时间: 2025年06月21日 23:30
任务类型: 功能开发和Bug修复
状态: ✅ 已完成
本次任务完成了两个重要功能:
农场作物模型缺少软删除功能,铲除作物时直接物理删除,无法保留审计记录。
deleted_at 字段支持软删除idx_deleted_at 索引优化查询idx_land_id_deleted_at 解决软删除与唯一约束冲突// app/Module/Farm/Models/FarmCrop.php
use Illuminate\Database\Eloquent\SoftDeletes;
class FarmCrop extends ModelCore
{
use SoftDeletes;
protected $casts = [
'deleted_at' => 'datetime',
// ...
];
}
CropLogic::shovelCrop() - 使用软删除替代物理删除CropLogic::forceDeleteCrop() - 强制物理删除CropLogic::restoreCrop() - 恢复软删除的作物CropLogic::getTrashedCropByLandId() - 获取软删除作物// 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
tests/Feature/Farm/CropSoftDeleteTest.phpapp/Console/Commands/TestCropSoftDelete.php作物事件日志的后台管理控制器已存在,但未添加到后台菜单中,管理员无法访问。
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());
// 修复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>";
});
解决了软删除与唯一索引冲突的关键问题:
UNIQUE KEY idx_land_id (land_id)UNIQUE KEY idx_land_id_deleted_at (land_id, deleted_at)这样软删除的记录不会与活跃记录产生唯一约束冲突。
修复了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行
本次任务成功实现了农场作物的软删除功能,提供了完整的软删除、强制删除、恢复功能,并解决了软删除与数据库唯一约束的冲突问题。同时修复了作物事件日志后台管理界面缺失的问题,为管理员提供了完整的事件日志查看和分析功能。
两个功能都经过了充分的测试验证,确保功能正常工作,代码质量良好。