using HslCommunication; using MailKit.Search; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Common; using WIDESEA_Common.LocationEnum; using WIDESEA_Common.OrderEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Common.TaskEnum; using WIDESEA_Common.WareHouseEnum; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_DTO.SquareCabin; using WIDESEA_IBasicService; using WIDESEA_ISquareCabinServices; using WIDESEA_IWMsInfoServices; 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 { private readonly IBasicService _basicService; private readonly IMedicineGoodsServices _medicineGoodsServices; private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IInventory_BatchServices _inventory_BatchServices; private readonly IInventoryInfoService _inventoryInfoService; private readonly ICabinOrderDetailServices _cabinOrderDetailServices; private readonly ISupplyTaskService _supplyTaskService; private readonly ISupplyTaskHtyService _supplyTaskHtyService; public IRepository Repository => BaseDal; public CabinOrderServices(IRepository BaseDal, IBasicService basicService, IMedicineGoodsServices medicineGoodsServices, IUnitOfWorkManage unitOfWorkManage, IInventory_BatchServices inventory_BatchServices, IInventoryInfoService inventoryInfoService, ICabinOrderDetailServices cabinOrderDetailServices, ICabinOrderHtyServices cabinOrderHtyServices, ICabinOrderDetailHtyServices cabinOrderDetailHtyServices, ISupplyTaskService supplyTaskService, ISupplyTaskHtyService supplyTaskHtyService) : base(BaseDal) { _basicService = basicService; _medicineGoodsServices = medicineGoodsServices; _unitOfWorkManage = unitOfWorkManage; _inventory_BatchServices = inventory_BatchServices; _inventoryInfoService = inventoryInfoService; _cabinOrderDetailServices = cabinOrderDetailServices; _supplyTaskService = supplyTaskService; _supplyTaskHtyService = supplyTaskHtyService; } /// /// pda查询出库单信息 /// /// /// public WebResponseContent GetCabinOrders(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); try { int pageNo = saveModel.MainData["pageNo"].ObjToInt(); string warehouseCode = saveModel.MainData["warehouseId"].ToString(); string orderNo = saveModel.MainData["orderNo"].ToString(); List dt_ReceiveOrders = new List(); if (string.IsNullOrEmpty(orderNo)) { dt_ReceiveOrders = Db.Queryable().Where(x => (x.OdrderStatus == "新建" || x.OdrderStatus == "开始") && x.Warehouse_no == warehouseCode).Includes(x => x.Details).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 5); } else { dt_ReceiveOrders = Db.Queryable().Where(x => (x.Order_no.Contains(orderNo) || x.Supplier_no.Contains(orderNo)) && (x.OdrderStatus == "新建" || x.OdrderStatus == "开始") && x.Warehouse_no == warehouseCode).OrderByDescending(x => x.CreateDate).Includes(x => x.Details).ToPageList(pageNo, 5); } content.OK(data: dt_ReceiveOrders); } catch (Exception) { throw; } return content; } /// /// pda查看入库详情表 /// /// /// /// public WebResponseContent GetCabinOrderDetail(int pageNo, string orderNo) { WebResponseContent content = new WebResponseContent(); Dt_CabinOrder cabinOrder = Db.Queryable().Includes(x => x.Details).First(x => x.Order_no == orderNo); List cabinOrderDetails = cabinOrder.Details.Where(x => x.Status == 2 && x.OrderDetailStatus != "已完成").ToList(); content.OK(data: cabinOrderDetails); return content; } /// /// Pad入库完成 /// /// /// public WebResponseContent FeedbackIn([FromBody] SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); try { var LocationCode = saveModel.MainData["LocationCode"].ToString(); var orderNo = saveModel.MainData["orderNo"].ToString(); var batchNo = saveModel.MainData["batchNo"].ToString(); var materielCode = saveModel.MainData["materielCode"].ToString(); var Inqty = saveModel.MainData["Inqty"].ObjToInt(); var warehouseCode = saveModel.MainData["warehouseCode"].ToString(); Dt_CabinOrder cabinOrder = BaseDal.Db.Queryable().Where(x => x.Order_no == orderNo && x.Warehouse_no == warehouseCode).Includes(x => x.Details).First(); if (cabinOrder == null || cabinOrder.OdrderStatus == "已完成") return WebResponseContent.Instance.Error($"入库单已完成"); Dt_CabinOrderDetail cabinOrderDetail = cabinOrder.Details.Where(x => x.Goods_no == materielCode && x.Batch_num == batchNo && x.Status == 2).FirstOrDefault(); if (cabinOrderDetail == null || cabinOrderDetail.OrderDetailStatus == "已完成") return WebResponseContent.Instance.Error($"入库单明细已完成"); Dt_MaterielInfo materielInfo = _basicService.MaterielInfoService.Repository.QueryFirst(x => x.MaterielCode == cabinOrderDetail.Goods_no); if (materielInfo == null) return WebResponseContent.Instance.Error($"请维护物料编号【{cabinOrderDetail.Goods_no}】的物料信息"); cabinOrderDetail.Order_Inqty += Inqty; if (cabinOrderDetail.Order_Inqty > cabinOrderDetail.Order_qty) return WebResponseContent.Instance.Error($"入库数量不可超出单据数量"); #region 处理入库单,货位,库存,库存批次信息 _unitOfWorkManage.BeginTran(); #region 入库单 cabinOrder.OdrderStatus = "开始"; cabinOrderDetail.OrderDetailStatus = "开始"; if (cabinOrderDetail.Order_Inqty == cabinOrderDetail.Order_qty) { cabinOrderDetail.OrderDetailStatus = "已完成"; } _cabinOrderDetailServices.Repository.UpdateData(cabinOrderDetail); var cabinOrder1 = BaseDal.Db.Queryable().Where(x => x.Order_no == cabinOrder.Order_no && x.Warehouse_no == warehouseCode).Includes(x => x.Details).First(); if (!cabinOrder1.Details.Where(x => x.OrderDetailStatus != "已完成").Any()) cabinOrder.OdrderStatus = "已完成"; Repository.UpdateData(cabinOrder); #endregion #region 货位 var location = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == LocationCode); if (location == null) return WebResponseContent.Instance.Error($"请维护货位编号【{LocationCode}】的货位信息"); if (location.EnableStatus == EnableStatusEnum.Disable.ObjToInt()) return WebResponseContent.Instance.Error($"货位编号【{LocationCode}】已禁用,请恢复正常再使用"); if (location.WarehouseCode != cabinOrderDetail.Reservoirarea) return WebResponseContent.Instance.Error($"货位编号【{LocationCode}】所属库房与当前入库单所属库房不匹配"); if (location.LocationStatus == LocationStatusEnum.Free.ObjToInt()) { location.LocationStatus = LocationStatusEnum.InStock.ObjToInt(); _basicService.LocationInfoService.UpdateData(location); } #endregion #region 库存 Dt_InventoryInfo inventoryInfo = _inventoryInfoService.Repository.QueryFirst(x => x.BatchNo == cabinOrderDetail.Batch_num && x.MaterielCode == cabinOrderDetail.Goods_no && x.LocationCode == LocationCode); if (inventoryInfo != null) { inventoryInfo.StockQuantity += Inqty; inventoryInfo.AvailableQuantity += Inqty; inventoryInfo.InDate = DateTime.Now; _inventoryInfoService.UpdateData(inventoryInfo); } else { inventoryInfo = new Dt_InventoryInfo() { LocationCode = LocationCode, MaterielCode = materielInfo.MaterielCode, MaterielName = materielInfo.MaterielName, MaterielSpec = materielInfo.MaterielSpec, OutboundQuantity = 0, StockQuantity = Inqty, AvailableQuantity = Inqty, StockStatus = StockStatusEmun.入库完成.ObjToInt(), ValidityPeriod = cabinOrderDetail.Exp_date, WarehouseCode = cabinOrderDetail.Reservoirarea, SupplyQuantity = 0, InDate = DateTime.Now, BatchNo = cabinOrderDetail.Batch_num, Creater = App.User.UserName, CreateDate = DateTime.Now, }; _inventoryInfoService.AddData(inventoryInfo); } #endregion #region 任务记录 #region MyRegion //Dt_SupplyTask supplyTask = new Dt_SupplyTask() //{ // WarehouseCode = cabinOrderDetail.Reservoirarea, // TaskNum = cabinOrderDetail.Id, // TaskStatus = SupplyStatusEnum.InFinish.ObjToInt(), // BatchNo = inventoryInfo.BatchNo, // MaterielName = inventoryInfo.MaterielName, // MaterielCode = inventoryInfo.MaterielCode, // MaterielSpec = inventoryInfo.MaterielSpec, // TaskType = TaskTypeEnum.InPick.ObjToInt(), // CreateDate = DateTime.Now, // Creater = App.User.UserName, // LocationCode = location.LocationCode, // OrderNo = cabinOrder.Order_no, // StockQuantity = Inqty, // SupplyQuantity = 0, // Remark = "入库" //}; //_supplyTaskService.AddData(supplyTask); #endregion Dt_SupplyTask_Hty supplyTask_Hty = new Dt_SupplyTask_Hty() { WarehouseCode = cabinOrderDetail.Reservoirarea, TaskNum = cabinOrderDetail.Id, OperateType = OperateTypeEnum.人工完成.ToString(), InsertTime = DateTime.Now, TaskStatus = SupplyStatusEnum.InFinish.ObjToInt(), BatchNo = inventoryInfo.BatchNo, MaterielName = inventoryInfo.MaterielName, MaterielCode = inventoryInfo.MaterielCode, MaterielSpec = inventoryInfo.MaterielSpec, TaskType = TaskTypeEnum.InPick.ObjToInt(), CreateDate = DateTime.Now, Creater = App.User.UserName, LocationCode = location.LocationCode, OrderNo = cabinOrder.Order_no, StockQuantity = Inqty, SupplyQuantity = 0, Remark = "入库" }; _supplyTaskHtyService.AddData(supplyTask_Hty); #endregion #region 库存批次 Dt_Inventory_Batch inventory_Batch = _inventory_BatchServices.Repository.QueryFirst(x => x.BatchNo == inventoryInfo.BatchNo && x.MaterielCode == inventoryInfo.MaterielCode); if (inventory_Batch != null) { inventory_Batch.StockQuantity += Inqty; inventory_Batch.AvailableQuantity += Inqty; _inventory_BatchServices.UpdateData(inventory_Batch); } else { inventory_Batch = new Dt_Inventory_Batch() { BatchNo = inventoryInfo.BatchNo, CreateDate = inventoryInfo.CreateDate, Creater = inventoryInfo.Creater, MaterielCode = inventoryInfo.MaterielCode, ERPStockQuantity = 0, MaterielName = inventoryInfo.MaterielName, MaterielSpec = inventoryInfo.MaterielSpec, OutboundQuantity = inventoryInfo.OutboundQuantity, ProductionDate = inventoryInfo.ProductionDate, Status = false, StockQuantity = inventoryInfo.StockQuantity, AvailableQuantity = inventoryInfo.StockQuantity, ValidityPeriod = inventoryInfo.ValidityPeriod, SupplyQuantity = inventoryInfo.SupplyQuantity, }; _inventory_BatchServices.AddData(inventory_Batch); } #endregion _unitOfWorkManage.CommitTran(); #endregion content.OK(cabinOrderDetail.Order_Inqty.ToString()); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); content.Error(ex.Message); } return content; } static string SearchDate = "2025-09-10 00:00:00"; /// /// 获取上游系统的入库单 /// /// /// public WebResponseContent GetUpstreamOrder() { var responseContent = new WebResponseContent(); try { // 请求地址 var url = "http://121.37.118.63:80/GYZ2/95fck/inOrder"; //var url = "http://127.0.0.1:4523/m2/5660322-5340849-default/363009261"; 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) { if (order.order_type == "1") //正常入库 { responseContent = CreateInboundOrder(order); List? dt_CabinOrders = responseContent.Data as List; if (dt_CabinOrders != null) _CabinOrders.AddRange(dt_CabinOrders); } else { //创建出库单 } }; BaseDal.Db.InsertNav(_CabinOrders).Include(x => x.Details).ExecuteCommand(); //在下发给wcs //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); } } #region 创建入库单 /// /// 创建入库单,返回一个入库单集合到data /// public WebResponseContent CreateInboundOrder(UpstreamOrderInfo order) { WebResponseContent webResponseContent = new WebResponseContent(); try { List dt_CabinOrders = new List(); #region 特殊药品入特殊库房 if (order.warehouse_no == WarehouseEnum.麻精库.ObjToInt().ToString("000") || order.warehouse_no == WarehouseEnum.冷冻库.ObjToInt().ToString("000")) { 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 { Goods_no = d.goods_no, Order_qty = Math.Abs(d.order_qty), Batch_num = d.batch_num, Exp_date = d.exp_date, OrderDetailStatus = "新建", Status = 2, //如果是001房那么就是未同步状态,如果不是001房那么就是无需同步状态 }).ToList() }; dt_CabinOrders.Add(entityOrder); webResponseContent.OK(data: dt_CabinOrders); } #endregion else { 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 = WarehouseEnum.大件库.ObjToInt().ToString("000"), Details = new List() }; var entityOrderLK = 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 = WarehouseEnum.立库.ObjToInt().ToString("000"), Details = new List() }; foreach (var item in order.details) { // 将上游入库数量转为正数 item.order_qty = Math.Abs(item.order_qty); #region 根据物料编码查询物料信息 Dt_MaterielInfo materielInfo = _basicService.MaterielInfoService.Repository.QueryFirst(x => x.MaterielCode == item.goods_no); if (materielInfo == null) throw new Exception($"未找到药品编码【{item.goods_no}】的信息"); if (!Enum.IsDefined(typeof(MaterielSourceTypeEnum), materielInfo.MaterielSourceType)) throw new Exception($"请设置药品编号【{item.goods_no}】的属性分类"); if (materielInfo.BoxQty < 1) throw new Exception($"请设置药品编号【{item.goods_no}】的箱规数量"); if (materielInfo.MinQty < 1) throw new Exception($"请设置药品编号【{item.goods_no}】的立库最低库存数"); #endregion #region 大件 if (materielInfo.MaterielSourceType == MaterielSourceTypeEnum.PurchasePart)//如果物料是大件 { Dt_CabinOrderDetail orderDetail = new Dt_CabinOrderDetail() { Reservoirarea = entityOrder.Warehouse_no, Goods_no = item.goods_no, Order_qty = item.order_qty, Batch_num = item.batch_num, Exp_date = item.exp_date, OrderDetailStatus = "新建", Status = 2 }; entityOrder.Details.Add(orderDetail); } #endregion else { Dt_CabinOrderDetail orderDetail = null; var ys = item.order_qty % materielInfo.BoxQty; //不能整除箱规的散件数 var xs = (int)(item.order_qty / materielInfo.BoxQty);//保留整数 #region 判断是否有散件 if (ys > 0) { orderDetail = new Dt_CabinOrderDetail() { Reservoirarea = entityOrderLK.Warehouse_no, Goods_no = item.goods_no, Order_qty = ys, Batch_num = item.batch_num, Exp_date = item.exp_date, OrderDetailStatus = "新建", Status = 0 }; materielInfo.Business_qty += ys; } #endregion #region 判断立库库存是否大于立库最低库存数 while (materielInfo.Business_qty < materielInfo.MinQty && xs > 0) //当业务数量和整箱数都大于0的时候才会停止循环 { xs--; if (orderDetail == null) { orderDetail = new Dt_CabinOrderDetail() { Reservoirarea = entityOrderLK.Warehouse_no, Goods_no = item.goods_no, Order_qty = materielInfo.BoxQty, Batch_num = item.batch_num, Exp_date = item.exp_date, OrderDetailStatus = "新建", Status = 0 }; materielInfo.Business_qty += materielInfo.BoxQty; } else { orderDetail.Order_qty += materielInfo.BoxQty; materielInfo.Business_qty += materielInfo.BoxQty; } } if (orderDetail != null) entityOrderLK.Details.Add(orderDetail); #endregion #region 剩余整件入平库 if (xs > 0) { orderDetail = new Dt_CabinOrderDetail() { Reservoirarea = entityOrder.Warehouse_no, Goods_no = item.goods_no, Order_qty = materielInfo.BoxQty * xs, Batch_num = item.batch_num, Exp_date = item.exp_date, OrderDetailStatus = "新建", Status = 2 }; entityOrder.Details.Add(orderDetail); } #endregion } _basicService.MaterielInfoService.Repository.UpdateData(materielInfo); } if (entityOrder.Details.Count > 0) dt_CabinOrders.Add(entityOrder); if (entityOrderLK.Details.Count > 0) dt_CabinOrders.Add(entityOrderLK); webResponseContent.OK(data: dt_CabinOrders); } } catch (Exception ex) { webResponseContent.Error(ex.Message); } return webResponseContent; } #endregion /// /// 传给wcs /// public WebResponseContent EdiIn() { try { //2.查询符合条件的订单(表头 = 新建 && 包含有效明细) //var orders = BaseDal.Db.Queryable() // .Where(o => o.OdrderStatus == "新建") // .Includes(o => o.Details, d => d.MedicineGoods) // .ToList(); //查出包含全部的入库单,包含全部明细+一个明细对应一个商品 var reslut = WarehouseEnum.立库.ObjToInt().ToString("000"); var orders = BaseDal.Db.CopyNew() .Queryable() .Where(o => o.OdrderStatus == "新建" && o.Warehouse_no == reslut) .Includes(o => o.Details, d => d.MedicineGoods) .ToList(); // 3. 再过滤掉不符合条件的明细(只保留 Status=0) foreach (var order in orders) { Console.WriteLine($"订单 {order.Order_no} 原明细数:{order.Details.Count}"); order.Details = order.Details.Where(d => d.Status == 0).ToList(); Console.WriteLine($"订单 {order.Order_no} 过滤后明细数:{order.Details.Count}"); } if (orders == null || !orders.Any()) { Console.WriteLine("没有符合条件的订单需要推送"); return WebResponseContent.Instance.Error("没有符合条件的订单需要推送"); } // 4. 遍历订单,组装 DTO 并推送 foreach (var order in orders) { // 从第一个有 MedicineGoods 的明细中取出 MaterielErpType string materialCode = order.Details .Select(d => d.MedicineGoods?.MaterielErpType) .FirstOrDefault(x => !string.IsNullOrEmpty(x)) ?? "YY"; // 默认值YY 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?.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 url = "http://172.16.1.2:9357/file-admin/api/in/ediIn"; //var url = "http://127.0.0.1:4523/m2/5660322-5340849-default/363019549"; 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 { #region 查找所有已完成入库单 var inorders = BaseDal.QueryData(x => x.OdrderStatus == "已完成").Select(x => x.Order_no).Distinct().ToList(); foreach (var inorder in inorders) { //var Orders = BaseDal.QueryData(x => x.Order_no == inorder); var Orders = BaseDal.Db.Queryable().Where(x => x.Order_no == inorder).Includes(x => x.Details).ToList(); if (!Orders.Where(x => x.OdrderStatus != "已完成").Any()) { BaseDal.Db.Ado.BeginTran(); BaseDal.DeleteAndMoveIntoHty(Orders, OperateTypeEnum.自动完成); foreach (var item in Orders) { _cabinOrderDetailServices.Repository.DeleteAndMoveIntoHty(item.Details, OperateTypeEnum.自动完成); } // 调用上游接口 var url = "http://121.37.118.63:80/GYZ2/95fck/inOrderOk"; var result = HttpHelper.Post(url, new { order_no = inorder }.ToJsonString()); var response = JsonConvert.DeserializeObject(result); if (response.resultCode == "0") { // 提交事务 BaseDal.Db.Ado.CommitTran(); } else { BaseDal.Db.Ado.RollbackTran(); SendErrorToUpstream(2, "", $"上游接口返回失败: {response.resultMsg}", inorder); } } } #endregion return responseContent.OK(); } catch (Exception ex) { BaseDal.Db.Ado.RollbackTran(); 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); } } } }