huangxiaoqiang
5 天以前 0e674f770d785bfd24b5034456c2502dcc6671d2
代码提交
已修改15个文件
598 ■■■■ 文件已修改
项目代码/WCS/WIDESEAWCS_Client/src/api/http.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Client/src/components/DeviceStacker.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Client/src/uitils/signalr.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Client/src/views/system/Sys_Log.vue 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/Dt_StationManagerService.cs 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/Enum/AgvStationEnum.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IDt_StationManagerService.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/System/Sys_Log.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/Enum/StackerCraneStatus.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs 211 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs 186 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneDBName.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskCommand.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Client/src/api/http.js
@@ -20,7 +20,7 @@
}
else if (process.env.NODE_ENV == 'production') {
    axios.defaults.baseURL = 'http://192.168.20.253:9291/';
    axios.defaults.baseURL = 'http://192.168.76.251:9291/';
}
if (!axios.defaults.baseURL.endsWith('/')) {
    axios.defaults.baseURL+="/";
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Client/src/components/DeviceStacker.vue
@@ -26,13 +26,13 @@
                å·¥ä½œçŠ¶æ€ï¼š{{ Stacker.data.stackerCraneWorkStatusDes }}
              </li>
              <li class="list-group-item list-group-item-secondary">
                èµ·ç‚¹ï¼š{{ Stacker.data.SourceAddress || '暂无任务' }}
                èµ·ç‚¹ï¼š{{ Stacker.data.sourceAddress || '暂无任务' }}
              </li>
              <li class="list-group-item list-group-item-secondary">
                ç»ˆç‚¹ï¼š{{ Stacker.data.TargetAddress || '暂无任务' }}
                ç»ˆç‚¹ï¼š{{ Stacker.data.targetAddress || '暂无任务' }}
              </li>
              <li class="list-group-item list-group-item-secondary">
                å‘½ä»¤æ–¹å¼ï¼š{{ Stacker.data.Command==1? '取放物料作业': '移动到指定位置' }}
                å‘½ä»¤æ–¹å¼ï¼š{{ Stacker.data.command==1? '取放物料作业': '移动到指定位置' }}
              </li>
              <li class="list-group-item list-group-item-secondary">
                AGV电量:{{ Stacker.data.electricity+'%' }}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Client/src/uitils/signalr.js
@@ -89,7 +89,6 @@
    });
    
    connection.on("StackerData", (data) => {
      console.log(data)
      eventBus.emit("stackerData", data);
    });
    connection.on("LineData", (data) => {
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Client/src/views/system/Sys_Log.vue
@@ -32,23 +32,23 @@
            const editFormFields = ref({});
            const editFormOptions = ref([]);
            const searchFormFields = ref({"BeginDate":"","Url":"","LogType":[],"Success":[],"UserIP":"","ServiceIP":"","Role_Id":""});
            const searchFormOptions = ref([[{"title":"请求地址","field":"Url","type":"text"},{"title":"用户IP","field":"UserIP","type":"text"},{"title":"服务器IP","field":"ServiceIP","type":"text"}],[{"title":"开始时间","field":"BeginDate","type":"datetime"},{"dataKey":"restatus","data":[],"title":"响应状态","field":"Success","type":"selectList"},{"dataKey":"roles","data":[],"title":"角色ID","field":"Role_Id","type":"select"}],[{"dataKey":"log","data":[],"title":"日志类型","field":"LogType","colSize":12,"type":"checkbox"}]]);
            const columns = ref([{field:'Id',title:'Id',type:'int',width:90,hidden:true,readonly:true,require:true,align:'left'},
                       {field:'BeginDate',title:'开始时间',type:'datetime',width:140,align:'left',sortable:true},
                       {field:'UserName',title:'用户名称',type:'string',width:90,align:'left'},
                       {field:'Url',title:'请求地址',type:'string',width:110,align:'left'},
                       {field:'LogType',title:'日志类型',type:'string',bind:{ key:'log',data:[]},width:80,align:'left'},
                       {field:'Success',title:'响应状态',type:'int',bind:{ key:'restatus',data:[]},width:80,align:'left'},
                       {field:'ElapsedTime',title:'时长',type:'int',width:60,align:'left'},
                       {field:'RequestParameter',title:'请求参数',type:'string',width:70,align:'left'},
                       {field:'ResponseParameter',title:'响应参数',type:'string',width:70,align:'left'},
                       {field:'ExceptionInfo',title:'异常信息',type:'string',width:70,align:'left'},
                       {field:'UserIP',title:'用户IP',type:'string',width:90,align:'left'},
                       {field:'ServiceIP',title:'服务器IP',type:'string',width:90,hidden:true,align:'left'},
                       {field:'BrowserType',title:'浏览器类型',type:'string',width:90,align:'left'},
                       {field:'User_Id',title:'用户ID',type:'int',width:90,hidden:true,align:'left'},
                       {field:'Role_Id',title:'角色ID',type:'int',bind:{ key:'roles',data:[]},width:90,hidden:true,align:'left'},
                       {field:'EndDate',title:'结束时间',type:'datetime',width:150,hidden:true,align:'left',sortable:true}]);
            const searchFormOptions = ref([[{"title":"请求地址","field":"Url","type":"text"},{"title":"用户名称","field":"userName","type":"text"},{"title":"服务器IP","field":"ServiceIP","type":"text"}],[{"title":"开始时间","field":"BeginDate","type":"datetime"},{"dataKey":"restatus","data":[],"title":"响应状态","field":"Success","type":"selectList"},{"dataKey":"roles","data":[],"title":"角色ID","field":"Role_Id","type":"select"}]]);
            const columns = ref([{field:'id',title:'Id',type:'int',width:90,hidden:true,readonly:true,require:true,align:'left'},
                       {field:'beginDate',title:'开始时间',type:'datetime',width:140,align:'left',sortable:true},
                       {field:'userName',title:'用户名称',type:'string',width:90,align:'left'},
                       {field:'url',title:'请求地址',type:'string',width:110,align:'left'},
                       {field:'logType',title:'日志类型',type:'string',bind:{ key:'log',data:[]},width:80,align:'left',hidden:true},
                       {field:'success',title:'响应状态',type:'int',bind:{ key:'restatus',data:[]},width:80,align:'left'},
                       {field:'elapsedTime',title:'时长',type:'int',width:60,align:'left'},
                       {field:'requestParam',title:'请求参数',type:'string',width:70,align:'left'},
                       {field:'responseParam',title:'响应参数',type:'string',width:70,align:'left'},
                       {field:'exceptionInfo',title:'异常信息',type:'string',width:70,align:'left',hidden:true},
                       {field:'userIP',title:'用户IP',type:'string',width:90,align:'left'},
                       {field:'serviceIP',title:'服务器IP',type:'string',width:90,hidden:true,align:'left'},
                       {field:'browserType',title:'浏览器类型',type:'string',width:90,align:'left',hidden:true},
                       {field:'user_Id',title:'用户ID',type:'int',width:90,hidden:true,align:'left'},
                       {field:'role_Id',title:'角色ID',type:'int',bind:{ key:'roles',data:[]},width:90,hidden:true,align:'left'},
                       {field:'endDate',title:'结束时间',type:'datetime',width:150,hidden:true,align:'left',sortable:true}]);
            const detail = ref({
                cnName: "#detailCnName",
                columns: [],
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/Dt_StationManagerService.cs
@@ -52,49 +52,40 @@
        {
            
        }
        public class Station_materialList
        {
            /// <summary>
            /// ä¸‹æ–™ä½-》》上料或存放
            /// </summary>
            public static List<int> BoardLoadList = new List<int>() { (int)AgvStationEnum.BoardLoad, (int)AgvStationEnum.PadUse };
            /// <summary>
            /// ä¸Šæ–™ï¼Œä¸‹æ–™ï¼Œåž«æ¿ä½¿ç”¨ï¼Œåž«æ¿å›žæ”¶
            /// </summary>
            public static List<int> UsebitsList = new List<int>() { (int)AgvStationEnum.BoardUnload,(int)AgvStationEnum.PadRecycle};
            public static List<string> StationareaList = new List<string>() {"1003","1004" , "1005","1006","1007" };
        }
        public List<Dt_StationManager> QuerypLatform(string deviceNo,List<string> task)
        {
            return BaseDal.QueryData(x=>x.DeviceCode == deviceNo && x.stationEnable==1 && Station_materialList.UsebitsList.Contains(x.stationMaterial) && !task.Contains(x.stationName)).ToList();
        }
        public List<Dt_StationManager> QuerypLatformarer(string deviceNo)
        {
            return BaseDal.QueryData((x => x.DeviceCode == deviceNo && x.stationEnable == 1 && Station_materialList.BoardLoadList.Contains(x.stationMaterial)), x=>x.stationMaterial).ToList();
        }
        public List<Dt_StationManager> QuerypLatformmaterial(int Station_Area)
        {
            return BaseDal.QueryData(x => x.stationArea == Station_Area && x.stationEnable == 1 && (x.stationMaterial == (int)AgvStationEnum.BoardStore || x.stationMaterial == (int)AgvStationEnum.PadStore) ).ToList();
        }
        public List<Dt_StationManager> QuerypStation_Area(int Station_Area)
        {
            return BaseDal.QueryData(x => x.stationArea == Station_Area && x.stationEnable == 1 && x.stationMaterial == (int)AgvStationEnum.PadStore).ToList();
        }
        public List<Dt_StationManager> QuerypStation_Area2(string Station_remark)
        {
            return BaseDal.QueryData(x => Station_remark.Contains(x.stationRemark) && x.stationEnable == 1 && x.stationMaterial == (int)AgvStationEnum.PadStore).ToList();
        }
        public List<Dt_StationManager> GetAllStationByDeviceCode(string DeviceCode)
        {
            return BaseDal.QueryData(x => x.DeviceCode == DeviceCode && x.stationEnable == 1).ToList();
        }
        public List<Dt_StationManager> QueryPlatform(Dt_StationManager station, List<string> tasks)
        {
            if (station.stationArea == 3 && station.stationMaterial == 7)
            {
                return BaseDal.QueryData(x => x.stationArea == station.stationArea && x.stationEnable == 1 && x.stationMaterial == (int)AgvStationEnum.BoardLoad && !tasks.Contains(x.stationName) && !station.stationName.Contains(x.stationName)).OrderBy(y => y.stationMaterial).ToList();
            }
            switch (station.stationMaterial)
            {
                case (int)AgvStationEnum.BoardUnload:
                    if (station.stationArea == 3)
                    {
                        return BaseDal.QueryData(x => x.stationArea == station.stationArea && x.stationEnable == 1 && (x.stationMaterial == (int)AgvStationEnum.BlankingBuffer|| x.stationMaterial == (int)AgvStationEnum.BoardLoad) && !tasks.Contains(x.stationName) && !station.stationName.Contains(x.stationName)).OrderBy(y=>y.stationMaterial).ToList();
                    }
                    else
                    {
                        return BaseDal.QueryData(x => x.stationArea == station.stationArea && x.stationEnable == 1 && x.stationMaterial == (int)AgvStationEnum.BlankingBuffer && !tasks.Contains(x.stationName) && !station.stationName.Contains(x.stationName)).ToList();
                    }
                case (int)AgvStationEnum.BoardStore:
                    return BaseDal.QueryData(x => x.stationArea == station.stationArea && x.stationEnable == 1 && x.stationMaterial == (int)AgvStationEnum.BoardLoad && !tasks.Contains(x.stationName) && !station.stationName.Contains(x.stationName)).ToList();
                case (int)AgvStationEnum.PadRecycle:
                    return BaseDal.QueryData(x => x.stationArea == station.stationArea && x.stationEnable == 1 && (x.stationMaterial == (int)AgvStationEnum.PadStore || x.stationMaterial == (int)AgvStationEnum.PadUse) && !tasks.Contains(x.stationName) && !station.stationName.Contains(x.stationName)).OrderBy(y=>y.stationMaterial).ToList();
                case (int)AgvStationEnum.PadStore:
                    return BaseDal.QueryData(x => x.stationArea == station.stationArea && x.stationEnable == 1 && x.stationMaterial == (int)AgvStationEnum.PadUse && !tasks.Contains(x.stationName) && !station.stationName.Contains(x.stationName)).ToList();
                default:
                    return null;
            }
        }
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/Enum/AgvStationEnum.cs
@@ -20,9 +20,9 @@
        [Description("下料位")]
        BoardUnload = 2,
        /// <summary>
        /// ç¼“存位
        /// ä¸Šæ–™ç¼“存位
        /// </summary>
        [Description("缓存位")]
        [Description("上料缓存位")]
        BoardStore = 3,
        /// <summary>
        /// åž«æ¿ä½¿ç”¨ä½
@@ -39,6 +39,12 @@
        /// </summary>
        [Description("垫板缓存位")]
        PadStore = 6,
        /// <summary>
        /// ä¸‹æ–™ç¼“存位
        /// </summary>
        [Description("下料缓存位")]
        BlankingBuffer = 7,
    }
    public enum AgvareaEnum
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IDt_StationManagerService.cs
@@ -33,21 +33,13 @@
{
    public interface IDt_StationManagerService : IService<Dt_StationManager>
    {
        public List<Dt_StationManager> QuerypLatform(string deviceNo, List<string> _Task);
        public List<Dt_StationManager> QuerypLatformarer(string deviceNo);
        public List<Dt_StationManager> QuerypLatformmaterial(int Station_Area);
        public List<Dt_StationManager> QuerypStation_Area(int Station_Area);
        public List<Dt_StationManager> QuerypStation_Area2(string Station_remark);
        /// <summary>
        /// æ ¹æ®PLC设备获取当前设备下的所有启用的站台
        /// </summary>
        /// <param name="DeviceCode"></param>
        /// <returns></returns>
        List<Dt_StationManager> GetAllStationByDeviceCode(string DeviceCode);
        List<Dt_StationManager> QueryPlatform(Dt_StationManager station, List<string> tasks);
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -69,7 +69,9 @@
        /// <param name="deviceNo"></param>
        /// <param name="currentAddress"></param>
        /// <returns></returns>
        List<string> QueryConveyorLineTaskSourceAddress();
        List<string> QueryConveyorLineTask();
        Dt_Task QueryConveyorLineTask(string stationName);
        /// <summary>
        /// æŸ¥æ‰¾è¯¥åœ°å€æ˜¯å¦æœ‰èµ·ç‚¹è´§ç»ˆç‚¹ä»»åŠ¡
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/System/Sys_Log.cs
@@ -44,13 +44,13 @@
        /// <summary>
        /// è¯·æ±‚参数
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 2000, ColumnDescription = "请求参数")]
        [SugarColumn(IsNullable = true, Length = int.MaxValue, ColumnDescription = "请求参数")]
        public string RequestParam { get; set; }
        /// <summary>
        /// å“åº”参数
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 2000, ColumnDescription = "响应参数")]
        [SugarColumn(IsNullable = true, Length = int.MaxValue, ColumnDescription = "响应参数")]
        public string ResponseParam { get; set; }
        /// <summary>
@@ -62,19 +62,19 @@
        /// <summary>
        /// è¯·æ±‚地址
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 2000, ColumnDescription = "请求地址")]
        [SugarColumn(IsNullable = true, Length = 8000, ColumnDescription = "请求地址")]
        public string Url { get; set; }
        /// <summary>
        /// ç”¨æˆ·IP
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 20, ColumnDescription = "用户IP")]
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "用户IP")]
        public string UserIP { get; set; }
        /// <summary>
        /// ç”¨æˆ·åç§°
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "用户名称")]
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "用户名称")]
        public string UserName { get; set; }
        /// <summary>
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/Enum/StackerCraneStatus.cs
@@ -73,6 +73,12 @@
        /// </summary>
        [Description("联机")]
        Automatic = 4,
        /// <summary>
        /// æ•…éšœ
        /// </summary>
        [Description("故障")]
        Fault = 5,
    }
    public enum StackerCraneWorkStatus
