LuckyGroupCrontabController.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <?php
  2. namespace addons\LuckyGroup\console\controllers;
  3. use addons\LuckyGroup\common\enums\LuckyGroupEnum;
  4. use addons\LuckyGroup\common\logic\attend\AttendTimeLogic;
  5. use addons\LuckyGroup\common\logic\order\WinLossLogic;
  6. use addons\LuckyGroup\common\logic\reward\BonusPoolLogic;
  7. use addons\LuckyGroup\common\logic\statistics\StatisticsLogic;
  8. use addons\LuckyGroup\common\models\LuckyGroupActivity;
  9. use addons\LuckyGroup\common\models\LuckyGroupOrder;
  10. use addons\LuckyGroup\common\queue\OrderPaidQueueLogic;
  11. use common\enums\StatusEnum;
  12. use addons\LuckyGroup\common\models\LuckyGroupUser;
  13. use common\models\common\CapitalLog;
  14. use common\models\mall\Mall;
  15. use common\models\order\Order;
  16. use yii\console\Controller;
  17. use yii\console\ExitCode;
  18. class LuckyGroupCrontabController extends Controller
  19. {
  20. /**
  21. * 奖金池分红--定时器逻辑(每小时请求一次)
  22. * 1.判断今天是否分过奖金了(判断流水表是否有今天奖金池分红的记录)
  23. * 2.判断基础设置结算周期是 每日/每周一/每月1号,今天是否满足结算周期
  24. * 3.满足则拿出每日奖金池均分金额,查询所有(0未发放,2部分发放)冻结记录,按添加时间升序取出
  25. * 4.按用户分组,每个用户能分的金额=奖金池均分金额/用户数
  26. * 5.循环冻结列表,判断当前分红金额(分一次减一次)是否够当前记录分。
  27. * 6.够分则修改状态为已发放,并添加到资金流水表。后添加用户总收入,加总表记录
  28. * 7.不够分则判断金额是否大于0,小于等于0则终止循环,本次分红到此结束
  29. * 8.够分一半则修改状态为部分发放,记录已发放金额,添加资金流水表。添加用户总收入,加总表记录,终止循环本次分红结束
  30. * @Author pin
  31. * @DateTime 2020-11-30 11:50:55
  32. * @param [type] $common_order_detail
  33. * @return mixed
  34. * @copyright: Copyright (c) 2020 广东七件事集团
  35. */
  36. public function actionBonusPoolDividendLog()
  37. {
  38. try {
  39. $malls = Mall::getEnableMallList();
  40. foreach ($malls as $mall) {
  41. BonusPoolLogic::bonusPoolDividendLog($mall['id']);
  42. }
  43. } catch (\Exception $e) {
  44. \Yii::error('actionBonusPoolDividendLog:' . $e->getMessage());
  45. return false;
  46. }
  47. }
  48. /**
  49. * 拼团活动数据统计
  50. */
  51. public function actionActivityDataStatistics()
  52. {
  53. // $start_time = microtime(true);
  54. $malls = Mall::getEnableMallList();
  55. foreach ($malls as $mall) {
  56. $res = StatisticsLogic::asyncStatisticsActivityData($mall['id']);
  57. }
  58. // $end_time = microtime(true);
  59. // var_dump($end_time - $start_time);
  60. }
  61. /**
  62. * 每日更新参团次数
  63. */
  64. public function actionUpdateAttendTimes()
  65. {
  66. $malls = Mall::getEnableMallList();
  67. foreach ($malls as $mall) {
  68. $res = AttendTimeLogic::addUserAttendTimes($mall['id']);
  69. }
  70. return 0;
  71. }
  72. //过了有效期的幸运拼团订单
  73. public function actionExpActivity()
  74. {
  75. try {
  76. $malls = Mall::getEnableMallList();
  77. foreach ($malls as $mall) {
  78. $mall_id = $mall['id'];
  79. $activity_list = LuckyGroupActivity::lists(['where' => [
  80. ['status' => StatusEnum::ENABLED],
  81. ['mall_id' => $mall_id],
  82. ]]);
  83. $logic = new OrderPaidQueueLogic();
  84. // 当天,手动拼团未成功
  85. foreach ($activity_list as $activity) {
  86. $end_time = strtotime($activity['end_time']) + 1800;// 延迟半小时,以防有的订单还在开团中...
  87. if (time() > $end_time) {
  88. // 活动结束,找出手动拼团的订单
  89. $group_order = LuckyGroupOrder::find()
  90. ->where([
  91. 'attend_type' => LuckyGroupEnum::ATTEND_TYPE_NOT_AUTO,
  92. 'group_status' => LuckyGroupEnum::GROUP_JOINING,
  93. 'activity_id' => $activity['id'],
  94. 'mall_id' => $mall_id,
  95. ])->andWhere(['<', 'created_at', $end_time])->all();
  96. foreach ($group_order as $order) {
  97. $model = new WinLossLogic();
  98. $order->group_status = LuckyGroupEnum::GROUP_FAIL;
  99. $order->save();
  100. $reson = '手动拼团失败自动退款';
  101. $model->refundToBalance($order, $reson);
  102. $activity_id = $order['activity_id'];
  103. $goods_id = $order['goods_id'];
  104. $this->upQueue($logic,$order['id'],$activity_id,$goods_id);
  105. }
  106. }
  107. }
  108. // 前一天,手动拼团未成功的
  109. $last_time = strtotime(date('Y-m-d'));
  110. $group_order = LuckyGroupOrder::find()
  111. ->where([
  112. 'attend_type' => LuckyGroupEnum::ATTEND_TYPE_NOT_AUTO,
  113. 'group_status' => LuckyGroupEnum::GROUP_JOINING,
  114. 'mall_id' => $mall_id,
  115. ])->andWhere(['<', 'created_at', $last_time])->all();
  116. foreach ($group_order as $order) {
  117. $model = new WinLossLogic();
  118. $order->group_status = LuckyGroupEnum::GROUP_FAIL;
  119. $order->save();
  120. $reson = '手动拼团失败自动退款';
  121. $model->refundToBalance($order, $reson);
  122. $activity_id = $order['activity_id'];
  123. $goods_id = $order['goods_id'];
  124. $this->upQueue($logic,$order['id'],$activity_id,$goods_id);
  125. }
  126. }
  127. return ExitCode::OK;
  128. } catch (\Exception $e) {
  129. echo '过了有效期的幸运拼团订单:' . $e->getMessage();
  130. return ExitCode::UNSPECIFIED_ERROR;
  131. }
  132. }
  133. public function upQueue($logic,$order_id,$activity_id,$goods_id){
  134. $queue = $logic->getQueueName($activity_id, $goods_id);
  135. $len = \Yii::$app->redis->llen($queue);
  136. $ids = \Yii::$app->redis->lrange($queue, -$len, -1);
  137. \Yii::$app->redis->ltrim($queue, 0, -($len + 1));
  138. foreach ($ids as $k=>$v){
  139. if($v==$order_id){
  140. unset($ids[$k]);
  141. }
  142. }
  143. if(!empty($ids)){
  144. \Yii::$app->redis->lpush($queue, ...$ids);
  145. }
  146. }
  147. public function actionFixBalance()
  148. {
  149. $i = 1;
  150. $page_size = 1000;
  151. $wallet_type='balance';
  152. while ($list = LuckyGroupUser::find()
  153. ->where(['status' => 1])
  154. ->offset(($i - 1) * $page_size)->limit($page_size)->all()) {
  155. foreach ($list as $item) {
  156. CapitalLog::$capitalType = $wallet_type;
  157. $change_num = CapitalLog::find()->where(['user_id'=>$item['user_id'],'change_type'=>'add','from_type'=>'LuckyGroup'])
  158. ->andWhere(['!=','capital_type','refund_order'])->sum('change_num');
  159. if(!empty($change_num)){
  160. $item->balance = $change_num;
  161. $item->save();
  162. }
  163. }
  164. $i++;
  165. }
  166. }
  167. //定时取消,待支付订单
  168. public function actionClose(){
  169. $malls = Mall::getEnableMallList();
  170. $time = time();
  171. foreach ($malls as $mall) {
  172. $order_auto_handle_time = \Yii::$app->services->setting->mall->get($mall['id'], 'order.payment_expire_time');
  173. if (empty($order_auto_handle_time)) $order_auto_handle_time = 30;
  174. $time_node = $time - $order_auto_handle_time * 60 - 120;
  175. $time_field = 'created_at';
  176. $where = [
  177. 'and',
  178. ['mall_id' => $mall['id']],
  179. ['group_status'=>0],
  180. ['pay_at'=>0],
  181. ['<', $time_field, $time_node]
  182. ];
  183. foreach (LuckyGroupOrder::find()->where($where)->each(1000) as $lucky_group_order) {
  184. $lucky_group_order->group_status = -1;
  185. $res = $lucky_group_order->save();
  186. var_dump($res);
  187. }
  188. }
  189. }
  190. }