model = new \app\admin\model\shop\Order; // 视图赋值 $this->view->assign("orderStatusList", OrderEnum::getOrderStatusList()); $this->view->assign("statusList", $this->model->getStatusList()); // $this->view->assign("payModeList", OrderEnum::getPayModeList()); $this->view->assign("payTypeList", PayEnum::getPayMethodList()); $this->view->assign("orderTypeList", OrderEnum::getOrderTypeList()); $this->view->assign("deliveryTypeList", OrderEnum::getDeliveryTypeList()); $this->view->assign("invoiceStatusList", OrderEnum::getInvoiceStatusList()); // $this->view->assign("activityTypeList", OrderEnum::getActivityTypeList()); $this->view->assign("actionTypeList", OrderActionEnum::getActionTypeList()); $this->view->assign("saleStatusList", GoodsEnum::getSaleStatusMap()); // 前端配置 $this->assignconfig('orderStatusList', json_encode(OrderEnum::getOrderStatusList())); // $this->assignconfig('payModeList', json_encode(OrderEnum::getPayModeList())); $this->assignconfig('payTypeList', json_encode(PayEnum::getPayMethodList())); $this->assignconfig('statusList', json_encode($this->model->getStatusList())); $this->assignconfig('orderTypeList', json_encode(OrderEnum::getOrderTypeList())); $this->assignconfig('deliveryTypeList', json_encode(OrderEnum::getDeliveryTypeList())); $this->assignconfig('invoiceStatusList', json_encode(OrderEnum::getInvoiceStatusList())); // $this->assignconfig('activityTypeList', json_encode(OrderEnum::getActivityTypeList())); $this->assignconfig('actionTypeList', json_encode(OrderActionEnum::getActionTypeList())); $this->assignconfig('saleStatusList', json_encode(GoodsEnum::getSaleStatusMap())); } /** * 根据显示类型获取对应的订单状态列表 * @param string $showType 显示类型 * @return array 状态列表 */ public static function getStatusByShowType($showType) { $statusMap = [ 'all' => [], 'wait_pay' => [OrderEnum::STATUS_CREATE], 'cancelled' => [OrderEnum::STATUS_CANCEL, OrderEnum::STATUS_AUTO_CANCEL, OrderEnum::STATUS_ADMIN_CANCEL], 'refund' => [OrderEnum::STATUS_REFUND, OrderEnum::STATUS_REFUND_CONFIRM, OrderEnum::STATUS_GROUPON_TIMEOUT], 'wait_ship' => [OrderEnum::STATUS_PAY], 'shipped' => [OrderEnum::STATUS_SHIP], 'wait_comment' => [OrderEnum::STATUS_CONFIRM, OrderEnum::STATUS_AUTO_CONFIRM], 'completed' => [OrderEnum::STATUS_COMMENT], ]; return isset($statusMap[$showType]) ? $statusMap[$showType] : []; } /** * 获取订单状态筛选条件 * @param string $showType 显示类型 * @return array 筛选条件 */ public static function getStatusFilter($showType) { $statusList = self::getStatusByShowType($showType); if (empty($statusList)) { return []; } if (count($statusList) === 1) { return ['order_status' => $statusList[0]]; } return ['order_status' => ['in', implode(',', $statusList)]]; } /** * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法 * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑 * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改 */ /** * 查看 */ public function index() { //设置过滤方法 $this->request->filter(['strip_tags', 'trim']); if ($this->request->isAjax()) { //如果发送的来源是Selectpage,则转发到Selectpage if ($this->request->request('keyField')) { return $this->selectpage(); } list($where, $sort, $order, $offset, $limit, , $alias) = $this->buildparams(); $a = reset($alias); $list = $this->model ->with(['OrderAddress','OrderGoods','User']) ->order('createtime desc') ->where($where) ->paginate($limit); $result = array("total" => $list->total(), "rows" => $list->items()); return json($result); } return $this->view->fetch(); } //发货单列表 public function orderList() { $ids = $this->request->post('ids/a'); if (empty($ids)) { $this->error('参数错误'); } $orderList = $this->model->with(['User', 'OrderGoods'])->order('createtime desc')->where('id', 'IN', $ids)->select(); foreach ($orderList as $index => $item) { if ($item->user) { $item->user->visible(['id', 'nickname', 'avatar']); } } $orderList = collection($orderList)->toArray(); foreach ($orderList as $index => $item) { $nums = 0; foreach ($item['order_goods'] as $key => $goods) { if ($goods['salestate'] == 4 || $goods['salestate'] == 5) { unset($orderList[$index]['order_goods'][$key]); } else { $nums += $goods['nums']; } } $orderList[$index]['nums'] = $nums; } $this->success('获取成功', '', ['orderList' => $orderList]); } //订单详情 public function detail() { $id = $this->request->param('ids'); if (!$id) { $this->error('参数错误'); } // 查询订单信息,包括关联的用户、商品、操作记录、收货地址、档案信息 $row = $this->model ->field('o.*,sum(s.refund) refund') ->with([ 'User' => function($query) { $query->field('id,username,nickname,avatar,email,mobile'); }, 'OrderGoods' => function($query) { $query->field('*'); }, 'OrderAddress' => function($query) { $query->field('*'); }, 'OrderProfile' => function($query) { $query->field('*'); } ]) ->where('o.id', $id) ->alias('o') ->join('shop_order_aftersales s', 'o.id=s.order_id and s.status=2 and s.type <> 3', 'LEFT') ->find(); if (!$row) { $this->error('记录未找到'); } // 转换为数组以便处理 $rowData = $row->toArray(); // 添加枚举文本转换 $rowData['order_status_text'] = OrderEnum::getOrderStatusText($rowData['order_status']); $rowData['source_text'] = ChannelEnum::getChannelText($rowData['source'] ?? ''); $rowData['type_text'] = $this->getTypeText($rowData['type']); $rowData['pay_type_text'] = $this->getPayTypeText($rowData['pay_type']); // $rowData['pay_mode_text'] = $this->getPayModeText($rowData['pay_mode']); $rowData['delivery_type_text'] = $this->getDeliveryTypeText($rowData['delivery_type']); if (!empty($rowData['invoice_status'])) { $rowData['invoice_status_text'] = $this->getInvoiceStatusText($rowData['invoice_status']); } // if (!empty($rowData['activity_type'])) { // $rowData['activity_type_text'] = $this->getActivityTypeText($rowData['activity_type']); // } // 处理订单商品的规格信息和售后状态文本 if (!empty($rowData['order_goods'])) { $orderGoods = []; foreach ($rowData['order_goods'] as $index => $item) { // 格式化商品规格属性 $item['goods_sku_attr_formatted'] = $this->formatGoodsSkuAttr($item['goods_sku_attr']); // 处理售后状态文本 $item['sale_status_text'] = $this->getSaleStatusText($item['sale_status']); $orderGoods[] = $item; } $rowData['order_goods'] = $orderGoods; } // 使用 OrderActionService 获取订单操作记录 $orderActions = OrderActionService::getActionTimeline($rowData['order_sn']); // 将操作记录添加到订单数据中 $rowData['order_action'] = $orderActions; // 支付信息 // 查询支付信息 $payInfo = PayService::getPayInfo($rowData['id']); $rowData['pay_info'] = $payInfo; // 处理档案信息 // echo "
";
// print_r($rowData);
// die();
if (!empty($rowData['order_profile'])) {
$profile = $rowData['order_profile'];
// // 处理体型选择数据
// if (!empty($profile['body_types'])) {
// $bodyTypes = json_decode($profile['body_types'], true);
// $profile['body_types_formatted'] = is_array($bodyTypes) ? $bodyTypes : [];
// }
// // 处理AI报告内容
// if (!empty($profile['ai_report_content'])) {
// $aiReportContent = json_decode($profile['ai_report_content'], true);
// $profile['ai_report_content_formatted'] = is_array($aiReportContent) ? $aiReportContent : [];
// }
// // 处理身体照片
// if (!empty($profile['body_photos'])) {
// $bodyPhotos = json_decode($profile['body_photos'], true);
// $profile['body_photos_formatted'] = is_array($bodyPhotos) ? $bodyPhotos : [];
// }
$rowData['order_profile'] = $profile;
}
$config = get_addon_config('shop');
$this->assignconfig('shop', $config);
$this->view->assign('row', $rowData);
return $this->view->fetch();
}
/**
* 获取订单来源文本
*/
private function getPlatformText($platform)
{
// 直接使用ChannelEnum获取渠道文本
return ChannelEnum::getChannelText($platform);
}
/**
* 获取订单类型文本
*/
private function getTypeText($type)
{
return OrderEnum::getOrderTypeText($type);
}
/**
* 获取支付方式文本
*/
private function getPayTypeText($payType)
{
// 直接使用PayEnum获取支付方式文本
return PayEnum::getPayMethodText($payType);
}
/**
* 获取发货方式文本
*/
private function getDeliveryTypeText($deliveryType)
{
return OrderEnum::getDeliveryTypeText($deliveryType);
}
/**
* 获取发票状态文本
*/
private function getInvoiceStatusText($invoiceStatus)
{
return OrderEnum::getInvoiceStatusText($invoiceStatus);
}
/**
* 获取售后状态文本
*/
private function getSaleStatusText($saleStatus)
{
return GoodsEnum::getSaleStatusText($saleStatus);
}
/**
* 格式化商品规格属性
*/
private function formatGoodsSkuAttr($goodsSkuAttr)
{
if (empty($goodsSkuAttr)) {
return [];
}
// 尝试解析JSON格式的规格信息
$decoded = json_decode($goodsSkuAttr, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) {
return $decoded;
}
// 如果不是JSON格式,直接返回原始字符串(兼容旧格式)
return [
[
'name' => '规格',
'value' => $goodsSkuAttr
]
];
}
//订单状态操作
public function edit_status()
{
$order_status = $this->request->post('order_status');
$pay_time = $this->request->post('pay_time');
$order_id = $this->request->post('order_id');
$order = $this->model->where('id', $order_id)->find();
if (!$order) {
$this->error('未找到订单记录');
}
//取消
if ($order_status == OrderEnum::STATUS_CANCEL && $order->order_status == OrderEnum::STATUS_CREATE && !$order->pay_time) {
$oldStatus = $order->order_status;
$order->order_status = OrderEnum::STATUS_CANCEL;
$order->cancel_time = time();
$order->save();
// 记录管理员操作
OrderActionService::recordAdminAction(
$order->order_sn,
OrderActionEnum::ACTION_ADMIN_CANCEL,
'管理员',
'管理员取消订单',
$this->auth->id ?? 0
);
$this->success('取消成功');
}
// 支付
if ($pay_time && $order->order_status == OrderEnum::STATUS_CREATE && !$order->pay_time) {
$oldStatus = $order->order_status;
$order->order_status = OrderEnum::STATUS_PAY;
$order->pay_type = 'system';
$order->pay_amount = $order->amount;
$order->pay_time = time();
$order->save();
// 记录管理员操作
OrderActionService::recordAdminAction(
$order->order_sn,
OrderActionEnum::ACTION_PAY,
'管理员',
'管理员手动标记订单为已支付',
$this->auth->id ?? 0
);
//发送通知
//TemplateMsg::sendTempMsg(0, $order->order_sn);
$this->success('操作成功');
}
//已完成
if ($order_status == OrderEnum::STATUS_CONFIRM && $order->order_status == OrderEnum::STATUS_PAY && $order->pay_time) {
$oldStatus = $order->order_status;
$order->order_status = OrderEnum::STATUS_CONFIRM;
$order->save();
// 记录管理员操作
OrderActionService::recordAdminAction(
$order->order_sn,
OrderActionEnum::ACTION_RECEIVE,
'管理员',
'管理员手动标记订单为已完成',
$this->auth->id ?? 0
);
$this->success('操作成功');
} elseif ($order->order_status == OrderEnum::STATUS_REFUND) {
$this->error("请完成售后后再进行操作");
}
$this->error('没有权限操作');
}
//编辑订单信息【备注等】
public function edit_info()
{
$id = $this->request->post('id');
$field = $this->request->post('field');
$value = $this->request->post('value');
if (!in_array($field, ['memo'])) {
$this->error('没有权限编辑');
}
$row = $this->model->with(['User'])->where('id', $id)->find();
if (!$row) {
$this->error('记录未找到');
}
$row->$field = $value;
$row->save();
$this->success('保存成功');
}
//发货
public function deliver()
{
$expressname = $this->request->post('expressname');
$expressno = $this->request->post('expressno');
$order_id = $this->request->post('order_id');
$type = $this->request->post('type');
$order = $this->model->where('id', $order_id)->find();
if (!$order) {
$this->error('未找到订单记录');
}
//发货 / 修改快递信息
if ($order->order_status == OrderEnum::STATUS_PAY && $type == 0) {
$oldStatus = $order->order_status;
$order->express_name = $expressname;
$order->express_no = $expressno;
$order->order_status = OrderEnum::STATUS_SHIP;
$order->shipping_time = time();
$order->save();
// 记录管理员操作
OrderActionService::recordAdminAction(
$order->order_sn,
OrderActionEnum::ACTION_SHIP,
'管理员',
'管理员发货,快递公司:' . $expressname . ',快递单号:' . $expressno,
$this->auth->id ?? 0,
[
'express_name' => $expressname,
'express_no' => $expressno,
]
);
$this->success('发货成功');
} elseif ($type == 1) {
$order->express_name = $expressname;
$order->express_no = $expressno;
$order->save();
$this->success('修改成功');
} elseif ($order->order_status == OrderEnum::STATUS_REFUND) {
$this->error("请完成售后后再进行操作");
}
$this->error('没有权限操作');
}
//电子面单【单独】
public function electronics()
{
$order_id = $this->request->param('order_id');
$row = $this->model->field('o.id,oe.print_template')
->where('o.id', $order_id)
->alias('o')
->join('shop_order_electronics oe', 'oe.order_sn=o.order_sn and oe.status=0', 'LEFT')
->find();
if ($row && !empty($row['print_template'])) {
$this->success('获取成功', '', ['PrintTemplate' => $row->print_template]);
}
$res = [];
$electronics_id = $this->request->param('electronics_id');
try {
$res = \addons\shop\library\KdApiExpOrder::create($order_id, $electronics_id);
} catch (\Exception $e) {
$this->error($e->getMessage());
}
if (!isset($res['Success']) || !$res['Success']) {
$msg = isset($res['Reason']) ? $res['Reason'] : '请求失败';
$this->error($msg);
}
//成功
$this->success('开始打印', '', $res);
}
//批量打印
public function prints()
{
$ids = $this->request->param('ids');
if (empty($ids)) {
$this->error('打印参数错误');
}
$order_ids = explode('_', $ids);
if ($this->request->isPost()) {
$electronics_id = $this->request->post('electronics_id');
$param = [];
//是否已获取
$list = $this->model->field('o.id,oe.print_template')
->where('o.id', 'IN', $order_ids)
->alias('o')
->join('shop_order_electronics oe', 'oe.order_sn=o.order_sn and oe.status=0', 'LEFT')
->select();
$has_ids = [];
//获取过的
if ($list) {
foreach ($list as $item) {
if (!empty($item['print_template'])) {
$param[] = [
'PrintTemplate' => $item['print_template'],
'Success' => true
];
$has_ids[] = $item['id'];
}
}
}
//剩余未获取的
try {
foreach (array_diff($order_ids, $has_ids) as $order_id) {
$res = \addons\shop\library\KdApiExpOrder::create($order_id, $electronics_id);
if ($res) {
$param[] = $res;
}
}
} catch (\Exception $e) {
$this->error($e->getMessage());
}
$this->success('操作成功', '', $param);
}
$config = get_addon_config('shop');
$this->assignconfig('shop', $config);
$this->assignconfig('order_ids', $order_ids);
$order = $this->model->with(['OrderGoods', 'OrderAddress'])->where('id', 'IN', $order_ids)->select();
// 处理规格信息格式化
$processedOrder = [];
foreach ($order as $orderItem) {
$orderData = $orderItem->toArray();
if (isset($orderData['order_goods']) && $orderData['order_goods']) {
foreach ($orderData['order_goods'] as $index => $goodsItem) {
$orderData['order_goods'][$index]['goods_sku_attr_formatted'] = $this->formatGoodsSkuAttr($goodsItem['goods_sku_attr']);
}
}
$processedOrder[] = $orderData;
}
$order = $processedOrder;
$this->view->assign('order', $order);
return $this->view->fetch();
}
//取消电子面单
public function cancel_electronics()
{
$oe_id = $this->request->param('oe_id');
$row = OrderElectronics::get($oe_id);
if ($row['status'] == 1) {
$this->error('电子面单已取消');
}
$res = \app\common\library\KdApiExpOrder::cancel($row);
if (isset($res['Success']) && $res['Success']) {
$row->status = 1;
$row->save();
$this->success('取消成功', '', $res);
}
$msg = isset($res['Reason']) ? $res['Reason'] : '取消失败';
$this->error($msg);
}
}