python學習之 迴圈裡面慎用copy類

2021-07-09 08:09:53 字數 2214 閱讀 1707

~ 最近在維護公司erp的發貨模組,**裡面有乙個這樣的問題:

客戶訂單裡面買個3個產品,每個產品10個,但是一次掃瞄的時候有可能只掃瞄其中兩個產品,每個產品數量不到10個,所以要求在銷貨的時候不能把所有的庫存都釋放掉,由於之前的程式設計師在寫這個地方的時候沒有考慮這麼清楚,所以客戶購買10個,即使只掃瞄了1個,到最後也是釋放了10個,這直接導致的就是庫存的不準確。

當我接手在做這個地方的時候,乙個需要去面對的問題就是在不能修改之前**的基礎上新增新的函式來處理這樣乙個部分銷貨的問題(其實這種還算是比較普遍的情況)。這個地方的**邏輯是:

1.建立掃瞄記錄

2.建立贈品

3.做庫存釋放

之前的邏輯是,在生成掃瞄記錄的時候,同時把掃瞄數量回寫到發貨明細裡面的掃瞄數量中,然後就是通過sql匹配,找到庫存表(stock_move)裡面此條掃瞄記錄對應的庫存明細id,

select stock_move_id from stock_seeed_delivery s,stock_seeed_delivery_line sl,account_seeed_project a,account_seeed_project_line al

where s.id=sl.delivery_id and a.id=al.project_id and al.stock_move_id is not null

and sl.sale_order_no=al.code and sl.sale_order_type||』-『||sl.sale_order_code=a.name and s.id=%s

「」「%(str(delivery_entity.id).replace(『l』,」))

然後呼叫move_obj.action_done(cr, uid, move_lines)把這條記錄的庫存釋放掉。

這個地方存在的問題有:如果同乙個產品多次掃瞄,只能有一條掃瞄記錄,因為在程式裡面做了限制,所以這個地方要修改;第二個問題在於:生產了掃瞄記錄之後,還要根據發貨明細裡面的掃瞄數量來進行庫存釋放,這樣咋看起來很合理,但是在實際操作中發現有乙個問題:假如說客戶購買了200個產品,但是第一次只掃瞄了30個,發貨明細裡面的掃瞄數量是30個沒有問題,庫存占用釋放了30個,然後第二次掃瞄了40個,在建立掃瞄記錄的時候同時改寫了發貨明細裡面的掃瞄數量(現在是30+40=70個),然後問題就出在這裡,第二次庫存釋放了70個,所以說,不能根據發貨明細裡面的掃瞄數量來進行庫存釋放。

怎麼解決這個問題呢,最初的時候我想到了兩種方法:

第一:先釋放庫存,再建立掃瞄記錄,但是細想一下也不對,對於上面說的這種第二次釋放的就變成了30個,仍然不對,而且修改起來很複雜,容易出錯

第二:根據傳過來的資料表裡面的掃瞄數量進行庫存的釋放操作,這樣才是最合理的,但是在實現的時候遇到了問題,就是**實在不好寫,因為這樣的判斷工作要放到sql裡面來執行,但是我的sql能力實在不敢恭維,最開始的時候由於是放在for迴圈裡面的弄出了很多重複資料,最後知道加乙個distinct就可以了,然後我以為問題就結束了,到後面才發現其實前面的建立掃瞄記錄裡面我給自己埋了乙個坑,請看下面的**,之前由於我是每次都只測試掃瞄乙個產品的,所以沒有測出來這個問題,當我昨天用兩個sku來測試的時候就發現了這個問題,在for迴圈裡面使用copy類的copy方法來給scan_ids賦值,然後第二個sku對應的掃瞄記錄就會在第二次迴圈的時候很理所當然的覆蓋之前的方法,這個bug不算明顯,所以我也是小測了一會才發現的,大家可以這樣做個測試:

在windows的dos視窗裡面做個測試:

import copy

exist_ids = [1,3,5,7,9]

scan_ids = copy.copy(exist_ids)

print scan_ids

然後再:

exist_ids2=[2,4,6,8,10]

scan_ids=copy.copy(exist_ids2)

print scan_ids

看一下兩次得到的結果是不是一樣的就知道問題在**了。

然後這個問題解決了之後,問題算是解決了一大半,用兩條的掃瞄也可以解決了,但是下午讓我們的測試在測的時候他一下往裡面丟了24條明細,然後我的**就很不爭氣的沒有做部分釋放,我現在正在調查這個問題,所以,此文未完待續。。。

Python學習之迴圈語句

python提供了while迴圈和for迴圈,但沒有do while迴圈.允許迴圈巢狀。基本形式如下 while 判斷條件 執行語句.執行語句可以是單個語句或語句塊。判斷條件可以是任何表示式,任何非零 或非空 null 的值均為true。while.else 在python中,可使用for.else...

python迴圈之for迴圈

python還有個迴圈是for迴圈。for迴圈一般用於遍歷元組 集合 列表這種資料型別裡面的所有元素。字典只會遍歷索引 簡單的for迴圈結構 不同於while迴圈容易變成無限迴圈,for迴圈遍歷完或中止便會結束執行 a ppap hello,world phone for b in a print ...

python學習之條件語句(if迴圈)

python條件語句是通過一條或多條語句的執行結果 true或者false 來決定執行的 塊。可以通過下圖來簡單了解條件語句的執行過程 python程式語言指定任何非0和非空 null 值為true,0 或者 null為false。python 程式設計中 if 語句用於控制程式的執行,基本形式為 ...