hsun hace 1 año
padre
commit
8a3e9f4867

+ 401 - 0
controllers/report_approve/report_approve_flow.go

@@ -0,0 +1,401 @@
+package report_approve
+
+import (
+	"encoding/json"
+	"eta/eta_api/controllers"
+	"eta/eta_api/models"
+	"eta/eta_api/models/report_approve"
+	"eta/eta_api/models/smart_report"
+	"eta/eta_api/models/system"
+	"eta/eta_api/services"
+	smartReportService "eta/eta_api/services/smart_report"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strings"
+	"sync"
+	"time"
+)
+
+// ReportApproveFlowController 智能研报
+type ReportApproveFlowController struct {
+	controllers.BaseAuthController
+}
+
+// Add
+// @Title 新增
+// @Description 新增
+// @Param	request	body smart_report.SmartReportAddReq true "type json string"
+// @Success 200 {object} smart_report.SmartReportItem
+// @router /add [post]
+func (this *ReportApproveFlowController) Add() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		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 smart_report.SmartReportAddReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.AddType != 1 && req.AddType != 2 {
+		br.Msg = "请选择新增方式"
+		return
+	}
+	if req.ClassifyIdFirst <= 0 || req.ClassifyIdSecond <= 0 {
+		br.Msg = "请选择分类"
+		return
+	}
+	req.Title = strings.TrimSpace(req.Title)
+	if req.Title == "" {
+		br.Msg = "请输入标题"
+		return
+	}
+
+	reportOB := new(smart_report.SmartReport)
+	stageMax, e := reportOB.GetMaxStageByClassifyId(req.ClassifyIdSecond)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取期数失败, Err: " + e.Error()
+		return
+	}
+	stageMax += 1
+
+	item := new(smart_report.SmartReport)
+	item.AddType = req.AddType
+	item.ClassifyIdFirst = req.ClassifyIdFirst
+	item.ClassifyNameFirst = req.ClassifyNameFirst
+	item.ClassifyIdSecond = req.ClassifyIdSecond
+	item.ClassifyNameSecond = req.ClassifyNameSecond
+	item.Title = req.Title
+	item.Abstract = req.Abstract
+	item.Author = req.Author
+	item.Frequency = req.Frequency
+	item.Stage = stageMax
+	item.AdminId = sysUser.AdminId
+	item.AdminRealName = sysUser.RealName
+	item.LastModifyAdminId = sysUser.AdminId
+	item.LastModifyAdminName = sysUser.RealName
+	item.State = smart_report.SmartReportStateWaitPublish
+	item.CreateTime = time.Now().Local()
+	item.ModifyTime = time.Now().Local()
+	// 继承报告
+	if req.AddType == 2 {
+		ob := new(smart_report.SmartReport)
+		cond := ` AND classify_id_first = ? AND classify_id_second = ?`
+		pars := make([]interface{}, 0)
+		pars = append(pars, req.ClassifyIdFirst, req.ClassifyIdSecond)
+		lastReport, e := ob.GetItemByCondition(cond, pars, "stage DESC")
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取往期研报失败, Err: " + e.Error()
+			return
+		}
+		if lastReport != nil {
+			item.Content = lastReport.Content
+			item.ContentSub = lastReport.ContentSub
+			item.ContentStruct = lastReport.ContentStruct
+		}
+	}
+	if e = item.Create(); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "新增研报失败, Err: " + e.Error()
+		return
+	}
+	uniqueCode := utils.MD5(fmt.Sprint("smart_", item.SmartReportId))
+	item.ReportCode = uniqueCode
+	if e = item.Update([]string{"ReportCode"}); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "更新研报编码失败, Err: " + e.Error()
+		return
+	}
+	resp := smart_report.FormatSmartReport2Item(item)
+
+	recordItem := &models.ReportStateRecord{
+		ReportId:   item.SmartReportId,
+		ReportType: 2,
+		State:      smart_report.SmartReportStateWaitPublish,
+		AdminId:    this.SysUser.AdminId,
+		AdminName:  this.SysUser.AdminName,
+		CreateTime: time.Now(),
+	}
+	go func() {
+		_, _ = models.AddReportStateRecord(recordItem)
+	}()
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+	br.Data = resp
+}
+
+// List
+// @Title 报告列表
+// @Description 报告列表
+// @Param   PageSize			query	int		true	"每页数据条数"
+// @Param   CurrentIndex		query	int		true	"当前页页码"
+// @Param   TimeType			query	string	false	"筛选的时间类别: publish_time-发布时间, modify_time-更新时间"
+// @Param   StartDate			query   string  false	"开始时间"
+// @Param   EndDate				query   string  false	"结束时间"
+// @Param   Frequency			query   string  false	"频度"
+// @Param   ClassifyIdFirst		query	int		false	"一级分类ID"
+// @Param   ClassifyIdSecond	query	int		false	"二级分类ID"
+// @Param   State				query	int		false	"发布状态: 1-待发布; 2-已发布"
+// @Param   Keyword				query	string	false	"搜索关键词"
+// @Success 200 {object} smart_report.SmartReportListResp
+// @router /list [get]
+func (this *ReportApproveFlowController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	type SmartReportListReq struct {
+		PageSize         int    `form:"PageSize"`
+		CurrentIndex     int    `form:"CurrentIndex"`
+		TimeType         string `form:"TimeType"`
+		StartDate        string `form:"StartDate"`
+		EndDate          string `form:"EndDate"`
+		Frequency        string `form:"Frequency"`
+		ClassifyIdFirst  int    `form:"ClassifyIdFirst"`
+		ClassifyIdSecond int    `form:"ClassifyIdSecond"`
+		State            int    `form:"State"`
+		Keyword          string `form:"Keyword"`
+	}
+	params := new(SmartReportListReq)
+	if e := this.ParseForm(params); e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "入参解析失败, Err: " + e.Error()
+		return
+	}
+	if params.TimeType == "" {
+		params.TimeType = "publish_time"
+	}
+	if params.TimeType != "publish_time" && params.TimeType != "modify_time" {
+		br.Msg = "请选择正确的时间类型"
+		return
+	}
+	// 更新时间指的是内容更新时间
+	if params.TimeType == "modify_time" {
+		params.TimeType = "content_modify_time"
+	}
+
+	var condition string
+	var pars []interface{}
+	// 筛选项
+	{
+		keyword := strings.TrimSpace(params.Keyword)
+		if keyword != "" {
+			kw := fmt.Sprint("%", keyword, "%")
+			condition += fmt.Sprintf(` AND (title LIKE ? OR admin_real_name LIKE ? OR last_modify_admin_name LIKE ?)`)
+			pars = append(pars, kw, kw, kw)
+		}
+		if params.StartDate != "" && params.EndDate != "" {
+			st := fmt.Sprintf("%s 00:00:00", params.StartDate)
+			ed := fmt.Sprintf("%s 23:59:59", params.EndDate)
+			condition += fmt.Sprintf(` AND %s >= ? AND %s <= ?`, params.TimeType, params.TimeType)
+			pars = append(pars, st, ed)
+		}
+		if params.Frequency != "" {
+			condition += ` AND frequency = ?`
+			pars = append(pars, params.Frequency)
+		}
+		if params.ClassifyIdFirst > 0 {
+			condition += ` AND classify_id_first = ?`
+			pars = append(pars, params.ClassifyIdFirst)
+		}
+		if params.ClassifyIdSecond > 0 {
+			condition += ` AND classify_id_second = ?`
+			pars = append(pars, params.ClassifyIdSecond)
+		}
+		if params.State > 0 {
+			condition += ` AND state = ?`
+			pars = append(pars, params.State)
+		}
+	}
+
+	resp := new(smart_report.SmartReportListResp)
+	reportOB := new(smart_report.SmartReport)
+	total, e := reportOB.GetCountByCondition(condition, pars)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取报告总数失败, Err:" + e.Error()
+		return
+	}
+	if total <= 0 {
+		page := paging.GetPaging(params.CurrentIndex, params.PageSize, total)
+		resp.Paging = page
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+
+	// 分页列表
+	var startSize int
+	if params.PageSize <= 0 {
+		params.PageSize = utils.PageSize20
+	}
+	if params.CurrentIndex <= 0 {
+		params.CurrentIndex = 1
+	}
+	startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
+
+	// 列表查询过滤掉富文本内容
+	fields := []string{
+		"smart_report_id", "report_code", "classify_id_first", "classify_name_first", "classify_id_second", "classify_name_second", "add_type",
+		"title", "abstract", "author", "frequency", "stage", "video_url", "video_name", "video_play_seconds", "video_size", "detail_img_url", "detail_pdf_url",
+		"admin_id", "admin_real_name", "state", "publish_time", "pre_publish_time", "pre_msg_send", "msg_is_send", "msg_send_time", "create_time", "modify_time",
+		"last_modify_admin_id", "last_modify_admin_name", "content_modify_time", "pv", "uv",
+	}
+	list, e := reportOB.GetPageItemsByCondition(condition, pars, fields, "", startSize, params.PageSize)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取报告分页列表失败, Err:" + e.Error()
+		return
+	}
+
+	// 获取系统用户列表-用于匹配编辑中的用户
+	adminIdName := make(map[int]string)
+	admins, e := system.GetSysAdminList(``, make([]interface{}, 0), []string{}, "")
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取系统用户列表失败, Err: " + e.Error()
+		return
+	}
+	for _, ad := range admins {
+		adminIdName[ad.AdminId] = ad.RealName
+	}
+
+	for _, v := range list {
+		item := smart_report.FormatSmartReport2Item(v)
+		mark, e := smartReportService.UpdateSmartReportEditing(v.SmartReportId, 2, sysUser.AdminId, sysUser.RealName, adminIdName)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "查询编辑中标记失败, Err:" + e.Error()
+			return
+		}
+		if mark.Status == 0 {
+			item.CanEdit = true
+		} else {
+			item.Editor = mark.Editor
+		}
+		resp.List = append(resp.List, item)
+	}
+
+	page := paging.GetPaging(params.CurrentIndex, params.PageSize, total)
+	resp.Paging = page
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// ReportClassifyTree
+// @Title 报告分类树
+// @Description 报告分类树
+// @Success 200 {object} report_approve.ReportClassifyTreeItem
+// @router /report/classify_tree [get]
+func (this *ReportApproveFlowController) ReportClassifyTree() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	resp, cnTree, enTree := make([]*report_approve.ReportClassifyTreeItem, 0), make([]*report_approve.ReportClassifyTreeItem, 0), make([]*report_approve.ReportClassifyTreeItem, 0)
+
+	var cnErr, enErr error
+	wg := sync.WaitGroup{}
+	wg.Add(2)
+
+	// 中文/智能研报分类
+	go func() {
+		wg.Done()
+
+		classify, e := models.GetAllClassify()
+		if e != nil {
+			cnErr = fmt.Errorf("GetAllClassify err: %s", e.Error())
+			return
+		}
+		cnTree = services.GetReportClassifyTreeRecursive(classify, 0)
+	}()
+
+	// 英文研报分类
+	go func() {
+		wg.Done()
+
+		classify, e := models.GetAllEnglishClassify()
+		if e != nil {
+			enErr = fmt.Errorf("GetAllEnglishClassify err: %s", e.Error())
+			return
+		}
+		enTree = services.GetReportClassifyTreeRecursive(classify, 0)
+	}()
+
+	wg.Wait()
+
+	if cnErr != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取中文分类失败, Err: " + cnErr.Error()
+		return
+	}
+	if enErr != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取英文分类失败, Err: " + enErr.Error()
+		return
+	}
+
+	resp = append(resp, &report_approve.ReportClassifyTreeItem{
+		ClassifyId:   report_approve.FlowReportTypeChinese,
+		ClassifyName: "研报列表",
+		Children:     cnTree,
+	}, &report_approve.ReportClassifyTreeItem{
+		ClassifyId:   report_approve.FlowReportTypeEnglish,
+		ClassifyName: "英文研报",
+		Children:     enTree,
+	}, &report_approve.ReportClassifyTreeItem{
+		ClassifyId:   report_approve.FlowReportTypeSmart,
+		ClassifyName: "智能研报",
+		Children:     cnTree,
+	})
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 255 - 0
models/report_approve/report_approve_flow.go

