王 垚
2022-09-29 fef143d04fc39ee5fce167fe22d727da1d042c5d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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);
        }
        /// <summary>
        /// 保存单据头校验器
        /// </summary>
        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<decimal>(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<decimal>(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<decimal>(Context, _sql, 0);
                        var FOrderQuantity = DBServiceHelper.ExecuteScalar<decimal>(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// 错误级别:警告、错误...
                                ));
                        }
                    }
                }
            }
        }
    }
}