获取卖家交易评价列表接口文档.md 16 KB

获取卖家交易评价列表接口文档

接口概述

接口信息

项目 内容
接口名称 获取用户作为卖家的交易评价列表
接口路径 /secondTradeRecord/getSellerEvaluationList
请求方式 GET
接口版本 v1.0
开发时间 2025-11-18
接口状态 ✅ 已完成

功能描述

用于用户主页展示该用户作为卖家收到的所有交易评价,包含:

  • 买家完整信息(昵称、头像、真实姓名、性别、简介等)
  • 评价内容和评分
  • 买家和卖家的信用积分
  • 买家和卖家的风控评分等级
  • 交易商品信息
  • 交易基本信息

请求参数

Query Parameters

参数名 类型 必填 描述 示例值 默认值
sellerId Integer ✅ 是 卖家用户ID(主页用户ID) 123 -

请求示例

cURL

curl -X GET "http://localhost:8080/secondTradeRecord/getSellerEvaluationList?sellerId=123" \
  -H "Authorization: Bearer your_token_here"

JavaScript (Axios)

axios.get('/secondTradeRecord/getSellerEvaluationList', {
  params: {
    sellerId: 123
  },
  headers: {
    'Authorization': 'Bearer your_token_here'
  }
})
.then(response => {
  console.log(response.data);
})
.catch(error => {
  console.error(error);
});

Java (RestTemplate)

String url = "http://localhost:8080/secondTradeRecord/getSellerEvaluationList?sellerId=123";
RestTemplate restTemplate = new RestTemplate();
R<List<SellerEvaluationVo>> result = restTemplate.getForObject(url, R.class);

响应参数

响应结构

字段名 类型 描述
code Integer 响应状态码,200表示成功
msg String 响应消息
data Array<SellerEvaluationVo> 评价列表数据

SellerEvaluationVo 对象结构

交易基本信息

字段名 类型 是否必返 描述 示例值
id Integer 交易记录ID 1
tradeNo String 交易编号 S2025111800001
transactionTime String 交易时间 2025-11-18 10:00:00
transactionAmount BigDecimal 交易金额(元) 3800.00
tradeStatus Integer 交易状态 4
createdTime String 创建时间 2025-11-18 09:00:00

商品信息

字段名 类型 是否必返 描述 示例值
goodsId Integer 商品ID 100
goodsTitle String 商品标题 二手iPhone 13 128G 白色 95新
goodsHomeImage String 商品封面图片URL https://cdn.example.com/goods/iphone13.jpg
goodsPrice BigDecimal 商品价格(元) 3999.00

买家信息

字段名 类型 是否必返 描述 示例值
buyerId Integer 买家ID 456
buyerName String 买家昵称 张三
buyerImage String 买家头像URL https://cdn.example.com/avatar/user456.jpg
buyerPhone String 买家手机号 13800138000
buyerRealName String 买家真实姓名 张三三
buyerSex String 买家性别
buyerJianjie String 买家简介 热爱数码产品,诚信交易

买家评价信息

字段名 类型 是否必返 描述 示例值
buyerEvaluate String 买家评价内容 商品质量很好,和描述一致,卖家态度也不错,推荐!
buyerRating Integer 买家评分(1-5分) 5
buyerCreditScore Integer 买家信用积分 450
buyerCreditLevel String 买家风控评分等级 A

卖家信息

字段名 类型 是否必返 描述 示例值
sellerId Integer 卖家ID 123
sellerName String 卖家昵称 李四
sellerImage String 卖家头像URL https://cdn.example.com/seller.jpg
sellerCreditScore Integer 卖家信用积分 500
sellerCreditLevel String 卖家风控评分等级 O

枚举说明

交易状态 (tradeStatus)

状态值 状态名称 说明
1 待确认 买家发起交易请求,等待卖家确认
2 已拒绝 卖家拒绝了交易请求
3 待交易 双方确认交易,等待线下交易
4 交易成功 交易完成,双方确认成功
5 交易失败 交易失败
6 交易取消 交易被取消

风控评分等级 (creditLevel)

