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('*'); } ]) ->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; $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); } }