xyxie 6 miesięcy temu
rodzic
commit
da6caeeb69

+ 220 - 0
controllers/knowledge_tag.go

@@ -0,0 +1,220 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta_gn/eta_api/models"
+	"eta_gn/eta_api/models/knowledge"
+	knowledgeServ "eta_gn/eta_api/services/knowledge"
+)
+
+// 标签
+type KnowledgeTagController struct {
+	BaseAuthController
+}
+
+// @Title 新增标签接口
+// @Description 新增标签
+// @Param	request	body knowledge.TagAddReq true "type json string"
+// @Success 200 新增成功
+// @router /tag/add [post]
+func (this *KnowledgeTagController) Add() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req knowledge.TagAddReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.TagName == "" {
+		br.Msg = "标签名称不可为空"
+		return
+	}
+
+	// 新增标签
+	err, errMsg, isSentEmail := knowledgeServ.AddKnowledgeTag(req.TagName, req.ResourceType)
+	if err != nil {
+		br.Msg = "添加失败"
+		if errMsg != "" {
+			br.Msg = errMsg
+		}
+		br.ErrMsg = "添加失败,Err:" + err.Error()
+		br.IsSendEmail = isSentEmail
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "新增成功"
+}
+
+// @Title 删除标签接口
+// @Description 删除标签
+// @Param	request	body knowledge.DeleteTagReq true "type json string"
+// @Success 200 Ret=200,删除成功
+// @router /tag/delete [post]
+func (this *KnowledgeTagController) Delete() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req knowledge.DeleteTagReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.TagId <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+	//todo 是否需要删除接口
+	/*br.Msg = "报告标签不允许删除"
+	br.IsSendEmail = false
+	return*/
+	knowledgeObj := new(knowledge.KnowledgeTag)
+	item, err := knowledgeObj.GetTagById(req.TagId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
+	if item == nil {
+		br.Msg = "标签不存在"
+		return
+	}
+	err = knowledgeObj.Delete(req.TagId)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败,Err:" + err.Error()
+		return
+	}
+
+	// 被删除是二级标签且关联电话会时, 同步FICC活动标签
+	//if item.ParentId > 0 && item.RelateTel == 1 {
+	//	go func() {
+	//		_ = yb.SyncTagAndFiccActivityType()
+	//	}()
+	//}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "删除成功"
+}
+
+// @Title 修改标签接口
+// @Description 修改标签
+// @Param	request	body knowledge.EditTagReq true "type json string"
+// @Success 200 Ret=200,修改成功
+// @router /tag/edit [post]
+func (this *KnowledgeTagController) Edit() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req knowledge.EditTagReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.TagId <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+	if req.TagName == "" {
+		br.Msg = "标签名称不可为空"
+		return
+	}
+
+	// 修改标签
+	err, errMsg, isSentEmail := knowledgeServ.EditKnowledgeTag(req.TagId, req.ParentId, req.TagName)
+	if err != nil {
+		br.Msg = "修改失败"
+		if errMsg != "" {
+			br.Msg = errMsg
+		}
+		br.ErrMsg = "修改失败,Err:" + err.Error()
+		br.IsSendEmail = isSentEmail
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "修改成功"
+}
+
+// @Title 获取标签列表
+// @Description 获取标签列表
+// @Param   KeyWord   query   string  true       "检索关键词"
+// @Param   CompanyType   query   string  false       "产品类型,枚举值:'ficc','权益';不传默认返回全部"
+// @Param   HideDayWeek   query   int  false       "是否隐藏晨周报"
+// @Success 200 {object} knowledge.Tag
+// @router /tag/list [get]
+func (this *KnowledgeTagController) ListTag() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	keyWord := this.GetString("KeyWord")
+	knowledgeObj := new(knowledge.KnowledgeTag)
+	list, err := knowledgeObj.GetTagListByKeyword(keyWord)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	resp := new(knowledge.KnowledgeTagListResp)
+	resp.List = list
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// Move
+// @Title 移动标签接口
+// @Description 移动标签
+// @Param	request	body knowledge.TagMoveReq true "type json string"
+// @Success 200 新增成功
+// @router /tag/move [post]
+func (this *KnowledgeTagController) Move() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req knowledge.TagMoveReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.TagId <= 0 {
+		br.Msg = "请选择标签"
+		return
+	}
+	e, msg := knowledgeServ.MoveKnowledgeTag(req)
+	if e != nil {
+		br.Msg = msg
+		br.ErrMsg = "移动标签失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 26 - 194
models/knowledge/knowledge_classify.go

@@ -58,27 +58,24 @@ func (k *KnowledgeClassify) GetClassifySubCountByClassifyId(classifyId int) (cou
 	sql := `SELECT COUNT(1) as num FROM knowledge_classify AS a
         INNER JOIN knowledge_resource AS b ON a.classify_id=b.classify_id
         WHERE a.parent_id=? `
-	//o := orm.NewOrmUsingDB("rddp")
-	//err = o.Raw(sql, classifyId).QueryRow(&count)
+
 	err = global.DmSQL["rddp"].Raw(sql, classifyId).First(&count).Error
 	return
 }
 
 func (k *KnowledgeClassify) GetClassifySubCountByParentId(classifyId int) (count int, err error) {
 	sqlCount := `
-	SELECT COUNT(1) as num FROM knowledge_classify AS a
+	SELECT COUNT(1) as num FROM %s AS a
 	WHERE a.parent_id=? `
-	//o := orm.NewOrmUsingDB("rddp")
-	//err = o.Raw(sqlCount, classifyId).QueryRow(&count)
+	sqlCount = fmt.Sprintf(sqlCount, k.TableName())
 	err = global.DmSQL["rddp"].Raw(sqlCount, classifyId).Scan(&count).Error
 	return
 }
 
 // 删除分类
 func (k *KnowledgeClassify) Delete(classifyId int) (err error) {
-	sql := `DELETE FROM knowledge_classify WHERE classify_id =? `
-	//o := orm.NewOrmUsingDB("rddp")
-	//_, err = o.Raw(sql, classifyId).Exec()
+	sql := `DELETE FROM %s WHERE classify_id =? `
+	sql = fmt.Sprintf(sql, k.TableName())
 	err = global.DmSQL["rddp"].Exec(sql, classifyId).Error
 	if err != nil {
 		return
@@ -100,64 +97,6 @@ type ClassifyPermissionListResp struct {
 	Paging *paging.PagingItem `description:"分页数据"`
 }
 
-// 获取分类列表
-func (k *KnowledgeClassify) GetClassifyList(keyWord string, enabled int) (items []*KnowledgeClassifyItem, err error) {
-	sql := ``
-	companyTypeSqlStr := ``
-	if enabled == 1 {
-		companyTypeSqlStr += ` AND enabled = 1 `
-	}
-	pars := make([]interface{}, 0)
-	if keyWord != "" {
-		sql = `SELECT * FROM (
-                   SELECT * FROM classify
-                   WHERE parent_id=0 ` + companyTypeSqlStr + `  AND classify_name LIKE ?
-                   UNION
-                   SELECT * FROM classify
-                   WHERE classify_id IN( SELECT parent_id FROM classify
-                   WHERE parent_id>0 ` + companyTypeSqlStr + `  AND classify_name LIKE ? )
-                   )AS t
-                   ORDER BY sort ASC,create_time ASC`
-		pars = utils.GetLikeKeywordPars(pars, keyWord, 2)
-	} else {
-		sql = `SELECT * FROM knowledge_classify WHERE parent_id=0 ` + companyTypeSqlStr
-
-		sql += ` ORDER BY sort ASC, create_time ASC`
-	}
-	pars = append(pars)
-
-	//o := orm.NewOrmUsingDB("rddp")
-	//_, err = o.Raw(sql, pars...).QueryRows(&items)
-	err = global.DmSQL["rddp"].Raw(sql, pars).Find(&items).Error
-	return
-}
-
-func (k *KnowledgeClassify) GetClassifyListCount(keyWord, companyType string, hideDayWeek int) (count int, err error) {
-	sqlCount := ``
-	pars := make([]interface{}, 0)
-
-	if keyWord != "" {
-		sqlCount = `SELECT  COUNT(1) AS count FROM (
-               SELECT * FROM classify
-               WHERE parent_id=0  AND classify_name LIKE ?
-               UNION
-               SELECT * FROM classify
-               WHERE classify_id IN(SELECT parent_id FROM classify
-               WHERE parent_id>0 AND classify_name LIKE ? )
-               )AS t `
-		pars = utils.GetLikeKeywordPars(pars, keyWord, 2)
-	} else {
-		sqlCount = `SELECT COUNT(1) AS count FROM knowledge_classify WHERE parent_id=0 `
-		if hideDayWeek == 1 {
-			sqlCount += ` AND classify_name <> '晨报' AND classify_name <> '周报' `
-		}
-	}
-	//o := orm.NewOrmUsingDB("rddp")
-	//err = o.Raw(sqlCount, pars...).QueryRow(&count)
-	err = global.DmSQL["rddp"].Raw(sqlCount, pars...).Scan(&count).Error
-	return
-}
-
 type CheckDeleteClassifyReq struct {
 	ClassifyId int `description:"分类ID"`
 }
@@ -186,48 +125,6 @@ type FindByIdClassifyReq struct {
 	ClassifyId int `description:"分类ID"`
 }
 
-func (k *KnowledgeClassify) GetClassifyChild(parentId int, keyWord string) (items []*KnowledgeClassify, err error) {
-	sql := ``
-	pars := make([]interface{}, 0)
-	if keyWord != "" {
-		sql = `SELECT * FROM knowledge_classify WHERE classify_name LIKE ? AND parent_id=? ORDER BY create_time ASC `
-		pars = append(pars, utils.GetLikeKeyword(keyWord))
-	} else {
-		sql = `SELECT * FROM knowledge_classify WHERE parent_id=? ORDER BY create_time ASC `
-	}
-	pars = append(pars, parentId)
-	//o := orm.NewOrmUsingDB("rddp")
-	//_, err = o.Raw(sql, pars...).QueryRows(&items)
-	err = global.DmSQL["rddp"].Raw(sql, pars...).Find(&items).Error
-	return
-}
-
-func (k *KnowledgeClassify) GetClassifyChildByParentIds(parentId []int, keyWord string, enabled int) (items []*KnowledgeClassify, err error) {
-	parentIdLen := len(parentId)
-	if parentIdLen == 0 {
-		return
-	}
-
-	sql := ``
-	pars := make([]interface{}, 0)
-	pars = append(pars, parentId)
-	if keyWord != "" {
-		sql = `SELECT * FROM knowledge_classify WHERE parent_id IN (` + utils.GetOrmInReplace(parentIdLen) + `) AND classify_name LIKE ? `
-		pars = append(pars, utils.GetLikeKeyword(keyWord))
-	} else {
-		sql = `SELECT * FROM knowledge_classify WHERE parent_id IN (` + utils.GetOrmInReplace(parentIdLen) + `) `
-	}
-
-	if enabled == 1 {
-		sql += ` AND enabled=1 `
-	}
-	sql += ` ORDER BY create_time ASC `
-	//o := orm.NewOrmUsingDB("rddp")
-	//_, err = o.Raw(sql, pars...).QueryRows(&items)
-	err = global.DmSQL["rddp"].Raw(sql, pars...).Find(&items).Error
-	return
-}
-
 // EditClassifyPermissionReq 编辑分类权限请求
 type EditClassifyPermissionReq struct {
 	ClassifyId            int   `description:"分类ID"`
@@ -236,28 +133,22 @@ type EditClassifyPermissionReq struct {
 
 // GetAllClassify 获取所有分类
 func (k *KnowledgeClassify) GetAllClassify() (list []*KnowledgeClassify, err error) {
-	//o := orm.NewOrmUsingDB("rddp")
-	//sql := ` SELECT * FROM classify `
-	//_, err = o.Raw(sql).QueryRows(&list)
-	sql := ` SELECT * FROM knowledge_classify `
+	sql := ` SELECT * FROM %s `
+	sql = fmt.Sprintf(sql, k.TableName())
 	err = global.DmSQL["rddp"].Raw(sql).Find(&list).Error
 	return
 }
 
 // GetClassifyByKeyword 名称获取分类
 func (k *KnowledgeClassify) GetClassifyByKeyword(keyword string) (item *KnowledgeClassify, err error) {
-	//o := orm.NewOrmUsingDB("rddp")
-	//sql := ` SELECT * FROM knowledge_classify WHERE classify_name = ? LIMIT 1 `
-	//err = o.Raw(sql, keyword).QueryRow(&item)
-	sql := ` SELECT * FROM knowledge_classify WHERE classify_name = ? LIMIT 1 `
+	sql := ` SELECT * FROM %s WHERE classify_name = ? LIMIT 1 `
+	sql = fmt.Sprintf(sql, k.TableName())
 	err = global.DmSQL["rddp"].Raw(sql, keyword).Find(&item).Error
 	return
 }
 
 // UpdateClassify 更新分类
 func (k *KnowledgeClassify) Update(cols []string) (err error) {
-	//o := orm.NewOrmUsingDB("rddp")
-	//_, err = o.Update(classifyInfo, cols...)
 	err = global.DmSQL["rddp"].Select(cols).Updates(k).Error
 	return
 }
@@ -274,7 +165,7 @@ type SimpleClassifyList struct {
 // GetClassifyByCondition 获取分类列表
 func (k *KnowledgeClassify) GetClassifyByCondition(condition, orderRule string, pars []interface{}) (items []*SimpleClassifyList, err error) {
 
-	sql := `SELECT * FROM knowledge_classify WHERE 1 = 1 `
+	sql := `SELECT * FROM %s WHERE 1 = 1 `
 	if condition != `` {
 		sql += condition
 	}
@@ -283,19 +174,9 @@ func (k *KnowledgeClassify) GetClassifyByCondition(condition, orderRule string,
 		order = orderRule
 	}
 	sql += ` ORDER BY ` + order
-	//o := orm.NewOrmUsingDB("rddp")
-	//_, err = o.Raw(sql, pars).QueryRows(&items)
-	err = global.DmSQL["rddp"].Raw(sql, pars...).Find(&items).Error
-	return
-}
+	sql = fmt.Sprintf(sql, k.TableName())
 
-// UpdateChildClassifyRelateSetting 更新子分类关联设置
-func (k *KnowledgeClassify) UpdateChildClassifyRelateSetting(parentId, relateTel, relateVideo int) (err error) {
-	//o := orm.NewOrmUsingDB("rddp")
-	//sql := `UPDATE knowledge_classify SET relate_tel = ?, relate_video = ? WHERE parent_id = ?`
-	//_, err = o.Raw(sql, relateTel, relateVideo, parentId).Exec()
-	sql := `UPDATE knowledge_classify SET relate_tel = ?, relate_video = ? WHERE parent_id = ?`
-	err = global.DmSQL["rddp"].Exec(sql, relateTel, relateVideo, parentId).Error
+	err = global.DmSQL["rddp"].Raw(sql, pars...).Find(&items).Error
 	return
 }
 
@@ -309,39 +190,36 @@ type RelateTelSecClassifyWithPermissions struct {
 // UpdateClassifySortByParentId 根据父类id更新排序
 func (k *KnowledgeClassify) UpdateClassifySortByParentId(parentId, permissionId, nowSort int, updateSort string, resourceType int) (err error) {
 
-	sql := ` update knowledge_classify set sort = ` + updateSort + ` WHERE parent_id=? AND resource_type=? AND sort > ? `
+	sql := ` update %s set sort = ` + updateSort + ` WHERE parent_id=? AND resource_type=? AND sort > ? `
 	if permissionId > 0 {
 		sql += ` or ( classify_id > ` + fmt.Sprint(permissionId) + ` and sort = ` + fmt.Sprint(nowSort) + `)`
 	}
-	//o := orm.NewOrmUsingDB("rddp")
-	//_, err = o.Raw(sql, parentId, nowSort).Exec()
+
+	sql = fmt.Sprintf(sql, k.TableName())
 	err = global.DmSQL["rddp"].Exec(sql, parentId, resourceType, nowSort).Error
 	return
 }
 
 // GetMaxSortByParentId 获取最大的排序值
 func (k *KnowledgeClassify) GetMaxSortByParentId(parentId int) (maxSort int, err error) {
-	//o := orm.NewOrmUsingDB("rddp")
-	//sql := `SELECT max(sort) AS sort FROM knowledge_classify WHERE parent_id = ? `
-	//err = o.Raw(sql, parentId).QueryRow(&maxSort)
-	sql := `SELECT COALESCE(MAX(sort),0) AS sort FROM knowledge_classify WHERE parent_id = ? `
+	sql := `SELECT COALESCE(MAX(sort),0) AS sort FROM %s WHERE parent_id = ? `
+	sql = fmt.Sprintf(sql, k.TableName())
 	err = global.DmSQL["rddp"].Raw(sql, parentId).Scan(&maxSort).Error
 	return
 }
 
 // GetMaxSort 获取最大的排序值
 func (k *KnowledgeClassify) GetMaxSort() (maxSort int, err error) {
-	//o := orm.NewOrmUsingDB("rddp")
-	//sql := `SELECT max(sort) AS sort FROM classify`
-	//err = o.Raw(sql).QueryRow(&maxSort)
-	sql := `SELECT COALESCE(MAX(sort),0) AS sort FROM knowledge_classify`
+	sql := `SELECT COALESCE(MAX(sort),0) AS sort FROM %s`
+	sql = fmt.Sprintf(sql, k.TableName())
 	err = global.DmSQL["rddp"].Raw(sql).Scan(&maxSort).Error
 	return
 }
 
 // GetFirstClassifyByParentId 获取当前父级分类下,且排序数相同 的排序第一条的数据
 func (k *KnowledgeClassify) GetFirstClassifyByParentId(parentId int) (item *KnowledgeClassify, err error) {
-	sql := `SELECT * FROM knowledge_classify WHERE parent_id = ? order by sort asc, classify_id asc limit 1`
+	sql := `SELECT * FROM %s WHERE parent_id = ? order by sort asc, classify_id asc limit 1`
+	sql = fmt.Sprintf(sql, k.TableName())
 	err = global.DmSQL["rddp"].Raw(sql, parentId).First(&item).Error
 	return
 }
@@ -357,28 +235,6 @@ type ClassifySetEnabledReq struct {
 	Enabled    int `description:"是否可用,1可用,0禁用"`
 }
 
-func (k *KnowledgeClassify) SetEnabled(id, enabled int) (err error) {
-	to := global.DmSQL["rddp"].Begin()
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	sql := ` UPDATE knowledge_classify SET enabled =?  WHERE classify_id = ?`
-	err = to.Exec(sql, enabled, id).Error
-	if err != nil {
-		return
-	}
-	sql = ` UPDATE knowledge_classify SET enabled =?  WHERE parent_id = ?`
-	err = to.Exec(sql, enabled, id).Error
-	if err != nil {
-		return
-	}
-	return
-}
-
 // GetCountClassifyChildByParentId
 // @Description: 获取父级分类下子分类数量
 // @author: Roc
@@ -387,9 +243,7 @@ func (k *KnowledgeClassify) SetEnabled(id, enabled int) (err error) {
 // @return total int
 // @return err error
 func (k *KnowledgeClassify) GetCountClassifyChildByParentId(parentId int) (total int, err error) {
-	//o := orm.NewOrmUsingDB("rddp")
-	//sql := `SELECT count(1) AS total FROM knowledge_classify WHERE parent_id = ? `
-	//err = o.Raw(sql, parentId).QueryRow(&total)
+
 	sql := fmt.Sprintf(`SELECT count(1) AS total FROM %s WHERE parent_id = ? `, k.TableName())
 	err = global.DmSQL["rddp"].Raw(sql, parentId).Scan(&total).Error
 	return
@@ -407,7 +261,7 @@ func (k *KnowledgeClassify) GetClassifyListByKeyword(keyWord string, enabled int
 	sql := ``
 	pars := make([]interface{}, 0)
 
-	sql = `SELECT * FROM knowledge_classify WHERE 1=1 `
+	sql = `SELECT * FROM %s WHERE 1=1 `
 	if enabled == 1 {
 		sql += ` AND enabled = 1 `
 	}
@@ -417,9 +271,7 @@ func (k *KnowledgeClassify) GetClassifyListByKeyword(keyWord string, enabled int
 		pars = utils.GetLikeKeywordPars(pars, keyWord, 1)
 	}
 	sql += ` ORDER BY sort ASC, create_time ASC`
-
-	//o := orm.NewOrmUsingDB("rddp")
-	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	sql = fmt.Sprintf(sql, k.TableName())
 	err = global.DmSQL["rddp"].Raw(sql, pars...).Find(&items).Error
 	return
 }
@@ -437,33 +289,13 @@ func (k *KnowledgeClassify) GetClassifyListByParentIdList(parentClassifyIdList [
 	if num <= 0 {
 		return
 	}
-	sql := `SELECT * FROM knowledge_classify WHERE classify_id in (` + utils.GetOrmInReplace(num) + `) ORDER BY sort ASC, create_time ASC`
+	sql := `SELECT * FROM %s WHERE classify_id in (?) ORDER BY sort ASC, create_time ASC`
 
-	//o := orm.NewOrmUsingDB("rddp")
-	//_, err = o.Raw(sql, parentClassifyIdList).QueryRows(&items)
+	sql = fmt.Sprintf(sql, k.TableName())
 	err = global.DmSQL["rddp"].Raw(sql, parentClassifyIdList).Find(&items).Error
 	return
 }
 
-// GetClassifyListByIdList
-// @Description: 根据指标ID列表,获取分类列表
-// @author: Roc
-// @datetime 2024-06-27 15:23:57
-// @param classifyIdList []int
-// @return items []*KnowledgeClassify
-// @return err error
-func (k *KnowledgeClassify) GetClassifyListByIdList(classifyIdList []int) (items []*KnowledgeClassify, err error) {
-	num := len(classifyIdList)
-	if num <= 0 {
-		return
-	}
-	sql := `SELECT * FROM knowledge_classify WHERE classify_id IN (` + utils.GetOrmInReplace(num) + `) `
-	//o := orm.NewOrmUsingDB("rddp")
-	//_, err = o.Raw(sql, classifyIdList).QueryRows(&items)
-	err = global.DmSQL["rddp"].Raw(sql, classifyIdList).Find(&items).Error
-	return
-}
-
 type KnowledgeFullClassify struct {
 	KnowledgeClassify
 	ParentName string `gorm:"column:parent_name"`

+ 258 - 0
models/knowledge/knowledge_tag.go

@@ -0,0 +1,258 @@
+package knowledge
+
+import (
+	"eta_gn/eta_api/global"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+type KnowledgeTag struct {
+	TagId        int       `gorm:"primaryKey;autoIncrement;column:tag_id"`
+	TagName      string    `gorm:"column:tag_name;default:'';type:varchar(100);not null"`
+	TagType      int       `gorm:"column:tag_type;default:0;type:tinyint"`
+	Sort         int       `gorm:"column:sort;default:0;type:tinyint"`
+	ResourceType int       `gorm:"column:resource_type;default:0;not null;type:tinyint"`
+	CreateTime   time.Time `gorm:"column:create_time;default:CURRENT_TIMESTAMP"`
+	ModifyTime   time.Time `gorm:"column:modify_time;default:CURRENT_TIMESTAMP"`
+}
+
+func (m *KnowledgeTag) TableName() string {
+	return "knowledge_tag"
+}
+
+func (m *KnowledgeTag) GetPrimaryKey() string {
+	return "tag_id"
+}
+
+func (m *KnowledgeTag) GetTagByName(tagName string, resourceType int) (item *KnowledgeTag, err error) {
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE tag_name=?  AND resource_type=?`, m.TableName())
+	err = global.DmSQL["rddp"].Raw(sql, tagName, resourceType).First(&item).Error
+	return
+}
+
+func (m *KnowledgeTag) GetTagById(tagId int) (item *KnowledgeTag, err error) {
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s=? `, m.TableName(), m.GetPrimaryKey())
+	err = global.DmSQL["rddp"].Raw(sql, tagId).First(&item).Error
+	return
+}
+
+// 添加分类
+func (m *KnowledgeTag) Add(item *KnowledgeTag) (err error) {
+	err = global.DmSQL["rddp"].Create(item).Error
+	return
+}
+
+func (m *KnowledgeTag) GetTagSubCountByTagId(tagId int) (count int, err error) {
+
+	sql := `SELECT COUNT(1) as num FROM %s AS a
+        INNER JOIN knowledge_resource AS b ON a.tag_id=b.tag_id
+        WHERE a.parent_id=? `
+	err = global.DmSQL["rddp"].Raw(sql, tagId).First(&count).Error
+	return
+}
+
+// 删除分类
+func (m *KnowledgeTag) Delete(tagId int) (err error) {
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE tag_id =? `, m.TableName())
+	err = global.DmSQL["rddp"].Exec(sql, tagId).Error
+	if err != nil {
+		return
+	}
+	return
+}
+
+type KnowledgeTagItem struct {
+	KnowledgeTag
+}
+
+type KnowledgeTagListResp struct {
+	List []*KnowledgeTagItem
+}
+
+type TagAddReq struct {
+	TagName      string `description:"分类名称"`
+	ParentId     int    `description:"父级分类id,没有父级分类传0"`
+	ResourceType int    `description:"分类类型:0事件库,1政策库,2观点库,3知识库"`
+}
+
+type DeleteTagReq struct {
+	TagId int `description:"分类ID"`
+}
+
+type EditTagReq struct {
+	TagId int `description:"分类ID"`
+	TagAddReq
+}
+
+type FindByIdTagReq struct {
+	TagId int `description:"分类ID"`
+}
+
+// EditTagPermissionReq 编辑分类权限请求
+type EditTagPermissionReq struct {
+	TagId                 int   `description:"分类ID"`
+	ChartPermissionIdList []int `description:"权限id数组"`
+}
+
+// GetAllTag 获取所有分类
+func (m *KnowledgeTag) GetAllTag() (list []*KnowledgeTag, err error) {
+	//o := orm.NewOrmUsingDB("rddp")
+	//sql := ` SELECT * FROM Tag `
+	//_, err = o.Raw(sql).QueryRows(&list)
+	sql := fmt.Sprintf(` SELECT * FROM %s `, m.TableName())
+	err = global.DmSQL["rddp"].Raw(sql).Find(&list).Error
+	return
+}
+
+// GetTagByKeyword 名称获取分类
+func (m *KnowledgeTag) GetTagByKeyword(keyword string) (item *KnowledgeTag, err error) {
+	sql := ` SELECT * FROM %s WHERE tag_name = ? LIMIT 1 `
+	err = global.DmSQL["rddp"].Raw(sql, keyword).Find(&item).Error
+	return
+}
+
+// UpdateTag 更新分类
+func (m *KnowledgeTag) Update(cols []string) (err error) {
+	err = global.DmSQL["rddp"].Select(cols).Updates(m).Error
+	return
+}
+
+// SimpleTagList 简版分类列表
+type SimpleTagList struct {
+	Id       int    `description:"分类ID"`
+	TagName  string `description:"分类名称"`
+	ParentId int    `description:"父级ID"`
+	Sort     int    `description:"排序"`
+	Child    []*SimpleTagList
+}
+
+// GetTagByCondition 获取分类列表
+func (m *KnowledgeTag) GetTagByCondition(condition, orderRule string, pars []interface{}) (items []*SimpleTagList, err error) {
+
+	sql := `SELECT * FROM %s WHERE 1 = 1 `
+	if condition != `` {
+		sql += condition
+	}
+	order := `sort ASC, create_time ASC`
+	if orderRule != `` {
+		order = orderRule
+	}
+	sql += ` ORDER BY ` + order
+	sql = fmt.Sprintf(sql, m.TableName())
+	err = global.DmSQL["rddp"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+// RelateTelSecTagWithPermissions 关联了电话会的二级分类及权限
+type RelateTelSecTagWithPermissions struct {
+	Id                 int    `description:"分类ID"`
+	TagName            string `description:"分类名称"`
+	ChartPermissionIds string `description:"权限IDs"`
+}
+
+// UpdateTagSortByParentId 根据父类id更新排序
+func (m *KnowledgeTag) UpdateTagSortByParentId(permissionId, nowSort int, updateSort string, resourceType int) (err error) {
+
+	sql := ` update %s set sort = ` + updateSort + ` WHERE resource_type=? AND sort > ? `
+	if permissionId > 0 {
+		sql += ` or ( tag_id > ` + fmt.Sprint(permissionId) + ` and sort = ` + fmt.Sprint(nowSort) + `)`
+	}
+	sql = fmt.Sprintf(sql, m.TableName())
+	err = global.DmSQL["rddp"].Exec(sql, resourceType, nowSort).Error
+	return
+}
+
+// GetMaxSortByParentId 获取最大的排序值
+func (m *KnowledgeTag) GetMaxSortByParentId(parentId int) (maxSort int, err error) {
+	sql := `SELECT COALESCE(MAX(sort),0) AS sort FROM %s WHERE parent_id = ? `
+	sql = fmt.Sprintf(sql, m.TableName())
+	err = global.DmSQL["rddp"].Raw(sql, parentId).Scan(&maxSort).Error
+	return
+}
+
+// GetMaxSort 获取最大的排序值
+func (m *KnowledgeTag) GetMaxSort() (maxSort int, err error) {
+	sql := `SELECT COALESCE(MAX(sort),0) AS sort FROM %s`
+	sql = fmt.Sprintf(sql, m.TableName())
+	err = global.DmSQL["rddp"].Raw(sql).Scan(&maxSort).Error
+	return
+}
+
+// GetFirstTagByParentId 获取当前父级分类下,且排序数相同 的排序第一条的数据
+func (m *KnowledgeTag) GetFirstTag() (item *KnowledgeTag, err error) {
+	sql := `SELECT * FROM %s order by sort asc, tag_id asc limit 1`
+	sql = fmt.Sprintf(sql, m.TableName())
+	err = global.DmSQL["rddp"].Raw(sql).First(&item).Error
+	return
+}
+
+type TagMoveReq struct {
+	TagId     int `description:"分类ID"`
+	PrevTagId int `description:"上一个兄弟节点分类id"`
+	NextTagId int `description:"下一个兄弟节点分类id"`
+}
+
+type TagSetEnabledReq struct {
+	TagId   int `description:"分类ID"`
+	Enabled int `description:"是否可用,1可用,0禁用"`
+}
+
+// GetCountTagChildByParentId
+// @Description: 获取父级分类下子分类数量
+// @author: Roc
+// @datetime 2024-06-17 10:58:46
+// @param parentId int
+// @return total int
+// @return err error
+func (m *KnowledgeTag) GetCountTagChildByParentId(parentId int) (total int, err error) {
+	sql := fmt.Sprintf(`SELECT count(1) AS total FROM %s WHERE parent_id = ? `, m.TableName())
+	err = global.DmSQL["rddp"].Raw(sql, parentId).Scan(&total).Error
+	return
+}
+
+// GetTagListByKeyword
+// @Description: 获取分类列表
+// @author: Roc
+// @datetime 2024-06-19 09:49:33
+// @param keyWord string
+// @param enabled int
+// @return items []*KnowledgeTagList
+// @return err error
+func (m *KnowledgeTag) GetTagListByKeyword(keyWord string) (items []*KnowledgeTagItem, err error) {
+	sql := ``
+	pars := make([]interface{}, 0)
+
+	sql = `SELECT * FROM %s WHERE 1=1 `
+
+	if keyWord != `` {
+		sql += ` AND tag_name LIKE ? `
+		pars = utils.GetLikeKeywordPars(pars, keyWord, 1)
+	}
+	sql += ` ORDER BY sort ASC, create_time ASC`
+
+	sql = fmt.Sprintf(sql, m.TableName())
+	err = global.DmSQL["rddp"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+func (m *KnowledgeTag) GetTagListByParentIdList(parentTagIdList []int) (items []*KnowledgeTagItem, err error) {
+	num := len(parentTagIdList)
+	if num <= 0 {
+		return
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE tag_id in (?) ORDER BY sort ASC, create_time ASC`, m.TableName())
+
+	err = global.DmSQL["rddp"].Raw(sql, parentTagIdList).Find(&items).Error
+	return
+}
+
+func (m *KnowledgeTag) GetTagListByIdList(tagIdList []int) (items []*KnowledgeTag, err error) {
+	num := len(tagIdList)
+	if num <= 0 {
+		return
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE tag_id IN (?)`, m.TableName())
+	err = global.DmSQL["rddp"].Raw(sql, tagIdList).Find(&items).Error
+	return
+}

+ 0 - 9
models/knowledge/knowledge_tags.go

@@ -1,9 +0,0 @@
-package knowledge
-
-type KnowledgeTags struct {
-	TagsId       int    `gorm:"primaryKey;autoIncrement;column:tags_id"`
-	TagsName     string `gorm:"column:tags_name;default:'';type:varchar(100);not null"`
-	TagsType     int    `gorm:"column:tags_type;default:0;type:tinyint"`
-	Sort         int    `gorm:"column:sort;default:0;type:tinyint"`
-	ResourceType int    `gorm:"column:resource_type;default:0;not null;type:tinyint"`
-}

+ 45 - 0
routers/commentsRouter.go

@@ -8602,6 +8602,51 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeTagController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeTagController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/tag/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeTagController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeTagController"],
+        beego.ControllerComments{
+            Method: "Delete",
+            Router: `/tag/delete`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeTagController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeTagController"],
+        beego.ControllerComments{
+            Method: "Edit",
+            Router: `/tag/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeTagController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeTagController"],
+        beego.ControllerComments{
+            Method: "ListTag",
+            Router: `/tag/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeTagController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:KnowledgeTagController"],
+        beego.ControllerComments{
+            Method: "Move",
+            Router: `/tag/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers:MeetingProbabilitiesController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:MeetingProbabilitiesController"],
         beego.ControllerComments{
             Method: "Detail",

+ 1 - 0
routers/router.go

@@ -391,6 +391,7 @@ func init() {
 			web.NSInclude(
 				&controllers.KnowledgeClassifyController{},
 				&controllers.KnowledgeResourceController{},
+				&controllers.KnowledgeTagController{},
 			),
 		),
 	)

+ 248 - 0
services/knowledge/tag.go

@@ -0,0 +1,248 @@
+package knowledge
+
+import (
+	"errors"
+	"eta_gn/eta_api/models/knowledge"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+// MoveKnowledgeTag 移动标签
+func MoveKnowledgeTag(req knowledge.TagMoveReq) (err error, errMsg string) {
+	knowledgeObj := new(knowledge.KnowledgeTag)
+	TagId := req.TagId
+	prevTagId := req.PrevTagId
+	nextTagId := req.NextTagId
+
+	//如果有传入 上一个兄弟节点标签id
+	var (
+		TagInfo *knowledge.KnowledgeTag
+		prevTag *knowledge.KnowledgeTag
+		nextTag *knowledge.KnowledgeTag
+
+		prevSort int
+		nextSort int
+	)
+
+	// 移动对象为标签, 判断权限
+	TagInfo, err = knowledgeObj.GetTagById(TagId)
+	if err != nil {
+		if utils.IsErrNoRow(err) {
+			errMsg = "标签不存在, 请刷新页面"
+			err = fmt.Errorf("获取标签信息失败,Err:" + err.Error())
+			return
+		}
+		errMsg = "移动失败"
+		err = fmt.Errorf("获取标签信息失败,Err:" + err.Error())
+		return
+	} else if TagInfo.TagId == 0 {
+		errMsg = "标签不存在, 请刷新页面"
+		err = fmt.Errorf("获取标签信息失败,Err:" + err.Error())
+		return
+	}
+	if prevTagId > 0 {
+		prevTag, err = knowledgeObj.GetTagById(prevTagId)
+		if err != nil {
+			if utils.IsErrNoRow(err) {
+				errMsg = "上一个标签不存在, 请刷新页面"
+				err = fmt.Errorf("获取标签信息失败,Err:" + err.Error())
+				return
+			}
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取上一个兄弟节点标签信息失败,Err:" + err.Error())
+			return
+		}
+		prevSort = prevTag.Sort
+	}
+
+	if nextTagId > 0 {
+		//下一个兄弟节点
+		nextTag, err = knowledgeObj.GetTagById(nextTagId)
+		if err != nil {
+			if utils.IsErrNoRow(err) {
+				errMsg = "下一个标签不存在, 请刷新页面"
+				err = fmt.Errorf("获取标签信息失败,Err:" + err.Error())
+				return
+			}
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取下一个兄弟节点标签信息失败,Err:" + err.Error())
+			return
+		}
+		nextSort = nextTag.Sort
+	}
+
+	err, errMsg = moveKnowledgeTag(TagInfo, prevTag, nextTag, prevSort, nextSort, TagInfo.ResourceType)
+	return
+}
+
+// moveKnowledgeTag 移动标签
+func moveKnowledgeTag(TagInfo, prevTag, nextTag *knowledge.KnowledgeTag, prevSort, nextSort, resourceType int) (err error, errMsg string) {
+	knowledgeObj := new(knowledge.KnowledgeTag)
+	updateCol := make([]string, 0)
+
+	if prevSort > 0 {
+		//如果是移动在两个兄弟节点之间
+		if nextSort > 0 {
+			//下一个兄弟节点
+			//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
+			if prevSort == nextSort || prevSort == TagInfo.Sort {
+				//变更兄弟节点的排序
+				updateSortStr := `sort + 2`
+
+				//变更标签
+				if prevTag != nil {
+					_ = knowledgeObj.UpdateTagSortByParentId(prevTag.TagId, prevTag.Sort, updateSortStr, resourceType)
+				} else {
+					_ = knowledgeObj.UpdateTagSortByParentId(0, prevSort, updateSortStr, resourceType)
+				}
+
+			} else {
+				//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
+				if nextSort-prevSort == 1 {
+					//变更兄弟节点的排序
+					updateSortStr := `sort + 1`
+
+					//变更标签
+					if prevTag != nil {
+						_ = knowledgeObj.UpdateTagSortByParentId(prevTag.TagId, prevSort, updateSortStr, resourceType)
+					} else {
+						_ = knowledgeObj.UpdateTagSortByParentId(0, prevSort, updateSortStr, resourceType)
+					}
+
+				}
+			}
+		}
+
+		TagInfo.Sort = prevSort + 1
+		TagInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	} else {
+		// 拖动到父级标签的第一位
+		firstPermission, tmpErr := knowledgeObj.GetFirstTag()
+		if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取获取当前父级标签下的排序第一条的标签信息失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		//如果该标签下存在其他标签,且第一个其他标签的排序等于0,那么需要调整排序
+		if firstPermission != nil && firstPermission.TagId != 0 && firstPermission.Sort == 0 {
+			updateSortStr := ` sort + 1 `
+			_ = knowledgeObj.UpdateTagSortByParentId(firstPermission.TagId-1, 0, updateSortStr, resourceType)
+		}
+
+		TagInfo.Sort = 0 //那就是排在第一位
+		TagInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	}
+
+	//更新
+	if len(updateCol) > 0 {
+		err = TagInfo.Update(updateCol)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("修改失败,Err:" + err.Error())
+			return
+		}
+	}
+	return
+}
+
+// AddKnowledgeTag
+// @Description: 添加报告标签
+// @author: Roc
+// @datetime 2024-06-17 11:01:21
+// @param TagName string
+// @param parentId int
+// @param chartPermissionIdList []int
+// @return err error
+// @return errMsg string
+// @return isSendEmail bool
+func AddKnowledgeTag(TagName string, resourceType int) (err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+	errMsg = `添加失败`
+	knowledgeObj := new(knowledge.KnowledgeTag)
+	_, err = knowledgeObj.GetTagByName(TagName, resourceType)
+	if err != nil && !utils.IsErrNoRow(err) {
+		errMsg = "获取标签信息失败"
+		return
+	}
+
+	if err == nil {
+		errMsg = "标签名称:" + TagName + "已存在"
+		isSendEmail = false
+		err = errors.New(errMsg)
+		return
+	} else {
+		err = nil
+	}
+
+	nowTime := time.Now().Local()
+	tag := new(knowledge.KnowledgeTag)
+
+	maxSort, err := tag.GetMaxSort()
+	if err != nil {
+		errMsg = "操作失败"
+		err = errors.New("查询品种排序失败, Err: " + err.Error())
+		return
+	}
+	tag.TagName = TagName
+	tag.CreateTime = nowTime
+	tag.ModifyTime = nowTime
+	tag.Sort = maxSort + 1
+	tag.ResourceType = resourceType
+
+	err = knowledgeObj.Add(tag)
+	if err != nil {
+		return
+	}
+	fmt.Println("tag.TagId:")
+	fmt.Println(tag.TagId)
+	return
+}
+
+func EditKnowledgeTag(TagId, parentId int, TagName string) (err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+	errMsg = `修改失败`
+	knowledgeObj := new(knowledge.KnowledgeTag)
+	item, err := knowledgeObj.GetTagById(TagId)
+	if err != nil {
+		errMsg = "获取标签信息失败"
+		if utils.IsErrNoRow(err) {
+			errMsg = "标签不存在, 或已被删除"
+			isSendEmail = false
+		}
+		return
+	}
+
+	//originName := item.TagName
+
+	// 重名校验
+	existName, e := knowledgeObj.GetTagByName(TagName, item.ResourceType)
+	if e != nil && !utils.IsErrNoRow(e) {
+		errMsg = "标签名称已存在"
+		err = errors.New("获取重名标签失败, Err: " + err.Error())
+		return
+	}
+	if existName != nil && existName.TagId > 0 && existName.TagId != item.TagId {
+		errMsg = "标签名称:" + TagName + "已存在"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	item.TagName = TagName
+
+	// ETA1.8.3:不允许修改上级标签  2024-6-17 13:21:01
+	//
+	// todo 修改父级,修改level,只允许修改同级别
+	item.ModifyTime = time.Now().Local()
+	cols := make([]string, 0)
+	cols = append(cols, "TagName", "ModifyTime")
+	err = item.Update(cols)
+	if err != nil {
+		return
+	}
+
+	return
+}