团财业务承保统计及手续费核对(第一阶段)— 后端接口清单

需求编号:BYXM-1891
范围:3.2.1 团财承保清单导入、3.2.1 团财批改清单导入、3.2.1 团财保单查询(已存在)、3.2.1 团财批单查询(新增)、3.2.1 影像件上传(新增)、3.2.1 团财保费预估表(暂不实现)。
不包含:3.2.2 产险对账单优化(下次上线)。
BasePath:/property_insurance(承保/批改/保单/批单),影像件上传单独一个控制器:/property_image_upload
鉴权:与现有所有 Controller 一致,从 UserInfoUtil.getUserInfo() 取登录信息(无需在入参里传 token)。
响应统一格式:Result(code / msg / data)。成功码 000000,业务异常码 000001 或 000002。


一、导入模板与字段定义(必读)

模板由业务方提供,共 4 份:

模板 列数 表头结构 数据起始行 落库表
产险车险承保清单导入模板 73 第 1 行分组标题(合并单元格)+ 第 2 行字段名 第 3 行 pi_policy_car_stg
产险非车承保清单导入模板 62 第 1 行分组标题 + 第 2 行字段名 第 3 行 pi_policy_nocar_stg
产险非车被保人清单导入模板 6 第 1 行字段名 第 2 行 pi_policy_insured_stg(新建)
产险批改清单导入模板 15 第 1 行分组标题 + 第 2 行字段名 第 3 行 pi_endorse_car_stg / pi_endorse_nocar_stg

约定:

  1. 只允许 .xlsx;禁止修改表头,后端会逐列校验表头,不一致直接拒绝整份文件(错误码 000002)。
  2. 表中“必录”= 模板里字体标红的字段,与需求 3.2.1.1.1.2 / 3.2.1.1.1.3 一致。
  3. 日期一律 yyyy-MM-dd;证件有效止期可填汉字“长期”,后端落 9999-12-31。
  4. 非车保单“被保人类型=团体”时,被保人名称等可不录,改由被保人清单导入。

1.1 车险承保清单(73 列)

表头行 = 第 2 行,数据自第 3 行开始。

