hl-api-changelog/changelogs-v2-mp/2026-06/22_4161_售后申诉-新增接口-小程序端.md

11 KiB

售后申诉 — 小程序端新增接口

  • 端类型:小程序端
  • 变更类型:新增接口
  • 日期2026-06-22
  • 关联 Issuewx/HL#4161
  • 关联 PR#4185小程序端接口/ #4162 #4165 #4168 #4187基础能力
  • 后端负责人腰苏图yaosutu

一、接口背景

v3 全新售后服务中心com.hulalv.aftersale上线。小程序端用户可发起投诉或申诉、查看自己的工单列表与详情、以及在工单未处置前随时撤回。

新增 4 个接口(含 1 个原有但归入本域):发起工单、我的工单列表、工单详情、撤回工单。

本次为全新域,不影响任何已有接口。


二、变更清单

编号 方法 路径 说明
1 POST /v3/mp/aftersale/ticket 发起投诉/申诉工单
2 GET /v3/mp/aftersale/ticket/my 我的工单列表(按订单分页)
3 GET /v3/mp/aftersale/ticket/{id} 工单详情
4 POST /v3/mp/aftersale/ticket/{id}/withdraw 撤回工单

三、接口详情

属性 说明
认证方式 JWT Bearer TokenC 端 Token,Gateway 解析后注入 userId
userId 传递 Gateway 解析 JWT 后注入到请求属性,后端从 HttpServletRequest 取;前端无需传 userId 字段
限流 Gateway 默认限流策略
路径前缀 /v3/mp/aftersale/ticket

四、接口入参

4.1 POST /v3/mp/aftersale/ticket — 发起工单

请求体JSON

字段 类型 必填 约束 说明
orderId Long 订单 ID
category String COMPLAINT / APPEAL 大类:投诉/申诉
type String 见 §六枚举 细分类型,必须与 category 匹配
title String 最多 100 字 工单标题
description String 最多 2000 字 诉求描述
targetRefId Long 条件必填 申诉时必填:关联退款申请 ID;投诉时可不传不传则用 orderId
claimType String REFUND / RECTIFY / EXPLANATION 用户诉求类型,仅供参考
claimAmount Number 用户期望金额,仅供参考,无约束力
attachments Array 最多 10 个 附件 URL 列表(图片/视频)

4.2 GET /v3/mp/aftersale/ticket/my — 我的工单列表

Query 参数:

字段 类型 必填 约束 说明
orderId Long 订单 ID,只查该订单下的工单
pageNo Integer >= 1 页码,默认 1
pageSize Integer 1-50 每页条数,默认 20

4.3 GET /v3/mp/aftersale/ticket/{id} — 工单详情

路径参数idString/Long必填,工单 ID。

注:后端校验工单归属,非本人工单返回 586014。

4.4 POST /v3/mp/aftersale/ticket/{id}/withdraw — 撤回工单

路径参数idString/Long必填,工单 ID。

无请求体。后端校验1. 工单归属(非本人返回 586014;2. 状态(只有 SUBMITTED / PROCESSING 可撤回,否则返回 586013


五、出参字段

5.1 发起工单 — 返回工单 ID

{"code": 200, "data": "1895000000000001"}

data 为 StringLong,即新建工单的 ID。

5.2 我的工单列表 — PageResult 结构

{
  "code": 200,
  "data": {
    "list": [],
    "total": 5,
    "pageNo": 1,
    "pageSize": 20
  }
}

5.3 工单详情及列表行 — TicketMpRespVO 字段

字段 类型 说明
id StringLong 工单 ID
orderId StringLong 关联订单 ID
category String 大类枚举值COMPLAINT / APPEAL
categoryLabel String 大类中文名:投诉 / 申诉
type String 细分类型枚举值,见 §六
typeLabel String 细分类型中文名
title String 工单标题
description String 诉求描述
claimType String 用户诉求类型(可选)
claimAmount Number 用户期望金额(可选)
attachments Array 附件 URL 列表
status String 工单状态枚举值,见 §六
statusLabel String 工单状态中文名
resolutionRemark String 处置说明RESOLVED / CLOSED 后可见,用于展示给用户)
canWithdraw Boolean 是否可撤回SUBMITTED / PROCESSING 且非终态时为 true
createdAt StringISO 8601 创建时间
updatedAt StringISO 8601 更新时间

C 端视图隐藏处置细节decision / resolutionType / resolutionAmount / approvalNo / linkedRefundId,仅展示 status 和 resolutionRemark。

5.4 撤回工单

{"code": 200, "data": null}

六、枚举 / 数据字典

AftersaleCategory — 工单大类

枚举值 中文名 场景
COMPLAINT 投诉 对已发生的服务质量不满
APPEAL 申诉 对某个处理结果不服,求复核

AftersaleTicketType — 细分类型type 字段)

枚举值 中文名 归属大类
ITINERARY 行程 COMPLAINT
HOTEL 酒店 COMPLAINT
VEHICLE COMPLAINT
GUIDE 导游 COMPLAINT
OTHER 其他 COMPLAINT
REFUND_REJECTED 退款被拒 APPEAL
REFUND_AMOUNT_DISPUTE 退款金额异议 APPEAL

