
@[TOC](目录)
### 背景
在跨组织场景,采购订单下推销售订单后,有客户会存在变更销售订单物料的情况,这样下推到出库单后,审核将不会自动生成入库单,因此需要在**出库单保存时校验销售订单与采购订单的物料是否一致**,需要在销售出库单保存操作上注册二开校验器插件实现
### 步骤

### python脚本
```python
import clr
clr.AddReference('mscorlib')
clr.AddReference('System')
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.App')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.DataEntity')
from System import *
from Kingdee.BOS import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Orm import *
from Kingdee.BOS.App.Data import *
from Kingdee.BOS.Core.Validation import *
from System.Collections.Generic import *
def OnPreparePropertys(e):
e.FieldKeys.Add("FPayConditionId")
e.FieldKeys.Add("FPurchaseOrgId")
e.FieldKeys.Add("FMATERIALSEQ")
e.FieldKeys.Add("FPayMaterialId")
e.FieldKeys.Add("FMaterialId")
def OnAddValidators(e):
outStockValidator = OutStockValidator()
outStockValidator.EntityKey = "FBillHead"
outStockValidator.AlwaysValidate = True
e.Validators.Add(outStockValidator)
class OutStockValidator(AbstractValidator):
def Validate(self, dataEntities, validateContext,ctx):
if dataEntities == None or dataEntities.Length == 0:
return
soEntryIds = List[String]()
for data in dataEntities:
cust = data.DataEntity["CustomerID"]
if cust != None:
custType = cust["CustTypeId"]
if custType != None:
if custType["Number"] == "KHLB003_SYS":
entrys = data.DataEntity["SAL_OUTSTOCKENTRY"]
if entrys != None and entrys.Count>0:
for entry in entrys:
soEntryId = Convert.ToString(entry["SOEntryId"])
if soEntryId >0:
soEntryIds.Add(soEntryId)
if soEntryIds.Count >0:
sql = """
SELECT T2.FBILLNO,T1.FSEQ,MA1.FNUMBER AS SOMATNUMBER,MA2.FNUMBER AS POMATNUMBER,ISNULL(T3.FREMAINOUTQTY,0)AS SOQTY,ISNULL(T6.FREMAINSTOCKINQTY,0) AS POQTY FROM T_SAL_ORDERENTRY T1
INNER JOIN T_SAL_ORDER T2 ON T1.FID = T2.FID AND T1.FENTRYID IN ({0})
INNER JOIN T_SAL_ORDERENTRY_R T3 ON T1.FENTRYID = T3.FENTRYID
INNER JOIN T_BD_MAT