列号 信息分组 字段名 必录
1 保单基本信息 投保单号 否
2 保单基本信息 保单号 是
3 保单基本信息 保单状态 否
4 保单基本信息 投保日期 (格式:yyyy-MM-dd) 否
5 保单基本信息 承保日期 (格式:yyyy-MM-dd) 是
6 保单基本信息 生效日期 (格式:yyyy-MM-dd) 否
7 保单基本信息 保险公司代码 是
8 保单基本信息 保险公司名称 否
9 保单基本信息 业务形式 是
10 保单基本信息 业务属性 否
11 业务员信息 归属业务员代码 否
12 业务员信息 归属业务员姓名 否
13 车辆信息 车牌号码 否
14 车辆信息 品牌型号 否
15 车辆信息 车型描述 否
16 车辆信息 车架号 否
17 车辆信息 发动机号 否
18 车辆信息 初次登记日期 否
19 车辆信息 使用性质 否
20 车主信息 车主名称 否
21 车主信息 车主证件类型 否
22 车主信息 车主证件号码 否
23 车主信息 移动电话 否
24 投保人信息 投保人类型 是
25 投保人信息 投保人名称 是
26 投保人信息 投保人证件类型 否
27 投保人信息 投保人证件号码 否
28 投保人信息 证件有效止期 (格式yyyy-MM-dd,长期录入汉字“长期”) 否
29 投保人信息 性别 (投保人类型为“个人”录入) 否
30 投保人信息 国籍 (投保人类型为“个人”录入) 否
31 投保人信息 移动电话 (投保人类型为“个人”录入) 否
32 投保人信息 职业 (投保人类型为“个人”录入) 否
33 投保人信息 联系地址 (省市区+详细地址) 否
34 投保人信息 经营范围 (投保人类型为“企业”录入) 否
35 投保人信息 法定代表人/负责人名称 (投保人类型为“企业”录入) 否
36 投保人信息 授权业务人员名称 (投保人类型为“企业”录入) 否
37 投保人信息 授权业务人员证件类型 (投保人类型为“企业”录入) 否
38 投保人信息 授权业务人员证件号码 (投保人类型为“企业”录入) 否
39 投保人信息 授权业务人员证件有效止期 (投保人类型为“企业”录入) 否
40 投保人信息 授权业务人员移动电话 (投保人类型为“企业”录入) 否
41 被保人信息 被保人类型 否
42 被保人信息 被保险人与投保人关系 (“本人”无需录入被保人其他信息) 否
43 被保人信息 被保人名称 是
44 被保人信息 被保人证件类型 否
45 被保人信息 被保人证件号码 否
46 被保人信息 证件有效止期 (格式yyyy-MM-dd长期录入汉字“长期”) 否
47 被保人信息 性别 (被保人类型为“个人”录入) 否
48 被保人信息 国籍 (被保人类型为“个人”录入) 否
49 被保人信息 移动电话 否
50 被保人信息 职业 (被保人类型为“个人”录入) 否
51 被保人信息 联系地址 (省市区+详细地址) 否
52 受益人信息 受益人标志 (“法定受益人”无需录入后续受益人信息) 否
53 受益人信息 受益人类型 否
54 受益人信息 受益人与被保人关系 (“本人”无需录入后续受益人信息) 否
55 受益人信息 受益人名称 否
56 受益人信息 受益人证件类型 否
57 受益人信息 受益人证件号码 否
58 受益人信息 证件有效止期 (格式yyyy-MM-dd长期录入汉字“长期”) 否
59 受益人信息 性别 (受益人类型为“个人”录入) 否
60 受益人信息 国籍 (受益人类型为“个人”录入) 否
61 受益人信息 移动电话 否
62 受益人信息 职业 (受益人类型为“个人”录入) 否
63 受益人信息 联系地址 (省市区+详细地址) 否
64 险种信息 险种代码 是
65 险种信息 险种名称 是
66 险种信息 险种大类 否
67 险种信息 险种小类 否
68 险种信息 保险金额 否
69 险种信息 险种保费(含税) 是
70 险种信息 险种保费(不含税) 否
71 险种信息 保险起期 (格式yyyy-MM-dd) 否
72 险种信息 保险止期 (格式yyyy-MM-dd) 否
73 险种信息 缴费方式 否

1.2 非车承保清单(62 列)

表头行 = 第 2 行,数据自第 3 行开始。

