1
yangpeixing
2025-12-04 885092869d8a27a0b77d6e55d3dd3f00f29e8002
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
@@ -17,6 +17,7 @@
using System.Reflection;
using System.Reflection.Metadata;
using System.Security.Policy;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using WIDESEA_Cache;
@@ -95,6 +96,26 @@
        _wareAreaInfoRepository = wareAreaInfoRepository;
        _inventoryRecordRepository = inventoryRecordRepository;
    }
    #region åˆå§‹åŒ–提升机
    public async Task<WebResponseContent> InitializationElevator()
    {
        WebResponseContent content = new WebResponseContent();
        try
        {
            var address = GetWCSIPAddress("WCSIPAddress","InitializationElevator");
            if (address != null)
            {
                await HttpHelper.PostAsync(address, "");
                return content.OK("成功");
            }
            return content.Error("失败");
        }
        catch (Exception ex)
        {
            return content.Error(ex.Message);
        }
    }
    #endregion
    #region å¤–部接口方法
@@ -363,64 +384,6 @@
    }
    #endregion å…¥åº“任务完成
    #region AGV搬运任务完成
    public async Task<WebResponseContent> CompleteCarryTaskAsync(Dt_Task task,DtStockInfo stockInfo)
    {
        WebResponseContent content = new WebResponseContent();
        try
        {
            var Sourcelocation = await _locationRepository.QueryFirstAsync(x => x.LocationCode == task.SourceAddress);
            var Targetlocation = await _locationRepository.QueryFirstAsync(x => x.LocationCode == task.TargetAddress);
            //UpdateLocationStatus(Sourcelocation, LocationEnum.Free);
            //UpdateLocationStatus(Targetlocation, LocationEnum.InStock);
            task.TaskState = (int)TaskAGVCarryStatusEnum.CarryFinish;
            var taskHty = task.Adapt<Dt_Task_Hty>();
            taskHty.FinishTime = DateTime.Now;
            taskHty.OperateType = App.User.UserName != null ? (int)OperateTypeEnum.人工完成 : (int)OperateTypeEnum.自动完成;
            taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System";
            await _unitOfWorkManage.UseTranAsync(async () =>
            {
                await DeleteTaskAsync(task.TaskId);
                await AddTaskHtyAsync(taskHty);
            });
        }
        catch (Exception ex)
        {
            return content.Error(ex.Message);
        }
        return content;
    }
    #endregion
    #region AGV跨楼层任务完成
    public async Task<WebResponseContent> CompleteAcrossFloorTaskAsync(Dt_Task task, DtStockInfo stockInfo)
    {
        WebResponseContent content = new WebResponseContent();
        try
        {
            task.TaskState = (int)TaskAcrossFloorStatusEnum.CarryFinish;
            var taskHty = task.Adapt<Dt_Task_Hty>();
            taskHty.FinishTime = DateTime.Now;
            taskHty.OperateType = App.User.UserName != null ? (int)OperateTypeEnum.人工完成 : (int)OperateTypeEnum.自动完成;
            taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System";
            await _unitOfWorkManage.UseTranAsync(async () =>
            {
                await DeleteTaskAsync(task.TaskId);
                await AddTaskHtyAsync(taskHty);
            });
        }
        catch (Exception ex)
        {
            return content.Error(ex.Message);
        }
        return content;
    }
    #endregion
    #region ä»»åŠ¡å®Œæˆ
    /// <summary>
@@ -522,14 +485,14 @@
                return content.Error("托盘信息不存在,请确认托盘已组盘成功");
            }
            foreach (var item in boxingInfo.BoxingInfoDetails)
            {
                var ERPStock = SqlSugarHelper.DBERP.Queryable<用友即时库存_ST>().Where(x => x.存储地点名称 == item.Warehouse && x.料号 == item.MaterielCode && x.品名 == item.MaterielName && x.库存数量 >= item.Quantity).ToList().FirstOrDefault();
                if (ERPStock == null)
                {
                    return content.Error($"组盘数据未在ERP库存数据中,请人工确认数据是否正确");
                }
            }
            //foreach (var item in boxingInfo.BoxingInfoDetails)
            //{
            //    var ERPStock = SqlSugarHelper.DBERP.Queryable<用友即时库存_ST>().Where(x => x.存储地点名称 == item.Warehouse && x.料号 == item.MaterielCode && x.品名 == item.MaterielName && x.库存数量 >= item.Quantity).ToList().FirstOrDefault();
            //    if (ERPStock == null)
            //    {
            //        return content.Error($"组盘数据未在ERP库存数据中,请人工确认数据是否正确");
            //    }
            //}
            var StartAddress = await _locationRepository.QueryFirstAsync(x => x.LocationCode == taskDto.Position);
            if (StartAddress == null)
@@ -566,6 +529,7 @@
                case 4:
                case 5:
                case 6:
                case 7:
                    taskNew = InboundAGVCacheArea(taskDto, StartAddress, area);
                    break;
                default:
@@ -577,6 +541,12 @@
            await _unitOfWorkManage.UseTranAsync(async () =>
            {
                if (taskDto.AreaId == 3 || taskDto.AreaId == 7)
                {
                    var result2 = UpdateLocationStatus(taskNew.TargetAddress, LocationEnum.Lock, taskNew.TaskNum.Value, (int)StatusChangeTypeEnum.AutomaticInbound);
                    await _locationStatusChangeRecordRepository.AddDataAsync(result2.Item1);
                    await _locationRepository.UpdateDataAsync(result2.Item2);
                }
                await _locationStatusChangeRecordRepository.AddDataAsync(result.Item1);
                await _locationRepository.UpdateDataAsync(result.Item2);
                BaseDal.AddData(taskNew);
@@ -672,7 +642,7 @@
    /// </summary>
    /// <param name="palletCode"></param>
    /// <returns></returns>
    public async Task<WebResponseContent> OutBoundTaskAsync(string palletCode,string remark)
    public async Task<WebResponseContent> OutBoundTaskAsync(string palletCode,string remark,int doubleTray)
    {
        WebResponseContent content = new WebResponseContent();
        try
@@ -699,7 +669,7 @@
                return content.Error("该托盘库存已在出库缓存区");
            }
            Dt_Task taskNew = await RequestOutboundTaskAsync(new RequestTaskDto { PalletCode = palletCode, AreaId = 2, Position = stcok.LocationCode, TaskType = (int)TaskOutboundTypeEnum.Outbound });
            Dt_Task taskNew = await RequestOutboundTaskAsync(new RequestTaskDto { PalletCode = palletCode, AreaId = 2, Position = stcok.LocationCode, TaskType = (int)TaskOutboundTypeEnum.Outbound, DoubleTray= doubleTray });
            List<Dt_InventoryRecord> records = new List<Dt_InventoryRecord>();
            stcok.StockInfoDetails.ForEach(x =>
            {
@@ -715,7 +685,7 @@
            });
            var taskDto = CreateListTaskDTO(taskNew);
            var result = GetlcoationState(taskNew, StatusChangeTypeEnum.AutomaticOutbound);
            var result = GetlcoationState(taskNew, StatusChangeTypeEnum.AutomaticOutbound, location);
            await _unitOfWorkManage.UseTranAsync(async () =>
            {
                await BaseDal.AddDataAsync(taskNew);
@@ -732,6 +702,12 @@
        }
    }
    /// <summary>
    /// å…¶ä»–出库
    /// </summary>
    /// <param name="details"></param>
    /// <returns></returns>
    public async Task<WebResponseContent> OtherOutBoundTaskAsync(List<DtStockInfoDetail> details)
    {
@@ -784,7 +760,7 @@
            stock.StockInfoDetails = details;
            var taskDto = CreateListTaskDTO(taskNew);
            var result = GetlcoationState(taskNew, StatusChangeTypeEnum.AutomaticOutbound);
            var result = GetlcoationState(taskNew, StatusChangeTypeEnum.AutomaticOutbound, stock.LocationInfo);
            await _unitOfWorkManage.UseTranAsync(async () =>
            {
                await BaseDal.AddDataAsync(taskNew);
@@ -867,7 +843,7 @@
            stock.StockInfoDetails = details;
            var taskDto = CreateListTaskDTO(taskNew);
            var result = GetlcoationState(taskNew, StatusChangeTypeEnum.AutomaticOutbound);
            var result = GetlcoationState(taskNew, StatusChangeTypeEnum.AutomaticOutbound, stock.LocationInfo);
            await _unitOfWorkManage.UseTranAsync(async () =>
            {
                await BaseDal.AddDataAsync(taskNew);
@@ -884,13 +860,20 @@
        }
    }
    public (List<DtLocationStatusChangeRecord>,List<DtLocationInfo>) GetlcoationState(Dt_Task task, StatusChangeTypeEnum StatusChangeTypeEnum)
    public (List<DtLocationStatusChangeRecord>,List<DtLocationInfo>) GetlcoationState(Dt_Task task, StatusChangeTypeEnum StatusChangeTypeEnum, DtLocationInfo location)
    {
        List<DtLocationStatusChangeRecord> locationStatusChangeRecords = new List<DtLocationStatusChangeRecord>();
        List<DtLocationInfo> locations = new List<DtLocationInfo>();
        var result = UpdateLocationStatus(task.SourceAddress, LocationEnum.InStockDisable, task.TaskNum.Value, (int)StatusChangeTypeEnum);
        locationStatusChangeRecords.AddRange(result.Item1);
        locations.AddRange(result.Item2);
        if(location.AreaId ==3|| location.AreaId == 7)
        {
            var result2 = UpdateLocationStatus(task.TargetAddress, LocationEnum.Lock, task.TaskNum.Value, (int)StatusChangeTypeEnum);
            locationStatusChangeRecords.AddRange(result2.Item1);
            locations.AddRange(result2.Item2);
        }
        return (locationStatusChangeRecords,locations);
    }
@@ -938,6 +921,7 @@
            case 4:
            case 5:
            case 6:
            case 7:
                return OutboundAGVCacheArea(taskDto, StartAddress, area);
            default:
                throw new Exception("请选择正确的区域信息");
@@ -1149,6 +1133,7 @@
            Remark = StartAddress.AreaId.ToString(),
            AGVTaskNum = GenerateUniqueId(),
            Floor = StartAddress.Floor,
            DoubleTray = taskDto.DoubleTray,
        };
    }
@@ -1295,6 +1280,7 @@
            switch (location.AreaId)
            {
                case 2:
                case 7:
                    locationInfos = _locationRepository.QueryData(x => x.Row == location.Row && x.Column > location.Column && x.Remark == location.Remark && x.AreaId == location.AreaId);
                    break;
                case 5:
@@ -1430,6 +1416,7 @@
                case 4:
                case 5:
                case 6:
                case 7:
                    locationInfo = await GetAGVEmptyCacheLocation(areaInfo.AreaID, location);
                    break;
                default:
@@ -2035,6 +2022,32 @@
        return (changeRecordDto, locations);
    }
    public (DtLocationStatusChangeRecord, DtLocationInfo) UpdateEndLocationStatus(string locationCode, LocationEnum locationStatus, int taskNum, StatusChangeTypeEnum StatusChangeType)
    {
        var location = _locationRepository.QueryFirst(x => x.LocationCode == locationCode);
        if (location != null && (location.AreaId == 3 || location.AreaId == 7))
        {
            int Beforelocation = location.LocationStatus;
            location.LocationStatus = (int)locationStatus;
            DtLocationStatusChangeRecord dtLocationStatusChangeRecord = new DtLocationStatusChangeRecord()
            {
                ChangeType = (int)StatusChangeType,
                LocationCode = locationCode,
                LocationId = location.Id,
                Creater = "System",
                TaskNum = taskNum,
                AfterStatus = location.LocationStatus,
                BeforeStatus = Beforelocation,
            };
            return (dtLocationStatusChangeRecord, location);
        }
        return (null, null);
    }
    public (DtLocationStatusChangeRecord, DtLocationInfo) UpdateLocationStatus(string locationCode, LocationEnum locationStatus, int taskNum, StatusChangeTypeEnum StatusChangeType)
    {
        var location = _locationRepository.QueryFirst(x => x.LocationCode == locationCode);
@@ -2071,7 +2084,7 @@
                }
            }
        }
        else if (location.AreaId == 2)
        else if (location.AreaId == 2 || location.AreaId == 7)
        {
            var locationLateral = _locationRepository.QueryData(x => x.Row == location.Row && x.Column > location.Column && x.Remark == location.Remark);
            if (locationLateral.Count > 0)
@@ -2109,6 +2122,7 @@
            TaskType = task.TaskType,
            Floor =task.Floor,
            AGVTaskNum = task.AGVTaskNum,
            DoubleTray = task.DoubleTray,
        } };
    }
@@ -2128,6 +2142,7 @@
            AGVTaskNum = task.AGVTaskNum,
            Remark = task.Remark,
            Floor = task.Floor,
            DoubleTray = task.DoubleTray,
        };
    }
    private List<WMSTaskDTO> CreateTaskDTO(List<Dt_Task> task)
@@ -2149,6 +2164,7 @@
                AGVTaskNum = item.AGVTaskNum,
                Remark = item.Remark,
                Floor = item.Floor,
                DoubleTray = item.DoubleTray,
            });
        }
@@ -2445,6 +2461,7 @@
        switch (AreaId)
        {
            case 2:
            case 7:
                return await FromShallowToDeep(AreaId, loc);
            case 3:
                return await AGVLIKU(AreaId);
@@ -2576,7 +2593,7 @@
            }
        }
        else if (location.AreaId == 2)
        else if (location.AreaId == 2 || location.AreaId == 7)
        {
            var locationLateral = _locationRepository.QueryData(x => x.Row == location.Row && x.Column > location.Column && x.Remark == location.Remark);