ziwen 1 year ago
parent
commit
ef5bc3a3d7

+ 399 - 0
controllers/help_doc/classify.go

@@ -0,0 +1,399 @@
+package help_doc
+
+import (
+	"encoding/json"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/help_doc"
+	"hongze/hz_crm_api/services/data"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// HelpDocClassifyController 帮助文档分类
+type HelpDocClassifyController struct {
+	controllers.BaseAuthController
+}
+
+// ListClassify
+// @Title 获取分类列表
+// @Description 获取分类列表
+// @Param   KeyWord   query   string  true       "检索关键词"
+// @Success 200 {object} models.HelpDocClassifyListResp
+// @router /classify/list [get]
+func (this *HelpDocClassifyController) ListClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	keyWord := this.GetString("KeyWord")
+
+	resp := new(help_doc.HelpDocClassifyListResp)
+
+	rootList, err := help_doc.GetHelpDocClassifyByParentId(0, keyWord)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+
+	classifyAll, err := help_doc.GetHelpDocClassifyAll(keyWord)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+
+	nodeAll := make([]*help_doc.HelpDocClassifyItems, 0)
+	for k := range rootList {
+		rootNode := rootList[k]
+		data.HelpDocClassifyItemsMakeTree(classifyAll, rootNode)
+		nodeAll = append(nodeAll, rootNode)
+	}
+
+	resp.AllNodes = nodeAll
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 新增分类
+// @Description 新增分类接口
+// @Param   ClassifyName   int  true       "分类名称"
+// @Param   ParentId   query   int  true       "父级Id 添加父级时为0"
+// @Param   Sort   query   string  false       "排序"
+// @Success 200 新增成功
+// @router /classify/add [post]
+func (this *HelpDocClassifyController) AddClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req help_doc.AddHelpDocClassifyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.HelpDocClassifyName == "" {
+		br.Msg = "请输入分类名称"
+		br.IsSendEmail = false
+		return
+	}
+	if req.ParentId < 0 {
+		br.Msg = "参数错误"
+		br.IsSendEmail = false
+		return
+	}
+
+	count, err := help_doc.GetHelpDocClassifyCount(req.HelpDocClassifyName, req.ParentId)
+	if err != nil {
+		br.Msg = "判断名称是否已存在失败"
+		br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
+		return
+	}
+	if count > 0 {
+		br.Msg = "分类名称已存在,请重新输入"
+		br.IsSendEmail = false
+		return
+	}
+	//获取该层级下最大的排序数
+	maxSort, err := help_doc.GetHelpDocClassifyMaxSort(req.ParentId)
+
+	classify := new(help_doc.HelpDocClassify)
+	classify.ParentId = req.ParentId
+	classify.ClassifyName = req.HelpDocClassifyName
+	classify.CreateTime = time.Now()
+	classify.ModifyTime = time.Now()
+	classify.SysUserId = this.SysUser.AdminId
+	classify.SysUserRealName = this.SysUser.RealName
+	classify.Level = req.Level + 1
+	classify.Sort = maxSort + 1
+
+	_, err = help_doc.AddHelpDocClassify(classify)
+	if err != nil {
+		br.Msg = "保存分类失败"
+		br.ErrMsg = "保存分类失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Msg = "保存成功"
+	br.Success = true
+}
+
+// @Title 编辑分类
+// @Description 编辑分类接口
+// @Param   ClassifyId   int  true       "分类Id"
+// @Param   ClassifyName   string  true       "分类名称"
+// @Param   ParentId   query   int  true       "父级Id 添加父级时为0"
+// @Param   Sort   query   string  false       "排序"
+// @Success 200 保存成功
+// @router /classify/edit [post]
+func (this *HelpDocClassifyController) EditClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req help_doc.EditHelpDocClassifyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.HelpDocClassifyName == "" {
+		br.Msg = "请输入分类名称"
+		br.IsSendEmail = false
+		return
+	}
+
+	if req.HelpDocClassifyId <= 0 {
+		br.Msg = "参数错误"
+		br.IsSendEmail = false
+		return
+	}
+
+	item, err := help_doc.GetHelpDocClassifyById(req.HelpDocClassifyId)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.Msg = "获取分类信息失败,Err:" + err.Error()
+		return
+	}
+
+	if item.ClassifyName != req.HelpDocClassifyName {
+		count, err := help_doc.GetHelpDocClassifyCount(req.HelpDocClassifyName, item.ParentId)
+		if err != nil {
+			br.Msg = "判断名称是否已存在失败"
+			br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
+			return
+		}
+		if count > 0 {
+			br.Msg = "分类名称已存在,请重新输入"
+			br.IsSendEmail = false
+			return
+		}
+
+		err = help_doc.EditHelpDocClassify(req.HelpDocClassifyId,req.ParentId, req.HelpDocClassifyName)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "保存失败,Err:" + err.Error()
+			return
+		}
+
+		// 修改文档中的分类名
+		if req.HelpDocClassifyName != item.ClassifyName {
+			err = help_doc.EditHelpDocClassifyId(req.HelpDocClassifyId, req.HelpDocClassifyName)
+			if err != nil {
+				br.Msg = "保存失败"
+				br.ErrMsg = "保存失败,Err:" + err.Error()
+				return
+			}
+		}
+	}
+	br.Ret = 200
+	br.Msg = "保存成功"
+	br.Success = true
+	br.IsAddLog = true
+}
+
+// @Title 删除分类列表
+// @Description 删除分类列表
+// @Param   ClassifyId   int  true       "分类名称"
+// @Success 200 删除成功
+// @router /classify/delete [get]
+func (this *HelpDocClassifyController) DelClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	classifyId, _ := this.GetInt("ClassifyId")
+
+	_, err := help_doc.GetHelpDocClassifyById(classifyId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "当前分类不存在"
+			br.ErrMsg = "当前分类不存在"
+			return
+		}
+		br.Msg = "获取分类信息失败"
+		br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
+		return
+	}
+
+	count, err := help_doc.GetHelpDocClassifyChildCounts(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
+	}
+
+	reportCount, e := help_doc.GetHelpDocCounts(classifyId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取失败,Err:" + e.Error()
+		return
+	}
+
+	if reportCount > 0 {
+		br.Msg = "该分类已关联文章,不允许删除!"
+		br.Ret = 403
+		return
+	}
+
+	if err = help_doc.DeleteHelpDocClassify(classifyId); err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除分类失败, Err: " + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "删除成功"
+}
+
+// ChartClassifyMove
+// @Title 分类移动接口
+// @Description 分类移动接口
+// @Success 200 {object} data_manage.MoveChartClassifyReq
+// @router /classify/move [post]
+func (this *HelpDocClassifyController) ClassifyMove() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req help_doc.MoveClassifyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.ClassifyId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "分类id小于等于0"
+		return
+	}
+	//判断分类是否存在
+	classifyInfo, err := help_doc.GetHelpDocClassifyById(req.ClassifyId)
+	if err != nil {
+		br.Msg = "移动失败"
+		br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
+		return
+	}
+	updateCol := make([]string, 0)
+
+	//判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
+	if classifyInfo.ParentId != req.ParentClassifyId && req.ParentClassifyId != 0 {
+		parentClassifyInfo, err := help_doc.GetHelpDocClassifyById(req.ClassifyId)
+		if err != nil {
+			br.Msg = "移动失败"
+			br.ErrMsg = "获取上级分类信息失败,Err:" + err.Error()
+			return
+		}
+		classifyInfo.ParentId = parentClassifyInfo.ClassifyId
+		classifyInfo.Level = parentClassifyInfo.Level + 1
+		classifyInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "ParentId", "Level", "ModifyTime")
+	}
+
+	//如果有传入 上一个兄弟节点分类id
+	if req.PrevClassifyId > 0 {
+		//上一个兄弟节点
+		prevClassify, err := help_doc.GetHelpDocClassifyById(req.PrevClassifyId)
+		if err != nil {
+			br.Msg = "移动失败"
+			br.ErrMsg = "获取上一个兄弟节点分类信息失败,Err:" + err.Error()
+			return
+		}
+
+		//如果是移动在两个兄弟节点之间
+		if req.NextClassifyId > 0 {
+			//下一个兄弟节点
+			nextClassify, err := help_doc.GetHelpDocClassifyById(req.NextClassifyId)
+			if err != nil {
+				br.Msg = "移动失败"
+				br.ErrMsg = "获取下一个兄弟节点分类信息失败,Err:" + err.Error()
+				return
+			}
+			//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
+			if prevClassify.Sort == nextClassify.Sort || prevClassify.Sort == classifyInfo.Sort {
+				//变更兄弟节点的排序
+				updateSortStr := `sort + 2`
+				_ = help_doc.UpdateHelpDocClassifySortByParentId(prevClassify.ParentId, prevClassify.ClassifyId, prevClassify.Sort, updateSortStr)
+			} else {
+				//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
+				if nextClassify.Sort-prevClassify.Sort == 1 {
+					//变更兄弟节点的排序
+					updateSortStr := `sort + 1`
+					_ = help_doc.UpdateHelpDocClassifySortByParentId(prevClassify.ParentId, 0, prevClassify.Sort, updateSortStr)
+				}
+			}
+		}
+
+		classifyInfo.Sort = prevClassify.Sort + 1
+		classifyInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+
+	} else {
+		firstClassify, err := help_doc.GetFirstHelpDocClassifyByParentId(classifyInfo.ParentId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "移动失败"
+			br.ErrMsg = "获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + err.Error()
+			return
+		}
+
+		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+		if firstClassify != nil && firstClassify.Sort == 0 {
+			updateSortStr := ` sort + 1 `
+			_ = help_doc.UpdateHelpDocClassifySortByParentId(firstClassify.ParentId, firstClassify.ClassifyId-1, 0, updateSortStr)
+		}
+
+		classifyInfo.Sort = 0 //那就是排在第一位
+		classifyInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	}
+
+	//更新
+	if len(updateCol) > 0 {
+		err = classifyInfo.Update(updateCol)
+		if err != nil {
+			br.Msg = "移动失败"
+			br.ErrMsg = "修改失败,Err:" + err.Error()
+			return
+		}
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "移动成功"
+}

+ 565 - 0
controllers/help_doc/doc.go

@@ -0,0 +1,565 @@
+package help_doc
+
+import (
+	"hongze/hz_crm_api/controllers"
+)
+
+// HelpDocController 帮助文档
+type HelpDocController struct {
+	controllers.BaseAuthController
+}
+
+//// @Title 新增报告接口
+//// @Description 新增报告
+//// @Param	request	body help_doc.AddHelpDocReq true "type json string"
+//// @Success 200 {object} models.AddEnglishReportResp
+//// @router /add [post]
+//func (this *HelpDocController) Add() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//	sysUser := this.SysUser
+//	if sysUser == nil {
+//		br.Msg = "请登录"
+//		br.ErrMsg = "请登录,SysUser Is Empty"
+//		br.Ret = 408
+//		return
+//	}
+//	var req help_doc.AddHelpDocReq
+//	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+//	if err != nil {
+//		br.Msg = "参数解析异常!"
+//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//		return
+//	}
+//	if req.Content == "" {
+//		br.Msg = "请输入内容"
+//		return
+//	}
+//
+//	item := new(help_doc.HelpDoc)
+//	item.ClassifyId = req.ClassifyId
+//	item.ClassifyName = req.ClassifyName
+//	item.Title = req.Title
+//	item.Author = req.Author
+//	item.Status = req.Status
+//	item.Content = html.EscapeString(req.Content)
+//	item.CreateTime = time.Now()
+//	item.ModifyTime = time.Now()
+//	item.AdminId = sysUser.AdminId
+//	item.AdminRealName = sysUser.RealName
+//	_, err = help_doc.AddHelpDoc(item)
+//	if err != nil {
+//		br.Msg = "保存失败"
+//		br.ErrMsg = "保存失败,Err:" + err.Error()
+//		return
+//	}
+//
+//	//resp := new(models.AddEnglishReportResp)
+//	//resp.ReportId = newReportId
+//	//resp.ReportCode = reportCode
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "保存成功"
+//	//br.Data = resp
+//}
+//
+//// @Title 编辑报告接口
+//// @Description 编辑报告
+//// @Param	request	body models.EditEnglishReportReq true "type json string"
+//// @Success 200 {object} models.EditEnglishReportResp
+//// @router /edit [post]
+//func (this *HelpDocController) Edit() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//	sysUser := this.SysUser
+//	if sysUser == nil {
+//		br.Msg = "请登录"
+//		br.ErrMsg = "请登录,SysUser Is Empty"
+//		br.Ret = 408
+//		return
+//	}
+//	var req models.EditEnglishReportReq
+//	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+//	if err != nil {
+//		br.Msg = "参数解析异常!"
+//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//		return
+//	}
+//	if req.Content == "" {
+//		br.Msg = "请输入内容"
+//		return
+//	}
+//	if req.Overview == "" {
+//		br.Msg = "请输入overview"
+//		return
+//	}
+//	if req.Abstract == "" {
+//		br.Msg = "请输入摘要"
+//		return
+//	}
+//
+//	//var contentSub string
+//	//if req.Content != "" {
+//	//	content, e := services.FilterReportContentBr(req.Content)
+//	//	if e != nil {
+//	//		br.Msg = "内容去除前后空格失败"
+//	//		br.ErrMsg = "内容去除前后空格失败, Err: " + e.Error()
+//	//		return
+//	//	}
+//	//	req.Content = content
+//	//
+//	//	contentSub, err = services.GetReportContentSub(req.Content)
+//	//	if err != nil {
+//	//		go alarm_msg.SendAlarmMsg("解析 ContentSub 失败,Err:"+err.Error(), 3)
+//	//		//utils.SendEmail(utils.APPNAME+"失败提醒", "解析 ContentSub 失败,Err:"+err.Error(), utils.EmailSendToUsers)
+//	//	}
+//	//}
+//
+//	var stage int
+//	report, _ := models.GetEnglishReportById(int(req.ReportId))
+//
+//	item := new(help_doc.HelpDoc)
+//	item.ClassifyId = req.ClassifyIdFirst
+//	item.ClassifyName = req.ClassifyNameFirst
+//	item.Title = req.Title
+//	item.Author = req.Author
+//	item.Content = html.EscapeString(req.Content)
+//	item.ModifyTime = time.Now()
+//	err = models.EditEnglishReport(item, req.ReportId)
+//	if err != nil {
+//		br.Msg = "保存失败"
+//		br.ErrMsg = "保存失败,Err:" + err.Error()
+//		return
+//	}
+//
+//	reportCode := utils.MD5(strconv.Itoa(int(req.ReportId)))
+//	resp := new(models.EditEnglishReportResp)
+//	resp.ReportId = req.ReportId
+//	resp.ReportCode = reportCode
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "保存成功"
+//	br.Data = resp
+//}
+//
+//// @Title 获取报告详情接口
+//// @Description 获取报告详情
+//// @Param	request	body models.ReportDetailReq true "type json string"
+//// @Success 200 {object} models.EnglishReportDetailView
+//// @router /detail [get]
+//func (this *HelpDocController) Detail() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//	/*var req models.ReportDetailReq
+//	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+//	if err != nil {
+//		br.Msg = "参数解析异常!"
+//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//		return
+//	}
+//	if req.ReportId <= 0 {
+//		br.Msg = "参数错误"
+//		return
+//	}*/
+//	reportId, err := this.GetInt("ReportId")
+//	if err != nil {
+//		br.Msg = "获取参数失败!"
+//		br.ErrMsg = "获取参数失败,Err:" + err.Error()
+//		return
+//	}
+//	if reportId <= 0 {
+//		br.Msg = "参数错误"
+//		return
+//	}
+//	item, err := models.GetEnglishReportById(reportId)
+//	if err != nil {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取失败,Err:" + err.Error()
+//		return
+//	}
+//
+//	item.Content = html.UnescapeString(item.Content)
+//	item.ContentSub = html.UnescapeString(item.ContentSub)
+//
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "获取成功"
+//	br.Data = item
+//}
+//
+//// @Title 获取报告列表接口
+//// @Description 获取报告列表
+//// @Param   PageSize   query   int  true       "每页数据条数"
+//// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+//// @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   State   query   int  true       "状态"
+//// @Param   KeyWord   query   string  true       "搜索关键词"
+//// @Param   PublishSort   query   string  true       "desc:降序,asc 升序(预留)"
+//// @Param   CompanyType   query   string  false       "产品类型,枚举值:'ficc','权益';不传默认返回全部"
+//// @Success 200 {object} models.ReportListResp
+//// @router /list [get]
+//func (this *HelpDocController) ListReport() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//	sysUser := this.SysUser
+//	if sysUser == nil {
+//		br.Msg = "请登录"
+//		br.ErrMsg = "请登录,SysUser Is Empty"
+//		br.Ret = 408
+//		return
+//	}
+//
+//	pageSize, _ := this.GetInt("PageSize")
+//	currentIndex, _ := this.GetInt("CurrentIndex")
+//
+//	startDate := this.GetString("StartDate")
+//	endDate := this.GetString("EndDate")
+//	frequency := this.GetString("Frequency")
+//	classifyNameFirst := this.GetString("ClassifyNameFirst")
+//	classifyNameSecond := this.GetString("ClassifyNameSecond")
+//	state, _ := this.GetInt("State")
+//	keyWord := this.GetString("KeyWord")
+//	companyType := this.GetString("CompanyType")
+//	// 群发邮件状态筛选
+//	emailState, _ := this.GetInt("EmailState")
+//
+//	var startSize int
+//	if pageSize <= 0 {
+//		pageSize = utils.PageSize20
+//	}
+//	if currentIndex <= 0 {
+//		currentIndex = 1
+//	}
+//	startSize = utils.StartIndex(currentIndex, pageSize)
+//
+//	var condition string
+//	var pars []interface{}
+//
+//	if keyWord != "" {
+//		condition += ` AND (title LIKE '%` + keyWord + `%' OR author LIKE '%` + keyWord + `%' ) `
+//	}
+//	if startDate != "" {
+//		condition += ` AND create_time >= ? `
+//		pars = append(pars, startDate)
+//	}
+//	if endDate != "" {
+//		condition += ` AND create_time <= ? `
+//		pars = append(pars, endDate)
+//	}
+//	if frequency != "" {
+//		condition += ` AND frequency = ? `
+//		pars = append(pars, frequency)
+//	}
+//	if classifyNameFirst != "" {
+//		condition += ` AND classify_name_first = ? `
+//		pars = append(pars, classifyNameFirst)
+//	}
+//
+//	if classifyNameSecond != "" {
+//		condition += ` AND classify_name_second = ? `
+//		pars = append(pars, classifyNameSecond)
+//	}
+//	if state > 0 {
+//		condition += ` AND state = ? `
+//		pars = append(pars, state)
+//	}
+//	// 未群发邮件(包含推送邮件失败的)
+//	if emailState == 1 {
+//		failIds, e := models.GetHasFailEmailLogReportIds()
+//		if e != nil {
+//			br.Msg = "获取失败"
+//			br.ErrMsg = "获取存在邮件推送失败记录的英文报告IDs失败, Err:" + e.Error()
+//			return
+//		}
+//		condition += ` AND email_state = 0`
+//		if len(failIds) > 0 {
+//			condition += ` OR id IN (` + utils.GetOrmInReplace(len(failIds)) + `)`
+//			pars = append(pars, failIds)
+//		}
+//	}
+//	// 已群发邮件
+//	if emailState == 2 {
+//		successIds, e := models.GetSuccessEmailLogReportIds()
+//		if e != nil {
+//			br.Msg = "获取失败"
+//			br.ErrMsg = "获取邮件推送记录均为成功的英文报告IDs失败, Err:" + e.Error()
+//			return
+//		}
+//		condition += ` AND email_state = 1`
+//		if len(successIds) > 0 {
+//			condition += ` AND id IN (` + utils.GetOrmInReplace(len(successIds)) + `)`
+//			pars = append(pars, successIds)
+//		}
+//	}
+//
+//	total, err := models.GetEnglishReportListCount(condition, pars, companyType)
+//	if err != nil {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取失败,Err:" + err.Error()
+//		return
+//	}
+//	list, err := models.GetEnglishReportList(condition, pars, companyType, startSize, pageSize)
+//	if err != nil {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取失败,Err:" + err.Error()
+//		return
+//	}
+//
+//	// 获取邮件配置-是否有权限群发
+//	conf := new(models.EnglishReportEmailConf)
+//	authKey := "english_report_email_conf"
+//	confAuth, e := company.GetConfigDetailByCode(authKey)
+//	if e != nil {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取群发邮件权限失败, Err: " + e.Error()
+//		return
+//	}
+//	if confAuth.ConfigValue == "" {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "群发邮件配置为空"
+//		return
+//	}
+//	if e := json.Unmarshal([]byte(confAuth.ConfigValue), &conf); e != nil {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "群发邮件配置有误"
+//		return
+//	}
+//	authOk := false
+//	authArr := strings.Split(conf.SendAuthGroup, ",")
+//	if utils.InArrayByStr(authArr, sysUser.RoleTypeCode) {
+//		authOk = true
+//	}
+//
+//	// 是否有群发邮件失败的记录,标记红点
+//	failList, e := models.GetEnglishReportEmailLogFailList(0)
+//	if e != nil {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取群发邮件记录失败, Err: " + e.Error()
+//		return
+//	}
+//	failMap := make(map[int]bool, 0)
+//	for i := range failList {
+//		failMap[failList[i].ReportId] = true
+//	}
+//
+//	for _, item := range list {
+//		if item.State == 2 {
+//			item.ShareUrl = "https://share.hzinsights.com/reportEn?code=" + item.ReportCode
+//		}
+//		item.EmailAuth = authOk
+//		item.EmailHasFail = failMap[item.Id]
+//		// 邮箱PV大于0的时候, 不展示最初版本的PV
+//		if item.PvEmail > 0 {
+//			item.Pv = 0
+//		}
+//
+//		/*key := fmt.Sprint(`crm:enReport:edit:`, item.Id)
+//		opUserId, _ := utils.Rc.RedisInt(key)
+//		//如果当前没有人操作,获取当前操作人是本人,那么编辑按钮可用
+//		if opUserId <= 0 || (opUserId == this.SysUser.AdminId) {
+//			item.CanEdit = true
+//		} else {
+//			adminInfo, errAdmin := system.GetSysUserById(opUserId)
+//			if errAdmin != nil {
+//				br.Msg = "获取失败"
+//				br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
+//				return
+//			}
+//			item.Editor = adminInfo.RealName
+//		}*/
+//		markStatus, err := services.UpdateEnReportEditMark(item.Id, this.SysUser.AdminId, 2, this.SysUser.RealName)
+//		if err != nil {
+//			br.Msg = "查询标记状态失败"
+//			br.ErrMsg = "查询标记状态失败,Err:" + err.Error()
+//			return
+//		}
+//		if markStatus.Status == 0 {
+//			item.CanEdit = true
+//		} else {
+//			item.Editor = markStatus.Editor
+//		}
+//	}
+//	page := paging.GetPaging(currentIndex, pageSize, total)
+//	resp := new(models.EnglishReportListResp)
+//	resp.Paging = page
+//	resp.List = list
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "获取成功"
+//	br.Data = resp
+//}
+//
+//// @Title 发布报告接口
+//// @Description 发布报告
+//// @Param	request	body models.PublishReq true "type json string"
+//// @Success 200 Ret=200 发布成功
+//// @router /publish [post]
+//func (this *HelpDocController) PublishReport() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//	var req models.PublishReq
+//	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+//	if err != nil {
+//		br.Msg = "参数解析异常!"
+//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//		return
+//	}
+//	reportIds := req.ReportIds
+//	if reportIds == "" {
+//		br.Msg = "参数错误"
+//		br.ErrMsg = "参数错误,报告id不可为空"
+//		return
+//	}
+//
+//	reportArr := strings.Split(reportIds, ",")
+//	for _, v := range reportArr {
+//		vint, err := strconv.Atoi(v)
+//		if err != nil {
+//			br.Msg = "参数错误"
+//			br.ErrMsg = "参数错误,Err:" + err.Error()
+//			return
+//		}
+//		report, err := models.GetEnglishReportById(vint)
+//		if err != nil {
+//			br.Msg = "获取报告信息失败"
+//			br.ErrMsg = "获取报告信息失败,Err:" + err.Error()
+//			return
+//		}
+//		if report == nil {
+//			br.Msg = "报告不存在"
+//			return
+//		}
+//
+//		var tmpErr error
+//
+//		if report.Content == "" {
+//			br.Msg = "报告内容为空,不可发布"
+//			br.ErrMsg = "报告内容为空,不需要生成,report_id:" + strconv.Itoa(report.Id)
+//			return
+//		}
+//		if tmpErr = models.PublishEnglishReportById(report.Id); tmpErr != nil {
+//			br.Msg = "报告发布失败"
+//			br.ErrMsg = "报告发布失败, Err:" + tmpErr.Error() + ", report_id:" + strconv.Itoa(report.Id)
+//			return
+//		}
+//		go func() {
+//			_ = services.UpdateEnglishReportEs(report.Id, 2)
+//		}()
+//	}
+//
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "发布成功"
+//}
+//
+//// @Title 取消发布报告接口
+//// @Description 取消发布报告
+//// @Param	request	body models.PublishCancelReq true "type json string"
+//// @Success 200 Ret=200 取消发布成功
+//// @router /publish/cancel [post]
+//func (this *HelpDocController) PublishCancleReport() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//	var req models.PublishCancelReq
+//	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+//	if err != nil {
+//		br.Msg = "参数解析异常!"
+//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//		return
+//	}
+//	if req.ReportIds <= 0 {
+//		br.Msg = "参数错误"
+//		br.ErrMsg = "参数错误,报告id不可为空"
+//		return
+//	}
+//	err = models.PublishCancelEnglishReport(req.ReportIds)
+//	if err != nil {
+//		br.Msg = "取消发布失败"
+//		br.ErrMsg = "取消发布失败,Err:" + err.Error()
+//		return
+//	}
+//	// 更新es里的报告状态
+//	go func() {
+//		_ = services.UpdateEnglishReportEs(req.ReportIds, 1)
+//	}()
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "取消发布成功"
+//}
+//
+//// @Title 删除报告接口
+//// @Description 删除报告
+//// @Param	request	body models.DeleteReq true "type json string"
+//// @Success 200 Ret=200 删除成功
+//// @router /delete [post]
+//func (this *HelpDocController) Delete() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//	var req models.DeleteReq
+//	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+//	if err != nil {
+//		br.Msg = "参数解析异常!"
+//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//		return
+//	}
+//	if req.ReportIds <= 0 {
+//		br.Msg = "参数错误"
+//		br.ErrMsg = "参数错误,报告id不可为空"
+//		return
+//	}
+//	reportInfo, err := models.GetEnglishReportById(req.ReportIds)
+//	if err != nil {
+//		if err.Error() == utils.ErrNoRow() {
+//			br.Msg = "报告不存在"
+//			return
+//		}
+//		br.Msg = "查询报告信息失败"
+//		br.ErrMsg = "查询报告信息失败, Err" + err.Error()
+//		return
+//	}
+//
+//	// 更新es里的报告状态
+//	_ = services.UpdateEnglishReportEs(req.ReportIds, 1)
+//	if err = models.DeleteEnglishReportAndChapter(reportInfo); err != nil {
+//		br.Msg = "删除失败"
+//		br.ErrMsg = "删除报告失败, Err: " + err.Error()
+//		return
+//	}
+//
+//	// 重置PPT关联报告
+//	go func() {
+//		_ = services.ResetPPTReport(req.ReportIds, true)
+//	}()
+//
+//	go func() {
+//		_ = services.EnglishPolicyReportSyncCancel(reportInfo)
+//	}()
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "删除成功"
+//}

+ 11 - 0
models/db.go

@@ -17,6 +17,7 @@ import (
 	"hongze/hz_crm_api/models/day_new"
 	"hongze/hz_crm_api/models/eta_business"
 	"hongze/hz_crm_api/models/eta_trial"
+	"hongze/hz_crm_api/models/help_doc"
 	"hongze/hz_crm_api/models/roadshow"
 	"hongze/hz_crm_api/models/seal"
 	"hongze/hz_crm_api/models/system"
@@ -186,6 +187,9 @@ func init() {
 
 	// ETA商家
 	initEtaBusiness()
+
+	// 帮助文档
+	initHelpDoc()
 }
 
 // initSystem 系统表 数据表
@@ -644,3 +648,10 @@ func initEtaBusiness() {
 		new(eta_business.EtaBusinessOperationRecord), // ETA操作记录表
 	)
 }
+
+func initHelpDoc() {
+	//注册对象
+	orm.RegisterModel(
+		new(help_doc.HelpDocClassify), //主题
+	)
+}

+ 266 - 0
models/help_doc/classify.go

@@ -0,0 +1,266 @@
+package help_doc
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type HelpDocClassify struct {
+	ClassifyId      int       `orm:"column(classify_id);pk"`
+	ClassifyName    string    `description:"分类名称"`
+	ParentId        int       `description:"父级id"`
+	CreateTime      time.Time `description:"创建时间"`
+	ModifyTime      time.Time `description:"修改时间"`
+	SysUserId       int       `description:"创建人id"`
+	SysUserRealName string    `description:"创建人姓名"`
+	Level           int       `description:"层级"`
+	Sort            int       `description:"排序字段,越小越靠前,默认值:10"`
+}
+
+func AddHelpDocClassify(item *HelpDocClassify) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+type AddHelpDocClassifyReq struct {
+	HelpDocClassifyName string `description:"分类名称"`
+	ParentId            int    `description:"父级id,第一级传0"`
+	Level               int    `description:"层级,第一级传0,其余传上一级的层级"`
+}
+
+func GetHelpDocClassifyCount(HelpDocClassifyName string, parentId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM help_doc_classify WHERE parent_id=? AND classify_name=? `
+	err = o.Raw(sql, parentId, HelpDocClassifyName).QueryRow(&count)
+	return
+}
+
+type EditHelpDocClassifyReq struct {
+	HelpDocClassifyName string `description:"分类名称"`
+	HelpDocClassifyId   int    `description:"分类id"`
+	ParentId            int    `description:"父级id"`
+}
+
+func GetHelpDocClassifyById(classifyId int) (item *HelpDocClassify, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM help_doc_classify WHERE classify_id=? `
+	err = o.Raw(sql, classifyId).QueryRow(&item)
+	return
+}
+
+func GetHelpDocClassifyCountById(classifyId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT count(1) AS count FROM help_doc_classify WHERE classify_id=? `
+	err = o.Raw(sql, classifyId).QueryRow(&count)
+	return
+}
+
+func EditHelpDocClassify(classifyId, parentId int, HelpDocClassifyName string) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE help_doc_classify SET classify_name=?,parent_id = ?, modify_time=NOW() WHERE classify_id=? `
+	_, err = o.Raw(sql, HelpDocClassifyName, parentId, classifyId).Exec()
+	return
+}
+
+func GetChartInfoCountByClassifyId(classifyId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT COUNT(1) AS count FROM chart_info AS a
+				WHERE a.classify_id IN(
+				SELECT t.classify_id FROM 
+				(
+				SELECT rd.*
+				FROM (SELECT * FROM help_doc_classify WHERE parent_id IS NOT NULL) rd,
+					 (SELECT @pid := ?) pd 
+				WHERE FIND_IN_SET(parent_id, @pid) > 0 
+				  AND @pid := CONCAT(@pid, ',', classify_id) 
+				UNION SELECT * FROM help_doc_classify WHERE classify_id = @pid
+				)AS t
+				) `
+	err = o.Raw(sql, classifyId).QueryRow(&count)
+	return
+}
+
+// GetHelpDocClassifyByParentId
+func GetHelpDocClassifyByParentId(parentId int, keyWord string) (items []*HelpDocClassifyItems, err error) {
+	o := orm.NewOrm()
+	sql := ``
+	if keyWord != ""{
+		sql = ` SELECT * FROM help_doc_classify WHERE parent_id=? AND (classify_name LIKE '%` + keyWord + `%' ) order by sort asc,classify_id asc`
+	} else {
+		sql = ` SELECT * FROM help_doc_classify WHERE parent_id=? order by sort asc,classify_id asc`
+	}
+	_, err = o.Raw(sql, parentId).QueryRows(&items)
+	return
+}
+
+// GetHelpDocClassifyAll
+func GetHelpDocClassifyAll(keyWord string) (items []*HelpDocClassifyItems, err error) {
+	o := orm.NewOrm()
+	sql := ``
+	if keyWord != ""{
+		sql = ` SELECT * FROM help_doc_classify WHERE parent_id<>0 AND (classify_name LIKE '%` + keyWord + `%' ) order by sort asc,classify_id asc`
+	} else {
+		sql = ` SELECT * FROM help_doc_classify WHERE parent_id<>0 order by sort asc,classify_id asc`
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type HelpDocClassifyItems struct {
+	ClassifyId     int `description:"分类id"`
+	ClassifyName   string
+	ParentId              int
+	Level                 int    `description:"层级"`
+	Sort                  int    `description:"排序字段,越小越靠前,默认值:10"`
+	SourceName            string `description:"来源名称"`
+	SysUserId             int    `description:"创建人id"`
+	SysUserRealName       string `description:"创建人姓名"`
+	Children              []*HelpDocClassifyItems
+}
+
+type HelpDocClassifyListResp struct {
+	AllNodes []*HelpDocClassifyItems
+}
+
+type HelpDocClassifyDeleteCheckResp struct {
+	DeleteStatus int    `description:"检测状态:0:默认值,如果为0,继续走其他校验,1:该分类下关联图表不可删除,2:确认删除当前目录及包含的子目录吗"`
+	TipsMsg      string `description:"提示信息"`
+}
+
+type HelpDocClassifyDeleteCheckReq struct {
+	HelpDocClassifyId int `description:"分类id"`
+	ChartInfoId       int `description:"指标id"`
+}
+
+func GetHelpDocClassifyByCondition(condition string, pars []interface{}) (item *HelpDocClassify, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM help_doc_classify WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+// MoveHelpDocClassifyReq 移动图表分类请求参数
+type MoveHelpDocClassifyReq struct {
+	ClassifyId       int `description:"分类id"`
+	ParentClassifyId int `description:"父级分类id"`
+	PrevClassifyId   int `description:"上一个兄弟节点分类id"`
+	NextClassifyId   int `description:"下一个兄弟节点分类id"`
+}
+
+// GetFirstHelpDocClassifyByParentId 获取当前父级图表分类下的排序第一条的数据
+func GetFirstHelpDocClassifyByParentId(parentId int) (item *HelpDocClassify, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM help_doc_classify WHERE parent_id=? order by sort asc,classify_id asc limit 1`
+	err = o.Raw(sql, parentId).QueryRow(&item)
+	return
+}
+
+// UpdateHelpDocClassifySortByParentId 根据图表父类id更新排序
+func UpdateHelpDocClassifySortByParentId(parentId, classifyId, nowSort int, updateSort string) (err error) {
+	o := orm.NewOrm()
+	sql := ` update help_doc_classify set sort = ` + updateSort + ` WHERE parent_id=? and sort > ? `
+	if classifyId > 0 {
+		sql += ` or ( classify_id > ` + fmt.Sprint(classifyId) + ` and sort= ` + fmt.Sprint(nowSort) + `)`
+	}
+	_, err = o.Raw(sql, parentId, nowSort).Exec()
+	return
+}
+
+// Update 更新图表分类基础信息
+func (HelpDocClassify *HelpDocClassify) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(HelpDocClassify, cols...)
+	return
+}
+
+// GetHelpDocClassifyMaxSort 获取分类下最大的排序数
+func GetHelpDocClassifyMaxSort(parentId int) (sort int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT Max(sort) AS sort FROM help_doc_classify WHERE parent_id=?  `
+	err = o.Raw(sql, parentId).QueryRow(&sort)
+	return
+}
+
+type HelpDocClassifyView struct {
+	HelpDocClassifyId   int    `orm:"column(classify_id);pk"`
+	HelpDocClassifyName string `description:"分类名称"`
+	ParentId            int    `description:"父级id"`
+}
+
+func GetHelpDocClassifyViewById(classifyId int) (item *HelpDocClassifyView, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM help_doc_classify WHERE classify_id=? `
+	err = o.Raw(sql, classifyId).QueryRow(&item)
+	return
+}
+
+func GetHelpDocClassifyByParentIdFromETA(parentId int) (items []*HelpDocClassifyItems, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM help_doc_classify WHERE parent_id=? AND source = 1 order by sort asc,classify_id asc`
+	_, err = o.Raw(sql, parentId).QueryRows(&items)
+	return
+}
+
+func GetHelpDocClassifyAllFromETA() (items []*HelpDocClassifyItems, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM help_doc_classify WHERE parent_id<>0 AND source = 1 order by sort asc,classify_id asc`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+func GetHelpDocClassifyTwo(source int) (items []*HelpDocClassifyItems, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM help_doc_classify WHERE level=3 AND source = ? order by sort asc,classify_id asc`
+	_, err = o.Raw(sql, source).QueryRows(&items)
+	return
+}
+
+func GetHelpDocClassifyByLevel(level, source int) (items []*HelpDocClassifyItems, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM help_doc_classify WHERE level=? AND source = ? order by sort asc,classify_id asc`
+	_, err = o.Raw(sql, level, source).QueryRows(&items)
+	return
+}
+
+func EditHelpDocClassifySysUser(classifyId, sysUserId int, HelpDocClassifyName string) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE help_doc_classify SET sys_user_id=?,sys_user_real_name=?,modify_time=NOW() WHERE parent_id=?  AND level=3 `
+	_, err = o.Raw(sql, sysUserId, HelpDocClassifyName, classifyId).Exec()
+	return
+}
+
+func GetHelpDocClassifyChildCounts(parentId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM help_doc_classify WHERE parent_id=? `
+	err = o.Raw(sql, parentId).QueryRow(&count)
+	return
+}
+
+func GetHelpDocCounts(classifyId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM help_doc WHERE classify_id=? `
+	err = o.Raw(sql, classifyId).QueryRow(&count)
+	return
+}
+
+// DeleteHelpDocClassify 删除分类
+func DeleteHelpDocClassify(classifyId int) (err error) {
+	o := orm.NewOrm()
+	sql := ` DELETE FROM help_doc_classify WHERE classify_id =? `
+	_, err = o.Raw(sql, classifyId).Exec()
+	return
+}
+
+
+// MoveClassifyReq 移动分类请求参数
+type MoveClassifyReq struct {
+	ClassifyId       int `description:"分类id"`
+	ParentClassifyId int `description:"父级分类id"`
+	PrevClassifyId   int `description:"上一个兄弟节点分类id"`
+	NextClassifyId   int `description:"下一个兄弟节点分类id"`
+}

+ 82 - 0
models/help_doc/help_doc.go

@@ -0,0 +1,82 @@
+package help_doc
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type HelpDoc struct {
+	Id            int       `orm:"column(id);pk"`
+	ClassifyId    int       // 分类id
+	ClassifyName  string    // 分类名称
+	Title         string    // 标题
+	Author        string    // 作者
+	CreateTime    time.Time // 创建时间
+	ModifyTime    time.Time // 修改时间
+	Status        int       // 1:未发布,2:已发布
+	PublishTime   time.Time // 发布时间
+	Content       string    // 内容
+	AdminId       int     // 创建人
+	AdminRealName string    // 创建人姓名
+}
+
+func EditHelpDocClassifyId(classifyId int, classifyName string) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE help_doc SET classify_name=?,modify_time=NOW() WHERE classify_id=? `
+	_, err = o.Raw(sql, classifyId, classifyName).Exec()
+	return
+}
+
+type AddHelpDocReq struct {
+	ClassifyId   int    `description:"一级分类id"`
+	ClassifyName string `description:"一级分类名称"`
+	Title        string `description:"标题"`
+	Author       string `description:"作者"`
+	Status       int    `description:"状态:1:未发布,2:已发布"`
+	Content      string `description:"内容"`
+}
+
+func AddHelpDoc(item *HelpDoc) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+type EditHelpDocReq struct {
+	Id           int64  `description:"文章id"`
+	ClassifyId    int    `description:"分类id"`
+	ClassifyName  string `description:"分类名称"`
+	Title              string `description:"标题"`
+	Abstract           string `description:"摘要"`
+	Author             string `description:"作者"`
+	Frequency          string `description:"频度"`
+	State              int    `description:"状态:1:未发布,2:已发布"`
+	Content            string `description:"内容"`
+	CreateTime         string `description:"创建时间"`
+	Overview           string `description:"英文概述部分"`
+}
+
+//func EditHelpDoc(item *HelpDoc, reportId int64) (err error) {
+//	o := orm.NewOrmUsingDB("rddp")
+//	sql := `UPDATE help_doc
+//			SET
+//			  classify_id =?,
+//			  classify_name_first = ?,
+//			  classify_id_second = ?,
+//			  classify_name_second = ?,
+//			  title = ?,
+//			  abstract = ?,
+//			  author = ?,
+//			  frequency = ?,
+//			  state = ?,
+//			  content = ?,
+//			  content_sub = ?,
+//			  stage =?,
+//			  create_time = ?,
+//			  modify_time = ?,
+//			  overview = ?
+//			WHERE id = ? `
+//	_, err = o.Raw(sql, item.ClassifyIdFirst, item.ClassifyNameFirst, item.ClassifyIdSecond, item.ClassifyNameSecond, item.Title,
+//		item.Abstract, item.Author, item.Frequency, item.State, item.Content, item.ContentSub, item.Stage, item.CreateTime, time.Now(), item.Overview, reportId).Exec()
+//	return
+//}

+ 45 - 0
routers/commentsRouter.go

@@ -6550,6 +6550,51 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/help_doc:HelpDocClassifyController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/help_doc:HelpDocClassifyController"],
+        beego.ControllerComments{
+            Method: "AddClassify",
+            Router: `/classify/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/help_doc:HelpDocClassifyController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/help_doc:HelpDocClassifyController"],
+        beego.ControllerComments{
+            Method: "DelClassify",
+            Router: `/classify/delete`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/help_doc:HelpDocClassifyController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/help_doc:HelpDocClassifyController"],
+        beego.ControllerComments{
+            Method: "EditClassify",
+            Router: `/classify/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/help_doc:HelpDocClassifyController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/help_doc:HelpDocClassifyController"],
+        beego.ControllerComments{
+            Method: "ListClassify",
+            Router: `/classify/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/help_doc:HelpDocClassifyController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/help_doc:HelpDocClassifyController"],
+        beego.ControllerComments{
+            Method: "ClassifyMove",
+            Router: `/classify/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/roadshow:CalendarController"],
         beego.ControllerComments{
             Method: "Accept",

+ 7 - 0
routers/router.go

@@ -22,6 +22,7 @@ import (
 	"hongze/hz_crm_api/controllers/data_manage/supply_analysis"
 	"hongze/hz_crm_api/controllers/english_report"
 	"hongze/hz_crm_api/controllers/eta_business"
+	"hongze/hz_crm_api/controllers/help_doc"
 	"hongze/hz_crm_api/controllers/roadshow"
 	"hongze/hz_crm_api/controllers/seal"
 	"hongze/hz_crm_api/controllers/yb"
@@ -305,6 +306,12 @@ func init() {
 				&eta_business.EtaBusinessController{},
 			),
 		),
+		web.NSNamespace("/help_doc",
+			web.NSInclude(
+				&help_doc.HelpDocClassifyController{},
+				&help_doc.HelpDocController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 35 - 0
services/data/help_doc_classify.go

@@ -0,0 +1,35 @@
+package data
+
+import "hongze/hz_crm_api/models/help_doc"
+
+func helpDocClassifyHaveChild(allNode []*help_doc.HelpDocClassifyItems, node *help_doc.HelpDocClassifyItems) (childs []*help_doc.HelpDocClassifyItems, yes bool) {
+	for _, v := range allNode {
+		if v.ParentId == node.ClassifyId {
+			childs = append(childs, v)
+		}
+	}
+	if len(childs) > 0 {
+		yes = true
+	}
+	return
+}
+
+func HelpDocClassifyItemsMakeTree(allNode []*help_doc.HelpDocClassifyItems, node *help_doc.HelpDocClassifyItems) {
+	childs, _ := helpDocClassifyHaveChild(allNode, node) //判断节点是否有子节点并返回
+	if len(childs) > 0 {
+		node.Children = append(node.Children, childs[0:]...) //添加子节点
+		for _, v := range childs {                           //查询子节点的子节点,并添加到子节点
+			_, has := helpDocClassifyHaveChild(allNode, v)
+			if has {
+				HelpDocClassifyItemsMakeTree(allNode, v) //递归添加节点
+			} else {
+				childrenArr := make([]*help_doc.HelpDocClassifyItems, 0)
+				v.Children = childrenArr
+			}
+		}
+	} else {
+		childrenArr := make([]*help_doc.HelpDocClassifyItems, 0)
+		node.Children = childrenArr
+	}
+}
+