Bladeren bron

充值和结账管理

shish 1 jaar geleden
bovenliggende
commit
69eb7c9bce
3 gewijzigde bestanden met toevoegingen van 68 en 65 verwijderingen
  1. 15 13
      app-hd/controllers/SettleController.php
  2. 42 33
      biz-hd/order/classes/SettleClass.php
  3. 11 19
      biz-hd/recharge/classes/RechargeClass.php

+ 15 - 13
app-hd/controllers/SettleController.php

@@ -41,24 +41,26 @@ class SettleController extends BaseController
                 util::fail('客户信息缺失');
             }
             //先充值
-            $mayClearAmount = 0;
+            $totalClear = 0;
             $idList = json_decode($idData, true);
             $ids = array_column($idList, 'id');
             if (empty($ids)) {
                 util::fail('请选择订单');
             }
-            $orderList = OrderClass::getAllByCondition(['id' => ['in', $ids]], null, '*', null, true);
-            if (empty($orderList)) {
-                util::fail('请选择订单呢');
-            }
-            foreach ($orderList as $order) {
-                if ($order->mainId != $this->mainId) {
-                    util::fail('不是你的订单哦');
+            $orderList = OrderClass::getAllByCondition(['id' => ['in', $ids]], null, 'id,mainId,remainDebtPrice', null, true);
+            $clearData = [];
+            if (!empty($orderList)) {
+                foreach ($orderList as $order) {
+                    if ($order->mainId != $this->mainId) {
+                        util::fail('不是你的订单哦');
+                    }
+                    $orderId = $order->id;
+                    $remainDebtPrice = $order->remainDebtPrice ?? 0;
+                    $clearData[] = [['orderId' => $orderId, 'clearAmount' => $remainDebtPrice]];
+                    $totalClear = bcadd($totalClear, $remainDebtPrice, 2);
                 }
-                $remainDebtPrice = $order->remainDebtPrice ?? 0;
-                $mayClearAmount = bcadd($mayClearAmount, $remainDebtPrice, 2);
             }
-            if (empty($mayClearAmount)) {
+            if (empty($totalClear)) {
                 util::fail('不需要销账');
             }
             $staffId = $this->shopAdminId;
@@ -78,7 +80,7 @@ class SettleController extends BaseController
 
             //创建待账单
             $settleParams = ['staffId' => $staffId, 'staffName' => $staffName];
-            $settle = SettleClass::addSettle($orderList, $shop, $custom, $hd, $settleParams);
+            $settle = SettleClass::addSettle($clearData, $shop, $custom, $hd, $settleParams);
             $settleId = $settle->id;
             $settleAmount = $settle->actPrice;
             $settleNo = $settle->orderSn ?? '';
@@ -93,7 +95,7 @@ class SettleController extends BaseController
                 'hdId' => $hdId,
                 'hdName' => $hdName,
                 'onlinePay' => 1,
-                'amount' => $mayClearAmount,
+                'amount' => $totalClear,
                 'staffId' => $staffId,
                 'staffName' => $staffName,
                 'payStatus' => 0,

+ 42 - 33
biz-hd/order/classes/SettleClass.php

@@ -19,9 +19,9 @@ class SettleClass extends BaseClass
 
     //$side 0 表示花店创建结账单,1客户创建结账单,二者区别有花店有带$staff信息,客户没有
     //$params 预留参数
-    public static function addSettle($orderList, $shop, $custom, $hd, $params = [])
+    public static function addSettle($orderData, $shop, $custom, $hd, $params = [])
     {
-        $totalRemain = 0;
+        $totalClear = 0;
         $shopId = $shop->id;
         $mainId = $shop->mainId;
         $sjId = $shop->sjId;
@@ -42,24 +42,16 @@ class SettleClass extends BaseClass
         $staffName = $params['staffName'] ?? '';
 
         $settleOrderSn = orderSn::getSettleSn();
-        $idList = [];
-        foreach ($orderList as $order) {
-            $remainDebtPrice = $order->remainDebtPrice ?? 0;
-            $totalRemain = bcadd($totalRemain, $remainDebtPrice, 2);
-            $idList[] = $order->id;
-        }
-        $string = implode(",", $idList);
-        $num = count($orderList);
+        $num = count($orderData);
         $settleData = [
-            'prePrice' => $totalRemain,
-            'actPrice' => $totalRemain,
-            'realPrice' => $totalRemain,
+            'prePrice' => 0,
+            'actPrice' => 0,
+            'realPrice' => 0,
             'payWay' => 0,
             'shopId' => $shopId,
             'mainId' => $mainId,
             'sjId' => $sjId,
             'purchaseIds' => '',
-            'saleIds' => $string,
             'num' => $num,
             'status' => 1,
             'customId' => $customId,
@@ -79,39 +71,56 @@ class SettleClass extends BaseClass
             'orderSn' => $settleOrderSn,
             'payTime' => '0000-00-00 00:00:00',
         ];
-        return self::addData($settleData);
+        $set = self::addData($settleData);
+        $settleId = $set->id;
+        foreach ($orderData as $order) {
+            $orderId = $order['orderId'];
+            $clearAmount = $order['clearAmount'] ?? 0;
+            OrderSettleClass::add(['orderId' => $orderId, 'settleId' => $settleId, 'status' => 0, 'amount' => $clearAmount]);
+            $totalClear = bcadd($totalClear, $clearAmount, 2);
+        }
+        $set->prePrice = $totalClear;
+        $set->actPrice = $totalClear;
+        $set->realPrice = $totalClear;
+        $set->save();
+        return $set;
     }
 
     public static function clearSettle($set)
     {
         $settleId = $set->id;
-        $str = $set->saleIds;
-        $ids = explode(",", $str);
-        $ids = array_filter(array_unique($ids));
-        $totalDebtPrice = 0;
+        $orderSettle = OrderSettleClass::getAllByCondition(['settleId' => $settleId], null, '*', null, true);
+        $ids = [];
+        $amountMap = [];
+        if (!empty($orderSettle)) {
+            foreach ($orderSettle as $os) {
+                $orderId = $os->orderId;
+                $ids[] = $orderId;
+                $amountMap[$orderId] = $os->amount;
+                $os->status = 1;
+                $os->save();
+            }
+        }
+
+        $totalClearAmount = 0;
         if (empty($ids)) {
-            return ['totalDebtPrice' => $totalDebtPrice];
+            return ['totalDebtPrice' => $totalClearAmount];
         }
         $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;
+                $orderId = $order->id;
+                $mayClearAmount = $amountMap[$orderId] ?? 0;
+                $totalClearAmount = bcadd($totalClearAmount, $mayClearAmount, 2);
+                $order->remainDebtPrice = bcsub($order->remainDebtPrice, $mayClearAmount, 2);
+                if ($order->remainDebtPrice <= 0) {
+                    $order->debt = 0;
+                }
                 $order->settleTime = date("Y-m-d H:i:s");
                 $order->save();
-
-                $orderId = $order->id;
-                $relate = [
-                    'settleId' => $settleId,
-                    'orderId' => $orderId,
-                    'amount' => $remainDebtPrice,
-                ];
-                OrderSettleClass::add($relate, true);
             }
         }
-        return ['totalDebtPrice' => $totalDebtPrice];
+        return ['totalClearAmount' => $totalClearAmount];
     }
 
     //结清尾款 ssh 20220708

+ 11 - 19
biz-hd/recharge/classes/RechargeClass.php

@@ -157,66 +157,61 @@ class RechargeClass extends BaseClass
         $settleId = $recharge->settleId;
         $settleAmount = 0;
         $settleNo = '';
-        $lastClearOrderId = 0;
-        $lastClearOrderNo = '';
         $realClearAmount = 0;
-        $lastClearOrderAmount = 0;
         if (!empty($settleId)) {
             //如果有结账单,按结账单销账
             $set = SettleClass::getById($settleId, true);
             $res = SettleClass::clearSettle($set);
-            $realClearAmount = $res['totalDebtPrice'] ?? 0;
+            $realClearAmount = $res['totalClearAmount'] ?? 0;
             $settleAmount = $set->actPrice ?? 0;
             $settleNo = $set->orderSn ?? '';
         } else {
-            //没有结账单,按顺序去销账,这里的逻辑,请去查看原型文档,来理解需求
+            //没有结账单,按顺序去销订单欠款
             $orderList = OrderClass::getAllByCondition(['customId' => $customId, 'debt' => 1], 'id asc', '*', null, true);
             if (!empty($orderList)) {
                 $lastRemainDebtAmount = 0;
-                $needClearIds = [];
+                $needClearIdMap = [];
                 $hasOver = false;
                 foreach ($orderList as $order) {
                     $orderId = $order->id ?? 0;
+                    //销订单全部的欠款!!!
                     $remainDebtPrice = $order->remainDebtPrice ?? 0;
                     $currentTotalDebtAmount = bcadd($lastRemainDebtAmount, $remainDebtPrice, 2);
                     if ($currentTotalDebtAmount > $getBalance) {
-                        //如果剩下的钱不够销结账单,可以拿来销订单,具体请查看原型文档来理解
                         if (!$hasOver) {
                             $lastClearOrderAmount = bcsub($getBalance, $lastRemainDebtAmount, 2);
                             if ($lastClearOrderAmount > 0) {
-                                //清除欠款
+                                //销订单部分的欠款!!!
                                 $order->remainDebtPrice = bcsub($order->remainDebtPrice, $lastClearOrderAmount, 2);
                                 $order->save();
-                                //记录清除欠款的订单id和编号
                                 $lastClearOrderId = $orderId;
-                                $lastClearOrderNo = $order->orderSn ?? '';
+                                $needClearIdMap[] = ['orderId' => $lastClearOrderId, 'clearAmount' => $lastClearOrderAmount];
                             }
                         }
                         $hasOver = true;
                         continue;
                     }
                     $lastRemainDebtAmount = bcadd($lastRemainDebtAmount, $remainDebtPrice, 2);
-                    $needClearIds[] = $orderId;
+                    $needClearIdMap[] = ['orderId' => $orderId, 'clearAmount' => $remainDebtPrice];
                 }
-                if (!empty($needClearIds)) {
+                if (!empty($needClearIdMap)) {
                     //创建结账单,并且销结账单
-                    $orderData = OrderClass::getAllByCondition(['id' => ['in', $needClearIds]], null, '*', null, true);
                     $staffId = $recharge->staffId ?? 0;
                     $staffName = $recharge->staffName ?? '';
                     $settleParams = ['staffId' => $staffId, 'staffName' => $staffName];
-                    $set = SettleClass::addSettle($orderData, $shop, $custom, $hd, $settleParams);
+                    $set = SettleClass::addSettle($needClearIdMap, $shop, $custom, $hd, $settleParams);
                     $settleId = $set->id;
                     $settleNo = $set->orderSn ?? '';
                     $settleAmount = $set->actPrice ?? 0;
                     $res = SettleClass::clearSettle($set);
-                    $realClearAmount = $res['totalDebtPrice'] ?? 0;
+                    $realClearAmount = $res['totalClearAmount'] ?? 0;
                 }
             }
         }
         if ($settleId > 0) {
             if (floatval($getBalance) != floatval($realClearAmount) || floatval($getBalance) != floatval($settleAmount)) {
                 $rechargeId = $recharge->id;
-                noticeUtil::push("注意,充值单,结账单,和实际清掉欠款金额不一致:{$getBalance} {$realClearAmount} {$settleAmount},settleId:{$settleId} recharge:{$rechargeId}", '15280215347');
+                noticeUtil::push("注意,充值单,结账单,和实际清掉欠款金额不一致:getBalance:{$getBalance} totalAmount:{$realClearAmount} settleAmount:{$settleAmount},settleId:{$settleId} recharge:{$rechargeId}", '15280215347');
             }
         }
 
@@ -239,9 +234,6 @@ class RechargeClass extends BaseClass
             'settleId' => $settleId,
             'settleNo' => $settleNo,
             'settleAmount' => $settleAmount,
-            'orderId' => $lastClearOrderId,
-            'orderNo' => $lastClearOrderNo,
-            'orderAmount' => $lastClearOrderAmount,
             'remark' => '',
         ];
         $returnChange = BalanceChangeClass::add($change, true);