@@ -92,7 +98,12 @@
        /// æœªçŸ¥
        /// </summary>
        [Description("未知")]
        Unkonw
        Unkonw,
        /// <summary>
        /// æ•…éšœ
        /// </summary>
        [Description("故障")]
        Fault = 5,
    }
    public enum StackerCraneTaskCompleted
    {
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -102,7 +102,7 @@
                {
                    tasks.Add(item);
                }
                  BaseDal.AddData(tasks);
                BaseDal.AddData(tasks);
                _taskExecuteDetailService.AddTaskExecuteDetail(tasks.Select(x => x.TaskNum).ToList(), "接收WMS任务");
                content = WebResponseContent.Instance.OK("成功");
            }
@@ -123,9 +123,24 @@
        /// <param name="deviceNo">设备编号</param>
        /// <param name="currentAddress">当前地址</param>
        /// <returns></returns>
        public List<string> QueryConveyorLineTaskSourceAddress()
        public List<string> QueryConveyorLineTask()
        {
            return BaseDal.QueryData().Select(task => task.SourceAddress).ToList();
            var query = BaseDal.QueryData();
            return query.SelectMany(x =>
                new[] { x.SourceAddress, x.TargetAddress }
                .Where(address => !string.IsNullOrEmpty(address)))
                .ToList();
        }
        /// <summary>
        /// æŸ¥æ‰¾è¯¥ç«™å°æ˜¯å¦æœ‰ä»»åŠ¡
        /// </summary>
        /// <param name="deviceNo">设备编号</param>
        /// <param name="currentAddress">当前地址</param>
        /// <returns></returns>
        public Dt_Task QueryConveyorLineTask(string stationName)
        {
            return BaseDal.QueryFirst(x => x.SourceAddress == stationName||x.TargetAddress==stationName);
        }
        /// <summary>
