1
yangpeixing
2026-03-11 6f7f2e11e9feea6a0b998c31feabf170fb135205
WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -84,6 +84,20 @@
using static WIDESEA_Common.NewHouseInboundPassBack.Parame.Syncretism;
using static WIDESEA_ITaskInfoService.ITaskService;
using Parameter = WIDESEA_Common.Parameter;
using WIDESEA_DTO.ERP;
using WIDESEA_OutboundRepository;
using System.ComponentModel.DataAnnotations;
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using Spire.Pdf;
using WIDESEA_InboundRepository;
using System.Drawing.Printing;
using System;
using WIDESEA_Common.Log;
using static WIDESEA_Common.HouseInboundPassBack.data.data1;
using System.Diagnostics;
namespace WIDESEA_TaskInfoService
{
@@ -564,9 +578,9 @@
                                return WebResponseContent.Instance.Error("未找到入库单信息");
                            }
                            var allBoxCodesForDetail = BaseDal.Db.Queryable<Dt_StockInfoDetailCP>()
              .Where(x => dt_StockInfo.Details.Select(d => d.Id).Contains(x.StockDetailId))
              .Select(x => x.BoxCode)
              .ToList();
                              .Where(x => dt_StockInfo.Details.Select(d => d.Id).Contains(x.StockDetailId))
                              .Select(x => x.BoxCode)
                              .ToList();
                            // 2. 获取托盘下的所有箱号
                            var boxCodes = new List<string>();
@@ -794,9 +808,10 @@
                                        // 判断Success的值
                                        if (!response.Success)
                                        {
                                            WriteLog.Write_Log("API", "SMOM立库回传给WMS", "请求失败", new { 请求报文 = houseInboundPassBack, 接收报文 = response });
                                            throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
                                        }
                                        WriteLog.Write_Log("API", "SMOM立库入库回传WMS", "请求成功", new { 请求报文 = houseInboundPassBack, 接收报文 = response });
                                    }
                                }
@@ -872,8 +887,11 @@
                                        var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskAllocatein, inventoryAllocate, "调拨入库数量回传WMS");
                                        if (!response.Success)
                                        {
                                            WriteLog.Write_Log("API", "SMOM调拨入库数量回传WMS", "请求失败", new { 请求报文 = inventoryAllocate, 接收报文 = response });
                                            throw new Exception($"操作失败:{response.Message ?? "未提供错误信息"}");
                                        }
                                        WriteLog.Write_Log("API", "SMOM调拨入库数量回传WMS", "请求成功", new { 请求报文 = inventoryAllocate, 接收报文 = response });
                                    }
                                }
                                else if (inboundOrder.OrderStatus == InboundStatusEnum.入库完成.ObjToInt() && inboundOrder.OrderType == 5 && inboundOrder.System.Equals("SMOM"))
@@ -887,7 +905,7 @@
                                         .ToList();
                                    Dt_InboundOrder? dt_InboundOrder = _inboundService.InbounOrderService.Db.Queryable<Dt_InboundOrder>().Where(x => x.OrderNo == inboundOrder.OrderNo).Includes(x => x.Details).First();
                                    if (StockInfos.Count  == 0) throw new Exception("未找到库存信息");
                                    if (StockInfos.Count == 0) throw new Exception("未找到库存信息");
                                    var houseSyncretism = new NewHouseInboundPassBack
                                    {
@@ -899,33 +917,28 @@
                                            {
                                                Value =  new Parame.Syncretism
                                                    {
                                                        OrderNo = inboundOrder.OrderNo,
                                                        Details =   StockInfos.SelectMany(stockInfo =>
                                                {
                                                    OrderNo = inboundOrder.OrderNo,
                                                    Details = StockInfos.SelectMany(stockInfo =>
                                                        stockInfo.Details.Select(g =>
                                                        {
                                                            //var InboundOrderde1=dt_InboundOrder.Details.FirstOrDefault;
                                                    stockInfo.Details.Select(g =>
                                                    {
                                                       //var InboundOrderde1=dt_InboundOrder.Details.FirstOrDefault;
                                                       return new Parame.Syncretism.details
                                                       {
                                                        MoveType = 0,
                                                        WareHouseCode = warehouse.WarehouseCode,
                                                        ItemCode = g.MaterielCode,
                                                        MoveNumber = g.StockQuantity,
                                                        LotNo = g.BatchNo,
                                                        WipBatch = g.BatchNo,
                                                        Lpn = g.StockDetails.FirstOrDefault().LPNNO,
                                                        LocationName = g.StockDetails.FirstOrDefault().OrinalLocation,
                                                        TargetLocName = stockInfo.LocationCode, // 添加null检查
                                                        TargetLpn = stockInfo.PalletCode, // 添加null检查
                                                       };
                                                    })).ToList()
                                                    }
                                                            return new Parame.Syncretism.details
                                                            {
                                                                MoveType = 0,
                                                                WareHouseCode = warehouse.WarehouseCode,
                                                                ItemCode = g.MaterielCode,
                                                                MoveNumber = g.StockQuantity,
                                                                LotNo = g.BatchNo,
                                                                WipBatch = g.BatchNo,
                                                                Lpn = g.StockDetails.FirstOrDefault().LPNNO,
                                                                LocationName = g.StockDetails.FirstOrDefault().OrinalLocation,
                                                                TargetLocName = stockInfo.LocationCode, // 添加null检查
                                                                TargetLpn = stockInfo.PalletCode, // 添加null检查
                                                            };
                                                        })).ToList()
                                                }
                                            }
                                        }
                                    };
