Open
Description
功能描述以及必要性描述
问题描述
当前导出功能不会自动考虑软删除字段,导致导出数据可能包含已删除记录,与前端列表展示不一致。
建议和方案
建议的完整解决方案
前端修改
-
添加过滤配置选项
- 在
exportExcel.vue
组件中添加filterDeleted
属性:
props: { // ...现有属性 filterDeleted: { type: Boolean, default: true // 默认过滤已删除数据 } } // 在请求参数中添加 const exportExcelFunc = async () => { // ...现有代码 const paramsCopy = JSON.parse(JSON.stringify(props.condition)) if (props.filterDeleted) { paramsCopy.filterDeleted = 'true' } // ...其余代码 }
- 在
-
UI展示
- 在导出模板配置页面添加选项:
<el-checkbox v-model="templateForm.filterDeleted">自动过滤已删除数据</el-checkbox>
后端修改
-
数据库模型增强
在SysExportTemplate
模型中添加字段:type SysExportTemplate struct { // ...现有字段 FilterDeleted *bool `json:"filterDeleted" gorm:"default:true"` // 是否过滤已删除数据 }
-
导出功能增强
改进ExportExcel
函数:func (s *SysExportTemplateService) ExportExcel(templateID string, values url.Values) (file *bytes.Buffer, name string, err error) { // ...现有代码 // 处理软删除过滤 filterDeleted := true // 默认过滤 if template.FilterDeleted != nil { filterDeleted = *template.FilterDeleted } // 允许前端参数覆盖 filterParam := values.Get("filterDeleted") if filterParam == "false" { filterDeleted = false } if filterDeleted { // 自动过滤主表的软删除 db = db.Where(fmt.Sprintf("%s.deleted_at IS NULL", template.TableName)) // 过滤关联表的软删除(如果有) if len(template.JoinTemplate) > 0 { for _, join := range template.JoinTemplate { // 检查关联表是否有deleted_at字段 hasDeletedAt := s.hasDeletedAtColumn(join.Table) if hasDeletedAt { db = db.Where(fmt.Sprintf("%s.deleted_at IS NULL", join.Table)) } } } } // ...继续执行后续代码 } // 辅助函数:检查表是否有deleted_at列 func (s *SysExportTemplateService) hasDeletedAtColumn(tableName string) bool { var count int64 global.GVA_DB.Raw("SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ? AND COLUMN_NAME = 'deleted_at'", tableName).Count(&count) return count > 0 }
迁移处理
提供数据库迁移,为现有模板添加默认值:
func (s *SysExportTemplateService) AutoMigrate() {
// 为现有模板设置默认值
global.GVA_DB.Model(&system.SysExportTemplate{}).
Where("filter_deleted IS NULL").
Update("filter_deleted", true)
}
优势
- 一致性: 导出数据与前端列表保持一致,都排除已删除记录
- 灵活性: 可通过配置或参数控制是否需要过滤删除数据
- 兼容性: 保持向后兼容,现有模板自动启用过滤
Metadata
Metadata
Assignees
Labels
No labels