shish 2 ماه پیش
والد
کامیت
021141d54e
2فایلهای تغییر یافته به همراه27 افزوده شده و 13 حذف شده
  1. 3 2
      biz-ghs/clear/classes/OrderCgClearClass.php
  2. 24 11
      console/controllers/ClearController.php

+ 3 - 2
biz-ghs/clear/classes/OrderCgClearClass.php

@@ -394,9 +394,10 @@ class OrderCgClearClass extends BaseClass
 
     /**
      * 检测结账单关系表问题,无问题返回 null
+     * @param bool $checkEmptyAmount 是否把 amount 为空/0 视为问题(抽样检查传 false)
      * @return array|null ['reason'=>string, 'relationCount'=>int, 'expected'=>int]
      */
-    public static function detectBackfillIssue($clear, $relationCount, array $emptyAmountClearIds, array $legacyGys2KmGysClearIds)
+    public static function detectBackfillIssue($clear, $relationCount, array $emptyAmountClearIds, array $legacyGys2KmGysClearIds, $checkEmptyAmount = true)
     {
         $clearId = intval(is_object($clear) ? ($clear->id ?? 0) : ($clear['id'] ?? 0));
         if ($clearId <= 0) {
@@ -416,7 +417,7 @@ class OrderCgClearClass extends BaseClass
                 'expected' => $expected,
             ];
         }
-        if (in_array($clearId, $emptyAmountClearIds, true)) {
+        if ($checkEmptyAmount && in_array($clearId, $emptyAmountClearIds, true)) {
             return [
                 'reason' => 'amount为空或0',
                 'relationCount' => $relationCount,

+ 24 - 11
console/controllers/ClearController.php

@@ -37,8 +37,8 @@ class ClearController extends Controller
     /** @var int 每处理多少条输出一次进度,0=仅每批汇总 */
     public $logEvery = 500;
 
-    /** @var int 每种 clearStyle 抽样条数(check-order-cg-clear-sample 默认 5000) */
-    public $samplePerStyle = 5000;
+    /** @var int 每种 clearStyle 抽样条数(check-order-cg-clear-sample 默认 50000) */
+    public $samplePerStyle = 50000;
 
     /** @var int 抽样检查最多打印的问题明细条数 */
     public $showIssues = 30;
@@ -92,11 +92,13 @@ class ClearController extends Controller
     }
 
     /**
-     * 抽样检查 xhOrderCgClear:clearStyle 1/2/3 各抽 N 条(默认 5000),检查是否有漏补问题
+     * 抽样检查 xhOrderCgClear:clearStyle 1/2/3 各抽 N 条(默认 50000)
+     *
+     * 检查漏补、旧格式等问题;不检 amount=0(由 patch-order-cg-clear-amount 处理)
      *
      * 用法:
      *   php yii clear/check-order-cg-clear-sample
-     *   php yii clear/check-order-cg-clear-sample --samplePerStyle=5000
+     *   php yii clear/check-order-cg-clear-sample --samplePerStyle=50000
      *   php yii clear/check-order-cg-clear-sample --dryRun=0   # 发现问题顺带漏补
      */
     public function actionCheckOrderCgClearSample()
@@ -327,7 +329,7 @@ class ClearController extends Controller
     }
 
     /**
-     * clearStyle 1/2/3 各抽样 samplePerStyle 条,检查关系表是否有漏补问题
+     * clearStyle 1/2/3 各抽样 samplePerStyle 条,检查关系表漏补问题(不含 amount=0)
      */
     private function runSampleCheckOrderCgClear()
     {
@@ -347,7 +349,7 @@ class ClearController extends Controller
         ];
 
         $this->stdout(sprintf(
-            "抽样检查 xhOrderCgClear | 各 clearStyle 抽 %d 条(id DESC) | dryRun=%d | 最多展示 %d 条问题明细\n",
+            "抽样检查 xhOrderCgClear | 各 clearStyle 抽 %d 条(id DESC) | 不检 amount=0 | dryRun=%d | 最多展示 %d 条问题明细\n",
             $sampleSize,
             (int)$this->dryRun,
             (int)$this->showIssues
@@ -370,9 +372,16 @@ class ClearController extends Controller
             }
 
             $clearIds = array_map('intval', array_column($list, 'id'));
-            $emptyAmountClearIds = OrderCgClearClass::getClearIdsWithEmptyAmount($clearIds);
-            $legacyGys2KmGysClearIds = OrderCgClearClass::getClearIdsWithLegacyGys2KmGysRows($clearIds);
-            $relationCountMap = OrderCgClearClass::getRelationCountMap($clearIds);
+            $relationCountMap = [];
+            $legacyGys2KmGysClearIds = [];
+            foreach (array_chunk($clearIds, 2000) as $clearIdChunk) {
+                $relationCountMap += OrderCgClearClass::getRelationCountMap($clearIdChunk);
+                $legacyGys2KmGysClearIds = array_merge(
+                    $legacyGys2KmGysClearIds,
+                    OrderCgClearClass::getClearIdsWithLegacyGys2KmGysRows($clearIdChunk)
+                );
+            }
+            $legacyGys2KmGysClearIds = array_values(array_unique(array_map('intval', $legacyGys2KmGysClearIds)));
 
             $styleIssues = 0;
             $styleFixed = 0;
@@ -383,8 +392,9 @@ class ClearController extends Controller
                 $issue = OrderCgClearClass::detectBackfillIssue(
                     $clear,
                     $relationCount,
-                    $emptyAmountClearIds,
-                    $legacyGys2KmGysClearIds
+                    [],
+                    $legacyGys2KmGysClearIds,
+                    false
                 );
                 if ($issue === null) {
                     continue;
@@ -459,6 +469,9 @@ class ClearController extends Controller
         if ($this->dryRun && $totalIssues > 0) {
             $this->stdout("请加 --dryRun=0 执行漏补,或运行 backfill-order-cg-clear --reset=1 全量漏补\n");
         }
+        if ($totalIssues === 0) {
+            $this->stdout("amount=0 请单独跑: php yii clear/patch-order-cg-clear-amount\n");
+        }
 
         return $totalIssues > 0 ? ExitCode::UNSPECIFIED_ERROR : ExitCode::OK;
     }