@@ -205,11 +220,11 @@
        /// <returns></returns>
        public Dt_Task? QuertStackerCraneTask(string deviceNo, TaskTypeGroup? taskTypeGroup = null)
        {
            if(taskTypeGroup == null)
            if (taskTypeGroup == null)
                return BaseDal.QueryFirst(x => x.Roadway == deviceNo && (TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish || TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew), TaskOrderBy);
            if(taskTypeGroup.Value == TaskTypeGroup.InboundGroup)
            if (taskTypeGroup.Value == TaskTypeGroup.InboundGroup)
                return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish, TaskOrderBy);
            if(taskTypeGroup.Value == TaskTypeGroup.OutbondGroup)
            if (taskTypeGroup.Value == TaskTypeGroup.OutbondGroup)
                return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew, TaskOrderBy);
            return null;
        }
@@ -222,7 +237,7 @@
        /// <returns>返回任务实体对象,可能为null</returns>
        public Dt_Task QueryStackerCraneTask(string deviceNo, string currentAddress = "")
        {
            return BaseDal.QueryFirst(x => x.TaskState == (int)TaskOutStatusEnum.OutNew && x.AGVName==deviceNo,TaskOrderBy);
            return BaseDal.QueryFirst(x => x.TaskState == (int)AGVTaskStatusEnum.AGVNew && x.AGVName == deviceNo, TaskOrderBy);
        }
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs
@@ -15,9 +15,12 @@
 *----------------------------------------------------------------*/
