如何实现检验单针对启用辅助属性的物料保存校验辅助属性必录
需求描述:标准产品检验单只有在检验单单据类型启用检验单确定辅助属性时才会按照单据类型参数设置在保存或者质检完成的时候校验使用决策表体的辅助属性必录(不校验明细分录的),但是某些类型的检验单不支持启用检验单确定辅助属性且一行明细分录的辅助属性都是一个值不需要在检验单使用决策表体分开维护也不需要将辅助属性反写回上游单据(例如其他检验单),因此也就不需要启用检验单确定辅助属性,只需要把检验单明细表体的辅助属性字段放出来显示维护即可,因此需要在保存的时候针对启用辅助属性管理的物料校验明细分录启用的辅助属性必录;
解决方法1:检验单单据类型不启用检验单确定辅助属性,修改检验单的实体服务规则将明细分录的辅助属性放开显示,在检验单的保存操作上二开python插件增加校验器实现辅助属性必录校验,详细逻辑如下:(适用于非来料检验且非产品检验)
(1)修改如下实体服务规则的条件使对应检验类型时明细表体的辅助属性显示;
(2)修改明细表体的辅助属性字段的锁定性,不勾选新增锁定和修改锁定即可;
(3)检验单的保存操作上注册python插件上增加校验器校验物料启用辅助属性时,明细表体的辅助属性值必录:
(4)示例代码如下:
import clr
clr.AddReference("System")
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.App')
clr.AddReference('Kingdee.BOS.DataEntity')
clr.AddReference('Kingdee.BOS.BusinessEntity')
clr.AddReference('Kingdee.BOS.Contracts')
clr.AddReference('Kingdee.BOS.App.Core')
from System import*
from Kingdee.BOS import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.Bill import *
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.App import *
from Kingdee.BOS.App.Core import *
from Kingdee.BOS.App.Data import *
from Kingdee.BOS.Contracts import *
from System.Collections.Generic import *
from Kingdee.BOS.Core.Metadata.EntityElement import*
from Kingdee.BOS.Core.Validation import*
def OnPreparePropertys(e):
e.FieldKeys.Add("FAuxPropId")
e.FieldKeys.Add("FMaterialId")
def OnAddValidators(e):
validator=ValidateAuxMustInput()
validator.EntityKey="FBillHead"
validator.AlwaysValidate=True
e.Validators.Add(validator)
class ValidateAuxMustInput(AbstractValidator):
def Validate(self,dataEntities,validateContext,ctx):
fieldKey = "FMaterialId"
baseDataField = validateContext.BusinessInfo.GetField(fieldKey)
for bill in dataEntities:
businessType=bill.DataEntity["BusinessType"]
if(businessType !="20"):
continue
billEntrys=bill.DataEntity["Entity"]
billId=bill["Id"]
for entry in billEntrys:
bEntryNotVal='0'
mseq=(entry["Seq"])
mtrlObj=entry["MaterialId"]
mtrlId=entry["MaterialId_Id"]
auxObj = entry["AuxPropId"]
listAuxId = baseDataField.Controller.GetFlexEnableList(mtrlObj)
if (listAuxId.Count <= 0):
continue
if auxObj is None:
bEntryNotVal ='1'
else:
for auxpropId in listAuxId:
auxItemKey = str.Format("F{0}", auxpropId)
auxItemObj = auxObj[auxItemKey]
if auxItemObj is None:
bEntryNotVal ='1'
if (bEntryNotVal == '1'):
msg="检验单第"+str(mseq)+"行分录对应辅助属性未全部录入,不允许保存"
info=ValidationErrorInfo("",str(billId),bill.DataEntityIndex,mseq,str(billId),msg,"",ErrorLevel.Error)
validateContext.AddError(None,info)
说明:(1)上述代码中通过businessType判断了业务类型,上述示例中是只有其他检验(20)才校验,其余类型不校验,可以根据实际业务需求修改代码中该字段的条件,具体该字段的枚举值分别对应哪种检验可以通过BOS设计器找到该字段查看其绑定的枚举类型即可:
(2)由于python对于合格要求比较严格,因此使用Tab键按上图中截图调整代码缩进,不要使用空格键以防缩进不一致;
解决方法2:不二开插件使用标准产品功能实现 (适用于来料检验和产品检验)
标准产品在对应的检验单单据类型中勾选参数:“检验单确定辅助属性”,则检验单使用决策表体可以录入对应辅助属性的值,且保存或者质检完成会校验使用决策表体的辅助属性是否全部录入,不录入不允许保存或者质检完成
说明:(1)不启用辅助属性的物料不会校验且不校验明细分录的辅助属性必录;
(2)不勾选参数“质检完成校验辅助属性必录”时,则在保存的时候校验辅助属性必录,
(3)勾选参数“质检完成校验辅助属性必录”时,则保存不校验而是在质检完成的时候校验必录;
补充说明:
(1)标准产品仅有来料检验和产品检验是支持检验单确定辅助属性的,且这2种类型的检验单只有在使用决策表体维护的辅助属性才有走标准产品逻辑反写回收料通知单或者生产汇报单,进而携带到采购入库单/采购退料单或者生产入库单的。因此来料检验和产品检验建议使用解决方法2实现;
(2)非来料检验且非产品检验时,如果一行检验单明细分录的数量分别存在不同辅助属性值时,比如10个数量,5个红色,5个黑色,则此时可以使用检验单的拆分行功能将明细分录拆分为2行,每一行录入对应的数量和辅助属性,仍然按照解决方法1二开即可。
如何实现检验单针对启用辅助属性的物料保存校验辅助属性必录
本文2024-09-23 03:28:01发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-159047.html