'v3'], false); } //计算邮费,判断商品 - 支持购物车和商品规格两种模式 public function calculate() { // 验证请求参数 $validate = new \app\api\validate\Order(); $postData = $this->request->post(); $postData['calculate_data'] = '1'; // 添加触发自定义验证的字段 if (!$validate->scene('calculate')->check($postData)) { $this->error($validate->getError()); } $userId = $this->auth->id; $config = get_addon_config('shop'); $address_id = $postData['address_id'] ?? 0; // 地址id $user_coupon_id = $postData['user_coupon_id'] ?? 0; // 优惠券 $cart_ids = $postData['cart_ids'] ?? []; // 购物车ID数组 $goods_list = $postData['goods_list'] ?? []; // 商品列表 $address = Address::get($address_id); $area_id = !empty($address) ? $address->area_id : 0; try { // 自动判断数据源类型并获取标准化的商品列表 if (!empty($cart_ids) && !empty($goods_list)) { // 结算页有加减数量,需同步更新购物车 CartService::updateCartByGoodsList($cart_ids, $goods_list, $userId); // goods_list 直接参与后续计算 } elseif (!empty($cart_ids)) { $goods_list = CartService::convertCartToGoodsList($cart_ids, $userId); } elseif (empty($goods_list)) { throw new \Exception("请提供购物车ID或商品列表"); } // 统一调用计算方法 $result = OrderService::calculateOrder($goods_list, $userId, $area_id, $user_coupon_id); $orderItem = $result['orderItem']; $goodsList = $result['goodsList']; $orderInfo = $result['orderInfo']; $userCoupon = $result['userCoupon']; if (empty($goodsList)) { throw new \Exception("未找到商品"); } } catch (\Exception $e) { $this->error($e->getMessage()); } // 处理商品数据 foreach ($goodsList as $item) { //$item->category_id = $item->goods->category_id; $item->brand_id = $item->goods->brand_id; $item->goods->visible(explode(',', 'id,title,image,price,marketprice')); } // 获取我的可以使用的优惠券 $goods_ids = array_column($goodsList, 'goods_id'); $category_ids = array_column($goodsList, 'category_id'); $brand_ids = array_column($goodsList, 'brand_id'); $this->success('获取成功', [ 'coupons' => UserCoupon::myGoodsCoupon($userId, $goods_ids, $category_ids, $brand_ids), 'goods_list' => $goodsList, 'order_info' => $orderInfo, ]); } /** * 提交订单 - 统一接口 */ public function create() { // 验证请求参数 $validate = new \app\api\validate\Order(); if (!$validate->scene('create')->check($this->request->post())) { $this->error($validate->getError()); } $address_id = $this->request->post('address_id/d'); // 地址id $user_coupon_id = $this->request->post('user_coupon_id/d'); // 优惠券id $remark = $this->request->post('remark','','trim'); // 备注 $cart_ids = $this->request->post('cart_ids/a'); // 购物车ID数组 $goods_list = $this->request->post('goods_list/a'); // 商品列表 $order = null; try { if (!empty($cart_ids)) { // 购物车模式 - 校验购物车id合法性 $row = (new Carts)->where('id', 'IN', $cart_ids)->where('user_id', '<>', $this->auth->id)->find(); if ($row) { $this->error('存在不合法购物车数据'); } // 先转换购物车为商品列表 $goods_list = \app\common\Service\CartService::convertCartToGoodsList($cart_ids, $this->auth->id); // 创建订单 $order = OrderService::createOrder($address_id, $this->auth->id, $goods_list, $user_coupon_id, $remark); // 购物车订单创建成功后清理购物车 \app\common\Service\CartService::clear($cart_ids); } elseif (!empty($goods_list)) { // 商品列表模式 - 直接创建订单 $order = OrderService::createOrder($address_id, $this->auth->id, $goods_list, $user_coupon_id, $remark); } else { $this->error('请提供购物车ID或商品列表'); } } catch (\Exception $e) { $this->error($e->getMessage()); } $this->success('下单成功!', array_intersect_key($order->toArray(), array_flip(['order_sn', 'id', 'order_status']))); } //订单详情 public function detail() { // 验证请求参数 $validate = new \app\api\validate\Order(); $orderId = $this->request->get('orderId'); $params = ['orderId' => $orderId]; if (!$validate->scene('detail')->check($params)) { $this->error($validate->getError()); } $order = OrderService::getDetail($orderId, $this->auth->id); if (empty($order)) { $this->error('未找到订单'); } //$order->append(['order_status_text']); $address = OrderService::getAddressInfo($orderId); $order->address = $address; // $order->append(['status_text']); // $order->hidden(explode(',', 'method,transactionid,updatetime,deletetime')); // $order->expiretime = $order->expiretime - time(); $this->success('', $order); } //订单列表 public function index() { // 验证请求参数 $validate = new \app\api\validate\Order(); $param = $this->request->param(); $param['time_range'] = '1'; // 添加触发时间范围验证的字段 if (!$validate->scene('lists')->check($param)) { $this->error($validate->getError()); } // 设置默认值 $userId = $this->auth->id; $param['page'] = $this->request->param('page', 1, 'intval'); $param['pageSize'] = $this->request->param('pageSize', 10, 'intval'); $status = $this->request->param('status', 0, 'intval'); // 默认为0(全部订单) $param['keywords'] = $this->request->param('keywords', '', 'trim'); $status = OrderEnum::SHOW_TYPE_STATUS_MAP[$status]; $list = OrderService::getOrderList($userId ,$param, $status); foreach ($list as $item) { // $item->append(['order_status_text']); $field = 'id,order_sn,amount,goods_price,order_amount,express_name,express_no,order_goods,order_status_text,order_status'; $item->visible(explode(',', $field)); } $this->success('获取成功', $list); } //取消订单 public function cancel() { // 验证请求参数 $validate = new \app\api\validate\Order(); $orderId = $this->request->post('orderId'); $params = ['orderId' => $orderId]; if (!$validate->scene('cancel')->check($params)) { $this->error($validate->getError()); } $order = OrderService::getByOrderId($orderId); if (empty($order)) { $this->error('订单不存在'); } if ($order->user_id != $this->auth->id) { $this->error('不能越权操作'); } if ($order->status == 'hidden') { $this->error('订单已失效!'); } //可以取消 if ($order->canCancelHandle()) { // 启动事务 Db::startTrans(); try { $order->order_status = OrderEnum::STATUS_CANCEL; $order->cancel_time = time(); $order->save(); foreach ($order->order_goods as $item) { $sku = $item->sku; $goods = $item->goods; //商品库存恢复 if ($sku) { $sku->setInc('stocks', $item->nums); } if ($goods) { $goods->setInc('stocks', $item->nums); } } //恢复优惠券 UserCoupon::resetUserCoupon($order->user_coupon_id, $order->order_sn); // 提交事务 Db::commit(); } catch (\Exception $e) { // 回滚事务 Db::rollback(); $this->error('订单取消失败'); } //记录操作 OrderAction::push($order->order_sn, '系统', '订单取消成功'); $this->success('订单取消成功!', $order['status']); } else { $this->error('订单不允许取消'); } } //订单支付 public function pay() { // 验证请求参数 $validate = new \app\api\validate\Order(); if (!$validate->scene('pay')->check($this->request->post())) { $this->error($validate->getError()); } $order_sn = $this->request->post('order_sn'); $pay_type = $this->request->post('pay_type'); $method = $this->request->post('method'); $appid = $this->request->post('appid'); //为APP的应用id $returnurl = $this->request->post('returnurl', '', 'trim'); $openid = $this->request->post('openid', '', null); $logincode = $this->request->post('logincode', '', null); $userId = $this->auth->id; $orderInfo = OrderService::getByOrderSn($order_sn); if (!$orderInfo) { $this->error("未找到指定的订单"); } if ($orderInfo->isPayStatus()) { $this->error("订单已经支付,请勿重复支付"); } // if (OrderService::isExpired($order_sn)) { // $this->error("订单已经失效"); // } //如果有传递logincode,则直接使用code换openid if (!$openid && $logincode) { $json = (new \app\common\library\Wechat\Service())->getWechatSession($logincode); $openid = $json['openid'] ?? $openid; } //必须传递openid if (in_array($method, ['miniapp', 'mp', 'mini']) && !$openid) { $this->error("未找到第三方用户信息", 'bind'); } $response = null; $response = PayOperService::pay($order_sn, $userId, $pay_type, $method, $openid, '', $returnurl); $this->success("请求成功", $response); } //确认收货 public function receipt() { // 验证请求参数 $validate = new \app\api\validate\Order(); $orderId = $this->request->post('orderId'); $params = ['orderId' => $orderId]; if (!$validate->scene('detail')->check($params)) { $this->error($validate->getError()); } $order = OrderService::getByOrderId($orderId); if (empty($order)) { $this->error('订单不存在'); } if ($order->user_id != $this->auth->id) { $this->error('该订单不属于当前用户'); } if ($order->canConfirmHandle()) { $order->order_status = OrderEnum::STATUS_CONFIRM; $order->receive_time = time(); $order->save(); //记录操作 OrderAction::push($order->order_sn, '系统', '订单确认收货成功'); $this->success('确认收货成功'); } $this->error('订单不允许确认收货'); } //查询物流 public function logistics() { // 验证请求参数 $validate = new \app\api\validate\Order(); $params = ['order_sn' => $this->request->param('order_sn')]; if (!$validate->scene('detail')->check($params)) { $this->error($validate->getError()); } $order_sn = $this->request->param('order_sn'); $order = OrderModel::getDetail($order_sn, $this->auth->id); if (empty($order)) { $this->error('未找到订单'); } if (!$order->shippingstate) { $this->error('订单未发货'); } $electronics = Db::name('shop_order_electronics')->where('order_sn', $order_sn)->where('status', 0)->find(); if (!$electronics) { $this->error('订单未发货'); } $result = KdApiExpOrder::getLogisticsQuery([ 'order_sn' => $order_sn, 'logistic_code' => $electronics['logistic_code'], 'shipper_code' => $electronics['shipper_code'] ]); if ($result['Success']) { $this->success('查询成功', $result['Traces']); } $this->error('查询失败'); } // 获取状态订单统计 public function getOrderStatusCount(){ $userId = $this->auth->id; $info = OrderService::getOrderStatusCount($userId); $this->success('获取成功', $info); } }