فهرست منبع

Merge branch 'bzq1/report_classify_delete' of eta_server/eta_api into master

baoziqiang 3 ماه پیش
والد
کامیت
051d94ff13

+ 46 - 5
controllers/classify.go

@@ -204,10 +204,6 @@ func (this *ClassifyController) Delete() {
 		return
 	}
 
-	br.Msg = "报告分类不允许删除"
-	br.IsSendEmail = false
-	return
-
 	item, err := models.GetClassifyById(req.ClassifyId)
 	if err != nil {
 		br.Msg = "获取信息失败"
@@ -218,7 +214,46 @@ func (this *ClassifyController) Delete() {
 		br.Msg = "分类不存在"
 		return
 	}
-	err = models.DeleteClassify(req.ClassifyId)
+	classifyList := &models.ClassifyList{Id: item.Id}
+	err = services.MarkEnableDeleteClassify([]*models.ClassifyList{classifyList})
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "标记失败,Err:" + err.Error()
+		return
+	}
+	if classifyList.IsEnableDelete == 0 {
+		br.Msg = "该分类有关联报告或审批流,不允许删除"
+		return
+	}
+
+	var childClassifyIds []int
+	if item.HasChild == 1 {
+		// 获取所有子分类
+		subClassifyMap := make(map[int][]int)
+		allClassify, err := models.GetAllClassifyWithDesc()
+		if err != nil {
+			br.Msg = "删除失败"
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			return
+		}
+		for _, classify := range allClassify {
+			v, ok := subClassifyMap[classify.Id]
+			if !ok {
+				subClassifyMap[classify.Id] = []int{}
+			}
+			pv, pok := subClassifyMap[classify.ParentId]
+			if pok {
+				subClassifyMap[classify.ParentId] = append(pv, classify.Id)
+			} else {
+				subClassifyMap[classify.ParentId] = []int{classify.Id}
+			}
+			if ok {
+				subClassifyMap[classify.ParentId] = append(subClassifyMap[classify.ParentId], v...)
+			}
+		}
+		childClassifyIds = subClassifyMap[item.Id]
+	}
+	err = item.Delete(childClassifyIds)
 	if err != nil {
 		br.Msg = "删除失败"
 		br.ErrMsg = "删除失败,Err:" + err.Error()
@@ -505,6 +540,12 @@ func (this *ClassifyController) ListClassify() {
 		}
 	}
 
+	err = services.MarkEnableDeleteClassify(list)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "标记可删除分类失败,Err:" + err.Error()
+		return
+	}
 	// 先将分类列表排序
 	services.SortClassifyListBySortAndCreateTime(list)
 	// 接着转换结构

+ 22 - 13
controllers/english_report/english_classify.go