#endregion << ç‰ˆ æœ¬ æ³¨ é‡Š >>
using AngleSharp.Dom;
using Autofac.Core;
using AutoMapper;
using HslCommunication;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using Quartz;
using System.Reflection;
@@ -113,8 +116,7 @@
                    #endregion è°ƒç”¨äº‹ä»¶æ€»çº¿é€šçŸ¥å‰ç«¯
                    // å°†äº¤äº’信号转换为布尔数组
                    var writeInteractiveSignal = command.InteractiveSignal;
                    var structs = BitConverter.GetBytes(writeInteractiveSignal).Reverse().ToArray().ToBoolArray();
                    var structs = BitConverter.GetBytes(command.InteractiveSignal).Reverse().ToArray().ToBoolArray();
                    // èŽ·å–è®¾å¤‡åè®®è¯¦æƒ…
                    List<DeviceProtocolDetailDTO>? deviceProtocolDetails = conveyorLine.DeviceProtocolDetailDTOs.Where(x => x.DeviceProParamName == nameof(ConveyorLineTaskCommand.InteractiveSignal)).ToList();
@@ -130,7 +132,7 @@
                                MethodInfo? method = GetType().GetMethod(item.ProtocolDetailType);
                                if (method != null)
                                {
                                    method.Invoke(this, new object[] { conveyorLine, station.stationName });
                                    method.Invoke(this, new object[] { conveyorLine, station });
                                }
                            }
                        }
