1
dengjunjie
4 天以前 1f1b9ac010b7ef6a055bdf22c022868c9033712f
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
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
using MailKit.Search;
using Masuit.Tools;
using Newtonsoft.Json;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.FangCang;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.SquareCabin;
using WIDESEA_ISquareCabinRepository;
using WIDESEA_ISquareCabinServices;
using WIDESEA_Model.Models;
using WIDESEA_SquareCabinRepository;
using static System.Net.WebRequestMethods;
using static WIDESEA_DTO.SquareCabin.OrderDto;
using static WIDESEA_DTO.SquareCabin.TowcsDto;
 
namespace WIDESEA_SquareCabinServices
{
    public class CabinOrderServices : ServiceBase<Dt_CabinOrder, ICabinOrderRepository>, ICabinOrderServices
    {
        public CabinOrderServices(ICabinOrderRepository BaseDal) : base(BaseDal)
        {
        }
        static string SearchDate = "";
 
        /// <summary>
        /// 获取上游系统的入库单
        /// </summary>
        /// <param name="searchDate"></param>
        /// <returns></returns>
        //public WebResponseContent GetUpstreamOrder(DateTime searchDate)
        //{
        //    var responseContent = new WebResponseContent();
 
        //    try
        //    {
        //        // 请求地址
        //        var url = "http://127.0.0.1:9090/GYZ2/95fck/inOrder";
 
        //        //// 请求参数
        //        var requestData = new
        //        {
        //            searchDate = searchDate.ToString("yyyy-MM-dd HH:mm:ss")
        //        };
 
        //        // 发起请求
        //        var result = HttpHelper.Post(url, requestData.ToJsonString());
 
        //        // 反序列化
        //        var response = JsonConvert.DeserializeObject<UpstreamResponse<UpstreamOrderInfo>>(result);
 
        //        if (response.resultCode != "0")
        //        {
        //            // 调用异常接口
        //            SendErrorToUpstream(1, "", response.resultMsg ?? "上游接口返回失败", "");
        //            return responseContent.Error(response.resultMsg ?? "上游接口返回失败");
        //        }
 
        //        if (response.data == null || !response.data.Any())
        //        {
        //            return responseContent.OK("无新入库单数据");
        //        }
 
        //        Db.Ado.BeginTran();
        //        List<Dt_CabinOrder> _CabinOrders = new List<Dt_CabinOrder>();
        //        foreach (var order in response.data)
        //        {
        //            try
        //            {
        //                // 插入入库单表
        //                var entityOrder = new Dt_CabinOrder
        //                {
 
        //                    Order_no = order.order_no,
        //                    Order_type = order.order_type,
        //                    Supplier_no = order.supplier_no,
        //                    Account_tiem = order.account_time,
        //                    OdrderStatus = "新建",
        //                };
        //                //var orderId = Db.Insertable(entityOrder).ExecuteReturnIdentity(); //就是返回主键ID。
 
        //                // 插入入库明细表
        //                var detailEntities = order.details.Select(d => new Dt_CabinOrderDetail
        //                {
        //                    //OrderId= orderId,
        //                    Goods_no = d.goods_no,
        //                    Order_qty = d.order_qty,
        //                    Batch_num = d.batch_num,
        //                    Exp_date = d.exp_date,
        //                    Warehouse_no = d.warehouse_no,
        //                    Status = 0,
        //                }).ToList();
        //                entityOrder.Details.AddRange(detailEntities); //建立主对象与子对象的关联关系
        //                _CabinOrders.Add(entityOrder);
 
        //                //自己
        //                /// Db.Insertable(detailEntities).ExecuteCommand();
 
        //                //这里要调用一个接口将上面的信息传给wcs,然后改变状态
        //            }
        //            catch (Exception innerEx)
        //            {
        //                // 针对某条订单报错时,推送异常给上游
        //                SendErrorToUpstream(1, order.order_no, innerEx.Message, "");
        //                throw; // 抛出异常,让外层捕获回滚
        //            }
        //        }
        //        // 批量插入(SqlSugar自动处理主外键关系)
        //        Db.Insertable(_CabinOrders).ExecuteCommand();
        //        Db.Ado.CommitTran();
 
