125 lines
4.9 KiB
Java
125 lines
4.9 KiB
Java
|
|
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"));
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|