dryRun === 1; $ghsId = intval($this->ghsId); echo $dry ? "【预览:ghsApp 采购供货商按订单重算余额】\n" : "【执行:ghsApp 采购供货商按订单重算余额】\n"; if ($ghsId > 0) { $count = $this->mergeOneGhs($ghsId, $dry) ? 1 : 0; echo "完成:处理 {$count} 条,dryRun=" . ($dry ? '1' : '0') . PHP_EOL; return; } $count = 0; $purchasePtStyles = $this->getGhsAppPurchasePtStyles(); $where = ['and', ['>', 'ownShopId', 0], ['in', 'ownPtStyle', $purchasePtStyles]]; if ($this->columnExists('xhGhs', 'balanceMerged')) { $where = ['and', ['>', 'ownShopId', 0], ['in', 'ownPtStyle', $purchasePtStyles], ['balanceMerged' => 0]]; } else { $where = ['and', ['>', 'ownShopId', 0], ['in', 'ownPtStyle', $purchasePtStyles], ['>', 'debtAmount', 0]]; } $list = BizGhsClass::getAllByCondition($where, null, 'id,ownShopId,ownPtStyle,balance,debtAmount,balanceMerged', null, true); foreach ($list as $ghs) { if ($this->mergeOneGhs(intval($ghs->id ?? 0), $dry)) { $count++; } } // ownPtStyle 未回填的历史行:再扫 ownPtStyle=0,由 isGhsAppPurchaseSupplierRow 按门店 ptStyle 判定 $legacyWhere = ['and', ['>', 'ownShopId', 0], ['ownPtStyle' => 0]]; if ($this->columnExists('xhGhs', 'balanceMerged')) { $legacyWhere = ['and', ['>', 'ownShopId', 0], ['ownPtStyle' => 0], ['balanceMerged' => 0]]; } $legacyList = BizGhsClass::getAllByCondition($legacyWhere, null, 'id,ownShopId,ownPtStyle,balance,debtAmount,balanceMerged', null, true); foreach ($legacyList as $ghs) { if ($this->mergeOneGhs(intval($ghs->id ?? 0), $dry)) { $count++; } } echo "完成:处理 {$count} 条,dryRun=" . ($dry ? '1' : '0') . PHP_EOL; } /** * ghsApp 采购买方平台类型:二级批发(2)、基地端(4);不含 hd 花店(1)。 */ protected function getGhsAppPurchasePtStyles() { return [ (int)dict::getDict('ptStyle', 'ghs'), (int)dict::getDict('ptStyle', 'kmGhs'), ]; } /** * 合并单行;预览模式只打印将写入的金额。 */ protected function mergeOneGhs($ghsId, $dry) { if ($ghsId <= 0) { return false; } $ghs = BizGhsClass::getById($ghsId, true); if (empty($ghs)) { echo "[跳过] id={$ghsId} 不存在" . PHP_EOL; return false; } if (!AccountMoneyClass::isGhsAppPurchaseSupplierRow($ghs)) { $ownPtStyle = intval($ghs->ownPtStyle ?? 0); echo "[跳过] id={$ghsId} 非 ghsApp 采购供货商行(ownPtStyle={$ownPtStyle},hd 行请用 balance-merge)" . PHP_EOL; return false; } $ownShopId = intval($ghs->ownShopId ?? 0); $orderDebt = AccountMoneyClass::sumPurchaseOrderDebtForGhs($ghsId); $rawBalance = bcadd((string)($ghs->balance ?? '0'), '0', 2); $positiveCredit = bccomp($rawBalance, '0', 2) > 0 ? $rawBalance : '0.00'; $newBalance = bcsub($positiveCredit, $orderDebt, 2); if ($dry) { echo "[ghsApp采购供货商] id={$ghsId} ownShopId={$ownShopId} ownPtStyle={$ghs->ownPtStyle}" . " balance={$ghs->balance} debtAmount={$ghs->debtAmount}" . " 采购待结合计={$orderDebt} => 新balance={$newBalance}" . PHP_EOL; return true; } $locked = BizGhsClass::getLockById($ghsId); AccountMoneyClass::mergeOwnShopGhsBalanceFromPurchaseOrdersIfNeeded($locked, true); echo "[已合并] id={$ghsId} 采购待结={$orderDebt} 新balance={$newBalance}" . PHP_EOL; return true; } /** * 判断 xhGhs 是否已有 balanceMerged 字段。 */ protected function columnExists($table, $column) { $db = \Yii::$app->db; $schema = $db->getTableSchema($table, true); return $schema && isset($schema->columns[$column]); } }