Browse Source

fix:指标共享时,添加逻辑校验

Roc 2 months ago
parent
commit
cca3e9ef5c

+ 81 - 203
controllers/data_manage/public_edb.go

@@ -5,11 +5,14 @@ import (
 	"eta_gn/eta_api/controllers"
 	"eta_gn/eta_api/models"
 	"eta_gn/eta_api/models/data_manage"
+	"eta_gn/eta_api/models/data_manage/data_approve"
 	"eta_gn/eta_api/models/data_manage/request"
+	"eta_gn/eta_api/models/system"
 	"eta_gn/eta_api/services/data"
 	dataApproveSerice "eta_gn/eta_api/services/data/data_approve"
 	"eta_gn/eta_api/services/elastic"
 	"eta_gn/eta_api/utils"
+	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"strconv"
 	"strings"
@@ -20,179 +23,6 @@ type EdbPublicController struct {
 	controllers.BaseAuthController
 }
 
-// RemoveCheck
-// @Title 删除检测接口
-// @Description 删除检测接口
-// @Param	request	body data_manage.ClassifyDeleteCheckReq true "type json string"
-// @Success 200 Ret=200 检测成功
-// @router /edb_public/remove/check [post]
-func (c *EdbPublicController) RemoveCheck() {
-	// TODO
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		c.Data["json"] = br
-		c.ServeJSON()
-	}()
-	var req data_manage.ClassifyDeleteCheckReq
-	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
-	if err != nil {
-		br.Msg = "参数解析异常!"
-		br.ErrMsg = "参数解析失败,Err:" + err.Error()
-		return
-	}
-
-	if req.ClassifyId < 0 && req.EdbInfoId <= 0 {
-		br.Msg = "参数错误"
-		br.IsSendEmail = false
-		return
-	}
-	deleteStatus, tipsMsg, tableList, err, errMsg := data.DeleteEdbPublicCheck(req.EdbInfoId, c.SysUser)
-	if errMsg != `` {
-		br.Msg = errMsg
-		br.ErrMsg = errMsg
-		if err != nil {
-			br.ErrMsg = err.Error()
-		} else {
-			br.IsSendEmail = false
-		}
-		return
-	}
-	if c.Lang == "en" {
-		if utils.ViperConfig.InConfig(tipsMsg) {
-			tipsMsg = utils.ViperConfig.GetString(tipsMsg)
-		}
-	}
-
-	//var deleteStatus int
-	//var tipsMsg string
-	////删除公共分类
-	//if req.ClassifyId > 0 && req.EdbInfoId == 0 {
-	//	//判断公共分类下,是否含有指标
-	//	count, err := data_manage.GetEdbInfoCountByClassifyId(req.ClassifyId)
-	//	if err != nil {
-	//		br.Msg = "删除失败"
-	//		br.ErrMsg = "公共分类下是否含有指标失败,Err:" + err.Error()
-	//		return
-	//	}
-	//
-	//	if count > 0 {
-	//		deleteStatus = 1
-	//		tipsMsg = "若目录关联指标不可删除"
-	//	}
-	//}
-	//
-	//if deleteStatus != 1 && req.EdbInfoId == 0 {
-	//	classifyCount, err := data_manage.GetClassifyCountByClassifyId(req.ClassifyId)
-	//	if err != nil && !utils.IsErrNoRow(err) {
-	//		br.Msg = "删除失败"
-	//		br.ErrMsg = "公共分类下是否含有指标失败,Err:" + err.Error()
-	//		return
-	//	}
-	//	if classifyCount > 0 {
-	//		deleteStatus = 2
-	//		tipsMsg = "确认删除当前目录及包含的子目录吗"
-	//	}
-	//}
-	//
-	////删除指标
-	//if req.EdbInfoId > 0 {
-	//	//判断指标是否用于作图,如果用于作图,则不可删除
-	//	chartCount, err := data_manage.GetChartEdbMappingCount(req.EdbInfoId)
-	//	if err != nil && !utils.IsErrNoRow(err) {
-	//		br.Msg = "删除失败"
-	//		br.ErrMsg = "判断指标是否被用于作图失败,Err:" + err.Error()
-	//		return
-	//	}
-	//	if chartCount > 0 {
-	//		deleteStatus = 3
-	//		tipsMsg = "当前指标已用作画图,不可删除"
-	//	}
-	//	//判断指标是否用于计算
-	//	{
-	//		calculateCount, err := data_manage.GetEdbInfoCalculateMappingCount(req.EdbInfoId)
-	//		if err != nil && !utils.IsErrNoRow(err) {
-	//			br.Msg = "删除失败"
-	//			br.ErrMsg = "判断指标是否被用于计算失败,GetEdbInfoCalculateCount Err:" + err.Error()
-	//			return
-	//		}
-	//		if calculateCount > 0 {
-	//			deleteStatus = 4
-	//			tipsMsg = "当前指标已用作,指标运算,不可删除"
-	//		}
-	//	}
-	//}
-
-	resp := new(data_manage.ClassifyDeleteCheckResp)
-	resp.DeleteStatus = deleteStatus
-	resp.TipsMsg = tipsMsg
-	resp.TableList = tableList
-	br.Ret = 200
-	br.Msg = "检测成功"
-	br.Success = true
-	br.Data = resp
-}
-
-// Remove
-// @Title 删除公共分类/指标
-// @Description 删除公共分类/指标接口
-// @Param	request	body data_manage.DeleteEdbClassifyReq true "type json string"
-// @Success 200 Ret=200 删除成功
-// @router /edb_public/remove [post]
-func (c *EdbPublicController) Remove() {
-	// TODO
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		c.Data["json"] = br
-		c.ServeJSON()
-	}()
-	sysUser := c.SysUser
-	if sysUser == nil {
-		br.Msg = "请登录"
-		br.ErrMsg = "请登录,SysUser Is Empty"
-		br.Ret = 408
-		return
-	}
-	var req data_manage.DeleteEdbClassifyReq
-	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
-	if err != nil {
-		br.Msg = "参数解析异常!"
-		br.ErrMsg = "参数解析失败,Err:" + err.Error()
-		return
-	}
-
-	if req.ClassifyId < 0 && req.EdbInfoId <= 0 {
-		br.Msg = "参数错误"
-		br.IsSendEmail = false
-		return
-	}
-
-	nextItem, _, err, errMsg := data.Delete(req.ClassifyId, req.EdbInfoId, sysUser, string(c.Ctx.Input.RequestBody), c.Ctx.Input.URI())
-	if errMsg != `` {
-		br.Msg = errMsg
-		br.ErrMsg = errMsg
-		if err != nil {
-			br.ErrMsg = err.Error()
-		} else {
-			br.IsSendEmail = false
-		}
-		return
-	}
-
-	resp := data_manage.AddEdbInfoResp{}
-	if nextItem != nil {
-		resp = data_manage.AddEdbInfoResp{
-			EdbInfoId:  nextItem.EdbInfoId,
-			UniqueCode: nextItem.UniqueCode,
-		}
-	}
-
-	br.Ret = 200
-	br.Msg = "删除成功"
-	br.Success = true
-	br.IsAddLog = true
-	br.Data = resp
-}
-
 // Save
 // @Title 单个指标设置公开
 // @Description 单个指标设置公开
