wangxinhui
3 天以前 225d11e2ddaa55d1d482201cb4d89c9486cdba69
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs
@@ -20,6 +20,7 @@
using WIDESEA_Core.CodeConfigEnum;
using Microsoft.AspNetCore.Mvc;
using WIDESEA_DTO.ERP;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
namespace WIDESEA_TaskInfoService
{
@@ -78,12 +79,108 @@
            return content;
        }
        /// <summary>
        /// é€‰å®šåº“存生成盘点单出库
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public WebResponseContent TakeOutbound(List<StockViewDTO> stockViews)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (stockViews.Select(x=>x.WarehouseId).Distinct().Count()>=2)
                {
                    return content.Error($"请选择同一仓库库存进行盘点");
                }
                List<int> ids = stockViews.Select(x => x.StockId).ToList();
                //获取库存
                List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => ids.Contains(x.Id)).Includes(x => x.Details).ToList();
                if (stockInfos.Count!= stockViews.Count)
                {
                    StockViewDTO? stockViewDTO = stockViews.FirstOrDefault(x=> !stockInfos.Select(x=>x.PalletCode).ToList().Contains(x.PalletCode));
                    return content.Error($"未找到{stockViewDTO?.PalletCode}库存");
                }
                //获取货位
                List<string> locStrs = stockInfos.Select(x => x.LocationCode).ToList();
                List<Dt_LocationInfo> locationInfos =_basicRepository.LocationInfoRepository.QueryData(x=> locStrs.Contains(x.LocationCode));
                if (stockInfos.Count != locationInfos.Count)
                {
                    string? locStr = locStrs.FirstOrDefault(x=> !locationInfos.Select(x => x.LocationCode).ToList().Contains(x));
                    return content.Error($"未找到{locStr}货位数据");
                }
                Dt_TakeStockOrder takeStockOrder = new Dt_TakeStockOrder()
                {
                    WarehouseId = stockInfos.FirstOrDefault().WarehouseId,
                    TakeStockStatus = TakeStockStatusEnum.盘点中.ObjToInt(),
                    Details = new List<Dt_TakeStockOrderDetail>()
                };
                foreach (var item in stockInfos)
                {
                    if (item.Details.Count<=0)
                    {
                        return content.Error($"未找到{item.PalletCode}库存明细数据");
                    }
                    Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x=>x.LocationCode==item.LocationCode);
                    if (locationInfo != null && (locationInfo.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || locationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt() && item.StockStatus == StockStatusEmun.入库完成.ObjToInt())
                    {
                        //创建明细
                        Dt_TakeStockOrderDetail takeStockOrderDetail = new Dt_TakeStockOrderDetail()
                        {
                            MaterielCode= item.Details.FirstOrDefault().MaterielCode,
                            MaterielName=item.Details.FirstOrDefault().MaterielName ?? "无物料名称",
                            BatchNo=item.Details.FirstOrDefault().BatchNo,
                            MaterielSpec=item.Details.FirstOrDefault().MaterielSpec ?? "无物料规格",
                            LocationCode=item.LocationCode,
                            TakePalletCode=item.PalletCode,
                            TakeDetalStatus=TakeStockDetailStatusEnum.盘点出库中.ObjToInt(),
                            Unit=item.Details.FirstOrDefault().Unit ?? "无单位",
                            SysQty=item.Details.Sum(x=>x.StockQuantity),
                            Qty=0
                        };
                        takeStockOrder.Details.Add(takeStockOrderDetail);
                    }
                    else
                    {
                        content.Error($"货位或库存状态不满足出库条件");
                    }
                }
                List<Dt_Task> tasks = GetTasks(stockInfos, TaskTypeEnum.OutInventory);
                if (tasks == null || tasks.Count <= 0)
                {
                    return content.Error($"生成任务失败");
                }
                stockInfos.ForEach(x =>
                {
                    x.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                });
                LocationStatusEnum locationStatus = LocationStatusEnum.Lock;
                _unitOfWorkManage.BeginTran();
                //更新库存状态
                _stockRepository.StockInfoRepository.UpdateData(stockInfos);
                _inboundRepository.TakeStockOrderRepository.Db.InsertNav(takeStockOrder).Include(x=>x.Details).ExecuteCommand();
                //新建任务
                BaseDal.AddData(tasks);
                //加入货位变动记录
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, locationStatus, LocationChangeType.OutboundAssignLocation, "", tasks?.Select(x => x.TaskNum).ToList());
                _basicService.LocationInfoService.Repository.UpdateLocationStatus(locationInfos, locationStatus);
                _unitOfWorkManage.CommitTran();
                PushTasksToWCS(tasks);
                content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// ç”Ÿæˆæˆå“å‡ºåº“任务
        /// </summary>
        /// <param name="ProOutNo">出库订单号</param>
        /// <param name="StationCode">站台地址</param>
        /// <returns></returns>
        public async Task<WebResponseContent> OutProductTask(int[] keys, string StationCode)
        public async Task<WebResponseContent> OutProductTask(int[] keys, string StationCode, int Grade)
        {
            WebResponseContent content = new WebResponseContent();
            try
@@ -93,10 +190,10 @@
                    return await Task.FromResult(content.Error("线体输入错误"));
                }
                //获取成品出库订单
                List<Dt_ProOutOrderDetail> _ProOutOrderDetails = await _outboundRepository.ProOutOrderDetailRepository.QueryDataAsync(x => keys.Contains(x.Id));
                List<Dt_ProOutOrderDetail> _ProOutOrderDetails = await _outboundRepository.ProOutOrderDetailRepository.QueryDataAsync(x => keys.Contains(x.Id) && x.ProOrderDetailStatus== OrderDetailStatusEnum.New.ObjToInt());
                if (_ProOutOrderDetails.Count<=0)
                {
                    return await Task.FromResult(content.Error("勾选订单明细不存在"));
                    return await Task.FromResult(content.Error("勾选订单明细状态为出库中"));
                }
                List<Dt_Task> tasks = new List<Dt_Task>();
                List<StockSelectViewDTO> stockSelectViews = new List<StockSelectViewDTO>();
