|
|
@@ -6,6 +6,8 @@ use biz\ghs\classes\GhsBackClass;
|
|
|
use bizGhs\clear\classes\OrderCgClearClass;
|
|
|
use bizGhs\clear\models\Clear;
|
|
|
use bizGhs\custom\classes\CustomClass;
|
|
|
+use bizGhs\custom\classes\CustomBalanceChangeClass;
|
|
|
+use bizGhs\ghs\classes\GhsBalanceChangeClass;
|
|
|
use bizGhs\custom\services\GhsRechargeSettleService;
|
|
|
use bizGhs\ghs\classes\GhsClass;
|
|
|
use bizGhs\ghs\models\Ghs;
|
|
|
@@ -141,45 +143,176 @@ class ClearController extends Controller
|
|
|
{
|
|
|
$list = GhsBackClass::getAllByCondition(['id>' => 0], null, '*', 'id', true);
|
|
|
if (!empty($list)) {
|
|
|
- foreach ($list as $ghs) {
|
|
|
- $ownPtStyle = $ghs['ownPtStyle'] ?? 1;
|
|
|
- $balance = $ghs['balance'] ?? 0;
|
|
|
- $customId = $ghs['customId'] ?? 0;
|
|
|
- if ($ownPtStyle == 1) {
|
|
|
- $custom = CustomClass::getById($customId, true);
|
|
|
- if (!empty($custom)) {
|
|
|
- $shopId = $ghs['shopId'] ?? 0;
|
|
|
- $shop = \bizGhs\shop\classes\ShopClass::getById($shopId, true);
|
|
|
- if (!empty($shop)) {
|
|
|
- $connection = Yii::$app->db;
|
|
|
- $transaction = $connection->beginTransaction();
|
|
|
- try {
|
|
|
- $staff = new \stdClass();
|
|
|
- $staff->id = 0;
|
|
|
- $staff->name = '';
|
|
|
- $params = [
|
|
|
- 'remark' => '系统升级恢复',
|
|
|
- 'rechargeType' => 0, // 0 代表正常充值
|
|
|
- ];
|
|
|
- // 模拟商家帮充并自动销挂账,payWay 设为 0 (线下微信)
|
|
|
- GhsRechargeSettleService::merchantRechargeWithAutoClear($custom, $balance, $shop, $staff, 0, $params);
|
|
|
- $transaction->commit();
|
|
|
- echo "customId: {$customId} 充值成功 {$balance} 元\n";
|
|
|
- } catch (\Exception $e) {
|
|
|
- $transaction->rollBack();
|
|
|
- echo "customId: {$customId} 充值失败: " . $e->getMessage() . "\n";
|
|
|
+ $connection = Yii::$app->db;
|
|
|
+ $transaction = $connection->beginTransaction();
|
|
|
+ try {
|
|
|
+ foreach ($list as $ghs) {
|
|
|
+ $ownPtStyle = $ghs['ownPtStyle'] ?? 1;
|
|
|
+ $balance = $ghs['balance'] ?? 0;
|
|
|
+ $customId = $ghs['customId'] ?? 0;
|
|
|
+ if($customId == 16440 || $customId == 46425){
|
|
|
+ if ($ownPtStyle == 1) {
|
|
|
+ $custom = CustomClass::getById($customId, true);
|
|
|
+ if (!empty($custom)) {
|
|
|
+ $shopId = $ghs['shopId'] ?? 0;
|
|
|
+ $shop = \bizGhs\shop\classes\ShopClass::getById($shopId, true);
|
|
|
+ if (!empty($shop)) {
|
|
|
+ $staff = new \stdClass();
|
|
|
+ $staff->id = 0;
|
|
|
+ $staff->name = '';
|
|
|
+ $params = [
|
|
|
+ 'remark' => '系统升级恢复',
|
|
|
+ 'rechargeType' => 0, // 0 代表正常充值
|
|
|
+ ];
|
|
|
+ // 模拟商家帮充并自动销挂账,payWay 设为 0 (线下微信)
|
|
|
+ GhsRechargeSettleService::merchantRechargeWithAutoClear($custom, $balance, $shop, $staff, 0, $params);
|
|
|
+ echo "customId: {$customId} 充值成功 {$balance} 元\n";
|
|
|
+ } else {
|
|
|
+ echo "customId: {$customId} 找不到对应的 shop\n";
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ echo "customId: {$customId} 找不到对应的 custom\n";
|
|
|
}
|
|
|
- } else {
|
|
|
- echo "customId: {$customId} 找不到对应的 shop\n";
|
|
|
}
|
|
|
- } else {
|
|
|
- echo "customId: {$customId} 找不到对应的 custom\n";
|
|
|
}
|
|
|
}
|
|
|
+ $transaction->commit();
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ $transaction->rollBack();
|
|
|
+ echo "执行失败,整体回滚: " . $e->getMessage() . "\n";
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 安全回滚最新一次“系统升级恢复”产生的多余充值和销账数据
|
|
|
+ * 支持传参单个 customId 测试:php yii clear/rollback-latest-upgrade 25695
|
|
|
+ * 批量跑全部:php yii clear/rollback-latest-upgrade
|
|
|
+ */
|
|
|
+ public function actionRollbackLatestUpgrade($customId = 0)
|
|
|
+ {
|
|
|
+ $connection = Yii::$app->db;
|
|
|
+ $customId = intval($customId);
|
|
|
+
|
|
|
+ // 1. 查找所有备注为 "系统升级恢复" 的充值流水 (按 ID 倒序,最新产生的在最前面)
|
|
|
+ $query = (new \yii\db\Query())
|
|
|
+ ->from('xhCustomRecharge')
|
|
|
+ ->where(['remark' => '系统升级恢复']);
|
|
|
+
|
|
|
+ if ($customId > 0) {
|
|
|
+ $query->andWhere(['customId' => $customId]);
|
|
|
+ }
|
|
|
+
|
|
|
+ $recharges = $query->orderBy('id DESC')->all();
|
|
|
+
|
|
|
+ if (empty($recharges)) {
|
|
|
+ echo "没有找到 '系统升级恢复' 相关的充值记录,无需回滚。\n";
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 按客户分组,找到每个客户绝对最新(最后一次运行)的那一笔充值
|
|
|
+ $latestRecharges = [];
|
|
|
+ foreach ($recharges as $r) {
|
|
|
+ $cid = $r['customId'];
|
|
|
+ if (!isset($latestRecharges[$cid])) {
|
|
|
+ $latestRecharges[$cid] = $r;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($customId > 0) {
|
|
|
+ echo "正在回滚指定客户 ID: {$customId} 的最新一笔升级恢复数据...\n";
|
|
|
+ } else {
|
|
|
+ echo "共找到 " . count($latestRecharges) . " 个客户的最新充值记录,准备执行批量安全回滚...\n";
|
|
|
+ }
|
|
|
+
|
|
|
+ $transaction = $connection->beginTransaction();
|
|
|
+ try {
|
|
|
+ foreach ($latestRecharges as $cr) {
|
|
|
+ $cId = intval($cr['customId']);
|
|
|
+ $amount = $cr['amount'];
|
|
|
+ $clearId = intval($cr['clearId']);
|
|
|
+ $crId = intval($cr['id']);
|
|
|
+ $ghsRechargeId = intval($cr['ghsRechargeId'] ?? 0);
|
|
|
+
|
|
|
+ // 1) 备注说明:根据用户指令,xhGhs (供货商) 与 xhGhsCustom (客户) 的 balance 余额无需变动还原,因此这里不执行余额扣减。
|
|
|
+
|
|
|
+ // 2) 如果这笔充值关联了自动销账(clearId > 0),精准回退订单待结和结账单状态
|
|
|
+ if ($clearId > 0) {
|
|
|
+ $cgClears = \bizGhs\clear\classes\OrderCgClearClass::getAllByCondition(['clearId' => $clearId], null, '*', null, true);
|
|
|
+ foreach ($cgClears as $cgClear) {
|
|
|
+ $orderId = intval($cgClear->orderId);
|
|
|
+ $cgId = intval($cgClear->cgId);
|
|
|
+ $clearedAmount = $cgClear->amount;
|
|
|
+
|
|
|
+ // a. 恢复批发端的订单未结挂账金额和状态 (xhOrder)
|
|
|
+ if ($orderId > 0) {
|
|
|
+ $order = \bizGhs\order\classes\OrderClass::getLockById($orderId);
|
|
|
+ if (!empty($order)) {
|
|
|
+ $order->remainDebtPrice = bcadd($order->remainDebtPrice, $clearedAmount, 2);
|
|
|
+ $order->debt = 1; // 重新恢复为挂账状态
|
|
|
+ if ($order->clearId == $clearId) {
|
|
|
+ $order->clearId = 0;
|
|
|
+ $order->clearTime = '0000-00-00 00:00:00';
|
|
|
+ }
|
|
|
+ $order->save(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // b. 恢复零售花店端的采购单未结挂账金额和状态 (xhPurchase)
|
|
|
+ $purchase = null;
|
|
|
+ if ($cgId > 0) {
|
|
|
+ $purchase = \bizHd\purchase\classes\PurchaseClass::getLockById($cgId);
|
|
|
+ } elseif ($orderId > 0) {
|
|
|
+ $purchase = \bizHd\purchase\classes\PurchaseClass::getByCondition(['saleId' => $orderId], true);
|
|
|
+ if (!empty($purchase)) {
|
|
|
+ $purchase = \bizHd\purchase\classes\PurchaseClass::getLockById($purchase->id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!empty($purchase)) {
|
|
|
+ $purchase->remainDebtPrice = bcadd($purchase->remainDebtPrice, $clearedAmount, 2);
|
|
|
+ $purchase->debt = 1; // 恢复挂账状态
|
|
|
+ if ($purchase->clearId == $clearId) {
|
|
|
+ $purchase->clearId = 0;
|
|
|
+ $purchase->clearTime = '0000-00-00 00:00:00';
|
|
|
+ }
|
|
|
+ $purchase->save(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除销账明细纪录
|
|
|
+ $cgClear->delete();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 将结账单(xhClear)置为已作废状态 (status = 3)
|
|
|
+ $clearObj = \bizGhs\order\classes\OrderClearClass::getLockById($clearId);
|
|
|
+ if (!empty($clearObj)) {
|
|
|
+ $clearObj->status = 3; // 3 代表已作废/已取消
|
|
|
+ $clearObj->save(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3) 删除本次充值产生的余额变动明细纪录
|
|
|
+ CustomBalanceChangeClass::deleteByCondition(['relateId' => $crId]);
|
|
|
+ if ($ghsRechargeId > 0) {
|
|
|
+ GhsBalanceChangeClass::deleteByCondition(['relateId' => $ghsRechargeId]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4) 删除充值记录本身
|
|
|
+ $connection->createCommand()->delete('xhCustomRecharge', ['id' => $crId])->execute();
|
|
|
+ if ($ghsRechargeId > 0) {
|
|
|
+ $connection->createCommand()->delete('xhGhsRecharge', ['id' => $ghsRechargeId])->execute();
|
|
|
+ }
|
|
|
+
|
|
|
+ echo "【成功】客户 ID: {$cId} 多余的充值及 {$amount} 元的销账订单已完美退回并删除!\n";
|
|
|
+ }
|
|
|
+
|
|
|
+ $transaction->commit();
|
|
|
+ echo "【全部完成】数据已成功安全回滚!\n";
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ $transaction->rollBack();
|
|
|
+ echo "【错误】回滚失败,已安全整体撤销。报错原因: " . $e->getMessage() . "\n";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public function actionGhsGhs()
|
|
|
{
|
|
|
ini_set('memory_limit', '2045M');
|
|
|
@@ -189,7 +322,6 @@ class ClearController extends Controller
|
|
|
$query->from(Ghs::tableName());
|
|
|
$query->where(['ownPtStyle' => 2]);
|
|
|
foreach ($query->batch(500) as $ghsList) {
|
|
|
-
|
|
|
$connection = Yii::$app->db;
|
|
|
$transaction = $connection->beginTransaction();
|
|
|
try {
|