@@ -149,107 +151,81 @@
        /// <param name="conveyorLine">输送线实例对象</param>
        /// <param name="command">读取的请求信息</param>Request outbound
        /// <param name="childDeviceCode">子设备编号</param>
        public async Task RequestInbound(CommonConveyorLine conveyorLine, string childDeviceCode)
        public async Task RequestInbound(CommonConveyorLine conveyorLine, Dt_StationManager station)
        {
            try
            {
                // è¾“出信息,表示站台请求取货
                var log = $"【{conveyorLine._deviceName}】站台【{childDeviceCode}】请求取货";
                ConsoleHelper.WriteWarningLine(log);
                // æŽ¨é€é€šçŸ¥åˆ°å‰ç«¯SignIR
                await _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "Red" });
                WriteInfo(conveyorLine.DeviceName, log);
                var log = $"【{conveyorLine._deviceName}】站台【{station.stationName}】请求取货";
                await LogAndWarn(conveyorLine.DeviceName, log);
                // èŽ·å–æ‰€æœ‰ä»»åŠ¡æºåœ°å€
                List<string> task = _taskService.QueryConveyorLineTaskSourceAddress();
                List<string> taskSourceAddress = _taskService.QueryConveyorLineTask();
                if (_taskService.QueryConveyorLineTask(station.stationName) != null)
                {
                    ConveyorLineSendFinish(conveyorLine, station.stationName);
                    await LogAndWarn(conveyorLine.DeviceName, $"【{conveyorLine._deviceName}】站台【{station.stationName}】存在任务");
                    return;
                }
                // æ ¹æ®è®¾å¤‡ç¼–号和任务源地址查询所有未执行的任务
                List<Dt_StationManager> childDeviceCodes = _stationManagerService.QuerypLatform(conveyorLine.DeviceCode, task);  //对应每个ip找全部的下料站点与垫板回收点站台点
                List<Dt_StationManager> childDeviceCodes = _stationManagerService.QueryPlatform(station, taskSourceAddress);  //对应每个ip找全部的下料站点与垫板回收点站台点
                if(childDeviceCodes.Count()==0|| childDeviceCodes == null)
                {
                    ConveyorLineSendFinish(conveyorLine, station.stationName);
                    await LogAndWarn(conveyorLine.DeviceName, $"【{conveyorLine._deviceName}】站台【{station.stationName}】未找到可前往站台");
                    return;
                }
                foreach (var item in childDeviceCodes)
                {
                    ConveyorLineTaskCommand command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand>(item.stationName);
                    if (command != null)
                    IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == item.DeviceCode);
                    if (device != null)
                    {
                        var structs = BitConverter.GetBytes(command.InteractiveSignal).Reverse().ToArray().ToBoolArray();
                        if (structs[1])
                        CommonConveyorLine commonConveyorLine = (CommonConveyorLine)device;
                        ConveyorLineTaskCommand command = commonConveyorLine.ReadCustomer<ConveyorLineTaskCommand>(item.stationName);
                        if (command != null)
                        {
                            if (item.stationMaterial == (int)AgvStationEnum.PadRecycle)
                            {
                                RequestHcdbst(conveyorLine, item.stationArea, item.stationName, item.stationRemark);
                                return;
                            }
                            else
                            var structs = BitConverter.GetBytes(command.InteractiveSignal).Reverse().ToArray().ToBoolArray();
                            if (structs[2])
                            {
                                Dt_Task taskDTO = new Dt_Task()
                                {
                                    TaskNum = _taskRepository.GetTaskNo().Result,
                                    Grade = 1,
                                    Roadway = item.stationArea.ToString(),
                                    SourceAddress = childDeviceCode,
                                    SourceAddress = station.stationName,
                                    CurrentAddress= station.stationName,
                                    TargetAddress = item.stationName,
                                    NextAddress = item.stationName,
                                    TaskState = (int)AGVTaskStatusEnum.AGVNew,
                                    TaskType = item.stationMaterial,
                                    TaskType = (int)AGVTaskTypeEnum.AGVCarry,
                                    AGVName = item.stationArea switch
                                    {
                                        1 => "AGV01",
                                        4 => "AGV03",
                                        _ => "AGV02",
                                    }
                                };
                                _taskService.ReceiveWMSTask(new List<Dt_Task> { taskDTO });
                                ConveyorLineSendFinish(conveyorLine,station.stationName);
                                return;
                            }
                        }
                        else
                        {
                            WriteInfo(conveyorLine.DeviceName, $"站台{item.stationName}状态不可用{structs[2]}");
                        }
                    }
                    else
                    {
                        WriteInfo(conveyorLine.DeviceName, $"通讯连接错误,{item.stationName}未找到读取模块地址");
                    }
                }
            }
            catch (Exception ex)
            {
                WriteInfo(conveyorLine.DeviceName, ex.Message);
            }
        }
        /// <summary>
        /// æ ¹æ®agv下料任务,把料放至上料口或缓存位
        /// </summary>
        /// <param name="conveyorLine">输送线实例对象</param>
        /// <param name="childDeviceCode">子设备编号</param>
        public void RequestOutbound(CommonConveyorLine conveyorLine, string childDeviceCode)
        {
            try
            {
                List<Dt_StationManager> station = _stationManagerService.QuerypLatformarer(conveyorLine.DeviceCode);
                foreach (var item in station)
                {
                    ConveyorLineTaskCommand command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand>(item.stationName);
                    if (command != null)
                    {
                        var structs = BitConverter.GetBytes(command.InteractiveSignal).Reverse().ToArray().ToBoolArray();
                        if (structs[2])
                        {
                            if (item.stationMaterial == (int)AgvStationEnum.BoardLoad)
                            else
                            {
                                //Dt_Task agvstack= _taskService.QueryConveyorLineTaskRoadway(AGVStationitem.stationArea);
                                //if(agvstack != null)
                                //{
                                //    _taskService.UpdateTargetAddress(agvstack.TaskId, AGVStationitem.stationName);
                                //}
                                //else
                                //{
                                //    //去找缓存区库存
                                //    RequestHcst(conveyorLine, AGVStationitem.stationArea, AGVStationitem.stationName, AGVStationitem.stationRemark);
                                //}
                                await LogAndWarn(conveyorLine.DeviceName, $"站台{item.stationName}状态不可用{structs[2]}");
                            }
                        }
                        else
                        {
                            WriteInfo(conveyorLine.DeviceName, $"站台{item.stationName}状态不可用{structs[2]}");
                            WriteInfo(conveyorLine.DeviceName, $"通讯连接错误,{item.stationName}未找到读取模块地址");
                        }
                    }
                    else
                    {
                        var logerror = $"【{conveyorLine.DeviceName}】站台:【{item.stationName}】未配置设备表头";
                        await LogAndWarn(conveyorLine.DeviceName, logerror);
                    }
                }
            }
@@ -258,88 +234,6 @@
                WriteInfo(conveyorLine.DeviceName, ex.Message);
            }
        }
        public void RequestHcst(CommonConveyorLine conveyorLine,int Station_Area,string Station_names,string Station_remark)
        {
            List<Dt_StationManager> AGVStationListdata = _stationManagerService.QuerypLatformmaterial(Station_Area);   //查出缓存位
            if (Station_remark != null)   //找寻对应的放货站台
            {
                AGVStationListdata = _stationManagerService.QuerypStation_Area2(Station_remark);
            }
            foreach (var item in AGVStationListdata)
            {
                ConveyorLineTaskCommand command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand>(item.stationName);
                if (command != null)
                {
                    var structs = BitConverter.GetBytes(command.InteractiveSignal).Reverse().ToArray().ToBoolArray();
                    if (structs[1])
                    {
                        if (_taskService.QueryConveyorLinetaeersuadd(item.stationName))
                        {
                            Dt_Task taskDTO = new Dt_Task()
                            {
                                TaskNum = _taskRepository.GetTaskNo().Result,
                                Grade = 1,
                                Roadway = item.stationArea.ToString(),
                                SourceAddress = item.stationName,
                                CurrentAddress = item.stationName,
                                TaskState = (int)TaskInStatusEnum.InNew,
                                TaskType = (int)item.stationMaterial,
                                TargetAddress = Station_names,
                                NextAddress = Station_names,
                            };
                            _taskService.ReceiveWMSTask(new List<Dt_Task> { taskDTO });
                        }
                    }
                    else
                    {
                        WriteInfo(conveyorLine.DeviceName,  $"通讯连接错误,{item.stationName}未找到读取模块地址");
                    }
                }
            }
        }
        public void RequestHcdbst(CommonConveyorLine conveyorLine, int Station_Area, string Station_names,string Station_remark)
        {
            List<Dt_StationManager> AGVStationListdata = _stationManagerService.QuerypStation_Area(Station_Area);   //查出缓存位
            if(Station_remark !=null)   //找寻对应的放货站台
            {
                AGVStationListdata= _stationManagerService.QuerypStation_Area2(Station_remark);
            }
            foreach (var item in AGVStationListdata)
            {
                ConveyorLineTaskCommand command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand>(item.stationName);
                if (command != null)
                {
                    var structs = BitConverter.GetBytes(command.InteractiveSignal).Reverse().ToArray().ToBoolArray();
                    if (structs[1])
                    {
                        if (_taskService.QueryConveyorLinetaeersuadd(item.stationName))
                        {
                            Dt_Task taskDTO = new Dt_Task()
                            {
                                TaskNum = _taskRepository.GetTaskNo().Result,
                                Grade = 1,
                                Roadway = item.stationArea.ToString(),
                                SourceAddress = Station_names,
                                CurrentAddress = Station_names,
                                TaskState = (int)TaskInStatusEnum.InNew,
                                TaskType = (int)item.stationMaterial,
                                TargetAddress = item.stationName,
                                NextAddress = item.stationName,
                            };
                            _taskService.ReceiveWMSTask(new List<Dt_Task> { taskDTO });
                        }
                    }
                    else
                    {
                        WriteInfo(conveyorLine.DeviceName, $"读取放货信号为:{structs[2]}");
                    }
                }
            }
        }
        /// <summary>
        /// è¾“送线交互完成
        /// </summary>
