wangxinhui
2025-12-19 5cf8be1f30878aeb2af568f471949d0b9190036a
CTU故障信息接口查询,故障上报至WMS,任务下发优化
已添加9个文件
已修改14个文件
796 ■■■■ 文件已修改
项目代码/WCSServices/WIDESEAWCS_BasicInfoRepository/ErrorInfoRepository.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_BasicInfoService/LocationInfoService.cs 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Common/APIEnum/APIEnum.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Common/Helper/AttributeHelper.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Common/Helper/ExportHelper.cs 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/Agv/AgvSearchStatusDTO.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/Agv/AgvStatusContent.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/EPLightSendDTO.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/TaskInfo/WMSTaskDTO.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_IBasicInfoRepository/IErrorInfoRepository.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Model/Models/BasicInfo/Dt_ErrorInfo.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Model/Models/BasicInfo/Dt_LocationInfo.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Server/Controllers/Task/TaskController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Server/appsettings.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_TaskInfoService/Task_HtyService.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Tasks/AGV/AGVErrorJob.cs 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Tasks/AGV/AGVExtend.cs 115 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口汇总文件/WMS-KUKA设备状态接口.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_BasicInfoRepository/ErrorInfoRepository.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 ErrorInfoRepository : RepositoryBase<Dt_ErrorInfo>, IErrorInfoRepository
    {
        public ErrorInfoRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_BasicInfoService/LocationInfoService.cs
@@ -1,26 +1,17 @@
using HslCommunication.WebSocket;
using Magicodes.ExporterAndImporter.Core;
using Magicodes.ExporterAndImporter.Core;
using Magicodes.ExporterAndImporter.Excel;
using MathNet.Numerics.Statistics.Mcmc;
using NPOI.SS.UserModel;
using NPOI.Util.Collections;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using NPOI.XSSF.UserModel;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_Core.Enums;
using System.Reflection;
using WIDESEA_DTO.Basic;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.WareHouseEnum;
using WIDESEAWCS_Common.Helper;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Core.Utilities;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_Model.Models;
@@ -197,45 +188,19 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                string savePath = AppDomain.CurrentDomain.BaseDirectory + $"ExcelExport";
                IExporter exporter = new ExcelExporter();
                options.Page = 1;
                options.Rows = 30;
                options.Order = "asc";
                options.Sort = "id";
                string savePath = AppDomain.CurrentDomain.BaseDirectory + "ExcelExport";
                string where = string.Empty;
                ISugarQueryable<Dt_LocationInfo> sugarQueryable = BaseDal.Db.Queryable<Dt_LocationInfo>();
                if (!string.IsNullOrEmpty(options.Wheres))
                {
                    try
                    {
                        List<SearchParameters> searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
                        if (searchParametersList?.Any() == true)
                        {
                            foreach (var param in searchParametersList)
                            {
                                switch (param.Name)
                                {
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                }
                // ç¡®ä¿ç›®å½•存在
                if (!Directory.Exists(savePath))
                    Directory.CreateDirectory(savePath);
                // èŽ·å–æ•°æ®
                ISugarQueryable<Dt_LocationInfo> query = BaseDal.Db.Queryable<Dt_LocationInfo>();
                var dataList = query.ToList();
                var properties = typeof(Dt_LocationInfo).GetProperties();
                byte[] data = exporter.ExportAsByteArray(sugarQueryable.ToList()).Result;
                string fileName = "库位信息.xlsx";
                FileHelper.WriteFile(savePath, fileName, data);
                content = WebResponseContent.Instance.OK(data: savePath + "\\" + fileName);
                string filePath = TExportHelper.GetExport(savePath, properties, dataList);
                return WebResponseContent.Instance.OK(data: filePath);
            }
            catch (Exception ex)
            {
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Common/APIEnum/APIEnum.cs
@@ -20,6 +20,11 @@
        [Description("AGV任务放行接口")]
        AgvTaskFlow,
        /// <summary>
        /// AGV状态查询接口
        /// </summary>
        [Description("AGV状态查询接口")]
        AgvSearchStatus,
        /// <summary>
        /// WMS出入库反馈完成
        /// </summary>
        [Description("WMS出入库反馈完成")]
@@ -35,6 +40,11 @@
        [Description("WMS播种墙上报")]
        WMSLightBack,
        /// <summary>
        /// WMS故障上报
        /// </summary>
        [Description("WMS故障上报")]
        WMSErrorBack,
        /// <summary>
        /// äºŒæœŸæ’­ç§å¢™åˆå§‹åŒ–
        /// </summary>
        [Description("二期播种墙初始化")]
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Common/Helper/AttributeHelper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_Common.Helper
{
    public static class AttributeHelper
    {
        /// <summary>
        /// èŽ·å–å±žæ€§çš„ ExporterHeader æ˜¾ç¤ºåç§°
        /// </summary>
        public static string GetExporterDisplayName(PropertyInfo property)
        {
            try
            {
                // èŽ·å– ExporterHeaderAttribute ç‰¹æ€§
                var exporterHeaderAttr = property.GetCustomAttributes()
                    .FirstOrDefault(attr => attr.GetType().Name == "ExporterHeaderAttribute");
                if (exporterHeaderAttr != null)
                {
                    // ä½¿ç”¨åå°„获取 DisplayName å±žæ€§
                    var displayNameProp = exporterHeaderAttr.GetType().GetProperty("DisplayName");
                    if (displayNameProp != null)
                    {
                        var displayName = displayNameProp.GetValue(exporterHeaderAttr) as string;
                        if (!string.IsNullOrEmpty(displayName))
                        {
                            return displayName;
                        }
                    }
                    // æ£€æŸ¥æ˜¯å¦è¢«å¿½ç•¥
                    var isIgnoreProp = exporterHeaderAttr.GetType().GetProperty("IsIgnore");
                    if (isIgnoreProp != null)
                    {
                        var isIgnore = (bool)isIgnoreProp.GetValue(exporterHeaderAttr);
                        if (isIgnore)
                        {
                            return null; // è¿”回 null è¡¨ç¤ºå¿½ç•¥æ­¤åˆ—
                        }
                    }
                }
            }
            catch
            {
                // å¦‚果出错,返回属性名
            }
            return property.Name; // é»˜è®¤è¿”回属性名
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Common/Helper/ExportHelper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
using NPOI.SS.UserModel;
using NPOI.Util.Collections;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_Common.Helper
{
    public static class TExportHelper
    {
        /// <summary>
        /// å¯¼å‡º
        /// </summary>
        public static string GetExport<T>(string savePath, PropertyInfo[] properties, List<T> dataList)
        {
            string filePath = "";
            try
            {
                // åˆ›å»º Excel å·¥ä½œç°¿
                IWorkbook workbook = new XSSFWorkbook();
                ISheet sheet = workbook.CreateSheet("x");
                // åˆ›å»ºè¡¨å¤´è¡Œ
                IRow headerRow = sheet.CreateRow(0);
                sheet.DefaultColumnWidth = 15;
                // è®¾ç½®è¡¨å¤´æ ·å¼
                ICellStyle headerStyle = workbook.CreateCellStyle();
                IFont headerFont = workbook.CreateFont();
                headerFont.Boldweight = (short)FontBoldWeight.Bold;
                headerFont.FontHeightInPoints = 12;
                headerStyle.SetFont(headerFont);
                headerStyle.FillForegroundColor = IndexedColors.LightBlue.Index;
                headerStyle.FillPattern = FillPattern.SolidForeground;
                headerStyle.BorderBottom = BorderStyle.Thin;
                headerStyle.BorderTop = BorderStyle.Thin;
                headerStyle.BorderLeft = BorderStyle.Medium;
                headerStyle.BorderRight = BorderStyle.Medium;
                // è®¾ç½®æ•°æ®æ ·å¼
                ICellStyle dataStyle = workbook.CreateCellStyle();
                dataStyle.BorderBottom = BorderStyle.Thin;
                dataStyle.BorderTop = BorderStyle.Thin;
                dataStyle.BorderLeft = BorderStyle.Thin;
                dataStyle.BorderRight = BorderStyle.Thin;
                // å¡«å……表头
                for (int i = 0; i < properties.Length; i++)
                {
                    var columnName = AttributeHelper.GetExporterDisplayName(properties[i]);
                    var cell = headerRow.CreateCell(i);
                    cell.SetCellValue(columnName);
                    cell.CellStyle = headerStyle;
                }
                // å¡«å……数据
                for (int rowIdx = 0; rowIdx < dataList.Count; rowIdx++)
                {
                    IRow dataRow = sheet.CreateRow(rowIdx + 1);
                    var item = dataList[rowIdx];
                    for (int colIdx = 0; colIdx < properties.Length; colIdx++)
                    {
                        var cell = dataRow.CreateCell(colIdx);
                        var value = properties[colIdx].GetValue(item);
                        // å¤„理不同类型的值
                        if (value == null)
                        {
                            cell.SetCellValue("");
                        }
                        else if (value is DateTime dateTime)
                        {
                            cell.SetCellValue(dateTime.ToString("yyyy-MM-dd HH:mm:ss"));
                        }
                        else if (value is bool boolValue)
                        {
                            cell.SetCellValue(boolValue);
                        }
                        else
                        {
                            cell.SetCellValue(value.ToString());
                        }
                        cell.CellStyle = dataStyle;
                    }
                }
                // ä¿å­˜æ–‡ä»¶
                string fileName = "x.xlsx";
                filePath = Path.Combine(savePath, fileName);
                using (var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                {
                    workbook.Write(fs);
                }
            }
            catch (Exception)
            {
                throw;
            }
            return filePath;
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/Agv/AgvSearchStatusDTO.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 AgvSearchStatusDTO
    {
        /// <summary>
        /// æœºå™¨äººç¼–码
        /// </summary>
        public string RobotId { get; set; }
        /// <summary>
        /// æœºå™¨äººåž‹å·
        /// </summary>
        public string RobotType { get; set; }
        /// <summary>
        /// åœ°å›¾ç¼–码
        /// </summary>
        public string MapCode { get; set; }
        /// <summary>
        /// ç‰‡åŒºç¼–码
        /// </summary>
        public string FloorNumber { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/Agv/AgvStatusContent.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_DTO.Agv
{
    public class StatusItem
    {
        /// <summary>
        /// æœºå™¨äººç¼–号
        /// </summary>
        public string RobotId { get; set; }
        /// <summary>
        /// æ–™ç®±å·
        /// </summary>
        public string ContainerCode { get; set; }
        /// <summary>
        /// çŠ¶æ€
        /// </summary>
        public int Status { get; set; }
        /// å½“前点位
        /// </summary>
        public string NodeCode { get; set; }
        /// ä»»åŠ¡å·
        /// </summary>
        public string MissionCode { get; set; }
    }
    /// <summary>
    /// æœºå™¨äººçŠ¶æ€è¿”å›žç»“æžœ
    /// </summary>
    public class AgvStatusContent
    {
        /// <summary>
        /// è¿”回机器人状态集合
        /// </summary>
        public List<StatusItem> Data { get; set; }
        /// <summary>
        /// è¿”回代码
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// è¿”回信息
        /// </summary>
        public string Message { get; set; }
        /// <summary>
        /// è¿”回结果
        /// </summary>
        public bool Success { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/EPLightSendDTO.cs
@@ -29,11 +29,11 @@
        /// </summary>
        public string LIGHTCOLOR { get; set; }
        /// <summary>
        /// äº®ç¯çŠ¶æ€ï¼š1:亮:2灭
        /// ä¸šåŠ¡ç±»åž‹ 1:入库亮灯 2:出库亮灯
        /// </summary>
        public string ORDERTYPE { get; set; }
        /// <summary>
        /// ä¸šåŠ¡ç±»åž‹ 1:入库亮灯 2:出库亮灯
        /// äº®ç¯çŠ¶æ€ï¼š1:亮:2灭
        /// </summary>
        public string LIGHTTYPE { get; set; }
    }
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/TaskInfo/WMSTaskDTO.cs
@@ -141,4 +141,23 @@
        /// </summary>
        public string TagCode { get; set; }
    }
    public class TaskError
    {
        /// <summary>
        /// æ¶ˆæ¯ID
        /// </summary>
        public int MsgID { get; set; }
        /// <summary>
        /// å·¥ä½œç«™ç¼–号(101、201、301、302、401、402、501、502)
        /// </summary>
        public string StationCode { get; set; }
        /// <summary>
        /// æ•…障代码 å¤§äºŽ0标识故障,0标识恢复
        /// </summary>
        public int MsgCode { get; set; }
        /// <summary>
        /// æ•…障信息描述
        /// </summary>
        public string Msg { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_IBasicInfoRepository/IErrorInfoRepository.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 IErrorInfoRepository : IRepository<Dt_ErrorInfo>
    {
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -112,12 +112,6 @@
        /// <param name="taskModel"></param>
        /// <returns></returns>
        WebResponseContent AgvSendTask(AgvTaskSendDTO taskModel, APIEnum SendTask = APIEnum.AgvSendTask);
        /// <summary>
        /// AGV任务状态刷新
        /// </summary>
        /// <param name="agvUpdateModel"></param>
        /// <returns></returns>
        AgvResponseContent AgvUpdateTask(AgvUpdateDTO agvUpdateModel);
        /// <summary>
        /// æ›´æ–°ä»»åŠ¡ä¿¡æ¯åŠæ·»åŠ ä»»åŠ¡æ˜Žç»†è®°å½•
@@ -173,5 +167,9 @@
        /// </summary>
        /// <returns></returns>
        EPLightContent ENDWORK();
        /// <summary>
        /// AGV状态查询调用及WMS故障上报
        /// </summary>
        void AgvSearchStatus();
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Model/Models/BasicInfo/Dt_ErrorInfo.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
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_ErrorInfo), "异常信息")]
    public class Dt_ErrorInfo : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// ç«™å°ç¼–号
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 10, ColumnDescription = "站台编号")]
        public string StationCode { get; set; }
        /// <summary>
        /// CTU编号
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 10, ColumnDescription = "CTU编号")]
        public string RobotCode { get; set; }
        /// <summary>
        /// é”™è¯¯ä¿¡æ¯
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "错误信息")]
        public string Message { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Model/Models/BasicInfo/Dt_LocationInfo.cs
@@ -10,15 +10,14 @@
namespace WIDESEAWCS_Model.Models
{
    /// <summary>
    /// è´§ä½ä¿¡æ¯
    /// åº“位信息
    /// </summary>
    [SugarTable(nameof(Dt_LocationInfo), "货位信息")]
    [SugarTable(nameof(Dt_LocationInfo), "库位信息")]
    public class Dt_LocationInfo : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [ImporterHeader(Name = "主键")]
        [ExporterHeader(DisplayName = "主键")]
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
@@ -26,8 +25,7 @@
        /// <summary>
        /// åº“区编号
        /// </summary>
        [ImporterHeader(IsIgnore = true)]
        [ExporterHeader(IsIgnore = true)]
        [ExporterHeader(DisplayName = "库区编号")]
        [SugarColumn(IsNullable = false, ColumnDescription = "库区编号")]
        public int WarehouseId { get; set; }
@@ -98,23 +96,22 @@
        /// <summary>
        /// è´§ä½çŠ¶æ€
        /// </summary>
        [ImporterHeader(Name = "货位状态")]
        [ExporterHeader(DisplayName = "货位状态")]
        [ImporterHeader(Name = "货位状态(0:空闲;1:锁定;100:有货)")]
        [ExporterHeader(DisplayName = "货位状态(0:空闲;1:锁定;100:有货)")]
        [SugarColumn(IsNullable = true, DefaultValue = "0", ColumnDescription = "货位状态")]
        public int LocationStatus {  get; set; }
        /// <summary>
        /// ç¦ç”¨çŠ¶æ€
        /// </summary>
        [ImporterHeader(Name = "禁用状态")]
        [ExporterHeader(DisplayName = "禁用状态")]
        [ImporterHeader(Name = "禁用状态(0:正常;3:禁用)")]
        [ExporterHeader(DisplayName = "禁用状态(0:正常;3:禁用)")]
        [SugarColumn(IsNullable = true, DefaultValue = "0", ColumnDescription = "禁用状态")]
        public int EnableStatus { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [ImporterHeader(Name = "备注")]
        [ExporterHeader(DisplayName = "备注")]
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "备注")]
        public string Remark {  get; set; }
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs
@@ -66,16 +66,16 @@
        /// <summary>
        /// æ‰˜ç›˜ç±»åž‹
        /// </summary>
        [ImporterHeader(Name = "托盘类型")]
        [ExporterHeader(IsIgnore =true)]
        [SugarColumn(IsNullable = false, ColumnDescription = "托盘类型")]
        [ImporterHeader(Name = "料箱类型")]
        [ExporterHeader(DisplayName = "料箱类型")]
        [SugarColumn(IsNullable = false, ColumnDescription = "料箱类型")]
        public int PalletType { get; set; }
        /// <summary>
        /// è®¾å¤‡ç¼–号
        /// </summary>
        [ImporterHeader(Name = "设备编号")]
        [ExporterHeader(IsIgnore = true)]
        [ExporterHeader(DisplayName = "设备编号")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "设备编号")]
        public string DeviceCode { get; set; }
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs
@@ -155,5 +155,14 @@
            }
            return content;
        }
        /// <summary>
        /// AGV作业完成
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("AgvSearchStatus"), AllowAnonymous]
        public void AgvSearchStatus()
        {
            _taskService.AgvSearchStatus();
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Server/Controllers/Task/TaskController.cs
@@ -116,7 +116,7 @@
        /// <returns></returns>
        [HttpPost, HttpGet, Route("InitLight"), AllowAnonymous]
        public WebResponseContent InitLight()
        {
        {
            return Service.InitLight();
        }
        /// <summary>
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Server/appsettings.json
@@ -21,6 +21,7 @@
    // æ³¨æ„ï¼Œhttp://127.0.0.1:1818 å’Œ http://localhost:1818 æ˜¯ä¸ä¸€æ ·çš„
    "IPs": "http://127.0.0.1:8080,http://localhost:8080"
  },
  "ApiLogIgnore": "Export,Get,get",
  "WMSApiAddress": "http://127.0.0.1:9293", //"http://127.0.0.1:9283",正式环境地址
  "LogDeubgEnable": true, //是否记录调试日志
  "PrintSql": false, //打印SQL语句
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs
@@ -12,6 +12,9 @@
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_DTO.Agv;
using System.Reflection.Metadata;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_DTO.TaskInfo;
namespace WIDESEAWCS_TaskInfoService
{
@@ -48,13 +51,103 @@
            return content;
        }
        /// <summary>
        /// AGV任务状态刷新/AGV任务完成
        /// AGV状态查询调用及WMS故障上报
        /// </summary>
        /// <param name="agvUpdateModel"></param>
        /// <returns></returns>
        public AgvResponseContent AgvUpdateTask(AgvUpdateDTO agvUpdateModel)
        public void AgvSearchStatus()
        {
            return new AgvResponseContent();
            try
            {
                AgvSearchStatusDTO agvSearchStatusDTO = new AgvSearchStatusDTO();
                string? apiAddress = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.AgvSearchStatus.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(apiAddress)) throw new Exception($"未找到AGV状态查询接口,请检查接口配置");
                string? apiErrorBack = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMSErrorBack.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(apiErrorBack)) throw new Exception($"未找到WMS故障上报,请检查接口配置");
                string request = JsonConvert.SerializeObject(agvSearchStatusDTO, settings);
                string response = HttpHelper.Post(apiAddress, request);
                AgvStatusContent agvContent = response.DeserializeObject<AgvStatusContent>() ?? throw new Exception("AGV状态查询未返回结果");
                //获取所有故障信息
                List <Dt_ErrorInfo> errorInfos = _errorInfoRepository.QueryData();
                int errorId = errorInfos.Count > 0 ? errorInfos.Max(x => x.Id) : 0;
                List<Dt_ErrorInfo> delErrorInfos = new List<Dt_ErrorInfo>();
                List<Dt_ErrorInfo> addErrorInfos = new List<Dt_ErrorInfo>();
                //获取任务信息
                List<Dt_Task> tasks = BaseDal.QueryData();
                if (agvContent.Success)
                {
                    foreach (var item in agvContent.Data.Where(x => errorInfos.Select(x => x.RobotCode).Contains(x.RobotId) && x.Status != 7))
                    {
                        //上报故障恢复
                        Dt_ErrorInfo errorInfo = errorInfos.FirstOrDefault(x => x.RobotCode == item.RobotId);
                        delErrorInfos.Add(errorInfo);
                    }
                    foreach (var item in agvContent.Data.Where(x => !x.MissionCode.IsNullOrEmpty() && !errorInfos.Select(x => x.RobotCode).Contains(x.RobotId) && x.Status == 7))
                    {
                        Dt_Task? task = tasks.FirstOrDefault(x=>x.TaskNum == item.MissionCode.ObjToInt() || x.GroupId==item.MissionCode);
                        if (task != null)
                        {
                            Dt_ErrorInfo errorInfo = new Dt_ErrorInfo()
                            {
                                RobotCode = item.RobotId,
                                Message = "故障"
                            };
                            if (task.TaskType==TaskTypeEnum.Inbound.ObjToInt())
                            {
                                errorInfo.StationCode = task.CurrentAddress;
                            }
                            else
                            {
                                errorInfo.StationCode = task.NextAddress;
                            }
                            addErrorInfos.Add(errorInfo);
                        }
                    }
                }
                //数据库操作
                _unitOfWorkManage.BeginTran();
                _errorInfoRepository.DeleteData(delErrorInfos);
                _errorInfoRepository.AddData(addErrorInfos);
                _unitOfWorkManage.CommitTran();
                List<Dt_ErrorInfo> newErrInfos = _errorInfoRepository.QueryData(x=>x.Id > errorId);
                if (delErrorInfos.Count>0)
                {
                    foreach (var item in delErrorInfos)
                    {
                        TaskError taskError = new TaskError()
                        {
                            MsgID = item.Id,
                            StationCode = item.StationCode,
                            MsgCode = 0,
                            Msg = "恢复"
                        };
                        string reqErrorBack = JsonConvert.SerializeObject(taskError, settings);
                        HttpHelper.Post(apiErrorBack, reqErrorBack);
                    }
                }
                if (newErrInfos.Count>0)
                {
                    //上传故障
                    foreach (var item in newErrInfos)
                    {
                        TaskError taskError = new TaskError()
                        {
                            MsgID = item.Id,
                            StationCode = item.StationCode,
                            MsgCode = 1,
                            Msg = item.Message
                        };
                        string reqErrorBack = JsonConvert.SerializeObject(taskError, settings);
                        HttpHelper.Post(apiErrorBack, reqErrorBack);
                    }
                }
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                throw new Exception(ex.Message);
            }
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -18,6 +18,8 @@
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using NPOI.SS.Formula.Functions;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using SqlSugar;
using System.Diagnostics.CodeAnalysis;
using System.DirectoryServices.Protocols;
@@ -30,6 +32,7 @@
using WIDESEAWCS_BasicInfoService;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.APIEnum;
using WIDESEAWCS_Common.Helper;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseRepository;
@@ -66,6 +69,7 @@
        private readonly ILocationInfoRepository _locationInfoRepository;
        private readonly ILocationInfoService _locationInfoService;
        private readonly ILocationStatusChangeRecordService _locationStatusChangeRecordService;
        private readonly IErrorInfoRepository _errorInfoRepository;
        private Dictionary<string, OrderByType> _taskOrderBy = new()
            {
@@ -83,7 +87,7 @@
        public List<int> TaskRelocationTypes => typeof(TaskTypeEnum).GetEnumIndexList().Where(x => x >= 900 && x < 1000).ToList();
        public TaskService(ITaskRepository BaseDal, IMapper mapper, ICacheService cacheService, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IApiInfoRepository apiInfoRepository,ILocationInfoRepository locationInfoRepository,IUnitOfWorkManage unitOfWorkManage, ILocationInfoService locationInfoService,ILocationStatusChangeRecordService locationStatusChangeRecordService) : base(BaseDal)
        public TaskService(ITaskRepository BaseDal, IMapper mapper, ICacheService cacheService, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IApiInfoRepository apiInfoRepository,ILocationInfoRepository locationInfoRepository,IUnitOfWorkManage unitOfWorkManage, ILocationInfoService locationInfoService,ILocationStatusChangeRecordService locationStatusChangeRecordService,IErrorInfoRepository errorInfoRepository) : base(BaseDal)
        {
            _mapper = mapper;
            _cacheService = cacheService;
@@ -97,6 +101,7 @@
            _unitOfWorkManage = unitOfWorkManage;
            _locationInfoService = locationInfoService;
            _locationStatusChangeRecordService=locationStatusChangeRecordService;
            _errorInfoRepository = errorInfoRepository;
        }
        static object lock_taskReceive = new object();
        /// <summary>
@@ -116,8 +121,8 @@
                    List<Dt_Task> taskOlds = BaseDal.QueryData(x=> taskDTO.Tasks.Select(x => x.TaskDescribe.ContainerCode).Contains(x.PalletCode));
                    List<Dt_LocationInfo> locationInfos = _locationInfoRepository.GetCanOut(taskDTO.Tasks.Select(x=>x.TaskDescribe.ContainerCode).ToList());
                    List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData();
                    //下发任务组
                    string taskGroup= taskDTO.TaskGroupCode.IsNullOrEmpty() ? Guid.NewGuid().ToString().Replace("-","") : taskDTO.TaskGroupCode;
                    ////下发任务组
                    //string taskGroup= taskDTO.TaskGroupCode.IsNullOrEmpty() ? Guid.NewGuid().ToString().Replace("-","") : taskDTO.TaskGroupCode;
                    foreach (var item in taskDTO.Tasks.OrderBy(x=>x.TaskDescribe.ToStationCode))
                    {
                        if (item.TaskDescribe.ToStationCode.IsNullOrEmpty()) throw new Exception($"任务{item.TaskCode}出库目标操作台不能为空");
@@ -150,7 +155,7 @@
                        task.CurrentAddress = locationInfo.LocationCode;
                        task.NextAddress = stationManger.PickStationCode;
                        task.TargetAddress = stationManger.PickStationCode;
                        task.GroupId = taskGroup;
                        //task.GroupId = taskGroup;
                        task.TaskType = TaskTypeEnum.Outbound.ObjToInt();
                        task.Roadway = locationInfo.RoadwayNo;
                        task.DeviceCode = stationManger.CraneCode;
@@ -315,8 +320,8 @@
                                "Red" => "4",
                                _ => throw new Exception($"未找到颜色定义")
                            },
                            ORDERTYPE=taskSendLight.Mode.ToString(),
                            LIGHTTYPE="1",
                            ORDERTYPE="1",
                            LIGHTTYPE=taskSendLight.Mode.ToString(),
                        }
                    };
                    EPLightContent pLightContent = PickOrderInfoRequest(lightSendDTOs);
@@ -793,5 +798,30 @@
            }
            return content;
        }
        public override WebResponseContent Export(PageDataOptions options)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string savePath = AppDomain.CurrentDomain.BaseDirectory + "ExcelExport";
                // ç¡®ä¿ç›®å½•存在
                if (!Directory.Exists(savePath))
                    Directory.CreateDirectory(savePath);
                // èŽ·å–æ•°æ®
                ISugarQueryable<Dt_Task> query = BaseDal.Db.Queryable<Dt_Task>();
                var dataList = query.ToList();
                var properties = typeof(Dt_Task).GetProperties();
                string filePath = TExportHelper.GetExport(savePath, properties, dataList);
                return WebResponseContent.Instance.OK(data: filePath);
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_TaskInfoService/Task_HtyService.cs
@@ -1,8 +1,14 @@

using AutoMapper;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using SqlSugar;
using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;
using WIDESEAWCS_Common.Helper;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_ITaskInfo_HtyRepository;
using WIDESEAWCS_ITaskInfo_HtyService;
using WIDESEAWCS_Model.Models;
@@ -14,5 +20,29 @@
        public Task_HtyService(ITask_HtyRepository BaseDal) : base(BaseDal)
        {
        }
        public override WebResponseContent Export(PageDataOptions options)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string savePath = AppDomain.CurrentDomain.BaseDirectory + "ExcelExport";
                // ç¡®ä¿ç›®å½•存在
                if (!Directory.Exists(savePath))
                    Directory.CreateDirectory(savePath);
                // èŽ·å–æ•°æ®
                ISugarQueryable<Dt_Task_Hty> query = BaseDal.Db.Queryable<Dt_Task_Hty>();
                var dataList = query.ToList();
                var properties = typeof(Dt_Task_Hty).GetProperties();
                string filePath = TExportHelper.GetExport(savePath, properties, dataList);
                return WebResponseContent.Instance.OK(data: filePath);
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Tasks/AGV/AGVErrorJob.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
using AutoMapper;
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.Service;
namespace WIDESEAWCS_Tasks
{
    [DisallowConcurrentExecution]
    public partial class AGVErrorJob : JobBase, IJob
    {
        public readonly ITaskService _taskService;
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
        private readonly IRouterService _routerService;
        private readonly IStationMangerRepository _stationMangerRepository;
        private readonly ILocationInfoRepository _locationInfoRepository;
        private readonly IMapper _mapper;
        public AGVErrorJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IStationMangerRepository stationMangerRepository, ILocationInfoRepository locationInfoRepository, IMapper mapper)
        {
            _taskService = taskService;
            _taskExecuteDetailService = taskExecuteDetailService;
            _routerService = routerService;
            _stationMangerRepository = stationMangerRepository;
            _locationInfoRepository = locationInfoRepository;
            _mapper = mapper;
        }
        public Task Execute(IJobExecutionContext context)
        {
            try
            {
                _taskService.AgvSearchStatus();
            }
            catch (Exception ex)
            {
                WriteError(nameof(AGVErrorJob),ex.Message);
            }
            return Task.CompletedTask;
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Tasks/AGV/AGVExtend.cs
@@ -6,6 +6,7 @@
using System.Text;
using System.Threading.Tasks;
using WIDESEA_DTO.Agv;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.APIEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
@@ -24,74 +25,84 @@
            {
                var newTasksOut = _taskService.Db.Queryable<Dt_Task>().Where(x => (x.TaskState == TaskStatusEnum.AGV_Execute.ObjToInt()) && x.TaskType==TaskTypeEnum.Outbound.ObjToInt() && x.DeviceCode == "AGV").ToList().OrderBy(x => x.Grade).ThenBy(x => x.TaskNum).ToList();
                var newTasksIn = _taskService.Db.Queryable<Dt_Task>().Where(x => (x.TaskState == TaskStatusEnum.AGV_Execute.ObjToInt()) && x.TaskType == TaskTypeEnum.Inbound.ObjToInt() && x.DeviceCode == "AGV").ToList().OrderBy(x => x.Grade).ThenBy(x => x.TaskNum).ToList();
                var taskDownOut = _taskService.Db.Queryable<Dt_Task>().Where(x => (x.TaskState > TaskStatusEnum.AGV_Execute.ObjToInt()) && x.TaskType == TaskTypeEnum.Outbound.ObjToInt() && x.DeviceCode == "AGV").OrderBy(x => x.TaskNum).ToList();
                #region å‡ºåº“任务下发
                if (newTasksOut.Count>0)
                {
                    List<string> GroupIds = newTasksOut.GroupBy(x => x.GroupId).Select(x => x.Key).ToList();
                    foreach (var GroupId in GroupIds)
                    foreach (var GroupTask in newTasksOut.GroupBy(x=>x.NextAddress))
                    {
                        var tasks = newTasksOut.Where(x => x.GroupId == GroupId).ToList();
                        try
                        var tasks = GroupTask.OrderBy(x => x.TaskNum).ToList();
                        TimeSpan span = DateTime.Now - tasks.FirstOrDefault().CreateDate;
                        int taskDownCount = taskDownOut.Where(x => x.NextAddress == GroupTask.Key).Count();
                        if (taskDownCount < (GroupTask.ObjToInt() > 201 ? 4 : 6) && (int)span.TotalSeconds > 20)
                        {
                            AgvTaskSendDTO agvTaskSend = new AgvTaskSendDTO()
                            try
                            {
                                MissionData = new List<MissionDataItem>()
                            };
                            foreach (var task in tasks)
                            {
                                //获取目标点货位
                                Dt_LocationInfo locationInfoStart = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.CurrentAddress);
                                //获取拣选出库站台
                                Dt_StationManger stationMangerEnd = _stationMangerRepository.QueryFirst(x => x.PickStationCode == task.NextAddress);
                                AgvTaskSendDTO agvTaskSend = new AgvTaskSendDTO()
                                {
                                    MissionData = new List<MissionDataItem>()
                                };
                                string taskGroupId = Guid.NewGuid().ToString().Replace("-", "");
                                foreach (var task in tasks)
                                {
                                    //获取目标点货位
                                    Dt_LocationInfo locationInfoStart = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.CurrentAddress);
                                    //获取拣选出库站台
                                    Dt_StationManger stationMangerEnd = _stationMangerRepository.QueryFirst(x => x.PickStationCode == task.NextAddress);
                                if (locationInfoStart == null || stationMangerEnd == null) throw new Exception($"未找到任务号${task.TaskNum}起始点{task.CurrentAddress}或目标点{task.NextAddress}位置信息");
                                agvTaskSend.RequestId = GroupId;
                                agvTaskSend.MissionCode = GroupId;
                                agvTaskSend.ViewBoardType = "W01";
                                if (task.Grade == 0)
                                    if (locationInfoStart == null || stationMangerEnd == null) throw new Exception($"未找到任务号${task.TaskNum}起始点{task.CurrentAddress}或目标点{task.NextAddress}位置信息");
                                    agvTaskSend.RequestId = taskGroupId;
                                    agvTaskSend.MissionCode = taskGroupId;
                                    agvTaskSend.ViewBoardType = "W01";
                                    //料箱子搬运任务
                                    MissionDataItem missionDataItem = new MissionDataItem()
                                    {
                                        Sequence = task.TaskNum,
                                        BinCode = task.PalletCode,
                                        StartPosition = locationInfoStart.AgvPoint,
                                        StartSlotCode = locationInfoStart.LocationCode,
                                        EndPosition = stationMangerEnd.StationCode,
                                        EndSlotCode = stationMangerEnd.CraneStationCode,
                                        TakeActionConfirm = false,
                                        TakeActionInform = false,
                                        PutActionConfirm = true,
                                        PutActionInform = true,
                                    };
                                    agvTaskSend.MissionData.Add(missionDataItem);
                                }
                                if (tasks.OrderByDescending(x => x.Grade).FirstOrDefault()?.Grade == 0)
                                {
                                    agvTaskSend.Priority = 99;
                                }
                                else
                                {
                                    agvTaskSend.Priority = 99 - task.Grade;
                                    agvTaskSend.Priority = 99 - tasks.OrderByDescending(x => x.Grade).FirstOrDefault().Grade;
                                }
                                //料箱子搬运任务
                                MissionDataItem missionDataItem = new MissionDataItem()
                                tasks.ForEach(x =>
                                {
                                    Sequence = task.TaskNum,
                                    BinCode = task.PalletCode,
                                    StartPosition = locationInfoStart.AgvPoint,
                                    StartSlotCode = locationInfoStart.LocationCode,
                                    EndPosition = stationMangerEnd.StationCode,
                                    EndSlotCode = stationMangerEnd.CraneStationCode,
                                    TakeActionConfirm = false,
                                    TakeActionInform = false,
                                    PutActionConfirm = true,
                                    PutActionInform = true,
                                };
                                agvTaskSend.MissionData.Add(missionDataItem);
                                    x.GroupId = taskGroupId;
                                });
                                //发送AGV任务
                                WebResponseContent content = _taskService.AgvSendTask(agvTaskSend, APIEnum.AgvSendTask);
                                if (!content.Status)
                                    throw new Exception(content.Message);
                                tasks.ForEach(x =>
                                {
                                    x.Dispatchertime = DateTime.Now;
                                    x.TaskState = TaskStatusEnum.AGV_Executing.ObjToInt();
                                });
                                _taskService.UpdateData(tasks);
                                Thread.Sleep(500);
                            }
                            //发送AGV任务
                            WebResponseContent content = _taskService.AgvSendTask(agvTaskSend, APIEnum.AgvSendTask);
                            if (!content.Status)
                                throw new Exception(content.Message);
                            tasks.ForEach(x =>
                            catch (Exception ex)
                            {
                                x.Dispatchertime = DateTime.Now;
                                x.TaskState = TaskStatusEnum.AGV_Executing.ObjToInt();
                            });
                            _taskService.UpdateData(tasks);
                            Thread.Sleep(500);
                        }
                        catch (Exception ex)
                        {
                            tasks.ForEach(x =>
                            {
                                x.TaskState = TaskStatusEnum.Exception.ObjToInt();
                                x.ExceptionMessage = ex.Message;
                            });
                            _taskService.UpdateData(tasks);
                                tasks.ForEach(x =>
                                {
                                    x.TaskState = TaskStatusEnum.Exception.ObjToInt();
                                    x.ExceptionMessage = ex.Message;
                                });
                                _taskService.UpdateData(tasks);
                            }
                        }
                    }
                }
ÏîÄ¿×ÊÁÏ/½Ó¿Ú»ã×ÜÎļþ/WMS-KUKAÉ豸״̬½Ó¿Ú.xlsx
Binary files differ