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, ICabinOrderServices { public CabinOrderServices(ICabinOrderRepository BaseDal) : base(BaseDal) { } static string SearchDate = ""; /// /// 获取上游系统的入库单 /// /// /// //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>(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 _CabinOrders = new List(); // 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>(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 _CabinOrders = new List(); //存储入库单号 List orderNos = new List(); 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 { 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() // .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); } } /// /// 传给wcs /// public WebResponseContent EdiIn() { try { // 1. 先找出至少有一条符合条件的明细对应的订单ID //var validOrderIds = Db.Queryable() // .Where(d => d.Status == 0 || d.Status == 2) // .Select(d => d.OrderId) // .Distinct() // .ToList(); // 2. 查询符合条件的订单(表头=新建 && 包含有效明细) var orders = BaseDal.Db.Queryable() .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() //stocktakingDetails = new List() //{ // 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>(result); if (resp != null && resp.code == "0") { // 更新表头状态 Db.Updateable() .SetColumns(o => new Dt_CabinOrder { OdrderStatus = "开始" }) .Where(o => o.Id == order.Id) .ExecuteCommand(); // 更新明细状态为已同步 Db.Updateable() .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 }; } } /// /// 入库报完成接口 /// /// 入库单号 /// 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(result); if (response.resultCode != "0") { SendErrorToUpstream(2, "", "上游接口返回失败", ""); return responseContent.Error(response.resultMsg ?? "上游接口返回失败"); } // 先查表头 var order = Db.Queryable() .First(o => o.Order_no == order_no); if (order == null) { return responseContent.Error($"未找到入库单号: {order_no}"); } // 查询所有明细是否都已完成 var allDetailsCompleted = Db.Queryable() .Where(d => d.OrderId == order.Id&&d.OrderDetailStatus=="已完成") // 明细表用 OrderId 关联主表 .Count(); if (allDetailsCompleted>0) { // 更新表头状态为已完成 Db.Updateable() .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); } } /// /// 推送异常信息给上游系统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/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); } } } }