@@ -332,7 +162,6 @@ func (c *EdbPublicController) Cancel() {
 		c.ServeJSON()
 	}()
 
-	// TODO 单个指标撤销的时候,需要校验状态,然后撤销
 	sysUser := c.SysUser
 	if sysUser == nil {
 		br.Msg = "请登录"
@@ -348,52 +177,101 @@ func (c *EdbPublicController) Cancel() {
 		return
 	}
 
-	var req request.SetEdbPublicReq
-	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
 	if err != nil {
-		br.Msg = "参数解析异常!"
-		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		br.Msg = "保存失败!"
+		br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
 		return
 	}
 
-	if len(req.EdbInfoList) <= 0 {
-		br.Msg = `请选择指标`
-		br.IsSendEmail = false
+	// 判断指标公共状态
+	if !utils.InArrayByInt([]int{utils.DataPublicSuccess, utils.DataPublicReject, utils.DataPublicCommit}, edbInfo.PublicStatus) {
+		br.Msg = "保存失败,指标公开状态异常!"
+		br.ErrMsg = "保存失败,指标公开状态异常,public_status:" + fmt.Sprint(edbInfo.PublicStatus)
 		return
 	}
 
-	// 待处理的资产
-	dataPublicItemList := make([]dataApproveSerice.SetDataPublicItem, 0)
-
-	// 校验是否重复存在已公开、已提交的指标
-	{
-		edbInfoIdList := make([]int, 0)
-		for _, item := range req.EdbInfoList {
-			edbInfoIdList = append(edbInfoIdList, item.EdbInfoId)
-
-			dataPublicItemList = append(dataPublicItemList, dataApproveSerice.SetDataPublicItem{
-				DataId:     item.EdbInfoId,
-				ClassifyId: item.ClassifyId,
-			})
-		}
-
-		list, err := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+	// 如果公开状态是:已驳回、已提交,那么直接去撤销审批单
+	if utils.InArrayByInt([]int{utils.DataPublicReject, utils.DataPublicCommit}, edbInfo.PublicStatus) {
+		obj := data_approve.DataApproveRelation{}
+		dataApproveId, err := obj.GetDataApproveIdByDataId(edbInfoId, utils.DataApproveTypeEdb)
 		if err != nil {
 			br.Msg = "保存失败!"
-			br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+			br.ErrMsg = "获取审批单失败,Err:" + err.Error()
 			return
 		}
-		for _, v := range list {
-			if v.PublicStatus != utils.DataPublicDefault {
-				br.Msg = `选择指标中存在已经公开/提交审批的指标,请仅选择未公开指标!`
-				br.IsSendEmail = false
+		// 撤销审批
+		msg, e := dataApproveSerice.DataApproveCancel(dataApproveId, sysUser.AdminId, sysUser.RealName)
+		if e != nil {
+			if msg != "" {
+				br.Msg = msg
+			} else {
+				br.Msg = "操作失败"
+			}
+			br.ErrMsg = "撤销审批失败, Err: " + e.Error()
+			return
+		}
+	}
+
+	checkUserIdList := []int{sysUser.AdminId}
+	noReferenced, otherUserIdList, err, tips := data.CheckEdbReferencedByOthers(edbInfo.EdbInfoType, []int{edbInfo.EdbInfoId}, checkUserIdList)
+	if err != nil {
+		br.Msg = "保存失败"
+		if tips != "" {
+			br.Msg = tips
+		}
+		br.ErrMsg = "撤销指标公开失败,查找指标的关联用户失败,Err:" + err.Error()
+		return
+	}
+
+	if !noReferenced {
+		userNameStr := ``
+		if len(otherUserIdList) > 0 {
+			userNameList := make([]string, 0)
+			userList, err := system.GetAdminListByIdList(otherUserIdList)
+			if err != nil {
+				br.Msg = "保存失败"
+				if tips != "" {
+					br.Msg = tips
+				}
+				br.ErrMsg = "撤销指标公开失败,查找用户信息失败,Err:" + err.Error()
 				return
 			}
+			for _, userInfo := range userList {
+				userNameList = append(userNameList, userInfo.RealName)
+			}
+			userNameStr = strings.Join(userNameList, ",")
+		}
+		msg := `指标被其他用户使用,无法撤销公开`
+		if userNameStr != "" {
+			msg = fmt.Sprintf(`指标被用户%s使用,无法撤销公开`, userNameStr)
 		}
+		if tips != "" {
+			msg = fmt.Sprintf(`%s,用户为:%s,无法撤销公开`, tips, userNameStr)
+		}
+		br.Msg = msg
+		br.ErrMsg = "指标被其他用户共享,无法撤销公开,EdbInfoId:" + strconv.Itoa(edbInfo.EdbInfoId)
+		br.IsSendEmail = false
+		return
 	}
+
+	edbInfo.PublicStatus = utils.DataPublicDefault
+	edbInfo.EdbPublicClassifyId = 0
+	err = edbInfo.Update([]string{"PublicStatus", "EdbPublicClassifyId"})
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "取消指标公共失败,Err:" + err.Error()
+		return
+	}
+
+	// 修改ES数据
+	data.AddOrEditEdbInfoToEs(edbInfo.EdbInfoId)
+
+	// TODO 取消公共的时候,需要清除对应用户的收藏状态
+
 	br.Ret = 200
 	br.Success = true
-	br.Msg = "保存成功"
+	br.Msg = "操作成功"
 }
 
 // ListByEs

+ 6 - 0
models/data_manage/collect_edb.go

@@ -221,6 +221,12 @@ MAX(b."source") "source",
 MAX(b."source_name") "source_name",
 MAX(b."frequency") "frequency",
 MAX(b."unit") "unit",
+MAX(b."end_date") "end_date",
+MAX(b."end_value") "end_value",
+MAX(b."latest_date") "latest_date",
+MAX(b."latest_value") "latest_value",
+MAX(b."sys_user_id") "sys_user_id",
+MAX(b."sys_user_real_name") "sys_user_real_name",
 MAX(b."classify_id") "classify_id",
 MAX(b."create_time") "create_time",
 MAX(b."unique_code") "unique_code",

+ 13 - 0
models/data_manage/data_approve/data_approve.go

@@ -237,3 +237,16 @@ func GetDataApproveCountByState(state int) (count int, err error) {
 	err = db.Raw(sql, state).Scan(&count).Error
 	return
 }
+
+// GetListByDataApproveId
+// @Description: 根据审批id获取关联的资产(指标、图表)
+// @author: Roc
+// @datetime 2024-12-05 17:23:39
+// @param dataApproveId int
+// @return dataIdList []int
+// @return err error
+func (b *DataApprove) GetByDataApproveId(dataApproveId int) (dataIdList []*DataApproveRelation, err error) {
+	sql := `SELECT * FROM data_approve_relation AS a WHERE data_approve_id = ? `
+	err = global.DmSQL["data"].Raw(sql, dataApproveId).Scan(&dataIdList).Error
+	return
+}

+ 26 - 0
models/data_manage/data_approve/data_approve_relation.go

@@ -1,6 +1,7 @@
 package data_approve
 
 import (
+	sql2 "database/sql"
 	"eta_gn/eta_api/global"
 	"time"
 )
@@ -55,3 +56,28 @@ func (b *DataApproveRelation) GetListByDataApproveId(dataApproveId int) (dataIdL
 	err = global.DmSQL["data"].Raw(sql, dataApproveId).Scan(&dataIdList).Error
 	return
 }
+
+// GetDataApproveIdByDataId
+// @Description: 根据审批类型和资产id获取最大的审批单
+// @author: Roc
+// @receiver b
+// @datetime 2024-12-26 15:56:03
+// @param dataId int
+// @param dataType int
+// @return dataApproveId int
+// @return err error
+func (b *DataApproveRelation) GetDataApproveIdByDataId(dataId, dataType int) (dataApproveId int, err error) {
+	sql := `SELECT max(a.data_approve_id) data_approve_id FROM data_approve_relation AS a 
+         JOIN data_approve ON a.data_approve_id = b.data_approve_id
+         WHERE a.data_id = ? AND b.data_type = ? `
+
+	var maxIdNull sql2.NullInt64
+	err = global.DmSQL["data"].Raw(sql, dataId, dataType).Scan(&maxIdNull).Error
+	if err != nil {
+		return
+	}
+
+	dataApproveId = int(maxIdNull.Int64)
+
+	return
+}