zhangchengsong
昨天 ce70974f99cd377579e9b07873c8ce79df6e05c3
ÏîÄ¿´úÂë/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/WMSTaskService.cs
@@ -16,7 +16,9 @@
#endregion << ç‰ˆ æœ¬ æ³¨ é‡Š >>
using AutoMapper;
using AutoMapper.Internal;
using Castle.Components.DictionaryAdapter.Xml;
using HslCommunication;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.OpenApi.Any;
@@ -84,7 +86,7 @@
                if (transfer.to == null || string.IsNullOrEmpty(transfer.to.code)) return apiResponse.ErrorResponse("目标位置不能为空");
                if (transfer.device == null || string.IsNullOrEmpty(transfer.device.uuid)) return apiResponse.ErrorResponse("设备标识不能为空");
                Dt_Task setask = BaseDal.QueryData(x => x.WMStaskid == transfer.barCode).FirstOrDefault();
                Dt_Task? setask = BaseDal.QueryData(x => x.WMStaskid == transfer.barCode).FirstOrDefault();
                if (setask != null) return apiResponse.ErrorResponse($"WCS已有当前任务,不可重复下发,托盘编号:{transfer.barCode}");
@@ -186,10 +188,10 @@
                    int StationStatus = conveyorLine.Communicator.Read<ushort>(StationNumProDTO.DeviceProAddress);
                    if(DeStateName=="F01" || DeStateName == "F06" || DeStateName == "F07")
                    if(DeStateName== "G01" || DeStateName == "G06" || DeStateName == "G07")
                    {
                        //有货,可进信号
                        statusValue = ((portStatus == 1 && StationStatus == 1) || (portStatus == 2 && StationStatus == 0)) ? 1 : (portStatus == 0) ? 0 : 0;
                        statusValue = (portStatus == 1 && StationStatus == 1) ? 1 : (portStatus == 2 && StationStatus == 0) ?0: (portStatus == 0) ? 0 : 0;
                    }
                    else
                    {
@@ -208,7 +210,7 @@
        //获取光幕状态
        public ApiResponse getSafeStatus(string[] datas)
        public ApiResponse getSafeStatus(string[]  datas)
        {
            WriteLog.Write_Log("获取光幕状态接口", "获取光幕状态信息", "调取参数", setCurtain);
            ApiResponse apiResponse = new ApiResponse();
@@ -232,19 +234,63 @@
        //设置光幕
        public ApiResponse setCurtain(SetCurtainRequest setCurtain)
        {
            //获取WMS调取的参数
            WriteLog.Write_Log("设置光幕接口", "设置光幕信息", "调取参数", setCurtain);
            ApiResponse apiResponse = new ApiResponse();
            bool HandShakeboolOPEN = false;
            bool HandShakeboolCLOSE = false;
            try
            {
                return apiResponse.SuccessResponse();
            }
                Dictionary<string, int> portStatusDict = new Dictionary<string, int>();
                foreach (string DeStateName in setCurtain.Datas)
                {
                    string DeciceCodes = "1003";
                    if (DeStateName.StartsWith("C")) DeciceCodes = "1004";
                    IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == DeciceCodes);
                    if (device == null) return apiResponse.ErrorResponse("WCS未能获取到库口实例");
                    CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
                    DeviceProDTO? HandShake = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == DeStateName && x.DeviceProParamName == "HandShake");
                    if (HandShake == null) return apiResponse.ErrorResponse($"WCS未找到库口:{setCurtain.Datas},对应的协议");
                    DeviceProDTO? Request = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == DeStateName && x.DeviceProParamName == "Request");
                    if (HandShake == null) return apiResponse.ErrorResponse($"WCS未找到库口:{setCurtain.Datas},对应的协议");
                    if (setCurtain.Operate.Equals("OPEN"))
                    {
                        //写入plc,agv退出中打开信号
                        HandShakeboolOPEN =  conveyorLine.Communicator.Write<short>(Request.DeviceProAddress, 0);
                        WriteLog.Write_Log("设置打开光幕接口", "设置打开光幕信息", $"库口名称:【{DeStateName}】,打开光幕信号地址:【{Request.DeviceProAddress}】,读取数据:【{conveyorLine.Communicator.Read<ushort>(Request.DeviceProAddress)}】\n" +
                        $"写入打开光幕信号是否成功返回值:【{HandShakeboolOPEN}】");
                    }
                    else
                    {
                        //写入plc,agv进入关闭光栅信号
                        HandShakeboolCLOSE = conveyorLine.Communicator.Write<short>(HandShake.DeviceProAddress, 1)&& conveyorLine.Communicator.Write<short>(Request.DeviceProAddress, 1);
                        WriteLog.Write_Log("设置关闭光幕接口", "设置关闭光幕接口信息", $"库口名称:【{DeStateName}】,关闭光幕信号地址:【{HandShake.DeviceProAddress}】,读取数据:【{conveyorLine.Communicator.Read<ushort>(HandShake.DeviceProAddress)}】" +
                            $"关闭光幕信号备用地址:【{Request.DeviceProAddress}】,读取数据:【{conveyorLine.Communicator.Read<ushort>(Request.DeviceProAddress)}】\n" +
                        $"写入关闭光幕信号是否成功返回值:【{HandShakeboolCLOSE}】");
                    }
                }
                 if ((HandShakeboolOPEN && setCurtain.Operate.Equals("OPEN") )|| (HandShakeboolCLOSE && setCurtain.Operate.Equals("CLOSE")))
                 {
                    return apiResponse.SuccessResponse();
                 }
                else
                {
                 return apiResponse.ErrorResponse("写入plc进入信号失败");
                }
                }
            catch (Exception ex)
            {
                return apiResponse.ErrorResponse($"WCS任务添加错误,原因:{ex.Message}");
            }
        }
        //agv进出状态反馈
