wanshenmean
2026-02-11 75f34e9ba2e8b249c96333f3d7936c8968e12ec7
Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -17,7 +17,9 @@
using AutoMapper;
using SqlSugar;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_DTO.Task;
@@ -35,6 +37,8 @@
    {
        private readonly IMapper _mapper;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IStockInfoService _stockInfoService;
        private readonly ILocationInfoService _locationInfoService;
        public IRepository<Dt_Task> Repository => BaseDal;
@@ -48,54 +52,189 @@
        public List<int> TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList();
        public TaskService(IRepository<Dt_Task> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
        public TaskService(IRepository<Dt_Task> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, ILocationInfoService locationInfoService) : base(BaseDal)
        {
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
            _stockInfoService = stockInfoService;
            _locationInfoService = locationInfoService;
        }
        /// <summary>
        /// 创建任务(组盘入库任务、空托盘回库任务)
        /// </summary>
        /// <param name="palletCode">托盘号</param>
        /// <param name="sourceAddress">起始地址</param>
        /// <param name="targetAddress">目标地址</param>
        /// <param name="roadway">巷道号</param>
        /// <param name="warehouseId">仓库主键</param>
        /// <param name="palletType">托盘类型</param>
        /// <param name="taskType">任务类型</param>
        /// <param name="taskDto">要创建的出库任务的详细信息。不能为null。</param>
        /// <returns>是否成功</returns>
        public async Task<Dt_Task?> CreateTaskInboundAsync(CreateTaskDto taskDto)
        public async Task<WebResponseContent> CreateTaskInboundAsync(CreateTaskDto taskDto)
        {
            if (string.IsNullOrWhiteSpace(taskDto.PalletCode) || string.IsNullOrWhiteSpace(taskDto.SourceAddress) || string.IsNullOrWhiteSpace(taskDto.TargetAddress) || string.IsNullOrWhiteSpace(taskDto.Roadway))
            WebResponseContent content = new WebResponseContent();
            try
            {
                return null;
                if (string.IsNullOrWhiteSpace(taskDto.PalletCode) || string.IsNullOrWhiteSpace(taskDto.SourceAddress) || string.IsNullOrWhiteSpace(taskDto.TargetAddress) || string.IsNullOrWhiteSpace(taskDto.Roadway))
                {
                    return content.Error("Invalid task details.");
                }
                if (taskDto.TaskType != TaskTypeEnum.Inbound || taskDto.TaskType != TaskTypeEnum.InEmpty)
                {
                    return content.Error("Invalid task details.");
                }
                var task = new Dt_Task
                {
                    TaskNum = 0,
                    PalletCode = taskDto.PalletCode,
                    PalletType = taskDto.PalletType,
                    Roadway = taskDto.Roadway,
                    TaskType = taskDto.TaskType.GetHashCode(),
                    TaskStatus = TaskStatusEnum.New.GetHashCode(),
                    SourceAddress = taskDto.SourceAddress,
                    TargetAddress = taskDto.TargetAddress,
                    CurrentAddress = taskDto.SourceAddress,
                    NextAddress = taskDto.TargetAddress,
                    WarehouseId = taskDto.WarehouseId,
                    Grade = 1,
                    Creater = "system"
                };
                var result = await Repository.AddDataAsync(task) > 0 ? true : false;
                if (result)
                {
                    var WmstaskDto = _mapper.Map<WMSTaskDTO>(task);
                    return content.OK("任务创建成功", WmstaskDto);
                }
                else
                {
                    return content.Error("任务创建失败");
                }
            }
            if (taskDto.TaskType != TaskTypeEnum.Inbound || taskDto.TaskType != TaskTypeEnum.InEmpty)
            catch (Exception ex)
            {
                return null;
                return content.Error($"任务创建失败: {ex.Message}");
            }
            var task = new Dt_Task
            {
                TaskNum = 0,
                PalletCode = taskDto.PalletCode,
                PalletType = taskDto.PalletType,
                Roadway = taskDto.Roadway,
                TaskType = taskDto.TaskType.GetHashCode(),
                TaskStatus = TaskStatusEnum.New.GetHashCode(),
                SourceAddress = taskDto.SourceAddress,
                TargetAddress = taskDto.TargetAddress,
                CurrentAddress = taskDto.SourceAddress,
                NextAddress = taskDto.TargetAddress,
                WarehouseId = taskDto.WarehouseId,
                Grade = 1,
                Creater = "system"
            };
            return await Repository.AddDataAsync(task) > 0 ? task : null;
        }
        /// <summary>
        /// 根据指定的任务详情异步创建新的出库任务。
        /// </summary>
        /// <param name="taskDto">要创建的出库任务的详细信息。不能为null。</param>
        /// <returns>表示异步操作的任务。任务结果包含表示已创建的出库任务的<see cref="WMSTaskDTO"/>,如果任务无法创建则为<see langword="null"/>。</returns>
        public async Task<WebResponseContent> CreateTaskOutboundAsync(CreateTaskDto taskDto)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                List<Dt_StockInfo>? stockResult = await _stockInfoService.GetStockInfoAsync(taskDto.WarehouseId);
                var taskList = new List<Dt_Task>();
                foreach (var item in stockResult)
                {
                    var taskInfo = new Dt_Task()
                    {
                        WarehouseId = item.WarehouseId,
                        PalletCode = item.PalletCode,
                        PalletType = item.PalletType,
                        SourceAddress = item.LocationCode,
                        TargetAddress = taskDto.TargetAddress,
                        Roadway = item.LocationDetails.RoadwayNo,
                        TaskType = TaskTypeEnum.Outbound.GetHashCode(),
                        TaskStatus = TaskStatusEnum.New.GetHashCode(),
                        Grade = 1,
                        TaskNum = 0,
                        CurrentAddress = item.LocationCode,
                        NextAddress = taskDto.TargetAddress,
                        Creater = "system",
                    };
                    taskList.Add(taskInfo);
                }
                var result = await BaseDal.AddDataAsync(taskList) > 0;
                var wmstaskDto = result ? _mapper.Map<WMSTaskDTO>(taskList) : null;
                return content.OK(result ? "任务创建成功" : "任务创建失败", wmstaskDto);
            }
            catch (Exception e)
            {
                return content.Error($"任务创建失败: {e.Message}");
            }
        }
        /// <summary>
        /// 获取可入库货位
        /// </summary>
        /// <param name="warehouseId"></param>
        /// <param name="taskType"></param>
        /// <returns></returns>
        public async Task<WebResponseContent> GetTasksLocationAsync(CreateTaskDto taskDto)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                var stockResult = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode);
                if (stockResult == null) return content.Error("未找到对应的任务");
                var locationInfo = await _locationInfoService.GetLocationInfo(stockResult.Roadway);
                if (locationInfo == null) return content.Error("未找到对应的货位");
                // 更新货位信息
                locationInfo.LocationStatus = LocationStatusEnum.FreeLock.GetHashCode();
                // 跟新任务信息
                stockResult.CurrentAddress = taskDto.SourceAddress;
                stockResult.NextAddress = locationInfo.LocationCode;
                stockResult.TargetAddress = taskDto.TargetAddress;
                stockResult.TaskStatus = TaskStatusEnum.Line_Finish.GetHashCode();
                var updateResult = await BaseDal.UpdateDataAsync(stockResult);
                var locationResult = await _locationInfoService.UpdateLocationInfoAsync(locationInfo);
                return content.OK(updateResult && locationResult ? "任务更新成功" : "任务更新失败", locationInfo.LocationCode);
            }
            catch (Exception ex)
            {
                return content.Error($"获取任务失败: {ex.Message}");
            }
        }
        // 任务完成。添加库存,修改货位状态,删除任务数据,添加历史任务数据
        public async Task<WebResponseContent> FinishTaskAsync(CreateTaskDto taskDto)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                var taskResult = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode);
                if (taskResult == null) return content.Error("未找到对应的任务");
                var locationResult = await _locationInfoService.GetLocationInfo(taskResult.Roadway, taskDto.PalletCode);
                if (locationResult == null) return content.Error("未找到对应的货位");
                // 添加库存信息
                var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode);
                stockInfo.LocationCode = locationResult.LocationCode;
                stockInfo.LocationId = locationResult.Id;
                stockInfo.OutboundDate = taskResult.Roadway.Contains("GW") ? DateTime.Now.AddHours(2) : taskResult.Roadway.Contains("CW") ? DateTime.Now.AddHours(1) : DateTime.Now.AddHours(0);
                // 修改货位状态
                locationResult.LocationStatus = LocationStatusEnum.InStock.GetHashCode();
                var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(locationResult);
                var addStockResult = await _stockInfoService.UpdateStockAsync(stockInfo);
                if (!updateLocationResult || !addStockResult) return content.Error("任务完成失败");
                // 删除任务数据
                var deleteTaskResult = await BaseDal.DeleteDataAsync(taskResult);
                // 添加历史任务数据
                var historyTask = _mapper.Map<Dt_Task_Hty>(taskResult);
                historyTask.InsertTime = DateTime.Now;
                if (!deleteTaskResult) return content.Error("任务完成失败");
                return content.OK("任务完成");
            }
            catch (Exception ex)
            {
                return content.Error($"完成任务失败: {ex.Message}");
            }
        }
    }
}