列号 信息分组 字段名 必录
1 保单基本信息 投保单号 否
2 保单基本信息 保单号 是
3 保单基本信息 保单状态 否
4 保单基本信息 投保日期 (格式:yyyy-MM-dd) 否
5 保单基本信息 承保日期 (格式:yyyy-MM-dd) 是
6 保单基本信息 生效日期 (格式:yyyy-MM-dd) 否
7 保单基本信息 保险公司代码 是
8 保单基本信息 保险公司名称 否
9 保单基本信息 业务形式 是
10 保单基本信息 业务属性 否
11 业务员信息 归属业务员代码 否
12 业务员信息 归属业务员姓名 否
13 投保人信息 投保人类型 是
14 投保人信息 投保人名称 是
15 投保人信息 投保人证件类型 否
16 投保人信息 投保人证件号码 否
17 投保人信息 证件有效止期 (格式yyyy-MM-dd,长期录入汉字“长期”) 否
18 投保人信息 性别 (投保人类型为“个人”录入) 否
19 投保人信息 国籍 (投保人类型为“个人”录入) 否
20 投保人信息 移动电话 (投保人类型为“个人”录入) 否
21 投保人信息 职业 (投保人类型为“个人”录入) 否
22 投保人信息 联系地址 (省市区+详细地址) 否
23 投保人信息 经营范围 (投保人类型为“企业”录入) 否
24 投保人信息 法定代表人/负责人名称 (投保人类型为“企业”录入) 否
25 投保人信息 授权业务人员名称 (投保人类型为“企业”录入) 否
26 投保人信息 授权业务人员证件类型 (投保人类型为“企业”录入) 否
27 投保人信息 授权业务人员证件号码 (投保人类型为“企业”录入) 否
28 投保人信息 授权业务人员证件有效止期 (投保人类型为“企业”录入) 否
29 投保人信息 授权业务人员移动电话 (投保人类型为“企业”录入) 否
30 被保人信息 被保人类型 (团体无需录入被保人信息,通过被保人清单导入) 否
31 被保人信息 被保险人与投保人关系 (“本人”无需录入被保人其他信息) 否
32 被保人信息 被保人名称 是
33 被保人信息 被保人证件类型 否
34 被保人信息 被保人证件号码 否
35 被保人信息 证件有效止期 (格式yyyy-MM-dd长期录入汉字“长期”) 否
36 被保人信息 性别 (被保人类型为“个人”录入) 否
37 被保人信息 国籍 (被保人类型为“个人”录入) 否
38 被保人信息 移动电话 否
39 被保人信息 职业 (被保人类型为“个人”录入) 否
40 被保人信息 联系地址 (省市区+详细地址) 否
41 受益人信息 受益人标志 (“法定受益人”无需录入后续受益人信息) 否
42 受益人信息 受益人类型 否
43 受益人信息 受益人与被保人关系 (“本人”无需录入后续受益人信息) 否
44 受益人信息 受益人名称 否
45 受益人信息 受益人证件类型 否
46 受益人信息 受益人证件号码 否
47 受益人信息 证件有效止期 (格式yyyy-MM-dd长期录入汉字“长期”) 否
48 受益人信息 性别 (受益人类型为“个人”录入) 否
49 受益人信息 国籍 (受益人类型为“个人”录入) 否
50 受益人信息 移动电话 否
51 受益人信息 职业 (受益人类型为“个人”录入) 否
52 受益人信息 联系地址 (省市区+详细地址) 否
53 险种信息 险种代码 是
54 险种信息 险种名称 是
55 险种信息 险种大类 否
56 险种信息 险种小类 否
57 险种信息 保险金额 否
58 险种信息 险种保费(含税) 是
59 险种信息 险种保费(不含税) 否
60 险种信息 保险起期 (格式yyyy-MM-dd) 否
61 险种信息 保险止期 (格式yyyy-MM-dd) 否
62 险种信息 缴费方式 否

1.3 非车被保人清单(6 列)

表头行 = 第 1 行,数据自第 2 行开始;一个保单号可有多行。

列号 信息分组 字段名 必录
1 保单号 是
2 被保人名称 否
3 被保人证件类型 是
4 被保人证件号码 是
5 证件有效止期 (格式yyyy-MM-dd长期录入汉字“长期”) 否
6 移动电话 否

1.4 批改清单(15 列)

表头行 = 第 2 行,数据自第 3 行开始;一个保单号可有多行(一行为一个批单险种)。

列号 信息分组 字段名 必录 落库字段
1 批单基本信息 保单号 是 policy_no
2 批单基本信息 批单号 是 endorse_no
3 批单基本信息 批单承保日期 (格式:YYYY-MM-DD) 是 accept_date
4 批单基本信息 批单生效日期 (格式:YYYY-MM-DD) 否 generate_date
5 批单基本信息 归属业务员代码 否 handler_code
6 批单基本信息 归属业务员姓名 否 handler_name
7 批单险种信息 险种代码 是 risk_code
8 批单险种信息 险种名称 是 risk_name
9 批单险种信息 险种大类 否 risk_class
10 批单险种信息 批单保险金额 否 sum_insured
11 批单险种信息 批单险种保费(含税) 是 premium
12 批单险种信息 批单险种保费(不含税) 否 risk_premium_no_tax
13 批单险种信息 保险起期 (格式yyyy-MM-dd) 否 start_date
14 批单险种信息 保险止期 (格式yyyy-MM-dd) 否 end_date
15 批单险种信息 缴费方式 否 pay_type

批改模板的两条特殊规则(与承保清单不同,务必注意):

  1. 模板没有“产险类型”列。 车险 / 非车由后端按「保单号」反查 car_main、no_car_main 自动判定,判定结果回填 property_type(车险 / 非车),并决定落到 pi_endorse_car_stg 还是 pi_endorse_nocar_stg。前端无需也无法指定。
  2. 保单号必须已存在于主表。 两侧主表都查不到时该行记为错误行,错误信息为「保单号在车险/非车保单主表中不存在,请先导入承保清单」。因此批改清单必须在对应承保清单导入并审批回写之后才能导入。

