Jelajahi Sumber

销账逻辑的完善

shish 1 tahun lalu
induk
melakukan
2b2f05de29

+ 4 - 4
app-hd/controllers/SettleController.php

@@ -70,7 +70,6 @@ class SettleController extends BaseController
             $mainId = $this->mainId;
             $orderSn = orderSn::getRechargeSn();
             $shop = $this->shop;
-            $settleParams = [];
 
             $hasSettle = SettleClass::getByCondition(['customId' => $customId, 'status' => 1], true);
             if (!empty($hasSettle)) {
@@ -78,7 +77,8 @@ class SettleController extends BaseController
             }
 
             //创建待账单
-            $settle = SettleClass::addSettle(0, $orderList, $shop, $custom, $hd, $staff, $settleParams);
+            $settleParams = ['staffId' => $staffId, 'staffName' => $staffName];
+            $settle = SettleClass::addSettle($orderList, $shop, $custom, $hd, $settleParams);
             $settleId = $settle->id;
             $settleAmount = $settle->actPrice;
 
@@ -98,8 +98,8 @@ class SettleController extends BaseController
                 'payStatus' => 0,
                 'payTime' => '0000-00-00 00:00:00',
                 'status' => 0,
-                'clearId' => $settleId,
-                'clearAmount' => $settleAmount,
+                'settleId' => $settleId,
+                'settleAmount' => $settleAmount,
                 'remark' => '',
                 'customId' => $customId,
                 'customName' => $customName,

+ 3 - 3
app-mall/controllers/SettleController.php

@@ -83,7 +83,7 @@ class SettleController extends BaseController
         }
 
         //创建待账单
-        $settle = SettleClass::addSettle(1, $orderList, $shop, $custom, $hd, $staff, $settleParams);
+        $settle = SettleClass::addSettle($orderList, $shop, $custom, $hd, $staff, $settleParams);
         $settleId = $settle->id;
         $settleAmount = $settle->actPrice;
 
@@ -106,8 +106,8 @@ class SettleController extends BaseController
             'payStatus' => 0,
             'payTime' => '0000-00-00 00:00:00',
             'status' => 0,
-            'clearId' => $settleId,
-            'clearAmount' => $settleAmount,
+            'settleId' => $settleId,
+            'settleAmount' => $settleAmount,
             'remark' => '',
         ];
         $respond = RechargeClass::addRecharge($createData);

+ 25 - 11
biz-hd/order/classes/SettleClass.php

@@ -19,10 +19,9 @@ class SettleClass extends BaseClass
 
     //$side 0 表示花店创建结账单,1客户创建结账单,二者区别有花店有带$staff信息,客户没有
     //$params 预留参数
