1
wangxinhui
14 小时以前 0023d3db5bd701864b73e57c0240c219c40c3a4e
1
已修改11个文件
400 ■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGV/CTU_AGVController .cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/成品仓/AGV_CPExtend.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/辅料仓/AGV_FLExtend.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesRworkOutboundOrderService.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ErpProScrapSheetDetailService.cs 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesRworkOutboundOrderService.cs 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderDetailService.cs 123 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockRepository/ProStockInfoRepository.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesProductService.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGV/CTU_AGVController .cs
@@ -177,8 +177,7 @@
                switch (agvUpdateModel.Method.ToUpper())
                {
                    case "END":
                        if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt() || task.TaskType == TaskTypeEnum.OutEmpty.ObjToInt()
                            || task.TaskType == TaskTypeEnum.OutAllocate.ObjToInt() || task.TaskType == TaskTypeEnum.OutProduct.ObjToInt())
                        if (task.TaskType.GetTaskTypeGroup()==TaskTypeGroup.OutbondGroup)
                            PutFinish(task.NextAddress);
                        _taskService.TaskCompleted(task.TaskNum);
                        break;
@@ -356,7 +355,7 @@
                            TakeFinish(task.CurrentAddress);
                            //_taskService.UpdateTask(task, TaskStatusEnum.AGV_Executing);
                        }
                        else if(task.TaskType == TaskTypeEnum.OutProduct.ObjToInt())
                        else if(task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                        {
                            task.TaskState = TaskStatusEnum.AGV_Executing.ObjToInt();
                            _taskRepository.UpdateData(task);
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/³ÉÆ·²Ö/AGV_CPExtend.cs
@@ -29,7 +29,7 @@
                    {
                        try
                        {
                            if (task.TaskType == TaskTypeEnum.OutProduct.ObjToInt())
                            if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                                task.CurrentAddress = GetAGVAddress(task.CurrentAddress);
                            else
                                task.NextAddress = GetAGVAddress(task.NextAddress);
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/¸¨ÁϲÖ/AGV_FLExtend.cs
@@ -32,7 +32,7 @@
                {
                    try
                    {
                        if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt() || task.TaskType == TaskTypeEnum.OutEmpty.ObjToInt() || task.TaskType == TaskTypeEnum.OutAllocate.ObjToInt())
                        if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                            task.CurrentAddress = GetAGVAddress(task.CurrentAddress);
                        else
                            task.NextAddress = GetAGVAddress(task.NextAddress);
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesRworkOutboundOrderService.cs
@@ -28,6 +28,8 @@
        //库存板出库
        WebResponseContent ProductOutBoundSync(MesProductOutBound model);
        MesProductOutBound MesProOutBound(Dt_MesRworkOutboundOrder mesRworkOutboundOrder, List<Dt_ProStockInfoDetail> proStockInfoDetails);
        /// <summary>
        /// æˆå“MES提库出库完后一包一包拣选
        /// </summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ErpProScrapSheetDetailService.cs
@@ -99,7 +99,7 @@
                    {
                        PartNum = item.ScrapProCode,
                        PartRev = item.ScrapProVersion,
                        Lotno = item.ScrapProVersion,
                        Lotno = item.ScrapProCode,
                        QtyOfArray = item.ScrapSETQty,
                        QtyOfUnit = item.ScrapPcsQty,
                        QtyOfArray_Alloc = 0,
@@ -131,7 +131,7 @@
                            {
                                PartNum = item.ScrapProCode,
                                PartRev = item.ScrapProVersion,
                                Lotno = item.ScrapProVersion,
                                Lotno = item.ScrapProCode,
                                QtyOfArray = item.ScrapSETQty,
                                QtyOfUnit = item.ScrapPcsQty,
                                QtyOfArray_Alloc = 0,
@@ -212,87 +212,6 @@
            List<Dt_ProStockInfo> outStocks = new List<Dt_ProStockInfo>();
            List<Dt_OutProStockInfo> outProStockInfos = new List<Dt_OutProStockInfo>();
            List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
            //List<Dt_ProOutOrderDetail> groupDetails = proOutOrderDetails.GroupBy(x => new { x.SaleOrder, x.PCode, x.PVer, x.PLot, x.DateCode }).Select(x => new Dt_ProOutOrderDetail()
            //{
            //    QtyPcs = x.Sum(x => x.QtyPcs) - x.Sum(x => x.OverQtyPcs),
            //    SaleOrder = x.Key.SaleOrder,
            //    PCode = x.Key.PCode,
            //    PVer = x.Key.PVer,
            //    PLot = x.Key.PLot,
            //    DateCode = x.Key.DateCode,
            //}).ToList();
            //foreach (var item in groupDetails)
            //{
            //    float needQty = item.QtyPcs;
            //    //查找可用库存
            //    List<Dt_ProStockInfo> stockInfoss = _stockInfoService.ProStockInfoService.GetUseableStocks(proOutOrder.WarehouseId, item);
            //    if (!stockInfoss.Any())
            //    {
            //        throw new Exception("未找到可分配库存");
            //    }
            //    //获取出库库存
            //    List<Dt_ProStockInfo> assignOutStocks = _stockInfoService.ProStockInfoService.GetOutboundStocks(stockInfoss, item, needQty, out float residueQuantity);
            //    item.LockQtyPcs += needQty - residueQuantity;
            //    if (item.QtyPcs> item.LockQtyPcs)
            //    {
            //        throw new Exception($"产品编码{item.PCode}可分配数量不足,可用数量{item.LockQtyPcs}");
            //    }
            //    outStocks.AddRange(assignOutStocks);
            //    float assignQuantity = needQty - residueQuantity;
            //    bool isCanLot = string.IsNullOrEmpty(item.PLot);
            //    bool isCanDate = string.IsNullOrEmpty(item.DateCode);
            //    List<Dt_ProOutOrderDetail> details = proOutOrderDetails
            //        .Where(x =>x.PCode == item.PCode && x.PVer == item.PVer
            //        && (isCanLot ? isCanLot : x.PLot == item.PLot)
            //        && (isCanDate ? isCanDate : x.DateCode == item.DateCode))
            //        .ToList();
            //    for (int i = 0; i < details.Count; i++)
            //    {
            //        float orderQuantity = details[i].QtyPcs;
            //        for (int j = 0; j < assignOutStocks.Count; j++)
            //        {
            //            //出库订单明细已分配数量
            //            float detailAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
            //                && (isCanLot ? isCanLot : x.PLot == item.PLot)
            //                && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
            //                && x.OrderDetailId == details[i].Id).Sum(x => x.AssignQuantity);
            //            float palletAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
            //                && (isCanLot ? isCanLot : x.PLot == item.PLot)
            //                && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
            //                && x.PalletCode == assignOutStocks[j].PalletCode).Sum(x => x.AssignQuantity);
            //            //出库详情已分配数量
            //            palletAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
            //                && (isCanLot ? isCanLot : x.PLot == item.PLot)
            //                && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
            //                && x.PalletCode == assignOutStocks[j].PalletCode).Sum(x => x.AssignQuantity);//出库详情已分配数量
            //            float palletOutboundQuantity = assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
            //            if (palletAssignQuantity < palletOutboundQuantity)//如果出库详情已分配数量小于托盘已分配数量,则可以继续添加该托盘出库信息
            //            {
            //                float orderDetailNeedQuantity = details[i].QtyPcs - detailAssignQuantity;
            //                if (orderDetailNeedQuantity > assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity)
            //                {
            //                    details[i].LockQtyPcs += assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity;
            //                    Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, details[i], assignOutStocks[j], assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity);
            //                    outProStockInfos.Add(outStockLockInfo);
            //                }
            //                else
            //                {
            //                    Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, details[i], assignOutStocks[j], details[i].QtyPcs - details[i].LockQtyPcs);
            //                    outProStockInfos.Add(outStockLockInfo);
            //                    details[i].LockQtyPcs = details[i].QtyPcs;
            //                    break;
            //                }
            //            }
            //        }
            //    }
            //    List<string> locationArr = outStocks.Select(x => x.LocationCode).ToList();
            //    locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(locationArr));
            //}
            foreach (var item in proOutOrderDetails)
            {
                float needQty = item.ScrapPcsQty;
@@ -315,15 +234,6 @@
                {
                    //出库订单明细已分配数量
                    float detailAssignQuantity = outProStockInfos.Where(x => x.OrderDetailId == item.Id).Sum(x => x.AssignQuantity);
                    ////出库详情已分配数量
                    //float palletAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
                    //    && (isCanLot ? isCanLot : x.PLot == item.PLot)
                    //    && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
                    //    && x.PalletCode == assignOutStocks[j].PalletCode).Sum(x => x.AssignQuantity);
                    ////出库详情已分配数量
                    //float palletOutboundQuantity = assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
                    //if (palletAssignQuantity < palletOutboundQuantity)//如果出库详情已分配数量小于托盘已分配数量,则可以继续添加该托盘出库信息
                    //{
                    float orderDetailNeedQuantity = item.ScrapPcsQty - detailAssignQuantity;
                    if (orderDetailNeedQuantity > assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity))
                    {
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesRworkOutboundOrderService.cs
@@ -26,6 +26,8 @@
using WIDESEA_OutboundRepository;
using WIDESEA_Common.APIEnum;
using WIDESEA_Common.OrderEnum;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using System.Reflection.Metadata;
namespace WIDESEA_OutboundService
{
@@ -66,63 +68,50 @@
            Dt_MesRworkOutboundOrder assignOutOrder= new Dt_MesRworkOutboundOrder();
            List<Dt_OutProStockInfo> outProStockInfos=new List<Dt_OutProStockInfo>();
            List<Dt_LocationInfo> locationInfos=new List<Dt_LocationInfo>();
            float originalNeedQuantity = mesRworkOutboundOrder.RequiredQuantity;
            float needQuantity = originalNeedQuantity;
            float needQty = mesRworkOutboundOrder.RequiredQuantity;
            //查找可用库存
            List<Dt_ProStockInfo> stockInfoss = _stockService.ProStockInfoService.GetUseableStocks(mesRworkOutboundOrder);
            if (!stockInfoss.Any())
            {
                throw new Exception("未找到可分配库存");
            }
            List<Dt_ProStockInfo> autoAssignStocks = _stockService.ProStockInfoService.GetOutboundStocks(stockInfoss,mesRworkOutboundOrder, needQuantity,out float residueQuantity);
            mesRworkOutboundOrder.LockQuantity += needQuantity - residueQuantity;
            autoAssignStocks.OrderBy(x => x.proStockInfoDetails.FirstOrDefault()?.StockPcsQty).ToList();
            proStockInfos.AddRange(autoAssignStocks);
            float assignQuantity = needQuantity - residueQuantity;
            //获取出库库存
            List<Dt_ProStockInfo> assignOutStocks = _stockService.ProStockInfoService.GetOutboundStocks(stockInfoss, mesRworkOutboundOrder, needQty, out float residueQuantity);
            mesRworkOutboundOrder.LockQuantity += needQty - residueQuantity;
            if (mesRworkOutboundOrder.RequiredQuantity > mesRworkOutboundOrder.LockQuantity)
            {
                throw new Exception($"产品编码{mesRworkOutboundOrder.ProductCode},版本{mesRworkOutboundOrder.ProductVersion}可分配数量不足,可用数量{mesRworkOutboundOrder.LockQuantity}");
            }
            proStockInfos.AddRange(assignOutStocks);
            //分配出库的PCS数量
            float assignQuantity = needQty;
            //订单明细的出库PCS数量
            float orderQuantity = mesRworkOutboundOrder.RequiredQuantity;
            bool isCanDate = string.IsNullOrEmpty(mesRworkOutboundOrder.DateCode);
            for (int j = 0; j < autoAssignStocks.Count; j++)
            for (int j = 0; j < assignOutStocks.Count; j++)
            {
                //出库订单明细已分配数量
                float detailAssignQuantity = outProStockInfos
                    .Where(x => x.SaleOrder == mesRworkOutboundOrder.SaleOrder
                    && x.PCode == mesRworkOutboundOrder.ProductCode
                    && x.PVer == mesRworkOutboundOrder.ProductVersion
                    && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode))
                    .Sum(x => x.AssignQuantity);
                float detailAssignQuantity = outProStockInfos.Where(x => x.OrderDetailId == mesRworkOutboundOrder.Id).Sum(x => x.AssignQuantity);
                //出库详情已分配数量
                float palletAssignQuantity = outProStockInfos
                    .Where(x => x.SaleOrder == mesRworkOutboundOrder.SaleOrder
                    && x.PCode == mesRworkOutboundOrder.ProductCode
                    && x.PVer == mesRworkOutboundOrder.ProductVersion
                    && x.PalletCode == autoAssignStocks[j].PalletCode
                    && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode))
                    .Sum(x => x.AssignQuantity);
                float palletOutboundQuantity = autoAssignStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
                if (palletAssignQuantity < palletOutboundQuantity)//如果出库详情已分配数量小于托盘已分配数量,则可以继续添加该托盘出库信息
                //所剩数量
                float orderDetailNeedQuantity = mesRworkOutboundOrder.RequiredQuantity - detailAssignQuantity;
                //生成出库详情
                if (orderDetailNeedQuantity > assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity))
                {
                    float orderDetailNeedQuantity = mesRworkOutboundOrder.RequiredQuantity - detailAssignQuantity;
                    if (orderDetailNeedQuantity > autoAssignStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity)
                    {
                        mesRworkOutboundOrder.LockQuantity += autoAssignStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity;
                        Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(mesRworkOutboundOrder, autoAssignStocks[j], autoAssignStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity);
                        outProStockInfos.Add(outStockLockInfo);
                    }
                    else
                    {
                        Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(mesRworkOutboundOrder, autoAssignStocks[j], mesRworkOutboundOrder.RequiredQuantity-mesRworkOutboundOrder.LockQuantity);
                        outProStockInfos.Add(outStockLockInfo);
                        mesRworkOutboundOrder.LockQuantity = mesRworkOutboundOrder.RequiredQuantity;
                        break;
                    }
                    mesRworkOutboundOrder.LockQuantity += assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
                    Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(mesRworkOutboundOrder, assignOutStocks[j], assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity));
                    outProStockInfos.Add(outStockLockInfo);
                }
                else
                {
                    Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(mesRworkOutboundOrder, assignOutStocks[j], mesRworkOutboundOrder.RequiredQuantity - detailAssignQuantity);
                    outProStockInfos.Add(outStockLockInfo);
                    mesRworkOutboundOrder.LockQuantity = mesRworkOutboundOrder.RequiredQuantity;
                    break;
                }
            }
            locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(proStockInfos.Select(x => x.LocationCode).ToList()));
            List<string> locationArr = proStockInfos.Select(x => x.LocationCode).ToList();
            locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(locationArr));
            return (proStockInfos, mesRworkOutboundOrder, outProStockInfos, locationInfos);
        }
@@ -311,6 +300,44 @@
            };
            return mesProductOutBound;
        }
        //库存板数据转换
        public MesProductOutBound MesProOutBound(Dt_MesRworkOutboundOrder mesRworkOutboundOrder, List<Dt_ProStockInfoDetail> proStockInfoDetails)
        {
            //获取仓库信息
            Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == mesRworkOutboundOrder.WarehouseId);
            List<MesInventoryInfo> inventoryInfos = new List<MesInventoryInfo>();
            foreach (var item in proStockInfoDetails.Where(x=>x.OutboundQuantity>0))
            {
                int setinterval = (int)item.StockPcsQty / (int)item.SETQty;
                if (setinterval == 0)
                {
                    throw new Exception($"{item.BagNo}获取SET数量转换失败");
                }
                item.OutSETQty = (int)item.OutboundQuantity / setinterval;
                if (item.OutSETQty == 0)
                {
                    throw new Exception($"{item.BagNo}获取SET数量转换失败");
                }
                MesInventoryInfo mesInventoryInfo = new MesInventoryInfo()
                {
                    Warhouseno = warehouse.WarehouseCode,
                    InternalPackageNumber = item.BagNo,
                    SetCount = (int)item.OutSETQty,
                    EligiblePcsCount = (int)item.OutboundQuantity
                };
                inventoryInfos.Add(mesInventoryInfo);
            }
            MesProductOutBound mesProductOutBound = new MesProductOutBound()
            {
                TaskNo = mesRworkOutboundOrder.TaskNo,
                ProductCode = mesRworkOutboundOrder.ProductCode,
                ProductVersion = mesRworkOutboundOrder.ProductVersion,
                DateCode = mesRworkOutboundOrder.DateCode,
                SaleOrder = mesRworkOutboundOrder.SaleOrder,
                InventoryInfo = inventoryInfos
            };
            return mesProductOutBound;
        }
        /// <summary>
        /// æˆå“åº“存板同步接口
        /// </summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderDetailService.cs
@@ -106,87 +106,6 @@
            {
                throw new Exception("未找到成品订单");
            }
            //List<Dt_ProOutOrderDetail> groupDetails = proOutOrderDetails.GroupBy(x => new { x.SaleOrder, x.PCode, x.PVer, x.PLot, x.DateCode }).Select(x => new Dt_ProOutOrderDetail()
            //{
            //    QtyPcs = x.Sum(x => x.QtyPcs) - x.Sum(x => x.OverQtyPcs),
            //    SaleOrder = x.Key.SaleOrder,
            //    PCode = x.Key.PCode,
            //    PVer = x.Key.PVer,
            //    PLot = x.Key.PLot,
            //    DateCode = x.Key.DateCode,
            //}).ToList();
            //foreach (var item in groupDetails)
            //{
            //    float needQty = item.QtyPcs;
            //    //查找可用库存
            //    List<Dt_ProStockInfo> stockInfoss = _stockInfoService.ProStockInfoService.GetUseableStocks(proOutOrder.WarehouseId, item);
            //    if (!stockInfoss.Any())
            //    {
            //        throw new Exception("未找到可分配库存");
            //    }
            //    //获取出库库存
            //    List<Dt_ProStockInfo> assignOutStocks = _stockInfoService.ProStockInfoService.GetOutboundStocks(stockInfoss, item, needQty, out float residueQuantity);
            //    item.LockQtyPcs += needQty - residueQuantity;
            //    if (item.QtyPcs> item.LockQtyPcs)
            //    {
            //        throw new Exception($"产品编码{item.PCode}可分配数量不足,可用数量{item.LockQtyPcs}");
            //    }
            //    outStocks.AddRange(assignOutStocks);
            //    float assignQuantity = needQty - residueQuantity;
            //    bool isCanLot = string.IsNullOrEmpty(item.PLot);
            //    bool isCanDate = string.IsNullOrEmpty(item.DateCode);
            //    List<Dt_ProOutOrderDetail> details = proOutOrderDetails
            //        .Where(x =>x.PCode == item.PCode && x.PVer == item.PVer
            //        && (isCanLot ? isCanLot : x.PLot == item.PLot)
            //        && (isCanDate ? isCanDate : x.DateCode == item.DateCode))
            //        .ToList();
            //    for (int i = 0; i < details.Count; i++)
            //    {
            //        float orderQuantity = details[i].QtyPcs;
            //        for (int j = 0; j < assignOutStocks.Count; j++)
            //        {
            //            //出库订单明细已分配数量
            //            float detailAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
            //                && (isCanLot ? isCanLot : x.PLot == item.PLot)
            //                && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
            //                && x.OrderDetailId == details[i].Id).Sum(x => x.AssignQuantity);
            //            float palletAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
            //                && (isCanLot ? isCanLot : x.PLot == item.PLot)
            //                && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
            //                && x.PalletCode == assignOutStocks[j].PalletCode).Sum(x => x.AssignQuantity);
            //            //出库详情已分配数量
            //            palletAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
            //                && (isCanLot ? isCanLot : x.PLot == item.PLot)
            //                && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
            //                && x.PalletCode == assignOutStocks[j].PalletCode).Sum(x => x.AssignQuantity);//出库详情已分配数量
            //            float palletOutboundQuantity = assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
            //            if (palletAssignQuantity < palletOutboundQuantity)//如果出库详情已分配数量小于托盘已分配数量,则可以继续添加该托盘出库信息
            //            {
            //                float orderDetailNeedQuantity = details[i].QtyPcs - detailAssignQuantity;
            //                if (orderDetailNeedQuantity > assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity)
            //                {
            //                    details[i].LockQtyPcs += assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity;
            //                    Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, details[i], assignOutStocks[j], assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity);
            //                    outProStockInfos.Add(outStockLockInfo);
            //                }
            //                else
            //                {
            //                    Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, details[i], assignOutStocks[j], details[i].QtyPcs - details[i].LockQtyPcs);
            //                    outProStockInfos.Add(outStockLockInfo);
            //                    details[i].LockQtyPcs = details[i].QtyPcs;
            //                    break;
            //                }
            //            }
            //        }
            //    }
            //    List<string> locationArr = outStocks.Select(x => x.LocationCode).ToList();
            //    locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(locationArr));
            //}
            foreach (var item in proOutOrderDetails)
            {
                float needQty = item.QtyPcs;
@@ -206,39 +125,29 @@
                outStocks.AddRange(assignOutStocks);
                //分配出库的PCS数量
                float assignQuantity = needQty;
                bool isCanLot = string.IsNullOrEmpty(item.PLot);
                bool isCanDate = string.IsNullOrEmpty(item.DateCode);
                //订单明细的出库PCS数量
                float orderQuantity = item.QtyPcs;
                for (int j = 0; j < assignOutStocks.Count; j++)
                {
                    //出库订单明细已分配数量
                    float detailAssignQuantity = outProStockInfos.Where(x => x.OrderDetailId == item.Id).Sum(x => x.AssignQuantity);
                    ////出库详情已分配数量
                    //float palletAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
                    //    && (isCanLot ? isCanLot : x.PLot == item.PLot)
                    //    && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
                    //    && x.PalletCode == assignOutStocks[j].PalletCode).Sum(x => x.AssignQuantity);
                    ////出库详情已分配数量
                    //float palletOutboundQuantity = assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
                    //if (palletAssignQuantity < palletOutboundQuantity)//如果出库详情已分配数量小于托盘已分配数量,则可以继续添加该托盘出库信息
                    //{
                        float orderDetailNeedQuantity = item.QtyPcs - detailAssignQuantity;
                        if (orderDetailNeedQuantity > assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity))
                        {
                            item.LockQtyPcs += assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
                            Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, item, assignOutStocks[j], assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity));
                            outProStockInfos.Add(outStockLockInfo);
                        }
                        else
                        {
                            Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, item, assignOutStocks[j], item.QtyPcs - detailAssignQuantity);
                            outProStockInfos.Add(outStockLockInfo);
                            item.LockQtyPcs = item.QtyPcs;
                            break;
                        }
                    //}
                    float orderDetailNeedQuantity = item.QtyPcs - detailAssignQuantity;
                    //生成出库详情
                    if (orderDetailNeedQuantity > assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity))
                    {
                        item.LockQtyPcs += assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
                        Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, item, assignOutStocks[j], assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity));
                        outProStockInfos.Add(outStockLockInfo);
                    }
                    else
                    {
                        Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, item, assignOutStocks[j], item.QtyPcs - detailAssignQuantity);
                        outProStockInfos.Add(outStockLockInfo);
                        item.LockQtyPcs = item.QtyPcs;
                        break;
                    }
                }
                List<string> locationArr = outStocks.Select(x => x.LocationCode).ToList();
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_StockRepository/ProStockInfoRepository.cs
@@ -74,7 +74,7 @@
        {
            List<Dt_ProStockInfo>? proStockInfos = null;
            bool isCanDate = string.IsNullOrEmpty(mesRworkOutboundOrder.DateCode);
            proStockInfos = Db.Queryable<Dt_ProStockInfo>().Where(x => locationInfos.Contains(x.LocationCode) && x.ProStockAttribute==ProStockAttributeEnum.尾数.ObjToInt())
            proStockInfos = Db.Queryable<Dt_ProStockInfo>().Where(x => locationInfos.Contains(x.LocationCode))
                .Includes(x => x.proStockInfoDetails)
                .Where(x => x.proStockInfoDetails
                .Any(v => v.SaleOrder == mesRworkOutboundOrder.SaleOrder
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs
@@ -339,47 +339,6 @@
                    index++;
                }
            }
            else
            {
                for (int i = 0; i < stockInfos.Count; i++)
                {
                    Dt_ProStockInfo stockInfo = stockInfos[i];
                    float useableStockQuantity = stockInfo.proStockInfoDetails
                        .Where(x => x.SaleOrder == mesRworkOutboundOrder.SaleOrder
                            && x.ProductCode == mesRworkOutboundOrder.ProductCode
                            && x.ProductVersion == mesRworkOutboundOrder.ProductVersion
                            && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode))
                        .Sum(x => x.StockPcsQty - x.OutboundQuantity);
                    if (useableStockQuantity < needQuantity)
                    {
                        stockInfo.proStockInfoDetails.ForEach(x => x.OutboundQuantity = x.StockPcsQty);
                        needQuantity -= useableStockQuantity;
                    }
                    else
                    {
                        stockInfo.proStockInfoDetails.ForEach(x =>
                        {
                            if (x.StockPcsQty > x.OutboundQuantity && x.SaleOrder == mesRworkOutboundOrder.SaleOrder
                                && x.ProductCode == mesRworkOutboundOrder.ProductCode
                                && x.ProductVersion == mesRworkOutboundOrder.ProductVersion
                                && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode))
                            {
                                if (x.StockPcsQty - x.OutboundQuantity >= needQuantity)
                                {
                                    x.OutboundQuantity += needQuantity;
                                    needQuantity = 0;
                                }
                                else
                                {
                                    needQuantity -= (x.StockPcsQty - x.OutboundQuantity);
                                    x.OutboundQuantity = x.StockPcsQty;
                                }
                            }
                        });
                    }
                    assignOutStocks.Add(stockInfo);
                }
            }
            residueQuantity = needQuantity;
            return assignOutStocks;
        }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesProductService.cs
@@ -541,6 +541,7 @@
                {
                    return content.Error($"提库任务单{model.TaskNo}已存在");
                }
                //生成提库单
                Dt_MesRworkOutboundOrder mesRworkOutboundOrder = new Dt_MesRworkOutboundOrder()
                {
                    WarehouseId = warehouse.WarehouseId,
@@ -560,6 +561,7 @@
                List<Dt_ProStockInfo>? proStockInfos = null;
                List<Dt_OutProStockInfo>? outProStockInfos = null;
                List<Dt_LocationInfo>? locationInfos = null;
                List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>();
                //分配库存生成提库任务
                (List<Dt_ProStockInfo>?, Dt_MesRworkOutboundOrder?, List<Dt_OutProStockInfo>?, List<Dt_LocationInfo>) result = _outboundService.RworkOutboundOrderService.AssignMesStocks(mesRworkOutboundOrder);
                if (result.Item1 != null && result.Item1.Count > 0)
@@ -585,6 +587,10 @@
                    x.TargetAddress = "5236";
                    x.OrderNo = mesRworkOutboundOrder.TaskNo;
                });
                proStockInfos.ForEach(x =>
                {
                    proStockInfoDetails.AddRange(x.proStockInfoDetails);
                });
                _unitOfWorkManage.BeginTran();
                int id = BaseDal.AddData(tasks);
