新增单据转换后部分下推的下游单据触发反写规则会重置上游单据关闭状态
## 一、现象
二开新增的单据转换,例如采购申请单—>采购合同,当配置好单据转换规则以及反写规则后,采购申请单整单关闭后部分下推采购合同(这里下推时没有去校验关闭状态,因此可以下推),然后下游的采购合同保存—提交—审核—反审核,此时发现上游源单明明之前已经手工整单关闭了,但此时的关闭状态却被改为了“未关闭”
## 二、原因
![image.webp](/download/0100d8be1b90372b464892458fdd14fa43f4.webp)
这里的采购合同到采购申请单的反写规则中设置了关闭控制,且关闭控制的整单关闭策略是“全部分录均关闭后,关闭整单”,那就意味着,当还有部分分录未关闭时,整单关闭状态应当是处于未关闭状态的。因此这里的反写规则的关闭控制逻辑会控制上游单据的整单关闭状态。
相信大家会问,手工关闭的还会受这个逻辑影响,应该是不正常的吧。的确是,我们系统正常的单据转换是不会有这个问题的,之前就已经指明过,是二开新增的单据转换且设置了反写规则的这个地方,才会发生上述情况。那这个问题如何解决呢?
## 三、办法
解决这个问题的核心就是在反写规则控制整单关闭状态时,需要识别上游单据是手工关闭的还是非手工关闭的,如果是手工关闭的那么无论如何都不让他进行更改。因此我们需要在上游单据上新增一个字段来标记该单是手工关闭还是非手工关闭。采购申请单系统在其他页签上已经预设了一个复选框为“手工关闭”,其他单据没有的需要自己增加。然后再书写反写插件进行注册即可。代码示例如下,反写插件注册在“单据关联配置”属性中,如截图
![image.webp](/download/0100c2d02969449c42989f1478ff392d251a.webp)
## 四、案例
反写插件
```python
import clr
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.App')
from Kingdee.BOS import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.BusinessFlow.PlugIn import *
from Kingdee.BOS.Core.Base import *
dicPrManualCloseInfo = {}#全局变量,记录上游手工关闭的单据的关闭信息
#申明上游单据必须加载的字段
def AfterCustomReadFields(e):
e.AddFieldKey("FMANUALCLOSE")#采购申请单上【手工关闭】复选框字段
#关闭上游行前调用
def BeforeCloseRow(e):
global dicPrManualCloseInfo#加载全局变量
srcFormId = e.SourceBusinessInfo.GetForm().Id#获取上游单据标识
if srcFormId == "PUR_Requisition" and e.SourceDataObject["ManualClose"]:#判断上游是否是采购申请单并且手工关闭处于勾选状态
sBillID = e.SourceDataObject["Id"]#上游单据ID
sCloseStatus = e.SourceDataObject["CLOSESTATUS"]#上游关闭状态
if sBillID in dicPrManualCloseInfo.keys() and sCloseStatus == "B":#如果该单是手工关闭的并且关闭状态已关闭
lDNCloserId = e.SourceDataObject["CLOSERID_Id"]
dtDNCloseTime = e.SourceDataObject["CLOSEDATE"]
dicPrManualCloseInfo[str(sBillID)]={str(lDNCloserId):dtDNCloseTime}#记录关闭人和关闭时间
#对上游进行了关闭状态填写后调用
def AfterCloseRow(e):
global dicPrManualCloseInfo
if e.SourceBusinessInfo.GetForm().Id == "PUR_Requisition":
if e.SourceDataObject["ManualClose"]:#如果手工关闭的
e.SourceDataObject["CLOSESTATUS"] = "B"#强制将关闭状态置为已关闭
sBillId = e.SourceDataObject["Id"]
if sBillId in dicPrManualCloseInfo:
#重新还原关闭人和关闭时间
e.SourceDataObject["CLOSERID_Id"] = dicPrManualCloseInfo[str(sBillId)].keys()[0]
e.SourceDataObject["CLOSEDATE"] = dicPrManualCloseInfo[str(sBillId)].values()[0]
```
原理:反写规则生效前先记录下上游是手工关闭的单据的关闭信息,反写规则生效之后再根据之前记录的信息将其关闭状态等信息还原。
**其他更多文章入口:**[https://wenku.my7c.com/link/s/lbRPP](https://wenku.my7c.com/link/s/lbRPP)
新增单据转换后部分下推的下游单据触发反写规则会重置上游单据关闭状态
## 一、现象二开新增的单据转换,例如采购申请单—>采购合同,当配置好单据转换规则以及反写规则后,采购申请单整单关闭后部分下推采购合...
点击下载文档
本文2024-09-16 19:05:55发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-26374.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章