Files
Yb-QaAutomationHub/requirements/小象开票收款方创建需求.md
xst 5e4e978cd5 chore: 入库 9 月积压成果(滇中好运原型评估、小象开票需求与原型、工具配置)
- 原型评估_滇中好运物流云_20260917/:物流云原型评估产物(含核对表与字段对比表)
- requirements/小象开票收款方创建需求.md + prototypes/小象开票原型.html:小象开票建司机/车辆/收款信息需求
- requirements.txt:Execute 战区依赖调整(移除 pytest/allure-pytest/requests,改用 pytest-html,Appium 默认注释)
- .claude/launch.json:新增物流公司管理原型预览服务(wuliu-proto:8138)
- .agents/skills:agent 技能定义
2026-09-29 10:03:43 +08:00

273 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 小象开票 —— 收款方创建需求文档(创建司机 / 创建车辆 / 新增收款信息)
> **版本**: v1.0(初稿)
> **编写日期**: 2026-09-28
> **状态**: 待评审
> **接口文档(权威来源)**:
> - 创建司机:https://v4.xxyb.cn/markdown/link/proxy/DriverCreate.html
> - 创建车辆:https://v4.xxyb.cn/markdown/link/proxy/VehicleCreate.html
> - 新增收款信息:https://v4.xxyb.cn/markdown/link/proxy/PayeeCreate.html
> - 公共枚举:https://v4.xxyb.cn/markdown/link/base/Code.html
> **交互原型**: [prototypes/小象开票原型.html](prototypes/小象开票原型.html)(风格与"物流公司管理"原型一致,数据为演示数据)
> **UI 参考**: 三十六匠发票"司机上传 / 车辆上传"页面截图(表头筛选行 + 批量上传按钮样式)
> **菜单位置**: 小象开票(顶级菜单)下新增:创建司机、创建车辆、新增收款信息
---
## 1. 背景与目标
小象开票(联合开票)业务要求承运方(司机、车辆)及其收款账户先在 xxyb 平台完成建档,才能开票。当前建档在小象平台侧手工操作,与运八系统脱节。本次在小象开票菜单下新增三个功能,直接调用 xxyb 开放接口完成建档:
1. **创建司机**:录入司机信息 → 调用 `createDriver` 在 xxyb 平台创建司机档案;
2. **创建车辆**:录入车辆信息 → 调用 `createVehicle` 创建车辆档案;
3. **新增收款信息**:录入收款人账户 → 调用 `createPayee` 创建收款信息。
建档结果(第三方返回 ID、审核状态)在列表中可见、可追溯。
### 1.1 设计原则
- 三个功能均为**记录/建档性质**:调用成功即在本系统留存记录并展示第三方审核状态,**不阻断**运单、开票等任何既有流程(是否允许开票由小象平台侧控制)。
- 接口文档为字段权威来源,本文档字段表与其一致;页面展示字段为全量字段的子集(必填 + 高频选填),其余字段按接口文档保留扩展。
---
## 2. 名词
| 名词 | 说明 |
|:---|:---|
| xxyb 平台 | 联合开票合作方(小象),接口基地址 `https://www.xxyb.cn/union/api/link/` |
| 税源地 | 开票主体(如云南运八数据科技有限公司),建档时随单传入 |
| 审核状态 | xxyb 平台对建档资料的审核结果:待审核 / 审核通过 / 审核不通过(AuditStatusEnum) |
| 长期 | 证件有效期无固定截止日期时,有效期字段填写字符串"长期" |
---
## 3. 角色与权限
| 角色 | 权限 |
|:---|:---|
| 开票运营人员 | 三个页面的新增、查看、批量上传 |
| 其他角色 | 列表只读(按需授权) |
- 数据按机构隔离(沿用平台多机构规则);操作记行为日志。
- **Header 鉴权**:`token`(应用令牌)、`cid`(合作ID),由平台配置统一注入,前端不接触。
---
## 4. 功能清单
| 编号 | 功能 | 说明 | 优先级 |
|:---|:---|:---|:---:|
| FR-01 | 创建司机 | 司机列表 + 新增司机弹窗,提交调用 `createDriver` | P0 |
| FR-02 | 创建车辆 | 车辆列表 + 新增车辆弹窗,提交调用 `createVehicle` | P0 |
| FR-03 | 新增收款信息 | 收款信息列表 + 新增弹窗,提交调用 `createPayee` | P0 |
| FR-04 | 审核状态展示 | 列表展示 xxyb 审核状态与审核时间 | P0 |
| FR-05 | 批量上传 | 司机身份证批量上传、车牌号批量上传(参照三十六匠页面;范围见 Q1) | P2 |
---
## 5. 接口规范(权威来源:xxyb 接口文档)
### 5.0 公共
- 请求方式:POST(JSON);Header:`token`(应用令牌,必填)、`cid`(合作ID,必填)。
- 返回结构:`{ code, msg, data, requestId }`;`code=200` 成功;成功后 `data.id` 为第三方建档 ID,需落库保存。
- 图片/附件类字段均为 **URL**:文件先上传平台文件服务(OBS)取得 URL 后再随接口提交。
### 5.1 创建司机 `POST /union/api/link/createDriver`
| 字段 | 类型 | 层级 | 说明 | 必填 |
|:---|:---|:---:|:---|:---:|
| driverPhone | String | 1 | 司机手机号 | 是 |
| driverRealAuthDomain | ApiDriverRealAuthDomain | 1 | 司机基础信息 | 是 |
| driverAuthDomain | ApiDriverAuthDomain | 1 | 司机认证信息 | 否 |
**ApiDriverRealAuthDomain 司机实名认证信息**:
| 字段 | 类型 | 说明 | 必填 |
|:---|:---|:---|:---:|
| driverName | String | 司机姓名 | 是 |
| driverIdCard | String | 身份证 | 是 |
| driverIdCardAddress | String | 身份证地址 | 否 |
| idCardFrontImg | String | 身份证人像面图片 | 否 |
| idCardBackImg | String | 身份证国徽面图片 | 否 |
**ApiDriverAuthDomain 司机认证信息(全部选填)**:
| 字段 | 类型 | 说明 |
|:---|:---|:---|
| driverLicense | String | 驾驶证 |
| driverLicenseFrontImg / BackImg | String | 驾驶证正/反面图片 |
| driverLicenseIssuingAuthority | String | 驾驶证发证机关 |
| driverLicenseExpireStartTime / EndTime | String | 驾驶证有效期起/止(长期填"长期") |
| professionalQualificationCertificate | String | 从业资格证 |
| professionalQualificationCertificateImg | String | 从业资格证图片 |
| professionalQualificationCertificateExpireStartTime / EndTime | String | 从业资格证有效期起/止 |
| approvedDrivingType | ApprovedDrivingTypeEnum | 准驾车型(A1/A2/A1A2/B2/C1 等组合值,见 Code.html) |
返回:`data.id` = 司机ID。
### 5.2 创建车辆 `POST /union/api/link/createVehicle`
| 字段 | 类型 | 层级 | 说明 | 必填 |
|:---|:---|:---:|:---|:---:|
| vehicleBasicDomain | ApiVehicleBasicDomain | 1 | 车辆基础信息 | 是 |
| vehicleAuthDomain | ApiVehicleAuthDomain | 1 | 车辆认证信息 | 否 |
**ApiVehicleBasicDomain 车辆基础信息**:
| 字段 | 类型 | 说明 | 必填 |
|:---|:---|:---|:---:|
| licensePlateNumber | String | 车辆牌号 | 是 |
| licensePlateColor | ColorEnum | 车牌颜色(BLUE 蓝 / YELLOW 黄 / GREEN 绿) | 是 |
**ApiVehicleAuthDomain 车辆认证信息**(必填:vehicleType、vehicleLength、vehicleEnergyType、vehicleLicenseFrontImg、vehicleLicenseBackImg、vehicleLicenseExpireTime;其余选填):
| 字段 | 类型 | 说明 |
|:---|:---|:---|
| vehicleType | VehicleTypeEnum | 车型(重型半挂牵引车/重型自卸货车/轻型厢式货车等,见 Code.html) |
| vehicleLength | BigDecimal | 车长 |
| vehicleEnergyType | VehicleEnergyTypeEnum | 能源类型(A汽油/B柴油/C电/E天然气/O混合动力/Y无/Z其他等) |
| vehicleIdentificationNumber | String | 车辆识别代码 |
| vehicleLicense | String | 行驶证 |
| vehicleLicenseFrontImg / BackImg / ClipImg | String | 行驶证正面/反面/副页图片 |
| vehicleLicenseRegisterTime / ExpireTime | String | 行驶证注册日期/有效期 |
| vehicleLicenseIssuingAuthority / IssuingTime | String | 行驶证发证机关/发证日期 |
| roadTransportLicense + Img + AnnualInspectionImg + ExpireTime | String | 道路运输证系列 |
| roadTransportBusinessLicense | String | 道路运输经营许可证 |
| trailerLicenseNumber + Img + BackImg | String | 挂车牌照/副本照片 |
| groupPhotoImg | String | 人车合照 |
| totalMass / approvedLoad / curbWeight | BigDecimal | 总质量/核定载质量/整备质量 |
| overallDimensions / useNature | String | 外廓尺寸/使用性质 |
| creditCode | String | 统一社会信用代码/身份证号 |
| vehicleOwner / vehicleOwnerExpireTime | String | 车辆所有人/有效期 |
| affiliationAgreement | List<String> | 挂靠协议(多附件 URL) |
返回:`data.id` = 车辆ID。
### 5.3 新增收款信息 `POST /union/api/link/createPayee`
| 字段 | 类型 | 层级 | 说明 | 必填 |
|:---|:---|:---:|:---|:---:|
| payeeBasicDomain | ApiPayeeBasicDomain | 1 | 收款信息 | 是 |
**ApiPayeeBasicDomain 收款人基础信息**:
| 字段 | 类型 | 说明 | 必填 | 备注 |
|:---|:---|:---|:---:|:---|
| payeeName | String | 收款人姓名 | 是 | |
| payeeIdCard | String | 收款人身份证 | 是 | |
| payeeBankCard | String | 收款银行卡号 | 是 | |
| payeeBankCardImg | String | 收款银行卡图片 | 否 | |
| payeeBankName | String | 收款银行 | 否 | |
| payeePhone | String | 收款手机号 | 条件 | accountType 为 PERSONAL 时必填 |
| accountType | AccountTypeEnum | 收款人类型 | 是 | PERSONAL 个人 / ENTERPRISE 企业 |
返回:`data.id` = 收款人ID。
---
## 6. 业务规则
### BR-01 必填与格式校验(前端 + 后端双重)
- 手机号 11 位;身份证 18 位国标格式;银行卡号按 Luhn 校验 + 位数 15-19 位。
- 收款人类型 = 个人时,`payeePhone` 必填(接口条件必填,前端联动校验)。
- 车牌号格式校验(省份简称+字母+5/6位,含挂车"挂"字尾);车辆长度数值 ≥ 0。
### BR-02 证件有效期"长期"口径
- 有效期截止类字段(驾驶证/资格证/行驶证/道路运输证/车辆所有人有效期)支持选择"长期",提交时填写字符串 `长期`;起止格式 `yyyy-MM-dd`。
### BR-03 附件
- 页面上传证件图片 → 平台文件服务(OBS)→ 取 URL 随接口提交;单图 ≤ 10MB,jpg/jpeg/png/pdf(挂靠协议支持多文件)。
- 上传失败时阻断提交并提示。
### BR-04 提交与结果落库
- 提交成功:保存 `data.id`(第三方ID)+ 提交内容 + 税源地 + 审核状态=待审核;提示"创建成功"。
- 提交失败:展示接口 `msg`;表单不清空。
- **重复创建**:同一身份证号(司机)/同一车牌号(车辆)在"待审核或审核通过"状态下重复创建时,前端提示确认;后端是否阻断以 xxyb 平台校验为准(见 Q4)。
### BR-05 审核状态同步
- 列表展示审核状态(待审核/审核通过/审核不通过)与审核时间,来源于 xxyb 平台。
- 同步方式见待确认 Q2(回调 / 定时轮询),状态变化仅做展示更新,不影响本系统流程。
### BR-06 批量上传
- 参照三十六匠页面提供"批量上传 / 司机身份证批量上传 / 车牌号批量上传"入口(Excel 模板导入,逐条调接口);范围见 Q1。
---
## 7. 页面详述
### 7.1 创建司机(小象开票 → 创建司机)
- **按钮**:查询、新增司机、批量上传、司机身份证批量上传(后两者见 Q1)。
- **表头筛选行**(参照截图样式,无标签、placeholder 直书):请选择税源地 ▼ / 请选择审核状态 ▼ / 审核时间起-止 / 请输入司机 / 请输入身份证号。
- **列表列**:选择框、税源地、审核状态(待审核-橙 / 审核通过-绿 / 审核不通过-红)、审核时间、司机姓名、身份证号、身份证有效期(驾驶证有效期止)、手机号、操作(查看、重新上传——仅审核不通过时显示)。
- **新增司机弹窗**(字段名对应 5.1):
- 基础信息:司机手机号*、司机姓名*、身份证号*、身份证地址、身份证人像面图片、身份证国徽面图片;
- 认证信息(选填,默认折叠):驾驶证号、驾驶证正/反面图片、发证机关、驾驶证有效期起/止(支持"长期")、从业资格证、资格证图片、资格证有效期起/止、准驾车型(下拉)。
- 提交成功后列表新增一行:审核状态"待审核",第三方ID落库。
### 7.2 创建车辆(小象开票 → 创建车辆)
- **按钮**:查询、新增车辆、批量上传、车牌号批量上传。
- **表头筛选行**:请选择税源地 ▼ / 请选择审核状态 ▼ / 审核时间起-止 / 请输入车牌 / 请输入车辆所有人 / 请选择车辆分类 ▼ / 请选择车牌颜色 ▼ / 请选择能源类型 ▼。
- **列表列**:税源地、审核状态、审核时间、车牌号、车辆所有人、车辆分类(=vehicleType)、车牌颜色、车辆能源类型、操作(查看、重新上传)。
- **新增车辆弹窗**:
- 基础信息:车牌号*、车牌颜色*(蓝/黄/绿);
- 认证信息:车型*(下拉,VehicleTypeEnum)、车长*(米)、能源类型*(下拉)、车辆识别代码、行驶证正面图片*、行驶证反面图片*、行驶证有效期*(支持"长期")、道路运输证、道路运输经营许可证、车辆所有人;
- 其余字段(挂车、质量参数、外廓尺寸、挂靠协议等)按接口文档保留输入(弹窗"更多信息"折叠区),原型中省略展示。
### 7.3 新增收款信息(小象开票 → 新增收款信息)
- **按钮**:查询、新增收款信息、导出。
- **表头筛选行**:请输入收款人姓名 / 请输入身份证号 / 请选择收款人类型 ▼。
- **列表列**:收款人姓名、身份证号、收款银行卡号、收款银行、收款手机号、收款人类型(个人/企业)、第三方ID、创建时间、操作(查看)。
- **新增收款信息弹窗**:收款人类型*(个人/企业,切换联动)、收款人姓名*、身份证号*、收款银行卡号*、银行卡图片、收款银行、收款手机号(**个人必填**联动校验)。
---
## 8. 待确认问题
| 编号 | 问题 | 倾向方案 |
|:---:|:---|:---|
| Q1 | 批量上传是否本期实现(Excel 模板 + 逐条调接口)? | 建议本期先做单笔,批量二期 |
| Q2 | 审核状态如何同步:xxyb 回调(Callback)还是我方定时轮询? | 待与平台确认接口 |
| Q3 | 审核不通过后的"重新上传"是调编辑接口重新提交还是新建一条?接口文档未见编辑接口 | 待平台确认;倾向新建一条并作废旧记录 |
| Q4 | 重复创建(同身份证/同车牌)xxyb 侧是否幂等/报错? | 以平台校验为准,我方先做提示 |
| Q5 | 菜单项命名:创建司机 / 创建车辆 / 新增收款信息(与接口同名)还是 司机管理 / 车辆管理 / 收款信息? | 待产品确认 |
| Q6 | 税源地字段接口未见入参——是否随 `cid` 隐含?列表中税源地列取值来源? | 待与平台确认 |
> ⚠️ 待确认 Q6 补充:接口文档的请求参数中**没有税源地字段**,但参照页面(三十六匠)列表均有"税源地"列。需确认税源地是否由 `cid`(合作ID)隐含绑定,或需要额外参数。
> ⚠️ 待确认 Q7:**企业收款人(accountType=ENTERPRISE)的 payeeIdCard 字段填什么?** 接口字段名为"收款人身份证",企业场景下应填法定代表人身份证还是统一社会信用代码?原型当前按"企业填统一社会信用代码、个人填身份证"处理。
---
## 9. 验收要点(概要)
1. 三个接口的 Header(token/cid)由平台配置注入,前端无感知;请求体字段与接口文档一致(逐字段核对)。
2. 必填校验生效:司机(手机号/姓名/身份证)、车辆(车牌/颜色/车型/车长/能源类型/行驶证正反/有效期)、收款信息(类型/姓名/身份证/银行卡号;个人时手机号必填)。
3. 有效期选择"长期"时提交值为字符串"长期";日期字段格式 yyyy-MM-dd。
4. 提交成功落库 `data.id` 并以"待审核"入列表;失败展示 `msg` 且表单保留。
5. 收款人类型=企业时手机号非必填、个人时必填(联动)。
6. 车牌颜色/车型/能源类型/准驾车型/收款人类型取值与 Code.html 枚举一致。
7. 列表筛选(表头筛选行)与分页正常;审核状态展示正确。
8. 权限:非授权角色只读;跨机构数据不可见。
---
## 10. 原型对照
| 原型页面 | 说明 |
|:---|:---|
| 创建司机(列表 + 新增弹窗) | 对标三十六匠"司机上传"截图:表头筛选行 + 批量上传按钮 |
| 创建车辆(列表 + 新增弹窗) | 对标"车辆上传"截图:车辆分类/车牌颜色/能源类型列 |
| 新增收款信息(列表 + 新增弹窗) | 新增设计,列表含收款人类型 |
| 侧边栏 | 小象开票菜单下新增三个菜单项(NEW 标识) |