sendType != 2) { return false; } if ($order->payStatus != 1) { return false; } $orderId = $order->id; $shopId = $order->shopId; try { $cacheKey = 'hd_pt_cacheData:' . $orderId; $cachedData = Yii::$app->redis->get($cacheKey); if (!empty($cachedData)) { noticeUtil::push('零售,付款成功之后要发跑腿的订单:' . $orderId, '15280215347'); $cachedData = json_decode($cachedData, true); $data = [ 'orderId' => $orderId, 'shopId' => $order->shopId, 'mainId' => $order->mainId, 'platform' => $cachedData['deliveryPlatform'], 'ip' => '127.0.0.1', 'deliveryPrice' => $cachedData['deliveryPrice'], 'deliveryDistance' => $cachedData['deliveryDistance'], 'deliveryBracketContent' => $cachedData['deliveryBracketContent'], 'pickupTime' => $cachedData['pickupTime'], 'allParams' => $cachedData['deliveryAllParams'], 'weight' => $cachedData['weight'] ?? 1, 'remark' => $cachedData['deliveryRemark'] ?? '', 'price' => $order->actPrice, ]; self::askCreateOrder($data); } else { //noticeUtil::push("零售-缓存数据不存在或已过期,cacheKey:{$cacheKey}"); // 发送 app 通知 // $title = '发跑腿失败'; // $msg = "零售-缓存数据不存在或已过期,cacheKey:{$cacheKey}"; // $allDevices = \bizHd\device\classes\HdDeviceClass::getAllByCondition(['shopId' => $shopId, 'status' => 1]); // $cids = array_column($allDevices, 'clientId'); // $push = new push('hd', push::MSG_TYPE_WORK); // $push->pushByCloud($cids, $title, $msg, []); return false; } } catch (\Exception $e) { $msg = $e->getMessage(); $remind = "零售,付款成功之后要发跑腿的订单,报错 {$orderId} {$msg}"; noticeUtil::push($remind); } } //发跑腿准备数据 public static function prepareAskData($post, $order) { try { //跑腿订单生产者创建订单 $orderId = $order->id ?? 0; $callErrand = $post['callErrand'] ?? 0; // 是否立即发跑腿 1:是 0:否 if ($callErrand == 1) { $hasPay = $post['hasPay'] ?? dict::getDict('hasPay', 'unPay'); //收款方式 0:扫码付 1:线下(已付款) 2:赊账(欠款)3:现金 4:余额 if ($hasPay == dict::getDict('hasPay', 'unPay')) { // 0:扫码付 $deliveryPlatform = $post['deliveryPlatform']; $expireTime = 0; if ($deliveryPlatform == 'shansong') { $expireTime = 1800 - 60; } elseif ($deliveryPlatform == 'didi') { $expireTime = 7200; } else { $expireTime = 7200; // 默认缓存时长2小时 } $cacheKey = 'hd_pt_cacheData:' . $orderId; Yii::$app->redis->set($cacheKey, json_encode($post, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); Yii::$app->redis->expire($cacheKey, $expireTime); } else { $sendType = $post['sendType']; if ($order->payStatus == 1 && $sendType == dict::getDict('sendType', 'thirdSend')) { // $post 中有 pickupTime,则说明是要立即发跑腿 或者 callErrand == 1 $platform = $post['deliveryPlatform']; $deliveryPrice = $post['deliveryPrice']; $deliveryDistance = $post['deliveryDistance']; $deliveryBracketContent = $post['deliveryBracketContent']; $pickupTime = $post['pickupTime']; $allParams = $post['deliveryAllParams']; $data = [ 'orderId' => $orderId, 'mainId' => $order->mainId, 'shopId' => $order->shopId, 'platform' => $platform, 'ip' => Yii::$app->request->userIP, 'deliveryPrice' => $deliveryPrice, 'deliveryDistance' => $deliveryDistance, 'deliveryBracketContent' => $deliveryBracketContent, 'pickupTime' => $pickupTime, 'allParams' => $allParams, //----------------------- 'weight' => $post['weight'] ?? 1, 'remark' => $post['deliveryRemark'] ?? '', 'price' => $order->actPrice, ]; self::askCreateOrder($data); } } } } catch (\Exception $e) { $msg = $e->getMessage(); $remind = "零售,跑腿下单,准备数据报错 {$orderId} {$msg}"; noticeUtil::push($remind); } } //生产者创建下单指令逻辑 public static function askCreateOrder($data) { try { $orderId = $data['orderId']; $allParams = $data['allParams']; $producer = Yii::$app->rabbitmq->getProducer('ptProducer'); $msg = serialize([ 'type' => 'hd_pt_create_order', 'orderId' => $orderId, 'mainId' => $data['mainId'], 'shopId' => $data['shopId'], 'pickupTime' => $data['pickupTime'], 'ip' => $data['ip'], 'allParams' => $allParams, 'weight' => $data['weight'], 'remark' => $data['remark'], 'price' => $data['price'] ]); Yii::info('hd askCreateOrder == ' . $msg); $producer->publish($msg, 'ptExchange', 'ptRoute', ['delivery_mode' => 2, 'content_type' => 'application/octet-stream']); } catch (\Exception $e) { $msg = $e->getMessage(); $remind = "零售花店,跑腿下单,生产消息端报错 {$orderId} {$msg}"; noticeUtil::push($remind, '15280215347'); } } //消费者消费下单指令逻辑 public static function beginCreateOrder($data) { try { //花店,进行下单流程处理 $dataStr = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); //noticeUtil::push('已消费hd -- ' . $dataStr); Yii::info('hd消费者收到下单指令 -- ' . $dataStr); $orderId = $data['orderId']; // xhOrder.id $params = $data['allParams']; $platform = $params['en_name'];// 平台英文名,$post['platform'] 是中文 $errMsg = ''; if (empty($platform)) { Yii::error('platform为空'); $errMsg = 'platform参数为空'; } $shopId = $data['shopId']; $mainId = $data['mainId']; $params['mainId'] = $mainId; $params['ip'] = $data['ip']; $params['weight'] = $data['weight']; $params['remark'] = $data['remark'] ?? ''; $params['total_price_fen'] = $data['price']; $params['pickupTime'] = $data['pickupTime']; $Order = OrderClass::getById($orderId, true); if (empty($Order)) { $errMsg = "没有找到订单 hd-orderId={$orderId}"; } if ($Order->mainId != $mainId) { $errMsg = "hd-orderId={$orderId} 不是 mainId={$mainId} 的订单"; } if (!in_array($Order['sendStatus'], [-4, -2, -1])) { $errMsg = "订单 hd-orderId={$orderId} 已经发过跑腿"; } if ($errMsg != '') { Yii::error($errMsg); noticeUtil::push($errMsg); return ConsumerInterface::MSG_REJECT; } $ds = new DispatchService($mainId, $platform); $ret = $ds->createOrder($Order, 'xhOrder', $shopId, $params); if (isset($ret['code']) && $ret['code'] == 0) { $hdo = HdDeliveryOrderClass::getByCondition(['mainId' => $mainId, 'orderId' => $ret['data']['orderId']]); if (empty($hdo)) { $data = [ 'mainId' => $mainId, 'shopId' => $shopId, 'deliveryId' => $ret['platform'], 'hdOrderId' => $orderId, 'orderId' => $ret['data']['orderId'], 'distance' => $ret['data']['distance'], 'fee' => $ret['data']['fee'], 'orderStatus' => 0 ]; // createdAt 中保存了滴滴跑腿订单的后半截数据 if ($platform == 'didi') { $data['createdAt'] = date('Y-m-d H:i:s', $ret['data']['timeStamp']); } HdDeliveryOrderClass::add($data); } else { Yii::info('重复创建订单'); noticeUtil::push('重复创建订单:' . json_encode($hdo, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); } //更新订单 $Order->sendDistance = $ret['data']['distance']; $Order->sendStatus = 0; $Order->deliveryId = $platform; $Order->sendType = 2;// 2指跑腿 $Order->status = 3;// 3配送中 $save = $Order->save(); if ($save) { noticeUtil::push("hd-orderId={$orderId}, 创建跑腿成功"); //. json_encode($Order->toArray(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES } else { noticeUtil::push("hd-orderId={$orderId}, 创建跑腿失败"); // . json_encode($Order->toArray(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES } return ConsumerInterface::MSG_ACK; } else { if (isset($ret['msg'])) { Yii::error("hd-orderId={$orderId}, 创建跑腿失败:" . $ret['msg']); noticeUtil::push("零售订单号:{$orderId}, 原因:" . $ret['msg']); self::sendAppNotice($shopId, $orderId, "订单号:{$orderId},原因:" . $ret['msg']); // 发 App 通知 return ConsumerInterface::MSG_REJECT; } Yii::error("hd-orderId={$orderId}, 创建跑腿失败"); noticeUtil::push("订单号:{$orderId}, 创建跑腿失败"); self::sendAppNotice($shopId, $orderId, '创建跑腿失败'); // 发 App 通知 return ConsumerInterface::MSG_REJECT; } } catch (\Exception $e) { $orderId = $data['orderId']; Yii::error("hd-orderId={$orderId} 创建跑腿失败:" . $e->getMessage()); noticeUtil::push("零售订单号:{$orderId} 原因:" . $e->getMessage()); $shopId = $data['shopId']; // 发 App 通知 self::sendAppNotice($shopId, $orderId, "订单号:{$orderId},原因:" . $e->getMessage()); return ConsumerInterface::MSG_REJECT; } } // 发 App 通知 public static function sendAppNotice($shopId, $orderId, $msg) { $title = '发跑腿失败'; $msg = "零售订单创建跑腿失败," . $msg; $allDevices = \bizHd\device\classes\HdDeviceClass::getAllByCondition(['shopId' => $shopId, 'status' => 1]); $cids = array_column($allDevices, 'clientId'); $payload = [ "page" => "admin/order/detail", "params" => ["id" => $orderId] ]; $push = new push('hd', push::MSG_TYPE_WORK); $push->pushByCloud($cids, $title, $msg, $payload); } } // 在同文件末尾追加一个内联的 AR 类 class HdDeliveryOrderAR extends \bizHd\base\models\Base { public static function tableName() { return 'xhHdDeliveryOrder'; } } // 可选:为了兼容历史直接引用 models 的代码(如果存在),做一个别名映射 if (!class_exists('\bizHd\express\models\HdDeliveryOrder')) { class_alias(\bizHd\express\classes\HdDeliveryOrderAR::class, '\bizHd\express\models\HdDeliveryOrder'); }