Browse Source

结账问题修复

shish 1 month ago
parent
commit
690f88c448
1 changed files with 56 additions and 15 deletions
  1. 56 15
      biz-ghs/order/classes/OrderClearClass.php

+ 56 - 15
biz-ghs/order/classes/OrderClearClass.php

@@ -349,7 +349,8 @@ class OrderClearClass extends BaseClass
             }
             OrderClass::updateById($orderId, $orderUpdate);
 
-            self::syncHdPurchaseAfterOrderClear($orderId, $cgId, $mayClear, $clearId, $clearTime);
+            // 批发单销账后立即按 xhGhsOrder 结果写回 xhCg,与充值 FIFO 同一事务内完成
+            self::syncHdPurchaseAfterOrderClear($orderId, $cgId, $clearId, $clearTime);
 
             $totalSettled = bcadd($totalSettled, $mayClear, 2);
             $os->amount = $mayClear;
@@ -403,29 +404,69 @@ class OrderClearClass extends BaseClass
     }
 
     /**
-     * 批发订单销账后同步花店采购单待结(充值 FIFO 等);cgId 缺失时按 saleId 回查。
+     * 批发订单销账后同步花店采购单待结(充值 FIFO、结账单确认等)。
+     * 以销账后的 xhGhsOrder 为准写回 xhCg,避免两边各自加减导致 remainDebtPrice 不一致。
+     *
+     * @param int $orderId 批发销售单 id(xhGhsOrder.id)
+     * @param int $cgId 结账单明细上的采购单 id,缺失时按 saleId 回查 xhCg
+     * @param int $clearId 结账单 id
+     * @param string $clearTime 销账时间
      */
-    protected static function syncHdPurchaseAfterOrderClear($orderId, $cgId, $mayClear, $clearId, $clearTime)
+    protected static function syncHdPurchaseAfterOrderClear($orderId, $cgId, $clearId, $clearTime)
     {
+        $orderId = intval($orderId);
+        $cgId = intval($cgId);
+        $clearId = intval($clearId);
+        if ($orderId <= 0) {
+            return;
+        }
+
+        $order = OrderClass::getById($orderId, true);
+        if (empty($order)) {
+            noticeUtil::push("批发销账后同步采购单失败:未找到销售单 orderId:{$orderId} clearId:{$clearId}", '15280215347');
+            return;
+        }
+
         $purchase = null;
-        if (intval($cgId) > 0) {
+        if ($cgId > 0) {
             $purchase = PurchaseClass::getById($cgId, true);
-        } elseif (intval($orderId) > 0) {
-            $purchase = PurchaseClass::getByCondition(['saleId' => $orderId], true);
         }
         if (empty($purchase)) {
+            $orderSn = $order->orderSn ?? '';
+            noticeUtil::push(
+                "批发销账后同步采购单失败:未找到采购单 orderId:{$orderId} orderSn:{$orderSn} cgId:{$cgId} clearId:{$clearId}",
+                '15280215347'
+            );
             return;
         }
-        $pRemain = bcsub((string)($purchase->remainDebtPrice ?? 0), (string)$mayClear, 2);
-        $pUpdate = [
-            'remainDebtPrice' => bccomp($pRemain, '0', 2) > 0 ? $pRemain : '0.00',
-            'clearTime' => $clearTime,
-        ];
-        if (bccomp($pRemain, '0', 2) <= 0) {
-            $pUpdate['debt'] = PurchaseClass::DEBT_NO;
-            $pUpdate['clearId'] = $clearId;
+
+        $orderRemain = bcadd((string)($order->remainDebtPrice ?? '0'), '0', 2);
+        $orderDebtFlag = intval($order->debt ?? 0);
+        $orderDebtPrice = bcadd((string)($order->debtPrice ?? $order->orderPrice ?? '0'), '0', 2);
+
+        $saveFields = ['remainDebtPrice', 'clearTime', 'debt'];
+        $purchase->remainDebtPrice = bccomp($orderRemain, '0', 2) > 0 ? $orderRemain : '0.00';
+        $purchase->clearTime = $clearTime;
+
+        if ($orderDebtFlag === OrderClass::DEBT_YES) {
+            $purchase->debt = PurchaseClass::DEBT_YES;
+        } else {
+            $purchase->debt = PurchaseClass::DEBT_NO;
+            $orderClearId = intval($order->clearId ?? 0);
+            if ($orderClearId > 0) {
+                $purchase->clearId = $orderClearId;
+            } elseif ($clearId > 0) {
+                $purchase->clearId = $clearId;
+            }
+            $saveFields[] = 'clearId';
+        }
+
+        if (bccomp((string)($purchase->debtPrice ?? '0'), '0', 2) <= 0 && bccomp($orderDebtPrice, '0', 2) > 0) {
+            $purchase->debtPrice = $orderDebtPrice;
+            $saveFields[] = 'debtPrice';
         }
-        $purchase->save(false, array_keys($pUpdate));
+
+        $purchase->save(false, array_values(array_unique($saveFields)));
     }
 
 }