@@ -266,54 +312,83 @@
                //是否可进出
                DeviceProDTO? HandShake = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == agvUpdateRequest.warehousenumber && x.DeviceProParamName == "HandShake");
                if (HandShake == null) return apiResponse.ErrorResponse($"WCS未找到库口:{agvUpdateRequest.warehousenumber},对应的协议");
                if (agvUpdateRequest.agvstatus == 1)
                {
                    //写入plc,agv进入信号
                    bool HandShakebool = conveyorLine.Communicator.Write<short>(HandShake.DeviceProAddress, 1);
                    if (HandShakebool)
                DeviceProDTO? Request = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == agvUpdateRequest.warehousenumber && x.DeviceProParamName == "Request");
                    if (agvUpdateRequest.agvstatus == 1)
                    {
                        //是否可进出    1允许取  2允许放
                        DeviceProDTO? deviceProDTO = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == agvUpdateRequest.warehousenumber && x.DeviceProParamName == "PermitHandShake");
                        //是否有货
                        DeviceProDTO? StationNumProDTO = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == agvUpdateRequest.warehousenumber && x.DeviceProParamName == "StationNum");
                        if (deviceProDTO == null || StationNumProDTO == null) return apiResponse.ErrorResponse($"WCS未找到库口:{agvUpdateRequest.warehousenumber},对应的协议");
                        int statusValue = 0;
                        int portStatus = conveyorLine.Communicator.Read<ushort>(deviceProDTO.DeviceProAddress);
                        int StationStatus = conveyorLine.Communicator.Read<ushort>(StationNumProDTO.DeviceProAddress);
                        //有货,可进信号
                        statusValue = ((portStatus == 1 && StationStatus == 1) || (portStatus == 2 && StationStatus == 0)) ? 1 : (portStatus == 0) ? 0 : 0;
                        if (statusValue == 1)
                        bool HandShakebool = conveyorLine.Communicator.Write<short>(HandShake.DeviceProAddress, 1);
                        if (HandShakebool)
                        {
                        if (Request != null)
                        {
                            conveyorLine.Communicator.Write<short>(Request.DeviceProAddress, 1);
                        }
                            //是否可进出    1允许取  2允许放
                            DeviceProDTO? deviceProDTO = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == agvUpdateRequest.warehousenumber && x.DeviceProParamName == "PermitHandShake");
                            //是否有货
                            DeviceProDTO? StationNumProDTO = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == agvUpdateRequest.warehousenumber && x.DeviceProParamName == "StationNum");
                            if (deviceProDTO == null || StationNumProDTO == null) return apiResponse.ErrorResponse($"WCS未找到库口:{agvUpdateRequest.warehousenumber},对应的协议");
                            int statusValue = 0;
                            int portStatus = conveyorLine.Communicator.Read<ushort>(deviceProDTO.DeviceProAddress);
                            int StationStatus = conveyorLine.Communicator.Read<ushort>(StationNumProDTO.DeviceProAddress);
                            //有货,可进信号
                            statusValue = ((portStatus == 1 && StationStatus == 1) || (portStatus == 2 && StationStatus == 0)) ? 1 : (portStatus == 0) ? 0 : 0;
                            WriteLog.Write_Log("申请进入AGV反馈信号信息", "申请进入AGV反馈信号信息", $"库口编号:【{agvUpdateRequest.warehousenumber}】,是否允许进入地址:【{deviceProDTO.DeviceProAddress}】,读取数据:【{portStatus}】\n" +
                                $"是否有货地址:【{StationNumProDTO.DeviceProAddress}】,读取数据:【{StationStatus}】\n" +
                                $"是否可进入信号:【{statusValue}】");
                            if (agvUpdateRequest.warehousenumber == "G01" || agvUpdateRequest.warehousenumber == "G06" || agvUpdateRequest.warehousenumber == "G07")
                            {
                                if (statusValue == 1)
                                {
                                    return apiResponse.SuccessResponse();
                                }
                                else
                                {
                                    conveyorLine.Communicator.Write<short>(Request.DeviceProAddress, 0);
                                    return apiResponse.ErrorResponse("读取plc不可进入信息");
                                }
                            }
                            else
                            {
                                return apiResponse.SuccessResponse();
                            }
                        }
                        else
                        {
                            return apiResponse.ErrorResponse("写入plc进入信号失败");
                        }
                    }
                    else if (agvUpdateRequest.agvstatus == 2)
                    {
                        //写入输送线信号
                        bool portStatus = conveyorLine.Communicator.Write<short>(HandShake.DeviceProAddress, 0);
                        if (portStatus)
                        {
                            if (Request != null)
                            {
                                conveyorLine.Communicator.Write<short>(Request.DeviceProAddress, 0);
                                WriteLog.Write_Log("申请离开AGV反馈信号信息", "申请离开AGV反馈信号信息", $"库口编号:【{agvUpdateRequest.warehousenumber}】,申请信号地址:【{HandShake.DeviceProAddress}】,读取数据:【{conveyorLine.Communicator.Read<ushort>(HandShake.DeviceProAddress)}】\n" +
                                    $"备用信号地址:【{Request.DeviceProAddress}】,读取数据:【{conveyorLine.Communicator.Read<ushort>(Request.DeviceProAddress)}】");
                            }
                            else
                            {
                                WriteLog.Write_Log("申请离开AGV反馈信号信息", "申请离开AGV反馈信号信息", $"库口编号:【{agvUpdateRequest.warehousenumber}】,申请信号地址:【{HandShake.DeviceProAddress}】,读取数据:【{conveyorLine.Communicator.Read<ushort>(HandShake.DeviceProAddress)}】\n" );
                            }
                            return apiResponse.SuccessResponse();
                        }
                        else
                        {
                            return apiResponse.ErrorResponse("读取plc不可进入信息");
                            return apiResponse.ErrorResponse("写入plc清除信号失败");
                        }
                    }
                    else
                    {
                        return apiResponse.ErrorResponse("写入plc进入信号失败");
                        return apiResponse.ErrorResponse($"agv对应的申请错误,字段:agvstatus,申请的值:{agvUpdateRequest.agvstatus}");
                    }
                }
                else if(agvUpdateRequest.agvstatus == 2)
                {
                    //写入输送线信号
                    bool portStatus = conveyorLine.Communicator.Write<short>(HandShake.DeviceProAddress, 0);
                    if (portStatus)
                    {
                        return apiResponse.SuccessResponse();
                    }
                    else
                    {
                        return apiResponse.ErrorResponse("写入plc清除信号失败");
                    }
                }
                else
                {
                    return apiResponse.ErrorResponse($"agv对应的申请错误,字段:agvstatus,申请的值:{agvUpdateRequest.agvstatus}");
                }
            }
            catch (Exception ex)
            {
@@ -335,17 +410,20 @@
                taskInfo1.taskType = taskType;
                taskInfo1.invType = invType;
                taskInfo1.psd = "akjfapjfpadaoif";
                commandResult = HttpHelper.Post<CommandResult>(urlWMStaskreturn, taskInfo1, "任务状态回调");
                WriteLog.Write_Log("同步给上游反馈任务完成", "任务信息", $"任务号:{taskId}", $"调取参数:{taskInfo1.ToJson()},返回参数:{commandResult.ToJson()}");
                WriteLog.Write_Log("同步给上游反馈任务完成", "任务信息", $"任务号:{taskId}", $"调取参数:{taskInfo1.ToJsonString()},返回参数:{commandResult.ToJsonString()}");
                return commandResult;
            }
            catch (Exception ex)
            {
                Console.WriteLine("调取上游接口错误:原因:"+ex.Message);
                commandResult.status = "error";
                commandResult.result = $"WCS接口错误,原因:{ex.Message}";
                string resujos = $"WCS接口错误,原因:{ex.Message}";
                commandResult.result = resujos.ToJsonString();
                WriteLog.Write_Log("同步给上游反馈任务完成", "任务信息", $"任务号:{taskId}", $"WCS接口错误,原因:{ex.Message}");
                WriteLog.Write_Log("同步给上游反馈任务完成", "任务信息", $"任务号:{taskId}", $"需要上传WMS信息内容:{commandResult.ToJsonString()},WCS接口错误,原因:{ex.Message}");
                return commandResult;
            }
            
@@ -383,7 +461,9 @@
            catch (Exception ex)
            {
                commandResult.status = "error";
                commandResult.result = $"WCS接口错误,原因:{ex.Message}";
                string resujos = $"WCS接口错误,原因:{ex.Message}";
                commandResult.result = resujos.ToJsonString();
                WriteLog.Write_Log("同步给上游设备故障信息", "设备故障信息", $"设备id:{devuuid},失败", $"WCS接口错误,原因:{ex.Message}");
                return commandResult;
@@ -411,7 +491,9 @@
            catch (Exception ex)
            {
                commandResult.status = "error";
                commandResult.result = $"WCS接口错误,原因:{ex.Message}";
                string resujos = $"WCS接口错误,原因:{ex.Message}";
                commandResult.result = resujos.ToJsonString();
                WriteLog.Write_Log("同步给上游提升到位信息", "信息内容", $"错误信息", $"WCS接口错误,原因:{ex.Message}");
                return commandResult;
            }