王 垚
2022-09-05 89e9e87324656eb6ff2bc70c731ee676eeac9111
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
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
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 Demo.Model.Model;
using System.Collections.Generic;
using ZD.Share.Common;
using System.Linq;
using Newtonsoft.Json.Linq;
using ZD.Cloud.WebApi;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
 
namespace Demo.BillView.PRD
{
    [Description("生产排程单动态表单-按钮点击事件")]
    [HotUpdate]
    public class ProductScheduleButtonClick : AbstractDynamicFormPlugIn
    {
        /// <summary>
        /// 定义工作日历班组List<Model>
        /// </summary>
        public List<ENG_WORKCALFULLDATA> ENG_WORKCALFULLDATA = new List<ENG_WORKCALFULLDATA>();
        /// <summary>
        /// 待排任务双击行 将订单齐套赋值
        /// </summary>
        /// <param name="e"></param>
        public override void EntityRowDoubleClick(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.EntityRowClickEventArgs e)
        {
            base.EntityRowClick(e);
            isSearched = false;
            DynamicFormShowParameter formPa = new DynamicFormShowParameter();
            if (!e.Key.ToString().Contains("FDPRWENTITY"))
                return;
            var model = this.View.Model;
            var fid = model.GetValue("FID", e.Row).ToString();
            while (this.Model.GetEntryRowCount("FQtfxEntity") > 0)
            {
                this.Model.DeleteEntryRow("FQtfxEntity", 0);
            }
            string sql = $"/*dialect*/select * from view_JIT_MOMaterReadysBill where  FHICMOInterID='{fid}' order by FPlanDate, FHStockQty desc ,FHMaterID ";
            DataTable dt = DBServiceHelper.ExecuteDataSet(Context, sql).Tables[0];
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    this.Model.CreateNewEntryRow("FQtfxEntity");
                    this.Model.SetValue("FSEQ", i + 1, i);//序号
                    this.Model.SetValue("FMateralDetailId", dt.Rows[i]["FHMATERID"], i);
                    this.Model.SetValue("FPlanIssueCount", dt.Rows[i]["FSumPlanCount"], i);//计划发料数量
                    this.Model.SetValue("FCompleteCount", dt.Rows[i]["FCompleteCount1"], i);//齐套数量  
                    this.Model.SetValue("FLackCount", dt.Rows[i]["FLackCount"], i);//缺料数量  
                    this.Model.SetValue("FPassableCount", dt.Rows[i]["FHLeftQty"].ToString(), i);//可用数量   
                    this.Model.SetValue("FMateralCount", dt.Rows[i]["FHStockQty"].ToString(), i);//物料数量   
                    this.Model.SetValue("FOccupyCount", dt.Rows[i]["FOccupyCount"].ToString(), i);//占用数量   
                    this.Model.SetValue("FCompleteDetailStatus", dt.Rows[i]["FComPlete"].ToString(), i);//是否齐套   
                    this.Model.SetValue("FIsHavePur", dt.Rows[i]["FIsHavePur"].ToString(), i);//是否有采购订单   
                    this.Model.SetValue("FHMainICMOInterIDr", dt.Rows[i]["FHMainICMOInterIDr"].ToString(), i);//生产订单内码   
                    this.Model.SetValue("FPRDBillNo", dt.Rows[i]["FPRDBillNo"].ToString(), i);//生产订单内码   
                    this.Model.SetValue("FPlanDate", dt.Rows[i]["FPlanDate"].ToString(), i);//日计划日期   
                    this.Model.SetValue("FOrgId", dt.Rows[i]["FHStockOrgID"], i);//库存组织  
                    this.Model.SetValue("FOwnerTypeId", dt.Rows[i]["FOwnerTypeId"], i);//货主类型  
                    this.Model.SetValue("FOwnerId", dt.Rows[i]["FOwnerId"], i);//货主 
                    this.Model.SetValue("FErpClsID", dt.Rows[i]["FErpClsID"], i);//物料属性 
                }
                ChangeColor();
            }
            isSearched = true;
        }
        /// <summary>
        /// 不齐套信息渲染底色
        /// </summary>
        private void ChangeColor()
        {
            Entity entity = this.View.BillBusinessInfo.GetEntity("FQtfxEntity");
            //单据体信息转换为列表集合
            DynamicObjectCollection entityDataObjoct = this.View.Model.GetEntityDataObject(entity);
            EntryGrid grid = this.View.GetControl<EntryGrid>("FQtfxEntity");
            int _i = 0;
            foreach (DynamicObject current in entityDataObjoct)
            {
                if (Convert.ToString(current["FCompleteDetailStatus"]) == "未齐套")
                {
                    // grid.SetRowBackcolor("#FF0000", _i);
                    grid.SetRowBackcolor("#71FF98CB", _i);
                }
                _i++;
            }
        }
        /// <summary>
        /// 自动排程日计划 齐套分析后的结果渲染
        /// </summary>
        private void ChangeColorZDPC()
        {
            DateTime DateNow = DateTime.Now;
            string sql = "";
            Entity entity = this.View.BillBusinessInfo.GetEntity("FZdpcEntity");
            //单据体信息转换为列表集合
            DynamicObjectCollection entityDataObjoct = this.View.Model.GetEntityDataObject(entity);
            EntryGrid grid = this.View.GetControl<EntryGrid>("FZdpcEntity");
            int _i = 0;
            foreach (DynamicObject current in entityDataObjoct)
            {
                sql = @"/*dialect*/SELECT * FROM Sc_WorkBillSortBillSub WHERE DATEDIFF(D,GETDATE(),FHMASTERDATE)>=0 and FID=" + current["FIDZD"].ToString();
                DataTable _dt = DBServiceHelper.ExecuteDataSet(Context, sql).Tables[0];
                foreach (DataRow dr in _dt.Rows)
                {
                    DateTime start = Convert.ToDateTime(DateNow.ToShortDateString());
                    DateTime end = Convert.ToDateTime(Convert.ToDateTime(dr["FHMASTERDATE"]).ToShortDateString());
                    TimeSpan getDay = end.Subtract(start);
                    if (getDay.Days > 60)
                        continue;
 
                    if (dr["FHLockedSub"].ToString() == "1")
                        this.View.GetFieldEditor("FT" + getDay.Days.ToString(), _i).Enabled = false; //单据体行锁定字段
                    if (dr["FCOMPLETE"].ToString() == "未齐套")
                    {
                        this.View.GetFieldEditor("FT" + getDay.Days.ToString(), _i).Enabled = false; //单据体行锁定字段
                        grid.SetForecolor("FT" + "" + getDay.Days.ToString() + "", "#FF0000", _i);
                    }
                    else if (dr["FCOMPLETE"].ToString() == "齐套")
                    {
                        this.View.GetFieldEditor("FT" + getDay.Days.ToString(), _i).Enabled = false; //单据体行锁定字段
                        grid.SetForecolor("FT" + "" + getDay.Days.ToString() + "", "#00FF00", _i);
                    }
                    //手工修改标记
                    if (dr["FIsSGXG"].ToString() == "1")
                    {
                        this.View.GetFieldEditor("FT" + getDay.Days.ToString(), _i).Enabled = false; //单据体行锁定字段
                        grid.SetForecolor("FT" + "" + getDay.Days.ToString() + "", "#00FFFF", _i);
                    }
                }
                _i++;
            }
        }
        private bool isSearched = true;
        /// <summary>
        /// 值更新事件
        /// </summary>
        /// <param name="e"></param>
        public override void DataChanged(DataChangedEventArgs e)
        {
            try
            {
                if (!isSearched) return;
                base.DataChanged(e);
                var columns = new List<string>() { "", "" };
                for (int i = 0; i < 100; i++)
                {
                    columns.Add("FT" + i.ToString());
                }
                var model = this.View.Model;
                if (columns.Contains(e.Field.Key))
                {
                    //if (Convert.ToDouble(model.GetValue(e.Field.Key, e.Row)) == 0)
                    //{
                    //    this.View.ShowErrMessage("日计划数量需大于0");
                    //    //this.View.Model.SetValue("FT0", 100, e.Row);//返回值
                    //    return;
                    //}
                    var sum = columns.Select(x => Convert.ToDouble(model.GetValue(x, e.Row))).Sum();//日计划总和
                    var scOrderCount = Convert.ToDouble(model.GetValue("FSCOrderCountZD", e.Row));//生产订单数量
                    var FQTYLS = Convert.ToDouble(model.GetValue("FQTYLS", e.Row));//历史
                    this.View.Model.SetValue("FNoScheduledCount", scOrderCount - sum - FQTYLS, e.Row);//待排数
                    this.View.Model.SetValue("FSumQty", sum, e.Row);//日计划总数
                    string sql = $"update Sc_WorkBillSortBillSub set FIsSGXG =1 where FID ={model.GetValue("FIDZD", e.Row)} AND DATEDIFF(D,GETDATE(),FHMasterDate) = '{e.Field.Key.Substring(2)}'";
                    DBServiceHelper.Execute(Context, sql);
                }
                //分配数量
                if (e.Field.Key == "FAllocatedCount")
                {
                    var scOrderNo = model.GetValue("FProOrderNo", e.Row).ToString();
                    var scOrderFentrySeqNo = model.GetValue("FSRCBILLENTRYSEQ", e.Row).ToString();
                    var scOrderCount = Convert.ToDouble(model.GetValue("FSCOrderCount", e.Row));
                    Entity entity = this.View.BillBusinessInfo.GetEntity("FDprwEntity");
                    //单据体信息转换为列表集合
                    DynamicObjectCollection entityDataObjoct = this.View.Model.GetEntityDataObject(entity);
                    var groups = entityDataObjoct.Where(x => Convert.ToString(x["FProOrderNo"]) == scOrderNo && Convert.ToString(x["FSRCBILLENTRYSEQ"]) == scOrderFentrySeqNo);//生产资源分组(计算优先级)
                    double allocatedCount = 0;
                    foreach (var group in groups)
                    {
                        allocatedCount += Convert.ToDouble(group["FAllocatedCount"]);
                    }
                    if (allocatedCount > scOrderCount)
                    {
                        this.View.ShowErrMessage("序号:" + model.GetValue("FSEQ", e.Row).ToString() + ",订单号:" + scOrderNo + ",行号:" + scOrderFentrySeqNo + " 分配总数超出生产订单数。");
                    }
                }
            }
            catch (Exception ex)
            {
                this.View.ShowErrMessage(ex.Message);
            }
        }
        /// <summary>
        /// 页面初始化 渲染界面 将T0-T60更改为日期显示
        /// </summary>
        /// <param name="e"></param>
        public override void OnInitialize(InitializeEventArgs e)
        {
            base.OnInitialize(e);
            DateTime DateNow = DateTime.Now;
            for (int m = 0; m <= 60; m++)
            {
                this.View.GetControl("FT" + "" + m + "").ControlAppearance.TextColor = "#FFFF00";
                this.View.GetControl("FT" + "" + m + "").Text = DateNow.AddDays(m).ToShortDateString();
            }
            this.View.SendDynamicFormAction(View);
        }
        /// <summary>
        /// 初始加载事件
        /// </summary>
        /// <param name="e"></param>
        public override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            SearchList();
        }
        /// <summary>
        /// 页面按钮点击事件
        /// </summary>
        /// <param name="e"></param>
        public override void ButtonClick(ButtonClickEventArgs e)
        {
            base.ButtonClick(e);
            try
            {
                //选择
                if (e.Key.ToUpper().Equals("FCHOICEBUTTONSC"))
                {
                    ShowFDprwEntity();
                }
                //待排任务 查询
                if (e.Key.ToUpper().Equals("FSEARCHBUTTON"))
                {
                    string FDepartId = (this.Model.GetValue("FDpDepartment") as DynamicObject)?["Id"].ToString();
                    string FDate = Convert.ToString(this.Model.GetValue("FNewPzDate"));
                    isSearched = false;
                    DprwSearcrList(FDepartId, FDate);
                    isSearched = true;
                }
                //生产订单 查询
                if (e.Key.ToUpper().Equals("FSEARCHBUTTONSC"))
                {
                    string FMaterialId = (this.Model.GetValue("FMATERIALIDCX") as DynamicObject)?["Id"].ToString();
                    string FProOrderNo = Convert.ToString(this.Model.GetValue("FOrderNoCX"));
                    isSearched = false;
                    ScddSearchList(FMaterialId, FProOrderNo);
                    isSearched = true;
                }
            }
            catch (Exception ex)
            {
                //LogHelper.Error("生产排程单动态表单-Button按钮点击事件 抛出异常:" + ex.Message.ToString());
                this.View.ShowErrMessage(ex.Message.ToString());
            }
        }
        /// <summary>
        /// 页面按钮工具栏事件
        /// </summary>
        /// <param name="e"></param>
        public override void BarItemClick(BarItemClickEventArgs e)
        {
            base.BarItemClick(e);
            try
            {
                //排程
                if (e.BarItemKey.ToUpper().Equals("TBPC"))
                {
                    ProductSchedul();
                }
                //保存
                if (e.BarItemKey.ToUpper().Equals("TBSAVE"))
                {
                    ZdpcSave();
                }
                //刷新
                if (e.BarItemKey.ToUpper().Equals("TBREFASH"))
                {
                    isSearched = false;
                    SearchList();
                    isSearched = true;
                }
            }
            catch (Exception ex)
            {
                //LogHelper.Error("生产排程单动态表单-BarItem按钮点击事件 抛出异常:" + ex.Message.ToString());
                this.View.ShowErrMessage(ex.Message.ToString());
            }
        }
        /// <summary>
        /// 窗体页面加载 及 查询
        /// </summary>
        public void SearchList()
        {
            isSearched = false;
            DprwSearcrList("", "");
            ScddSearchList("", "");
            isSearched = true;
        }
        /// <summary>
        /// 界面上方“待排任务”的页签
        /// </summary>
        /// <param name="FDepartId"></param>
        /// <param name="FDate"></param>
        public void DprwSearcrList(string FDepartId, string FDate)
        {
            try
            {
                string sqlWhere = " where 1=1 ";
                if (!string.IsNullOrEmpty(FDepartId))
                    sqlWhere += $" and FHMATERID ={FDepartId}";
                if (!string.IsNullOrEmpty(FDate))
                    sqlWhere += $" and dadediff(d,FDate,) =0 ";
                //待排任务 初始化加载 where FNoScheduled > 0 未排产数量大于0
                string sql = @"select *  ,isnull((select SUM(isnull(FHQTY,0)) from SC_WORKBILLSORTBILLSub t2 where t2.FID = t1.FID and DATEDIFF(D,FHMASTERDATE,GETDATE())>0),0)FQTYLS from Sc_WorkBillSortBillMain t1";
                DataTable dt = DBServiceHelper.ExecuteDataSet(this.Context, sql).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    while (this.Model.GetEntryRowCount("FDprwEntity") > 0)
                    {
                        this.Model.DeleteEntryRow("FDprwEntity", 0);
                    }
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        this.Model.CreateNewEntryRow("FDprwEntity");
                        this.Model.SetValue("FSczy", dt.Rows[i]["FHSourceID"], i);//生产资源  
                        this.Model.SetValue("FProOrderNo", dt.Rows[i]["FSCOrderNo"], i);//生产订单号  
                        this.Model.SetValue("FSRCBILLENTRYSEQ", dt.Rows[i]["FSRCBILLENTRYSEQ"], i);//生产订单明细行号  
                        this.Model.SetValue("FMATERIALID", dt.Rows[i]["FHMaterID"], i);//物料代码  
                        this.Model.SetValue("FSCOrderCount", dt.Rows[i]["FOrderQuantity"], i);//生产订单数  
                        //this.Model.SetValue("FFinishConut", dt.Rows[i]["FNOTE"], i);//完工数 (没有对应字段)
                        this.Model.SetValue("FStoredCount", dt.Rows[i]["FHInstockQty"], i);//已入库数  
                        this.Model.SetValue("FPriority", dt.Rows[i]["FHYX"], i);//优先级  
                        this.Model.SetValue("FCapacity", dt.Rows[i]["FHWorkQty"], i);//产能  
                        this.Model.SetValue("FPlanBeginDate", dt.Rows[i]["FHPlanBeginDate"], i);//计划开始日期  
                        this.Model.SetValue("FPlanEndDate", dt.Rows[i]["FHPlanEndDate"], i);//计划完工日期  
                        this.Model.SetValue("FSalOrderCount", dt.Rows[i]["FHOrderQty"], i);//销售订单数量  
                        //this.Model.SetValue("FCustormer", dt.Rows[i]["FNOTE"], i);//客户 (没有对应字段) 
                        this.Model.SetValue("FSalOrderNo", dt.Rows[i]["FHSeOrderBillNo"], i);//销售订单号  
                        //this.Model.SetValue("FSalDeliveryDate", dt.Rows[i]["FNOTE"], i);//销售订单交货期  (没有对应字段)
                        //this.Model.SetValue("FOrderRemake", dt.Rows[i]["FNOTE"], i);//订单备注  (没有对应字段)
                        this.Model.SetValue("FID", dt.Rows[i]["FID"], i);//日计划工单ID  
                    }
                }
 
                //自动排程 初始化加载  where FNoScheduled > 0 未排产数量大于0
                if (dt.Rows.Count > 0)
                {
                    while (this.Model.GetEntryRowCount("FZdpcEntity") > 0)
                    {
                        this.Model.DeleteEntryRow("FZdpcEntity", 0);
                    }
                    DateTime DateNow = DateTime.Now;//获取当前日期
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        this.Model.CreateNewEntryRow("FZdpcEntity");
                        this.Model.SetValue("FSczyZD", dt.Rows[i]["FHSourceID"], i);//生产资源  
                        this.Model.SetValue("FProOrderNoZD", dt.Rows[i]["FSCOrderNo"], i);//生产订单号  
                        this.Model.SetValue("FSRCBILLENTRYSEQZD", dt.Rows[i]["FSRCBILLENTRYSEQ"], i);//生产订单明细行号  
                        this.Model.SetValue("FMATERIALIDZD", dt.Rows[i]["FHMaterID"], i);//物料代码  
                        this.Model.SetValue("FSCOrderCountZD", dt.Rows[i]["FOrderQuantity"], i);//生产订单数  
                        //this.Model.SetValue("FFinishConutZD", dt.Rows[i]["FNOTE"], i);//完工数 (没有对应字段)
                        this.Model.SetValue("FQTYLS", dt.Rows[i]["FQTYLS"].ToString(), i);//历史遗留
                        this.Model.SetValue("FNoScheduledCount", Convert.ToDecimal(dt.Rows[i]["FOrderQuantity"]) - Convert.ToDecimal(dt.Rows[i]["FDayPlanQuantity"]), i);//待排数  
                        this.Model.SetValue("FSumQty", Convert.ToDecimal(dt.Rows[i]["FDAYPLANQUANTITY"]) - Convert.ToDecimal(dt.Rows[i]["FQTYLS"]), i);// 
                        this.Model.SetValue("FPriorityZD", dt.Rows[i]["FHYX"], i);//优先级  
                        this.Model.SetValue("FCapacityZD", dt.Rows[i]["FHWorkQty"], i);//产能  
                        this.Model.SetValue("FIDZD", dt.Rows[i]["FID"], i);//日计划工单ID  
                        sql = @"/*dialect*/SELECT * FROM Sc_WorkBillSortBillSub WHERE DATEDIFF(D,GETDATE(),FHMASTERDATE)>=0 and FID=" + dt.Rows[i]["FID"].ToString();
                        DataTable _dt = DBServiceHelper.ExecuteDataSet(Context, sql).Tables[0];
                        foreach (DataRow dr in _dt.Rows)
                        {
                            DateTime start = Convert.ToDateTime(DateNow.ToShortDateString());
                            DateTime end = Convert.ToDateTime(Convert.ToDateTime(dr["FHMASTERDATE"]).ToShortDateString());
                            TimeSpan getDay = end.Subtract(start);
                            if (getDay.Days > 60)
                                continue;
                            this.Model.SetValue("FT" + getDay.Days.ToString(), dr["FHQTY"].ToString(), i);//日计划工单FID
                            if (dr["FHLockedSub"].ToString() == "1")
                                this.View.GetFieldEditor("FT" + getDay.Days.ToString(), i).Enabled = false; //单据体行锁定字段
                        }
                    }
                    //for (int m = 0; m <= 60; m++)
                    //{
                    //    this.View.GetControl("FT" + "" + m + "").Text = DateNow.AddDays(m).ToShortDateString();
                    //}
                    ChangeColorZDPC();
 
                }
            }
            catch (Exception ex)
            {
                //LogHelper.Error("生产排程单动态表单-页面展示 待排任务抛出异常:" + ex.Message.ToString());
                this.View.ShowErrMessage("错误:" + ex.Message.ToString());
            }
        }
        /// <summary>
        /// 界面下方“生产订单”的页签
        /// </summary>
        /// <param name="FMaterialId">物料</param>
        /// <param name="FProOrderNo">生产订单号</param>
        public void ScddSearchList(string FMaterialId, string FProOrderNo)
        {
            try
            {
                string sqlWhere = " and 1=1 ";
                if (!string.IsNullOrEmpty(FMaterialId))
                    sqlWhere += $" and b.FMATERIALID ='{FMaterialId}'";
                if (!string.IsNullOrEmpty(FProOrderNo))
                    sqlWhere += $" and a.FBILLNO like '%{FProOrderNo}%' ";
 
                //界面下方“生产订单”的页签,加载未排程已审核的生产订单 (测试未加条件 更改后去除该标记)
                string sql = @"
SELECT A.FBILLNO,B.FSEQ,B.FMATERIALID,B.FQTY,B.FPlanStartDate,b.FPlanFinishDate,b.FSaleOrderNo,c.FCustId,d.FQTY as FQTYXSDD ,d.FNOTE,d.FPLANDELIVERYDATE,e.FSCOrderNo
FROM T_PRD_MO a
LEFT JOIN T_PRD_MOENTRY b on a.FID = B.FID
left join T_SAL_ORDER c on b.FSaleOrderNo =c.FBILLNO
left join T_SAL_ORDERENTRY d on c.FID = d.FID and b.FMATERIALID = d.FMATERIALID
left join Sc_WorkBillSortBillMain e on b.FMATERIALID = e.FHMaterID and b.FSEQ = e.FSRCBILLENTRYSEQ and a.FBILLNO = e.FSCOrderNo
where ISNULL(e.FSCOrderNo,'')=''";
                sql += sqlWhere;
                DataTable dt = DBServiceHelper.ExecuteDataSet(this.Context, sql).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    //this.Model.DeleteEntryData("FScddEntity");
                    while (this.Model.GetEntryRowCount("FScddEntity") > 0)
                    {
                        this.Model.DeleteEntryRow("FScddEntity", 0);
                    }
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        this.Model.CreateNewEntryRow("FScddEntity");
                        this.Model.SetValue("FSEQ", i + 1, i);//序号
                        this.Model.SetValue("FProOrderNoSC", dt.Rows[i]["FBILLNO"], i);//生产订单号  
                        this.Model.SetValue("FSRCBILLENTRYSEQSC", dt.Rows[i]["FSEQ"], i);//生产订单明细号  
                        this.Model.SetValue("FSCOrderCountSC", dt.Rows[i]["FQTY"], i);//生产订单数
                        this.Model.SetValue("FPlanBeginDateSC", dt.Rows[i]["FPlanStartDate"], i);//计划开工日期
                        this.Model.SetValue("FPlanEndDateSC", dt.Rows[i]["FPlanFinishDate"], i);//计划完工日期  
                        this.Model.SetValue("FSalOrderNoSC", dt.Rows[i]["FSaleOrderNo"], i);//销售订单号  
                        this.Model.SetValue("FMATERIALIDSC", dt.Rows[i]["FMATERIALID"], i);//物料  
                        this.Model.SetValue("FCustormerSC", dt.Rows[i]["FCustId"], i);//客户  
                        this.Model.SetValue("FSalOrderCountSC", dt.Rows[i]["FQTYXSDD"], i);//销售订单数量  
                        this.Model.SetValue("FSalDeliveryDateSC", dt.Rows[i]["FPLANDELIVERYDATE"], i);//销售订单交货期
                        this.Model.SetValue("FOrderRemakeSC", dt.Rows[i]["FNOTE"], i);//订单备注  
                    }
                }
            }
            catch (Exception ex)
            {
                //LogHelper.Error("生产排程单动态表单-页面展示 生产订单抛出异常:" + 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 = @"/*dialect*/ 
select FCalUserId,FCalUserType,FShiftId,FIsWorkTime,FDay,FDateStyle,c.FALLHOURS ,c.FALLHOURS FALLHOURSCONST,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'
and DATEDIFF(D,getdate(),FDAY)>0
and   convert(nvarchar(20),FCalUserId)+convert(nvarchar(20),FDay,23) not in 
(
 select DISTINCT convert(nvarchar(20),FHSourceID)+convert(nvarchar(20),FHMasterDate,23) from Sc_WorkBillSortBillMain a
join Sc_WorkBillSortBillSub b on a.FID =B.FID 
WHERE FIsSGXG =1
)
--去除手动修改过的日期
--条件为 工作日+是否生产 == 1 ";
            ENG_WORKCALFULLDATA = DBServiceHelper.ExecuteDataSet(Context, _sql).ToModelList<ENG_WORKCALFULLDATA>();
 
            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;
                string fMaterialID = ""; //记录循环时的产品 用于产品换线时判断(同一个产线时的计算)
                foreach (var order in orders)
                {
                    List<ENG_WORKCALFULLDATA> _ENG_WORKCALFULLDATA = ENG_WORKCALFULLDATA.Where(x => x.FALLHOURS > 0 && x.FCalUserId == Convert.ToInt32(order["FSczy_Id"])).ToList();
                    //产品发生变幻时扣除相应的换线时间
                    if (fMaterialID == "")
                    {
                        fMaterialID = order["FMATERIALID_Id"].ToString();
                    }
                    decimal FChangeLine = Convert.ToDecimal((order["FSczy"] as DynamicObject)?["FChangeLine"]);//换线时间
                    if (fMaterialID != order["FMATERIALID_Id"].ToString())
                    {
                        foreach (var item in _ENG_WORKCALFULLDATA)
                        {
                            if (FChangeLine < item.FALLHOURS)
                            {
                                //改变list中某个元素值
                                var model = ENG_WORKCALFULLDATA.Where(c => c.FENTRYID == item.FENTRYID).FirstOrDefault();
                                //model.FALLHOURS -= Math.Ceiling(fqty / FCapacity);
                                model.FALLHOURS -= FChangeLine; // 生产数 / 小时产能 = 消耗的小时 (数值类型为decimal)
                            }
                            else
                            {
                                var model = ENG_WORKCALFULLDATA.Where(c => c.FENTRYID == item.FENTRYID).FirstOrDefault();
                                model.FALLHOURS = 0;
                            }
                        }
                        fMaterialID = order["FMATERIALID_Id"].ToString();
                    }
                    //计算产能
                    decimal FCapacity = Convert.ToDecimal(order["FCapacity"]);//小时产能
                    decimal FSCOrderCount = Convert.ToDecimal(order["FSCOrderCount"]);//生产订单
                    var _FID = order["FID"]?.ToString();
                    string cnSql = "";
                    cnSql = $"select sum(FHQty) from Sc_WorkBillSortBillSub where FID = {_FID} and FIsSGXG =1";
                    decimal fDayPlanQuality = DBServiceHelper.ExecuteScalar<decimal>(Context, cnSql, 0);
                    cnSql = $"delete Sc_WorkBillSortBillSub where FID = {_FID} and FIsSGXG <>1";
                    DBServiceHelper.Execute(Context, cnSql);
                    FSCOrderCount = FSCOrderCount - fDayPlanQuality;
                    List<ENG_WORKCALFULLDATA> finalyResult = new List<ENG_WORKCALFULLDATA>();
                    decimal dayFCapacity = 0;//当日剩余产量 = 小时产能 * 日剩余工作时长
                    _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);
                            model.FALLHOURS -= fqty / FCapacity; // 生产数 / 小时产能 = 消耗的小时 (数值类型为decimal)
                        }
                        else
                        {
                            var model = ENG_WORKCALFULLDATA.Where(c => c.FENTRYID == item.FENTRYID).FirstOrDefault();
                            model.FALLHOURS = 0;
                        }
                        FSCOrderCount = FSCOrderCount - fqty;
                    }
                    //根据生产订单号和物料查询是否存在明细 +生产订单明细行号
                    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("FHPlanBeginDate", Convert.ToString(order["FPlanBeginDate"]));//计划开始日期
                    jsonModel.Add("FHPlanEndDate", Convert.ToString(order["FPlanEndDate"]));//计划完工日期
                    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", seq++); ;//优先级
                    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());
            }
        }
        /// <summary>
        /// 自动排程保存功能
        /// </summary>
        public void ZdpcSave()
        {
            List<string> sqlList = new List<string>();
            string sql;
            //获取单据体信息
            Entity entity = this.View.BillBusinessInfo.GetEntity("FZdpcEntity");
            //单据体信息转换为列表集合
            DynamicObjectCollection entityDataObjoct = this.View.Model.GetEntityDataObject(entity);
            DateTime date = Convert.ToDateTime(DateTime.Now.ToString("d"));
            string _result = "";
            foreach (DynamicObject current in entityDataObjoct)
            {
                if (Convert.ToInt32(current["FNoScheduledCount"]) < 0)
                    _result += "序号:" + Convert.ToString(current["SEQ"]) + ",日计划总数量超出生产订单数量";
            }
            if (_result != "")
            {
                this.View.ShowErrMessage(_result);
                return;
            }
            //var groups = entityDataObjoct.GroupBy(x => new {x});//生产资源分组(计算优先级)
            //var groups = entityDataObjoct.GroupBy(x => x["FSczy_Id"]);//生产资源分组(计算优先级)
            foreach (DynamicObject current in entityDataObjoct)
            {
                JObject jsonRoot = new JObject();
                jsonRoot.Add("Creator", "");
                jsonRoot.Add("NeedUpDateFields", new JArray());
                jsonRoot.Add("NeedReturnFields", new JArray());
                jsonRoot.Add("IsDeleteEntry", "false");
                jsonRoot.Add("SubSystemId", "");
                jsonRoot.Add("IsVerifyBaseDataField", "");
                JObject jsonModel = new JObject();
                jsonModel.Add("FID", Convert.ToString(current["FIDZD"]));
                //jsonModel.Add("FOrderQuantity", Convert.ToString(current["FOrderQuantity"]));
                //jsonModel.Add("FDayPlanQuantity", Convert.ToString(current["FDayPlanQuantity"]));
                //jsonModel.Add("FNoScheduled", Convert.ToString(current["FNoScheduled"]));
                sql = $" /*dialect*/ select FEntryID, FHMASTERDATE from SC_WORKBILLSORTBILLSub  where FID={Convert.ToString(current["FIDZD"])} ";
                List<DayPlanModel> dayPlanModel = new List<DayPlanModel>();
                dayPlanModel = DBServiceHelper.ExecuteDataSet(Context, sql).ToModelList<DayPlanModel>();
                JArray Entry = new JArray();
                for (int i = 0; i <= 60; i++)
                {
                    if (Convert.ToString(current["FT" + "" + i + ""]) == "" || Convert.ToString(current["FT" + "" + i + ""]) == "0")
                        continue;
                    JObject jsonFPOOrderEntry = new JObject();
                    jsonFPOOrderEntry.Add("FHMasterDate", date.AddDays(i).ToShortDateString()); ;//主日期
                    jsonFPOOrderEntry.Add("FHQty ", Convert.ToString(current["FT" + "" + i + ""])); ;//日计划数量
                    List<DayPlanModel> _dayPlanModel = dayPlanModel.Where(x => x.FHMASTERDATE == date.AddDays(i)).ToList();
                    if (_dayPlanModel.Count > 0)
                    {
                        jsonFPOOrderEntry.Add("FEntryID", _dayPlanModel.FirstOrDefault().FEntryID); ;//序号
                    }
                    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.ShowMessage(saveObj["Result"]["ResponseStatus"]["Errors"][0]["Message"].ToString());
                }
            }
 
            this.View.ShowMessage("操作成功");
        }
 
    }
}