@@ -604,6 +610,12 @@
                    }
                }
                _outboundService.RworkOutboundOrderService.Repository.AddData(mesRworkOutboundOrder);
                //MES成品库存板出库同步
                WebResponseContent responseContent = _outboundService.RworkOutboundOrderService.ProductOutBoundSync(_outboundService.RworkOutboundOrderService.MesProOutBound(mesRworkOutboundOrder, proStockInfoDetails));
                if (!responseContent.Status)
                {
                    throw new Exception("同步MES库存板出库失败,错误:" + responseContent.Message);
                }
                _unitOfWorkManage.CommitTran();
                return content.OK("提供返库单接收成功");
            }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -1073,7 +1073,6 @@
                }
                proStockInfoDetails.ForEach(x =>
                {
                    x.OutboundQuantity = 0;
                    x.ProOutDetailStatus = StockStatusEmun.出库完成.ObjToInt();
                });
                proStockInfo.StockStatus = StockStatusEmun.出库完成.ObjToInt();
@@ -1087,6 +1086,7 @@
                //货位变动记录
                int beforeStatus = locationInfo.LocationStatus;
                locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
                _outboundRepository.ErpProScrapDetailRepository.UpdateData(erpProScrapSheetDetail);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, proStockInfo.PalletType, LocationStatusEnum.Free, locationInfo.WarehouseId);
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, (LocationStatusEnum)beforeStatus, LocationStatusEnum.Free, LocationChangeType.OutboundCompleted, erpProScrapSheet?.ProScrapSheetOrderNo ?? "", task.TaskNum);
                _stockRepository.ProStockInfoRepository.UpdateData(proStockInfo);