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);
    }

 
}