[changelogs-v2/2026-05] #2586 合同/保险接通后 4 处 VO/字段不明 #3
正在加载...
x
在新工单中引用
屏蔽一个用户
没有提供说明。
删除分支 %!s()
删除分支是永久的。虽然已删除的分支在实际被删除前有可能会短时间存在,但这在大多数情况下无法撤销。是否继续?
删除分支是永久的。虽然已删除的分支在实际被删除前有可能会短时间存在,但这在大多数情况下无法撤销。是否继续?
前端按 #2586 接入合同/保险 v3 完成(commit 08359913),但 changelog 未列 VO 完整字段表与若干字段约束,前端目前用「宽容渲染 + 占位字段名」过渡,需后端补齐契约。
一、待确认
1) ContractVO 完整字段
GET /v3/admin/contract/list?orderId=出参 list 元素字段未列。前端当前读:schemeName / version / contractNo / status / signedAt / signUrl / pdfUrl(沿用老 mock 名)。请确认真实字段名(特别是contractNo是否就叫这个 /pdfUrl还是contractFileUrl)。2) InsuranceOrderVO 完整字段
同上,
GET /v3/admin/insurance/orders出参字段未列。前端当前读:productName / policyNo / status / amount / coveragePeriod / appliedAt / policyUrl。3) ContractSchemeVO / InsuranceSchemeVO 字段
方案下拉用,前端只用
id / name,确认即可;如有disabled/enabled之类的状态字段也请列。4)
createContractByScheme/purchaseInsurancebody 完整字段changelog 写
{orderId, schemeId, ...}省略号未展开。请列必填/选填全字段(特别是手动投保是否需要前端传 travelerIds / coverageStartDate 等)。5)
triggeredEvents是否稳定契约字段POST /v3/admin/order/{id}/transition同步返回的triggeredEvents: ["ASYNC_CONTRACT_GENERATE", "ASYNC_INSURANCE_ISSUE"]是约定字段吗?前端按 changelog 描述直接 parse 这个数组,命中则 toast 异步生成提示。如果是临时调试字段需要换其他识别方式。6) OrderMainVO 6 个新 tab 状态字段
前端 v3Adapter 假设 OrderMainVO 包含
contractStatus / insuranceStatus / refundStatus / hasRefund / hasServiceStandard / hasFinanceDetail用于侧边 Tab 红点判断,但 §1.2 当前 OrderMainVO 字段表未列。请确认是否已加 / 计划加 / 走另一接口聚合。二、低优 / 仅文档建议
阻塞情况
不阻塞:前端已用宽容渲染上线,等真测时按真实字段名微调。仅在前端联调时若字段名不对,需要回此 issue 同步真名。
字段实证(基于 dev-v3 HEAD 后端代码)
逐条回复,所有字段名按
com.hulalv.{module}.vo.*真实代码核验。1️⃣ ContractVO 字段映射 + 完整清单
接口:
GET /v3/admin/contract/list、GET /v3/admin/contract/by-order/{orderId}、GET /v3/admin/contract/active-by-order/{orderId}字段映射(前端假设 → 真名):
schemeNametemplateNameversioncontractNocontractNumberstatusstatus✅(+statusLabel中文)signedAtContractDetailVO.statusLogs[]取最后一条SIGNED状态时间,或用createTime占位signUrlsignUrl✅pdfUrlfileUrlContractVO 完整 27 字段:
contractId / orderId / schemeId / orderNo / templateCode / templateName / contractNumber / platform / contractType / contractTypeLabel / mode / modeLabel / status / statusLabel / signUrl / qrCodeUrl / fileUrl / agencyCode / travelAgencyName / destination / departureDate / returnDate / totalAmount / touristCount / contactName / contactPhone / createTimeContractDetailVO(GET /v3/admin/contract/{id})= ContractVO + 3 字段:
supplementaryClause(补充约定)travelers[](出行人列表:travelerId/name/idCardType/idCardTypeLabel/idCardNo/phone/isSigner,证件号和手机号是明文,由前端处理脱敏展示)statusLogs[](状态变更日志)2️⃣ InsuranceOrderVO 字段映射 + 完整清单
接口:
GET /v3/admin/insurance/orders、GET /v3/admin/insurance/orders/by-order/{orderId}字段映射:
productNameproductName✅policyNoextPolicyNo(推荐)statusstatus✅(+statusLabel中文)amountpremiumcoveragePeriodcoverageStartDate+coverageEndDateappliedAtcreateTimepolicyUrlpolicyPdfUrl⚠️ policyNo 字段虽然还在(兼容字段,与
extPolicyNo同值),但 ApiModelProperty 已标注"后续版本将废弃,前端请改用 extPolicyNo"。新代码请用extPolicyNo。InsuranceOrderVO 完整 16 字段:
insuranceOrderId / orderId / planId / extOrderNo / extPolicyNo / policyNo(deprecated) / productName / planName / premium / insuredCount / coverageStartDate / coverageEndDate / status / statusLabel / policyPdfUrl / createTimeInsuranceOrderDetailVO(GET /v3/admin/insurance/orders/{id})= 上面 + 补丁字段:
schemeId / schemeName / insuranceProductId / productId(v1兼容) / totalPremium(=premium v1兼容) / startDate/endDate(v1兼容) / policyHolderName / entityCode / insuredPersons[] / coverages[] / remark / thirdPartyPolicyId / updateTime3️⃣ Scheme VO 字段(下拉用)
ContractSchemeVO(合同方案下拉):
schemeIdnamedescriptioncontractPlatform12301/LOCAL/TENCENT_ESIGNcontractTemplateNamestatusACTIVE/INACTIVE(用这个判可用)完整字段另含:
vendorCode / channel / contractTemplateCode / templateCode / contractMode / signatoryMode / agencyCode / agencyName / supplementaryClause / transactorName / transactorPhone / sortOrder / createTimeInsuranceSchemeVO(保险方案下拉):
schemeIdschemeNamenamedescriptionenabledstatusACTIVE/INACTIVE(与 enabled 并存,含义相同)autoInsureisOverseastotalDaysinsuranceProductIdproductNameplanIdplanNamesegments[]完整字段另含:
sortOrder / adminId / segmentCount / createTime / updateTime⚠️ 类型不一致:contract 的
schemeId是 String,insurance 的schemeId是 Long。v3Adapter 注意。4️⃣ 创建合同 / 投保 入参完整字段
POST /v3/admin/contract/create-by-schemeCreateContractBySchemeRequest(只有 2 个字段):两个都必填。后端从订单 + 方案自动装配出行人 / 日期 / 联系人 / 合同金额等所有细节。
如果要前端手动填全部细节,走
POST /v3/admin/contract/create→CreateContractRequest(40+ 字段:templateCode / destination / routeName / departureDate / returnDate / signatoryName / signatoryPhone / signatoryIdNumber / contactName / contactPhone / totalAmount / adultCost / childCost / travelers[] 等)。POST /v3/admin/insurance/purchase(手动投保)PurchaseInsuranceRequest:orderIdschemeIdinsuranceProductIdplanIdcoverageStartDatecoverageEndDateinsuredPersons[]remarkInsuredPersonItem子结构:name(必填)idCardType(必填,ID_CARD/PASSPORT/OTHER,JsonAlias 兼容idType)idCardNo(必填,JsonAlias 兼容idNo)birthday(可选)phone(可选)POST /v3/admin/insurance/purchase-by-scheme(按方案自动投保)AutoPurchaseRequest(只有 2 字段):📌 回答 issue #4 的具体问题:手动投保不需要传 travelerIds,需要传完整
insuredPersons[](或留空让后端按订单出行人自动填)。coverageStartDate / coverageEndDate也是可选,留空走订单日期。5️⃣
triggeredEvents是稳定契约字段 ✅接口:
POST /v3/admin/order/{id}/transition返回 VO:
OrderTransitionRespVOsuccessoldStatus/newStatusoldFlowStatus/newFlowStatustriggeredEvents["ASYNC_CONTRACT_GENERATE","ASYNC_INSURANCE_ISSUE"]triggeredEvents带@ApiModelPropertySwagger 文档 + example,是稳定契约字段,不是临时调试字段。前端 parse 这个数组做 toast 提示(如"合同正在异步生成")是合理设计,可以放心依赖。新增的事件枚举会在 changelog 里同步。
6️⃣ OrderMainVO 6 个 tab 状态字段 — 全部已存在 ✅
接口:订单详情 main Tab(具体路径在 OrderDetail Controller,需要时补对照)
OrderMainVO 已有的 6 个 tab 字段:
contractStatusNONE/GENERATING/GENERATED/SIGNED/VOIDED/RESIGNING(直接读主表 contractStatus)insuranceStatusNONE/ISSUING/ISSUED/CANCELLED/FAILED(直接读主表 insuranceStatus)refundStatusNONE/PROCESSING/COMPLETED(派生,见 OrderMainRefundStatus)hasRefundrefundedAmount > 0hasServiceStandardorder_product_snapshot存在且非空hasFinanceDetaildiscountAmount > 0 或 surchargeAmount > 0(派生,无 SQL)前端 v3Adapter 直接读这 6 个字段做 tab 红点判断即可,不需要走另一接口聚合。
另外 OrderMainVO 还有一个相关字段:
exceptionBadges(Map<String, Boolean>):异常态横条 9 类标识,key 包括contractFail/insuranceFail/refundAbnormal/grabTimeout/hotelPending/vehiclePending/travelerIncomplete/longUnpaid/awaitingCustomerConfirm(用于"业务异常徽标",跟 6 个 tab 状态字段语义不同)。7️⃣ 关于 540022 携带白名单的建议
合理但不在本 issue 范围,需要后端动错误码定义。当前 message 是写死字符串:
未带白名单状态。我会另起一张工单跟进(错误码语义增强)。
后续动作
后端这边会另起一个 changelog 文件
changelogs-v2/2026-05/{今天日期}_*_合同保险VO字段补全-修改接口-管理后台.md,把上面 6 节全字段表自包含归档。本 issue 不阻塞前端联调:按上面 6 个映射表改 v3Adapter,可直接对接真实接口。