【NumberValidators】工商營業執照號碼和統一社會信用代碼驗證


從本質上講,工商營業執照號碼和統一社會信用代碼是兩套完全不一樣的編碼規則,識別結果也僅有行政區划部分為兩者共有,但因為這兩種編碼同時存在的原因,所以如果需要在系統中唯一標志一家企業時,還是可以通過工商營業執照號碼或統一社會信用代碼來進行識別。

工商營業執照號碼長度按工商規定為15位,統一社會信用代碼按國家規定是18位,你可以在此類庫的驗證基礎上,通過其它網站(比如企查查)來進一步查驗企業是否真實存在。

NumberValidators中,該部分驗證相關的內容均在NumberValidators.BusinessRegistrationNos下,你可以在此處查看具體源代碼。

IRegistrationNoValidator約定了要實現的驗證的規范。

    /// <summary>
    /// 工商注冊碼/統一社會信用代碼驗證接口
    /// </summary>
    public interface IRegistrationNoValidator<out TResult> : IValidator<TResult>
        where TResult : RegistrationNoValidationResult, new()
    {
        /// <summary>
        /// 用於驗證的行政區划字典數據
        /// </summary>
        IValidationDictionary<int, string> Dictionary { get; set; }
        /// <summary>
        /// 號碼長度
        /// </summary>
        RegistrationNoLength RegistrationNoLength { get; }
        /// <summary>
        /// 驗證號碼是否正確
        /// </summary>
        /// <param name="code">待驗證的工商注冊碼/統一社會信用代碼</param>
        /// <param name="validLimit">行政區划驗證限制,因為存在工商管理機構代碼,所以默認為null</param>
        /// <returns></returns>
        TResult Validate(string code, AreaValidLimit? validLimit = null);
    }

驗證結果定義如下:

  • RegistrationNoValidationResult 默認驗證結果類
  • RegistrationNo15ValidationResult 工商營業執照特有的驗證結果類
  • RegistrationNo18ValidationResult 統一社會信用代碼特有的驗證結果類

RegistrationNoValidationResult代碼如下

    /// <summary>
    /// 注冊碼通用驗證結果類
    /// </summary>
    public class RegistrationNoValidationResult : ValidationResult
    {
        /// <summary>
        /// 行政區划或工商行政管理機關編碼
        /// </summary>
        public int AreaNumber { get; internal set; }
        /// <summary>
        /// 身份證頒發行政區域或工商行政管理機關(識別出Depth最深的區域),可通過FullName來獲取完整的名稱
        /// 注意此處有可能為null
        /// </summary>
        public Area RecognizableArea { get; internal set; }
        /// <summary>
        /// 號碼長度
        /// </summary>
        public RegistrationNoLength RegistrationNoLength { get; internal set; }
        /// <summary>
        /// 校驗碼
        /// </summary>
        public char CheckBit { get; internal set; }
    }

RegistrationNo15ValidationResultRegistrationNoValidationResult的基礎上額外包含了工商營業執照專有的識別信息,你可以通過該部分得知該企業是內資企業、外資企業還是個體戶

   /// <summary>
    /// 工商行政管理市場主體注冊號 專用驗證結果類
    /// </summary>
    public class RegistrationNo15ValidationResult : RegistrationNoValidationResult
    {
        /// <summary>
        /// 順序碼
        /// </summary>
        public int SequenceNumber { get; internal set; }
        /// <summary>
        /// 企業類型
        /// </summary>
        public EnterpriseType EnterpriseType
        {
            get
            {
                var comp = this.SequenceNumber / 10000000;
                if (comp <= (int)EnterpriseType.Domestic)
                {
                    return EnterpriseType.Domestic;
                }
                else if (comp <= (int)EnterpriseType.Foreign)
                {
                    return EnterpriseType.Foreign;
                }
                else { return EnterpriseType.Individual; }
            }
        }
    }

RegistrationNo18ValidationResult則是在RegistrationNoValidationResult的基礎上額外包含了社會統一信用代碼的專有信息,你可以通過該部分信息得知其登記管理部門,以及其組織機構代碼

    /// <summary>
    /// 法人和其他組織統一社會信用代碼 專用驗證結果類
    /// </summary>
    public class RegistrationNo18ValidationResult : RegistrationNoValidationResult
    {
        /// <summary>
        /// 登記管理部門代碼標志
        /// </summary>
        public ManagementCode ManagementCode { get; internal set; }
        /// <summary>
        /// 登記管理部門下機構類別代碼標志
        /// </summary>
        public ManagementKindCode ManagementKindCode { get; internal set; } = ManagementKindCode.NonSpecific;
        /// <summary>
        /// 組織機構代碼,遵循GB/T 11714-1997
        /// </summary>
        public string OrganizationCode { get; internal set; }
    }

可根據IsValid來判斷驗證是否成功,如果驗證失敗,Errors 屬性則包含了驗證失敗的原因,具體的錯誤原因列表如下

    /// <summary>
    /// 錯誤提示信息類
    /// </summary>
    internal class ErrorMessage
    {
        /// <summary>
        /// 字符串為空
        /// </summary>
        public const string Empty = "工商注冊碼/統一社會信用代碼為空";
        /// <summary>
        /// 號碼錯誤
        /// </summary>
        public const string Error = "錯誤的工商注冊碼/統一社會信用代碼";
        /// <summary>
        /// 無效的登記管理部門代碼
        /// </summary>
        public const string InvalidManagement = "無效的登記管理部門代碼";
        /// <summary>
        /// 無效的登記管理部門機構類別代碼
        /// </summary>
        public const string InvalidManagementKind = "無效的登記管理部門機構類別代碼";
        /// <summary>
        /// 無效的組織機構代碼
        /// </summary>
        public const string InvalidOrganizationCode = "無效的組織機構代碼";
        /// <summary>
        /// 行政區划識別失敗
        /// </summary>
        public const string InvalidArea = "工商管理機關或行政區划識別失敗";
        /// <summary>
        /// 錯誤的校驗碼
        /// </summary>
        public const string InvalidCheckBit = "錯誤的校驗碼";
        /// <summary>
        /// 無效實現
        /// </summary>
        public const string InvalidImplement = "未能找到或無效的 {0} 位工商注冊碼/統一社會信用代碼實現";
        /// <summary>
        /// 長度錯誤
        /// </summary>
        public const string LengthOutOfRange = "工商注冊碼/統一社會信用代碼非 {0} 位";
    }

同其它驗證類一致,RegistrationNoValidatorHelper可自動識別待識別號碼究竟為工商營業執照號碼還是社會統一信用代碼,當然因為有可能待識別號碼哪種號碼都不是,所以最終識別結果可能為RegistrationNoValidationResultRegistrationNo15ValidationResultRegistrationNo18ValidationResult中的某一種。

最后是簡單的使用示例

            Console.WriteLine("***工商注冊碼/統一社會信用代碼***");
            string[] rnArr = { "110108000000016", "91320621MA1MRHG205" };
            foreach (var rn in rnArr)
            {
                var valid = RegistrationNoValidatorHelper.Validate(rn, validLimit: null);
                Console.WriteLine("{0}驗證結果:{1} 長度{2} 行政區划名稱({3}) 驗證結果類型:{4}", rn, valid.IsValid, valid.RegistrationNoLength, valid.RecognizableArea.FullName, valid);
            }
            Console.WriteLine("隨機的工商注冊碼:" + new RegistrationNo15Validator().GenerateRandomNumber());
            Console.WriteLine("隨機的統一社會信用代碼:" + new RegistrationNo18Validator().GenerateRandomNumber());


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM