dengjunjie
6 天以前 3b7569285434bb38736627821f7d7eb34fabca28
优化海康跨楼层任务,处理设备信息写入失败任务
已修改13个文件
361 ■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/AGVCartInfoService.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IAGVCartInfoService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/AGVCartInfoController.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/HKTaskMethods.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskMethods.cs 96 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/HKTaskExtend.cs 98 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/RGVTaskExtend.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/TaskExtend.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/TaskJob.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/TestJob.cs 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/AGVCartInfoService.cs
@@ -37,7 +37,7 @@
        /// </summary>
        /// <param name="agvcode"></param>
        /// <returns></returns>
        public WebResponseContent CheckTheCar()
        public WebResponseContent CheckTheCar(string hkagvType)
        {
            WebResponseContent content = new WebResponseContent();
            List<HIKROBOTQueryData> dataList = new List<HIKROBOTQueryData>();
@@ -51,7 +51,7 @@
            try
            {
                var agvInfo = Repository.QueryData();
                var agvInfo = Repository.QueryData(x => x.HkagvType == hkagvType);
                if (agvInfo == null || !agvInfo.Any())
                {
                    content.Error("未查询到AGV小车信息");
@@ -63,7 +63,7 @@
                foreach (var item in agvInfo)
                {
                     var headers = new Dictionary<string, string>
                    var headers = new Dictionary<string, string>
                    {
                        { "X-lr-request-id", DateTimeOffset.Now.ToUnixTimeSeconds().ToString() + item.AGVCode }
                    };
@@ -156,6 +156,6 @@
        }
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs
@@ -124,28 +124,28 @@
        /// <summary>
        /// ç­‰å¾…海康AGV搬运到位  19
        /// å‘¼å«AGV小车中
        /// </summary>
        [Description("等待海康AGV搬运到位")]
        [Description("呼叫AGV小车中")]
        WaitingHkAGVMovePosition,
        /// <summary>
        /// å‘¼å«æµ·åº·æ¬è¿ä¸­
        /// æµ·åº·AGV空车跨层下发
        /// </summary>
        [Description("呼叫海康AGV搬运")]
        [Description("海康AGV空车跨层下发")]
        CallingHKtransportation,
        /// <summary>
        /// æµ·åº·AGV搬运中
        /// æµ·åº·AGV空车跨层运行中
        /// </summary>
        [Description("海康AGV搬运中")]
        [Description("海康AGV空车跨层运行中")]
        HktransportIng,
        /// <summary>
        /// æµ·åº·AGV搬运完成 22
        /// æµ·åº·AGV空车跨层完成
        /// </summary>
        [Description("海康AGV搬运完成")]
        [Description("海康AGV空车跨层完成")]
        HkTransportCompleted,
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IAGVCartInfoService.cs
@@ -19,6 +19,6 @@
        /// æ£€æŸ¥æµ·åº·å°è½¦
        /// </summary>
        /// <returns></returns>
        WebResponseContent CheckTheCar();
        WebResponseContent CheckTheCar(string hkagvType);
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs
@@ -58,7 +58,7 @@
        /// </summary>
        [ImporterHeader(Name = "托盘编号")]
        [ExporterHeader(DisplayName = "托盘编号")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "托盘编号")]
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "托盘编号")]
        public string PalletCode { get; set; }
        /// <summary>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/AGVCartInfoController.cs
@@ -20,9 +20,9 @@
        }
        [HttpPost,Route("CheckTheCar"), AllowAnonymous]
        public WebResponseContent CheckTheCar()
        public WebResponseContent CheckTheCar(string hkagvType)
        {
            return Service.CheckTheCar();
            return Service.CheckTheCar(hkagvType);
        }
    }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/HKTaskMethods.cs
