package controllers

import (
	"encoding/json"
	"eta_gn/eta_report/models"
	"eta_gn/eta_report/services"
	"eta_gn/eta_report/services/knowledge"
	"eta_gn/eta_report/utils"
	"fmt"
	"strconv"
	"strings"
	"time"
)

// ReportOpenController 报告开放接口
type ReportOpenController struct {
	BaseOpenController
}

// ClassifyTree
// @Title 报告分类
// @Description 报告分类接口
// @Param   ClassifyType   query   int   false   "分类类型:0-全部(不传默认为0);1-研报;2-PPT"
// @Param   OutId   query   string   false   "用户工号Id"
// @Success 200 {object} models.ClassifyTreeItem
// @router /report/classify [get]
func (this *ReportOpenController) ClassifyTree() {
	br := new(models.BaseResponse).Init()
	defer func() {
		if br.ErrMsg == "" {
			br.IsSendEmail = false
		}
		this.Data["json"] = br
		this.ServeJSON()
	}()
	classifyType, _ := this.GetInt("ClassifyType", 0)
	outId := this.GetString("OutId")
	if classifyType < 0 || classifyType > 2 {
		classifyType = 0
	}

	// 获取分类列表, 格式化分类树
	classifyOb := new(models.Classify)
	cond := ``
	pars := make([]interface{}, 0)
	if classifyType > 0 {
		cond += ` AND classify_type = ?`
		pars = append(pars, classifyType)
	}
	classifyList, e := classifyOb.GetItemsByCondition(cond, pars, []string{}, "parent_id ASC, sort ASC, create_time ASC")
	if e != nil {
		br.Msg = "获取失败"
		br.ErrMsg = fmt.Sprintf("获取分类列表失败,%v", e)
		return
	}

	if outId == "" {
		br.Msg = "工号不能为空"
		return
	}
	list := make([]*models.Classify, 0)
	classifyObj := new(models.ClassifyVisible)
	visibleUsers, err := classifyObj.GetClassifyVisibleAll()
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = fmt.Sprintf("获取可见用户失败,%v", err)
		return
	}
	adminObj := new(models.Admin)
	admin, e := adminObj.GetAdminByOutId(outId)
	if e != nil {
		if utils.IsErrNoRow(e) {
			br.Msg = "工号不存在"
			return
		}
		br.Msg = "获取失败"
		br.ErrMsg = fmt.Sprintf("获取管理员信息失败,%v", e)
		return
	}

	visibleUsersMap := make(map[int][]int)
	for _, v := range visibleUsers {
		visibleUsersMap[v.ClassifyId] = append(visibleUsersMap[v.ClassifyId], v.AdminId)
	}

	for _, v := range classifyList {
		if visibleUser, ok := visibleUsersMap[v.Id]; ok {
			if !utils.InArrayByInt(visibleUser, admin.AdminId) {
				continue
			}
		}
		list = append(list, v)
	}

	resp := services.GetReportClassifyTreeRecursive(list, 0)
	resp = services.RecursiveFilterNoChildTreeClassify(resp)

	br.Data = resp
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
}

