修复:消费返利失效判断流程错误,导致非第一个用户下单后返利信息立即失效
This commit is contained in:
parent
829bafa177
commit
99a443701e
|
|
@ -216,72 +216,63 @@ class Rebate extends BaseModel{
|
||||||
*/
|
*/
|
||||||
public static function loseEfficacy(){
|
public static function loseEfficacy(){
|
||||||
set_time_limit(0);
|
set_time_limit(0);
|
||||||
|
// 复购时间
|
||||||
|
$set = Setting::get('plugin.rebate');
|
||||||
|
$repurchaseDay = $set['repurchase_day'] ?? 0;
|
||||||
DB::beginTransaction();
|
DB::beginTransaction();
|
||||||
try{
|
try{
|
||||||
// 循环平台 进行处理
|
// 未过期返利信息 分组:根据用户id、订单id、商品id分组
|
||||||
$uniAccount = UniAccount::getEnable() ?: [];
|
$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')
|
||||||
foreach ($uniAccount as $u) {
|
->groupBy('group_key')
|
||||||
Setting::$uniqueAccountId = \YunShop::app()->uniacid = $u->uniacid;
|
->having(DB::raw("max(status)"),'=', 2)
|
||||||
// 分组 获取最新一条已处理数据 状态:0=冻结中,1=待结算,2=已结算,3=已失效,4=已退款(失效)
|
->limit(500)
|
||||||
$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')
|
->get()
|
||||||
->whereIn('status',[2,3,4])
|
->toArray();
|
||||||
->groupBy('group_key')
|
// 订单信息 查询条件:必须是分期内的商品 且为N天内订单 且为对应用户下单
|
||||||
->get()
|
$startTime = strtotime(date("Y-m-d H:i:s",time())." -{$repurchaseDay} day");
|
||||||
->toArray();
|
$goodsKey = Db::table('yz_order_goods')
|
||||||
$ids = array_column($list, 'id');
|
->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')
|
||||||
$settlement = self::select([
|
->where('yz_order_goods.is_rebate',1)
|
||||||
'yz_rebate.id',
|
->where('yz_order.pay_time','>',$startTime)
|
||||||
'yz_order_goods.uid',
|
->pluck('group_key')
|
||||||
'yz_order_goods.order_id',
|
->toArray();
|
||||||
'yz_order_goods.goods_id',
|
// 循环处理
|
||||||
'yz_order.pay_time',
|
foreach($list as $rebateInfo){
|
||||||
'yz_rebate.reality_thaw_time',
|
// 判断:是否存在N天内的复购订单 存在-已复购,无需任何处理;不存在-未复购,判断是否需要复购
|
||||||
DB::raw('ims_yz_order_goods.id as order_goods_id'),
|
if(!in_array($rebateInfo['goods_key'],$goodsKey)){
|
||||||
DB::raw('CONCAT(ims_yz_order_goods.uid,"_",ims_yz_order_goods.goods_id) as group_key')
|
// 判断:是否需要复购 最新一次购买是否存在复购信息,存在判断是否已经超出复购限制时间
|
||||||
])
|
$isRepurchase = (int)self::where([
|
||||||
->rightJoin('yz_order_goods',function($join){
|
'reality_thaw_time' => $rebateInfo['max_reality_thaw_time'],
|
||||||
$join->on('yz_order_goods.goods_id','=','yz_rebate.goods_id')
|
'goods_id' => $rebateInfo['goods_id'],
|
||||||
->on('yz_order_goods.uid','=','yz_rebate.uid');
|
'order_id' => $rebateInfo['order_id'],
|
||||||
})
|
'uid' => $rebateInfo['uid'],
|
||||||
->rightJoin('yz_order',function($join){
|
])->value('is_repurchase');
|
||||||
$join->on('yz_order.id','=','yz_order_goods.order_id')
|
if($isRepurchase == 1){
|
||||||
->on('yz_order.pay_time','>','yz_rebate.reality_thaw_time');
|
// 需要复购 判断:当前时间 >= (最后一次复购时间 + N天) = 已失效
|
||||||
})
|
$currentEndTime = strtotime(date("Y-m-d H:i:s",$rebateInfo['max_reality_thaw_time'])." +{$repurchaseDay} day");
|
||||||
->whereIn('yz_rebate.id',$ids)
|
if(time() >= $currentEndTime){
|
||||||
->where('yz_rebate.status',2)
|
// 未在规定时间内复购 失效处理
|
||||||
->where('yz_rebate.is_repurchase',1)
|
self::where([
|
||||||
->get()
|
'status' => 0,
|
||||||
->toArray();
|
'uid' => $rebateInfo['uid'],
|
||||||
// 获取两个数组差异
|
'goods_id' => $rebateInfo['goods_id'],
|
||||||
$set = Setting::get('plugin.rebate');
|
'order_id' => $rebateInfo['order_id'],
|
||||||
$repurchase_day = $set['repurchase_day'] ?? 0;
|
])->update([
|
||||||
$groupKey = array_column($settlement,'group_key');
|
'status' => 3,
|
||||||
// 循环判断 处理失效内容
|
'reality_thaw_time' => time()
|
||||||
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()
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DB::commit();
|
DB::commit();
|
||||||
}catch(\Exception $e){
|
}catch(\Exception $e){
|
||||||
|
|
||||||
\Log::debug('--- 消费返利 - 失效判断 - 错误:'.$e->getMessage());
|
\Log::debug('--- 消费返利 - 失效判断 - 错误:'.$e->getMessage());
|
||||||
DB::rollBack();
|
DB::rollBack();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue