helongyang
17 小时以前 6f8fe2fc191fb466e3141a6e915d6aa63802c269
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -1,4 +1,6 @@
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using System;
using System.Collections;
using System.Collections.Generic;
@@ -9,12 +11,14 @@
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.OtherEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.Helper;
using WIDESEA_DTO;
using WIDESEA_DTO.MES;
using WIDESEA_DTO.Task;
using WIDESEA_Model.Models;
@@ -72,6 +76,10 @@
                {
                    Dt_LocationInfo locationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.WarehouseId == warehouseId);
                    if (locationInfo == null) return WebResponseContent.Instance.Error($"未找到当前库区货位信息");
                    if (stationCode!= "8005")
                    {
                        return WebResponseContent.Instance.Error($"起点错误:{stationCode}");
                    }
                    return DeviceRequestInboundTask(stationCode, locationInfo.RoadwayNo, palletCode);
                }
                else
@@ -88,7 +96,9 @@
                        TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                        TaskStatus = TaskStatusEnum.New.ObjToInt(),
                        WarehouseId = stockInfo.WarehouseId,
                        PalletType = stockInfo.PalletType
                        PalletType = stockInfo.PalletType,
                        MaterielCode = stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode,
                        Quantity = (float)stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).Sum(x => x.StockQuantity),
                    };
                    //获取是否存在入库单
                    Dt_InboundOrder? inboundOrder =  null;
@@ -127,6 +137,15 @@
                    else
                    {
                        stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
                    }
                    if (warehouse.WarehouseCode==WarehouseEnum.HA57.ToString())
                    {
                        Dt_Task dt_TaskMesReturn = BaseDal.QueryFirst(x=>x.TaskType==TaskTypeEnum.MesMatReturn.ObjToInt() && x.TaskStatus!=TaskStatusEnum.SC_Executing.ObjToInt());
                        if (dt_TaskMesReturn!=null)
                        {
                            return WebResponseContent.Instance.Error($"退料任务正执行");
                        }
                    }
                    _unitOfWorkManage.BeginTran();
                    int taskId = BaseDal.AddData(newTask);
@@ -200,7 +219,7 @@
                _stockRepository.StockInfoRepository.AddData(stockInfo);
                _unitOfWorkManage.CommitTran();
                PushTasksToWCS(new List<Dt_Task> { newTask });
                PutFinish(address);
                PutFinish(address, newTask.PalletCode, newTask.TaskNum.ToString());
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
@@ -269,7 +288,7 @@
        /// <param name="roadwayNo"></param>
        /// <param name="palletCode"></param>
        /// <returns></returns>
        public WebResponseContent DeviceRequestInboundTask(string stationCode, string roadwayNo, string palletCode)
        public WebResponseContent DeviceRequestInboundTask(string stationCode, string roadwayNo, string palletCode,string materielBoxCode = "")
        {
            try
            {
@@ -284,7 +303,80 @@
                {
                    return WebResponseContent.Instance.Error($"该站点已有未执行的任务");
                }
                if (!string.IsNullOrEmpty(materielBoxCode))
                {
                    _unitOfWorkManage.BeginTran();
                    WebResponseContent responseGroup = _inboundOrderService.MaterielPPorGM(materielBoxCode);
                    if (!responseGroup.Status)
                    {
                        return WebResponseContent.Instance.Error($"{responseGroup.Message}");
                    }
                    Dt_StockInfo stockInfoPPorGM = responseGroup.Data as Dt_StockInfo ?? null;
                    if (stockInfoPPorGM==null)
                    {
                        return WebResponseContent.Instance.Error($"组盘数据转换失败");
                    }
                    Dt_LocationInfo? locationInfoPPorGM = _basicService.LocationInfoService.AssignLocation(roadwayNo, stockInfoPPorGM.PalletType, stockInfoPPorGM.WarehouseId);
                    if (locationInfoPPorGM == null)
                    {
                        return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位");
                    }
                    Dt_Task newTaskPPorGM = new Dt_Task()
                    {
                        CurrentAddress = stationCode,
                        Grade = 0,
                        NextAddress = locationInfoPPorGM.LocationCode,
                        PalletCode = stockInfoPPorGM.PalletCode,
                        Roadway = roadwayNo,
                        SourceAddress = stationCode,
                        TargetAddress = locationInfoPPorGM.LocationCode,
                        TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                        TaskStatus = TaskStatusEnum.New.ObjToInt(),
                        WarehouseId = stockInfoPPorGM.WarehouseId,
                        PalletType = stockInfoPPorGM.PalletType,
                        TaskLength= stockInfoPPorGM.StockLength,
                    };
                    string MaterielCodeGMPP = stockInfoPPorGM.Details?.Where(x => x.StockId == stockInfoPPorGM.Id).FirstOrDefault()?.MaterielCode;
                    float QuantityGMPP = (float)stockInfoPPorGM.Details?.Where(x => x.StockId == stockInfoPPorGM.Id).Sum(x => x.StockQuantity);
                    if (MaterielCodeGMPP != null && QuantityGMPP != null)
                    {
                        newTaskPPorGM.MaterielCode = MaterielCodeGMPP;
                        newTaskPPorGM.Quantity = QuantityGMPP;
                    }
                    //获取是否存在入库单
                    Dt_InboundOrder? inboundOrderPPorGM = null;
                    if (stockInfoPPorGM != null && stockInfoPPorGM.Details.Count > 0)
                    {
                        string? orderNo = stockInfoPPorGM.Details.FirstOrDefault()?.OrderNo ?? "";
                        inboundOrderPPorGM = _inboundOrderService.Repository.QueryFirst(x => x.InboundOrderNo == orderNo && x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt());
                    }
                    if (inboundOrderPPorGM != null)
                    {
                        if (inboundOrderPPorGM.OrderType == InOrderTypeEnum.Allocat.ObjToInt())
                        {
                            newTaskPPorGM.TaskType = TaskTypeEnum.InAllocate.ObjToInt();
                        }
                        else if (inboundOrderPPorGM.OrderType == InOrderTypeEnum.Return.ObjToInt())
                        {
                            newTaskPPorGM.TaskType = TaskTypeEnum.ProductionReturn.ObjToInt();
                        }
                    }
                    stockInfoPPorGM.StockStatus = StockStatusEmun.入库确认.ObjToInt();
                    LocationStatusEnum lastStatusPPorGM = (LocationStatusEnum)locationInfoPPorGM.LocationStatus;
                    _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfoPPorGM, lastStatusPPorGM, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation);
                    _basicService.LocationInfoService.UpdateLocationStatus(locationInfoPPorGM, newTaskPPorGM.PalletType, LocationStatusEnum.Lock, newTaskPPorGM.WarehouseId);
                    int taskIdPPorGM = BaseDal.AddData(newTaskPPorGM);
                    newTaskPPorGM.TaskId = taskIdPPorGM;
                    _stockRepository.StockInfoRepository.Db.InsertNav(stockInfoPPorGM).Include(x => x.Details).ExecuteCommand();
                    _unitOfWorkManage.CommitTran();
                    WMSTaskDTO wMSTaskDTOPPorGM = _mapper.Map<WMSTaskDTO>(newTaskPPorGM);
                    PushTasksToWCS(new List<Dt_Task> { newTaskPPorGM });
                    return WebResponseContent.Instance.OK(data: wMSTaskDTOPPorGM);
                }
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
                if (stockInfo == null)
                {
@@ -317,8 +409,15 @@
                    TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = stockInfo.WarehouseId,
                    PalletType = stockInfo.PalletType
                    PalletType = stockInfo.PalletType,
                };
                string MaterielCode = stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode;
                float Quantity = (float)stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).Sum(x => x.StockQuantity);
                if (MaterielCode != null && Quantity != null)
                {
                    newTask.MaterielCode = MaterielCode;
                    newTask.Quantity = Quantity;
                }
                //获取是否存在入库单
                Dt_InboundOrder? inboundOrder = null;
