wangxinhui
6 小时以前 ff24fa06ba2d3a5e271789b8f81f3a3131d19470
更新代码
已添加10个文件
已删除4个文件
已修改14个文件
1930 ■■■■ 文件已修改
项目代码/WIDESEA_WCSServer/WIDESEAWCS_BasicInfoRepository/ApiInfoRepository.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Common/APIEnum/APIEnum.cs 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Common/TaskEnum/TaskEnumHelper.cs 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs 308 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Core/BaseRepository/IRepository.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Core/BaseRepository/RepositoryBase.cs 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Core/DB/Models/IBaseHistoryEntity.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Core/Enums/OperateTypeEnum.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/AGVReceiveDTO.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/AgvRespone.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/AgvResponseContent.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/AgvStatusUpdateDTO.cs 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/AgvTaskSendDTO.cs 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/SendTask.cs 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_DTO/WMS/RequestTaskDto.cs 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_IBasicInfoRepository/IApiInfoRepository.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_IBasicInfoRepository/IDt_StationManagerRepository.cs 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_ITaskInfoService/ITaskExecuteDetailService.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_ITaskInfoService/ITaskService.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Model/Models/BasicInfo/Dt_ApiInfo.cs 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs 74 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Server/Controllers/System/Sys_DictionaryController.cs 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_TaskInfoService/TaskExecuteDetailService.cs 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_TaskInfoService/TaskService.cs 178 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Tasks/AGV/CommonAGVJob.cs 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_BasicInfoRepository/ApiInfoRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_BasicInfoRepository
{
    public class ApiInfoRepository : RepositoryBase<Dt_ApiInfo>, IApiInfoRepository
    {
        public ApiInfoRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Common/APIEnum/APIEnum.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_Common.APIEnum
{
    public enum APIEnum
    {
        /// <summary>
        /// AGV发送任务接口
        /// </summary>
        [Description("AGV发送任务接口")]
        AgvSendTask,
        /// <summary>
        /// AGV任务放行接口
        /// </summary>
        [Description("AGV任务放行接口")]
        AgvTaskFlow,
        /// <summary>
        /// AGV状态查询接口
        /// </summary>
        [Description("AGV状态查询接口")]
        AgvSearchStatus,
        /// <summary>
        /// AGV任务取消
        /// </summary>
        [Description("AGV任务取消")]
        AgvTaskCancel
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Common/TaskEnum/TaskEnumHelper.cs
@@ -18,29 +18,9 @@
        public static TaskTypeGroup GetTaskTypeGroup(this int taskType)
        {
            if (!int.TryParse(Enum.Parse<TaskOutboundTypeEnum>(taskType.ToString()).ToString(), out int result))
            {
                return TaskTypeGroup.OutbondGroup;
            }
            else if (!int.TryParse(Enum.Parse<TaskInboundTypeEnum>(taskType.ToString()).ToString(), out result))
            {
                return TaskTypeGroup.InboundGroup;
            }
            else if (!int.TryParse(Enum.Parse<TaskRelocationTypeEnum>(taskType.ToString()).ToString(), out result))
            {
                return TaskTypeGroup.RelocationGroup;
            }
            else if (!int.TryParse(Enum.Parse<TaskOtherTypeEnum>(taskType.ToString()).ToString(), out result))
            {
                return TaskTypeGroup.OtherGroup;
            }
            else if (!int.TryParse(Enum.Parse<TaskAGVCarryTypeEnum>(taskType.ToString()).ToString(), out result))
            if (!int.TryParse(Enum.Parse<TaskAGVCarryTypeEnum>(taskType.ToString()).ToString(), out int result))
            {
                return TaskTypeGroup.CarryGroup;
            }
            else if (!int.TryParse(Enum.Parse<TaskAcrossFloorTypeEnum>(taskType.ToString()).ToString(), out result))
            {
                return TaskTypeGroup.AcrossFloorGroup;
            }
            else
            {
@@ -50,29 +30,9 @@
        public static TaskStateGroup GetTaskStateGroup(this int taskState)
        {
            if (!int.TryParse(Enum.Parse<TaskOutStatusEnum>(taskState.ToString()).ToString(), out int result))
            {
                return TaskStateGroup.OutbondGroup;
            }
            else if (!int.TryParse(Enum.Parse<TaskInStatusEnum>(taskState.ToString()).ToString(), out result))
            {
                return TaskStateGroup.InboundGroup;
            }
            else if (!int.TryParse(Enum.Parse<TaskRelocationStatusEnum>(taskState.ToString()).ToString(), out result))
            {
                return TaskStateGroup.RelocationGroup;
            }
            else if (!int.TryParse(Enum.Parse<TaskOtherStateEnum>(taskState.ToString()).ToString(), out result))
            {
                return TaskStateGroup.OtherGroup;
            }
            else if (!int.TryParse(Enum.Parse<TaskAGVCarryStatusEnum>(taskState.ToString()).ToString(), out result))
            if (!int.TryParse(Enum.Parse<TaskAGVCarryStatusEnum>(taskState.ToString()).ToString(), out int result))
            {
                return TaskStateGroup.CarryGroup;
            }
            else if (!int.TryParse(Enum.Parse<TaskAcrossFloorStatusEnum>(taskState.ToString()).ToString(), out result))
            {
                return TaskStateGroup.AcrossFloorGroup;
            }
            else
            {
@@ -85,26 +45,9 @@
            Type type = typeof(T);
            if (type is null) throw new ArgumentNullException();
            if (!type.IsEnum) return 0;
            if (type == typeof(TaskInStatusEnum))
            if (type == typeof(TaskAGVCarryStatusEnum))
            {
                List<int> taskInboundTypes = type.GetEnumIndexList();
                return taskInboundTypes.Where(x => x > currentStatus && x < (int)TaskInStatusEnum.InFinish).OrderBy(x => x).FirstOrDefault();
            }
            else if (type == typeof(TaskOutStatusEnum))
            {
                return type.GetEnumIndexList().Where(x => x > currentStatus && x < (int)TaskOutStatusEnum.OutFinish).OrderBy(x => x).FirstOrDefault();
            }
            else if (type == typeof(TaskRelocationStatusEnum))
            {
                return type.GetEnumIndexList().Where(x => x > currentStatus && x < (int)TaskRelocationStatusEnum.RelocationFinish).OrderBy(x => x).FirstOrDefault();
            }
            else if (type == typeof(TaskAGVCarryStatusEnum))
            {
                return type.GetEnumIndexList().Where(x => x > currentStatus && x < (int)TaskAGVCarryStatusEnum.CarryFinish).OrderBy(x => x).FirstOrDefault();
            }
            else if (type == typeof(TaskAcrossFloorStatusEnum))
            {
                return type.GetEnumIndexList().Where(x => x > currentStatus && x < (int)TaskAcrossFloorStatusEnum.CarryFinish).OrderBy(x => x).FirstOrDefault();
                return type.GetEnumIndexList().Where(x => x > currentStatus && x < (int)TaskAGVCarryStatusEnum.AGV_CarryFinish).OrderBy(x => x).FirstOrDefault();
            }
            else
            {
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs
@@ -7,315 +7,103 @@
namespace WIDESEAWCS_Common.TaskEnum
{
    public enum TaskInStatusEnum
    {
        /// <summary>
        /// æ–°å»ºå…¥åº“任务
        /// </summary>
        [Description("新建入库任务")]
        InNew = 200,
        /// <summary>
        /// AGV入库执行中
        /// </summary>
        [Description("AGV入库执行中")]
        AGV_InExecuting = 210,
        /// <summary>
        /// AGV入库完成
        /// </summary>
        [Description("AGV搬运完成")]
        AGV_InFinish = 215,
        /// <summary>
        /// è¾“送线入库执行中
        /// </summary>
        [Description("输送线入库执行中")]
        Line_InExecuting = 220,
        /// <summary>
        /// è¾“送线入库完成
        /// </summary>
        [Description("输送线入库完成")]
        Line_InFinish = 225,
        /// <summary>
        /// å †åž›æœºå…¥åº“执行中
        /// </summary>
        [Description("堆垛机入库执行中")]
        SC_InExecuting = 230,
        /// <summary>
        /// å †åž›æœºå…¥åº“完成
        /// </summary>
        [Description("堆垛机入库完成")]
        SC_InFinish = 235,
        /// <summary>
        /// å…¥åº“任务完成
        /// </summary>
        [Description("入库任务完成")]
        InFinish = 290,
        /// <summary>
        /// å…¥åº“任务挂起
        /// </summary>
        [Description("入库任务挂起")]
        InPending = 297,
        /// <summary>
        /// å…¥åº“任务取消
        /// </summary>
        [Description("入库任务取消")]
        InCancel = 298,
        /// <summary>
        /// å…¥åº“任务异常
        /// </summary>
        [Description("入库任务异常")]
        InException = 299,
    }
    public enum TaskOutStatusEnum
    {
        /// <summary>
        /// æ–°å»ºå‡ºåº“任务
        /// </summary>
        [Description("新建出库任务")]
        OutNew = 100,
        /// <summary>
        /// å †åž›æœºå‡ºåº“执行中
        /// </summary>
        [Description("堆垛机出库执行中")]
        SC_OutExecuting = 110,
        /// <summary>
        /// å †åž›æœºå‡ºåº“完成
        /// </summary>
        [Description("堆垛机出库完成")]
        SC_OutFinish = 115,
        /// <summary>
        /// è¾“送线出库执行中
        /// </summary>
        [Description("输送线出库执行中")]
        Line_OutExecuting = 120,
        /// <summary>
        /// è¾“送线出库完成
        /// </summary>
        [Description("输送线出库完成")]
        Line_OutFinish = 125,
        /// <summary>
        /// AGV出库执行中
        /// </summary>
        [Description("AGV出库执行中")]
        AGV_OutExecuting = 130,
        /// <summary>
        /// AGV出库完成
        /// </summary>
        [Description("AGV搬运完成")]
        AGV_OutFinish = 135,
        /// <summary>
        /// å‡ºåº“任务完成
        /// </summary>
        [Description("出库任务完成")]
        OutFinish = 190,
        /// <summary>
        /// å‡ºåº“任务挂起
        /// </summary>
        [Description("出库任务挂起")]
        OutPending = 197,
        /// <summary>
        /// å‡ºåº“任务取消
        /// </summary>
        [Description("出库任务取消")]
        OutCancel = 198,
        /// <summary>
        /// å‡ºåº“任务异常
        /// </summary>
        [Description("出库任务异常")]
        OutException = 199,
    }
    public enum TaskOtherStateEnum
    {
    }
    public enum TaskRelocationStatusEnum
    {
        /// <summary>
        /// æ–°å»ºç§»åº“任务
        /// </summary>
        [Description("新建移库任务")]
        RelocationNew = 300,
        /// <summary>
        /// å †åž›æœºç§»åº“执行中
        /// </summary>
        [Description("堆垛机移库执行中")]
        SC_RelocationExecuting = 310,
        /// <summary>
        /// å †åž›æœºç§»åº“完成
        /// </summary>
        [Description("堆垛机移库完成")]
        SC_RelocationFinish = 315,
        /// <summary>
        /// æ–°å»ºAGV移库任务
        /// </summary>
        [Description("新建AGV移库任务")]
        RelocationNewAGV = 320,
        /// <summary>
        /// AGV移库执行中
        /// </summary>
        [Description("AGV移库执行中")]
        AGV_RelocationExecuting = 325,
        /// <summary>
        /// AGV移库完成
        /// </summary>
        [Description("AGV移库完成")]
        AGV_RelocationFinish = 330,
        /// <summary>
        /// ç§»åº“任务完成
        /// </summary>
        [Description("移库任务完成")]
        RelocationFinish = 390,
        /// <summary>
        /// ç§»åº“任务挂起
        /// </summary>
        [Description("移库任务挂起")]
        RelocationPending = 397,
        /// <summary>
        /// ç§»åº“任务取消
        /// </summary>
        [Description("移库任务取消")]
        RelocationCancel = 398,
        /// <summary>
        /// ç§»åº“任务异常
        /// </summary>
        [Description("移库任务异常")]
        RelocationException = 399,
    }
    public enum TaskAGVCarryStatusEnum
    {
        /// <summary>
        /// æ–°å»ºAGV搬运任务
        /// </summary>
        [Description("新建AGV搬运任务")]
        CarryNew = 400,
        AGV_CarryNew = 400,
        /// <summary>
        /// AGV搬运执行中
        /// </summary>
        [Description("AGV搬运执行中")]
        AGV_CarryExecuting = 410,
        AGV_CarryExecuting = 405,
        /// <summary>
        /// AGV取货完成
        /// </summary>
        [Description("AGV搬运取货完成")]
        AGV_CarryTakeFinish = 410,
        /// <summary>
        /// AGV搬运完成
        /// </summary>
        [Description("AGV搬运完成")]
        AGV_CarryFinish = 415,
        [Description("AGV搬运放货完成")]
        AGV_CarryReleaseFinish = 415,
        /// <summary>
        /// AGV搬运任务完成
        /// </summary>
        [Description("AGV搬运任务完成")]
        CarryFinish = 490,
        AGV_CarryFinish = 490,
        /// <summary>
        /// AGV搬运任务挂起
        /// </summary>
        [Description("AGV搬运任务挂起")]
        CarryPending = 497,
        AGV_CarryPending = 497,
        /// <summary>
        /// AGV搬运任务取消
        /// </summary>
        [Description("AGV搬运任务取消")]
        CarryCancel = 498,
        AGV_CarryCancel = 498,
        /// <summary>
        /// AGV搬运任务异常
        /// </summary>
        [Description("AGV搬运任务异常")]
        CarryException = 499,
        AGV_CarryException = 499,
    }
    public enum TaskAcrossFloorStatusEnum
    /// <summary>
    ///作业当前状态<br/>
    ///开始移动:MOVE_BEGIN<br/>
    ///料 ç®± å– æ–™ å®Œ æˆ:PICKER_RECEIVE<br/>
    ///料 ç®± ä¸‹ æ–™ å®Œ æˆ:PICKER_SEND<br/>
    ///等待放行:WAITFEEDBACK<br/>
    ///任务完成:COMPLETED<br/>
    ///任务取消完成:CANCELED<br/>
    ///告警:WARNING<br/>
    /// </summary>
    public enum AGVStatusEnum
    {
        /// <summary>
        /// æ–°å»ºè·¨æ¥¼å±‚任务
        /// å¼€å§‹ç§»åЍ
        /// </summary>
        [Description("新建跨楼层任务")]
        CarryNew = 500,
        [Description("开始移动")]
        MOVE_BEGIN,
        /// <summary>
        /// è·¨æ¥¼å±‚搬运1
        /// æ–™ ç®± å– æ–™ å®Œ æˆ
        /// </summary>
        [Description("跨楼层搬运1")]
        FirstCarry = 510,
        [Description("料 ç®± å– æ–™ å®Œ æˆ")]
        PICKER_RECEIVE,
        /// <summary>
        /// ä¸€æ¥¼æ¬è¿å®Œæˆ
        /// æ–™ ç®± ä¸‹ æ–™ å®Œ æˆ
        /// </summary>
        [Description("跨楼层搬运1完成")]
        FirstCarryFinish = 515,
        [Description("料 ç®± ä¸‹ æ–™ å®Œ æˆ")]
        PICKER_SEND,
        /// <summary>
        /// è·¨æ¥¼å±‚搬运2
        /// ä»»åŠ¡å®Œæˆ
        /// </summary>
        [Description("跨楼层搬运2")]
        SecondCarry = 520,
        [Description("任务完成")]
        COMPLETED,
        /// <summary>
        /// è·¨æ¥¼å±‚终点执行
        /// ç­‰å¾…放行
        /// </summary>
        [Description("跨楼层终点执行")]
        EndAddressExecuting = 525,
        [Description("等待放行")]
        WAITFEEDBACK,
        /// <summary>
        /// è·¨æ¥¼å±‚搬运2完成
        /// ä»»åŠ¡å–æ¶ˆå®Œæˆ
        /// </summary>
        [Description("跨楼层搬运2完成")]
        SecondCarryFinish = 530,
        [Description("任务取消完成")]
        CANCELED,
        /// <summary>
        /// è·¨æ¥¼å±‚任务完成
        /// å‘Šè­¦
        /// </summary>
        [Description("跨楼层任务完成")]
        CarryFinish = 590,
        /// <summary>
        /// è·¨æ¥¼å±‚任务挂起
        /// </summary>
        [Description("跨楼层任务挂起")]
        CarryPending = 597,
        /// <summary>
        /// è·¨æ¥¼å±‚任务取消
        /// </summary>
        [Description("跨楼层任务取消")]
        CarryCancel = 598,
        /// <summary>
        /// AGV搬运任务异常
        /// </summary>
        [Description("AGV搬运任务异常")]
        CarryException = 599,
        [Description("告警")]
        WARNING,
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs
@@ -7,94 +7,19 @@
namespace WIDESEAWCS_Common.TaskEnum
{
    public enum TaskInboundTypeEnum
    {
        /// <summary>
        /// å…¥åº“
        /// </summary>
        [Description("入库")]
        Inbound = 200,
        /// <summary>
        /// å…¶ä»–入库
        /// </summary>
        [Description("其他入库")]
        InOther = 205,
    }
    public enum TaskOutboundTypeEnum
    {
        /// <summary>
        /// å‡ºåº“
        /// </summary>
        [Description("出库")]
        Outbound = 100,
        /// <summary>
        /// è°ƒæ‹¨å‡ºåº“
        /// </summary>
        [Description("调拨出库")]
        OutAllocate = 105,
        /// <summary>
        /// å…¶ä»–出库
        /// </summary>
        [Description("其他出库")]
        OutOther = 110,
        /// <summary>
        /// ç”Ÿäº§é¢†æ–™å‡ºåº“
        /// </summary>
        [Description("生产领料出库")]
        MaterialRequisition = 115,
        /// <summary>
        /// åŽŸææ–™å‡ºåº“
        /// </summary>
        [Description("原材料出库")]
        RawMaterials = 120,
    }
    public enum TaskRelocationTypeEnum
    {
        /// <summary>
        /// åº“内移库
        /// </summary>
        [Description("库内移库")]
        Relocation = 300,
        /// <summary>
        /// åº“外移库
        /// </summary>
        [Description("库外移库")]
        RelocationIn = 301
    }
    public enum TaskOtherTypeEnum
    {
    }
    public enum TaskAGVCarryTypeEnum
    {
        /// <summary>
        /// AGV搬运
        /// AGV上料搬运
        /// </summary>
        [Description("AGV搬运")]
        [Description("AGV上料搬运")]
        Carry = 400,
        /// <summary>
        /// AGV移库搬运
        /// AGV空载具搬运
        /// </summary>
        [Description("AGV移库搬运")]
        CarryReloction = 410
    }
    public enum TaskAcrossFloorTypeEnum
    {
        /// <summary>
        /// è·¨æ¥¼å±‚搬运
        /// </summary>
        [Description("跨楼层搬运")]
        AcrossFloorCarry = 500
        [Description("AGV空载具搬运")]
        CarryEmpty = 410
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj
@@ -7,11 +7,13 @@
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
    <Compile Remove="Http\**" />
    <EmbeddedResource Remove="Http\**" />
    <None Remove="Http\**" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="Http\" />
    <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
  </ItemGroup>
</Project>
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Core/BaseRepository/IRepository.cs
@@ -7,6 +7,7 @@
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.Enums;
namespace WIDESEAWCS_Core.BaseRepository
{
@@ -414,5 +415,9 @@
        //    Expression<Func<T, T2, T3, TResult>> selectExpression,
        //    Expression<Func<T, T2, T3, bool>> whereLambda = null) where T : class, new();
        //Task<PageModel<TEntity>> QueryPage(PaginationModel pagination);
        bool DeleteAndMoveIntoHty(TEntity entity, OperateTypeEnum operateType);
        bool DeleteAndMoveIntoHty(List<TEntity> entities, OperateTypeEnum operateType);
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Core/BaseRepository/RepositoryBase.cs
@@ -16,6 +16,9 @@
using WIDESEAWCS_Core.Const;
using WIDESEAWCS_Core.AOP;
using OfficeOpenXml.FormulaParsing.ExpressionGraph;
using WIDESEAWCS_Core.DB.Models;
using WIDESEAWCS_Core.Utilities;
using WIDESEAWCS_Core.Enums;
namespace WIDESEAWCS_Core.BaseRepository
{
@@ -852,5 +855,103 @@
        //    Expression<Func<T, T2, T3, TResult>> selectExpression,
        //    Expression<Func<T, T2, T3, bool>> whereLambda = null) where T : class, new(){throw new NotImplementedException();}
        //Task<PageModel<TEntity>> QueryPage(PaginationModel pagination){throw new NotImplementedException();}
        public bool DeleteAndMoveIntoHty(TEntity entity, OperateTypeEnum operateType)
        {
            Type type = entity.GetType();
            Assembly assembly = type.Assembly;
            Type? htyType = assembly.GetType(type.FullName + "_Hty");
            if (htyType != null)
            {
                object? obj = Activator.CreateInstance(htyType);
                PropertyInfo keyPro = typeof(TEntity).GetKeyProperty();
                PropertyInfo? operateTypePro = htyType.GetProperty(nameof(IBaseHistoryEntity.OperateType));
                PropertyInfo? sourceIdPro = htyType.GetProperty(nameof(IBaseHistoryEntity.SourceId));
                if (obj != null && keyPro != null && operateTypePro != null && sourceIdPro != null)
                {
                    operateTypePro.SetValue(obj, operateType.ToString());
                    sourceIdPro.SetValue(obj, keyPro.GetValue(entity));
                    List<PropertyInfo> propertyInfos = htyType.GetProperties().Where(x => x.Name != operateTypePro.Name && x.Name != sourceIdPro.Name && x.Name != keyPro.Name).ToList();
                    for (int i = 0; i < propertyInfos.Count; i++)
                    {
                        PropertyInfo propertyInfo = propertyInfos[i];
                        PropertyInfo? property = type.GetProperty(propertyInfo.Name);
                        if (property != null)
                        {
                            if (propertyInfo.Name == nameof(BaseEntity.Modifier))
                            {
                                propertyInfo.SetValue(obj, App.User.UserId > 0 ? App.User.UserName : "System");
                            }
                            else if (propertyInfo.Name == nameof(BaseEntity.ModifyDate))
                            {
                                propertyInfo.SetValue(obj, DateTime.Now);
                            }
                            else
                            {
                                propertyInfo.SetValue(obj, property.GetValue(entity));
                            }
                        }
                    }
                    _db.InsertableByObject(obj).AS(type.Name + "_Hty").ExecuteCommand();
                }
            }
            return DeleteData(entity);
        }
        public bool DeleteAndMoveIntoHty(List<TEntity> entities, OperateTypeEnum operateType)
        {
            Type type = typeof(TEntity);
            Assembly assembly = type.Assembly;
            Type? htyType = assembly.GetType(type.FullName + "_Hty");
            if (htyType != null)
            {
                object? obj2 = Activator.CreateInstance(htyType);
                PropertyInfo keyPro = typeof(TEntity).GetKeyProperty();
                PropertyInfo? operateTypePro = htyType.GetProperty(nameof(IBaseHistoryEntity.OperateType));
                PropertyInfo? sourceIdPro = htyType.GetProperty(nameof(IBaseHistoryEntity.SourceId));
                if (obj2 != null && keyPro != null && operateTypePro != null && sourceIdPro != null)
                {
                    List<PropertyInfo> propertyInfos = htyType.GetProperties().Where(x => x.Name != operateTypePro.Name && x.Name != sourceIdPro.Name && x.Name != keyPro.Name).ToList();
                    List<object> list = new List<object>();
                    foreach (var item in entities)
                    {
                        object? obj = Activator.CreateInstance(htyType);
                        if (obj != null)
                        {
                            operateTypePro.SetValue(obj, operateType.ToString());
                            sourceIdPro.SetValue(obj, keyPro.GetValue(item));
                            for (int i = 0; i < propertyInfos.Count; i++)
                            {
                                PropertyInfo propertyInfo = propertyInfos[i];
                                PropertyInfo? property = type.GetProperty(propertyInfo.Name);
                                if (property != null)
                                {
                                    if (propertyInfo.Name == nameof(BaseEntity.Modifier))
                                    {
                                        propertyInfo.SetValue(obj, App.User.UserId > 0 ? App.User.UserName : "System");
                                    }
                                    else if (propertyInfo.Name == nameof(BaseEntity.ModifyDate))
                                    {
                                        propertyInfo.SetValue(obj, DateTime.Now);
                                    }
                                    else
                                    {
                                        propertyInfo.SetValue(obj, property.GetValue(item));
                                    }
                                }
                            }
                            list.Add(obj);
                        }
                    }
                    _db.InsertableByObject(list).AS(type.Name + "_Hty").ExecuteCommand();
                }
            }
            return DeleteData(entities);
        }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Core/DB/Models/IBaseHistoryEntity.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
using Magicodes.ExporterAndImporter.Core;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_Core.DB.Models
{
    public interface IBaseHistoryEntity
    {
        /// <summary>
        /// åŽŸè¡¨ä¸»é”®
        /// </summary>
        [ImporterHeader(Name = "原表主键")]
        [ExporterHeader(DisplayName = "原表主键")]
        [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "原表主键")]
        public int SourceId { get; set; }
        /// <summary>
        /// æ“ä½œç±»åž‹
        /// </summary>
        [ImporterHeader(Name = "操作类型")]
        [ExporterHeader(DisplayName = "操作类型")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "操作类型")]
        public string OperateType { get; set; }
        /// <summary>
        /// ç§»å…¥åŽ†å²æ—¶é—´
        /// </summary>
        [ImporterHeader(Name = "移入历史时间")]
        [ExporterHeader(DisplayName = "移入历史时间")]
        [SugarColumn(IsNullable = false, ColumnDescription = "移入历史时间")]
        public DateTime InsertTime { get; set; }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Core/Enums/OperateTypeEnum.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_Core.Enums
{
    public enum OperateTypeEnum
    {
        äººå·¥åˆ é™¤ = 1,
        è‡ªåŠ¨åˆ é™¤ = 2,
        äººå·¥æ¢å¤ = 3,
        è‡ªåŠ¨æ¢å¤ = 4,
        äººå·¥å®Œæˆ = 5,
        è‡ªåŠ¨å®Œæˆ = 6,
        å…³é—­ = 7,
        å…¶ä»– = 99
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/AGVReceiveDTO.cs
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/AgvRespone.cs
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/AgvResponseContent.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_DTO.Agv
{
    /// <summary>
    /// AGV返回参数
    /// </summary>
    public class AgvResponseContent
    {
        /// <summary>
        ///
        /// </summary>
        public object Data { get; set; }
        /// <summary>
        /// è¿”回代码
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// è¿”回信息
        /// </summary>
        public string Message { get; set; }
        /// <summary>
        /// è¿”回结果
        /// </summary>
        public bool Success { get; set; }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/AgvStatusUpdateDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_DTO.Agv
{
    public class AgvStatusUpdateDTO
{
        /// <summary>
        /// ä»»åŠ¡ç¼–å·
        /// </summary>
        public string MissionCode { get; set; }
        /// <summary>
        /// ä½œä¸šç±»åž‹
        /// </summary>
        public string ViewBoardType { get; set; }
        /// <summary>
        /// å½“前所在槽位
        /// </summary>
        public string SlotCode { get; set; }
        /// <summary>
        /// æ‰§è¡Œå½“前任务的机器人 id
        /// </summary>
        public string RobotId { get; set; }
        /// <summary>
        /// å®¹å™¨ç¼–号
        /// </summary>
        public string ContainerCode { get; set; }
        /// <summary>
        /// å®¹å™¨å½“前位置
        /// </summary>
        public string CurrentPosition { get; set; }
        /// <summary>
        ///作业当前状态<br/>
        ///开始移动:MOVE_BEGIN<br/>
        ///料 ç®± å– æ–™ å®Œ æˆ:PICKER_RECEIVE<br/>
        ///料 ç®± ä¸‹ æ–™ å®Œ æˆ:PICKER_SEND<br/>
        ///等待放行:WAITFEEDBACK<br/>
        ///任务完成:COMPLETED<br/>
        ///任务取消完成:CANCELED<br/>
        ///告警:WARNING<br/>
        /// </summary>
        public string MissionStatus { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string Message { get; set; }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/AgvTaskSendDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,154 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_DTO.Agv
{
    public class MissionDataItem
    {
        /// <summary>
        /// æ¬è¿æ–™ç®±åºå·ä»Ž1开始
        /// </summary>
        public int Sequence { get; set; } = 1;
        /// <summary>
        /// æ–™ç®±å·
        /// </summary>
        public string BinCode { get; set; }
        /// <summary>
        /// æ–™ç®±æ‰€åœ¨çš„起始点位
        /// </summary>
        public string StartPosition { get; set; }
        /// <summary>
        /// æ–™ç®±æ‰€åœ¨çš„起始槽位
        /// </summary>
        public string StartSlotCode { get; set; }
        /// <summary>
        /// å–料箱时之前是否需要确认
        /// </summary>
        public bool TakeActionConfirm { get; set; }
        /// <summary>
        /// å–料箱后是否需要通知
        /// </summary>
        public bool TakeActionInform { get; set; }
        /// <summary>
        /// æ–™ç®±æ‰€åœ¨çš„目标点位
        /// </summary>
        public string EndPosition { get; set; }
        /// <summary>
        /// æ–™ç®±æ‰€åœ¨çš„目标槽位
        /// </summary>
        public string EndSlotCode { get; set; }
        /// <summary>
        /// æ”¾æ–™ç®±æ—¶ä¹‹å‰æ˜¯å¦éœ€è¦ç¡®è®¤
        /// </summary>
        public bool PutActionConfirm { get; set; }
        /// <summary>
        /// æ”¾æ–™ç®±åŽæ˜¯å¦éœ€è¦é€šçŸ¥
        /// </summary>
        public bool PutActionInform { get; set; }
    }
    /// <summary>
    /// AGV任务发送
    /// </summary>
    public class AgvTaskSendDTO
    {
        /// <summary>
        /// åº“存组织ID
        /// </summary>
        public string OrgId { get; set; } = "HF";
        /// <summary>
        /// è¯·æ±‚ id
        /// </summary>
        public string RequestId { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç¼–ç 
        /// </summary>
        public string MissionCode { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç±»åž‹ï¼šPICKER_MOVE
        /// </summary>
        public string MissionType { get; set; } = "PICKER_MOVE";
        /// <summary>
        /// ä»»åŠ¡çœ‹æ¿å±•ç¤ºä»»åŠ¡ç±»åž‹
        /// </summary>
        public string ViewBoardType { get; set; }
        /// <summary>
        /// æœºå™¨äººå…·ä½“型号
        /// </summary>
        public List<string> RobotModels { get; set; }
        /// <summary>
        /// æœºå™¨äººç¼–号
        /// </summary>
        public List<string> RobotIds { get; set; }
        /// <summary>
        /// æœºå™¨äººåŠŸèƒ½ç±»åž‹PICKER
        /// </summary>
        public string RobotType { get; set; } = "PICKER";
        /// <summary>
        /// ä½œä¸šä¼˜å…ˆçº§
        /// </summary>
        public int Priority { get; set; }
        /// <summary>
        /// å®¹å™¨æ¨¡åž‹ç¼–码
        /// </summary>
        public string ContainerModelCode { get; set; }
        /// <summary>
        /// å®¹å™¨ç¼–号
        /// </summary>
        public string ContainerCode { get; set; }
        /// <summary>
        /// ä½œä¸šæµç¨‹æ¨¡æ¿ç¼–号
        /// </summary>
        public string TemplateCode { get; set; }
        /// <summary>
        ///
        /// </summary>
        public bool LockRobotAfterFinish { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string UnlockRobotId { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string UnlockMissionCode { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string IdleNode { get; set; }
        /// <summary>
        ///
        /// </summary>
        public List<MissionDataItem> MissionData { get; set; }
    }
    public class AgvTaskCancelDTO
    {
        /// <summary>
        /// è¯·æ±‚id
        /// </summary>
        public string RequestId { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç¼–å·
        /// </summary>
        public string MissionCode { get; set; }
        /// <summary>
        /// å®¹å™¨ç¼–号
        /// </summary>
        public string ContainerCode { get; set; }
        /// <summary>
        /// èŠ‚ç‚¹ç¼–å·
        /// </summary>
        public string Position { get; set; }
        /// <summary>
        /// å–消模式
        /// </summary>
        public string CancelMode { get; set; }
        /// <summary>
        /// å–消原因
        /// </summary>
        public string Reason { get; set; }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/SendTask.cs
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_DTO/WMS/RequestTaskDto.cs
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_IBasicInfoRepository/IApiInfoRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_IBasicInfoRepository
{
    public interface IApiInfoRepository : IRepository<Dt_ApiInfo>
    {
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_IBasicInfoRepository/IDt_StationManagerRepository.cs
@@ -1,19 +1,8 @@
#region << ç‰ˆ æœ¬ æ³¨ é‡Š >>
/*----------------------------------------------------------------
 * å‘½åç©ºé—´ï¼šWIDESEAWCS_ITaskInfoRepository
 * åˆ›å»ºè€…:胡童庆
 * åˆ›å»ºæ—¶é—´ï¼š2024/8/2 16:13:36
 * ç‰ˆæœ¬ï¼šV1.0.0
 * æè¿°ï¼š
 *
 * ----------------------------------------------------------------
 * ä¿®æ”¹äººï¼š
 * ä¿®æ”¹æ—¶é—´ï¼š
 * ç‰ˆæœ¬ï¼šV1.0.1
 * ä¿®æ”¹è¯´æ˜Žï¼š
 *
 *----------------------------------------------------------------*/
#endregion << ç‰ˆ æœ¬ æ³¨ é‡Š >>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Model.Models;
@@ -21,6 +10,5 @@
{
    public interface IDt_StationManagerRepository : IRepository<Dt_StationManager>
    {
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_ITaskInfoService/ITaskExecuteDetailService.cs
@@ -34,7 +34,5 @@
        WebResponseContent GetDetailInfo(int taskNum);
        WebResponseContent GetDetailDatas(int taskNum);
        void AddTaskExecuteDetail(List<int> taskNums, string description = "");
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -31,6 +31,8 @@
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_DTO.MES;
using WIDESEAWCS_Common.APIEnum;
using WIDESEAWCS_DTO.Agv;
namespace WIDESEAWCS_ITaskInfoService
{
@@ -40,37 +42,6 @@
        /// ä»»åŠ¡æŽ’åº
        /// </summary>
        public Dictionary<string, OrderByType> TaskOrderBy { get; set; }
        /// <summary>
        /// æ‰€æœ‰å…¥åº“任务类型
        /// </summary>
        public List<int> TaskInboundTypes { get; }
        /// <summary>
        /// æ‰€æœ‰å‡ºåº“任务类型
        /// </summary>
        public List<int> TaskOutboundTypes { get; }
        /// <summary>
        /// æ‰€æœ‰ç§»åº“任务类型
        /// </summary>
        public List<int> TaskRelocationboundTypes { get; }
        /// <summary>
        /// æ‰€æœ‰å…¥åº“任务状态
        /// </summary>
        public List<int> TaskInboundStates { get; }
        /// <summary>
        /// æ‰€æœ‰å‡ºåº“任务状态
        /// </summary>
        public List<int> TaskOutboundStates { get; }
        /// <summary>
        /// æ‰€æœ‰ç§»åº“任务状态
        /// </summary>
        public List<int> TaskRelocationboundStates { get; }
        /// <summary>
        /// æŽ¥æ”¶MES任务
@@ -112,5 +83,28 @@
        /// <param name="taskNum">任务号</param>
        /// <returns>返回处理结果</returns>
        WebResponseContent RollbackTaskStatusToLast(int taskNum);
        /// <summary>
        /// AGV任务发送
        /// </summary>
        /// <returns></returns>
        WebResponseContent AgvSendTask(AgvTaskSendDTO taskModel, APIEnum SendTask = APIEnum.AgvSendTask);
        /// <summary>
        /// æ›´æ–°ä»»åŠ¡ä¿¡æ¯åŠæ·»åŠ ä»»åŠ¡æ˜Žç»†è®°å½•
        /// </summary>
        /// <param name="task">任务原对象实例(未修改的数据对象)</param>
        /// <param name="taskStatus">修改后的任务状态</param>
        /// <param name="deviceCode">修改后的设备编号</param>
        /// <param name="sourceAddress">修改后的起始地址</param>
        /// <param name="targetAddress">修改后的目标地址</param>
        /// <param name="currentAddress">修改后的当前地址</param>
        /// <param name="nextAddress">修改后的下一地址</param>
        void UpdateTask(Dt_Task task, TaskAGVCarryStatusEnum taskStatus, string deviceCode = "", string sourceAddress = "", string targetAddress = "", string currentAddress = "", string nextAddress = "", string roadwayNo = "");
        /// <summary>
        /// ä»»åŠ¡å®Œæˆé¢
        /// </summary>
        /// <returns></returns>
        WebResponseContent TaskCompleted(int taskNum);
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Model/Models/BasicInfo/Dt_ApiInfo.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
using SqlSugar;
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
{
    [SugarTable(nameof(Dt_ApiInfo), "接口信息")]
    public class Dt_ApiInfo : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// æŽ¥å£ç¼–号
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "接口编号")]
        public string ApiCode { get; set; }
        /// <summary>
        /// æŽ¥å£åç§°
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "接口名称")]
        public string ApiName { get; set; }
        /// <summary>
        /// æŽ¥å£åœ°å€
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 200, ColumnDescription = "接口地址")]
        public string ApiAddress { get; set; }
        /// <summary>
        /// æ˜¯å¦å¯ç”¨
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "是否启用")]
        public int Enable { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "备注")]
        public string Remark { get; set; }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs
@@ -1,29 +1,85 @@
using Microsoft.AspNetCore.Authorization;
using Autofac.Core;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using System.Reflection;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
using System.Text;
using System.Text.RegularExpressions;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.APIEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_DTO.AGV;
using WIDESEAWCS_Core.Enums;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Core.LogHelper;
using WIDESEAWCS_DTO;
using WIDESEAWCS_DTO.Agv;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Repository;
using WIDESEAWCS_TaskInfoService;
using WIDESEAWCS_Tasks;
namespace WIDESEAWCS_Server.Controllers.AGV
namespace WIDESEAWCS_Server.Controllers
{
    [Route("api/AGV")]
    [Route("api/[controller]")]
    [ApiController]
    public class AGVController : ControllerBase
    {
        private readonly ITaskRepository _taskRepository;
        private readonly IDt_StationManagerRepository _stationMangerRepository;
        private readonly ITaskService _taskService;
        private readonly ITaskRepository _taskRepository;
        private readonly IRouterRepository _routerRepository;
        public AGVController(ITaskRepository taskRepository,ITaskService taskService)
        public AGVController(IDt_StationManagerRepository stationMangerRepository, ITaskService taskService, ITaskRepository taskRepository,IRouterRepository routerRepository)
        {
            _taskRepository = taskRepository;
            _stationMangerRepository = stationMangerRepository;
            _taskService = taskService;
            _taskRepository = taskRepository;
            _routerRepository = routerRepository;
        }
        /// <summary>
        /// AGV任务更新
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("Callback"), AllowAnonymous]
        public WebResponseContent? Callback([FromBody]AgvStatusUpdateDTO agvUpdateDTO)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                var task = _taskRepository.QueryFirst(x => (agvUpdateDTO.ContainerCode ?? "") == x.PalletCode);
                switch (agvUpdateDTO.MissionStatus)
                {
                    case nameof(AGVStatusEnum.PICKER_RECEIVE):
                        if (task == null) throw new Exception($"未找到料箱【{agvUpdateDTO.ContainerCode}】任务");
                        _taskService.UpdateTask(task, TaskAGVCarryStatusEnum.AGV_CarryTakeFinish);
                        break;
                    case nameof(AGVStatusEnum.PICKER_SEND):
                        if (task == null) throw new Exception($"未找到料箱【{agvUpdateDTO.ContainerCode}】任务");
                        _taskService.UpdateTask(task, TaskAGVCarryStatusEnum.AGV_CarryReleaseFinish);
                        break;
                    case nameof(AGVStatusEnum.COMPLETED):
                        if (task == null) throw new Exception($"未找到料箱【{agvUpdateDTO.ContainerCode}】任务");
                        _taskService.TaskCompleted(task.TaskNum);
                        break;
                    default:
                        break;
                }
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Server/Controllers/System/Sys_DictionaryController.cs
@@ -186,94 +186,6 @@
                        {
                            List<object> data = new List<object>();
                            #region TaskInboundTypeEnum
                            {
                                Type type = typeof(TaskInboundTypeEnum);
                                List<int> enums = Enum.GetValues(typeof(TaskInboundTypeEnum)).Cast<int>().ToList();
                                int index = 0;
                                foreach (var item in enums)
                                {
                                    FieldInfo? fieldInfo = typeof(TaskInboundTypeEnum).GetField(((TaskInboundTypeEnum)item).ToString());
                                    DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                                    if (description != null)
                                    {
                                        data.Add(new { key = item.ToString(), value = description.Description });
                                    }
                                    else
                                    {
                                        data.Add(new { key = item.ToString(), value = item.ToString() });
                                    }
                                    index++;
                                }
                            }
                            #endregion
                            #region TaskOutboundTypeEnum
                            {
                                Type type = typeof(TaskOutboundTypeEnum);
                                List<int> enums = Enum.GetValues(typeof(TaskOutboundTypeEnum)).Cast<int>().ToList();
                                int index = 0;
                                foreach (var item in enums)
                                {
                                    FieldInfo? fieldInfo = typeof(TaskOutboundTypeEnum).GetField(((TaskOutboundTypeEnum)item).ToString());
                                    DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                                    if (description != null)
                                    {
                                        data.Add(new { key = item.ToString(), value = description.Description });
                                    }
                                    else
                                    {
                                        data.Add(new { key = item.ToString(), value = item.ToString() });
                                    }
                                    index++;
                                }
                            }
                            #endregion
                            #region TaskRelocationTypeEnum
                            {
                                Type type = typeof(TaskRelocationTypeEnum);
                                List<int> enums = Enum.GetValues(typeof(TaskRelocationTypeEnum)).Cast<int>().ToList();
                                int index = 0;
                                foreach (var item in enums)
                                {
                                    FieldInfo? fieldInfo = typeof(TaskRelocationTypeEnum).GetField(((TaskRelocationTypeEnum)item).ToString());
                                    DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                                    if (description != null)
                                    {
                                        data.Add(new { key = item.ToString(), value = description.Description });
                                    }
                                    else
                                    {
                                        data.Add(new { key = item.ToString(), value = item.ToString() });
                                    }
                                    index++;
                                }
                            }
                            #endregion
                            #region TaskOtherTypeEnum
                            {
                                Type type = typeof(TaskOtherTypeEnum);
                                List<int> enums = Enum.GetValues(typeof(TaskOtherTypeEnum)).Cast<int>().ToList();
                                int index = 0;
                                foreach (var item in enums)
                                {
                                    FieldInfo? fieldInfo = typeof(TaskOtherTypeEnum).GetField(((TaskOtherTypeEnum)item).ToString());
                                    DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                                    if (description != null)
                                    {
                                        data.Add(new { key = item.ToString(), value = description.Description });
                                    }
                                    else
                                    {
                                        data.Add(new { key = item.ToString(), value = item.ToString() });
                                    }
                                    index++;
                                }
                            }
                            #endregion
                            #region TaskAGVCarryTypeEnum
                            {
                                Type type = typeof(TaskAGVCarryTypeEnum);
@@ -296,100 +208,12 @@
                            }
                            #endregion
                            #region TaskAcrossFloorTypeEnum
                            {
                                Type type = typeof(TaskAcrossFloorTypeEnum);
                                List<int> enums = Enum.GetValues(typeof(TaskAcrossFloorTypeEnum)).Cast<int>().ToList();
                                int index = 0;
                                foreach (var item in enums)
                                {
                                    FieldInfo? fieldInfo = typeof(TaskAcrossFloorTypeEnum).GetField(((TaskAcrossFloorTypeEnum)item).ToString());
                                    DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                                    if (description != null)
                                    {
                                        data.Add(new { key = item.ToString(), value = description.Description });
                                    }
                                    else
                                    {
                                        data.Add(new { key = item.ToString(), value = item.ToString() });
                                    }
                                    index++;
                                }
                            }
                            #endregion
                            result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data };
                        }
                        break;
                    case "taskState":
                        {
                            List<object> data = new List<object>();
                            #region TaskInStatusEnum
                            {
                                Type type = typeof(TaskInStatusEnum);
                                List<int> enums = Enum.GetValues(typeof(TaskInStatusEnum)).Cast<int>().ToList();
                                int index = 0;
                                foreach (var item in enums)
                                {
                                    FieldInfo? fieldInfo = typeof(TaskInStatusEnum).GetField(((TaskInStatusEnum)item).ToString());
                                    DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                                    if (description != null)
                                    {
                                        data.Add(new { key = item.ToString(), value = description.Description });
                                    }
                                    else
                                    {
                                        data.Add(new { key = item.ToString(), value = item.ToString() });
                                    }
                                    index++;
                                }
                            }
                            #endregion
                            #region TaskOutStatusEnum
                            {
                                Type type = typeof(TaskOutStatusEnum);
                                List<int> enums = Enum.GetValues(typeof(TaskOutStatusEnum)).Cast<int>().ToList();
                                int index = 0;
                                foreach (var item in enums)
                                {
                                    FieldInfo? fieldInfo = typeof(TaskOutStatusEnum).GetField(((TaskOutStatusEnum)item).ToString());
                                    DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                                    if (description != null)
                                    {
                                        data.Add(new { key = item.ToString(), value = description.Description });
                                    }
                                    else
                                    {
                                        data.Add(new { key = item.ToString(), value = item.ToString() });
                                    }
                                    index++;
                                }
                            }
                            #endregion
                            #region TaskRelocationStatusEnum
                            {
                                Type type = typeof(TaskRelocationStatusEnum);
                                List<int> enums = Enum.GetValues(typeof(TaskRelocationStatusEnum)).Cast<int>().ToList();
                                int index = 0;
                                foreach (var item in enums)
                                {
                                    FieldInfo? fieldInfo = typeof(TaskRelocationStatusEnum).GetField(((TaskRelocationStatusEnum)item).ToString());
                                    DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                                    if (description != null)
                                    {
                                        data.Add(new { key = item.ToString(), value = description.Description });
                                    }
                                    else
                                    {
                                        data.Add(new { key = item.ToString(), value = item.ToString() });
                                    }
                                    index++;
                                }
                            }
                            #endregion
                            #region TaskAGVCarryStatusEnum
                            {
@@ -413,27 +237,6 @@
                            }
                            #endregion
                            #region TaskAcrossFloorStatusEnum
                            {
                                Type type = typeof(TaskAcrossFloorStatusEnum);
                                List<int> enums = Enum.GetValues(typeof(TaskAcrossFloorStatusEnum)).Cast<int>().ToList();
                                int index = 0;
                                foreach (var item in enums)
                                {
                                    FieldInfo? fieldInfo = typeof(TaskAcrossFloorStatusEnum).GetField(((TaskAcrossFloorStatusEnum)item).ToString());
                                    DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                                    if (description != null)
                                    {
                                        data.Add(new { key = item.ToString(), value = description.Description });
                                    }
                                    else
                                    {
                                        data.Add(new { key = item.ToString(), value = item.ToString() });
                                    }
                                    index++;
                                }
                            }
                            #endregion
                            result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data };
                        }
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
using Autofac.Core;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.Log;
using WIDESEAWCS_Common.APIEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_DTO.Agv;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_TaskInfoService
{
    public partial class TaskService
    {
        // åˆ›å»ºä¸€ä¸ªä½¿ç”¨å°é©¼å³°å‘½åæ³•的序列化设置
        JsonSerializerSettings settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
        /// <summary>
        /// AGV任务发送
        /// </summary>
        /// <returns></returns>
        public WebResponseContent AgvSendTask(AgvTaskSendDTO taskModel, APIEnum SendTask = APIEnum.AgvSendTask)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string? apiAddress = _apiInfoRepository.QueryFirst(x => x.ApiCode == SendTask.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(apiAddress)) throw new Exception($"未找到发送AGV任务接口,请检查接口配置");
                string request = JsonConvert.SerializeObject(taskModel, settings);
                string response = HttpHelper.Post(apiAddress, request);
                WriteLog.Write_Log("AGV入库任务下发", "出库任务下发接口", "请求任务", $"请求:{request},回传:{response}");
                AgvResponseContent agvContent = response.DeserializeObject<AgvResponseContent>() ?? throw new Exception("AGV任务发送未返回结果");
                if (agvContent.Success)
                {
                    content.OK();
                }
                else
                {
                    content.Error(agvContent.Message);
                }
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        public WebResponseContent AgvCancelTask(AgvTaskCancelDTO taskModel, APIEnum SendTask = APIEnum.AgvTaskCancel)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string? apiAddress = _apiInfoRepository.QueryFirst(x => x.ApiCode == SendTask.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(apiAddress)) throw new Exception($"未找到发送AGV任务接口,请检查接口配置");
                string request = JsonConvert.SerializeObject(taskModel, settings);
                string response = HttpHelper.Post(apiAddress, request);
                AgvResponseContent agvContent = response.DeserializeObject<AgvResponseContent>() ?? throw new Exception("AGV任务发送未返回结果");
                if (agvContent.Success)
                {
                    content.OK();
                }
                else
                {
                    content.Error(agvContent.Message);
                }
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_TaskInfoService/TaskExecuteDetailService.cs
@@ -53,14 +53,9 @@
                int taskNum = task.TaskNum;
                int taskState = task.TaskState;
                if (!int.TryParse(Enum.Parse<TaskOutStatusEnum>(taskState.ToString()).ToString(), out int result))
                if (!int.TryParse(Enum.Parse<TaskAGVCarryStatusEnum>(taskState.ToString()).ToString(), out int result))
                {
                    if ((int)(TaskOutStatusEnum)result > (int)TaskOutStatusEnum.OutFinish)
                        isNormal = false;
                }
                else if (!int.TryParse(Enum.Parse<TaskInStatusEnum>(taskState.ToString()).ToString(), out result))
                {
                    if ((int)(TaskInStatusEnum)result > (int)TaskInStatusEnum.InFinish)
                    if ((int)(TaskAGVCarryStatusEnum)result > (int)TaskAGVCarryStatusEnum.AGV_CarryFinish)
                        isNormal = false;
                }
                
@@ -93,14 +88,9 @@
                int NewtaskNum = task.TaskNum;
                int taskState = task.TaskState;
                if (!int.TryParse(Enum.Parse<TaskOutStatusEnum>(taskState.ToString()).ToString(), out int result))
                if (!int.TryParse(Enum.Parse<TaskAGVCarryStatusEnum>(taskState.ToString()).ToString(), out int result))
                {
                    if ((int)(TaskOutStatusEnum)result > (int)TaskOutStatusEnum.OutFinish)
                        isNormal = false;
                }
                else if (!int.TryParse(Enum.Parse<TaskInStatusEnum>(taskState.ToString()).ToString(), out result))
                {
                    if ((int)(TaskInStatusEnum)result > (int)TaskInStatusEnum.InFinish)
                    if ((int)(TaskAGVCarryStatusEnum)result > (int)TaskAGVCarryStatusEnum.AGV_CarryFinish)
                        isNormal = false;
                }
                
@@ -124,52 +114,6 @@
            }
        }
        public void AddTaskExecuteDetail(List<int> taskNums, string description = "")
        {
            try
            {
                List<Dt_TaskExecuteDetail> taskExecuteDetails = new List<Dt_TaskExecuteDetail>();
                foreach (var item in taskNums)
                {
                    bool isNormal = true;
                    Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == item);
                    if (task == null) return;
                    int taskNum = task.TaskNum;
                    int taskState = task.TaskState;
                    if (!int.TryParse(Enum.Parse<TaskOutStatusEnum>(taskState.ToString()).ToString(), out int result))
                    {
                        if ((int)(TaskOutStatusEnum)result > (int)TaskOutStatusEnum.OutFinish)
                            isNormal = false;
                    }
                    else if (!int.TryParse(Enum.Parse<TaskInStatusEnum>(taskState.ToString()).ToString(), out result))
                    {
                        if ((int)(TaskInStatusEnum)result > (int)TaskInStatusEnum.InFinish)
                            isNormal = false;
                    }
                    Dt_TaskExecuteDetail taskExecuteDetail = new()
                    {
                        IsManual = App.User.UserId > 0,
                        IsNormal = isNormal,
                        TaskNum = taskNum,
                        TaskId = task.TaskId,
                        TaskState = taskState,
                        Description = description,
                        CurrentAddress = task.CurrentAddress,
                        NextAddress = task.NextAddress,
                    };
                    taskExecuteDetails.Add(taskExecuteDetail);
                }
                BaseDal.AddData(taskExecuteDetails);
            }
            catch (Exception ex)
            {
            }
        }
        public WebResponseContent GetDetailInfo(int taskNum)
        {
            WebResponseContent content = new();
@@ -182,14 +126,14 @@
                if (task != null)
                {
                    if (!int.TryParse(Enum.Parse<TaskOutboundTypeEnum>(task.TaskType.ToString()).ToString(), out int result))
                    if (!int.TryParse(Enum.Parse<TaskAGVCarryTypeEnum>(task.TaskType.ToString()).ToString(), out int result))
                    {
                        steps = Enum.GetValues(typeof(TaskOutStatusEnum)).Cast<int>().Where(x => x <= (int)TaskOutStatusEnum.OutFinish).ToList();
                        steps = Enum.GetValues(typeof(TaskAGVCarryStatusEnum)).Cast<int>().Where(x => x <= (int)TaskAGVCarryStatusEnum.AGV_CarryFinish).ToList();
                        foreach (var item in steps)
                        {
                            object obj;
                            FieldInfo? fieldInfo = typeof(TaskOutStatusEnum).GetField(((TaskOutStatusEnum)item).ToString());
                            FieldInfo? fieldInfo = typeof(TaskAGVCarryStatusEnum).GetField(((TaskAGVCarryStatusEnum)item).ToString());
                            DescriptionAttribute? descriptionAttribute = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                            if (descriptionAttribute != null)
                            {
@@ -197,38 +141,10 @@
                            }
                            else
                            {
                                obj = new { title = item, description = ((TaskOutStatusEnum)item).ToString() };
                                obj = new { title = item, description = ((TaskAGVCarryStatusEnum)item).ToString() };
                            }
                            list.Add(obj);
                        }
                    }
                    else if (!int.TryParse(Enum.Parse<TaskInboundTypeEnum>(task.TaskType.ToString()).ToString(), out result))
                    {
                        steps = Enum.GetValues(typeof(TaskInStatusEnum)).Cast<int>().Where(x => x <= (int)TaskInStatusEnum.InFinish).ToList();
                        foreach (var item in steps)
                        {
                            object obj;
                            FieldInfo? fieldInfo = typeof(TaskInStatusEnum).GetField(((TaskInStatusEnum)item).ToString());
                            DescriptionAttribute? descriptionAttribute = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                            if (descriptionAttribute != null)
                            {
                                obj = new { title = item, description = descriptionAttribute.Description };
                            }
                            else
                            {
                                obj = new { title = item, description = ((TaskInStatusEnum)item).ToString() };
                            }
                            list.Add(obj);
                        }
                    }
                    else if (!int.TryParse(Enum.Parse<TaskRelocationTypeEnum>(task.TaskType.ToString()).ToString(), out result))
                    {
                        //todo è°ƒç”¨WMS移库完成
                    }
                    else if (!int.TryParse(Enum.Parse<TaskOtherTypeEnum>(task.TaskType.ToString()).ToString(), out result))
                    {
                    }
                    else
                    {
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -5,19 +5,25 @@
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using SqlSugar;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.Log;
using WIDESEAWCS_BasicInfoRepository;
using WIDESEAWCS_BasicInfoService;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.APIEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_Core.Enums;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Core.LogHelper;
using WIDESEAWCS_DTO.MES;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_DTO.WMS;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_ISystemServices;
@@ -43,6 +49,8 @@
        private readonly IDt_StationManagerRepository _stationManagerRepository;
        private readonly IRouterRepository _routerRepository;
        private readonly ITask_HtyRepository _taskHtyRepository;
        private readonly IApiInfoRepository _apiInfoRepository;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private Dictionary<string, OrderByType> _taskOrderBy = new()
        {
@@ -56,20 +64,12 @@
        #region èŽ·å–æ‰€æœ‰ä»»åŠ¡ç±»åž‹ã€çŠ¶æ€
        public List<int> TaskInboundTypes => typeof(TaskInboundTypeEnum).GetEnumIndexList();
        public List<int> TaskOutboundTypes => typeof(TaskOutboundTypeEnum).GetEnumIndexList();
        public List<int> TaskRelocationboundTypes => typeof(TaskRelocationTypeEnum).GetEnumIndexList();
        public List<int> TaskInboundStates => typeof(TaskInStatusEnum).GetEnumIndexList();
        public List<int> TaskOutboundStates => typeof(TaskOutStatusEnum).GetEnumIndexList();
        public List<int> TaskRelocationboundStates => typeof(TaskRelocationStatusEnum).GetEnumIndexList();
        #endregion èŽ·å–æ‰€æœ‰ä»»åŠ¡ç±»åž‹ã€çŠ¶æ€
        public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, ISys_ConfigService sys_ConfigService, IDt_StationManagerService stationManagerService, IDt_StationManagerRepository stationManagerRepository, IRouterRepository routerRepository, ITask_HtyRepository htyRepository) : base(BaseDal)
        public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, ISys_ConfigService sys_ConfigService, IDt_StationManagerService stationManagerService, IDt_StationManagerRepository stationManagerRepository, IRouterRepository routerRepository, ITask_HtyRepository htyRepository, IApiInfoRepository apiInfoRepository,IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
        {
            _routerService = routerService;
            _taskExecuteDetailService = taskExecuteDetailService;
@@ -80,6 +80,8 @@
            _stationManagerRepository = stationManagerRepository;
            _routerRepository = routerRepository;
            _taskHtyRepository = htyRepository;
            _apiInfoRepository = apiInfoRepository;
            _unitOfWorkManage = unitOfWorkManage;
        }
        /// <summary>
@@ -139,13 +141,9 @@
            {
                var task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】");
                if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.CarryGroup)
                {
                    task.TaskState = (int)TaskOutStatusEnum.OutPending;
                }
                else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
                {
                    task.TaskState = (int)TaskInStatusEnum.InPending;
                    task.TaskState = (int)TaskAGVCarryStatusEnum.AGV_CarryException;
                }
                task.ExceptionMessage = message;
                task.ModifyDate = DateTime.Now;
@@ -196,29 +194,15 @@
                int oldState = task.TaskState;
                if (task.TaskState.GetTaskStateGroup() == TaskStateGroup.OutbondGroup)
                {
                    int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskOutStatusEnum>();
                    int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskAGVCarryStatusEnum>();
                    task.TaskState = nextStatus;
                    if (task.TaskState == (int)TaskOutStatusEnum.AGV_OutFinish)
                    if (task.TaskState == (int)TaskAGVCarryStatusEnum.AGV_CarryFinish)
                    {
                        task.ModifyDate = DateTime.Now;
                        task.Modifier = "System";
                        Dt_Task_Hty task_Hty = _mapper.Map<Dt_Task_Hty>(task);
                        task_Hty.TaskId = 0;
                        BaseDal.DeleteData(task);
                        _taskHtyRepository.AddData(task_Hty);
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工完成 : OperateTypeEnum.自动完成);
                    }
                }
                else if (task.TaskState.GetTaskStateGroup() == TaskStateGroup.InboundGroup)
                {
                    int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>();
                    task.TaskState = nextStatus;
                }
                else
                {
@@ -273,7 +257,7 @@
            {
                var task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】");
                if (task.TaskState != (int)TaskInStatusEnum.InPending && task.TaskState != (int)TaskOutStatusEnum.OutPending)
                if (task.TaskState != (int)TaskAGVCarryStatusEnum.AGV_CarryException && task.TaskState != (int)TaskAGVCarryStatusEnum.AGV_CarryException)
                {
                    return content = WebResponseContent.Instance.Error($"该任务状态不可恢复,任务号:【{taskNum}】,任务状态:【{task.TaskState}】");
                }
@@ -285,14 +269,7 @@
                }
                else
                {
                    if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                    {
                        task.TaskState = (int)TaskOutStatusEnum.OutNew;
                    }
                    else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
                    {
                        task.TaskState = (int)TaskInStatusEnum.InNew;
                    }
                    throw new Exception($"未找到任务号{taskNum}恢复状态");
                }
                task.ExceptionMessage = string.Empty;
@@ -379,5 +356,122 @@
        #endregion é‡å†™æ–¹æ³•
        /// <summary>
        /// æ›´æ–°ä»»åŠ¡ä¿¡æ¯åŠæ·»åŠ ä»»åŠ¡æ˜Žç»†è®°å½•
        /// </summary>
        /// <param name="task">任务原对象实例(未修改的数据对象)</param>
        /// <param name="taskStatus">修改后的任务状态</param>
        /// <param name="deviceCode">修改后的设备编号</param>
        /// <param name="sourceAddress">修改后的起始地址</param>
        /// <param name="targetAddress">修改后的目标地址</param>
        /// <param name="currentAddress">修改后的当前地址</param>
        /// <param name="nextAddress">修改后的下一地址</param>
        public void UpdateTask(Dt_Task task, TaskAGVCarryStatusEnum taskStatus, string deviceCode = "", string sourceAddress = "", string targetAddress = "", string currentAddress = "", string nextAddress = "", string roadwayNo = "")
        {
            StringBuilder stringBuilder = new StringBuilder(App.User?.UserId == 0 ? $"系统自动流程" : "人工手动流程");
            if (task.SourceAddress != sourceAddress && !string.IsNullOrEmpty(sourceAddress))
            {
                stringBuilder.Append($",起始地址由{task.SourceAddress}变更为{sourceAddress}");
                task.SourceAddress = sourceAddress;
            }
            if (task.TargetAddress != targetAddress && !string.IsNullOrEmpty(targetAddress))
            {
                stringBuilder.Append($",目标地址由{task.TargetAddress}变更为{targetAddress}");
                task.TargetAddress = targetAddress;
            }
            if (task.CurrentAddress != currentAddress && !string.IsNullOrEmpty(currentAddress))
            {
                stringBuilder.Append($",当前位置由{task.CurrentAddress}变更为{currentAddress}");
                task.CurrentAddress = currentAddress;
            }
            if (task.NextAddress != nextAddress && !string.IsNullOrEmpty(nextAddress))
            {
                stringBuilder.Append($",下一位置由{task.NextAddress}变更为{nextAddress}");
                task.NextAddress = nextAddress;
            }
            if (task.Roadway != roadwayNo && !string.IsNullOrEmpty(roadwayNo))
            {
                stringBuilder.Append($",巷道号由{task.Roadway}变更为{roadwayNo}");
                task.Roadway = roadwayNo;
            }
            if (task.TaskState != taskStatus.ObjToInt())
            {
                string newStatus = $"{taskStatus}";
                try
                {
                    List<int> enums = Enum.GetValues(typeof(TaskAGVCarryStatusEnum)).Cast<int>().ToList();
                    FieldInfo? fieldInfo = typeof(TaskAGVCarryStatusEnum).GetField((taskStatus).ToString());
                    if (fieldInfo != null)
                    {
                        DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                        if (description != null)
                        {
                            newStatus = $"{description.Description}({taskStatus})";
                        }
                    }
                }
                catch { }
                string oldStatus = $"{task.TaskState}";
                try
                {
                    FieldInfo? fieldInfo2 = typeof(RouterInOutType).GetField(((TaskAGVCarryStatusEnum)task.TaskState).ToString());
                    if (fieldInfo2 != null)
                    {
                        DescriptionAttribute? description2 = fieldInfo2.GetCustomAttribute<DescriptionAttribute>();
                        if (description2 != null)
                        {
                            oldStatus = $"{description2.Description}({task.TaskState})";
                        }
                    }
                }
                catch { }
                stringBuilder.Append($",任务状态由{oldStatus}变更为{newStatus}");
                task.TaskState = taskStatus.ObjToInt();
            }
            BaseDal.UpdateData(task);
            _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, stringBuilder.ToString());
        }
        // åœ¨ç±»ä¸­æ·»åŠ é™æ€é”å¯¹è±¡
        private static readonly object _taskCompleteLock = new object();
        /// <summary>
        /// ä»»åŠ¡å®Œæˆ
        /// </summary>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        public WebResponseContent TaskCompleted(int taskNum)
        {
            WebResponseContent content = new WebResponseContent();
            // ä½¿ç”¨é”ç¡®ä¿åŒä¸€ä»»åŠ¡ä¸ä¼šå¹¶å‘å¤„ç†
            lock (_taskCompleteLock)
            {
                try
                {
                    WriteLog.Write_Log("任务完成", "任务完成接口", "任务号", $"任务:{taskNum}");
                    // å†æ¬¡æŸ¥è¯¢ä»»åŠ¡çŠ¶æ€ï¼Œé˜²æ­¢åœ¨é”ç­‰å¾…æœŸé—´ä»»åŠ¡çŠ¶æ€å·²æ”¹å˜
                    Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                    if (task == null)
                    {
                        return content.Error($"任务{taskNum}不存在");
                    }
                    //任务完成逻辑
                    _unitOfWorkManage.BeginTran();
                    _unitOfWorkManage.CommitTran();
                    content.OK("任务完成");
                }
                catch (Exception ex)
                {
                    _unitOfWorkManage.RollbackTran();
                    content.Error(ex.Message);
                }
                return content;
            }
        }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Tasks/AGV/CommonAGVJob.cs
@@ -10,12 +10,15 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.Log;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.APIEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_DTO.Agv;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_DTO.WMS;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ISystemServices;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
@@ -30,15 +33,87 @@
        private readonly ITaskRepository _taskRepository;
        private readonly ITaskService _taskService;
        private readonly ISys_ConfigService _sys_ConfigService;
        public CommonAGVJob(ITaskRepository taskRepository,ITaskService taskService,ISys_ConfigService configService)
        private readonly IDt_StationManagerRepository _stationManagerRepository;
        public CommonAGVJob(ITaskRepository taskRepository,ITaskService taskService,ISys_ConfigService configService,IDt_StationManagerRepository stationManagerRepository)
        {
            _taskRepository = taskRepository;
            _taskService = taskService;
            _sys_ConfigService = configService;
            _stationManagerRepository = stationManagerRepository;
        }
        public Task Execute(IJobExecutionContext context)
        {
            var newTasks = _taskService.Db.Queryable<Dt_Task>().Where(x => (x.TaskState == TaskAGVCarryStatusEnum.AGV_CarryNew.ObjToInt())).ToList().OrderBy(x => x.Grade).ThenBy(x => x.TaskNum).ToList();
            #region ä»»åŠ¡ä¸‹å‘
            if (newTasks.Count > 0)
            {
                WriteLog.Write_Log("AGV任务下发", "任务下发接口", "添加任务", $"任务:{newTasks.ToJson()}");
                try
                {
                    AgvTaskSendDTO agvTaskSend = new AgvTaskSendDTO()
                    {
                        MissionData = new List<MissionDataItem>()
                    };
                    string taskGroupId = Guid.NewGuid().ToString().Replace("-", "");
                    foreach (var task in newTasks)
                    {
                        //获取目标点货位
                        Dt_StationManager stationManagerStart = _stationManagerRepository.QueryFirst(x => x.stationLocation == task.CurrentAddress);
                        //获取拣选出库站台
                        Dt_StationManager stationManagerEnd = _stationManagerRepository.QueryFirst(x => x.stationLocation == task.NextAddress);
                        if (stationManagerStart == null || stationManagerStart == null) throw new Exception($"未找到任务号${task.TaskNum}起始点{task.CurrentAddress}或目标点{task.NextAddress}位置信息");
                        agvTaskSend.RequestId = taskGroupId;
                        agvTaskSend.MissionCode = task.TaskNum.ToString();
                        agvTaskSend.ViewBoardType = "W01";
                        //料箱子搬运任务
                        MissionDataItem missionDataItem = new MissionDataItem()
                        {
                            Sequence = task.TaskNum,
                            BinCode = task.PalletCode,
                            StartPosition = stationManagerStart.stationLocation,
                            EndPosition = stationManagerEnd.stationLocation,
                            TakeActionConfirm = false,
                            TakeActionInform = false,
                            PutActionConfirm = true,
                            PutActionInform = true,
                        };
                        agvTaskSend.MissionData.Add(missionDataItem);
                    }
                    if (newTasks.OrderByDescending(x => x.Grade).FirstOrDefault()?.Grade == 0)
                    {
                        agvTaskSend.Priority = 99;
                    }
                    else
                    {
                        agvTaskSend.Priority = 99 - newTasks.OrderByDescending(x => x.Grade).FirstOrDefault().Grade;
                    }
                    //发送AGV任务
                    WebResponseContent content = _taskService.AgvSendTask(agvTaskSend, APIEnum.AgvSendTask);
                    if (!content.Status)
                        throw new Exception(content.Message);
                    newTasks.ForEach(x =>
                    {
                        x.Dispatchertime = DateTime.Now;
                        x.TaskState = TaskAGVCarryStatusEnum.AGV_CarryExecuting.ObjToInt();
                    });
                    _taskService.UpdateData(newTasks);
                    Thread.Sleep(500);
                }
                catch (Exception ex)
                {
                    newTasks.ForEach(x =>
                    {
                        x.TaskState = TaskAGVCarryStatusEnum.AGV_CarryException.ObjToInt();
                        x.ExceptionMessage = ex.Message;
                    });
                    _taskService.UpdateData(newTasks);
                }
            }
            #endregion
            return Task.CompletedTask;
        }