前端对接供应商

供应商申诉调整

首页质检问题(缺货+退货+换货)、质检汇总换货扎数与场次卡「已确认」口径及跳转、二级类目编码、状态标签、商品全称、客服只展示 ID、申诉凭证选填

端
供应商小程序
后端服务
supplier
状态
已上测
测试分支
supplier/test
需求单
XYLZ-3640
更新
2026-10-29
接口数
5

Markdown 原文(给 AI 用):https://doc.xfun.fun/supplier-appeal-adjust-api.md

完整接口字段见 供应商申诉优化 · 前端对接文档;本页集中说明本次涉及的字段、口径与展示规则。

总览

接口页面本页涉及的字段 / 规则
POST /home/supplierPunishCount首页「本月履约情况 —— 质检问题汇总 N 扎」qualityIssueNum / qualityLackNum / qualityReturnNum / qualityExchangeNum
POST /home/qualityIssue/summary质检问题汇总汇总卡 / 场次卡 / 商品行三级 exchangeNum;lackNum / returnNum 类型集合;rounds[].punishCount / punishAmount;items[].skuDesc / productFullName;商品行排序;roundOptions
POST /punish/center/summary我的处罚统计、二级类目卡、「全部类型」下拉二级类目编码表、categories[].subCategories[]、typeOptions
POST /punish/center/list我的处罚 - 处罚明细statusTag / statusTagName、skuDesc / productFullName、title / typeName、reason(处罚描述)、latestComplain.operatorId
POST /punish/center/detail处罚详情列表字段 + operatorId(下发人)、complainHistory[].operatorId(处理人)、sourceDesc
POST /comment/complain申诉提交凭证 picUrl 选填(图片 / 视频),reason 必填

首页质检问题

POST/home/supplierPunishCount

首页「本月履约情况 —— 质检问题汇总 N 扎」 读 qualityIssueNum。下列四个字段固定统计 当月,与请求中的 startRoundNo / endRoundNo 无关;接口其余字段(stockOut、salesReturnNum 等)口径不同,首页卡片不要用。

请求

text
// 首页已调用的请求,原样即可
{ "startRoundNo": "2026-10-27", "endRoundNo": "2026-10-27" }

响应 data(本页相关字段)

字段类型说明
qualityIssueNumint当月质检问题扎数 = qualityLackNum + qualityReturnNum + qualityExchangeNum(缺货 + 退货 + 换货)。等于 /home/qualityIssue/summary 按月(statType=1、不传月份)的 lackNum + returnNum + exchangeNum
qualityLackNumint当月缺货扎数,处罚类型 1 缺货处罚、6 缺货补货、9 缺货不补 的处罚数量之和;= 汇总页当月 lackNum
qualityReturnNumint当月退货扎数,处罚类型 7、8、11、12 的处罚数量之和;= 汇总页当月 returnNum
qualityExchangeNumint当月换货扎数,取 换货记录的换货要求扎数(质检扫码换货 + 运营批量换货,含已完成与未完成,扣除已取消数量);= 汇总页当月 exchangeNum
text
// 响应 data(仅列出本页相关字段)
{
  "stockOut": 3, "...": "...",
  "qualityIssueNum": 13,
  "qualityLackNum": 7,
  "qualityReturnNum": 5,
  "qualityExchangeNum": 1
}
注意

null 处理:四个字段同时计算,计算失败时 四个字段都为 null,接口仍返回成功、其他字段正常。前端「质检问题汇总」显示「--」(或隐藏数字),入口仍可点击进入汇总页;不要把 null 当 0 展示。

质检问题汇总

POST/home/qualityIssue/summary

请求参数

字段类型必填说明
statTypeint可选1 按月(默认)/ 2 按场次
monthstring可选2026-10,不传 = 当月;传了 roundNo 时取场次所在月
roundNostring可选按月:「场次质检汇总」下拉选中值,rounds 只含该场次,汇总仍为整月;按场次:所选场次,不传取当月最近场次

扎数口径(三级一致)

扎数字段口径对应「我的处罚」二级类目
售卖saleNum入场明细售卖扎数—
缺货lackNum处罚类型 1、6、9 的处罚数量11 缺货
退货returnNum处罚类型 7、8、11、12 的处罚数量12 退货
换货exchangeNum换货记录的换货要求扎数(质检扫码换货 + 运营批量换货,含已完成与未完成,扣除已取消)15 换货配货

响应 data

