using HslCommunication; using Newtonsoft.Json; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_IBasicService; using WIDESEA_ISquareCabinServices; using WIDESEA_IWMsInfoServices; using static WIDESEA_DTO.SquareCabin.OrderDto; using WIDESEA_Model.Models; using WIDESEA_SquareCabinServices; using static WIDESEA_DTO.SquareCabin.TowcsDto; using WIDESEA_Common.WareHouseEnum; using WIDESEA_DTO.SquareCabin; using WIDESEA_Common; using System.Xml.Linq; using WIDESEA_Common.OrderEnum; using static WIDESEA_DTO.SquareCabin.AlarmDto; using OfficeOpenXml.Style; using System.Security.Policy; using SqlSugar; namespace WIDESEA_SquareCabinServices { public partial class Business : IBusiness { private readonly ICabinOrderServices _cabinOrderServices; private readonly ICabinOrderDetailServices _cabinDetailServices; private readonly IDeliveryOrderServices _deliveryOrderServices; private readonly IDeliveryOrderDetailServices _deliveryOrderDetailServices; private readonly IMaterielInfoService _materielInfoService; private readonly IMessageInfoService _messageInfoService; private readonly IUnitOfWorkManage _unitOfWorkManage; public Business(IDeliveryOrderServices deliveryOrderServices, IUnitOfWorkManage unitOfWorkManage, IDeliveryOrderDetailServices deliveryOrderDetailServices, ICabinOrderServices cabinOrderServices, ICabinOrderDetailServices cabinDetailServices, IMaterielInfoService materielInfoService, IMessageInfoService messageInfoService) { _deliveryOrderServices = deliveryOrderServices; _unitOfWorkManage = unitOfWorkManage; _deliveryOrderDetailServices = deliveryOrderDetailServices; _cabinOrderServices = cabinOrderServices; _cabinDetailServices = cabinDetailServices; _materielInfoService = materielInfoService; _messageInfoService = messageInfoService; } #region 下发立库入库单 //public WebResponseContent EdiIn() //{ // try // { // var reslut = WarehouseEnum.立库.ObjToInt().ToString("000"); // var orders = _cabinOrderServices.Repository.QueryData(x => x.OdrderStatus == "新建" && x.Warehouse_no == reslut).ToList(); // if (orders.Count < 1) return WebResponseContent.Instance.OK(); // //string url = "http://172.16.1.2:9357/file-admin/api/in/ediIn"; // var cabinOrderDetails = _cabinDetailServices.Repository.QueryData(x => orders.Select(x => x.Id).ToList().Contains(x.OrderId)).ToList(); // var materielInfos = _materielInfoService.Repository.QueryData(x => cabinOrderDetails.Select(x => x.Goods_no).Contains(x.MaterielCode)).ToList(); // foreach (var order in orders) // { // order.Details = cabinOrderDetails.Where(x => x.OrderId == order.Id).ToList(); // foreach (var item in order.Details) // { // item.MedicineGoods = materielInfos.Where(x => x.MaterielCode == item.Goods_no).First(); // } // #region 下发WCS // string materialCode = order.Details.FirstOrDefault()?.MedicineGoods?.MaterielErpType ?? "YY"; // var ediDto = new ToediInInfo // { // //客户代码 // customerCode = "905", // //物料类型 // materialCode = materialCode, // //入库单号 // externalOrderNo = order.Order_no, // //入库单类型 // inOrderType = order.Order_type == "5" ? "20" : "10", // //优先级 // priority = 0, // //是否取消 // Is_cancel = 0, // details = order.Details.Select(d => new ToediInDetail // { // //批号 // batchNo = d.Batch_num, // //产品 // productCode = d.Goods_no, // //sku名称 // productName = d.MedicineGoods.MaterielName, // //sku规格 // productSpecifications = d.MedicineGoods.MaterielSpec, // //数量 // quantity = (int)d.Order_qty, // //效期 // validityPeriod = d.Exp_date, // //生产厂家 // manufacturer = d.MedicineGoods.Factory, // //房号 // libraryNo = order.Warehouse_no, // }).ToList() // }; // var result = HttpHelper.Post(url, ediDto.ToJsonString()); // var resp = JsonConvert.DeserializeObject>(result); // if (resp != null && resp.code == "0") // { // order.OdrderStatus = "开始"; // foreach (var item in cabinOrderDetails.Where(x => x.OrderId == order.Id)) // { // item.Status = 1; // item.OrderDetailStatus = "开始"; // } // } // #endregion // } // _cabinOrderServices.UpdateData(orders); // _cabinDetailServices.UpdateData(cabinOrderDetails); // return WebResponseContent.Instance.OK(); // } // catch (Exception ex) // { // Console.WriteLine("下发WCS入库单异常:" + ex.Message); // return WebResponseContent.Instance.Error(ex.Message); // } //} #endregion #region 下发立库出库单 //public WebResponseContent EdiOut() //{ // try // { // var reslut = WarehouseEnum.立库.ObjToInt().ToString("000"); // var orders = _deliveryOrderServices.Repository.QueryData(x => x.OutStatus == "新建" && x.Warehouse_no == reslut).ToList(); // if (orders.Count < 1) return WebResponseContent.Instance.OK(); // string url = "http://172.16.1.2:9357/file-admin/api/out/ediOut"; // var deliveryOrderDetails = _deliveryOrderDetailServices.Repository.QueryData(x => orders.Select(x => x.Id).ToList().Contains(x.DeliveryOrderId)).ToList(); // var materielInfos = _materielInfoService.Repository.QueryData(x => deliveryOrderDetails.Select(x => x.Goods_no).Contains(x.MaterielCode)).ToList(); // foreach (var order in orders) // { // order.Details = deliveryOrderDetails.Where(x => x.DeliveryOrderId == order.Id).ToList(); // foreach (var item in order.Details) // { // item.MedicineGoods = materielInfos.Where(x => x.MaterielCode == item.Goods_no).First(); // } // #region 下发WCS // string materialCode = order.Details.FirstOrDefault()?.MedicineGoods?.MaterielErpType ?? "YY"; // var ediDto = new ToediOutInfo // { // //客户代码 // customerCode = "905", // //物料类型 // materialCode = materialCode, // externalOrderNo = order.Out_no, // outOrderType = order.Out_type, // priority = 1, // Is_cancel = 0, // details = order.Details.Select(d => new ToeOutdiInDetail // { // batchNo = d.Batch_num, // productCode = d.Goods_no, // productName = d.MedicineGoods.MaterielName, // productSpecifications = d.MedicineGoods.MaterielModel, // quantity = (int)d.Order_qty, // }).ToList() // }; // switch (order.Out_type) // { // case "1"://正常出库 // case "3"://入库退货 // ediDto.outOrderType = "10";//一般交易出库单 // break; // case "6"://盘亏出库 // ediDto.outOrderType = "30";//盘亏出库单 // break; // } // var result = HttpHelper.Post(url, ediDto.ToJsonString()); // var resp = JsonConvert.DeserializeObject>(result); // if (resp != null && resp.code == "0") // { // order.OutStatus = "开始"; // foreach (var item in deliveryOrderDetails.Where(x => x.DeliveryOrderId == order.Id)) // { // item.Status = 1; // item.OotDetailStatus = "开始"; // } // } // #endregion // } // _deliveryOrderServices.UpdateData(orders); // _deliveryOrderDetailServices.UpdateData(deliveryOrderDetails); // return WebResponseContent.Instance.OK(); // } // catch (Exception ex) // { // Console.WriteLine("下发WCS出库单异常:" + ex.Message); // return WebResponseContent.Instance.Error(ex.Message); // } //} #endregion // 使用 SqlSugar 的 Ado.Connection 手动管理 #region 下发立库入库单 public WebResponseContent EdiIn() { // 创建独立的 SqlSugarClient using (var db = new SqlSugarClient(new ConnectionConfig { ConnectionString = "Data Source=.;Initial Catalog=WIDESEA_WMSDBF_Z22;User ID=sa;Password=48PYX_h7KS@f;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False", DbType = DbType.SqlServer, IsAutoCloseConnection = true, // 关键配置,自动关闭连接 MoreSettings = new ConnMoreSettings() { IsAutoRemoveDataCache = true } })) { try { var reslut = WarehouseEnum.立库.ObjToInt().ToString("000"); // 使用新的 db 实例执行所有查询 var orders = db.Queryable() .Where(x => x.OdrderStatus == "新建" && x.Warehouse_no == reslut) .ToList(); if (orders.Count < 1) return WebResponseContent.Instance.OK(); string url = "http://172.16.1.2:9357/file-admin/api/in/ediIn"; var orderIds = orders.Select(x => x.Id).ToList(); var cabinOrderDetails = db.Queryable() .Where(x => orderIds.Contains(x.OrderId)) .ToList(); var goodsCodes = cabinOrderDetails.Select(x => x.Goods_no).Distinct().ToList(); var materielInfos = db.Queryable() .Where(x => goodsCodes.Contains(x.MaterielCode)) .ToList(); foreach (var order in orders) { order.Details = cabinOrderDetails.Where(x => x.OrderId == order.Id).ToList(); foreach (var item in order.Details) //手动创建与物料表的连接 { item.MedicineGoods = materielInfos.Where(x => x.MaterielCode == item.Goods_no).First(); } #region 下发WCS string materialCode = order.Details.FirstOrDefault()?.MedicineGoods?.MaterielErpType ?? "YY"; var ediDto = new ToediInInfo { customerCode = "905", materialCode = materialCode, externalOrderNo = order.Order_no, inOrderType = order.Order_type == "5" ? "20" : "10", priority = 0, Is_cancel = 0, details = order.Details.Select(d => new ToediInDetail { batchNo = d.Batch_num, productCode = d.Goods_no, productName = d.MedicineGoods.MaterielName, productSpecifications = d.MedicineGoods.MaterielSpec, quantity = (int)d.Order_qty, validityPeriod = d.Exp_date, manufacturer = d.MedicineGoods.Factory, libraryNo = order.Warehouse_no, }).ToList() }; var result = HttpHelper.Post(url, ediDto.ToJsonString()); var resp = JsonConvert.DeserializeObject>(result); if (resp != null && resp.code == "0") { order.OdrderStatus = "开始"; foreach (var item in cabinOrderDetails.Where(x => x.OrderId == order.Id)) { item.Status = 1; item.OrderDetailStatus = "开始"; } } #endregion } // 使用同一个 db 实例执行更新 db.Updateable(orders).ExecuteCommand(); db.Updateable(cabinOrderDetails).ExecuteCommand(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { Console.WriteLine("下发WCS入库单异常:" + ex.Message); return WebResponseContent.Instance.Error(ex.Message); } } // 这里会自动关闭连接,不需要手动管理 } #endregion #region 下发立库出库单 public WebResponseContent EdiOut() { using (var db = new SqlSugarClient(new ConnectionConfig { ConnectionString = "Data Source=.;Initial Catalog=WIDESEA_WMSDBF_Z22;User ID=sa;Password=48PYX_h7KS@f;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False", DbType = DbType.SqlServer, IsAutoCloseConnection = true, // 关键配置,自动关闭连接 MoreSettings = new ConnMoreSettings() { IsAutoRemoveDataCache = true } })) { try { var reslut = WarehouseEnum.立库.ObjToInt().ToString("000"); var orders = db.Queryable().Where(x => x.OutStatus == "新建" && x.Warehouse_no == reslut).ToList(); if (orders.Count < 1) { return WebResponseContent.Instance.OK(); } string url = "http://172.16.1.2:9357/file-admin/api/out/ediOut"; var deliveryOrderDetails = db.Queryable().Where(x => orders.Select(x => x.Id).ToList().Contains(x.DeliveryOrderId)).ToList(); var materielInfos = db.Queryable().Where(x => deliveryOrderDetails.Select(x => x.Goods_no).Contains(x.MaterielCode)).ToList(); foreach (var order in orders) { order.Details = deliveryOrderDetails.Where(x => x.DeliveryOrderId == order.Id).ToList(); #region 下发WCS foreach (var item in order.Details) //手动创建与物料表的连接 { item.MedicineGoods = materielInfos.Where(x => x.MaterielCode == item.Goods_no).First(); } string materialCode = order.Details.FirstOrDefault()?.MedicineGoods?.MaterielErpType ?? "YY"; var ediDto = new ToediOutInfo { //客户代码 customerCode = "905", //物料类型 materialCode = materialCode, externalOrderNo = order.Out_no, outOrderType = order.Out_type, priority = 1, Is_cancel = 0, details = order.Details.Select(d => new ToeOutdiInDetail { batchNo = d.Batch_num, productCode = d.Goods_no, productName = d.MedicineGoods.MaterielName, productSpecifications = d.MedicineGoods.MaterielModel, quantity = (int)d.Order_qty, }).ToList() }; switch (order.Out_type) { case "1"://正常出库 case "3"://入库退货 ediDto.outOrderType = "10";//一般交易出库单 break; case "6"://盘亏出库 ediDto.outOrderType = "30";//盘亏出库单 break; } var result = HttpHelper.Post(url, ediDto.ToJsonString()); var resp = JsonConvert.DeserializeObject>(result); if (resp != null && resp.code == "0") { order.OutStatus = "开始"; foreach (var item in deliveryOrderDetails.Where(x => x.DeliveryOrderId == order.Id)) { item.Status = 1; item.OotDetailStatus = "开始"; } } #endregion } db.Updateable(orders).ExecuteCommand(); db.Updateable(deliveryOrderDetails).ExecuteCommand(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { Console.WriteLine("下发WCS出库单异常:" + ex.Message); return WebResponseContent.Instance.Error(ex.Message); } } } #endregion #region 入库完成上报ERP /// /// 入库报完成接口 /// /// 入库单号 //先检查是否所有明细都已完成,如果是,那么更新表头状态为已完成 /// public WebResponseContent CompleteAllOrders() { var responseContent = new WebResponseContent(); try { #region 查找所有已完成入库单 var inorders = _cabinOrderServices.Repository.QueryData(x => x.OdrderStatus == "已完成").Select(x => x.Order_no).Distinct().ToList(); var Orders = _cabinOrderServices.Db.Queryable().Where(x => inorders.Contains(x.Order_no)).Includes(x => x.Details).ToList(); List cabinOrders = new List(); List cabinOrderDetails = new List(); var url = "http://192.168.1.100:80/GYZ2/95fck/inOrderOk"; foreach (var item in Orders.GroupBy(x => x.Order_no)) { //只有当该订单号下的所有记录都是"已完成"状态时,才继续处理 if (!item.Where(x => x.OdrderStatus != "已完成").Any()) { if (item.First().Order_type == InOrderTypeEnum.Allocat.ObjToInt().ToString())//如果是调拨单 { foreach (var a in item) { if (a.Details != null) cabinOrderDetails.AddRange(a.Details); a.Details = null; cabinOrders.Add(a); } } else { if (item.First().Order_type == "2") url = "http://192.168.1.100:80/GYZ2/95fck/outOrderOk";//出库退货 var result = HttpHelper.Post(url, new { order_no = item.Key }.ToJsonString()); var response = JsonConvert.DeserializeObject(result); if (response != null && response.resultCode == "0") { foreach (var a in item) { if (a.Details != null) cabinOrderDetails.AddRange(a.Details); a.Details = null; cabinOrders.Add(a); } } else { string mess = "上报ERP无响应"; if (response != null) mess = response.resultMsg; _messageInfoService.AddMessageInfo(MessageGroupByEnum.InOrderAlarm, $"入库单号【{item.Key}】完成上报ERP失败", mess); continue; } } } } _cabinDetailServices.Repository.DeleteAndMoveIntoHty(cabinOrderDetails, OperateTypeEnum.自动完成); _cabinOrderServices.Repository.DeleteAndMoveIntoHty(cabinOrders, OperateTypeEnum.自动完成); #endregion return responseContent.OK(); } catch (Exception ex) { return responseContent.Error("批量处理失败:" + ex.Message); } } #endregion #region 出库完成上报ERP /// /// 出库报完成接口 /// /// 出库单号 /// public WebResponseContent CompleteAllOutOrders() { var responseContent = new WebResponseContent(); try { #region 查找所有已完成出库单 var outorders = _deliveryOrderServices.Repository.QueryData(x => x.OutStatus == "已完成").Select(x => x.Out_no).Distinct().ToList(); var Orders = _deliveryOrderServices.Db.Queryable().Where(x => outorders.Contains(x.Out_no)).Includes(x => x.Details).ToList(); List cabinOrders = new List(); List cabinOrderDetails = new List(); var url = "http://192.168.1.100:80/GYZ2/95fck/outOrderOk"; foreach (var item in Orders.GroupBy(x => x.Out_no)) { if (!item.Where(x => x.OutStatus != "已完成").Any()) { if (item.First().Out_type == OutOrderTypeEnum.Allocate.ObjToInt().ToString()) { foreach (var a in item) { if (a.Details != null) cabinOrderDetails.AddRange(a.Details); a.Details = null; cabinOrders.Add(a); } } else { if (item.First().Out_type == "3") url = "http://192.168.1.100:80/GYZ2/95fck/inOrderOk";//入库退货 出库单 var result = HttpHelper.Post(url, new { order_no = item.Key }.ToJsonString()); var response = JsonConvert.DeserializeObject(result); if (response != null && response.resultCode == "0") { foreach (var a in item) { if (a.Details != null) cabinOrderDetails.AddRange(a.Details); a.Details = null; cabinOrders.Add(a); } } else { string mess = "上报ERP无响应"; if (response != null) mess = response.resultMsg; _messageInfoService.AddMessageInfo(MessageGroupByEnum.InOrderAlarm, $"出库单号【{item.Key}】完成上报ERP失败", mess); continue; } } } } _deliveryOrderDetailServices.Repository.DeleteAndMoveIntoHty(cabinOrderDetails, OperateTypeEnum.自动完成); _deliveryOrderServices.Repository.DeleteAndMoveIntoHty(cabinOrders, OperateTypeEnum.自动完成); #endregion return responseContent.OK(); } catch (Exception ex) { return responseContent.Error("批量处理失败:" + ex.Message); } } #endregion } }