فهرست منبع

add:增加观点库导入接口,改造审批接口,将通过审批的报告入库

zqbao 3 ماه پیش
والد
کامیت
8d37d41a13
5فایلهای تغییر یافته به همراه361 افزوده شده و 0 حذف شده
  1. 79 0
      controllers/report_open.go
  2. 123 0
      models/knowledge_resource.go
  3. 15 0
      models/report_open.go
  4. 142 0
      services/knowledge_resource.go
  5. 2 0
      utils/constants.go

+ 79 - 0
controllers/report_open.go

@@ -396,6 +396,17 @@ func (this *ReportOpenController) ReportApprove() {
 				br.ErrMsg = fmt.Sprintf("更新报告状态失败, %v", e)
 				return
 			}
+			if req.ApproveType == 1 {
+				// 审批通过,将PPT或研报加入报告库中
+				go func() {
+					msg, err := services.ReportKnowledgeResourceAdd(v.Title, v.DetailPdfUrl, v.AdminId, v.AdminRealName)
+					if err != nil {
+						utils.FileLog.Error(fmt.Sprintf("ReportApprove-报告知识库添加失败,reportId:%d,msg:%s,err: %v", v.Id, msg, err))
+						return
+					}
+				}()
+			}
+
 			if req.ApproveType == 3 || req.ApproveType == 4 {
 				// 撤回/提审暂不发消息
 				continue
@@ -478,6 +489,18 @@ func (this *ReportOpenController) ReportApprove() {
 				br.ErrMsg = fmt.Sprintf("更新报告状态失败, %v", e)
 				return
 			}
+
+			if req.ApproveType == 1 {
+				// 审批通过,将PPT或研报加入报告库中
+				go func() {
+					msg, err := services.ReportKnowledgeResourceAdd(v.Title, v.PptxUrl, v.AdminId, v.AdminRealName)
+					if err != nil {
+						utils.FileLog.Error(fmt.Sprintf("ReportApprove-报告知识库添加失败,pptId:%d,msg:%s,err: %v", v.PptId, msg, err))
+						return
+					}
+				}()
+			}
+
 			if req.ApproveType == 3 || req.ApproveType == 4 {
 				// 撤回/提审暂不发消息
 				continue
@@ -611,3 +634,59 @@ func (this *ReportOpenController) ReportRemove() {
 	br.Success = true
 	br.Msg = "操作成功"
 }
+
+// ViewPointSave
+// @Title 观点保存
+// @Description 观点保存
+// @Param request body models.ReportViewPointReq true "type json string"
+// @Success 200 string "操作成功"
+// @Router /viewpoint/save [post]
+func (this *ReportOpenController) ViewPointSave() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req *models.ReportViewPointReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常"
+		br.ErrMsg = fmt.Sprintf("参数解析失败,%v", e)
+		return
+	}
+	req.Content = strings.TrimSpace(req.Content)
+	req.Title = strings.TrimSpace(req.Title)
+	req.Category = strings.TrimSpace(req.Category)
+	if req.Title == "" {
+		br.Msg = "观点标题不能为空"
+		return
+	}
+	if req.Content == "" {
+		br.Msg = "观点内容不能为空"
+		return
+	}
+	if req.Category == "" {
+		br.Msg = "观点分类不能为空"
+		return
+	}
+	if req.DataDate == nil {
+		br.Msg = "观点日期不能为空"
+		return
+	}
+
+	msg, err := services.ViewPointSave(req)
+	if err != nil {
+		if msg == "" {
+			msg = "保存观点失败"
+		}
+		br.Msg = msg
+		br.ErrMsg = fmt.Sprintf("保存观点失败, %v", err)
+		return
+	}
+
+	br.Msg = "保存观点成功"
+	br.Success = true
+	br.Ret = 200
+}

+ 123 - 0
models/knowledge_resource.go

