Skip to content

[Feature]: 导出功能支持软删除数据过滤选项 #2006

Open
@shuangjie

Description

@shuangjie

功能描述以及必要性描述

问题描述

当前导出功能不会自动考虑软删除字段,导致导出数据可能包含已删除记录,与前端列表展示不一致。

建议和方案

建议的完整解决方案

前端修改

  1. 添加过滤配置选项

    • 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'
      }
      // ...其余代码
    }
  2. UI展示

    • 在导出模板配置页面添加选项:
    <el-checkbox v-model="templateForm.filterDeleted">自动过滤已删除数据</el-checkbox>

后端修改

  1. 数据库模型增强
    SysExportTemplate模型中添加字段:

    type SysExportTemplate struct {
        // ...现有字段
        FilterDeleted *bool `json:"filterDeleted" gorm:"default:true"` // 是否过滤已删除数据
    }
  2. 导出功能增强
    改进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)
}

优势

  1. 一致性: 导出数据与前端列表保持一致,都排除已删除记录
  2. 灵活性: 可通过配置或参数控制是否需要过滤删除数据
  3. 兼容性: 保持向后兼容,现有模板自动启用过滤

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions