從本質上講,工商營業執照號碼和統一社會信用代碼是兩套完全不一樣的編碼規則,識別結果也僅有行政區劃部分為兩者共有,但因為這兩種編碼同時存在的原因,所以如果需要在系統中唯一標誌一家企業時,還是可以通過工商營業執照號碼或統一社會信用代碼來進行識別。 工商營業執照號碼長度按工商規定為15位,統一社會信用代碼 ...
從本質上講,工商營業執照號碼和統一社會信用代碼是兩套完全不一樣的編碼規則,識別結果也僅有行政區劃部分為兩者共有,但因為這兩種編碼同時存在的原因,所以如果需要在系統中唯一標誌一家企業時,還是可以通過工商營業執照號碼或統一社會信用代碼來進行識別。
工商營業執照號碼長度按工商規定為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());