dengjunjie
2025-10-24 d55ef610a530c2ab0a30d6ecdc1e7e4ab54cc896
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/CabinOrderServices.cs
@@ -1,6 +1,7 @@
using HslCommunication;
using MailKit.Search;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.SqlClient;
using Newtonsoft.Json;
using SqlSugar;
using System;
@@ -13,11 +14,13 @@
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;
@@ -32,17 +35,18 @@
{
    public class CabinOrderServices : ServiceBase<Dt_CabinOrder, IRepository<Dt_CabinOrder>>, 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 IDeliveryOrderServices _eliveryOrderServices;
        private readonly ISupplyTaskService _supplyTaskService;
        private readonly ISupplyTaskHtyService _supplyTaskHtyService;
        public IRepository<Dt_CabinOrder> Repository => BaseDal;
        public CabinOrderServices(IRepository<Dt_CabinOrder> BaseDal, IBasicService basicService, IMedicineGoodsServices medicineGoodsServices, IUnitOfWorkManage unitOfWorkManage, IInventory_BatchServices inventory_BatchServices, IInventoryInfoService inventoryInfoService, ICabinOrderDetailServices cabinOrderDetailServices, ICabinOrderHtyServices cabinOrderHtyServices, ICabinOrderDetailHtyServices cabinOrderDetailHtyServices, ISupplyTaskService supplyTaskService) : base(BaseDal)
        public CabinOrderServices(IRepository<Dt_CabinOrder> BaseDal, IBasicService basicService, IMedicineGoodsServices medicineGoodsServices, IUnitOfWorkManage unitOfWorkManage, IInventory_BatchServices inventory_BatchServices, IInventoryInfoService inventoryInfoService, ICabinOrderDetailServices cabinOrderDetailServices, ICabinOrderHtyServices cabinOrderHtyServices, ICabinOrderDetailHtyServices cabinOrderDetailHtyServices, ISupplyTaskService supplyTaskService, ISupplyTaskHtyService supplyTaskHtyService, IDeliveryOrderServices eliveryOrderServices) : base(BaseDal)
        {
            _basicService = basicService;
            _medicineGoodsServices = medicineGoodsServices;
@@ -51,6 +55,8 @@
            _inventoryInfoService = inventoryInfoService;
            _cabinOrderDetailServices = cabinOrderDetailServices;
            _supplyTaskService = supplyTaskService;
            _supplyTaskHtyService = supplyTaskHtyService;
            _eliveryOrderServices = eliveryOrderServices;
        }
@@ -98,7 +104,7 @@
        {
            WebResponseContent content = new WebResponseContent();
            Dt_CabinOrder cabinOrder = Db.Queryable<Dt_CabinOrder>().Includes(x => x.Details).First(x => x.Order_no == orderNo);
            List<Dt_CabinOrderDetail> cabinOrderDetails = cabinOrder.Details.Where(x => x.Status == 2).ToList();
            List<Dt_CabinOrderDetail> cabinOrderDetails = cabinOrder.Details.Where(x => x.Status == 2 && x.OrderDetailStatus != "已完成").ToList();
            content.OK(data: cabinOrderDetails);
            return content;
        }
@@ -117,13 +123,15 @@
                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<Dt_CabinOrder>().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();
                Dt_CabinOrderDetail cabinOrderDetail = cabinOrder.Details.Where(x => x.Batch_num == batchNo && x.Status == 2).First();
                if (cabinOrderDetail == null) return WebResponseContent.Instance.Error($"入库单明细已完成");
                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;
@@ -139,41 +147,10 @@
                if (cabinOrderDetail.Order_Inqty == cabinOrderDetail.Order_qty)
                {
                    cabinOrderDetail.OrderDetailStatus = "已完成";
                    //_cabinOrderDetailServices.Repository.DeleteAndMoveIntoHty(cabinOrderDetail, OperateTypeEnum.自动完成);
                    Dt_CabinOrderDetail_Hty hty = new Dt_CabinOrderDetail_Hty
                    {
                        Id = cabinOrderDetail.OrderId,
                        Reservoirarea = cabinOrderDetail.Reservoirarea,
                        Goods_no = cabinOrderDetail.Goods_no,
                        Order_qty = cabinOrderDetail.Order_qty,
                        Order_Inqty = cabinOrderDetail.Order_Inqty,
                        Batch_num = cabinOrderDetail.Batch_num,
                        Exp_date = cabinOrderDetail.Exp_date,
                        OrderDetailStatus = cabinOrderDetail.OrderDetailStatus,
                        Status = cabinOrderDetail.Status,
                        Creater = cabinOrderDetail.Creater,
                        CreateDate = cabinOrderDetail.CreateDate,
                        Modifier = App.User.UserName,
                        ModifyDate = DateTime.Now
                    };
                    var i = BaseDal.Db.Insertable(hty).ExecuteCommand();
                    if (i<0)
                    {
                        _unitOfWorkManage.RollbackTran();
                    }
                    var v = BaseDal.Db.Deleteable<Dt_CabinOrderDetail>(cabinOrderDetail).ExecuteCommand();
                    if (v < 0)
                    {
                        _unitOfWorkManage.RollbackTran();
                    }
                }
                else
                {
                    _cabinOrderDetailServices.Repository.UpdateData(cabinOrderDetail);
                }
                var cabinOrder1 = BaseDal.Db.Queryable<Dt_CabinOrder>().Where(x => x.Order_no == cabinOrder.Order_no).Includes(x => x.Details).First();
                if (cabinOrder1.Details == null || cabinOrder1.Details.Count < 1) cabinOrder.OdrderStatus = "已完成";
                _cabinOrderDetailServices.Repository.UpdateData(cabinOrderDetail);
                var cabinOrder1 = BaseDal.Db.Queryable<Dt_CabinOrder>().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
@@ -182,7 +159,9 @@
                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())
                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);
@@ -194,6 +173,8 @@
                if (inventoryInfo != null)
                {
                    inventoryInfo.StockQuantity += Inqty;
                    inventoryInfo.AvailableQuantity += Inqty;
                    inventoryInfo.InDate = DateTime.Now;
                    _inventoryInfoService.UpdateData(inventoryInfo);
                }
                else
@@ -206,6 +187,7 @@
                        MaterielSpec = materielInfo.MaterielSpec,
                        OutboundQuantity = 0,
                        StockQuantity = Inqty,
                        AvailableQuantity = Inqty,
                        StockStatus = StockStatusEmun.入库完成.ObjToInt(),
                        ValidityPeriod = cabinOrderDetail.Exp_date,
                        WarehouseCode = cabinOrderDetail.Reservoirarea,
@@ -220,10 +202,33 @@
                #endregion
                #region ä»»åŠ¡è®°å½•
                Dt_SupplyTask supplyTask = new Dt_SupplyTask()
                #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,
@@ -238,7 +243,7 @@
                    SupplyQuantity = 0,
                    Remark = "入库"
                };
                _supplyTaskService.AddData(supplyTask);
                _supplyTaskHtyService.AddData(supplyTask_Hty);
                #endregion
                #region åº“存批次
@@ -246,6 +251,7 @@
                if (inventory_Batch != null)
                {
                    inventory_Batch.StockQuantity += Inqty;
                    inventory_Batch.AvailableQuantity += Inqty;
                    _inventory_BatchServices.UpdateData(inventory_Batch);
                }
                else
@@ -263,6 +269,7 @@
                        ProductionDate = inventoryInfo.ProductionDate,
                        Status = false,
                        StockQuantity = inventoryInfo.StockQuantity,
                        AvailableQuantity = inventoryInfo.StockQuantity,
                        ValidityPeriod = inventoryInfo.ValidityPeriod,
                        SupplyQuantity = inventoryInfo.SupplyQuantity,
                    };
@@ -282,10 +289,7 @@
            }
            return content;
        }
        static string SearchDate = "2025-09-10 00:00:00";
        /// <summary>
        /// èŽ·å–ä¸Šæ¸¸ç³»ç»Ÿçš„å…¥åº“å•
        /// </summary>
@@ -297,17 +301,17 @@
            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";
                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");
                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 = SearchDate
                    //searchDate = "2022-10-10 20:45:16"  // æ­£ç¡®çš„æ ¼å¼
                };
                //SearchDate = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd HH:mm:ss");
                SearchDate = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd HH:mm:ss");
                // å‘起请求
                var result = HttpHelper.Post(url, requestData.ToJsonString());
