直接调拨单明细仓库一致性保存校验实现原创
金蝶云社区-邱育华
邱育华
4人赞赏了该文章 568次浏览 未经作者许可,禁止转载编辑于2022年09月26日 10:55:37

一、【业务需求】

直接调拨单控制所有明细行中调出仓库字段一致时才能保存


二、【功能实现】

  • 方案1:BOS扩展配置

1、单据头扩展基础资料字段,绑定"仓库"类型

image.png


2、明细"调出仓库"配置值更新,将明细仓库赋值到单据头仓库

image.png


3、保存操作添加"单据合法性"校验,比较明细仓库字段和单据头仓库字段是否一致

image.png


image.png


  • 方案2:二开保存校验器



import clr
clr.AddReference('System')
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
from System import * 
from System import StringComparison
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.Metadata.EntityElement import *
from Kingdee.BOS.Core.Validation import *
from Kingdee.BOS.Log import Logger

def OnAddValidators(e):
    validator = TransferDirectSrcStockIdValidator()
    validator.AlwaysValidate = True
    validator.EntityKey = "FBillHead"
    e.Validators.Add(validator)
                
class TransferDirectSrcStockIdValidator(AbstractValidator):
    def Validate(self, dataEntities, validateContext, ctx):
        if len(dataEntities) == 0:
            return
            
        targetStockId = 0
        for bill in dataEntities:
            billEntities = bill["TransferDirectEntry"]
            if len(billEntities) > 0:
                targetStockId = str(billEntities[0]["SrcStockId_Id"])
        
        for bill in dataEntities:
            billEntities = bill["TransferDirectEntry"] 
            countMain = list(filter(lambda x: str(x["SrcStockId_Id"]) != str(targetStockId), billEntities));
            if len(countMain) > 0:
                errorMsg = "明细行调出仓库不一致,校验失败"
                info = ValidationErrorInfo("",str(bill["Id"]), bill.DataEntityIndex, bill.RowIndex, "调出仓库校验", errorMsg, str(bill["BillNo"]), ErrorLevel.Error)                    
                validateContext.AddError(None,info)
赞 4