// ReportCreate
// @Title 生成报告
// @Description 生成报告接口
// @Param	request	body models.ReportCreateReq true "type json string"
// @Success 200 string "操作成功"
// @router /report/create [post]
func (this *ReportOpenController) ReportCreate() {
	br := new(models.BaseResponse).Init()
	defer func() {
		if br.ErrMsg == "" {
			br.IsSendEmail = false
		}
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.ReportCreateReq
	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
		br.Msg = "参数解析异常"
		br.ErrMsg = fmt.Sprintf("参数解析失败,%v", e)
		return
	}
	if req.ReportId <= 0 {
		br.Msg = "报告ID有误"
		br.ErrMsg = fmt.Sprintf("智力共享报告ID有误, %d", req.ReportId)
		return
	}
	if req.ClassifyId <= 0 {
		br.Msg = "请选择分类"
		return
	}
	req.Title = strings.TrimSpace(req.Title)
	if req.Title == "" {
		br.Msg = "请输入报告标题"
		return
	}
	req.EndTime = strings.TrimSpace(req.EndTime)
	if req.EndTime == "" {
		br.Msg = "请输入课题结束时间"
		return
	}
	topicTime, e := time.ParseInLocation(utils.FormatDateTime, req.EndTime, time.Local)
	if e != nil {
		br.Msg = "课题结束时间格式有误"
		return
	}
	req.Creator = strings.TrimSpace(req.Creator)
	if req.Creator == "" {
		br.Msg = "请输入创建人工号"
		return
	}

	// 查询分类,根据分类创建对应类型的研报
	classifyOb := new(models.Classify)
	classify, e := classifyOb.GetItemById(req.ClassifyId)
	if e != nil {
		if utils.IsErrNoRow(e) {
			br.Msg = "分类不存在"
			return
		}
		br.Msg = "操作失败"
		br.ErrMsg = fmt.Sprintf("获取分类失败, %v", e)
		return
	}

	// 校验报告ID是否已存在, 已存在返回已有的报告ID
	reportExist, pptExist := services.GetReportByOutReportId(req.ReportId)
	if reportExist != nil && reportExist.Id > 0 {
		resp := new(models.ReportCreateResp)
		resp.ReportId = reportExist.Id
		br.Data = resp
		br.Ret = 200
		br.Success = true
		br.Msg = "操作成功"
		return
	}
	if pptExist != nil && pptExist.PptId > 0 {
		resp := new(models.ReportCreateResp)
		resp.ReportId = pptExist.PptId
		br.Data = resp
		br.Ret = 200
		br.Success = true
		br.Msg = "操作成功"
		return
	}

	// 研报类型
	var reportId int
	if classify.ClassifyType == utils.ReportTypeDefault {
		reportId, e = services.CreateReport(req.ReportId, req.ClassifyId, req.Title, topicTime, req.Creator, req.Authors)
		if e != nil {
			br.Msg = "操作失败"
			br.ErrMsg = fmt.Sprintf("新增报告失败, %v", e)
			return
		}
	}

	// PPT类型
	if classify.ClassifyType == utils.ReportTypePPT {
		reportId, e = services.CreatePptReport(req.ReportId, req.ClassifyId, req.Title, topicTime, req.Creator, req.Authors)
		if e != nil {
			br.Msg = "操作失败"
			br.ErrMsg = fmt.Sprintf("新增PPT报告失败, %v", e)
			return
		}
	}

	resp := new(models.ReportCreateResp)
	resp.ReportId = reportId
	//resp.ReportCode = reportCode

	br.Data = resp
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
}

