FrozenFundService.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <?php
  2. namespace addons\DoubleCopy\common\services;
  3. use addons\DoubleCopy\common\enums\DoubleCopyEnum;
  4. use addons\DoubleCopy\common\models\DoubleCopyCommission;
  5. use addons\DoubleCopy\common\models\DoubleCopyFrozenFundClearLog;
  6. use addons\DoubleCopy\common\models\DoubleCopyUser;
  7. use common\enums\UserWalletEnum;
  8. use Exception;
  9. use RuntimeException;
  10. use services\common\UserWalletService;
  11. use Yii;
  12. class FrozenFundService extends BaseService
  13. {
  14. /**
  15. * 失效冻结基金
  16. *
  17. * @param DoubleCopyUser $doubleCopyUser
  18. *
  19. * @throws \yii\db\Exception
  20. */
  21. public function clearFrozenFundByDoubleCopyUser(DoubleCopyUser $doubleCopyUser)
  22. {
  23. $t = Yii::$app->db->beginTransaction();
  24. try {
  25. $frozenFund = $doubleCopyUser->frozen_fund;
  26. $frozenFundScore = $doubleCopyUser->frozen_fund_score;
  27. $no_settlement_money = DoubleCopyCommission::getNoSettlementForzen($doubleCopyUser->user_id);
  28. $no_settlement_score = DoubleCopyCommission::getNoSettlementForzen($doubleCopyUser->user_id, 'score');
  29. $frozenFund += $no_settlement_money;
  30. $frozenFundScore += $no_settlement_score;
  31. // 清空数组
  32. $clearArr = [];
  33. if ($frozenFund > 0) {
  34. $clearArr[] = ['reward_currency' => 'commission', 'money' => $frozenFund];
  35. $doubleCopyUser->frozen_fund = 0;
  36. }
  37. if ($frozenFundScore > 0) {
  38. $clearArr[] = ['reward_currency' => 'score', 'money' => $frozenFundScore];
  39. $doubleCopyUser->frozen_fund_score = 0;
  40. }
  41. if (!empty($clearArr)) {
  42. $saveRes = $doubleCopyUser->save();
  43. if (!$saveRes) {
  44. throw new RuntimeException('更新二二复制user失败');
  45. }
  46. }
  47. foreach ($clearArr as $item) {
  48. $saveRes = DoubleCopyFrozenFundClearLog::setData([
  49. 'mall_id' => $this->mall_id,
  50. 'user_id' => $doubleCopyUser->user_id,
  51. 'clear_num' => $item['money'],
  52. 'reward_currency' => $item['reward_currency'],
  53. 'operation_type' => DoubleCopyEnum::OPERATION_TYPE_FREEZE_FUND_MONTHLY_LIMITED_INVALID,
  54. ]);
  55. if (!$saveRes) {
  56. throw new RuntimeException('写入二二复制frozen_fund_clear_log 失败:' . DoubleCopyFrozenFundClearLog::getStaticError());
  57. }
  58. $saveRes = DoubleCopyCommission::setData([
  59. 'mall_id' => $this->mall_id,
  60. 'user_id' => $doubleCopyUser->user_id,
  61. 'settlement_type' => 1,
  62. 'capital_type' => DoubleCopyEnum::FREEZE_FUND,
  63. 'is_frozen' => 0,
  64. 'money' => -$item['money'],
  65. 'goods_name' => "用户({$doubleCopyUser->user_id})未达到当月业绩要求,冻结基金额度清零",
  66. 'reward_currency' => $item['reward_currency'],
  67. 'operation_type' => DoubleCopyEnum::OPERATION_TYPE_FREEZE_FUND_MONTHLY_LIMITED_INVALID,
  68. ]);
  69. if (!$saveRes) {
  70. throw new RuntimeException('写入二二复制commission 失败:' . DoubleCopyCommission::getStaticError());
  71. }
  72. }
  73. DoubleCopyCommission::updateAll(['settlement_type' => -1, 'updated_at' => time(), 'operation_type' => DoubleCopyEnum::OPERATION_TYPE_FREEZE_FUND_MONTHLY_LIMITED_INVALID], ['user_id' => $doubleCopyUser->user_id, 'capital_type' => DoubleCopyEnum::FREEZE_FUND, 'settlement_type' => [0, 2]]);
  74. $t->commit();
  75. } catch (Exception $e) {
  76. $t->rollBack();
  77. throw $e;
  78. }
  79. }
  80. /**
  81. * 解冻转给上级
  82. *
  83. * @param DoubleCopyUser $user
  84. * @param DoubleCopyUser $parentDoubleCopyUser
  85. *
  86. * @throws Exception
  87. */
  88. public function unfreezeHandleToParent(DoubleCopyUser $user, DoubleCopyUser $parentDoubleCopyUser)
  89. {
  90. $t = Yii::$app->db->beginTransaction();
  91. try {
  92. $unfreeze_money = $user->frozen_fund;
  93. $unfreeze_score = $user->frozen_fund_score;// 解冻的积分
  94. $no_settlement_money = DoubleCopyCommission::getNoSettlementForzen($user['user_id']);
  95. $no_settlement_score = DoubleCopyCommission::getNoSettlementForzen($user['user_id'], 'score');
  96. $unfreeze_money += $no_settlement_money;
  97. $unfreeze_score += $no_settlement_score;
  98. $toParentWalletArr = [];
  99. if ($unfreeze_money > 0) {
  100. $parentDoubleCopyUser->commission += $unfreeze_money;
  101. $toParentWalletArr[] = [
  102. 'wallet_type' => 'commission',
  103. 'money' => $unfreeze_money,
  104. ];
  105. $user->frozen_fund = 0;
  106. }
  107. if ($unfreeze_score > 0) {
  108. $parentDoubleCopyUser->score += $unfreeze_score;
  109. $toParentWalletArr[] = [
  110. 'wallet_type' => 'score',
  111. 'money' => $unfreeze_score,
  112. ];
  113. $user->frozen_fund_score = 0;
  114. }
  115. if (!$user->save()) throw new Exception($user->getError());
  116. if (!$parentDoubleCopyUser->save()) throw new Exception($parentDoubleCopyUser->getError());
  117. // 冻结资金记录修改状态
  118. DoubleCopyCommission::updateAll(
  119. ['settlement_type' => 1, 'updated_at' => time(), 'operation_type' => DoubleCopyEnum::OPERATION_TYPE_FREEZE_FUND_MONTHLY_LIMITED_TO_PARENT, 'operation_id' => $parentDoubleCopyUser['user_id']],
  120. ['user_id' => $user->user_id, 'capital_type' => DoubleCopyEnum::FREEZE_FUND, 'settlement_type' => [0, 2]]
  121. );
  122. foreach ($toParentWalletArr as $item) {
  123. $insert_wallet[] = [
  124. 'mall_id' => $this->mall_id,
  125. 'user_id' => $parentDoubleCopyUser['user_id'],
  126. 'is_frozen' => false,
  127. 'wallet_type' => $item['wallet_type'],
  128. 'money' => $item['money'],
  129. 'desc' => sprintf('用户(%d)在月份期限内未达标,资金解冻给上级', $user->user_id),
  130. 'source_table' => $user::tableName(),
  131. 'source_table_id' => $user->id,
  132. 'from_type' => DoubleCopyEnum::ADDONS_NAME,
  133. 'capital_type' => UserWalletEnum::BOSS_BONUS_FREEZE_FUND,
  134. ];
  135. DoubleCopyCommission::setData([
  136. 'mall_id' => $this->mall_id,
  137. 'user_id' => $user['user_id'],
  138. 'settlement_type' => 1,
  139. 'capital_type' => DoubleCopyEnum::FREEZE_FUND,
  140. 'is_frozen' => 0,
  141. 'money' => -$item['money'],
  142. 'reward_currency' => $item['wallet_type'],
  143. 'operation_type' => DoubleCopyEnum::OPERATION_TYPE_FREEZE_FUND_MONTHLY_LIMITED_TO_PARENT,
  144. 'operation_id' => $parentDoubleCopyUser['user_id']
  145. ]);
  146. DoubleCopyCommission::setData([
  147. 'mall_id' => $this->mall_id,
  148. 'user_id' => $parentDoubleCopyUser['user_id'],
  149. 'settlement_type' => 1,
  150. 'capital_type' => DoubleCopyEnum::FREEZE_FUND,
  151. 'is_frozen' => 0,
  152. 'money' => $item['money'],
  153. 'reward_currency' => $item['wallet_type'],
  154. 'operation_type' => DoubleCopyEnum::OPERATION_TYPE_FREEZE_FUND_MONTHLY_LIMITED_FROM_CHILD,
  155. 'operation_id' => $user->user_id
  156. ]);
  157. }
  158. $t->commit();
  159. } catch (Exception $e) {
  160. $t->rollBack();
  161. throw $e;
  162. }
  163. // 插入钱包
  164. if (!empty($insert_wallet)) {
  165. UserWalletService::batchHandleByQueue($insert_wallet);
  166. }
  167. }
  168. }