package com.whyc.util; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.whyc.constant.CMD_Constant; import com.whyc.dto.Response; import com.whyc.mapper.CustomMapper; import org.springframework.util.ReflectionUtils; import java.lang.reflect.Field; public class OpCmdUtil { /** * 查询操作状态 * @param mapper * @param queryWrapper * @param opCmd 执行的操作输入 * @param ackTimeLimitSecond 最大限制返回时间,单位秒 * @param battIndex 电池组index,可传入[0,1]或者null * @return 对比opCmd的操作输出,是否操作成功或者失败 */ public static Response getOpStatus(CustomMapper mapper, QueryWrapper queryWrapper, Integer opCmd, Integer ackTimeLimitSecond, Integer battIndex) { try { int count = ackTimeLimitSecond * 1000 / 250; for (int i = 0; i < count; i++) { queryWrapper.select("op_cmd"); if(battIndex != null){ queryWrapper.eq("batt_index",battIndex); } queryWrapper.last(" limit 1"); Object obj = mapper.selectOne(queryWrapper); Class clazz = obj.getClass(); Field fieldOpCmdAck = clazz.getDeclaredField("opCmd"); ReflectionUtils.makeAccessible(fieldOpCmdAck); Integer opCmdAck = (Integer) fieldOpCmdAck.get(obj); boolean ackStatus = getAckStatus(opCmd, opCmdAck); if (ackStatus) {//操作成功 return new Response().set(1, true, "更新完成"); } Thread.sleep(250); } return new Response().set(1, false, "设备响应超时,更新失败"); }catch (NoSuchFieldException | IllegalAccessException | InterruptedException e){ return new Response().set(0,e.toString()); } } /** * 读取 * @param mapper * @param queryWrapper * @param opCmd 执行的操作输入 * @param ackTimeLimitSecond 最大限制返回时间,单位秒 * @param battIndex 电池组index,可传入[0,1]或者null * @return */ public static Response readByUpdateOpCmd(CustomMapper mapper, QueryWrapper queryWrapper, Integer opCmd, Integer ackTimeLimitSecond,Integer battIndex) { try { //更新cmd UpdateWrapper update = Wrappers.update(); update.set("op_cmd",opCmd); if(battIndex != null){ update.set("batt_index",battIndex); } mapper.update(null,update); //读取cmd返回 int count = ackTimeLimitSecond * 1000 / 250; QueryWrapper query2 = null; if(battIndex != null){ query2 = queryWrapper.clone(); query2.eq("batt_index",battIndex); } for (int i = 0; i < count; i++) { queryWrapper.select("op_cmd"); if(battIndex != null){ queryWrapper.eq("batt_index",battIndex); } queryWrapper.last(" limit 1"); Object obj = mapper.selectOne(queryWrapper); Class clazz = obj.getClass(); Field fieldOpCmdAck = clazz.getDeclaredField("opCmd"); ReflectionUtils.makeAccessible(fieldOpCmdAck); Integer opCmdAck = (Integer) fieldOpCmdAck.get(obj); boolean ackStatus = getAckStatus(opCmd, opCmdAck); if (ackStatus) {//操作成功 Object data = mapper.selectList(query2).get(0); return new Response().setII(1, true, data,"读取完成"); } Thread.sleep(250); } //Object dataFail = mapper.selectList(query2).get(0); //return new Response().setII(1, false,dataFail, "设备响应超时,读取失败"); return new Response().set(1, false, "设备响应超时,读取失败"); }catch (NoSuchFieldException | IllegalAccessException | InterruptedException e){ return new Response().set(0,e.toString()); } } /** * 持续更新cmd和cmdAck对应关系 * @param opCmd * @param opCmdAck * @return */ private static boolean getAckStatus(Integer opCmd,Integer opCmdAck) { switch (opCmd){ case CMD_Constant.CMD_SetACDCARK_Telemetry:{ return opCmdAck == CMD_Constant.CMD_SetACDCARK_Telemetry_ACK; } case CMD_Constant.CMD_SetACDCARK_Signal:{ return opCmdAck == CMD_Constant.CMD_SetACDCARK_Signal_ACK; } case CMD_Constant.CMD_GetModelParam:{ return opCmdAck ==CMD_Constant.CMD_GetModelParam_ACK ; } case CMD_Constant.CMD_SetModelParam:{ return opCmdAck ==CMD_Constant.CMD_SetModelParam_ACK ; } case CMD_Constant.CMD_SetModelControl:{ return opCmdAck ==CMD_Constant.CMD_SetModelControl_ACK ; } case CMD_Constant.CMD_GetModelControl:{ return opCmdAck ==CMD_Constant.CMD_GetModelControl_ACK ; } case CMD_Constant.CMD_SetBatt1MonData:{ return opCmdAck ==CMD_Constant.CMD_SetBatt1MonData_ACK ; } case CMD_Constant.CMD_SetBatt1GroupData:{ return opCmdAck ==CMD_Constant.CMD_SetBatt1GroupData_ACK ; } case CMD_Constant.CMD_SetBatt2MonData:{ return opCmdAck ==CMD_Constant.CMD_SetBatt2MonData_ACK ; } case CMD_Constant.CMD_SetBatt2GroupData:{ return opCmdAck ==CMD_Constant.CMD_SetBatt2GroupData_ACK ; } case CMD_Constant.CMD_SetBattAlarm:{ return opCmdAck ==CMD_Constant.CMD_SetBattAlarm_ACK ; } case CMD_Constant.CMD_GetBattDisParam:{ return opCmdAck ==CMD_Constant.CMD_GetBattDisParam_ACK ; } case CMD_Constant.CMD_SetBattDisParam:{ return opCmdAck ==CMD_Constant.CMD_SetBattDisParam_ACK ; } case CMD_Constant.CMD_GetDevIP:{ return opCmdAck ==CMD_Constant.CMD_GetDevIP_ACK ; } case CMD_Constant.CMD_SetDevIP:{ return opCmdAck ==CMD_Constant.CMD_SetDevIP_ACK ; } case CMD_Constant.CMD_StartBatt1DisTest:{ return opCmdAck ==CMD_Constant.CMD_StartBatt1DisTest_ACK ; } case CMD_Constant.CMD_StopBatt1DisTest:{ return opCmdAck ==CMD_Constant.CMD_StopBatt1DisTest_ACK ; } case CMD_Constant.CMD_StartBatt2DisTest:{ return opCmdAck ==CMD_Constant.CMD_StartBatt2DisTest_ACK ; } case CMD_Constant.CMD_StopBatt2DisTest:{ return opCmdAck ==CMD_Constant.CMD_StopBatt2DisTest_ACK ; } case CMD_Constant.CMD_StartBatt1ResTest:{ return opCmdAck ==CMD_Constant.CMD_StartBatt1ResTest_ACK ; } case CMD_Constant.CMD_StopBatt1ResTest:{ return opCmdAck ==CMD_Constant.CMD_StopBatt1ResTest_ACK ; } case CMD_Constant.CMD_StartBatt2ResTest:{ return opCmdAck ==CMD_Constant.CMD_StartBatt2ResTest_ACK ; } case CMD_Constant.CMD_StopBatt2ResTest:{ return opCmdAck ==CMD_Constant.CMD_StopBatt2ResTest_ACK ; } case CMD_Constant.CMD_StartDevK1Test:{ return opCmdAck ==CMD_Constant.CMD_StartDevK1Test_ACK ; } case CMD_Constant.CMD_StopDevK1Test:{ return opCmdAck ==CMD_Constant.CMD_StopDevK1Test_ACK ; } case CMD_Constant.CMD_StartDevD1Test:{ return opCmdAck ==CMD_Constant.CMD_StartDevD1Test_ACK ; } case CMD_Constant.CMD_StopDevD1Test:{ return opCmdAck ==CMD_Constant.CMD_StopDevD1Test_ACK ; } case CMD_Constant.CMD_RestartDev:{ return opCmdAck ==CMD_Constant.CMD_RestartDev_ACK ; } case CMD_Constant.CMD_GetAlarmParam:{ return opCmdAck ==CMD_Constant.CMD_GetAlarmParam_ACK ; } case CMD_Constant.CMD_SetAlarmParam:{ return opCmdAck ==CMD_Constant.CMD_SetAlarmParam_ACK ; } case CMD_Constant.CMD_SetBreakerState:{ return opCmdAck ==CMD_Constant.CMD_SetBreakerState_ACK ; } case CMD_Constant.CMD_SetHRSTopBatt:{ return opCmdAck ==CMD_Constant.CMD_SetHRSTopBatt_ACK ; } case CMD_Constant.CMD_SetHRSTopState:{ return opCmdAck ==CMD_Constant.CMD_SetHRSTopState_ACK ; } case CMD_Constant.CMD_SetHRSTopAlm:{ return opCmdAck ==CMD_Constant.CMD_SetHRSTopAlm_ACK ; } default: return false; } } }