@@ -44,14 +44,14 @@
                //获取货位信息
                else
                    hKLocationInfo = _hKLocationInfoService.GetFreeLocationInfo(taskDTO.toAreaCode) ?? throw new Exception($"未找到终点库区【{taskDTO.toAreaCode}】可用空货位!");
                if (taskType==(int)TaskTypeEnum.Q1TSJ4)
                if (taskType == (int)TaskTypeEnum.Q1TSJ4)
                {
                    var device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "TSJ") as OtherDevice;
                    if (device.IsConnected)
                    {
                        var reslu = device.GetValue<HoistEnum, string>(HoistEnum.Emptycontainernumber);
                        var result = reslu?.TrimEnd('\0')?.Substring(2);
                        if (reslu== taskDTO.containerCode&&result!=null)
                        if (reslu == taskDTO.containerCode && result != null)
                        {
                            throw new Exception($"当前的料箱号为{reslu}与{taskDTO.containerCode}料箱号不匹配");
                        }
@@ -246,8 +246,7 @@
                hIKROBOTTaskSubmit.initPriority = task.Grade;
                hIKROBOTTaskSubmit.robotTaskCode = task.WMSTaskNum;
                hIKROBOTTaskSubmit.taskType = tasktype.ToString(); ExtraDto extraDto = new ExtraDto();
                if (task.TaskType != (int)TaskTypeEnum.MOVE &&task.TaskType != (int)TaskTypeEnum.Q3RK && task.TaskType != (int)TaskTypeEnum.Q3CK &&
                    task.TaskType != (int)TaskTypeEnum.F01)
                if (task.TaskType != (int)TaskTypeEnum.MOVE && task.TaskType != (int)TaskTypeEnum.Q3RK && task.TaskType != (int)TaskTypeEnum.Q3CK && task.TaskType != (int)TaskTypeEnum.F01)
                {
                    CarrierInfoDto carrierInfoDto = new CarrierInfoDto()
                    {
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskMethods.cs
@@ -83,12 +83,6 @@
                                task.TaskState = (int)TaskStatusEnum.HktransportIng;
                                BaseDal.UpdateData(task);
                            }
                            else if (task.TaskType == (int)TaskTypeEnum.Q3CK|| task.TaskType == (int)TaskTypeEnum.Q3RK)
                            {
                                //UpdateStandStatus(task, task.SourceAddress, LocationStatusEnum.Lock);
                                task.TaskState = (int)TaskStatusEnum.Takeing;
                                TaskFeedback(task, 1);
                            }
                            else
                            {
                                task.TaskState = (int)TaskStatusEnum.Takeing;
@@ -97,24 +91,11 @@
                            break;
                        case "outbin"://离开起点
                            {
                                  if (task.TaskType == (int)TaskTypeEnum.Q3RK|| task.TaskType == (int)TaskTypeEnum.Q3CK)
                                {
                                    UpdateStandStatus(task, task.SourceAddress, LocationStatusEnum.Free);
                                    task.TaskState = TaskStatusEnum.TakeFinish.ObjToInt();
                                    BaseDal.UpdateData(task);
                                    TaskFeedback(task, 1);
                                }
                                else
                                {
                                    TaskFromCompleted(task, deviceTypeEnum); //任务状体改为3取货完成,更新起点货位状态,并反馈WMS起点完成
                                }
                                ///判断任务是否跟设备有关
                                TaskFromCompleted(task, deviceTypeEnum); //任务状体改为3取货完成,更新起点货位状态,并反馈WMS起点完成
                            }
                            break;
                        case "finish"://离开提升机
                            {
                                //入提升机
                                if (task.TaskType == TaskTypeEnum.RK3F.ObjToInt() && task.TaskState == (int)TaskStatusEnum.CheckPalletCodeFinish)
                                {
@@ -146,7 +127,7 @@
                                    BaseDal.UpdateData(task);
                                }
                                //四楼 å‡ºåº“  
                                else if ((task.TaskType == TaskTypeEnum.CHUKU1.ObjToInt() || task.TaskType == TaskTypeEnum.F04.ObjToInt()) && task.TaskState == (int)TaskStatusEnum.AGV_ToExecute)
                                else if ((task.TaskType == TaskTypeEnum.CHUKU1.ObjToInt() || task.TaskType == TaskTypeEnum.F04.ObjToInt()) && task.TaskState == (int)TaskStatusEnum.AGV_ToExecute)
                                {
                                    var device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "TSJ") as OtherDevice;
                                    if (device == null) task.ExceptionMessage = "未找到提升机信息";
@@ -160,7 +141,7 @@
                                    BaseDal.UpdateData(task);
                                }
                                // //四楼出提升机 å…¥åº“ ä¹‹å‰æ˜¯AGV_ToExecute  //要写成取货完成状态TakeFinish
                                if ((task.TaskType == TaskTypeEnum.Q1TSJ4.ObjToInt() || task.TaskType == TaskTypeEnum.F03.ObjToInt()) && task.TaskState == (int)TaskStatusEnum.AGV_ToExecute)
                                else if ((task.TaskType == TaskTypeEnum.Q1TSJ4.ObjToInt() || task.TaskType == TaskTypeEnum.F03.ObjToInt()) && task.TaskState == (int)TaskStatusEnum.AGV_ToExecute)
                                {
                                    var device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "TSJ") as OtherDevice;
                                    if (device == null) task.ExceptionMessage = "未找到提升机信息";
@@ -175,21 +156,29 @@
                                    BaseDal.UpdateData(task);
                                }
                                //跨楼层
                                else if (task.TaskType == TaskTypeEnum.Q3RK.ObjToInt() || task.TaskType == TaskTypeEnum.Q3CK.ObjToInt() && task.TaskState == (int)TaskStatusEnum.TakeFinish)
                                else if (task.TaskType == TaskTypeEnum.Q3RK.ObjToInt() || task.TaskType == TaskTypeEnum.Q3CK.ObjToInt()/* && task.TaskState == (int)TaskStatusEnum.TakeFinish*/)
                                {
                                    if (task.TaskType == TaskTypeEnum.Q3RK.ObjToInt()|| task.TaskType == TaskTypeEnum.Q3RK.ObjToInt())
                                    var device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "F1") as OtherDevice;
                                    if (device == null) task.ExceptionMessage = "未找到质检门信息";
                                    else
                                    {
                                        var device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "F1") as OtherDevice;
                                        if (device == null) task.ExceptionMessage = "未找到质检门信息";
                                        else
                                        bool Wok = false;
                                        var Address = task.TaskType == TaskTypeEnum.Q3RK.ObjToInt() ? task.TargetAddress : task.SourceAddress;
                                        if (device.IsConnected)
                                        {
                                            if (device.IsConnected)
                                                //写以一个出库完成信号
                                                device.SetValue(QualityInspectionCommandEnum.RequestToEnter, false, task.TargetAddress);
                                            else
                                                task.ExceptionMessage = "质检门信息设备连接失败";
                                            int i = 0;
                                            while (!Wok && i <= 3)
                                            {
                                                i++;
                                                Wok = device.SetValue(QualityInspectionCommandEnum.RequestToEnter, false, Address);
                                                Thread.Sleep(500);
                                            }
                                        }
                                        if (!Wok)
                                        {
                                            task.ExceptionMessage = $"【{Address}】关闭请求进入失败!";
                                            task.Remark = $"{device.DeviceCode}_RequestToEnter_{false}_{Address}";
                                        }
                                    }
                                    BaseDal.UpdateData(task);
                                }