其它校验:日期须为 yyyy-MM-dd;保险止期须 ≥ 保险起期;缴费方式枚举「趸交 / 按年缴 / 不定期」;金额类字段须为数字且最多 2 位小数。

二、接口清单

所有 POST 请求的 Content-Type:application/json;charset=utf-8
所有 GET 请求的 Content-Type:URL query string
上传接口(除下载外)的 Content-Type:multipart/form-data

2.1 车险承保清单导入

Code
复制成功
POST /property_insurance/import/car/upload
Content-Type: multipart/form-data
 
表单字段:
- file:产险车险承保清单导入模板.xlsx(73 列,禁止改表头)
 
返回:Result
{
"code": "000000",
"msg": "车险承保清单导入解析完成",
"data": {
"batchNo": "PC202609161530001",
"totalRows": 200,
"successRows": 195,
"errorRows": 5,
"insuranceScope": "CAR"
}
}

落库 pi_policy_car_stg;行级错误写 pi_import_error,可用 §2.5/§2.6 查。
表头校验不通过时返回 code=000002,msg 里会带出具体哪一列被改。

2.2 非车承保清单导入(可同时传被保人清单)

Code
复制成功
POST /property_insurance/import/nocar/upload
Content-Type: multipart/form-data
 
表单字段:
- file:产险非车承保清单导入模板.xlsx(62 列),必传
- insuredFiles:产险非车被保人清单导入模板.xlsx(6 列),可多个,非必传
 
返回:Result
{
"code": "000000",
"msg": "非车承保清单导入解析完成",
"data": {
"batchNo": "PN202609161530002",
"totalRows": 260, // 承保清单行数 + 各被保人清单行数累加
"successRows": 255,
"errorRows": 5,
"insuranceScope": "NOCAR"
}
}

承保清单落 pi_policy_nocar_stg,被保人清单落 pi_policy_insured_stg,共用同一个 batchNo,
一次提交、一次审核。需求 3.2.1.1.1.5 第 7 条:被保人类型=团体时必须上传被保人清单。

2.3 非车被保人清单单独导入(补录场景)

Code
复制成功
POST /property_insurance/import/insured/upload
Content-Type: multipart/form-data
 
表单字段:
- file:产险非车被保人清单导入模板.xlsx(6 列)
 
返回:Result { code, msg, data: { batchNo, totalRows, successRows, errorRows, insuranceScope } }

落库 pi_policy_insured_stg。适用于非车保单信息补录时单独补充被保人。

2.4 批改清单导入

Code
复制成功
POST /property_insurance/import/endorse/upload
Content-Type: multipart/form-data
 
表单字段:
- file:产险批改清单导入模板.xlsx(15 列,见 §1.4)

返回:Result { code, msg, data: { batchNo, totalRows, successRows, errorRows, insuranceScope } }

落库 pi_endorse_car_stg / pi_endorse_nocar_stg(按保单号自动判定,见 §1.4 规则 1)。返回码与其他导入接口一致:表头不符 000002,解析异常 000001。

导入顺序要求:批改是对已有保单的批改,保单号必须在 car_main / no_car_main 中存在,
即对应承保清单需先导入并审批回写。查不到的行计入 errorRows,
可在 §2.5 批次详情里看到具体行号与错误原因。

2.5 批次详情(解析明细 + 错误明细)

Code
复制成功
GET /property_insurance/import/batch/detail?batchNo=20260527001BY0130
 
返回:Result
{
"code": "000000",
"data": {
"batch": { ...同 2.4 batchVo 结构 },
"rows": [
{
"rowNo": 3,
"sheetName": "Sheet1",
"recordType": "POLICY", // POLICY/ENDORSE
"policyNo": "...",
"endorseNo": null,
"premiumTaxTotal": 12345.67,
"status": "VALIDATED", // VALIDATED/INVALID
"validationErrors": [] // 本行的校验错误
}
]
}
}

2.6 批次错误明细(仅错误行)