type 必须与 category 匹配,否则返回 586012。

AftersaleTicketStatus — 工单状态

枚举值 中文名 终态 说明
SUBMITTED 已提交 等待受理
PROCESSING 处理中 客服受理中
RESOLVED 已处置 处置方案落定(退款类等待到账)
CLOSED 已关闭 流程终结
WITHDRAWN 已撤回 用户主动撤回

canWithdraw = true 的条件status 为 SUBMITTED 或 PROCESSING。

claimType — 用户诉求类型(参考值,无强制约束)

常见值 中文名
REFUND 退款
RECTIFY 整改
EXPLANATION 要个说法

七、错误码

错误码 说明 触发场景
586009 工单不存在 传入 id 找不到工单
586011 同一对象已存在活跃工单 防重复提交(同订单下同 target 已有进行中工单)
586012 category 与 type 不匹配 如 COMPLAINT 传了 REFUND_REJECTED
586013 撤回时状态非法 终态或 RESOLVED 工单不可撤回
586014 非本人工单 查看/撤回他人工单
586015 申诉必须关联退款申请 APPEAL 类工单未传 targetRefId
586016 申诉关联退款状态不合法 关联的退款申请状态不允许申诉

八、示例

8.1 典型成功 — 发起投诉工单

请求:

POST /v3/mp/aftersale/ticket
Authorization: Bearer {mp_token}
Content-Type: application/json

{
  "orderId": 1800000000000099,
  "category": "COMPLAINT",
  "type": "HOTEL",
  "title": "酒店降级投诉",
  "description": "订单挂四星酒店实际入住三星,要求退差价",
  "claimType": "REFUND",
  "claimAmount": 600.00,
  "attachments": ["https://oss.example.com/img1.jpg"]
}

响应:

{"code": 200, "data": "1895000000000001"}

8.2 典型成功 — 发起申诉工单(退款被拒)

POST /v3/mp/aftersale/ticket
Authorization: Bearer {mp_token}
Content-Type: application/json

{
  "orderId": 1800000000000099,
  "category": "APPEAL",
  "type": "REFUND_REJECTED",
  "targetRefId": 9876543210,
  "title": "退款申请被拒申诉",
  "description": "退款申请被拒,但供应商确实未提供服务,要求重新审核"
}

响应:

{"code": 200, "data": "1895000000000002"}

8.3 边界情况 — 查询工单详情(已处置,展示处置说明)

{
  "code": 200,
  "data": {
    "id": "1895000000000001",
    "orderId": "1800000000000099",
    "category": "COMPLAINT",
    "categoryLabel": "投诉",
    "type": "HOTEL",
    "typeLabel": "酒店",
    "title": "酒店降级投诉",
    "description": "订单挂四星酒店实际入住三星,要求退差价",
    "claimType": "REFUND",
    "claimAmount": 600.00,
    "attachments": ["https://oss.example.com/img1.jpg"],
    "status": "CLOSED",
    "statusLabel": "已关闭",
    "resolutionRemark": "经核实酒店确实降级,已退差价 500 元",
    "canWithdraw": false,
    "createdAt": "2026-06-22T09:00:00",
    "updatedAt": "2026-06-22T15:30:00"
  }
}

8.4 业务失败 — 申诉未传 targetRefId

{"code": 586015, "msg": "申诉必须关联一笔有效的退款申请"}

8.5 业务失败 — 撤回已 CLOSED 工单

{"code": 586013, "msg": "撤回时工单状态非法(只有 SUBMITTED / PROCESSING 可撤回)"}

九、业务边界

适用:

  • 同一订单下同一 targetRef 只能有一个活跃工单SUBMITTED / PROCESSING / RESOLVED,否则返回 586011
  • 申诉APPEAL类工单必须关联一笔有效的退款申请targetRefId 必填)
  • SUBMITTED / PROCESSING 状态的工单可撤回,canWithdraw=true

不适用:

  • 终态工单CLOSED / WITHDRAWN不可撤回
  • 非本人工单不可查看/撤回

特殊边界:

  • 工单从 PROCESSING 撤回后,若该工单已提交企微 OA,后端会自动撤回 OA 审批(异步,不影响前端响应)
  • attachments 最多 10 个,超出返回参数校验错误

十、修改前后对比

本次为全新域新增接口,无旧接口对比。


十一、影响评估 / 回滚

本次为全新域,不影响任何已有小程序接口,可独立上线。

回滚方案:回滚后端服务版本即可。


十二、注意事项

  1. 发起工单返回值是 StringLongdata 字段为新建工单的 ID,是字符串而非数字。
  2. C 端视图隐藏处置细节resolutionAmount / decision / approvalNo 等字段在 C 端不返回,不要在小程序页面展示。resolutionRemark 是给用户看的处置说明,可展示。
  3. canWithdraw 字段已由后端计算:前端直接用该字段判断是否显示撤回按钮,无需自行判断状态。
  4. 所有 ID 为字符串id / orderId 均序列化为字符串,前端不要转 Number。
  5. category=APPEAL 时targetRefId 必填(关联退款申请 ID,targetRefType 后端自动设为 REFUND_APPLICATION。

十三、关联 / 联系人