@@ -349,6 +448,7 @@
                }
                else if (stockInfo.StockStatus == StockStatusEmun.拣选完成.ObjToInt())
                {
                    stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
                    newTask.TaskType = TaskTypeEnum.InPick.ObjToInt();
                }
                else
@@ -367,7 +467,7 @@
                WMSTaskDTO wMSTaskDTO = _mapper.Map<WMSTaskDTO>(newTask);
                PushTasksToWCS(new List<Dt_Task> { newTask });
                if (newTask.WarehouseId == 5) PutFinish(stationCode);
                if (newTask.WarehouseId == 5) PutFinish(stationCode.ToString(),newTask.PalletCode, newTask.TaskNum.ToString());
                return WebResponseContent.Instance.OK(data: wMSTaskDTO);
            }
            catch (Exception ex)
@@ -398,8 +498,7 @@
                {
                    return WebResponseContent.Instance.Error($"该站点已有未执行的任务");
                }
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
                if (stockInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到组盘信息");
@@ -425,9 +524,15 @@
                    TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = stockInfo.WarehouseId,
                    PalletType = stockInfo.PalletType
                    PalletType = stockInfo.PalletType,
                };
                string MaterielCode = stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode;
                float Quantity = (float)stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).Sum(x => x.StockQuantity);
                if (MaterielCode != null && Quantity != null)
                {
                    newTask.MaterielCode = MaterielCode;
                    newTask.Quantity = (float)Quantity;
                }
                if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
                {
@@ -462,7 +567,7 @@
                WMSTaskDTO wMSTaskDTO = _mapper.Map<WMSTaskDTO>(newTask);
                PushTasksToWCS(new List<Dt_Task> { newTask });
                if (newTask.WarehouseId == 5) PutFinish(stationCode);
                if (newTask.WarehouseId == 5) PutFinish(stationCode, newTask.PalletCode, newTask.TaskNum.ToString());
                return WebResponseContent.Instance.OK(data: wMSTaskDTO);
            }
            catch (Exception ex)
