1
wankeda
2026-02-04 7df9475d342d199ae9cc5585d5d3a95888c33208
1
已添加5个文件
已修改8个文件
595 ■■■■■ 文件已修改
WMS/WIDESEA_WMSServer/.vs/ProjectEvaluation/widesea_wmsserver.strings.v9.bin 补丁 | 查看 | 原始文档 | blame | 历史
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.995.13737/CodeChunks.db 补丁 | 查看 | 原始文档 | blame | 历史
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.995.13737/SemanticSymbols.db 补丁 | 查看 | 原始文档 | blame | 历史
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/345cfd9a-4138-4c4a-a9af-c8d22877aeae.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/5c4a7e69-693f-412b-ad07-d063fc4e9d3b.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/a7cf8380-9089-4dcc-924e-fb96f612f4aa.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/aef23139-5f2b-4e2b-b8b1-07914de64bf1.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/cf340d1a-bab8-4f69-a5cd-bf2c9bf7d805.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/Service/NewOutboundOrderDetailService.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/Service/OutboundOrderDetailService.cs 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/NewPartialTaskService_Outbound.cs 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 483 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WMS/WIDESEA_WMSServer/.vs/ProjectEvaluation/widesea_wmsserver.strings.v9.bin
Binary files differ
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.995.13737/CodeChunks.db
Binary files differ
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.995.13737/SemanticSymbols.db
Binary files differ
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/345cfd9a-4138-4c4a-a9af-c8d22877aeae.vsidx
Binary files differ
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/5c4a7e69-693f-412b-ad07-d063fc4e9d3b.vsidx
Binary files differ
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/a7cf8380-9089-4dcc-924e-fb96f612f4aa.vsidx
Binary files differ
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/aef23139-5f2b-4e2b-b8b1-07914de64bf1.vsidx
Binary files differ
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/cf340d1a-bab8-4f69-a5cd-bf2c9bf7d805.vsidx
Binary files differ
WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/Service/NewOutboundOrderDetailService.cs
@@ -30,7 +30,7 @@
        /// <summary>
        /// 低温、药水库存分配
        /// 成品分配
        /// </summary>
        /// <param name="outboundOrderDetails"></param>
        /// <returns></returns>