-    public static function addSettle($side, $orderList, $shop, $custom, $hd, $staff = [], $params = [])
+    public static function addSettle($orderList, $shop, $custom, $hd, $params = [])
     {
         $totalRemain = 0;
-        $string = '';
         $shopId = $shop->id;
         $mainId = $shop->mainId;
         $sjId = $shop->sjId;
@@ -39,19 +38,17 @@ class SettleClass extends BaseClass
         $hdAvatar = $hd->avatar;
         $hdMobile = $hd->mobile;
         $hdAddress = $hd->address;
-        $staffId = 0;
-        $staffName = '';
-        if (!empty($staff) && $side == 0) {
-            $staffId = $staff->id;
-            $staffName = $staff->name ?? '';
-        }
+        $staffId = $params['staffId'] ?? 0;
+        $staffName = $params['staffName'] ?? '';
 
         $settleOrderSn = orderSn::getSettleSn();
+        $idList = [];
         foreach ($orderList as $order) {
             $remainDebtPrice = $order->remainDebtPrice ?? 0;
             $totalRemain = bcadd($totalRemain, $remainDebtPrice, 2);
-            $string = $string . ',' . $order->id;
+            $idList[] = $order->id;
         }
+        $string = implode(",", $idList);
         $num = count($orderList);
         $settleData = [
             'prePrice' => $totalRemain,
@@ -85,9 +82,26 @@ class SettleClass extends BaseClass
         return self::addData($settleData);
     }
 
-    public static function clearSettle()
+    public static function clearSettle($set)
     {
-
+        $str = $set->saleIds;
+        $ids = explode(",", $str);
+        $ids = array_filter(array_unique($ids));
+        $totalDebtPrice = 0;
+        if (empty($ids)) {
+            return ['totalDebtPrice' => $totalDebtPrice];
+        }
+        $orderList = OrderClass::getAllByCondition(['id' => ['in', $ids]], null, '*', null, true);
+        if (!empty($orderList)) {
+            foreach ($orderList as $order) {
+                $remainDebtPrice = $order->remainDebtPrice;
+                $totalDebtPrice = bcadd($totalDebtPrice, $remainDebtPrice, 2);
+                $order->remainDebtPrice = 0;
+                $order->debt = 0;
+                $order->save();
+            }
+        }
+        return ['totalDebtPrice' => $totalDebtPrice];
     }
 
     //结清尾款 ssh 20220708

+ 60 - 3
biz-hd/recharge/classes/RechargeClass.php

@@ -7,6 +7,8 @@ use bizHd\balance\classes\BalanceChangeClass;
 use bizHd\custom\classes\CustomClass;
 use bizHd\custom\classes\HdClass;
 use bizHd\member\classes\MemberWealClass;
+use bizHd\order\classes\OrderClass;
+use bizHd\order\classes\SettleClass;
 use bizHd\shop\classes\MainClass;
 use common\components\arrayUtil;
 use common\components\dict;
@@ -55,7 +57,8 @@ class RechargeClass extends BaseClass
     public static function complete($recharge, $payWay, $params)
     {
         $onlinePay = $params['onlinePay'];
-        $side = $params['side'];
+        //0 花店端操作,1 客户端操作
+        $side = $params['side'] ?? 0;
         $recharge->onlinePay = $onlinePay;
         $recharge->payWay = $payWay;
         $recharge->payStatus = 1;
@@ -93,8 +96,8 @@ class RechargeClass extends BaseClass
         $rechargeWeal = $shop->rechargeWeal ?? 0;
         $addGiveAmount = 0;
 
-        //如果客户有本身有欠款,充值不享受任何福利
-        if ($custom->balance > 0) {
+        //如果客户余额不足,本身有欠款,充值不享受任何福利;结账充值,不参与优惠
+        if ($custom->balance > 0 || $recharge->settelId > 0) {
             if ($rechargeWeal == 1 || $rechargeWeal == 2) {
                 $weal = MemberWealClass::getAllByCondition(['shopId' => $shopId], null, '*');
                 if (!empty($weal)) {
@@ -150,6 +153,55 @@ class RechargeClass extends BaseClass
             Yii::info($msg);
             util::fail($msg);
         }
+
+        $settleId = $recharge->settleId;
+        $settleAmount = 0;
+        $lastClearOrderId = 0;
+        $lastClearOrderAmount = 0;
+        if (!empty($settleId)) {
+            //如果有结账单,按结账单销账
+            $set = SettleClass::getById($settleId, true);
+            SettleClass::clearSettle($set);
+            $settleAmount = $set->actPrice ?? 0;
+        } else {
+            //没有结账单,按顺序去销账,这里的逻辑,请去查看原型文档,来理解需求
+            $orderList = OrderClass::getAllByCondition(['customId' => $customId, 'debt' => 1], 'id asc', '*', null, true);
+            if (!empty($orderList)) {
+                $totalRemainAmount = 0;
+                $need = [];
+                $hasPass = false;
+                foreach ($orderList as $order) {
+                    $orderId = $order->id ?? 0;
+                    $remainDebtPrice = $order->remainDebtPrice ?? 0;
+                    $currentTotal = bcadd($totalRemainAmount, $remainDebtPrice, 2);
+                    if ($currentTotal > $totalAmount) {
+                        continue;
+                    } else {
+                        if (!$hasPass) {
+                            $lastClearOrderAmount = bcsub($totalAmount, $totalRemainAmount, 2);
+                            if ($lastClearOrderAmount > 0) {
+                                $lastClearOrderId = $orderId;
+                            }
+                        }
+                        $hasPass = true;
+                    }
+                    $totalRemainAmount = bcadd($totalRemainAmount, $remainDebtPrice, 2);
+                    $need[] = $orderId;
+                }
+                if (!empty($need)) {
+                    //创建结账单,并且销结账单
+                    $orderData = OrderClass::getAllByCondition(['id' => ['in', $need]], null, '*', null, true);
+                    $staffId = $recharge->staffId ?? 0;
+                    $staffName = $recharge->staffName ?? '';
+                    $settleParams = ['staffId' => $staffId, 'staffName' => $staffName];
+                    $set = SettleClass::addSettle($orderData, $shop, $custom, $hd, $settleParams);
+                    $settleId = $set->id;
+                    $settleAmount = $set->actPrice ?? 0;
+                    SettleClass::clearSettle($set);
+                }
+            }
+        }
+
         $change = [
             'customId' => $customId,
             'customName' => $customName,
@@ -166,6 +218,10 @@ class RechargeClass extends BaseClass
             'staffName' => $staffName,
             'shopId' => $shopId,
             'mainId' => $mainId,
+            'settleId' => $settleId,
+            'settleAmount' => $settleAmount,
+            'orderId' => $lastClearOrderId,
+            'orderAmount' => $lastClearOrderAmount,
             'remark' => '',
         ];
         $returnChange = BalanceChangeClass::add($change, true);
@@ -175,6 +231,7 @@ class RechargeClass extends BaseClass
             $main = MainClass::getLockById($mainId);
             ShopClass::skRechargeAddBalance($main, $shop, $recharge);
         }
+
         return $returnChange;
     }