kazelee
2025-05-09 62e3ff7506396fcb7f7737900806e838c2466aa3
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
using System;
using System.Collections.Generic;
using System.Linq;
 
using HH.WCS.Mobox3.DSZSH.Consts;
using HH.WCS.Mobox3.DSZSH.Helpers;
using HH.WCS.Mobox3.DSZSH.Helpers.Model;
using HH.WCS.Mobox3.DSZSH.Models;
 
using Newtonsoft.Json;
 
namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
    /// <summary>
    /// 定时轮询任务:出库业务核心
    /// </summary>
    public class OutboundCore {
        /// <summary>
        /// 后台轮询出库单/出库明细单,生成出库任务表
        /// </summary>
        public static void CheckOutboundOrder() {
            var db = DbHelper.GetDbClient();
 
            try {
                // 查找所有的 等待出库 的 出库单,按 先创建先处理 排序
                var orders = db.Queryable<TN_Outbound_Order>()
                    .Where(o => o.N_B_STATE == 0)
                    .OrderBy(o => o.T_CREATE)
                    .Mapper(
                        o => o.Details, // 将子表数据映射到主表的 Details 属性
                        o => o.S_NO,    // 主表关联字段
                        d => d.S_NO     // 子表关联字段
                    )
                    .ToList();
 
                if (orders.Count == 0) {
                    LogHelper.Info("轮询 | 当前没有等待执行的出库单");
                    return;
                }
 
                using (var tran = db.Ado.UseTran()) {
 
                    foreach (var o in orders) {
                        foreach (var d in o.Details) {
                            for (int i = 0; i < d.N_QTY; i++) {
                                var task = new TN_Outbound_Task {
                                    S_CG_ID = d.S_CG_ID,
                                    S_END_AREA = d.S_END_AREA,
                                    N_FORCE = o.N_FORCE,
                                    S_BATCH_NO = d.S_BATCH_NO,
                                    N_STATE = 0
                                };
                                if (db.Insertable<TN_Outbound_Task>(task).ExecuteCommand() <= 0) {
                                    tran.RollbackTran();
                                    LogHelper.Info("插入任务出错");
                                    return;
                                }
                            }
 
                            d.N_B_STATE = 1;
                            if (db.Updateable<TN_Outbound_Detail>(d).UpdateColumns(c => c.N_B_STATE).ExecuteCommand() > 0) {
                                LogHelper.Info("更新 N_B_STATE 成功");
                            }
                            else {
                                tran.RollbackTran();
 
                                LogHelper.Info("更新 N_B_STATE 失败");
                                return;
                            }
                        }
 
                        o.N_B_STATE = 1;
                        if (db.Updateable<TN_Outbound_Order>(o).UpdateColumns(c => c.N_B_STATE).ExecuteCommand() > 0) {
                            LogHelper.Info("更新 N_B_STATE 成功");
                        }
                        else {
                            tran.RollbackTran();
 
                            LogHelper.Info("更新 N_B_STATE 失败");
                            return;
                        }
                    }
 
                    tran.CommitTran();
                }
            }
            catch (Exception ex) {
                LogHelper.InfoEx(ex);
                throw;
            }
        }
 
        /// <summary>
        /// 轮询出库
        /// </summary>
        public static void CheckOutboundTask() {
            var db = DbHelper.GetDbClient();
 
            try {
                var task = db.Queryable<TN_Outbound_Task>()
                    .Where(t => t.N_STATE == 0).First();
 
                if (task == null) {
                    LogHelper.Info("轮询 | 出库任务队列 暂无待执行的任务");
                    return;
                }
 
                var headTask = task;
                if (headTask.N_STATE != 0) {
                    LogHelper.Info("轮询 | 出库任务队列 队头任务尚未完成");
                    return;
                }
 
                var locCntr = db.Queryable<TN_Location, TN_Loc_Container, TN_CG_Detail>
                    ((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE)
                    // 筛选要求的物料编码和批次号
                    .Where((l, c, d) => d.S_CG_ID == headTask.S_CG_ID && d.S_BATCH_NO == headTask.S_BATCH_NO)
                    // 如果不是强制出库,物料状态必须必须合格
                    // 否则,只要不是正在检验的物料即可
                    .Where((l, c, d) => (headTask.N_FORCE == 0 && d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "合格")
                        || (headTask.N_FORCE != 0 && d.N_ITEM_STATE != 3 && d.S_ITEM_STATE != "正在检验"))
                    // 物料状态对应的数字,越小越优先
                    .OrderBy((l, c, d) => d.N_ITEM_STATE)
                    .OrderBy(l => l.N_LAYER)
                    .Select((l, c) => new { Location = l, Container = c }).First();
                    
                if (locCntr == null) {
                    LogHelper.Info("轮询 | 不存在符合条件的物料货位");
                    return;
                }
 
                var endLoc = db.Queryable<TN_Location>()
                    .Where(l => l.S_AREA_CODE == headTask.S_END_AREA)
                    .Where(ExprHelper.LocIsFree)
                    .Where(ExprHelper.LocIsEmpty)
                    .OrderBy(l => l.S_CODE)
                    .First();
 
                if (endLoc == null) {
                    LogHelper.Info("轮询 | 不存在符合条件的出库终点库位");
                    return;
                }
 
                using (var tran = db.Ado.UseTran()) {
                    if (TaskHelper.LogCreateTask(locCntr.Location.S_CODE, locCntr.Container.S_CNTR_CODE, endLoc.S_CODE, TaskName.成品胶出库)) {
                        task.N_STATE = 1;
                        if (db.Updateable<TN_Outbound_Task>(task).UpdateColumns(c => c.N_STATE).ExecuteCommand() <= 0) {
                            tran.RollbackTran();
                            LogHelper.Info("修改出库任务状态错误");
                        }
                        else {
                            tran.CommitTran();
                            LogHelper.Info("修改出库任务状态成功");
                        }
                    }
                }
                    
            }
            catch (Exception ex) {
                LogHelper.InfoEx(ex);
            }
        }
 
        /// <summary>
        /// 
        /// </summary>
        /// <param name="state"></param>
        public static void UpdateTaskState(int state = 2) {
 
        }
 
    }
}