@@ -353,5 +247,12 @@
            conveyorLine.Communicator.Write(devicePro.DeviceProAddress, true);
        }
        public async Task LogAndWarn(string deviceName, string log, string color = "red")
        {
            ConsoleHelper.WriteWarningLine(log);
            await _noticeService.Logs(userTokenIds, new { deviceName, log = log, time = DateTime.Now.ToString("G"), color = color });
            WriteInfo(deviceName, log);
        }
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
@@ -10,6 +10,7 @@
using WIDESEAWCS_Core.Caches;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Core.HttpContextUser;
using WIDESEAWCS_DTO.Enum;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ISystemRepository;
using WIDESEAWCS_ITaskInfoRepository;
@@ -24,6 +25,7 @@
using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
using WIDESEAWCS_SignalR;
using WIDESEAWCS_Tasks.StackerCraneJob;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
using ICacheService = WIDESEAWCS_Core.Caches.ICacheService;
namespace WIDESEAWCS_Tasks
@@ -53,7 +55,6 @@
            try
            {
                CommonStackerCrane commonStackerCrane = (CommonStackerCrane)context.JobDetail.JobDataMap.Get("JobParams");
                if (commonStackerCrane != null)
                {
                    if (!commonStackerCrane.IsEventSubscribed)
@@ -67,7 +68,10 @@
                        if (commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Idle)
                        {
                            GetTask(commonStackerCrane);
                            if (commonStackerCrane.GetValue<StackerCraneDBName, float>(StackerCraneDBName.Electricity) > 20)
                            {
                                GetTask(commonStackerCrane);
                            }
                        }
                    }
@@ -87,8 +91,8 @@
                            commonStackerCrane.DeviceName,
                            commonStackerCrane.CurrentTaskNum,
                            commonStackerCrane.LastTaskNum,
                            SourceAddress = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.SourceAddress),
                            TargetAddress = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.TargetAddress),
                            SourceAddress = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.StartAddress),
                            TargetAddress = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.EndAddress),
                            Command = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.Command),
                            Electricity = commonStackerCrane.GetValue<StackerCraneDBName, float>(StackerCraneDBName.Electricity),
                        };
