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_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; 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 { static string SearchDate = ""; 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; 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) : base(BaseDal) { _basicService = basicService; _medicineGoodsServices = medicineGoodsServices; _unitOfWorkManage = unitOfWorkManage; _inventory_BatchServices = inventory_BatchServices; _inventoryInfoService = inventoryInfoService; _cabinOrderDetailServices = cabinOrderDetailServices; _supplyTaskService = supplyTaskService; } /// /// 获取上游系统的入库单 /// /// /// //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 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; } 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.Reservoirarea == pageNo.ToString()).ToList(); content.OK(data: cabinOrderDetails); return content; } 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 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) return WebResponseContent.Instance.Error($"入库单已完成"); Dt_CabinOrderDetail cabinOrderDetail = cabinOrder.Details.Where(x => x.Batch_num == batchNo && x.Reservoirarea == warehouseCode).First(); if (cabinOrderDetail == null) 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.DeleteAndMoveIntoHty(cabinOrderDetail, OperateTypeEnum.自动完成); } else { _cabinOrderDetailServices.Repository.UpdateData(cabinOrderDetail); } var cabinOrder1 = BaseDal.Db.Queryable().Where(x => x.Order_no == cabinOrder.Order_no).Includes(x => x.Details).First(); if (cabinOrder1.Details == null || cabinOrder1.Details.Count < 1) 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.LocationStatus != LocationStatusEnum.InStock.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; _inventoryInfoService.UpdateData(inventoryInfo); } else { inventoryInfo = new Dt_InventoryInfo() { LocationCode = LocationCode, MaterielCode = materielInfo.MaterielCode, MaterielName = materielInfo.MaterielName, MaterielSpec = materielInfo.MaterielSpec, OutboundQuantity = 0, StockQuantity = 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 任务记录 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 #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_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, 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; } 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 = new List() //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() }; 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); Dt_MedicineGoods materielInfo = BaseDal.Db.Queryable().Where(x => x.Goods_no == item.goods_no).First(); ///根据物料信息大小件属性区分是否入立库 //大件入平库 if (materielInfo.MaterielSourceType == MaterielSourceTypeEnum.PurchasePart) { Dt_CabinOrderDetail orderDetail = new Dt_CabinOrderDetail() { Reservoirarea = order.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); } else { Dt_CabinOrderDetail orderDetail = null; var ys = item.order_qty % materielInfo.BoxQty; //不能整除箱规的散件数 var xs = item.order_qty / materielInfo.BoxQty;//整箱数量 #region 生成立库入库单 #region 判断是否有散件 if (ys > 0) { orderDetail = new Dt_CabinOrderDetail() { Reservoirarea = order.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) { xs--; if (orderDetail == null) { orderDetail = new Dt_CabinOrderDetail() { Reservoirarea = order.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; } } #endregion if (orderDetail != null) entityOrder.Details.Add(orderDetail); #endregion #region 剩余整件入平库 if (xs > 0) { orderDetail = new Dt_CabinOrderDetail() { Reservoirarea = order.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); _medicineGoodsServices.Db.Updateable(materielInfo).ExecuteCommand(); #endregion } _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); } } } }