GhsPurchaseBalanceMergeController.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <?php
  2. namespace console\controllers;
  3. use biz\ghs\classes\GhsClass as BizGhsClass;
  4. use bizGhs\custom\classes\AccountMoneyClass;
  5. use common\components\dict;
  6. use yii\console\Controller;
  7. /**
  8. * ghsApp 采购供货商 xhGhs 余额合并(按采购待结订单重算)
  9. *
  10. * 【用途】仅处理 ghsApp 采购供货商行(ownPtStyle=ghs/kmGhs),不处理 hd 花店侧 xhGhs 行(ownPtStyle=hd)。
  11. * 【公式】净 balance = max(原正余额,0) - 待结 ghs 采购单 actPrice 合计,debtAmount 清 0。
  12. *
  13. * hd 花店侧供货商请用:php yii balance-merge/run
  14. *
  15. * 用法:php yii ghs-purchase-balance-merge/run
  16. * 预览:php yii ghs-purchase-balance-merge/run --dryRun=1
  17. * 单户:php yii ghs-purchase-balance-merge/run --ghsId=123
  18. */
  19. class GhsPurchaseBalanceMergeController extends Controller
  20. {
  21. /** 1=只预览不写库 */
  22. public $dryRun = 0;
  23. /** 指定 xhGhs.id,0=扫全表符合条件的 ghsApp 采购供货商行 */
  24. public $ghsId = 0;
  25. public function options($actionID)
  26. {
  27. return array_merge(parent::options($actionID), ['dryRun', 'ghsId']);
  28. }
  29. /**
  30. * 执行或预览:仅 ghsApp 采购供货商(ownPtStyle=ghs/kmGhs)按采购待结订单重算净余额。
  31. */
  32. public function actionRun()
  33. {
  34. $dry = (int)$this->dryRun === 1;
  35. $ghsId = intval($this->ghsId);
  36. echo $dry ? "【预览:ghsApp 采购供货商按订单重算余额】\n" : "【执行:ghsApp 采购供货商按订单重算余额】\n";
  37. if ($ghsId > 0) {
  38. $count = $this->mergeOneGhs($ghsId, $dry) ? 1 : 0;
  39. echo "完成:处理 {$count} 条,dryRun=" . ($dry ? '1' : '0') . PHP_EOL;
  40. return;
  41. }
  42. $count = 0;
  43. $purchasePtStyles = $this->getGhsAppPurchasePtStyles();
  44. $where = ['and', ['>', 'ownShopId', 0], ['in', 'ownPtStyle', $purchasePtStyles]];
  45. if ($this->columnExists('xhGhs', 'balanceMerged')) {
  46. $where = ['and', ['>', 'ownShopId', 0], ['in', 'ownPtStyle', $purchasePtStyles], ['balanceMerged' => 0]];
  47. } else {
  48. $where = ['and', ['>', 'ownShopId', 0], ['in', 'ownPtStyle', $purchasePtStyles], ['>', 'debtAmount', 0]];
  49. }
  50. $list = BizGhsClass::getAllByCondition($where, null, 'id,ownShopId,ownPtStyle,balance,debtAmount,balanceMerged', null, true);
  51. foreach ($list as $ghs) {
  52. if ($this->mergeOneGhs(intval($ghs->id ?? 0), $dry)) {
  53. $count++;
  54. }
  55. }
  56. // ownPtStyle 未回填的历史行:再扫 ownPtStyle=0,由 isGhsAppPurchaseSupplierRow 按门店 ptStyle 判定
  57. $legacyWhere = ['and', ['>', 'ownShopId', 0], ['ownPtStyle' => 0]];
  58. if ($this->columnExists('xhGhs', 'balanceMerged')) {
  59. $legacyWhere = ['and', ['>', 'ownShopId', 0], ['ownPtStyle' => 0], ['balanceMerged' => 0]];
  60. }
  61. $legacyList = BizGhsClass::getAllByCondition($legacyWhere, null, 'id,ownShopId,ownPtStyle,balance,debtAmount,balanceMerged', null, true);
  62. foreach ($legacyList as $ghs) {
  63. if ($this->mergeOneGhs(intval($ghs->id ?? 0), $dry)) {
  64. $count++;
  65. }
  66. }
  67. echo "完成:处理 {$count} 条,dryRun=" . ($dry ? '1' : '0') . PHP_EOL;
  68. }
  69. /**
  70. * ghsApp 采购买方平台类型:二级批发(2)、基地端(4);不含 hd 花店(1)。
  71. */
  72. protected function getGhsAppPurchasePtStyles()
  73. {
  74. return [
  75. (int)dict::getDict('ptStyle', 'ghs'),
  76. (int)dict::getDict('ptStyle', 'kmGhs'),
  77. ];
  78. }
  79. /**
  80. * 合并单行;预览模式只打印将写入的金额。
  81. */
  82. protected function mergeOneGhs($ghsId, $dry)
  83. {
  84. if ($ghsId <= 0) {
  85. return false;
  86. }
  87. $ghs = BizGhsClass::getById($ghsId, true);
  88. if (empty($ghs)) {
  89. echo "[跳过] id={$ghsId} 不存在" . PHP_EOL;
  90. return false;
  91. }
  92. if (!AccountMoneyClass::isGhsAppPurchaseSupplierRow($ghs)) {
  93. $ownPtStyle = intval($ghs->ownPtStyle ?? 0);
  94. echo "[跳过] id={$ghsId} 非 ghsApp 采购供货商行(ownPtStyle={$ownPtStyle},hd 行请用 balance-merge)" . PHP_EOL;
  95. return false;
  96. }
  97. $ownShopId = intval($ghs->ownShopId ?? 0);
  98. $orderDebt = AccountMoneyClass::sumPurchaseOrderDebtForGhs($ghsId);
  99. $rawBalance = bcadd((string)($ghs->balance ?? '0'), '0', 2);
  100. $positiveCredit = bccomp($rawBalance, '0', 2) > 0 ? $rawBalance : '0.00';
  101. $newBalance = bcsub($positiveCredit, $orderDebt, 2);
  102. if ($dry) {
  103. echo "[ghsApp采购供货商] id={$ghsId} ownShopId={$ownShopId} ownPtStyle={$ghs->ownPtStyle}"
  104. . " balance={$ghs->balance} debtAmount={$ghs->debtAmount}"
  105. . " 采购待结合计={$orderDebt} => 新balance={$newBalance}" . PHP_EOL;
  106. return true;
  107. }
  108. $locked = BizGhsClass::getLockById($ghsId);
  109. AccountMoneyClass::mergeOwnShopGhsBalanceFromPurchaseOrdersIfNeeded($locked, true);
  110. echo "[已合并] id={$ghsId} 采购待结={$orderDebt} 新balance={$newBalance}" . PHP_EOL;
  111. return true;
  112. }
  113. /**
  114. * 判断 xhGhs 是否已有 balanceMerged 字段。
  115. */
  116. protected function columnExists($table, $column)
  117. {
  118. $db = \Yii::$app->db;
  119. $schema = $db->getTableSchema($table, true);
  120. return $schema && isset($schema->columns[$column]);
  121. }
  122. }