@@ -116,8 +120,6 @@
           CommonStackerCrane? commonStackerCrane = sender as CommonStackerCrane;
            if (commonStackerCrane != null)
            {
                Console.Out.WriteLine("TaskCompleted" + e.TaskNum);
                _taskService.StackCraneTaskCompleted(e.TaskNum);
                commonStackerCrane.SetValue(StackerCraneDBName.TaskCompleted, 1);
@@ -135,39 +137,53 @@
            task = _taskService.QueryStackerCraneTask(commonStackerCrane.DeviceCode);
            if (task != null)
            {
                StackerCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task);
                if (stackerCraneTaskCommand != null)
                if (task.Roadway == "3")
                {
                    bool sendFlag = commonStackerCrane.SendCommand(stackerCraneTaskCommand);
                    Thread.Sleep(1000);
                    if (ReadReceived(commonStackerCrane) == 1)
                    if (AGVToSandyEdgeRead(commonStackerCrane))
                    {
                        WriteConfirm(commonStackerCrane);
                        _taskService.UpdateTaskStatusToNext(task.TaskNum);
                        WriteAGVTask(task, commonStackerCrane);
                    }
                    else
                    {
                        AGVToSandyEdge(commonStackerCrane);
                    }
                }
                else if (task.Roadway == "2")
                {
                    if (AGVToEdgeBandingRead(commonStackerCrane))
                    {
                        WriteAGVTask(task, commonStackerCrane);
                    }
                    else
                    {
                        AGVToEdgeBanding(commonStackerCrane);
                    }
                }
                else
                {
                    WriteAGVTask(task, commonStackerCrane);
                }
            }
        }
        //读取AGV状态
        public int ReadAGVstatus(CommonStackerCrane commonStackerCrane)
        public void WriteAGVTask(Dt_Task task, CommonStackerCrane commonStackerCrane)
        {
            var deviceProDTO = commonStackerCrane.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == commonStackerCrane.DeviceCode && x.DeviceProParamName == "AGVCraneStatus");
            return deviceProDTO != null ? commonStackerCrane.Communicator.Read<int>(deviceProDTO.DeviceProAddress) : 99;
        }
        //读取AGV工作模式
        public int ReadAGVworkingmode(CommonStackerCrane commonStackerCrane)
        {
            var deviceProDTO = commonStackerCrane.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == commonStackerCrane.DeviceCode && x.DeviceProParamName == "AGVWorkingmode");
            return deviceProDTO != null ? commonStackerCrane.Communicator.Read<int>(deviceProDTO.DeviceProAddress) : 99;
        }
        //读取任务号
        public int Readtasknumber(CommonStackerCrane commonStackerCrane)
        {
            var deviceProDTO = commonStackerCrane.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == commonStackerCrane.DeviceCode && x.DeviceProParamName == "AGVWorkingmode");
            return deviceProDTO != null ? commonStackerCrane.Communicator.Read<int>(deviceProDTO.DeviceProAddress) : 99;
            StackerCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task);
            if (stackerCraneTaskCommand != null)
            {
                bool sendFlag = commonStackerCrane.SendCommand(stackerCraneTaskCommand);
                Thread.Sleep(2000);
                if (ReadReceived(commonStackerCrane) == 1)
                {
                    if (Clear(commonStackerCrane))
                    {
                        _taskService.UpdateTaskStatusToNext(task.TaskNum);
                    }
                }
            }
        }
        /// <summary>
@@ -179,10 +195,6 @@
        {
            return commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.Received);
        }
        public void WriteConfirm(CommonStackerCrane commonStackerCrane)
        {
            commonStackerCrane.SetValue(StackerCraneDBName.WriteConfirm, 1);
        }
        /// <summary>
        /// è°ƒåº¦AGV去封边区域
