Bläddra i källkod

实现edb收藏功能的优化

- 优化了edb收藏的逻辑,支持同时添加多个分类
-改进了edb信息的获取,增加了收藏分类ID列表的返回
- 重构了收藏相关的数据库操作,提高了性能和可维护性
- 修复了一些与收藏功能相关的服务中的逻辑问题
Roc 6 månader sedan
förälder
incheckning
4267f5546b

+ 21 - 28
controllers/data_manage/edb_collect.go

@@ -245,10 +245,6 @@ func (this *EdbCollectController) Collect() {
 		br.Msg = "请选择指标"
 		return
 	}
-	if req.ClassifyId <= 0 {
-		br.Msg = "请选择分类"
-		return
-	}
 
 	edbItem, e := data_manage.GetEdbInfoById(req.EdbInfoId)
 	if e != nil {
@@ -261,33 +257,30 @@ func (this *EdbCollectController) Collect() {
 		return
 	}
 
-	// 校验是否重复添加至同一个分类
 	collectOb := new(data_manage.EdbCollect)
-	{
-		cond := fmt.Sprintf(" AND %s = ? AND %s = ? AND %s = ?", collectOb.Cols().SysUserId, collectOb.Cols().EdbCollectClassifyId, collectOb.Cols().EdbInfoId)
-		pars := make([]interface{}, 0)
-		pars = append(pars, sysUser.AdminId, req.ClassifyId, req.EdbInfoId)
-		total, e := collectOb.GetCountByCondition(cond, pars)
-		if e != nil {
-			br.Msg = "操作失败"
-			br.ErrMsg = fmt.Sprintf("获取分类下同指标失败, %v", e)
-			return
-		}
-		if total > 0 {
-			br.Msg = "该指标已收藏至该分类,请勿重复收藏"
-			return
-		}
+
+	// 待添加的分类配置
+	addList := make([]*data_manage.EdbCollect, 0)
+	for _, classifyId := range req.ClassifyIdList {
+		addList = append(addList, &data_manage.EdbCollect{
+			EdbCollectClassifyId: classifyId,
+			EdbInfoId:            req.EdbInfoId,
+			EdbCode:              edbItem.EdbCode,
+			SysUserId:            sysUser.AdminId,
+			SysRealName:          sysUser.RealName,
+			CreateTime:           time.Now().Local(),
+			ModifyTime:           time.Now().Local(),
+		})
+
 	}
 
-	// 保存收藏
-	collectOb.EdbCollectClassifyId = req.ClassifyId
-	collectOb.EdbInfoId = edbItem.EdbInfoId
-	collectOb.EdbCode = edbItem.EdbCode
-	collectOb.SysUserId = sysUser.AdminId
-	collectOb.SysRealName = sysUser.RealName
-	collectOb.CreateTime = time.Now().Local()
-	collectOb.ModifyTime = time.Now().Local()
-	if e = collectOb.Create(); e != nil {
+	cond := fmt.Sprintf(" %s = ? AND %s = ?", collectOb.Cols().SysUserId, collectOb.Cols().EdbInfoId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, sysUser.AdminId, req.EdbInfoId)
+
+	// 清除原有保存收藏配置,并新增保存收藏
+	e = collectOb.RemoveAndCreateMulti(cond, pars, addList)
+	if e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = fmt.Sprintf("新增指标收藏失败: %v", e)
 		return

+ 19 - 0
controllers/data_manage/edb_info.go

@@ -2300,6 +2300,25 @@ func (this *EdbInfoController) EdbInfoList() {
 	//是否展示英文标识
 	edbInfoItem.IsEnEdb = data.CheckIsEnEdb(edbInfoItem.EdbNameEn, edbInfoItem.Unit, edbInfoItem.UnitEn)
 
+	// 所属收藏分类id列表
+	{
+		obj := data_manage.EdbCollect{}
+		tmpCondition := ` AND sys_user_id = ? AND edb_info_id = ? `
+		tmpPars := []interface{}{this.SysUser.AdminId, edbInfoId}
+		collectList, err := obj.GetItemsByCondition(tmpCondition, tmpPars, []string{"edb_collect_classify_id"}, "")
+		if err != nil {
+			br.Msg = "获取指标信息失败"
+			br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+			return
+		}
+		collectIdList := make([]int, 0)
+		for _, v := range collectList {
+			collectIdList = append(collectIdList, v.EdbCollectClassifyId)
+		}
+		edbInfoItem.CollectClassifyIdList = collectIdList
+	}
+	//CollectClassifyIdList
+
 	resp.Paging = page
 	resp.Item = edbInfoItem
 	resp.ClassifyList = classifyList

+ 88 - 21
models/data_manage/edb_collect.go

@@ -5,6 +5,7 @@ import (
 	"eta_gn/eta_api/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"strconv"
 	"strings"
 	"time"
 )
@@ -94,6 +95,43 @@ func (m *EdbCollect) RemoveByCondition(condition string, pars []interface{}) (er
 	return
 }
 
+// RemoveAndCreateMulti
+// @Description: 清除原有配置并新增收藏
+// @receiver m
+// @param delCondition
+// @param delPars
+// @param items
+// @return err
+func (m *EdbCollect) RemoveAndCreateMulti(delCondition string, delPars []interface{}, items []*EdbCollect) (err error) {
+	to := global.DmSQL["data"].Begin()
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	// 先删除
+	{
+		if delCondition == "" {
+			return
+		}
+		sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, m.TableName(), delCondition)
+		err = to.Exec(sql, delPars...).Error
+		if err != nil {
+			return
+		}
+	}
+
+	if len(items) == 0 {
+		return
+	}
+	err = to.CreateInBatches(items, utils.MultiAddNum).Error
+
+	return
+}
+
 func (m *EdbCollect) GetItemById(id int) (item *EdbCollect, err error) {
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
 	err = global.DmSQL["data"].Raw(sql, id).First(&item).Error
@@ -154,16 +192,17 @@ func GetCollectEdbInfoByClassifyId(classifyId int) (items []*EdbInfo, err error)
 
 // EdbCollectReq 加入/取消收藏
 type EdbCollectReq struct {
-	ClassifyId int `description:"分类ID"`
-	EdbInfoId  int `description:"指标ID"`
+	ClassifyId     int   `description:"分类ID"`
+	ClassifyIdList []int `description:"分类ID列表"`
+	EdbInfoId      int   `description:"指标ID"`
 }
 
 // GetCollectEdbInfoCount 获取收藏的指标信息总数
 func GetCollectEdbInfoCount(condition string, pars []interface{}) (total int64, err error) {
 	sql := fmt.Sprintf(`SELECT COUNT(1) AS ct FROM (
-	  SELECT b.* FROM edb_collect AS a JOIN edb_info AS b ON a.edb_info_id = b.edb_info_id
+	  SELECT b.edb_info_id FROM edb_collect AS a JOIN edb_info AS b ON a.edb_info_id = b.edb_info_id
 	  WHERE 1=1 %s
-	  ORDER BY a.create_time DESC
+	  GROUP BY b.edb_info_id
 	) AS sub`, condition)
 	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&total).Error
 	return
@@ -171,9 +210,26 @@ func GetCollectEdbInfoCount(condition string, pars []interface{}) (total int64,
 
 // GetCollectEdbInfoPageList 获取收藏的指标信息列表-分页
 func GetCollectEdbInfoPageList(condition string, pars []interface{}, startSize, pageSize int) (list []*CollectEdbInfoQuery, err error) {
-	sql := fmt.Sprintf(`SELECT b.*, a.edb_collect_classify_id AS collect_classify_id FROM edb_collect AS a JOIN edb_info AS b ON a.edb_info_id = b.edb_info_id
+	sql := fmt.Sprintf(`SELECT b."edb_info_id",
+       WM_CONCAT(DISTINCT a."edb_collect_classify_id") AS "collect_classify_id",
+MAX(a.create_time) as collect_time,
+MAX(b."edb_code") AS "edb_code",
+MAX(b."edb_name") "edb_name",
+MAX(b."edb_info_type") "edb_info_type",
+MAX(b."edb_type") "edb_type",
+MAX(b."source") "source",
+MAX(b."source_name") "source_name",
+MAX(b."frequency") "frequency",
+MAX(b."unit") "unit",
+MAX(b."classify_id") "classify_id",
+MAX(b."create_time") "create_time",
+MAX(b."unique_code") "unique_code",
+MAX(b."chart_image") "chart_image",
+MAX(b."modify_time") "modify_time"
+ FROM edb_collect AS a JOIN edb_info AS b ON a.edb_info_id = b.edb_info_id
 	  WHERE 1=1 %s
-	  ORDER BY a.create_time DESC LIMIT ?,?`, condition)
+	  GROUP BY b.edb_info_id
+ORDER  BY collect_time DESC LIMIT ?,?`, condition)
 	pars = append(pars, startSize, pageSize)
 	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&list).Error
 	return
@@ -181,24 +237,24 @@ func GetCollectEdbInfoPageList(condition string, pars []interface{}, startSize,
 
 type CollectEdbInfoQuery struct {
 	EdbInfo
-	CollectClassifyId int `gorm:"column:collect_classify_id" description:"收藏分类ID"`
+	CollectClassifyIdStr string `gorm:"column:collect_classify_id" description:"收藏分类ID"`
 }
 
 // CollectEdbInfoItem 收藏列表指标信息
 type CollectEdbInfoItem struct {
-	EdbInfoId         int    `description:"指标ID"`
-	EdbInfoType       int    `description:"指标类型:0-普通指标; 1-预测指标"`
-	EdbType           int    `description:"指标类型:1-基础指标; 2-计算指标"`
-	Source            int    `description:"来源ID"`
-	SourceName        string `description:"来源名称"`
-	EdbCode           string `description:"指标编码"`
-	EdbName           string `description:"指标名称"`
-	Frequency         string `description:"频率"`
-	Unit              string `description:"单位"`
-	UniqueCode        string `description:"唯一编码"`
-	ChartImage        string `description:"图表图片"`
-	ClassifyId        int    `description:"指标分类ID"`
-	CollectClassifyId int    `description:"收藏分类ID"`
+	EdbInfoId             int    `description:"指标ID"`
+	EdbInfoType           int    `description:"指标类型:0-普通指标; 1-预测指标"`
+	EdbType               int    `description:"指标类型:1-基础指标; 2-计算指标"`
+	Source                int    `description:"来源ID"`
+	SourceName            string `description:"来源名称"`
+	EdbCode               string `description:"指标编码"`
+	EdbName               string `description:"指标名称"`
+	Frequency             string `description:"频率"`
+	Unit                  string `description:"单位"`
+	UniqueCode            string `description:"唯一编码"`
+	ChartImage            string `description:"图表图片"`
+	ClassifyId            int    `description:"指标分类ID"`
+	CollectClassifyIdList []int  `description:"收藏分类ID列表"`
 }
 
 func FormatEdbInfo2CollectItem(origin *CollectEdbInfoQuery) (item *CollectEdbInfoItem) {
@@ -215,7 +271,18 @@ func FormatEdbInfo2CollectItem(origin *CollectEdbInfoQuery) (item *CollectEdbInf
 	item.UniqueCode = origin.UniqueCode
 	item.ChartImage = origin.ChartImage
 	item.ClassifyId = origin.ClassifyId
-	item.CollectClassifyId = origin.CollectClassifyId
+	collectClassifyIdList := make([]int, 0)
+	if origin.CollectClassifyIdStr != `` {
+		collectClassifyIdStrList := strings.Split(origin.CollectClassifyIdStr, ",")
+		for _, v := range collectClassifyIdStrList {
+			//collectClassifyIdList =
+			collectClassifyId, tmpErr := strconv.Atoi(v)
+			if tmpErr == nil {
+				collectClassifyIdList = append(collectClassifyIdList, collectClassifyId)
+			}
+		}
+	}
+	item.CollectClassifyIdList = collectClassifyIdList
 	return
 }
 

+ 44 - 43
models/data_manage/edb_info.go

@@ -434,49 +434,50 @@ func ModifyEdbEnInfo(item *EditEdbEnInfoReq) (err error) {
 }
 
 type EdbInfoList struct {
-	EdbInfoId        int                     `orm:"column(edb_info_id);pk" gorm:"primaryKey" `
-	EdbInfoType      int                     `description:"指标类型,0:普通指标,1:预测指标"`
-	SourceName       string                  `description:"来源名称"`
-	Source           int                     `description:"来源id"`
-	EdbCode          string                  `description:"指标编码"`
-	EdbNameEn        string                  `description:"英文指标名称"`
-	EdbName          string                  `description:"指标名称"`
-	Frequency        string                  `description:"频率"`
-	FrequencyEn      string                  `description:"英文频率"`
-	Unit             string                  `description:"单位"`
-	UnitEn           string                  `description:"英文单位"`
-	StartDate        string                  `description:"起始日期"`
-	EndDate          string                  `description:"终止日期"`
-	LatestDate       string                  `description:"数据最新日期(实际日期)"`
-	LatestValue      float64                 `description:"数据最新值(实际值)"`
-	EndValue         float64                 `description:"数据的最新值(预测日期的最新值)"`
-	ClassifyId       int                     `description:"分类id"`
-	UniqueCode       string                  `description:"指标唯一编码"`
-	SysUserId        int                     `description:"创建人id"`
-	SysUserRealName  string                  `description:"创建人姓名"`
-	ModifyTime       string                  `description:"最新修改时间"`
-	CreateTime       string                  `description:"创建时间"`
-	EdbNameAlias     string                  `json:"-" description:"指标名称,别名"`
-	EdbType          int                     `description:"指标类型:1:基础指标,2:计算指标"`
-	ChartImage       string                  `description:"图表图片"`
-	RuleType         int                     `description:"预测规则,1:最新,2:固定值"`
-	FixedValue       float64                 `description:"固定值"`
-	DataList         []*EdbData              `gorm:"-" description:"实际指标数据"`
-	PredictDataList  []*EdbData              `gorm:"-" description:"预测指标数据"`
-	Button           EdbClassifyItemsButton  `gorm:"-" description:"操作权限"`
-	IsEnEdb          bool                    `description:"是否展示英文标识"`
-	DataInsertConfig EdbDataInsertConfigItem `gorm:"-" description:"指标数据插入配置"`
-	DataDateType     string                  `description:"数据日期类型,枚举值:交易日、自然日"`
-	EmptyType        int                     `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
-	MaxEmptyType     int                     `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
-	SubSource        int                     `description:"子数据来源:0:经济数据库,1:日期序列"`
-	SubSourceName    string                  `description:"子数据来源名称"`
-	IndicatorCode    string                  `description:"指标代码"`
-	StockCode        string                  `description:"证券代码"`
-	NoUpdate         int8                    `description:"是否停止更新,0:继续更新;1:停止更新"`
-	IsJoinPermission int                     `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
-	HaveOperaAuth    bool                    `description:"是否有数据权限,默认:false"`
-	IsSupplierStop   int                     `description:"是否供应商停更:1:停更,0:未停更"`
+	EdbInfoId             int                     `orm:"column(edb_info_id);pk" gorm:"primaryKey" `
+	EdbInfoType           int                     `description:"指标类型,0:普通指标,1:预测指标"`
+	SourceName            string                  `description:"来源名称"`
+	Source                int                     `description:"来源id"`
+	EdbCode               string                  `description:"指标编码"`
+	EdbNameEn             string                  `description:"英文指标名称"`
+	EdbName               string                  `description:"指标名称"`
+	Frequency             string                  `description:"频率"`
+	FrequencyEn           string                  `description:"英文频率"`
+	Unit                  string                  `description:"单位"`
+	UnitEn                string                  `description:"英文单位"`
+	StartDate             string                  `description:"起始日期"`
+	EndDate               string                  `description:"终止日期"`
+	LatestDate            string                  `description:"数据最新日期(实际日期)"`
+	LatestValue           float64                 `description:"数据最新值(实际值)"`
+	EndValue              float64                 `description:"数据的最新值(预测日期的最新值)"`
+	ClassifyId            int                     `description:"分类id"`
+	UniqueCode            string                  `description:"指标唯一编码"`
+	SysUserId             int                     `description:"创建人id"`
+	SysUserRealName       string                  `description:"创建人姓名"`
+	ModifyTime            string                  `description:"最新修改时间"`
+	CreateTime            string                  `description:"创建时间"`
+	EdbNameAlias          string                  `json:"-" description:"指标名称,别名"`
+	EdbType               int                     `description:"指标类型:1:基础指标,2:计算指标"`
+	ChartImage            string                  `description:"图表图片"`
+	RuleType              int                     `description:"预测规则,1:最新,2:固定值"`
+	FixedValue            float64                 `description:"固定值"`
+	DataList              []*EdbData              `gorm:"-" description:"实际指标数据"`
+	PredictDataList       []*EdbData              `gorm:"-" description:"预测指标数据"`
+	Button                EdbClassifyItemsButton  `gorm:"-" description:"操作权限"`
+	IsEnEdb               bool                    `description:"是否展示英文标识"`
+	DataInsertConfig      EdbDataInsertConfigItem `gorm:"-" description:"指标数据插入配置"`
+	DataDateType          string                  `description:"数据日期类型,枚举值:交易日、自然日"`
+	EmptyType             int                     `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
+	MaxEmptyType          int                     `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
+	SubSource             int                     `description:"子数据来源:0:经济数据库,1:日期序列"`
+	SubSourceName         string                  `description:"子数据来源名称"`
+	IndicatorCode         string                  `description:"指标代码"`
+	StockCode             string                  `description:"证券代码"`
+	NoUpdate              int8                    `description:"是否停止更新,0:继续更新;1:停止更新"`
+	IsJoinPermission      int                     `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	HaveOperaAuth         bool                    `description:"是否有数据权限,默认:false"`
+	IsSupplierStop        int                     `description:"是否供应商停更:1:停更,0:未停更"`
+	CollectClassifyIdList []int                   `description:"所属收藏分类id列表" gorm:"-"`
 }
 
 type EdbDataInsertConfigItem struct {

+ 6 - 1
services/report_approve.go

@@ -120,8 +120,13 @@ func CheckReportCurrState(reportType, firstId, secondId, thirdId, operate int) (
 		return
 	}
 
+	var hasFlowItem bool
+	if flowItem != nil && flowItem.ReportApproveFlowId > 0 {
+		hasFlowItem = true
+	}
+
 	// 开启审批/有审批流
-	if openApprove && (flowItem != nil || confMap[models.BusinessConfReportApproveType] == models.BusinessConfReportApproveTypeOther) {
+	if openApprove && (hasFlowItem || confMap[models.BusinessConfReportApproveType] == models.BusinessConfReportApproveTypeOther) {
 		// 操作为无审批的操作时, 会转为有审批的初始状态-待提交
 		stateMap := map[int]int{
 			models.ReportOperateAdd:           models.ReportStateWaitSubmit,  // 新增