@@ -209,8 +198,8 @@
                                else
                                {
                                    if (device.IsConnected)
                                         //打开扫码器
                                       device.SetValue<HoistEnum, short>(HoistEnum.Codereadingtriggered, 1);
                                        //打开扫码器
                                        device.SetValue<HoistEnum, short>(HoistEnum.Codereadingtriggered, 1);
                                    else
                                        task.ExceptionMessage = "提升机信息设备连接失败";
                                }
@@ -220,16 +209,16 @@
                            break;
                        case "end"://任务完成通知
                            {
                                 if (task.TaskType == (int)TaskTypeEnum.Q3RK || task.TaskType == (int)TaskTypeEnum.Q3CK|| task.TaskType == (int)TaskTypeEnum.MOVE)
                                if (task.TaskType == (int)TaskTypeEnum.MOVE)
                                {
                                    task.TaskState = TaskStatusEnum.Finish.ObjToInt();
                                    BaseDal.UpdateData(task);
                                    TaskFeedback(task, 2);
                                    BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.自动完成);
                                    var Task = BaseDal.QueryFirst(x => task.WMSTaskNum.Contains(x.WMSTaskNum));
                                    Task.TaskState = TaskStatusEnum.HkTransportCompleted.ObjToInt();
                                    BaseDal.UpdateData(Task);
                                }
                                else
                                {
                                    ///判断任务是否跟设备有关
                                    TaskCompleted(task, deviceTypeEnum);
                                }
                            }