        //        //如果EdiIn完成那么就调用CompleteOrder接口
 
        //        return responseContent.OK("同步入库单成功");
        //    }
        //    catch (Exception ex)
        //    {
        //        // 全局异常时,也推送异常给上游
        //        SendErrorToUpstream(1, "", ex.Message, "");
        //        Db.Ado.RollbackTran();
        //        return responseContent.Error("同步失败: " + ex.Message);
        //    }
        //}
 
 
        public WebResponseContent GetUpstreamOrder()
        {
            var responseContent = new WebResponseContent();
            try
            {
                // 请求地址
                var url = "http://127.0.0.1:9090/GYZ2/95fck/inOrder";
                if (string.IsNullOrEmpty(SearchDate)) SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                //// 请求参数
                var requestData = new
                {
                    searchDate = SearchDate
                };
                SearchDate = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd HH:mm:ss");
                // 发起请求
                var result = HttpHelper.Post(url, requestData.ToJsonString());
 
                // 反序列化
                var response = JsonConvert.DeserializeObject<UpstreamResponse<UpstreamOrderInfo>>(result);
 
                if (response.resultCode != "0")
                {
                    // 调用异常接口
                    SendErrorToUpstream(1, "", response.resultMsg ?? "上游接口返回失败", "");
                    return responseContent.Error(response.resultMsg ?? "上游接口返回失败");
                }
 
                if (response.data == null || !response.data.Any())
                {
                    return responseContent.OK("无新入库单数据");
                }
 
                Db.Ado.BeginTran();
                try
                {
                    List<Dt_CabinOrder> _CabinOrders = new List<Dt_CabinOrder>();
                    //存储入库单号
                    List<string> orderNos = new List<string>();
 
                    foreach (var order in response.data)
                    {
                        var entityOrder = new Dt_CabinOrder
                        {
                            Order_no = order.order_no,
                            Order_type = order.order_type,
                            Supplier_no = order.supplier_no,
                            Account_tiem = order.account_time,
                            OdrderStatus = "新建",
                            Details = order.details.Select(d => new Dt_CabinOrderDetail
                            {
                                //OrderId 要拿到入库单表中的id,如何拿不到就将这个字段改了,改成入库单号
                                Goods_no = d.goods_no,
                                Order_qty = d.order_qty,
                                Batch_num = d.batch_num,
                                Exp_date = d.exp_date,
                                Warehouse_no = d.warehouse_no,
                                OrderDetailStatus="新建",
                                Status = d.warehouse_no== "001" ? 0 : 2, //如果是001房那么就是未同步状态,如果不是001房那么就是无需同步状态
                            }).ToList()
                        };
                        _CabinOrders.Add(entityOrder);
                        orderNos.Add(order.order_no);
                    };
                    BaseDal.Db.InsertNav(_CabinOrders).Include(x => x.Details).ExecuteCommand();
 
                    //在下发给wcs 
                  var reslut=  EdiIn(); //发给下游
                                        //如果这个方法成功了,那么就调用CompleteOrder接口,然后改变
                    if (reslut.Status==true)
                    {
                        //如果EdiIn完成那么就调用CompleteOrder接口,将状态改为UpOrderStatus == "已完成
                        foreach (var no in orderNos)
                        {
                            //CompleteOrder(no); // 使用收集的单号
 
                            //Db.Updateable<Dt_CabinOrder>()
                            //  .SetColumns(o => o.UpOrderStatus == "已完成") // 更新上游状态
                            //  .Where(o => o.Order_no == no && o.OdrderStatus == "已完成")
                            //  .ExecuteCommand();
                        }
                    }
                    Db.Ado.CommitTran();
                    return responseContent.OK("同步入库单成功");
                }
                catch (Exception ex)
                {
                    Db.Ado.RollbackTran();
                    SendErrorToUpstream(1, "", ex.Message, "");
                    return responseContent.Error("同步失败: " + ex.Message);
                }
            }
            catch (Exception ex)
            {
                // 全局异常时,也推送异常给上游
                SendErrorToUpstream(1, "", ex.Message, "");
                return responseContent.Error("同步失败: " + ex.Message);
            }
        }
 
