kazelee
3 天以前 fbb7c2253c86d58583d7e3b0a8a44d0342c43c73
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
 
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;
using System.Linq;
 
namespace HH.WCS.Mobox3.AnGang.core {
    /// <summary>
    /// 定时轮询任务
    /// </summary>
    public class Monitor
    {
        public static void InboundDataSync() {
            var db = new SqlHelper<object>().GetInstance();
            try {
                var inboundDataList = db.Queryable<TN_Inbound_DataRecord>().ToList();
                
                if (inboundDataList.Count == 0 ) {
                    LogHelper.Info($"轮询:入库信息同步:当前没有待同步的ERP物料信息");
                    return;
                }
 
                var needDeleteDataList = new List<TN_Inbound_DataRecord>();
                var needUpdateLocCntrRelList = new List<TN_Loc_Container>();
                //var needUpdateCgDetailList = new List<TN_CG_Detail>();
 
                var needDeleteCgDetailList = new List<TN_CG_Detail>();
                var needInsertCgDetailList = new List<TN_CG_Detail>();
                var needUpdateCntrList = new List<TN_Container>();
 
                foreach (var inboundData in inboundDataList) {
                    var locCntrRel = db.Queryable<TN_Loc_Container>().Where(c => c.S_LOC_CODE == inboundData.S_LOCATION_CODE).First();
                    // 暂时不考虑如果当前关系表,锁状态为1(已经ERP覆盖过)的情况,默认有就覆盖
                    if (locCntrRel == null) {
                        LogHelper.Info($"轮询:入库信息同步:货位容器绑定表中暂无货位={inboundData.S_LOCATION_CODE}");
                        continue;
                    }
 
                    // 存在货位容器表但没找到物料表 ( 通常情况下不会发生 )
                    var cgDetailList = db.Queryable<TN_CG_Detail>().Where(d => d.S_CNTR_CODE == locCntrRel.S_CNTR_CODE).ToList();
                    if (cgDetailList.Count == 0) {
                        LogHelper.Info($"轮询:入库信息同步:货位容器表中,包含货位={locCntrRel.S_LOC_CODE}, 容器={locCntrRel.S_CNTR_CODE};但容器对应的物料表,没有找到物料!");
                        continue;
                    }
 
                    // 对查到的 cgDetailList , 待覆盖 , 添加到待删除列表中
                    foreach (var cgDetal in cgDetailList) {
                        if (!needDeleteCgDetailList.Contains(cgDetal)) {
                            needDeleteCgDetailList.Add(cgDetal);
                        }
                    }
 
                    // 更新容器表的货品明细数量 , 第一次设置为 1 , 之后每次 + 1
                    var cntr = needUpdateCntrList.Where(c => c.S_CODE == locCntrRel.S_CNTR_CODE).FirstOrDefault();
                    if (cntr != null) {
                        cntr.N_DETAIL_COUNT += 1;
                        cntr.T_MODIFY = DateTime.Now;
                    }
                    else {
                        needUpdateCntrList.Add(new TN_Container { S_CODE = locCntrRel.S_CNTR_CODE, N_DETAIL_COUNT = 1 });
                    }
 
                    // ERP 数据 -> CG_Detail
                    // 货品列表中随便找一个 cgDetail 赋值 , 只需要确保 F_WEIGHT 和 S_EXT_ATTR5 ( IMG_URL ) 不变即可
                    var cgDetail = cgDetailList.FirstOrDefault();
 
                    cgDetail.S_ITEM_CODE = inboundData.S_ITEM_CODE;
                    cgDetail.S_ITEM_SHORT_DESC = inboundData.S_ITEM_SHORT_DESC; // 物料短描述
                    cgDetail.S_IN_QUANTITY = inboundData.S_IN_QUANTITY; // 入库数量
                    cgDetail.S_STOCK_QUANTITY = inboundData.S_STOCK_QUANTITY; // 库存数量
                    cgDetail.S_TOTAL_PRICE = inboundData.S_TOTAL_PRICE; // 库存总价
                    cgDetail.S_STORE_KEEPER = inboundData.S_STORE_KEEPER;
                    cgDetail.S_LINE_CODE = inboundData.S_LINE_CODE;
                    cgDetail.F_QTY = float.Parse(inboundData.S_IN_QUANTITY);
                    cgDetail.T_MODIFY = DateTime.Now;
                    //cgDetail.S_INVENTORY_MAN = inboundData.S_INVENTORY_MAN; // 库存责任人姓名
 
                    cgDetail.N_LOCK_STATE = 1;
                    locCntrRel.N_LOCK_STATE = 1;
                    locCntrRel.T_MODIFY = DateTime.Now;
 
                    needUpdateLocCntrRelList.Add(locCntrRel);
                    //needUpdateCgDetailList.Add(cgDetailList);
 
                    // 最后 , 将处理完的入库记录加入删除队列
                    needDeleteDataList.Add(inboundData);
                }
 
                if (needDeleteDataList.Count == 0) {
                    LogHelper.Info($"轮询:入库信息同步:待更新的ERP物料信息,暂无物料可以覆盖,目前待更新数量:{inboundDataList.Count}");
                    return;
                }
 
                using (var tran = db.Ado.UseTran()) {
                    if (needDeleteDataList.Count > 0 && db.Deleteable<TN_Inbound_DataRecord>(needDeleteDataList).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info($"轮询:入库信息同步:删除已有物料的入库信息表失败!" + JsonConvert.SerializeObject(needDeleteDataList));
                        return;
                    }
 
                    //if (needUpdateCgDetailList.Count > 0 && db.Updateable<TN_CG_Detail>(needUpdateCgDetailList).ExecuteCommand() <= 0) {
                    //    tran.RollbackTran();
                    //    LogHelper.Info($"轮询:入库信息同步:根据ERP信息,更新物料信息表失败!" + JsonConvert.SerializeObject(needUpdateCgDetailList));
                    //    return;
                    //}
 
                    if (needUpdateLocCntrRelList.Count > 0 && db.Updateable<TN_Loc_Container>(needUpdateLocCntrRelList).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info($"轮询:入库信息同步:根据ERP信息,更新货位容器关系表失败!" + JsonConvert.SerializeObject(needUpdateLocCntrRelList));
                        return;
                    }
 
                    if (needDeleteCgDetailList.Count > 0 && db.Deleteable(needDeleteCgDetailList).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info($"轮询: 入库信息同步: 根据ERP信息, 删除旧物料明细表失败! " + JsonConvert.SerializeObject(needDeleteCgDetailList));
                        return;
                    }
 
                    if (needInsertCgDetailList.Count > 0 && db.Insertable(needInsertCgDetailList).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info($"轮询: 入库信息同步: 根据ERP信息, 插入新物料明细表失败! " + JsonConvert.SerializeObject(needInsertCgDetailList));
                        return;
                    }
 
                    if (needUpdateCntrList.Count > 0 && db.Updateable(needUpdateCntrList).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info($"轮询: 入库信息同步: 根据ERP信息, 更新容器表失败! " + JsonConvert.SerializeObject(needUpdateCntrList));
                        return;
                    }
 
                    tran.CommitTran();
                    LogHelper.Info($"轮询:入库信息同步:根据ERP信息,更改货位容器关系、货品明细成功!已更改货位:" + JsonConvert.SerializeObject(needUpdateLocCntrRelList.Select(c => c.S_LOC_CODE).ToArray()));
                }
 
            }
            catch (Exception ex) {
 
                LogHelper.Info($"发生了异常:{ex.Message}");
            }
        }
 