@@ -79,6 +79,7 @@ func (this *EnglishReportController) ListClassify() {
 	// 三级分类-品种权限
 	permissionMap := make(map[int][]int)
 
+	var secondClassify []*models.EnglishClassifyList
 	if len(idList) > 0 {
 		childIdMap := make(map[int]struct{}, 0)
 		for _, v := range idList {
@@ -97,6 +98,7 @@ func (this *EnglishReportController) ListClassify() {
 			br.ErrMsg = "获取二级分类失败,Err:" + err.Error()
 			return
 		}
+		secondClassify = tmpList
 		for _, v := range tmpList {
 			if _, ok := rootMap[v.ParentId]; !ok {
 				thirdIds = append(thirdIds, v.Id)
@@ -145,6 +147,13 @@ func (this *EnglishReportController) ListClassify() {
 			}
 		}
 	}
+	// 标记可删除的英文分类
+	err = services.MarkEnableDeleteEnlishClassify(rootList, secondClassify)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "标记可删除分类失败,Err:" + err.Error()
+		return
+	}
 
 	//处理一级分类
 	var sortList models.RSClassifyList
@@ -483,18 +492,18 @@ func (this *EnglishReportController) DelClassify() {
 		return
 	}
 
-	count, err := models.GetEnglishClassifyChildCounts(classifyId)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取信息失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
+	// count, err := models.GetEnglishClassifyChildCounts(classifyId)
+	// if err != nil && err.Error() != utils.ErrNoRow() {
+	// 	br.Msg = "获取信息失败"
+	// 	br.ErrMsg = "获取失败,Err:" + err.Error()
+	// 	return
+	// }
 
-	if count > 0 {
-		br.Msg = "请先删除该分类下关联分类"
-		br.Ret = 403
-		return
-	}
+	// if count > 0 {
+	// 	br.Msg = "请先删除该分类下关联分类"
+	// 	br.Ret = 403
+	// 	return
+	// }
 	reportCount, e := models.GetEnglishReportCounts(classifyId, classifyInfo.ParentId)
 	if e != nil && e.Error() != utils.ErrNoRow() {
 		br.Msg = "获取信息失败"
@@ -536,8 +545,8 @@ func (this *EnglishReportController) DelClassify() {
 		br.Ret = 403
 		return
 	}
-
-	if err = models.DeleteEnglishClassify(classifyId); err != nil {
+	err = classifyInfo.Delete()
+	if err != nil {
 		br.Msg = "删除失败"
 		br.ErrMsg = "删除报告失败, Err: " + err.Error()
 		return

+ 60 - 1
models/classify.go

@@ -3,9 +3,10 @@ package models
 import (
 	"eta/eta_api/utils"
 	"fmt"
+	"time"
+
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
-	"time"
 )
 
 type Classify struct {
@@ -90,6 +91,55 @@ type ClassifyAddReq struct {
 	RelateVideo           int                    `description:"是否在路演视频中可选: 0-否; 1-是"`*/
 }
 
+func (c *Classify) Delete(childIds []int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	tx, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+	// 删除自身
+	_, err = tx.Delete(c)
+	if err != nil {
+		return
+	}
+	// 删除子分类
+	if len(childIds) > 0 {
+		sql := `DELETE FROM classify WHERE id IN (` + utils.GetOrmInReplace(len(childIds)) + `)`
+		_, err = tx.Raw(sql, childIds).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	// 检查是否需要更新父类
+	if c.ParentId > 0 {
+		var count int
+		sql := `SELECT COUNT(*) FROM classify WHERE parent_id=? `
+		err = tx.Raw(sql, c.ParentId).QueryRow(&count)
+		if err != nil {
+			return
+		}
+		if count == 0 {
+			sql = `UPDATE classify SET has_child=0 WHERE id=? `
+			_, err = tx.Raw(sql, c.ParentId).Exec()
+			if err != nil {
+				return
+			}
+		}
+	}
+
+	deleteImgSql := `DELETE FROM banner WHERE classify_id=? `
+	_, err = tx.Raw(deleteImgSql, c.Id).Exec()
+	return
+}
+
 func GetClassifyByName(classifyName string, parentId int) (item *Classify, err error) {
 	sql := `SELECT * FROM classify WHERE classify_name=? AND parent_id=? `
 	o := orm.NewOrmUsingDB("rddp")
@@ -216,6 +266,7 @@ type ClassifyList struct {
 	ChartPermissionIdList []int `description:"绑定的权限ID"`
 	Level                 int   `description:"层级"`
 	HasChild              int   `description:"是否有子级别,0:下面没有子分类,1:下面有子分类;默认:0"`
+	IsEnableDelete        int   `description:"是否允许删除: 0-否; 1-是"`
 }
 
 type ClassifyItem struct {
@@ -376,6 +427,14 @@ func GetAllClassify() (list []*Classify, err error) {
 	return
 }
 
+// GetAllClassifyWithDesc 获取所有倒序分类
+func GetAllClassifyWithDesc() (list []*Classify, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` SELECT * FROM classify ORDER BY id DESC `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
 // GetClassifyByKeyword 名称获取分类
 func GetClassifyByKeyword(keyword string) (item Classify, err error) {
 	o := orm.NewOrmUsingDB("rddp")

+ 51 - 3
models/english_report.go

@@ -429,9 +429,10 @@ type EnglishClassifyList struct {
 	ShowType      int       `description:"展示类型:1-列表 2-专栏"`
 	IsShow        int       `description:"是否在小程序显示:1-显示 0-隐藏"`
 	//ClassifyType  int       `description:"分类类型:0英文报告,1英文线上路演"`
-	EnPermissions []int `description:"英文权限IDs"`
-	Enabled       int   `description:"是否可用,1可用,0禁用"`
-	Child         []*EnglishClassifyList
+	EnPermissions  []int `description:"英文权限IDs"`
+	Enabled        int   `description:"是否可用,1可用,0禁用"`
+	IsEnableDelete int   `description:"是否允许删除: 1-允许 0-不允许"`
+	Child          []*EnglishClassifyList
 }
 
 type EnglishClassifyListResp struct {
@@ -545,6 +546,41 @@ type EnglishClassify struct {
 	Enabled int `description:"是否可用,1可用,0禁用"`
 }
 
+func (e *EnglishClassify) Delete() (err error) {
+	tx, err := orm.NewOrmUsingDB("rddp").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+	_, err = tx.Delete(e)
+	if err != nil {
+		return
+	}
+	if e.Id == e.RootId {
+		// 删除一级分类时,删除其下所有子分类
+		sql := `DELETE FROM english_classify WHERE root_id = ?`
+		_, err = tx.Raw(sql, e.Id).Exec()
+		if err != nil {
+			return
+		}
+	}
+	if e.ParentId == e.RootId {
+		// 删除二级分类时,更新其父级分类的子分类数量
+		sql := `DELETE FROM english_classify WHERE id = ? OR parent_id = ?`
+		_, err = tx.Raw(sql, e.Id, e.ParentId).Exec()
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
 func AddEnglishClassify(item *EnglishClassify) (lastId int64, err error) {
 	o := orm.NewOrmUsingDB("rddp")
 	lastId, err = o.Insert(item)
@@ -1012,3 +1048,15 @@ func GetEnglishReportFieldsByIds(ids []int, fields []string) (items []*EnglishRe
 	_, err = o.Raw(sql, ids).QueryRows(&items)
 	return
 }
+
+func GetExistEnglishReportClassifyIdByClassifyIds(classifyIds []int) (existClassifyIds []*EnglishReport, err error) {
+	if len(classifyIds) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT classify_id_first, classify_id_second FROM english_report WHERE 1=1 `
+	sql += fmt.Sprintf(` AND (classify_id_first IN (%s) OR classify_id_second IN (%s))`, utils.GetOrmInReplace(len(classifyIds)), utils.GetOrmInReplace(len(classifyIds)))
+
+	_, err = o.Raw(sql, classifyIds, classifyIds).QueryRows(&existClassifyIds)
+	return
+}

+ 8 - 0
models/english_video.go

@@ -330,3 +330,11 @@ func GetEnglishVideoByIds(Ids []int, fieldArr []string) (list []*EnglishVideo, e
 	_, err = o.Raw(sql, Ids).QueryRows(&list)
 	return
 }
+
+// GetAllEnglishVideoClassify 获取路演视频分类列表
+func GetAllEnglishVideoClassify() (list []*EnglishVideo, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT classify_id_first, classify_id_second FROM english_video `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}

+ 15 - 2
models/report.go

@@ -4,10 +4,11 @@ import (
 	"errors"
 	"eta/eta_api/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"strings"
 	"time"
+
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 // 报告状态
@@ -1529,6 +1530,18 @@ func GetReportListByClassifyId(classifyId int) (items []*Report, err error) {
 	return items, err
 }
 
+func GetExistReportClassifyIdByClassifyIds(classifyIds []int) (existClassifyIds []*Report, err error) {
+	if len(classifyIds) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT classify_id_first, classify_id_second, classify_id_third FROM report WHERE 1=1 `
+	sql += fmt.Sprintf(` AND (classify_id_first IN (%s) OR classify_id_second IN (%s) OR classify_id_third IN (%s))`, utils.GetOrmInReplace(len(classifyIds)), utils.GetOrmInReplace(len(classifyIds)), utils.GetOrmInReplace(len(classifyIds)))
+
+	_, err = o.Raw(sql, classifyIds, classifyIds, classifyIds).QueryRows(&existClassifyIds)
+	return
+}
+
 // UpdateReportInfo 修改报告
 func UpdateReportInfo(reports *Report) (err error) {
 	o := orm.NewOrmUsingDB("rddp")

+ 66 - 1
services/classify.go

@@ -7,9 +7,10 @@ import (
 	"eta/eta_api/models/report_approve"
 	"eta/eta_api/utils"
 	"fmt"
-	"github.com/beego/beego/v2/core/logs"
 	"sort"
 	"time"
+
+	"github.com/beego/beego/v2/core/logs"
 )
 
 // MoveReportClassify 移动分类
@@ -835,6 +836,70 @@ func SortClassifyListBySortAndCreateTime(classifyList []*models.ClassifyList) {
 	sort.Sort(BySortAndCreateTime(classifyList))
 }
 
+// MarkEnableDeleteClassify 标记是否可以删除分类
+func MarkEnableDeleteClassify(classifyList []*models.ClassifyList) (err error) {
+	if len(classifyList) == 0 {
+		return
+	}
+	classifyIds := make([]int, 0)
+	for _, v := range classifyList {
+		classifyIds = append(classifyIds, v.Id)
+	}
+	// 检查是否有报告
+	reportList, err := models.GetExistReportClassifyIdByClassifyIds(classifyIds)
+	if err != nil {
+		return
+	}
+
+	// 查询该分类是否关联了审批流
+	flowOb := new(report_approve.ReportApproveFlow)
+	flowCond := fmt.Sprintf(` AND %s = ? AND ( %s IN (`+utils.GetOrmInReplace(len(classifyIds))+`) OR %s IN (`+utils.GetOrmInReplace(len(classifyIds))+`) OR %s IN (`+utils.GetOrmInReplace(len(classifyIds))+`))`,
+		report_approve.ReportApproveFlowCols.ReportType,
+		report_approve.ReportApproveFlowCols.ClassifyFirstId,
+		report_approve.ReportApproveFlowCols.ClassifySecondId,
+		report_approve.ReportApproveFlowCols.ClassifyThirdId,
+	)
+	flowPars := make([]interface{}, 0)
+	flowPars = append(flowPars, report_approve.FlowReportTypeChinese, classifyIds, classifyIds, classifyIds)
+	flowList, err := flowOb.GetItemsByCondition(flowCond, flowPars, []string{"classify_first_id", "classify_second_id", "classify_third_id"}, "")
+	if err != nil {
+		return
+	}
+
+	disableDeleteClassifyMap := make(map[int]struct{})
+	// 记录关联报告的分类
+	for _, v := range reportList {
+		if v.ClassifyIdFirst > 0 {
+			disableDeleteClassifyMap[v.ClassifyIdFirst] = struct{}{}
+		}
+		if v.ClassifyIdSecond > 0 {
+			disableDeleteClassifyMap[v.ClassifyIdSecond] = struct{}{}
+		}
+		if v.ClassifyIdThird > 0 {
+			disableDeleteClassifyMap[v.ClassifyIdThird] = struct{}{}
+		}
+	}
+	// 记录关联审批流的分类
+	for _, v := range flowList {
+		if v.ClassifyFirstId > 0 {
+			disableDeleteClassifyMap[v.ClassifyFirstId] = struct{}{}
+		}
+		if v.ClassifySecondId > 0 {
+			disableDeleteClassifyMap[v.ClassifySecondId] = struct{}{}
+		}
+		if v.ClassifyThirdId > 0 {
+			disableDeleteClassifyMap[v.ClassifyThirdId] = struct{}{}
+		}
+	}
+	for _, v := range classifyList {
+		if _, ok := disableDeleteClassifyMap[v.Id]; !ok {
+			v.IsEnableDelete = 1
+		}
+	}
+
+	return
+}
+
 // DealBug6445 处理禅道bug6445,对数据进行补偿刷新
 func DealBug6445() error {
 	var condition string

+ 86 - 0
services/english_classify.go

@@ -2,6 +2,7 @@ package services
 
 import (
 	"eta/eta_api/models"
+	"eta/eta_api/models/report_approve"
 	"eta/eta_api/utils"
 	"fmt"
 	"time"
@@ -167,3 +168,88 @@ func moveEnglishReportClassify(classifyInfo, prevClassify, nextClassify *models.
 	}
 	return
 }
+
+func MarkEnableDeleteEnlishClassify(rootClassifyList, childClassifyList []*models.EnglishClassifyList) (err error) {
+	if len(rootClassifyList) == 0 && len(childClassifyList) == 0 {
+		return
+	}
+
+	// 合并分类列表
+	allClassifyList := append(rootClassifyList, childClassifyList...)
+
+	classifyIds := make([]int, len(allClassifyList))
+	rootClassifyMap := make(map[int]*models.EnglishClassifyList)
+
+	for i, v := range allClassifyList {
+		classifyIds[i] = v.Id
+		if v.RootId == v.Id {
+			rootClassifyMap[v.Id] = v
+		}
+	}
+	// 检查是否有报告
+	reportList, err := models.GetExistEnglishReportClassifyIdByClassifyIds(classifyIds)
+	if err != nil {
+		return
+	}
+
+	// 查询该分类是否关联了审批流
+	flowOb := new(report_approve.ReportApproveFlow)
+	flowCond := fmt.Sprintf(` AND %s = ? `, report_approve.ReportApproveFlowCols.ReportType)
+	flowPars := make([]interface{}, 0)
+	flowPars = append(flowPars, report_approve.FlowReportTypeEnglish)
+	flowList, err := flowOb.GetItemsByCondition(flowCond, flowPars, []string{"classify_first_id", "classify_second_id", "classify_third_id"}, "")
+	if err != nil {
+		return
+	}
+
+	// 查询路演视频分类
+	videoClassify, err := models.GetAllEnglishVideoClassify()
+	if err != nil {
+		return
+	}
+
+	disableDeleteClassifyMap := make(map[int]struct{})
+	// 记录关联报告的分类
+	for _, v := range reportList {
+		if v.ClassifyIdFirst > 0 {
+			disableDeleteClassifyMap[v.ClassifyIdFirst] = struct{}{}
+		}
+		if v.ClassifyIdSecond > 0 {
+			disableDeleteClassifyMap[v.ClassifyIdSecond] = struct{}{}
+		}
+	}
+	// 记录关联审批流的分类
+	for _, v := range flowList {
+		if v.ClassifyFirstId > 0 {
+			disableDeleteClassifyMap[v.ClassifyFirstId] = struct{}{}
+		}
+		if v.ClassifySecondId > 0 {
+			disableDeleteClassifyMap[v.ClassifySecondId] = struct{}{}
+		}
+		if v.ClassifyThirdId > 0 {
+			disableDeleteClassifyMap[v.ClassifyThirdId] = struct{}{}
+		}
+	}
+	for _, v := range videoClassify {
+		if v.ClassifyIdFirst > 0 {
+			disableDeleteClassifyMap[v.Id] = struct{}{}
+		}
+		if v.ClassifyIdSecond > 0 {
+			disableDeleteClassifyMap[v.Id] = struct{}{}
+		}
+	}
+	markedClassifyMap := make(map[int]struct{})
+	for _, v := range allClassifyList {
+		if _, ok := markedClassifyMap[v.Id]; ok {
+			continue
+		}
+		if _, ok := disableDeleteClassifyMap[v.Id]; !ok {
+			v.IsEnableDelete = 1
+		} else {
+			rootClassifyMap[v.RootId].IsEnableDelete = 0
+			markedClassifyMap[v.RootId] = struct{}{}
+		}
+		markedClassifyMap[v.Id] = struct{}{}
+	}
+	return
+}