kazelee
1 天以前 f8d23dcf8d6501482db1a5180325194232afe96c
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
using HH.WCS.Mobox3.DSZSH.models;
using HH.WCS.Mobox3.DSZSH.util;
using HH.WCS.Mobox3.DSZSH;
 
using Newtonsoft.Json;
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace HH.WCS.Mobox3.DSZSH.wms {
    internal class WCSHelper {
        internal static string GenerateTaskNo() {
            var id = SYSHelper.GetSerialNumber("任务号", "TN");
            var date = DateTime.Now.ToString("yyMMdd");
            return $"TN{date}{id.ToString().PadLeft(4, '0')}";
        }
        internal static bool UpdateStatus(TN_Task task, string status) {
            var res = false;
            var db = new SqlHelper<TN_Task>().GetInstance();
            task.S_B_STATE = status;
            res = db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand() > 0;
            return res;
        }
        internal static bool UpdateStatus(TN_Task task) {
            var res = false;
            var db = new SqlHelper<TN_Task>().GetInstance();
            task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE);
            task.T_MODIFY = DateTime.Now;
            res = db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_MODIFY }).ExecuteCommand() > 0;
            return res;
        }
        internal static bool UpdateEQNo(TN_Task task) {
            var res = false;
            var db = new SqlHelper<TN_Task>().GetInstance();
            task.T_MODIFY = DateTime.Now;
            db.Updateable(task).UpdateColumns(it => new { it.S_EQ_TASK_CODE, it.T_MODIFY }).ExecuteCommand();
            return res;
        }
 
        internal static TN_Task GetTask(string no) {
            var db = new SqlHelper<TN_Task>().GetInstance();
            var task = db.Queryable<TN_Task>().Where(a => a.S_CODE == no).First();
            return task;
        }
 
        public static string GetAgvSite(string locCode) {
            var db = new SqlHelper<object>().GetInstance();
            var loc = db.Queryable<TN_Location>().Where(l => l.S_CODE == locCode).First();
            return loc == null ? "0" : loc.S_AGV_SITE;
        }
 
        /// <summary>
        /// ![[弃用|理由:不灵活,涉及业务过于具体]]检查容器类型是否正确
        /// </summary>
        /// <param name="cntrCode"></param>
        /// <param name="cntrType"></param>
        /// <param name="errMsg"></param>
        /// <returns></returns>
        private static bool CheckCntrType(string cntrCode, string cntrType, out string errMsg) {
            var db = new SqlHelper<object>().GetInstance();
            errMsg = string.Empty;
 
            var cntr = db.Queryable<TN_Container>().Where(c => c.S_CODE == cntrType).First();
            if (cntr == null) {
                errMsg = $"容器'{cntrCode}'在[容器表]中不存在,请在前台页面中维护!";
                return false;
            }
            if (cntr.S_TYPE != cntrType) {
                errMsg = $"容器'{cntrCode}'在[容器表]中的类型是'{cntr.S_TYPE},不是'{cntrType}'!";
                return false;
            }
 
            return true;
        }
 
        /// <summary>
        /// 根据容器号,查询当前容器关联的[货位/容器/物料]信息(只查询1条)
        /// </summary>
        /// <param name="cntrCode">容器号</param>
        /// <param name="skipCgDetail">是否跳过[物料表]的查询(当容器号来自[物料表]时)</param>
        /// <returns></returns>
        public static LocCntrCg GetLocCntrCg(string cntrCode, bool skipCgDetail = false) {
            var db = new SqlHelper<object>().GetInstance();
 
            TN_CG_Detail cgDetail = null;
            if (!skipCgDetail) {
                cgDetail = db.Queryable<TN_CG_Detail>().Where(d => d.S_CNTR_CODE == cntrCode).First();
            }
 
            var locCntrRel = db.Queryable<TN_Loc_Container>().Where(c => c.S_CNTR_CODE == cntrCode).First();
 
            TN_Location location = null;
            if (locCntrRel != null) {
                location = db.Queryable<TN_Location>().Where(l => l.S_CODE == locCntrRel.S_LOC_CODE).First();
                if (location == null) {
                    LogHelper.Warn($"");
                }
            }
            if (location != null) {
                location.N_CURRENT_NUM = 0;
                location.T_MODIFY = DateTime.Now;
            }
 
            return new LocCntrCg {
                CgDetail = cgDetail,
                LocCntrRel = locCntrRel,
                Location = location
            };
        }
 
        /// <summary>
        /// 绑定[货位-容器]信息
        /// </summary>
        /// <param name="startLoc"></param>
        /// <param name="cntrCode"></param>
        /// <returns></returns>
        public static TN_Loc_Container BindLocCntr(ref TN_Location startLoc, string cntrCode) {
            var locCntrRel = new TN_Loc_Container {
                S_LOC_CODE = startLoc.S_CODE,
                S_CNTR_CODE = cntrCode,
            };
 
            startLoc.N_CURRENT_NUM = 1;
            startLoc.T_MODIFY = DateTime.Now;
 
            return locCntrRel;
        }
 
        /// <summary>
        /// 起点出库锁
        /// </summary>
        /// <param name="loc"></param>
        /// <param name="lockSource"></param>
        public static void LockStartLoc(ref TN_Location loc, string lockSource = "") {
            if (loc == null) {
                throw new ArgumentNullException(); // 接受货位loc为空时直接抛异常(通常不会发生)
            }
 
            if (loc.N_LOCK_STATE != 0 || loc.S_LOCK_STATE != "无") {
                LogHelper.Warn($"起点出库锁:程序正在尝试给当前[锁状态]不是'无'的货位上锁!货位='{loc.S_CODE}',锁状态=({loc.N_LOCK_STATE},{loc.S_LOCK_STATE})");
            }
 
            loc.N_LOCK_STATE = 2; // 起点出库锁
            loc.S_LOCK_STATE = TN_Location.GetLockStateStr(2); // 起点出库锁
            loc.S_LOCK_OP = lockSource;
            loc.T_MODIFY = System.DateTime.Now;
        }
 
        /// <summary>
        /// 终点入库锁
        /// </summary>
        /// <param name="loc"></param>
        /// <param name="lockSource"></param>
        public static void LockEndLoc(ref TN_Location loc, string lockSource = "") {
            if (loc == null) {
                throw new ArgumentNullException(); // 接受货位loc为空时直接抛异常(通常不会发生)
            }
 
            if (loc.N_LOCK_STATE != 0 || loc.S_LOCK_STATE != "无") {
                LogHelper.Warn($"起点出库锁:程序正在尝试给当前[锁状态]不是'无'的货位上锁!货位='{loc.S_CODE}',锁状态=({loc.N_LOCK_STATE},{loc.S_LOCK_STATE})");
            }
 
            loc.N_LOCK_STATE = 1; // 终点出库锁
            loc.S_LOCK_STATE = TN_Location.GetLockStateStr(1); // 终点出库锁
            loc.S_LOCK_OP = lockSource;
            loc.T_MODIFY = System.DateTime.Now;
        }
 
        /// <summary>
        /// 创建任务
        /// </summary>
        /// <param name="startLoc">起点货位:至少提供:S_CODE,S_AREA_CODE</param>
        /// <param name="endLoc">终点货位:至少提供:S_CODE,S_AREA_CODE</param>
        /// <param name="cntId">容器号</param>
        /// <param name="type">任务类型(名称)</param>
        /// <param name="pri">优先级</param>
        /// <param name="agvType">AGV类型</param>
        /// <returns></returns>
        public static TN_Task BuildTask(TN_Location startLoc, TN_Location endLoc, string cntId, string type, int pri = 3, int agvType = 1) {
            TN_Task TN_Task = new TN_Task() {
                S_CODE = GenerateTaskNo(),
                S_START_AREA = startLoc.S_AREA_CODE,
                S_END_AREA = endLoc.S_AREA_CODE,
                S_START_LOC = startLoc.S_CODE,
                S_END_LOC = endLoc.S_CODE,
                S_TYPE = type,
                N_PRIORITY = pri,
                N_SCHEDULE_TYPE = agvType,
                N_B_STATE = 0, // 任务创建时,默认等待
                S_CNTR_CODE = cntId,
            };
 
            return TN_Task;
        }
 
 
        internal static bool CheckActionRecordExist(string no, int code) {
            var db = new SqlHelper<TN_Task_Action>().GetInstance();
            return db.Queryable<TN_Task_Action>().Count(a => a.S_TASK_CODE == no && a.N_ACTION_CODE == code) > 0;
        }
 
        internal static void Begin(TN_Task task, string forklift_no) {
            var db = new SqlHelper<TN_Task>().GetInstance();
            if (task != null) {
                if (task.N_B_STATE == 1 || task.N_B_STATE == 0) { // 添加当task状态为0时也可以触发
                    task.N_B_STATE = 2;
                    task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE);
                    task.T_START_TIME = System.DateTime.Now;
                    task.S_EQ_NO = forklift_no;
                    db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_START_TIME, it.S_EQ_NO }).ExecuteCommand();
                }
            }
        }
        internal static void End(TN_Task task) {
            var db = new SqlHelper<TN_Task>().GetInstance();
            if (task != null) {
                task.N_B_STATE = 3;
                task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE);
                task.T_END_TIME = DateTime.Now;
                db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_END_TIME }).ExecuteCommand();
            }
        }
        internal static void Fail(TN_Task task) {
            var db = new SqlHelper<TN_Task>().GetInstance();
            if (task != null) {
                //判断有没有取货完成,没有就变成失败。有取货完成默认完成了 (跟据项目而定,有些项目人工拉走了也没有放到终点) 。
                task.N_B_STATE = 4;
                task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE);
                db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
            }
        }
 
        internal static bool AddActionRecord(string no, int state, string forkliftNo, string extData) {
            var db = new SqlHelper<TN_Task_Action>().GetInstance();
            var action = new TN_Task_Action() {
                N_ACTION_CODE = state,
                S_TASK_CODE = no,
                S_EQ_CODE = forkliftNo,
                S_EQ_TYPE = "agv",
                S_DATA = extData
            };
            return db.Insertable(action).ExecuteCommand() > 0;
        }
 
        internal static List<TN_Task> GetWaitingTaskList() {
            var db = new SqlHelper<object>().GetInstance();
            return db.Queryable<TN_Task>().Where(a => a.N_B_STATE == 0 && (a.S_B_STATE == "等待" || a.S_B_STATE == "待推送")).ToList();
        }
    }
 
    /// <summary>
    /// [货位/容器/物料]信息
    /// </summary>
    public class LocCntrCg {
        public TN_CG_Detail CgDetail { get; set; } = null;
        public TN_Loc_Container LocCntrRel { get; set; } = null;
        public TN_Location Location { get; set; } = null;
    }
}