組織機構コードと統一社会信用コード検証規則およびjava検証ツールクラス

13236 ワード

組織機構コード
符号化規則編集1.全国組織機構コードは、8桁の数字(または大文字のラテン文字)本体コードと1桁の数字(または大文字のラテン文字)チェックコードから構成されています.本体コードは、シリーズ(すなわちセグメント)シーケンス符号化方法を採用する.チェックコードは、C 9=11-MOD(ΣCi(i=1→8)の式で計算される.×Wi,11)式中:MOD--余関数を求めることを表す;i——コード文字の左から右までの位置番号を表す.Ci-i番目のビットのコード文字を表す値(具体的なコード文字は付表を参照).C 9——検査コードを表す.Wi-i位の重み付け係数を表し、その数値は以下の表を参照する:C 9の値が10の場合、チェックコードは大文字のアルファベットXで表される.C 9の値が11の場合、チェックコードは0で表される.2.コードの表示形式は手動で識別しやすいため、1つのハイフン"—"を使用して本体コードと検査コードを分離しなければならない.機械で読むときは、ハイフンは省略します.表示形式为:xxxxxxxx—X 3.カスタムエリアは各システム管理上の特殊な需要を満たすため、本体コードPDY 00001からPDY 999999をカスタムエリアと規定し、各システムが内部組織機構コードを編成して使用する.カスタムゾーン内で作成された組織機構コードは、システム間の情報交換の根拠とはなりません.
統一社会信用コード
構成特徴編集1は,組織機構コードを主体識別コードとして埋め込んでいる.組織機構コードの一意性により、社会信用コードが再コードされないことを確保します.言い換えれば、組織機構コードの唯一性は、統一社会信用コードに完璧な「遺伝」を与える.二つ目は、組織機構コードの前に行政区画コードを追加することであり、この組み合わせが税務登録証番号であることを発見するのは難しくない.これにより、統一社会コードの互換性が向上し、移行期間中に税務機関はこのネスト規則を利用して新しい信用コードシステムにより容易にアップグレードすることができる.三つ目は、上位2位を登録機関と機構のカテゴリに残すことであり、このように統一社会信用コードは応用の中でより明確で効率的であり、第1位は登録機関の管理に便利であり、検索項目とすることができ、第2位は組織機構に正確に分類することができ、細分化管理を容易にする.4つ目は、社会信用コードを統一する主体識別コードが生まれつき持つ大容量である.デジタルアルファベットの組み合わせに加え、指数級の増加により、長い間、昇進を必要とせずに多くの組織機構を収容できることを確保することができます.五、統一社会信用コードの桁数は18位で、身分証明書の桁数と同じで、この巧みな設計は未来の「2コード管2人」の応用の中で登録、検索、記入表などの統一を実現することができる.六、統一社会信用コードに組み込まれた主体識別コードは検査ビットを有し、同時に自身の第18位も検査ビットであり、身分証明書番号と比較して二重検査であり、番号の正確性を確保した.
JAva検証ツールクラス
package ;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

/**
 * 
 *       /             
 * 
 * 1.isUniformSocialCreditCode                  
 * 2.isOrganizationCertificate                
 * 
 * 
 *  
 */

public class RegexUtil {
	private static final String BASE_CODE_STRING = "0123456789ABCDEFGHJKLMNPQRTUWXY";
    private static final char[] BASE_CODE_ARRAY = BASE_CODE_STRING.toCharArray();
    private static final List<Character> BASE_CODES = new ArrayList<Character>();
    private static final String BASE_CODE_REGEX = "[" + BASE_CODE_STRING + "]{18}";
    private static final int[] WEIGHT = {1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28};

    static {
        for (char c : BASE_CODE_ARRAY) {
            BASE_CODES.add(c);
        }
    }
	
    /**
     *     
     */
    private static int power[] = {3,7,9,10,5,8,4,2};
    /**
     *               
     * @param a
     * @param b
     * @return
     */
	public static boolean isUniformSocialCreditCode(String socialCreditCode) {
		if (StringUtils.isBlank(socialCreditCode) || !Pattern.matches(BASE_CODE_REGEX, socialCreditCode)) {
            return false;
        }
        char[] businessCodeArray = socialCreditCode.toCharArray();
        char check = businessCodeArray[17];
        int sum = 0;
        for (int i = 0; i < 17; i++) {
            char key = businessCodeArray[i];
            sum += (BASE_CODES.indexOf(key) * WEIGHT[i]);
        }
        int value = 31 - sum % 31;
        return check == BASE_CODE_ARRAY[value % 31];
    }
    /**
     *             
     * @param organizationCertificate
     * @return
     */
    public static boolean isOrganizationCertificate(String organizationCertificate) {
        String temp = organizationCertificate.toUpperCase();
        if (temp.contains("-")) {
            temp = temp.replace("-", "");
        }
        if(temp.length()!=9){
            return false;
        }
        //     8 
        String pre8 = temp.substring(0,8);
        char[] pre8chars = pre8.toCharArray();// 0~z;
        //      
        String code = temp.substring(8,9);
        boolean isCode = isCode(code,sum(pre8chars));
        return isCode;
    }
 
    /**
     *   
     * @param bit
     * @return
     */
    private static int sum(char[] bit){
        int sum = 0;
        for(int i=0;i<bit.length;i++){
            int intTemp = bit[i]>'9'?(bit[i]-'A'+10):Integer.parseInt(bit[i]+"");
            System.out.print(" "+intTemp);
            sum +=intTemp*power[i];
        }
        return  sum;
    }
 
    /**
     *                       
     * @param a
     * @param b
     * @return
     */
    private static boolean isCode(String a,int b){
        String codeTEmp = (11- b%11)==10?"X":(11- b%11)==11?0+"":(11- b%11)+"";
        return a.equals(codeTEmp);
    }
    
}