zhangchengsong
2026-04-01 a87eee72770da479f043462787c17c534062a318
ÏîÄ¿´úÂë/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -33,11 +33,13 @@
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Metadata;
using System.Security.Cryptography.Xml;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Comm.Http;
using WIDESEA_Common.Log;
using WIDESEA_Core.Enums;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseRepository;
@@ -46,10 +48,13 @@
using WIDESEAWCS_Core.Utilities;
using WIDESEAWCS_DTO.Enum;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_ISystemRepository;
using WIDESEAWCS_ISystemServices;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_Model.Models.System;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_TaskInfoRepository;
@@ -67,6 +72,7 @@
        private readonly IMapper _mapper;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IDt_roadwayinfoService _Dt_roadwayinfoService;
        private readonly IDt_PlatformStationRepository _dt_PlatformStation;
        private Dictionary<string, OrderByType> _taskOrderBy = new()
            {
@@ -80,7 +86,7 @@
        public string urlWMSdeverror = WIDESEAWCS_Core.Helper.AppSettings.Configuration["urlWMSdeverror"];
        public string urlWMSliftinposition = WIDESEAWCS_Core.Helper.AppSettings.Configuration["urlWMSliftinposition"];
        public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, ITask_HtyService task_HtyService, ITask_HtyRepository task_HtyRepository, IUnitOfWorkManage unitOfWork, IDt_roadwayinfoService dt_RoadwayinfoService) : base(BaseDal)
        public TaskService(ITaskRepository BaseDal, IDt_PlatformStationRepository dt_PlatformStation, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, ITask_HtyService task_HtyService, ITask_HtyRepository task_HtyRepository, IUnitOfWorkManage unitOfWork, IDt_roadwayinfoService dt_RoadwayinfoService) : base(BaseDal)
        {
            _routerService = routerService;
            _taskExecuteDetailService = taskExecuteDetailService;
@@ -90,6 +96,13 @@
            _mapper = mapper;
            _unitOfWorkManage = unitOfWork;
            _Dt_roadwayinfoService = dt_RoadwayinfoService;
            _dt_PlatformStation = dt_PlatformStation;
        }
        //根据任务号,查询任务
        public Dt_Task? CurrtaskInfo(int taskNum)
        {
            return BaseDal.QueryData().Where(x => x.TaskNum == taskNum).FirstOrDefault();
        }
        /// <summary>
@@ -121,9 +134,25 @@
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"出库完成");
                }
                else if (task.TaskType == (int)TaskInboundTypeEnum.Inbound && task.TaskState == (int)TaskInStatusEnum.SC_InExecuting)
                else if (task.TaskType == (int)TaskTypeEnum.Inbound && task.TaskState == (int)TaskInStatusEnum.SC_InExecuting)
                {
                    task.TaskState = (int)TaskInStatusEnum.InFinish;
                    BaseDal.UpdateData(task);
                    string Result = WMSTaskStatusEnum.insuccess.GetDescription();
                    CommandResult command = taskreturn(int.Parse(task.WMStaskid), Result, "invmd", "");
                    if (command.status != "success") return content.Error($"调取上游返回失败,完成堆垛机任务失败,条码:{task.PalletCode},任务号:{task.TaskNum}");
                    task.ModifyDate = DateTime.Now;
                    task.Modifier = "System";
                    BaseDal.DeleteData(task);
                    _task_HtyService.AddTaskHty(task);
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"入库完成");
                }
                else if (task.TaskType == (int)TaskTypeEnum.Inventorybound && task.TaskState == (int)TaskinventoryStatusEnum.SC_inventoryExecuting)
                {
                    task.TaskState = (int)TaskinventoryStatusEnum.inventoryFinish;
                    BaseDal.UpdateData(task);
                    string Result = WMSTaskStatusEnum.insuccess.GetDescription();
                    CommandResult command = taskreturn(int.Parse(task.WMStaskid), Result, "invmd", "");
@@ -404,13 +433,13 @@
                {
                    _task_HtyService.AddTaskHty(tasks);
                    BaseDal.DeleteData(tasks);
                    WriteLog.Write_Log("WMS手动删除任务", "删除成功", $"申请删除的条码:{tasks.TaskNum},托盘条码:{tasks.PalletCode}", new { ä¿¡æ¯ = "删除成功" });
                    WriteLog.Write_Log("WMS手动删除任务", "删除成功", $"申请删除的任务号:{tasks.TaskNum},托盘条码:{tasks.PalletCode}", new { ä¿¡æ¯ = "删除成功" });
                    return WebResponseContent.Instance.OK();
                }
                catch (Exception ex)
                {
                    WriteLog.Write_Log("WMS手动删除任务", "删除失败", $"申请删除的条码:{tasks.TaskNum},托盘条码:{tasks.PalletCode}", new { ä¿¡æ¯ = ex.Message });
                    WriteLog.Write_Log("WMS手动删除任务", "删除失败", $"申请删除的任务号:{tasks.TaskNum},托盘条码:{tasks.PalletCode}", new { ä¿¡æ¯ = ex.Message });
                    return WebResponseContent.Instance.Error();
                }
            }
@@ -437,5 +466,208 @@
            return BaseDal.QueryData(x => x.Roadway == deviceNo && (x.TaskState == (int)TaskInStatusEnum.InNew || x.TaskState == (int)TaskOutStatusEnum.OutNew), TaskOrderBy);
        }
        public Dt_Task CutStackerCraneTask(string deviceNo)
        {
            Dt_Task dt_Task = BaseDal.QueryFirst(x => x.Roadway == deviceNo && (x.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting  || x.TaskState == (int)TaskInStatusEnum.SC_InExecuting));
            return dt_Task;
        }
        /// <summary>
        /// æ‰‹åŠ¨å–æ¶ˆä»»åŠ¡
        /// </summary>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        public WebResponseContent TaskCancel(int taskNum)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task != null)
                {
                    BaseDal.DeleteData(task);
                    task.ModifyDate = DateTime.Now;
                    task.Modifier = App.User?.UserName;
                    task.Remark = "人工手动取消";
                    BaseDal.DeleteData(task);
                    _task_HtyService.AddTaskHty(task);
                    content.Status = true;
                }
                else
                {
                    WebResponseContent.Instance.Error($"取消失败,该任务【{taskNum}】不存在");
                }
                return content;
            }
            catch (Exception e)
            {
                return WebResponseContent.Instance.Error();
            }
        }
        /// <summary>
        ///手动完成任务
        /// </summary>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        public WebResponseContent TaskHandCompleted(int taskNum)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】");
                if (task.TaskType == (int)TaskTypeEnum.Outbound)
                {
                    string Result = WMSTaskStatusEnum.outsuccess.GetDescription();
                    //同步给上游反馈任务完成
                    CommandResult command = taskreturn(int.Parse(task.WMStaskid), Result, "invmd", "");
                    if (command.status != "success") return content.Error($"调取上游返回失败,完成堆垛机任务失败,条码:{task.PalletCode},任务号:{task.TaskNum}");
                    task.ModifyDate = DateTime.Now;
                    task.Modifier = App.User?.UserName;
                    task.Remark = "人工手动完成";
                    BaseDal.DeleteData(task);
                    _task_HtyService.AddTaskHty(task);
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"手动出库完成");
                }
                else if (task.TaskType == (int)TaskTypeEnum.Inbound)
                {
                    string Result = WMSTaskStatusEnum.insuccess.GetDescription();
                    CommandResult command = taskreturn(int.Parse(task.WMStaskid), Result, "invmd", "");
                    if (command.status != "success") return content.Error($"调取上游返回失败,完成堆垛机任务失败,条码:{task.PalletCode},任务号:{task.TaskNum}");
                    task.ModifyDate = DateTime.Now;
                    task.Modifier = App.User?.UserName;
                    task.Remark = "人工手动完成";
                    BaseDal.DeleteData(task);
                    _task_HtyService.AddTaskHty(task);
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"手动入库完成");
                }
                else if (task.TaskType == (int)TaskTypeEnum.Inventorybound)
                {;
                    string Result = WMSTaskStatusEnum.insuccess.GetDescription();
                    CommandResult command = taskreturn(int.Parse(task.WMStaskid), Result, "invmd", "");
                    if (command.status != "success") return content.Error($"调取上游返回失败,完成堆垛机任务失败,条码:{task.PalletCode},任务号:{task.TaskNum}");
                    task.ModifyDate = DateTime.Now;
                    task.Modifier = App.User?.UserName;
                    task.Remark = "人工手动完成";
                    BaseDal.DeleteData(task);
                    _task_HtyService.AddTaskHty(task);
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"手动入库完成");
                }
                else
                {
                    throw new Exception($"任务类型错误,未找到该任务类型,任务号:【{taskNum}】,任务类型:【{task.TaskType}】");
                }
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error($"任务完成异常,任务号:【{taskNum}】,原因:{ex.Message}");
            }
            return content;
        }
        /// <summary>
        /// æ‰‹åŠ¨åˆ›å»ºä»»åŠ¡
        /// </summary>
        /// <param name="transfer"></param>
        /// <returns></returns>
        public WebResponseContent CreateManualTask(Dt_Task transfer)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceName.Contains("堆垛机"));
                // åˆ¤æ–­è®¾å¤‡æ˜¯å¦å­˜åœ¨
                if (device == null)
                {
                    content.Error("手动创建任务失败,原因:未找到堆垛机设备");
                    WriteLog.Write_Log("手动任务创建失败", "创建失败", $"原因:未找到堆垛机设备,托盘编号:{transfer.PalletCode},任务类型:{transfer.TaskType},起始地址:{transfer.SourceAddress},目标地址:{transfer.TargetAddress}");
                    return content;
                }
                // åˆ¤æ–­åœ°å€æ˜¯å¦å±žäºŽå½“前设备库
                if (transfer.SourceAddress.Contains(device.DeviceCode) && transfer.TargetAddress.Contains(device.DeviceCode))
                {
                    // å…¥åº“
                    if (transfer.TaskType == 200)
                    {
                        Dt_PlatformStation _PlatformStation = _dt_PlatformStation.QueryFirst(x => x.Station_code == transfer.SourceAddress);
                        if (_PlatformStation == null)
                        {
                            content.Error($"手动创建任务失败,原因:{device.DeviceCode}库不存在这个库口:{transfer.SourceAddress}");
                            WriteLog.Write_Log("手动任务创建失败", "创建失败", $"托盘编号:{transfer.PalletCode},任务类型:{transfer.TaskType},起始地址:{transfer.SourceAddress},目标地址:{transfer.TargetAddress}");
                        }
                        else {
                        // æ­£å¸¸åˆ›å»ºä»»åŠ¡
                        transfer.TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum));
                        transfer.TaskState = 200;
                        transfer.CurrentAddress = transfer.SourceAddress;
                        transfer.NextAddress = transfer.TargetAddress;
                        transfer.Roadway = device.DeviceCode;
                        transfer.Creater = "WCS";
                        transfer.Grade = 1;
                        transfer.CreateDate = DateTime.Now;
                        _unitOfWorkManage.BeginTran();
                        BaseDal.AddData(transfer);
                        _unitOfWorkManage.CommitTran();
                        content.OK("手动任务创建成功!");
                        WriteLog.Write_Log("手动任务创建成功", "创建成功", $"托盘编号:{transfer.PalletCode},任务类型:{transfer.TaskType},起始地址:{transfer.SourceAddress},目标地址:{transfer.TargetAddress}");
                        }
                        return content;
                    }
                    // å‡ºåº“
                    else if (transfer.TaskType == 100)
                    {
                        Dt_PlatformStation _PlatformStation = _dt_PlatformStation.QueryFirst(x => x.Station_code == transfer.TargetAddress);
                        if (_PlatformStation == null)
                        {
                            content.Error($"手动创建任务失败,原因:{device.DeviceCode}库不存在这个库口:{transfer.TargetAddress}");
                        }
                        else
                        {
                            // æ­£å¸¸åˆ›å»ºä»»åŠ¡
                            transfer.TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum));
                            transfer.TaskState = 200;
                            transfer.CurrentAddress = transfer.SourceAddress;
                            transfer.NextAddress = transfer.TargetAddress;
                            transfer.Roadway = device.DeviceCode;
                            transfer.Creater = "WCS";
                            transfer.Grade = 1;
                            transfer.CreateDate = DateTime.Now;
                            _unitOfWorkManage.BeginTran();
                            BaseDal.AddData(transfer);
                            _unitOfWorkManage.CommitTran();
                            content.OK("手动任务创建成功!");
                            WriteLog.Write_Log("手动任务创建成功", "创建成功", $"托盘编号:{transfer.PalletCode},任务类型:{transfer.TaskType},起始地址:{transfer.SourceAddress},目标地址:{transfer.TargetAddress}");
                        }
                        return content;
                    }
                }
                else
                {
                    content.Error($"手动创建任务失败,原因:{device.DeviceCode}库地址不匹配,起始地址:{transfer.SourceAddress},目标地址:{transfer.TargetAddress}");
                    WriteLog.Write_Log("手动任务创建失败", "创建失败", $"托盘编号:{transfer.PalletCode},任务类型:{transfer.TaskType},起始地址:{transfer.SourceAddress},目标地址:{transfer.TargetAddress}");
                }
            }
            catch (Exception ex)
            {
                content.Error($"手动创建任务失败,系统异常:{ex.Message}");
                WriteLog.Write_Log("手动任务异常", "异常", ex.ToString());
            }
            return content;
        }
    }
}