package com.czlis.interfaceCommon.utils; import com.czlis.common.utils.DateUtils; import java.util.Date; import java.util.HashMap; import java.util.Map; public class HaveRegUtils { /** * 许可码有效性校验 * @param company 注册单位 * @param regkey 许可码 * @return 有效返回有效期,无效返回空 */ public static String haveReg(String company, String regkey){ String newkey = regkey.replace("-", ""); String instrsl = RightA(newkey,5); newkey = LeftA(newkey,10); int year = 1990 + Integer.parseInt(RightA(instrsl,2)); int day = Integer.parseInt(LeftA(instrsl,3)); Date expiredate=LisUtil.relativeDateTime(DateUtils.parseDate(year + "/01/01"),day); instrsl =DateUtils.parseDateToStr("yyyyMMdd",expiredate); if(newkey.equals(haveregister(company,instrsl))){ return DateUtils.parseDateToStr("yyyy-MM-dd",expiredate); } return ""; } /** * 根据单位名称+有效期生成许可码 * @param company * @param instrsl * @return */ private static String haveregister(String company,String instrsl){ int ll_len= LisUtil.getGbkByteLength(company); if(ll_len < 8) return ""; String newcompany = company + instrsl; int il_len= LisUtil.getGbkByteLength(newcompany); newcompany = newcompany.toUpperCase(); int[] il_char = LisUtil.getStringAscii(newcompany); long[] il_parm= {0,0,0,0,0,0,0,0}; for (int i = 0; i < il_char.length; i++) { il_parm[1] += il_char[i]; } il_parm[2] = il_parm[1] / il_len; il_parm[7] = il_parm[2]; il_parm[2] = il_parm[1]; il_parm[1] = il_parm[7]; int il_i=3; for (int i = 0; i < il_char.length; i++) { il_parm[il_i] = (int) (il_parm[il_i] + (il_char[i] * il_parm[il_i - 2]) / Math.sqrt(Math.abs(il_parm[il_i - 1]))); } long[] serialnum={0,0,0,0,0}; serialnum[1]=Math.abs(il_parm[il_i]); il_i=4; for (int i = 0; i < il_char.length; i++) { il_parm[il_i] = (int) (il_parm[il_i] + (il_char[i] * il_parm[il_i - 1]) / Math.sqrt(Math.abs(il_parm[il_i - 2]))); } serialnum[2]=Math.abs(il_parm[il_i]); il_i=5; for (int i = 0; i < il_char.length; i++) { il_parm[il_i] = (int) (il_parm[il_i] + il_char[i] * Math.sqrt(Math.abs(il_parm[il_i - 1] * il_parm[il_i - 2]))); } serialnum[3]=Math.abs(il_parm[il_i]); il_i=6; for (int i = 0; i < il_char.length; i++) { il_parm[il_i] = (int) (il_parm[il_i] + Math.log(Math.abs(il_char[i])) * Math.sqrt(Math.abs(il_parm[il_i - 1]) * LisUtil.logten(Math.abs(il_parm[il_i - 2])))); } serialnum[4]=Math.abs(il_parm[il_i]); double com_sum=serialnum[1]+serialnum[2]+serialnum[3]+serialnum[4]; double com_sub=Math.abs(serialnum[2] * serialnum[3] - serialnum[1] * serialnum[4] ); double num1=Math.sqrt(Math.abs( serialnum[1] - serialnum[4] ) * Math.abs( serialnum[2] + serialnum[3] )) * 3412.971; double num2=Math.log( com_sum * com_sub ) * 9134.176; String sn1=RightA(String.format("%05d",(num1+ num2) * 2 - Math.sqrt(Math.abs(num1* num2)) ),5); String sn2=RightA(String.format("%05d", num2 + num1 ),5); String sn=Mid(sn2,2,1) + Mid(sn1,1,1) + Mid(sn1,5,1) + Mid(sn1,4,1) + Mid(sn2,3,1) + Mid(sn1,2,1) + Mid(sn2,1,1) + Mid(sn2,5,1) + Mid(sn2,4,1) + Mid(sn1,3,1); return sn; } /** * 从字符串第Index位开始截取指定长度的字符 * @param str 原始字符串 * @param length 要截取的长度 * @return 截取后的字符串 */ private static String Mid(String str,int Index, int length) { // 处理null和空字符串 if (str == null || str.isEmpty()) { return ""; } // 计算起始索引(第2位对应索引1) int startIndex = Index - 1; // 计算结束索引,确保不超出字符串长度 int endIndex = Math.min(startIndex + length, str.length()); // 如果起始索引已经超出字符串长度,返回空 if (startIndex >= str.length()) { return ""; } return str.substring(startIndex, endIndex); } private static String LeftA(String str,int n) { if (str == null || str.isEmpty()) { return str; } int length = Math.min(str.length(), n); return str.substring(0, length); } private static String RightA(String str, int n) { if (str == null) { return null; } int startIndex = Math.max(0, str.length() - n); return str.substring(startIndex); } // 测试 public static void main(String[] args) { System.out.println(haveReg("石首市人民医院","63325-15429-00060")); } }