using HslCommunication; using MailKit.Search; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Helper; using WIDESEA_ISquareCabinServices; using WIDESEA_Model.Models; 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 { static string SearchDate = ""; public CabinOrderServices(IRepository BaseDal) : base(BaseDal) { } /// /// 获取上游系统的入库单 /// /// /// //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://121.37.118.63:80/GYZ2/95fck/inOrder"; //if (string.IsNullOrEmpty(SearchDate)) SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //// 请求参数 var requestData = new { //searchDate = SearchDate searchDate = "2022-10-10 20:45:16" // 正确的格式 }; //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("无新入库单数据"); } // 获取所有已存在的入库单号 var existingOrderNos = BaseDal.Db.Queryable() .Select(x => x.Order_no) .ToList(); // 过滤掉已存在的入库单 var newOrders = response.data .Where(order => !existingOrderNos.Contains(order.order_no)) .ToList(); if (!newOrders.Any()) { return responseContent.OK("所有入库单已存在,无需新增"); } Db.Ado.BeginTran(); try { List _CabinOrders = new List(); //存储入库单号 List orderNos = new List(); foreach (var order in newOrders) { 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 = "新建", Supplier_name=order.supplier_name, Warehouse_no = order.warehouse_no, Details = order.details.Select(d => new Dt_CabinOrderDetail { //OrderId 要拿到入库单表中的id,如何拿不到就将这个字段改了,改成入库单号 // SqlSugar InsertNav工作原理先插入主表 (Dt_CabinOrder)//获取生成的主键ID//自动设置子表的关联字段 (OrderId)//再插入(Dt_CabinOrderDetail) Goods_no = d.goods_no, Order_qty = d.order_qty, Batch_num = d.batch_num, Exp_date = d.exp_date, OrderDetailStatus="新建", Status = order.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接口,然后改变 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 { //2.查询符合条件的订单(表头 = 新建 && 包含有效明细) //var orders = BaseDal.Db.Queryable() // .Where(o => o.OdrderStatus == "新建") // .Includes(o => o.Details, d => d.MedicineGoods) // .ToList(); //查出包含全部的入库单,包含全部明细+一个明细对应一个商品 var orders = BaseDal.Db.CopyNew() .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) { string materialCode = "YY";//默认值 //获取当前订单的第一个明细项 var firstDetail = order.Details.FirstOrDefault(); if (firstDetail?.MedicineGoods != null && !string.IsNullOrEmpty(firstDetail.MedicineGoods.MaterialCode)) { //如果条件满足,将物料代码设置为第一个明细项对应的药品物料代码 materialCode = firstDetail.MedicineGoods.MaterialCode; } var ediDto = new ToediInInfo { //客户代码 customerCode = "905", //物料类型 materialCode = materialCode, //入库单号 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 = order.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") { // 更新表头状态 BaseDal.Db.Updateable() .SetColumns(o => new Dt_CabinOrder { OdrderStatus = "开始" }) .Where(o => o.Id == order.Id) .ExecuteCommand(); // 更新明细状态为已同步 BaseDal.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 CompleteAllOrders() { var responseContent = new WebResponseContent(); try { // 查找所有“开始”状态的入库单 var orders = BaseDal.Db.Queryable() .Where(o => o.OdrderStatus == "开始") .ToList(); if (orders == null || !orders.Any()) { return responseContent.OK("暂无需要处理的入库单"); } int successCount = 0; int failCount = 0; foreach (var order in orders) { try { BaseDal.Db.Ado.BeginTran(); // 查询该单的明细 var details = BaseDal.Db.Queryable() .Where(d => d.OrderId == order.Id) .ToList(); // 判断是否全部完成 var totalCount = details.Count; var completedCount = details.Count(d => d.OrderDetailStatus == "已完成"); if (totalCount > 0 && completedCount == totalCount) { // 更新表头状态 order.OdrderStatus = "已完成"; BaseDal.Db.Updateable(order).ExecuteCommand(); // 调用上游接口 var url = "http://121.37.118.63:80/GYZ2/95fck/inOrderOk"; var result = HttpHelper.Post(url, new { order_no = order.Order_no }.ToJsonString()); var response = JsonConvert.DeserializeObject(result); if (response.resultCode == "0") { // === 步骤 1:插入历史表 === // 1.1 插入表头历史 var orderHistory = new Dt_CabinOrder_Hty { Id = order.Id, Order_no = order.Order_no, Order_type = order.Order_type, Supplier_no = order.Supplier_no, Supplier_name = order.Supplier_name, Account_tiem = order.Account_tiem, Warehouse_no = order.Warehouse_no, OdrderStatus = order.OdrderStatus, }; var historyId = BaseDal.Db.Insertable(orderHistory).ExecuteReturnIdentity(); // 1.2 插入明细历史 var detailsHistory = details.Select(d => new Dt_CabinOrderDetail_Hty { Id = d.Id, Reservoirarea = d.Reservoirarea, Goods_no = d.Goods_no, Order_qty = d.Order_qty, Order_Inqty = d.Order_Inqty, Batch_num = d.Batch_num, Exp_date = d.Exp_date, OrderDetailStatus = d.OrderDetailStatus, Status = d.Status, }).ToList(); BaseDal.Db.Insertable(detailsHistory).ExecuteCommand(); // === 步骤 2:删除原始表 === BaseDal.Db.Deleteable().Where(d => d.OrderId == order.Id).ExecuteCommand(); BaseDal.Db.Deleteable().Where(o => o.Id == order.Id).ExecuteCommand(); // 提交事务 BaseDal.Db.Ado.CommitTran(); successCount++; } else { BaseDal.Db.Ado.RollbackTran(); failCount++; SendErrorToUpstream(2, "", $"上游接口返回失败: {response.resultMsg}", order.Order_no); } } else { BaseDal.Db.Ado.RollbackTran(); } } catch (Exception ex) { BaseDal.Db.Ado.RollbackTran(); failCount++; SendErrorToUpstream(1, "", ex.Message, order.Order_no); } } return responseContent.OK($"批量处理完成:成功 {successCount} 单,失败 {failCount} 单。"); } catch (Exception ex) { 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://121.37.118.63:80/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); } } } }