diff --git a/plugins/rebate/src/models/Rebate.php b/plugins/rebate/src/models/Rebate.php index 0a173c06..89456cb8 100644 --- a/plugins/rebate/src/models/Rebate.php +++ b/plugins/rebate/src/models/Rebate.php @@ -216,72 +216,63 @@ class Rebate extends BaseModel{ */ public static function loseEfficacy(){ set_time_limit(0); + // 复购时间 + $set = Setting::get('plugin.rebate'); + $repurchaseDay = $set['repurchase_day'] ?? 0; DB::beginTransaction(); try{ - // 循环平台 进行处理 - $uniAccount = UniAccount::getEnable() ?: []; - foreach ($uniAccount as $u) { - Setting::$uniqueAccountId = \YunShop::app()->uniacid = $u->uniacid; - // 分组 获取最新一条已处理数据 状态: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() - ]); + // 未过期返利信息 分组:根据用户id、订单id、商品id分组 + $list = self::selectRaw('CONCAT(uid,"_",order_id,"_",goods_id) as group_key,CONCAT(uid,"_",goods_id) as goods_key,max(reality_thaw_time) as max_reality_thaw_time,uid,goods_id,order_id,uniacid') + ->groupBy('group_key') + ->having(DB::raw("max(status)"),'=', 2) + ->limit(500) + ->get() + ->toArray(); + // 订单信息 查询条件:必须是分期内的商品 且为N天内订单 且为对应用户下单 + $startTime = strtotime(date("Y-m-d H:i:s",time())." -{$repurchaseDay} day"); + $goodsKey = Db::table('yz_order_goods') + ->join('yz_order','yz_order.id','=','yz_order_goods.order_id') + ->selectRaw('CONCAT(ims_yz_order_goods.uid,"_",ims_yz_order_goods.goods_id) as group_key') + ->where('yz_order_goods.is_rebate',1) + ->where('yz_order.pay_time','>',$startTime) + ->pluck('group_key') + ->toArray(); + // 循环处理 + foreach($list as $rebateInfo){ + // 判断:是否存在N天内的复购订单 存在-已复购,无需任何处理;不存在-未复购,判断是否需要复购 + if(!in_array($rebateInfo['goods_key'],$goodsKey)){ + // 判断:是否需要复购 最新一次购买是否存在复购信息,存在判断是否已经超出复购限制时间 + $isRepurchase = (int)self::where([ + 'reality_thaw_time' => $rebateInfo['max_reality_thaw_time'], + 'goods_id' => $rebateInfo['goods_id'], + 'order_id' => $rebateInfo['order_id'], + 'uid' => $rebateInfo['uid'], + ])->value('is_repurchase'); + if($isRepurchase == 1){ + // 需要复购 判断:当前时间 >= (最后一次复购时间 + N天) = 已失效 + $currentEndTime = strtotime(date("Y-m-d H:i:s",$rebateInfo['max_reality_thaw_time'])." +{$repurchaseDay} day"); + if(time() >= $currentEndTime){ + // 未在规定时间内复购 失效处理 + self::where([ + 'status' => 0, + 'uid' => $rebateInfo['uid'], + 'goods_id' => $rebateInfo['goods_id'], + 'order_id' => $rebateInfo['order_id'], + ])->update([ + 'status' => 3, + 'reality_thaw_time' => time() + ]); + } } } } + DB::commit(); }catch(\Exception $e){ + \Log::debug('--- 消费返利 - 失效判断 - 错误:'.$e->getMessage()); DB::rollBack(); } - - - }