using Masuit.Tools; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; 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 WIDESEA_DTO.SquareCabin.OrderDto; using static WIDESEA_DTO.SquareCabin.TowcsDto; namespace WIDESEA_SquareCabinServices { public class DeliveryOrderServices : ServiceBase, IDeliveryOrderServices { public DeliveryOrderServices(IDeliveryOrderRepository BaseDal) : base(BaseDal) { } static string SearchDate = ""; /// /// 获取上游出库单 0成功1失败 /// /// /// public WebResponseContent GetUpstreamOutOrder() { var responseContent = new WebResponseContent(); try { // 请求地址 var url = "http://127.0.0.1:9000/GYZ2/95fck/outOrder"; 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>(result); if (response.resultCode != "0") { SendErrorToUpstream(3, "", response.resultMsg ?? "上游接口返回失败", ""); return responseContent.Error(response.resultMsg ?? "上游接口返回失败"); } if (response.data == null || !response.data.Any()) { return responseContent.OK("无新出库单数据"); } Db.Ado.BeginTran(); foreach (var outorder in response.data) { try { // 插入出库单 var entityOrder = new Dt_DeliveryOrder { Out_no = outorder.out_no, Out_type = outorder.out_type, Client_no = outorder.client_no, Account_time = outorder.account_time, OutStatus= "未完成", }; var outorderId = Db.Insertable(entityOrder).ExecuteReturnIdentity(); // 插入出库单明细 var detailEntities = outorder.details.Select(d => new Dt_DeliveryOrderDetail { DeliveryOrderId = outorderId, Goods_no = d.goods_no, Order_qty = d.out_qty, Batch_num = d.batch_num, Exp_date = d.exp_date, OotDetailStatus="新建" }).ToList(); Db.Insertable(detailEntities).ExecuteCommand(); } catch (Exception ex) { SendErrorToUpstream(3, outorder.out_no, ex.Message, ""); throw; // 让外层捕获并回滚 } } Db.Ado.CommitTran(); return responseContent.OK("同步出库单成功"); } catch (Exception ex) { SendErrorToUpstream(3, "", ex.Message, ""); Db.Ado.RollbackTran(); return responseContent.Error("同步失败: " + ex.Message); } } /// /// 出库单推送给 WCS /// /// public WebResponseContent EdiOut() { var responseContent = new WebResponseContent(); try { // 1. 查询符合条件的订单(表头=新建 && 包含有效明细) var outOrders = Db.Queryable() .Where(o => o.OutStatus == "新建") .Includes(o => o.Details, d => d.MedicineGoods) .ToList(); // 2. 再过滤掉不符合条件的明细(只保留 Status=0 ) foreach (var order in outOrders) { order.Details = order.Details.Where(d => d.Status == 0).ToList(); } if (outOrders == null || !outOrders.Any()) { Console.WriteLine("没有符合条件的订单需要推送"); return responseContent.Error("没有符合条件的订单需要推送"); } foreach (var order in outOrders) { try { // 3. 组装 DTO var ediDto = new TowcsDto.ToediOutInfo { customerCode = "905", materialCode = "YY", externalOrderNo = order.Out_no, outOrderType = order.Out_type == "1" ? "10" : order.Out_type == "2" ? "20" : "30", priority = 1, Is_cancel = 0, details = order.Details.Select(d => new TowcsDto.ToeOutdiInDetail { batchNo = d.Batch_num, productCode = d.Goods_no, productName = d.MedicineGoods?.Goods_spm, productSpecifications = d.MedicineGoods?.Model, quantity = (int)d.Order_qty, //stocktakingDetails = order.Out_type == "3" // ? new List // { // new ToOutediInStock { palletCode = "FC00001", quantity = d.Order_qty.ToString() } // } // : null }).ToList() }; // 4. 调用接口 var url = "http://172.16.1.2:9357/file-admin/api/out/ediOut"; var result = HttpHelper.Post(url, ediDto.ToJsonString()); var resp = JsonConvert.DeserializeObject>(result); if (resp != null && resp.code == "0") { // 更新表头状态 Db.Updateable() .SetColumns(o => new Dt_DeliveryOrder { OutStatus = "开始" }) .Where(o => o.Id == order.Id) .ExecuteCommand(); // 更新明细状态 Db.Updateable() .SetColumns(d => new Dt_DeliveryOrderDetail { Status = 1,OotDetailStatus="已完成" }) .Where(d => d.DeliveryOrderId == order.Id && d.Status == 0) .ExecuteCommand(); Console.WriteLine($"订单 {order.Out_no} 推送成功"); } else { SendErrorToUpstream(3, order.Out_no, resp?.msg ?? "WCS 推送失败", ""); Console.WriteLine($"订单 {order.Out_no} 推送失败:{resp?.msg}"); } //删除全部状为已完成的明细和表头,移入历史表 } catch (Exception ex) { SendErrorToUpstream(3, order.Out_no, ex.Message, ""); Console.WriteLine($"订单 {order.Out_no} 推送异常:{ex.Message}"); } } return responseContent.OK("出库订单推送完成"); } catch (Exception ex) { Console.WriteLine("EdiOut 异常:" + ex.Message); return responseContent.Error("出库订单推送失败:" + ex.Message); } } /// /// 出库报完成接口 /// /// 出库单号 /// public WebResponseContent CompleteOutOrder(string out_no) { var responseContent = new WebResponseContent(); try { if (string.IsNullOrWhiteSpace(out_no)) { return responseContent.Error("入库单号不可以为空"); } var url = " http://127.0.0.1:9090/GYZ2/95fck/outOrderOk"; var reslut = HttpHelper.Post(url, new {out_no }.ToJsonString()); var response = JsonConvert.DeserializeObject(reslut); if (response.resultCode != "0") { SendErrorToUpstream(4, "", "上游接口返回失败", ""); return responseContent.Error(response.resultMsg ?? "上游接口返回失败"); } //先查头表 var outOerd=Db.Queryable() .Where(o => o.Out_no == out_no) .First(); if (outOerd == null) { return responseContent.Error($"没有找到该出库单号{out_no}"); } //查找所有明细表是否都已完成 var incompleteDetails = Db.Queryable() .Where(d => d.DeliveryOrderId == outOerd.Id && d.OotDetailStatus == "已完成") .ToList(); // 更新出库单状态 Db.Updateable() .SetColumns(o => new Dt_DeliveryOrder { OutStatus = "已完成" }) .Where(o => o.Out_no == out_no) .ExecuteCommand(); return responseContent.OK("操作成功"); } catch (Exception ex) { SendErrorToUpstream(1, "", ex.Message, ""); return responseContent.Error("同步失败: " + ex.Message); } } /// /// 推送异常信息给上游系统 1.入库单接口;2.入库单报完成接口;3.出库单接口;4.出库报完成接口;5.药品基础信息同步接口;6.供应商信息接口;7.客户信息接口;8.库存查询接口 /// public void SendErrorToUpstream(int type, string code, string message, string remark) { try { var url = "http://127.0.0.1:9090/GYZ2/95fck/exceptionLog"; 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); } } } }