@@ -237,14 +226,14 @@
                        case "intolift": //进入电梯
                            {
                                //六楼到一楼的入库任务
                                if (task.TaskType==(int)TaskTypeEnum.Q3RK||task.TaskType==(int)TaskTypeEnum.MOVE||task.TaskType==(int)TaskTypeEnum.F01)
                                if (task.TaskType == (int)TaskTypeEnum.Q3RK || task.TaskType == (int)TaskTypeEnum.MOVE || task.TaskType == (int)TaskTypeEnum.F01)
                                {
                                    task.TaskState = TaskStatusEnum.Hkintolift.ObjToInt();
                                    BaseDal.UpdateData(task);
                                }
                            }
                            break;
                            case "leavelift": //离开电梯
                        case "leavelift": //离开电梯
                            {
                                if (task.TaskType == (int)TaskTypeEnum.Q3RK || task.TaskType == (int)TaskTypeEnum.MOVE || task.TaskType == (int)TaskTypeEnum.F01)
                                {
@@ -443,7 +432,7 @@
            try
            {
                dt_Task.TaskState = TaskStatusEnum.Finish.ObjToInt();
                TaskFeedback(dt_Task, 2);
                TaskFeedback(dt_Task, 2, string.IsNullOrEmpty(dt_Task.Remark));
                //Db.Ado.BeginTran();
                UpdateLocationStatus(dt_Task.TargetAddress, dt_Task.PalletCode, deviceTypeEnum, LocationStatusEnum.InStock);
@@ -517,6 +506,21 @@
                        stationInfo.StationStatus = locationStatusEnum.ObjToInt();
                        _stationInfo.UpdateData(stationInfo);
                    }
                    Dt_StationManger stationManger = _stationMangerService.Repository.QueryFirst(x => x.StationCode == locationCode);
                    if (stationManger != null)
                    {
                        if (locationStatusEnum == LocationStatusEnum.Free) //如果起点完成就给货位赋值托盘号
                        {
                            stationManger.Remark = "";
                            stationManger.IsOccupied = LocationStatusEnum.Free.ObjToInt();
                        }
                        else
                        {
                            stationManger.Remark = palletCode;
                            stationManger.IsOccupied = LocationStatusEnum.Lock.ObjToInt();
                        }
                        _stationMangerService.UpdateData(stationManger);
                    }
                }
                else if (deviceTypeEnum == DeviceTypeEnum.YuanLiJuHe)
                {
@@ -551,7 +555,7 @@
        #endregion
        #region æ›´æ–°ä¸€æ¥¼ç«™å°çŠ¶æ€
        public WebResponseContent UpdateStandStatus(Dt_Task task,string stationCode,LocationStatusEnum locationStatusEnum)
        public WebResponseContent UpdateStandStatus(Dt_Task task, string stationCode, LocationStatusEnum locationStatusEnum)
        {
            try
            {
@@ -579,7 +583,7 @@
        #endregion
        #region ä¸ŠæŠ¥WMS
        public WebResponseContent TaskFeedback(Dt_Task dt_Task, int Status)
        public WebResponseContent TaskFeedback(Dt_Task dt_Task, int Status, bool Del = true)
        {
            WebResponseContent content = new WebResponseContent();
            WMSInOutBoundCompleteFeedback boundCompleteFeedback = new WMSInOutBoundCompleteFeedback();
@@ -596,7 +600,7 @@
                    boundCompleteFeedback.toLocationCode = dt_Task.TargetAddress;
                    boundCompleteFeedback.status = Status;
                    boundCompleteFeedback.custStatus = "";
                    string response = HttpHelper.Post(apiInfo.ApiAddress,boundCompleteFeedback.Serialize());
                    string response = HttpHelper.Post(apiInfo.ApiAddress, boundCompleteFeedback.Serialize());
                    agvContent = response.DeserializeObject<WMSReturn>();
                    content.OK(data: agvContent);
                    if (agvContent.code != 200)
@@ -613,7 +617,7 @@
            finally
            {
                _trackloginfoService.AddTrackLog(boundCompleteFeedback, content, "出入库任务状态反馈WMS", "", "");
                if (agvContent != null && agvContent.code == 200 && Status == 2)
                if (agvContent != null && agvContent.code == 200 && Del)
                    BaseDal.DeleteAndMoveIntoHty(dt_Task, OperateTypeEnum.自动完成);
                else
                    BaseDal.UpdateData(dt_Task);
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -130,7 +130,7 @@
                            continue;
                            //throw new Exception($"托盘号【{task.containerCode}】已存在任务");
                        }
                        if (BaseDal.QueryFirst(x => x.SourceAddress == task.fromLocationCode && x.TaskType == item.taskType&&x.TaskState<TaskStatusEnum.TakeFinish.ObjToInt())!=null)
                        if (BaseDal.QueryFirst(x => x.SourceAddress == task.fromLocationCode && x.TaskType == item.taskType && x.TaskState < TaskStatusEnum.TakeFinish.ObjToInt()) != null)
                        {
                            objects.Add(new
                            {
@@ -168,7 +168,7 @@
                                break;
                            #endregion
                            #region æµ·åº·AGV
                            case(int)TaskTypeEnum.STURR:
                            case (int)TaskTypeEnum.STURR:
                            case (int)TaskTypeEnum.Q1TSJ4:
                                content = CreateHKNewInTask(task, item.taskType);
                                objects.Add(content.Data);
@@ -178,7 +178,7 @@
                                content = CreateHKNewOutTask(task, item.taskType);
                                objects.Add(content.Data);
                                break;
                            case (int)TaskTypeEnum.Q3RK:
                            case (int)TaskTypeEnum.Q3CK:
                                content = CarryTask(task, item.taskType);
@@ -243,7 +243,7 @@
                //四向车
                bool isAGV = dt_Task.TaskType == (int)TaskTypeEnum.CPInbound || dt_Task.TaskType == (int)TaskTypeEnum.CPOutbound;
                //海康
                bool isHK = dt_Task.TaskType == (int)TaskTypeEnum.F01 || dt_Task.TaskType == (int)TaskTypeEnum.RK3F || dt_Task.TaskType == (int)TaskTypeEnum.CK3F || dt_Task.TaskType == (int)TaskTypeEnum.Q1TSJ4 || dt_Task.TaskType == (int)TaskTypeEnum.STU0003 || dt_Task.TaskType == (int)TaskTypeEnum.F02 || dt_Task.TaskType == (int)TaskTypeEnum.CHUKU1 || dt_Task.TaskType == (int)TaskTypeEnum.Q3RK || dt_Task.TaskType == (int)TaskTypeEnum.Q3CK||dt_Task.TaskType==(int)TaskTypeEnum.STURR;
                bool isHK = dt_Task.TaskType == (int)TaskTypeEnum.F01 || dt_Task.TaskType == (int)TaskTypeEnum.RK3F || dt_Task.TaskType == (int)TaskTypeEnum.CK3F || dt_Task.TaskType == (int)TaskTypeEnum.Q1TSJ4 || dt_Task.TaskType == (int)TaskTypeEnum.STU0003 || dt_Task.TaskType == (int)TaskTypeEnum.F02 || dt_Task.TaskType == (int)TaskTypeEnum.CHUKU1 || dt_Task.TaskType == (int)TaskTypeEnum.Q3RK || dt_Task.TaskType == (int)TaskTypeEnum.Q3CK || dt_Task.TaskType == (int)TaskTypeEnum.STURR;
                //这里将状态改变了198取消任务
                dt_Task.TaskType = TaskStatusEnum.WMSCancel.ObjToInt();
                #region å‡¯ä¹å£«
@@ -331,7 +331,7 @@
                    Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(CancelHIKROBOTTask));
                    if (apiInfo == null) throw new Exception("未找到四向车AGV任务下发接口配置信息!请检查接口配置");
                    string response = HttpHelper.Post(apiInfo.ApiAddress, cancelHIKROBOTTask.Serialize(),headers: headers);
                    string response = HttpHelper.Post(apiInfo.ApiAddress, cancelHIKROBOTTask.Serialize(), headers: headers);
                    HIKROBOTReturn hIKROBOTReturn = response.DeserializeObject<HIKROBOTReturn>();
                    content.OK(data: hIKROBOTReturn);
                    if (hIKROBOTReturn.code == "SUCCESS" && hIKROBOTReturn.message == "成功")
@@ -1146,7 +1146,7 @@
                            LoctionCode = item.LocationCode,
                            LocationStatus = item.LocationStatus,
                            EnableStatus = item.EnableStatus,
                              PalletCode = item.PalletCode
                            PalletCode = item.PalletCode
                        });
                    }
                    content.OK(data: list);
@@ -1161,7 +1161,7 @@
                    list.Add(new
                    {
                        LoctionCode = value,
                        LocationStatus = value!=0? 100 : 0,
                        LocationStatus = value != 0 ? 100 : 0,
                        EnableStatus = 0,
                    });
                    content.OK(data: list);
@@ -1180,7 +1180,7 @@
                            LoctionCode = item.LocationCode,
                            LocationStatus = item.LocationStatus,
                            EnableStatus = item.EnableStatus,
                              PalletCode = item.PalletCode
                            PalletCode = item.PalletCode
                        });
                    }
                    content.OK(data: list);
@@ -1191,7 +1191,7 @@
                    var device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "F1") as OtherDevice;
                    if (device == null) throw new Exception("未找到1楼质检门设备信息");
                    if (!device.IsConnected) throw new Exception("PLC1楼质检门设备连接失败");
                    var sta = _stationMangerService.Repository.QueryData(x => x.Remark == "成品库");
                    var sta = _stationMangerService.Repository.QueryData(x => x.StationName.Contains("成品仓"));
                    foreach (var item in sta)
                    {
                        bool value = device.GetValue<QualityInspectionCommandEnum, bool>(QualityInspectionCommandEnum.R_StockAvailableSymbol, item.StationCode);
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/HKTaskExtend.cs
@@ -50,10 +50,10 @@
            foreach (var item in tasks)
            {
                // å‡ºåº“任务处理 (从1楼出库到6楼)
                if (item.TaskType == (int)TaskTypeEnum.Q3CK)
                if (item.TaskType == (int)TaskTypeEnum.Q3CK || item.TaskType == (int)TaskTypeEnum.Q3RK)
                {
                    // è°ƒç”¨æŽ¥å£èŽ·å–å°è½¦ä¿¡æ¯
                    var result = _agvcartInfoService.CheckTheCar();
                    var result = _agvcartInfoService.CheckTheCar("MR-Q3-600LE-D(M)(YWGP)");
                    if (result != null && result.Status)
                    {
                        var dataList = result.Data as List<HIKROBOTQueryData>;
@@ -61,7 +61,8 @@
                        {
                            // å‡ºåº“任务:检查是否有在1楼(AA)的小车
                            // Q3CK æ˜¯AA→FF的跨楼层任务,只能使用专用小车
                            var specialCarInAA = dataList.FirstOrDefault(d => d.mapCode == "AA" && d.CarType == "MR-Q3-600LE-D(M)(YWGP)");
                            var code = item.TaskType == (int)TaskTypeEnum.Q3CK ? "AA" : "FF";
                            var specialCarInAA = dataList.FirstOrDefault(d => d.mapCode == code);
                            if (specialCarInAA != null)
                            {
@@ -75,11 +76,11 @@
                            else
                            {
                                // æ²¡æœ‰ä¸“用小车在1楼,需要呼叫专用小车来到1楼
                                var anySpecialCar = dataList.FirstOrDefault(d => d.CarType == "MR-Q3-600LE-D(M)(YWGP)");
                                var anySpecialCar = dataList.FirstOrDefault();
                                if (anySpecialCar != null)
                                {
                                    // èµ·ç‚¹ï¼šå°è½¦å½“前所在楼层的点位,目标:1楼点位
                                    var callCarResult = AddAGVCartInfo(item, anySpecialCar.mapCode, "AA");
                                    var callCarResult = AddAGVCartInfo(item, anySpecialCar.mapCode, code);
                                    if (callCarResult.Status)
                                    {
                                        // åŽŸä»»åŠ¡çŠ¶æ€æ”¹ä¸ºç­‰å¾…ç©ºè½¦
@@ -98,54 +99,10 @@
                        item.ExceptionMessage = "获取AGV小车信息失败";
                    }
                }
                // å…¥åº“任务处理 (从6楼入库到1楼)
                else if (item.TaskType == (int)TaskTypeEnum.Q3RK)
                {
                    var result = _agvcartInfoService.CheckTheCar();
                    if (result != null && result.Status)
                    {
                        var dataList = result.Data as List<HIKROBOTQueryData>;
                        if (dataList != null && dataList.Any())
                        {
                            // Q3RK æ˜¯FF→AA的跨楼层任务,只能使用专用小车
                            var specialCarInFF = dataList.FirstOrDefault(d => d.mapCode == "FF" && d.CarType == "MR-Q3-600LE-D(M)(YWGP)");
                            if (specialCarInFF!=null)
                            {
                                // æœ‰åœ¨1楼的小车,直接执行任务
                                var content = _taskService.SendHIKROBOTTask(item);
                                item.TaskState = (int)TaskStatusEnum.Execut;
                            }
                            else
                            {
                                // æ²¡æœ‰ä¸“用小车在6楼,需要呼叫专用小车来到6楼
                                var anySpecialCar = dataList.FirstOrDefault(d => d.CarType == "MR-Q3-600LE-D(M)(YWGP)");
                                if (anySpecialCar != null)
                                {
                                    // èµ·ç‚¹ï¼šå°è½¦å½“前所在楼层的点位,目标:6楼点位
                                    var callCarResult = AddAGVCartInfo(item, anySpecialCar.mapCode, "FF");
                                    if (callCarResult.Status)
                                    {
                                        item.TaskState = (int)TaskStatusEnum.WaitingHkAGVMovePosition;
                                    }
                                }
                                else
                                {
                                    item.ExceptionMessage = "未找到可用AGV小车";
                                }
                            }
                        }
                    }
                    else
                    {
                        item.ExceptionMessage = "获取AGV小车信息失败";
                    }
                }
                else if (item.TaskType == (int)TaskTypeEnum.F01)
                {
                    // F01任务处理:根据目标地址判断需要哪个楼层的小车
                    var result = _agvcartInfoService.CheckTheCar();
                    var result = _agvcartInfoService.CheckTheCar("MR-Q3-600LE-D(M)");
                    if (result != null && result.Status)
                    {
@@ -162,9 +119,9 @@
                            }
                            // æ£€æŸ¥æ˜¯å¦æœ‰åœ¨ç›®æ ‡æ¥¼å±‚的小车
                            var hasRequiredCar = dataList.FirstOrDefault(d => d.mapCode == requiredMapCode&&d.CarType== "MR-Q3-600LE-D(M)");
                            var hasRequiredCar = dataList.FirstOrDefault(d => d.mapCode == requiredMapCode);
                            if (hasRequiredCar!=null)
                            if (hasRequiredCar != null)
                            {
                                // æœ‰åœ¨ç›®æ ‡æ¥¼å±‚的小车,直接执行任务
                                var content = _taskService.SendHIKROBOTTask(item);
@@ -193,7 +150,7 @@
                            }
                        }
                    }
                    }
                }
                _taskService.UpdateData(item);
            }
        }
@@ -239,7 +196,7 @@
                Dt_Task newTask = new Dt_Task
                {
                    WMSTaskNum="HKkc"+ DateTime.Now.ToString("yyyyMMddHHmmss"), // ç”Ÿæˆå”¯ä¸€çš„WMS任务号
                    WMSTaskNum = "HK_" + task.WMSTaskNum, // ç”Ÿæˆå”¯ä¸€çš„WMS任务号
                    TaskNum = _taskService.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                    SourceAddress = currentFloorInfo.PointCode,
                    CurrentAddress = currentFloorInfo.PointCode,
@@ -247,16 +204,16 @@
                    NextAddress = targetFloorInfo.PointCode,
                    TaskType = (int)TaskTypeEnum.MOVE,
                    Grade = task.Grade,
                    PalletCode = null,
                    PalletCode = "",
                    TaskState = (int)TaskStatusEnum.CallingHKtransportation,
                    // å¤åˆ¶å…¶ä»–必要字段
                    CreateDate = DateTime.Now,
                    Creater = "System"
                };
                _taskService.AddData(newTask);  // æ·»åŠ æ–°ä»»åŠ¡
                var result = _taskService.SendHIKROBOTTask(newTask);
                if (result.Status)
                {
                    _taskService.AddData(newTask);  // æ·»åŠ æ–°ä»»åŠ¡
                    content.OK("空车呼叫任务创建成功", newTask);
                }
                else
@@ -274,26 +231,22 @@
        #endregion
        #region å¤„理agv待空车搬运任务
        public void SendHKWaitTask()
        public void SendHKWaitTask(List<Dt_Task> Tasks)
        {
            try
            {
                List<Dt_Task> reslut = _taskService.Repository.QueryData(x => x.TaskType == (int)TaskTypeEnum.MOVE);
                if (reslut.Count<=0)
                List<Dt_Task> Uptasks = new List<Dt_Task>();
                foreach (var item in Tasks)
                {
                    List<Dt_Task> reslut2 = _taskService.Repository.QueryData(x => x.TaskType == (int)TaskTypeEnum.Q3RK||x.TaskType==(int)TaskTypeEnum.Q3CK || x.TaskType == (int)TaskTypeEnum.F01);
                    foreach (var item in reslut2)
                    var content = _taskService.SendHIKROBOTTask(item);
                    if (content.Status)
                    {
                        var content = _taskService.SendHIKROBOTTask(item);
                    }
                    reslut.ForEach(x =>
                    {
                        x.TaskState =(int)TaskStatusEnum.Execut;
                    });
                        item.TaskState = (int)TaskStatusEnum.Execut;
                        Uptasks.Add(item);
                    }
                }
                _taskService.UpdateData(reslut);
                _taskService.UpdateData(Uptasks);
            }
            catch (Exception ex)
            {
@@ -314,14 +267,13 @@
            // åœ°å€æ ¼å¼ç¤ºä¾‹ ï¼šAA å¯¹åº” 0339050AA0309145
            // keys æ˜¯ AA、BB、CC、DD、EE、FF,vule是对应的点位信息
            foreach (var floorCode in FloorMapping.FloorMap.Keys)
            foreach (var floorCode in FloorMapping.FloorMap.Keys)
            {
                if (address.Contains(floorCode))
                if (address.Contains(floorCode))
                {
                    return floorCode;//返回的就是AA、BB、CC、DD、EE、FF中的一个,代表对应的楼层
                }
            }
            return null;
        }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/RGVTaskExtend.cs
@@ -300,12 +300,12 @@
                                locationsToUpdate.Add(rGVLocationInfo);
                                #region é‡Šæ”¾å…¥åº“站台
                                //var stationManger = _stationMangerService.GetInStationInfo(item.SourceAddress);
                                //if (stationManger != null)
                                //{
                                //    stationManger.IsOccupied = LocationStatusEnum.Free.ObjToInt();
                                //    stationsToUpdate.Add(stationManger);
                                //}
                                var stationManger = _stationMangerService.GetInStationInfo(item.SourceAddress);
                                if (stationManger != null)
                                {
                                    stationManger.IsOccupied = LocationStatusEnum.Free.ObjToInt();
                                    stationsToUpdate.Add(stationManger);
                                }
                                content.OK();
                                #endregion
                            }
@@ -412,8 +412,8 @@
                            _taskService.UpdateData(tasksToUpdate);
                        if (locationsToUpdate.Any())
                            _rGVLocationInfoService.UpdateData(locationsToUpdate);
                        //if (stationsToUpdate.Any())
                        //    _stationMangerService.UpdateData(stationsToUpdate);
                        if (stationsToUpdate.Any())
                            _stationMangerService.UpdateData(stationsToUpdate);
                        _unitOfWorkManage.CommitTran();
                    }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/TaskExtend.cs
