Skill: unlimitwave/food-expiry-reminder (version 1.0.0)

--- name: food-expiry-reminder description: 食品过期提醒技能。用于记录、管理和提醒食品过期情况。当用户需要记录食品信息、检查食品是否过期、查看即将过期的食品或管理食品库存时使用此技能。数据存储在food_data.json文件中。 --- # 食品过期提醒技能 本技能帮助用户记录、管理和提醒食品过期情况。所有食品数据存储在`food_data.json`文件中。 ## 功能概述 1. **记录食品信息** - 添加新的食品记录 2. **检查过期状态** - 检查食品是否已过期或即将过期 3. **查看所有食品** - 列出所有食品及其状态 4. **提醒功能** - 提醒一周内将过期的食物 5. **数据管理** - 更新或删除食品记录 ## 数据结构 食品数据存储在`food_data.json`文件中，格式如下： ```json { "foods": [ { "id": "唯一标识符", "name": "食品名称", "production_date": "生产日期 (YYYY-MM-DD)", "expiry_days": "保质期天数", "expiry_date": "过期日期 (自动计算)", "location": "存放位置", "quantity": "数量", "notes": "备注", "created_at": "创建时间", "updated_at": "更新时间" } ] } ``` ## 使用方法 ### 1. 添加新食品 使用以下命令添加新食品： ```bash python scripts/add_food.py "食品名称" "生产日期" "保质期天数" "存放位置" "数量" "备注" ``` 或手动编辑`food_data.json`文件。 ### 2. 检查过期状态 运行检查脚本查看过期和即将过期的食品： ```bash python scripts/check_expiry.py ``` ### 3. 查看所有食品 查看当前存储的所有食品： ```bash python scripts/list_foods.py ``` ### 4. 获取提醒 获取一周内将过期的食品提醒： ```bash python scripts/get_reminders.py ``` ## 脚本说明 ### `scripts/add_food.py` 添加新食品到数据库。参数： - 食品名称 - 生产日期 (YYYY-MM-DD) - 保质期天数 (整数) - 存放位置 - 数量 (可选，默认1) - 备注 (可选) ### `scripts/check_expiry.py` 检查所有食品的过期状态，显示： - 已过期的食品 - 一周内将过期的食品 - 两周内将过期的食品 - 安全的食品 ### `scripts/list_foods.py` 列出所有食品的详细信息，包括状态。 ### `scripts/get_reminders.py` 专门获取一周内将过期的食品提醒。 ### `scripts/init_data.py` 初始化food_data.json文件（如果不存在）。 ## 工作流程 1. **初始化数据文件** - 首次使用时运行`init_data.py` 2. **添加食品记录** - 购买新食品后立即记录 3. **定期检查** - 每天或每周运行`check_expiry.py` 4. **处理提醒** - 根据提醒处理即将过期的食品 ## 注意事项 1. 生产日期格式必须为YYYY-MM-DD 2. 保质期天数为整数 3. 过期日期会自动计算 4. 建议每天运行一次检查脚本 5. 数据文件位于`data/food_data.json` ## 参考文件 - [数据结构说明](references/data_structure.md) - [使用示例](references/examples.md) - [常见问题](references/faq.md)

path: references/examples.md
content: # 使用示例

## 示例1：初始化数据

首次使用技能时，需要初始化数据文件：

```bash
# 进入技能目录
cd ~/.openclaw/workspace/skills/food-expiry-reminder

# 运行初始化脚本
python scripts/init_data.py
```

输出：
```
✅ 已创建数据文件: /path/to/skills/food-expiry-reminder/data/food_data.json
📁 数据目录: /path/to/skills/food-expiry-reminder/data
```

## 示例2：添加食品

### 添加牛奶
```bash
python scripts/add_food.py "牛奶" "2024-03-01" 7 "冰箱" 2 "全脂牛奶"
```

输出：
```
✅ 已添加食品: 牛奶
  生产日期: 2024-03-01
  保质期: 7天
  过期日期: 2024-03-08
  存放位置: 冰箱
  数量: 2
  备注: 全脂牛奶
```

### 添加鸡蛋
```bash
python scripts/add_food.py "鸡蛋" "2024-02-28" 30 "冰箱" 12 "有机鸡蛋"
```

### 添加面包
```bash
python scripts/add_food.py "面包" "2024-03-03" 5 "pantry" 1 ""
```

### 添加冷冻蔬菜
```bash
python scripts/add_food.py "冷冻蔬菜" "2024-01-15" 180 "冷冻室" 3 "混合蔬菜"
```

## 示例3：列出所有食品