等级 违规次数 等级说明 风险程度
O 0次 无违规记录 🟢 无风险(最优)
A 1-2次 轻微违规 🟢 低风险
B 3-5次 一般违规 🟡 中等风险
C 6-9次 较严重违规 🟡 较高风险
D 10-14次 严重违规 🔴 高风险
E ≥15次 极差 🔴 极高风险(最差)

风控等级计算说明

  • 基于用户在 second_risk_control_record 表中的违规记录数量
  • 违规类型包括:洗钱嫌疑、账号异常、交易欺诈、异常发布
  • 等级实时计算,反映用户最新的信用状态

响应示例

成功响应

{
  "code": 200,
  "msg": "成功",
  "data": [
    {
      "id": 1,
      "tradeNo": "S2025111800001",
      "goodsId": 100,
      "goodsTitle": "二手iPhone 13 128G 白色 95新",
      "goodsHomeImage": "https://cdn.example.com/goods/iphone13.jpg",
      "goodsPrice": 3999.00,
      "transactionAmount": 3800.00,
      "buyerId": 456,
      "buyerName": "张三",
      "buyerImage": "https://cdn.example.com/avatar/user456.jpg",
      "buyerPhone": "13800138000",
      "buyerRealName": "张三三",
      "buyerSex": "男",
      "buyerJianjie": "热爱数码产品,诚信交易",
      "buyerEvaluate": "商品质量很好,和描述一致,卖家态度也不错,推荐!",
      "buyerRating": 5,
      "buyerCreditScore": 450,
      "buyerCreditLevel": "A",
      "sellerId": 123,
      "sellerName": "李四",
      "sellerImage": "https://cdn.example.com/avatar/user123.jpg",
      "sellerCreditScore": 500,
      "sellerCreditLevel": "O",
      "transactionTime": "2025-11-18 10:00:00",
      "tradeStatus": 4,
      "createdTime": "2025-11-18 09:00:00"
    },
    {
      "id": 2,
      "tradeNo": "S2025111700025",
      "goodsId": 101,
      "goodsTitle": "小米手环7 黑色 全新未拆封",
      "goodsHomeImage": "https://cdn.example.com/goods/miband7.jpg",
      "goodsPrice": 199.00,
      "transactionAmount": 180.00,
      "buyerId": 789,
      "buyerName": "王五",
      "buyerImage": "https://cdn.example.com/avatar/user789.jpg",
      "buyerPhone": "13900139000",
      "buyerRealName": "王小五",
      "buyerSex": "女",
      "buyerJianjie": "喜欢运动健身",
      "buyerEvaluate": "东西不错,发货速度快",
      "buyerRating": 4,
      "buyerCreditScore": 380,
      "buyerCreditLevel": "O",
      "sellerId": 123,
      "sellerName": "李四",
      "sellerImage": "https://cdn.example.com/avatar/user123.jpg",
      "sellerCreditScore": 500,
      "sellerCreditLevel": "O",
      "transactionTime": "2025-11-17 15:30:00",
      "tradeStatus": 4,
      "createdTime": "2025-11-17 14:20:00"
    }
  ]
}

空数据响应

{
  "code": 200,
  "msg": "成功",
  "data": []
}

错误响应

参数缺失

{
  "code": 500,
  "msg": "获取评价列表失败: 卖家ID不能为空",
  "data": null
}

系统异常

{
  "code": 500,
  "msg": "获取评价列表失败: 数据库连接异常",
  "data": null
}

业务规则

