30日2045-宠物自动收获增加铲除功能.md 12 KB

宠物自动收获增加铲除功能

任务描述

在宠物自动收获技能中增加自动铲除枯萎作物的功能,收获后自动清理枯萎作物使土地变为空闲状态

需求分析

背景

在前面的修复中,我们让作物收获后进入枯萎状态而不是直接消失。但这对宠物的自动收获技能产生了影响:

  • 宠物收获作物后,作物进入枯萎状态
  • 土地状态变为枯萎状态,不是空闲状态
  • 自动播种技能无法在枯萎状态的土地上工作
  • 需要用户手动铲除枯萎作物才能继续自动播种

需求详细分析

1. 自动收获的完整流程需求

  • 收获作物:获得果实,作物进入枯萎状态
  • 自动铲除:立即铲除枯萎的作物
  • 土地清理:土地状态变为空闲
  • 继续循环:自动播种可以在空闲土地上继续工作

2. 宠物技能的智能化需求

  • 一站式服务:收获 + 铲除一次完成
  • 无需人工干预:完全自动化的农场管理
  • 效率提升:减少用户的手动操作

3. 统计和日志需求

  • 详细记录:记录收获和铲除的数量
  • 操作追踪:追踪每个操作的成功/失败状态
  • 性能监控:监控自动技能的执行效果

解决方案

1. 修改自动收获逻辑

1.1 在收获后增加铲除步骤

// 调用收获服务
$result = CropService::harvestCrop($userId, $land->id);

if ($result instanceof Res && !$result->error) {
    $harvestCount++;
    $harvestResults[] = [
        'land_id' => $land->id,
        'success' => true,
        'auto_cleared' => false
    ];

    Log::info('自动收菜成功', [
        'user_id' => $userId,
        'pet_id' => $pet->id,
        'land_id' => $land->id
    ]);

    // 收获后自动铲除枯萎的作物
    $clearResult = $this->autoClearWitheredCrop($userId, $land->id);
    if ($clearResult) {
        $harvestResults[count($harvestResults) - 1]['auto_cleared'] = true;
        
        Log::info('自动铲除枯萎作物成功', [
            'user_id' => $userId,
            'pet_id' => $pet->id,
            'land_id' => $land->id
        ]);
    }
}

1.2 增加统计信息

// 统计自动铲除的数量
$autoClearedCount = array_sum(array_column($harvestResults, 'auto_cleared'));

// 记录统计信息
$this->recordSkillStatistics($activeSkill, 'auto_harvest', [
    'harvest_count' => $harvestCount,
    'auto_cleared_count' => $autoClearedCount,
    'total_lands_checked' => $harvestableLands->count(),
    'harvest_results' => $harvestResults
]);

2. 实现自动铲除方法

2.1 autoClearWitheredCrop方法

protected function autoClearWitheredCrop(int $userId, int $landId): bool
{
    try {
        // 获取土地信息
        $land = \App\Module\Farm\Models\FarmLand::where('id', $landId)
            ->where('user_id', $userId)
            ->first();

        if (!$land) {
            return false;
        }

        // 检查土地状态是否为枯萎状态
        if ($land->status !== \App\Module\Farm\Enums\LAND_STATUS::WITHERED->value) {
            return false;
        }

        // 获取土地上的作物
        $crop = \App\Module\Farm\Models\FarmCrop::where('land_id', $landId)->first();
        if (!$crop) {
            // 如果没有作物但土地状态是枯萎,修正土地状态为空闲
            $land->status = \App\Module\Farm\Enums\LAND_STATUS::IDLE->value;
            $land->save();
            return true;
        }

        // 检查作物是否为枯萎状态
        if ($crop->growth_stage !== \App\Module\Farm\Enums\GROWTH_STAGE::WITHERED->value) {
            return false;
        }

        // 调用农场服务铲除作物
        $result = \App\Module\Farm\Services\CropService::removeCrop($userId, $landId);

        if ($result) {
            Log::info('宠物自动铲除枯萎作物成功', [
                'user_id' => $userId,
                'land_id' => $landId,
                'crop_id' => $crop->id
            ]);
            return true;
        }

        return false;
    } catch (\Exception $e) {
        Log::warning('宠物自动铲除枯萎作物失败', [
            'user_id' => $userId,
            'land_id' => $landId,
            'error' => $e->getMessage()
        ]);

        return false;
    }
}