@@ -934,17 +947,19 @@
                                    if (authResult.IsSuccess)
                                    {
                                        houseSyncretism.Context = new Dictionary<string, string>
                                            {
                                                { "Ticket", authResult.Ticket },
                                                { "InvOrgId", authResult.InvOrgId }
                                        {
                                            { "Ticket", authResult.Ticket },
                                            { "InvOrgId", authResult.InvOrgId }
                                            };
                                        };
                                        var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskin, houseSyncretism, "立库入库数量回传WMS");
                                        if (!response.Success)
                                        {
                                            WriteLog.Write_Log("API", "SMOM立库入库数量回传WMS", "请求失败", new { 请求报文 = houseSyncretism, 接收报文 = response });
                                            throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
                                        }
                                        WriteLog.Write_Log("API", "SMOM立库入库数量回传WMS", "请求成功", new { 请求报文 = houseSyncretism, 接收报文 = response });
                                    }
@@ -1073,6 +1088,8 @@
                                if (inboundOrder.OrderStatus == InboundStatusEnum.入库完成.ObjToInt() && inboundOrder.OrderType == 0 && inboundOrder.System.Equals("SMOM"))
                                {
                                    //SendInboundInfoToWMS(task, inboundOrder, stockInfo);
                                    SendInboundInfoToWMS(task, inboundOrder, dt_StockInfo);
                                }
                                else if (inboundOrder.OrderStatus == InboundStatusEnum.入库完成.ObjToInt() && inboundOrder.OrderType == 2 && inboundOrder.System.Equals("SMOM"))
                                {
@@ -1492,11 +1509,13 @@
                // 判断Success的值
                if (response.Success)
                {
                    WriteLog.Write_Log("API", "SMOM立库入库回传WMS", "请求成功", new { 请求报文 = houseInboundPassBack, 接收报文 = response });
                    // 如果Success为true,返回需要的值(这里以返回整个响应对象为例)
                    return WebResponseContent.Instance.OK();
                }
                else
                {
                    WriteLog.Write_Log("API", "SMOM立库入库回传WMS", "请求失败", new { 请求报文 = houseInboundPassBack, 接收报文 = response });
                    // 如果Success为false,抛出异常并包含错误信息
                    throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
                }
@@ -1517,9 +1536,9 @@
                Parameters = new List<HouseBackboundPassBack.backdata>
                {
                   new HouseBackboundPassBack.backdata
                    {
                   {
                         Value= new List<backdata.backdata1>
                        {
                         {
                            new backdata.backdata1
                            {
                                OrderType = returnOrder.OrderType,
@@ -1535,7 +1554,7 @@
                                WarehouseCode = returnOrder.WarehouseCode,
                                System = returnOrder.System,
                            }
                        }
                         }
                   }
                }
            };
@@ -1551,11 +1570,16 @@
                // 判断Success的值
                if (response.Success)
                {
                    WriteLog.Write_Log("API", "取消发货后立库反拣入库回传WMS", "请求成功", new { 请求报文 = houseReturnOrders, 接收报文 = response });
                    // 如果Success为true,返回需要的值(这里以返回整个响应对象为例)
                    return WebResponseContent.Instance.OK();
                }
                else
                {
                    WriteLog.Write_Log("API", "取消发货后立库反拣入库回传WMS", "请求失败", new { 请求报文 = houseReturnOrders, 接收报文 = response });
                    // 如果Success为false,抛出异常并包含错误信息
                    throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
                }
@@ -1620,33 +1644,33 @@
                ApiType = "InventoryAllocateController",
                Method = "AsrsFinishedStockCount",
                Parameters = new List<InventoryAllocate.Allocate>
        {
             new InventoryAllocate.Allocate
            {
                Value = new List<Allocate.data1>
                {
                new Allocate.data1
                {
                    No = inboundOrder.OrderNo,
                    //InWarehouse = task.Roadway,
                    TransactionCode = inboundOrder.TransactionCode,
                    InoutType = inboundOrder.OrderType,
                    OrderType = inboundOrder.InoutType,
                    // 遍历所有库存明细,添加到 DetailList
                    DetailList = StockInfos.Select(d => new Allocate.data1.Inventory
                    new InventoryAllocate.Allocate
                    {
                        LinId = d.Details.FirstOrDefault()?.LinId?? "",
                        MaterielCode = d.Details.FirstOrDefault()?.MaterielCode?? "",
                        OrderQuantity = d.Details.FirstOrDefault().StockQuantity,
                        BatchNo = d.BatchNo,
                        LPNNo = d.PalletCode,
                        FinishQty = d.Details.FirstOrDefault().StockQuantity,
                        LocationName = d.LocationCode
                    }).ToList()
                        Value = new List<Allocate.data1>
                        {
                            new Allocate.data1
                            {
                                No = inboundOrder.OrderNo,
                                //InWarehouse = task.Roadway,
                                TransactionCode = inboundOrder.TransactionCode,
                                InoutType = inboundOrder.OrderType,
                                OrderType = inboundOrder.InoutType,
                                // 遍历所有库存明细,添加到 DetailList
                                DetailList = StockInfos.Select(d => new Allocate.data1.Inventory
                                {
                                    LinId = d.Details.FirstOrDefault()?.LinId?? "",
                                    MaterielCode = d.Details.FirstOrDefault()?.MaterielCode?? "",
                                    OrderQuantity = d.Details.FirstOrDefault().StockQuantity,
                                    BatchNo = d.BatchNo,
                                    LPNNo = d.PalletCode,
                                    FinishQty = d.Details.FirstOrDefault().StockQuantity,
                                    LocationName = d.LocationCode
                                }).ToList()
                            }
                        }
                    }
                }
                }
            }
        }
            };
            var authResult = AuthenticateWithWMS();
