金蝶云星空条件执行顺序
以销售出库单反写销售订单条件为例
( 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.0
FSTOCKBASEREBACKQTY = 30.0
FBaseDeliveryMinQty = 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.0
FSTOCKBASEREBACKQTY = 20.0
FStockBaseQty = 70.0
- 计算:
- 净出库量:
round(80.0 - 20.0, 10) = 60.0
- 基准值:
abs(round(70.0, 10)) = 70.0
- 比较:
60.0 >= 70.0 → False
- 净出库量:
- 结果:条件不成立,拦截操作并提示错误。
- 数据:
总结
该条件通过严格的单位类型判断、净出库量计算和动态基准值选择,实现了对库存操作的精细化控制。其执行顺序遵循编程语言的标准优先级规则,结合短路逻辑优化性能,适用于需要高精度库存管理的企业场景。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通