Roc пре 7 месеци
родитељ
комит
0c0c8a1ddc

+ 2 - 2
controllers/report_approve/report_approve_flow.go

@@ -206,7 +206,7 @@ func (this *ReportApproveFlowController) Add() {
 		br.ErrMsg = fmt.Sprintf("审批流报告类型有误, ReportType: %d", req.ReportType)
 		return
 	}
-	if req.ClassifyFirstId <= 0 || req.ClassifySecondId <= 0 {
+	if req.ClassifyFirstId <= 0 && req.ClassifySecondId <= 0 && req.ClassifyThirdId <= 0 {
 		br.Msg = "请选择报告分类"
 		return
 	}
@@ -345,7 +345,7 @@ func (this *ReportApproveFlowController) Edit() {
 		br.ErrMsg = fmt.Sprintf("审批流报告类型有误, ReportType: %d", req.ReportType)
 		return
 	}
-	if req.ClassifyFirstId <= 0 || req.ClassifySecondId <= 0 {
+	if req.ClassifyFirstId <= 0 && req.ClassifySecondId <= 0 && req.ClassifyThirdId <= 0 {
 		br.Msg = "请选择报告分类"
 		return
 	}

+ 82 - 2
controllers/report_chapter.go

@@ -13,6 +13,7 @@ import (
 	"os"
 	"path"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -50,6 +51,12 @@ func (this *ReportController) AddChapter() {
 		return
 	}
 
+	req.Title = strings.TrimSpace(req.Title)
+	if req.Title == `` {
+		br.Msg = "章节名称不能为空"
+		return
+	}
+
 	// 获取报告详情
 	reportInfo, err := models.GetReportByReportId(req.ReportId)
 	if err != nil {
@@ -106,6 +113,27 @@ func (this *ReportController) AddChapter() {
 		minClassifyName = reportInfo.ClassifyNameFirst
 	}
 
+	// 判断名称是否重复
+	{
+		var condition string
+		var pars []interface{}
+
+		condition += " AND report_id = ? AND title=? "
+		pars = append(pars, req.ReportId, req.Title)
+		count, err := models.GetCountReportChapterByCondition(condition, pars)
+		if err != nil {
+			br.Msg = "新增失败"
+			br.ErrMsg = "判断章节名称是否存在失败,Err:" + err.Error()
+			return
+		}
+		if count > 0 {
+			br.Msg = "章节名称不允许重复"
+			br.ErrMsg = "章节名称不允许重复"
+			br.IsSendEmail = false
+			return
+		}
+	}
+
 	reportChapterInfo := new(models.ReportChapter)
 	reportChapterInfo.ReportId = reportInfo.Id
 	reportChapterInfo.ClassifyIdFirst = minClassifyId
@@ -181,6 +209,13 @@ func (this *ReportController) EditChapterBaseInfoAndPermission() {
 		br.Msg = "报告章节ID有误"
 		return
 	}
+
+	req.Title = strings.TrimSpace(req.Title)
+	if req.Title == `` {
+		br.Msg = "章节名称不能为空"
+		return
+	}
+
 	// 获取章节详情
 	reportChapterInfo, err := models.GetReportChapterInfoById(reportChapterId)
 	if err != nil {
@@ -188,6 +223,28 @@ func (this *ReportController) EditChapterBaseInfoAndPermission() {
 		br.ErrMsg = "报告章节信息有误, Err: " + err.Error()
 		return
 	}
+
+	// 判断名称是否重复
+	{
+		var condition string
+		var pars []interface{}
+
+		condition += " AND report_id = ? AND title=? AND report_chapter_id != ? "
+		pars = append(pars, reportChapterInfo.ReportId, req.Title, reportChapterId)
+		count, err := models.GetCountReportChapterByCondition(condition, pars)
+		if err != nil {
+			br.Msg = "新增失败"
+			br.ErrMsg = "判断章节名称是否存在失败,Err:" + err.Error()
+			return
+		}
+		if count > 0 {
+			br.Msg = "章节名称不允许重复"
+			br.ErrMsg = "章节名称不允许重复"
+			br.IsSendEmail = false
+			return
+		}
+	}
+
 	// 获取报告详情
 	reportInfo, err := models.GetReportByReportId(reportChapterInfo.ReportId)
 	if err != nil {
@@ -1432,8 +1489,10 @@ func (this *ReportController) EditChapterTitle() {
 		br.Msg = "报告章节ID有误"
 		return
 	}
-	if req.Title == "" {
-		br.Msg = "请输入标题"
+
+	req.Title = strings.TrimSpace(req.Title)
+	if req.Title == `` {
+		br.Msg = "章节名称不能为空"
 		return
 	}
 
@@ -1445,6 +1504,27 @@ func (this *ReportController) EditChapterTitle() {
 		return
 	}
 
+	// 判断名称是否重复
+	{
+		var condition string
+		var pars []interface{}
+
+		condition += " AND report_id = ? AND title=? AND report_chapter_id != ? "
+		pars = append(pars, reportChapterInfo.ReportId, req.Title, reportChapterId)
+		count, err := models.GetCountReportChapterByCondition(condition, pars)
+		if err != nil {
+			br.Msg = "新增失败"
+			br.ErrMsg = "判断章节名称是否存在失败,Err:" + err.Error()
+			return
+		}
+		if count > 0 {
+			br.Msg = "章节名称不允许重复"
+			br.ErrMsg = "章节名称不允许重复"
+			br.IsSendEmail = false
+			return
+		}
+	}
+
 	// 获取报告详情
 	reportInfo, err := models.GetReportByReportId(reportChapterInfo.ReportId)
 	if err != nil {

+ 5 - 4
controllers/report_v2.go

@@ -246,8 +246,8 @@ func (this *ReportController) ListReport() {
 				}
 			}
 			list[i].ChapterVideoList = chapterList
-			list[i].Pv += pvMap[list[i].Id]
-			list[i].Uv += uvMap[list[i].Id]
+			list[i].Pv = pvMap[list[i].Id]
+			list[i].Uv = uvMap[list[i].Id]
 		}
 	}
 
@@ -1378,8 +1378,9 @@ func (this *ReportController) PrePublishReport() {
 	}
 
 	// 生成报告pdf和长图
-	if req.ReportUrl != "" {
-		go services.Report2pdfAndJpeg(req.ReportUrl, reportDetail.Id, 1)
+	{
+		reportPdfUrl := services.GetGeneralPdfUrl(reportDetail.ReportCode, reportDetail.ReportLayout)
+		go services.Report2pdfAndJpeg(reportPdfUrl, reportDetail.Id, 1)
 	}
 
 	br.Ret = 200

+ 1 - 1
models/report_approve/report_approve.go

@@ -326,7 +326,7 @@ func GetApprovedReportApprovePageList(cond string, pars []interface{}, orderRule
 	if orderRule != "" {
 		order = ` ORDER BY ` + orderRule
 	}
-	sql := fmt.Sprintf(`SELECT a.report_approve_record_id, a.state AS record_state,a.node_state,a.node_approve_time, a.approve_time AS handle_time, b.*
+	sql := fmt.Sprintf(`SELECT a.report_approve_record_id, a.node_state AS record_state,a.node_state,a.node_approve_time, a.approve_time AS handle_time, b.*
 		FROM report_approve_record AS a
 		JOIN report_approve AS b ON a.report_approve_id = b.report_approve_id
 		WHERE 1 = 1 %s %s

+ 19 - 0
models/report_chapter.go

@@ -585,3 +585,22 @@ func GetAllReportChapter() (items []*ReportChapter, err error) {
 
 	return
 }
+
+// GetCountReportChapterByCondition
+// @Description: 根据条件获取章节数量
+// @author: Roc
+// @datetime 2024-07-15 15:37:50
+// @param condition string
+// @param pars []interface{}
+// @return count int
+// @return err error
+func GetCountReportChapterByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` SELECT COUNT(1) AS count FROM report_chapter WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+
+	return
+}

+ 73 - 72
services/report.go

@@ -434,78 +434,79 @@ func reportBase64ToImg(imageBase64 string) (resourceUrl string, err error) {
 	return
 }
 
-// UpdateReportVideo 更新报告及其章节音频
-func UpdateReportVideo(reportId int) (err error) {
-	defer func() {
-		if err != nil {
-			utils.FileLog.Error("UpdateReportVideo, reportId:%s, Err:%s", strconv.Itoa(reportId), err.Error())
-			go alarm_msg.SendAlarmMsg("更新报告音频失败, 报告ID: "+strconv.Itoa(reportId)+", Err: "+err.Error(), 3)
-			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "更新报告音频失败, 报告ID: " + reportIdStr + ", Err: "+err.Error(), utils.EmailSendToUsers)
-		}
-	}()
-	if reportId == 0 {
-		return
-	}
-	reportInfo, err := models.GetReportByReportId(reportId)
-	if err != nil {
-		return
-	}
-	if reportInfo.HasChapter == 1 {
-		// 更新章节音频
-		chapterList, tmpErr := models.GetPublishedChapterListByReportId(reportInfo.Id)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		chapterIdArr := make([]int, 0)
-		for i := 0; i < len(chapterList); i++ {
-			chapterIdArr = append(chapterIdArr, chapterList[i].ReportChapterId)
-		}
-		//go UpdateChaptersVideo(chapterIds)
-		err = UpdateChaptersVideo(chapterIdArr)
-	} else {
-		// 更新报告音频
-		if reportInfo.VideoUrl != "" {
-			return
-		}
-		nowTime := time.Now()
-		updateCols := make([]string, 0)
-		updateCols = append(updateCols, "VideoUrl", "VideoName", "VideoSize", "VideoPlaySeconds")
-		videoUrl, videoName, videoSize, videoPlaySeconds, tmpErr := CreateReportVideo(reportInfo.Title, html.UnescapeString(reportInfo.Content), nowTime.Format(utils.FormatDateTime))
-		reportInfo.VideoUrl = videoUrl
-		reportInfo.VideoName = videoName
-		reportInfo.VideoSize = videoSize
-		reportInfo.VideoPlaySeconds = fmt.Sprintf("%.2f", videoPlaySeconds)
-		tmpErr = reportInfo.UpdateReport(updateCols)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-	}
-	return
-}
-
-func UpdateEmptyVideoReportVideo() (err error) {
-	list, err := models.GetSyncEmptyVideoReport()
-	if err != nil {
-		return
-	}
-	listLen := len(list)
-	if listLen <= 0 {
-		fmt.Println("无报告需要更新音频")
-		return
-	}
-	fmt.Println("Start 待更新报告音频数: ", listLen)
-	for i := 0; i < listLen; i++ {
-		if err = UpdateReportVideo(list[i].Id); err != nil {
-			fmt.Printf("更新音频失败")
-			fmt.Println(err.Error())
-			return
-		}
-	}
-	fmt.Println("End 报告音频更新完毕")
-	return
-}
+//
+//// UpdateReportVideo 更新报告及其章节音频
+//func UpdateReportVideo(reportId int) (err error) {
+//	defer func() {
+//		if err != nil {
+//			utils.FileLog.Error("UpdateReportVideo, reportId:%s, Err:%s", strconv.Itoa(reportId), err.Error())
+//			go alarm_msg.SendAlarmMsg("更新报告音频失败, 报告ID: "+strconv.Itoa(reportId)+", Err: "+err.Error(), 3)
+//			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "更新报告音频失败, 报告ID: " + reportIdStr + ", Err: "+err.Error(), utils.EmailSendToUsers)
+//		}
+//	}()
+//	if reportId == 0 {
+//		return
+//	}
+//	reportInfo, err := models.GetReportByReportId(reportId)
+//	if err != nil {
+//		return
+//	}
+//	if reportInfo.HasChapter == 1 {
+//		// 更新章节音频
+//		chapterList, tmpErr := models.GetPublishedChapterListByReportId(reportInfo.Id)
+//		if tmpErr != nil {
+//			err = tmpErr
+//			return
+//		}
+//		chapterIdArr := make([]int, 0)
+//		for i := 0; i < len(chapterList); i++ {
+//			chapterIdArr = append(chapterIdArr, chapterList[i].ReportChapterId)
+//		}
+//		//go UpdateChaptersVideo(chapterIds)
+//		err = UpdateChaptersVideo(chapterIdArr)
+//	} else {
+//		// 更新报告音频
+//		if reportInfo.VideoUrl != "" {
+//			return
+//		}
+//		nowTime := time.Now()
+//		updateCols := make([]string, 0)
+//		updateCols = append(updateCols, "VideoUrl", "VideoName", "VideoSize", "VideoPlaySeconds")
+//		videoUrl, videoName, videoSize, videoPlaySeconds, tmpErr := CreateReportVideo(reportInfo.Title, html.UnescapeString(reportInfo.Content), nowTime.Format(utils.FormatDateTime))
+//		reportInfo.VideoUrl = videoUrl
+//		reportInfo.VideoName = videoName
+//		reportInfo.VideoSize = videoSize
+//		reportInfo.VideoPlaySeconds = fmt.Sprintf("%.2f", videoPlaySeconds)
+//		tmpErr = reportInfo.UpdateReport(updateCols)
+//		if tmpErr != nil {
+//			err = tmpErr
+//			return
+//		}
+//	}
+//	return
+//}
+//
+//func UpdateEmptyVideoReportVideo() (err error) {
+//	list, err := models.GetSyncEmptyVideoReport()
+//	if err != nil {
+//		return
+//	}
+//	listLen := len(list)
+//	if listLen <= 0 {
+//		fmt.Println("无报告需要更新音频")
+//		return
+//	}
+//	fmt.Println("Start 待更新报告音频数: ", listLen)
+//	for i := 0; i < listLen; i++ {
+//		if err = UpdateReportVideo(list[i].Id); err != nil {
+//			fmt.Printf("更新音频失败")
+//			fmt.Println(err.Error())
+//			return
+//		}
+//	}
+//	fmt.Println("End 报告音频更新完毕")
+//	return
+//}
 
 // checkDayWeekChapterWrite 校验晨周报已写章节与本期应写章节
 func checkDayWeekChapterWrite(chapters []*models.ReportChapter, reportType string) (publishReport bool, tips string, publishIdArr, unPublishIdArr []int, err error) {

+ 11 - 5
services/report_approve.go

@@ -676,9 +676,6 @@ func PassReportApprove(approveItem *report_approve.ReportApprove, recordItem *re
 				return
 			}
 		}()
-
-		// 生成报告pdf和长图
-		go Report2pdfAndJpeg(reportUrl, approveItem.ReportId, approveItem.ReportType)
 	}
 	return
 }
@@ -701,7 +698,7 @@ func RefuseReportApprove(approveItem *report_approve.ReportApprove, recordItem *
 	recordItem.ApproveTime = now
 	recordItem.ModifyTime = now
 
-	recordItem.NodeState = report_approve.ReportApproveStatePass
+	recordItem.NodeState = report_approve.ReportApproveStateRefuse
 	recordItem.NodeApproveUserId = recordItem.ApproveUserId
 	recordItem.NodeApproveUserName = recordItem.ApproveUserName
 	recordItem.NodeApproveTime = now
@@ -839,7 +836,16 @@ func AfterReportApprovePass(reportType, reportId int) (err error) {
 			err = fmt.Errorf("获取研报信息失败, Err: %s", e.Error())
 			return
 		}
-		_ = CreateVideo(reportInfo)
+		// 重新生成音频,里面还涉及到章节类型的报告
+		go UpdateReportVideo(reportInfo)
+
+		// 生成报告pdf和长图
+		{
+			reportPdfUrl := GetGeneralPdfUrl(reportInfo.ReportCode, reportInfo.ReportLayout)
+			go Report2pdfAndJpeg(reportPdfUrl, reportId, 1)
+		}
+
+		//_ = CreateVideo(reportInfo)
 		_ = UpdateReportEs(reportInfo.Id, models.ReportStatePublished)
 
 		return

+ 63 - 4
services/report_v2.go

@@ -1117,8 +1117,9 @@ func PublishReport(reportId int, reportUrl string, sysUser *system.Admin) (tips
 	}()
 
 	// 生成报告pdf和长图
-	if reportUrl != "" {
-		go Report2pdfAndJpeg(reportUrl, reportId, 1)
+	{
+		reportPdfUrl := GetGeneralPdfUrl(reportInfo.ReportCode, reportInfo.ReportLayout)
+		go Report2pdfAndJpeg(reportPdfUrl, reportId, 1)
 	}
 
 	// 报告权限处理
@@ -1248,8 +1249,9 @@ func PublishChapterReport(reportInfo *models.Report, reportUrl string, sysUser *
 	go SaveReportLogs(reportInfo, chapters, reportInfo.AdminId, reportInfo.AdminRealName)
 
 	// 生成报告pdf和长图
-	if reportUrl != "" {
-		go Report2pdfAndJpeg(reportUrl, reportId, 1)
+	{
+		reportPdfUrl := GetGeneralPdfUrl(reportInfo.ReportCode, reportInfo.ReportLayout)
+		go Report2pdfAndJpeg(reportPdfUrl, reportId, 1)
 	}
 
 	return
@@ -1338,3 +1340,60 @@ func HandleReportPermission(reportInfo *models.Report) {
 	}
 	handleReportPermission(int64(reportInfo.Id), minClassifyId)
 }
+
+// UpdateReportVideo
+// @Description: 更新报告音频
+// @author: Roc
+// @datetime 2024-07-17 18:11:10
+// @param reportInfo *models.Report
+func UpdateReportVideo(reportInfo *models.Report) {
+	if reportInfo.HasChapter == 1 {
+		reportChapterIdList := make([]int, 0)
+		// 获取报告中的所有章节列表
+		chapterList, err := models.GetChapterListByReportId(reportInfo.Id)
+		if err != nil {
+			return
+		}
+		for _, chapter := range chapterList {
+			if chapter.PublishState == 2 {
+				reportChapterIdList = append(reportChapterIdList, chapter.ReportChapterId)
+			}
+		}
+		if len(reportChapterIdList) > 0 {
+			err = UpdateChaptersVideo(reportChapterIdList)
+			if err != nil {
+				utils.FileLog.Info(fmt.Sprintf("%d报告音频生产失败:%s", reportInfo.Id, err.Error()))
+			}
+		}
+	} else {
+		err := CreateVideo(reportInfo)
+		if err != nil {
+			utils.FileLog.Info(fmt.Sprintf("%d报告音频生产失败:%s", reportInfo.Id, err.Error()))
+		}
+	}
+}
+
+// GetGeneralPdfUrl
+// @Description: 获取生成pdf的地址
+// @author: Roc
+// @datetime 2024-07-19 14:09:28
+// @param reportCode string
+// @param reportLayout int8
+// @return pdfUrl string
+func GetGeneralPdfUrl(reportCode string, reportLayout int8) (pdfUrl string) {
+	conf, e := models.GetBusinessConfByKey("ReportViewUrl")
+	if e != nil {
+		return
+	}
+
+	switch reportLayout {
+	case 1:
+		// 普通布局
+		pdfUrl = fmt.Sprintf("%s/reportshare_pdf?code=%s", conf.ConfVal, reportCode)
+	case 2:
+		// 智能布局
+		pdfUrl = fmt.Sprintf("%s/reportshare_smart_pdf?code=%s", conf.ConfVal, reportCode)
+	}
+
+	return
+}

+ 11 - 0
services/smart_report.go

@@ -278,6 +278,13 @@ finally:
 	return
 }
 
+// Report2pdfAndJpeg
+// @Description: 报告转pdf和图片
+// @author: Roc
+// @datetime 2024-07-19 14:11:38
+// @param reportUrl string
+// @param reportId int
+// @param reportType int
 func Report2pdfAndJpeg(reportUrl string, reportId, reportType int) {
 	var err error
 
@@ -288,6 +295,10 @@ func Report2pdfAndJpeg(reportUrl string, reportId, reportType int) {
 		}
 	}()
 
+	if reportUrl == `` {
+		return
+	}
+
 	// 先清空字段
 	if reportType == 1 {
 		err = models.UpdatePdfUrlReportById(reportId)

+ 1 - 1
services/wechat_send_msg.go

@@ -111,7 +111,7 @@ func SendMiniProgramReportWxMsg(reportId int) (err error) {
 
 	var wxAppPath string
 	weekClassifyId, err := company.GetReportClassifyIdByConfigKey("report_week_classify_id")
-	if err != nil {
+	if err != nil && err.Error() != utils.ErrNoRow() {
 		msg = "获取周报ID配置失败:" + err.Error()
 		return err
 	}