@@ -1659,6 +1683,8 @@
        };
                HttpHelper.Post<WebResponseContent>(ReceiveWMSTaskAllocatein, inventoryAllocate, "调拨入库数量回传WMS");
                WriteLog.Write_Log("API", "调拨入库数量回传WMS", "请求", new { 请求报文 = inventoryAllocate, 接收报文 = inventoryAllocate });
            }
        }
@@ -1687,10 +1713,10 @@
            {
                ApiType = "AuthenticationController",
                Parameters = new List<Parameter>
        {
            new Parameter { Value = "LK-Admin" },
            new Parameter { Value = "LK-Admin" }
        },
                {
                    new Parameter { Value = "LK-Admin" },
                    new Parameter { Value = "LK-Admin" }
                },
                Method = "Login",
            };
@@ -1769,7 +1795,7 @@
                                       .Where(x => x.OrderId == outboundOrder.Id)
                                       .ToList();
                            }
                            if ((outboundOrderDetails == null && outboundOrderDetails1 == null) || (outboundOrderDetails.Count == 0  && outboundOrderDetails1.Count == 0))
                            if ((outboundOrderDetails == null && outboundOrderDetails1 == null) || (outboundOrderDetails.Count == 0 && outboundOrderDetails1.Count == 0))
                            {
                                throw new Exception($"未找到托盘 {stockInfo.PalletCode} 在货位 {stockInfo.LocationCode} 上的出库单明细");
                            }
@@ -1865,6 +1891,7 @@
                                        foreach (var orderDetail in outboundOrderDetails1.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()))
                                        {
                                            FeedBackOutERP(outboundOrder.OrderNo, orderDetail.LinId);
                                        }
                                        // 如果有完成的明细,下载报表
