金蝶云星空條件執行順序
以銷售出庫單反寫銷售訂單條件為例
( FOUTLMTUNIT == 'STK' And (round(abs(float(FSTOCKBASESTOCKOUTQTY))- abs(float(FSTOCKBASEREBACKQTY)),10)) >= (abs(round(float(FBaseDeliveryMinQty),10)) if FDeliveryControl ==true else abs(round(float(FStockBaseQty),10))) ) Or (FOUTLMTUNIT == 'SAL' And (round(abs(float(FBaseStockOutQty))-abs(float(FBaseReBackQty)),10)) >=(abs(round(float(FBaseDeliveryMinQty),10)) if FDeliveryControl ==true else abs(round(float(FBaseUnitQty),10))) )
Python
(分支1:STK條件) OR (分支2:SAL條件)條件表達式由
OR 連接兩個分支,系統按從左到右順序執行,但遵循短路邏輯(若左分支為真,則跳過右分支)( FOUTLMTUNIT == 'STK' And (round(abs(float(FSTOCKBASESTOCKOUTQTY))- abs(float(FSTOCKBASEREBACKQTY)),10)) >= (abs(round(float(FBaseDeliveryMinQty),10)) if FDeliveryControl ==true else abs(round(float(FStockBaseQty),10))) ) 解讀
1. 條件表達式結構

2. 執行步驟分解
按照運算優先級和括號嵌套順序執行如下:
-
判斷單位類型:
PythonFOUTLMTUNIT == 'STK'- 優先級最高,首先檢查當前單位是否為庫存單位(
STK)。 - 若為
False,整個條件短路返回False,不再執行后續計算。 - 若為
True,繼續執行后續邏輯。
- 優先級最高,首先檢查當前單位是否為庫存單位(
-
計算左側表達式(凈出庫量):
Pythonround(abs(float(FSTOCKBASESTOCKOUTQTY)) - abs(float(FSTOCKBASEREBACKQTY)), 10)- 執行順序(從內到外):
a.float(FSTOCKBASESTOCKOUTQTY):將庫存出庫量轉換為浮點數。
b.abs(...):取絕對值,得到非負數。
c.float(FSTOCKBASEREBACKQTY):將庫存退庫量轉換為浮點數。
d.abs(...):取絕對值。
e. 計算出庫量 - 退庫量。
f.round(..., 10):將結果四舍五入到10位小數。
- 執行順序(從內到外):
-
計算右側基準值(動態選擇):
Pythonabs(round(float(FBaseDeliveryMinQty), 10)) if FDeliveryControl == True else abs(round(float(FStockBaseQty), 10))- 執行順序(分支判斷):
a. 判斷FDeliveryControl是否為True:- 若為
True,計算abs(round(float(FBaseDeliveryMinQty), 10))。float(FBaseDeliveryMinQty)→ 轉浮點數。round(..., 10)→ 四舍五入到10位小數。abs(...)→ 取絕對值。
- 若為
False,計算abs(round(float(FStockBaseQty), 10))。float(FStockBaseQty)→ 轉浮點數。round(..., 10)→ 四舍五入到10位小數。abs(...)→ 取絕對值。
- 若為
- 執行順序(分支判斷):
-
比較操作:
Python左側凈出庫量 >= 右側基準值- 將步驟2和步驟3的結果進行
>=比較。 - 若成立,返回
True;否則返回False。
- 將步驟2和步驟3的結果進行
-
邏輯與(And)操作:
PythonFOUTLMTUNIT == 'STK' And (比較結果)- 若步驟1為
True且步驟4為True,最終結果為True; - 否則結果為
False。
- 若步驟1為
3. 執行流程圖

意事項
-
短路邏輯:
- 若
FOUTLMTUNIT != 'STK',直接跳過后續所有計算,返回False,節省性能。
- 若
-
浮點數精度控制:
- 所有數值計算均使用
round(..., 10),避免因浮點數精度誤差(如0.1 + 0.2 ≠ 0.3)導致條件誤判。
- 所有數值計算均使用
-
變量類型安全:
- 強制將字段值轉為
float,確保數學運算正確性(尤其針對文本型數字或空值)。
- 強制將字段值轉為
-
動態基準值選擇:
- 通過
if-else實現靈活的業務規則切換,例如:- 啟用交貨控制時(
FDeliveryControl=True),按最小交貨量校驗; - 否則按庫存基礎數量校驗。
- 啟用交貨控制時(
- 通過
5. 示例場景
-
場景1:某采購訂單使用庫存單位(
STK),啟用交貨控制(FDeliveryControl=True)。- 數據:
FSTOCKBASESTOCKOUTQTY = 150.0FSTOCKBASEREBACKQTY = 30.0FBaseDeliveryMinQty = 100.0
- 計算:
- 凈出庫量:
round(abs(150.0) - abs(30.0), 10) = 120.0 - 基準值:
abs(round(100.0, 10)) = 100.0 - 比較:
120.0 >= 100.0 → True
- 凈出庫量:
- 結果:條件成立,允許后續操作(如發貨)。
- 數據:
-
場景2:某訂單使用庫存單位但未啟用交貨控制(
FDeliveryControl=False)。- 數據:
FSTOCKBASESTOCKOUTQTY = 80.0FSTOCKBASEREBACKQTY = 20.0FStockBaseQty = 70.0
- 計算:
- 凈出庫量:
round(80.0 - 20.0, 10) = 60.0 - 基準值:
abs(round(70.0, 10)) = 70.0 - 比較:
60.0 >= 70.0 → False
- 凈出庫量:
- 結果:條件不成立,攔截操作并提示錯誤。
- 數據:
總結
該條件通過嚴格的單位類型判斷、凈出庫量計算和動態基準值選擇,實現了對庫存操作的精細化控制。其執行順序遵循編程語言的標準優先級規則,結合短路邏輯優化性能,適用于需要高精度庫存管理的企業場景。
浙公網安備 33010602011771號