字段类型说明
statType / month / roundNoint / string实际统计方式、月份、按场次时实际场次(按月时 roundNo 为 null)
roundCountint统计范围内场次数
saleNum / lackNum / returnNum / exchangeNumint汇总卡「售卖 / 缺货 / 退货 / 换货」4 列
roundOptions[]string[]所选月份内有售卖、缺货、退货 或换货的场次(倒序),只有换货的场次也在内;场次下拉用
rounds[]array场次卡(倒序),见下表

rounds[] 场次卡

字段类型说明
roundNostring场次
productKinds / saleNumint共 X 种商品 / 售卖 Y 扎
lackNum / returnNum / exchangeNumint红标「缺货 a 扎 · 退货 b 扎 · 换货 c 扎」
punishCountint该场次 质检处罚(category=1)条数,含待扣款;等于跳转后 /punish/center/list {statType:2, roundNo, category:1} 的 total
punishAmountnumber该场次质检处罚 已确认金额:已扣款 / 已退回项的实际处罚(actualAmount)之和,不含待扣款
items[]array商品行,全部返回由前端折叠(默认 3 行,「展开更多(n)」n = items.length - 3)

卡片底部文案:「查看处罚明细 —— 共 punishCount 条处罚 已确认 · ¥ punishAmount >」。

rounds[].items[] 商品行

字段类型说明
productId / productName / rankNumlong / string / int商品 ID、商品名、等级(15 = AE,6 = O);行按 (productId, rankNum) 区分
skuDescstring规格属性描述,如「卷边」「不卷边」;无属性时为空串,见 商品全称
productFullNamestring商品全称,如「高原红A级卷边」,商品列直接展示
saleNum / lackNum / returnNum / exchangeNumint商品表「售卖 / 缺货 / 退货 / 换货」列

商品行排序:售卖扎数倒序 → 换货扎数倒序 → 退货扎数倒序 → 缺货扎数倒序。前端按返回顺序展示即可。

示例

text
// 请求:按月
{ "statType": 1, "month": "2026-10" }
// 请求:按场次
{ "statType": 2, "roundNo": "2026-10-21" }
// 响应 data(按月)
{
  "statType": 1, "month": "2026-10", "roundNo": null,
  "roundCount": 2, "saleNum": 86, "lackNum": 7, "returnNum": 5, "exchangeNum": 1,
  "roundOptions": ["2026-10-21", "2026-10-14"],
  "rounds": [{
    "roundNo": "2026-10-21", "productKinds": 6, "saleNum": 52,
    "lackNum": 7, "returnNum": 5, "exchangeNum": 1,
    "punishCount": 5, "punishAmount": 120.00,
    "items": [
      { "productId": 399968, "productName": "高原红", "rankNum": 1, "skuDesc": "卷边",
        "productFullName": "高原红A级卷边", "saleNum": 20, "lackNum": 3, "returnNum": 2, "exchangeNum": 1 },
      { "productId": 400017, "productName": "高原红", "rankNum": 1, "skuDesc": "不卷边",
        "productFullName": "高原红A级不卷边", "saleNum": 20, "lackNum": 4, "returnNum": 3, "exchangeNum": 0 },
      { "productId": 401203, "productName": "卡罗拉", "rankNum": 6, "skuDesc": "",
        "productFullName": "卡罗拉", "saleNum": 12, "lackNum": 0, "returnNum": 0, "exchangeNum": 0 }
    ]
  }]
}

场次卡「查看处罚明细」跳转

质检问题汇总 · 场次卡 → 我的处罚(按场次,定位「质检处罚」Tab)

跳转后调用入参
POST /punish/center/summary{ "statType": 2, "roundNo": "2026-10-21" }
POST /punish/center/list{ "statType": 2, "roundNo": "2026-10-21", "category": 1, "pageIndex": 1, "pageSize": 20 }

我的处罚二级类目编码

缺货/退货扎数按类目类型集合统计,只统计质检环节处罚(punish_link=1),人工下发、代卖等其他环节的处罚不计入;条件为 pid=0、data_status=0、handle_status IN (0,1)。换货扎数独立取 exchange_log,19、22 不计扎数。

质检类型(1、6、7、8、9、11、12、13、15)只有质检环节(punish_link=1)才归入下表的质检类目,其他环节的同类型处罚归「其他处罚 · 34」,详见 供应商申诉优化 · 前端对接。

二级类目 subCategory 的 有效编码仅以下 9 个,按下表顺序下发(summary.categories[].subCategories[] 与 typeOptions 均按此顺序):