@@ -1891,33 +1918,33 @@
                                                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
                                                {
                                                    new HouseoutboundPassBack.datas
                                                    {
                                                        Value = new List<HouseoutboundPassBack.datas.data1>
                                                        {
                                                            LinId = d.LinId?? "",
                                                            LPN_No = d.PalletCode,
                                                            MaterielCode = d.MaterielCode?? "",
                                                            OrderQuantity = d.OrderQuantity,
                                                            BatchNo = d.BatchNo,
                                                            FinishQty = d.OrderQuantity,
                                                            LocationName = d.LocationCode
                                                        })
                                                        .ToList()
                                    }
                                }
                            }
                        }
                                                            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接口...
@@ -1932,8 +1959,11 @@
                                                var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskout, passBack, "立库出库数量回传WMS");
                                                if (!response.Success)
                                                {
                                                    WriteLog.Write_Log("API", "SMOM立库库数量回传WMS", "请求失败", new { 请求报文 = passBack, 接收报文 = response });
                                                    throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
                                                }
                                                WriteLog.Write_Log("API", "SMOM立库库数量回传WMS", "请求成功", new { 请求报文 = passBack, 接收报文 = response });
                                            }
                                        }
@@ -1945,36 +1975,36 @@
                                                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 =>
                                                {
                                                    new Allocate
                                                    {
                                                        Value = new List<Allocate.data1>
                                                        {
                                                            return new Allocate.data1.Inventory
                                                            new Allocate.data1
                                                            {
                                                                LinId = item.LinId,
                                                                LPNNo = item.PalletCode,
                                                                MaterielCode = item.MaterielCode,
                                                                OrderQuantity = item.OrderQuantity,
                                                                BatchNo = item.BatchNo,
                                                                FinishQty = item.OrderQuantity,
                                                                LocationName = task.SourceAddress
                                                            };
                                                        }).ToList()
                                    }
                                }
                            }
                        }
                                                                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接口...
@@ -1982,15 +2012,19 @@
                                            if (authResult.IsSuccess)
                                            {
                                                allocate.Context = new Dictionary<string, string>
                                        {
                                            { "Ticket", authResult.Ticket },
                                            { "InvOrgId", authResult.InvOrgId }
                                        };
                                                {
                                                    { "Ticket", authResult.Ticket },
                                                    { "InvOrgId", authResult.InvOrgId }
                                                };
                                                var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskin, allocate, "立库入库数量回传WMS");
                                                if (!response.Success)
                                                {
                                                    WriteLog.Write_Log("API", "SMOM立库库数量回传WMS", "请求失败", new { 请求报文 = allocate, 接收报文 = response });
                                                    throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
                                                }
                                                WriteLog.Write_Log("API", "SMOM立库库数量回传WMS", "请求成功", new { 请求报文 = allocate, 接收报文 = response });
                                            }
                                        }
                                    }
@@ -2123,33 +2157,33 @@
                                                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
                                                {
                                                    new HouseoutboundPassBack.datas
                                                    {
                                                        Value = new List<HouseoutboundPassBack.datas.data1>
                                                        {
                                                            LinId = d.LinId?? "",
                                                            LPN_No = d.PalletCode,
                                                            MaterielCode = d.MaterielCode?? "",
                                                            OrderQuantity = d.OrderQuantity,
                                                            BatchNo = d.BatchNo,
                                                            FinishQty = d.OrderQuantity,
                                                            LocationName = d.LocationCode
                                                        })
                                                        .ToList()
                                    }
                                }
                            }
                        }
                                                            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接口...
@@ -2164,8 +2198,12 @@
                                                var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskout, passBack, "立库出库数量回传WMS");
                                                if (!response.Success)
                                                {
                                                    WriteLog.Write_Log("API", "SMOM立库库数量回传WMS", "请求失败", new { 请求报文 = passBack, 接收报文 = response });
                                                    throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
                                                }
                                                WriteLog.Write_Log("API", "SMOM立库库数量回传WMS", "请求成功", new { 请求报文 = passBack, 接收报文 = response });
                                            }
                                        }
@@ -2177,36 +2215,36 @@
                                                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 =>
                                                {
                                                    new Allocate
                                                    {
                                                        Value = new List<Allocate.data1>
                                                        {
                                                            return new Allocate.data1.Inventory
                                                            new Allocate.data1
                                                            {
                                                                LinId = item.LinId,
                                                                LPNNo = item.PalletCode,
                                                                MaterielCode = item.MaterielCode,
                                                                OrderQuantity = item.OrderQuantity,
                                                                BatchNo = item.BatchNo,
                                                                FinishQty = item.OrderQuantity,
                                                                LocationName = task.SourceAddress
                                                            };
                                                        }).ToList()
                                    }
                                }
                            }
                        }
                                                                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接口...
