|
|
@@ -11,13 +11,15 @@ use yii\console\Controller;
|
|
|
* ghsApp 采购供货商 xhGhs 余额合并(按采购待结订单重算)
|
|
|
*
|
|
|
* 【用途】仅处理 ghsApp 采购供货商行(ownPtStyle=ghs/kmGhs),不处理 hd 花店侧 xhGhs 行(ownPtStyle=hd)。
|
|
|
- * 【公式】净 balance = max(原正余额,0) - 待结 ghs 采购单 actPrice 合计,debtAmount 清 0。
|
|
|
+ * 【公式】净 balance = max(当前正余额,0) - 待结 ghs 采购单 actPrice 合计;debtNum 与有效待结单数对齐。
|
|
|
+ * 【可重复执行】默认 force=1,已 balanceMerged 的行也会重算,并清理 actPrice<=0/已取消仍标待结的幽灵单。
|
|
|
*
|
|
|
* hd 花店侧供货商请用:php yii balance-merge/run
|
|
|
*
|
|
|
* 用法: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
|
|
|
+ * 仅未合并:php yii ghs-purchase-balance-merge/run --force=0
|
|
|
*/
|
|
|
class GhsPurchaseBalanceMergeController extends Controller
|
|
|
{
|
|
|
@@ -27,9 +29,12 @@ class GhsPurchaseBalanceMergeController extends Controller
|
|
|
/** 指定 xhGhs.id,0=扫全表符合条件的 ghsApp 采购供货商行 */
|
|
|
public $ghsId = 0;
|
|
|
|
|
|
+ /** 1=已合并行也重算(默认);0=仅处理未合并行 */
|
|
|
+ public $force = 1;
|
|
|
+
|
|
|
public function options($actionID)
|
|
|
{
|
|
|
- return array_merge(parent::options($actionID), ['dryRun', 'ghsId']);
|
|
|
+ return array_merge(parent::options($actionID), ['dryRun', 'ghsId', 'force']);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -38,46 +43,47 @@ class GhsPurchaseBalanceMergeController extends Controller
|
|
|
public function actionRun()
|
|
|
{
|
|
|
$dry = (int)$this->dryRun === 1;
|
|
|
+ $force = (int)$this->force === 1;
|
|
|
$ghsId = intval($this->ghsId);
|
|
|
echo $dry ? "【预览:ghsApp 采购供货商按订单重算余额】\n" : "【执行:ghsApp 采购供货商按订单重算余额】\n";
|
|
|
+ echo 'force=' . ($force ? '1(含已合并)' : '0(仅未合并)') . PHP_EOL;
|
|
|
|
|
|
if ($ghsId > 0) {
|
|
|
- $count = $this->mergeOneGhs($ghsId, $dry) ? 1 : 0;
|
|
|
+ $count = $this->mergeOneGhs($ghsId, $dry, $force) ? 1 : 0;
|
|
|
echo "完成:处理 {$count} 条,dryRun=" . ($dry ? '1' : '0') . PHP_EOL;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
$count = 0;
|
|
|
$purchasePtStyles = $this->getGhsAppPurchasePtStyles();
|
|
|
- // 本项目 conditionQuery 只支持哈希条件,不支持 Yii 的 ['and', ...] 写法
|
|
|
$where = [
|
|
|
'ownShopId>' => 0,
|
|
|
'ownPtStyle' => ['in', $purchasePtStyles],
|
|
|
];
|
|
|
- if ($this->columnExists('xhGhs', 'balanceMerged')) {
|
|
|
+ if (!$force && $this->columnExists('xhGhs', 'balanceMerged')) {
|
|
|
$where['balanceMerged'] = 0;
|
|
|
- } else {
|
|
|
+ } elseif (!$force) {
|
|
|
$where['debtAmount>'] = 0;
|
|
|
}
|
|
|
|
|
|
- $list = BizGhsClass::getAllByCondition($where, null, 'id,ownShopId,ownPtStyle,balance,debtAmount,balanceMerged', null, true);
|
|
|
+ $list = BizGhsClass::getAllByCondition($where, null, 'id,ownShopId,ownPtStyle,balance,debtAmount,debtNum,balanceMerged', null, true);
|
|
|
foreach ($list as $ghs) {
|
|
|
- if ($this->mergeOneGhs(intval($ghs->id ?? 0), $dry)) {
|
|
|
+ if ($this->mergeOneGhs(intval($ghs->id ?? 0), $dry, $force)) {
|
|
|
$count++;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // ownPtStyle 未回填的历史行:再扫 ownPtStyle=0,由 isGhsAppPurchaseSupplierRow 按门店 ptStyle 判定
|
|
|
+ // ownPtStyle 未回填的历史行
|
|
|
$legacyWhere = [
|
|
|
'ownShopId>' => 0,
|
|
|
'ownPtStyle' => 0,
|
|
|
];
|
|
|
- if ($this->columnExists('xhGhs', 'balanceMerged')) {
|
|
|
+ if (!$force && $this->columnExists('xhGhs', 'balanceMerged')) {
|
|
|
$legacyWhere['balanceMerged'] = 0;
|
|
|
}
|
|
|
- $legacyList = BizGhsClass::getAllByCondition($legacyWhere, null, 'id,ownShopId,ownPtStyle,balance,debtAmount,balanceMerged', null, true);
|
|
|
+ $legacyList = BizGhsClass::getAllByCondition($legacyWhere, null, 'id,ownShopId,ownPtStyle,balance,debtAmount,debtNum,balanceMerged', null, true);
|
|
|
foreach ($legacyList as $ghs) {
|
|
|
- if ($this->mergeOneGhs(intval($ghs->id ?? 0), $dry)) {
|
|
|
+ if ($this->mergeOneGhs(intval($ghs->id ?? 0), $dry, $force)) {
|
|
|
$count++;
|
|
|
}
|
|
|
}
|
|
|
@@ -99,7 +105,7 @@ class GhsPurchaseBalanceMergeController extends Controller
|
|
|
/**
|
|
|
* 合并单行;预览模式只打印将写入的金额。
|
|
|
*/
|
|
|
- protected function mergeOneGhs($ghsId, $dry)
|
|
|
+ protected function mergeOneGhs($ghsId, $dry, $force)
|
|
|
{
|
|
|
if ($ghsId <= 0) {
|
|
|
return false;
|
|
|
@@ -116,21 +122,28 @@ class GhsPurchaseBalanceMergeController extends Controller
|
|
|
}
|
|
|
|
|
|
$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';
|
|
|
+ $oldBalance = bcadd((string)($ghs->balance ?? '0'), '0', 2);
|
|
|
+ $oldDebtNum = intval($ghs->debtNum ?? 0);
|
|
|
+ $fixedOrders = AccountMoneyClass::countInvalidPurchaseDebtOrders($ghsId);
|
|
|
+ $debtStats = AccountMoneyClass::getValidPurchaseDebtStats($ghsId);
|
|
|
+ $orderDebt = $debtStats['amount'];
|
|
|
+ $orderDebtNum = $debtStats['num'];
|
|
|
+ $positiveCredit = bccomp($oldBalance, '0', 2) > 0 ? $oldBalance : '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;
|
|
|
+ . " 原balance={$oldBalance} 原debtNum={$oldDebtNum}"
|
|
|
+ . " 清理幽灵单={$fixedOrders}"
|
|
|
+ . " 待结{$orderDebtNum}笔合计={$orderDebt} => 新balance={$newBalance} 新debtNum={$orderDebtNum}" . PHP_EOL;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
$locked = BizGhsClass::getLockById($ghsId);
|
|
|
- AccountMoneyClass::mergeOwnShopGhsBalanceFromPurchaseOrdersIfNeeded($locked, true);
|
|
|
- echo "[已合并] id={$ghsId} 采购待结={$orderDebt} 新balance={$newBalance}" . PHP_EOL;
|
|
|
+ $fixedOrders = AccountMoneyClass::syncInvalidPurchaseDebtOrders($ghsId);
|
|
|
+ AccountMoneyClass::mergeOwnShopGhsBalanceFromPurchaseOrdersIfNeeded($locked, false, $force);
|
|
|
+ echo "[已重算] id={$ghsId} 清理幽灵单={$fixedOrders} 待结{$orderDebtNum}笔合计={$orderDebt}"
|
|
|
+ . " balance {$oldBalance}=>{$newBalance} debtNum {$oldDebtNum}=>{$orderDebtNum}" . PHP_EOL;
|
|
|
return true;
|
|
|
}
|
|
|
|