using Kingdee.BOS; using Kingdee.BOS.Core; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.Validation; using Kingdee.BOS.ServiceHelper; using Kingdee.BOS.Util; using System; using System.ComponentModel; namespace Demo.BillView.PRD { [Description("[日计划工单保存] 校验器"), HotUpdate] public class SalOrderSaveVal : AbstractOperationServicePlugIn { public override void OnPreparePropertys(PreparePropertysEventArgs e) { base.OnPreparePropertys(e); } //自定义校验器 public override void OnAddValidators(AddValidatorsEventArgs e) { base.OnAddValidators(e); TestValidator validator = new TestValidator(); validator.AlwaysValidate = true; validator.EntityKey = "FBillHead"; e.Validators.Add(validator); } /// /// 保存单据头校验器 /// private class TestValidator : AbstractValidator { public override void Validate(ExtendedDataEntity[] dataEntities, ValidateContext validateContext, Context ctx) { //for循环,读取数据 foreach (var data in dataEntities) { var FID = data.DataEntity["Id"]?.ToString();//日计划工单FID var FPRDMOENTYID = Convert.ToInt32(data.DataEntity["FPRDMOENTYID"]?.ToString());//生产订单明细 FentryID var FSRCBILLENTRYSEQ = data.DataEntity["FSRCBILLENTRYSEQ"]?.ToString();//生产订单明细行号 var FSCOrderNo = data.DataEntity["FSCOrderNo"]?.ToString(); //生产订单号 var FDayPlanQuantity = Convert.ToDecimal(data.DataEntity["FDayPlanQuantity"]?.ToString()); //日计划数量总量 var FMOENTRYID = Convert.ToInt32(data.DataEntity["FMOENTRYID"]?.ToString());//生产订单明细 FMOENTRYID(新) var FMoBillNo = data.DataEntity["FMoBillNo"]?.ToString();//生产订单号 FMOENTRYID(新) var FMoSeq = 1;//生产订单明细行号(新) if (FMOENTRYID == 0 || FMOENTRYID == FPRDMOENTYID) { var FOrderQuantity = DBServiceHelper.ExecuteScalar(Context, "select Fqty from t_prd_moentry where fentryid ="+ FPRDMOENTYID.ToString(), 0); string sql = $"select convert(decimal(18,2),sum(FDayPlanQuantity)) from Sc_WorkBillSortBillMain where FPRDMOENTYID = {FPRDMOENTYID} and (FMoEntryId = 0 or FMoEntryId = FPRDMOENTYID ) and FID <>{FID}"; decimal FOrderCount = DBServiceHelper.ExecuteScalar(Context, sql, 0); //LogService.Write("sql:" + sql); //LogService.Write("FOrderCount:" + FOrderCount); bool isSave = FOrderCount + FDayPlanQuantity > FOrderQuantity; if (isSave) { string err = $"生产订单号:{FSCOrderNo},生产订单明细行号:{FSRCBILLENTRYSEQ},生产订单数量:{FOrderQuantity},已有日计划数量{FOrderCount},本次计划数量:{FDayPlanQuantity},将超出生产订单总数量"; //报错 validateContext.AddError(data.DataEntity, new ValidationErrorInfo ("PurchaserId",//出错的字段Key,可以空 data.DataEntity["Id"].ToString(),// 出错的字段Key,可以空 data.DataEntityIndex, // 出错的数据包在全部数据包中的顺序 data.RowIndex,// 出错的数据行在全部数据行中的顺序,如果校验基于单据头,此为0 "001",//错误编码,可以任意设定一个字符,主要用于追查错误来源 "单据编号" + data.BillNo + err,//错误的详细提示信息  "保存" + data.BillNo,// 错误的简明提示信息 Kingdee.BOS.Core.Validation.ErrorLevel.Error// 错误级别:警告、错误... )); } } else//新生产订单 { string _sql = string.Format(@" select convert(decimal(18,2),sum(FDayPlanQuantity)) from ( select FDayPlanQuantity from Sc_WorkBillSortBillMain t1 where FMOENTRYID ={0} and FID <>{1} union select FDayPlanQuantity from Sc_WorkBillSortBillMain t1 where FPRDMOENTYID ={0} and FMOENTRYID in({0},0 ) and FID <> {1} ) t1", FMOENTRYID, FID); LogService.Write("_sql:"+ _sql); //string sql = $"select convert(decimal(18,2),sum(FDayPlanQuantity)) from Sc_WorkBillSortBillMain where FMoEntryId = {FMOENTRYID} and FID <>{FID}"; decimal FOrderCount = DBServiceHelper.ExecuteScalar(Context, _sql, 0); var FOrderQuantity = DBServiceHelper.ExecuteScalar(Context, "select Fqty from t_prd_moentry where fentryid =" + FMOENTRYID.ToString(), 0); //LogService.Write("FOrderCount:" + FOrderCount); bool isSave = FOrderCount + FDayPlanQuantity > FOrderQuantity; if (isSave) { string err = $"生产订单号:{FMoBillNo},生产订单明细行号:{FMoSeq},生产订单数量:{FOrderQuantity},已有日计划数量{FOrderCount},本次计划数量:{FDayPlanQuantity},将超出生产订单总数量"; //报错 validateContext.AddError(data.DataEntity, new ValidationErrorInfo ("PurchaserId",//出错的字段Key,可以空 data.DataEntity["Id"].ToString(),// 出错的字段Key,可以空 data.DataEntityIndex, // 出错的数据包在全部数据包中的顺序 data.RowIndex,// 出错的数据行在全部数据行中的顺序,如果校验基于单据头,此为0 "001",//错误编码,可以任意设定一个字符,主要用于追查错误来源 "单据编号" + data.BillNo + err,//错误的详细提示信息  "保存" + data.BillNo,// 错误的简明提示信息 Kingdee.BOS.Core.Validation.ErrorLevel.Error// 错误级别:警告、错误... )); } } } } } } }