| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- <?php
- namespace bizHd\express\classes;
- use bizHd\base\classes\BaseClass;
- use bizHd\order\classes\OrderClass;
- use common\components\delivery\services\DispatchService;
- use common\components\dict;
- use common\components\noticeUtil;
- use common\components\push;
- use mikemadisonweb\rabbitmq\components\ConsumerInterface;
- use Yii;
- class HdDeliveryOrderClass extends BaseClass
- {
- public static $baseFile = HdDeliveryOrderAR::class;
- public static function payAfter($order)
- {
- if (empty($order)) {
- return false;
- }
- if ($order->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');
- }
|