@@ -2221,8 +2259,12 @@
                                                var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskin, allocate, "立库入库数量回传WMS");
                                                if (!response.Success)
                                                {
                                                    WriteLog.Write_Log("API", "SMOM立库库数量回传WMS", "请求失败", new { 请求报文 = allocate, 接收报文 = response });
                                                    throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
                                                }
                                                WriteLog.Write_Log("API", "SMOM立库库数量回传WMS", "请求成功", new { 请求报文 = allocate, 接收报文 = response });
                                            }
                                        }
                                    }
@@ -2264,7 +2306,7 @@
                            outboundOrderDetails.Add(outboundOrderDetail);
                        }
                        for (var i = 0; i<outboundOrderDetails.Count; i++)
                        for (var i = 0; i < outboundOrderDetails.Count; i++)
                        {
                            if (outboundOrderDetails[i].LocationName != null && outboundOrderDetails[i].LocationName != "")
                            {
@@ -2787,48 +2829,50 @@
                ApiType = "InventoryAllocateController",
                Method = "AsrsFinishedStockCount",
                Parameters = new List<Allocate>
        {
            new Allocate
            {
                Value = new List<Allocate.data1>
                {
                    new Allocate.data1
                    new Allocate
                    {
                        No = outboundOrder.OrderNo,
                        InWarehouse = task.Roadway,
                        TransactionCode = outboundOrder.TransactionCode,
                        InoutType = outboundOrder.OrderType,
                        OrderType = outboundOrder.InoutType,
                        DetailList = outStockLockInfos.Select(item =>
                        Value = new List<Allocate.data1>
                        {
                            //var detail = _stockService.StockInfoDetailService.Repository.QueryFirst(x => x.StockId == item.StockId);
                            return new Allocate.data1.Inventory
                            new Allocate.data1
                            {
                                LinId = outDetail.LinId,
                                LPNNo = item.PalletCode,
                                MaterielCode = outDetail.MaterielCode,
                                OrderQuantity = outDetail.OrderQuantity,
                                BatchNo = outDetail.BatchNo,
                                FinishQty = outDetail.OrderQuantity,
                                LocationName = task.SourceAddress
                            };
                        }).ToList()
                                No = outboundOrder.OrderNo,
                                InWarehouse = task.Roadway,
                                TransactionCode = outboundOrder.TransactionCode,
                                InoutType = outboundOrder.OrderType,
                                OrderType = outboundOrder.InoutType,
                                DetailList = outStockLockInfos.Select(item =>
                                {
                                    //var detail = _stockService.StockInfoDetailService.Repository.QueryFirst(x => x.StockId == item.StockId);
                                    return new Allocate.data1.Inventory
                                    {
                                        LinId = outDetail.LinId,
                                        LPNNo = item.PalletCode,
                                        MaterielCode = outDetail.MaterielCode,
                                        OrderQuantity = outDetail.OrderQuantity,
                                        BatchNo = outDetail.BatchNo,
                                        FinishQty = outDetail.OrderQuantity,
                                        LocationName = task.SourceAddress
                                    };
                                }).ToList()
                            }
                        }
                    }
                }
            }
        }
            };
            var authResult = AuthenticateWithWMS();
            if (authResult.IsSuccess)
            {
                allocate.Context = new Dictionary<string, string>
        {
            { "Ticket", authResult.Ticket },
            { "InvOrgId", authResult.InvOrgId }
        };
                {
                    { "Ticket", authResult.Ticket },
                    { "InvOrgId", authResult.InvOrgId }
                };
                HttpHelper.Post<WebResponseContent>(ReceiveWMSTaskin, allocate, "立库入库数量回传WMS");
                var response = HttpHelper.Post<WebResponseContent>(ReceiveWMSTaskin, allocate, "立库入库数量回传WMS");
                WriteLog.Write_Log("API", "SMOM立库入库数量回传WMS", "请求", new { 请求报文 = allocate, 接收报文 = response });
            }
        }
