This commit is contained in:
2025-09-06 11:58:18 +08:00
commit 8d34972119
1483 changed files with 141190 additions and 0 deletions

View File

@@ -0,0 +1,190 @@
# 数据库字段缺失问题修复指南
## 🐛 问题描述
错误信息:
```
java.sql.SQLSyntaxErrorException: Unknown column 'goods_id' in 'field list'
```
**原因**: 数据库表 `shop_coupon_apply_item` 中缺少 `goods_id``category_id` 字段,但代码中尝试查询这些字段。
## 🔧 解决方案
### 方案一:执行数据库修复脚本(推荐)
1. **备份数据库**(重要!)
```bash
mysqldump -u username -p database_name > backup_$(date +%Y%m%d_%H%M%S).sql
```
2. **执行修复脚本**
```bash
mysql -u username -p database_name < src/main/resources/sql/simple_fix_coupon_table.sql
```
或者手动执行以下SQL
```sql
-- 添加缺失的字段
ALTER TABLE shop_coupon_apply_item
ADD COLUMN goods_id INT(11) NULL COMMENT '商品ID' AFTER coupon_id;
ALTER TABLE shop_coupon_apply_item
ADD COLUMN category_id INT(11) NULL COMMENT '分类ID' AFTER goods_id;
-- 添加索引
CREATE INDEX idx_coupon_apply_item_goods ON shop_coupon_apply_item(coupon_id, goods_id);
CREATE INDEX idx_coupon_apply_item_category ON shop_coupon_apply_item(coupon_id, category_id);
CREATE INDEX idx_coupon_apply_item_type ON shop_coupon_apply_item(coupon_id, type);
-- 检查表结构
DESCRIBE shop_coupon_apply_item;
```
### 方案二:临时代码修复(已实施)
我已经修改了 `CouponStatusServiceImpl.java` 中的代码,添加了异常处理:
```java
try {
// 尝试查询 goods_id 字段
List<ShopCouponApplyItem> applyItems = shopCouponApplyItemService.list(...);
// 处理逻辑
} catch (Exception e) {
log.warn("查询优惠券适用商品失败,可能是数据库字段不存在: {}", e.getMessage());
// 如果查询失败默认返回true允许使用
return true;
}
```
## 📋 修复步骤
### 1. 立即修复(临时方案)
- ✅ 已修改代码添加异常处理
- ✅ 使用 `pk` 字段作为临时的商品ID
- ✅ 查询失败时默认允许使用优惠券
### 2. 完整修复(推荐执行)
#### 步骤1停止应用
```bash
# 如果使用Docker
docker-compose down
# 或者直接停止Java进程
pkill -f java
```
#### 步骤2备份数据库
```bash
mysqldump -u root -p your_database > backup_$(date +%Y%m%d_%H%M%S).sql
```
#### 步骤3执行数据库修复
```bash
mysql -u root -p your_database < src/main/resources/sql/simple_fix_coupon_table.sql
```
#### 步骤4验证修复
```sql
-- 检查表结构
DESCRIBE shop_coupon_apply_item;
-- 应该看到以下字段:
-- id, coupon_id, goods_id, category_id, type, pk, status, deleted, tenant_id, create_time, update_time
```
#### 步骤5重启应用
```bash
# 如果使用Docker
docker-compose up -d
# 或者直接启动
java -jar your-app.jar
```
## 🧪 测试验证
### 1. 检查API接口
```bash
# 测试优惠券列表查询
curl -X GET "http://localhost:9200/api/shop/user-coupon/my/available"
# 测试优惠券验证
curl -X POST "http://localhost:9200/api/shop/coupon-status/validate" \
-H "Content-Type: application/json" \
-d '{"userCouponId":1,"totalAmount":150.00,"goodsIds":[1,2,3]}'
```
### 2. 检查日志
```bash
# 查看应用日志
tail -f logs/application.log
# 查找相关错误
grep -i "goods_id\|SQLSyntaxErrorException" logs/application.log
```
## 📊 数据迁移(可选)
如果表中已有数据,可能需要迁移:
```sql
-- 如果原来使用 pk 字段存储商品ID
UPDATE shop_coupon_apply_item
SET goods_id = pk
WHERE type = 1 AND pk IS NOT NULL AND goods_id IS NULL;
-- 如果原来使用其他字段存储分类ID
-- UPDATE shop_coupon_apply_item
-- SET category_id = some_other_field
-- WHERE type = 2 AND some_other_field IS NOT NULL AND category_id IS NULL;
```
## 🚨 注意事项
1. **数据备份**: 执行任何数据库修改前必须备份
2. **停机时间**: 建议在低峰期执行修复
3. **测试环境**: 先在测试环境验证修复效果
4. **回滚计划**: 准备回滚方案以防出现问题
## 🔄 回滚方案
如果修复后出现问题,可以回滚:
```sql
-- 删除新添加的字段
ALTER TABLE shop_coupon_apply_item DROP COLUMN goods_id;
ALTER TABLE shop_coupon_apply_item DROP COLUMN category_id;
-- 删除新添加的索引
DROP INDEX idx_coupon_apply_item_goods ON shop_coupon_apply_item;
DROP INDEX idx_coupon_apply_item_category ON shop_coupon_apply_item;
DROP INDEX idx_coupon_apply_item_type ON shop_coupon_apply_item;
```
或者直接恢复备份:
```bash
mysql -u root -p your_database < backup_20250115_143000.sql
```
## ✅ 修复完成检查清单
- [ ] 数据库已备份
- [ ] 执行了字段添加脚本
- [ ] 验证了表结构正确
- [ ] 重启了应用
- [ ] 测试了API接口正常
- [ ] 检查了应用日志无错误
- [ ] 验证了优惠券功能正常
## 📞 技术支持
如果在修复过程中遇到问题,请:
1. 检查数据库连接和权限
2. 确认SQL语法与MySQL版本兼容
3. 查看详细的错误日志
4. 如有必要,联系技术支持团队
修复完成后,优惠券状态管理功能应该可以正常使用!