
【场景】经常有客户提单反馈二开调用保存的时候出现以下错误
在其他单据保存时出现反写异常,提示非当前单据异常
"XXX" 使用业务单据:"采购订单"业务操作-“[反写-采购订单-XXX]”冲突
这个错误就是我们系统标准的网控互斥

【分析】很多客户很好奇为啥会出现一个问题?
<0>逻辑分析:业务流反写
<0.0>一对一关系

入库单保存时反写逻辑

由于需要计算反写、超额控制,因此在保存CGRK001的时候,我们会开启CGSQ001和CGDD001的网控,**保存操作调用完成后释放**;
同样的,在保存CGRK002的时候,我们会开启CGSQ002和CGDD002的网控,**保存操作调用完成后释放**;
<0.1>一对多,拆单关系;假定采购申请分别推两个订单

入库单保存时反写逻辑

此时CGRK001和CGRK002都需要开启CGSQ001的网控,如果CGRK001占用了网控,那么CGRK002就会冲突;
只能等待CGRK001保存完了,网控释放了的时候重新保存一次。
通常在界面出现这样的问题的时候,我们就会等另外的业务员操作一下,过个几秒钟、或者1分钟重新保存
<1>时间线分析:单据批量操作、非工作流模式
普通操作模型为串行分批模型,指代的意思是处理完上一批后再处理下一批

不同批次的操作:由于时间不会交叉,每次都是等待上一次完成后才开始下一批,不会冲突
(在一批操作内的反写网控判断:判断网控是否为本次操作调用占用)
<2>时间线分析:单据批量操作、工作流模型
工作流消息队列操作模型为异步逐单并行模型,指代的意思是操作时不会真正触发(异步),而后在真正调度的时候会可能存在并发调用

消息队列调度逻辑:等待上一个任务完成时直接调用,或者到达超时时间还没收到上一个任务反馈,也直接调用
导致单据B和单据C在时间上会一起执行
<3>最终结论:两个下游单据,存在同一上游单据,在工作流并发偶发下,会存在冲突操作;
【最佳实践】
<0>业务流:减少拆单下推的逻辑
<1>界面操作:遇到保存、审核抛出的