timer 定時任務(wù)中查詢出訂單列表,通過foreach 遍歷每個訂單,計算每個訂單贈送的積分,設(shè)置的當贈送積分大于0時,進行積分變動,并記錄,但實際運行時,積分記錄表出現(xiàn)了很多score為0的記錄;
$list 是訂單列表
foreach ($list as $k=>$v){
$good_list=$v['goods'];
$score=0;
foreach ($good_list as $k2=>$v2){
$has_catgory=$good_category
->where('goods_id',$v2['goods_id'])
->where('category_id','in',$category_ids)
->find();
//滿足商品屬于指定分類,贈送積分
if(!empty($has_catgory)){
$score=$score+$v2['total_num'];
}
}
//積分大于0時執(zhí)行,積分記錄操作
if($score>0){
$uid=$v['user_id'];
$data=[
'user_id' => $uid,
'value' => $score,
'describe' => "飲料訂單贈送:{$v['order_no']}",
'store_id' => $v['store_id'],
'order_id' => $v['order_id'],
];
$has_log=$this->where(['order_id' => $v['order_id']])->find();
if(empty($has_log)){
$user->setIncPoints($uid,$score,$data['describe'],$v['store_id'],$v['order_id']);
}
}
}
業(yè)務(wù)邏輯問題,和框架定時器沒關(guān)系
雙重循環(huán)里還有好幾個查詢數(shù)據(jù)庫的邏輯,這樣很不合理。
1、可以在循環(huán)開始前,就把訂單中的商品的category_id查詢出來。然后在循環(huán)中跟category_id做比對即可。
2、判斷是否有沒有贈送過積分,可以在訂單中增加個狀態(tài)字段來標識,在最初查詢需要贈送積分的訂單就進行過濾,這樣就避免了每次都要查詢積分記錄表來判斷。
3、$user->setIncPoints()贈送積分,可以先把要贈送的數(shù)據(jù)放到數(shù)組里,然后等循環(huán)結(jié)束后批量更新,這樣只執(zhí)行一次sql。(要注意同一個用戶多個訂單,積分要累加,邏輯上做個判斷即可)
4、積分為0的問題,上面的代碼沒有看出來有什么積分計算bug,猜測很可能是在$user->setIncPoints()方法中出了問題,貼一下這個方法的代碼吧。