shish 2 月之前
父節點
當前提交
782536b30b
共有 1 個文件被更改,包括 146 次插入0 次删除
  1. 146 0
      console/controllers/ClearController.php

+ 146 - 0
console/controllers/ClearController.php

@@ -6,6 +6,8 @@ use biz\ghs\classes\GhsBackClass;
 use bizGhs\clear\classes\OrderCgClearClass;
 use bizGhs\clear\models\Clear;
 use bizGhs\custom\classes\CustomClass;
+use bizGhs\custom\classes\CustomBalanceChangeClass;
+use bizGhs\ghs\classes\GhsBalanceChangeClass;
 use bizGhs\custom\services\GhsRechargeSettleService;
 use bizGhs\ghs\classes\GhsClass;
 use bizGhs\ghs\models\Ghs;
@@ -180,6 +182,150 @@ class ClearController extends Controller
         }
     }
 
+    /**
+     * 安全回滚最新一次“系统升级恢复”产生的多余充值和销账数据
+     * 支持传参单个 customId 测试:php yii clear/rollback-latest-upgrade 25695
+     * 批量跑全部:php yii clear/rollback-latest-upgrade
+     */
+    public function actionRollbackLatestUpgrade($customId = 0)
+    {
+        $connection = Yii::$app->db;
+        $customId = intval($customId);
+        
+        // 1. 查找所有备注为 "系统升级恢复" 的充值流水 (按 ID 倒序,最新产生的在最前面)
+        $query = (new \yii\db\Query())
+            ->from('xhCustomRecharge')
+            ->where(['remark' => '系统升级恢复']);
+            
+        if ($customId > 0) {
+            $query->andWhere(['customId' => $customId]);
+        }
+        
+        $recharges = $query->orderBy('id DESC')->all();
+            
+        if (empty($recharges)) {
+            echo "没有找到 '系统升级恢复' 相关的充值记录,无需回滚。\n";
+            return;
+        }
+        
+        // 2. 按客户分组,找到每个客户绝对最新(最后一次运行)的那一笔充值
+        $latestRecharges = [];
+        foreach ($recharges as $r) {
+            $cid = $r['customId'];
+            if (!isset($latestRecharges[$cid])) {
+                $latestRecharges[$cid] = $r;
+            }
+        }
+        
+        if ($customId > 0) {
+            echo "正在回滚指定客户 ID: {$customId} 的最新一笔升级恢复数据...\n";
+        } else {
+            echo "共找到 " . count($latestRecharges) . " 个客户的最新充值记录,准备执行批量安全回滚...\n";
+        }
+        
+        $transaction = $connection->beginTransaction();
+        try {
+            foreach ($latestRecharges as $cr) {
+                $cId = intval($cr['customId']);
+                $amount = $cr['amount'];
+                $clearId = intval($cr['clearId']);
+                $crId = intval($cr['id']);
+                $ghsRechargeId = intval($cr['ghsRechargeId'] ?? 0);
+                
+                // 1) 锁定客户和供货商并扣回多充的余额
+                $custom = \bizGhs\custom\classes\CustomClass::getLockById($cId);
+                if (empty($custom)) {
+                    throw new \Exception("找不到客户: " . $cId);
+                }
+                $ghsId = $custom->ghsId;
+                $ghs = \bizGhs\ghs\classes\GhsClass::getLockById($ghsId);
+                if (empty($ghs)) {
+                    throw new \Exception("找不到供货商, customId: " . $cId);
+                }
+                
+                // 扣减多充的值
+                $custom->balance = bcsub($custom->balance, $amount, 2);
+                $ghs->balance = bcsub($ghs->balance, $amount, 2);
+                $custom->save(false);
+                $ghs->save(false);
+                
+                // 2) 如果这笔充值关联了自动销账(clearId > 0),精准回退订单待结和结账单状态
+                if ($clearId > 0) {
+                    $cgClears = \bizGhs\clear\classes\OrderCgClearClass::getAllByCondition(['clearId' => $clearId], null, '*', null, true);
+                    foreach ($cgClears as $cgClear) {
+                        $orderId = intval($cgClear->orderId);
+                        $cgId = intval($cgClear->cgId);
+                        $clearedAmount = $cgClear->amount;
+                        
+                        // a. 恢复批发端的订单未结挂账金额和状态 (xhOrder)
+                        if ($orderId > 0) {
+                            $order = \bizGhs\order\classes\OrderClass::getLockById($orderId);
+                            if (!empty($order)) {
+                                $order->remainDebtPrice = bcadd($order->remainDebtPrice, $clearedAmount, 2);
+                                $order->debt = 1; // 重新恢复为挂账状态
+                                if ($order->clearId == $clearId) {
+                                    $order->clearId = 0;
+                                    $order->clearTime = '0000-00-00 00:00:00';
+                                }
+                                $order->save(false);
+                            }
+                        }
+                        
+                        // b. 恢复零售花店端的采购单未结挂账金额和状态 (xhPurchase)
+                        $purchase = null;
+                        if ($cgId > 0) {
+                            $purchase = \bizHd\purchase\classes\PurchaseClass::getLockById($cgId);
+                        } elseif ($orderId > 0) {
+                            $purchase = \bizHd\purchase\classes\PurchaseClass::getByCondition(['saleId' => $orderId], true);
+                            if (!empty($purchase)) {
+                                $purchase = \bizHd\purchase\classes\PurchaseClass::getLockById($purchase->id);
+                            }
+                        }
+                        if (!empty($purchase)) {
+                            $purchase->remainDebtPrice = bcadd($purchase->remainDebtPrice, $clearedAmount, 2);
+                            $purchase->debt = 1; // 恢复挂账状态
+                            if ($purchase->clearId == $clearId) {
+                                $purchase->clearId = 0;
+                                $purchase->clearTime = '0000-00-00 00:00:00';
+                            }
+                            $purchase->save(false);
+                        }
+                        
+                        // 删除销账明细纪录
+                        $cgClear->delete();
+                    }
+                    
+                    // 将结账单(xhClear)置为已作废状态 (status = 3)
+                    $clearObj = \bizGhs\order\classes\OrderClearClass::getLockById($clearId);
+                    if (!empty($clearObj)) {
+                        $clearObj->status = 3; // 3 代表已作废/已取消
+                        $clearObj->save(false);
+                    }
+                }
+                
+                // 3) 删除本次充值产生的余额变动明细纪录
+                CustomBalanceChangeClass::deleteByCondition(['relateId' => $crId]);
+                if ($ghsRechargeId > 0) {
+                    GhsBalanceChangeClass::deleteByCondition(['relateId' => $ghsRechargeId]);
+                }
+                
+                // 4) 删除充值记录本身
+                $connection->createCommand()->delete('xhCustomRecharge', ['id' => $crId])->execute();
+                if ($ghsRechargeId > 0) {
+                    $connection->createCommand()->delete('xhGhsRecharge', ['id' => $ghsRechargeId])->execute();
+                }
+                
+                echo "【成功】客户 ID: {$cId} 多余的充值及 {$amount} 元的销账订单已完美退回并删除!\n";
+            }
+            
+            $transaction->commit();
+            echo "【全部完成】数据已成功安全回滚!\n";
+        } catch (\Exception $e) {
+            $transaction->rollBack();
+            echo "【错误】回滚失败,已安全整体撤销。报错原因: " . $e->getMessage() . "\n";
+        }
+    }
+
     public function actionGhsGhs()
     {
         ini_set('memory_limit', '2045M');