@@ -498,7 +603,7 @@
                string roadwayNo = AssignRoadwayNo(staions, palletCode, heightType);
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
                if (stockInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到组盘信息");
@@ -524,9 +629,15 @@
                    TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = stockInfo.WarehouseId,
                    PalletType = stockInfo.PalletType
                    PalletType = stockInfo.PalletType,
                };
                string MaterielCode = stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode;
                float Quantity = (float)stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).Sum(x => x.StockQuantity);
                if (MaterielCode != null && Quantity != null)
                {
                    newTask.MaterielCode = MaterielCode;
                    newTask.Quantity = Quantity;
                }
                if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
                {
                    stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
@@ -660,6 +771,107 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent RequestZHInboundTask(string agvTaskCode, string palletCode, string palletType, string materialLot)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取测试架原库存信息
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA154.ToString());
                //获取库存记录
                List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x =>
                  x.WarehouseId == warehouse.WarehouseId && x.PalletCode== palletCode).Includes(x => x.Details).ToList();
                if (stockInfos.Count > 0)
                {
                    return content.Error($"载具托盘已存在");
                }
                Dt_StockInfo? stockInfoOld = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == materialLot));
                if (stockInfoOld != null)
                {
                    return content.Error($"库存信息已存在");
                }
                Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x=>x.CodeStartStr== palletType);
                if (palletTypeInfo == null)
                {
                    return content.Error($"托盘类型信息不存在");
                }
                ////获取阻焊批次
                //WebResponseContent requestLotInfo = GetZHMesMaterialLot(materialLot);
                //if (!requestLotInfo.Status)
                //{
                //    return content.Error($"请求阻焊批次信息失败,{requestLotInfo.Message}");
                //}
                //MesLotInfoModel mesLotInfo = JsonConvert.DeserializeObject<MesLotInfoModel>(requestLotInfo.Data.ToString());
                MesLotInfoModel mesLotInfo = new MesLotInfoModel()
                {
                    Product="FH001",
                    ProductVersion="A1",
                    Qty=20,
                    LotNo= materialLot,
                    IsFullNumber=true
                };
                Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
                {
                    MaterielSpec = mesLotInfo.ProductVersion,
                    BatchNo = materialLot,
                    EffectiveDate = mesLotInfo.DateCode ?? " ",
                    MaterielCode = mesLotInfo.Product,
                    InboundOrderRowNo =  0,
                    MaterielName = mesLotInfo.Product,
                    ProductionDate = mesLotInfo.DateCode ?? " ",
                    OrderNo = "",
                    OutboundQuantity = 0,
                    SerialNumber = materialLot,
                    StockQuantity = (float)mesLotInfo.Qty,
                    Status = StockStatusEmun.入库确认.ObjToInt(),
                    Unit = "Lot",
                    Remark= mesLotInfo.IsFullNumber?"满Lot":"不满Lot"
                };
                Dt_StockInfo stockInfo = new Dt_StockInfo()
                {
                    PalletCode = palletCode,
                    PalletType = palletTypeInfo.PalletType,
                    WarehouseId = warehouse.WarehouseId,
                    StockStatus = StockStatusEmun.入库确认.ObjToInt(),
                    Details = new List<Dt_StockInfoDetail> { stockInfoDetail }
                };
                //生成退库任务
                Dt_Task taskIn = new()
                {
                    CurrentAddress = "AGV_ZH",
                    Grade = 0,
                    PalletCode = palletCode,
                    NextAddress = "",
                    Roadway = "SC01_ZH",
                    SourceAddress = "AGV_ZH",
                    TargetAddress = "",
                    TaskStatus = (int)TaskStatusEnum.New,
                    TaskType = palletTypeInfo.LocaitonCount==2? (int)TaskTypeEnum.InZHProductLarge : (int)TaskTypeEnum.InZHProductSmall,
                    TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                    PalletType = palletTypeInfo.PalletType,
                    WarehouseId = warehouse.WarehouseId,
                    MaterielCode = mesLotInfo.Product,
                    Quantity = (float)mesLotInfo.Qty,
                };
                _unitOfWorkManage.BeginTran();
                Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand();
                BaseDal.AddData(taskIn);
                //BaseDal.AddData(task);
                _unitOfWorkManage.CommitTran();
                //将任务推送到WCS
                PushTasksToWCS(new List<Dt_Task>() { taskIn }, "AGV_ZH", agvTaskCode);
                content.OK(data: taskIn);
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
        public readonly string[] OutStartPonits = { "5230", "5237", "5244" };
        /// <summary>
        /// æˆå“ä½™æ–™é€€åº“入仓
@@ -752,7 +964,9 @@
                    TaskType = TaskTypeEnum.InProductBack.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = warePoint.WarehouseId,
                    PalletType = proStockInfo.PalletType
                    PalletType = proStockInfo.PalletType,
                    MaterielCode = proStockInfo.proStockInfoDetails?.Where(x => x.ProStockId == proStockInfo.Id).FirstOrDefault()?.ProductCode,
                    Quantity = (float)proStockInfo.proStockInfoDetails?.Where(x => x.ProStockId == proStockInfo.Id).Sum(x => x.StockPcsQty)
                };
                _unitOfWorkManage.BeginTran();
                int taskId = BaseDal.AddData(newTask);