kazelee
2025-06-03 9e40412e6d20f07c1d98ceae5214093b50e2fb88
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
 
using HH.WCS.Mobox3.AnGang.models;
using HH.WCS.Mobox3.AnGang.process;
using HH.WCS.Mobox3.AnGang.util;
using HH.WCS.Mobox3.AnGang.wms;
 
using Newtonsoft.Json;
 
using System;
using System.Collections.Generic;
 
namespace HH.WCS.Mobox3.AnGang.core {
    /// <summary>
    /// 定时轮询任务
    /// </summary>
    public class Monitor
    {
        public static void CheckCountOrder() {
            var taskName = TaskName.盘点理货出库;
            var db = new SqlHelper<object>().GetInstance();
            var info = "";
 
            try {
                var orderList = db.Queryable<TN_Count_Order>()
                    .Where(c => c.N_B_STATE == 1)
                    .OrderBy(c => c.T_CREATE, SqlSugar.OrderByType.Asc)
                    .ToList();
 
                if (orderList.Count == 0) {
                    LogHelper.Info($"轮询--{taskName}--暂无待执行的{taskName}单");
                    return;
                }
 
                var detailList = new List<TN_Count_CG_Detail>();
                foreach (var order in orderList) {
                    var doingCount = db.Queryable<TN_Count_CG_Detail>()
                        .Count(d => d.S_COUNT_NO == order.S_COUNT_NO && d.N_B_STATE >= 2); // 执行中
                    var allCount = db.Queryable<TN_Count_CG_Detail>()
                        .Count(d => d.S_COUNT_NO == order.S_COUNT_NO);
                    LogHelper.Info($"轮询--{taskName}--统计{taskName}单'{order.S_COUNT_NO}'任务已下发:{doingCount}/{allCount}");
 
                    if (doingCount == allCount) {
                        order.N_B_STATE = 2; // 所有任务都已执行
                        db.Updateable<TN_Count_Order>(order).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
                        continue;
                    }
 
                    var countCgDetailList = db.Queryable<TN_Count_CG_Detail>()
                        .Where(a => a.S_COUNT_NO == order.S_COUNT_NO && a.N_B_STATE == 1) // 已下发
                        .ToList();
 
                    if (countCgDetailList.Count == 0) {
                        LogHelper.Info($"轮询--{taskName}--{taskName}单明细状态异常");
                        continue;
                    }
 
                    detailList.AddRange(countCgDetailList);
                }
 
                if (detailList.Count == 0) {
                    return;
                }
 
                foreach (var detail in detailList) {
                    var startLoc = db.Queryable<TN_Location>()
                        .LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
                        .Where((l, c) => c.S_CNTR_CODE == detail.S_CNTR_CODE)
                        .First();
 
                    if (startLoc == null) {
                        LogHelper.Info($"轮询--{taskName}:没有找到合适的起点货位!");
                        continue;
                    }
 
                    var endLoc = db.Queryable<TN_Location>()
                        .Where(a => Settings.Areas[0].Contains(a.S_AREA_CODE))
                        .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y")
                        .Where(a => a.N_CURRENT_NUM == 0).First();
 
                    if (endLoc == null) {
                        LogHelper.Info($"轮询--{taskName}:没有找到合适的终点货位!单号为 '{detail.S_COUNT_NO}'");
                        continue;
                    }
 
                    detail.N_B_STATE = 2;
 
                    var cntId = detail.S_CNTR_CODE;
                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
 
                    LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁
                    LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
 
                    using (var tran = db.Ado.UseTran()) {
                        if (db.Updateable<TN_Count_CG_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
                            tran.RollbackTran();
                            LogHelper.Info($"轮询--{taskName}--修改明细表状态为完成失败!");
                        }
 
                        if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
                            it.N_LOCK_STATE,
                            it.S_LOCK_STATE,
                            it.S_LOCK_OP,
                            it.T_MODIFY
                        }).ExecuteCommand() <= 0) {
                            tran.RollbackTran();
                            info = $"生成任务'{taskName}'失败,容器号{cntId},起点{startLoc.S_CODE},终点货位{endLoc.S_CODE}";
                            LogHelper.Info(info);
                            continue;
                        }
 
                        if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
                            it.N_LOCK_STATE,
                            it.S_LOCK_STATE,
                            it.S_LOCK_OP,
                            it.T_MODIFY
                        }).ExecuteCommand() <= 0) {
 
                            tran.RollbackTran();
                            info = $"生成'{taskName}'失败,容器号 {cntId} ,起点 {startLoc.S_CODE} ,终点货位 {endLoc.S_CODE}";
                            LogHelper.Info(info);
                            continue;
                        }
 
                        if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
                            tran.RollbackTran();
                            info = $"生成 {taskName} 失败,容器号 {cntId} ,起点 {startLoc.S_CODE} ,终点货位 {endLoc.S_CODE}";
                            LogHelper.Info(info);
                            continue;
                        }
 
                        tran.CommitTran();
                        info = $"生成 {taskName} 成功,容器号 {cntId} ,起点 {startLoc.S_CODE} ,终点货位 {endLoc.S_CODE}";
                        LogHelper.Info(info);
                        //continue;
                    }
                }
            }
            catch (Exception ex) {
                info = $"发生了异常:{ex.Message}";
                LogHelper.Info(info);
            }
        }
    }
 
}