@@ -3025,8 +3069,7 @@
                        var matchedStockDetail = stockInfoDetails.FirstOrDefault(x => x.MaterielCode == outDetail.MaterielCode && x.BatchNo == outDetail.BatchNo);
                        if (matchedStockDetail == null)
                        {
                            matchedStockDetail = stockInfoDetails.FirstOrDefault(x =>
               x.MaterielCode == outDetail.MaterielCode);
                            matchedStockDetail = stockInfoDetails.FirstOrDefault(x =>x.MaterielCode == outDetail.MaterielCode);
                            if (matchedStockDetail == null)
                            {
@@ -3250,6 +3293,8 @@
                    result = response.Content.ReadAsStringAsync()
                        .ConfigureAwait(false).GetAwaiter().GetResult();
                    WriteLog.Write_Log("API", "单据明细出库完成回调ERP", "请求成功", new { 请求报文 = postContent, 接收报文 = response });
                }
                // 假设ERP返回成功时返回成功响应
@@ -3257,11 +3302,15 @@
            }
            catch (HttpRequestException ex)
            {
                WriteLog.Write_Log("API", "单据明细出库完成回调ERP", "请求失败", new { 请求报文 = postContent, 接收报文 = ex.Message });
                // 处理HTTP请求相关异常
                return WebResponseContent.Instance.Error($"HTTP请求错误: {ex.Message}");
            }
            catch (Exception ex)
            {
                WriteLog.Write_Log("API", "单据明细出库完成回调ERP", "请求失败", new { 请求报文 = postContent, 接收报文 = ex.Message });
                // 处理其他异常
                return WebResponseContent.Instance.Error($"处理失败: {ex.Message}");
            }
@@ -3289,11 +3338,15 @@
            // 判断Success的值
            if (response.Code == 0)
            {
                WriteLog.Write_Log("API", "任务回传给erp", "请求成功", new { 请求报文 = feedbackInboundOrder, 接收报文 = response });
                // 如果Success为true,返回需要的值(这里以返回整个响应对象为例)
                return WebResponseContent.Instance.OK();
            }
            else
            {
                WriteLog.Write_Log("API", "任务回传给erp", "请求失败", new { 请求报文 = feedbackInboundOrder, 接收报文 = response });
                // 如果Success为false,抛出异常并包含错误信息
                throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
            }
