22
zongzhibin
2024-11-24 5ff68c7d3a3ced4a9e1fbce1d739b545c0f28196
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
using iWareCC.Common.Helper;
using iWareCommon.Common.Globle;
using iWareCommon.Utils;
using iWareModel;
using iWareSql;
using iWareSql.DataAccess;
using iWareSql.DBModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using XiGang.Core.Model;
 
namespace iWareCC
{
    /// <summary>
    /// 任务分解线程
    /// </summary>
    public static class MainTaskDecompose
    {
        /// <summary>
        /// 任务分解线程
        /// </summary>
        public static void HandlerMainTaskDecompose()
        {
            while (true)
            {
                try
                {
                    SystemWarningMsg._lbl_Alert_MainTaskDecompose = "";
                    if (SystemValue.isAllowRuning_MainTaskDecompose && SystemValue.isStartedModel)
                    {
                        using (DbModel context = new DbModel())
                        {
                            //查询状态=下发中的出库计划
                            //注意:原则是优先执行出库任务
 
                            var queryState2 = (int)MainTaskStatusEnum.待出库;
 
                            //var mainList = context.Task_Main.Where(x => x.TaskState == queryState1 || x.TaskState == queryState2).OrderBy(x => x.TaskSequence).ToList();//按照顺序号升序排列
                            //if (mainList != null && mainList.Count > 0)
                            //{//每次只处理一个
                            //    Do_HandlerMainTaskDecompose(mainList, context);
                            //}
                            //else
                            //{
                            //    SystemWarningMsg._lbl_Alert_MainTaskDecompose = "没有要分解的任务";
                            //}
 
                            var isAllowDecomposeOutTask = true;//是否允许分解出库任务
                            //按照先 出库优先,再入库的原则来
                            var mainList = context.Task_Main.Where(x => x.TaskState == queryState2).OrderBy(x => x.TaskSequence).ThenBy(x => x.CreateTime).ToList();//按照顺序号升序排列
                            if (mainList != null && mainList.Count > 0)
                            {//每次只处理一个
                                //验证 如果连续出库任务分解了两次,并且1012
                                var errMsg = "";
                                if (!MyExtendHelper.IsNoFinishedOutTaskGroupbyArea(context, ref errMsg))
                                {
                                    SystemWarningMsg._lbl_Alert_MainTaskDecompose += "不允许分解出库任务:" + errMsg + SysGloble.SPLIT_STR;
                                    isAllowDecomposeOutTask = false;
                                }
                                //var _list = MyExtendHelper.GetHasCatogryStationCodeAreaList();
                                Dictionary<string, int> dict_hasNoFinishedOutStoreTaskStationCodeAreaList = new Dictionary<string, int>();
                                var _list = MyExtendHelper.GetHasCatogryAndNoFinishedOutStoreTaskStationCodeAreaList(context, ref dict_hasNoFinishedOutStoreTaskStationCodeAreaList);
                                if (_list != null && _list.Count >= 2)
                                {
                                    SystemWarningMsg._lbl_Alert_MainTaskDecompose += "不允许分解出库任务:四个出库口目前有" + _list.Count + "个被占用了,超过了设定值:" + 2 + SysGloble.SPLIT_STR;
                                    isAllowDecomposeOutTask = false;
                                }
                                if (isAllowDecomposeOutTask)
                                {
                                    Do_HandlerMainTaskDecomposeForOut(mainList, context);
                                }
                            }
                            else
                            {//当前没有要出库的主任务,或者是 1012长时间被托盘占用的情况下 才允许分解组盘入库任务
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    SystemWarningMsg._lbl_Alert_MainTaskDecompose += "分解线程出现异常:" + ex.Message + SysGloble.SPLIT_STR;
                    Log4NetHelper.WriteErrorLog(LogType.CCWCFService, "HandlerIssuingTask出现异常:" + ex.Message, ex);
                }
                Thread.Sleep(2000);//休眠2秒
            }
        }
 
 
 
        private static void Do_HandlerMainTaskDecomposeForOut(List<Task_Main> mainList, DbModel context)
        {
            if (mainList != null && mainList.Count > 0)
            {//出库任务,严格按照 出库计划的顺序来执行。不能调个。
                //取前2台要出库的发动机,必须只能是处理2个,否则会出现顺序不对的情况
                var _mainList = mainList.OrderBy(x => x.TaskSequence).ThenBy(x => x.CreateTime).ToList().Take(2);
                List<string> areaList = new List<string>();
                List<Task_Main> doMainList = new List<Task_Main>();
                foreach (var item in _mainList)
                {
                    if (string.IsNullOrEmpty(item.Area))
                    {
                        throw new Exception("出库任务" + item.TaskNo + "的区域为空!");
                    }
                    if (areaList.Count >= 2)
                    {
                        break;
                    }
                    if (!areaList.Contains(item.Area))
                    {
                        areaList.Add(item.Area);
                        doMainList.Add(item);
                    }
                }
                //获取要处理的这些任务
                foreach (var doMain in doMainList)
                {
                    FunRetEntity result = null;
 
                    result = SingleHandlerForOutTask(context, doMain);
 
                    if (result.result) context.SaveChanges();
                    SystemWarningMsg._lbl_Alert_MainTaskDecompose = result.resMsg + SysGloble.SPLIT_STR;
                }
            }
            else
            {
                SystemWarningMsg._lbl_Alert_MainTaskDecompose += "没有要分解的任务" + SysGloble.SPLIT_STR;
            }
        }
 
        private static FunRetEntity SingleHandlerForOutTask(DbModel context, Task_Main mainTask)
        {
            try
            {
                //再次判断主任务是否已经被分解
                var aa = context.Task_Main.Where(x => x.Id == mainTask.Id).First();
                if (aa.TaskState != (int)MainTaskStatusEnum.待出库)
                {
                    return FunRetEntity.Fail("主任务不是待出库状态");
                }
 
                var toPlace = StationHandler.GetPlaceByPlaceId((int)mainTask.ToPlace, context);
                var sourcePlace = StationHandler.GetPlaceByPlaceId((int)mainTask.SourcePlace, context);
                var salver = SalverHandler.GetSalveById(context, mainTask.SalverId);
 
                //中间点
                var midPlace = StationHandler.GetRgvPlaceBySrmPlaceForOutStore(context, sourcePlace);
                if (midPlace == null)
                {
                    return FunRetEntity.Fail("没有找到RGV出库位置");
                }
 
                //去掉这个验证 【EditBy shaocx,2022-05-19】
                //判断rgv站点是否有光电占用 [EditBy shaocx,2022-04-29]
                /*
                var isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattion(midPlace.RgvStationCode);
                if (isGD_HasCatogryForRgvStattion)
                {
                    return FunRetEntity.Fail("RGV出库口站点" + midPlace.RgvStationCode + "上面光电显示有货,不允许创建堆垛机出库任务");
                }
                //*/
 
                //增加验证同一个目标点,是否存在未结束的任务,如果有,则不允许了 【EditBy shaocx,2022-04-29】
                //同一个堆垛机的前面未结束的任务,且同种类型
                var queryTaskState1 = (int)DeviceTaskStatusEnum.未开始;
                var queryTaskState2 = (int)DeviceTaskStatusEnum.已下发;
                var otherSrmTask = context.Task_Part.Where(x => x.ToPlace == midPlace.Id
                    && x.DeviceType == (int)EDeviceType.堆垛机
                     && (x.TaskState == queryTaskState1 || x.TaskState == queryTaskState2)
                     ).FirstOrDefault();
                if (otherSrmTask != null)
                {
                    return FunRetEntity.Fail("上一个堆垛机任务未完成,不允许创建堆垛机出库任务,上一个堆垛机任务号:" + otherSrmTask.PlcTaskId);
                }
 
                var plcTaskNo = BusinessHelper.CreatePlcTaskIdForSrmTask();
                var createTime = DateTime.Now;
                //创建堆垛机任务
                FunRetEntity fre = PartTaskHandler.CreatePartTask(createTime, plcTaskNo, context, EDeviceType.堆垛机, mainTask.CreateBy, 1, DeviceTaskTypeEnum.出库, mainTask, salver, sourcePlace, midPlace, mainTask.OperationRemark);
                if (fre.result == false)
                {
                    return fre;
                }
                //创建RGV任务
                fre = PartTaskHandler.CreatePartTask(createTime, plcTaskNo, context, EDeviceType.RGV, mainTask.CreateBy, 2, DeviceTaskTypeEnum.出库, mainTask, salver, midPlace, toPlace, mainTask.OperationRemark);
                if (fre.result == false)
                {
                    return fre;
                }
 
                //更新主表的任务状态
                var _changeTaskState = MainTaskStatusEnum.出库任务已分解;
                mainTask.TaskState = (int)_changeTaskState;
                mainTask.TaskStateName = _changeTaskState.ToString();
 
 
                return FunRetEntity.Success("成功新建出库设备任务");
            }
            catch (Exception ex)
            {
                return FunRetEntity.Fail("新增出库设备任务异常:" + ex.Message);
            }
 
        }
    }
}