| 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 ; | 
|     } | 
|   | 
| } |