【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; } }
RegistrationNo15ValidationResult
在RegistrationNoValidationResult
的基礎上額外包含了工商營業執照專有的識別資訊,你可以通過該部分得知該企業是內資企業、外資企業還是個體戶
。
/// <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
可自動識別待識別號碼究竟為工商營業執照號碼還是社會統一信用程式碼,當然因為有可能待識別號碼哪種號碼都不是,所以最終識別結果可能為RegistrationNoValidationResult
、RegistrationNo15ValidationResult
和RegistrationNo18ValidationResult
中的某一種。
最後是簡單的使用示例
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());