@@ -351,185 +355,44 @@
                    {
                        if (order.order_type == "1") //正常入库
                        {
                            responseContent = CreateInboundOrder(order);
                            List<Dt_CabinOrder>? dt_CabinOrders = responseContent.Data as List<Dt_CabinOrder>;
                            if (dt_CabinOrders != null) _CabinOrders.AddRange(dt_CabinOrders);
                        }
                        else
                        else if (order.order_type == "3")//入库退料
                        {
                            //创建出库单
                        }
                        #region åˆ›å»ºä¸€ä¸ªå…¥åº“单方法
                        //排除特殊药品
                        bool skipOrder = false;//标记是否跳过该入库单
                        if (order.warehouse_no != "001" && order.warehouse_no != "大件平库") //特殊药品库房号进行下面操作
                        {
                            //创建入库单主表从表
                            var entityOrder = new Dt_CabinOrder
                            #region è½¬æ¢ä¸ºå‡ºåº“单
                            UpstramOutOrderInfo upstramOutOrderInfo = new UpstramOutOrderInfo()
                            {
                                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 = 2, //如果是001房那么就是未同步状态,如果不是001房那么就是无需同步状态
                                }).ToList()
                            };
                            _CabinOrders.Add(entityOrder);
                        }
                        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 = order.warehouse_no,
                                Details = new List<Dt_CabinOrderDetail>()
                                order_no = order.order_no,
                                order_type = order.order_type,
                                warehouse_no = order.warehouse_no,
                                details = new List<UpstreamOutOrderDetail>()
                            };
                            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)
                                UpstreamOutOrderDetail detail = new UpstreamOutOrderDetail()
                                {
                                    skipOrder = true;
                                    Console.WriteLine($"跳过入库单 {order.order_no},原因:未找到商品 [{item.goods_no}] çš„物料信息。");
                                    break;
                                }
                                //  è‹¥ç‰©æ–™ä¸å­˜åœ¨æˆ– MaterielSourceType ä¸ºç©ºï¼Œåˆ™è·³è¿‡æ•´ä¸ªå…¥åº“单
                                if (materielInfo == null || !Enum.IsDefined(typeof(MaterielSourceTypeEnum), materielInfo.MaterielSourceType))
                                {
                                    skipOrder = true;
                                    break;
                                }
                                //Dt_MedicineGoods materielInfo = BaseDal.Db.Queryable<Dt_MedicineGoods>().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;//整箱数量
                                    var xs = (int)(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) //当业务数量和整箱数都大于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;
                                        }
                                    }
                                    if (orderDetail != null) entityOrder.Details.Add(orderDetail);
                                    #endregion
                                    #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
                                    batch_num = item.batch_num,
                                    goods_no = item.goods_no,
                                    order_qty = item.order_qty,
                                    exp_date = item.exp_date,
                                };
                                upstramOutOrderInfo.details.Add(detail);
                            }
                            _eliveryOrderServices.CreateOutboundOrder(upstramOutOrderInfo);
                            #endregion
                            // â—如果跳过该单,则直接continue,不保存
                            if (skipOrder)
                            {
                                Console.WriteLine($"跳过入库单 {order.order_no},因为存在未定义物料属性的商品。");
                                continue;
                            }
                            _CabinOrders.Add(entityOrder);
                            orderNos.Add(order.order_no);
                        }
                        else if (order.order_type == "5")//报溢入库
                        {
                        }
                    };
                    BaseDal.Db.InsertNav(_CabinOrders).Include(x => x.Details).ExecuteCommand();
                    //在下发给wcs 
                    //var reslut=  EdiIn(); //发给下游
                    //EdiIn(); //发给下游
                    //如果这个方法成功了,那么就调用CompleteOrder接口,然后改变
                    Db.Ado.CommitTran();
                    return responseContent.OK("同步入库单成功");