查询规则

  1. 数据过滤

    • ✅ 只返回有买家评价内容的记录(buyer_evaluate IS NOT NULL AND buyer_evaluate != ''
    • ✅ 只返回未删除的记录(delete_flag = 0
    • ✅ 按创建时间倒序排列(最新评价在前)
  2. 数据关联

    • 商品信息:通过 goods_record_id 关联 second_goods_record
    • 买家信息:通过 buyer_id 关联 life_user
    • 卖家信息:通过 seller_id 关联 life_user
    • 信用积分:通过 user_id 关联 second_user_credit
    • 风控等级:实时计算,查询 second_risk_control_record
  3. 性能优化

    • 使用批量查询避免 N+1 问题
    • 关联数据使用 Map 索引,时间复杂度 O(1)
    • 分组查询:商品、用户、积分分别批量获取

数据完整性

  1. 字段缺失处理

    • 如果商品记录已删除,商品相关字段返回 null
    • 如果用户信息不存在,用户相关字段返回 null
    • 如果没有信用积分记录,creditScore 返回 0
    • 风控等级计算异常时返回默认等级 "O"
  2. 评分有效性

    • 买家评分 buyerRating 有效范围:1-5 分
    • 如果未评分,该字段可能为 null

错误码说明

HTTP状态码 code msg 说明 解决方案
200 200 成功 请求成功 -
200 500 卖家ID不能为空 未传入 sellerId 参数 检查请求参数,确保传入 sellerId
200 500 获取评价列表失败: xxx 系统异常 查看日志,联系后端开发人员
500 - - 服务器内部错误 联系后端开发人员

使用场景

1. 用户主页展示

在用户主页展示该用户作为卖家的历史交易评价,供其他用户查看。

场景示例

  • 用户 A 点击用户 B 的主页
  • 展示用户 B 作为卖家收到的所有评价
  • 显示评价内容、评分、买家信息等

2. 信用评估

通过评价内容、评分和风控等级综合评估卖家的信誉度。

评估维度

  • 评价数量:评价越多,信誉参考价值越高
  • 平均评分:反映买家满意度
  • 风控等级:反映用户违规情况
  • 信用积分:反映用户交易活跃度

3. 交易决策辅助

买家在决定是否与某卖家交易时,可以查看其历史评价。

决策参考

  • 查看近期评价内容
  • 查看风控评分等级
  • 了解卖家信用积分
  • 参考其他买家的评价

技术实现

实现方式

技术点 实现方案
查询方式 MyBatis Plus LambdaQueryWrapper
关联查询 批量查询 + Map 索引
风控计算 实时查询违规记录并计算等级
事务处理 无需事务(只读查询)
性能优化 批量查询避免 N+1 问题

代码示例

// 1. 查询交易记录
LambdaQueryWrapper<SecondTradeRecord> tradeWrapper = new LambdaQueryWrapper<>();
tradeWrapper.eq(SecondTradeRecord::getSellerId, sellerId)
        .eq(SecondTradeRecord::getDeleteFlag, 0)
        .isNotNull(SecondTradeRecord::getBuyerEvaluate)
        .ne(SecondTradeRecord::getBuyerEvaluate, "")
        .orderByDesc(SecondTradeRecord::getCreatedTime);
List<SecondTradeRecord> tradeRecords = mapper.selectList(tradeWrapper);

// 2. 批量查询商品信息
LambdaQueryWrapper<SecondGoodsRecord> goodsWrapper = new LambdaQueryWrapper<>();
goodsWrapper.in(SecondGoodsRecord::getId, goodsRecordIds);
List<SecondGoodsRecord> goodsRecords = goodsRecordMapper.selectList(goodsWrapper);

// 3. 批量查询用户信息
LambdaQueryWrapper<LifeUser> userWrapper = new LambdaQueryWrapper<>();
userWrapper.in(LifeUser::getId, buyerIds).eq(LifeUser::getDeleteFlag, 0);
List<LifeUser> buyers = lifeUserMapper.selectList(userWrapper);

// 4. 批量查询信用积分
LambdaQueryWrapper<SecondUserCredit> creditWrapper = new LambdaQueryWrapper<>();
creditWrapper.in(SecondUserCredit::getUserId, allUserIds)
        .eq(SecondUserCredit::getDeleteFlag, 0);
List<SecondUserCredit> credits = secondUserCreditMapper.selectList(creditWrapper);

// 5. 计算风控等级
String creditLevel = calculateCreditLevel(userId);

数据库表

表名 说明 关联字段
second_trade_record 交易记录表 主表
second_goods_record 商品记录表 goods_record_id
life_user 用户表 buyer_id, seller_id
second_user_credit 用户信用积分表 user_id
second_risk_control_record 风控记录表 user_id(用于计算等级)

相关文件

  1. Controller
    alien-second/src/main/java/shop/alien/second/controller/SecondTradeRecordController.java

  2. Service Interface
    alien-second/src/main/java/shop/alien/second/service/SecondTradeRecordService.java

  3. Service Implementation
    alien-second/src/main/java/shop/alien/second/service/impl/SecondTradeRecordServiceImpl.java

  4. VO Object
    alien-entity/src/main/java/shop/alien/entity/second/vo/SellerEvaluationVo.java

  5. Entity
    alien-entity/src/main/java/shop/alien/entity/second/SecondTradeRecord.java


注意事项

⚠️ 重要提示

  1. 必传参数

    • sellerId 为必传参数,用于查看指定用户的评价列表
    • 不传或传空会返回错误:"卖家ID不能为空"
  2. 数据权限

    • 接口不做权限校验,任何人都可以查看用户主页的公开评价
    • 如需增加权限控制,请联系后端开发人员
  3. 空数据处理

    • 如果该用户没有收到任何评价,返回空数组 []
    • 不会返回 null,前端可以直接遍历
  4. 字段可空性

    • 部分字段可能为 null,前端需要做空值判断
    • 建议使用可选链操作符或空值合并运算符
  5. 评分范围

    • 买家评分 buyerRating 的有效范围是 1-5 分
    • 超出范围的数据为异常数据

💡 最佳实践

  1. 前端展示建议

    // 显示买家昵称,为空时显示默认值
    const buyerName = evaluation.buyerName || '匿名用户';
       
    // 显示评分,为空时显示未评分
    const rating = evaluation.buyerRating ? `${evaluation.buyerRating}分` : '未评分';
       
    // 风控等级颜色映射
    const levelColorMap = {
     'O': 'green',  // 最好
     'A': 'green',
     'B': 'orange',
     'C': 'orange',
     'D': 'red',
     'E': 'red'     // 最差
    };
    
  2. 缓存策略

    • 评价数据变化频率低,建议前端缓存
    • 缓存时间:5-10 分钟
    • 用户主动刷新时清除缓存
  3. 分页处理

    • 当前接口返回所有评价
    • 如评价数量过多,建议前端实现虚拟滚动
    • 或联系后端增加分页功能

测试用例

测试场景 1:正常查询

测试步骤

  1. 准备测试数据:用户 ID 为 123 的卖家有 3 条评价记录
  2. 调用接口:GET /secondTradeRecord/getSellerEvaluationList?sellerId=123
  3. 验证响应:返回 3 条评价数据

期望结果

  • 返回 code = 200
  • data 数组长度为 3
  • 每条数据包含完整字段
  • 按创建时间倒序排列

测试场景 2:无评价数据

测试步骤

  1. 准备测试数据:用户 ID 为 999 的卖家没有任何评价
  2. 调用接口:GET /secondTradeRecord/getSellerEvaluationList?sellerId=999
  3. 验证响应:返回空数组

期望结果

  • 返回 code = 200
  • data 为空数组 []

测试场景 3:参数缺失

测试步骤

  1. 调用接口:GET /secondTradeRecord/getSellerEvaluationList(不传 sellerId)
  2. 验证响应:返回错误信息

期望结果

  • 返回 code = 500
  • msg = "获取评价列表失败: 卖家ID不能为空"

测试场景 4:风控等级计算

测试步骤

  1. 准备测试数据:
    • 买家 A(ID 456)有 2 条违规记录
    • 买家 B(ID 789)有 0 条违规记录
  2. 调用接口查询包含这两位买家的评价
  3. 验证风控等级

期望结果

  • 买家 A 的 buyerCreditLevel = "A"
  • 买家 B 的 buyerCreditLevel = "O"

版本历史

版本 日期 修改内容 修改人
v1.0 2025-11-18 初始版本,实现基本功能 开发团队
v1.0 2025-11-18 优化查询方式,使用 MyBatis Plus 开发团队
v1.0 2025-11-18 增加风控评分等级计算 开发团队
v1.0 2025-11-18 增加更多用户信息字段 开发团队

联系方式

如有问题或建议,请联系:

  • 开发团队:二手交易平台开发组
  • 服务名称:alien-second
  • 文档路径alien-second/doc/获取卖家交易评价列表接口文档.md

最后更新时间:2025-11-18