21日2330-农场作物软删除功能和事件日志后台管理.md 5.0 KB

农场作物软删除功能和事件日志后台管理

时间: 2025年06月21日 23:30
任务类型: 功能开发和Bug修复
状态: ✅ 已完成

任务概述

本次任务完成了两个重要功能:

  1. 为农场作物模型实现软删除功能
  2. 修复作物事件日志后台管理界面缺失问题

任务1:作物信息模型,软删除

问题描述

农场作物模型缺少软删除功能,铲除作物时直接物理删除,无法保留审计记录。

解决方案

1. 数据库结构修改

  • 添加 deleted_at 字段支持软删除
  • 添加 idx_deleted_at 索引优化查询
  • 修改唯一索引策略,使用复合索引 idx_land_id_deleted_at 解决软删除与唯一约束冲突

2. 模型修改

// app/Module/Farm/Models/FarmCrop.php
use Illuminate\Database\Eloquent\SoftDeletes;

class FarmCrop extends ModelCore
{
    use SoftDeletes;
    
    protected $casts = [
        'deleted_at' => 'datetime',
        // ...
    ];
}

3. 逻辑层实现

  • CropLogic::shovelCrop() - 使用软删除替代物理删除
  • CropLogic::forceDeleteCrop() - 强制物理删除
  • CropLogic::restoreCrop() - 恢复软删除的作物
  • CropLogic::getTrashedCropByLandId() - 获取软删除作物

4. 服务层封装

// app/Module/Farm/Services/CropService.php
public static function shovelCrop(int $userId, int $landId): bool
public static function forceDeleteCrop(int $userId, int $landId): bool
public static function restoreCrop(int $userId, int $landId): bool
public static function getTrashedCropByLandId(int $landId): ?FarmCropDto

5. 测试验证

  • 创建单元测试 tests/Feature/Farm/CropSoftDeleteTest.php
  • 创建命令行测试工具 app/Console/Commands/TestCropSoftDelete.php
  • 验证软删除、强制删除、恢复功能正常工作

功能特性

  • ✅ 软删除:铲除作物时保留数据用于审计
  • ✅ 强制删除:提供物理删除功能用于数据清理
  • ✅ 恢复功能:可以恢复误删的作物
  • ✅ 查询支持:支持查询软删除的作物记录
  • ✅ 索引优化:解决软删除与唯一索引的冲突问题

任务2:作物事件日志,后台缺失

问题描述

作物事件日志的后台管理控制器已存在,但未添加到后台菜单中,管理员无法访问。

解决方案

1. 添加后台菜单

INSERT INTO kku_admin_menu (parent_id, `order`, title, icon, uri, `show`, extension, created_at, updated_at) 
VALUES (265, 86, '作物事件日志', 'fa-history', 'farm-crop-logs', 1, '', NOW(), NOW());

2. 修复Dcat Admin兼容性问题

// 修复Grid列display方法参数问题
$grid->column('event_data', '事件数据')->display(function ($value) {
    if (empty($value)) {
        return '<span class="text-muted">无数据</span>';
    }
    
    $jsonStr = json_encode($value, JSON_UNESCAPED_UNICODE);
    if (strlen($jsonStr) > 100) {
        $jsonStr = substr($jsonStr, 0, 100) . '...';
    }
    
    return "<small class='text-info'>{$jsonStr}</small>";
});

功能特性

  • ✅ 菜单导航:在农场管理下添加作物事件日志菜单
  • ✅ 统计信息:显示总事件数、今日事件数、各类型事件统计
  • ✅ 列表展示:显示ID、用户ID、作物ID、种子名称、土地ID、事件类型、生长阶段、事件数据、创建时间
  • ✅ 筛选功能:支持按用户ID、作物ID、事件类型、生长阶段、事件时间筛选
  • ✅ 详情查看:可查看每个事件的详细信息,包括格式化的JSON事件数据
  • ✅ 只读设计:禁用新增、编辑、删除功能,符合日志记录特性

技术要点

软删除索引策略

解决了软删除与唯一索引冲突的关键问题:

  • 原索引:UNIQUE KEY idx_land_id (land_id)
  • 新索引:UNIQUE KEY idx_land_id_deleted_at (land_id, deleted_at)

这样软删除的记录不会与活跃记录产生唯一约束冲突。

Dcat Admin兼容性

修复了Grid列display方法的参数传递问题,确保与Dcat Admin框架的兼容性。

测试验证

软删除功能测试

# 运行单元测试
vendor/bin/phpunit tests/Feature/Farm/CropSoftDeleteTest.php

# 运行命令行测试
php artisan farm:test-soft-delete 39077 296 1

后台管理测试

  • ✅ 菜单正常显示和导航
  • ✅ 列表页面正常显示统计信息
  • ✅ 筛选功能正常工作
  • ✅ 分页功能正常
  • ✅ 详情页面正常显示

代码提交

提交信息: 实现农场作物软删除功能并修复作物事件日志后台管理
提交哈希: 21cc6c09
文件变更: 8个文件,新增881行,删除27行

总结

本次任务成功实现了农场作物的软删除功能,提供了完整的软删除、强制删除、恢复功能,并解决了软删除与数据库唯一约束的冲突问题。同时修复了作物事件日志后台管理界面缺失的问题,为管理员提供了完整的事件日志查看和分析功能。

两个功能都经过了充分的测试验证,确保功能正常工作,代码质量良好。