国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

Timer 定時任務(wù)中 數(shù)據(jù)亂掉了

yiqixing

問題描述

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']);
                }

            }
        }
974 4 0
4個回答

yongdao35

業(yè)務(wù)邏輯問題,和框架定時器沒關(guān)系

  • yiqixing 2023-10-20

    業(yè)務(wù)邏輯里面 我就加了判斷積分大于0時,才進行積分操作的,但實際運行下來,數(shù)據(jù)庫里有積分等于0的。而且我把函數(shù)拿出來單獨運行是正常的,放到定時任務(wù)里面就出問題

  • luochen 2023-10-20

    是不是要設(shè)置成單進程的 $worker->count=1

  • TM 2023-10-21

    在定時里面每次都把積分寫入日志看看幾次定時任務(wù)的記錄就知道了

  • TM 2023-10-21

    可以用一下 bcadd函數(shù)進行相加

xgdd1987

你這邏輯看著好難受。判斷數(shù)據(jù)庫中是否在某個記錄,最好用select count(*),下面代碼就可以用查詢結(jié)果是否大于0來判斷了。
你這樣寫,會有查詢結(jié)果,結(jié)果還會封裝成數(shù)組或?qū)ο螅速M服務(wù)器資源。

  • TM 2023-10-21

    感覺是出了精度問題,0.00001啥的 然后大于0

  • TM 2023-10-21

    他整條$good_category記錄都查詢出來了0.0

xgdd1987

雙重循環(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()方法中出了問題,貼一下這個方法的代碼吧。

  • 暫無評論
釋永戰(zhàn)

另外開啟一個進程去進行數(shù)據(jù)庫操作,定時器只負責(zé)定時觸發(fā)任務(wù)執(zhí)行···

  • 暫無評論
年代過于久遠,無法發(fā)表回答
??