categorysubCategory三级类型(sourceType / punishType:typeName)卡片标题 title
1 质检处罚11 缺货1/1 缺货处罚、1/6 缺货补货、1/9 缺货不补缺货处罚
1 质检处罚12 退货1/7 退货不补、1/8 退货补货、1/11 退货不补转代卖、1/12 退货补货转代卖退货处罚
1 质检处罚14 降级1/13 降1级、1/15 降2级降级处罚
1 质检处罚15 换货配货1/25 换货未换、1/18 换货、1/19 配货错误处罚、1/22 先扫码后配货处罚换货配货处罚
2 迟到处罚21 配货迟到1/14 迟到配货处罚、1/23 代配送货迟到处罚配货迟到处罚
2 迟到处罚22 换货迟到1/20 换货迟到换货迟到处罚
2 迟到处罚23 迟到处罚1/3 迟到处罚迟到处罚
3 其他处罚32 售后处罚2/null 退款支出、3/null 缺货赔付售后处罚
3 其他处罚34 其他处罚1/2 未打勾处罚、1/4 其他处罚、1/16 退款赠花、1/17 超时转代卖,及其他未归类类型其他处罚

示例:/punish/center/summary

text
// 请求
{ "statType": 1, "month": "2026-10" }
// 响应 data(节选)
{
  "statType": 1, "month": "2026-10", "roundNo": null, "roundOptions": ["2026-10-21", "2026-10-14"],
  "startRoundNo": "2026-10-01", "endRoundNo": "2026-10-31",
  "actualAmount": 320.00, "totalAmount": 350.00, "appealSuccessAmount": 30.00, "totalCount": 12,
  "pendingAmount": 15.00, "pendingCount": 1,
  "categories": [
    { "category": 1, "categoryName": "质检处罚",
      "actualAmount": 240.00, "totalAmount": 260.00, "appealSuccessAmount": 20.00, "totalCount": 8,
      "subCategories": [
        { "subCategory": 11, "subCategoryName": "缺货", "actualAmount": 60.00, "totalAmount": 60.00, "appealSuccessAmount": 0.00, "totalCount": 3 },
        { "subCategory": 12, "subCategoryName": "退货", "actualAmount": 120.00, "totalAmount": 140.00, "appealSuccessAmount": 20.00, "totalCount": 3 },
        { "subCategory": 14, "subCategoryName": "降级", "actualAmount": 40.00, "totalAmount": 40.00, "appealSuccessAmount": 0.00, "totalCount": 1 },
        { "subCategory": 15, "subCategoryName": "换货配货", "actualAmount": 20.00, "totalAmount": 20.00, "appealSuccessAmount": 0.00, "totalCount": 1 } ] },
    { "category": 2, "categoryName": "迟到处罚",
      "actualAmount": 50.00, "totalAmount": 50.00, "appealSuccessAmount": 0.00, "totalCount": 2,
      "subCategories": [
        { "subCategory": 21, "subCategoryName": "配货迟到", "actualAmount": 0.00, "totalAmount": 0.00, "appealSuccessAmount": 0.00, "totalCount": 0 },
        { "subCategory": 22, "subCategoryName": "换货迟到", "actualAmount": 20.00, "totalAmount": 20.00, "appealSuccessAmount": 0.00, "totalCount": 1 },
        { "subCategory": 23, "subCategoryName": "迟到处罚", "actualAmount": 30.00, "totalAmount": 30.00, "appealSuccessAmount": 0.00, "totalCount": 1 } ] },
    { "category": 3, "categoryName": "其他处罚",
      "actualAmount": 30.00, "totalAmount": 40.00, "appealSuccessAmount": 10.00, "totalCount": 2,
      "subCategories": [
        { "subCategory": 32, "subCategoryName": "售后处罚", "actualAmount": 10.00, "totalAmount": 20.00, "appealSuccessAmount": 10.00, "totalCount": 1 },
        { "subCategory": 34, "subCategoryName": "其他处罚", "actualAmount": 20.00, "totalAmount": 20.00, "appealSuccessAmount": 0.00, "totalCount": 1 } ] }
  ],
  "typeOptions": [
    { "category": 1, "categoryName": "质检处罚", "subCategories": [
      { "subCategory": 15, "subCategoryName": "换货配货", "types": [
        { "sourceType": 1, "punishType": 25, "name": "换货未换" },
        { "sourceType": 1, "punishType": 18, "name": "换货" },
        { "sourceType": 1, "punishType": 19, "name": "配货错误处罚" },
        { "sourceType": 1, "punishType": 22, "name": "先扫码后配货处罚" } ] } ] },
    { "category": 2, "categoryName": "迟到处罚", "subCategories": [
      { "subCategory": 23, "subCategoryName": "迟到处罚", "types": [
        { "sourceType": 1, "punishType": 3, "name": "迟到处罚" } ] } ] }
  ],
  "serverTime": "2026-10-27 10:00:00"
}

