王 垚
2021-04-02 4476cab7907ced549b116987362ef0c895a18030
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using System;
using System.ComponentModel;
using System.Data;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
using ZD.Cloud.Logger;
using Demo.Model.Model;
using System.Collections.Generic;
using ZD.Share.Common;
using System.Linq;
using Newtonsoft.Json.Linq;
using ZD.Cloud.WebApi;
 
namespace Demo.BillView
{
    [Description("生产排程单动态表单-按钮点击事件")]
    [HotUpdate]
    public class ProductScheduleButtonClick : AbstractDynamicFormPlugIn
    {
        public List<ENG_WORKCALFULLDATA> ENG_WORKCALFULLDATA = new List<ENG_WORKCALFULLDATA>();
        /// <summary>
        /// 页面按钮点击事件
        /// </summary>
        /// <param name="e"></param>
        public override void ButtonClick(ButtonClickEventArgs e)
        {
            base.OnLoad(e);
            try
            {
                //选择
                if (e.Key.ToUpper().Equals("FCHOICEBUTTONSC"))
                {
                    ShowFDprwEntity();
                }
                //生产订单      查询
                if (e.Key.ToUpper().Equals("FSEARCHBUTTONSC"))
                {
                    this.View.ShowErrMessage("生产订单嘿嘿!");
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("生产排程单动态表单-Button按钮点击事件 抛出异常:" + ex.Message.ToString());
                this.View.ShowErrMessage(ex.Message.ToString());
 
            }
        }
        public override void BarItemClick(BarItemClickEventArgs e)
        {
            base.OnLoad(e);
            try
            {
                //排程
                if (e.BarItemKey.ToUpper().Equals("TBPC"))
                {
                    ProductSchedul();
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("生产排程单动态表单-BarItem按钮点击事件 抛出异常:" + ex.Message.ToString());
                this.View.ShowErrMessage(ex.Message.ToString());
            }
        }
 
        /// <summary>
        /// 生产订单数据推到待排任务栏
        /// </summary>
        public void ShowFDprwEntity()
        {
            Entity entity = this.View.BillBusinessInfo.GetEntity("FScddEntity");
            //单据体信息转换为列表集合
            DynamicObjectCollection entityDataObjoct = this.View.Model.GetEntityDataObject(entity);
            int FChose = 0;
            foreach (DynamicObject current in entityDataObjoct)
            {
                if (Convert.ToBoolean(current["FChose"]))
                    FChose++;
            }
            if (FChose == 0)
            {
                this.View.ShowErrMessage("请选择需要待排的生产订单数据!");
                return;
            }
            int i = this.View.Model.GetEntryRowCount("FDprwEntity");
            foreach (DynamicObject current in entityDataObjoct)
            {
                if (!Convert.ToBoolean(current["FChose"]))
                    continue;
                this.Model.CreateNewEntryRow("FDprwEntity");
                // this.Model.SetValue("FSEQ", i + 1, i);//序号
                this.Model.SetValue("FProOrderNo", Convert.ToString(current["FProOrderNoSC"]), i);//生产订单号  
                this.Model.SetValue("FSRCBILLENTRYSEQ", Convert.ToString(current["FSRCBILLENTRYSEQSC"]), i);//生产订单明细号  
                this.Model.SetValue("FMATERIALID", Convert.ToString(current["FMATERIALIDSC_ID"]), i);//物料
                this.Model.SetValue("FSCOrderCount", Convert.ToString(current["FSCOrderCountSC"]), i);//生产订单数
                this.Model.SetValue("FPlanBeginDate", Convert.ToString(current["FPlanBeginDateSC"]), i);//计划开工日期
                this.Model.SetValue("FPlanEndDate", Convert.ToString(current["FPlanEndDateSC"]), i);//计划完工日期  
                this.Model.SetValue("FSalOrderNo", Convert.ToString(current["FSalOrderNoSC"]), i);//销售订单号  
                this.Model.SetValue("FCustormer", Convert.ToString(current["FCustormerSC"]), i);//客户  
                this.Model.SetValue("FSalOrderCount", Convert.ToString(current["FSalOrderCountSC"]), i);//销售订单数量  
                this.Model.SetValue("FSalDeliveryDate", Convert.ToString(current["FSalDeliveryDateSC"]), i);//销售订单交货期  
                this.Model.SetValue("FOrderRemake", Convert.ToString(current["FOrderRemakeSC"]), i);//订单备注  
                i++;
            }
        }
 
        /// <summary>
        /// 产能计算
        /// </summary>
        public void Jscn()
        {
            //查询出重复生产线对应的工作日历信息
            string _sql = @"
select FCalUserId,FCalUserType,FShiftId,FIsWorkTime,FDay,FDateStyle,c.FALLHOURS,b.FENTRYID from T_ENG_WORKCAL a
left join  T_ENG_WORKCALFULLDATA b on a.FID=b.FID
left join T_ENG_SHIFT c on b.FShiftId =c.FID
where FDateStyle = 1 and FIsWorkTime = 1
and FCalUserType ='ENG_RepetitiveProductLine'
--条件为 工作日+是否生产 == 1 ";
            ENG_WORKCALFULLDATA = DBServiceHelper.ExecuteDataSet(Context, _sql).ToModelList<ENG_WORKCALFULLDATA>();
 
            var list = new List<object>();
            Entity entity = this.View.BillBusinessInfo.GetEntity("FDprwEntity");
            //单据体信息转换为列表集合
            DynamicObjectCollection entityDataObjoct = this.View.Model.GetEntityDataObject(entity);
            var groups = entityDataObjoct.GroupBy(x => x["FSczy_Id"]);//生产资源分组(计算优先级)
            foreach (var group in groups)
            {
                var orders = group.OrderBy(x => Convert.ToDateTime(x["FPlanEndDate"]));//计划完工日期排序
                var seq = 1;
                foreach (var order in orders)
                {
                    //计算产能
                    decimal FCapacity = Convert.ToDecimal(order["FCapacity"]);//小时产能
                    decimal FSCOrderCount = Convert.ToDecimal(order["FSCOrderCount"]);//生产订单数
                    List<ENG_WORKCALFULLDATA> finalyResult = new List<ENG_WORKCALFULLDATA>();
                    decimal dayFCapacity = 0;//日产量
                    List<ENG_WORKCALFULLDATA> _ENG_WORKCALFULLDATA = ENG_WORKCALFULLDATA.Where(x => x.FALLHOURS > 0 && x.FCalUserId == Convert.ToInt32(order["FSczy_Id"])).ToList();
                    foreach (var item in _ENG_WORKCALFULLDATA)
                    {
                        if (FSCOrderCount == 0)
                            break;
                        dayFCapacity = FCapacity * item.FALLHOURS;
                        decimal fqty = dayFCapacity > FSCOrderCount ? FSCOrderCount : dayFCapacity;
                        finalyResult.Add(new Demo.Model.Model.ENG_WORKCALFULLDATA
                        {
                            FDay = item.FDay,
                            FQTY = fqty
                        }); ;
                        //当日产量大于剩余生产订单数量时 按小时产量去计算需要时间 list<>去扣除相应的工时
                        if (dayFCapacity > FSCOrderCount)
                        {
                            //改变list中某个元素值
                            var model = ENG_WORKCALFULLDATA.Where(c => c.FENTRYID == item.FENTRYID).FirstOrDefault();
                            model.FALLHOURS -= Math.Ceiling(fqty / FCapacity);
 
                        }
                        else
                        {
                            var model = ENG_WORKCALFULLDATA.Where(c => c.FENTRYID == item.FENTRYID).FirstOrDefault();
                            model.FALLHOURS = 0;
                        }
                        FSCOrderCount = FSCOrderCount - fqty;
                    }
 
                    //continue;
 
                    //根据生产订单号和物料查询是否存在明细 +生产订单明细行号
                    string sql = string.Format(@"
/*dialect*/
SELECT T1.FBILLNO,T2.*,t3.FNUMBER as FUnitNumber FROM T_PRD_MO T1
 LEFT JOIN T_PRD_MOENTRY T2 ON T1.FID = T2.FID
 join T_BD_UNIT t3 on t2.FUNITID=t3.FUNITID 
 WHERE T1.FBILLNO = '{0}'  AND T2.FMATERIALID = '{1}' AND T2.FSEQ = '{2}'", Convert.ToString(order["FProOrderNo"]), Convert.ToString(order["FMATERIALID_Id"]), Convert.ToString(order["FSRCBILLENTRYSEQ"]));
                    DataTable dt = DBServiceHelper.ExecuteDataSet(Context, sql).Tables[0];
                    string FID = "";//FID 源单主内码
                    string FENTRYID = "";//FENTRYID 源单子内码
                    string FLOT = "";//FLOT  批次
                    string FQTY = "";//FQTY 生产订单数量
                    string FBILLNO = "";//FBILLNO 原单号 
                    string FHUnitID = "";//单位
                    if (dt.Rows.Count > 0)
                    {
                        FID = dt.Rows[0]["FID"].ToString();
                        FENTRYID = dt.Rows[0]["FENTRYID"].ToString();
                        FLOT = dt.Rows[0]["FLOT"].ToString();
                        FQTY = dt.Rows[0]["FQTY"].ToString();
                        FBILLNO = dt.Rows[0]["FBILLNO"].ToString();
                        FHUnitID = dt.Rows[0]["FUnitNumber"].ToString();
                    }
 
                    JObject jsonRoot = new JObject();
                    jsonRoot.Add("Creator", "");
                    jsonRoot.Add("NeedUpDateFields", new JArray());
                    jsonRoot.Add("NeedReturnFields", new JArray());
                    jsonRoot.Add("IsDeleteEntry", "true");
                    jsonRoot.Add("SubSystemId", "");
                    jsonRoot.Add("IsVerifyBaseDataField", "");
 
                    JObject jsonModel = new JObject();
                    jsonModel.Add("FPreparatDate", DateTime.Now.ToString());//编制日期
                    jsonModel.Add("FSRCBILLENTRYSEQ", Convert.ToString(order["FSRCBILLENTRYSEQ"]));//生产订单明细行号
                    jsonModel.Add("FSCOrderNo", Convert.ToString(order["FProOrderNo"])); //生产订单号FSCOrderNo
                    jsonModel.Add("FHSeOrderBillNo", Convert.ToString(order["FSalOrderNo"]));//销售订单号
                    //jsonModel.Add("FHOrderLev", order["FOrderLevel"].ToString());//订单等级
                    jsonModel.Add("FHOrderQty", Convert.ToString(order["FSalOrderCount"]));//销售订单数量
                    //jsonModel.Add("FHOrderCommitDate", Convert.ToString(order["FDeliveryDate"]));//交货期HOrderCommitDate
                    jsonModel.Add("FHOrderNeedQty", FQTY);// 订单需求数量
                    jsonModel.Add("FPrdBillNo", FBILLNO); ;//源单编号
                    jsonModel.Add("FPRDMOMAINID", FID); ;//源单主内码
                    jsonModel.Add("FPRDMOENTYID", FENTRYID); ;//源单子内码
                    jsonModel.Add("FOrderQuantity", Convert.ToString(order["FSCOrderCount"])); ;//生产订单数量
                    //jsonModel.Add("FDayPlanQuantity", Convert.ToString(order["FDayPlanQuantity"])); ;//日计划数量
                    //jsonModel.Add("FNoScheduled", Convert.ToString(order["FNoScheduled"])); ;//未排数量
                    jsonModel.Add("FHMaterID", new JObject() { ["Fnumber"] = Convert.ToString(((order["FMATERIALID"]) as DynamicObject)?["Number"].ToString()) });//物料
                    jsonModel.Add("FHSourceID", new JObject() { ["Fnumber"] = Convert.ToString(((order["FSczy"]) as DynamicObject)?["Number"].ToString()) });//生产资源
                    jsonModel.Add("FHWorkQty", Convert.ToString(order["FCapacity"])); ;//产能
                    jsonModel.Add("FHYX", Convert.ToString(order["FPriority"])); ;//优先级
                    if (Convert.ToInt32(order["FID"]) > 0)
                        jsonModel.Add("FID", Convert.ToString(order["FID"])); ;//日计划工单ID
                    JArray Entry = new JArray();
                    foreach (var finaly in finalyResult)
                    {
                        JObject jsonFPOOrderEntry = new JObject();
                        jsonFPOOrderEntry.Add("FHMasterDate", finaly.FDay); ;//主日期
                        jsonFPOOrderEntry.Add("FHQty ", finaly.FQTY); ;//日计划数量
                        Entry.Add(jsonFPOOrderEntry);
                    }
                    jsonModel.Add("FEntity", Entry);
                    jsonRoot.Add("Model", jsonModel);
                    CloudClient cloudClient = new CloudClient("http://localhost//k3cloud/");
                    var result = cloudClient.Save("Paez_Sc_WorkBillAutoSortBill", jsonRoot.ToString());
                    JObject saveObj = JObject.Parse(result);
                    string saveIsSuc = saveObj["Result"]["ResponseStatus"]["IsSuccess"].ToString().ToUpper();
                    if (saveIsSuc != "TRUE")
                    {
                        LogHelper.Error(jsonRoot.ToString());
                        this.View.ShowErrMessage(jsonRoot.ToString());
                    }
                }
            }
        }
        /// <summary>
        /// 排程 按钮点击事件
        /// 按照优先级排产 日产量=小时产量*工作时长 
        /// </summary>
        public void ProductSchedul()
        {
            try
            {
                //查询出重复生产线对应的工作日历信息
                string sql = @"
select FCalUserId,FCalUserType,FShiftId,FIsWorkTime,FDay,FDateStyle,c.FALLHOURS,b.FENTRYID from T_ENG_WORKCAL a
left join  T_ENG_WORKCALFULLDATA b on a.FID=b.FID
left join T_ENG_SHIFT c on b.FShiftId =c.FID
where FDateStyle = 1 and FIsWorkTime = 1
and FCalUserType ='ENG_RepetitiveProductLine'
--条件为 工作日+是否生产 == 1 ";
                ENG_WORKCALFULLDATA = DBServiceHelper.ExecuteDataSet(Context, sql).ToModelList<ENG_WORKCALFULLDATA>();
 
                Entity entity = this.View.BillBusinessInfo.GetEntity("FDprwEntity");
                //单据体信息转换为列表集合
                DynamicObjectCollection entityDataObjoct = this.View.Model.GetEntityDataObject(entity);
 
                string result = "";
                foreach (DynamicObject current in entityDataObjoct)
                {
                    if (Convert.ToInt32(current["FSczy_Id"]) == 0)
                        result += "行号:" + Convert.ToString(current["Seq"]) + ",生产资源为空;";
                    if (Convert.ToInt32(current["FCapacity"]) == 0)
                        result += "行号:" + Convert.ToString(current["Seq"]) + ",小时产能为空;";
 
                }
                if (result.Length > 0)
                {
                    this.View.ShowErrMessage("请检查数据,存在生产资源为空的单据:" + result);
                    return;
                }
 
                Jscn();
                this.View.ShowMessage("操作成功");
            }
            catch (Exception ex)
            {
                LogHelper.Error("生产排程单动态表单 排程按钮点击功能" + ex.Message.ToString());
            }
        }
 
    }
}