diff --git a/app/common/models/goods/Privilege.php b/app/common/models/goods/Privilege.php index 1ed57ae8..58b77c6f 100644 --- a/app/common/models/goods/Privilege.php +++ b/app/common/models/goods/Privilege.php @@ -623,7 +623,8 @@ class Privilege extends BaseModel $set = Setting::get('plugin.rebate'); $repurchase_day = $set['repurchase_day'] ?? 0; $limitTime = strtotime(date("Y-m-d H:i:s",$maxTime)." +{$repurchase_day} day"); - if($limitTime >= time()) throw new AppException('已超过复购时间'); + // 判断:最后复购时间 小于等于 当前时间,超出复购时间,禁止复购 + if($limitTime <= time()) throw new AppException('已超过复购时间'); } } diff --git a/plugins/rebate/src/PluginApplication.php b/plugins/rebate/src/PluginApplication.php index 0d5ef8c9..527b08c4 100644 --- a/plugins/rebate/src/PluginApplication.php +++ b/plugins/rebate/src/PluginApplication.php @@ -111,12 +111,16 @@ class PluginApplication extends \app\common\services\PluginApplication{ public function cronConfig(){ \Event::listen('cron.collectJobs', function () { - // 每天5分钟 执行一次消费返利解冻判断 + // 每5分钟 执行一次消费返利解冻判断 \Cron::add('rebate-settlement', '*/5 * * * *', function () { Rebate::rebateThaw(); return; }); - + // 每5分钟 执行一次消费返利失效判断 + \Cron::add('rebate-settlement', '*/5 * * * *', function () { + Rebate::loseEfficacy(); + return; + }); diff --git a/plugins/rebate/src/models/Rebate.php b/plugins/rebate/src/models/Rebate.php index a19a7f89..1208345b 100644 --- a/plugins/rebate/src/models/Rebate.php +++ b/plugins/rebate/src/models/Rebate.php @@ -1,6 +1,7 @@ where('status', 1) ->get() ->toArray(); $incomeData = []; foreach($list as $item){ $incomeData[] = [ - 'uniacid' => \YunShop::app()->uniacid, + 'uniacid' => $item['uniacid'], 'member_id' => $item['uid'], 'amount' => $item['money'], 'detail' => '', @@ -202,7 +204,64 @@ class Rebate extends BaseModel{ ]); } } - + /** + * Common: 失效 + * Author: wu-hui + * Time: 2024/03/16 10:59 + */ + public static function loseEfficacy(){ + // 分组 获取最新一条已处理数据 状态:0=冻结中,1=待结算,2=已结算,3=已失效,4=已退款(失效) + $list = self::selectRaw('max(id) as id,max(reality_thaw_time) as max_reality_thaw_time,max(status) as status,uid,goods_id,order_id,CONCAT(uid,"_",goods_id) as group_key') + ->whereIn('status',[2,3,4]) + ->groupBy('group_key') + ->get() + ->toArray(); + $ids = array_column($list, 'id'); + // 获取复购订单 状态为已结算 不存在信息的都是未复购,立即失效 + $settlement = self::select([ + 'yz_rebate.id', + 'yz_order_goods.uid', + 'yz_order_goods.order_id', + 'yz_order_goods.goods_id', + 'yz_order.pay_time', + 'yz_rebate.reality_thaw_time', + DB::raw('ims_yz_order_goods.id as order_goods_id'), + DB::raw('CONCAT(ims_yz_order_goods.uid,"_",ims_yz_order_goods.goods_id) as group_key') + ]) + ->rightJoin('yz_order_goods',function($join){ + $join->on('yz_order_goods.goods_id','=','yz_rebate.goods_id') + ->on('yz_order_goods.uid','=','yz_rebate.uid'); + }) + ->rightJoin('yz_order',function($join){ + $join->on('yz_order.id','=','yz_order_goods.order_id') + ->on('yz_order.pay_time','>','yz_rebate.reality_thaw_time'); + }) + ->whereIn('yz_rebate.id',$ids) + ->where('yz_rebate.status',2) + ->where('yz_rebate.is_repurchase',1) + ->get() + ->toArray(); + // 获取两个数组差异 + $set = Setting::get('plugin.rebate'); + $repurchase_day = $set['repurchase_day'] ?? 0; + $groupKey = array_column($settlement,'group_key'); + // 循环判断 处理失效内容 + foreach($list as $item){ + // 判断: 不存在复购信息;并且最后一条结算时间+N天 小于等于当前时间;最后一条信息状态为已结算 = 信息失效 + $endTime = strtotime(date("Y-m-d H:i:s",$item['max_reality_thaw_time'])." +{$repurchase_day} day"); + if(!in_array($item['group_key'], $groupKey) && $endTime <= time() && $item['status'] == 2){ + self::where([ + 'status' => 0, + 'uid' => $item['uid'], + 'goods_id' => $item['goods_id'], + 'order_id' => $item['order_id'], + ])->update([ + 'status' => 3, + 'reality_thaw_time' => time() + ]); + } + } + }