package asUser import ( "fmt" "github.com/fonchain_enterprise/fonchain-main/api/artistInfoUser" "github.com/fonchain_enterprise/fonchain-main/pkg/common/syncDownload" "github.com/fonchain_enterprise/fonchain-main/pkg/config" "github.com/fonchain_enterprise/fonchain-main/pkg/e" "github.com/fonchain_enterprise/fonchain-main/pkg/model" "github.com/fonchain_enterprise/fonchain-main/pkg/service" "github.com/fonchain_enterprise/fonchain-main/pkg/service/artistInfo/asUtil" "github.com/fonchain_enterprise/fonchain-main/pkg/utils" "github.com/fonchain_enterprise/fonchain-main/pkg/utils/excel" "github.com/gin-gonic/gin" "os" "path" "path/filepath" "sync" "time" ) var exportBackendUserViewListLock sync.RWMutex // 批量查询BackendUserView func GetBackendUserViewList(c *gin.Context) { var req GetBackendUserViewListRequest if err := c.ShouldBindJSON(&req); err != nil { service.Error(c, e.InvalidParams, err, "无效参数") return } var protoReq artistInfoUser.GetBackendUserViewListRequest asUtil.RequestDataConvert(&req, &protoReq) resp, err := service.GrpcArtistInfoUserImpl.GetBackendUserViewList(c, &protoReq) if err != nil { service.ErrorWithMark(c, e.Failed, err, "GetBackendUserViewList Err", "查询失败") return } service.ResponseList(c, resp.List, service.OptionPage(resp.Page, resp.PageSize, resp.Total), service.OptionMsg("查询成功"), service.OptionAddField_ArtshowCount("artistUid"), ) } func ExportBackendUserViewList(c *gin.Context) { var req ExportBackendUserViewListRequest if err := c.ShouldBindJSON(&req); err != nil { service.Error(c, e.InvalidParams, err, "无效参数") return } var accId uint64 claims, err := GetJwtInfo(c) if err == nil && claims != nil { accId = claims.ID } resp, err := service.GrpcArtistInfoUserImpl.GetBackendUserViewList(c, &artistInfoUser.GetBackendUserViewListRequest{ Page: 1, PageSize: -1, SelectColumns: req.ColumnIds, UserIds: req.UserIds, IsArtist: req.IsArtist, }) if err != nil { service.ErrorWithMark(c, e.Failed, err, "ExportBackendUserViewList: GrpcArtistInfoUserImpl.GetBackendUserViewList", "查询失败") return } columnResp, err := service.GrpcArtistInfoUserImpl.GetExportFieldList(c, &artistInfoUser.GetExportFieldListRequest{ Page: 1, PageSize: -1, Ids: req.ColumnIds, }) if err != nil { service.ErrorWithMark(c, e.Failed, err, "ExportBackendUserViewList: GetExportFieldList", "查询失败") return } filePath, _, err := writeToExcel(accId, resp.List, columnResp.List) if err != nil { service.ErrorWithMark(c, e.Failed, err, "ExportBackendUserViewList: writeToExcel", "导出失败") return } defer func() { if filePath != "" { service.DelayDeleteFileTask.AddPendingDeleteFile(service.DelayDeleteFile{ Path: filePath, RetentionTime: time.Now().Add(2 * time.Minute), }) } }() var httpType string if config.IsHttps { httpType = model.HttpsType } else { httpType = model.HttpType } var exportUrl = fmt.Sprintf("%s%s/static/tmp/%s", httpType, c.Request.Host, filepath.Base(filePath)) service.Success(c, map[string]interface{}{"ExportUrl": exportUrl}) } func ExportBackendUserStatic(c *gin.Context) { var req ExportBackendUserViewListRequest if err := c.ShouldBindJSON(&req); err != nil { service.Error(c, e.InvalidParams, err, "无效参数") return } var accId uint64 claims, err := GetJwtInfo(c) if err == nil && claims != nil { accId = claims.ID } res, err := service.GrpcArtistInfoUserImpl.GetExportFieldList(c, &artistInfoUser.GetExportFieldListRequest{ Query: &artistInfoUser.ExportFieldData{ Origin: "backend_user_view", }, Page: 1, PageSize: -1, }) if err != nil { service.ErrorWithMark(c, e.Failed, err, "ExportBackendUserStatic:GetExportFieldList", "导出失败") return } for _, v := range res.List { if v.Column == "real_name" || v.Column == "tnum" { req.ColumnIds = append(req.ColumnIds, v.ID) } } resp, err := service.GrpcArtistInfoUserImpl.GetBackendUserViewList(c, &artistInfoUser.GetBackendUserViewListRequest{ Page: 1, PageSize: -1, SelectColumns: req.ColumnIds, UserIds: req.UserIds, }) if err != nil { service.ErrorWithMark(c, e.Failed, err, "ExportBackendUserViewList: GrpcArtistInfoUserImpl.GetBackendUserViewList", "查询失败") return } if resp.Total > 0 { staticRootDir := path.Join("./runtime/tmp", fmt.Sprintf("画家静态资源_%d_%d", accId, time.Now().Unix())) if err = os.MkdirAll(staticRootDir, os.ModePerm); err != nil { service.ErrorWithMark(c, e.Failed, err, "文件生成失败,请稍后再试!") return } var wg sync.WaitGroup var downloadTasks []*syncDownload.DownLoadInfo for _, v := range resp.List { //userStaticRoot := filepath.Join(staticRootDir, v.Tnum+"_"+v.RealName) userStaticRoot := staticRootDir if err = os.MkdirAll(userStaticRoot, os.ModePerm); err != nil { service.ErrorWithMark(c, e.Failed, err, "文件生成失败,请稍后再试!") return } if v.CertificateImg != "" { fileExt := filepath.Ext(v.CertificateImg) filePath := filepath.Join(userStaticRoot, v.Tnum+"_"+v.RealName+"_美协编号"+fileExt) downloadTasks = append(downloadTasks, &syncDownload.DownLoadInfo{ DownloadUrl: v.CertificateImg, SavePath: filePath, Wg: &wg, }) } if v.IdcardBack != "" { fileExt := filepath.Ext(v.IdcardBack) filePath := filepath.Join(userStaticRoot, v.Tnum+"_"+v.RealName+"_身份证反面"+fileExt) downloadTasks = append(downloadTasks, &syncDownload.DownLoadInfo{ DownloadUrl: v.IdcardBack, SavePath: filePath, Wg: &wg, }) } if v.IdcardFront != "" { fileExt := filepath.Ext(v.IdcardFront) filePath := filepath.Join(userStaticRoot, v.Tnum+"_"+v.RealName+"_身份证正面"+fileExt) downloadTasks = append(downloadTasks, &syncDownload.DownLoadInfo{ DownloadUrl: v.IdcardFront, SavePath: filePath, Wg: &wg, }) } if v.Photo != "" { fileExt := filepath.Ext(v.Photo) filePath := filepath.Join(userStaticRoot, v.Tnum+"_"+v.RealName+"_近照"+fileExt) downloadTasks = append(downloadTasks, &syncDownload.DownLoadInfo{ DownloadUrl: v.Photo, SavePath: filePath, Wg: &wg, }) } } wg.Add(len(downloadTasks)) syncDownload.DownloadService.AddDownLoadTask(downloadTasks...) wg.Wait() zipPath := staticRootDir + ".zip" err = utils.ZipDirectory(staticRootDir, zipPath) if err != nil { service.ErrorWithMark(c, e.Failed, err, "ExportBackendUserStatic:zipDirectory", "文件压缩失败") return } defer func() { if zipPath != "" || staticRootDir != "" { service.DelayDeleteFileTask.AddPendingDeleteFile(service.DelayDeleteFile{ Path: zipPath, RetentionTime: time.Now().Add(2 * time.Minute), }, service.DelayDeleteFile{ Path: staticRootDir, RetentionTime: time.Now().Add(2 * time.Minute), }) } }() var httpType string if config.IsHttps { httpType = model.HttpsType } else { httpType = model.HttpType } var exportUrl = fmt.Sprintf("%s%s/static/tmp/%s", httpType, c.Request.Host, filepath.Base(zipPath)) service.Success(c, map[string]interface{}{"ExportUrl": exportUrl}) } else { service.Error(c, e.Failed, nil, "查询数据为空,无法下载") } } func writeToExcel(accId uint64, datas []*artistInfoUser.BackendUserViewData, columns []*artistInfoUser.ExportFieldData) (path string, filename string, err error) { exportBackendUserViewListLock.Lock() defer exportBackendUserViewListLock.Unlock() var ( sheet1Columns []string jsonFiledList []string ) for _, col := range columns { sheet1Columns = append(sheet1Columns, col.ColumnDesc) jsonFiledList = append(jsonFiledList, utils.SnakeToCamel(col.Column)) } sheet1Data := excel.NewSheet("Sheet1", datas, sheet1Columns, jsonFiledList) var fileName = fmt.Sprintf("画家宝画家列表_%d.xlsx", accId) path, filename, err = excel.WriteToExcel(fileName, "./runtime/tmp", "", sheet1Data) return }