Code
复制成功
GET /property_insurance/import/batch/errors?batchNo=20260527001BY0130
 
返回:Result
{
"code": "000000",
"data": [
{ "rowNo": 5, "sheetName": "Sheet1", "errors": ["保单号不能为空"] }
]
}

2.7 下载导入模板

Code
复制成功
GET /property_insurance/import/downloadTemplate?templateType=car

templateType 为必填参数,取值:

templateType 下载文件名 说明
car 产险车险承保清单导入模板.xlsx 73 列,双行表头
nocar 产险非车承保清单导入模板.xlsx 62 列,双行表头
insured 产险非车被保人清单导入模板.xlsx 6 列,单行表头
endorse 产险批改清单导入模板.xlsx 15 列,双行表头

响应:

  • Content-Type: application/octet-stream;charset=ISO8859-1
  • Content-disposition: attachment; filename=<上表文件名>
  • Body: xlsx 二进制

前端调用注意(容易踩):

  1. 必须带 templateType,且要按用户点击的是哪一类模板动态传值。四个模板对应四个入口,不要用一个固定 URL。
  2. 漏传参数不再抛框架异常(原来会报 MissingServletRequestParameterException,浏览器只看到 400 白页),而是返回统一业务响应,前端按普通错误提示即可:
    JSON
    复制成功
    {
    "code": "000004",
    "msg": "缺少模板类型参数 templateType。可选值:car(车险承保清单)/ nocar(非车承保清单)/ insured(非车被保人清单)/ endorse(批改清单)。示例:/tabycore/property_insurance/import/downloadTemplate?templateType=car"
    }
  3. 传了不支持的值同样返回 000004:模板类型不支持:xxx,可选值:car(车险承保清单)/ ...。
  4. 参数值大小写与首尾空格后端会自动归一化(Car、car 均可)。
  5. 下载类接口建议用 window.location.href 或 a[download] 直接跳转,不要用 ajax(二进制流无法走 JSON 解析)。

2.8 提交审核

Code
复制成功
POST /property_insurance/import/batch/submit
Content-Type: application/json
 
请求体:
{ "batchNo": "20260527001BY0130" }
 
返回:Result { code, msg, data=null }
- 000000 提交成功
- 000001 该批次校验未通过 / 已提交过

2.9 审核(通过/不通过)

Code
复制成功
POST /property_insurance/import/batch/audit
Content-Type: application/json
 
请求体:
{
"batchNo": "20260527001BY0130",
"status": "approved", // approved / reject
"remark": "审核通过"
}
 
返回:Result
{
"code": "000000",
"msg": "审核通过,回写成功",
"data": { "policyWritten": 120, "endorseWritten": 80 }
}

2.10 兼容旧接口(前端如果还没改完,可以继续用)

Code
复制成功
POST /property_insurance/import/batch/approve
请求体:{ "batchNo": "...", "remark": "..." }
 
POST /property_insurance/import/batch/reject
请求体:{ "batchNo": "...", "remark": "..." }

内部均调用 auditBatch。

2.11 团财保单查询(已存在,保持不变)

Code
复制成功
POST /property_insurance/policyQuery
请求体:PolicyQueryCondition
返回:Result<PolicyPageVo>

2.12 团财保单详情(已存在)

Code
复制成功
POST /property_insurance/policyQuery/detail
请求体:{ "policyNo": "...", "queryType": "1" }
返回:Result<PolicyDataDetailVo>

2.13 团财保单导出(已存在)

Code
复制成功
GET /property_insurance/policyData/export?...
query:PolicyQueryCondition 全部字段

2.14 团财批单查询(新增)

Code
复制成功
POST /property_insurance/endorse/query
Content-Type: application/json
 
请求体:PolicyEndorseQueryCondition
{
"comCode": "00", // 省级分公司代码(可选)
"codeName": "佰盈总部", // 省级分公司名称(可选)
"comSubCode": "0001", // 地市级分公司代码(可选)
"comSubName": "北京分公司", // 地市级分公司名称(可选)
"companyCode": "PICC", // 保险公司代码(可选)
"companyName": "人保财险", // 保险公司名称(可选)
"acceptStartDate": "2026-05-01", // 承保开始日期(与 保单号/批单号 二选一)
"acceptEndDate": "2026-05-31", // 承保结束日期
"policyNo": "PICC202605001", // 保单号(可选)
"endorseNo": "E001", // 批单号(可选)
"propertyType": "1", // 1=车险 / 2=非车 / 空=并集
"currentPage": 1,
"pageSize": 20
}
 