        public static void OutboundDataSync() {
            var db = new SqlHelper<object>().GetInstance();
            try {
                var outboundDataList = db.Queryable<TN_Outbound_DataRecord>().ToList();
 
                if (outboundDataList.Count== 0 ) {
                    LogHelper.Info($"轮询:出库信息同步:当前没有待同步的ERP物料信息");
                    return;
                }
                
                var needDeleteDataList = new List<TN_Outbound_DataRecord>();
                var needUpdateLocCntrRelList = new List<TN_Loc_Container>();
 
                var needUpdateCgDetailList = new List<TN_CG_Detail>();
                var needDeleteCgDetailList = new List<TN_CG_Detail>();
                var needUpdateCntrList = new List<TN_Container>();
 
                foreach (var outboundData in outboundDataList) {
                    var locCntrRel = db.Queryable<TN_Loc_Container>().Where(c => c.S_LOC_CODE == outboundData.S_LOCATION_CODE).First();
                    // 暂时不考虑如果当前关系表,锁状态为1(已经ERP覆盖过)的情况,默认有就覆盖
                    if (locCntrRel != null) {
                        // 出库不像入库那样直接覆盖 , 而是查找具体的物料编码 , 对每个进行修改
                        var cgDetail = db.Queryable<TN_CG_Detail>().Where(d => d.S_CNTR_CODE == locCntrRel.S_CNTR_CODE && d.S_ITEM_CODE == outboundData.S_ITEM_CODE).First();
                        if (cgDetail == null) {
                            LogHelper.Info($"轮询:出库信息同步:货位容器表中,包含货位={locCntrRel.S_LOC_CODE}, 容器={locCntrRel.S_CNTR_CODE};但容器对应的物料表,没有找到物料{outboundData.S_ITEM_CODE}!");
                            continue;
                        }
 
                        var actualQty = float.Parse(outboundData.S_ACTUAL_QTY);
                        if (actualQty > cgDetail.F_QTY) {
                            LogHelper.Info($"实发数量超过物料数量! 物料编码={cgDetail.S_ITEM_CODE}, 当前数量={cgDetail.F_QTY}, 实发数量='{outboundData.S_ACTUAL_QTY}'", "Error");
                        }
 
                        var currentQty = cgDetail.F_QTY - actualQty;
                        if (currentQty <= 0) {
                            needDeleteCgDetailList.Add(cgDetail);
 
                            // 更新容器表的货品明细数量 , 第一次查找并 - 1 , 之后每次 - 1
                            var cntr = needUpdateCntrList.Where(c => c.S_CODE == locCntrRel.S_CNTR_CODE).FirstOrDefault();
                            if (cntr != null) {
                                if (cntr.N_DETAIL_COUNT == 0) {
                                    LogHelper.Info($"容器明细数量为0, 无法再减少!", "Error");
                                }
                                else {
                                    cntr.N_DETAIL_COUNT -= 1;
                                    cntr.T_MODIFY = DateTime.Now;
                                }
                            }
                            else {
                                var actualCntr = db.Queryable<TN_Container>().Where(c => c.S_CODE == locCntrRel.S_CNTR_CODE).First();
                                if (actualCntr == null) {
                                    LogHelper.Info($"容器表中没有容器{actualCntr.S_CODE}!", "Error");
                                }
                                else {
                                    if (actualCntr.N_DETAIL_COUNT == 0) {
                                        LogHelper.Info($"容器明细数量为0, 无法再减少!", "Error");
                                    }
                                    else {
                                        actualCntr.N_DETAIL_COUNT -= 1;
                                        actualCntr.T_MODIFY = DateTime.Now;
                                        needUpdateCntrList.Add(actualCntr);
                                    }
                                }
                            }
 
                        }
                        else {
                            cgDetail.S_ITEM_CODE = outboundData.S_ITEM_CODE;
                            cgDetail.S_STORE_KEEPER = outboundData.S_STORE_KEEPER;
                            cgDetail.F_QTY = currentQty;
                            cgDetail.T_MODIFY = DateTime.Now;
                            locCntrRel.N_LOCK_STATE = 1;
                            cgDetail.N_LOCK_STATE = 1;
                            cgDetail.S_STOCK_QUANTITY = currentQty.ToString();
                            locCntrRel.T_MODIFY = DateTime.Now;
 
                            needUpdateCgDetailList.Add(cgDetail);
                        }
 
                        // 就算cgDetail都删完了, 也还是会保留货位容器信息, 不会自动删除 ( 不过理论上只有回库之后才会更新物料的 , 所以物料不可能为空 )
                        needUpdateLocCntrRelList.Add(locCntrRel);
                        needDeleteDataList.Add(outboundData);
                    }
                }
 
                if (needDeleteDataList.Count == 0) {
                    LogHelper.Info($"轮询:出库信息同步:待更新的ERP物料信息,暂无物料可以覆盖,目前待更新数量:{outboundDataList.Count}");
                }
 
                using (var tran = db.Ado.UseTran()) {
                    if (needDeleteDataList.Count > 0 && db.Deleteable<TN_Outbound_DataRecord>(needDeleteDataList).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info($"轮询:出库信息同步:删除已有物料的出库信息表失败!" + JsonConvert.SerializeObject(needDeleteDataList));
                        return;
                    }
 
                    if (needUpdateCgDetailList.Count > 0 && db.Updateable<TN_CG_Detail>(needUpdateCgDetailList).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info($"轮询:出库信息同步:根据ERP信息,更新物料信息表失败!" + JsonConvert.SerializeObject(needUpdateCgDetailList));
                        return;
                    }
 
                    if (needDeleteCgDetailList.Count > 0 && db.Deleteable(needDeleteCgDetailList).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info($"轮询:出库信息同步:根据ERP信息, 删除旧物料明细表失败! " + JsonConvert.SerializeObject(needDeleteCgDetailList));
                        return;
                    }
 
                    if (needUpdateCntrList.Count > 0 && db.Updateable(needUpdateCntrList).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info($"轮询:出库信息同步:根据ERP信息, 更新容器表失败! " + JsonConvert.SerializeObject(needUpdateCntrList));
                        return;
                    }
 
                    if (needUpdateLocCntrRelList.Count > 0 && db.Updateable<TN_Loc_Container>(needUpdateLocCntrRelList).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info($"轮询:出库信息同步:根据ERP信息,更新货位容器关系表失败!" + JsonConvert.SerializeObject(needUpdateLocCntrRelList));
                        return;
                    }
 
                    tran.CommitTran();
                    LogHelper.Info($"轮询:出库信息同步:根据ERP信息,更改货位容器关系、货品明细成功!已更改货位:" + JsonConvert.SerializeObject(needUpdateLocCntrRelList.Select(c => c.S_LOC_CODE).ToArray()));
                }
 
            }
            catch (Exception ex) {
                LogHelper.Info($"发生了异常:{ex.Message}");
            }
        }
 
        
    }
 
}