shop; $shopName = $shop->shopName ?? ''; $sjName = $shop->merchantName ?? ''; $name = $shopName == '首店' ? $sjName : $sjName . ' ' . $shopName; if (empty($shop->lat) || empty($shop->long)) { util::fail('没有经纬度,请修改地址'); } if (empty($shop->address)) { util::fail('地址缺失,请修改'); } $adminId = $this->adminId; util::checkRepeatCommit($adminId, 3); $storeData = [ 'out_store_id' => $this->mainId, //自定义门店编号 'store_name' => $name, 'address_info' => [ 'province' => $shop->province, 'city' => $shop->city, 'area' => $shop->dist, 'street' => '', 'house' => $shop->address . $shop->floor, 'lat' => $shop->lat, 'lng' => $shop->long, 'phone' => $shop->telephone ] ]; // 验证必填参数 $requiredFields = ['out_store_id', 'store_name', 'address_info']; foreach ($requiredFields as $field) { if (empty($storeData[$field])) { util::fail("缺少必填参数:{$field}"); } } // 创建门店前,检查是否已经 开通门店权限 (有wxStoreId,即说明开通了) $main = $this->main; if (!empty($main->wxStoreId)) { util::fail('已经创建门店,请刷新'); } $result = IntraCityExpress::createStore($storeData); if ($result['errcode'] === 0) { // 保存微信门店编号(wx_store_id) $main->wxStoreId = $result['wx_store_id']; $main->save(); util::success($result, "门店创建成功"); } else { $errMsg = $result['errmsg'] ?? ''; Yii::error("门店创建失败:" . $errMsg); noticeUtil::push("跑腿创建门店报错:" . $errMsg, '15280215347'); util::fail('创建失败,请联系客服'); } } /** * 查询门店创建情况 */ public function actionStore() { $shopId = $this->shopId; // 首先从门店扩展表查询是否已经创建 $main = MainClass::getById($this->mainId, true, 'id, wxStoreId'); if ($main->wxStoreId == '') { // 不存在,则从微信接口查询 $result = IntraCityExpress::getStore($this->mainId); if ($result['errcode'] === 0) { $store = $result['store_list'][0]; // 保存 wx_store_id $main->wxStoreId = $store['wx_store_id']; $main->save(); util::success($store, "门店查询成功"); } else { Yii::error("门店查询失败:" . $result['errmsg']); util::error(-1, '门店查询失败'); } } else { $field = 'province, city, dist, lat, long, floor, address'; $shop = ShopClass::getById($shopId, false, $field); $data = array_merge($shop, $main->toArray()); util::success($data, "门店查询成功"); } } /** * 更新门店 */ public function actionUpdateStore() { // 首先从门店扩展表查询是否已经创建 $main = $this->main; $wxStoreId = $main->wxStoreId; if (empty($wxStoreId)) { util::fail('未创建门店,请先创建'); } $shop = $this->shop; $shopName = $shop->shopName ?? ''; $sjName = $shop->merchantName ?? ''; $name = $shopName == '首店' ? $sjName : $sjName . ' ' . $shopName; $adminId = $this->adminId; util::checkRepeatCommit($adminId, 3); if (empty($shop->lat) || empty($shop->long)) { util::fail('没有经纬度,请修改地址'); } if (empty($shop->address)) { util::fail('地址缺失,请修改'); } $storeData = [ 'keys' => ['wx_store_id' => $wxStoreId], 'content' => [ 'store_name' => $name, 'address_info' => [ 'province' => $shop->province, 'city' => $shop->city, 'area' => $shop->dist, 'street' => '', 'house' => $shop->address . $shop->floor, 'lat' => $shop->lat, 'lng' => $shop->long, 'phone' => $shop->telephone ], //"order_pattern" => 2, //"service_trans_prefer" => "SFTC" //order_pattern = 2时必填 ] ]; $result = IntraCityExpress::updateStore($storeData); if ($result['errcode'] === 0) { util::success($result, "门店更新成功"); } else { $errMsg = $result['errmsg'] ?? ''; Yii::error("门店更新失败:" . $errMsg); noticeUtil::push("销花宝,跑腿修改门店报错:" . $errMsg, '15280215347'); util::fail('更新失败,请联系客服'); } } /** * 门店运费充值 */ public function actionStoreCharge() { $post = Yii::$app->request->post(); $amount = floatval($post['amount']); $amountTurnFen = $amount * 100; if ($amountTurnFen < 5000) { util::fail('50元起充'); } $expressId = $post['expressId']; $serviceTransIds = ['SFTC', 'DADA']; if (!in_array($expressId, $serviceTransIds)) { util::fail('快递动力ID出错'); } $shopExt = MainClass::getById($this->mainId, false, 'id, wxStoreId'); if ($shopExt['wxStoreId'] == '') { util::fail('微信门店编号为空'); } $wxStoreId = $shopExt['wxStoreId']; $result = IntraCityExpress::storeCharge($wxStoreId, $expressId, $amountTurnFen); if ($result['errcode'] === 0) { util::success($result, "门店余额充值单已生成"); } else { Yii::error("门店余额充值失败:" . $result['errmsg']); util::fail('门店余额充值失败'); } } /** * 门店余额查询 */ public function actionStoreBalance() { $shopExt = MainClass::getById($this->mainId, false, 'id, wxStoreId'); if ($shopExt['wxStoreId'] == '') { util::error(-1, '微信门店编号为空'); } $wxStoreId = $shopExt['wxStoreId']; $result = IntraCityExpress::getBalance($wxStoreId); if ($result['errcode'] === 0) { $data = ['all_balance' => $result['all_balance'] / 100.0]; foreach ($result['balance_detail'] as $item) { if ($item['service_trans_id'] == 'DADA') { $data['dada_balance'] = $item['balance'] / 100.0; } if ($item['service_trans_id'] == 'SFTC') { $data['sf_balance'] = $item['balance'] / 100.0; } } util::success($data, "门店余额查询成功"); } else { Yii::error("门店余额查询失败:" . $result['errmsg']); util::fail('门店余额查询失败'); } } /** * 查询运费 */ public function actionStoreFee() { $post = Yii::$app->request->post(); // 创建表单验证模型 $form = new StoreFeeForm(); $form->setScenario('store_fee'); $form->load($post, ''); // 直接从 post 数据加载,不使用模型名作为前缀 // 执行表单验证 $form->validateForm(); $orderId = $post['orderId']; $order = OrderClass::getById($orderId); if (empty($order)) { util::fail('订单出错'); } if ($order['mainId'] != $this->mainId) { util::fail('订单出错'); } $sn = $order['orderSn']; $shopId = intval($this->shopId); if (empty($shopId)) { util::fail("门店不存在"); } $shopExt = MainClass::getById($this->mainId, false, 'id, wxStoreId'); if (empty($shopExt)) { util::fail("微信门店不存在"); } $itemInfoList = OrderItemClass::getAllByCondition(['orderSn' => $sn], null, 'id, name, cover, num'); $orderType = 2; // 默认是 2。说明:1花束订单 2花材订单 3花束和花材都有 if (empty($itemInfoList)) { $orderType = 1; } $cargoName = '花材'; // 商品名称,默认是花材 $goodsInfoList = OrderGoodsClass::getListBySn($sn); if (count($goodsInfoList) == 1) { $goodsInfo = $goodsInfoList[0]; $cargoName = $goodsInfo['name']; } else { if ($orderType != 2) { util::fail("订单商品数量不正确"); } } $cargo = [ 'cargo_name' => $cargoName, // 商品名称 -- $order 中没有,要在 goodsInfo 中取 'cargo_weight' => intval($post['weight'] * 1000), // 单位:克 -- 把千克转换为克 'cargo_price' => intval($post['price'] * 100), // 单位:分 -- 把元转换为分 'cargo_type' => IntraCityExpress::GOODS_TYPE_FLOWER, 'cargo_num' => intval($post['packageNum']) ]; $originalLng = doubleval($post['user_lng']); $originalLat = doubleval($post['user_lat']); $orderData = [ //'out_store_id' => $shopId, 'wx_store_id' => $shopExt['wxStoreId'], 'user_name' => $post['user_name'], 'user_phone' => $post['user_phone'], 'user_lng' => $originalLng, 'user_lat' => $originalLat, 'user_address' => $post['user_address'], 'cargo' => $cargo, // 'use_sandbox' => getenv('YII_ENV') == 'production' ? 0 : 1, //正式环境不能传这个参数,会报错 ]; //多处有用到这个方法,需修改请同步修改,搜索关键词 intra_city_express_pre_add $result = IntraCityExpress::preAddOrder($orderData); if ($result['errcode'] === 0) { util::success($result, "查询成功"); } else { Yii::error("运费查询失败:" . json_encode($result)); util::fail('运费查询失败,请确认是否超过20公斤,编号56698'); } } //根据订单查询运费 ssh public function actionGetOrderFee() { $post = Yii::$app->request->post(); $orderId = $post['id']; $order = OrderClass::getById($orderId, true); if (empty($order)) { util::fail('没有找到订单'); } if ($order->mainId != $this->mainId) { util::fail('不是你的订单'); } $main = $this->main; $wxStoreId = $main->wxStoreId ?? ''; if (empty($wxStoreId)) { util::fail('你还没有开通跑腿'); } $weight = $post['weight'] ?? 0; if ($weight <= 0) { util::fail('请填写重量'); } $packageNum = $post['packageNum'] ?? 1; $price = $order->actPrice ?? 0; $cargo = [ 'cargo_name' => '鲜花花材', // 商品名称 -- $order 中没有,要在 goodsInfo 中取 'cargo_weight' => intval($weight * 1000), // 单位:克 -- 把千克转换为克 'cargo_price' => intval($price * 100), // 单位:分 -- 把元转换为分 'cargo_type' => IntraCityExpress::GOODS_TYPE_FLOWER, 'cargo_num' => intval($packageNum) ]; $originalLng = $order->long; $originalLat = $order->lat; if (empty($originalLng) || empty($originalLat)) { util::fail('客户地址不完整'); } $customName = $order->customName ?? ''; $customMobile = $order->customMobile ?? ''; if (empty($customMobile)) { util::fail('客户手机缺失'); } $address = $order->address ?? ''; if (empty($address)) { util::fail('客户地址缺失'); } //根据环境变量判断是否使用沙盒环境 // $useSandBox = getenv('YII_ENV') == 'production' ? 0 : 1; $orderData = [ 'wx_store_id' => $wxStoreId, 'user_name' => $customName, 'user_phone' => $customMobile, 'user_lng' => $originalLng, 'user_lat' => $originalLat, 'user_address' => $address, 'cargo' => $cargo, // 'use_sandbox' => $useSandBox,//正式环境不能传这个参数,会报错 ]; //多处有用到这个方法,需修改请同步修改,搜索关键词 intra_city_express_pre_add $result = IntraCityExpress::preAddOrder($orderData); if ($result['errcode'] === 0) { util::success($result, "查询成功"); } else { $errMsg = $result['errmsg'] ?? ''; $errCode = $result['errcode'] ?? ''; noticeUtil::push("运费查询失败了:" . $errMsg . ",编号:" . $errCode, '15280215347'); util::fail('查询失败,请确认量否超过20公斤,编号8930'); } } /** * 创建订单 * POST /intra-city/create-order */ public function actionCreateOrder() { $post = Yii::$app->request->post(); $adminId = $this->adminId; util::checkRepeatCommit($adminId, 4); $orderId = intval($post['orderId']); $order = OrderClass::getById($orderId, true); if (empty($order)) { util::fail('没有找到订单'); } if ($order->mainId != $this->mainId) { util::fail('不是你的订单'); } $packageNum = $post['packageNum'] ?? 0; if ($packageNum <= 0) { util::fail('请填写包裹数量'); } $weight = $post['weight'] ?? 0; if ($weight <= 0) { util::fail('请填写重量'); } $actPrice = $order->actPrice ?? 0; if ($actPrice <= 0) { util::fail('订单没有价格,不能发跑腿'); } if ($order->status != 2) { util::fail('待发货订单才能发跑腿,请刷新页面'); } //如果不是没鹛跑腿和取消了,则不能再叫跑腿,有多处,关键词no_call_express $notCanCreateSendStatus = [-2, 3]; if (!in_array($order->sendStatus, $notCanCreateSendStatus)) { util::fail('不能叫跑腿,请刷新页面,编号800'); } $cgId = $order->purchaseId ?? 0; $cgInfo = PurchaseClass::getById($cgId, true); if (empty($cgInfo)) { util::fail('没有采购信息'); } $sn = $order->orderSn; $itemInfo = OrderItemClass::getByCondition(['orderSn' => $sn], null, 'id, name, cover, num'); $num = intval($order->itemNum); $itemList[] = [ 'item_name' => '花材', 'item_pic_url' => imgUtil::groupImg($itemInfo['cover']) . "?x-oss-process=image/resize,m_fill,h_130,w_130", 'count' => $num, ]; $main = $this->main; $wxStoreId = $main->wxStoreId ?? ''; if (empty($wxStoreId)) { util::fail('你还没有开通跑腿功能'); } $cgId = $order->purchaseId ?? 0; if (empty($cgId)) { util::fail('没有找到采购信息'); } $miniOpenId = ''; $customShopAdminId = $order->customShopAdminId ?? 0; if (!empty($customShopAdminId)) { $customStaff = ShopAdminClass::getById($customShopAdminId, true); $customStaffAdminId = $customStaff->adminId ?? ''; if (!empty($customStaffAdminId)) { $customAdmin = AdminClass::getById($customStaffAdminId, true); $miniOpenId = $customAdmin->miniOpenId ?? ''; } } if (empty($miniOpenId)) { $admin = $this->admin; $miniOpenId = $admin->miniOpenId ?? ''; } if (empty($miniOpenId)) { util::fail('没有找到微信登录信息,无法呼叫跑腿'); } $cargoName = '鲜花花材';//商品名称 $cargo = [ 'cargo_name' => $cargoName, 'cargo_weight' => intval($weight * 1000), 'cargo_type' => IntraCityExpress::GOODS_TYPE_FLOWER, 'cargo_num' => intval($packageNum), 'cargo_price' => intval($actPrice * 100), // $order 中有各个价格,请注意 'item_list' => $itemList, ]; $shopId = $this->shopId; $mainId = $this->mainId; $snData = ['shopId' => $shopId, 'mainId' => $mainId]; $storeOrderId = orderSn::getGhsExpressSn($snData); $sendNum = $order->sendNum ?? ''; $customName = $order->customName ?? ''; if (empty($customName)) { util::fail('客户名称无效'); } $customMobile = $order->customMobile ?? ''; if (empty($customMobile)) { util::fail('客户手机号无效'); } $long = $order->long ?? ''; $lat = $order->lat ?? ''; if (empty($long) || empty($lat)) { util::fail('客户地址无效'); } $address = $order['address'] ?? ''; if (empty($address)) { util::fail('客户地址无效呢'); } $floor = $order['floor'] ?? ''; $fullAddress = $address . $floor; $callbackUrl = Yii::$app->params['ghsHost'] . '/intra-city/callback'; $orderData = [ 'wx_store_id' => $wxStoreId, 'store_order_id' => $storeOrderId, //同一个门店订单编号要保证唯一,相同的订单号会重入 'user_openid' => $miniOpenId, 'user_lng' => (float)$long, 'user_lat' => (float)$lat, 'user_address' => $fullAddress, 'user_name' => $customName, 'user_phone' => $customMobile, 'order_seq' => $sendNum, // 用于配送员快速寻找到匹配的商品(非必传) -- 对应 xhOrder 表的 sendNum 'verify_code_type' => 0, 'order_detail_path' => '/pagesPurchase/purDetails?id=' . $cgId, 'callback_url' => $callbackUrl, // 订单状态回调地址(非必传) // 'use_sandbox' => 0,//正式环境不能传这个参数,会报错 'cargo' => $cargo ]; $result = IntraCityExpress::createOrder($orderData); if (isset($result['errcode']) && $result['errcode'] === 0) { noticeUtil::push(json_encode($result), '15280215347'); // 保存进 xhGhsExpressOrder 表 $data = [ 'mainId' => $this->mainId, 'shopId' => $this->shopId, 'deliveryId' => $result['service_trans_id'] ?? '', 'wxOrderId' => $result['wx_order_id'] ?? '', 'wxStoreId' => $result['wx_store_id'] ?? '', 'storeOrderId' => $result['store_order_id'] ?? '', 'orderId' => $orderId, 'transOrderId' => $result['trans_order_id'] ?? '', 'distance' => $result['distance'] ?? 0, 'fee' => $result['fee'] ?? 0, 'fetchCode' => $result['fetch_code'] ?? '', 'orderSeq' => $result['order_seq'] ?? '', 'status' => 1,//有订单可以取消 'orderStatus' => 0,//已提交申请,待确认 ]; GhsExpressOrderClass::add($data); $sendDistance = $data['distance'] ?? 0; $deliveryId = $data['deliveryId'] ?? ''; //更新订单 $order->sendDistance = $sendDistance; $order->sendStatus = -1;//已提交申请,待确认 $order->deliveryId = $deliveryId; $order->sendType = 2; $order->save(); $cgInfo->sendDistance = $sendDistance; $cgInfo->sendStatus = -1;//已提交申请,待确认 $cgInfo->deliveryId = $deliveryId; $cgInfo->sendType = 2; $cgInfo->save(); $params = [ 'fhType' => 0, 'fhWl' => '', 'fhWlNo' => '', 'staffId' => 0, 'staffName' => '', ]; //确认发货,花店会增加路上库存 OrderClass::orderSend($order, $params); $totalFee = $result['fee'] ?? 0; $ghsName = $cgInfo->ghsName ?? ''; noticeUtil::push("批发订单,发跑跑腿,获取运费:{$totalFee} 重量:{$weight} 距离:{$sendDistance} 订单号:{$orderId} 供货商:{$ghsName} 客户:{$customName} 客户手机:{$customMobile} 收货地址:{$fullAddress}", '15280215347'); util::success(['fee' => $data['fee']], '订单创建成功'); } else { noticeUtil::push("批发 -- " . $this->mainId . ",订单创建失败:" . json_encode($result)); Yii::error("订单创建失败:" . ($result['errmsg'] ?? '未知错误'), 'intraCity'); util::fail('提交失败,请确认余额是否充足'); } } /** * 查询订单 * GET /intra-city/get-order */ public function actionGetOrder() { try { $shopExt = MainClass::getById($this->mainId, false, 'id, wxStoreId'); if (empty($shopExt)) { util::fail("微信门店不存在"); } $post = Yii::$app->request->post(); $wxOrderId = isset($post['wx_order_id']) ? $post['wx_order_id'] : ''; $orderId = $post['orderId']; $wxStoreId = isset($post['wx_store_id']) ? $post['wx_store_id'] : $shopExt['wxStoreId']; if (empty($wxOrderId) && (empty($orderId) || empty($wxStoreId))) { util::fail("参数不足:wx_order_id 或 (order_id + wx_store_id) 必须提供一组"); } $order = OrderClass::getById($orderId, false, 'id, mainId, sendStatus'); if ($order['mainId'] != $this->mainId) { util::fail('订单未找到'); } // 检查是否存在重复的订单:如果存在,则使用最后一个订单的 store_order_id $storeOrderId = $orderId; // ------------------------------------- 注意区分:$storeOrderId , $orderId 。它们有可能不相同 $query = (new Query()) ->from('xhGhsExpressOrder') ->where(['orderId' => $orderId]) ->andWhere(['mainId' => $this->mainId]); $esDatas = $query->all(); $count = count($esDatas); if ($count > 0) { $es = $esDatas[0]; $storeOrderId = $es['storeOrderId']; } $result = IntraCityExpress::queryOrder($wxStoreId, $storeOrderId, $wxOrderId); if (isset($result['errcode']) && $result['errcode'] === 0) { util::success($result, "查询成功"); } else { Yii::error("订单查询失败:" . ($result['errmsg'] ?? '未知错误'), 'intracity'); util::fail('订单查询失败: ' . $result['errcode']); } } catch (\Exception $e) { Yii::error("订单查询异常:" . $e->getMessage(), 'intracity'); util::fail("系统出错"); } } /** * 取消订单 * POST /intra-city/cancel-order */ public function actionCancelOrder() { try { $post = Yii::$app->request->post(); $adminId = $this->adminId; util::checkRepeatCommit($adminId, 4); $orderId = $post['orderId'] ?? 0; $order = OrderClass::getById($orderId, true);//todo 这时必须取全部字段,下面发货要用到,否则会出错,请勿修改 if (empty($order)) { util::fail('没有找到订单'); } if ($order->mainId != $this->mainId) { util::fail('不是你的订单'); } if ($order->status != 3) { util::fail('不能取消'); } if (in_array($order->sendStatus, [-2, 2, 3])) { //订单 没叫跑腿、已送达、已取消 util::fail('不能取消哈,编号666'); } $cgId = $order->purchaseId ?? 0; $cg = PurchaseClass::getById($cgId, true); if (empty($cg)) { util::fail('没有采购单信息'); } $main = $this->main; $wxStoreId = $main->wxStoreId ?? ''; $express = GhsExpressOrderClass::getByCondition(['orderId' => $orderId, 'status' => 1], true); if (empty($express)) { util::fail('没有找到有效配送单'); } $wxOrderId = $express->wxOrderId ?? ''; $storeOrderId = $express->storeOrderId ?? ''; $result = IntraCityExpress::cancelOrder($wxOrderId, $storeOrderId, $wxStoreId); if (isset($result['errcode']) && $result['errcode'] === 0) { // 更新订单状态 $order->sendStatus = 3; $order->save(); $cg->sendStatus = 3; $cg->save(); $params = ['staffId' => 0, 'staffName' => '']; OrderClass::cancelOrderSend($order, $params); $deductFee = $result['deductfee'] ?? 0; $express->status = 0; $express->cancelTime = date('Y-m-d H:i:s'); $express->deductfee = $deductFee; $express->save(); util::success($result, "订单取消成功"); } else { Yii::error("订单取消失败:" . ($result['errmsg'] ?? '未知错误'), 'intracity'); util::fail('取消失败,编号6693'); } } catch (\Exception $e) { Yii::error("订单取消异常:" . $e->getMessage(), 'intraCity'); util::fail("系统出错"); } } /** * 微信回调接口 */ public function actionCallback() { $callbackData = Yii::$app->request->post(); if (empty($callbackData)) { $postStr = file_get_contents('php://input'); $callbackData = json_decode($postStr, true); if (empty($callbackData)) { util::fail('回调请求的数据为空'); } } // 从配置中获取安全token // $token = Yii::$app->params['wx_intracity_token'] ?? 'your_token_here'; // $result = IntraCityExpress::handleOrderCallback($callbackData, $token); // 记录回调日志 Yii::info('同城配送回调:' . json_encode($callbackData, JSON_UNESCAPED_UNICODE), 'intraCity'); $storeOrderId = $callbackData['store_order_id'] ?? 0; $wxStoreId = $callbackData['wx_store_id'] ?? ''; //微信门店编号 if (empty($storeOrderId) || empty($wxStoreId)) { Yii::error("配送单回调接口的请求参数出错,storeOrderId = $storeOrderId, wxStoreId = $wxStoreId"); return $this->asJson(['return_code' => 1, 'return_msg' => '请求参数不正确']); } try { // 使用 storeOrderId 与 wxStoreId 去查询 xhExpressOrder 表 $eo = GhsExpressOrderClass::getByCondition(['storeOrderId' => $storeOrderId, 'wxStoreId' => $wxStoreId], true, false); if (empty($eo)) { Yii::error('订单不存在. store_order_id: ' . $storeOrderId . ',wx_store_id: ' . $wxStoreId); return $this->asJson(['return_code' => 1, 'return_msg' => '系统错误']); } $orderId = $eo->orderId ?? 0; if (empty($orderId)) { $errRemind = '订单号为空,store_order_id: ' . $storeOrderId . ',wx_store_id: ' . $wxStoreId; Yii::error($errRemind, 'intracity'); noticeUtil::push($errRemind, '15280215347'); return $this->asJson(['return_code' => 1, 'return_msg' => '系统错误2']); } $order = OrderClass::getById($orderId, true);//todo 注意,这里必须取全部字段,否则下面发错会出错!!!!!!!! if (empty($order)) { $errRemind = '没有找到订单,store_order_id: ' . $storeOrderId . ',wx_store_id: ' . $wxStoreId; Yii::error($errRemind, 'intracity'); noticeUtil::push($errRemind, '15280215347'); return $this->asJson(['return_code' => 1, 'return_msg' => '系统错误3']); } $cgId = $order->purchaseId ?? 0; $cg = PurchaseClass::getById($cgId, true); if (empty($cg)) { $errRemind = '没有找到采购单,store_order_id: ' . $storeOrderId . ',wx_store_id: ' . $wxStoreId; Yii::error($errRemind, 'intracity'); noticeUtil::push($errRemind, '15280215347'); return $this->asJson(['return_code' => 1, 'return_msg' => '系统错误4']); } $orderStatus = intval($callbackData['order_status']); //同个配送单,同个状态的,5秒内不允许重复请求,重要勿删 $uniqueId = $storeOrderId . '_' . $orderStatus; util::checkRepeatCommit($uniqueId, 5); // ====================== 开启事务 $tx = Yii::$app->db->beginTransaction(); $msg = ''; // 发通知的内容(默认为空,根据情况生成。没有内容则不会发通知) switch ($orderStatus) { // 订单创建成功,已叫跑腿,等跑腿接单 case IntraCityExpress::ORDER_STATUS_CREATED: if ($order->status == 3) { $eo->orderStatus = 1;//已叫跑腿,等跑腿接单 $eo->save(); $order->sendStatus = 0;//已叫跑腿,等跑腿接单 $order->save(); $cg->sendStatus = 0;//已叫跑腿,等跑腿接单 $cg->save(); } break; // 配送员接单 case IntraCityExpress::ORDER_STATUS_ACCEPTED: if ($order->status == 3) { $eo->orderStatus = 4;//跑腿已接单 $eo->save(); $order->sendStatus = 1;//跑腿已接单 $order->save(); $cg->sendStatus = 1;//跑腿已接单 $cg->save(); } break; // 配送员到店 case IntraCityExpress::ORDER_STATUS_ARRIVED: if ($order->status == 3) { $eo->orderStatus = 5;//跑腿到店 $eo->save(); $order->sendStatus = 4;//跑腿到店 $order->save(); $cg->sendStatus = 4;//跑腿到店 $cg->save(); } break; // 配送中 case IntraCityExpress::ORDER_STATUS_DELIVERING: if ($order->status == 3) { $eo->orderStatus = 6;//跑腿配送中 $eo->save(); $order->sendStatus = 5;//跑腿配送中 $order->save(); $cg->sendStatus = 5;//跑腿配送中 $cg->save(); } break; // 配送完成 case IntraCityExpress::ORDER_STATUS_COMPLETED: if ($order->status == 3) { $eo->orderStatus = 8;//配送完成 $eo->save(); $order->sendStatus = 2;//已送达 $order->save(); $cg->sendStatus = 2;//已送达 $cg->save(); $params = ['staffId' => 0, 'staffName' => '']; OrderClass::confirmReach($order, $params); } break; // 商家取消订单 case IntraCityExpress::ORDER_STATUS_CANCELED_BY_MERCHANT: //取消已发货,回滚到待发货 if ($order->status == 3) { $eo->orderStatus = 2; $eo->save(); $order->sendStatus = 3; $order->save(); $cg->sendStatus = 3; $cg->save(); $params = ['staffId' => 0, 'staffName' => '']; OrderClass::cancelOrderSend($order, $params); $msg = '取消配送,订单编号 '; } break; // 配送方取消订单 case IntraCityExpress::ORDER_STATUS_CANCELED_BY_DELIVERY: //取消已发货,回滚到待发货 if ($order->status == 3) { $eo->orderStatus = 3; $eo->status = 0; $eo->save(); $order->sendStatus = 3; $order->save(); $cg->sendStatus = 3; $cg->save(); $params = ['staffId' => 0, 'staffName' => '']; OrderClass::cancelOrderSend($order, $params); $msg = '配送方取消配送,订单编号 '; } break; // 配送员撤单 case IntraCityExpress::ORDER_STATUS_WITHDRAWN: //todo 配送员撤单,目前我们认为会重新派单,先不要有任何操作!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $msg = '跑腿取消配送,订单编号 '; break; // 配送异常 case IntraCityExpress::ORDER_STATUS_EXCEPTION: //取消已发货,回滚到待发货 if ($order->status == 3) { $eo->orderStatus = 9; $eo->status = 0; $eo->save(); $order->sendStatus = 3; $order->save(); $cg->sendStatus = 3; $cg->save(); $params = ['staffId' => 0, 'staffName' => '']; OrderClass::cancelOrderSend($order, $params); $msg = '订单配送异常,订单编号 '; } break; } // ====================== 事务提交 $tx->commit(); if (!empty($msg)) { $order = OrderClass::getById($orderId, true, 'id, shopId, customName, sendNum'); $shop = ShopClass::getById($order->shopId, true, 'id, ptStyle, mainId'); $result = $msg . $order->sendNum; WxMessageClass::expressErrorInform($shop, $order->customName, $orderId, $result); } // 成功状态的返回数据 return $this->asJson(['return_code' => 0, 'return_msg' => 'OK']); } catch (\Exception $e) { Yii::error('同城配送回调处理异常:' . $e->getMessage()); return $this->asJson(['return_code' => 1, 'return_msg' => '系统错误']); } } //模拟接口回调 ssh 20250826 public function actionMockNotify() { if (getenv('YII_ENV') != 'production') { $post = Yii::$app->request->post(); $orderStatus = $post['orderStatus'] ?? 0; $wxOrderId = $post['wxOrderId'] ?? ''; $ptStyle = dict::getDict('ptStyle', 'hd'); $merchant = WxOpenClass::getWxInfo(); $ret = IntraCityExpress::mockNotify($orderStatus, $wxOrderId, '', '', $merchant, $ptStyle); util::success($ret); } util::complete(); } }