1
yangpeixing
2026-01-28 513da724807c2fed2d4ec772b31d054a550d391a
WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -1687,16 +1687,250 @@
                                       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());
                            if (outboundOrderDetails == null || outboundOrderDetails.Count == 0)
                            {
                                foreach (var stockDetail in stockInfoDetails)
                                {
                                    var matchingOrderDetails = outboundOrderDetails1
                                        .Where(x => x.MaterielCode == stockDetail.MaterielCode)
                                        .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)
                                            {
                                                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(outboundOrderDetails1);
                                    AddCPRetrueOrder(stockInfo, outboundOrder, outboundOrderDetails1);
                                    // 区分单据数据来源更新货位状态
                                    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 outboundOrderDetails1.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()))
                                        {
                                            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
                            {
                                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;
                                }
                            }
                            else
                            {
                            foreach (var stockDetail in stockInfoDetails)
                            {
                                var matchingOrderDetails = outboundOrderDetails
@@ -1927,6 +2161,7 @@
                                throw;
                            }
                        }
                        }
                        catch (Exception ex)
                        {
                            return WebResponseContent.Instance.Error($"处理失败: {ex.Message}");