@@ -0,0 +1,255 @@
+package report_approve
+
+import (
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+)
+
+const (
+	FlowReportTypeChinese = iota + 1
+	FlowReportTypeEnglish
+	FlowReportTypeSmart
+)
+
+// ReportApproveFlow 报告审批流表
+type ReportApproveFlow struct {
+	ReportApproveFlowId int       `orm:"column(report_approve_flow_id);pk" description:"审批流ID"`
+	FlowName            string    `description:"审批流名称"`
+	ReportType          int       `description:"报告类型:1-中文研报;2-英文研报;3-智能研报"`
+	ClassifyFirstId     int       `description:"一级分类ID"`
+	ClassifySecondId    int       `description:"二级分类ID"`
+	CurrVersion         int       `description:"当前版本号"`
+	CreateTime          time.Time `description:"创建时间"`
+	ModifyTime          time.Time `description:"修改时间"`
+}
+
+func (m *ReportApproveFlow) TableName() string {
+	return "report_approve_flow"
+}
+
+func (m *ReportApproveFlow) PrimaryId() string {
+	return "report_approve_flow_id"
+}
+
+func (m *ReportApproveFlow) Create() (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.ReportApproveFlowId = int(id)
+	return
+}
+
+func (m *ReportApproveFlow) CreateMulti(items []*ReportApproveFlow) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("rddp")
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+func (m *ReportApproveFlow) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *ReportApproveFlow) Del() (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	_, err = o.Raw(sql, m.ReportApproveFlowId).Exec()
+	return
+}
+
+func (m *ReportApproveFlow) MultiDel(menuIds []int) (err error) {
+	if len(menuIds) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.PrimaryId(), utils.GetOrmInReplace(len(menuIds)))
+	_, err = o.Raw(sql, menuIds).Exec()
+	return
+}
+
+func (m *ReportApproveFlow) GetItemById(id int) (item *ReportApproveFlow, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func (m *ReportApproveFlow) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *ReportApproveFlow, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+func (m *ReportApproveFlow) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *ReportApproveFlow) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*ReportApproveFlow, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func (m *ReportApproveFlow) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*ReportApproveFlow, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// ReportApproveFlowItem 报告审批流信息
+type ReportApproveFlowItem struct {
+	ReportApproveFlowId int    `description:"审批流ID"`
+	FlowName            string `description:"审批流名称"`
+	ReportType          int    `description:"报告类型:1-中文研报;2-英文研报;3-智能研报"`
+	ClassifyFirstId     int    `description:"一级分类ID"`
+	ClassifySecondId    int    `description:"二级分类ID"`
+	CurrVersion         int    `description:"当前版本号"`
+	CreateTime          string `description:"创建时间"`
+	ModifyTime          string `description:"修改时间"`
+}
+
+// FormatReportApproveFlow2Item 格式化报告审批流
+func FormatReportApproveFlow2Item(origin *ReportApproveFlow) (item *ReportApproveFlowItem) {
+	item = new(ReportApproveFlowItem)
+	if origin == nil {
+		return
+	}
+	item.ReportApproveFlowId = origin.ReportApproveFlowId
+	item.FlowName = origin.FlowName
+	item.ReportType = origin.ReportType
+	item.ClassifyFirstId = origin.ClassifyFirstId
+	item.ClassifySecondId = origin.ClassifySecondId
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+// ReportApproveFlowAddReq 新增报告审批流请求体
+type ReportApproveFlowAddReq struct {
+	FlowName         string `description:"审批流名称"`
+	ReportType       int    `description:"报告类型:1-中文研报;2-英文研报;3-智能研报"`
+	ClassifyFirstId  int    `description:"一级分类ID"`
+	ClassifySecondId int    `description:"二级分类ID"`
+}
+
+//
+//// ReportApproveFlowEditReq 编辑报告审批流请求体
+//type ReportApproveFlowEditReq struct {
+//	ReportApproveFlowAddReq
+//	ReportApproveFlowId int    `description:"报告审批流ID"`
+//	Content             string `description:"内容"`
+//	ContentStruct       string `description:"内容结构"`
+//}
+//
+//// ReportApproveFlowRemoveReq 删除报告审批流请求体
+//type ReportApproveFlowRemoveReq struct {
+//	ReportApproveFlowId int `description:"报告审批流ID"`
+//}
+//
+//// ReportApproveFlowPublishReq 发布报告审批流请求体
+//type ReportApproveFlowPublishReq struct {
+//	ReportApproveFlowId int `description:"报告审批流ID"`
+//	PublishState        int `description:"1-取消发布; 2-发布"`
+//}
+//
+//// ReportApproveFlowPrePublishReq 预发布报告审批流请求体
+//type ReportApproveFlowPrePublishReq struct {
+//	ReportApproveFlowId int    `description:"报告审批流ID"`
+//	PrePublishTime      string `description:"预发布时间"`
+//	PreMsgSend          int    `description:"定时发布成功后是否立即推送模版消息:0否,1是"`
+//}
+//
+//// ReportApproveFlowSaveContentReq 保存草稿请求体
+//type ReportApproveFlowSaveContentReq struct {
+//	ReportApproveFlowId int    `description:"报告审批流ID"`
+//	Content             string `description:"内容"`
+//	ContentStruct       string `description:"内容结构"`
+//	NoChange            int    `description:"内容是否未改变:1:内容未改变"`
+//}
+//
+//// ReportApproveFlowSaveContentResp 保存草稿响应体
+//type ReportApproveFlowSaveContentResp struct {
+//	ReportApproveFlowId int `description:"报告审批流ID"`
+//}
+//
+//// ReportApproveFlowSendMsgReq 消息推送请求体
+//type ReportApproveFlowSendMsgReq struct {
+//	ReportApproveFlowId int `description:"报告审批流ID"`
+//}
+//
+//// ReportApproveFlowMarkEditReq 标记编辑英文研报的请求数据
+//type ReportApproveFlowMarkEditReq struct {
+//	ReportApproveFlowId int `description:"报告审批流ID"`
+//	Status              int `description:"标记状态: 1-编辑中; 2-编辑完成"`
+//}
+//
+//// ReportApproveFlowListResp 报告审批流
+//type ReportApproveFlowListResp struct {
+//	List   []*ReportApproveFlowItem
+//	Paging *paging.PagingItem `description:"分页数据"`
+//}
+//
+//// ElasticReportApproveFlow 报告审批流es
+//type ElasticReportApproveFlow struct {
+//	ReportApproveFlowId int    `description:"报告审批流ID"`
+//	Title               string `description:"标题"`
+//	Abstract            string `description:"摘要"`
+//	BodyContent         string `description:"内容"`
+//	PublishTime         string `description:"发布时间"`
+//	PublishState        int    `description:"发布状态 1-未发布 2-已发布"`
+//	Author              string `description:"作者"`
+//	ClassifyIdFirst     int    `description:"一级分类ID"`
+//	ClassifyNameFirst   string `description:"一级分类名称"`
+//	ClassifyIdSecond    int    `description:"二级分类ID"`
+//	ClassifyNameSecond  string `description:"二级分类名称"`
+//	StageStr            string `description:"报告期数"`
+//	Frequency           string `description:"频度"`
+//}
+//
+//// Report2ImgQueueReq 报告详情生成长图队列请求体
+//type Report2ImgQueueReq struct {
+//	ReportType int    `description:"报告类型: 1-研报; 2-报告审批流"`
+//	ReportCode string `description:"报告唯一编码"`
+//}
+
+type ReportClassifyTreeItem struct {
+	ClassifyId   int                       `description:"分类ID"`
+	ClassifyName string                    `description:"分类名称"`
+	ParentId     int                       `description:"父级ID"`
+	Children     []*ReportClassifyTreeItem `description:"子分类"`
+}

+ 245 - 0
models/report_approve/report_approve_node.go

@@ -0,0 +1,245 @@
+package report_approve
+
+import (
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+)
+
+const (
+	NodeApproveTypeRoll = iota + 1
+	NodeApproveTypeAll
+	NodeApproveTypeAny
+)
+
+// ReportApproveNode 报告审批节点表
+type ReportApproveNode struct {
+	ReportApproveNodeId int       `orm:"column(report_approve_node_id);pk" description:"报告审批节点ID"`
+	ReportApproveFlowId int       `description:"报告审批流ID"`
+	PrevNodeId          int       `description:"上一个节点ID(0为开始节点)"`
+	NextNodeId          int       `description:"下一个节点ID(0为结束节点)"`
+	NodeType            int       `description:"节点类型:0-审批;1-抄送"`
+	ApproveType         int       `description:"审批类型:1-依次审批;2-会签;3-或签"`
+	users               string    `description:"审批人信息-JSON,user_type:user-用户;role-角色,user_id:用户/角色ID"`
+	CurrVersion         int       `description:"当前版本号"`
+	CreateTime          time.Time `description:"创建时间"`
+}
+
+func (m *ReportApproveNode) TableName() string {
+	return "report_approve_node"
+}
+
+func (m *ReportApproveNode) PrimaryId() string {
+	return "report_approve_node_id"
+}
+
+func (m *ReportApproveNode) Create() (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.ReportApproveNodeId = int(id)
+	return
+}
+
+func (m *ReportApproveNode) CreateMulti(items []*ReportApproveNode) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("rddp")
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+func (m *ReportApproveNode) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *ReportApproveNode) Del() (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	_, err = o.Raw(sql, m.ReportApproveNodeId).Exec()
+	return
+}
+
+func (m *ReportApproveNode) MultiDel(menuIds []int) (err error) {
+	if len(menuIds) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.PrimaryId(), utils.GetOrmInReplace(len(menuIds)))
+	_, err = o.Raw(sql, menuIds).Exec()
+	return
+}
+
+func (m *ReportApproveNode) GetItemById(id int) (item *ReportApproveNode, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func (m *ReportApproveNode) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *ReportApproveNode, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+func (m *ReportApproveNode) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *ReportApproveNode) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*ReportApproveNode, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func (m *ReportApproveNode) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*ReportApproveNode, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// ReportApproveNodeItem 报告审批节点信息
+type ReportApproveNodeItem struct {
+	ReportApproveNodeId int    `orm:"column(report_approve_node_id);pk" description:"报告审批节点ID"`
+	ReportApproveFlowId int    `description:"报告审批流ID"`
+	PrevNodeId          int    `description:"上一个节点ID(0为开始节点)"`
+	NextNodeId          int    `description:"下一个节点ID(0为结束节点)"`
+	NodeType            int    `description:"节点类型:0-审批;1-抄送"`
+	ApproveType         int    `description:"审批类型:1-依次审批;2-会签;3-或签"`
+	users               string `description:"审批人信息-JSON,user_type:user-用户;role-角色,user_id:用户/角色ID"`
+	CurrVersion         int    `description:"当前版本号"`
+	CreateTime          string `description:"创建时间"`
+}
+
+// FormatReportApproveNode2Item 格式化报告审批节点
+func FormatReportApproveNode2Item(origin *ReportApproveNode) (item *ReportApproveNodeItem) {
+	item = new(ReportApproveNodeItem)
+	if origin == nil {
+		return
+	}
+	item.ReportApproveNodeId = origin.ReportApproveNodeId
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	return
+}
+
+// ReportApproveNodeAddReq 新增报告审批节点请求体
+type ReportApproveNodeAddReq struct {
+	FlowName         string `description:"审批流名称"`
+	ReportType       int    `description:"报告类型:1-中文研报;2-英文研报;3-智能研报"`
+	ClassifyFirstId  int    `description:"一级分类ID"`
+	ClassifySecondId int    `description:"二级分类ID"`
+}
+
+//
+//// ReportApproveNodeEditReq 编辑报告审批节点请求体
+//type ReportApproveNodeEditReq struct {
+//	ReportApproveNodeAddReq
+//	ReportApproveNodeId int    `description:"报告审批节点ID"`
+//	Content             string `description:"内容"`
+//	ContentStruct       string `description:"内容结构"`
+//}
+//
+//// ReportApproveNodeRemoveReq 删除报告审批节点请求体
+//type ReportApproveNodeRemoveReq struct {
+//	ReportApproveNodeId int `description:"报告审批节点ID"`
+//}
+//
+//// ReportApproveNodePublishReq 发布报告审批节点请求体
+//type ReportApproveNodePublishReq struct {
+//	ReportApproveNodeId int `description:"报告审批节点ID"`
+//	PublishState        int `description:"1-取消发布; 2-发布"`
+//}
+//
+//// ReportApproveNodePrePublishReq 预发布报告审批节点请求体
+//type ReportApproveNodePrePublishReq struct {
+//	ReportApproveNodeId int    `description:"报告审批节点ID"`
+//	PrePublishTime      string `description:"预发布时间"`
+//	PreMsgSend          int    `description:"定时发布成功后是否立即推送模版消息:0否,1是"`
+//}
+//
+//// ReportApproveNodeSaveContentReq 保存草稿请求体
+//type ReportApproveNodeSaveContentReq struct {
+//	ReportApproveNodeId int    `description:"报告审批节点ID"`
+//	Content             string `description:"内容"`
+//	ContentStruct       string `description:"内容结构"`
+//	NoChange            int    `description:"内容是否未改变:1:内容未改变"`
+//}
+//
+//// ReportApproveNodeSaveContentResp 保存草稿响应体
+//type ReportApproveNodeSaveContentResp struct {
+//	ReportApproveNodeId int `description:"报告审批节点ID"`
+//}
+//
+//// ReportApproveNodeSendMsgReq 消息推送请求体
+//type ReportApproveNodeSendMsgReq struct {
+//	ReportApproveNodeId int `description:"报告审批节点ID"`
+//}
+//
+//// ReportApproveNodeMarkEditReq 标记编辑英文研报的请求数据
+//type ReportApproveNodeMarkEditReq struct {
+//	ReportApproveNodeId int `description:"报告审批节点ID"`
+//	Status              int `description:"标记状态: 1-编辑中; 2-编辑完成"`
+//}
+//
+//// ReportApproveNodeListResp 报告审批节点
+//type ReportApproveNodeListResp struct {
+//	List   []*ReportApproveNodeItem
+//	Paging *paging.PagingItem `description:"分页数据"`
+//}
+//
+//// ElasticReportApproveNode 报告审批节点es
+//type ElasticReportApproveNode struct {
+//	ReportApproveNodeId int    `description:"报告审批节点ID"`
+//	Title               string `description:"标题"`
+//	Abstract            string `description:"摘要"`
+//	BodyContent         string `description:"内容"`
+//	PublishTime         string `description:"发布时间"`
+//	PublishState        int    `description:"发布状态 1-未发布 2-已发布"`
+//	Author              string `description:"作者"`
+//	ClassifyIdFirst     int    `description:"一级分类ID"`
+//	ClassifyNameFirst   string `description:"一级分类名称"`
+//	ClassifyIdSecond    int    `description:"二级分类ID"`
+//	ClassifyNameSecond  string `description:"二级分类名称"`
+//	StageStr            string `description:"报告期数"`
+//	Frequency           string `description:"频度"`
+//}
+//
+//// Report2ImgQueueReq 报告详情生成长图队列请求体
+//type Report2ImgQueueReq struct {
+//	ReportType int    `description:"报告类型: 1-研报; 2-报告审批节点"`
+//	ReportCode string `description:"报告唯一编码"`
+//}

+ 1 - 0
models/report_approve/report_approve_record.go

@@ -0,0 +1 @@
+package report_approve

+ 22 - 0
services/report_approve.go

@@ -0,0 +1,22 @@
+package services
+
+import (
+	"eta/eta_api/models"
+	"eta/eta_api/models/report_approve"
+)
+
+// GetReportClassifyTreeRecursive 递归获取报告分类树
+func GetReportClassifyTreeRecursive(list []*models.Classify, parentId int) []*report_approve.ReportClassifyTreeItem {
+	res := make([]*report_approve.ReportClassifyTreeItem, 0)
+	for _, v := range list {
+		if v.ParentId == parentId {
+			t := new(report_approve.ReportClassifyTreeItem)
+			t.ClassifyId = v.Id
+			t.ClassifyName = v.ClassifyName
+			t.ParentId = v.ParentId
+			t.Children = GetReportClassifyTreeRecursive(list, v.Id)
+			res = append(res, t)
+		}
+	}
+	return res
+}