返回:Result
{
"code": "000000",
"data": {
"total": 152,
"rows": [
{
"policyNo": "PICC202605001",
"endorseNo": "E001",
"acceptDate": "2026-05-12 00:00:00",
"generateDate": "2026-05-12 00:00:00",
"propertyType": "1",
"companyName": "人保财险",
"comName": "北京分公司",
"agentCode": "AGENT001",
"agentName": "张三",
"insureName": "XX 物流有限公司",
"insuredName": "XX 物流有限公司"
}
]
}
}

前端校验:承保日期、保单号/批单号至少二选一,否则 000002。

2.15 团财批单详情(新增)

Code
复制成功
GET /property_insurance/endorse/detail?policyNo=...&endorseNo=...&propertyType=1
 
返回:Result<PolicyEndorseDetailVo> —— 见 §3 VO 列表。

2.16 团财批单导出(新增)

Code
复制成功
GET /property_insurance/endorse/export?
comCode=&codeName=&comSubCode=&comSubName=&companyCode=&companyName=
acceptStartDate=&acceptEndDate=&policyNo=&endorseNo=&propertyType=
currentPage=&pageSize=
 
响应:application/vnd.ms-excel;文件名"产险批单数据导出.xls"

2.17 影像件上传(新增)

本模块完全参考寿险影像件上传(ImageUploadController)实现,落库沿用同一张表 imageupload,
与寿险只有两点差异:①接口名不同;②上传目录由 imageUpload/ 改为 propertyimage/。
因此 本次不需要新建任何表(原先准备的 pi_policy_image 建表 SQL 已作废并删除)。
产险当前业务只要求上传「投保人影像」一类。

Code
复制成功
POST /property_image_upload/policyImageUpload
Content-Type: multipart/form-data
 
form-data:
file: <jpg/png/pdf> // 必填,仅支持 jpg、png、pdf
policyNo: "PICC202605001" // 必填,保单号
imageType: "5" // 选填,默认 5=投保人影像
// 1=客户告知书 2=保单主页 3=投保单
// 5=投保人影像 6=被保人影像 7=受益人影像
 
返回:Result
{
"code": "000000",
"msg": "上传成功!",
"data": null
}

落盘路径:{oss.upload.dir}/propertyimage/{policyNo}/{影像子目录}/{yyyyMMdd + UUID + 后缀}
影像子目录映射(与寿险一致):
1→notification、2→homepage、3→insurance、5→policyHolderIdCard、6→insuredIdCard、7→beneficiaryIdCard、其他→trouble
访问 URL:https://{oss.domain}/propertyimage/{policyNo}/{影像子目录}/{文件名},即 imageupload.imagepathsftp 的值。
失败返回:000002 + 具体原因("不支持上传此类型文件!可上传类型为:jpg,png,pdf!" / "保单号不能为空" / "系统异常,上传失败")。

2.18 影像件查询(按保单号,新增)

保单号超链接进入影像上传页面时调用,返回该保单下的全部影像件,按影像分类分组。

Code
复制成功
POST /property_image_upload/policyImageQuery
Content-Type: application/json
 
请求体:
{
"policyNo": "PICC202605001" // 必填
}
 
返回:Result
{
"code": "000000",
"msg": "查询成功",
"data": {
"notification": [ { "imageName": "xxx.jpg", "imageURL": "https://{oss.domain}/propertyimage/..." } ],
"homepage": [],
"insurance": [],
"policyHolderIdCard": [ { "imageName": "xxx.jpg", "imageURL": "https://{oss.domain}/propertyimage/..." } ],
"insuredIdCard": [],
"beneficiaryIdCard": []
}
}

imageURL 就是访问地址,前端预览/下载直接用它。查询失败返回 000002。

2.19 影像件删除(新增)

同时删除服务器物理文件与 imageupload 表记录。删完由前端重新调用 2.18 刷新。

Code
复制成功
POST /property_image_upload/policyImageDelete
Content-Type: application/json
 
请求体:
{
"policyNo": "PICC202605001", // 必填
"imageType": "5", // 必填,与上传时一致
"imageNameFromSftp": "https://{oss.domain}/propertyimage/PICC202605001/policyHolderIdCard/xxx.jpg" // 必填,2.18 返回的 imageURL
}
 
返回:Result
{
"code": "000000",
"msg": "图片删除成功!"
}

删除失败返回 000002 + "图片删除失败!"。前端需先弹框确认"是否确定删除?"。

2.20 影像件下载(新增)

Code
复制成功
GET /property_image_upload/policyImageDownload?fileName={urlencoded 完整URL}
 
说明:fileName 传 2.18 返回的 imageURL(或上传接口返回的访问地址),需 URLEncode。
 
响应:
- Content-Type: application/octet-stream;charset=utf-8
- Content-disposition: attachment; filename=<文件名>
- Body: 文件二进制流

三、新增/修改的 VO 字段

PolicyEndorseListVo(产险批单列表)

字段:policyNo, endorseNo, acceptDate, generateDate, propertyType, companyName, comName, agentCode, agentName, insureName, insuredName

PolicyEndorseDetailVo(产险批单详情)

  • 保单基本信息:policyNo, policyStatus, policyAcceptDate, policyGenerateDate, companyCode, companyName, insureName, insuredName, handlerCode, handlerName, comCode, comName, propertyType, bizForm
  • 批单基本信息:endorseNo, endorseAcceptDate, endorseGenerateDate, totalPremiumTax, totalPremiumNoTax, endorseHandlerCode, endorseHandlerName
  • 险种信息:riskClass, riskCode, riskName, sumInsured, riskPremiumTax, riskPremiumNoTax, startDate, endDate, settleCommissionRate, settleCommissionBasis

影像件相关 VO(复用寿险已有的类,无新增)

  • 入参 ImageUploadVO:影像件模块用到的字段是 policyNo(保单号)、imageType(影像类型)、imageNameFromSftp(服务器文件地址/整条URL)
  • 出参 ImageReturnVO:imageName(文件名)、imageURL(访问地址)

PolicyEndorseQueryCondition

字段:comCode, codeName, comSubCode, comSubName, companyCode, companyName, acceptStartDate, acceptEndDate, policyNo, endorseNo, propertyType


四、建表 SQL

4.1 影像件

影像件不需要建表。
产险影像件参照寿险实现,直接复用已有的 imageupload 表(该表已有 policyno / filetype / imagename / imagepathsftp / createtime / updatetime / createby / updateby / imagelocation 字段)。
原"团财影像件上传表DDL.sql"(pi_policy_image)方案已废弃,文件已从工程中删除,无需在生产执行。

4.2 承保/批改导入(本轮新增,需在生产执行)

真实导入模板比早期占位模板多了车辆信息、车主信息、企业授权业务人员、受益人信息、险种大类/小类等字段,且非车被保人清单需要独立落表。因此新增一份增量脚本:

团财承保批改_新导入表DDL_增量.sql(工程根目录),包含两段:

段落 内容 适用环境
1 新建 pi_policy_insured_stg(非车被保人清单暂存) 所有环境
2 pi_policy_car_stg / pi_policy_nocar_stg 增列:车辆 7 列、车主 4 列、企业经营/授权人 7 列、受益人 12 列、险种大类/小类 2 列 仅存量库;全新环境执行 团财承保批改_新导入表DDL.sql 即可(CREATE 已含这些列)
3 pi_endorse_car_stg / pi_endorse_nocar_stg 增列 6 列:risk_class、sum_insured、risk_premium_no_tax、start_date、end_date、pay_type(批改清单模板 15 列中有 6 列原表没有) 仅存量库;全新环境执行 团财承保批改_新导入表DDL.sql 即可(CREATE 已含这些列)

已有表 pi_policy_car_stg / pi_policy_nocar_stg / pi_endorse_car_stg / pi_endorse_nocar_stg / pi_import_batch / pi_import_error / pi_endorse_car_main / pi_endorse_nocar_main 通过 团财承保批改_新导入表DDL.sql 建好,不重复创建。