```bash
python scripts/list_foods.py
```

输出示例：
```
================================================================================
📋 所有食品清单
================================================================================

1. 牛奶 (2个) 🟡 即将过期
   ID: a1b2c3d4
   生产日期: 2024-03-01
   保质期: 7 天
   过期日期: 2024-03-08
   剩余天数: 4 天
   存放位置: 冰箱
   备注: 全脂牛奶
   添加时间: 2024-03-04

2. 面包 (1个) 🔴 已过期
   ID: b2c3d4e5
   生产日期: 2024-03-03
   保质期: 5 天
   过期日期: 2024-03-08
   已过期: 1 天
   存放位置: pantry
   添加时间: 2024-03-04

3. 鸡蛋 (12个) 🟢 安全
   ID: c3d4e5f6
   生产日期: 2024-02-28
   保质期: 30 天
   过期日期: 2024-03-29
   剩余天数: 25 天
   存放位置: 冰箱
   备注: 有机鸡蛋
   添加时间: 2024-03-04

4. 冷冻蔬菜 (3个) 🟢 安全
   ID: d4e5f6g7
   生产日期: 2024-01-15
   保质期: 180 天
   过期日期: 2024-07-13
   剩余天数: 131 天
   存放位置: 冷冻室
   备注: 混合蔬菜
   添加时间: 2024-03-04

================================================================================
📊 统计信息:
   食品总数: 4 种
   🔴 已过期: 1 种
   🟡 一周内过期: 1 种
   🟠 两周内过期: 0 种
   🟢 安全: 2 种

💡 提示:
   使用 'python check_expiry.py' 检查过期状态
   使用 'python get_reminders.py' 获取提醒
   使用 'python add_food.py' 添加新食品
================================================================================
```

## 示例4：检查过期状态

```bash
python scripts/check_expiry.py
```

输出示例：
```
============================================================
📊 食品过期状态检查
📅 检查日期: 2024-03-04
============================================================

🔴 已过期的食品:
   • 面包 (1个) - 过期 1 天
     位置: pantry, 过期日期: 2024-03-08

🟡 一周内将过期的食品:
   • 牛奶 (2个) - 4 天后过期
     位置: 冰箱, 过期日期: 2024-03-08

🟢 安全的食品 (两周后过期):
   • 鸡蛋 (12个) - 25 天后过期
     位置: 冰箱
   • 冷冻蔬菜 (3个) - 131 天后过期
     位置: 冷冻室

============================================================
📈 统计信息:
   总计食品: 4 种
   已过期: 1 种
   一周内过期: 1 种
   两周内过期: 0 种
   安全: 2 种
============================================================

🔔 提醒:
   • 有 1 种食品已过期，请立即处理！
   • 有 1 种食品一周内将过期，请优先食用！
```

## 示例5：获取一周内过期提醒

```bash
python scripts/get_reminders.py
```

输出示例：
```
============================================================
🔔 一周内将过期的食品提醒
============================================================

⚠️  发现 1 种食品一周内将过期：

📌 牛奶 (2个)
   4 天后过期 - 过期日期: 2024-03-08
   存放位置: 冰箱
   备注: 全脂牛奶

💡 建议:
   1. 优先食用这些即将过期的食品
   2. 检查是否可以冷冻保存延长保质期
   3. 考虑分享给家人朋友
   4. 如果已变质，请及时丢弃

============================================================
📅 检查时间: 2024-03-04 11:30:00
============================================================
```

## 示例6：手动编辑数据文件

如果需要批量添加或修改数据，可以直接编辑`data/food_data.json`文件：

```json
{
  "foods": [
    {
      "id": "manual001",
      "name": "酸奶",
      "production_date": "2024-03-03",
      "expiry_days": 14,
      "expiry_date": "2024-03-17",
      "location": "冰箱",
      "quantity": 4,
      "notes": "希腊酸奶",
      "created_at": "2024-03-04T12:00:00",
      "updated_at": "2024-03-04T12:00:00"
    }
  ],
  "created_at": "2024-03-04T09:00:00",
  "updated_at": "2024-03-04T12:00:00"
}
```

## 示例7：设置定时提醒

可以设置cron任务每天自动检查：

```bash
# 编辑crontab
crontab -e

# 添加以下行（每天上午9点检查）
0 9 * * * cd /path/to/skills/food-expiry-reminder && python scripts/get_reminders.py
```

## 示例8：结合OpenClaw使用

在OpenClaw中，可以创建快捷命令：