@@ -113,8 +113,8 @@
                    #region å¤„理agv待空车搬运任务
                    Tasks = ExecutTasks.Where(x => x.TaskState == (int)TaskStatusEnum.WaitingHkAGVMovePosition).OrderByDescending(x => x.Grade).ToList();
                    if (Tasks.Count > 0) SendHKWaitTask();
                    Tasks = ExecutTasks.Where(x => x.TaskState == (int)TaskStatusEnum.HkTransportCompleted).OrderByDescending(x => x.Grade).ToList();
                    if (Tasks.Count > 0) SendHKWaitTask(Tasks);
                    #endregion
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/TaskJob.cs
@@ -2,6 +2,7 @@
using HslCommunication;
using HslCommunication.Core;
using Microsoft.VisualBasic.FileIO;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using Quartz;
using SixLabors.ImageSharp.PixelFormats;
using SqlSugar;
@@ -15,12 +16,14 @@
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Communicator;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Core.Enums;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DeviceBase;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
namespace WIDESEAWCS_Tasks
@@ -54,6 +57,29 @@
                SendNewTask();
                SendWaitToTask();
                #region å¤„理写入设备信号异常任务
                var tasks = _taskService.Repository.QueryData(x => x.TaskState == TaskStatusEnum.Finish.ObjToInt() && !string.IsNullOrEmpty(x.Remark));
                if (tasks.Count > 0)
                {
                    List<Dt_Task> list = new List<Dt_Task>();
                    foreach (var item in tasks)
                    {
                        var infos = item.Remark.Split("_");
                        var device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == infos[0]) as OtherDevice;
                        if (device != null && device.IsConnected)
                        {
                            DeviceProDTO? devicePro = device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == infos[1] && x.DeviceChildCode == infos[3]);
                            if (devicePro != null)
                            {
                                var W = device.Communicator.WriteObj(devicePro.DeviceProAddress, devicePro.DeviceDataType, infos[2]);
                                if (W) list.Add(item);
                            }
                        }
                    }
                    _taskService.Repository.DeleteAndMoveIntoHty(list, OperateTypeEnum.自动删除);
                }
                #endregion
            }
            catch (Exception ex)
            {
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/TestJob.cs
@@ -12,6 +12,7 @@
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.LocationEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Communicator;
using WIDESEAWCS_Core.Helper;
@@ -50,9 +51,9 @@
                // _taskService.Repository ä»“储层,进行数据库访问-
                try
                {
                    #region å››å‘车任务
                    List<Dt_Task> Uptasks = new List<Dt_Task>();
                    var taskList = _taskService.Repository.QueryData(x => x.TaskType == TaskTypeEnum.CPInbound.ObjToInt() && x.TaskState == TaskStatusEnum.CheckShapeing.ObjToInt());
                    var AGVtaskList = _taskService.Repository.QueryData(x => x.TaskState == TaskStatusEnum.AGV_WaitToExecute.ObjToInt()&& (x.TaskType == TaskTypeEnum.Q3RK.ObjToInt() || x.TaskType == TaskTypeEnum.Q3CK.ObjToInt()));//1-6和6-1楼任务
                    //任务的目标地址对于站台号;
                    foreach (var task in taskList)
                    {
@@ -103,19 +104,57 @@
                            Uptasks.Add(task);
                        }
                    }
                    #endregion
                    var AGVtaskList = _taskService.Repository.QueryData(x => x.TaskState == TaskStatusEnum.AGV_WaitToExecute.ObjToInt() && (x.TaskType == TaskTypeEnum.Q3RK.ObjToInt() || x.TaskType == TaskTypeEnum.Q3CK.ObjToInt()));//1-6和6-1楼任务
                    foreach (var item in AGVtaskList)
                    {
                        if (device.GetValue<QualityInspectionCommandEnum, bool>(QualityInspectionCommandEnum.R_StockAvailableSymbol, item.SourceAddress))
                        var address = item.TaskType == TaskTypeEnum.Q3RK.ObjToInt() ? item.TargetAddress : item.SourceAddress;
                        var stationManger = _stationMangerService.Repository.QueryFirst(x => x.StationCode == address);
                        if (stationManger == null)
                        {
                            item.ExceptionMessage = $"{item.SourceAddress}站台有货,无法进入";
                            item.ExceptionMessage = $"未找到【{address}】站台信息";
                            Uptasks.Add(item);
                            continue;
                        }
                        //into进入一楼位置的时候,写入进入信号
                        device.SetValue(QualityInspectionCommandEnum.RequestToEnter, true, item.SourceAddress);
                        if (!device.GetValue<QualityInspectionCommandEnum,bool>(QualityInspectionCommandEnum.Blocking)==true)
                        var StockAvailableSymbol = device.GetValue<QualityInspectionCommandEnum, bool>(QualityInspectionCommandEnum.R_StockAvailableSymbol, address);
                        if (item.TaskType == TaskTypeEnum.Q3RK.ObjToInt())
                        {
                            item.ExceptionMessage = $"{item.TargetAddress}站台光栅不为true(1)!";
                            if (StockAvailableSymbol)
                            {
                                item.ExceptionMessage = $"{address}站台光电检测有货!";
                                Uptasks.Add(item);
                                continue;
                            }
                            if (stationManger.IsOccupied == (int)LocationStatusEnum.Lock)
                            {
                                item.ExceptionMessage = $"站台有货!";
                                Uptasks.Add(item);
                                continue;
                            }
                        }
                        else
                        {
                            if (!StockAvailableSymbol)
                            {
                                item.ExceptionMessage = $"{address}站台光电检测无货!";
                                Uptasks.Add(item);
                                continue;
                            }
                            if (stationManger.IsOccupied == (int)LocationStatusEnum.Free)
                            {
                                item.ExceptionMessage = $"站台无货!";
                                Uptasks.Add(item);
                                continue;
                            }
                        }
                        //into进入一楼位置的时候,写入进入信号
                        device.SetValue(QualityInspectionCommandEnum.RequestToEnter, true, address);
                        if (!device.GetValue<QualityInspectionCommandEnum, bool>(QualityInspectionCommandEnum.Blocking, address))
                        {
                            item.ExceptionMessage = $"{address}站台光栅不为true(1)!";
                            Uptasks.Add(item);
                            continue;
                        }
                        var result = _taskService.Hikvisiontaskscontinue(item.WMSTaskNum);
                        if (result.Status == false)
@@ -130,15 +169,12 @@
                        item.TaskState = (int)TaskStatusEnum.AGV_ToExecute;
                        item.ExceptionMessage = "";
                        Uptasks.Add(item);
                    }
                    _taskService.UpdateData(Uptasks);
                    WriteInfo(device.DeviceName, "infoLog");
                    //WriteInfo(device.DeviceName, "infoLog");
                    WriteDebug(device.DeviceName, "debugLog");
                    //WriteDebug(device.DeviceName, "debugLog");
                }
                catch (Exception ex)
                {
@@ -149,8 +185,6 @@
            {
                WriteError(nameof(TestJob), "参数错误,未传递设备参数或设备类型错误");
            }
            return Task.CompletedTask;
        }
    }