hl-api-changelog/changelogs-v2/2026-07/03_4691_打印行程单出参二次调整-修改接口-管理后台.md
yaosutu 985240047c docs(changelog): 打印行程单出参二次调整(Issue #4691,PR #4692)
去 printTime / dateRange 拆 departDate+returnDate / 顶层补订单号+订单总额+应收总额+应收尾款 / 餐食三布尔改 meals 数组 / 节点加 serviceStandard。多处破坏性,管理后台前端须同步。
2026-07-01 14:38:23 +08:00

12 KiB

打印行程单出参二次调整(去 printTime / 拆日期 / 补订单金额 / 餐食 meals 数组 / 节点服务标准)

接口路径GET /v3/admin/order/{id}/print-itinerary 服务hl-order-service-v3 PR#4692 Issue#4691 前序#4683(第一轮增强)/ #4650(首上线)| 合并至dev-v3 变更类型:修改接口(含破坏性变更)


1. 接口背景

打印行程单出团行程单·Driver Copy接口联调后按前端反馈做第二轮出参调整。只改出参,入参不变,零 DDL,无新依赖。

调整目标:

  • 打印时间去后端化,改前端本地生成。
  • 出团/返回日期拆开,让前端自行拼接展示。
  • 补齐订单号 + 订单级金额(总额/应收总额/应收尾款)。
  • 餐食含餐字段结构化(三个平铺布尔 → meals 数组,带中文标签)。
  • 每个资源点位带上服务标准。

2. 变更清单

类型 字段路径 变更说明
删除字段 printTime 打印时间不再由后端返回,前端本地生成
删除字段 dateRange 出行日期范围字符串删除,拆为 departDate + returnDate
新增字段 departDate 出团日期LocalDate
新增字段 returnDate 返回日期LocalDate
新增字段 orderNo 订单号
新增字段 orderAmount 订单总额(下单冻结原价)
新增字段 payableTotal 订单应收总额
新增字段 outstandingBalance 应收尾款(待收)
删除字段 days[].breakfast / lunch / dinner 原 Boolean 三字段删除
新增字段 days[].meals 数组,固定早/午/晚三项,each {type,label,included}
新增字段 days[].nodes[].serviceStandard 资源服务标准(景点/活动/服务有值,餐厅无恒 null

入参无变化无 DDL无新依赖


3. 接口详情

  • 方法GET
  • 路径:/v3/admin/order/{id}/print-itinerary
  • 鉴权:管理后台 JWT公司隔离后端从 JWT 校验,前端不传)
  • 响应:Result<PrintItineraryRespVO>

4. 入参

位置 字段 类型 必填 说明
Path id String 订单 ID

本次入参无变化。


5. 出参

5.1 顶层(本次变化字段)

字段 类型 说明 变化
orderNo String 订单号 新增
departDate LocalDate(String) 出团日期 新增(原 dateRange 拆分)
returnDate LocalDate(String) 返回日期 新增
orderAmount BigDecimal(String) 订单总额(冻结原价;本地数据恒在,不随 feeDetail 降级) 新增
payableTotal BigDecimal(String) 订单应收总额(取消单为 0 新增
outstandingBalance BigDecimal(String) 应收尾款(待收) 新增
printTime String 打印时间 删除
dateRange String 出行日期范围 删除

其余顶层字段agencyName / teamNo / productName / paxSummary / driver·guide·leader Name/Phone / consultantName不变。

5.2 days[] 每日行程(变化字段)

字段 类型 说明 变化
meals List<MealVO> 餐食含餐列表,固定早/午/晚三项 新增(原 breakfast/lunch/dinner 三布尔删除)
breakfast / lunch / dinner Boolean 是否含餐 删除,并入 meals

MealVO

字段 类型 说明
type String 餐次BREAKFAST / LUNCH / DINNER
label String 餐次中文:早餐 / 午餐 / 晚餐
included Boolean 是否含餐

5.3 days[].nodes[] 点位(新增字段)

字段 类型 说明
serviceStandard String 资源服务标准;覆盖景点(SCENIC)/活动(ACTIVITY)/服务(SERVICE),餐厅(RESTAURANT)无此字段恒 null;资源未维护/失败为 null

节点既有字段nodeName / nodeType / description / startTime / timePeriod / contactPerson / contactPhone / supplierPhone / remark不变。


6. 枚举 / 数据字典

说明
meals[].type BREAKFAST / LUNCH / DINNER 早 / 午 / 晚
meals[].included true 含团餐 / 特色餐(底层 HOTEL / SPECIAL
meals[].included false 不含 / 自理(底层 NONE / SELF / 空)
serviceStandard 有值 仅景点 / 活动 / 服务类资源
serviceStandard null 餐厅节点,或资源未维护服务标准

7. 错误码

本次无新增错误码。接口为纯查询聚合,Feign 依赖失败走降级(费用块整体 null、联系人/服务标准返空串/null,不抛业务错误。


8. 示例

8.1 典型成功(字段全填示范)

{
  "code": 200,
  "message": "成功",
  "data": {
    "agencyName": "内蒙古呼籁国际旅行社有限公司",
    "orderNo": "HL20260701001",
    "teamNo": "26-0554",
    "productName": "游牧的森林-短途版",
    "departDate": "2026-07-01",
    "returnDate": "2026-07-04",
    "paxSummary": "2大2小",
    "orderAmount": "18000.00",
    "payableTotal": "12000.00",
    "outstandingBalance": "6000.00",
    "driverName": "扎西", "driverPhone": "13700137001",
    "guideName": "", "guidePhone": "", "leaderName": "", "leaderPhone": "",
    "consultantName": "王骁",
    "transports": [
      {"direction": "ARRIVAL", "transportType": "FLIGHT", "transportNo": "CA1234", "carrier": "中国国航", "departStation": "北京首都T2", "arriveStation": "海拉尔东山机场", "departTime": "2026-07-01 08:00:00", "arriveTime": "2026-07-01 10:30:00", "pickupRequired": true, "pickupRemark": "T2出口举牌", "remark": null}
    ],
    "customerOverview": {"customerName": "吕思远", "customerPhone": "138****0020", "adultCount": 2, "childCount": 1, "youngChildCount": 1, "babyCount": 1, "tripDays": 4, "customerType": null, "createSource": "CONSULTANT", "customerRemark": "忌海鲜"},
    "feeDetail": {"items": [{"name": "成人包价", "unitPrice": "3380.00", "qty": 2, "subtotal": "6760.00"}], "singleRoomSurcharge": "0", "grandTotal": "9540.00", "onsiteBalance": "3540.00"},
    "hotels": [
      {"dayNumber": 1, "stayDate": "2026-07-01", "hotelName": "海拉尔海棠酒店", "city": "呼伦贝尔市", "roomCategory": "标间", "roomCount": 4, "contactPerson": "海棠-李经理", "contactPhone": "0470-7777777", "settleType": "公司付款", "paymentMode": "月结", "checkInTime": "14:00", "checkOutTime": "12:00"}
    ],
    "emergencyContacts": [{"contactName": "admin", "contactPhone": "13000000001", "role": "房务"}],
    "days": [
      {
        "dayNumber": 1, "dayDate": "2026-07-01", "dayTitle": "海拉尔接机", "week": "周三",
        "description": "接机入住自由活动",
        "meals": [
          {"type": "BREAKFAST", "label": "早餐", "included": true},
          {"type": "LUNCH", "label": "午餐", "included": false},
          {"type": "DINNER", "label": "晚餐", "included": false}
        ],
        "diningRemark": null,
        "gatherPlace": "{\"name\":\"海拉尔东山机场\",\"cityName\":\"呼伦贝尔市\"}",
        "dismissalPlace": "{\"name\":\"海拉尔海棠酒店\"}",
        "dailyMileage": "200.00",
        "nodes": [
          {"nodeName": "黑山头", "nodeType": "SCENIC", "description": "以壮美日落闻名", "serviceStandard": "黑山头点位服务标准1.带队提前30分钟到集合点清点人数;2.按行程完成本点位服务;3.如遇异常及时上报计调。", "startTime": "10:00", "timePeriod": null, "contactPerson": "黑山头-前台", "contactPhone": "0470-8800006", "supplierPhone": "", "remark": null},
          {"nodeName": "早餐", "nodeType": "RESTAURANT", "description": "含(酒店)", "serviceStandard": null, "startTime": null, "timePeriod": null, "contactPerson": "", "contactPhone": "", "supplierPhone": "", "remark": null}
        ]
      }
    ],
    "notices": [
      {"level": "FORBIDDEN", "title": "严禁事项 · 违者扣全部车费、永不录用", "color": "#DC2626", "icon": "🚫", "items": ["严禁向客人推荐自费项目、带客进购物店;违者扣除本行程全部车费,且永不录用"]},
      {"level": "WARNING", "title": "警示事项 · 风险由领队、师傅承担", "color": "#D97706", "icon": "⚠️", "items": ["送站时间不得早于出发时间前 2 小时"]},
      {"level": "STANDARD", "title": "流程标准 · 出团必做", "color": "#16A34A", "icon": "✅", "items": ["出发前须核实全程住宿安排"]}
    ],
    "refundNotes": [
      {"sourceName": "黑山头", "intro": "退费说明", "items": [{"title": "单项未骑马", "amount": "100", "unitLabel": "/人", "settleScope": "PER_PERSON", "settleScopeLabel": "按人", "remark": null, "effectiveFrom": null, "effectiveTo": null}]}
    ],
    "handoverChecklist": ["出行群已建立并拉入全部出行人"],
    "collectReceipt": {"collectAmount": "3540.00"},
    "remark": null
  },
  "success": true
}

8.2 边界(餐厅节点 serviceStandard 恒 null + 未配司机/大交通)

  • 餐厅节点 serviceStandard 永远 nullresource 模型无此列)。
  • 订单未配司机/大交通时 driverName/driverPhone 为空串、transports 为空数组。
  • 无配房 → hotels 空数组;无固化行程 → days 空数组。
  • 未录代收款 → outstandingBalance 仍按应收派生返回,collectReceipt.collectAmount 为 null。

8.3 异常product-v2 报价 Feign 失败)

  • feeDetail 整块返回 null(前端展示"暂无")。
  • 但顶层 orderAmount/payableTotal/outstandingBalance 仍正常返回(本地数据,不受 Feign 影响)。

9. 业务边界

  • 顶层订单金额orderAmount/payableTotal/outstandingBalance取自订单本地数据,恒返回,不随 feeDetail 的 product-v2 报价 Feign 降级为 null。
  • 服务标准与联系人/电话均为查询类软依赖,失败降级不阻断整单。
  • 餐厅节点 serviceStandard 恒 null 属预期resource restaurant 表无 service_standard 列)。

10. 修改前后对比

字段 修改前 修改后
打印时间 "printTime": "2026-07-01T10:00:00" 字段删除(前端本地生成)
日期 "dateRange": "2026-07-01→2026-07-04" "departDate": "2026-07-01", "returnDate": "2026-07-04"
订单金额 顶层新增 orderNo / orderAmount / payableTotal / outstandingBalance
餐食 "breakfast": true, "lunch": false, "dinner": false "meals": [{"type":"BREAKFAST","label":"早餐","included":true}, {"type":"LUNCH","label":"午餐","included":false}, {"type":"DINNER","label":"晚餐","included":false}]
节点服务标准 days[].nodes[].serviceStandard(景点/活动/服务有值,餐厅 null

11. 影响评估 / 回滚

破坏性变更(前端必须同步):

  1. 删除 printTime → 前端改本地生成打印时间。
  2. 删除 dateRange → 前端改用 departDate + returnDate 拼接。
  3. 删除 days[].breakfast/lunch/dinner → 前端改遍历 days[].meals 数组(用 label 展示、included 判含餐)。

非破坏(可选接入):顶层订单号/金额、节点 serviceStandard。

回滚:接口层回退到 PR #4683 版本(第一轮增强)。零 DDL,无数据迁移,回滚无副作用。


12. 注意事项

  • meals 固定三项、顺序早→午→晚,前端可直接下标或按 type 匹配。
  • serviceStandard 是长文本,前端展示注意折行/截断。
  • 顶层金额为字符串(防 JS 精度丢失),前端按字符串处理或自行解析。

13. 关联 / 联系人

  • Issue#4691
  • PR#4692
  • 前序:#4683(第一轮增强)、#4650(首上线)
  • 设计文档API-SPEC §12.6(四件套 v6.2.2
  • 负责人腰苏图yst