五、错误码表

code 含义
000000 成功
000001 业务异常(具体信息看 msg)
000002 模板表头校验不通过(列数/字段名与系统模板不一致,msg 里带出具体列);或前端校验不通过
000003 文件解析失败(非 xlsx / 模板格式错)
000004 数据回写失败(详见 msg;通常对应某条具体的 stg 行 id)
000005 权限不足(非本公司数据)
000099 系统异常

六、与前端的约定

  1. 所有 POST 请求的 body 字段命名沿用驼峰式(与 VO @Data 注解生成的一致)。

  2. 导出接口用 GET + queryString;前端如需复杂条件可以用 POST 后端再加。

  3. 任何 /upload 接口超时统一 30 秒,前端请用 upload progress 反馈用户。

  4. 审核回写是异步的还是同步的?

    • 当前实现:审核接口(/audit、/approve)在事务内同步完成 car_main / no_car_main 的回写;批量 200 行以内 < 5 秒,超过 200 行会返回 000004 并提示"请分批导入"。
    • 后续如果需要异步版本再扩展。
  5. 同一保单号已存在时再导入 → 后端拒绝并提示"保单已存在",不会覆盖。

  6. 受益人=指定受益人 时,导入校验要求"受益人姓名、证件、份额"三项;前端录入时也应该在校验层把这三项联动起来。

  7. 后端会复用 UserInfoUtil.getUserInfo() 取 comCode / operatorCode;前端传过来的 comCode 仅作为展示用,不参与过滤(避免越权)。

  8. 影像件模块(/property_image_upload/*)与寿险影像件上传(/ImageUpload/*)是两套独立接口、同一张 imageupload 表,只是存储目录不同(propertyimage/ vs imageUpload/)。前端请按产险这套接口对接,不要混用。

  9. 影像件预览:直接用 2.18 返回的 imageURL 打开即可(走 oss.domain);如果浏览器需要强制下载,用 2.20 的下载接口。

  10. 模板必须走下载接口拿(?templateType=car|nocar|insured|endorse,templateType 必填),不要用前端自己存的旧模板。后端会逐列校验表头,任何改名/删列/加列都会直接拒绝整份文件并返回 000002,msg 里会说明第几列对不上。

  11. 车险、非车是两套模板两套接口(73 列 vs 62 列),不能混用;识别方式就是下载时传的 templateType。

  12. 非车上传页支持一个承保清单 + 多个被保人清单,一起 multipart 提交(file + insuredFiles[]),后端合并到同一个 batchNo,失败详情里会按文件名+行号定位。

  13. 证件有效止期允许填汉字“长期”,后端落 9999-12-31,前端回显时按这个约定处理。

  14. 批改清单导入(§2.4)模板不带“产险类型”列,前端不要自行加列,也不要让用户选车险/非车——后端按保单号自动判定并在返回的错误明细里说明原因。导入顺序上,需提示用户先导入对应承保清单并完成审批回写,否则批改行会因保单号不存在而失败。

  15. 旧版前端 JS 里的产险调用已与后端不一致,请按下表更新(仓库 static/dist 下打包产物仍含旧调用):

    旧前端调用 现状 应改为
    GET /property_insurance/import/downloadTemplate(无参数) 会报缺参数 带 `?templateType=car
    POST /property_insurance/import/policy/upload 后端已删除 POST /import/car/upload 或 /import/nocar/upload
    GET /property_insurance/import/batch/auditHistory 后端无此端点 暂无,需确认是否仍需要(需后端补)
    POST /property_insurance/import/batch/delete 后端无此端点 暂无,需确认是否仍需要(需后端补)
    POST /property_insurance/import/batch/audit 保留 也可改用 /batch/approve、/batch/reject
    POST /property_insurance/import/endorse/upload 正常 不变
    POST /property_insurance/import/batch/list、/detail、/errors、/submit 正常 不变

    其中 auditHistory、batch/delete 两个端点后端从未实现,若业务确实需要请明确后由后端补。

本页笔记

加载中…