处罚明细

POST/punish/center/list

本页相关的 records[] 字段

字段类型卡片展示
titlestring卡片标题,二级名 + 处罚,如「换货配货处罚」「迟到处罚」
subCategory / subCategoryName / typeNameint / string二级 / 三级类型,编码见「我的处罚二级类目编码」
statusTag / statusTagNameint / string卡片右上角标签,见 状态标签
punishTimestring处罚时间
productFullName + numstring / int商品信息:「productFullName · num 扎」;需要等级标红时用 productName + 等级(rankNum)+ skuDesc 自行拼
reasonstring行名显示为 「处罚描述」,值取 reason
orderSnstring关联单号
deductStatus / deductStatusNameint / string扣款状态
latestComplain.operatorIdlong最新申诉的处理客服 ID;latestComplain.operatorName 恒为 null

示例

text
// 请求
{ "statType": 2, "roundNo": "2026-10-21", "category": 1, "pageIndex": 1, "pageSize": 20 }
// 响应 data
{ "total": 5, "serverTime": "2026-10-27 10:00:00", "records": [
  { "itemKey": "1_922652537", "sourceType": 1, "sourceId": 922652537,
    "category": 1, "categoryName": "质检处罚", "subCategory": 12, "subCategoryName": "退货",
    "punishType": 7, "typeName": "退货不补", "title": "退货处罚",
    "roundNo": "2026-10-21", "punishTime": "2026-10-21 17:16:00",
    "productName": "高原红", "rankNum": 1, "skuDesc": "卷边", "productFullName": "高原红A级卷边",
    "num": 2, "orderItemUrl": "https://…",
    "reason": "花头受损,品质不达标", "orderSn": "T2026102110033425",
    "punishAmount": 45.00, "returnedAmount": 0.00, "actualAmount": 45.00,
    "deductStatus": 2, "deductStatusName": "已扣款", "appealStatus": 3, "appealStatusName": "申诉驳回",
    "statusTag": 4, "statusTagName": "申诉拒绝",
    "complainType": 3, "canAppeal": true, "nextAppealNo": 2, "appealDeadline": "2026-10-23 11:00:00",
    "canCancelAppeal": false, "latestComplainId": 88123,
    "latestComplain": { "id": 88123, "appealNo": 1, "reason": "花头受损为运输导致", "pictures": "[]",
      "status": 3, "operationContent": "质检照片显示到货即受损", "operatorId": 10086, "operatorName": null,
      "createTime": "2026-10-22 09:30:00", "handleTime": "2026-10-22 11:00:00" } },
  { "itemKey": "1_922652601", "sourceType": 1, "sourceId": 922652601,
    "category": 1, "categoryName": "质检处罚", "subCategory": 15, "subCategoryName": "换货配货",
    "punishType": 25, "typeName": "换货未换", "title": "换货配货处罚",
    "roundNo": "2026-10-21", "punishTime": "2026-10-21 22:00:00",
    "productName": "卡罗拉", "rankNum": 6, "skuDesc": "", "productFullName": "卡罗拉",
    "num": 1, "reason": "场次换货未换", "orderSn": "T2026102110039876",
    "punishAmount": 20.00, "returnedAmount": 0.00, "actualAmount": 20.00,
    "deductStatus": 2, "deductStatusName": "已扣款", "appealStatus": 0, "appealStatusName": "未申诉",
    "statusTag": 5, "statusTagName": "已确认",
    "complainType": 3, "canAppeal": false, "nextAppealNo": null, "appealDeadline": "2026-10-23 22:00:00",
    "canCancelAppeal": false, "latestComplainId": null, "latestComplain": null } ] }

处罚详情

POST/punish/center/detail

响应 = 列表项全部字段(含 statusTag / skuDesc / productFullName)+ 详情字段。本页相关:

