123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373 |
- package system
- import (
- "bytes"
- "encoding/json"
- "fmt"
- "github.com/xuri/excelize/v2"
- "gorm.io/gorm"
- "mime/multipart"
- "net/url"
- "server/global"
- "server/model/common/request"
- "server/model/system"
- systemReq "server/model/system/request"
- "server/utils"
- "strconv"
- "strings"
- )
- type SysExportTemplateService struct {
- }
- // CreateSysExportTemplate 创建导出模板记录
- // Author [piexlmax](https://github.com/piexlmax)
- func (sysExportTemplateService *SysExportTemplateService) CreateSysExportTemplate(sysExportTemplate *system.SysExportTemplate) (err error) {
- err = global.GVA_DB.Create(sysExportTemplate).Error
- return err
- }
- // DeleteSysExportTemplate 删除导出模板记录
- // Author [piexlmax](https://github.com/piexlmax)
- func (sysExportTemplateService *SysExportTemplateService) DeleteSysExportTemplate(sysExportTemplate system.SysExportTemplate) (err error) {
- err = global.GVA_DB.Delete(&sysExportTemplate).Error
- return err
- }
- // DeleteSysExportTemplateByIds 批量删除导出模板记录
- // Author [piexlmax](https://github.com/piexlmax)
- func (sysExportTemplateService *SysExportTemplateService) DeleteSysExportTemplateByIds(ids request.IdsReq) (err error) {
- err = global.GVA_DB.Delete(&[]system.SysExportTemplate{}, "id in ?", ids.Ids).Error
- return err
- }
- // UpdateSysExportTemplate 更新导出模板记录
- // Author [piexlmax](https://github.com/piexlmax)
- func (sysExportTemplateService *SysExportTemplateService) UpdateSysExportTemplate(sysExportTemplate system.SysExportTemplate) (err error) {
- return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
- conditions := sysExportTemplate.Conditions
- e := tx.Delete(&[]system.Condition{}, "template_id = ?", sysExportTemplate.TemplateID).Error
- if e != nil {
- return e
- }
- sysExportTemplate.Conditions = nil
- joins := sysExportTemplate.JoinTemplate
- e = tx.Delete(&[]system.JoinTemplate{}, "template_id = ?", sysExportTemplate.TemplateID).Error
- if e != nil {
- return e
- }
- sysExportTemplate.JoinTemplate = nil
- e = tx.Updates(&sysExportTemplate).Error
- if e != nil {
- return e
- }
- if len(conditions) > 0 {
- for i := range conditions {
- conditions[i].ID = 0
- }
- e = tx.Create(&conditions).Error
- }
- if len(joins) > 0 {
- for i := range joins {
- joins[i].ID = 0
- }
- e = tx.Create(&joins).Error
- }
- return e
- })
- }
- // GetSysExportTemplate 根据id获取导出模板记录
- // Author [piexlmax](https://github.com/piexlmax)
- func (sysExportTemplateService *SysExportTemplateService) GetSysExportTemplate(id uint) (sysExportTemplate system.SysExportTemplate, err error) {
- err = global.GVA_DB.Where("id = ?", id).Preload("JoinTemplate").Preload("Conditions").First(&sysExportTemplate).Error
- return
- }
- // GetSysExportTemplateInfoList 分页获取导出模板记录
- // Author [piexlmax](https://github.com/piexlmax)
- func (sysExportTemplateService *SysExportTemplateService) GetSysExportTemplateInfoList(info systemReq.SysExportTemplateSearch) (list []system.SysExportTemplate, total int64, err error) {
- limit := info.PageSize
- offset := info.PageSize * (info.Page - 1)
- // 创建db
- db := global.GVA_DB.Model(&system.SysExportTemplate{})
- var sysExportTemplates []system.SysExportTemplate
- // 如果有条件搜索 下方会自动创建搜索语句
- if info.StartCreatedAt != nil && info.EndCreatedAt != nil {
- db = db.Where("created_at BETWEEN ? AND ?", info.StartCreatedAt, info.EndCreatedAt)
- }
- if info.Name != "" {
- db = db.Where("name LIKE ?", "%"+info.Name+"%")
- }
- if info.TableName != "" {
- db = db.Where("table_name = ?", info.TableName)
- }
- if info.TemplateID != "" {
- db = db.Where("template_id = ?", info.TemplateID)
- }
- err = db.Count(&total).Error
- if err != nil {
- return
- }
- if limit != 0 {
- db = db.Limit(limit).Offset(offset)
- }
- err = db.Find(&sysExportTemplates).Error
- return sysExportTemplates, total, err
- }
- // ExportExcel 导出Excel
- // Author [piexlmax](https://github.com/piexlmax)
- func (sysExportTemplateService *SysExportTemplateService) ExportExcel(templateID string, values url.Values) (dept *bytes.Buffer, name string, err error) {
- var template system.SysExportTemplate
- err = global.GVA_DB.Preload("Conditions").Preload("JoinTemplate").First(&template, "template_id = ?", templateID).Error
- if err != nil {
- return nil, "", err
- }
- f := excelize.NewFile()
- defer func() {
- if err := f.Close(); err != nil {
- fmt.Println(err)
- }
- }()
- // Create a new sheet.
- index, err := f.NewSheet("Sheet1")
- if err != nil {
- fmt.Println(err)
- return
- }
- var templateInfoMap = make(map[string]string)
- columns, err := utils.GetJSONKeys(template.TemplateInfo)
- if err != nil {
- return nil, "", err
- }
- err = json.Unmarshal([]byte(template.TemplateInfo), &templateInfoMap)
- if err != nil {
- return nil, "", err
- }
- var tableTitle []string
- for _, key := range columns {
- tableTitle = append(tableTitle, templateInfoMap[key])
- }
- selects := strings.Join(columns, ", ")
- var tableMap []map[string]interface{}
- db := global.GVA_DB
- if template.DBName != "" {
- db = global.MustGetGlobalDBByDBName(template.DBName)
- }
- if len(template.JoinTemplate) > 0 {
- for _, join := range template.JoinTemplate {
- db = db.Joins(join.JOINS + "`" + join.Table + "`" + " ON " + join.ON)
- }
- }
- db = db.Select(selects).Table(template.TableName)
- if len(template.Conditions) > 0 {
- for _, condition := range template.Conditions {
- sql := fmt.Sprintf("%s %s ?", condition.Column, condition.Operator)
- value := values.Get(condition.From)
- if value != "" {
- if condition.Operator == "LIKE" {
- value = "%" + value + "%"
- }
- db = db.Where(sql, value)
- }
- }
- }
- // 通过参数传入limit
- limit := values.Get("limit")
- if limit != "" {
- l, e := strconv.Atoi(limit)
- if e == nil {
- db = db.Limit(l)
- }
- }
- // 模板的默认limit
- if limit == "" && template.Limit != 0 {
- db = db.Limit(template.Limit)
- }
- // 通过参数传入offset
- offset := values.Get("offset")
- if offset != "" {
- o, e := strconv.Atoi(offset)
- if e == nil {
- db = db.Offset(o)
- }
- }
- // 通过参数传入order
- order := values.Get("order")
- if order != "" {
- db = db.Order(order)
- }
- // 模板的默认order
- if order == "" && template.Order != "" {
- db = db.Order(template.Order)
- }
- err = db.Debug().Find(&tableMap).Error
- if err != nil {
- return nil, "", err
- }
- var rows [][]string
- rows = append(rows, tableTitle)
- for _, table := range tableMap {
- var row []string
- for _, column := range columns {
- if len(template.JoinTemplate) > 0 {
- columnArr := strings.Split(column, ".")
- if len(columnArr) > 1 {
- column = strings.Split(column, ".")[1]
- }
- }
- row = append(row, fmt.Sprintf("%v", table[column]))
- }
- rows = append(rows, row)
- }
- for i, row := range rows {
- for j, colCell := range row {
- err := f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", getColumnName(j+1), i+1), colCell)
- if err != nil {
- return nil, "", err
- }
- }
- }
- f.SetActiveSheet(index)
- dept, err = f.WriteToBuffer()
- if err != nil {
- return nil, "", err
- }
- return dept, template.Name, nil
- }
- // ExportTemplate 导出Excel模板
- // Author [piexlmax](https://github.com/piexlmax)
- func (sysExportTemplateService *SysExportTemplateService) ExportTemplate(templateID string) (dept *bytes.Buffer, name string, err error) {
- var template system.SysExportTemplate
- err = global.GVA_DB.First(&template, "template_id = ?", templateID).Error
- if err != nil {
- return nil, "", err
- }
- f := excelize.NewFile()
- defer func() {
- if err := f.Close(); err != nil {
- fmt.Println(err)
- }
- }()
- // Create a new sheet.
- index, err := f.NewSheet("Sheet1")
- if err != nil {
- fmt.Println(err)
- return
- }
- var templateInfoMap = make(map[string]string)
- err = json.Unmarshal([]byte(template.TemplateInfo), &templateInfoMap)
- if err != nil {
- return nil, "", err
- }
- var tableTitle []string
- for key := range templateInfoMap {
- tableTitle = append(tableTitle, templateInfoMap[key])
- }
- for i := range tableTitle {
- fErr := f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", getColumnName(i+1), 1), tableTitle[i])
- if fErr != nil {
- return nil, "", fErr
- }
- }
- f.SetActiveSheet(index)
- dept, err = f.WriteToBuffer()
- if err != nil {
- return nil, "", err
- }
- return dept, template.Name, nil
- }
- // ImportExcel 导入Excel
- // Author [piexlmax](https://github.com/piexlmax)
- func (sysExportTemplateService *SysExportTemplateService) ImportExcel(templateID string, dept *multipart.FileHeader) (err error) {
- var template system.SysExportTemplate
- err = global.GVA_DB.First(&template, "template_id = ?", templateID).Error
- if err != nil {
- return err
- }
- src, err := dept.Open()
- if err != nil {
- return err
- }
- defer src.Close()
- f, err := excelize.OpenReader(src)
- if err != nil {
- return err
- }
- rows, err := f.GetRows("Sheet1")
- if err != nil {
- return err
- }
- var templateInfoMap = make(map[string]string)
- err = json.Unmarshal([]byte(template.TemplateInfo), &templateInfoMap)
- if err != nil {
- return err
- }
- var titleKeyMap = make(map[string]string)
- for key, title := range templateInfoMap {
- titleKeyMap[title] = key
- }
- db := global.GVA_DB
- if template.DBName != "" {
- db = global.MustGetGlobalDBByDBName(template.DBName)
- }
- return db.Transaction(func(tx *gorm.DB) error {
- excelTitle := rows[0]
- values := rows[1:]
- items := make([]map[string]interface{}, 0, len(values))
- for _, row := range values {
- var item = make(map[string]interface{})
- for ii, value := range row {
- key := titleKeyMap[excelTitle[ii]]
- item[key] = value
- }
- // 此处需要等待gorm修复HasColumn中的painc问题
- //needCreated := tx.Migrator().HasColumn(template.TableName, "created_at")
- //needUpdated := tx.Migrator().HasColumn(template.TableName, "updated_at")
- //
- //if item["created_at"] == nil && needCreated {
- // item["created_at"] = time.Now()
- //}
- //if item["updated_at"] == nil && needUpdated {
- // item["updated_at"] = time.Now()
- //}
- items = append(items, item)
- }
- cErr := tx.Table(template.TableName).CreateInBatches(&items, 1000).Error
- return cErr
- })
- }
- func getColumnName(n int) string {
- columnName := ""
- for n > 0 {
- n--
- columnName = string(rune('A'+n%26)) + columnName
- n /= 26
- }
- return columnName
- }
|