2.2 方法特点

  • 安全检查:验证土地和作物状态
  • 状态修正:处理数据不一致的情况
  • 服务调用:使用现有的CropService::removeCrop
  • 详细日志:记录操作过程和结果

3. 完整的自动化流程

3.1 自动收获 + 自动铲除流程

  1. 检查可收获土地:获取所有成熟期的作物
  2. 执行收获操作:调用CropService::harvestCrop
  3. 作物进入枯萎期:收获后作物自动变为枯萎状态
  4. 自动铲除枯萎作物:立即调用autoClearWitheredCrop
  5. 土地变为空闲:铲除后土地状态变为空闲
  6. 记录操作结果:统计收获和铲除的数量

3.2 与自动播种的配合

  1. 自动收获:清理成熟作物,释放土地
  2. 自动播种:在空闲土地上种植新作物
  3. 循环进行:形成完整的自动化农场管理

修改内容

修改的文件

  • app/Module/Pet/Logic/PetAutoSkillLogic.php

具体修改

1. processAutoHarvest方法修改(第52-97行)

foreach ($harvestableLands as $land) {
    try {
        DB::beginTransaction();

        // 调用收获服务
        $result = CropService::harvestCrop($userId, $land->id);

        if ($result instanceof Res && !$result->error) {
            $harvestCount++;
            $harvestResults[] = [
                'land_id' => $land->id,
                'success' => true,
                'auto_cleared' => false
            ];

            Log::info('自动收菜成功', [
                'user_id' => $userId,
                'pet_id' => $pet->id,
                'land_id' => $land->id
            ]);

            // 收获后自动铲除枯萎的作物
            $clearResult = $this->autoClearWitheredCrop($userId, $land->id);
            if ($clearResult) {
                $harvestResults[count($harvestResults) - 1]['auto_cleared'] = true;
                
                Log::info('自动铲除枯萎作物成功', [
                    'user_id' => $userId,
                    'pet_id' => $pet->id,
                    'land_id' => $land->id
                ]);
            }
        }

        DB::commit();

    } catch (\Exception $e) {
        DB::rollBack();
        Log::warning('自动收菜失败', [
            'user_id' => $userId,
            'pet_id' => $pet->id,
            'land_id' => $land->id,
            'error' => $e->getMessage()
        ]);
    }
}

2. 统计信息增强(第99-108行)

// 统计自动铲除的数量
$autoClearedCount = array_sum(array_column($harvestResults, 'auto_cleared'));

// 记录统计信息
$this->recordSkillStatistics($activeSkill, 'auto_harvest', [
    'harvest_count' => $harvestCount,
    'auto_cleared_count' => $autoClearedCount,
    'total_lands_checked' => $harvestableLands->count(),
    'harvest_results' => $harvestResults
]);

3. 日志信息更新(第110-117行)

Log::info('自动收菜技能处理完成', [
    'active_skill_id' => $activeSkill->id,
    'pet_id' => $pet->id,
    'user_id' => $userId,
    'harvest_count' => $harvestCount,
    'auto_cleared_count' => $autoClearedCount,
    'total_lands' => $harvestableLands->count()
]);

4. 新增autoClearWitheredCrop方法(第872-933行)

protected function autoClearWitheredCrop(int $userId, int $landId): bool
{
    // 完整的自动铲除逻辑
    // 包括状态检查、服务调用、错误处理等
}

技术要点

1. 事务安全性

  • 统一事务:收获和铲除在同一个事务中执行
  • 回滚机制:任何步骤失败都会回滚整个操作
  • 数据一致性:确保土地和作物状态的一致性

2. 状态验证

  • 土地状态检查:确认土地为枯萎状态
  • 作物状态检查:确认作物为枯萎状态
  • 数据修正:处理状态不一致的边缘情况