```bash
# 创建别名
alias food-check='cd ~/.openclaw/workspace/skills/food-expiry-reminder && python scripts/check_expiry.py'
alias food-list='cd ~/.openclaw/workspace/skills/food-expiry-reminder && python scripts/list_foods.py'
alias food-remind='cd ~/.openclaw/workspace/skills/food-expiry-reminder && python scripts/get_reminders.py'

# 使用别名
food-check
food-list
food-remind
```

path: references/data_structure.md
content: # 数据结构说明

## 数据文件位置

食品数据存储在：
```
技能目录/data/food_data.json
```

## 数据结构

### 根对象
```json
{
  "foods": [
    // 食品对象数组
  ],
  "created_at": "ISO格式的创建时间",
  "updated_at": "ISO格式的更新时间"
}
```

### 食品对象
```json
{
  "id": "唯一标识符 (UUID前8位)",
  "name": "食品名称",
  "production_date": "生产日期 (YYYY-MM-DD)",
  "expiry_days": "保质期天数 (整数)",
  "expiry_date": "过期日期 (YYYY-MM-DD, 自动计算)",
  "location": "存放位置",
  "quantity": "数量 (整数, 默认1)",
  "notes": "备注 (可选)",
  "created_at": "创建时间 (ISO格式)",
  "updated_at": "更新时间 (ISO格式)"
}
```

## 字段说明

### id
- **类型**: 字符串
- **说明**: 食品的唯一标识符
- **生成方式**: UUID前8位
- **示例**: "a1b2c3d4"

### name
- **类型**: 字符串
- **说明**: 食品名称
- **示例**: "牛奶", "鸡蛋", "面包"

### production_date
- **类型**: 字符串
- **格式**: YYYY-MM-DD
- **说明**: 生产日期
- **示例**: "2024-03-01"

### expiry_days
- **类型**: 整数
- **说明**: 保质期天数
- **示例**: 7 (表示7天保质期)

### expiry_date
- **类型**: 字符串
- **格式**: YYYY-MM-DD
- **说明**: 过期日期，自动计算：`生产日期 + 保质期天数`
- **示例**: "2024-03-08"

### location
- **类型**: 字符串
- **说明**: 存放位置
- **示例**: "冰箱", " pantry", "冷冻室"

### quantity
- **类型**: 整数
- **默认值**: 1
- **说明**: 食品数量
- **示例**: 2

### notes
- **类型**: 字符串
- **可选**: 是
- **说明**: 额外备注信息
- **示例**: "全脂牛奶", "有机鸡蛋"

### created_at
- **类型**: 字符串
- **格式**: ISO 8601
- **说明**: 记录创建时间
- **示例**: "2024-03-04T10:30:00"

### updated_at
- **类型**: 字符串
- **格式**: ISO 8601
- **说明**: 记录最后更新时间
- **示例**: "2024-03-04T10:30:00"

## 数据验证规则

1. **生产日期**: 必须为有效的YYYY-MM-DD格式
2. **保质期天数**: 必须为正整数
3. **过期日期**: 自动计算，必须晚于生产日期
4. **数量**: 必须为正整数
5. **所有必填字段**: name, production_date, expiry_days, location 必须提供

## 数据文件示例

```json
{
  "foods": [
    {
      "id": "a1b2c3d4",
      "name": "牛奶",
      "production_date": "2024-03-01",
      "expiry_days": 7,
      "expiry_date": "2024-03-08",
      "location": "冰箱",
      "quantity": 2,
      "notes": "全脂牛奶",
      "created_at": "2024-03-04T10:30:00",
      "updated_at": "2024-03-04T10:30:00"
    },
    {
      "id": "e5f6g7h8",
      "name": "鸡蛋",
      "production_date": "2024-02-28",
      "expiry_days": 30,
      "expiry_date": "2024-03-29",
      "location": "冰箱",
      "quantity": 12,
      "notes": "有机鸡蛋",
      "created_at": "2024-03-04T11:00:00",
      "updated_at": "2024-03-04T11:00:00"
    }
  ],
  "created_at": "2024-03-04T09:00:00",
  "updated_at": "2024-03-04T11:00:00"
}
```

## 数据备份建议

建议定期备份`food_data.json`文件，可以：
1. 复制到其他位置
2. 使用版本控制系统 (如git)
3. 同步到云存储

path: references/faq.md
content: # 常见问题 (FAQ)

## 一般问题

### Q1: 这个技能是做什么的？
**A:** 这个技能帮助您记录、管理和提醒食品过期情况。您可以：
- 记录购买的食品信息（名称、生产日期、保质期、存放位置等）
- 检查食品是否已过期或即将过期
- 获取一周内将过期的食品提醒
- 查看所有食品的详细清单和状态