// ReportModify
// @Title 编辑报告
// @Description 编辑报告接口
// @Param	request	body models.ReportModifyReq true "type json string"
// @Success 200 string "操作成功"
// @router /report/modify [post]
func (this *ReportOpenController) ReportModify() {
	br := new(models.BaseResponse).Init()
	defer func() {
		if br.ErrMsg == "" {
			br.IsSendEmail = false
		}
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.ReportModifyReq
	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
		br.Msg = "参数解析异常"
		br.ErrMsg = fmt.Sprintf("参数解析失败,%v", e)
		return
	}
	if req.ReportId <= 0 {
		br.Msg = "报告ID有误"
		br.ErrMsg = fmt.Sprintf("智力共享报告ID有误, %d", req.ReportId)
		return
	}
	req.Title = strings.TrimSpace(req.Title)
	if req.Title == "" {
		br.Msg = "请输入报告标题"
		return
	}
	req.EndTime = strings.TrimSpace(req.EndTime)
	if req.EndTime == "" {
		br.Msg = "请输入课题结束时间"
		return
	}
	topicTime, e := time.ParseInLocation(utils.FormatDateTime, req.EndTime, time.Local)
	if e != nil {
		br.Msg = "课题结束时间格式有误"
		return
	}
	reportExist, pptExist := services.GetReportByOutReportId(req.ReportId)
	if reportExist == nil && pptExist == nil {
		br.Msg = "报告不存在"
		br.ErrMsg = fmt.Sprintf("报告不存在, OutReportId: %d", req.ReportId)
		return
	}

	// 研报类型
	if reportExist != nil && reportExist.Id > 0 {
		if reportExist.State == models.ReportStatePass {
			br.Msg = "报告已发布,不可编辑"
			return
		}
		if e = services.EditReport(reportExist, req.Title, topicTime, req.Authors); e != nil {
			br.Msg = "操作失败"
			br.ErrMsg = fmt.Sprintf("编辑报告失败, %v", e)
			return
		}
	}

	// PPT类型
	if pptExist != nil && pptExist.PptId > 0 {
		if pptExist.State == models.ReportStatePass {
			br.Msg = "报告已发布,不可编辑"
			return
		}
		if e = services.EditPptReport(pptExist, req.Title, topicTime, req.Authors); e != nil {
			br.Msg = "操作失败"
			br.ErrMsg = fmt.Sprintf("编辑PPT报告失败, %v", e)
			return
		}
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
}

// ReportApprove
// @Title 审批报告
// @Description 审批报告接口
// @Param	request	body models.ReportApproveReq true "type json string"
// @Success 200 string "操作成功"
// @router /report/approve [post]
func (this *ReportOpenController) ReportApprove() {
	br := new(models.BaseResponse).Init()
	defer func() {
		if br.ErrMsg == "" {
			br.IsSendEmail = false
		}
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.ReportApproveReq
	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
		br.Msg = "参数解析异常"
		br.ErrMsg = fmt.Sprintf("参数解析失败,%v", e)
		return
	}
	if len(req.ReportIds) == 0 {
		br.Msg = "报告ID有误"
		br.ErrMsg = fmt.Sprintf("智力共享报告ID有误, %v", req.ReportIds)
		return
	}
	if req.ApproveType != 1 && req.ApproveType != 2 && req.ApproveType != 3 && req.ApproveType != 4 {
		br.Msg = "审批类型异常"
		br.ErrMsg = fmt.Sprintf("审批类型异常, %d", req.ApproveType)
		return
	}

	// 先做校验后执行, 报告很可能是研报和PPT类型混着一起审批的
	updateReports := make([]*models.Report, 0)
	updatePpts := make([]*models.PptV2, 0)
	for _, v := range req.ReportIds {
		reportExist, pptExist := services.GetReportByOutReportId(v)
		if reportExist == nil && pptExist == nil {
			utils.FileLog.Info(fmt.Sprintf("ReportApprove-报告ID: %d不存在", v))
			continue
		}

		// 通过和驳回需要审批中/已驳回状态,撤回、提审暂不做限制(若报告未撰写完毕,提审会把状态从待提交直接变为待审批,那么就是撰写终止附件不会再传回去了,这种情况是允许的)
		if reportExist != nil && reportExist.Id > 0 {
			if (req.ApproveType == 1 || req.ApproveType == 2) && reportExist.State != models.ReportStateWaitApprove && reportExist.State != models.ReportStateRefused {
				utils.FileLog.Info(fmt.Sprintf("ReportApprove-报告当前状态不允许审批, OutId: %d, State: %d", v, reportExist.State))
				continue
			}
			updateReports = append(updateReports, reportExist)
		}
		if pptExist != nil && pptExist.PptId > 0 {
			if (req.ApproveType == 1 || req.ApproveType == 2) && pptExist.State != models.ReportStateWaitApprove && pptExist.State != models.ReportStateRefused {
				utils.FileLog.Info(fmt.Sprintf("ReportApprove-PPT当前状态不允许审批, OutId: %d, State: %d", v, pptExist.State))
				continue
			}
			updatePpts = append(updatePpts, pptExist)
		}
	}

	// 审批人
	approveUser := new(models.Admin)
	{
		ob := new(models.Admin)
		cond := ` AND out_id = ?`
		pars := make([]interface{}, 0)
		pars = append(pars, req.ApproveUser)
		admin, e := ob.GetItemByCondition(cond, pars, "")
		if e != nil && !utils.IsErrNoRow(e) {
			br.Msg = "操作失败"
			br.ErrMsg = fmt.Sprintf("获取审批人信息失败, %v", e)
			return
		}
		if admin != nil && admin.AdminId > 0 {
			approveUser = admin
		}
	}
	if approveUser.AdminId == 0 {
		utils.FileLog.Info(fmt.Sprintf("ReportApprove-无审批人信息, OutId: %s", req.ApproveUser))
	}

	reportMessages := make([]*models.ReportMessage, 0)
	afterApproveMap := map[int]int{
		1: models.ReportStatePass,
		2: models.ReportStateRefused,
		3: models.ReportStateWaitSubmit,
		4: models.ReportStateWaitApprove,
	}
	if len(updateReports) > 0 {
		for _, v := range updateReports {
			updateCols := []string{"State", "ModifyTime"}
			v.State = afterApproveMap[req.ApproveType]
			v.ModifyTime = time.Now()
			if v.State == models.ReportStatePass || v.State == models.ReportStateRefused {
				v.ApproveTime = time.Now()
				updateCols = append(updateCols, "ApproveTime")
			}
			if e := v.Update(updateCols); e != nil {
				br.Msg = "操作失败"
				br.ErrMsg = fmt.Sprintf("更新报告状态失败, %v", e)
				return
			}
			if req.ApproveType == 1 {
				// 审批通过,将PPT或研报加入报告库中
				go func() {
					msg, err := knowledge.ReportKnowledgeResourceAdd(v.Title, []string{v.DetailPdfUrl}, v.AdminId, v.AdminRealName, "市场研究报告/内部报告/日常报告", "市场信息研究所", time.Now())
					if err != nil {
						utils.FileLog.Error(fmt.Sprintf("ReportKnowledgeResourceAdd-报告知识资源库添加失败,reportId:%d,msg:%s,err: %v", v.Id, msg, err))
						return
					}
				}()
				go func() {
					// 审批通过,将摘要加入知识资源库观点中
					var classifyId int
					if v.ClassifyIdThird > 0 {
						classifyId = v.ClassifyIdThird
					} else if v.ClassifyIdSecond > 0 {
						classifyId = v.ClassifyIdSecond
					} else {
						classifyId = v.ClassifyIdFirst
					}
					v.Abstract = strings.TrimSpace(v.Abstract)
					if v.Abstract == "" {
						return
					}
					classifyId, err := knowledge.ReportKnowledgeResourceClassifyCheckAndSave(classifyId)
					if err != nil {
						utils.FileLog.Error(fmt.Sprintf("ReportKnowledgeResourceClassifyCheckAndSave-报告分类保存失败,reportId:%d,classifyId:%d,err: %v", v.Id, classifyId, err))
						return
					}
					msg, err := knowledge.ViewPointSave(0, v.AdminId, v.AdminRealName, v.Title, v.Abstract, "市场信息研究所", "", classifyId, &v.ApproveTime)
					if err != nil {
						utils.FileLog.Error(fmt.Sprintf("ViewPointSave-报告摘要知识资源库添加失败,reportId:%d,msg:%s,err: %v", v.Id, msg, err))
						return
					}
				}()
			}

			if req.ApproveType == 3 || req.ApproveType == 4 {
				// 撤回/提审暂不发消息
				continue
			}

			// 创作人和协作人
			userIds := make([]int, 0)
			userIds = append(userIds, v.AdminId)
			{
				grantOb := new(models.ReportGrant)
				grantCond := ` AND report_id = ?`
				grantPars := make([]interface{}, 0)
				grantPars = append(grantPars, v.Id)
				grants, e := grantOb.GetItemsByCondition(grantCond, grantPars, []string{"admin_id"}, "")
				if e != nil {
					br.Msg = "操作失败"
					br.ErrMsg = fmt.Sprintf("获取报告协作人失败, %v", e)
					return
				}
				for _, v := range grants {
					if utils.InArrayByInt(userIds, v.AdminId) {
						continue
					}
					userIds = append(userIds, v.AdminId)
				}
			}

			// 发送系统消息给创建人和协作人
			var messageType int
			var tips string
			var extraContent string
			if v.State == models.ReportStatePass {
				messageType = models.ReportMessageTypeApprovePass
				tips = "已通过审批!"
			}
			if v.State == models.ReportStateRefused {
				messageType = models.ReportMessageTypeApproveRefuse
				tips = "已被驳回,点击查看详情!"
				// 审批详情信息
				var extra models.ReportMessageApproveItem
				extra.Title = v.Title
				extra.ApproveType = 2
				extra.ApproveUserId = approveUser.AdminId
				extra.ApproveUserName = approveUser.RealName
				extra.ApproveRemark = req.Suggestion
				b, e := json.Marshal(extra)
				if e != nil {
					br.Msg = "操作失败"
					br.ErrMsg = fmt.Sprintf("消息通知-审批信息JSON格式化失败, %v", e)
					return
				}
				extraContent = string(b)
			}
			for _, u := range userIds {
				m := new(models.ReportMessage)
				m.SendUserId = approveUser.AdminId
				m.ReceiveUserId = u
				m.Content = fmt.Sprintf("您提交的【%s】%s", v.Title, tips)
				m.ExtraContent = extraContent
				m.ReportType = utils.ReportTypeDefault
				m.ReportId = v.Id
				m.MessageType = messageType
				m.CreateTime = time.Now()
				m.ModifyTime = time.Now()
				reportMessages = append(reportMessages, m)
			}
		}
	}
	if len(updatePpts) > 0 {
		for _, v := range updatePpts {
			updateCols := []string{"State", "ModifyTime"}
			v.State = afterApproveMap[req.ApproveType]
			v.ModifyTime = time.Now()
			if v.State == models.ReportStatePass || v.State == models.ReportStateRefused {
				v.ApproveTime = time.Now()
				updateCols = append(updateCols, "ApproveTime")
			}
			if e := v.Update(updateCols); e != nil {
				br.Msg = "操作失败"
				br.ErrMsg = fmt.Sprintf("更新报告状态失败, %v", e)
				return
			}

			if req.ApproveType == 1 {
				// 审批通过,将PPT或研报加入报告库中
				go func() {
					msg, err := knowledge.ReportKnowledgeResourceAdd(v.Title, []string{v.PptxUrl}, v.AdminId, v.AdminRealName, "市场研究报告/内部报告/日常报告", "市场信息研究所", time.Now())
					if err != nil {
						utils.FileLog.Error(fmt.Sprintf("ReportKnowledgeResourceAdd-PPT知识资源报告库添加失败,pptId:%d,msg:%s,err: %v", v.PptId, msg, err))
						return
					}
				}()
				go func() {
					// 审批通过,将摘要加入知识资源库观点中
					v.Abstract = strings.TrimSpace(v.Abstract)
					if v.Abstract == "" {
						return
					}
					classifyId, err := knowledge.ReportKnowledgeResourceClassifyCheckAndSave(v.ClassifyId)
					if err != nil {
						utils.FileLog.Error(fmt.Sprintf("ReportKnowledgeResourceClassifyCheckAndSave-PPT分类保存失败,pptId:%d,classifyId:%d,err: %v", v.PptId, v.ClassifyId, err))
						return
					}
					msg, err := knowledge.ViewPointSave(0, v.AdminId, v.AdminRealName, v.Title, v.Abstract, "市场信息研究所", "", classifyId, &v.ApproveTime)
					if err != nil {
						utils.FileLog.Error(fmt.Sprintf("ViewPointSave-ppt摘要知识库添加失败,pptId:%d,msg:%s,err: %v", v.PptId, msg, err))
						return
					}
				}()
			}

			if req.ApproveType == 3 || req.ApproveType == 4 {
				// 撤回/提审暂不发消息
				continue
			}

			// 创建人和协作人
			userIds := make([]int, 0)
			userIds = append(userIds, v.AdminId)
			if v.CollaborateUsers != "" {
				partnerArr := strings.Split(v.CollaborateUsers, ",")
				for _, p := range partnerArr {
					uid, _ := strconv.Atoi(p)
					if uid > 0 && !utils.InArrayByInt(userIds, uid) {
						userIds = append(userIds, uid)
					}
				}
			}

			// 发送系统消息给创建人和协作人
			var messageType int
			var tips string
			var extraContent string
			if v.State == models.ReportStatePass {
				messageType = models.ReportMessageTypeApprovePass
				tips = "已通过审批!"
			}
			if v.State == models.ReportStateRefused {
				messageType = models.ReportMessageTypeApproveRefuse
				tips = "已被驳回,点击查看详情!"
				// 审批详情信息
				var extra models.ReportMessageApproveItem
				extra.Title = v.Title
				extra.ApproveType = 2
				extra.ApproveUserId = approveUser.AdminId
				extra.ApproveUserName = approveUser.RealName
				extra.ApproveRemark = req.Suggestion
				b, e := json.Marshal(extra)
				if e != nil {
					br.Msg = "操作失败"
					br.ErrMsg = fmt.Sprintf("消息通知-审批信息JSON格式化失败, %v", e)
					return
				}
				extraContent = string(b)
			}
			for _, u := range userIds {
				m := new(models.ReportMessage)
				m.SendUserId = approveUser.AdminId
				m.ReceiveUserId = u
				m.Content = fmt.Sprintf("您提交的【%s】%s", v.Title, tips)
				m.ExtraContent = extraContent
				m.ReportType = utils.ReportTypePPT
				m.ReportId = v.PptId
				m.MessageType = messageType
				m.CreateTime = time.Now()
				m.ModifyTime = time.Now()
				reportMessages = append(reportMessages, m)
			}
		}
	}

	// 消息通知
	if len(reportMessages) > 0 {
		messageOb := new(models.ReportMessage)
		if e := messageOb.CreateMulti(reportMessages); e != nil {
			br.Msg = "操作失败"
			br.ErrMsg = fmt.Sprintf("批量新增报告消息失败, %v", e)
			return
		}
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
}

// ReportRemove
// @Title 删除报告
// @Description 删除报告接口
// @Param	request	body models.ReportRemoveReq true "type json string"
// @Success 200 string "操作成功"
// @router /report/remove [post]
func (this *ReportOpenController) ReportRemove() {
	br := new(models.BaseResponse).Init()
	defer func() {
		if br.ErrMsg == "" {
			br.IsSendEmail = false
		}
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.ReportRemoveReq
	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
		br.Msg = "参数解析异常"
		br.ErrMsg = fmt.Sprintf("参数解析失败,%v", e)
		return
	}
	if len(req.ReportIds) == 0 {
		br.Msg = "报告ID有误"
		br.ErrMsg = fmt.Sprintf("智力共享报告ID有误, %v", req.ReportIds)
		return
	}

	// TODO:(可选优化)若报告的状态是已审批状态,那么把OutReportId置空,不做物理删除
	for _, v := range req.ReportIds {
		reportExist, pptExist := services.GetReportByOutReportId(v)
		// 不存在忽略即可
		if reportExist == nil && pptExist == nil {
			continue
		}

		// 研报类型
		if reportExist != nil && reportExist.Id > 0 {
			if e := reportExist.Remove(); e != nil {
				br.Msg = "操作失败"
				br.ErrMsg = fmt.Sprintf("删除报告失败, %v", e)
				return
			}
		}

		// PPT类型
		if pptExist != nil && pptExist.PptId > 0 {
			if e := pptExist.Remove(); e != nil {
				br.Msg = "操作失败"
				br.ErrMsg = fmt.Sprintf("删除PPT报告失败, %v", e)
				return
			}
		}
	}

	br.Ret = 200
	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.ReportViewPointSaveReq
	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 == "" {
		br.Msg = "观点日期不能为空"
		return
	}
	dataDate, err := time.ParseInLocation(utils.FormatDateTime, req.DataDate, time.Local)
	if err != nil {
		br.Msg = "观点日期格式不正确"
		return
	}
	msg, err := knowledge.ViewPointSave(req.Id, 0, "", req.Title, req.Content, req.DataSource, req.Category, 0, &dataDate)
	if err != nil {
		if msg == "" {
			msg = "保存观点失败"
		}
		br.Msg = msg
		br.ErrMsg = fmt.Sprintf("保存观点失败, %v", err)
		return
	}

	br.Msg = "保存观点成功"
	br.Success = true
	br.Ret = 200
}

// @Title 观点删除
// @Description 观点删除
// @Param request body models.ReportViewPointReq true "type json string"
// @Success 200 string "操作成功"
// @router /viewpoint/delete [post]
func (this *ReportOpenController) ViewPointDelete() {
	br := new(models.BaseResponse).Init()
	defer func() {
		if br.ErrMsg == "" {
			br.IsSendEmail = false
		}
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req *models.ReportViewPointDeleteRep
	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
		br.Msg = "参数解析异常"
		br.ErrMsg = fmt.Sprintf("参数解析失败,%v", e)
		return
	}
	if req.Id == nil {
		br.Msg = "观点ID不能为空"
		return
	}

	obj := new(models.KnowledgeResource)
	obj, err := obj.GetKnowledgeResourceByOutId(*req.Id)
	if err != nil {
		if utils.IsErrNoRow(err) {
			br.Msg = "观点不存在"
			return
		}
		br.Msg = "删除观点失败"
		br.ErrMsg = fmt.Sprintf("删除观点失败, %v", err)
		return
	}
	obj.IsDelete = 1
	if err = obj.Update([]string{"IsDelete"}); err != nil {
		br.Msg = "删除观点失败"
		br.ErrMsg = fmt.Sprintf("删除观点失败, %v", err)
		return
	}
	updateMap := map[string]interface{}{
		"IsDelete": "1",
	}
	err = knowledge.UpdateEsKnowledgeResource(obj.KnowledgeResourceId, updateMap)
	if err != nil {
		br.Msg = "删除观点失败"
		br.ErrMsg = fmt.Sprintf("es删除观点失败, %v", err)
		return
	}

	br.Msg = "删除观点成功"
	br.Success = true
	br.Ret = 200
}

// @Title 知识资源报告库上传
// @Description 知识资源报告库上传
// @Param request body string/int true/false "Description"
// @Success 200 string "操作成功"
// @router /report/knowledge/upload [post]
func (this *ReportOpenController) ReportKnowledgeUpload() {
	br := new(models.BaseResponse).Init()
	defer func() {
		if br.ErrMsg == "" {
			br.IsSendEmail = false
		}
		this.Data["json"] = br
		this.ServeJSON()
	}()

	var req models.ReportKnowledgeUploadRep
	if e := this.BindForm(&req); e != nil {
		br.Msg = "参数解析异常"
		br.ErrMsg = fmt.Sprintf("参数解析失败,%v", e)
		return
	}
	pushTime, err := time.Parse(utils.FormatDateTime, req.PushTime)
	if err != nil {
		br.Msg = "发布时间格式不正确"
		return
	}
	fileUrls, msg, err := knowledge.UploadFormFile(this.Ctx.Request.MultipartForm.File)
	if err != nil {
		if msg == "" {
			msg = "上传失败"
		}
		br.Msg = msg
		br.ErrMsg = fmt.Sprintf("上传失败, %v", err)
		return
	}
	msg, err = knowledge.ReportKnowledgeResourceAdd(req.Title, fileUrls, 0, "", req.ClassifyPath, req.Source, pushTime)
	if err != nil {
		if msg == "" {
			msg = "保存失败"
		}
		br.Msg = msg
		br.ErrMsg = fmt.Sprintf("保存失败, %v", err)
		return
	}

	br.Ret = 200
	br.Msg = "上传成功"
	br.Success = true
}