# 数据库字段缺失问题修复指南

## 🐛 问题描述

错误信息：
```
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. 如有必要，联系技术支持团队

修复完成后，优惠券状态管理功能应该可以正常使用！