字段类型说明
operatorIdlong下发处罚人 ID(质检处罚为质检员):处罚取处罚记录、退款支出取售后单、缺货赔付取赔付记录的操作人 ID。展示为「客服:operatorId」,0 或 null 显示「系统」
operatorNamestring恒为 null,不展示
sourceDescstring处罚来源,如「质检处罚」「系统自动处罚」「售后处罚」「售后单」「缺货赔付(订单 T…)」,不含任何姓名;为空不展示
reasonstring行名「处罚描述」
complainHistory[].operatorIdlong每条申诉的处理客服 ID,显示「客服:ID」,0 或 null 显示「系统」;operatorName 恒为 null
text
// 请求
{ "sourceType": 1, "id": 922652537 }
// 响应 data(节选)
{
  "sourceType": 1, "sourceId": 922652537, "title": "退货处罚", "typeName": "退货不补",
  "productName": "高原红", "rankNum": 1, "skuDesc": "卷边", "productFullName": "高原红A级卷边",
  "num": 2, "reason": "花头受损,品质不达标",
  "deductStatus": 2, "deductStatusName": "已扣款", "statusTag": 4, "statusTagName": "申诉拒绝",
  "operatorId": 20231, "operatorName": null, "sourceDesc": "质检处罚",
  "complainHistory": [
    { "id": 88123, "appealNo": 1, "reason": "花头受损为运输导致", "pictures": "[]", "status": 3,
      "operationContent": "质检照片显示到货即受损", "operatorId": 10086, "operatorName": null,
      "createTime": "2026-10-22 09:30:00", "handleTime": "2026-10-22 11:00:00", "delTime": null } ],
  "serverTime": "2026-10-27 10:00:00"
}

状态标签 statusTag

列表、详情都返回 statusTag / statusTagName,前端直接展示 statusTagName,不用自行组合扣款 / 申诉状态。判断顺序:先判待扣款,再按申诉状态。

statusTagstatusTagName条件
0(空串,不展示标签)deductStatus = 1 待扣款
1待申诉appealStatus = 0 && canAppeal
2申诉中appealStatus = 1
3申诉成功appealStatus = 2
4申诉拒绝appealStatus = 3;可二诉时同样显示「申诉拒绝」,另显示「再次申诉」按钮与二诉倒计时
5已确认appealStatus = 0 && !canAppeal(申诉期已过且未申诉)

商品全称 skuDesc / productFullName

返回位置:质检问题汇总 rounds[].items[]、我的处罚列表 records[]、处罚详情。

字段规则
skuDesc取商品规格属性值,按原顺序以空格连接;规格中的「等级」与包装 JSON 不展示;无属性时为空串 ""
productFullNameproductName + 等级名 + skuDesc;等级名仅 rankNum 15 对应 **A级E级**,其他取值(如 6 = O 级、0、null) 不拼等级字样
productNamerankNum规格skuDescproductFullName
高原红1生熟度:卷边卷边高原红A级卷边
高原红1生熟度:不卷边不卷边高原红A级不卷边
卡罗拉2生熟度:中熟,等级:B中熟卡罗拉B级中熟
卡罗拉6(O 级)(空)(空串)卡罗拉

productName / rankNum 仍返回,需要把等级标红时可用 productName + 等级(标红)+ skuDesc 自行拼接。

客服只展示 ID

位置字段展示
处罚详情 · 下发处罚人detail.operatorId「客服:operatorId」;0 或 null 显示「系统」
处罚列表 · 最新申诉处理人latestComplain.operatorId「客服:operatorId」;0 或 null 显示「系统」
处罚详情 · 申诉记录处理人complainHistory[].operatorId「客服:operatorId」;0 或 null 显示「系统」

提交申诉

POST/comment/complain

字段类型必填说明
idlong必填处罚项 sourceId
complainTypeint必填处罚项 complainType(3 处罚 / 2 退款支出 / 6 缺货赔付)
reasonstring必填申诉理由,≤255 字
picUrlstring可选申诉凭证,图片 / 视频地址的 JSON 数组字符串,选填;不传、空串或 [] 均可提交。前端上传组件不做必填校验
appealDescstring可选诉求说明
text
// 请求:不带凭证
{ "id": 922652537, "complainType": 3, "reason": "花头受损为运输导致" }
// 请求:带图片和视频
{ "id": 922652537, "complainType": 3, "reason": "花头受损为运输导致",
  "picUrl": "[\"https://img.xm.com/a.jpg\",\"https://img.xm.com/b.mp4\"]" }
// 响应
{ "code": 0, "msg": "success", "data": true }

联调与发版注意