### Q2: 数据存储在哪里？
**A:** 所有食品数据存储在 `技能目录/data/food_data.json` 文件中。这是一个JSON格式的文件，易于阅读和备份。

### Q3: 需要安装额外的依赖吗？
**A:** 不需要。这个技能使用Python标准库，不需要安装额外的包。

## 安装和设置

### Q4: 如何开始使用？
**A:** 按照以下步骤：
1. 确保技能目录存在：`~/.openclaw/workspace/skills/food-expiry-reminder`
2. 运行初始化脚本：`python scripts/init_data.py`
3. 开始添加食品：`python scripts/add_food.py ...`

### Q5: 如何验证安装是否成功？
**A:** 运行以下命令检查：
```bash
cd ~/.openclaw/workspace/skills/food-expiry-reminder
python scripts/init_data.py
python scripts/list_foods.py
```
如果看到"还没有添加任何食品"的提示，说明安装成功。

## 使用问题

### Q6: 添加食品时出现"日期格式错误"怎么办？
**A:** 确保生产日期使用正确的格式：`YYYY-MM-DD`
- ✅ 正确：`2024-03-04`
- ❌ 错误：`2024/03/04`、`04-03-2024`、`March 4, 2024`

### Q7: 如何批量添加食品？
**A:** 有几种方法：
1. 多次运行 `add_food.py` 脚本
2. 直接编辑 `data/food_data.json` 文件
3. 创建批处理脚本

### Q8: 如何更新食品信息？
**A:** 目前需要直接编辑 `data/food_data.json` 文件。未来版本可能会添加编辑功能。

### Q9: 如何删除食品？
**A:** 直接编辑 `data/food_data.json` 文件，从 `foods` 数组中删除对应的食品对象。

### Q10: 数据会丢失吗？
**A:** 数据存储在本地文件中，不会自动删除。但建议定期备份 `food_data.json` 文件。

## 功能问题

### Q11: 如何设置每天自动提醒？
**A:** 可以使用cron任务：
```bash
# 编辑crontab
crontab -e

# 添加以下行（每天上午9点检查）
0 9 * * * cd /path/to/skills/food-expiry-reminder && python scripts/get_reminders.py
```

### Q12: 可以设置不同的提醒时间吗？
**A:** 是的，可以修改 `check_expiry.py` 脚本中的时间阈值：
- 默认：一周内过期会提醒
- 可以修改为3天、10天等

### Q13: 如何查看特定位置的食品？
**A:** 目前需要查看完整列表然后筛选。未来版本可能会添加按位置筛选的功能。

### Q14: 可以导出数据吗？
**A:** 可以，`food_data.json` 本身就是标准JSON格式，可以直接复制或导入到其他系统。

### Q15: 支持多个用户吗？
**A:** 目前是单用户系统。如果需要多用户，可以为每个用户创建单独的数据文件。

## 故障排除

### Q16: 运行脚本时出现"没有那个文件或目录"错误
**A:** 确保在正确的目录中运行：
```bash
cd ~/.openclaw/workspace/skills/food-expiry-reminder
python scripts/脚本名称.py
```

### Q17: 出现"数据文件不存在"错误
**A:** 运行初始化脚本：
```bash
python scripts/init_data.py
```

### Q18: Python版本有问题
**A:** 这个技能需要Python 3.6或更高版本。检查Python版本：
```bash
python3 --version
```

### Q19: JSON文件格式错误
**A:** 如果手动编辑JSON文件导致格式错误，可以：
1. 使用JSON验证工具检查
2. 从备份恢复
3. 重新初始化并重新添加数据

### Q20: 脚本没有执行权限
**A:** 添加执行权限：
```bash
chmod +x scripts/*.py
```

## 高级用法

### Q21: 如何集成到OpenClaw的日常检查中？
**A:** 可以修改 `HEARTBEAT.md` 文件，添加食品检查：
```markdown
# 每天检查食品过期情况
运行食品过期检查脚本
```

### Q22: 可以添加自定义字段吗？
**A:** 可以，直接修改 `food_data.json` 文件的数据结构，但需要相应更新脚本。

### Q23: 如何备份数据？
**A:** 建议定期备份：
```bash
# 备份到其他位置
cp data/food_data.json ~/backups/food_data_backup.json

# 或使用版本控制
cd ~/.openclaw/workspace/skills/food-expiry-reminder
git add data/food_data.json
git commit -m "备份食品数据"
```

### Q24: 数据文件太大怎么办？
**A:** 定期清理已处理（已食用或丢弃）的食品记录。