@@ -191,7 +203,90 @@
        /// <param name="value"></param>
        public void AGVToEdgeBanding(CommonStackerCrane commonStackerCrane)
        {
            commonStackerCrane.SetValue(StackerCraneDBName.AreaWrite, true);
            DeviceProDTO? devicePro = commonStackerCrane.DeviceProDTOs.Where(x => x.DeviceProParamType == "AreaWrite" && x.DeviceChildCode == commonStackerCrane.DeviceCode && x.DeviceProParamName == "AreaWrite").OrderBy(x => x.DeviceProOffset).FirstOrDefault();
            commonStackerCrane.Communicator.Write(devicePro.DeviceProAddress, true);
            commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 3);
            commonStackerCrane.SetValue(StackerCraneDBName.WriteConfirm, 1);
            Thread.Sleep(1000);
            if (ReadReceived(commonStackerCrane) == 1)
            {
                Clear(commonStackerCrane);
            }
        }
        /// <summary>
        /// è¯»å–AGV是否在砂边
        /// </summary>
        /// <param name="commonStackerCrane"></param>
        /// <returns></returns>
        public bool AGVToSandyEdgeRead(CommonStackerCrane commonStackerCrane)
        {
            DeviceProDTO? devicePro = commonStackerCrane.DeviceProDTOs.Where(x => x.DeviceProParamType == "AreaRead" && x.DeviceChildCode == commonStackerCrane.DeviceCode && x.DeviceProParamName == "AreaRead").OrderBy(x => x.DeviceProOffset).FirstOrDefault();
            if (devicePro == null)
            {
                ConsoleHelper.WriteColorLine($"【未找到配置调度AGV区域协议】", ConsoleColor.Magenta);
                return false;
            }
            string[] x = devicePro.DeviceProAddress.Split('.');
            x[x.Length - 1] = (int.Parse(x[x.Length - 1]) + 1).ToString();
            string DeviceProAddress = string.Join(".", x);
            bool read = commonStackerCrane.Communicator.Read<bool>(DeviceProAddress);
            return read;
        }
        public bool Clear(CommonStackerCrane commonStackerCrane)
        {
            DeviceProDTO? devicePro = commonStackerCrane.DeviceProDTOs.Where(x => x.DeviceProParamType == "WriteConfirm" && x.DeviceChildCode == commonStackerCrane.DeviceCode && x.DeviceProParamName == "WriteConfirm").OrderBy(x => x.DeviceProOffset).FirstOrDefault();
            if (devicePro == null)
            {
                ConsoleHelper.WriteColorLine($"【未找到配置调度AGV区域协议】", ConsoleColor.Magenta);
                return false;
            }
            commonStackerCrane.Communicator.Write(devicePro.DeviceProAddress,Convert.ToInt16(0));
            for (int i = 0; i < 6; i++)
            {
                if (i == 5)
                {
                    return false;
                }
                else
                {
                    int read = commonStackerCrane.Communicator.Read<int>(devicePro.DeviceProAddress);
                    if (read == 0)
                    {
                        return true;
                    }
                    else
                    {
                        commonStackerCrane.Communicator.Write(devicePro.DeviceProAddress, Convert.ToInt16(0));
                    }
                }
            }
            return false;
        }
        /// <summary>
        /// è¯»å–AGV是否在封边
        /// </summary>
        /// <param name="commonStackerCrane"></param>
        /// <returns></returns>
        public bool AGVToEdgeBandingRead(CommonStackerCrane commonStackerCrane)
        {
            DeviceProDTO? devicePro = commonStackerCrane.DeviceProDTOs.Where(x => x.DeviceProParamType == "AreaRead" && x.DeviceChildCode == commonStackerCrane.DeviceCode && x.DeviceProParamName == "AreaRead").OrderBy(x => x.DeviceProOffset).FirstOrDefault();
            if (devicePro == null)
            {
                ConsoleHelper.WriteColorLine($"【未找到配置调度AGV区域协议】", ConsoleColor.Magenta);
                return false;
            }
            return commonStackerCrane.Communicator.Read<bool>(devicePro.DeviceProAddress);
        }
        /// <summary>
@@ -203,15 +298,24 @@
        {
            DeviceProDTO? devicePro = commonStackerCrane.DeviceProDTOs.Where(x => x.DeviceProParamType == "AreaWrite" && x.DeviceChildCode == commonStackerCrane.DeviceCode && x.DeviceProParamName == "AreaWrite").OrderBy(x => x.DeviceProOffset).FirstOrDefault();
            if(devicePro == null)
            if (devicePro == null)
            {
                ConsoleHelper.WriteColorLine($"【未找到配置调度AGV区域协议】", ConsoleColor.Magenta);
                return;
            }
            var writeBool = commonStackerCrane.Communicator.Read<bool>(devicePro.DeviceProAddress+0.1);
            if (!writeBool)
            string[] x = devicePro.DeviceProAddress.Split('.');
            x[x.Length - 1] = (int.Parse(x[x.Length - 1]) + 1).ToString();
            string DeviceProAddress = string.Join(".", x);
            commonStackerCrane.Communicator.Write(DeviceProAddress, true);
            commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 4);
            commonStackerCrane.SetValue(StackerCraneDBName.WriteConfirm, 1);
            Thread.Sleep(1000);
            if (ReadReceived(commonStackerCrane) == 1)
            {
                commonStackerCrane.Communicator.Write(devicePro.DeviceProAddress + 0.1, true);
                Clear(commonStackerCrane);
            }
        }
        /// <summary>
@@ -234,7 +338,7 @@
            stackerCraneTaskCommand.TaskNum = task.TaskNum;
            stackerCraneTaskCommand.WorkType = 1;
            stackerCraneTaskCommand.TaskType = 0;
            stackerCraneTaskCommand.WriteConfirm = 1;
            stackerCraneTaskCommand.StartAddress = Convert.ToInt16(SourceAddress.stationCode);
            stackerCraneTaskCommand.EndAddress = Convert.ToInt16(TargetAddress.stationCode);
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneDBName.cs
@@ -78,12 +78,12 @@
        /// <summary>
        /// èµ·ç‚¹
        /// </summary>
        SourceAddress,
        StartAddress,
        /// <summary>
        /// ç»ˆç‚¹
        /// </summary>
        TargetAddress,
        EndAddress,
        /// <summary>
        /// AGV收到任务信号
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskCommand.cs
@@ -47,10 +47,9 @@
        /// </summary>
        public short WorkType { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç±»åž‹
        /// </summary>
        public short TaskType { get; set; }
        public short WriteConfirm { get; set; }
        #endregion <Public Menber>
    }
}