@@ -114,12 +114,9 @@
                }
                List<Dt_StockInfo> autoAssignStocks = new List<Dt_StockInfo>();
                List<IStockInfoService.residueQuantity> newResidueQuantitys = new List<IStockInfoService.residueQuantity>();
                if (warehouse.Any(x => x.WarehouseCode.Contains("DW")) || warehouse.Any(x => x.WarehouseCode.Contains("YS")))
                {
                    autoAssignStocks = _stockService.StockInfoService.CPGetOutboundStocks(stockInfos, dt_OutboundOrderDetails, out List<IStockInfoService.residueQuantity> residueQuantitys);
                    newResidueQuantitys.AddRange(residueQuantitys);
                    outStocks.AddRange(autoAssignStocks);
                }
                autoAssignStocks = _stockService.StockInfoService.CPGetOutboundStocks(stockInfos, dt_OutboundOrderDetails, out List<IStockInfoService.residueQuantity> residueQuantitys);
                newResidueQuantitys.AddRange(residueQuantitys);
                outStocks.AddRange(autoAssignStocks);
                foreach (var residueQuantity in newResidueQuantitys)
                {
                    foreach (var item in dt_OutboundOrderDetails)
@@ -149,11 +146,9 @@
                                        palletAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == item.MaterielCode && x.PalletCode == autoAssignStocks[j].PalletCode).Sum(x => x.AssignQuantity);//出库详情已分配数量
                                    }
                                    decimal palletOutboundQuantity = 0;
                                    if (warehouse.Any(x => x.WarehouseCode.Contains("DW")) || warehouse.Any(x => x.WarehouseCode.Contains("YS")))
                                    {
                                        palletOutboundQuantity = autoAssignStocks[j].Details.Where(x => x.MaterielCode == item.MaterielCode).Sum(x => x.OutboundQuantity);
                                    }
                                    palletOutboundQuantity = autoAssignStocks[j].Details.Where(x => x.MaterielCode == item.MaterielCode).Sum(x => x.OutboundQuantity);
                                    if (palletAssignQuantity < palletOutboundQuantity)//如果出库详情已分配数量小于托盘已分配数量,则可以继续添加该托盘出库信息
                                    {
                                        decimal orderDetailNeedQuantity = details[i].OrderQuantity - detailAssignQuantity;
WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/Service/OutboundOrderDetailService.cs
@@ -671,15 +671,15 @@
                return WebResponseContent.Instance.Error("该出库单据非ERP推送,无法取消");
            }
            string ids ="";
            foreach (var item in outboundOrderDetails)
            try
            {
                ids = item.LinId;
                var postContent = new MultipartFormDataContent();
                postContent.Add(new StringContent(ids), "ids");
                string result = string.Empty;
                HttpClient client = null;
                try
                foreach (var item in outboundOrderDetails)
                {
                    ids = item.LinId;
                    var postContent = new MultipartFormDataContent();
                    postContent.Add(new StringContent(ids), "ids");
                    string result = string.Empty;
                    HttpClient client = null;
                    using (client = new HttpClient())
                    {
                        // 2. 发送请求
@@ -706,26 +706,24 @@
                        _outboundRepository.OutboundOrderRepository.DeleteAndMoveIntoHty(outboundOrder, OperateType.人工取消);
                    }
                    _unitOfWorkManage.CommitTran();
                    // 假设ERP返回成功时返回成功响应
                    return WebResponseContent.Instance.OK(result);
                }
                catch (HttpRequestException ex)
                {
                    _unitOfWorkManage.RollbackTran();
                    // 处理HTTP请求相关异常
                    return WebResponseContent.Instance.Error($"HTTP请求错误: {ex.Message}");
                }
                catch (Exception ex)
                {
                    _unitOfWorkManage.RollbackTran();
                    // 处理其他异常
                    return WebResponseContent.Instance.Error($"处理失败: {ex.Message}");
                }
                // 假设ERP返回成功时返回成功响应
                return WebResponseContent.Instance.OK();
            }
            return WebResponseContent.Instance.OK();
            catch (HttpRequestException ex)
            {
                _unitOfWorkManage.RollbackTran();
                // 处理HTTP请求相关异常
                return WebResponseContent.Instance.Error($"HTTP请求错误: {ex.Message}");
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                // 处理其他异常
                return WebResponseContent.Instance.Error($"处理失败: {ex.Message}");
            }
        }
    }
WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs
@@ -345,10 +345,10 @@
            List<Dt_StockInfo> notStocks = new List<Dt_StockInfo>(); ;
            foreach (var dt_OutboundOrderDetail in dt_OutboundOrderDetails)
            {
                notStocks = stockInfos.Where(x => x.Details.Any(x => x.BatchNo == dt_OutboundOrderDetail.BatchNo && x.MaterielCode == dt_OutboundOrderDetail.MaterielCode)).OrderBy(x => x.Id).ToList();
                notStocks = stockInfos.Where(x => x.Details.Any(x =>x.MaterielCode == dt_OutboundOrderDetail.MaterielCode)).OrderBy(x => x.Id).ToList();
                if (notStocks.Count > 0)
                {
                    decimal stockTotalQuantity = stockInfos.SelectMany(x => x.Details).Where(d => d.BatchNo == dt_OutboundOrderDetail.BatchNo).Sum(v => v.StockQuantity - v.OutboundQuantity);
                    decimal stockTotalQuantity = stockInfos.SelectMany(x => x.Details).Where(d => d.MaterielCode == dt_OutboundOrderDetail.MaterielCode).Sum(v => v.StockQuantity - v.OutboundQuantity);
                    decimal needQuantity = dt_OutboundOrderDetail.OrderQuantity - dt_OutboundOrderDetail.LockQuantity;
                    if (stockTotalQuantity >= needQuantity)//库存够
                    {
@@ -360,7 +360,7 @@
                            Dt_StockInfoDetail dt_StockInfoDetail = new Dt_StockInfoDetail();
                            foreach (var detail in stockInfo.Details)
                            {
                                if (detail.BatchNo == dt_OutboundOrderDetail.BatchNo && detail.MaterielCode == dt_OutboundOrderDetail.MaterielCode)
                                if (detail.MaterielCode == dt_OutboundOrderDetail.MaterielCode)
                                {
                                    dt_StockInfoDetail = detail;
                                }
@@ -370,7 +370,7 @@
                            {
                                stockInfo.Details.ForEach(x =>
                                {
                                    if (x.MaterielCode == dt_OutboundOrderDetail.MaterielCode && x.BatchNo == dt_OutboundOrderDetail.BatchNo)
                                    if (x.MaterielCode == dt_OutboundOrderDetail.MaterielCode)
                                    {
                                        x.OutboundQuantity = x.StockQuantity;
                                    }
@@ -382,7 +382,7 @@
                                stockInfo.Details.ForEach(x =>
                                {
                                    if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == dt_OutboundOrderDetail.MaterielCode && x.BatchNo == dt_OutboundOrderDetail.BatchNo)
                                    if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == dt_OutboundOrderDetail.MaterielCode)
                                    {
                                        if (x.StockQuantity - x.OutboundQuantity >= needQuantity)
                                        {
@@ -409,7 +409,7 @@
                            decimal useableStockQuantity = 0;
                            foreach (var detail in stockInfo.Details)
                            {
                                if (detail.MaterielCode == dt_OutboundOrderDetail.MaterielCode && detail.BatchNo == dt_OutboundOrderDetail.BatchNo)
                                if (detail.MaterielCode == dt_OutboundOrderDetail.MaterielCode)
                                {
                                    useableStockQuantity = detail.StockQuantity - detail.OutboundQuantity;
                                }
@@ -418,7 +418,7 @@
                            if (useableStockQuantity < needQuantity)
                            {
                                stockInfo.Details.ForEach(x => {
                                    if (x.MaterielCode == dt_OutboundOrderDetail.MaterielCode && x.BatchNo == dt_OutboundOrderDetail.BatchNo)
                                    if (x.MaterielCode == dt_OutboundOrderDetail.MaterielCode)
                                    {
                                        x.OutboundQuantity = x.StockQuantity;
                                    }
@@ -429,7 +429,7 @@
                            {
                                stockInfo.Details.ForEach(x =>
                                {
                                    if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == dt_OutboundOrderDetail.MaterielCode && x.BatchNo == dt_OutboundOrderDetail.BatchNo)
                                    if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == dt_OutboundOrderDetail.MaterielCode)
                                    {
                                        if (x.StockQuantity - x.OutboundQuantity >= needQuantity)
                                        {
WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/NewPartialTaskService_Outbound.cs
@@ -41,6 +41,7 @@
                }
                if (outboundOrderDetails.FirstOrDefault()?.LPNNo == null)
                {
                    outboundOrderDetails.Clear();
                    try
                    {
                        List<StockSelectViewDTO> stockSelectViews = new List<StockSelectViewDTO>();
@@ -63,17 +64,13 @@
                            }
                            if (result.Item5 != null && result.Item5.Count > 0)
                            {
                                locationInfos.AddRange(result.Item5);
                                locationInfos.AddRange(result.Item5.DistinctBy(x => x.LocationCode));
                            }
                            if (result.Item1 != null && result.Item1.Count > 0)
                            {
                                tasks.AddRange(result.Item1);
                            }
                            if (locationInfos.First().RoadwayNo.Contains("DW") || locationInfos.First().RoadwayNo.Contains("YS"))
                            {
                                break;
                            }
                            break;
                        }
                        WebResponseContent content = NEWGenerateOutboundTaskDataUpdate(tasks, stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos);
@@ -447,14 +444,14 @@
            List<Dt_LocationInfo>? locationInfos = null;
            //if (outboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
            {
                Dt_OutboundOrder dt_OutboundOrder = _outboundService.OutboundOrderService.Repository.QueryData(x => x.Id == outboundOrderDetails.First().OrderId).First();
                Dt_NewOutboundOrder dt_OutboundOrder = _outboundService.NewOutboundOrderService.Repository.QueryData(x => x.Id == outboundOrderDetails.First().OrderId).First();
                (List<Dt_StockInfo>, List<Dt_NewOutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = new();
                result = _outboundService.NewOutboundOrderDetailService.CPAssignStockOutbound(outboundOrderDetails);
                if (result.Item1 != null && result.Item1.Count > 0)
                {
                    Dt_OutboundOrder outboundOrder = _outboundService.OutboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId);
                    Dt_NewOutboundOrder outboundOrder = _outboundService.NewOutboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId);
                    TaskTypeEnum typeEnum = outboundOrder.OrderType switch
                    {
                        (int)OrderTypeEnum.生产出库单 => TaskTypeEnum.Outbound,
@@ -467,24 +464,10 @@
                    {
                        x.OrderNo = outboundOrder.OrderNo;
                    });
                    if (dt_OutboundOrder.OutWareHouse.Contains("DW") || dt_OutboundOrder.OutWareHouse.Contains("YS"))
                    result.Item2.ForEach(x =>
                    {
                        result.Item2.ForEach(x =>
                        {
                            if (x.LockQuantity == x.OrderQuantity)
                            {
                                x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
                            }
                        });
                    }
                    else
                    {
                        result.Item2.ForEach(x =>
                        {
                            x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
                        });
                    }
                        x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
                    });
                    result.Item3.ForEach(x =>
                    {
WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -1688,128 +1688,130 @@
                                       x.LPNNo == stockInfo.PalletCode)
                                .ToList();
                            if (outboundOrderDetails == null || outboundOrderDetails.Count == 0)
                            List<Dt_NewOutboundOrderDetail> outboundOrderDetails1 = _outboundService.NewOutboundOrderDetailService.Db.Queryable<Dt_NewOutboundOrderDetail>()
                                .Where(x => x.OrderId == outboundOrder.Id)
                                .ToList();
                            if ((outboundOrderDetails == null && outboundOrderDetails1 == null) || (outboundOrderDetails.Count == 0  && outboundOrderDetails1.Count == 0))
                            {
                                throw new Exception($"未找到托盘 {stockInfo.PalletCode} 在货位 {stockInfo.LocationCode} 上的出库单明细");
                            }
                            // 获取库存明细
                            var stockInfoDetails = stockInfo.Details.ToList();
                            int overCount = outboundOrder.Details.Count(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt());
                            foreach (var stockDetail in stockInfoDetails)
                            if (outboundOrderDetails == null || outboundOrderDetails.Count == 0)
                            {
                                var matchingOrderDetails = outboundOrderDetails
                                    .Where(x => x.MaterielCode == stockDetail.MaterielCode &&
                                           x.BatchNo == stockDetail.BatchNo)
                                    .ToList();
                                if (matchingOrderDetails.Count == 0)
                                foreach (var stockDetail in stockInfoDetails)
                                {
                                    continue;
                                }
                                    var matchingOrderDetails = outboundOrderDetails1
                                        .Where(x => x.MaterielCode == stockDetail.MaterielCode)
                                        .ToList();
                                // 计算需要分配的数量
                                decimal remainingStock = stockDetail.OutboundQuantity;
                                foreach (var orderDetail in matchingOrderDetails)
                                {
                                    if (remainingStock <= 0) break;
                                    if (orderDetail.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt())
                                        continue;
                                    // 计算本次可以分配的数量
                                    decimal availableOrderQty = orderDetail.OrderQuantity - orderDetail.OverOutQuantity;
                                    decimal allocateQty = Math.Min(remainingStock, availableOrderQty);
                                    if (allocateQty > 0)
                                    if (matchingOrderDetails.Count == 0)
                                    {
                                        orderDetail.OverOutQuantity += allocateQty;
                                        remainingStock -= allocateQty;
                                        continue;
                                    }
                                        // 检查是否完成
                                        if (Math.Abs(orderDetail.OverOutQuantity - orderDetail.OrderQuantity) < 0.001m)
                                    // 计算需要分配的数量
                                    decimal remainingStock = stockDetail.OutboundQuantity;
                                    foreach (var orderDetail in matchingOrderDetails)
                                    {
                                        if (remainingStock <= 0) break;
                                        if (orderDetail.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt())
                                            continue;
                                        // 计算本次可以分配的数量
                                        decimal availableOrderQty = orderDetail.OrderQuantity - orderDetail.OverOutQuantity;
                                        decimal allocateQty = Math.Min(remainingStock, availableOrderQty);
                                        if (allocateQty > 0)
                                        {
                                            orderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
                                            overCount++;
                                            orderDetail.OverOutQuantity += allocateQty;
                                            remainingStock -= allocateQty;
                                            // 检查是否完成
                                            if (Math.Abs(orderDetail.OverOutQuantity - orderDetail.OrderQuantity) < 0.001m)
                                            {
                                                orderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
                                                overCount++;
                                            }
                                        }
                                    }
                                }
                            }
                            // 更新订单状态
                            if (outboundOrder.Details.Count == overCount)
                            {
                                outboundOrder.OrderStatus = OutboundStatusEnum.出库完成.ObjToInt();
                            }
                            _unitOfWorkManage.BeginTran();
                            try
                            {
                                // 更新出库单
                                _outboundService.NewOutboundOrderService.Repository.UpdateData(outboundOrder);
                                _outboundService.NewOutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails);
                                AddCPRetrueOrder(stockInfo, outboundOrder, outboundOrderDetails);
                                // 区分单据数据来源更新货位状态
                                if (outboundOrder.System == null)
                                // 更新订单状态
                                if (outboundOrder.Details.Count == overCount)
                                {
                                    return WebResponseContent.Instance.Error("出库单数据源为空");
                                    outboundOrder.OrderStatus = OutboundStatusEnum.出库完成.ObjToInt();
                                }
                                _unitOfWorkManage.BeginTran();
                                if (!outboundOrder.System.Equals("SMOM"))
                                try
                                {
                                    UpdateLocationStatus(locationInfo);
                                }
                                    // 更新出库单
                                    _outboundService.NewOutboundOrderService.Repository.UpdateData(outboundOrder);
                                // 处理任务完成
                                CompleteTask(task);
                                    _outboundService.NewOutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails1);
                                // 添加状态变更记录
                                AddStatusChangeRecord(task, stockInfo, locationInfo);
                                string path = "http://fr.mankun.com:8080/webroot/decision/view/report?viewlet=fr-report\\SMOM/Product/Produce/OutBoundDetileReport.cpt&op=write&format=pdf";
                                string fullPath = AppDomain.CurrentDomain.BaseDirectory;
                                var url = Path.Combine(fullPath, "wwwroot", "Reports");
                                string savePath = Path.Combine(url, "本次出库.pdf");
                                    AddCPRetrueOrder(stockInfo, outboundOrder, outboundOrderDetails1);
                                // ERP系统反馈
                                if (outboundOrder.System.Equals("ERP"))
                                {
                                    // 为每个完成的明细反馈ERP
                                    foreach (var orderDetail in outboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()))
                                    // 区分单据数据来源更新货位状态
                                    if (outboundOrder.System == null)
                                    {
                                        FeedBackOutERP(outboundOrder.OrderNo, orderDetail.LinId);
                                        return WebResponseContent.Instance.Error("出库单数据源为空");
                                    }
                                    // 如果有完成的明细,下载报表
                                    if (outboundOrderDetails.Any(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()))
                                    if (!outboundOrder.System.Equals("SMOM"))
                                    {
                                        DownloadReport(path, savePath, outboundOrderDetails.First().Id);
                                        UpdateLocationStatus(locationInfo);
                                    }
                                }
                                // 单据完成推送SMOM系统
                                if (outboundOrder.OrderStatus == OutboundStatusEnum.出库完成.ObjToInt() && outboundOrder.System.Equals("SMOM"))
                                {
                                    var outStockLockInfoList = _outboundService.OutboundStockLockInfoService.Repository
                                        .QueryData(x => x.OrderNo == outboundOrder.OrderNo);
                                    // 处理任务完成
                                    CompleteTask(task);
                                    if (outStockLockInfoList.Count == 0)
                                        throw new Exception($"订单 {outboundOrder.OrderNo} 托盘 {stockInfo.PalletCode} 未找到库存锁定信息");
                                    // 添加状态变更记录
                                    AddStatusChangeRecord(task, stockInfo, locationInfo);
                                    // 采购出库
                                    if (outboundOrder.OrderType == 1)
                                    string path = "http://fr.mankun.com:8080/webroot/decision/view/report?viewlet=fr-report\\SMOM/Product/Produce/OutBoundDetileReport.cpt&op=write&format=pdf";
                                    string fullPath = AppDomain.CurrentDomain.BaseDirectory;
                                    var url = Path.Combine(fullPath, "wwwroot", "Reports");
                                    string savePath = Path.Combine(url, "本次出库.pdf");
                                    // ERP系统反馈
                                    if (outboundOrder.System.Equals("ERP"))
                                    {
                                        var passBack = new HouseoutboundPassBack
                                        // 为每个完成的明细反馈ERP
                                        foreach (var orderDetail in outboundOrderDetails1.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()))
                                        {
                                            ApiType = "ShippingOrderController",
                                            Method = "AsrsOutboundSO",
                                            Parameters = new List<HouseoutboundPassBack.datas>
                                            FeedBackOutERP(outboundOrder.OrderNo, orderDetail.LinId);
                                        }
                                        // 如果有完成的明细,下载报表
                                        if (outboundOrderDetails1.Any(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()))
                                        {
                                            DownloadReport(path, savePath, outboundOrderDetails1.First().Id);
                                        }
                                    }
                                    //单据完成推送SMOM系统
                                    if (outboundOrder.OrderStatus == OutboundStatusEnum.出库完成.ObjToInt() && outboundOrder.System.Equals("SMOM"))
                                    {
                                        var outStockLockInfoList = _outboundService.OutboundStockLockInfoService.Repository
                                            .QueryData(x => x.OrderNo == outboundOrder.OrderNo);
                                        if (outStockLockInfoList.Count == 0)
                                            throw new Exception($"订单 {outboundOrder.OrderNo} 托盘 {stockInfo.PalletCode} 未找到库存锁定信息");
                                        // 采购出库
                                        if (outboundOrder.OrderType == 1)
                                        {
                                            var passBack = new HouseoutboundPassBack
                                            {
                                                ApiType = "ShippingOrderController",
                                                Method = "AsrsOutboundSO",
                                                Parameters = new List<HouseoutboundPassBack.datas>
                        {
                            new HouseoutboundPassBack.datas
                            {
@@ -1837,33 +1839,33 @@
                                }
                            }
                        }
                                        };
                                            };
                                        //调用SMOM接口...
                                        var authResult = AuthenticateWithWMS();
                                        if (authResult.IsSuccess)
                                        {
                                            passBack.Context = new Dictionary<string, string>
                                            //调用SMOM接口...
                                            var authResult = AuthenticateWithWMS();
                                            if (authResult.IsSuccess)
                                            {
                                                passBack.Context = new Dictionary<string, string>
                                        {
                                            { "Ticket", authResult.Ticket },
                                            { "InvOrgId", authResult.InvOrgId }
                                        };
                                            var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskout, passBack, "立库出库数量回传WMS");
                                            if (!response.Success)
                                            {
                                                throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
                                                var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskout, passBack, "立库出库数量回传WMS");
                                                if (!response.Success)
                                                {
                                                    throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
                                                }
                                            }
                                        }
                                    }
                                    // 调拨出库
                                    if (outboundOrder.OrderType == 2)
                                    {
                                        var allocate = new InventoryAllocate
                                        // 调拨出库
                                        if (outboundOrder.OrderType == 2)
                                        {
                                            ApiType = "InventoryAllocateController",
                                            Method = "AsrsFinishedStockCount",
                                            Parameters = new List<Allocate>
                                            var allocate = new InventoryAllocate
                                            {
                                                ApiType = "InventoryAllocateController",
                                                Method = "AsrsFinishedStockCount",
                                                Parameters = new List<Allocate>
                        {
                            new Allocate
                            {
@@ -1894,38 +1896,271 @@
                                }
                            }
                        }
                                        };
                                            };
                                        // 调用SMOM接口...
                                        var authResult = AuthenticateWithWMS();
                                        if (authResult.IsSuccess)
                                        {
                                            allocate.Context = new Dictionary<string, string>
                                            // 调用SMOM接口...
                                            var authResult = AuthenticateWithWMS();
                                            if (authResult.IsSuccess)
                                            {
                                                allocate.Context = new Dictionary<string, string>
                                        {
                                            { "Ticket", authResult.Ticket },
                                            { "InvOrgId", authResult.InvOrgId }
                                        };
                                            var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskin, allocate, "立库入库数量回传WMS");
                                            if (!response.Success)
                                                var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskin, allocate, "立库入库数量回传WMS");
                                                if (!response.Success)
                                                {
                                                    throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
                                                }
                                            }
                                        }
                                    }
                                    if (outboundOrder.OrderType == 240) // 盘点出库
                                    {
                                        // 盘点出库特殊处理逻辑
                                    }
                                    _unitOfWorkManage.CommitTran();
                                    return WebResponseContent.Instance.OK();
                                }
                                catch
                                {
                                    _unitOfWorkManage.RollbackTran();
                                    throw;
                                }
                            }
                            else
                            {
                                foreach (var stockDetail in stockInfoDetails)
                                {
                                    var matchingOrderDetails = outboundOrderDetails
                                        .Where(x => x.MaterielCode == stockDetail.MaterielCode &&
                                               x.BatchNo == stockDetail.BatchNo)
                                        .ToList();
                                    if (matchingOrderDetails.Count == 0)
                                    {
                                        continue;
                                    }
                                    // 计算需要分配的数量
                                    decimal remainingStock = stockDetail.OutboundQuantity;
                                    foreach (var orderDetail in matchingOrderDetails)
                                    {
                                        if (remainingStock <= 0) break;
                                        if (orderDetail.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt())
                                            continue;
                                        // 计算本次可以分配的数量
                                        decimal availableOrderQty = orderDetail.OrderQuantity - orderDetail.OverOutQuantity;
                                        decimal allocateQty = Math.Min(remainingStock, availableOrderQty);
                                        if (allocateQty > 0)
                                        {
                                            orderDetail.OverOutQuantity += allocateQty;
                                            remainingStock -= allocateQty;
                                            // 检查是否完成
                                            if (Math.Abs(orderDetail.OverOutQuantity - orderDetail.OrderQuantity) < 0.001m)
                                            {
                                                throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
                                                orderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
                                                overCount++;
                                            }
                                        }
                                    }
                                }
                                if (outboundOrder.OrderType == 240) // 盘点出库
                                // 更新订单状态
                                if (outboundOrder.Details.Count == overCount)
                                {
                                    // 盘点出库特殊处理逻辑
                                    outboundOrder.OrderStatus = OutboundStatusEnum.出库完成.ObjToInt();
                                }
                                _unitOfWorkManage.BeginTran();
                                _unitOfWorkManage.CommitTran();
                                return WebResponseContent.Instance.OK();
                            }
                            catch
                                try
                                {
                                    // 更新出库单
                                    _outboundService.NewOutboundOrderService.Repository.UpdateData(outboundOrder);
                                    _outboundService.NewOutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails);
                                    AddCPRetrueOrder(stockInfo, outboundOrder, outboundOrderDetails);
                                    // 区分单据数据来源更新货位状态
                                    if (outboundOrder.System == null)
                                    {
                                        return WebResponseContent.Instance.Error("出库单数据源为空");
                                    }
                                    if (!outboundOrder.System.Equals("SMOM"))
                                    {
                                        UpdateLocationStatus(locationInfo);
                                    }
                                    // 处理任务完成
                                    CompleteTask(task);
                                    // 添加状态变更记录
                                    AddStatusChangeRecord(task, stockInfo, locationInfo);
                                    string path = "http://fr.mankun.com:8080/webroot/decision/view/report?viewlet=fr-report\\SMOM/Product/Produce/OutBoundDetileReport.cpt&op=write&format=pdf";
                                    string fullPath = AppDomain.CurrentDomain.BaseDirectory;
                                    var url = Path.Combine(fullPath, "wwwroot", "Reports");
                                    string savePath = Path.Combine(url, "本次出库.pdf");
                                    // ERP系统反馈
                                    if (outboundOrder.System.Equals("ERP"))
                                    {
                                        // 为每个完成的明细反馈ERP
                                        foreach (var orderDetail in outboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()))
                                        {
                                            FeedBackOutERP(outboundOrder.OrderNo, orderDetail.LinId);
                                        }
                                        // 如果有完成的明细,下载报表
                                        if (outboundOrderDetails.Any(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()))
                                        {
                                            DownloadReport(path, savePath, outboundOrderDetails.First().Id);
                                        }
                                    }
                                    //单据完成推送SMOM系统
                                    if (outboundOrder.OrderStatus == OutboundStatusEnum.出库完成.ObjToInt() && outboundOrder.System.Equals("SMOM"))
                                    {
                                        var outStockLockInfoList = _outboundService.OutboundStockLockInfoService.Repository
                                            .QueryData(x => x.OrderNo == outboundOrder.OrderNo);
                                        if (outStockLockInfoList.Count == 0)
                                            throw new Exception($"订单 {outboundOrder.OrderNo} 托盘 {stockInfo.PalletCode} 未找到库存锁定信息");
                                        // 采购出库
                                        if (outboundOrder.OrderType == 1)
                                        {
                                            var passBack = new HouseoutboundPassBack
                                            {
                                                ApiType = "ShippingOrderController",
                                                Method = "AsrsOutboundSO",
                                                Parameters = new List<HouseoutboundPassBack.datas>
                        {
                            new HouseoutboundPassBack.datas
                            {
                                _unitOfWorkManage.RollbackTran();
                                throw;
                                Value = new List<HouseoutboundPassBack.datas.data1>
                                {
                                    new HouseoutboundPassBack.datas.data1
                                    {
                                        No = outboundOrder.OrderNo,
                                        OutWareHouse = task.Roadway,
                                        TransactionCode = outboundOrder.TransactionCode,
                                        InoutType = outboundOrder.OrderType,
                                        OrderType = outboundOrder.InoutType,
                                              DetailList = outStockLockInfoList.Select(d => new HouseoutboundPassBack.datas.data1.Inbound
                                                        {
                                                            LinId = d.LinId?? "",
                                                            LPN_No = d.PalletCode,
                                                            MaterielCode = d.MaterielCode?? "",
                                                            OrderQuantity = d.OrderQuantity,
                                                            BatchNo = d.BatchNo,
                                                            FinishQty = d.OrderQuantity,
                                                            LocationName = d.LocationCode
                                                        })
                                                        .ToList()
                                    }
                                }
                            }
                        }
                                            };
                                            //调用SMOM接口...
                                            var authResult = AuthenticateWithWMS();
                                            if (authResult.IsSuccess)
                                            {
                                                passBack.Context = new Dictionary<string, string>
                                        {
                                            { "Ticket", authResult.Ticket },
                                            { "InvOrgId", authResult.InvOrgId }
                                        };
                                                var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskout, passBack, "立库出库数量回传WMS");
                                                if (!response.Success)
                                                {
                                                    throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
                                                }
                                            }
                                        }
                                        // 调拨出库
                                        if (outboundOrder.OrderType == 2)
                                        {
                                            var allocate = new InventoryAllocate
                                            {
                                                ApiType = "InventoryAllocateController",
                                                Method = "AsrsFinishedStockCount",
                                                Parameters = new List<Allocate>
                        {
                            new Allocate
                            {
                                Value = new List<Allocate.data1>
                                {
                                    new Allocate.data1
                                    {
                                        No = outboundOrder.OrderNo,
                                        InWarehouse = task.Roadway,
                                        TransactionCode = outboundOrder.TransactionCode,
                                        InoutType = outboundOrder.OrderType,
                                        OrderType = outboundOrder.InoutType,
                                        ActiveType = 2,
                                                DetailList = outStockLockInfoList.Select(item =>
                                                        {
                                                            return new Allocate.data1.Inventory
                                                            {
                                                                LinId = item.LinId,
                                                                LPNNo = item.PalletCode,
                                                                MaterielCode = item.MaterielCode,
                                                                OrderQuantity = item.OrderQuantity,
                                                                BatchNo = item.BatchNo,
                                                                FinishQty = item.OrderQuantity,
                                                                LocationName = task.SourceAddress
                                                            };
                                                        }).ToList()
                                    }
                                }
                            }
                        }
                                            };
                                            // 调用SMOM接口...
                                            var authResult = AuthenticateWithWMS();
                                            if (authResult.IsSuccess)
                                            {
                                                allocate.Context = new Dictionary<string, string>
                                        {
                                            { "Ticket", authResult.Ticket },
                                            { "InvOrgId", authResult.InvOrgId }
                                        };
                                                var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskin, allocate, "立库入库数量回传WMS");
                                                if (!response.Success)
                                                {
                                                    throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
                                                }
                                            }
                                        }
                                    }
                                    if (outboundOrder.OrderType == 240) // 盘点出库
                                    {
                                        // 盘点出库特殊处理逻辑
                                    }
                                    _unitOfWorkManage.CommitTran();
                                    return WebResponseContent.Instance.OK();
                                }
                                catch
                                {
                                    _unitOfWorkManage.RollbackTran();
                                    throw;
                                }
                            }
                        }
                        catch (Exception ex)