package com.dy.pipirrComCreator.p206V1; import com.dy.common.mw.protocol.p206V1.parse.global.GlCreate; import com.dy.common.util.ByteUtil; import com.dy.common.util.DateTime; import com.dy.common.util.NumUtil; /** * @Author: liurunyu * @Date: 2025/5/7 11:25 * @Description */ public class P206V1CdA2 extends P206V1Cd { public static final String ComCode = "A2" ; public String checkParams(String ...params){ if(params.length != 9){ return "只有虚拟IC卡编号、剩余金额、水价、用水量(立方)、年、月、日、时、分九个参数" ; } //62090200300400001 if(!NumUtil.isPlusIntNumber(params[0])){ return "虚拟IC卡编号必须是正整数" ; } if(params[0].length() != 17){ return "虚拟IC卡编号必须是17位数字" ; } //2.10 if(!NumUtil.isPlusDoubleNumber(params[1])){ return "剩余金额必须是正数" ; } Integer temp = (Double.valueOf(Double.parseDouble(params[1]) * 100.0D)).intValue() ; if(temp <= 0){ return "剩余金额必须是大于0的正数" ; } if(temp >= 99999999){ return "剩余金额必须是小于999999.99的正数" ; } //1.23 if(!NumUtil.isPlusDoubleNumber(params[2])){ return "水价必须是正数" ; } temp = (Double.valueOf(Double.parseDouble(params[2]) * 100.0D)).intValue() ; if(temp <= 0){ return "水价必须是大于0的正数" ; } if(temp >= 9999){ return "水价必须是小于99.99的正数" ; } if(!NumUtil.isPlusIntNumber(params[3])){ return "用水量必须是正整数" ; } temp = Integer.parseInt(params[3]) ; if(temp <= 0){ return "用水量必须是大于0的正整数" ; } if(temp > 9999){ return "用水量必须是小于9999的正整数" ; } if(!NumUtil.isPlusIntNumber(params[4])){ return "年必须是正整数" ; } int year = Integer.parseInt(params[4]) ; if(year < 2025){ return "年必须是大于等于2025的正整数" ; } if(year > 9999){ return "年必须是小于9999的正整数" ; } if(!NumUtil.isPlusIntNumber(params[5])){ return "月必须是正整数" ; } int month = Integer.parseInt(params[5]) ; if(month <= 0){ return "月必须是大于0的正整数" ; } if(month > 12){ return "月必须是小于12的正整数" ; } if(!NumUtil.isPlusIntNumber(params[6])){ return "日必须是正整数" ; } temp = Integer.parseInt(params[6]) ; if(temp <= 0){ return "日必须是大于0的正整数" ; } if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12){ if(temp > 31){ return "日必须是小于31的正整数" ; } }else if(month == 4 || month == 6 || month == 9 || month == 11){ if(temp > 30){ return "日必须是小于30的正整数" ; } }else if(month == 2){ if(DateTime.isLeapYear(year)){ //润年 if(temp > 29){ return "日必须是小于29的正整数" ; } }else{ if(temp > 28){ return "日必须是小于28的正整数" ; } } } if(!NumUtil.isPlusIntNumber(params[7])){ return "时必须是正整数" ; } temp = Integer.parseInt(params[7]) ; if(temp < 0){ return "时必须是大于等于0的正整数" ; } if(temp >= 24){ return "时必须是小于24的正整数" ; } if(!NumUtil.isPlusIntNumber(params[8])){ return "分钟必须是正整数" ; } temp = Integer.parseInt(params[8]) ; if(temp < 0){ return "分钟必须是大于等于0的正整数" ; } if(temp > 59){ return "分钟必须是小于等于59的正整数" ; } return null ; } public String helpInfo() { return ComCode + " *...*(虚拟IC卡编号) *...*(剩余金额) *...*(水价) *...*(立方水量) ****(年) **(月) **(日) **(时) **(分)[Enter](定量关阀式计划开阀)" ; } /** * 构造命令数据(十六进制) * @return 字符串 * @throws Exception 异常 */ public String hex(String rtuAddr, String ...params) throws Exception { byte[] bytes = bs(rtuAddr, params) ; return ByteUtil.bytes2Hex(bytes, false) ; } /** * 构造命令数据(字节数组) * @return 字节数组 * @throws Exception 异常 */ public byte[] bs(String rtuAddr, String ...params) throws Exception { byte[] bytes = createHead(rtuAddr, ComCode, P206V1Cd.CTRL); byte[] bs = new byte[8] ; GlCreate.createIcCardNo(params[0], bs, 0); bytes = ByteUtil.bytesMerge(bytes, bs) ; bs = new byte[4] ; byte index = 0 ; Integer money = Double.valueOf(Double.parseDouble(params[1]) * 100.0D).intValue() ; byte[] bTemp = ByteUtil.int2BCD_LE(money) ; int bTempLen = bTemp.length ; int count = 0 ; for(int i = 0 ; i < bTempLen; i++){ bs[index++] = bTemp[i] ; count ++ ; if(count >= 4){ break ; } } for(; count < 4; count++){ bs[index++] = 0 ; } bytes = ByteUtil.bytesMerge(bytes, bs) ; bs = new byte[2] ; index = 0 ; Integer price = Double.valueOf(Double.parseDouble(params[2]) * 100.0D).intValue() ; bTemp = ByteUtil.int2BCD_LE(price) ; bTempLen = bTemp.length ; count = 0 ; for(int i = 0 ; i < bTempLen; i++){ bs[index++] = bTemp[i] ; count ++ ; if(count >= 2){ break ; } } for(; count < 2; count++){ bs[index++] = 0 ; } bytes = ByteUtil.bytesMerge(bytes, bs) ; bs = new byte[2] ; index = 0 ; Integer amount = Integer.parseInt(params[3]) ; bTemp = ByteUtil.int2BCD_LE(amount) ; bTempLen = bTemp.length ; count = 0 ; for(int i = 0 ; i < bTempLen; i++){ bs[index++] = bTemp[i] ; count ++ ; if(count >= 2){ break ; } } for(; count < 2; count++){ bs[index++] = 0 ; } bytes = ByteUtil.bytesMerge(bytes, bs) ; bs = new byte[5] ; Integer year = Integer.parseInt(params[4]) ; if(year >= 2024){ year = year - 2000 ; } bs[0] = ByteUtil.int2BCD_LE(Integer.parseInt(params[8]))[0] ; bs[1] = ByteUtil.int2BCD_LE(Integer.parseInt(params[7]))[0] ; bs[2] = ByteUtil.int2BCD_LE(Integer.parseInt(params[6]))[0] ; bs[3] = ByteUtil.int2BCD_LE(Integer.parseInt(params[5]))[0] ; bs[4] = ByteUtil.int2BCD_LE(year)[0] ; bytes = ByteUtil.bytesMerge(bytes, bs) ; GlCreate.createLen(bytes);//长度放字节数组中 byte[] bsTail = GlCreate.createCrcTail4P206(bytes) ;//CRC和尾叠加字节数组中 bytes = ByteUtil.bytesMerge(bytes, bsTail) ; return bytes ; } }