中介新增 修改接口

This commit is contained in:
wkc
2026-01-29 22:03:42 +08:00
parent 1b043fa2d6
commit ac4e02e8c5
214 changed files with 9397 additions and 671 deletions

View File

@@ -0,0 +1,192 @@
import openpyxl
from openpyxl import Workbook
import random
from datetime import datetime, timedelta
# 机构名称前缀
org_prefixes = [
"北京", "上海", "广州", "深圳", "杭州", "成都", "重庆", "武汉", "西安", "南京",
"天津", "苏州", "长沙", "郑州", "东莞", "青岛", "沈阳", "宁波", "厦门", "佛山"
]
# 机构类型关键词
org_types = [
"投资咨询", "资产管理", "证券投资", "基金管理", "股权投资",
"财富管理", "金融信息服务", "商务咨询", "企业咨询", "投资顾问"
]
# 机构后缀
org_suffixes = ["有限公司", "股份有限公司", "集团", "企业", "事务所"]
# 主体类型
entity_types = ["企业", "事业单位", "社会组织"]
# 企业性质
corp_natures = [
"有限责任公司", "股份有限公司", "国有独资", "集体企业",
"私营企业", "中外合资", "外商独资", "港澳台合资"
]
# 行业分类
industry_classes = ["金融业", "商务服务业", "科学研究和技术服务业"]
# 所属行业
industries = [
"货币金融服务", "资本市场服务", "保险业", "其他金融业",
"企业管理服务", "法律服务", "咨询与调查", "广告业",
"研究和试验发展", "专业技术服务业", "科技推广和应用服务业"
]
# 证件类型
id_types = ["身份证", "护照", "其他"]
# 统一社会信用代码生成18位
def generate_credit_code():
area_code = f"{random.randint(110000, 659900):06d}"
org_code = ''.join([str(random.randint(0, 9)) for _ in range(9)])
check_code = random.randint(0, 9)
return f"{area_code}{org_code}{check_code}"
# 生成法定代表人姓名
def generate_person_name():
surnames = ["", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", ""]
names1 = ["", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "秀英", "", ""]
names2 = ["", "", "", "", "", "", "", "", "", ""]
return random.choice(surnames) + random.choice(names1) + random.choice(names2)
# 生成身份证号18位
def generate_id_card():
# 地区码(6位) + 出生日期(8位) + 顺序码(3位) + 校验码(1位)
area_code = f"{random.randint(110000, 659900):06d}"
year = random.randint(1960, 1995)
month = f"{random.randint(1, 12):02d}"
day = f"{random.randint(1, 28):02d}"
birth_date = f"{year}{month}{day}"
sequence = f"{random.randint(1, 999):03d}"
check_code = random.randint(0, 9)
return f"{area_code}{birth_date}{sequence}{check_code}"
# 生成注册地址
def generate_address():
districts = ["朝阳区", "海淀区", "西城区", "东城区", "丰台区",
"浦东新区", "黄浦区", "静安区", "徐汇区", "天河区",
"福田区", "南山区", "罗湖区", "西湖区", "江干区"]
streets = ["建设路", "人民路", "解放路", "和平路", "文化路",
"科技路", "创新路", "发展路", "创业路", "工业路"]
buildings = ["大厦", "中心", "广场", "写字楼", "科技园"]
return f"{random.choice(districts)}{random.choice(streets)}{random.randint(1,999)}{random.choice(buildings)}"
# 生成成立日期
def generate_establish_date():
start_date = datetime(2000, 1, 1)
end_date = datetime(2024, 12, 31)
days_between = (end_date - start_date).days
random_days = random.randint(0, days_between)
return (start_date + timedelta(days=random_days)).strftime("%Y-%m-%d")
# 生成股东名称
def generate_shareholder():
types = [
lambda: f"{random.choice(org_prefixes)}{random.choice(['投资', '资本', '控股', '集团'])}有限公司",
lambda: generate_person_name() + random.choice(["", "(自然人)"])
]
return random.choice(types)()
# 生成备注
def generate_remark():
remarks = [
"", "", "", "",
"重点监控", "已整改", "存在风险", "待核查"
]
return random.choice(remarks)
# 生成单条机构数据
def generate_org_data(index):
# 随机决定有几个股东1-5个
shareholder_count = random.randint(1, 5)
shareholders = [generate_shareholder() for _ in range(shareholder_count)]
# 补齐到5个
while len(shareholders) < 5:
shareholders.append("")
# 证件类型
id_type = random.choice(id_types)
id_card = generate_id_card() if id_type == "身份证" else f"{random.choice(['A', 'B', 'C'])}{random.randint(10000, 99999)}"
return {
"id": index,
"orgName": f"{random.choice(org_prefixes)}{random.choice(org_types)}{random.choice(org_suffixes)}",
"creditCode": generate_credit_code(),
"entityType": random.choice(entity_types),
"corpNature": random.choice(corp_natures) if random.choice([True, False]) else "",
"industryClass": random.choice(industry_classes),
"industry": random.choice(industries),
"establishDate": generate_establish_date(),
"regAddress": generate_address(),
"legalRep": generate_person_name(),
"legalRepIdType": id_type,
"legalRepIdNo": id_card,
"shareholder1": shareholders[0],
"shareholder2": shareholders[1],
"shareholder3": shareholders[2],
"shareholder4": shareholders[3],
"shareholder5": shareholders[4],
"remark": generate_remark()
}
# 生成数据并保存到Excel
def generate_org_test_data(filename, count=1000, start_id=1):
# 读取模板获取表头
template_path = "机构中介黑名单模板_1769674571626.xlsx"
template_wb = openpyxl.load_workbook(template_path)
template_ws = template_wb.active
# 创建新工作簿
wb = Workbook()
ws = wb.active
ws.title = "机构中介黑名单"
# 复制表头
for cell in template_ws[1]:
new_cell = ws.cell(row=1, column=cell.column, value=cell.value)
# 生成数据
data_list = []
for i in range(count):
data = generate_org_data(start_id + i)
data_list.append(data)
# 按照模板列顺序写入数据
# 列顺序:机构名称、统一社会信用代码、主体类型、企业性质、行业分类、所属行业、
# 成立日期、注册地址、法定代表人、法定代表人证件类型、法定代表人证件号码、
# 股东1、股东2、股东3、股东4、股东5、备注
for row_idx, data in enumerate(data_list, start=2):
ws.cell(row=row_idx, column=1, value=data["orgName"])
ws.cell(row=row_idx, column=2, value=data["creditCode"])
ws.cell(row=row_idx, column=3, value=data["entityType"])
ws.cell(row=row_idx, column=4, value=data["corpNature"])
ws.cell(row=row_idx, column=5, value=data["industryClass"])
ws.cell(row=row_idx, column=6, value=data["industry"])
ws.cell(row=row_idx, column=7, value=data["establishDate"])
ws.cell(row=row_idx, column=8, value=data["regAddress"])
ws.cell(row=row_idx, column=9, value=data["legalRep"])
ws.cell(row=row_idx, column=10, value=data["legalRepIdType"])
ws.cell(row=row_idx, column=11, value=data["legalRepIdNo"])
ws.cell(row=row_idx, column=12, value=data["shareholder1"])
ws.cell(row=row_idx, column=13, value=data["shareholder2"])
ws.cell(row=row_idx, column=14, value=data["shareholder3"])
ws.cell(row=row_idx, column=15, value=data["shareholder4"])
ws.cell(row=row_idx, column=16, value=data["shareholder5"])
ws.cell(row=row_idx, column=17, value=data["remark"])
# 保存文件
wb.save(filename)
print(f"已生成文件: {filename}")
if __name__ == "__main__":
print("开始生成机构中介黑名单测试数据...")
generate_org_test_data("机构中介黑名单测试数据_1000条.xlsx", 1000, 1)
generate_org_test_data("机构中介黑名单测试数据_1000条_第2批.xlsx", 1000, 1001)
print("完成!")

View File

@@ -0,0 +1,268 @@
"""
中介黑名单导入功能测试脚本
测试目标:
1. 验证机构中介导入时 certificate_no 字段不能为 null 的修复
2. 验证个人中介导入功能正常
3. 验证更新模式功能正常
测试数据准备:
- 个人中介2条记录
- 机构中介2条记录
"""
import requests
import json
from datetime import datetime
BASE_URL = "http://localhost:8080"
def login():
"""登录并获取token"""
url = f"{BASE_URL}/login/test"
data = {
"username": "admin",
"password": "admin123"
}
response = requests.post(url, json=data)
if response.status_code == 200:
result = response.json()
if result.get("code") == 200:
token = result.get("token")
print(f"✓ 登录成功获取token: {token[:20]}...")
return token
print(f"✗ 登录失败: {response.text}")
return None
def get_headers(token):
"""获取请求头"""
return {
"Authorization": f"Bearer {token}"
}
def test_import_person_intermediary(token):
"""测试个人中介导入"""
print("\n" + "="*60)
print("测试1: 个人中介导入功能")
print("="*60)
# 准备个人中介数据直接通过API调用测试
url = f"{BASE_URL}/dpc/intermediary"
headers = get_headers(token)
headers["Content-Type"] = "application/json"
person_data = {
"name": "测试个人中介",
"certificateNo": "110101199001011234",
"intermediaryType": "1",
"status": "0",
"remark": "测试个人中介导入",
"indivType": "中介",
"indivSubType": "本人",
"indivGender": "M",
"indivCertType": "身份证",
"indivPhone": "13800138000",
"indivWechat": "test_wx_id",
"indivAddress": "北京市朝阳区",
"indivCompany": "测试公司",
"indivPosition": "经纪人"
}
response = requests.post(url, json=person_data, headers=headers)
if response.status_code == 200:
result = response.json()
if result.get("code") == 200:
print("✓ 个人中介导入成功")
return True
else:
print(f"✗ 个人中介导入失败: {result.get('msg')}")
return False
else:
print(f"✗ 个人中介导入请求失败: {response.status_code} - {response.text}")
return False
def test_import_entity_intermediary(token):
"""测试机构中介导入"""
print("\n" + "="*60)
print("测试2: 机构中介导入功能")
print("="*60)
# 准备机构中介数据
url = f"{BASE_URL}/dpc/intermediary"
headers = get_headers(token)
headers["Content-Type"] = "application/json"
entity_data = {
"name": "测试机构中介有限公司",
"certificateNo": "91110108MA0000001A", # 统一社会信用代码
"intermediaryType": "2",
"status": "0",
"remark": "测试机构中介导入",
"corpCreditCode": "91110108MA0000001A",
"corpType": "有限责任公司",
"corpNature": "民营企业",
"corpIndustryCategory": "房地产业",
"corpIndustry": "房地产中介服务",
"corpEstablishDate": "2020-01-01",
"corpAddress": "北京市海淀区",
"corpLegalRep": "张三",
"corpLegalCertType": "身份证",
"corpLegalCertNo": "110101199001011235",
"corpShareholder1": "李四",
"corpShareholder2": "王五"
}
response = requests.post(url, json=entity_data, headers=headers)
if response.status_code == 200:
result = response.json()
if result.get("code") == 200:
print("✓ 机构中介导入成功")
print(f" - 机构名称: {entity_data['name']}")
print(f" - 统一社会信用代码: {entity_data['corpCreditCode']}")
print(f" - 证件号字段: {entity_data['certificateNo']}")
return True
else:
print(f"✗ 机构中介导入失败: {result.get('msg')}")
return False
else:
print(f"✗ 机构中介导入请求失败: {response.status_code} - {response.text}")
return False
def test_import_entity_without_credit_code(token):
"""测试机构中介导入时统一社会信用代码为空的情况"""
print("\n" + "="*60)
print("测试4: 机构中介导入时统一社会信用代码为空(应该失败)")
print("="*60)
url = f"{BASE_URL}/dpc/intermediary"
headers = get_headers(token)
headers["Content-Type"] = "application/json"
# 故意不提供统一社会信用代码
entity_data = {
"name": "测试机构中介有限公司(无信用代码)",
"certificateNo": "", # 空字符串
"intermediaryType": "2",
"status": "0",
"remark": "测试统一社会信用代码为空的情况",
"corpCreditCode": "", # 空字符串
"corpType": "有限责任公司"
}
response = requests.post(url, json=entity_data, headers=headers)
if response.status_code == 200:
result = response.json()
if result.get("code") != 200:
# 预期失败
print(f"✓ 预期行为:导入被拒绝,错误信息: {result.get('msg')}")
return True
else:
# 不应该成功
print(f"✗ 测试失败:统一社会信用代码为空时不应该导入成功")
return False
else:
print(f"✗ 请求失败: {response.status_code} - {response.text}")
return False
def test_query_intermediary_list(token):
"""测试查询中介列表"""
print("\n" + "="*60)
print("测试3: 查询中介列表")
print("="*60)
url = f"{BASE_URL}/dpc/intermediary/list"
headers = get_headers(token)
params = {
"pageNum": 1,
"pageSize": 10
}
response = requests.get(url, params=params, headers=headers)
if response.status_code == 200:
result = response.json()
if result.get("code") == 200:
rows = result.get("rows", [])
total = result.get("total", 0)
print(f"✓ 查询成功,共 {total} 条记录")
for item in rows:
print(f" - {item['name']} ({item.get('intermediaryTypeName', '未知')}) - 证件号: {item.get('certificateNo', '')}")
return True
else:
print(f"✗ 查询失败: {result.get('msg')}")
return False
else:
print(f"✗ 查询请求失败: {response.status_code} - {response.text}")
return False
def generate_test_report(results):
"""生成测试报告"""
print("\n" + "="*60)
print("测试报告")
print("="*60)
total_tests = len(results)
passed_tests = sum(1 for r in results.values() if r)
failed_tests = total_tests - passed_tests
print(f"\n总测试数: {total_tests}")
print(f"通过: {passed_tests}")
print(f"失败: {failed_tests}")
print(f"通过率: {passed_tests/total_tests*100:.1f}%")
print("\n详细结果:")
for test_name, result in results.items():
status = "✓ 通过" if result else "✗ 失败"
print(f" {test_name}: {status}")
# 保存报告到文件
report_content = {
"测试时间": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"总测试数": total_tests,
"通过": passed_tests,
"失败": failed_tests,
"通过率": f"{passed_tests/total_tests*100:.1f}%",
"详细结果": {k: "通过" if v else "失败" for k, v in results.items()}
}
with open("doc/test-data/import_test_report.json", "w", encoding="utf-8") as f:
json.dump(report_content, f, ensure_ascii=False, indent=2)
print(f"\n测试报告已保存至: doc/test-data/import_test_report.json")
def main():
"""主测试函数"""
print("="*60)
print("中介黑名单导入功能测试")
print(f"测试时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("="*60)
results = {}
# 1. 登录
token = login()
if not token:
print("登录失败,无法继续测试")
return
# 2. 测试个人中介导入
results["个人中介导入"] = test_import_person_intermediary(token)
# 3. 测试机构中介导入
results["机构中介导入"] = test_import_entity_intermediary(token)
# 4. 测试统一社会信用代码为空的情况
results["机构中介无信用代码校验"] = test_import_entity_without_credit_code(token)
# 5. 测试查询列表
results["查询列表"] = test_query_intermediary_list(token)
# 5. 生成测试报告
generate_test_report(results)
print("\n" + "="*60)
print("测试完成")
print("="*60)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,22 @@
字段中文名,数据类型,长度/精度,是否为空,默认值,说明
统一社会信用代码,VARCHAR,18,,-,统一社会信用代码
主体名称,VARCHAR,200,,-,企业注册名称
主体类型,VARCHAR,50,,-,企业类型:有限责任公司、股份有限公司、合伙企业、个体工商户、外资企业等
企业性质,VARCHAR,50,,-,国企、民企、外企、合资、其他
行业分类,VARCHAR,100,,-,行业分类代码或名称
所属行业,VARCHAR,100,,-,所属行业
成立日期,DATE,-,,-,企业成立日期
注册地址,VARCHAR,500,,-,工商注册地址
法定代表人,VARCHAR,50,,-,法定代表人姓名
法定代表人证件类型,VARCHAR,30,,-,法定代表人证件类型
法定代表人证件号码,VARCHAR,30,,-,法定代表人证件号码
股东1,VARCHAR,30,,-,股东姓名
股东2,VARCHAR,30,,-,股东姓名
股东3,VARCHAR,30,,-,股东姓名
股东4,VARCHAR,30,,-,股东姓名
股东5,VARCHAR,30,,-,股东姓名
创建时间,DATETIME,-,,当前时间,记录创建时间
更新时间,DATETIME,-,,当前时间,记录更新时间
创建人,VARCHAR,50,,-,记录创建人
更新人,VARCHAR,50,,-,记录更新人
数据来源,VARCHAR,30,,MANUAL,"MANUAL:手动录入, SYSTEM:系统同步, API:接口获取, IMPORT:批量导入"
1 字段中文名 数据类型 长度/精度 是否为空 默认值 说明
2 统一社会信用代码 VARCHAR 18 - 统一社会信用代码
3 主体名称 VARCHAR 200 - 企业注册名称
4 主体类型 VARCHAR 50 - 企业类型:有限责任公司、股份有限公司、合伙企业、个体工商户、外资企业等
5 企业性质 VARCHAR 50 - 国企、民企、外企、合资、其他
6 行业分类 VARCHAR 100 - 行业分类代码或名称
7 所属行业 VARCHAR 100 - 所属行业
8 成立日期 DATE - - 企业成立日期
9 注册地址 VARCHAR 500 - 工商注册地址
10 法定代表人 VARCHAR 50 - 法定代表人姓名
11 法定代表人证件类型 VARCHAR 30 - 法定代表人证件类型
12 法定代表人证件号码 VARCHAR 30 - 法定代表人证件号码
13 股东1 VARCHAR 30 - 股东姓名
14 股东2 VARCHAR 30 - 股东姓名
15 股东3 VARCHAR 30 - 股东姓名
16 股东4 VARCHAR 30 - 股东姓名
17 股东5 VARCHAR 30 - 股东姓名
18 创建时间 DATETIME - 当前时间 记录创建时间
19 更新时间 DATETIME - 当前时间 记录更新时间
20 创建人 VARCHAR 50 - 记录创建人
21 更新人 VARCHAR 50 - 记录更新人
22 数据来源 VARCHAR 30 MANUAL MANUAL:手动录入, SYSTEM:系统同步, API:接口获取, IMPORT:批量导入

View File

@@ -0,0 +1,20 @@
字段中文名,数据类型,长度/精度,是否为空,默认值,说明
人员ID,VARCHAR,20,,-,中介、职业背债人、房产中介等
人员类型,VARCHAR,30,,-,中介、职业背债人、房产中介等
人员子类型,VARCHAR,50,,-,如:本人、配偶等
姓名,VARCHAR,50,,-,人员姓名
性别,CHAR,1,,-,"M:男, F:女, O:其他"
证件类型,VARCHAR,30,,身份证,身份证、护照、港澳通行证、台胞证、军官证等
证件号码,VARCHAR,30,,-,证件号码(加密存储)
手机号码,VARCHAR,20,,-,手机号码(加密存储)
微信号,VARCHAR,50,,-,微信号
联系地址,VARCHAR,200,,-,详细联系地址
所在公司,VARCHAR,100,,-,当前就职公司
职位,VARCHAR,100,,-,职位/职务
关联人员ID,VARCHAR,20,,-,关联“人员ID”
关联关系,VARCHAR,50,,-,与关联员工的关系
创建时间,DATETIME,-,,当前时间,记录创建时间
更新时间,DATETIME,-,,当前时间,记录更新时间
创建人,VARCHAR,50,,-,记录创建人
更新人,VARCHAR,50,,-,记录更新人
数据来源,VARCHAR,30,,MANUAL,"MANUAL:手动录入, SYSTEM:系统同步, IMPORT:批量导入, API:接口获取"
1 字段中文名 数据类型 长度/精度 是否为空 默认值 说明
2 人员ID VARCHAR 20 - 中介、职业背债人、房产中介等
3 人员类型 VARCHAR 30 - 中介、职业背债人、房产中介等
4 人员子类型 VARCHAR 50 - 如:本人、配偶等
5 姓名 VARCHAR 50 - 人员姓名
6 性别 CHAR 1 - M:男, F:女, O:其他
7 证件类型 VARCHAR 30 身份证 身份证、护照、港澳通行证、台胞证、军官证等
8 证件号码 VARCHAR 30 - 证件号码(加密存储)
9 手机号码 VARCHAR 20 - 手机号码(加密存储)
10 微信号 VARCHAR 50 - 微信号
11 联系地址 VARCHAR 200 - 详细联系地址
12 所在公司 VARCHAR 100 - 当前就职公司
13 职位 VARCHAR 100 - 职位/职务
14 关联人员ID VARCHAR 20 - 关联“人员ID”
15 关联关系 VARCHAR 50 - 与关联员工的关系
16 创建时间 DATETIME - 当前时间 记录创建时间
17 更新时间 DATETIME - 当前时间 记录更新时间
18 创建人 VARCHAR 50 - 记录创建人
19 更新人 VARCHAR 50 - 记录更新人
20 数据来源 VARCHAR 30 MANUAL MANUAL:手动录入, SYSTEM:系统同步, IMPORT:批量导入, API:接口获取