| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- <?php
- namespace addons\LuckyGroup\console\controllers;
- use addons\LuckyGroup\common\enums\LuckyGroupEnum;
- use addons\LuckyGroup\common\logic\attend\AttendTimeLogic;
- use addons\LuckyGroup\common\logic\order\WinLossLogic;
- use addons\LuckyGroup\common\logic\reward\BonusPoolLogic;
- use addons\LuckyGroup\common\logic\statistics\StatisticsLogic;
- use addons\LuckyGroup\common\models\LuckyGroupActivity;
- use addons\LuckyGroup\common\models\LuckyGroupOrder;
- use addons\LuckyGroup\common\queue\OrderPaidQueueLogic;
- use common\enums\StatusEnum;
- use addons\LuckyGroup\common\models\LuckyGroupUser;
- use common\models\common\CapitalLog;
- use common\models\mall\Mall;
- use common\models\order\Order;
- use yii\console\Controller;
- use yii\console\ExitCode;
- class LuckyGroupCrontabController extends Controller
- {
- /**
- * 奖金池分红--定时器逻辑(每小时请求一次)
- * 1.判断今天是否分过奖金了(判断流水表是否有今天奖金池分红的记录)
- * 2.判断基础设置结算周期是 每日/每周一/每月1号,今天是否满足结算周期
- * 3.满足则拿出每日奖金池均分金额,查询所有(0未发放,2部分发放)冻结记录,按添加时间升序取出
- * 4.按用户分组,每个用户能分的金额=奖金池均分金额/用户数
- * 5.循环冻结列表,判断当前分红金额(分一次减一次)是否够当前记录分。
- * 6.够分则修改状态为已发放,并添加到资金流水表。后添加用户总收入,加总表记录
- * 7.不够分则判断金额是否大于0,小于等于0则终止循环,本次分红到此结束
- * 8.够分一半则修改状态为部分发放,记录已发放金额,添加资金流水表。添加用户总收入,加总表记录,终止循环本次分红结束
- * @Author pin
- * @DateTime 2020-11-30 11:50:55
- * @param [type] $common_order_detail
- * @return mixed
- * @copyright: Copyright (c) 2020 广东七件事集团
- */
- public function actionBonusPoolDividendLog()
- {
- try {
- $malls = Mall::getEnableMallList();
- foreach ($malls as $mall) {
- BonusPoolLogic::bonusPoolDividendLog($mall['id']);
- }
- } catch (\Exception $e) {
- \Yii::error('actionBonusPoolDividendLog:' . $e->getMessage());
- return false;
- }
- }
- /**
- * 拼团活动数据统计
- */
- public function actionActivityDataStatistics()
- {
- // $start_time = microtime(true);
- $malls = Mall::getEnableMallList();
- foreach ($malls as $mall) {
- $res = StatisticsLogic::asyncStatisticsActivityData($mall['id']);
- }
- // $end_time = microtime(true);
- // var_dump($end_time - $start_time);
- }
- /**
- * 每日更新参团次数
- */
- public function actionUpdateAttendTimes()
- {
- $malls = Mall::getEnableMallList();
- foreach ($malls as $mall) {
- $res = AttendTimeLogic::addUserAttendTimes($mall['id']);
- }
- return 0;
- }
- //过了有效期的幸运拼团订单
- public function actionExpActivity()
- {
- try {
- $malls = Mall::getEnableMallList();
- foreach ($malls as $mall) {
- $mall_id = $mall['id'];
- $activity_list = LuckyGroupActivity::lists(['where' => [
- ['status' => StatusEnum::ENABLED],
- ['mall_id' => $mall_id],
- ]]);
- $logic = new OrderPaidQueueLogic();
- // 当天,手动拼团未成功
- foreach ($activity_list as $activity) {
- $end_time = strtotime($activity['end_time']) + 1800;// 延迟半小时,以防有的订单还在开团中...
- if (time() > $end_time) {
- // 活动结束,找出手动拼团的订单
- $group_order = LuckyGroupOrder::find()
- ->where([
- 'attend_type' => LuckyGroupEnum::ATTEND_TYPE_NOT_AUTO,
- 'group_status' => LuckyGroupEnum::GROUP_JOINING,
- 'activity_id' => $activity['id'],
- 'mall_id' => $mall_id,
- ])->andWhere(['<', 'created_at', $end_time])->all();
- foreach ($group_order as $order) {
- $model = new WinLossLogic();
- $order->group_status = LuckyGroupEnum::GROUP_FAIL;
- $order->save();
- $reson = '手动拼团失败自动退款';
- $model->refundToBalance($order, $reson);
- $activity_id = $order['activity_id'];
- $goods_id = $order['goods_id'];
- $this->upQueue($logic,$order['id'],$activity_id,$goods_id);
- }
- }
- }
- // 前一天,手动拼团未成功的
- $last_time = strtotime(date('Y-m-d'));
- $group_order = LuckyGroupOrder::find()
- ->where([
- 'attend_type' => LuckyGroupEnum::ATTEND_TYPE_NOT_AUTO,
- 'group_status' => LuckyGroupEnum::GROUP_JOINING,
- 'mall_id' => $mall_id,
- ])->andWhere(['<', 'created_at', $last_time])->all();
- foreach ($group_order as $order) {
- $model = new WinLossLogic();
- $order->group_status = LuckyGroupEnum::GROUP_FAIL;
- $order->save();
- $reson = '手动拼团失败自动退款';
- $model->refundToBalance($order, $reson);
- $activity_id = $order['activity_id'];
- $goods_id = $order['goods_id'];
- $this->upQueue($logic,$order['id'],$activity_id,$goods_id);
- }
- }
- return ExitCode::OK;
- } catch (\Exception $e) {
- echo '过了有效期的幸运拼团订单:' . $e->getMessage();
- return ExitCode::UNSPECIFIED_ERROR;
- }
- }
- public function upQueue($logic,$order_id,$activity_id,$goods_id){
- $queue = $logic->getQueueName($activity_id, $goods_id);
- $len = \Yii::$app->redis->llen($queue);
- $ids = \Yii::$app->redis->lrange($queue, -$len, -1);
- \Yii::$app->redis->ltrim($queue, 0, -($len + 1));
- foreach ($ids as $k=>$v){
- if($v==$order_id){
- unset($ids[$k]);
- }
- }
- if(!empty($ids)){
- \Yii::$app->redis->lpush($queue, ...$ids);
- }
- }
- public function actionFixBalance()
- {
- $i = 1;
- $page_size = 1000;
- $wallet_type='balance';
- while ($list = LuckyGroupUser::find()
- ->where(['status' => 1])
- ->offset(($i - 1) * $page_size)->limit($page_size)->all()) {
- foreach ($list as $item) {
- CapitalLog::$capitalType = $wallet_type;
- $change_num = CapitalLog::find()->where(['user_id'=>$item['user_id'],'change_type'=>'add','from_type'=>'LuckyGroup'])
- ->andWhere(['!=','capital_type','refund_order'])->sum('change_num');
- if(!empty($change_num)){
- $item->balance = $change_num;
- $item->save();
- }
- }
- $i++;
- }
- }
- //定时取消,待支付订单
- public function actionClose(){
- $malls = Mall::getEnableMallList();
- $time = time();
- foreach ($malls as $mall) {
- $order_auto_handle_time = \Yii::$app->services->setting->mall->get($mall['id'], 'order.payment_expire_time');
- if (empty($order_auto_handle_time)) $order_auto_handle_time = 30;
- $time_node = $time - $order_auto_handle_time * 60 - 120;
- $time_field = 'created_at';
- $where = [
- 'and',
- ['mall_id' => $mall['id']],
- ['group_status'=>0],
- ['pay_at'=>0],
- ['<', $time_field, $time_node]
- ];
- foreach (LuckyGroupOrder::find()->where($where)->each(1000) as $lucky_group_order) {
- $lucky_group_order->group_status = -1;
- $res = $lucky_group_order->save();
- var_dump($res);
- }
- }
- }
- }
|