Jelajahi Sumber

Merge branch 'feature/eta1.1.7' of eta_server/eta_api into master

xyxie 1 tahun lalu
induk
melakukan
40f542404a

+ 12 - 2
controllers/english_report/email.go

@@ -588,7 +588,12 @@ func (this *EnglishReportEmailController) Send() {
 		br.Msg = "无权操作"
 		return
 	}
-
+	noCompanyIdsMap := make(map[int]struct{})
+	if len(req.NoCompanyIds) > 0 {
+		for _, v := range req.NoCompanyIds {
+			noCompanyIdsMap[v] = struct{}{}
+		}
+	}
 	// 指定品种的客户
 	sendCompanyIds := make([]int, 0)
 	if len(req.EnPermissions) > 0 {
@@ -598,8 +603,13 @@ func (this *EnglishReportEmailController) Send() {
 			br.ErrMsg = "获取指定品种的客户IDs失败, Err: " + e.Error()
 			return
 		}
-		sendCompanyIds = companyIds
+		for _, v := range companyIds {
+			if _, ok := noCompanyIdsMap[v]; !ok {
+				sendCompanyIds = append(sendCompanyIds, v)
+			}
+		}
 	}
+
 	// 指定收件人列表
 	sendEmailIds := make([]int, 0)
 	if req.EmailIds != "" {

+ 252 - 105
controllers/english_report/english_classify.go

@@ -2,12 +2,12 @@ package english_report
 
 import (
 	"encoding/json"
-	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"eta/eta_api/controllers"
 	"eta/eta_api/models"
 	"eta/eta_api/services"
 	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"sort"
 	"time"
 )
@@ -35,7 +35,6 @@ func (this *EnglishReportController) ListClassify() {
 	pageSize, _ := this.GetInt("PageSize")
 	currentIndex, _ := this.GetInt("CurrentIndex")
 	keyWord := this.GetString("KeyWord")
-	classifyType, _ := this.GetInt("ClassifyType", 0)
 
 	var startSize int
 	if pageSize <= 0 {
@@ -50,13 +49,21 @@ func (this *EnglishReportController) ListClassify() {
 	page := paging.GetPaging(currentIndex, pageSize, 0)
 	resp := new(models.EnglishClassifyListResp)
 
-	list, err := models.GetEnglishClassifyList(startSize, pageSize, keyWord, classifyType)
+	// 处理一级分类分页的情况
+	rootList, err := models.GetEnglishClassifyRootId(startSize, pageSize, keyWord)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-	total, err := models.GetEnglishClassifyListCount(keyWord, classifyType)
+	var ids []int
+	var rootIds []int
+	rootMap := make(map[int]struct{}, 0)
+	for _, v := range rootList {
+		rootIds = append(rootIds, v.Id)
+		rootMap[v.Id] = struct{}{}
+	}
+	total, err := models.GetEnglishClassifyListCount(keyWord)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -72,65 +79,102 @@ func (this *EnglishReportController) ListClassify() {
 		br.Msg = "获取成功"
 		return
 	}
-	var parentIds []int
-	for _, v := range list {
-		parentIds = append(parentIds, v.Id)
-	}
+	page = paging.GetPaging(currentIndex, pageSize, total)
 
-	childMap := make(map[int][]*models.EnglishClassifyList)
-	tmpList, err := models.GetEnglishClassifyChildByParentIds(parentIds, keyWord, classifyType)
+	//获取相关的分类ID
+	idList, err := models.GetEnglishClassifyListByRootId(rootIds, keyWord)
 	if err != nil {
-		br.Msg = "获取二级分类失败"
-		br.ErrMsg = "获取二级分类失败,Err:" + err.Error()
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-
-	// 二级分类-品种权限
+	secondListMap := make(map[int][]*models.EnglishClassifyList)
+	thirdListMap := make(map[int][]*models.EnglishClassifyList)
+	var thirdIds []int
+	var sortChildList models.RSChildClassifyList
+	// 三级分类-品种权限
 	permissionMap := make(map[int][]int)
-	{
-		classifyIds := make([]int, 0)
+
+	if len(idList) > 0 {
+		childIdMap := make(map[int]struct{}, 0)
+		for _, v := range idList {
+			if _, ok := childIdMap[v.ParentId]; !ok {
+				ids = append(ids, v.ParentId)
+				childIdMap[v.ParentId] = struct{}{}
+			}
+			if _, ok := childIdMap[v.Id]; !ok {
+				ids = append(ids, v.Id)
+				childIdMap[v.Id] = struct{}{}
+			}
+		}
+		tmpList, err := models.GetEnglishClassifyChildByIds(ids)
+		if err != nil {
+			br.Msg = "获取二级分类失败"
+			br.ErrMsg = "获取二级分类失败,Err:" + err.Error()
+			return
+		}
 		for _, v := range tmpList {
-			classifyIds = append(classifyIds, v.Id)
+			if _, ok := rootMap[v.ParentId]; !ok {
+				thirdIds = append(thirdIds, v.Id)
+			}
 		}
-		if len(classifyIds) > 0 {
-			cond := fmt.Sprintf(` AND %s IN (%s)`, models.EnClassifyPermissionColumns.EnClassifyId, utils.GetOrmInReplace(len(classifyIds)))
-			pars := make([]interface{}, 0)
-			pars = append(pars, classifyIds)
-			ob := new(models.EnClassifyPermission)
-			items, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
-			if e != nil {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取客户权限列表失败, Err: " + e.Error()
-				return
+		{
+			classifyIds := thirdIds
+			if len(classifyIds) > 0 {
+				cond := fmt.Sprintf(` AND %s IN (%s)`, models.EnClassifyPermissionColumns.EnClassifyId, utils.GetOrmInReplace(len(classifyIds)))
+				pars := make([]interface{}, 0)
+				pars = append(pars, classifyIds)
+				ob := new(models.EnClassifyPermission)
+				items, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
+				if e != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取客户权限列表失败, Err: " + e.Error()
+					return
+				}
+				for _, v := range items {
+					if permissionMap[v.EnClassifyId] == nil {
+						permissionMap[v.EnClassifyId] = make([]int, 0)
+					}
+					permissionMap[v.EnClassifyId] = append(permissionMap[v.EnClassifyId], v.EnPermissionId)
+				}
 			}
-			for _, v := range items {
-				if permissionMap[v.EnClassifyId] == nil {
-					permissionMap[v.EnClassifyId] = make([]int, 0)
+		}
+		// 处理三级分类
+		for _, v := range tmpList {
+			if _, ok := rootMap[v.ParentId]; !ok {
+				if p, ok1 := permissionMap[v.Id]; ok1 {
+					v.EnPermissions = p
 				}
-				permissionMap[v.EnClassifyId] = append(permissionMap[v.EnClassifyId], v.EnPermissionId)
+				thirdListMap[v.ParentId] = append(thirdListMap[v.ParentId], v)
 			}
 		}
-	}
 
-	for _, v := range tmpList {
-		v.EnPermissions = permissionMap[v.Id]
-		childMap[v.ParentId] = append(childMap[v.ParentId], v)
-	}
-	for _, v := range list {
-		if child, ok := childMap[v.Id]; ok {
-			v.Child = child
+		//处理二级分类
+		for _, v := range tmpList {
+			if _, ok := rootMap[v.ParentId]; ok {
+				if child, ok1 := thirdListMap[v.Id]; ok1 {
+					sortChildList = child
+					sort.Sort(sortChildList)
+					v.Child = sortChildList
+				}
+				secondListMap[v.ParentId] = append(secondListMap[v.ParentId], v)
+			}
 		}
 	}
+
+	//处理一级分类
 	var sortList models.RSClassifyList
-	sortList = list
+	for _, v := range rootList {
+		if child, ok := secondListMap[v.Id]; ok {
+			sortChildList = child
+			sort.Sort(sortChildList)
+			v.Child = sortChildList
+		}
+		sortList = append(sortList, v)
+	}
+
 	sort.Sort(sortList)
 
-	for _, item := range sortList {
-		var sortChildList models.RSChildClassifyList
-		sortChildList = item.Child
-		sort.Sort(sortChildList)
-		item.Child = sortChildList
-	}
 	resp.List = sortList
 	resp.Paging = page
 
@@ -155,19 +199,38 @@ func (this *EnglishReportController) AddClassify() {
 	}()
 	classifyName := this.GetString("ClassifyName")
 	parentId, _ := this.GetInt("ParentId")
-	classifyType, _ := this.GetInt("ClassifyType", 0)
 	sort, _ := this.GetInt("Sort")
 
+	// 查新父级分类是否存在
+	rootId := 0
+	if parentId > 0 {
+		parentClassify, err := models.GetEnglishReportClassifyById(parentId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				br.Msg = "上级分类不存在"
+				return
+			}
+			br.Msg = "查询上级分类信息失败"
+			br.ErrMsg = "查询上级分类信息失败,Err:" + err.Error()
+			return
+		}
+		if parentClassify.RootId == 0 {
+			rootId = parentClassify.Id
+		} else {
+			rootId = parentClassify.RootId
+		}
+	}
+
 	item := &models.EnglishClassify{
 		ClassifyName: classifyName,
 		Sort:         sort,
 		ParentId:     parentId,
+		RootId:       rootId,
 		CreateTime:   time.Now(),
 		ModifyTime:   time.Now(),
-		ClassifyType: classifyType,
 		IsShow:       1,
 	}
-	counts, err := models.GetEnglishClassifyCountsByName(classifyName, parentId, classifyType)
+	counts, err := models.GetEnglishClassifyCountsByName(classifyName, parentId)
 	if err != nil {
 		br.Msg = "查询失败"
 		br.ErrMsg = "查询失败,Err:" + err.Error()
@@ -178,12 +241,23 @@ func (this *EnglishReportController) AddClassify() {
 		br.ErrMsg = "该名称已存在!"
 		return
 	}
-	_, err = models.AddEnglishClassify(item)
+	var newId int64
+	newId, err = models.AddEnglishClassify(item)
 	if err != nil {
 		br.Msg = "保存失败"
 		br.ErrMsg = "保存失败,Err:" + err.Error()
 		return
 	}
+	if parentId == 0 { //一级目录的rootId等于自己本身
+		item.Id = int(newId)
+		item.RootId = int(newId)
+		err = item.UpdateEnglishClassify([]string{"RootId"})
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "保存失败,Err:" + err.Error()
+			return
+		}
+	}
 
 	br.Ret = 200
 	br.Success = true
@@ -223,26 +297,52 @@ func (this *EnglishReportController) EditClassify() {
 	}
 
 	oldItem, err := models.GetEnglishReportClassifyById(classifyId)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取信息失败"
-		br.ErrMsg = "获取信息失败,Err:" + err.Error()
-		return
-	}
-	parent, err := models.GetEnglishReportClassifyById(parentId)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "当前分类不存在"
+			return
+		}
 		br.Msg = "获取信息失败"
 		br.ErrMsg = "获取信息失败,Err:" + err.Error()
 		return
 	}
-
 	if oldItem.ParentId == 0 && parentId > 0 {
 		// 一级分类变更为二级分类,禁止
-		br.Msg = "一级分类不允许更改为二级分类"
+		br.Msg = "一级分类不允许更改为二级分类或三级分类"
 		return
 	}
 
+	var parent *models.EnglishClassify
+	rootId := 0
+	if parentId > 0 {
+		parent, err = models.GetEnglishReportClassifyById(parentId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				br.Msg = "上级分类不存在"
+				return
+			}
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			return
+		}
+		//二级分类不允许改成三级分类
+		if oldItem.ParentId > 0 && oldItem.ParentId == oldItem.RootId {
+			if parent.ParentId > 0 {
+				//即将改为为三级分类
+				br.Msg = "二级分类不允许更改为三级分类"
+				return
+			}
+		}
+
+		if parent.RootId == 0 {
+			rootId = parent.Id
+		} else {
+			rootId = parent.RootId
+		}
+	}
+
 	//判断是否已存在同个名称的分类
-	existItem, e := models.GetEnglishClassifyByClassifyNameParentId(classifyName, parentId, oldItem.ClassifyType)
+	existItem, e := models.GetEnglishClassifyByClassifyNameParentId(classifyName, parentId)
 	if e != nil {
 		if e.Error() != utils.ErrNoRow() {
 			br.Msg = "查询已存在的分类出错"
@@ -254,44 +354,52 @@ func (this *EnglishReportController) EditClassify() {
 		br.Msg = "分类名称:" + classifyName + "已存在"
 		return
 	}
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取信息失败"
-		br.ErrMsg = "获取信息失败,Err:" + err.Error()
-		return
-	}
 
-	//oldParentId := item.ParentId
+	if parentId == 0 { //一级分类的顶级分类为自己的ID
+		rootId = oldItem.Id
+	}
 	item := &models.EnglishClassify{
 		Id:           oldItem.Id,
 		ClassifyName: classifyName,
 		Sort:         sort,
 		ParentId:     parentId,
+		RootId:       rootId,
 		ModifyTime:   time.Now(),
-		ClassifyType: oldItem.ClassifyType,
 		IsShow:       1,
 	}
-	if oldItem.ClassifyType == 1 {
-		err = services.UpdateEnglishVideoClassifyId(oldItem, item, parent, classifyId)
+	{
+		// 更新研报里的分类名称
+		err = services.UpdateEnglishReportClassifyId(oldItem, item, classifyId)
 		if err != nil {
 			br.Msg = err.Error()
 			return
 		}
-	} else {
-		// 更新研报里的分类名称
-		err = services.UpdateEnglishReportClassifyId(oldItem, item, parent, classifyId)
+
+		//更新相关联的路演视频里的分类名称
+		err = services.UpdateEnglishVideoClassifyId(oldItem, item, classifyId)
 		if err != nil {
 			br.Msg = err.Error()
 			return
 		}
 	}
-
 	err = models.ModifyEnglishClassify(item)
 	if err != nil {
 		br.Msg = "保存失败"
 		br.ErrMsg = "保存失败,Err:" + err.Error()
 		return
 	}
-
+	err = models.UpdateEnglishReportClassifyByFirstSecondClassifyId(classifyId, parentId)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+	err = models.UpdateEnglishVideoClassifyByFirstSecondClassifyId(classifyId, parentId)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "保存成功"
@@ -336,33 +444,29 @@ func (this *EnglishReportController) DelClassify() {
 		br.Ret = 403
 		return
 	}
+	reportCount, e := models.GetEnglishReportCounts(classifyId, classifyInfo.ParentId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取失败,Err:" + e.Error()
+		return
+	}
 
-	if classifyInfo.ClassifyType == 0 {
-		reportCount, e := models.GetEnglishReportCounts(classifyId, classifyInfo.ParentId)
-		if e != nil && e.Error() != utils.ErrNoRow() {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "获取失败,Err:" + e.Error()
-			return
-		}
-
-		if reportCount > 0 {
-			br.Msg = "该分类有关联报告,不允许删除"
-			br.Ret = 403
-			return
-		}
-	} else {
-		videoCount, e := models.GetEnglishVideoCounts(classifyId, classifyInfo.ParentId)
-		if e != nil && e.Error() != utils.ErrNoRow() {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "获取失败,Err:" + e.Error()
-			return
-		}
+	if reportCount > 0 {
+		br.Msg = "该分类有关联报告,不允许删除"
+		br.Ret = 403
+		return
+	}
+	videoCount, e := models.GetEnglishVideoCounts(classifyId, classifyInfo.ParentId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取失败,Err:" + e.Error()
+		return
+	}
 
-		if videoCount > 0 {
-			br.Msg = "该分类有关联的路演视频,不允许删除"
-			br.Ret = 403
-			return
-		}
+	if videoCount > 0 {
+		br.Msg = "该分类有关联的路演视频,不允许删除"
+		br.Ret = 403
+		return
 	}
 
 	if err = models.DeleteEnglishClassify(classifyId); err != nil {
@@ -391,7 +495,6 @@ func (this *EnglishReportController) FistListClassify() {
 	}()
 	pageSize, _ := this.GetInt("PageSize")
 	currentIndex, _ := this.GetInt("CurrentIndex")
-	classifyType, _ := this.GetInt("ClassifyType", 0)
 
 	var startSize int
 	if pageSize <= 0 {
@@ -402,22 +505,66 @@ func (this *EnglishReportController) FistListClassify() {
 	}
 
 	startSize = utils.StartIndex(currentIndex, pageSize)
-	list, err := models.GetEnglishFirstClassifyList(classifyType, startSize, pageSize)
+	rootList, err := models.GetEnglishFirstClassifyList(startSize, pageSize)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-	total, err := models.GetEnglishFirstClassifyListCount(classifyType)
+	total, err := models.GetEnglishFirstClassifyListCount()
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp := new(models.EnglishClassifyListResp)
-	resp.List = list
+
+	if total == 0 {
+		resp.List = make([]*models.EnglishClassifyList, 0)
+		resp.Paging = page
+
+		br.Data = resp
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+	rootMap := make(map[int]struct{}, 0)
+	var rootIds []int
+	for _, v := range rootList {
+		rootMap[v.Id] = struct{}{}
+		rootIds = append(rootIds, v.Id)
+	}
+	tmpList, err := models.GetEnglishSecondClassifyList(rootIds)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	secondListMap := make(map[int][]*models.EnglishClassifyList)
+	//处理二级分类
+	for _, v := range tmpList {
+		if _, ok := rootMap[v.ParentId]; ok {
+			secondListMap[v.ParentId] = append(secondListMap[v.ParentId], v)
+		}
+	}
+
+	//处理一级分类
+	var sortList models.RSClassifyList
+	var sortChildList models.RSChildClassifyList
+	for _, v := range rootList {
+		if child, ok := secondListMap[v.Id]; ok {
+			sortChildList = child
+			sort.Sort(sortChildList)
+			v.Child = sortChildList
+		}
+		sortList = append(sortList, v)
+	}
+
+	sort.Sort(sortList)
+
+	resp.List = sortList
 	resp.Paging = page
 
 	br.Data = resp

+ 104 - 11
controllers/english_report/report.go

@@ -277,6 +277,24 @@ func (this *EnglishReportController) Detail() {
 	item.Content = html.UnescapeString(item.Content)
 	item.ContentSub = html.UnescapeString(item.ContentSub)
 
+	classifyNameMap := make(map[int]*models.EnglishClassifyFullName)
+	if item.ClassifyIdSecond > 0 {
+		nameList, tErr := models.GetEnglishClassifyFullNameByIds([]int{item.ClassifyIdSecond})
+		if tErr != nil {
+			br.Msg = "获取分类名称失败"
+			br.ErrMsg = "获取分类名称失败, ERR:" + tErr.Error()
+			return
+		}
+		for _, v := range nameList {
+			classifyNameMap[v.Id] = v
+		}
+		//处理分类名
+		if n, ok := classifyNameMap[item.ClassifyIdSecond]; ok {
+			item.ClassifyNameRoot = n.RootName
+			item.ClassifyIdRoot = n.RootId
+		}
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -292,8 +310,8 @@ func (this *EnglishReportController) Detail() {
 // @Param   StartDate   query   string  true       "开始时间"
 // @Param   EndDate   query   string  true       "结束时间"
 // @Param   Frequency   query   string  true       "频度"
-// @Param   ClassifyNameFirst   query   string  true       "一级分类名称"
-// @Param   ClassifyNameSecond   query   string  true       "二级分类名称"
+// @Param   ClassifyIdFirst   query   string  true       "一级分类id"
+// @Param   ClassifyIdSecond   query   string  true       "二级分类id"
 // @Param   State   query   int  true       "状态"
 // @Param   KeyWord   query   string  true       "搜索关键词"
 // @Param   PublishSort   query   string  true       "desc:降序,asc 升序(预留)"
@@ -321,8 +339,9 @@ func (this *EnglishReportController) ListReport() {
 	startDate := this.GetString("StartDate")
 	endDate := this.GetString("EndDate")
 	frequency := this.GetString("Frequency")
-	classifyNameFirst := this.GetString("ClassifyNameFirst")
-	classifyNameSecond := this.GetString("ClassifyNameSecond")
+	classifyIdFirst, _ := this.GetInt("ClassifyIdFirst")
+	classifyIdSecond, _ := this.GetInt("ClassifyIdSecond")
+	classifyIdRoot, _ := this.GetInt("ClassifyIdRoot")
 	state, _ := this.GetInt("State")
 	keyWord := this.GetString("KeyWord")
 	companyType := this.GetString("CompanyType")
@@ -366,19 +385,47 @@ func (this *EnglishReportController) ListReport() {
 		condition += ` AND frequency = ? `
 		pars = append(pars, frequency)
 	}
-	if classifyNameFirst != "" {
-		condition += ` AND classify_name_first = ? `
-		pars = append(pars, classifyNameFirst)
+	if classifyIdFirst != 0 {
+		condition += ` AND classify_id_first = ? `
+		pars = append(pars, classifyIdFirst)
 	}
 
-	if classifyNameSecond != "" {
-		condition += ` AND classify_name_second = ? `
-		pars = append(pars, classifyNameSecond)
+	if classifyIdSecond != 0 {
+		condition += ` AND classify_id_second = ? `
+		pars = append(pars, classifyIdSecond)
 	}
 	if state > 0 {
 		condition += ` AND state = ? `
 		pars = append(pars, state)
 	}
+	if classifyIdRoot > 0 && classifyIdFirst == 0 && classifyIdSecond == 0 {
+		//查询顶级分类下的所有二级分类ID
+		childClassify, err := models.GetEnglishSecondClassifyList([]int{classifyIdRoot})
+		if err != nil {
+			br.Msg = "查询子分类出错"
+			br.ErrMsg = "查询子分类出错, Err:" + err.Error()
+			return
+		}
+		var childClassifyIds []int
+		if len(childClassify) > 0 {
+			for _, v := range childClassify {
+				childClassifyIds = append(childClassifyIds, v.Id)
+			}
+			condition += ` AND classify_id_first IN (` + utils.GetOrmInReplace(len(childClassifyIds)) + `)`
+			pars = append(pars, childClassifyIds)
+		} else {
+			//一级分类下没有子分类,直接返回空列表
+			page := paging.GetPaging(currentIndex, pageSize, 0)
+			resp := new(models.EnglishReportListResp)
+			resp.Paging = page
+			resp.List = make([]*models.EnglishReportList, 0)
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			br.Data = resp
+			return
+		}
+	}
 	// 未群发邮件(包含推送邮件失败的)
 	if emailState == 1 {
 		failIds, e := models.GetHasFailEmailLogReportIds()
@@ -516,7 +563,23 @@ func (this *EnglishReportController) ListReport() {
 		br.ErrMsg = errOther.Error()
 		return
 	}
-
+	// 查询分类信息
+	var classifyIdSecondSlice []int
+	for _, item := range list {
+		classifyIdSecondSlice = append(classifyIdSecondSlice, item.ClassifyIdSecond)
+	}
+	classifyNameMap := make(map[int]*models.EnglishClassifyFullName)
+	if len(classifyIdSecondSlice) > 0 {
+		nameList, err := models.GetEnglishClassifyFullNameByIds(classifyIdSecondSlice)
+		if err != nil {
+			br.Msg = "获取分类名称失败"
+			br.ErrMsg = "获取分类名称失败, ERR:" + err.Error()
+			return
+		}
+		for _, v := range nameList {
+			classifyNameMap[v.Id] = v
+		}
+	}
 	for _, item := range list {
 		if item.State == 2 {
 			item.ShareUrl = "https://share.hzinsights.com/reportEn?code=" + item.ReportCode
@@ -557,6 +620,17 @@ func (this *EnglishReportController) ListReport() {
 		} else {
 			item.Editor = ret.Editor
 		}
+
+		//处理分类名
+		if n, ok := classifyNameMap[item.ClassifyIdSecond]; ok {
+			if n.RootId == 0 {
+				item.FullClassifyName = strings.Join([]string{n.ParentName, n.ClassifyName}, "/")
+			} else {
+				item.FullClassifyName = strings.Join([]string{n.RootName, n.ParentName, n.ClassifyName}, "/")
+			}
+			item.ClassifyIdRoot = n.RootId
+			item.ClassifyNameRoot = n.RootName
+		}
 	}
 
 	page := paging.GetPaging(currentIndex, pageSize, total)
@@ -932,7 +1006,26 @@ func (this *EnglishReportController) ClassifyIdDetail() {
 	if item != nil {
 		item.Content = html.UnescapeString(item.Content)
 		item.ContentSub = html.UnescapeString(item.ContentSub)
+
+		classifyNameMap := make(map[int]*models.EnglishClassifyFullName)
+		if item.ClassifyIdSecond > 0 {
+			nameList, tErr := models.GetEnglishClassifyFullNameByIds([]int{item.ClassifyIdSecond})
+			if tErr != nil {
+				br.Msg = "获取分类名称失败"
+				br.ErrMsg = "获取分类名称失败, ERR:" + tErr.Error()
+				return
+			}
+			for _, v := range nameList {
+				classifyNameMap[v.Id] = v
+			}
+			//处理分类名
+			if n, ok := classifyNameMap[item.ClassifyIdSecond]; ok {
+				item.ClassifyNameRoot = n.RootName
+				item.ClassifyIdRoot = n.RootId
+			}
+		}
 	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"

+ 141 - 52
models/english_report.go

@@ -209,6 +209,8 @@ type EnglishReportDetail struct {
 	Overview           string `description:"英文概述部分"`
 	FromReportId       int    `description:"继承的报告ID(英文策略报告ID)"`
 	KeyTakeaways       string `description:"关键点"`
+	ClassifyIdRoot     int    `description:"顶级分类id"`
+	ClassifyNameRoot   string `description:"顶级分类名称"`
 }
 
 func GetEnglishReportById(reportId int) (item *EnglishReportDetail, err error) {
@@ -259,6 +261,9 @@ type EnglishReportList struct {
 	FromReportId       int       `description:"继承的报告ID(英文策略报告ID)"`
 	AdminId            int       `description:"创建者账号"`
 	AdminRealName      string    `description:"创建者姓名"`
+	FullClassifyName   string    `description:"顶级分类名/父级分类名/当前分类名"`
+	ClassifyIdRoot     int       `description:"顶级分类id"`
+	ClassifyNameRoot   string    `description:"顶级分类名称"`
 }
 
 type EnglishReportListResp struct {
@@ -319,6 +324,17 @@ func GetEnglishReportByCondition(condition string, pars []interface{}) (items []
 	return
 }
 
+func GetEnglishReportCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT count(*) 
+        FROM english_report WHERE 1=1  `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
 // 发布报告
 func PublishEnglishReportById(reportId int, publishTime string) (err error) {
 	o := orm.NewOrmUsingDB("rddp")
@@ -386,13 +402,14 @@ type EnglishClassifyList struct {
 	ClassifyName  string    `description:"分类名称"`
 	Sort          int       `description:"排序"`
 	ParentId      int       `description:"父级分类id"`
+	RootId        int       `description:"一级分类ID"`
 	CreateTime    time.Time `description:"创建时间"`
 	ModifyTime    time.Time `description:"修改时间"`
 	ClassifyLabel string    `description:"分类标签"`
 	ShowType      int       `description:"展示类型:1-列表 2-专栏"`
 	IsShow        int       `description:"是否在小程序显示:1-显示 0-隐藏"`
-	ClassifyType  int       `description:"分类类型:0英文报告,1英文线上路演"`
-	EnPermissions []int     `description:"英文权限IDs"`
+	//ClassifyType  int       `description:"分类类型:0英文报告,1英文线上路演"`
+	EnPermissions []int `description:"英文权限IDs"`
 	Child         []*EnglishClassifyList
 }
 
@@ -401,75 +418,77 @@ type EnglishClassifyListResp struct {
 	Paging *paging.PagingItem `description:"分页数据"`
 }
 
-// 获取分类列表
-func GetEnglishClassifyList(startSize, pageSize int, keyWord string, classifyType int) (items []*EnglishClassifyList, err error) {
+// GetEnglishClassifyRootId 获取一级分类列表
+func GetEnglishClassifyRootId(startSize, pageSize int, keyWord string) (items []*EnglishClassifyList, err error) {
 	sql := ``
 	o := orm.NewOrmUsingDB("rddp")
 	if keyWord != "" {
 		sql = `SELECT * FROM (
-                   SELECT * FROM english_classify
-                   WHERE parent_id=0 AND classify_name LIKE '%` + keyWord + `%' AND classify_type = ?
+			                   SELECT * FROM english_classify
+                   WHERE parent_id=0 AND classify_name LIKE '%` + keyWord + `%'
                    UNION
                    SELECT * FROM english_classify
                    WHERE id IN(SELECT parent_id FROM english_classify
-                   WHERE parent_id>0 AND classify_name LIKE '%` + keyWord + `%') AND classify_type = ?
+                   WHERE parent_id>0 AND classify_name LIKE '%` + keyWord + `%')
                    )AS t
                    ORDER BY sort ASC,create_time ASC
                    LIMIT ?,? `
-		_, err = o.Raw(sql, classifyType, classifyType, startSize, pageSize).QueryRows(&items)
+		_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
 	} else {
-		sql = `SELECT * FROM english_classify WHERE parent_id=0 AND classify_type = ? ORDER BY sort ASC,create_time ASC LIMIT ?,? `
-		_, err = o.Raw(sql, classifyType, startSize, pageSize).QueryRows(&items)
+		sql = `SELECT * FROM english_classify WHERE parent_id=0 ORDER BY sort ASC,create_time ASC LIMIT ?,? `
+		_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
 	}
 	return
 }
 
-func GetEnglishClassifyListCount(keyWord string, classifyType int) (count int, err error) {
+func GetEnglishClassifyListCount(keyWord string) (count int, err error) {
 	sqlCount := ``
 	o := orm.NewOrmUsingDB("rddp")
 	if keyWord != "" {
 		sqlCount = `SELECT  COUNT(1) AS count FROM (
                SELECT * FROM english_classify
-               WHERE parent_id=0 AND classify_name LIKE '%` + keyWord + `%' AND classify_type = ?
+               WHERE parent_id=0 AND classify_name LIKE '%` + keyWord + `%'
                UNION
                SELECT * FROM english_classify
                WHERE id IN(SELECT parent_id FROM english_classify
-               WHERE parent_id>0 AND classify_name LIKE '%` + keyWord + `%' AND classify_type = ?)
+               WHERE parent_id>0 AND classify_name LIKE '%` + keyWord + `%')
                )AS t `
-		err = o.Raw(sqlCount, classifyType, classifyType).QueryRow(&count)
+		err = o.Raw(sqlCount).QueryRow(&count)
 	} else {
-		sqlCount = `SELECT COUNT(1) AS count FROM english_classify WHERE parent_id=0 AND classify_type = ?`
-		err = o.Raw(sqlCount, classifyType).QueryRow(&count)
+		sqlCount = `SELECT COUNT(1) AS count FROM english_classify WHERE parent_id=0`
+		err = o.Raw(sqlCount).QueryRow(&count)
 	}
 
 	return
 }
 
-func GetEnglishClassifyChild(parentId int, keyWord string, classifyType int) (items []*EnglishClassify, err error) {
-	o := orm.NewOrmUsingDB("rddp")
+func GetEnglishClassifyListByRootId(rootIds []int, keyWord string) (items []*EnglishClassifyList, err error) {
 	sql := ``
+	o := orm.NewOrmUsingDB("rddp")
 	if keyWord != "" {
-		sql = `SELECT * FROM english_classify WHERE parent_id=? AND classify_type = ? AND classify_name LIKE '%` + keyWord + `%' ORDER BY create_time ASC `
+		sql = `SELECT
+	a.*
+FROM
+	english_classify a
+	LEFT JOIN english_classify b ON a.root_id = b.id
+	LEFT JOIN english_classify c ON a.parent_id = c.id
+	WHERE a.parent_id>0 and a.classify_name LIKE '%` + keyWord + `%' and a.root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `)`
+		_, err = o.Raw(sql, rootIds).QueryRows(&items)
 	} else {
-		sql = `SELECT * FROM english_classify WHERE parent_id=? AND classify_type = ? ORDER BY create_time ASC `
+		sql = `SELECT * FROM english_classify WHERE parent_id>0 and root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `) `
+		_, err = o.Raw(sql, rootIds).QueryRows(&items)
 	}
-	_, err = o.Raw(sql, parentId, classifyType).QueryRows(&items)
 	return
 }
 
-func GetEnglishClassifyChildByParentIds(parentIds []int, keyWord string, classifyType int) (items []*EnglishClassifyList, err error) {
+func GetEnglishClassifyChildByIds(ids []int) (items []*EnglishClassifyList, err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	sql := ``
-	if keyWord != "" {
-		sql = `SELECT * FROM english_classify WHERE parent_id IN (` + utils.GetOrmInReplace(len(parentIds)) + `) AND classify_type = ? AND classify_name LIKE '%` + keyWord + `%' ORDER BY create_time ASC `
-	} else {
-		sql = `SELECT * FROM english_classify WHERE parent_id IN (` + utils.GetOrmInReplace(len(parentIds)) + `) AND classify_type = ? ORDER BY create_time ASC `
-	}
-	_, err = o.Raw(sql, parentIds, classifyType).QueryRows(&items)
+	sql := `SELECT * FROM english_classify WHERE id IN (` + utils.GetOrmInReplace(len(ids)) + `) ORDER BY create_time ASC `
+	_, err = o.Raw(sql, ids).QueryRows(&items)
 	return
 }
 
-func GetEnglishReportDetailByClassifyId(classifyIdFirst, classifyIdSecond int) (item *EnglishReport, err error) {
+func GetEnglishReportDetailByClassifyId(classifyIdFirst, classifyIdSecond int) (item *EnglishReportDetail, err error) {
 	o := orm.NewOrmUsingDB("rddp")
 	sql := ` SELECT * FROM english_report WHERE 1=1 `
 	if classifyIdSecond > 0 {
@@ -506,12 +525,13 @@ type EnglishClassify struct {
 	ClassifyName  string    `description:"分类名称"`
 	Sort          int       `description:"排序"`
 	ParentId      int       `description:"父级分类id"`
+	RootId        int       `description:"一级分类ID"`
 	CreateTime    time.Time `description:"创建时间"`
 	ModifyTime    time.Time `description:"修改时间"`
 	ClassifyLabel string    `description:"分类标签"`
 	ShowType      int       `description:"展示类型:1-列表 2-专栏"`
 	IsShow        int       `description:"是否在小程序显示:1-显示 0-隐藏"`
-	ClassifyType  int       `description:"分类类型:0英文报告,1英文线上路演"`
+	//ClassifyType  int       `description:"分类类型:0英文报告,1英文线上路演"`
 }
 
 func AddEnglishClassify(item *EnglishClassify) (lastId int64, err error) {
@@ -527,9 +547,18 @@ func ModifyEnglishClassify(item *EnglishClassify) (err error) {
 	classify_name = ?,
 	sort = ?,
 	parent_id = ?,
+	root_id = ?,
 	modify_time = ? 
 	WHERE id = ? `
-	_, err = o.Raw(sql, item.ClassifyName, item.Sort, item.ParentId, item.ModifyTime, item.Id).Exec()
+	_, err = o.Raw(sql, item.ClassifyName, item.Sort, item.ParentId, item.RootId, item.ModifyTime, item.Id).Exec()
+	return
+}
+
+// UpdateEnglishClassifyRootIdByParentId 更新报告分类的顶级ID
+func UpdateEnglishClassifyRootIdByParentId(parentId, rootId int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := " UPDATE english_classify SET root_id = ? WHERE parent_id=? "
+	_, err = o.Raw(sql, rootId, parentId).Exec()
 	return
 }
 
@@ -568,30 +597,33 @@ func GetEnglishReportCounts(classifyId, parentId int) (count int, err error) {
 	return
 }
 
-func GetEnglishClassifyCountsByName(name string, parentId int, classifyType int) (count int, err error) {
+func GetEnglishClassifyCountsByName(name string, parentId int) (count int, err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT COUNT(1) AS count FROM english_classify WHERE classify_name=? AND parent_id = ? AND classify_type = ? `
-	err = o.Raw(sql, name, parentId, classifyType).QueryRow(&count)
+	sql := `SELECT COUNT(1) AS count FROM english_classify WHERE classify_name=? AND parent_id = ? `
+	err = o.Raw(sql, name, parentId).QueryRow(&count)
 	return
 }
 
-// 获取分类列表
-func GetEnglishFirstClassifyList(classifyType, startSize, pageSize int) (items []*EnglishClassifyList, err error) {
-	sql := ``
-
-	sql = `SELECT * FROM english_classify WHERE parent_id=0 AND classify_type = ?  ORDER BY sort ASC,create_time ASC LIMIT ?,? `
-
+// GetEnglishFirstClassifyList 获取一级、二级分类列表
+func GetEnglishFirstClassifyList(startSize, pageSize int) (items []*EnglishClassifyList, err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	_, err = o.Raw(sql, classifyType, startSize, pageSize).QueryRows(&items)
+	sql := `SELECT * FROM english_classify WHERE parent_id=0  ORDER BY sort ASC,create_time ASC LIMIT ?,? `
+	_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
 	return
 }
 
-func GetEnglishFirstClassifyListCount(classifyType int) (count int, err error) {
-	sqlCount := ``
-	sqlCount = `SELECT COUNT(1) AS count FROM english_classify WHERE parent_id=0 AND classify_type = ? `
+// GetEnglishSecondClassifyList 获取一级、二级分类列表
+func GetEnglishSecondClassifyList(rootIds []int) (items []*EnglishClassifyList, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM english_classify WHERE root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `) and parent_id>0 and root_id=parent_id ORDER BY sort ASC,create_time ASC`
+	_, err = o.Raw(sql, rootIds).QueryRows(&items)
+	return
+}
 
+func GetEnglishFirstClassifyListCount() (count int, err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	err = o.Raw(sqlCount, classifyType).QueryRow(&count)
+	sqlCount := `SELECT COUNT(1) AS count FROM english_classify WHERE parent_id=0`
+	err = o.Raw(sqlCount).QueryRow(&count)
 	return
 }
 
@@ -633,6 +665,35 @@ func UpdateEnglishReportByClassifyId(classifyFirstName, classifySecondName strin
 	return
 }
 
+func UpdateEnglishReportClassifyByFirstSecondClassifyId(classifyId, parentId int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	// 更新相关联的二级分类的parentId,和classify_name_second
+	sql := `update english_report r
+LEFT JOIN english_classify c ON r.classify_id_second = c.id
+SET r.classify_id_first=c.parent_id, r.classify_name_second=c.classify_name
+where (r.classify_id_first != c.parent_id or r.classify_name_second != c.classify_name) and r.classify_id_second =?`
+	_, err = o.Raw(sql, classifyId).Exec()
+	if err != nil {
+		return
+	}
+	//更新一级分类名
+	sql = `update english_report r
+    LEFT JOIN english_classify c ON r.classify_id_first = c.id
+    SET r.classify_name_first=c.classify_name
+where r.classify_name_first	!= c.classify_name and r.classify_id_first=?`
+	_, err = o.Raw(sql, parentId).Exec()
+	if err != nil {
+		return
+	}
+	//更新一级分类名
+	sql = `update english_report r
+    LEFT JOIN english_classify c ON r.classify_id_first = c.id
+    SET r.classify_name_first=c.classify_name
+where r.classify_name_first	!= c.classify_name and r.classify_id_first=?`
+	_, err = o.Raw(sql, classifyId).Exec()
+	return
+}
+
 // FetchEnglishReportById 主键获取英文报告
 func FetchEnglishReportById(reportId int) (item *EnglishReport, err error) {
 	o := orm.NewOrmUsingDB("rddp")
@@ -650,10 +711,10 @@ func (reportInfo *EnglishReport) UpdateReport(cols []string) (err error) {
 }
 
 // GetAllEnglishClassify 获取所有英文分类
-func GetAllEnglishClassify(classifyType int) (list []*Classify, err error) {
+func GetAllEnglishClassify() (list []*Classify, err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	sql := ` SELECT * FROM english_classify where classify_type = ? `
-	_, err = o.Raw(sql, classifyType).QueryRows(&list)
+	sql := ` SELECT * FROM english_classify `
+	_, err = o.Raw(sql).QueryRows(&list)
 	return
 }
 
@@ -728,9 +789,37 @@ func (m RSChildClassifyList) Swap(i, j int) {
 }
 
 // GetEnglishClassifyByClassifyNameParentId 获取英文分类
-func GetEnglishClassifyByClassifyNameParentId(classifyName string, parentId, classifyType int) (item *Classify, err error) {
+func GetEnglishClassifyByClassifyNameParentId(classifyName string, parentId int) (item *Classify, err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	sql := ` SELECT * FROM english_classify where classify_name = ? and parent_id = ? and classify_type = ? `
-	err = o.Raw(sql, classifyName, parentId, classifyType).QueryRow(&item)
+	sql := ` SELECT * FROM english_classify where classify_name = ? and parent_id = ? `
+	err = o.Raw(sql, classifyName, parentId).QueryRow(&item)
+	return
+}
+
+type EnglishClassifyFullName struct {
+	Id           int    `description:"分类ID"`
+	ParentId     int    `description:"父级分类id"`
+	RootId       int    `description:"一级分类ID"`
+	RootName     string `description:"一级分类名"`
+	ParentName   string `description:"二级分类名"`
+	ClassifyName string `description:"分类名称"`
+}
+
+// GetEnglishClassifyFullNameByIds 获取英文分类名一级/二级/三级
+func GetEnglishClassifyFullNameByIds(classifyIds []int) (list []*EnglishClassifyFullName, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` SELECT
+	a.id,
+	a.parent_id,
+	a.root_id,
+	a.classify_name,
+	b.classify_name AS root_name,
+	c.classify_name AS parent_name 
+FROM
+	english_classify a
+	LEFT JOIN english_classify b ON a.root_id = b.id
+	LEFT JOIN english_classify c ON a.parent_id = c.id 
+where a.id IN (` + utils.GetOrmInReplace(len(classifyIds)) + `)`
+	_, err = o.Raw(sql, classifyIds).QueryRows(&list)
 	return
 }

+ 1 - 0
models/english_report_email.go

@@ -187,6 +187,7 @@ type EnglishReportEmailSendReq struct {
 	EmailIds      string `description:"邮箱IDs"`
 	Theme         string `description:"邮件主题"`
 	EnPermissions []int  `description:"品种权限IDs"`
+	NoCompanyIds  []int  `description:"禁止接收邮件的英文客户IDs"`
 }
 
 // EnglishReportEmailConf 英文研报邮件配置

+ 24 - 8
models/english_video.go

@@ -240,16 +240,32 @@ func DeleteEnglishVideo(Id int) (err error) {
 	return
 }
 
-func GetEnglishVideoDetailByClassifyId(classifyIdFirst, classifyIdSecond int) (item *EnglishVideo, err error) {
+func UpdateEnglishVideoClassifyByFirstSecondClassifyId(classifyId, parentId int) (err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	sql := ` SELECT * FROM english_video WHERE 1=1 `
-	if classifyIdSecond > 0 {
-		sql = sql + ` AND classify_id_second=?   ORDER BY stage DESC LIMIT 1`
-		err = o.Raw(sql, classifyIdSecond).QueryRow(&item)
-	} else {
-		sql = sql + ` AND classify_id_first=?   ORDER BY stage DESC LIMIT 1`
-		err = o.Raw(sql, classifyIdFirst).QueryRow(&item)
+	// 更新相关联的二级分类的parentId,和classify_name_second
+	sql := `update english_video r
+LEFT JOIN english_classify c ON r.classify_id_second = c.id
+SET r.classify_id_first=c.parent_id, r.classify_name_second=c.classify_name
+where (r.classify_id_first != c.parent_id or r.classify_name_second != c.classify_name) and r.classify_id_second =?`
+	_, err = o.Raw(sql, classifyId).Exec()
+	if err != nil {
+		return
+	}
+	//更新一级分类名
+	sql = `update english_video r
+    LEFT JOIN english_classify c ON r.classify_id_first = c.id
+    SET r.classify_name_first=c.classify_name
+where r.classify_name_first	!= c.classify_name and r.classify_id_first=?`
+	_, err = o.Raw(sql, parentId).Exec()
+	if err != nil {
+		return
 	}
+	//更新一级分类名
+	sql = `update english_video r
+    LEFT JOIN english_classify c ON r.classify_id_first = c.id
+    SET r.classify_name_first=c.classify_name
+where r.classify_name_first	!= c.classify_name and r.classify_id_first=?`
+	_, err = o.Raw(sql, classifyId).Exec()
 	return
 }
 

+ 144 - 102
services/english_report.go

@@ -290,6 +290,74 @@ func UpdateEnglishReportEs(reportId int, publishState int) (err error) {
 	return
 }
 
+// ModifyAllEsEnglishReportVideo 批量修改es里的英文研报信息和线上路演信息
+func ModifyAllEsEnglishReportVideo() (err error) {
+	reportList, err := models.GetEnglishReportByCondition("", []interface{}{})
+	if err != nil {
+		return
+	}
+	for _, reportInfo := range reportList {
+		// 新增报告ES
+		esReport := &models.ElasticEnglishReportDetail{
+			Id:                 strconv.Itoa(reportInfo.Id),
+			ReportId:           reportInfo.Id,
+			Title:              reportInfo.Title,
+			Abstract:           reportInfo.Abstract,
+			BodyContent:        utils.TrimHtml(html.UnescapeString(reportInfo.Content)),
+			PublishTime:        reportInfo.PublishTime.Format(utils.FormatDateTime),
+			CreateTime:         reportInfo.CreateTime,
+			ReportCode:         reportInfo.ReportCode,
+			PublishState:       reportInfo.State,
+			Author:             reportInfo.Author,
+			Frequency:          reportInfo.Frequency,
+			ClassifyIdFirst:    reportInfo.ClassifyIdFirst,
+			ClassifyNameFirst:  reportInfo.ClassifyNameFirst,
+			ClassifyIdSecond:   reportInfo.ClassifyIdSecond,
+			ClassifyNameSecond: reportInfo.ClassifyNameSecond,
+			StageStr:           strconv.Itoa(reportInfo.Stage),
+			Overview:           utils.TrimHtml(html.UnescapeString(reportInfo.Overview)),
+			ContentSub:         utils.TrimHtml(html.UnescapeString(reportInfo.ContentSub)),
+		}
+		docId := fmt.Sprintf("%d", reportInfo.Id)
+		if err = EsAddOrEditEnglishReport(utils.EsEnglishReportIndexName, docId, esReport); err != nil {
+			return
+		}
+	}
+
+	videoList, err := models.GetEnglishVideoByCondition("", []interface{}{})
+	if err != nil {
+		return
+	}
+	for _, videoInfo := range videoList {
+		// 新增报告ES
+		esReport := &models.ElasticEnglishReportDetail{
+			Id:                 "v" + strconv.Itoa(videoInfo.Id),
+			VideoId:            videoInfo.Id,
+			Title:              videoInfo.Title,
+			Abstract:           videoInfo.Abstract,
+			BodyContent:        "",
+			PublishTime:        videoInfo.PublishTime.Format(utils.FormatDateTime),
+			CreateTime:         videoInfo.CreateTime.Format(utils.FormatDateTime),
+			ReportCode:         videoInfo.VideoCode,
+			PublishState:       videoInfo.State,
+			Author:             videoInfo.Author,
+			Frequency:          "",
+			ClassifyIdFirst:    videoInfo.ClassifyIdFirst,
+			ClassifyNameFirst:  videoInfo.ClassifyNameFirst,
+			ClassifyIdSecond:   videoInfo.ClassifyIdSecond,
+			ClassifyNameSecond: videoInfo.ClassifyNameSecond,
+			StageStr:           "",
+			Overview:           utils.TrimHtml(html.UnescapeString(videoInfo.Overview)),
+			ContentSub:         "",
+		}
+		docId := fmt.Sprintf("v%d", videoInfo.Id)
+		if err = EsAddOrEditEnglishReport(utils.EsEnglishReportIndexName, docId, esReport); err != nil {
+			return
+		}
+	}
+	return
+}
+
 // UpdateEnglishVideoEs 更新英文线上路演Es
 func UpdateEnglishVideoEs(videoId int, publishState int) (err error) {
 	if videoId <= 0 {
@@ -327,8 +395,7 @@ func UpdateEnglishVideoEs(videoId int, publishState int) (err error) {
 	return
 }
 
-func UpdateEnglishReportClassifyId(oldItem, newItem, newParent *models.EnglishClassify, classifyId int) (err error) {
-	//一级分类改为二级分类
+func UpdateEnglishReportClassifyId(oldItem, newItem *models.EnglishClassify, classifyId int) (err error) {
 	defer func() {
 		if err != nil {
 			go alarm_msg.SendAlarmMsg("英文报告分类改名-同步更新报告表字段及权限表关键词失败3, Err:"+err.Error(), 3)
@@ -338,64 +405,51 @@ func UpdateEnglishReportClassifyId(oldItem, newItem, newParent *models.EnglishCl
 	//如果二级分类更换了父级分类,则更新报告中的父级分类ID
 	//如果一级分类更换了名称,则更新所有报告中的一级分类名称
 	//如果二级分类更换了名称,则更新所有报告中的二级分类名称
-	if oldItem.ParentId != newItem.ParentId {
-		parentClassifyName := ""
-		parentId := 0
-
-		//二级分类改为一级分类, 或者二级分类的一级分类有变更
-		if newItem.ParentId > 0 {
-			parentClassifyName = newParent.ClassifyName
-			parentId = newParent.Id
-		}
-
-		// 更新报告表分类字段
-		var condition string
-		var pars []interface{}
-
-		condition += ` AND classify_id_second = ? `
-		pars = append(pars, classifyId)
-		list, e := models.GetEnglishReportByCondition(condition, pars)
-		if e != nil {
-			err = e
-			return
-		}
-		if len(list) > 0 {
-			//二级分类改为一级分类
-			if oldItem.ParentId > 0 && newItem.ParentId == 0 {
-				//查询该二级分类下是否存在关联报告,如果存在则不允许变更
-				err = fmt.Errorf("该分类有关联的报告,不允许变更为一级分类")
-				return
+	if oldItem.ParentId > 0 && oldItem.ParentId != newItem.ParentId {
+		//二级分类下的三级分类如果有报告,则该二级分类不允许改成一级分类
+		if oldItem.ParentId > 0 && oldItem.ParentId == oldItem.RootId {
+			if newItem.ParentId == 0 {
+				// 更新报告表分类字段
+				var condition string
+				var pars []interface{}
+
+				condition += ` AND classify_id_first = ? `
+				pars = append(pars, classifyId)
+				count, e := models.GetEnglishReportCountByCondition(condition, pars)
+				if e != nil {
+					err = e
+					return
+				}
+				if count > 0 {
+					err = fmt.Errorf("该分类有关联的报告,不允许变更为一级分类")
+					return
+				}
 			}
-		}
-		var idSlice []string
-		for _, report := range list {
-			idSlice = append(idSlice, strconv.Itoa(report.Id))
-		}
-		ids := strings.Join(idSlice, ",")
-		if ids != "" {
-			if err = models.UpdateEnglishReportByClassifyId(parentClassifyName, newItem.ClassifyName, parentId, oldItem.Id, ids); err != nil {
-				return
-			}
-		}
-	} else if oldItem.ClassifyName != newItem.ClassifyName {
-		if oldItem.ParentId > 0 {
-			//只对二级分类名称作了修改
-			// 更新报告表分类字段
-			if err = models.UpdateEnglishReportSecondClassifyNameByClassifyId(classifyId, newItem.ClassifyName); err != nil {
-				return
-			}
-		} else if oldItem.ParentId == 0 {
-			//只对一级分类名称作了修改
-			// 更新报告表分类字段
-			if err = models.UpdateEnglishReportFirstClassifyNameByClassifyId(classifyId, newItem.ClassifyName); err != nil {
-				return
+		} else if oldItem.ParentId > 0 && oldItem.ParentId != oldItem.RootId {
+			//三级分类下如果有报告,则该三级分类不允许改成二级或或者一级分类
+			if (newItem.ParentId > 0 && newItem.ParentId == newItem.RootId) || newItem.ParentId == 0 {
+				// 更新报告表分类字段
+				var condition string
+				var pars []interface{}
+
+				condition += ` AND classify_id_second = ? `
+				pars = append(pars, classifyId)
+				count, e := models.GetEnglishReportCountByCondition(condition, pars)
+				if e != nil {
+					err = e
+					return
+				}
+				if count > 0 {
+					err = fmt.Errorf("该分类有关联的报告,不允许变更为二级分类或者一级分类")
+					return
+				}
 			}
 		}
 	}
 	return
 }
 
-func UpdateEnglishVideoClassifyId(oldItem, newItem, newParent *models.EnglishClassify, classifyId int) (err error) {
+func UpdateEnglishVideoClassifyId(oldItem, newItem *models.EnglishClassify, classifyId int) (err error) {
 	//一级分类改为二级分类
 	defer func() {
 		if err != nil {
@@ -406,56 +460,44 @@ func UpdateEnglishVideoClassifyId(oldItem, newItem, newParent *models.EnglishCla
 	//如果二级分类更换了父级分类,则更新报告中的父级分类ID
 	//如果一级分类更换了名称,则更新所有报告中的一级分类名称
 	//如果二级分类更换了名称,则更新所有报告中的二级分类名称
-	if oldItem.ParentId != newItem.ParentId {
-		parentClassifyName := ""
-		parentId := 0
-		//二级分类改为一级分类, 或者二级分类的一级分类有变更
-		if newItem.ParentId > 0 {
-			parentClassifyName = newParent.ClassifyName
-			parentId = newParent.Id
-		}
-
-		// 更新报告表分类字段
-		var condition string
-		var pars []interface{}
-
-		condition += ` AND classify_id_second = ? `
-		pars = append(pars, classifyId)
-		list, e := models.GetEnglishVideoByCondition(condition, pars)
-		if e != nil {
-			err = e
-			return
-		}
-		if len(list) > 0 {
-			//二级分类改为一级分类
-			if oldItem.ParentId > 0 && newItem.ParentId == 0 {
-				//查询该二级分类下是否存在关联报告,如果存在则不允许变更
-				err = fmt.Errorf("该分类有关联的视频,不允许变更为一级分类")
-				return
-			}
-		}
-		var idSlice []string
-		for _, report := range list {
-			idSlice = append(idSlice, strconv.Itoa(report.Id))
-		}
-		ids := strings.Join(idSlice, ",")
-		if ids != "" {
-			if err = models.UpdateEnglishVideoByClassifyId(parentClassifyName, newItem.ClassifyName, parentId, oldItem.Id, ids); err != nil {
-				return
-			}
-		}
-	} else if oldItem.ClassifyName != newItem.ClassifyName {
-		if oldItem.ParentId > 0 {
-			//只对二级分类名称作了修改
-			// 更新报告表分类字段
-			if err = models.UpdateEnglishVideoSecondClassifyNameByClassifyId(classifyId, newItem.ClassifyName); err != nil {
-				return
+	if oldItem.ParentId > 0 && oldItem.ParentId != newItem.ParentId {
+		//二级分类下的三级分类如果有报告,则该二级分类不允许改成一级分类
+		if oldItem.ParentId > 0 && oldItem.ParentId == oldItem.RootId {
+			if newItem.ParentId == 0 {
+				// 更新报告表分类字段
+				var condition string
+				var pars []interface{}
+
+				condition += ` AND classify_id_first = ? `
+				pars = append(pars, classifyId)
+				count, e := models.GetEnglishVideoListCount(condition, pars)
+				if e != nil {
+					err = e
+					return
+				}
+				if count > 0 {
+					err = fmt.Errorf("该分类有关联的视频,不允许变更为一级分类")
+					return
+				}
 			}
-		} else if oldItem.ParentId == 0 {
-			//只对一级分类名称作了修改
-			// 更新报告表分类字段
-			if err = models.UpdateEnglishVideoFirstClassifyNameByClassifyId(classifyId, newItem.ClassifyName); err != nil {
-				return
+		} else if oldItem.ParentId > 0 && oldItem.ParentId != oldItem.RootId {
+			//三级分类下如果有报告,则该三级分类不允许改成二级或或者一级分类
+			if (newItem.ParentId > 0 && newItem.ParentId == newItem.RootId) || newItem.ParentId == 0 {
+				// 更新报告表分类字段
+				var condition string
+				var pars []interface{}
+
+				condition += ` AND classify_id_second = ? `
+				pars = append(pars, classifyId)
+				count, e := models.GetEnglishVideoListCount(condition, pars)
+				if e != nil {
+					err = e
+					return
+				}
+				if count > 0 {
+					err = fmt.Errorf("该分类有关联的视频,不允许变更为二级分类或者一级分类")
+					return
+				}
 			}
 		}
 	}

+ 2 - 7
services/english_video.go

@@ -125,14 +125,9 @@ func SaveEnglishVideo(req models.SaveEnglishVideoReq, adminInfo *system.Admin) (
 	firstClassify := new(models.EnglishClassify)
 	secondClassify := new(models.EnglishClassify)
 	for _, v := range classifyList {
-		if v.ClassifyType != 1 {
-			err = fmt.Errorf("分类类型出错")
-			errMsg = fmt.Sprintf("分类类型出错, Err: %v", err)
-			return
-		}
-		if v.ParentId == 0 {
+		if v.ParentId == v.RootId {
 			firstClassify = v
-		} else {
+		} else if v.ParentId > 0 {
 			secondClassify = v
 		}
 	}

+ 1 - 1
services/ppt.go

@@ -343,7 +343,7 @@ func SaveEnglishPPTReport(pptId, classifyIdFirst, classifyIdSecond int, title, a
 	}
 
 	// 分类
-	classifyList, e := models.GetAllEnglishClassify(0)
+	classifyList, e := models.GetAllEnglishClassify()
 	if e != nil {
 		errMsg = "转换失败"
 		err = errors.New("获取分类列表失败, Err: " + e.Error())

+ 11 - 0
services/task.go

@@ -465,3 +465,14 @@ func FixEnCompanyPermission() {
 	}
 	fmt.Println("修复完成")
 }
+
+// ModifyEsEnglishReport 批量修改es里的英文研报信息和线上路演信息
+func ModifyEsEnglishReport() {
+	fmt.Println("开始")
+	err := ModifyAllEsEnglishReportVideo()
+	if err != nil {
+		err = fmt.Errorf("重置es中的英文研报信息失败:ModifyAllEnglishReportInEs err: %s", err.Error())
+		return
+	}
+	fmt.Println("结束")
+}