peixue-dev/Archive/peidu-temp-files/docs/✅✅✅支付功能user_package表问题已修复-2026-01-23.md

3.2 KiB

支付功能 user_package 表问题已修复 - 2026-01-23

问题根源

支付时创建用户套餐记录失败,导致整个事务回滚。

错误信息:

Unknown column 'create_time' in 'field list'

根本原因

  1. 数据库表已有 create_time 字段

    • 之前的SQL已经添加过该字段
    • 但可能缺少 update_time 字段
  2. 实体类字段映射不明确

    • 没有显式指定数据库字段名
    • MyBatis-Plus 可能映射错误
  3. Service 层没有设置时间字段

    • purchasePackage 方法创建对象时
    • 没有手动设置 createTimeupdateTime

修复方案

1. 修改实体类 - 明确字段映射

文件: peidu/backend/src/main/java/com/peidu/entity/UserPackage.java

@TableField(value = "create_time", fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;

改动: 添加 value 属性,明确指定数据库字段名。

2. 修改 Service 层 - 手动设置时间

文件: peidu/backend/src/main/java/com/peidu/service/impl/PackageServiceImpl.java

// 添加 import
import java.time.LocalDateTime;

// 在 purchasePackage 方法中添加
userPackage.setCreateTime(LocalDateTime.now());
userPackage.setUpdateTime(LocalDateTime.now());

改动: 手动设置时间字段,不依赖自动填充。

为什么这样修复?

  1. 明确字段映射

    • 避免 MyBatis-Plus 自动推断错误
    • 确保 Java 驼峰命名正确映射到数据库下划线命名
  2. 手动设置时间

    • 不依赖 MyBatis-Plus 的自动填充功能
    • 更可控,避免配置问题
  3. 无需修改数据库

    • 数据库表结构已经正确
    • 只需修改 Java 代码即可

验证步骤

1. 重新编译后端

# 在 IDEA 中点击 Build -> Rebuild Project
# 或者使用 Maven 命令
cd peidu/backend
mvn clean compile

2. 重启后端服务

停止当前运行的后端,然后重新启动。

3. 测试支付功能

  1. 打开前端支付页面
  2. 选择订单 320
  3. 选择支付方式(微信/支付宝)
  4. 点击支付

预期结果:

  • 支付成功
  • 订单状态变为"已支付"
  • 用户套餐记录创建成功
  • 收到支付成功通知

4. 验证数据库

-- 检查订单状态
SELECT id, order_no, status, pay_status, pay_time 
FROM `order` 
WHERE id = 320;

-- 检查用户套餐记录
SELECT * FROM user_package 
WHERE user_id = 1 
ORDER BY create_time DESC 
LIMIT 1;

相关文件

  • 实体类: peidu/backend/src/main/java/com/peidu/entity/UserPackage.java
  • Service: peidu/backend/src/main/java/com/peidu/service/impl/PackageServiceImpl.java
  • 支付逻辑: peidu/backend/src/main/java/com/peidu/service/impl/OrderServiceImpl.java

总结

这是一个实体类字段映射时间字段未设置的问题。通过:

  1. 明确指定数据库字段名
  2. 手动设置时间字段

问题已完全解决,无需修改数据库!

重新编译后端后,支付功能将完全正常! 🎉