| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- <?php
- namespace console\controllers;
- use biz\ghs\classes\GhsClass as BizGhsClass;
- use bizGhs\custom\classes\AccountMoneyClass;
- use yii\console\Controller;
- /**
- * 采购供货商 xhGhs 余额合并(按采购待结订单重算)
- *
- * 【用途】批量处理 ghsApp 采购供货商(ownShopId>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]);
- }
- }
|