@@ -0,0 +1,123 @@
+package models
+
+import (
+	"eta_gn/eta_report/global"
+	"time"
+)
+
+const (
+	// 事件类型-事件库
+	KnowledgeResourceTypeEvent = iota
+	// 事件-政策库
+	KnowledgeResourceTypePolicy
+	// 事件-观点库
+	KnowledgeResourceTypeOpinion
+	// 事件类型-知识库
+	KnowledgeResourceTypeKnow
+	// 事件-报告库
+	KnowledgeResourceTypeReport
+)
+
+const (
+	// 未发布
+	KnowledgeResourceStateUnpublished = iota
+	// 已发布
+	KnowledgeResourceStatePublished
+	// 待审批
+	KnowledgeResourceStatePending
+	// 已驳回
+	KnowledgeResourceStateRejected
+	// 已通过
+	KnowledgeResourceStateApproved
+)
+
+type KnowledgeResourceFile struct {
+	KnowledgeResourceFileId int    `gorm:"column:knowledge_resource_file_id;primaryKey;autoIncrement"`
+	KnowledgeResourceId     int    `gorm:"column:knowledge_resource_id"`
+	FileUrl                 string `gorm:"column:file_url"`
+}
+
+func (k KnowledgeResourceFile) TableName() string {
+	return "knowledge_resource_file"
+}
+
+type KnowledgeResource struct {
+	KnowledgeResourceId int        `gorm:"column:knowledge_resource_id;;primaryKey;autoIncrement"`
+	ResourceType        int        `gorm:"column:resource_type;"`
+	ClassifyId          int        `gorm:"column:classify_id"`
+	Title               string     `gorm:"column:title;"`
+	CreateTime          time.Time  `gorm:"column:create_time" description:"创建时间"`
+	ModifyTime          time.Time  `gorm:"column:modify_time;autoUpdateTime" description:"修改时间"`
+	State               int        `gorm:"column:state" description:"0:未发布;1:已发布;2:待审批;3:已驳回;4:已通过"`
+	Content             string     `gorm:"column:content"`
+	ResourceCode        string     `gorm:"column:resource_code"`
+	AdminId             int        `gorm:"column:admin_id" description:"创建者账号"`
+	AdminRealName       string     `gorm:"column:admin_real_name" description:"创建者姓名"`
+	SourceFrom          string     `gorm:"column:source_from"`
+	TagId               int        `gorm:"column:tag_id;default:0;NOT NULL"`
+	StartTime           *time.Time `gorm:"column:start_time"`
+	EndTime             *time.Time `gorm:"column:end_time"`
+	IsFile              int        `gorm:"column:is_file;default:0;NOT NULL"`
+	FileUrl             string     `gorm:"column:file_url"`
+	OutId               int        `gorm:"column:out_id" description:"外部系统ID"`
+}
+
+func (k KnowledgeResource) TableName() string {
+	return "knowledge_resource"
+}
+
+func (k *KnowledgeResource) Create() (err error) {
+	tx := global.DEFAULT_DmSQL.Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+	fileUrl := k.FileUrl
+	k.FileUrl = ""
+	err = tx.Create(k).Error
+	file := new(KnowledgeResourceFile)
+	file.KnowledgeResourceId = k.KnowledgeResourceId
+	file.FileUrl = fileUrl
+	err = tx.Create(file).Error
+	return
+}
+
+func (k *KnowledgeResource) Update(cols []string) error {
+	return global.DEFAULT_DmSQL.Model(k).Select(cols).Updates(k).Error
+}
+
+// GetKnowledgeResourceByOutId 根据外部系统ID获取知识资源
+func (k *KnowledgeResource) GetKnowledgeResourceByOutId(outId int) (item *KnowledgeResource, err error) {
+	sql := "SELECT * FROM knowledge_resource WHERE out_id = ?"
+	err = global.DEFAULT_DmSQL.Raw(sql, outId).First(&item).Error
+	return
+}
+
+type KnowledgeClassify struct {
+	ClassifyId   int       `gorm:"primaryKey;column:classify_id"`
+	ClassifyName string    `gorm:"column:classify_name;default:'';type:varchar(125);not null"` // 注意:varchar的默认长度可能需要根据实际情况调整
+	Sort         int       `gorm:"column:sort;default:0;type:tinyint"`
+	ParentId     int       `gorm:"column:parent_id;default:0;type:int"`
+	CreateTime   time.Time `gorm:"column:create_time;default:CURRENT_TIMESTAMP"`
+	ModifyTime   time.Time `gorm:"column:modify_time;default:CURRENT_TIMESTAMP"`
+	Enabled      int       `gorm:"column:enabled;default:1;type:tinyint"`
+	Level        int       `gorm:"column:level;default:0;type:bigint"`
+	ResourceType int       `gorm:"column:resource_type;default:0;not null;type:tinyint"`
+}
+
+func (k KnowledgeClassify) TableName() string {
+	return "knowledge_classify"
+}
+
+func (k *KnowledgeClassify) Create() error {
+	return global.DEFAULT_DmSQL.Create(k).Error
+}
+
+func (k *KnowledgeClassify) GetClassifyByNameAndType(classifyName string, resourceType int) (items *KnowledgeClassify, err error) {
+	sql := "SELECT * FROM knowledge_classify WHERE classify_name = ? AND resource_type = ?"
+	err = global.DEFAULT_DmSQL.Raw(sql, classifyName, resourceType).First(&items).Error
+	return
+}

