刘磊
2024-11-20 083856c1cbe6ed951dcd93118250324af6271120
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
@@ -130,7 +130,7 @@
        {
            OpFlag = 1,
            Software = "WMS",
            EquipmentCode = "ECH001-B",
            EquipmentCode = "24MEJQ08-1091",
            TrayBarcode = stock.PalletCode,
            SerialNos = stock.StockInfoDetails.Select(x => new SerialNoOutDto
            {
@@ -254,91 +254,6 @@
    /// </summary>
    /// <param name="task">任务数据合集</param>
    /// <returns>返回结果集</returns>
    //public async Task<WebResponseContent> CompleteInboundTaskAsync(Dt_Task task)
    //{
    //    WebResponseContent content = new WebResponseContent();
    //    try
    //    {
    //        var boxing = await _boxingInfoRepository.QueryFirstNavAsync(x => x.PalletCode == task.PalletCode);
    //        var locationInf = await _locationRepository.QueryFirstAsync(x => x.LocationCode == task.TargetAddress);
    //        locationInf.LocationStatus = (int)LocationEnum.InStock;
    //        // 创建历史任务实例模型
    //        var taskHty = CreateHistoricalTask(task);
    //        // 创建库存实例模型
    //        DtStockInfo stock;
    //        if (boxing == null)
    //        {
    //            // 空托盘
    //            stock = new DtStockInfo()
    //            {
    //                PalletCode = task.PalletCode,
    //                LocationCode = task.TargetAddress,
    //                CreateDate = DateTime.Now,
    //                Creater = "system",
    //                IsFull = boxing.IsFull,
    //                StockInfoDetails = new List<DtStockInfoDetail>()
    //                {
    //                    new DtStockInfoDetail()
    //                    {
    //                         MaterielCode = "空托盘",
    //                         Id = 0,
    //                    }
    //                }
    //            };
    //        }
    //        else
    //        {
    //            // 实盘
    //            var boxDetail = boxing.BoxingInfoDetails.Adapt<List<DtStockInfoDetail>>();
    //            // 创建库存实例模型
    //            stock = new DtStockInfo()
    //            {
    //                PalletCode = task.PalletCode,
    //                LocationCode = task.TargetAddress,
    //                CreateDate = DateTime.Now,
    //                Creater = "system",
    //                IsFull = boxing.IsFull,
    //                StockInfoDetails = boxDetail,
    //            };
    //            AgingInputDto agingInputDto = new AgingInputDto()
    //            {
    //                SerialNos = boxing.BoxingInfoDetails
    //                    .Select(item => new SerialNoInDto { SerialNo = item.SerialNumber, PositionNo = item.OrderNo })
    //                    .ToList(),
    //                TrayBarcode = task.PalletCode,
    //                OpFlag = 1
    //            };
    //            var result = await _agingInOrOutInputService.GetOCVInputAsync(agingInputDto);
    //            stock.Remark = JsonConvert.DeserializeObject<ResponeAgingInputDto>(result.Data.ToString()).LinedProcessFeedbackTime;
    //            LogFactory.GetLog("任务完成").InfoFormat(true, "入库任务完成", $"货位地址:{task.TargetAddress},修改后货位数据:{locationInf}");
    //        }
    //        // 执行数据库事务
    //        bool isResult = await ExecuteTransaction(stock, taskHty, locationInf, task.TaskId);
    //        if (isResult)
    //            content.OK("入库任务完成成功");
    //        else
    //            content.Error("入库任务完成失败");
    //    }
    //    catch (Exception err)
    //    {
    //        Console.WriteLine(err.Message.ToString());
    //    }
    //    return content;
    //}
    /// <summary>
    /// 完成入库任务
    /// </summary>
    /// <param name="task">任务数据合集</param>
    /// <returns>返回结果集</returns>
    public async Task<WebResponseContent> CompleteInboundTaskAsync(Dt_Task task)
    {
        // 初始化响应内容
@@ -383,6 +298,8 @@
    /// </summary>
    private DtStockInfo CreateEmptyPalletStock(Dt_Task task, DtLocationInfo locationInf)
    {
        var loation = _locationRepository.QueryFirst(x => x.RoadwayNo == task.Roadway && x.LocationCode == task.TargetAddress);
        var area = _areaInfoRepository.QueryFirst(x => x.AreaID == loation.AreaId);
        return new DtStockInfo()
        {
            PalletCode = task.PalletCode,
@@ -390,7 +307,8 @@
            CreateDate = DateTime.Now,
            Creater = "system",
            IsFull = false,
            AreaCode = task.Roadway,
            AreaCode = area.AreaCode,
            LocationId = loation.Id,
            StockInfoDetails = new List<DtStockInfoDetail>()
            {
                new DtStockInfoDetail()
@@ -408,6 +326,8 @@
    /// </summary>
    private DtStockInfo CreateFullPalletStock(Dt_Task task, DtLocationInfo locationInf, DtBoxingInfo boxing)
    {
        var loation = _locationRepository.QueryFirst(x => x.RoadwayNo == task.Roadway && x.LocationCode == task.TargetAddress);
        var area = _areaInfoRepository.QueryFirst(x => x.AreaID == loation.AreaId);
        var boxDetail = boxing.BoxingInfoDetails.Adapt<List<DtStockInfoDetail>>();
        boxDetail.ForEach(x => { x.Status = (int)StockStateEmun.已入库; });
        var stock = new DtStockInfo()
@@ -417,7 +337,8 @@
            CreateDate = DateTime.Now,
            Creater = "system",
            IsFull = boxing.IsFull,
            AreaCode = task.Roadway,
            AreaCode = area.AreaCode,
            LocationId = loation.Id,
            StockInfoDetails = boxDetail,
        };
@@ -429,13 +350,16 @@
                .ToList(),
            TrayBarcode = task.PalletCode,
            OpFlag = 1,
            EquipmentCode = "ECH001-B",
            EquipmentCode = "24MEJQ08-1091",
            Software = "WMS"
        };
        var result = _agingInOrOutInputService.GetOCVInputAsync(agingInputDto).Result;
        var respone = JsonConvert.DeserializeObject<ResponeAgingInputDto>(result.Data.ToString());
        stock.LinedProcessFeedbackTime = respone.LinedProcessFeedbackTime;
        stock.SpecialParameterDuration = respone.SpecialParameterDuration;
        //2024年11月16日:新增字段计算应出库时间
        stock.OutboundTime = Convert.ToDateTime(respone.LinedProcessFeedbackTime).AddHours(Convert.ToDouble(respone.SpecialParameterDuration));
        stock.ProductionLine = respone.ProductionLine;
        // 记录日志
        LogFactory.GetLog("任务完成").InfoFormat(true, "入库任务完成", $"货位地址:{task.TargetAddress},修改后货位数据:{locationInf}");
@@ -527,13 +451,14 @@
                    return content.OK(data: taskDTO);
                }
            }
            // 创建一个TrayCellsStatusDto对象,并赋值
            TrayCellsStatusDto trayCells = new TrayCellsStatusDto()
            {
                Software = "WMS",
                TrayBarcode = input.PalletCode,
                //EquipmentCode = "EQ_CWJZ01"
                EquipmentCode = "ECH001-B"
                EquipmentCode = "24MEJQ08-1091"
            };
            // 调用GetTrayCellStatusAsync方法,获取整盘电芯
@@ -690,7 +615,7 @@
        // 创建一个ProcessApplyDto对象,并赋值
        return new ProcessApplyDto()
        {
            EquipmentCode = "ECH001-B",
            EquipmentCode = "24MEJQ08-1091",
            Software = "WMS",
            //WipOrderNo = result.BindCode,
            SerialNos = content.SerialNos.Select(item => new SerialNos
@@ -801,19 +726,19 @@
    /// </summary>
    private async Task<DtStockInfo> QueryStockInfoForRealTrayAsync(string areaCode, List<string> roadways)
    {
        // TODO时间根据MOM系统配置的出库时间来获取,暂时不知道MOM返回的时间是什么所以这里测试时候在改
        //return _stockInfoRepository.QueryFirstNavAsync(x => x.AreaCode == areaCode && Convert.ToDateTime(x.LinedProcessFeedbackTime).AddHours(Convert.ToDouble(x.SpecialParameterDuration)) < DateTime.Now
        //                        && x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && roadways.Contains(x.LocationInfo.RoadwayNo) && x.StockInfoDetails.Any(x => x.Status == (int)StockStateEmun.已入库) && x.LocationInfo.LocationStatus == (int)LocationEnum.InStock).Result;
        var area = await _areaInfoRepository.QueryFirstAsync(x => x.AreaCode == areaCode);
        var result = await _stockInfoRepository.Db.Queryable<DtStockInfo>().Where(x =>
            x.AreaCode == areaCode &&
            Convert.ToDateTime(x.LinedProcessFeedbackTime).AddHours(Convert.ToDouble(x.SpecialParameterDuration)) < DateTime.Now)
            .Includes(x => x.LocationInfo)
            .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && roadways.Contains(x.LocationInfo.RoadwayNo))
            .Includes(x => x.StockInfoDetails)
            .Where(x => x.StockInfoDetails.Any(detail => detail.Status == (int)StockStateEmun.已入库))
            .OrderBy(x => x.CreateDate)
            .FirstAsync();
        var result = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
            .Includes(x => x.LocationInfo) // 预加载LocationInfo
            .Includes(x => x.StockInfoDetails) // 预加载StockInfoDetails
            .Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull == true) // 过滤条件
            .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID) // 过滤条件
            .OrderBy(x => x.OutboundTime) // 排序
            .FirstAsync(); // 获取第一个元素
        //var firstOrDefault = result.FirstOrDefault(x => roadways.Contains(x.LocationInfo.RoadwayNo)); // 查找第一个匹配的元素
        //var firstOrDefault = result[0]; // 查找第一个匹配的元素
        //return firstOrDefault;
        return result;
    }
@@ -822,14 +747,19 @@
    /// </summary>
    private async Task<DtStockInfo> QueryStockInfoForEmptyTrayAsync(string areaCode, List<string> roadways)
    {
        //return _stockInfoRepository.QueryFirstNavAsync(x => x.StockInfoDetails.Any(x => x.MaterielCode == "空托盘") && roadways.Contains(x.LocationInfo.RoadwayNo) && x.StockInfoDetails.Any(x => x.Status == (int)StockStateEmun.已入库) && x.LocationInfo.LocationStatus == (int)LocationEnum.InStock).Result;
        var area = await _areaInfoRepository.QueryFirstAsync(x => x.AreaCode == areaCode);
        var result = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
            .Includes(x => x.LocationInfo)
            .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && roadways.Contains(x.LocationInfo.RoadwayNo))
            .Includes(x => x.StockInfoDetails)
            .Where(x => x.StockInfoDetails.Any(detail => detail.Status == (int)StockStateEmun.已入库 && detail.MaterielCode == "空托盘"))
            .OrderBy(x => x.CreateDate)
            .FirstAsync();
            .Includes(x => x.LocationInfo) // 预加载LocationInfo
            .Includes(x => x.StockInfoDetails) // 预加载StockInfoDetails
            .Where(x => x.AreaCode == areaCode && x.IsFull == false)
            .Where(x => x.StockInfoDetails.Any(y => y.MaterielCode == "空托盘"))
            .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID) // 过滤条件
            .OrderBy(x => x.CreateDate) // 排序
            .FirstAsync(); // 转换为列表
        //var firstOrDefault = result[0]; // 查找第一个匹配的元素
        //return firstOrDefault;
        return result;
    }
@@ -895,7 +825,7 @@
            if (task == null)
                return content.Error("未找到任务");
            if (taskState == (int)TaskOutStatusEnum.Line_OutFinish)
            if (taskState == (int)TaskOutStatusEnum.Line_OutFinish || taskState == (int)TaskOutStatusEnum.SC_OutFinish)
            {
                var taskHty = CreateHistoricalTask(task);
                await _unitOfWorkManage.UseTranAsync(async () =>
@@ -1056,7 +986,7 @@
    /// <returns>是否更新成功</returns>
    public async Task<bool> Update(Dt_Task model)
    {
        return await BaseDal.Update(model);
        return await BaseDal.UpdateDataAsync(model);
    }
    /// <summary>
@@ -1066,7 +996,7 @@
    /// <returns>是否更新成功</returns>
    public async Task<bool> Update(List<Dt_Task> models)
    {
        return await BaseDal.Update(models);
        return await BaseDal.UpdateDataAsync(models);
    }
    /// <summary>
@@ -1086,7 +1016,7 @@
    /// <returns></returns>
    public async Task<Dt_Task> GetByLocation(string locationID)
    {
        return await Db.Queryable<Dt_Task>().Where(x => x.SourceAddress == locationID).FirstAsync();
        return await BaseDal.QueryFirstAsync(x => x.SourceAddress == locationID);
    }
    /// <summary>
@@ -1096,7 +1026,7 @@
    /// <returns></returns>
    public async Task<Dt_Task> GetByTaskNum(int taskNum)
    {
        return await Db.Queryable<Dt_Task>().Where(x => x.TaskNum == taskNum).FirstAsync();
        return await BaseDal.QueryFirstAsync(x => x.TaskNum == taskNum);
    }
    #endregion 内部调用方法
@@ -1381,16 +1311,25 @@
    /// <summary>
    /// 查找货位
    /// </summary>
    /// <param name="areaId">区域主键</param>
    /// <param name="IsFull">区域主键</param>
    /// <param name="roadWay">巷道</param>
    /// <returns></returns>
    public async Task<DtLocationInfo> GetLocationDistributeAsync(string roadWay)
    public async Task<DtLocationInfo> GetLocationDistributeAsync(string roadWay, bool IsFull = true)
    {
        #region 获取货位
        try
        {
            var locations = await _locationRepository.QueryDataAsync(x => x.LocationStatus == (int)LocationEnum.Free && x.RoadwayNo == roadWay);
            List<DtLocationInfo> locations;
            if (IsFull)
            {
                locations = await _locationRepository.QueryDataAsync(x => x.LocationStatus == (int)LocationEnum.Free && x.RoadwayNo == roadWay);
            }
            else
            {
                locations = await _locationRepository.QueryDataAsync(x => x.LocationStatus == (int)LocationEnum.Free && x.RoadwayNo == roadWay /*&& x.LocationType ==*/);
            }
            if (locations == null)
            {
                return null;
@@ -1418,7 +1357,7 @@
    public async Task<string> GetRoadWayAsync(RequestTaskDto input, List<string> process)
    {
        var minGroup = _locationRepository.QueryData(x => process.Contains(x.RoadwayNo) && x.LocationStatus == (int)LocationEnum.Free)
            .GroupBy(x => x.RoadwayNo)
             .GroupBy(x => x.RoadwayNo)
             .OrderByDescending(g => g.Count()) // 根据每个组的元素数量排序
             .First(); // 取出数量最多的组