        /// <summary>
        /// 传给wcs
        /// </summary>
        public WebResponseContent EdiIn()
        {
            try
            {
                //2.查询符合条件的订单(表头 = 新建 && 包含有效明细)
                //var orders = BaseDal.Db.Queryable<Dt_CabinOrder>()
                //    .Where(o => o.OdrderStatus == "新建")
                //    .Includes(o => o.Details, d => d.MedicineGoods)
                //    .ToList();
                //查出包含全部的入库单,包含全部明细+一个明细对应一个商品
                var orders = BaseDal.Db.CopyNew()
                .Queryable<Dt_CabinOrder>()
                .Where(o => o.OdrderStatus == "新建")
                .Includes(o => o.Details, d => d.MedicineGoods)
                .ToList();
                // 3. 再过滤掉不符合条件的明细(只保留 Status=0)
                foreach (var order in orders)
                {
                    order.Details = order.Details.Where(d => d.Status == 0).ToList();
                }
 
                if (orders == null || !orders.Any())
                {
                    Console.WriteLine("没有符合条件的订单需要推送");
                    return WebResponseContent.Instance.Error("没有符合条件的订单需要推送");
                }
 
                // 4. 遍历订单,组装 DTO 并推送
                foreach (var order in orders)
                {
                    var ediDto = new ToediInInfo
                    {
                        //客户代码
                        customerCode = "905",
                        //物料类型
                        materialCode = "YY",
                        //入库单号
                        externalOrderNo = order.Order_no,
                        //入库单类型
                        inOrderType = order.Order_type == "1" ? "10" : "20",
                        //优先级
                        priority = 0,
                        //是否取消
                        Is_cancel = 0,
                        details = order.Details.Select(d => new ToediInDetail
                        {
                            //批号
                            batchNo = d.Batch_num,
                            //产品
                            productCode = d.Goods_no,
                            //sku名称
                            productName = d.MedicineGoods?.Goods_spm,
                            //sku规格
                            productSpecifications = d.MedicineGoods?.Model,
                            //数量
                            quantity = (int)d.Order_qty,
                            //效期
                            validityPeriod = d.Exp_date,
                            //生产厂家
                            manufacturer = d.MedicineGoods?.Factory,
                            //房号
                            libraryNo = d.Warehouse_no,
                            //盘盈入库
                            //stocktakingDetails = new List<ToediInStock>()
                            //stocktakingDetails = new List<ToediInStock>()
                            //{
                            //    new ToediInStock
                            //    {
                            //         //料箱号
                            //        palletCode = "PDA001", 
                            //        //数量
                            //        quantity = d.Order_qty.ToString()
                            //    }
                            // }
                        }).ToList()
                    };
 
                    var url = "http://172.16.1.2:9357/file-admin/api/in/ediIn";
                    var result = HttpHelper.Post(url, ediDto.ToJsonString());
                    var resp = JsonConvert.DeserializeObject<TowcsResponse<object>>(result);
 
                    if (resp != null && resp.code == "0")
                    {
                        // 更新表头状态
                       BaseDal.Db.Updateable<Dt_CabinOrder>()
                          .SetColumns(o => new Dt_CabinOrder { OdrderStatus = "开始" })
                          .Where(o => o.Id == order.Id)
                          .ExecuteCommand();
 
                        // 更新明细状态为已同步
                        BaseDal.Db.Updateable<Dt_CabinOrderDetail>()
                          .SetColumns(d => new Dt_CabinOrderDetail { Status = 1, OrderDetailStatus = "已完成" })
                          .Where(d => d.OrderId == order.Id && d.Status == 0)
                          .ExecuteCommand();
 
                        Console.WriteLine($"订单 {order.Order_no} 推送成功");
                    }
                    else
                    {
                        SendErrorToUpstream(3, order.Order_no, resp?.msg ?? "WCS 推送失败", "");
                        Console.WriteLine($"订单 {order.Order_no} 推送失败:{resp?.msg}");
                        return new WebResponseContent { Status = false, Message = "订单推送失败" };
                    }
                }
                return new WebResponseContent { Status = true, Message = "推送成功" };
            }
            catch (Exception ex)
            {
                Console.WriteLine("EdiIn 异常:" + ex.Message);
                return new WebResponseContent { Status = false, Message = ex.Message };
            }
        }
 
 
 
