Jelajahi Sumber

1. 把订单类型与商品类型的判断改用函数参数来判断
2. fix bug

shizhongqi 8 bulan lalu
induk
melakukan
c817df7ff0

+ 4 - 4
app-ghs/controllers/DeliveryController.php

@@ -238,10 +238,10 @@ class DeliveryController extends BaseController
 
         $params['mainId'] = $this->mainId;
         $params['ip'] = Yii::$app->request->userIP;
+        $params['weight'] = $post['weight'];
         $params['remark'] = $post['remark'];
         $params['total_price_fen'] = $post['price'];
         $params['pickupTime'] = $pickupTime['value'];
-        $shopId = $this->shopId;
 
         $ghsOrder = OrderClass::getById($orderId, true);
          if(!in_array($ghsOrder['sendStatus'], [-4, -1])) {
@@ -250,7 +250,7 @@ class DeliveryController extends BaseController
          }
 
         $ds = new DispatchService($this->mainId, $platform);
-        $ret = $ds->createOrder($ghsOrder, $shopId, $params);
+        $ret = $ds->createOrder($ghsOrder, 'xhGhsOrder', $this->shopId, $params);
 
         if (isset($ret['code']) && $ret['code'] == 0) {
             $gdo = GhsDeliveryOrderClass::getByCondition(['mainId'=>$this->mainId, 'orderId'=>$ret['data']['order_id']]);
@@ -367,8 +367,8 @@ class DeliveryController extends BaseController
 
             $ghsOrder = OrderClass::getById($ghsOrderId, true, 'id, sendDistance, sendStatus, deliveryId');
             $ghsOrder->sendDistance = 0;
-            $ghsOrder->sendStatus = -4;
-            $ghsOrder->deliveryId = '';
+            $ghsOrder->sendStatus = -1;
+            // $ghsOrder->deliveryId = ''; // 为了获取上一次的配送记录,不要置空
             $ghsOrder->sendTip = 0;
             if(!$ghsOrder->save()) {
                 Yii::error('保存批发订单失败: ' . json_encode($ghsOrder->errors));

+ 5 - 3
app-ghs/models/delivery/CreateOrderForm.php

@@ -12,6 +12,7 @@ use Yii;
 class CreateOrderForm extends BaseForm
 {
     public $orderId;           // xhGhsOrder.id
+    public $weight;            // 货物总重量
     public $remark;            // 订单备注
     public $price;             // 配送费(单位:分)
     public $pickupTime;        // 取件时间
@@ -20,12 +21,12 @@ class CreateOrderForm extends BaseForm
     public function rules()
     {
         return [
-            [['orderId', 'price'], 'required'],
-            [['orderId', 'price'], 'integer'],
+            [['orderId', 'weight', 'price'], 'required'],
+            [['orderId', 'weight', 'price'], 'integer'],
             ['orderId', 'validateOrderId'],
             ['pickupTime', 'safe'],
             ['allParams', 'safe'],
-            ['remark', 'string', 'max' => 500],
+            ['remark', 'string', 'max' => 100],
         ];
     }
 
@@ -33,6 +34,7 @@ class CreateOrderForm extends BaseForm
     {
         return [
             'orderId' => '订单ID',
+            'weight' => '重量',
             'remark' => '备注',
             'price' => '配送费用',
             'pickupTime' => '取件时间',

+ 2 - 2
app-hd/controllers/DeliveryController.php

@@ -148,10 +148,10 @@ class DeliveryController extends BaseController
 
         $params['mainId'] = $this->mainId;
         $params['ip'] = Yii::$app->request->userIP;
+        $params['weight'] = $post['weight'];
         $params['remark'] = $post['remark'];
         $params['total_price_fen'] = $post['price'];
         $params['pickupTime'] = $pickupTime['value'];
-        $shopId = $this->shopId;
 
         $Order = OrderClass::getById($orderId, true);
         if(!in_array($Order['sendStatus'], [-4, -1])) {
@@ -160,7 +160,7 @@ class DeliveryController extends BaseController
         }
 
         $ds = new DispatchService($this->mainId, $platform);
-        $ret = $ds->createOrder($Order, $shopId, $params);
+        $ret = $ds->createOrder($Order, 'xhOrder', $this->shopId, $params);
 
         if (isset($ret['code']) && $ret['code'] == 0) {
             $gdo = HdDeliveryOrderClass::getByCondition(['mainId'=>$this->mainId, 'orderId'=>$ret['data']['order_id']]);

+ 1 - 0
app-hd/controllers/PurchaseController.php

@@ -590,6 +590,7 @@ class PurchaseController extends BaseController
                             'custom' => $custom,
                             'order' => [
                                 'orderSn' => $orderSn,
+                                'goodsType' => 1, //商品类型:0花束 1花材
                                 'itemTotalAmount' => $post['itemTotalAmount'] ?? 0,
                                 'remark' => $post['remark'] ?? '',
                             ],

+ 1 - 1
app-hd/models/delivery/CreateOrderForm.php

@@ -15,7 +15,7 @@ class CreateOrderForm extends BaseForm
     public $remark;            // 订单备注
     public $price;             // 配送费(单位:分)
     public $pickupTime;        // 取件时间
-    public $allParams;         // 配送平台所需的所有参数
+    public $allParams;         // 配送平台所需的所有参数(透传平台参数)
 
     public function rules()
     {

+ 2 - 0
app-mall/controllers/OrderController.php

@@ -393,6 +393,7 @@ class OrderController extends BaseController
                         'custom' => $this->user, // $custom 数据有问题,要是 user
                         'order' => [
                             'orderSn' => $orderSn,
+                            'goodsType' => 1, //商品类型:0花束 1花材
                             'itemTotalAmount' => $post['itemTotalAmount'] ?? 0,
                             'remark' => $post['remark'] ?? '',
                         ],
@@ -643,6 +644,7 @@ class OrderController extends BaseController
                         'custom' => $cutomInfo,
                         'order' => [
                             'orderSn' => $orderSn,
+                            'goodsType' => 0, //商品类型:0花束 1花材
                             'itemTotalAmount' => $post['itemTotalAmount'] ?? 0,
                             'remark' => $post['remark'] ?? '',
                         ],

+ 13 - 3
common/components/delivery/services/DispatchService.php

@@ -95,15 +95,22 @@ class DispatchService
     }
 
     /**
-     * 发单调度
+     * @param $order
+     * @param string $orderType 订单类型:xhOrder 或 xhGhsOrder
+     * @param $shopId
+     * @param $params
+     * @return mixed
      */
-    public function createOrder($order, $shopId, $params)
+    public function createOrder($order, $orderType, $shopId, $params)
     {
         $order = $order->toArray();
+        if(!in_array($orderType, ['xhOrder', 'xhGhsOrder'])){
+            util::fail('订单类型错误');
+        }
         $shop = ShopClass::getById($shopId, false, 'id,merchantName,fullAddress,lat,long,city,dist,floor,mobile,merchantName');
 
         $adapter = $this->getAdapter();
-        $orderData = $adapter->formatOrderData($order, $shop, $params);
+        $orderData = $adapter->formatOrderData($order, $orderType, $shop, $params);
         return $adapter->createOrder($orderData);
     }
 
@@ -456,6 +463,9 @@ class DispatchService
             'deliveryType' => 1,
             'expectStartTime' => null,
             'expectEndTime' => null,
+
+            //补充额外的订单数据
+            'sendNum' => $order['sendNum'],
         ];
     }
 

+ 10 - 7
common/components/delivery/services/adapter/FengniaoAdapter.php

@@ -51,11 +51,13 @@ class FengniaoAdapter extends Fengniao implements Adapter
     /**
      * 转化订单数据
      * @param $order
+     * @param string $type 订单类型:xhOrder 或 xhGhsOrder
      * @param $shop
      * @param $params
      * @return array
+     * @throws \Exception
      */
-    public function formatOrderData($order, $shop, $params)
+    public function formatOrderData($order, $type, $shop, $params)
     {
         // 订单类型为预约单时必传,如需要送达时间 – 推单时间 < 60min,则蜂鸟配送开放平台自动将订单类型置为即时单
         $timeDiff = strtotime($params['pickupTime']) - time();
@@ -66,9 +68,9 @@ class FengniaoAdapter extends Fengniao implements Adapter
 
         $sn = $order['orderSn'];
         // 批发
-        if(strstr($sn, 'XSD_CS') || strstr($sn, 'XSD')){
+        if($type == 'xhGhsOrder'){
             $itemInfos = OrderItemClass::getAllByCondition(['orderSn' => $sn], null, 'id, name, unitPrice, num, unitWeight');
-            $goodsWeight = 0;
+            //$goodsWeight = 0;
             $goodsItemList = [];
             foreach ($itemInfos as $item){
                 $goodsItemList[] = [
@@ -78,13 +80,13 @@ class FengniaoAdapter extends Fengniao implements Adapter
                     'item_name' => $item['name'],
                     'item_quantity' => $item['num'],
                 ];
-                $goodsWeight += $item['unitWeight'];
+                //$goodsWeight += $item['unitWeight'];
             }
             $goodsCount = count($goodsItemList);
         // 零售
-        }else if(strstr($sn, 'KD_CS') || strstr($sn, 'KD')){
+        }else if($type == 'xhOrder'){
             $itemInfos = OrderGoodsClass::getAllByCondition(['orderSn' => $sn], null, 'id, name, unitPrice, num');
-            $goodsWeight = 0;
+            //$goodsWeight = 0;
             $goodsItemList = [];
             foreach ($itemInfos as $item){
                 $goodsItemList[] = [
@@ -100,9 +102,11 @@ class FengniaoAdapter extends Fengniao implements Adapter
             Yii::error('订单编号出错: '.$sn);
             util::fail('订单编号出错');
         }
+        $goodsWeight = floatval($params['weight']);//取客户端传来的重量
 
         $orderData = [
             //'out_shop_code' => $params['mainId'], // 当使用门店发单 out_shop_code 和 chain_store_id 必填1个
+            'chain_store_id' => $this->getShopId(), // 动态修改为门店号 -- (点对点不传)
             'partner_order_code' => $order['orderSn'],
             'receiver_primary_phone' => Functions::getMobile($order),
             'receiver_name' => $order['customName'],
@@ -116,7 +120,6 @@ class FengniaoAdapter extends Fengniao implements Adapter
             'goods_actual_amount_cent' => (int)($order['actPrice'] * 100), //订单货物实付金额
             'goods_item_list' => $goodsItemList,
             'order_type' => $orderType,
-            'chain_store_id' => $this->getShopId(), // 动态修改为门店号 -- (点对点不传)
             'order_remark' => $order['remark'],
             'serial_number' => $order['sendNum'] // 配送编号,方便寻找订单对应的花材
         ];

+ 3 - 1
common/components/delivery/services/adapter/HuolalaAdapter.php

@@ -184,11 +184,13 @@ class HuolalaAdapter extends Huolala implements Adapter
     /**
      * 转化订单数据
      * @param $order
+     * @param $orderType
      * @param $shop
      * @param $params
      * @return array
+     * @throws \Exception
      */
-    public function formatOrderData($order, $shop, $params)
+    public function formatOrderData($order, $orderType, $shop, $params)
     {
         //用车时间 -- 用车时间(unix时间戳:秒)。 取值范围:(当前时间+10分钟)<=用车时间<=(当前时间+5天)
         $orderTime = strtotime($params['pickupTime']);

+ 3 - 1
common/components/delivery/services/adapter/ShansongAdapter.php

@@ -45,11 +45,12 @@ class ShansongAdapter extends Shansong implements Adapter
     /**
      * 转化订单数据
      * @param $order
+     * @param $orderType
      * @param $shop
      * @param $params
      * @return array
      */
-    public function formatOrderData($order, $shop, $params)
+    public function formatOrderData($order, $orderType, $shop, $params)
     {
         $orderData = ['issOrderNo' =>  $params['issOrderNo']];
         return $orderData;
@@ -133,6 +134,7 @@ class ShansongAdapter extends Shansong implements Adapter
                 'goodType' => $receiver['goodType'],  // 物品类型,默认10-其他
                 'weight' => (int) ($receiver['weight'] ?? 1),         // 物品重量(必须是整数kg)
                 'remarks' => $receiver['remarks'] ?? '', // 备注
+                'orderingSourceType' => 1, // 订单来源枚举: 1.闪送 5.其他平台
                 'orderingSourceNo' => $data['sendNum'], // 对应orderingSourceType流水号,传参数时必须和orderingSourceType成对出现
                 'expectStartTime' => isset($receiver['expectStartTime']) ? (int) $receiver['expectStartTime'] : null,
                 'expectEndTime' => isset($receiver['expectEndTime']) ? (int) $receiver['expectEndTime'] : null,

+ 26 - 15
common/components/delivery/services/adapter/ShunfengAdapter.php

@@ -3,6 +3,7 @@ namespace common\components\delivery\services\adapter;
 
 
 use bizGhs\order\classes\OrderItemClass;
+use bizHd\order\classes\OrderGoodsClass;
 use common\components\delivery\platform\shunfeng\Shunfeng;
 use Yii;
 
@@ -14,29 +15,39 @@ class ShunfengAdapter extends Shunfeng implements Adapter
      * 格式化订单数据为顺丰同城API所需格式
      * 
      * @param array $order 订单信息
+     * @param string $orderType 订单类型:xhOrder 或 xhGhsOrder
      * @param array $shop 店铺信息
      * @param array $params 额外参数
      * @return array 格式化后的订单数据
      */
-    public function formatOrderData($order, $shop, $params)
+    public function formatOrderData($order, $orderType, $shop, $params)
     {
         // 获取订单商品信息
-        $itemInfos = OrderItemClass::getAllByCondition(
-            ['orderSn' => $order['orderSn']], 
-            null, 
-            'id, name, unitPrice, num, unitWeight'
-        );
+        if($orderType == 'xhGhsOrder'){
+            $itemInfos = OrderItemClass::getAllByCondition(
+                ['orderSn' => $order['orderSn']],
+                null,
+                'id, name, unitPrice, num, unitWeight'
+            );
+        }elseif($orderType == 'xhOrder'){
+            $itemInfos = OrderGoodsClass::getAllByCondition(
+                ['orderSn' => $order['orderSn']],
+                null,
+                'id, name, unitPrice, num'
+            );
+        }
 
         // 计算商品总重量(单位:克)
-        $totalWeight = 0;
+        $totalWeight = round($params['weight'], 1) * 1000;
+
         $productNum = 0; // 物品个数
         $productTypeNum = 0; // 物品种类个数
         $productDetail = []; // 物品详情
 
         foreach ($itemInfos as $item) {
             // 累加重量(转换为克)
-            $itemWeight = (float)($item['unitWeight'] ?? 0) * (int)($item['num'] ?? 1) * 1000;
-            $totalWeight += (int)$itemWeight;
+            // $itemWeight = (float)($item['unitWeight'] ?? 0) * (int)($item['num'] ?? 1) * 1000;
+            // $totalWeight += (int)$itemWeight;
 
             // 累加商品数量和种类
             $productNum += (int)($item['num'] ?? 1);
@@ -51,14 +62,14 @@ class ShunfengAdapter extends Shunfeng implements Adapter
         }
 
         // 如果没有商品信息,使用订单重量
-        if ($totalWeight == 0 && isset($order['weight'])) {
-            $totalWeight = (int)($order['weight'] * 1000);
-        }
+        // if ($totalWeight == 0 && isset($order['weight'])) {
+        //     $totalWeight = (int)($order['weight'] * 1000);
+        // }
 
         // 默认重量为1000克(1公斤)
-        if ($totalWeight == 0) {
-            $totalWeight = 1000;
-        }
+        // if ($totalWeight == 0) {
+        //     $totalWeight = 1000;
+        // }
 
         // 如果没有商品详情,添加默认商品
         if (empty($productDetail)) {

+ 8 - 6
common/components/delivery/util/DeliveryQuoteUtil.php

@@ -117,7 +117,8 @@ class DeliveryQuoteUtil
             $params['productCount'] ?? 0,
             $params['order']['itemTotalAmount'] ?? 0,
             $params['ghsInfo']['mainId'],
-            $order['orderSn']
+            $order['orderSn'],
+            $order['goodsType']
         );
 
         return [
@@ -189,6 +190,7 @@ class DeliveryQuoteUtil
      * @param float $itemTotalAmount 商品总金额
      * @param int $ghsMainId 供货商mainId
      * @param string $orderSn 订单号
+     * @param int $goodsType 商品类型:0花束 1花材
      * @return float 最终配送费用
      */
     private static function applyFreeDeliveryRules(
@@ -198,7 +200,8 @@ class DeliveryQuoteUtil
         $productCount,
         $itemTotalAmount,
         $ghsMainId,
-        $orderSn
+        $orderSn,
+        $goodsType
     )
     {
         // 获取店铺扩展信息(免费配送设置)
@@ -207,8 +210,7 @@ class DeliveryQuoteUtil
             return $sendCost;
         }
 
-        // XSD_CS-    KD_CS-
-        if (strstr($orderSn, 'XSD_CS') || strstr($orderSn, 'XSD')) {//花材
+        if ($goodsType == 1) {//花材
             // 获取花材的免费配送设置
             $hcFreeKm = ($shopExt['hcFreeKm'] ?? 0) * 1000; // 转换为米
             $hcMapString = $shopExt['hcMap'] ?? '';
@@ -243,8 +245,8 @@ class DeliveryQuoteUtil
                 // 在免费配送距离内
                 return 0;
             }
-        } else if (strstr($orderSn, 'KD_CS') || strstr($orderSn, 'KD')) {//花束
-            // 获取花的免费配送设置
+        } else if ($goodsType == 0) {//花束
+            // 获取花的免费配送设置
             $hsFreeKm = ($shopExt['hsFreeKm'] ?? 0) * 1000; // 转换为米
             $hsAddFee = $shopExt['hsAddFee'] ?? 0;