### Q25: 可以添加图片或条形码吗？
**A:** 当前版本不支持，但可以在 `notes` 字段中添加相关信息的文字描述。

## 功能建议

### Q26: 未来可能添加的功能
**A:** 计划中的功能包括：
1. 图形用户界面 (GUI)
2. 移动端应用
3. 条形码扫描
4. 食谱建议（基于现有食材）
5. 购物清单生成
6. 营养信息跟踪

### Q27: 如何贡献代码？
**A:** 欢迎提交改进建议和代码贡献。可以：
1. Fork项目
2. 实现新功能
3. 提交Pull Request

### Q28: 在哪里报告问题？
**A:** 可以通过OpenClaw的反馈渠道报告问题。

### Q29: 有使用教程视频吗？
**A:** 目前只有文字文档。未来可能会制作视频教程。

### Q30: 这个技能是免费的吗？
**A:** 是的，完全免费和开源。

path: scripts/list_foods.py
content: #!/usr/bin/env python3
"""
列出所有食品
"""

import os
import json
from datetime import datetime

def load_food_data():
    """加载食品数据"""
    data_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'data')
    data_file = os.path.join(data_dir, 'food_data.json')
    
    if not os.path.exists(data_file):
        print("❌ 数据文件不存在，请先运行 init_data.py")
        return None
    
    with open(data_file, 'r', encoding='utf-8') as f:
        return json.load(f)

def list_all_foods():
    """列出所有食品"""
    data = load_food_data()
    if data is None:
        return
    
    today = datetime.now().date()
    
    print("=" * 80)
    print("📋 所有食品清单")
    print("=" * 80)
    
    if not data['foods']:
        print("\n📭 还没有添加任何食品。")
        print("使用 'python add_food.py' 命令添加食品。")
        return
    
    # 按过期日期排序
    sorted_foods = sorted(data['foods'], 
                         key=lambda x: datetime.strptime(x['expiry_date'], "%Y-%m-%d").date())
    
    for i, food in enumerate(sorted_foods, 1):
        try:
            expiry_date = datetime.strptime(food['expiry_date'], "%Y-%m-%d").date()
            days_left = (expiry_date - today).days
            
            # 确定状态图标
            if days_left < 0:
                status = "🔴 已过期"
            elif days_left <= 7:
                status = "🟡 即将过期"
            elif days_left <= 14:
                status = "🟠 注意"
            else:
                status = "🟢 安全"
            
            print(f"\n{i}. {food['name']} ({food['quantity']}个) {status}")
            print(f"   ID: {food['id']}")
            print(f"   生产日期: {food['production_date']}")
            print(f"   保质期: {food['expiry_days']} 天")
            print(f"   过期日期: {food['expiry_date']}")
            
            if days_left < 0:
                print(f"   已过期: {-days_left} 天")
            else:
                print(f"   剩余天数: {days_left} 天")
            
            print(f"   存放位置: {food['location']}")
            
            if food.get('notes'):
                print(f"   备注: {food['notes']}")
            
            print(f"   添加时间: {food['created_at'][:10]}")
            
        except ValueError:
            print(f"\n{i}. {food['name']} ⚠️ 日期格式错误")
            print(f"   过期日期: {food.get('expiry_date', '未知')}")
    
    # 统计信息
    print("\n" + "=" * 80)
    print("📊 统计信息:")
    print(f"   食品总数: {len(data['foods'])} 种")
    
    # 按状态统计
    expired = 0
    expiring_soon = 0
    warning = 0
    safe = 0
    
    for food in data['foods']:
        try:
            expiry_date = datetime.strptime(food['expiry_date'], "%Y-%m-%d").date()
            days_left = (expiry_date - today).days
            
            if days_left < 0:
                expired += 1
            elif days_left <= 7:
                expiring_soon += 1
            elif days_left <= 14:
                warning += 1
            else:
                safe += 1
        except ValueError:
            continue
    
    print(f"   🔴 已过期: {expired} 种")
    print(f"   🟡 一周内过期: {expiring_soon} 种")
    print(f"   🟠 两周内过期: {warning} 种")
    print(f"   🟢 安全: {safe} 种")
    
    print("\n💡 提示:")
    print("   使用 'python check_expiry.py' 检查过期状态")
    print("   使用 'python get_reminders.py' 获取提醒")
    print("   使用 'python add_food.py' 添加新食品")
    print("=" * 80)

def main():
    """主函数"""
    list_all_foods()

if __name__ == "__main__":
    main()