        /// <summary>
        /// 入库报完成接口 //检查一个详细表中全部状态为完成的时候就将入库单的开始改写成完成并推送给上游
        /// </summary>
        /// <param name="order_no">入库单号</param>
        /// <returns></returns>
        public WebResponseContent CompleteOrder(string order_no)
        {
            var responseContent = new WebResponseContent();
            try
            {
                if (string.IsNullOrWhiteSpace(order_no))
                {
                    return responseContent.Error("入库单号不可以为空");
                }
 
                var url = "http://127.0.0.1:9090/GYZ2/95fck/inOrderOk";
                var result = HttpHelper.Post(url, new { order_no }.ToJsonString());
                var response = JsonConvert.DeserializeObject<UpstreamOrderResponse>(result);
 
                if (response.resultCode != "0")
                {
                    SendErrorToUpstream(2, "", "上游接口返回失败", "");
                    return responseContent.Error(response.resultMsg ?? "上游接口返回失败");
                }
 
                // 先查表头
                var order = BaseDal.Db.Queryable<Dt_CabinOrder>()
                              .First(o => o.Order_no == order_no);
 
                if (order == null)
                {
                    return responseContent.Error($"未找到入库单号: {order_no}");
                }
 
                // 查询所有明细是否都已完成
                var allDetailsCompleted = BaseDal.Db.Queryable<Dt_CabinOrderDetail>()
                    .Where(d => d.OrderId == order.Id&&d.OrderDetailStatus=="已完成")  // 明细表用 OrderId 关联主表
                     .Count();
 
                if (allDetailsCompleted>0)
                {
                    // 更新表头状态为已完成
                    BaseDal.Db.Updateable<Dt_CabinOrder>()
                      .SetColumns(o => o.OdrderStatus == "已完成")
                      .Where(o => o.Order_no == order_no)
                      .ExecuteCommand();
 
                    return responseContent.OK("操作成功,入库单及明细全部完成");
                }
                else
                {
                    return responseContent.OK("操作成功,但仍有未完成的明细");
                }
                //删除全部状为已完成的明细和表头,移入历史表
            }
            catch (Exception ex)
            {
                SendErrorToUpstream(1, "", ex.Message, "");
                return responseContent.Error("同步失败: " + ex.Message);
            }
        }
 
        
 
        /// <summary>
        /// 推送异常信息给上游系统1.入库单接口;2.入库单报完成接口;3.出库单接口;4.出库报完成接口;5.药品基础信息同步接口;6.供应商信息接口;7.客户信息接口;8.库存
        /// </summary>
        public void SendErrorToUpstream(int type, string code, string message, string remark)
        {
            try
            {
                var url = "http://127.0.0.1:9090/GYZ2/95fck/lexceptionLogog";
 
                var requestData = new
                {
                    type = type.ToString(),
                    code = code,
                    message = message,
                    remark = remark
                };
 
                var result = HttpHelper.Post(url, requestData.ToJsonString());
                // 可以反序列化检查 resultCode 是否为0
            }
            catch (Exception e)
            {
                // 这里不要再抛异常了,避免死循环
                Console.WriteLine("异常接口推送失败:" + e.Message);
            }
        }
 
 
 
      
 
 
    }
}