0)未 merge 的 xhGhs 行: * 净 balance = max(原正余额,0) - 待结采购单 actPrice 合计,debtAmount 清 0。 * 【与线上一致】调用 AccountMoneyClass::mergeOwnShopGhsBalanceFromPurchaseOrdersIfNeeded。 * * 用法:php yii ghs-purchase-balance-merge/run * 预览:php yii ghs-purchase-balance-merge/run --dryRun=1 * 单户:php yii ghs-purchase-balance-merge/run --ghsId=123 */ class GhsPurchaseBalanceMergeController extends Controller { /** 1=只预览不写库 */ public $dryRun = 0; /** 指定 xhGhs.id,0=扫全表符合条件的 ownShop 行 */ public $ghsId = 0; public function options($actionID) { return array_merge(parent::options($actionID), ['dryRun', 'ghsId']); } /** * 执行或预览:按采购待结订单重算 ownShop 供货商净余额。 */ public function actionRun() { $dry = (int)$this->dryRun === 1; $ghsId = intval($this->ghsId); echo $dry ? "【预览:采购供货商按订单重算余额】\n" : "【执行:采购供货商按订单重算余额】\n"; if ($ghsId > 0) { $count = $this->mergeOneGhs($ghsId, $dry) ? 1 : 0; echo "完成:处理 {$count} 条,dryRun=" . ($dry ? '1' : '0') . PHP_EOL; return; } $count = 0; $where = ['and', ['>', 'ownShopId', 0]]; if ($this->columnExists('xhGhs', 'balanceMerged')) { $where = ['and', ['>', 'ownShopId', 0], ['balanceMerged' => 0]]; } else { $where = ['and', ['>', 'ownShopId', 0], ['>', 'debtAmount', 0]]; } $list = BizGhsClass::getAllByCondition($where, null, 'id,ownShopId,balance,debtAmount,balanceMerged', null, true); foreach ($list as $ghs) { if ($this->mergeOneGhs(intval($ghs->id ?? 0), $dry)) { $count++; } } echo "完成:处理 {$count} 条,dryRun=" . ($dry ? '1' : '0') . PHP_EOL; } /** * 合并单行;预览模式只打印将写入的金额。 */ 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; } $ownShopId = intval($ghs->ownShopId ?? 0); if ($ownShopId <= 0) { echo "[跳过] id={$ghsId} 非采购供货商行(无 ownShopId)" . PHP_EOL; return false; } $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 "[供货商] id={$ghsId} ownShopId={$ownShopId} 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]); } }