path: scripts/get_reminders.py
content: #!/usr/bin/env python3
"""
获取一周内将过期的食品提醒
"""

import os
import json
from datetime import datetime, timedelta

def load_food_data():
    """加载食品数据"""
    data_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'data')
    data_file = os.path.join(data_dir, 'food_data.json')
    
    if not os.path.exists(data_file):
        print("❌ 数据文件不存在，请先运行 init_data.py")
        return None
    
    with open(data_file, 'r', encoding='utf-8') as f:
        return json.load(f)

def get_weekly_reminders():
    """获取一周内将过期的食品提醒"""
    data = load_food_data()
    if data is None:
        return []
    
    today = datetime.now().date()
    one_week_later = today + timedelta(days=7)
    
    expiring_foods = []
    
    for food in data['foods']:
        try:
            expiry_date = datetime.strptime(food['expiry_date'], "%Y-%m-%d").date()
            
            # 只获取一周内将过期的食品
            if today <= expiry_date <= one_week_later:
                days_left = (expiry_date - today).days
                expiring_foods.append({
                    'food': food,
                    'days_left': days_left
                })
        except ValueError:
            continue
    
    # 按过期时间排序
    expiring_foods.sort(key=lambda x: x['days_left'])
    
    return expiring_foods

def main():
    """主函数"""
    print("=" * 60)
    print("🔔 一周内将过期的食品提醒")
    print("=" * 60)
    
    expiring_foods = get_weekly_reminders()
    
    if not expiring_foods:
        print("\n🎉 好消息！没有一周内将过期的食品。")
        print("所有食品都安全，可以放心食用。")
    else:
        print(f"\n⚠️  发现 {len(expiring_foods)} 种食品一周内将过期：")
        
        for item in expiring_foods:
            food = item['food']
            days_left = item['days_left']
            
            if days_left == 0:
                day_text = "今天过期"
            elif days_left == 1:
                day_text = "明天过期"
            else:
                day_text = f"{days_left} 天后过期"
            
            print(f"\n📌 {food['name']} ({food['quantity']}个)")
            print(f"   {day_text} - 过期日期: {food['expiry_date']}")
            print(f"   存放位置: {food['location']}")
            
            if food.get('notes'):
                print(f"   备注: {food['notes']}")
        
        print("\n💡 建议:")
        print("   1. 优先食用这些即将过期的食品")
        print("   2. 检查是否可以冷冻保存延长保质期")
        print("   3. 考虑分享给家人朋友")
        print("   4. 如果已变质，请及时丢弃")
    
    print("\n" + "=" * 60)
    print(f"📅 检查时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print("=" * 60)

if __name__ == "__main__":
    main()

path: scripts/add_food.py
content: #!/usr/bin/env python3
"""
添加新食品到数据库
"""

import os
import json
import sys
from datetime import datetime, timedelta
import uuid

def load_food_data():
    """加载食品数据"""
    data_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'data')
    data_file = os.path.join(data_dir, 'food_data.json')
    
    if not os.path.exists(data_file):
        print("❌ 数据文件不存在，请先运行 init_data.py")
        return None
    
    with open(data_file, 'r', encoding='utf-8') as f:
        return json.load(f)

def save_food_data(data):
    """保存食品数据"""
    data_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'data')
    data_file = os.path.join(data_dir, 'food_data.json')
    
    data['updated_at'] = datetime.now().isoformat()
    
    with open(data_file, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)

def add_food(name, production_date, expiry_days, location, quantity=1, notes=""):
    """添加新食品"""
    try:
        # 验证生产日期格式
        prod_date = datetime.strptime(production_date, "%Y-%m-%d")
        
        # 计算过期日期
        expiry_date = prod_date + timedelta(days=int(expiry_days))
        
        # 创建食品记录
        food_item = {
            "id": str(uuid.uuid4())[:8],  # 使用UUID前8位作为ID
            "name": name,
            "production_date": production_date,
            "expiry_days": int(expiry_days),
            "expiry_date": expiry_date.strftime("%Y-%m-%d"),
            "location": location,
            "quantity": int(quantity),
            "notes": notes,
            "created_at": datetime.now().isoformat(),
            "updated_at": datetime.now().isoformat()
        }
        
        # 加载现有数据
        data = load_food_data()
        if data is None:
            return False
        
        # 添加新食品
        data['foods'].append(food_item)
        data['updated_at'] = datetime.now().isoformat()
        
        # 保存数据
        save_food_data(data)
        
        print(f"✅ 已添加食品: {name}")
        print(f"  生产日期: {production_date}")
        print(f"  保质期: {expiry_days}天")
        print(f"  过期日期: {expiry_date.strftime('%Y-%m-%d')}")
        print(f"  存放位置: {location}")
        print(f"  数量: {quantity}")
        if notes:
            print(f"  备注: {notes}")
        
        return True
        
    except ValueError as e:
        print(f"❌ 日期格式错误: {e}")
        print("请使用 YYYY-MM-DD 格式 (例如: 2024-03-04)")
        return False
    except Exception as e:
        print(f"❌ 添加食品时出错: {e}")
        return False