@@ -3496,65 +3549,171 @@
            }
        }
        public virtual void PrintTestDirect(string fullPath)
        public void PrintTestDirect(string fullPath)
        {
            const int maxRetryCount = 3;
            const int retryDelayMs = 1000;
            if (!File.Exists(fullPath))
            {
                Console.WriteLine($"打印失败:文件不存在 {fullPath}");
                Console.WriteLine($"✗ 打印失败:文件不存在 {fullPath}");
                return;
            }
            // 获取配置的打印机名称
            string printerName = AppSettings.app("PrinterName");
            // 获取打印机名称配置
            string printerName = AppSettings.app("PrinterName")?.Trim();
            if (string.IsNullOrEmpty(printerName))
            {
                Console.WriteLine("✗ 打印失败:未配置打印机名称");
                return;
                // 如果没有配置,使用系统默认打印机
                printerName = GetDefaultPrinterUbuntu();
            }
            // 直接使用配置的打印机名称,不进行任何转换
            PrintUsingConfiguredPrinter(fullPath, printerName.Trim());
            PrintUsingUbuntuPrinter(fullPath, printerName);
        }
        /// <summary>
        /// 获取 Ubuntu 默认打印机
        /// </summary>
        private string GetDefaultPrinterUbuntu()
        {
            try
            {
                ProcessStartInfo psi = new ProcessStartInfo
                {
                    FileName = "lpstat",
                    Arguments = "-d",
                    UseShellExecute = false,
                    CreateNoWindow = true,
                    RedirectStandardOutput = true
                };
                using (Process process = new Process { StartInfo = psi })
                {
                    process.Start();
                    string output = process.StandardOutput.ReadToEnd();
                    process.WaitForExit();
                    // 解析默认打印机名称,例如: "system default destination: LenovoPrinter"
                    if (output.Contains(":"))
                    {
                        return output.Split(':')[1].Trim();
                    }
                    return "LenovoPrinter"; // 默认回退
                }
            }
            catch
            {
                return "LenovoPrinter";
            }
        }
        /// <summary>
        /// Ubuntu 打印实现
        /// </summary>
        private void PrintUsingUbuntuPrinter(string filePath, string printerName)
        {
            try
            {
                PrintWithLpr(filePath, printerName);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"✗ 打印失败: {ex.Message}");
                throw;
            }
        }
        /// <summary>
        /// 使用 lpr 命令打印
        /// </summary>
        private void PrintWithLpr(string filePath, string printerName)
        {
            Console.WriteLine($"📄 正在打印到 {printerName}: {Path.GetFileName(filePath)}");
            // 使用 lp 命令,添加 -o raw 选项
            string command = $"lp -d {printerName} -o raw \"{filePath}\"";
            ExecuteShellCommand(command);
        }
        /// <summary>
        /// 执行 Shell 命令
        /// </summary>
        private void ExecuteShellCommand(string command)
        {
            ProcessStartInfo psi = new ProcessStartInfo
            {
                FileName = "/bin/bash",
                Arguments = $"-c \"{command.Replace("\"", "\\\"")}\"",
                UseShellExecute = false,
                CreateNoWindow = true,
                RedirectStandardOutput = true,
                RedirectStandardError = true
            };
            using (Process process = new Process { StartInfo = psi })
            {
                process.Start();
                string output = process.StandardOutput.ReadToEnd();
                string error = process.StandardError.ReadToEnd();
                process.WaitForExit();
                if (process.ExitCode == 0)
                {
                    Console.WriteLine($"✅ 打印任务提交成功");
                    if (!string.IsNullOrEmpty(output))
                        Console.WriteLine($"输出: {output}");
                }
                else
                {
                    throw new InvalidOperationException($"命令执行失败: {error}");
                }
            }
        }
        /// <summary>
        /// 只使用配置的打印机进行打印
        /// </summary>
        /// <summary>
        /// Ubuntu 打印方法 - 使用 lpr 命令
        /// </summary>
        private void PrintUsingConfiguredPrinter(string filePath, string printerName)
        {
            try
            {
                // 1. 首先验证打印机是否存在
                if (!IsPrinterInstalled(printerName))
                // 1. 检查打印机是否在线
                if (!IsPrinterAvailableUbuntu(printerName))
                {
                    Console.WriteLine($"✗ 打印机 '{printerName}' 未安装或不存在");
                    Console.WriteLine("\n系统已安装的打印机列表:");
                    foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
                    {
                        Console.WriteLine($"  - {printer}");
                    }
                    throw new InvalidOperationException($"打印机 '{printerName}' 未安装");
                    throw new InvalidOperationException($"打印机 '{printerName}' 不可用或未找到");
                }
                // 3. 使用 Spire.PDF 打印
                using (Spire.Pdf.PdfDocument pdf = new Spire.Pdf.PdfDocument())
                Console.WriteLine($"✓ 使用打印机: {printerName}");
                Console.WriteLine($"✓ 正在打印: {Path.GetFileName(filePath)}");
                // 2. 使用 lpr 命令打印
                ProcessStartInfo psi = new ProcessStartInfo
                {
                    // 加载文件
                    pdf.LoadFromFile(filePath);
                    FileName = "lpr",
                    Arguments = $"-P {printerName} \"{filePath}\"",
                    UseShellExecute = false,
                    CreateNoWindow = true,
                    RedirectStandardOutput = true,
                    RedirectStandardError = true
                };
                    // 设置打印机名称(只使用配置的名称)
                    pdf.PrintSettings.PrinterName = printerName;
                using (Process process = new Process { StartInfo = psi })
                {
                    process.Start();
                    string output = process.StandardOutput.ReadToEnd();
                    string error = process.StandardError.ReadToEnd();
                    process.WaitForExit();
                    Console.WriteLine($"✓ 使用配置的打印机: {printerName}");
                    Console.WriteLine($"✓ 正在打印: {Path.GetFileName(filePath)}");
                    // 直接打印
                    pdf.Print();
                    Console.WriteLine("✓ 打印任务已提交");
                    if (process.ExitCode == 0)
                    {
                        Console.WriteLine($"✓ 打印任务已提交到 {printerName}");
                    }
                    else
                    {
                        throw new InvalidOperationException($"打印失败: {error}");
                    }
                }
            }
            catch (Exception ex)
@@ -3565,155 +3724,29 @@
        }
        /// <summary>
        /// 从配置的友好名称获取实际的打印机名称
        /// Ubuntu 检查打印机可用性
        /// </summary>
        private string GetActualPrinterName(string displayName)
        {
            if (string.IsNullOrEmpty(displayName))
                return string.Empty;
            // 如果配置的是 "192.168.99.3 上的 Lenovo M7605D"
            if (displayName.Contains("192.168.99.3 上的 Lenovo M7605D"))
            {
                // 在系统中查找实际的打印机名称
                return FindActualPrinterForIP("192.168.99.3");
            }
            // 如果直接配置的是IP地址
            if (displayName.Contains("192.168.99.3"))
            {
                return FindActualPrinterForIP("192.168.99.3");
            }
            // 如果已经是实际的打印机名称,直接返回
            if (IsPrinterInstalled(displayName))
            {
                return displayName;
            }
            // 默认返回原名称
            return displayName;
        }
        /// <summary>
        /// 查找IP地址对应的实际打印机名称
        /// </summary>
        private string FindActualPrinterForIP(string ipAddress)
        private bool IsPrinterAvailableUbuntu(string printerName)
        {
            try
            {
                // 获取所有打印机
                var allPrinters = new List<string>();
                foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
                ProcessStartInfo psi = new ProcessStartInfo
                {
                    allPrinters.Add(printer);
                }
                Console.WriteLine($"查找IP地址 {ipAddress} 对应的打印机...");
                Console.WriteLine("系统打印机列表:");
                foreach (var printer in allPrinters)
                {
                    Console.WriteLine($"  - {printer}");
                }
                // 优先查找包含IP地址的打印机
                foreach (string printer in allPrinters)
                {
                    if (printer.Contains(ipAddress))
                    {
                        Console.WriteLine($"✓ 找到包含IP的打印机: {printer}");
                        return printer;
                    }
                }
                // 查找联想打印机
                foreach (string printer in allPrinters)
                {
                    if (printer.Contains("M7605D", StringComparison.OrdinalIgnoreCase))
                    {
                        Console.WriteLine($"✓ 找到联想打印机: {printer}");
                        return printer;
                    }
                }
                // 返回第一个可用的打印机
                if (allPrinters.Any())
                {
                    Console.WriteLine($"⚠️ 未找到精确匹配,使用第一个打印机: {allPrinters.First()}");
                    return allPrinters.First();
                }
                return string.Empty;
            }
            catch (Exception ex)
            {
                Console.WriteLine($"查找打印机失败: {ex.Message}");
                return string.Empty;
            }
        }
        /// <summary>
        /// 检查打印机是否已安装
        /// </summary>
        private bool IsPrinterInstalled(string printerName)
        {
            try
            {
                foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
                {
                    if (printer.Equals(printerName, StringComparison.OrdinalIgnoreCase))
                    {
                        return true;
                    }
                }
                return false;
            }
            catch
            {
                return false;
            }
        }
        /// <summary>
        /// 使用原始打印命令
        /// </summary>
        private void PrintUsingRawCommand(string filePath, string printerName)
        {
            try
            {
                var processStartInfo = new System.Diagnostics.ProcessStartInfo
                {
                    FileName = filePath,
                    Verb = "print",  // 使用"print"动词
                    UseShellExecute = true,  // 关键:启用Shell执行
                    FileName = "lpstat",
                    Arguments = $"-p {printerName}",
                    UseShellExecute = false,
                    CreateNoWindow = true,
                    WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
                    RedirectStandardOutput = true
                };
                // 设置打印机(可选,系统通常会使用默认打印机)
                // processStartInfo.Arguments = $"/t \"{filePath}\" \"{printerName}\"";
                System.Diagnostics.Process.Start(processStartInfo);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"打印失败: {ex.Message}");
                // 可以尝试其他方法
                //TryAlternativePrintMethod(filePath, printerName);
            }
        }
        /// <summary>
        /// 检查文件是否可访问
        /// </summary>
        private bool IsFileAccessible(string filePath)
        {
            try
            {
                using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                using (Process process = new Process { StartInfo = psi })
                {
                    return fs.Length > 0;
                    process.Start();
                    string output = process.StandardOutput.ReadToEnd();
                    process.WaitForExit();
                    return output.Contains($"{printerName} is idle") ||
                           output.Contains($"{printerName} is ready");
                }
            }
            catch
@@ -3721,25 +3754,6 @@
                return false;
            }
        }
        /// <summary>
        /// 尝试强制垃圾回收,释放可能存在的文件句柄
        /// </summary>
        private void TryForceGarbageCollection()
        {
            try
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
                Console.WriteLine("已执行垃圾回收");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"垃圾回收失败: {ex.Message}");
            }
        }
        /// <summary>
        /// 盘点出库完成
        /// </summary>