3. 服务复用

  • 使用现有服务:调用CropService::removeCrop
  • 保持一致性:与手动铲除使用相同的逻辑
  • 减少重复代码:避免重复实现铲除逻辑

4. 详细统计

  • 操作计数:分别统计收获和铲除的数量
  • 结果追踪:记录每个土地的操作结果
  • 性能监控:监控自动技能的执行效率

业务价值

1. 用户体验提升

  • 完全自动化:收获 + 铲除一次完成
  • 无需干预:用户不需要手动清理枯萎作物
  • 效率提升:自动播种可以立即在清理后的土地上工作

2. 宠物技能完善

  • 智能化程度提高:宠物能够处理完整的农场管理流程
  • 技能价值增加:自动收获技能变得更加实用
  • 用户满意度提升:减少了用户的操作负担

3. 系统逻辑完整性

  • 流程闭环:形成完整的自动化农场管理循环
  • 状态一致性:确保土地状态的正确流转
  • 功能协调性:自动收获与自动播种完美配合

4. 数据监控能力

  • 操作统计:详细的收获和铲除统计
  • 性能分析:可以分析自动技能的执行效果
  • 问题排查:详细的日志便于问题定位

流程对比

Before(修改前)

  1. 宠物自动收获成熟作物 ✅
  2. 作物进入枯萎状态 ✅
  3. 土地状态变为枯萎状态 ❌
  4. 用户需要手动铲除枯萎作物 ❌
  5. 土地状态变为空闲 ❌
  6. 自动播种可以继续工作 ❌

After(修改后)

  1. 宠物自动收获成熟作物 ✅
  2. 作物进入枯萎状态 ✅
  3. 宠物自动铲除枯萎作物 ✅
  4. 土地状态变为空闲 ✅
  5. 自动播种可以立即继续工作 ✅
  6. 形成完整的自动化循环 ✅

统计信息示例

自动收获技能统计

{
    "action_type": "auto_harvest",
    "timestamp": "2024-12-30 20:45:00",
    "data": {
        "harvest_count": 5,
        "auto_cleared_count": 5,
        "total_lands_checked": 8,
        "harvest_results": [
            {
                "land_id": 1,
                "success": true,
                "auto_cleared": true
            },
            {
                "land_id": 2,
                "success": true,
                "auto_cleared": true
            }
        ]
    }
}

验证方法

1. 功能测试

  • 激活宠物自动收获技能
  • 等待成熟作物被自动收获
  • 确认枯萎作物被自动铲除
  • 验证土地状态变为空闲

2. 配合测试

  • 同时激活自动收获和自动播种技能
  • 验证收获 → 铲除 → 播种的完整循环
  • 确认自动化农场管理的连续性

3. 统计验证

  • 检查技能统计信息
  • 确认收获和铲除数量的准确性
  • 验证日志记录的完整性

4. 异常测试

  • 测试土地状态异常的处理
  • 验证作物状态不一致的修正
  • 确认错误情况下的回滚机制

风险评估

1. 低风险

  • 使用现有的CropService::removeCrop服务
  • 在事务中执行,保证数据一致性
  • 详细的状态检查和错误处理

2. 注意事项

  • 需要确保CropService::removeCrop服务的稳定性
  • 监控自动铲除的执行效果
  • 关注事务执行时间,避免长时间锁定

后续优化建议

1. 性能优化

  • 批量处理多个土地的铲除操作
  • 优化数据库查询,减少查询次数
  • 考虑异步处理大量土地的情况

2. 功能扩展

  • 支持选择性铲除(根据作物类型)
  • 增加铲除失败的重试机制
  • 支持铲除时获得额外奖励

3. 用户体验

  • 提供铲除操作的可视化反馈
  • 增加自动铲除的开关选项
  • 显示详细的操作统计报告

任务状态

✅ 已完成

相关文件

  • app/Module/Pet/Logic/PetAutoSkillLogic.php - 主要修改文件

影响范围

  • 增强了宠物自动收获技能的完整性
  • 实现了收获后的自动清理功能
  • 完善了自动化农场管理的闭环流程
  • 提升了宠物技能的实用价值和用户体验