def main():
    """主函数"""
    if len(sys.argv) < 5:
        print("使用方法: python add_food.py <名称> <生产日期> <保质期天数> <存放位置> [数量] [备注]")
        print("示例: python add_food.py \"牛奶\" \"2024-03-01\" 7 \"冰箱\" 2 \"全脂牛奶\"")
        return
    
    name = sys.argv[1]
    production_date = sys.argv[2]
    expiry_days = sys.argv[3]
    location = sys.argv[4]
    
    quantity = sys.argv[5] if len(sys.argv) > 5 else 1
    notes = sys.argv[6] if len(sys.argv) > 6 else ""
    
    add_food(name, production_date, expiry_days, location, quantity, notes)

if __name__ == "__main__":
    main()

path: scripts/init_data.py
content: #!/usr/bin/env python3
"""
初始化食品数据文件
"""

import os
import json
from datetime import datetime

def init_food_data():
    """初始化food_data.json文件"""
    data_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'data')
    data_file = os.path.join(data_dir, 'food_data.json')
    
    # 创建数据目录
    os.makedirs(data_dir, exist_ok=True)
    
    # 如果文件不存在，创建初始数据结构
    if not os.path.exists(data_file):
        initial_data = {
            "foods": [],
            "created_at": datetime.now().isoformat(),
            "updated_at": datetime.now().isoformat()
        }
        
        with open(data_file, 'w', encoding='utf-8') as f:
            json.dump(initial_data, f, ensure_ascii=False, indent=2)
        
        print(f"✅ 已创建数据文件: {data_file}")
        print(f"📁 数据目录: {data_dir}")
    else:
        print(f"📁 数据文件已存在: {data_file}")
    
    return data_file

if __name__ == "__main__":
    init_food_data()

path: scripts/check_expiry.py
content: #!/usr/bin/env python3
"""
检查食品过期状态
"""

import os
import json
from datetime import datetime, timedelta

def load_food_data():
    """加载食品数据"""
    data_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'data')
    data_file = os.path.join(data_dir, 'food_data.json')
    
    if not os.path.exists(data_file):
        print("❌ 数据文件不存在，请先运行 init_data.py")
        return None
    
    with open(data_file, 'r', encoding='utf-8') as f:
        return json.load(f)

def check_expiry_status():
    """检查所有食品的过期状态"""
    data = load_food_data()
    if data is None:
        return
    
    today = datetime.now().date()
    one_week_later = today + timedelta(days=7)
    two_weeks_later = today + timedelta(days=14)
    
    expired_foods = []
    expiring_soon_foods = []  # 一周内过期
    expiring_later_foods = []  # 两周内过期
    safe_foods = []
    
    for food in data['foods']:
        try:
            expiry_date = datetime.strptime(food['expiry_date'], "%Y-%m-%d").date()
            
            if expiry_date < today:
                expired_foods.append(food)
            elif expiry_date <= one_week_later:
                expiring_soon_foods.append(food)
            elif expiry_date <= two_weeks_later:
                expiring_later_foods.append(food)
            else:
                safe_foods.append(food)
        except ValueError:
            print(f"⚠️  食品 '{food.get('name', '未知')}' 的过期日期格式错误: {food.get('expiry_date')}")
    
    # 打印结果
    print("=" * 60)
    print("📊 食品过期状态检查")
    print(f"📅 检查日期: {today.strftime('%Y-%m-%d')}")
    print("=" * 60)
    
    if expired_foods:
        print("\n🔴 已过期的食品:")
        for food in expired_foods:
            days_overdue = (today - datetime.strptime(food['expiry_date'], "%Y-%m-%d").date()).days
            print(f"   • {food['name']} ({food['quantity']}个) - 过期 {days_overdue} 天")
            print(f"     位置: {food['location']}, 过期日期: {food['expiry_date']}")
    
    if expiring_soon_foods:
        print("\n🟡 一周内将过期的食品:")
        for food in expiring_soon_foods:
            expiry_date = datetime.strptime(food['expiry_date'], "%Y-%m-%d").date()
            days_left = (expiry_date - today).days
            print(f"   • {food['name']} ({food['quantity']}个) - {days_left} 天后过期")
            print(f"     位置: {food['location']}, 过期日期: {food['expiry_date']}")
    
    if expiring_later_foods:
        print("\n🟠 两周内将过期的食品:")
        for food in expiring_later_foods:
            expiry_date = datetime.strptime(food['expiry_date'], "%Y-%m-%d").date()
            days_left = (expiry_date - today).days
            print(f"   • {food['name']} ({food['quantity']}个) - {days_left} 天后过期")
            print(f"     位置: {food['location']}, 过期日期: {food['expiry_date']}")
    
    if safe_foods:
        print("\n🟢 安全的食品 (两周后过期):")
        for food in safe_foods:
            expiry_date = datetime.strptime(food['expiry_date'], "%Y-%m-%d").date()
            days_left = (expiry_date - today).days
            print(f"   • {food['name']} ({food['quantity']}个) - {days_left} 天后过期")
            print(f"     位置: {food['location']}")
    
    # 统计信息
    print("\n" + "=" * 60)
    print("📈 统计信息:")
    print(f"   总计食品: {len(data['foods'])} 种")
    print(f"   已过期: {len(expired_foods)} 种")
    print(f"   一周内过期: {len(expiring_soon_foods)} 种")
    print(f"   两周内过期: {len(expiring_later_foods)} 种")
    print(f"   安全: {len(safe_foods)} 种")
    print("=" * 60)
    
    # 返回提醒信息
    reminders = []
    if expired_foods:
        reminders.append(f"有 {len(expired_foods)} 种食品已过期，请立即处理！")
    if expiring_soon_foods:
        reminders.append(f"有 {len(expiring_soon_foods)} 种食品一周内将过期，请优先食用！")
    
    return reminders