@@ -549,213 +412,176 @@
            }
        }
        #region åˆ›å»ºå…¥åº“单
        /// <summary>
        /// å¯¹æ²¡æœ‰è¿›è¡Œç»´æŠ¤å•†å“ä¿¡æ¯è¡¨çš„入库单进行过滤处理
        /// åˆ›å»ºå…¥åº“单,返回一个入库单集合到data
        /// </summary>
        /// <returns></returns>
        public WebResponseContent GetUpstreamOrder2()
        public WebResponseContent CreateInboundOrder(UpstreamOrderInfo order)
        {
            var responseContent = new WebResponseContent();
            WebResponseContent webResponseContent = 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
                List<Dt_CabinOrder> dt_CabinOrders = new List<Dt_CabinOrder>();
                #region ç‰¹æ®Šè¯å“å…¥ç‰¹æ®Šåº“房
                if (order.warehouse_no == WarehouseEnum.麻精库.ObjToInt().ToString("000") || order.warehouse_no == WarehouseEnum.冷冻库.ObjToInt().ToString("000"))
                {
                    //searchDate = SearchDate
                    searchDate = "2020-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<UpstreamResponse<UpstreamOrderInfo>>(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<Dt_CabinOrder>()
                    .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<Dt_CabinOrder> _CabinOrders = new();
                    List<string> orderNos = new();
                    foreach (var order in newOrders)
                    var entityOrder = new Dt_CabinOrder
                    {
                        bool skipOrder = false; // æ ‡è®°æ˜¯å¦è·³è¿‡è¯¥å…¥åº“单
                        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
                        {
                            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<Dt_CabinOrderDetail>()
                        };
                        foreach (var item in order.details)
                            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<Dt_CabinOrderDetail>()
                    };
                    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<Dt_CabinOrderDetail>()
                    };
                    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)//如果物料是大件
                        {
                            item.order_qty = Math.Abs(item.order_qty);
                            // æŸ¥è¯¢ç‰©æ–™ä¿¡æ¯
                            var materielInfo = BaseDal.Db.Queryable<Dt_MedicineGoods>()
                                .Where(x => x.Goods_no == item.goods_no)
                                .First();
                            //如果物料信息不存在,跳过整个入库单
                            if (materielInfo == null)
                            Dt_CabinOrderDetail orderDetail = new Dt_CabinOrderDetail()
                            {
                                skipOrder = true;
                                Console.WriteLine($"跳过入库单 {order.order_no},原因:未找到商品 [{item.goods_no}] çš„物料信息。");
                                break;
                            }
                            //  è‹¥ç‰©æ–™ä¸å­˜åœ¨æˆ– MaterielSourceType ä¸ºç©ºï¼Œåˆ™è·³è¿‡æ•´ä¸ªå…¥åº“单
                            if (materielInfo == null || !Enum.IsDefined(typeof(MaterielSourceTypeEnum), materielInfo.MaterielSourceType))
                                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)
                            {
                                skipOrder = true;
                                break;
                            }
                            // åŒºåˆ†å¤§ä»¶/小件
                            if (materielInfo.MaterielSourceType == MaterielSourceTypeEnum.PurchasePart)
                            {
                                var detail = new Dt_CabinOrderDetail
                                orderDetail = new Dt_CabinOrderDetail()
                                {
                                    Reservoirarea = order.warehouse_no,
                                    Reservoirarea = entityOrderLK.Warehouse_no,
                                    Goods_no = item.goods_no,
                                    Order_qty = item.order_qty,
                                    Order_qty = ys,
                                    Batch_num = item.batch_num,
                                    Exp_date = item.exp_date,
                                    OrderDetailStatus = "新建",
                                    Status = 2
                                    Status = 0
                                };
                                entityOrder.Details.Add(detail);
                                materielInfo.Business_qty += ys;
                            }
                            else
                            {
                                Dt_CabinOrderDetail orderDetail = null;
                                var ys = item.order_qty % materielInfo.BoxQty; // ä¸èƒ½æ•´é™¤çš„æ•£ä»¶
                                var xs = item.order_qty / materielInfo.BoxQty; // æ•´ç®±æ•°é‡
                            #endregion
                                // æœ‰æ•£ä»¶
                                if (ys > 0)
                            #region åˆ¤æ–­ç«‹åº“库存是否大于立库最低库存数
                            while (materielInfo.Business_qty < materielInfo.MinQty && xs > 0) //当业务数量和整箱数都大于0的时候才会停止循环
                            {
                                xs--;
                                if (orderDetail == null)
                                {
                                    orderDetail = new Dt_CabinOrderDetail
                                    orderDetail = new Dt_CabinOrderDetail()
                                    {
                                        Reservoirarea = order.warehouse_no,
                                        Reservoirarea = entityOrderLK.Warehouse_no,
                                        Goods_no = item.goods_no,
                                        Order_qty = ys,
                                        Order_qty = materielInfo.BoxQty,
                                        Batch_num = item.batch_num,
                                        Exp_date = item.exp_date,
                                        OrderDetailStatus = "新建",
                                        Status = 0
                                    };
                                    materielInfo.Business_qty += ys;
                                }
                                // ä¸è¶³æœ€ä½Žåº“存时补入立库
                                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
                                        };
                                    }
                                    else
                                    {
                                        orderDetail.Order_qty += materielInfo.BoxQty;
                                    }
                                    materielInfo.Business_qty += materielInfo.BoxQty;
                                }
                                if (orderDetail != null) entityOrder.Details.Add(orderDetail);
                                // å‰©ä½™æ•´ç®±å…¥å¹³åº“
                                if (xs > 0)
                                else
                                {
                                    entityOrder.Details.Add(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
                                    });
                                    orderDetail.Order_qty += materielInfo.BoxQty;
                                    materielInfo.Business_qty += materielInfo.BoxQty;
                                }
                            }
                            _medicineGoodsServices.Db.Updateable(materielInfo).ExecuteCommand();
                            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
                        }
                        // â—如果跳过该单,则直接continue,不保存
                        if (skipOrder)
                        {
                            Console.WriteLine($"跳过入库单 {order.order_no},因为存在未定义物料属性的商品。");
                            continue;
                        }
                        _CabinOrders.Add(entityOrder);
                        orderNos.Add(order.order_no);
                        _basicService.MaterielInfoService.Repository.UpdateData(materielInfo);
                    }
                    if (_CabinOrders.Any())
                    {
                        BaseDal.Db.InsertNav(_CabinOrders).Include(x => x.Details).ExecuteCommand();
                        Db.Ado.CommitTran();
                        return responseContent.OK($"成功同步 {_CabinOrders.Count} æ¡å…¥åº“单");
                    }
                    else
                    {
                        Db.Ado.RollbackTran();
                        return responseContent.OK("无可处理的入库单(商品属性未定义或未找到)");
                    }
                }
                catch (Exception ex)
                {
                    Db.Ado.RollbackTran();
                    SendErrorToUpstream(1, "", ex.Message, "");
                    return responseContent.Error("同步失败: " + ex.Message);
                    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)
            {
                SendErrorToUpstream(1, "", ex.Message, "");
                return responseContent.Error("同步失败: " + ex.Message);
                webResponseContent.Error(ex.Message);
            }
            return webResponseContent;
        }
        #endregion
        /// <summary>
        /// ä¼ ç»™wcs
