FrozenFundController.php 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <?php
  2. /**
  3. * 冻结基金
  4. */
  5. namespace addons\DoubleCopy\console\controllers;
  6. use addons\DoubleCopy\common\enums\DoubleCopyEnum;
  7. use addons\DoubleCopy\common\logic\DoubleCopyLogic;
  8. use addons\DoubleCopy\common\models\DoubleCopyCommission;
  9. use addons\DoubleCopy\common\models\DoubleCopyFrozenFundClearLog;
  10. use addons\DoubleCopy\common\models\DoubleCopyLevel;
  11. use addons\DoubleCopy\common\models\DoubleCopyUser;
  12. use addons\DoubleCopy\common\services\FrozenFundService;
  13. use common\enums\StatusEnum;
  14. use common\helpers\ArrayHelper;
  15. use common\helpers\FormatHelper;
  16. use common\models\mall\Mall;
  17. use common\models\user\UserPartitionRelationship;
  18. use DateTime;
  19. use Exception;
  20. use RuntimeException;
  21. use yii\console\Controller;
  22. use yii\console\ExitCode;
  23. use Yii;
  24. class FrozenFundController extends Controller
  25. {
  26. /**
  27. * 冻结基金每月清零
  28. * @return void
  29. */
  30. public function actionClear()
  31. {
  32. try {
  33. $mall_list = Mall::getEnableMallList(true);
  34. foreach ($mall_list as $mall){
  35. $mall_id = $mall['id'];
  36. //is_open_frozen_fund_clear
  37. //frozen_fund_clear_time
  38. //frozen_fund_clear_time_show
  39. // 获取基础配置
  40. $config = Yii::$app->services->setting->addons->get($mall_id, DoubleCopyEnum::ADDONS_NAME, 'basic',true);
  41. $is_open_frozen_fund_clear = $config['is_open_frozen_fund_clear'] ?? StatusEnum::DISABLED;
  42. if(!$is_open_frozen_fund_clear) continue;
  43. $frozen_fund_clear_date = $config['frozen_fund_clear_date'] ?? 0;
  44. if(!$frozen_fund_clear_date) continue;
  45. $frozen_fund_clear_time = $config['frozen_fund_clear_time'] ?? '';
  46. $frozen_fund_clear_time = $frozen_fund_clear_date.' '.$frozen_fund_clear_time;
  47. if ($is_open_frozen_fund_clear == StatusEnum::ENABLED && $frozen_fund_clear_time) {
  48. $date_time = date('Y-m-', time()).$frozen_fund_clear_time;
  49. $date_timestamp = strtotime($date_time);
  50. if(time() >= $date_timestamp){
  51. $this->frozenFundClear($mall_id,$config);
  52. }
  53. }
  54. }
  55. }catch (\Exception $e){
  56. }
  57. }
  58. private function frozenFundClear($mall_id,$config)
  59. {
  60. //判断该月是否清零过
  61. $month_begin_time = strtotime(date('Y-m-01', time()));
  62. $exists = DoubleCopyFrozenFundClearLog::find()->where(['mall_id' => $mall_id,'status' => StatusEnum::ENABLED])->andWhere(['>=','created_at',$month_begin_time])->one();
  63. if($exists) return true;
  64. $query = DoubleCopyUser::find()->where(['mall_id' => $mall_id]);
  65. if($config['reward_currency'] == 'commission'){
  66. $field = 'frozen_fund';
  67. }else{
  68. $field = 'frozen_fund_score';
  69. }
  70. $users = $query->andWhere(['>',$field,0])->all();
  71. foreach($users as $user){
  72. echo $user->user_id."\n";
  73. $check = DoubleCopyFrozenFundClearLog::find()->where(['mall_id' => $mall_id])->andWhere(['user_id' => $user->user_id])->andWhere(['>=','created_at',$month_begin_time])->one();
  74. if($check) continue;
  75. //事务:处理,清零冻结基金,写入清零记录表,冻结基金清零为0
  76. $trans = Yii::$app->db->beginTransaction();
  77. try{
  78. $clear_num = $user->$field;
  79. if($clear_num <= 0 ) throw new \Exception('冻结基金<=0');
  80. $user->$field = 0;
  81. $res = $user->save();
  82. if(!$res) throw new \Exception('更新二二复制user '.$field.' 失败');
  83. $result = DoubleCopyFrozenFundClearLog::setData([
  84. 'mall_id' => $mall_id,
  85. 'user_id' => $user->user_id,
  86. 'clear_num' => $clear_num,
  87. 'reward_currency' => $config['reward_currency']
  88. ]);
  89. if(!$result) throw new \Exception('写入二二复制frozen_fund_clear_log 失败:'.DoubleCopyFrozenFundClearLog::getStaticError());
  90. DoubleCopyCommission::updateAll(['settlement_type' => -1, 'updated_at' => time()], ['user_id' => $user->user_id, 'capital_type' => DoubleCopyEnum::FREEZE_FUND, 'settlement_type' => [0,2],'reward_currency' => $config['reward_currency']]);
  91. $res = DoubleCopyCommission::setData([
  92. 'mall_id' => $mall_id,
  93. 'user_id' => $user->user_id,
  94. 'settlement_type' => 1,
  95. 'capital_type' => DoubleCopyEnum::FREEZE_FUND,
  96. 'is_frozen' => 1,
  97. 'money' => -$clear_num,
  98. 'goods_name' => "用户({$user->user_id})未达到当月业绩要求,冻结基金额度清零",
  99. ]);
  100. if(!$res) throw new \Exception('写入二二复制commission 失败:'.DoubleCopyCommission::getStaticError());
  101. $trans->commit();
  102. }catch(\Exception $e){
  103. //事务回滚
  104. $trans->rollBack();
  105. $exception = FormatHelper::exception($e,'frozenFundClear err:'.$e->getMessage().' user_id:'.$user->user_id);
  106. Yii::error($exception);
  107. continue;
  108. }
  109. }
  110. return true;
  111. }
  112. /**
  113. * 如果一个月的期限没达成解冻条件则冻结基金转给直推上级
  114. *
  115. * @return void
  116. */
  117. public function actionFreezeFundMonthlyLimited()
  118. {
  119. // 必须次月初1号执行
  120. if (date('d') != 1) {
  121. return;
  122. }
  123. $mall_list = Mall::getEnableMallList(true);
  124. $frozenFundService = new FrozenFundService();
  125. foreach ($mall_list as $mall){
  126. $mall_id = $mall['id'];
  127. $frozenFundService->mall_id = $mall_id;
  128. // 获取基础配置
  129. $config = Yii::$app->services->setting->addons->get($mall_id, DoubleCopyEnum::ADDONS_NAME, 'basic', true);
  130. // 是否开启每月时间期限功能
  131. if (empty($config['is_freeze_fund_monthly_limited'])) {
  132. continue;
  133. }
  134. $doubleCopyUserFind = DoubleCopyUser::find();
  135. DoubleCopyUser::paramPack([
  136. 'where' => [
  137. [
  138. 'mall_id' => $mall_id,
  139. 'status' => StatusEnum::ENABLED,
  140. 'is_thaw' => StatusEnum::DISABLED,
  141. ],
  142. ['>=', 'level', 2],
  143. ['>', 'upgrade_boss_at', 0],
  144. ],
  145. ], $doubleCopyUserFind);
  146. $levelList = DoubleCopyLevel::lists([
  147. 'with' => [
  148. 'setting' => function ($query) {
  149. $query->select('level_id, is_thaw');
  150. }
  151. ],
  152. 'where' => [
  153. [
  154. 'mall_id' => $mall_id,
  155. 'status' => StatusEnum::ENABLED,
  156. ],
  157. ['>=', 'level', 2]
  158. ],
  159. 'index' => 'level',
  160. 'select' => 'id, level'
  161. ]);
  162. // 找到所有大于老板等级并且未解冻的
  163. foreach ($doubleCopyUserFind->batch(1000) as $doubleCopyUsers) {
  164. foreach ($doubleCopyUsers as $doubleCopyUser) {
  165. // 检查这个等级是否开启了额外解冻条件
  166. if (empty($levelList[$doubleCopyUser->level]['setting']['is_thaw'])) {
  167. continue;
  168. }
  169. // 是否到了该验证的时间(当月成为的老板以上等级,则次月不判断)
  170. $upgradeBossAt = date('Y-m-1', strtotime('+1 month', $doubleCopyUser['upgrade_boss_at']));
  171. if (!$frozenFundService->isMoreThanOneMonth($upgradeBossAt, date('Y-m-d'))) {
  172. continue;
  173. }
  174. $parentIdArr = array_reverse(UserPartitionRelationship::getParentIdArr($doubleCopyUser['user_id']));
  175. // 找到上级的二二复制用户
  176. $doubleCopyUsers = DoubleCopyUser::lists([
  177. 'where' => [
  178. [
  179. 'mall_id' => $mall_id,
  180. 'status' => StatusEnum::ENABLED,
  181. 'user_id' => $parentIdArr
  182. ],
  183. ],
  184. 'index' => 'user_id'
  185. ], false);
  186. // 找到上级是代理的用户
  187. $parentDoubleCopyUser = null;
  188. foreach ($parentIdArr as $parentId) {
  189. if (isset($doubleCopyUsers[$parentId])) {
  190. $parentDoubleCopyUser = $doubleCopyUsers[$parentId];
  191. break;
  192. }
  193. }
  194. $logData = [
  195. 'double_copy_user' => ArrayHelper::toArray($doubleCopyUser),
  196. 'parent_double_copy_user' => $parentDoubleCopyUser ? ArrayHelper::toArray($parentDoubleCopyUser) : [],
  197. 'mall_id' => $mall_id
  198. ];
  199. try {
  200. Yii::$app->custom->logs('【二二复制】开始处理冻结基金', $logData);
  201. // 没有上级则直接失效冻结基金
  202. if (empty($parentDoubleCopyUser)) {
  203. $frozenFundService->clearFrozenFundByDoubleCopyUser($doubleCopyUser);
  204. } else { // 有上级则解冻给上级
  205. $frozenFundService->unfreezeHandleToParent($doubleCopyUser, $parentDoubleCopyUser);
  206. }
  207. }catch (Exception $e) {
  208. Yii::$app->custom->logs('处理每月期限限制数据异常', $logData);
  209. }
  210. }
  211. }
  212. }
  213. }
  214. }