@@ -124,10 +221,26 @@
                }
                if (result.Item1 != null && result.Item1.Count > 0)
                {
                    Dt_Task? task = BaseDal.QueryData(x=>x.TaskType==TaskTypeEnum.OutProduct.ObjToInt()).OrderBy(x=>x.Grade).FirstOrDefault();
                    //更新出库目的位置
                    result.Item1.ForEach(x =>
                    {
                        x.TargetAddress = StationCode;
                        if (Grade==1 || task==null)
                        {
                            x.Grade = 127;
                        }
                        else
                        {
                            if (task.Grade==0 || task.Grade==1)
                            {
                                x.Grade = 1;
                            }
                            else
                            {
                                x.Grade = task.Grade - 1;
                            }
                        }
                    });
                    tasks.AddRange(result.Item1);
                }
@@ -422,9 +535,7 @@
                {
                    x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
                });
                string groupId = DateTime.Now.ToString("yyyyMMddHHmmss");
                tasks.ForEach(x => x.OrderNo = proOutOrder.ProOutOrderNo);
                tasks.ForEach(x => x.GroupId = groupId);
                proStockInfos = result.Item1;
                proOutOrderDetails = result.Item2;
                outProStockInfos = result.Item3;
@@ -445,10 +556,14 @@
        public List<Dt_Task> GetTasks(List<Dt_ProStockInfo> stockInfos, TaskTypeEnum taskType)
        {
            List<Dt_Task> tasks = new List<Dt_Task>();
            for (int i = 0; i < stockInfos.Count; i++)
            string groupId = DateTime.Now.ToString("yyMMddHHmmss");
            for (int i = 1; i <= stockInfos.Count; i++)
            {
                Dt_ProStockInfo stockInfo = stockInfos[i];
                Dt_ProStockInfo stockInfo = stockInfos[i-1];
                if (i%5==0)
                {
                    groupId= DateTime.Now.AddSeconds(i).ToString("yyMMddHHmmss");
                }
                if (stockInfo != null)
                {
                    Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode);
@@ -468,6 +583,9 @@
                            TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                            PalletType = stockInfo.PalletType,
                            WarehouseId = stockInfo.WarehouseId,
                            GroupId= groupId,
                            MaterielCode = stockInfo.proStockInfoDetails.Where(x => x.ProStockId == stockInfo.Id).FirstOrDefault()?.ProductCode,
                            Quantity = (float)stockInfo.proStockInfoDetails.Where(x => x.ProStockId == stockInfo.Id).Sum(x=> x.StockPcsQty)
                        };
                        tasks.Add(task);
                    }
@@ -506,7 +624,17 @@
                            TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                            PalletType = stockInfo.PalletType,
                            WarehouseId = stockInfo.WarehouseId,
                        };
                        if (taskType != TaskTypeEnum.OutEmpty)
                        {
                            task.MaterielCode = stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode;
                            task.Quantity = (float)stockInfo.Details.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.StockQuantity;
                        }
                        if (stockInfo.StockLength>0)
                        {
                            task.TaskLength = stockInfo.StockLength;
                        }
                        tasks.Add(task);
                    }
                }
@@ -751,7 +879,9 @@
                                StockId = x.Id,
                                TaskNum = 0,
                                OrderQuantity = OrderDetail.OrderQuantity,
                                Unit = OrderDetail.Unit
                                Unit = OrderDetail.Unit,
                                ProductionDate = v.ProductionDate,
                                EffectiveDate = v.EffectiveDate
                            };
                            outStockLockInfos.Add(outStockLockInfo);
                        }
@@ -851,6 +981,15 @@
                    {
                        x.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                    });
                    outboundOrderDetails.ForEach(x =>
                    {
                        x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
                    });
                    Dt_OutboundOrder outboundOrder = _outboundRepository.OutboundOrderRepository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId);
                    if (outboundOrder.OrderStatus != OutOrderStatusEnum.出库中.ObjToInt())
                    {
                        _outboundRepository.OutboundOrderRepository.UpdateData(outboundOrder);
                    }
                    WebResponseContent content = _outboundService.OutboundOrderDetailService.LockOutboundStockDataUpdate(stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks);
                    if (!content.Status)