diff --git a/changelogs/2026-05/01_feat_contract_12301-spec-alignment-attachments-tour-guides-traveler-fields.md b/changelogs/2026-05/01_feat_contract_12301-spec-alignment-attachments-tour-guides-traveler-fields.md deleted file mode 100644 index 57fd9b1..0000000 --- a/changelogs/2026-05/01_feat_contract_12301-spec-alignment-attachments-tour-guides-traveler-fields.md +++ /dev/null @@ -1,233 +0,0 @@ -# 12301 合同 2026 spec 完整对齐: 新增附件管理 + 导游名单 + 出行人民族/同住分组录入 - -**类型**: 后端新接口 + 字段扩展 -**关联**: 工单 #1590 / PR #1592 -**日期**: 2026-05-01 -**前端处理者**: mmg -**影响范围**: 管理后台「合同方案管理」+「订单出行人录入」+「合同生成」三块联动改造 - ---- - -## 背景 - -用户反馈 12301 国家旅游服务监管平台合同上报字段大量空白,本 PR 完整对齐 2026 spec: - -- 12301 上报 21 个原本声明但未接通的 setter 全接通(投诉详细地址 / 合同份数 / 营业网点 / 付款明细 / 同住名单 / 导游列表 / race / nationality / 行程附件 / 自费购物 / 紧急联系人等) -- 新增 2 张子表 `contract_scheme_attachment` + `contract_tour_guide`(管理后台需要 UI 对应) -- `order_traveler` 加 `race`(民族) + `room_group_no`(同住分组号) -- 行程 PDF 自动生成上传 OSS 嵌入 12301 attachments[] 节点 - -业务规则锁定(用户明确): -- 所有产品**无购物**: shoppingArrangement = [] 永远 -- 所有产品**无额外收费**: selfExpenseItems = [] 永远 -- 付款方式**固定对公转账**: paymentMethod=2, payBankCard=15050161665209911111(从 nacos AgencyInfo.bankCard 注入) -- **导游有的产品没有**: tourGuides[] 允许空数组(无导游产品不强制录入) - ---- - -## 新增接口 1: 合同方案附件管理 - -### `GET /admin/contract/scheme/{schemeId}/attachments` - -查询合同方案附件列表。 - -**Path 参数**: -- `schemeId` (Long, 必填) — 合同方案 ID - -**返回示例**: -```json -{ - "code": 200, - "message": "成功", - "data": [ - { - "attachmentId": "2049914870366703618", - "schemeId": 3, - "fileName": "服务标准.pdf", - "ossUrl": "https://hlgl-test.oss-cn-beijing.aliyuncs.com/contract/scheme-attachment/2026-05/3_xxxxx.pdf", - "ossKey": "contract/scheme-attachment/2026-05/3_xxxxx.pdf", - "fileSize": 102400, - "fileType": "PDF", - "sortOrder": 10, - "createTime": "2026-05-01 02:12:45" - } - ] -} -``` - -### `POST /admin/contract/scheme/{schemeId}/attachments` - -上传新附件(multipart/form-data)。 - -**Path 参数**: -- `schemeId` (Long) - -**form-data**: -- `file` (MultipartFile, 必填) — 附件文件,支持 PDF/JPG/PNG 等 -- `fileType` (String, 必填) — 字典 `contract_attachment_type`: `PDF` / `IMAGE` / `OTHER` -- `sortOrder` (Integer, 选填,默认 0) — 排序号,越小越前 - -**返回**: 与 GET 列表的单项结构相同,含 `attachmentId` / `ossUrl` - -### `PUT /admin/contract/scheme/{schemeId}/attachments/{attachmentId}/sort` - -调整附件排序。 - -**Body**: -```json -{ "sortOrder": 20 } -``` - -### `DELETE /admin/contract/scheme/{schemeId}/attachments/{attachmentId}` - -删除附件(软删除)。 - ---- - -## 新增接口 2: 合同方案导游管理 - -### `GET /admin/contract/scheme/{schemeId}/tour-guides` - -查询合同方案导游列表。 - -**返回示例**: -```json -{ - "code": 200, - "message": "成功", - "data": [ - { - "guideId": "2049915142757388290", - "schemeId": 3, - "name": "李导", - "phone": "13800138000", - "licenseNumber": "L-NMG-100953", - "sortOrder": 1, - "createTime": "2026-05-01 02:13:50" - } - ] -} -``` - -### `POST /admin/contract/scheme/{schemeId}/tour-guides` - -新增导游(application/json)。 - -**Body**: -```json -{ - "name": "李导", - "phone": "13800138000", - "licenseNumber": "L-NMG-100953", - "sortOrder": 1 -} -``` - -**字段说明**: -- `name` (String, 必填,≤50 字) -- `phone` (String, 选填,11 位手机号) -- `licenseNumber` (String, 选填,≤64 字,导游证号) -- `sortOrder` (Integer, 选填,默认 0) - -### `PUT /admin/contract/scheme/{schemeId}/tour-guides/{guideId}` - -修改导游(同 POST body)。 - -### `DELETE /admin/contract/scheme/{schemeId}/tour-guides/{guideId}` - -删除导游(软删除)。 - ---- - -## 出行人字段扩展 - -### 新增字段 (3 个 SaveReqVO + TravelerVO 都要加) - -| 字段 | 类型 | 是否必填 | 说明 | -|------|------|---------|------| -| `race` | String | 选填 | 民族(默认\"汉族\"; 12301 race) | -| `nationality` | String | 选填 | 国籍(默认\"中国\"; 港澳台/外籍必填) | -| `roomGroupNo` | Integer | 选填 | 同住分组号(同号=同房; NULL 系统自动两两配对) | - -### 影响接口 - -| 接口 | 变更 | -|------|------| -| `POST /admin/order/traveler` 创建出行人 | Body 新增 race/nationality/roomGroupNo | -| `PUT /admin/order/traveler/{id}` 修改出行人 | Body 新增 race/nationality/roomGroupNo | -| `POST /mp/order/traveler` 小程序新增出行人 | Body 新增 race/nationality/roomGroupNo | -| `GET /admin/order/traveler/{id}` 查出行人详情 | Resp 新增 race/nationality/roomGroupNo 三个字段 | -| `GET /admin/order/traveler/list` 列表 | 同上 | - -### 兜底规则 - -- 后端:`race` null → 上报 12301 用 \"汉族\";`nationality` null → \"中国\"。前端可不强制要求,默认值由后端兜底 -- `roomGroupNo` 为空时,后端按 traveler 列表顺序两两配对(0+1, 2+3, ...);奇数尾巴单人成对(自配自避免空) -- 港澳台/护照证件出行人**建议前端引导填写**(身份证可反推国籍/民族,护照不可) - ---- - -## 前端管理后台需要新增的 UI - -### 1. 合同方案管理页 — 附件 Tab - -在合同方案编辑页(`/admin/contract/scheme/edit/{id}`)加一个「附件管理」分块: -- 附件列表表格(file_name / file_type / file_size / sort_order / 操作) -- 上传按钮(MultipartFile,限 PDF/JPG/PNG,大小 ≤ 10MB) -- 排序拖动 / 删除按钮 - -附件用途:**长期复用模板**,如旅行社服务标准 PDF / 公司资质照片等。生成合同时自动嵌入 12301 attachments[] 节点。 - -### 2. 合同方案管理页 — 导游 Tab - -同方案编辑页加「导游管理」分块: -- 导游列表表格(name / phone / license_number / sort_order / 操作) -- 新增按钮 → 弹窗表单(姓名 / 手机号 / 导游证号 / 排序) -- 修改 / 删除 - -业务规则: **没配导游就空,不强制录入**。有导游产品才需要在方案里配。 - -### 3. 订单出行人录入页 - -`/admin/order/{orderId}/traveler/edit` 表单加 3 个字段: -- 民族(下拉,使用字典 `nation` 或文本输入,默认\"汉族\") -- 国籍(下拉,默认\"中国\";使用字典 `nationality` 如有) -- 同住分组号(数字输入,提示\"同号=同房,空=系统自动两两配对\") - -小程序录入页 `/mp/order/traveler/edit` 同步加。 - ---- - -## 自动行程附件(无前端配合) - -**后端自动生成**: 创建合同时,后端自动从订单产品快照渲染一份「行程单.pdf」(用 PDFBox 渲染,中文用 arphic uming TTC),上传 OSS,嵌入 12301 attachments[] 节点的第一项。前端**不需要做任何事**,这块用户看到的是 12301 平台合同 PDF 内已有完整的每日行程内容。 - -样本: 测试服 round-trip 生成的 12301 合同 ECDJ260501IYZJR9, 25 页 PDF(含行程单作为附件 1)。 - ---- - -## 测试服验证 - -| 步骤 | 命令 | 结果 | -|------|------|------| -| 上传附件 | `POST /admin/contract/scheme/3/attachments` | 200 | -| 查附件 | `GET /admin/contract/scheme/3/attachments` | 返回 1 条 | -| 加导游 | `POST /admin/contract/scheme/3/tour-guides` | 200 | -| 查导游 | `GET /admin/contract/scheme/3/tour-guides` | 返回 1 条 | -| 创建合同 | `POST /admin/contract/create-by-scheme` body `{orderId,schemeId}` | 200, 合同号 ECDJ260501IYZJR9 | -| 12301 PDF | 25 页, 467 KB | 银行卡/投诉区号/附件1/海拉尔区营业部/汉族 全部呈现 | - ---- - -## 部署状态 - -- 测试服 SQL 已应用(2 张新表 + order_traveler 加 race/room_group_no) -- 测试服 nacos `hl-order-service-v2-test.yml` (namespace=test) 已推送 6 字段(3 agency × 6) -- 测试服 hl-order-service-v2 双实例已重启 -- 正式环境 nacos 配置补字段 + 部署待运维管理员处理 - ---- - -## 服务重启提示 - -合并后只需重启 `hl-order-service-v2`(单服务)。其他服务无影响。 diff --git a/changelogs/2026-05/01_feat_contract_scheme_attachments_tab.md b/changelogs/2026-05/01_feat_contract_scheme_attachments_tab.md new file mode 100644 index 0000000..0dbb124 --- /dev/null +++ b/changelogs/2026-05/01_feat_contract_scheme_attachments_tab.md @@ -0,0 +1,132 @@ +# 合同方案管理页 — 新增「附件管理」Tab + +**类型**: 后端新接口 +**前端处理者**: mmg +**日期**: 2026-05-01 +**关联**: 工单 #1590 / PR #1592 #1594 +**影响页面**: 管理后台「合同管理 → 合同方案 → 编辑方案」 + +--- + +## 这是什么 + +合同方案现在可以挂附件(PDF/图片)。生成 12301 合同时,方案附件会**自动作为合同附件嵌入**到 12301 平台合同 PDF 中。 + +**用途举例**: +- 旅行社服务标准 PDF +- 公司资质照片 +- 安全告知补充说明 +- 任何需要随合同长期出现的材料 + +**业务规则**:方案上传几个附件,生成合同时就嵌入几个,不需要每个订单单独传。 + +--- + +## UI 需求 + +在合同方案编辑页(路由类似 `/admin/contract/scheme/edit/:id`)加一个 **「附件管理」Tab**,里面: + +1. **附件列表表格**: + - 列:文件名 / 类型 / 大小 / 排序号 / 创建时间 / 操作 + - 操作:下载(`ossUrl`)/ 调整排序号 / 删除 + +2. **上传按钮**: + - 点击 → 弹窗 + - 表单字段: + - 文件(必填,accept=`.pdf,.jpg,.jpeg,.png`,限 10MB) + - 文件类型(下拉:PDF / 图片 / 其他) + - 排序号(数字,默认 0,越小越前) + - 提交 → multipart 上传 + +3. **删除二次确认**:删后从列表移除 + +--- + +## 接口 + +**Base path**: `/admin/contract/scheme/{schemeId}/attachments` + +### 1. 查询附件列表 + +``` +GET /admin/contract/scheme/{schemeId}/attachments +Authorization: Bearer + +→ 200 +{ + "code": 200, + "data": [ + { + "attachmentId": "2049914870366703618", // String 雪花 + "schemeId": 3, + "fileName": "服务标准.pdf", + "ossUrl": "https://hlgl-test.oss-cn-beijing.aliyuncs.com/contract/scheme-attachment/2026-05/3_xxx.pdf", + "fileSize": 102400, // 字节数 + "fileType": "PDF", // PDF / IMAGE / OTHER + "sortOrder": 10, + "createTime": "2026-05-01 10:12:45" + } + ] +} +``` + +### 2. 上传新附件(multipart/form-data) + +``` +POST /admin/contract/scheme/{schemeId}/attachments +Authorization: Bearer +Content-Type: multipart/form-data + +form-data: + file: (必填, ≤10MB) + fileType: "PDF" (必填, 字典 PDF / IMAGE / OTHER) + sortOrder: 10 (选填, 默认 0) + +→ 200 +{ + "code": 200, + "data": { ...同上单条结构, 含新生成 attachmentId 和 ossUrl... } +} +``` + +### 3. 调整排序 + +``` +PUT /admin/contract/scheme/{schemeId}/attachments/{attachmentId}/sort +Content-Type: application/json +{ "sortOrder": 20 } + +→ 200 { "code": 200, "data": null } +``` + +### 4. 删除附件(软删除) + +``` +DELETE /admin/contract/scheme/{schemeId}/attachments/{attachmentId} + +→ 200 { "code": 200, "data": null } +``` + +--- + +## 字段字典 + +`fileType` 字典 `contract_attachment_type`: + +| 字典 value | 显示名 | +|-----------|------| +| PDF | PDF 文档 | +| IMAGE | 图片 | +| OTHER | 其他 | + +--- + +## 测试服已就绪 + +可以现在直接调测试服 (`https://api.test.1814.love:9443`) 的 GET 端点验证(schemeId=3 是测试数据)。 + +--- + +## 服务重启 + +后端 hl-order-service-v2 已上线,前端开发完直接对接即可。 diff --git a/changelogs/2026-05/01_feat_contract_scheme_tour_guides_tab.md b/changelogs/2026-05/01_feat_contract_scheme_tour_guides_tab.md new file mode 100644 index 0000000..681ff09 --- /dev/null +++ b/changelogs/2026-05/01_feat_contract_scheme_tour_guides_tab.md @@ -0,0 +1,120 @@ +# 合同方案管理页 — 新增「导游管理」Tab + +**类型**: 后端新接口 +**前端处理者**: mmg +**日期**: 2026-05-01 +**关联**: 工单 #1590 / PR #1592 +**影响页面**: 管理后台「合同管理 → 合同方案 → 编辑方案」 + +--- + +## 这是什么 + +合同方案现在可以配导游名单。生成 12301 合同时,方案下配的导游会**作为合同条款的一部分上报到 12301 平台**(合同正文显示导游姓名/电话/导游证号)。 + +**业务规则**: +- **不强制**:自驾产品 / 不带团产品**没导游就不配,留空数组即可**(用户原话:"导游有的产品没有") +- **方案级配置**:一个方案对应一组默认导游(同一线路通常配同一批导游) +- 后端**永远不会兜底**到经办人,没配就 12301 上报空导游列表 + +--- + +## UI 需求 + +在合同方案编辑页加一个 **「导游管理」Tab**,里面: + +1. **导游列表表格**: + - 列:姓名 / 手机号 / 导游证号 / 排序号 / 创建时间 / 操作 + - 操作:编辑 / 删除 + +2. **新增按钮**: + - 点击 → 弹窗表单 + - 字段(详见下方接口) + - 提交 → POST 接口 + +3. **编辑**: + - 复用同一弹窗,PUT 接口 + +4. **删除二次确认** + +--- + +## 接口 + +**Base path**: `/admin/contract/scheme/{schemeId}/tour-guides` + +### 1. 查询导游列表 + +``` +GET /admin/contract/scheme/{schemeId}/tour-guides + +→ 200 +{ + "code": 200, + "data": [ + { + "guideId": "2049915142757388290", // String 雪花 + "schemeId": 3, + "name": "李导", + "phone": "13800138000", // 后端已用 EncryptTypeHandler 自动加解密 + "licenseNumber": "L-NMG-100953", + "sortOrder": 1, + "createTime": "2026-05-01 10:13:50" + } + ] +} +``` + +**返回空列表**(`data: []`)很正常 — 该方案没配导游。 + +### 2. 新增导游 + +``` +POST /admin/contract/scheme/{schemeId}/tour-guides +Content-Type: application/json + +{ + "name": "李导", // 必填, ≤50 字 + "phone": "13800138000", // 选填, 11 位手机号(13/14/15/16/17/18/19 开头) + "licenseNumber": "L-NMG-100953", // 选填, ≤64 字 + "sortOrder": 1 // 选填, 默认 0, 越小越前 +} + +→ 200 { "code": 200, "data": { ... 含新 guideId } } +``` + +**校验**: +- name 不能空 +- phone 格式 `^$|^1[3-9]\d{9}$`(允许空 OR 11 位手机号) +- 长度限制后端已校验,前端可加客户端校验提升体验 + +### 3. 修改导游 + +``` +PUT /admin/contract/scheme/{schemeId}/tour-guides/{guideId} +Content-Type: application/json + +{ ...同 POST body... } + +→ 200 { "code": 200, "data": { ... 同 GET 单条结构 } } +``` + +### 4. 删除导游(软删除) + +``` +DELETE /admin/contract/scheme/{schemeId}/tour-guides/{guideId} + +→ 200 { "code": 200, "data": null } +``` + +--- + +## 测试服已就绪 + +`https://api.test.1814.love:9443/admin/contract/scheme/3/tour-guides` GET 立即可调(admin token 可用 wx 账号登录拿)。 + +--- + +## 服务重启 + +后端已上线,前端开发完直接对接。 diff --git a/changelogs/2026-05/01_feat_traveler_race_nationality_room_group.md b/changelogs/2026-05/01_feat_traveler_race_nationality_room_group.md new file mode 100644 index 0000000..c0afee8 --- /dev/null +++ b/changelogs/2026-05/01_feat_traveler_race_nationality_room_group.md @@ -0,0 +1,129 @@ +# 出行人录入 — 新增 民族 / 国籍 / 同住分组号 三个字段 + +**类型**: 后端字段扩展 +**前端处理者**: mmg +**日期**: 2026-05-01 +**关联**: 工单 #1590 / PR #1592 +**影响页面**: +- 管理后台「订单详情 → 出行人 → 新增/编辑出行人」 +- 小程序「订单 → 出行人」录入页 + +--- + +## 这是什么 + +出行人 entity 加了 3 个字段,用于 12301 合同上报: + +| 字段 | 类型 | 说明 | 默认值兜底 | +|------|------|------|----------| +| `race` | String | 民族(中文,如 "汉族" "蒙古族" "回族") | 后端兜底 "汉族" | +| `nationality` | String | 国籍(中文,如 "中国") | 后端兜底 "中国" | +| `roomGroupNo` | Integer | 同住分组号(同号=同房,例如夫妻填同一数字 1,独立间填 NULL 或唯一数字) | 系统自动两两配对 | + +--- + +## UI 需求 + +### 出行人录入弹窗 / 表单 + +加三个字段(建议放在「证件号 / 手机号 / 紧急联系人」附近): + +1. **民族**(选填) + - 推荐用 **下拉框**,但项目暂没"民族"字典 + - **简化方案**:用文本输入框 + placeholder "默认汉族, 港澳台/护照证件请填实际民族" + - 后端会用 EncryptTypeHandler 加密存储不?**不加密**(当前 entity 直接 String race) + - 长度限制 20 字符 + +2. **国籍**(选填) + - 文本输入 + placeholder "默认中国, 港澳台/护照证件必填" + - 长度限制 50 字符(实际更短) + +3. **同住分组号**(选填) + - 数字输入 + placeholder "同号=同房, 留空系统自动两两配对" + - 提示文案: + > 例如夫妻同房:两人都填 1 + > 朋友合住:两人都填 2 + > 单人房:填唯一数字(如 99) + > 留空:系统按列表顺序自动两两配对(0+1, 2+3...) + +--- + +## 接口(增量字段) + +### 1. 管理端新增出行人 + +``` +POST /admin/order/{orderId}/traveler +Content-Type: application/json + +{ + "name": "张三", + "idCardType": "ID_CARD", + "idCardNo": "152104199802205216", + "phone": "13800138000", + ... + + // 🆕 新增 3 字段(全部选填): + "race": "蒙古族", + "nationality": "中国", + "roomGroupNo": 1 +} +``` + +### 2. 管理端修改出行人 + +``` +PUT /admin/order/traveler/{travelerId} +Content-Type: application/json + +{ ...含同样 3 字段 } +``` + +### 3. 小程序端 + +`POST /mp/order/traveler` body 里也加这 3 字段(逻辑一致)。 + +### 4. 查询出行人详情/列表 + +``` +GET /admin/order/traveler/{travelerId} +GET /admin/order/{orderId}/travelers + +→ 200 +{ + "code": 200, + "data": { + ...原有字段... + "race": "汉族", // 🆕 + "nationality": "中国", // 🆕 + "roomGroupNo": 1 // 🆕 (Integer 或 null) + } +} +``` + +--- + +## 哪种证件类型必填? + +业务规则: + +| 证件类型 | race / nationality 重要性 | +|---------|-------------------------| +| 身份证(ID_CARD) | 系统可由身份证号反推民族/国籍,**前端可不填**,后端兜底 | +| 港澳通行证 | **建议填**,身份证算法不适用 | +| 护照(PASSPORT) | **建议填**,外籍/海外华人必填正确国籍 | +| 台湾通行证 | 同港澳通行证 | + +可在表单上加提示文案引导。 + +--- + +## 测试服已就绪 + +后端字段已上线,前端调用接口加这 3 个字段即可。 + +--- + +## 服务重启 + +后端 hl-order-service-v2 已上线。`order_traveler` 表已 ALTER 加 race + room_group_no 列(nationality 之前已有)。