模拟统一社会信用代码(符合规范) python

统一社会信用代码规则:

https://zh.wikisource.org/zh-hans/GB_32100-2015_%E6%B3%95%E4%BA%BA%E5%92%8C%E5%85%B6%E4%BB%96%E7%BB%84%E7%BB%87%E7%BB%9F%E4%B8%80%E7%A4%BE%E4%BC%9A%E4%BF%A1%E7%94%A8%E4%BB%A3%E7%A0%81%E7%BC%96%E7%A0%81%E8%A7%84%E5%88%99

组织机构代码规则:

https://zh.wikisource.org/zh-hans/GB_11714-1997_%E5%85%A8%E5%9B%BD%E7%BB%84%E7%BB%87%E6%9C%BA%E6%9E%84%E4%BB%A3%E7%A0%81%E7%BC%96%E5%88%B6%E8%A7%84%E5%88%99

class Social(object):
    '''
    统一社会信用代码 + 组织结构代码校验
    '''

    def __init__(self):
        '''
        Constructor
        '''
        # 统一社会信用代码中不使用I,O,S,V,Z
        # ''.join([str(i) for i in range(10)])
        # import string
        # string.ascii_uppercase  # ascii_lowercase |  ascii_letters
        # dict([i for i in zip(list(self.string), range(len(self.string)))])
        # dict(enumerate(self.string))
        # list(d.keys())[list(d.values()).index(10)]
        # chr(97)  --> 'a'
        self.string1 = '0123456789ABCDEFGHJKLMNPQRTUWXY'
        self.SOCIAL_CREDIT_CHECK_CODE_DICT = {
            '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
            'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17,
            'J': 18, 'K': 19, 'L': 20, 'M': 21, 'N': 22, 'P': 23, 'Q': 24,
            'R': 25, 'T': 26, 'U': 27, 'W': 28, 'X': 29, 'Y': 30}
        # 第i位置上的加权因子
        self.social_credit_weighting_factor = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]

        # GB11714-1997全国组织机构代码编制规则中代码字符集
        self.string2 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        self.ORGANIZATION_CHECK_CODE_DICT = {
            '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
            'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17, 'I': 18,
            'J': 19, 'K': 20, 'L': 21, 'M': 22, 'N': 23, 'O': 24, 'P': 25, 'Q': 26,
            'R': 27, 'S': 28, 'T': 29, 'U': 30, 'V': 31, 'W': 32, 'X': 33, 'Y': 34, 'Z': 35}
        # 第i位置上的加权因子
        self.organization_weighting_factor = [3, 7, 9, 10, 5, 8, 4, 2]

    def gen_check_code(self, weighting_factor, ontology_code, modulus, check_code_dict):
        '''
        @param weighting_factor: 加权因子
        @param ontology_code:本体代码
        @param modulus:  模数(求余用)
        @param check_code_dict: 字符字典
        '''
        total = 0
        for i in range(len(ontology_code)-1):
            if ontology_code[i].isdigit():
                # print(ontology_code[i], weighting_factor[i])
                total += int(ontology_code[i]) * weighting_factor[i]
            else:
                num = check_code_dict.get(ontology_code[i], -1)
                if num < 0:
                    return -1
                total += num * weighting_factor[i]
        diff = modulus - total % modulus
        return diff
def unified_social_credit_code():
    """统一社会信用代码"""
    
    department = "123456789999999999999999"  # 登记管理部门代码
    agency = "11111111111111112121212345999"  # 机构类别
    organization_num = str(random.randint(11111111, 99999999))
    u = Social()
    # 组织机构代码校验位
    check_code = u.gen_check_code(u.organization_weighting_factor, organization_num, 11, u.ORGANIZATION_CHECK_CODE_DICT)
    organization_code = organization_num + str(check_code)  # 组织机构代码
    address_code = get_address(True)
    # 没有校验码的社会统一代码
    un_code = random.choice(department) + random.choice(agency) + str(address_code) + organization_code
    # 社会 校验位
    social_num = u.gen_check_code(u.social_credit_weighting_factor, un_code, 31, u.SOCIAL_CREDIT_CHECK_CODE_DICT)
    if social_num == 31:
        social_num = 0
    social_dict = {value: key for key, value in u.SOCIAL_CREDIT_CHECK_CODE_DICT.items()}
    # 两位证书 转换成 协议里面的值
    social_key = social_dict[social_num]
    code = un_code + social_key
    return code

这样 就生成了 符合 规范的 统一社会信用代码

def get_address(code=False, random_switch=True, all_info=False, **kwargs):
    """

    :param code: 只返回 地区码
    :param random_switch: 自定义区域 然后随机地区
    :param kwargs: province_num = 省 city_info = 市 district_info = 区
    :return: code False 省市区 code True 地区吗
    """
    import json
    with open(test_report_path() + "\\address.json", 'r', encoding='UTF-8') as file:
        info = json.load(file)
    i = 0
    province_num = None
    city_info = None
    district_info = None
    error_num = 0
    while True:
        try:
            if random_switch:
                province_num = random.randint(0, len(info) - 1)
            else:
                for address_info in info:

                    if kwargs['province_name'] == address_info['name']:
                        province_num = i
                        break
                    i += 1
            province_date = info[province_num]

            province_name = province_date['name']
            if 'city_name' in kwargs.keys():
                for city in province_date['child']:
                    if city['name'] == kwargs['city_name']:
                        city_info = city
                        break
                city_name = kwargs['city_name']
            else:
                city_info = random.choice(province_date['child'])
                city_name = city_info['name']

            if 'district_name' in kwargs.keys():
                for district in city_info['child']:
                    if district['name'] == kwargs['district_name']:
                        district_info = district
            else:
                district_info = random.choice(city_info['child'])
            district_name = district_info['name'].replace(' ', '')
            if code and not all_info:
                return district_info['code']
            elif code and all_info:
                return province_name, city_name, district_name, district_info['code']
            else:
                return province_name, city_name, district_name
        except Exception as e:
            error_num += 1
            if error_num >= 3:
                raise Exception(e)

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值