@@ -770,16 +596,20 @@
                //    .Includes(o => o.Details, d => d.MedicineGoods)
                //    .ToList();
                //查出包含全部的入库单,包含全部明细+一个明细对应一个商品
                var reslut = WarehouseEnum.立库.ObjToInt().ToString("000");
                var orders = BaseDal.Db.CopyNew()
                .Queryable<Dt_CabinOrder>()
                .Where(o => o.OdrderStatus == "新建")
                .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())
                {
@@ -787,18 +617,13 @@
                    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.MaterielErpType))
                    {
                        //如果条件满足,将物料代码设置为第一个明细项对应的药品物料代码
                        materialCode = firstDetail.MedicineGoods.MaterielErpType;
                    }
                    // ä»Žç¬¬ä¸€ä¸ªæœ‰ MedicineGoods çš„æ˜Žç»†ä¸­å–出 MaterielErpType
                    string materialCode = order.Details
                        .Select(d => d.MedicineGoods?.MaterielErpType)
                        .FirstOrDefault(x => !string.IsNullOrEmpty(x)) ?? "YY"; // é»˜è®¤å€¼YY
                    var ediDto = new ToediInInfo
                    {
@@ -833,23 +658,11 @@
                            manufacturer = d.MedicineGoods?.Factory,
                            //房号
                            libraryNo = order.Warehouse_no,
                            //盘盈入库
                            //stocktakingDetails = new List<ToediInStock>()
                            //stocktakingDetails = new List<ToediInStock>()
                            //{
                            //    new ToediInStock
                            //    {
                            //         //料箱号
                            //        palletCode = "PDA001",
                            //        //数量
                            //        quantity = d.Order_qty.ToString()
                            //    }
                            // }
                        }).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 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<TowcsResponse<object>>(result);
@@ -861,9 +674,9 @@
                           .Where(o => o.Id == order.Id)
                           .ExecuteCommand();
                        // æ›´æ–°æ˜Žç»†çŠ¶æ€ä¸ºå·²åŒæ­¥
                        // æ›´æ–°æ˜Žç»†çŠ¶æ€ä¸ºå·²åŒæ­¥  //这里要是将新建--》开始状态,在后端接口返回我们的时候在返回已完成
                        BaseDal.Db.Updateable<Dt_CabinOrderDetail>()
                          .SetColumns(d => new Dt_CabinOrderDetail { Status = 1, OrderDetailStatus = "已完成" })
                          .SetColumns(d => new Dt_CabinOrderDetail { Status = 1, OrderDetailStatus = "开始" })
                          .Where(d => d.OrderId == order.Id && d.Status == 0)
                          .ExecuteCommand();
@@ -897,113 +710,42 @@
            var responseContent = new WebResponseContent();
            try
            {
                // æŸ¥æ‰¾æ‰€æœ‰â€œå¼€å§‹â€çŠ¶æ€çš„å…¥åº“å•
                var orders = BaseDal.Db.Queryable<Dt_CabinOrder>()
                    .Where(o => o.OdrderStatus == "开始")
                    .ToList();
                if (orders == null || !orders.Any())
                #region æŸ¥æ‰¾æ‰€æœ‰å·²å®Œæˆå…¥åº“单
                var inorders = BaseDal.QueryData(x => x.OdrderStatus == "已完成").Select(x => x.Order_no).Distinct().ToList();
                foreach (var inorder in inorders)
                {
                    return responseContent.OK("暂无需要处理的入库单");
                }
                int successCount = 0;
                int failCount = 0;
                foreach (var order in orders)
                {
                    try
                    //var Orders = BaseDal.QueryData(x => x.Order_no == inorder);
                    var Orders = BaseDal.Db.Queryable<Dt_CabinOrder>().Where(x => x.Order_no == inorder).Includes(x => x.Details).ToList();
                    if (!Orders.Where(x => x.OdrderStatus != "已完成").Any())
                    {
                        BaseDal.Db.Ado.BeginTran();
                        // æŸ¥è¯¢è¯¥å•的明细
                        var details = BaseDal.Db.Queryable<Dt_CabinOrderDetail>()
                            .Where(d => d.OrderId == order.Id)
                            .ToList();
                        // åˆ¤æ–­æ˜¯å¦å…¨éƒ¨å®Œæˆ
                        var totalCount = details.Count;
                        var completedCount = details.Count(d => d.OrderDetailStatus == "已完成");
                        if (totalCount > 0 && completedCount == totalCount)
                        BaseDal.DeleteAndMoveIntoHty(Orders, OperateTypeEnum.自动完成);
                        foreach (var item in Orders)
                        {
                            // æ›´æ–°è¡¨å¤´çŠ¶æ€
                            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<UpstreamOrderResponse>(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<Dt_CabinOrderDetail>().Where(d => d.OrderId == order.Id).ExecuteCommand();
                                BaseDal.Db.Deleteable<Dt_CabinOrder>().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);
                            }
                            _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<UpstreamOrderResponse>(result);
                        if (response.resultCode == "0")
                        {
                            // æäº¤äº‹åŠ¡
                            BaseDal.Db.Ado.CommitTran();
                        }
                        else
                        {
                            BaseDal.Db.Ado.RollbackTran();
                            SendErrorToUpstream(2, "", $"上游接口返回失败: {response.resultMsg}", inorder);
                        }
                    }
                    catch (Exception ex)
                    {
                        BaseDal.Db.Ado.RollbackTran();
                        failCount++;
                        SendErrorToUpstream(1, "", ex.Message, order.Order_no);
                    }
                }
                return responseContent.OK($"批量处理完成:成功 {successCount} å•,失败 {failCount} å•。");
                #endregion
                return responseContent.OK();
            }
            catch (Exception ex)
            {
                BaseDal.Db.Ado.RollbackTran();
                return responseContent.Error("批量处理失败:" + ex.Message);
            }
        }