package eta_forum
import (
"encoding/json"
"eta/eta_api/models/data_manage"
"eta/eta_api/models/data_manage/chart_theme"
"eta/eta_api/models/system"
"eta/eta_api/services/alarm_msg"
"eta/eta_api/utils"
"fmt"
"strconv"
"time"
)
type UploadChartToForumReq struct {
ChartInfoId int `description:"图表ID"`
Description string `description:"逻辑简述"`
}
type UpdateChartToForumReq struct {
ChartInfoId int `description:"图表ID"`
}
type ChartSaveLibReq struct {
ChartInfo *data_manage.ChartInfo
Description []*data_manage.ChartDescriptionReq `description:"逻辑简述"`
EdbInfoList []*data_manage.EdbInfo
ChartThemeList []*chart_theme.ChartTheme
EdbInfoDataList []*AddEdbDataReq
ChartEdbMapping []*data_manage.ChartEdbMapping
EdbInfoCalculateMapping []*data_manage.EdbInfoCalculateMapping
ChartSeries []*data_manage.ChartSeries
ChartSeriesEdbMapping []*data_manage.ChartSeriesEdbMapping
CreatorInfo *system.Admin //创建者的账号信息
UploaderInfo *system.Admin //上传者的账号信息
}
type ChartSaveLibResp struct {
Ret int
Msg string
ErrMsg string
ErrCode string
Data *data_manage.AddChartInfoResp
Success bool `description:"true 执行成功,false 执行失败"`
IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
IsAddLog bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
}
type AddEdbDataReq struct {
EdbCode string
EdbType int
DataList []*data_manage.EdbDataBase
}
type DeleteChartReq struct {
ChartInfoId int `description:"图表id"`
}
// UploadChart 上传图表接口
func UploadChart(chartInfoId int, description string, uploaderInfo *system.Admin) (err error, errMsg string) {
// 设置缓存 防止重复上传
cacheKey := "eta_forum_task:UploadChart:" + strconv.Itoa(chartInfoId)
if utils.Rc.Get(cacheKey) != nil {
err = fmt.Errorf("系统处理中,请稍后重试!")
return
}
utils.Rc.SetNX(cacheKey, 1, 30*time.Second)
defer func() {
if err != nil {
go alarm_msg.SendAlarmMsg(fmt.Sprintf("上传图表至社区失败:Err:%v,ErrMsg:%s", err, errMsg), 3)
}
utils.Rc.Delete(cacheKey)
}()
// 查询图表信息
chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
if err != nil {
if utils.IsErrNoRow(err) {
errMsg = "图表不存在"
err = fmt.Errorf(errMsg)
return
}
errMsg = "获取图表信息失败"
err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
return
}
if chartInfo.ForumChartInfoId > 0 {
errMsg = "该图表已上传至社区,无法再次上传"
err = fmt.Errorf(errMsg)
return
}
//查询图表主题
//查询图表指标
//获取原图表关联的指标信息列表
chartMappingList, err := data_manage.GetChartMappingList(chartInfoId)
if err != nil {
errMsg = "获取图表关联的指标信息失败"
err = fmt.Errorf("获取图表关联的指标信息失败,Err:" + err.Error())
return
}
edbIds := make([]int, 0)
for _, v := range chartMappingList {
edbIds = append(edbIds, v.EdbInfoId)
}
chartSeriesList := make([]*data_manage.ChartSeries, 0)
chartSeriesEdbList := make([]*data_manage.ChartSeriesEdbMapping, 0)
if chartInfo.ChartType == utils.CHART_TYPE_SECTION_COMBINE {
chartSeriesList, err = data_manage.GetChartSeriesByChartInfoId(chartInfoId)
if err != nil {
errMsg = "获取图表关联的系列信息失败"
err = fmt.Errorf("获取图表关联的系列信息失败,Err:" + err.Error())
return
}
chartSeriesEdbList, err = data_manage.GetChartSeriesEdbByChartInfoId(chartInfoId)
if err != nil {
errMsg = "获取图表关联的系列指标信息失败"
err = fmt.Errorf("获取图表关联的系列指标信息失败,Err:" + err.Error())
return
}
}
var (
edbInfoList []*data_manage.EdbInfo
edbMappingList []*data_manage.EdbInfoCalculateMapping
edbInfoDataList []*AddEdbDataReq
)
//查询指标详情
edbInfoList, edbMappingList, edbInfoDataList, err = GetEdbListByEdbInfoId(edbIds)
if err != nil {
errMsg = "获取指标详情失败"
err = fmt.Errorf("获取指标详情失败,Err:" + err.Error())
return
}
descriptionList, err, errMsg := getChartDescriptionWithAdminNameByChartInfoId(chartInfoId)
if err != nil {
errMsg = "获取图表简介失败"
err = fmt.Errorf("获取图表简介失败,Err:" + err.Error())
return
}
req := new(ChartSaveLibReq)
req.ChartInfo = chartInfo
req.ChartEdbMapping = chartMappingList
req.EdbInfoList = edbInfoList
req.EdbInfoDataList = edbInfoDataList
req.EdbInfoCalculateMapping = edbMappingList
req.Description = descriptionList
req.ChartSeries = chartSeriesList
req.ChartSeriesEdbMapping = chartSeriesEdbList
// 查询创建者信息
creatorInfo, _ := system.GetSysAdminById(chartInfo.SysUserId)
if creatorInfo != nil {
req.CreatorInfo = creatorInfo
}
req.UploaderInfo = uploaderInfo
// 添加计算指标
reqJson, err := json.Marshal(req)
if err != nil {
errMsg = "参数解析异常"
err = fmt.Errorf("参数解析异常,Err:" + err.Error())
return
}
respItem, err := ChartSaveLib(string(reqJson))
if err != nil {
errMsg = "上传失败"
err = fmt.Errorf("上传失败,Err:" + err.Error())
return
}
if respItem.Ret != 200 {
errMsg = "上传失败"
err = fmt.Errorf(respItem.ErrMsg)
return
}
if respItem.Data != nil && respItem.Data.ChartInfoId != 0 {
// 更新社区返回的图表ID
err = data_manage.SetForumChartInfoId(chartInfoId, respItem.Data.ChartInfoId, utils.ChartClassifyResourceStatusUp)
if err != nil {
errMsg = "更新图表ID失败"
err = fmt.Errorf("更新图表ID失败,Err:" + err.Error())
return
}
}
return
}
// UpdateChart 更新社区里的图表接口
func UpdateChart(chartInfoId int) (err error, errMsg string) {
// 设置缓存 防止重复更新
cacheKey := "eta_forum_task:UpdateChart:" + strconv.Itoa(chartInfoId)
if utils.Rc.Get(cacheKey) != nil {
err = fmt.Errorf("系统处理中,请稍后重试!")
return
}
utils.Rc.SetNX(cacheKey, 1, 30*time.Second)
defer func() {
if err != nil {
go alarm_msg.SendAlarmMsg(fmt.Sprintf("同步图表信息至社区失败:Err:%v,ErrMsg:%s", err, errMsg), 3)
}
utils.Rc.Delete(cacheKey)
}()
// 查询图表信息
chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
if err != nil {
if utils.IsErrNoRow(err) {
errMsg = "图表不存在"
err = fmt.Errorf(errMsg)
return
}
errMsg = "获取图表信息失败"
err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
return
}
if chartInfo.ForumChartInfoId <= 0 {
errMsg = "该图表未上传至社区"
err = fmt.Errorf(errMsg)
return
}
//查询图表主题
//查询图表指标
//获取原图表关联的指标信息列表
chartMappingList, err := data_manage.GetChartMappingList(chartInfoId)
if err != nil {
errMsg = "获取图表关联的指标信息失败"
err = fmt.Errorf("获取图表关联的指标信息失败,Err:" + err.Error())
return
}
edbIds := make([]int, 0)
for _, v := range chartMappingList {
edbIds = append(edbIds, v.EdbInfoId)
}
chartSeriesList := make([]*data_manage.ChartSeries, 0)
chartSeriesEdbList := make([]*data_manage.ChartSeriesEdbMapping, 0)
if chartInfo.ChartType == utils.CHART_TYPE_SECTION_COMBINE {
chartSeriesList, err = data_manage.GetChartSeriesByChartInfoId(chartInfoId)
if err != nil {
errMsg = "获取图表关联的系列信息失败"
err = fmt.Errorf("获取图表关联的系列信息失败,Err:" + err.Error())
return
}
chartSeriesEdbList, err = data_manage.GetChartSeriesEdbByChartInfoId(chartInfoId)
if err != nil {
errMsg = "获取图表关联的系列指标信息失败"
err = fmt.Errorf("获取图表关联的系列指标信息失败,Err:" + err.Error())
return
}
}
var (
edbInfoList []*data_manage.EdbInfo
edbMappingList []*data_manage.EdbInfoCalculateMapping
edbInfoDataList []*AddEdbDataReq
)
//查询指标详情
edbInfoList, edbMappingList, edbInfoDataList, err = GetEdbListByEdbInfoId(edbIds)
if err != nil {
errMsg = "获取指标详情失败"
err = fmt.Errorf("获取指标详情失败,Err:" + err.Error())
return
}
descriptionList, err, errMsg := getChartDescriptionWithAdminNameByChartInfoId(chartInfoId)
if err != nil {
errMsg = "获取图表简介失败"
err = fmt.Errorf("获取图表简介失败,Err:" + err.Error())
return
}
req := new(ChartSaveLibReq)
req.ChartInfo = chartInfo
req.ChartInfo.ChartInfoId = chartInfo.ForumChartInfoId
req.ChartEdbMapping = chartMappingList
req.EdbInfoList = edbInfoList
req.EdbInfoDataList = edbInfoDataList
req.EdbInfoCalculateMapping = edbMappingList
req.ChartSeries = chartSeriesList
req.ChartSeriesEdbMapping = chartSeriesEdbList
req.Description = descriptionList
// 查询创建者信息
creatorInfo, _ := system.GetSysAdminById(chartInfo.SysUserId)
if creatorInfo != nil {
req.CreatorInfo = creatorInfo
}
// 添加计算指标
reqJson, err := json.Marshal(req)
if err != nil {
errMsg = "参数解析异常"
err = fmt.Errorf("参数解析异常,Err:" + err.Error())
return
}
respItem, err := ChartUpdateLib(string(reqJson))
if err != nil {
errMsg = "更新失败"
err = fmt.Errorf("上传失败,Err:" + err.Error())
return
}
if respItem.Ret != 200 {
errMsg = "更新失败"
err = fmt.Errorf(respItem.ErrMsg)
return
}
return
}
func GetEdbListByEdbInfoId(edbInfoIds []int) (edbInfoList []*data_manage.EdbInfo, edbMappingList []*data_manage.EdbInfoCalculateMapping, edbInfoDataList []*AddEdbDataReq, err error) {
//查询指标信息
//查询指标映射
//查询所有指标数据
//查询这个指标相关的mapping信息放到数组里,
//将得到的指标ID信息放到数组里
hasFindMap := make(map[int]struct{})
edbInfoIdMap := make(map[int]struct{})
edbMappingList = make([]*data_manage.EdbInfoCalculateMapping, 0)
edbMappingMap := make(map[int]struct{})
for _, edbInfoId := range edbInfoIds {
edbMappingList, err = traceEdbInfoByEdbInfoId(edbInfoId, hasFindMap, edbInfoIdMap, edbMappingList, edbMappingMap)
if err != nil {
err = fmt.Errorf(" traceEdbInfoByEdbInfoId err: %s", err.Error())
return
}
}
// 指标信息map
edbInfoIdList := make([]int, 0)
for k, _ := range edbInfoIdMap {
edbInfoIdList = append(edbInfoIdList, k)
}
edbInfoList, err = data_manage.GetEdbInfoByIdList(edbInfoIdList)
if err != nil {
err = fmt.Errorf(" GetEdbInfoByIdList err: %s", err.Error())
return
}
for _, v := range edbInfoList {
var dataList []*data_manage.EdbDataBase
if v.Source == utils.DATA_SOURCE_BUSINESS && utils.UseMongo {
dataList, err = data_manage.GetEdbDataBaseMongoByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
} else if v.Source == utils.DATA_SOURCE_THS && v.SubSource == utils.DATA_SUB_SOURCE_HIGH_FREQUENCY && utils.UseMongo {
dataList, err = data_manage.GetThsHfEdbDataBaseMongoByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
} else {
dataList, err = data_manage.GetEdbDataBaseByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
}
if err != nil {
err = fmt.Errorf("查询指标数据失败 Err: %s", err.Error())
return
}
tmp := new(AddEdbDataReq)
tmp.EdbCode = v.EdbCode
tmp.EdbType = v.EdbType
tmp.DataList = dataList
edbInfoDataList = append(edbInfoDataList, tmp)
}
return
}
// traceEdbInfoByEdbInfoId 指标追溯
func traceEdbInfoByEdbInfoId(edbInfoId int, hasFindMap map[int]struct{}, edbInfoIdMap map[int]struct{}, edbMappingList []*data_manage.EdbInfoCalculateMapping, edbMappingMap map[int]struct{}) (newEdbMappingList []*data_manage.EdbInfoCalculateMapping, err error) {
newEdbMappingList = edbMappingList
_, ok := hasFindMap[edbInfoId]
if ok {
return
}
if _, ok1 := edbInfoIdMap[edbInfoId]; !ok1 {
edbInfoIdMap[edbInfoId] = struct{}{}
}
edbInfoMappingList, e := data_manage.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
if e != nil {
err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", e.Error())
return
}
if len(edbInfoMappingList) > 0 {
fromEdbInfoIdList := make([]int, 0)
for _, v := range edbInfoMappingList {
fromEdbInfoIdList = append(fromEdbInfoIdList, v.FromEdbInfoId)
if _, ok1 := edbInfoIdMap[v.FromEdbInfoId]; !ok1 {
edbInfoIdMap[v.FromEdbInfoId] = struct{}{}
}
if _, ok2 := edbMappingMap[v.EdbInfoCalculateMappingId]; !ok2 {
edbMappingMap[v.EdbInfoCalculateMappingId] = struct{}{}
tmp := &data_manage.EdbInfoCalculateMapping{
EdbInfoCalculateMappingId: v.EdbInfoCalculateMappingId,
EdbInfoId: v.EdbInfoId,
Source: v.Source,
SourceName: v.SourceName,
EdbCode: v.EdbCode,
FromEdbInfoId: v.FromEdbInfoId,
FromEdbCode: v.FromEdbCode,
FromEdbName: v.FromEdbName,
FromSource: v.FromSource,
FromSourceName: v.FromSourceName,
FromTag: v.FromTag,
Sort: v.Sort,
CreateTime: v.CreateTime,
ModifyTime: v.ModifyTime,
}
newEdbMappingList = append(newEdbMappingList, tmp)
}
if edbInfoId != v.FromEdbInfoId && (v.FromEdbType == 2 || v.FromEdbInfoType == 1) {
// 查过了就不查了
if _, ok2 := hasFindMap[v.FromEdbInfoId]; !ok2 {
newEdbMappingList, e = traceEdbInfoByEdbInfoId(v.FromEdbInfoId, hasFindMap, edbInfoIdMap, newEdbMappingList, edbMappingMap)
if e != nil {
err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", e.Error())
return
}
}
}
hasFindMap[v.FromEdbInfoId] = struct{}{}
}
}
hasFindMap[edbInfoId] = struct{}{}
return
}
// DeleteChart 上传图表接口
func DeleteChart(chartInfoId int) (err error, errMsg string) {
// 设置缓存 防止重复撤回
cacheKey := "eta_forum_task:DeleteChart:" + strconv.Itoa(chartInfoId)
if utils.Rc.Get(cacheKey) != nil {
err = fmt.Errorf("系统处理中,请稍后重试!")
return
}
utils.Rc.SetNX(cacheKey, 1, 30*time.Second)
defer func() {
if err != nil {
go alarm_msg.SendAlarmMsg(fmt.Sprintf("撤回图表失败:%v,ErrMsg:%s", err, errMsg), 3)
}
utils.Rc.Delete(cacheKey)
}()
// 查询图表信息
chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
if err != nil {
if utils.IsErrNoRow(err) {
errMsg = "图表不存在"
err = fmt.Errorf(errMsg)
return
}
errMsg = "获取图表信息失败"
err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
return
}
if chartInfo.ForumChartInfoId <= 0 {
errMsg = "该图表未上传至社区,无需撤回"
err = fmt.Errorf(errMsg)
return
}
req := new(DeleteChartReq)
req.ChartInfoId = chartInfo.ForumChartInfoId
// 添加计算指标
reqJson, err := json.Marshal(req)
if err != nil {
errMsg = "参数解析异常"
err = fmt.Errorf("参数解析异常,Err:" + err.Error())
return
}
respItem, err := ChartDeleteLib(string(reqJson))
if err != nil {
errMsg = "撤回失败"
err = fmt.Errorf("撤回失败,Err:" + err.Error())
return
}
if respItem.Ret != 200 {
errMsg = "撤回失败"
err = fmt.Errorf(respItem.ErrMsg)
return
}
// 更新社区返回的图表ID
err = data_manage.SetForumChartInfoId(chartInfoId, 0, utils.ChartClassifyResourceStatusDown)
if err != nil {
errMsg = "撤回失败"
err = fmt.Errorf("更新图表ID失败,Err:" + err.Error())
return
}
return
}
// DeleteChart 上传图表接口
func DeleteChartByForumChartInfoId(forumChartInfoId int) (err error, errMsg string) {
// 查询图表信息
req := new(DeleteChartReq)
req.ChartInfoId = forumChartInfoId
// 添加计算指标
reqJson, err := json.Marshal(req)
if err != nil {
errMsg = "参数解析异常"
err = fmt.Errorf("参数解析异常,Err:" + err.Error())
return
}
respItem, err := ChartDeleteLib(string(reqJson))
if err != nil {
errMsg = "撤回失败"
err = fmt.Errorf("撤回失败,Err:" + err.Error())
return
}
if respItem.Ret != 200 {
errMsg = "撤回失败"
err = fmt.Errorf(respItem.ErrMsg)
return
}
return
}
type AdminSaveReq struct {
*system.Admin
BusinessCode string `description:"商家编码"`
}
// 上传管理员信息
func AdminSave(adminId int) (err error) {
if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
return
}
//查询用户信息
adminInfo, err := system.GetSysAdminById(adminId)
if err != nil {
if utils.IsErrNoRow(err) {
err = fmt.Errorf("用户不存在")
return
}
err = fmt.Errorf("获取用户信息失败,Err:" + err.Error())
return
}
var req AdminSaveReq
req.Admin = adminInfo
req.BusinessCode = utils.BusinessCode
reqJson, err := json.Marshal(req)
if err != nil {
err = fmt.Errorf("参数解析异常,Err:" + err.Error())
return
}
respItem, err := AdminSaveLib(string(reqJson))
if err != nil {
err = fmt.Errorf("上传管理员信息失败,Err:" + err.Error())
return
}
if respItem.Ret != 200 {
err = fmt.Errorf("上传管理员信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
return
}
return
}
type AdminDeleteReq struct {
AdminName string
BusinessCode string `description:"商家编码"`
}
// 上传管理员信息
func AdminDelete(adminName string) (err error) {
if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
return
}
var req AdminDeleteReq
req.AdminName = adminName
req.BusinessCode = utils.BusinessCode
reqJson, err := json.Marshal(req)
if err != nil {
err = fmt.Errorf("参数解析异常,Err:" + err.Error())
return
}
respItem, err := AdminDeleteLib(string(reqJson))
if err != nil {
err = fmt.Errorf("删除管理员信息失败,Err:" + err.Error())
return
}
if respItem.Ret != 200 {
err = fmt.Errorf("删除管理员信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
return
}
return
}
type ChartThemeReq struct {
*chart_theme.ChartTheme
BusinessCode string `description:"商家编码"`
}
// 上传主题信息
func ChartThemeSave(theme *chart_theme.ChartTheme) (err error) {
if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
return
}
var req ChartThemeReq
req.ChartTheme = theme
req.BusinessCode = utils.BusinessCode
reqJson, err := json.Marshal(req)
if err != nil {
err = fmt.Errorf("参数解析异常,Err:" + err.Error())
return
}
respItem, err := ChartThemeSaveLib(string(reqJson))
if err != nil {
err = fmt.Errorf("上传图表主题信息失败,Err:" + err.Error())
return
}
if respItem.Ret != 200 {
err = fmt.Errorf("上传图表主题信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
return
}
return
}
// ChartThemeTypeSave 上传主题类型信息
func ChartThemeTypeSave(theme *chart_theme.ChartThemeType) (err error) {
if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
return
}
//req.BusinessCode = utils.BusinessCode
reqJson, err := json.Marshal(theme)
if err != nil {
err = fmt.Errorf("参数解析异常,Err:" + err.Error())
return
}
respItem, err := ChartThemeTypeSaveLib(string(reqJson))
if err != nil {
err = fmt.Errorf("上传图表主题信息失败,Err:" + err.Error())
return
}
if respItem.Ret != 200 {
err = fmt.Errorf("上传图表主题信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
return
}
return
}
// ChartBatchUpdate 批量上传和更新图表信息
func ChartBatchUpdateAndUpload(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (err error) {
if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
return
}
var tmpErr []error
deleteCache := true
cacheKey := "eta_forum_task:EtaForumChartUpdateByClassifyId:" + strconv.Itoa(chartClassifyInfo.ChartClassifyId)
defer func() {
if deleteCache {
_ = utils.Rc.Delete(cacheKey)
}
stack := ""
if err != nil {
stack = fmt.Sprintln(stack + err.Error())
}
if len(tmpErr) > 0 {
for _, v := range tmpErr {
stack = fmt.Sprintln(stack + v.Error())
}
}
if stack != "" {
utils.FileLog.Error("批量更新资源库图表信息失败"+"
"+stack)
go alarm_msg.SendAlarmMsg("批量更新资源库图表信息失败"+"
"+stack, 3)
}
}()
if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
deleteCache = false
err = fmt.Errorf("系统处理中,请稍后重试!")
return
}
chartClassifyInfoList, err := data_manage.GetChartClassifyByLevelPath(chartClassifyInfo.LevelPath, chartClassifyInfo.Source)
if err != nil {
return
}
chartClassifyIdList := make([]string, 0)
upChartClassifyIdList := make([]string, 0)
for _, v := range chartClassifyInfoList {
chartClassifyIdList = append(chartClassifyIdList, strconv.Itoa(v.ChartClassifyId))
if v.ResourceStatus == utils.ChartClassifyResourceStatusUp {
upChartClassifyIdList = append(upChartClassifyIdList, strconv.Itoa(v.ChartClassifyId))
}
}
condition := " and forum_chart_info_id > 0 and source=1 and chart_classify_id in ?"
// 查询需要更新的图表信息总数
total, err := data_manage.GetChartInfoCountByCondition(condition, []interface{}{chartClassifyIdList})
if err != nil {
return
}
if total > 0 {
// 更新图表数据
offset := 0
pageSize := 100
success := 0
// 循环更新100个图表数据
for i := 0; offset < total; i++ {
// 查询需要更新的图表信息
chartInfos, e := data_manage.GetChartInfoListByCondition(condition, []interface{}{chartClassifyIdList}, offset, pageSize)
if e != nil {
err = fmt.Errorf("查询需要更新的图表信息失败: %v", e)
return
}
// 循环更新图表数据
for _, chartInfo := range chartInfos {
// 更新图表数据
er, msg := UpdateChart(chartInfo.ChartInfoId)
if er != nil {
er = fmt.Errorf("图表ID %d, 更新图表数据失败: %s, %v", chartInfo.ChartInfoId, msg, er)
tmpErr = append(tmpErr, er)
continue
}
success += 1
}
offset = (i + 1) * pageSize
}
utils.FileLog.Info("更新图表数据完成, 更新图表数据总数:", success)
}
// 批量上传已经上架的分类下的图表到资源库中
// 查询需要新增的图表ID
condition = " and source=1 and forum_chart_info_id=0 and resource_status !=2 and chart_classify_id in ?"
total, err = data_manage.GetChartInfoCountByCondition(condition, []interface{}{upChartClassifyIdList})
if err != nil {
return
}
if total == 0 {
return
}
offset := 0
pageSize := 100
success := 0
for i := 0; offset < total; i++ {
chartInfos, e := data_manage.GetChartInfoListByCondition(condition, []interface{}{upChartClassifyIdList}, offset, pageSize)
if e != nil {
err = fmt.Errorf("查询需要新增的图表信息失败: %v", e)
return
}
// 循环更新图表数据
for _, chartInfo := range chartInfos {
// 更新图表数据
er, msg := UploadChart(chartInfo.ChartInfoId, "", sysUser)
if er != nil {
er = fmt.Errorf("图表ID %d, 上传图表数据失败: %s, %v", chartInfo.ChartInfoId, msg, er)
tmpErr = append(tmpErr, er)
continue
}
success += 1
}
offset = (i + 1) * pageSize
}
utils.FileLog.Info("批量上传已经上架的分类下的图表到资源库中完成, 新增图表数据总数:", success)
return
}
// 批量删除资源库图表信息
func ChartInfoDeleteBatch(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (err error) {
if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
return
}
var tmpErr []error
deleteCache := true
cacheKey := "eta_forum_task:ChartInfoDeleteBatch:" + strconv.Itoa(chartClassifyInfo.ChartClassifyId)
defer func() {
if deleteCache {
_ = utils.Rc.Delete(cacheKey)
}
stack := ""
if err != nil {
stack = fmt.Sprintln(stack + err.Error())
}
if len(tmpErr) > 0 {
for _, v := range tmpErr {
stack = fmt.Sprintln(stack + v.Error())
}
}
if stack != "" {
utils.FileLog.Error("批量删除资源库图表信息失败"+"
"+stack)
go alarm_msg.SendAlarmMsg("批量删除资源库图表信息失败"+"
"+stack, 3)
}
}()
if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
deleteCache = false
err = fmt.Errorf("系统处理中,请稍后重试!")
return
}
// 查询所有子分类
chartClassifyInfoList, err := data_manage.GetChartClassifyByLevelPath(chartClassifyInfo.LevelPath, chartClassifyInfo.Source)
if err != nil {
return
}
if len(chartClassifyInfoList) == 0 {
return
}
chartClassifyIdList := make([]string, 0)
for _, v := range chartClassifyInfoList {
chartClassifyIdList = append(chartClassifyIdList, strconv.Itoa(v.ChartClassifyId))
}
// 批量删除图表信息
condition := " AND source=? AND chart_classify_id in ? AND forum_chart_info_id > 0"
total, err := data_manage.GetChartInfoCountByCondition(condition, []interface{}{chartClassifyInfo.Source, chartClassifyIdList})
if err != nil {
return
}
if total == 0 {
return
}
offset := 0
pageSize := 100
success := 0
// 循环更新100个图表数据
for i := 0; offset < total; i++ {
// 查询需要更新的图表信息
chartInfos, e := data_manage.GetChartInfoListByCondition(condition, []interface{}{chartClassifyInfo.Source, chartClassifyIdList}, offset, pageSize)
if e != nil {
err = fmt.Errorf("查询需要更新的图表信息失败: %v", e)
return
}
// 循环更新图表数据
for _, chartInfo := range chartInfos {
// 删除图表数据
er, msg := DeleteChart(chartInfo.ChartInfoId)
if er != nil {
er = fmt.Errorf("图表ID %d, 删除图表数据失败: %s, %v", chartInfo.ChartInfoId, msg, er)
tmpErr = append(tmpErr, er)
continue
}
success += 1
}
offset = (i + 1) * pageSize
}
fmt.Println("删除图表数据完成, 删除图表数据总数:", success)
return
}
// 修改分类状态,一键上架至资源库
func SetChartClassifyResourceStatusUp(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (errMsg string, err error) {
if chartClassifyInfo.ResourceStatus == utils.ChartClassifyResourceStatusUp {
errMsg = "分类状态已为已上架, 无需重复操作"
err = fmt.Errorf("%s", errMsg)
return
}
// 判断是否是精选资源
if chartClassifyInfo.IsSelected != utils.ChartClassifyIsSelected {
errMsg = "分类状态已为已上架, 无需重复操作"
err = fmt.Errorf("%s", errMsg)
return
}
// 查询分类下的所有图表信息
err = data_manage.UpdateChartClassifyResourceStatus(chartClassifyInfo.Source, utils.ChartClassifyResourceStatusUp, chartClassifyInfo.LevelPath)
if err != nil {
errMsg = "更新分类状态失败"
err = fmt.Errorf("更新分类状态失败,Err:%w", err)
return
}
go ChartBatchUpdateAndUpload(chartClassifyInfo, sysUser)
return
}
// 修改分类,一键从资源库下架
func SetChartClassifyResourceStatusDown(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (errMsg string, err error) {
if chartClassifyInfo.ResourceStatus == utils.ChartClassifyResourceStatusDown {
errMsg = "分类状态已为已下架, 无需重复操作"
err = fmt.Errorf("%s", errMsg)
return
}
// 查询分类下的所有图表信息
err = data_manage.UpdateChartClassifyResourceStatus(chartClassifyInfo.Source, utils.ChartClassifyResourceStatusDown, chartClassifyInfo.LevelPath)
if err != nil {
errMsg = "更新分类状态失败"
err = fmt.Errorf("更新分类状态失败,Err:%w", err)
return
}
go ChartInfoDeleteBatch(chartClassifyInfo, sysUser)
return
}
func getChartDescriptionWithAdminNameByChartInfoId(chartInfoId int) (list []*data_manage.ChartDescriptionReq, err error, errMsg string) {
descriptionList, err := data_manage.GetChartDescriptionByChartInfoId(chartInfoId)
if err != nil {
errMsg = "获取图表简介失败"
err = fmt.Errorf("获取图表简介失败,Err:" + err.Error())
return
}
// 查询创建者信息
adminIdList := make([]int, 0)
for _, v := range descriptionList {
adminIdList = append(adminIdList, v.SysUserId)
}
adminList, err := system.GetAdminListByIdList(adminIdList)
if err != nil {
errMsg = "获取创建者信息失败"
err = fmt.Errorf("获取创建者信息失败,Err:" + err.Error())
return
}
adminMap := make(map[int]string)
for _, v := range adminList {
adminMap[v.AdminId] = v.AdminName
}
for _, v := range descriptionList {
adminName, ok := adminMap[v.SysUserId]
if !ok {
adminName = ""
}
list = append(list, &data_manage.ChartDescriptionReq{
ChartInfoId: v.ChartInfoId,
Description: v.Description,
AdminName: adminName,
SysUserId: v.SysUserId,
SysUserRealName: v.SysUserRealName,
ModifyTime: v.ModifyTime,
CreateTime: v.CreateTime,
})
}
return
}