def main():
    """主函数"""
    reminders = check_expiry_status()
    
    if reminders:
        print("\n🔔 提醒:")
        for reminder in reminders:
            print(f"   • {reminder}")

if __name__ == "__main__":
    main()

path: data/food_data.json
content: {
  "foods": [
    {
      "id": "a3bd5788",
      "name": "牛奶",
      "production_date": "2024-03-01",
      "expiry_days": 7,
      "expiry_date": "2024-03-08",
      "location": "冰箱",
      "quantity": 2,
      "notes": "全脂牛奶",
      "created_at": "2026-03-04T11:14:14.688472",
      "updated_at": "2026-03-04T11:14:14.688484"
    },
    {
      "id": "625c5ac1",
      "name": "鸡蛋",
      "production_date": "2024-02-28",
      "expiry_days": 30,
      "expiry_date": "2024-03-29",
      "location": "冰箱",
      "quantity": 12,
      "notes": "有机鸡蛋",
      "created_at": "2026-03-04T11:14:20.626586",
      "updated_at": "2026-03-04T11:14:20.626594"
    },
    {
      "id": "5ed84ceb",
      "name": "面包",
      "production_date": "2024-03-03",
      "expiry_days": 5,
      "expiry_date": "2024-03-08",
      "location": "pantry",
      "quantity": 1,
      "notes": "",
      "created_at": "2026-03-04T11:14:26.216593",
      "updated_at": "2026-03-04T11:14:26.216604"
    },
    {
      "id": "e77f5bed",
      "name": "酸奶",
      "production_date": "2026-03-01",
      "expiry_days": 14,
      "expiry_date": "2026-03-15",
      "location": "冰箱",
      "quantity": 4,
      "notes": "希腊酸奶",
      "created_at": "2026-03-04T11:14:37.314782",
      "updated_at": "2026-03-04T11:14:37.314790"
    },
    {
      "id": "a13d609a",
      "name": "苹果",
      "production_date": "2026-03-02",
      "expiry_days": 21,
      "expiry_date": "2026-03-23",
      "location": "水果篮",
      "quantity": 6,
      "notes": "红富士",
      "created_at": "2026-03-04T11:14:43.598254",
      "updated_at": "2026-03-04T11:14:43.598262"
    },
    {
      "id": "837de565",
      "name": "秦晋小馒头",
      "production_date": "2026-03-04",
      "expiry_days": 3,
      "expiry_date": "2026-03-07",
      "location": "冰箱保鲜层",
      "quantity": 1,
      "notes": "",
      "created_at": "2026-03-04T11:18:45.519643",
      "updated_at": "2026-03-04T11:18:45.519651"
    }
  ],
  "created_at": "2026-03-04T11:14:09.359868",
  "updated_at": "2026-03-04T11:18:45.519802"
}

Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)