2025-09-17 18:50:28 +08:00

125 lines
4.9 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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