Browse Source

fix:新增自有数据批量删除接口

Roc 9 months ago
parent
commit
ad6e823c0c

+ 105 - 2
controllers/base_from_business.go

@@ -20,7 +20,7 @@ type BusinessIndexController struct {
 // HandleBusinessIndexData
 // @Title 处理外部指标(商家)的接口
 // @Description 处理外部指标(商家)的接口
-// @Success 200 {object} models.AddBusinessIndexReq
+// @Success 200 {object} models.BaseFromBusinessIndexResp
 // @router /handle [post]
 func (c *BusinessIndexController) HandleBusinessIndexData() {
 	br := new(models.BaseResponse).Init()
@@ -37,7 +37,24 @@ func (c *BusinessIndexController) HandleBusinessIndexData() {
 		return
 	}
 
-	err = services.HandleBusinessIndex(&req)
+	// 如果没有传入指标编码的话,那么自动生成指标编码
+	if req.IndexCode == `` {
+		cacheKey := utils.CACHE_SELF_EDB_HANDLE
+		if utils.Rc.IsExist(cacheKey) {
+			br.Ret = 501
+			br.Success = true
+			br.Msg = "系统处理中,请稍后重试"
+			return
+		}
+
+		// 刷新指标
+		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+		defer func() {
+			_ = utils.Rc.Delete(cacheKey)
+		}()
+	}
+
+	businessIndex, err := services.HandleBusinessIndex(&req)
 	if err != nil {
 		fmt.Println("HandleBusinessIndexData Err:" + err.Error())
 		br.Msg = "处理失败"
@@ -47,6 +64,92 @@ func (c *BusinessIndexController) HandleBusinessIndexData() {
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "处理成功"
+	br.Data = businessIndex
+}
+
+// DelIndex
+// @Title 删除外部指标(商家)的接口
+// @Description 删除外部指标(商家)的接口
+// @Success 200 string "删除成功"
+// @router /index/del [post]
+func (c *BusinessIndexController) DelIndex() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	body := c.Ctx.Input.RequestBody
+	var req models.DelBusinessIndexReq
+	err := json.Unmarshal(body, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	// 如果没有传入指标编码的话,那么自动生成指标编码
+	if len(req.IndexCodeList) < 0 {
+		br.Msg = "指标编码不允许为空"
+		return
+	}
+
+	joinEdbCodeList, needDelEdbCodeList, err, errMsg := services.DelBusinessIndex(req.IndexCodeList)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = "删除失败,Err:" + err.Error()
+		return
+	}
+
+	resp := services.DelBusinessIndexResp{
+		IsDeleteEdbCodeList: needDelEdbCodeList,
+		NoDeleteEdbCodeList: joinEdbCodeList,
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "删除成功"
+	br.Data = resp
+}
+
+// DelIndexData
+// @Title 删除外部指标(商家)的指定日期数据接口
+// @Description 删除外部指标(商家)的指定日期数据接口
+// @Success 200 string "删除成功"
+// @router /data/del [post]
+func (c *BusinessIndexController) DelIndexData() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	body := c.Ctx.Input.RequestBody
+	var req models.DelBusinessIndexDataReq
+	err := json.Unmarshal(body, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	// 如果没有传入指标编码的话,那么自动生成指标编码
+	if req.IndexCode == `` {
+		br.Msg = "指标编码不允许为空"
+		return
+	}
+	if req.StartDate == `` && req.EndDate == `` {
+		br.Msg = "开始日期和结束日期不允许同时为空"
+		return
+	}
+
+	err, errMsg := services.DelBusinessIndexData(req.IndexCode, req.StartDate, req.EndDate)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = "删除失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "删除成功"
 }
 
 // Add

+ 87 - 4
models/base_from_business.go

@@ -29,6 +29,16 @@ type BaseFromBusinessIndex struct {
 	ModifyTime              time.Time `description:"修改时间"`
 }
 
+// BaseFromBusinessIndexResp
+// @Description: 外部指标(商家系统)表
+type BaseFromBusinessIndexResp struct {
+	IndexCode  string `description:"指标编码"`
+	IndexName  string `description:"指标名称"`
+	Unit       string `description:"单位"`
+	Frequency  string `description:"频度"`
+	SourceName string `description:"数据来源名称"`
+}
+
 // EdbBusinessSource
 // @Description: 自有数据(商家)指标来源
 type EdbBusinessSource struct {
@@ -56,6 +66,28 @@ type AddBusinessDataReq struct {
 	Date  string  `description:"日期"`
 }
 
+// DelBusinessIndexReq
+// @Description:  删除外部指标(商家)请求
+type DelBusinessIndexReq struct {
+	IndexCodeList []string `description:"指标编码"`
+}
+
+// DelBusinessIndexDataReq
+// @Description:  删除外部指标(商家)明细数据请求
+type DelBusinessIndexDataReq struct {
+	IndexCode string `description:"指标编码"`
+	StartDate string `description:"开始日期"`
+	EndDate   string `description:"结束日期"`
+}
+
+// GetIndexItem
+// @Description: 根据指标编码获取自有数据指标
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-31 16:29:30
+// @param indexCode string
+// @return item *BaseFromBusinessIndex
+// @return err error
 func (m *BaseFromBusinessIndex) GetIndexItem(indexCode string) (item *BaseFromBusinessIndex, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_business_index WHERE index_code = ? `
@@ -63,11 +95,56 @@ func (m *BaseFromBusinessIndex) GetIndexItem(indexCode string) (item *BaseFromBu
 	return
 }
 
-func (m *BaseFromBusinessIndex) GetIndexCreate(terminalCode string) (items []*BaseFromBusinessIndex, err error) {
+// GetIndexItemList
+// @Description: 根据指标编码列表获取自有数据指标列表
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-31 16:29:12
+// @param indexCodeList []string
+// @return items []*BaseFromBusinessIndex
+// @return err error
+func (m *BaseFromBusinessIndex) GetIndexItemList(indexCodeList []string) (items []*BaseFromBusinessIndex, err error) {
+	num := len(indexCodeList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_business_index WHERE index_code in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, indexCodeList).QueryRows(&items)
+
+	return
+}
+
+// DelIndexItemList
+// @Description: 根据指标编码列表删除自有数据指标
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-31 16:36:52
+// @param indexCodeList []string
+// @return err error
+func (m *BaseFromBusinessIndex) DelIndexItemList(indexCodeList []string) (err error) {
+	num := len(indexCodeList)
+	if num <= 0 {
+		return
+	}
 	o := orm.NewOrm()
-	endTime := time.Now().Add(-2 * time.Minute).Format(utils.FormatDateTime)
-	sql := `SELECT * FROM base_from_business_index WHERE index_name = '' AND create_time <= ? AND terminal_code = ? `
-	_, err = o.Raw(sql, endTime, terminalCode).QueryRows(&items)
+	sql := `DELETE FROM base_from_business_index WHERE index_code in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, indexCodeList).Exec()
+
+	return
+}
+
+// GetMaxId
+// @Description: 获取自有数据库中的最大id
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-31 13:11:34
+// @return maxId int
+// @return err error
+func (m *BaseFromBusinessIndex) GetMaxId() (maxId int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT max(base_from_business_index_id) id FROM base_from_business_index limit 1`
+	err = o.Raw(sql).QueryRow(&maxId)
 	return
 }
 
@@ -89,6 +166,12 @@ func (m *BaseFromBusinessIndex) Update(cols []string) (err error) {
 	return
 }
 
+func (m *BaseFromBusinessIndex) Del() (err error) {
+	o := orm.NewOrm()
+	_, err = o.Delete(m)
+	return
+}
+
 func (m *BaseFromBusinessIndex) UpdateIndex(item *BaseFromBusinessIndex, updateCols []string) (err error) {
 	if item == nil {
 		return

+ 20 - 27
models/edb_data_business.go

@@ -299,38 +299,31 @@ func (obj Business) refresh(edbInfo *EdbInfo, startDate string) (err error) {
 		needAddDateMap[currDate] = 1
 	}
 
-	//删除已经不存在的指标数据(由于该指标当日的数据删除了)
-	removeDateList := make([]string, 0)
-	{
-		for dateTime := range removeDataTimeMap {
-			removeDateList = append(removeDateList, dateTime)
-		}
-		removeNum := len(removeDateList)
-		if removeNum > 0 {
-			// todo 删除指定日期的数据
-
-		}
-	}
-
 	// 入库
 	{
-
 		coll := mogDataObj.GetCollection()
 
 		//删除已经不存在的指标数据(由于该指标当日的数据删除了)
-		//{
-		//	for dateTime := range removeDataTimeMap {
-		//		removeDateList = append(removeDateList, dateTime)
-		//	}
-		//	removeNum := len(removeDateList)
-		//	if removeNum > 0 {
-		//		err = mogDataObj.RemoveManyByColl(coll, addDataList)
-		//		if err != nil {
-		//			fmt.Println("mogDataObj.RemoveMany() Err:" + err.Error())
-		//			return
-		//		}
-		//	}
-		//}
+		{
+			removeDateList := make([]time.Time, 0)
+			for dateTime := range removeDataTimeMap {
+				//获取已存在的所有数据
+				tmpDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dateTime, time.Local)
+				if tmpErr != nil {
+					err = tmpErr
+					return
+				}
+				removeDateList = append(removeDateList, tmpDateTime)
+			}
+			removeNum := len(removeDateList)
+			if removeNum > 0 {
+				err = mogDataObj.RemoveManyByColl(coll, bson.M{"edb_code": edbInfo.EdbCode, "data_time": bson.M{"$in": removeDateList}})
+				if err != nil {
+					fmt.Println("mogDataObj.RemoveMany() Err:" + err.Error())
+					return
+				}
+			}
+		}
 
 		// 插入新数据
 		if len(addDataList) > 0 {

+ 26 - 26
models/edb_info.go

@@ -5,6 +5,7 @@ import (
 	"errors"
 	"eta/eta_index_lib/models/mgo"
 	"eta/eta_index_lib/utils"
+	"eta/eta_index_lib/utils/mgodb"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/shopspring/decimal"
@@ -352,33 +353,12 @@ func GetEdbDataListAllByMongo(source, subSource int, findEdbDataListAllCond Find
 	queryConditions := bson.M{
 		"edb_info_id": findEdbDataListAllCond.EdbInfoId,
 	}
-	// 开始日期
-	if findEdbDataListAllCond.StartDataTime != "" {
-		startDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, findEdbDataListAllCond.StartDataTime, time.Local)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-
-		// 日期比较符
-		cond := utils.DateConvMysqlConvMongo(findEdbDataListAllCond.StartDataTimeCond)
-		if cond != `` {
-			queryConditions["data_time"] = bson.M{cond: startDateTime}
-		}
+	dateCondition, err := mgodb.BuildDateCondition(findEdbDataListAllCond.StartDataTime, findEdbDataListAllCond.EndDataTime)
+	if err != nil {
+		return
 	}
-	// 结束日期
-	if findEdbDataListAllCond.EndDataTime != "" {
-		endDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, findEdbDataListAllCond.EndDataTime, time.Local)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-
-		// 日期比较符
-		cond := utils.DateConvMysqlConvMongo(findEdbDataListAllCond.EndDataTimeCond)
-		if cond != `` {
-			queryConditions["data_time"] = bson.M{cond: endDateTime}
-		}
+	if len(dateCondition) > 0 {
+		queryConditions["data_time"] = dateCondition
 	}
 
 	sortList := make([]string, 0)
@@ -1452,3 +1432,23 @@ type CalculateEdbExtra struct {
 type CalculateLjzEdbExtra struct {
 	LastValType int `description:"最新值处理:0默认、均值填充"`
 }
+
+// GetEdbInfoByEdbCodeList
+// @Description: 根据来源和指标编码列表获取指标信息列表
+// @author: Roc
+// @datetime 2024-05-31 16:31:52
+// @param source int
+// @param edbCodeList []string
+// @return items []*EdbInfo
+// @return err error
+func GetEdbInfoByEdbCodeList(source int, edbCodeList []string) (items []*EdbInfo, err error) {
+	num := len(edbCodeList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM edb_info WHERE source=? AND edb_code IN (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, source, edbCodeList).QueryRows(&items)
+
+	return
+}

+ 33 - 0
models/mgo/base_from_business_data.go

@@ -417,3 +417,36 @@ func (m *BaseFromBusinessData) GetLatestValue(whereParams, selectParam interface
 
 	return
 }
+
+// RemoveMany
+// @Description: 根据条件删除多条数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-30 13:17:02
+// @param whereParams interface{}
+// @return err error
+func (m *BaseFromBusinessData) RemoveMany(whereParams interface{}) (err error) {
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+
+	return m.RemoveManyByColl(coll, whereParams)
+}
+
+// RemoveManyByColl
+// @Description: 根据条件删除多条数据(外部传入集合)
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-30 13:18:42
+// @param coll *qmgo.Collection
+// @param whereParams interface{}
+// @return err error
+func (m *BaseFromBusinessData) RemoveManyByColl(coll *qmgo.Collection, whereParams interface{}) (err error) {
+	ctx := context.TODO()
+	_, err = coll.RemoveAll(ctx, whereParams)
+	if err != nil {
+		fmt.Println("RemoveManyByColl:Err:" + err.Error())
+		return
+	}
+
+	return
+}

+ 18 - 0
routers/commentsRouter.go

@@ -142,6 +142,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BusinessIndexController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BusinessIndexController"],
+        beego.ControllerComments{
+            Method: "DelIndexData",
+            Router: `/data/del`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BusinessIndexController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BusinessIndexController"],
         beego.ControllerComments{
             Method: "Edit",
@@ -160,6 +169,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BusinessIndexController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BusinessIndexController"],
+        beego.ControllerComments{
+            Method: "DelIndex",
+            Router: `/index/del`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BusinessIndexController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:BusinessIndexController"],
         beego.ControllerComments{
             Method: "Refresh",

+ 229 - 33
services/base_from_business.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_index_lib/models/mgo"
 	"eta/eta_index_lib/services/alarm_msg"
 	"eta/eta_index_lib/utils"
+	"eta/eta_index_lib/utils/mgodb"
 	"fmt"
 	"go.mongodb.org/mongo-driver/bson"
 	"strings"
@@ -14,18 +15,18 @@ import (
 )
 
 // HandleBusinessIndex
-// @Description:  处理处理外部指标
+// @Description:  处理外部指标
 // @author: Roc
 // @datetime 2024-04-26 14:23:42
-// @param indexItem *models.AddBusinessIndexReq
+// @param indexReq *models.AddBusinessIndexReq
 // @return err error
-func HandleBusinessIndex(indexItem *models.AddBusinessIndexReq) (err error) {
+func HandleBusinessIndex(indexReq *models.AddBusinessIndexReq) (resp models.BaseFromBusinessIndexResp, err error) {
 	defer func() {
 		if err != nil {
 			// 添加刷新失败日志
 			dataUpdateResult := 2
 			dataUpdateFailedReason := "服务异常"
-			edbInfo, e := models.GetEdbInfoByEdbCode(utils.DATA_SOURCE_MYSTEEL_CHEMICAL, indexItem.IndexCode)
+			edbInfo, e := models.GetEdbInfoByEdbCode(utils.DATA_SOURCE_MYSTEEL_CHEMICAL, indexReq.IndexCode)
 			if e == nil {
 				//查询指标存在,才添加刷新日志
 				_ = AddEdbInfoUpdateLog(edbInfo.EdbInfoId, 2, err.Error(), dataUpdateResult, dataUpdateFailedReason, 1, 0)
@@ -34,26 +35,26 @@ func HandleBusinessIndex(indexItem *models.AddBusinessIndexReq) (err error) {
 	}()
 
 	// 没有数据就返回
-	if indexItem.DataList == nil || len(indexItem.DataList) <= 0 {
+	if indexReq.DataList == nil || len(indexReq.DataList) <= 0 {
 		return
 	}
 	// 兼容频度缺少度的字段
-	if !strings.Contains(indexItem.Frequency, "度") {
-		indexItem.Frequency = indexItem.Frequency + "度"
+	if !strings.Contains(indexReq.Frequency, "度") {
+		indexReq.Frequency = indexReq.Frequency + "度"
 	}
-	if !utils.VerifyFrequency(indexItem.Frequency) {
-		err = errors.New("指标频度不合法:" + indexItem.Frequency)
+	if !utils.VerifyFrequency(indexReq.Frequency) {
+		err = errors.New("指标频度不合法:" + indexReq.Frequency)
 		return
 	}
 
 	// 判断来源,如果来源不存在的话,则创建
 	sourceObj := new(models.EdbBusinessSource)
-	sourceItem, err := sourceObj.GetEdbBusinessSourceItem(indexItem.SourceName)
+	sourceItem, err := sourceObj.GetEdbBusinessSourceItem(indexReq.SourceName)
 	if err != nil {
 		if err.Error() == utils.ErrNoRow() {
 			sourceItem = &models.EdbBusinessSource{
 				EdbBusinessSourceId: 0,
-				SourceName:          indexItem.SourceName,
+				SourceName:          indexReq.SourceName,
 				CreateTime:          time.Now(),
 			}
 			err = sourceItem.Add()
@@ -63,10 +64,18 @@ func HandleBusinessIndex(indexItem *models.AddBusinessIndexReq) (err error) {
 	}
 
 	// 指标
-
 	indexObj := new(models.BaseFromBusinessIndex)
+	if indexReq.IndexCode == `` {
+		// 如果指标编码为空,那么自动生成
+		currId, tmpErr := indexObj.GetMaxId()
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		indexReq.IndexCode = fmt.Sprintf("SELF%07d", currId+1)
+	}
 	//判断指标是否存在
-	item, err := indexObj.GetIndexItem(indexItem.IndexCode)
+	item, err := indexObj.GetIndexItem(indexReq.IndexCode)
 	if err != nil {
 		if err.Error() != utils.ErrNoRow() {
 			return
@@ -75,15 +84,15 @@ func HandleBusinessIndex(indexItem *models.AddBusinessIndexReq) (err error) {
 		// 添加指标
 		item = &models.BaseFromBusinessIndex{
 			BaseFromBusinessIndexId: 0,
-			IndexCode:               indexItem.IndexCode,
-			IndexName:               indexItem.IndexName,
-			Unit:                    indexItem.Unit,
-			Frequency:               indexItem.Frequency,
+			IndexCode:               indexReq.IndexCode,
+			IndexName:               indexReq.IndexName,
+			Unit:                    indexReq.Unit,
+			Frequency:               indexReq.Frequency,
 			Source:                  int(sourceItem.EdbBusinessSourceId),
 			SourceName:              sourceItem.SourceName,
 			//StartDate:               time.Time{},
 			//EndDate:                 time.Time{},
-			Remark:         indexItem.Remark,
+			Remark:         indexReq.Remark,
 			BaseModifyTime: time.Now(),
 			DataUpdateTime: time.Now(),
 			CreateTime:     time.Now(),
@@ -96,16 +105,16 @@ func HandleBusinessIndex(indexItem *models.AddBusinessIndexReq) (err error) {
 		}
 	} else {
 		updateCols := make([]string, 0)
-		if item.IndexName != indexItem.IndexName {
-			item.IndexName = indexItem.IndexName
+		if item.IndexName != indexReq.IndexName {
+			item.IndexName = indexReq.IndexName
 			updateCols = append(updateCols, "IndexName")
 		}
-		if item.Unit != indexItem.Unit {
-			item.Unit = indexItem.Unit
+		if item.Unit != indexReq.Unit {
+			item.Unit = indexReq.Unit
 			updateCols = append(updateCols, "Unit")
 		}
-		if item.Frequency != indexItem.Frequency {
-			item.Frequency = indexItem.Frequency
+		if item.Frequency != indexReq.Frequency {
+			item.Frequency = indexReq.Frequency
 			updateCols = append(updateCols, "Frequency")
 		}
 		if item.Source != int(sourceItem.EdbBusinessSourceId) {
@@ -130,10 +139,10 @@ func HandleBusinessIndex(indexItem *models.AddBusinessIndexReq) (err error) {
 	mogDataObj := new(mgo.BaseFromBusinessData)
 
 	//获取已存在的所有数据
-	exitDataList, err := mogDataObj.GetAllDataList(bson.M{"index_code": indexItem.IndexCode}, []string{"data_time"})
+	exitDataList, err := mogDataObj.GetAllDataList(bson.M{"index_code": indexReq.IndexCode}, []string{"data_time"})
 	if err != nil {
 		fmt.Println("GetIndexDataList Err:" + err.Error())
-		return err
+		return
 	}
 
 	// 已经存在的数据集
@@ -149,11 +158,12 @@ func HandleBusinessIndex(indexItem *models.AddBusinessIndexReq) (err error) {
 	updateDataList := make([]mgo.BaseFromBusinessData, 0)
 	//var hasUpdate bool
 	// 遍历excel数据,然后跟现有的数据做校验,不存在则入库
-	for _, data := range indexItem.DataList {
-		dateTime, err := utils.DealExcelDate(data.Date)
-		if err != nil {
-			fmt.Println("time.ParseInLocation Err:" + err.Error())
-			return err
+	for _, data := range indexReq.DataList {
+		dateTime, tmpErr := utils.DealExcelDate(data.Date)
+		if tmpErr != nil {
+			fmt.Println("time.ParseInLocation Err:" + tmpErr.Error())
+			err = tmpErr
+			return
 		}
 
 		// 调整最小日期
@@ -220,12 +230,12 @@ func HandleBusinessIndex(indexItem *models.AddBusinessIndexReq) (err error) {
 	//fmt.Println("result", result)
 
 	//修改最大最小日期
-	indexMaxAndMinInfo, err := item.GetEdbInfoMaxAndMinInfo(indexItem.IndexCode)
+	indexMaxAndMinInfo, err := item.GetEdbInfoMaxAndMinInfo(indexReq.IndexCode)
 	if err != nil {
 		return
 	}
 	if err == nil && indexMaxAndMinInfo != nil {
-		e := item.ModifyIndexMaxAndMinInfo(indexItem.IndexCode, indexMaxAndMinInfo, isIndexUpdateOrAdd)
+		e := item.ModifyIndexMaxAndMinInfo(indexReq.IndexCode, indexMaxAndMinInfo, isIndexUpdateOrAdd)
 		if e != nil {
 			fmt.Println("ModifyIndexMaxAndMinInfo Err:" + e.Error())
 		}
@@ -234,6 +244,192 @@ func HandleBusinessIndex(indexItem *models.AddBusinessIndexReq) (err error) {
 	// 同步刷新指标库的指标
 	go refreshEdbBusiness(item.IndexCode, reqMinDate)
 
+	resp = models.BaseFromBusinessIndexResp{
+		IndexCode:  item.IndexCode,
+		IndexName:  item.IndexName,
+		Unit:       item.Unit,
+		Frequency:  item.Frequency,
+		SourceName: item.SourceName,
+	}
+	return
+}
+
+// DelBusinessIndexResp
+// @Description: 删除外部指标的返回
+type DelBusinessIndexResp struct {
+	IsDeleteEdbCodeList []string `description:"已经删除了的指标编码"`
+	NoDeleteEdbCodeList []string `description:"未删除的指标编码"`
+}
+
+// DelBusinessIndex
+// @Description: 删除外部指标
+// @author: Roc
+// @datetime 2024-05-31 16:27:37
+// @param indexCodeList []string
+// @return err error
+// @return errMsg string
+func DelBusinessIndex(indexCodeList []string) (joinEdbCodeList, needDelEdbCodeList []string, err error, errMsg string) {
+	defer func() {
+		if err != nil {
+			fmt.Println("DelBusinessIndex Err:" + err.Error())
+		}
+	}()
+	errMsg = "删除失败"
+
+	if len(indexCodeList) < 0 {
+		errMsg = "指标编码不允许为空"
+		err = errors.New(errMsg)
+		return
+	}
+
+	// 指标
+	indexObj := new(models.BaseFromBusinessIndex)
+
+	//判断指标是否存在
+	baseIndexList, err := indexObj.GetIndexItemList(indexCodeList)
+	if err != nil {
+		return
+	}
+
+	// 已加入到eta指标库的编码map
+	joinEdbCodeList = make([]string, 0)
+	joinEdbMap := make(map[string]string)
+
+	// 未加入到eta指标库的编码
+	needDelEdbCodeList = make([]string, 0)
+
+	// 判断指标是否加入到指标库
+	tmpEdbInfoList, err := models.GetEdbInfoByEdbCodeList(utils.DATA_SOURCE_BUSINESS, indexCodeList)
+	if err != nil {
+		return
+	}
+	for _, v := range tmpEdbInfoList {
+		joinEdbCodeList = append(joinEdbCodeList, v.EdbCode)
+		joinEdbMap[v.EdbCode] = v.EdbCode
+	}
+
+	for _, v := range baseIndexList {
+		_, ok := joinEdbMap[v.IndexCode]
+		if !ok {
+			needDelEdbCodeList = append(needDelEdbCodeList, v.IndexCode)
+		}
+	}
+
+	// 如果需要删除的指标,则直接返回
+	if len(needDelEdbCodeList) <= 0 {
+		return
+	}
+
+	// 删除指标
+	err = indexObj.DelIndexItemList(needDelEdbCodeList)
+	if err != nil {
+		fmt.Println("删除自有指标失败, Err:" + err.Error())
+		return
+	}
+
+	// 删除指标明细数据
+	mogDataObj := new(mgo.BaseFromBusinessData)
+	err = mogDataObj.RemoveMany(bson.M{"index_code": bson.M{"$in": needDelEdbCodeList}})
+	if err != nil {
+		fmt.Println("删除自有指标明细数据 Err:" + err.Error())
+		return
+	}
+
+	return
+}
+
+// DelBusinessIndexData
+// @Description: 删除指标数据
+// @author: Roc
+// @datetime 2024-05-31 15:43:32
+// @param indexCode string
+// @param dateList []string
+// @return err error
+// @return errMsg string
+func DelBusinessIndexData(indexCode string, startDate, endDate string) (err error, errMsg string) {
+	defer func() {
+		if err != nil {
+			fmt.Println("DelBusinessIndex Err:" + err.Error())
+		}
+	}()
+	errMsg = "删除失败"
+
+	if indexCode == `` {
+		errMsg = "指标编码不允许为空"
+		err = errors.New(errMsg)
+		return
+	}
+	if startDate == `` && endDate == `` {
+		errMsg = "开始日期和结束日期不允许同时为空"
+		err = errors.New(errMsg)
+		return
+	}
+
+	// 指标
+	indexObj := new(models.BaseFromBusinessIndex)
+
+	//判断指标是否存在
+	item, err := indexObj.GetIndexItem(indexCode)
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			return
+		}
+		err = nil
+		return
+	}
+
+	// 构建查询条件
+	queryConditions := bson.M{
+		"index_code": item.IndexCode,
+	}
+
+	// 当前传入的最小日期
+	var reqMinDate time.Time
+
+	var startDateTime, endDateTime time.Time
+	if startDate != `` {
+		//获取已存在的所有数据
+		startDateTime, err = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+		if err != nil {
+			return
+		}
+		// 调整最小日期
+		if reqMinDate.IsZero() || reqMinDate.After(startDateTime) {
+			reqMinDate = startDateTime
+		}
+	}
+
+	if endDate != `` {
+		//获取已存在的所有数据
+		endDateTime, err = time.ParseInLocation(utils.FormatDate, endDate, time.Local)
+		if err != nil {
+			return
+		}
+		// 调整最小日期
+		if reqMinDate.IsZero() || reqMinDate.After(endDateTime) {
+			reqMinDate = endDateTime
+		}
+	}
+
+	dateCondition, err := mgodb.BuildDateTimeCondition(startDateTime, endDateTime)
+	if err != nil {
+		return
+	}
+	if len(dateCondition) > 0 {
+		queryConditions["data_time"] = dateCondition
+	}
+
+	// 删除数据源中的指标明细数据
+	mogDataObj := new(mgo.BaseFromBusinessData)
+	err = mogDataObj.RemoveMany(queryConditions)
+	if err != nil {
+		fmt.Println("删除自有指标明细数据 Err:" + err.Error())
+		return
+	}
+
+	// 同步刷新指标库的指标
+	go refreshEdbBusiness(item.IndexCode, reqMinDate)
+
 	return
 }
 

+ 1 - 0
utils/constants.go

@@ -227,6 +227,7 @@ const (
 	CACHE_EDB_TERMINAL_CODE_URL      = "edb:terminal_code:edb_code:"      // 指标与终端关系的缓存
 	CACHE_EDB_TERMINAL_CODE_GOOD_URL = "edb:terminal_code:good:edb_code:" // 指标与终端关系的缓存, 商品期货
 	CACHE_EDB_THS_SERVER_TOKEN       = "edb:ths_server_token:"            //同花顺调用凭证
+	CACHE_SELF_EDB_HANDLE            = "CACHE_SELF_EDB_HANDLE:"           // 自定义指标缓存
 )
 
 // 图表类型

+ 58 - 0
utils/mgodb/common.go

@@ -0,0 +1,58 @@
+package mgodb
+
+import (
+	"eta/eta_index_lib/utils"
+	"go.mongodb.org/mongo-driver/bson"
+	"time"
+)
+
+// BuildDateCondition
+// @Description:  构建日期查询条件
+// @author: Roc
+// @datetime 2024-06-03 09:41:19
+// @param start string
+// @param end string
+// @return condition bson.M
+// @return err error
+func BuildDateCondition(start, end string) (condition bson.M, err error) {
+	var startDateTime, endDateTime time.Time
+	if start != "" {
+		// 使用开始日期条件
+		startDateTime, err = time.ParseInLocation(utils.FormatDate, start, time.Local)
+		if err != nil {
+			return
+		}
+	}
+	if end != "" {
+		// 使用结束日期条件
+		endDateTime, err = time.ParseInLocation(utils.FormatDate, end, time.Local)
+		if err != nil {
+			return
+		}
+	}
+
+	return BuildDateTimeCondition(startDateTime, endDateTime)
+
+}
+
+// BuildDateTimeCondition
+// @Description: 构建日期查询条件
+// @author: Roc
+// @datetime 2024-06-03 09:47:32
+// @param startDateTime time.Time
+// @param endDateTime time.Time
+// @return condition bson.M
+// @return err error
+func BuildDateTimeCondition(startDateTime, endDateTime time.Time) (condition bson.M, err error) {
+	if !startDateTime.IsZero() && !endDateTime.IsZero() {
+		condition = bson.M{utils.DateConvMysqlConvMongo(">="): startDateTime, utils.DateConvMysqlConvMongo("<="): endDateTime}
+	} else if !startDateTime.IsZero() {
+		cond := utils.DateConvMysqlConvMongo(">=")
+		condition = bson.M{cond: startDateTime}
+	} else if !endDateTime.IsZero() {
+		cond := utils.DateConvMysqlConvMongo("<=")
+		condition = bson.M{cond: endDateTime}
+	}
+
+	return
+}