+ 15 - 0
models/report_open.go

@@ -1,5 +1,7 @@
 package models
 
+import "time"
+
 // ReportCreateReq 创建报告
 type ReportCreateReq struct {
 	ReportId   int      `description:"智力共享报告ID"`
@@ -38,3 +40,16 @@ type ReportRemoveReq struct {
 	ReportIds []int  `description:"智力共享报告ID"`
 	Operator  string `description:"操作人工号"`
 }
+
+type ReportViewPointReq struct {
+	Id             int        `description:"观点库id"`
+	Title          string     `description:"观点标题"`
+	Category       string     `description:"观点分类"`
+	Content        string     `description:"观点内容"`
+	DataSourceCode string     `description:"数据来源"`
+	DataSource     string     `description:"数据来源名称"`
+	Creator        string     `description:"创建人"`
+	Des            string     `description:"描述"`
+	DataDate       *time.Time `description:"数据日期"`
+	UpdateTime     string     `description:"更新时间"`
+}

+ 142 - 0
services/knowledge_resource.go

@@ -0,0 +1,142 @@
+package services
+
+import (
+	"eta_gn/eta_report/models"
+	"eta_gn/eta_report/utils"
+	"html"
+	"strconv"
+	"time"
+)
+
+func ReportKnowledgeResourceAdd(title string, fileUrl string, adminId int, adminRealName string) (msg string, err error) {
+	classifyObj := new(models.KnowledgeClassify)
+	classifyObj, err = classifyObj.GetClassifyByNameAndType("日常报告", models.KnowledgeResourceTypeReport)
+	if err != nil {
+		if utils.IsErrNoRow(err) {
+			msg = "分类不存在,请检查知识资源-报告库中是否存在-市场研究报告/内部报告/日常报告分类"
+			return
+		}
+		msg = "报告库添加失败"
+		return
+	}
+
+	obj := new(models.KnowledgeResource)
+	obj.ResourceType = models.KnowledgeResourceTypeReport
+	obj.ClassifyId = classifyObj.ClassifyId
+	obj.Title = title
+	obj.CreateTime = time.Now()
+	obj.ModifyTime = time.Now()
+	obj.State = models.KnowledgeResourceStatePublished
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	obj.ResourceCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
+	obj.AdminId = adminId
+	obj.AdminRealName = adminRealName
+	obj.SourceFrom = "市场信息研究所"
+	currentTime := time.Now()
+	obj.StartTime = &currentTime
+	// 此处传入的url会在入库时存入knowledge_resource_file表中
+	obj.FileUrl = fileUrl
+	if fileUrl != "" {
+		obj.IsFile = 1
+	}
+	err = obj.Create()
+	if err != nil {
+		return
+	}
+	return
+}
+
+// ViewPointSave 知识资源观点库保存
+func ViewPointSave(req *models.ReportViewPointReq) (msg string, err error) {
+	classifyId, err := KnowledgeResourceClassifyCheckAndSave(req.Category, models.KnowledgeResourceTypeOpinion)
+	if err != nil {
+		msg = "观点保存失败"
+		return
+	}
+	obj := new(models.KnowledgeResource)
+	knowledgeResource, err := obj.GetKnowledgeResourceByOutId(req.Id)
+	if err != nil {
+		if !utils.IsErrNoRow(err) {
+			msg = "观点保存失败"
+			return
+		}
+		// 创建新的知识资源库
+		err = nil
+		obj.ResourceType = models.KnowledgeResourceTypeOpinion
+		obj.ClassifyId = classifyId
+		obj.Title = req.Title
+		obj.CreateTime = time.Now()
+		obj.ModifyTime = time.Now()
+		obj.State = models.KnowledgeResourceStateApproved
+		obj.Content = html.EscapeString(req.Content)
+		timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+		obj.ResourceCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
+		obj.AdminRealName = "无"
+		obj.SourceFrom = req.DataSource
+		obj.StartTime = req.DataDate
+		obj.IsFile = 0
+		obj.OutId = req.Id
+		err = obj.Create()
+		if err != nil {
+			msg = "观点保存失败"
+			return
+		}
+	}
+
+	// 更新知识资源库的状态
+	var updateCols []string
+	if knowledgeResource.Title != req.Title {
+		knowledgeResource.Title = req.Title
+		updateCols = append(updateCols, "title")
+	}
+	if knowledgeResource.Content != req.Content {
+		knowledgeResource.Content = req.Content
+		updateCols = append(updateCols, "content")
+	}
+	if !knowledgeResource.StartTime.Equal(*req.DataDate) {
+		knowledgeResource.StartTime = req.DataDate
+		updateCols = append(updateCols, "start_time")
+	}
+	if knowledgeResource.SourceFrom != req.DataSource {
+		knowledgeResource.SourceFrom = req.DataSource
+		updateCols = append(updateCols, "source_from")
+	}
+
+	if len(updateCols) > 0 {
+		knowledgeResource.ModifyTime = time.Now()
+		updateCols = append(updateCols, "modify_time")
+		err = knowledgeResource.Update(updateCols)
+		if err != nil {
+			msg = "观点保存失败"
+			return
+		}
+	}
+	return
+}
+
+func KnowledgeResourceClassifyCheckAndSave(classifyName string, resourceType int) (classifyId int, err error) {
+	obj := new(models.KnowledgeClassify)
+	obj, err = obj.GetClassifyByNameAndType(classifyName, resourceType)
+	if err != nil {
+		if !utils.IsErrNoRow(err) {
+			return
+		}
+		// 创建新的分类
+		err = nil
+		obj.ClassifyName = classifyName
+		obj.ResourceType = resourceType
+		obj.CreateTime = time.Now()
+		obj.ModifyTime = time.Now()
+		obj.Enabled = 1
+		obj.Level = 1
+		obj.Sort = 1
+		err = obj.Create()
+		if err != nil {
+			return
+		}
+		classifyId = obj.ClassifyId
+	} else {
+		classifyId = obj.ClassifyId
+	}
+	return
+}

+ 2 - 0
utils/constants.go

@@ -27,6 +27,8 @@ const (
 	RegularEmail  = `\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*`                                             //匹配电子邮箱
 )
 
+const CHART_PREFIX = "hz_chart"
+
 // 缓存key
 const (
 	CACHE_KEY_USER_VIEW = "user_view_record" //用户阅读数据