dengjunjie
2026-01-23 62bfd66d8980d01f76408c655004c5d848f07759
添加WMS下发任务接口
已添加3个文件
已修改6个文件
444 ■■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task_Hty.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGV/KLSAGVController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/KLSTaskMethods.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskMethods.cs 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/TaskExtend.cs 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/TaskJob.cs 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs
@@ -7,6 +7,109 @@
namespace WIDESEAWCS_Common.TaskEnum
{
    public enum TaskStatusEnum
    {
        /// <summary>
        /// æ–°å»ºä»»åŠ¡
        /// </summary>
        [Description("新建任务")]
        New,
        ///// <summary>
        ///// å¾…执行
        ///// </summary>
        [Description("待执行")]
        Execut,
        ///// <summary>
        ///// å–货中
        ///// </summary>
        [Description("取货中")]
        Takeing,
        /// <summary>
        /// å–货完成
        /// </summary>
        [Description("取货完成")]
        TakeFinish,
        /// <summary>
        /// æ”¾è´§ä¸­
        /// </summary>
        [Description("放货中")]
        Puting,
        /// <summary>
        /// å®Œæˆ
        /// </summary>
        [Description("完成")]
        Finish,
        /// <summary>
        /// å¤–形检测中
        /// </summary>
        [Description("外形检测中")]
        CheckShapeing,
        /// <summary>
        /// æ‰˜ç›˜å·ç¡®è®¤ä¸­
        /// </summary>
        [Description("托盘号确认中")]
        CheckPalletCodeing,
        /// <summary>
        /// AGV待继续执行
        /// </summary>
        [Description("AGV待继续执行")]
        AGV_WaitToExecute,
        #region å‡¯ä¹å£«AGV其他任务状态
        /// <summary>
        /// èµ·ç‚¹æ— è´§
        /// </summary>
        [Description("起点无货")]
        FromOutOfStock,
        /// <summary>
        /// ç»ˆç‚¹æœ‰è´§
        /// </summary>
        [Description("终点有货")]
        ToaddInStock,
        /// <summary>
        /// ä»»åŠ¡å·é‡å¤
        /// </summary>
        [Description("任务号重复")]
        TaskNumRepetition,
        /// <summary>
        /// RCS系统接收到任务后操作数据库异常
        /// </summary>
        [Description("RCS系统接收到任务后操作数据库异常")]
        RCSDataError,
        /// <summary>
        /// ä»»åŠ¡ç±»åž‹å¼‚å¸¸
        /// </summary>
        [Description("任务类型异常")]
        TaskTypeError,
        /// <summary>
        /// å‚数异常
        /// </summary>
        [Description("参数异常")]
        ParameterError,
        /// <summary>
        /// RCS系统未知异常
        /// </summary>
        [Description("RCS系统未知异常")]
        RCSError,
        /// <summary>
        /// ä»»åŠ¡åºŸæ­¢
        /// </summary>
        [Description("任务废止")]
        Cancel
        #endregion
        #region æµ·åº·AGV其他任务状态
        #endregion
        #region å››å‘车其他任务状态
        #endregion
    }
    public enum TaskInStatusEnum
    {
        /// <summary>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs
@@ -62,11 +62,11 @@
        public string PalletCode { get; set; }
        /// <summary>
        /// å··é“号
        /// åŒºåŸŸ
        /// </summary>
        [ImporterHeader(Name = "巷道号")]
        [ExporterHeader(DisplayName = "巷道号")]
        [SugarColumn(IsNullable = true, Length = 10, ColumnDescription = "巷道号")]
        [ImporterHeader(Name = "区域")]
        [ExporterHeader(DisplayName = "区域")]
        [SugarColumn(IsNullable = true, Length = 10, ColumnDescription = "区域")]
        public string Roadway { get; set; }
        /// <summary>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task_Hty.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.DB.Models;
namespace WIDESEAWCS_Model.Models
{
    public class Dt_Task_Hty : Dt_Task, IBaseHistoryEntity
    {
        public int SourceId { get; set; }
        public string OperateType { get; set; }
        public DateTime InsertTime { get; set; }
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGV/KLSAGVController.cs
@@ -24,7 +24,7 @@
        /// <param name="taskDTOs"></param>
        /// <returns></returns>
        [HttpPost, Route("UpdateTaskStatus"), AllowAnonymous]
        public WebResponseContent UpdateTaskStatus(object TaskDTO)
        public WebResponseContent UpdateTaskStatus([FromBody] object TaskDTO)
        {
            return _taskService.UpdateTaskStatus(TaskDTO, DeviceTypeEnum.GALAXIS);
        }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json
@@ -17,7 +17,7 @@
    //5.PostgreSQL
    "DBType": "SqlServer",
    //连接字符串
    "ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWCS_GP;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
    "ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWCS_GP;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
    //跨域
    "Cors": {
        "PolicyName": "CorsIpAccess", //策略名称
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/KLSTaskMethods.cs
@@ -24,7 +24,7 @@
        {
            try
            {
                int containerType = taskDTO.containerCode.Contains("") ? LocationTypeEnum.LargePallet.ObjToInt() : LocationTypeEnum.SmallPallet.ObjToInt();
                int containerType = taskDTO.containerCode.Contains("LLM") ? LocationTypeEnum.LargePallet.ObjToInt() : LocationTypeEnum.SmallPallet.ObjToInt();
                //获取货位信息
                Dt_KLSLocationInfo? kLSLocationInfo = _kLSLocationInfoService.Repository.QueryFirst(x => x.WarehouseId.ToString() == taskDTO.toAreaCode && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.LocationType == containerType);
                if (kLSLocationInfo == null) throw new Exception($"未找到终点库区【{taskDTO.toAreaCode}】可用空货位!");
@@ -34,7 +34,7 @@
                    WMSTaskNum = taskDTO.taskCode,
                    Grade = taskDTO.taskPriority,
                    PalletCode = taskDTO.containerCode,
                    TaskState = TaskInStatusEnum.InNew.ObjToInt(),
                    TaskState = TaskStatusEnum.New.ObjToInt(),
                    TaskType = taskType,
                    SourceAddress = taskDTO.fromLocationCode,
                    CurrentAddress = taskDTO.fromLocationCode,
@@ -68,7 +68,7 @@
                    WMSTaskNum = taskDTO.taskCode,
                    Grade = taskDTO.taskPriority,
                    PalletCode = taskDTO.containerCode,
                    TaskState = TaskOutStatusEnum.OutNew.ObjToInt(),
                    TaskState = TaskStatusEnum.New.ObjToInt(),
                    TaskType = taskType,
                    SourceAddress = taskDTO.fromLocationCode,
                    CurrentAddress = taskDTO.fromLocationCode,
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskMethods.cs
@@ -1,15 +1,26 @@
using System;
using Magicodes.IE.Core;
using NetTaste;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.LocationEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Enums;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_DTO;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_TaskInfoService
{
    public partial class TaskService
    {
        #region æ›´æ–°ä»»åŠ¡çŠ¶æ€
        /// <summary>
        /// æ›´æ–°ä»»åŠ¡çŠ¶æ€
        /// </summary>
@@ -23,7 +34,23 @@
            {
                if (deviceTypeEnum == DeviceTypeEnum.GALAXIS)
                {
                    GALAXISUpdateTaskStatus? gALAXIS = TaskDTO.Serialize().DeserializeObject<GALAXISUpdateTaskStatus>();
                    if (gALAXIS == null) throw new Exception("参数转换失败!");
                    var task = BaseDal.QueryFirst(x => x.WMSTaskNum == gALAXIS.taskId);
                    if (task == null) throw new Exception($"未找到任务,任务编号【{gALAXIS.taskId}】");
                    switch (gALAXIS.taskStatus)
                    {
                        case 0:
                            TaskCompleted(task, deviceTypeEnum);
                            break;
                        case 4:
                            TaskFromCompleted(task, deviceTypeEnum);
                            break;
                        default:
                            task.TaskState = ReturnTaskStatus(gALAXIS.taskStatus, deviceTypeEnum);
                            BaseDal.UpdateData(task);
                            break;
                    }
                }
                else if (deviceTypeEnum == DeviceTypeEnum.HIKROBOT)
                {
@@ -37,8 +64,154 @@
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
                throw new Exception(ex.Message);
            }
        }
        #endregion
        #region ä»»åŠ¡çŠ¶æ€è½¬æ¢
        public int ReturnTaskStatus(object status, DeviceTypeEnum deviceTypeEnum)
        {
            try
            {
                if (deviceTypeEnum == DeviceTypeEnum.GALAXIS)
                {
                    TaskStatusEnum taskStatus = status switch
                    {
                        1 => TaskStatusEnum.FromOutOfStock,
                        2 => TaskStatusEnum.ToaddInStock,
                        3 => TaskStatusEnum.TaskNumRepetition,
                        5 => TaskStatusEnum.RCSDataError,
                        6 => TaskStatusEnum.TaskTypeError,
                        7 => TaskStatusEnum.ParameterError,
                        8 => TaskStatusEnum.RCSError,
                        13 => TaskStatusEnum.Cancel,
                        _ => throw new ArgumentOutOfRangeException(
                            nameof(status),
                            status,
                            $"未知的任务状态码: {status}"
                        )
                    };
                    return (int)taskStatus;
                }
                else if (deviceTypeEnum == DeviceTypeEnum.HIKROBOT)
                {
                    return 0;
                }
                else
                {
                    return 0;
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        #endregion
        #region ä»»åŠ¡èµ·ç‚¹å®Œæˆ
        /// <summary>
        /// ä»»åŠ¡èµ·ç‚¹å®Œæˆ
        /// </summary>
        /// <param name="dt_Task"></param>
        /// <param name="deviceTypeEnum"></param>
        /// <returns></returns>
        public WebResponseContent TaskFromCompleted(Dt_Task dt_Task, DeviceTypeEnum deviceTypeEnum)
        {
            try
            {
                dt_Task.TaskState = TaskStatusEnum.TakeFinish.ObjToInt();
                Db.Ado.BeginTran();
                UpdateLocationStatus(dt_Task.SourceAddress, deviceTypeEnum, LocationStatusEnum.Free);
                BaseDal.UpdateData(dt_Task);
                Db.Ado.CommitTran();
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                Db.Ado.RollbackTran();
                throw new Exception(ex.Message);
            }
        }
        #endregion
        #region ä»»åŠ¡å®Œæˆ
        /// <summary>
        /// ä»»åŠ¡å®Œæˆ
        /// </summary>
        /// <param name=""></param>
        /// <param name="deviceTypeEnum"></param>
        /// <returns></returns>
        public WebResponseContent TaskCompleted(Dt_Task dt_Task, DeviceTypeEnum deviceTypeEnum)
        {
            try
            {
                dt_Task.TaskState = TaskStatusEnum.Finish.ObjToInt();
                Db.Ado.BeginTran();
                UpdateLocationStatus(dt_Task.TargetAddress, deviceTypeEnum, LocationStatusEnum.InStock);
                BaseDal.DeleteAndMoveIntoHty(dt_Task, OperateTypeEnum.自动完成);
                Db.Ado.CommitTran();
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                Db.Ado.RollbackTran();
                throw new Exception(ex.Message);
            }
        }
        #endregion
        #region æ›´æ–°è´§ä½çŠ¶æ€
        /// <summary>
        /// æ›´æ–°è´§ä½çŠ¶æ€
        /// </summary>
        /// <param name="LocationCode"></param>
        /// <param name="deviceTypeEnum"></param>
        /// <param name="locationStatusEnum"></param>
        /// <returns></returns>
        public WebResponseContent UpdateLocationStatus(string LocationCode, DeviceTypeEnum deviceTypeEnum, LocationStatusEnum locationStatusEnum)
        {
            try
            {
                if (deviceTypeEnum == DeviceTypeEnum.GALAXIS)
                {
                    Dt_KLSLocationInfo? dt_KLSLocationInfo = _kLSLocationInfoService.Repository.QueryFirst(x => x.LocationCode == LocationCode);
                    if (dt_KLSLocationInfo != null)
                    {
                        dt_KLSLocationInfo.LocationStatus = locationStatusEnum.ObjToInt();
                        _kLSLocationInfoService.Repository.UpdateData(dt_KLSLocationInfo);
                    }
                }
                else if (deviceTypeEnum == DeviceTypeEnum.HIKROBOT)
                {
                    Dt_HKLocationInfo? dt_HKLocationInfo = _hKLocationInfoService.Repository.QueryFirst(x => x.LocationCode == LocationCode);
                    if (dt_HKLocationInfo != null)
                    {
                        dt_HKLocationInfo.LocationStatus = locationStatusEnum.ObjToInt();
                        _hKLocationInfoService.Repository.UpdateData(dt_HKLocationInfo);
                    }
                }
                else if (deviceTypeEnum == DeviceTypeEnum.YuanLiJuHe)
                {
                    Dt_RGVLocationInfo dt_RGVLocationInfo = _rGVLocationInfoService.Repository.QueryFirst(x => x.LocationCode == LocationCode);
                    if (dt_RGVLocationInfo != null)
                    {
                        dt_RGVLocationInfo.LocationStatus = locationStatusEnum.ObjToInt();
                        _rGVLocationInfoService.Repository.UpdateData(dt_RGVLocationInfo);
                    }
                }
                else//库外站台
                {
                }
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        #endregion
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/TaskExtend.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_Tasks
{
    public partial class TaskJob
    {
        #region ä¸‹å‘任务
        /// <summary>
        /// ä¸‹å‘任务
        /// </summary>
        public void SendTask()
        {
            try
            {
                var newTask = _taskService.Db.Queryable<Dt_Task>().Where(x => x.TaskState == TaskStatusEnum.New.ObjToInt()).ToList();
                if (newTask.Count > 0)
                {
                }
            }
            catch (Exception ex)
            {
                WriteError(nameof(TaskJob), ex.Message, ex);
            }
        }
        #endregion
        #region ä¸‹å‘待执行任务
        /// <summary>
        /// ä¸‹å‘待执行任务
        /// </summary>
        public void SendWaitToTask()
        {
            try
            {
            }
            catch (Exception ex)
            {
                WriteError(nameof(TaskJob), ex.Message, ex);
            }
        }
        #endregion
        #region ä¸‹å‘凯乐士AGV任务
        public void SendGALAXISTask(List<Dt_Task> tasks)
        {
        }
        #endregion
        #region ä¸‹å‘四向车任务
        public void SendRGVTask(List<Dt_Task> tasks)
        {
        }
        #endregion
        #region ä¸‹å‘海康AGV任务
        public void SendHIKROBOTTask(List<Dt_Task> tasks)
        {
        }
        #endregion
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/TaskJob.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
using Autofac.Core;
using HslCommunication;
using HslCommunication.Core;
using Microsoft.VisualBasic.FileIO;
using Quartz;
using SixLabors.ImageSharp.PixelFormats;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Communicator;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DeviceBase;
using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
namespace WIDESEAWCS_Tasks
{
    [DisallowConcurrentExecution]
    public partial class TaskJob : JobBase, IJob
    {
        private readonly ITaskService _taskService;
        private readonly IApiInfoService _apiInfoService;
        public TaskJob(ITaskService taskService, IApiInfoService apiInfoService)
        {
            _taskService = taskService;//注入
            _apiInfoService = apiInfoService;
        }
        public Task Execute(IJobExecutionContext context)
        {
            try
            {
                SendTask();
                SendWaitToTask();
            }
            catch (Exception ex)
            {
                Console.Out.WriteLine(nameof(TaskJob) + ":" + ex.Message);
            }
            return Task.CompletedTask;
        }
    }
}