kobe6258 1 өдөр өмнө
parent
commit
58fbcb5985

+ 14 - 0
go.mod

@@ -49,9 +49,16 @@ require (
 	github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.973
 	github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses v1.0.973
 	github.com/xuri/excelize/v2 v2.8.1
+<<<<<<< HEAD
 	go.mongodb.org/mongo-driver v1.16.0
 	golang.org/x/net v0.27.0
 	golang.org/x/time v0.5.0
+=======
+	github.com/yidane/formula v0.0.0-20220322063702-c9da84ba3476
+	go.mongodb.org/mongo-driver v1.15.0
+	golang.org/x/net v0.21.0
+	golang.org/x/time v0.0.0-20220609170525-579cf78fd858
+>>>>>>> pool_424_pdf_remote_gen
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
 	gorm.io/driver/mysql v1.5.7
 	gorm.io/gorm v1.25.12
@@ -162,10 +169,17 @@ require (
 	golang.org/x/crypto v0.25.0 // indirect
 	golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
 	golang.org/x/image v0.15.0 // indirect
+<<<<<<< HEAD
 	golang.org/x/sync v0.7.0 // indirect
 	golang.org/x/sys v0.22.0 // indirect
 	golang.org/x/text v0.16.0 // indirect
 	google.golang.org/protobuf v1.34.1 // indirect
+=======
+	golang.org/x/sync v0.2.0 // indirect
+	golang.org/x/sys v0.17.0 // indirect
+	golang.org/x/text v0.14.0 // indirect
+	google.golang.org/protobuf v1.30.0 // indirect
+>>>>>>> pool_424_pdf_remote_gen
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect
 	gopkg.in/ini.v1 v1.67.0 // indirect

+ 4 - 0
go.sum

@@ -398,6 +398,10 @@ github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mo
 github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
 github.com/panjf2000/ants v1.3.0 h1:8pQ+8leaLc9lys2viEEr8md0U4RN6uOSUCE9bOYjQ9M=
 github.com/panjf2000/ants v1.3.0/go.mod h1:AaACblRPzq35m1g3enqYcxspbbiOJJYaxU2wMpm1cXY=
+<<<<<<< HEAD
+=======
+github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+>>>>>>> pool_424_pdf_remote_gen
 github.com/pdfcpu/pdfcpu v0.8.0 h1:SuEB4uVsPFz1nb802r38YpFpj9TtZh/oB0bGG34IRZw=
 github.com/pdfcpu/pdfcpu v0.8.0/go.mod h1:jj03y/KKrwigt5xCi8t7px2mATcKuOzkIOoCX62yMho=
 github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=

+ 6 - 1
models/english_report.go

@@ -1039,7 +1039,12 @@ func ModifyEnglishReportPdfUrl(reportId int, detailPdfUrl string) (err error) {
 	err = o.Exec(sql, detailPdfUrl, reportId).Error
 	return
 }
-
+func ModifyEnglishReportPdfAndJPGUrl(reportId int, detailPdfUrl, detailImgUrl, detailPdfUrlMobile, detailImgUrlMobile string) (err error) {
+	o := global.DbMap[utils.DbNameReport]
+	sql := `UPDATE english_report SET detail_pdf_url=?,detail_pdf_url_mobile=?,detail_img_url=?,detail_img_url_mobile=? WHERE id=? `
+	err = o.Exec(sql, detailPdfUrl, detailPdfUrlMobile, detailImgUrl, detailImgUrlMobile, reportId).Error
+	return
+}
 func ModifyEnglishReportImgUrl(reportId int, detailImgUrl string) (err error) {
 	o := global.DbMap[utils.DbNameReport]
 	sql := `UPDATE english_report SET detail_img_url=? WHERE id=? `

+ 5 - 5
models/manual_edb.go

@@ -166,11 +166,11 @@ func GetEdbInfoSortList(condition string, pars []interface{}, startSize, pageSiz
 	if orderType == "" {
 		orderType = "DESC"
 	}
-	//sql += ` ORDER BY a.` + orderField + ` ` + orderType
-	sql += ` ORDER BY ? ?`
-
-	pars = append(pars, orderField)
-	pars = append(pars, orderType)
+	sql += ` ORDER BY a.` + orderField + ` ` + orderType
+	//sql += ` ORDER BY ? ?`
+	//
+	//pars = append(pars, orderField)
+	//pars = append(pars, orderType)
 
 	if pageSize > 0 {
 		sql += ` LIMIT ?,? `

+ 8 - 3
models/report.go

@@ -1578,7 +1578,12 @@ func ModifyReportPdfUrl(reportId int, detailPdfUrl string) (err error) {
 	err = o.Exec(sql, detailPdfUrl, reportId).Error
 	return
 }
-
+func ModifyReportPdfAndJpgUrl(reportId int, detailPdfUrl, detailImgUrl, detailPdfUrlMobile, detailImgUrlMobile string) (err error) {
+	o := global.DbMap[utils.DbNameReport]
+	sql := `UPDATE report SET detail_pdf_url=?,detail_pdf_url_mobile=?,detail_img_url=?,detail_img_url_mobile=?  WHERE id=? `
+	err = o.Exec(sql, detailPdfUrl, detailPdfUrlMobile, detailImgUrl, detailImgUrlMobile, reportId).Error
+	return
+}
 func ModifyReportImgUrl(reportId int, detailImgUrl string) (err error) {
 	o := global.DbMap[utils.DbNameReport]
 	sql := `UPDATE report SET detail_img_url=? WHERE id=? `
@@ -1721,7 +1726,7 @@ func InsertOrUpdateReportFreeLayoutContentPage(reportInfo *Report, ormList []*re
 		}
 		_ = tx.Commit()
 	}()
-	reportUpdateCols := []string{"Content", "ContentSub", "ContentStruct", "HeadImg", "EndImg", "CanvasColor", "HeadResourceId", "EndResourceId", "ModifyTime", "ContentModifyTime","FreeLayoutConfig"}
+	reportUpdateCols := []string{"Content", "ContentSub", "ContentStruct", "HeadImg", "EndImg", "CanvasColor", "HeadResourceId", "EndResourceId", "ModifyTime", "ContentModifyTime", "FreeLayoutConfig"}
 	err = tx.Model(&reportInfo).Select(reportUpdateCols).Updates(reportInfo).Error
 	return report.BatchInsertOrUpdatePages(tx, ormList, false, reportInfo.Id, 0)
 }
@@ -1735,7 +1740,7 @@ func UpdateChapterFreeLayoutContentPage(reportInfo *Report, chapterInfo *ReportC
 		_ = tx.Commit()
 	}()
 
-	if err = tx.Model(&reportInfo).Select([]string{"LastModifyAdminId", "LastModifyAdminName", "ModifyTime","FreeLayoutConfig"}).Updates(reportInfo).Error; err != nil {
+	if err = tx.Model(&reportInfo).Select([]string{"LastModifyAdminId", "LastModifyAdminName", "ModifyTime", "FreeLayoutConfig"}).Updates(reportInfo).Error; err != nil {
 		return
 	}
 	// 更新章节

+ 61 - 0
models/report/report_pdf_task.go

@@ -0,0 +1,61 @@
+package report
+
+import (
+	"eta/eta_api/global"
+	"eta/eta_api/utils"
+	"time"
+)
+
+const (
+	ReportPdfTaskStatusPending = "pending"
+	ReportPdfTaskStatusFailed  = "failed"
+	ReportPdfTaskStatusDone    = "done"
+)
+
+type ReportPdfTask struct {
+	Id             int       `gorm:"column:id;primary_key" json:"id"`
+	ReportId       int       `gorm:"column:report_id" json:"report_id"`
+	ReportURL      string    `gorm:"column:report_url" json:"report_url"`
+	ReportType     int       `gorm:"column:report_type" json:"report_type"`
+	FreeLayout     bool      `gorm:"column:free_layout" json:"free_layout"`
+	Status         string    `gorm:"column:status" json:"status"` // 使用 enum('pending','falied','done')
+	LastFinishTime time.Time `gorm:"column:last_finish_time" json:"last_finish_time,omitempty"`
+	Message        string    `gorm:"column:message"`
+	CreatedTime    time.Time `gorm:"column:created_time" json:"created_time"`
+	UpdateTime     time.Time `gorm:"column:update_time" json:"update_time,omitempty"`
+	PostUrl        string    `gorm:"-"`
+}
+
+func (r *ReportPdfTask) TableName() string {
+	return "report_pdf_task"
+}
+
+func CreateReportPdfTask(url string, reportId, reportType int, freeLayout bool) (err error) {
+	task := &ReportPdfTask{
+		ReportId:    reportId,
+		ReportURL:   url,
+		ReportType:  reportType,
+		FreeLayout:  freeLayout,
+		Status:      ReportPdfTaskStatusPending,
+		CreatedTime: time.Now(),
+	}
+	err = global.DbMap[utils.DbNameReport].Create(task).Error
+	return
+}
+
+func GetPendingAndFailedTasks() (list []*ReportPdfTask, err error) {
+	err = global.DbMap[utils.DbNameReport].Where("status in (?,?)", ReportPdfTaskStatusPending, ReportPdfTaskStatusFailed).Find(&list).Error
+	return
+}
+
+func FailTask(task *ReportPdfTask) (err error) {
+	task.Status = ReportPdfTaskStatusFailed
+	err = global.DbMap[utils.DbNameReport].Model(task).Select("last_finish_time,status,message").Updates(task).Error
+	return
+}
+
+func DoneTask(task *ReportPdfTask) (err error) {
+	task.Status = ReportPdfTaskStatusDone
+	err = global.DbMap[utils.DbNameReport].Model(task).Select("last_finish_time,status").Updates(task).Error
+	return
+}

+ 226 - 0
services/report_pdf_service.go

@@ -0,0 +1,226 @@
+package services
+
+import (
+	"encoding/json"
+	"eta/eta_api/models"
+	"eta/eta_api/models/report"
+	"eta/eta_api/models/smart_report"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/panjf2000/ants"
+	"io"
+	"net/http"
+	"strings"
+	"sync"
+	"time"
+)
+
+const (
+	taskInterval      = 10 * time.Second
+	httpTimeout       = 5 * time.Minute
+	maxPoolSize       = 4
+	BlockingQueueSize = 10
+)
+
+var (
+	reportOnce sync.Once
+)
+
+type PdfRequest struct {
+	ReportUrl  string `json:"ReportUrl"`
+	ReportId   int    `json:"ReportId"`
+	FreeLayout bool   `json:"FreeLayout"`
+}
+type PdfResponse struct {
+	PdfUrl       string `json:"PdfUrl"`
+	JpgUrl       string `json:"JpgUrl"`
+	MobilePdfUrl string `json:"MobilePdfUrl"`
+	MobileJpgUrl string `json:"MobileJpgUrl"`
+}
+type BaseResponse struct {
+	Ret         int
+	Msg         string
+	ErrMsg      string
+	ErrCode     string
+	Data        json.RawMessage
+	Success     bool
+	IsSendEmail bool
+}
+type ReportPDFService interface {
+	//RejectCallback 任务拒绝策略
+	RejectCallback(p interface{})
+	// SubmitTask 提交任务
+	SubmitTask(tasks *report.ReportPdfTask)
+
+	RegisterWorkPool(pool *ants.Pool)
+
+	ReleasePool()
+
+	TryTimer() *time.Timer
+}
+type ReportPDFHandler struct {
+	Timer      *time.Timer
+	WorkerPool *ants.Pool
+	HttpClient *http.Client
+}
+
+func (d *ReportPDFHandler) ReleasePool() {
+	d.WorkerPool.Release()
+}
+
+func (d *ReportPDFHandler) RegisterWorkPool(pool *ants.Pool) {
+	d.WorkerPool = pool
+}
+
+func (d *ReportPDFHandler) TryTimer() *time.Timer {
+	return d.Timer
+}
+func (d *ReportPDFHandler) SubmitTask(task *report.ReportPdfTask) {
+	_ = d.WorkerPool.Submit(func() {
+		defer func() {
+			if r := recover(); r != nil {
+				utils.FileLog.Error("任务执行异常: %v", r)
+				d.RejectCallback(task)
+			}
+		}()
+		d.processTask(task)
+	})
+}
+
+// processTask 处理单个任务:发送HTTP请求、更新数据库
+func (d *ReportPDFHandler) processTask(task *report.ReportPdfTask) {
+	// 模拟调用 HTTP 接口获取 MinIO URL
+	pdfMinioURL, err := fetchPDFMinioURL(task)
+	if err != nil {
+		utils.FileLog.Error("获取 MinIO URL 失败: %v", err)
+		return
+	}
+	if task.ReportType == 3 {
+		// 更新pdf url
+		ob := new(smart_report.SmartReport)
+		ob.SmartReportId = task.ReportId
+		ob.DetailPdfUrl = pdfMinioURL.PdfUrl
+		ob.DetailImgUrl = pdfMinioURL.JpgUrl
+		ob.DetailImgUrlMobile = pdfMinioURL.MobileJpgUrl
+		ob.DetailPdfUrlMobile = pdfMinioURL.MobilePdfUrl
+		if err = ob.Update([]string{"DetailPdfUrl", "DetailImgUrl", "DetailImgUrlMobile", "DetailPdfUrlMobile"}); err != nil {
+			utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+		}
+	} else if task.ReportType == 2 {
+		err = models.ModifyEnglishReportPdfAndJPGUrl(task.ReportId, pdfMinioURL.PdfUrl, pdfMinioURL.JpgUrl, pdfMinioURL.MobilePdfUrl, pdfMinioURL.MobileJpgUrl)
+		if err != nil {
+			utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+		}
+	} else if task.ReportType == 1 {
+		err = models.ModifyReportPdfAndJpgUrl(task.ReportId, pdfMinioURL.PdfUrl, pdfMinioURL.JpgUrl, pdfMinioURL.MobilePdfUrl, pdfMinioURL.MobileJpgUrl)
+		if err != nil {
+			utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+		}
+	}
+	task.LastFinishTime = time.Now()
+	if err != nil {
+		task.Message = err.Error()
+		_ = report.FailTask(task)
+		return
+	}
+	_ = report.DoneTask(task)
+	utils.FileLog.Info("任务 %d 成功更新 pdf &jpeg URL: %s", task.ReportId, pdfMinioURL)
+}
+
+// fetchPDFMinioURL 发起 HTTP 请求获取 MinIO 地址(根据实际接口修改)
+func fetchPDFMinioURL(task *report.ReportPdfTask) (pdfResponse PdfResponse, err error) {
+
+	postData, _ := json.Marshal(PdfRequest{
+		ReportUrl:  task.ReportURL,
+		ReportId:   task.ReportId,
+		FreeLayout: task.FreeLayout,
+	})
+	body := io.NopCloser(strings.NewReader(string(postData)))
+	client := &http.Client{}
+
+	req, err := http.NewRequest("POST", task.PostUrl, body)
+	if err != nil {
+		utils.FileLog.Error("PDF generate http.NewRequest Err:"+err.Error(), 1)
+		return
+	}
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	resp, err := client.Do(req)
+	if err != nil {
+		fmt.Println("PDF generate http client.Do Err:" + err.Error())
+		return
+	}
+	defer resp.Body.Close()
+	b, err := io.ReadAll(resp.Body)
+	if err != nil {
+		return
+	}
+	result := new(BaseResponse)
+	err = json.Unmarshal(b, &result)
+	if err != nil {
+		utils.FileLog.Error("解析应答失败" + err.Error())
+	}
+	if result.Success {
+		err = json.Unmarshal(result.Data, &pdfResponse)
+	} else {
+		err = fmt.Errorf("PDF generate http client.Do Err:" + result.Msg)
+	}
+	return
+}
+
+func GetTaskHandlerInstance() (reportHandler ReportPDFService, err error) {
+	if reportHandler == nil {
+		reportOnce.Do(func() {
+			reportHandler = &ReportPDFHandler{
+				Timer: time.NewTimer(taskInterval),
+				HttpClient: &http.Client{
+					Timeout: httpTimeout,
+				},
+			}
+			pool, initPoolErr := ants.NewPool(maxPoolSize, ants.WithMaxBlockingTasks(BlockingQueueSize), ants.WithNonblocking(false), ants.WithPanicHandler(reportHandler.RejectCallback))
+			if initPoolErr != nil {
+				err = fmt.Errorf("初始化协程池失败: %v", initPoolErr)
+			}
+			reportHandler.RegisterWorkPool(pool)
+		})
+	}
+	return reportHandler, nil
+}
+func (d *ReportPDFHandler) RejectCallback(p interface{}) {
+	utils.FileLog.Error("任务被拒绝: %+v", p)
+}
+func StartGenerateReportPDF() {
+	reportHandler, err := GetTaskHandlerInstance()
+	if err != nil {
+		utils.FileLog.Warn("初始化协程池失败: %v", err)
+	}
+	defer reportHandler.ReleasePool()
+	conf, err := models.GetBusinessConfByKey("RemoteGeneratePdfUrl")
+	if err != nil {
+		utils.FileLog.Error("获取RemoteGeneratePdfUrl失败: %v", err)
+		return
+	}
+	for {
+		select {
+		case <-reportHandler.TryTimer().C:
+			// 从数据库中获取待处理的任务
+			tasks, getErr := report.GetPendingAndFailedTasks()
+			if getErr != nil {
+				utils.FileLog.Error("获取待处理任务失败: %v", getErr)
+				continue
+			}
+			if len(tasks) == 0 {
+				utils.FileLog.Info("暂无待处理任务")
+				continue
+			}
+
+			// 提交任务到协程池
+			for _, task := range tasks {
+				task.PostUrl = conf.ConfVal
+				reportHandler.SubmitTask(task)
+			}
+			// 重置定时器,等待下一次执行
+			reportHandler.TryTimer().Reset(taskInterval)
+		}
+	}
+}

+ 207 - 165
services/smart_report.go

@@ -3,6 +3,7 @@ package services
 import (
 	"encoding/json"
 	"eta/eta_api/models"
+	"eta/eta_api/models/report"
 	"eta/eta_api/models/smart_report"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/utils"
@@ -290,195 +291,108 @@ finally:
 // @param reportType int
 func Report2pdfAndJpeg(reportUrl string, reportId, reportType int) {
 	var err error
-
-	defer func() {
-		if err != nil {
-			go alarm_msg.SendAlarmMsg("Report2pdfAndJpeg failed:"+err.Error(), 3)
-			utils.FileLog.Info("Report2pdfAndJpeg failed: , error: \n" + err.Error())
-		}
-	}()
-
-	if reportUrl == `` {
-		return
+	var remoteGenerate bool
+	businessConf := make(map[string]string)
+	businessConf, err = models.GetBusinessConf()
+	if err != nil {
+		utils.FileLog.Warn("获取业务配置失败: %v", err)
 	}
-	var report *models.ReportDetail
-
-	// 先清空字段
-	if reportType == 1 {
-		report, err = models.GetReportById(reportId)
-		if err != nil {
-			return
-		}
-		err = models.UpdatePdfUrlReportById(reportId)
-		if err != nil {
-			utils.FileLog.Info("清空pdf长图字段失败, Err: \n" + err.Error())
-			return
-		}
-	} else if reportType == 2 {
-		err = models.UpdatePdfUrlEnglishReportById(reportId)
-		if err != nil {
-			utils.FileLog.Info("清空pdf长图字段失败, Err: \n" + err.Error())
-			return
-		}
-	} else if reportType == 3 {
-		err = smart_report.UpdatePdfUrlSmartReportById(reportId)
-		if err != nil {
-			utils.FileLog.Info("清空pdf长图字段失败, Err: \n" + err.Error())
-			return
-		}
+	if conf, ok := businessConf["RemoteGeneratePdf"]; ok {
+		remoteGenerate = conf == "true"
 	}
-
-	reportCode := utils.MD5(strconv.Itoa(reportId))
-
-	// pc端
-	go func() {
-		pdfPath := `./static/` + reportCode + "_1200.pdf"
-		jpegPath := `./static/` + reportCode + "_1200.jpg"
-
-		width := 1200
-		top, bottom, left, right := 20, 20, 20, 20
+	if remoteGenerate {
+		var freeLayout bool
 		if reportType == 1 {
-			if report != nil && report.ReportLayout == 3 {
-				top, bottom, left, right = 0, 0, 0, 0
-			}
-		}
-		//if reportType == 3 {
-		//	width = 800
-		//}
-		err = ReportToPdf(width, reportUrl, pdfPath, top, bottom, left, right)
-		if err != nil {
-			utils.FileLog.Info("ReportToPdf failed: , error: \n" + err.Error())
-			go alarm_msg.SendAlarmMsg("ReportToPdf failed:"+err.Error(), 3)
-		}
-
-		file, err := os.Open(pdfPath)
-		if err != nil {
-			utils.FileLog.Info("Open failed: , error: \n" + err.Error())
-			go alarm_msg.SendAlarmMsg("Open failed:"+err.Error(), 3)
-			return
-		}
-
-		ext := path.Ext(file.Name())
-
-		randStr := utils.GetRandStringNoSpecialChar(28)
-		fileName := randStr + ext
-		defer file.Close() //关闭上传文件
-
-		resourceUrl := ``
-		ossClient := NewOssClient()
-		if ossClient == nil {
-			utils.FileLog.Info("初始化OSS服务失败")
-			return
-		}
-		resourceUrl, err = ossClient.UploadFile(fileName, pdfPath, "")
-		if err != nil {
-			utils.FileLog.Info("文件上传失败, Err: \n" + err.Error())
-			go alarm_msg.SendAlarmMsg("文件上传失败:"+err.Error(), 3)
-			return
-		}
-		defer func() {
-			_ = os.Remove(pdfPath)
-		}()
-
-		if reportType == 3 {
-			// 更新pdf url
-			ob := new(smart_report.SmartReport)
-			ob.SmartReportId = reportId
-			ob.DetailPdfUrl = resourceUrl
-			if err = ob.Update([]string{"DetailPdfUrl"}); err != nil {
-				utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+			var reportDTO *models.ReportDetail
+			reportDTO, err = models.GetReportById(reportId)
+			if err != nil {
+				utils.FileLog.Error("获取报告失败,无法生成PDF: %v", err)
 				return
 			}
+			if reportDTO.ReportLayout == 3 {
+				freeLayout = true
+			}
 		} else if reportType == 2 {
-			err = models.ModifyEnglishReportPdfUrl(reportId, resourceUrl)
+			err = models.UpdatePdfUrlEnglishReportById(reportId)
 			if err != nil {
-				utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+				utils.FileLog.Info("清空pdf长图字段失败, Err: \n" + err.Error())
 				return
 			}
-		} else if reportType == 1 {
-			err = models.ModifyReportPdfUrl(reportId, resourceUrl)
+		} else if reportType == 3 {
+			err = smart_report.UpdatePdfUrlSmartReportById(reportId)
 			if err != nil {
-				utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+				utils.FileLog.Info("清空pdf长图字段失败, Err: \n" + err.Error())
 				return
 			}
 		}
-
-		time.Sleep(1 * time.Minute)
-
-		err = ReportToJpeg(width, reportUrl, jpegPath)
+		err = report.CreateReportPdfTask(reportUrl, reportId, reportType, freeLayout)
 		if err != nil {
-			utils.FileLog.Info("ReportToJpeg failed: , error: \n" + err.Error())
-		}
-		file, err = os.Open(jpegPath)
-		if err != nil {
-			utils.FileLog.Info("open file failed: , error: \n" + err.Error())
+			utils.FileLog.Error("创建生成任务失败,无法生成PDF: %v", err)
 			return
 		}
+	} else {
 
-		ext = path.Ext(file.Name())
-
-		randStr = utils.GetRandStringNoSpecialChar(28)
-		fileName = randStr + ext
-		defer file.Close() //关闭上传文件
+		defer func() {
+			if err != nil {
+				go alarm_msg.SendAlarmMsg("Report2pdfAndJpeg failed:"+err.Error(), 3)
+				utils.FileLog.Info("Report2pdfAndJpeg failed: , error: \n" + err.Error())
+			}
+		}()
 
-		resourceUrl = ``
-		ossClient = NewOssClient()
-		if ossClient == nil {
-			utils.FileLog.Info("初始化OSS服务失败")
+		if reportUrl == `` {
 			return
 		}
-		resourceUrl, err = ossClient.UploadFile(fileName, jpegPath, "")
-		if err != nil {
-			utils.FileLog.Info("文件上传失败, Err: \n" + err.Error())
-			return
-		}
-		defer func() {
-			_ = os.Remove(jpegPath)
-		}()
+		var report *models.ReportDetail
 
-		if reportType == 3 {
-			// 更新jpeg url
-			ob := new(smart_report.SmartReport)
-			ob.SmartReportId = reportId
-			ob.DetailImgUrl = resourceUrl
-			if err = ob.Update([]string{"DetailImgUrl"}); err != nil {
-				utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+		// 先清空字段
+		if reportType == 1 {
+			report, err = models.GetReportById(reportId)
+			if err != nil {
+				return
+			}
+			err = models.UpdatePdfUrlReportById(reportId)
+			if err != nil {
+				utils.FileLog.Info("清空pdf长图字段失败, Err: \n" + err.Error())
 				return
 			}
 		} else if reportType == 2 {
-			err = models.ModifyEnglishReportImgUrl(reportId, resourceUrl)
+			err = models.UpdatePdfUrlEnglishReportById(reportId)
 			if err != nil {
-				utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+				utils.FileLog.Info("清空pdf长图字段失败, Err: \n" + err.Error())
 				return
 			}
-		} else if reportType == 1 {
-			err = models.ModifyReportImgUrl(reportId, resourceUrl)
+		} else if reportType == 3 {
+			err = smart_report.UpdatePdfUrlSmartReportById(reportId)
 			if err != nil {
-				utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+				utils.FileLog.Info("清空pdf长图字段失败, Err: \n" + err.Error())
 				return
 			}
 		}
-	}()
-	var mobilePdf = true
-	if reportType == 1 && report != nil {
-		if report.ReportLayout == 3 {
-			mobilePdf = false
-		}
-	}
-	if mobilePdf {
-		// 移动端
+
+		reportCode := utils.MD5(strconv.Itoa(reportId))
+
+		// pc端
 		go func() {
-			pdfPathMobile := `./static/` + reportCode + "_600.pdf"
-			jpegPathMobile := `./static/` + reportCode + "_600.jpg"
+			pdfPath := `./static/` + reportCode + "_1200.pdf"
+			jpegPath := `./static/` + reportCode + "_1200.jpg"
+
+			width := 1200
 			top, bottom, left, right := 20, 20, 20, 20
-			width := 600
-			err = ReportToPdf(width, reportUrl, pdfPathMobile, top, bottom, left, right)
+			if reportType == 1 {
+				if report != nil && report.ReportLayout == 3 {
+					top, bottom, left, right = 0, 0, 0, 0
+				}
+			}
+			//if reportType == 3 {
+			//	width = 800
+			//}
+			err = ReportToPdf(width, reportUrl, pdfPath, top, bottom, left, right)
 			if err != nil {
 				utils.FileLog.Info("ReportToPdf failed: , error: \n" + err.Error())
 				go alarm_msg.SendAlarmMsg("ReportToPdf failed:"+err.Error(), 3)
 			}
 
-			file, err := os.Open(pdfPathMobile)
+			file, err := os.Open(pdfPath)
 			if err != nil {
 				utils.FileLog.Info("Open failed: , error: \n" + err.Error())
 				go alarm_msg.SendAlarmMsg("Open failed:"+err.Error(), 3)
@@ -497,33 +411,33 @@ func Report2pdfAndJpeg(reportUrl string, reportId, reportType int) {
 				utils.FileLog.Info("初始化OSS服务失败")
 				return
 			}
-			resourceUrl, err = ossClient.UploadFile(fileName, pdfPathMobile, "")
+			resourceUrl, err = ossClient.UploadFile(fileName, pdfPath, "")
 			if err != nil {
 				utils.FileLog.Info("文件上传失败, Err: \n" + err.Error())
 				go alarm_msg.SendAlarmMsg("文件上传失败:"+err.Error(), 3)
 				return
 			}
 			defer func() {
-				_ = os.Remove(pdfPathMobile)
+				_ = os.Remove(pdfPath)
 			}()
 
 			if reportType == 3 {
 				// 更新pdf url
 				ob := new(smart_report.SmartReport)
 				ob.SmartReportId = reportId
-				ob.DetailPdfUrlMobile = resourceUrl
-				if err = ob.Update([]string{"DetailPdfUrlMobile"}); err != nil {
+				ob.DetailPdfUrl = resourceUrl
+				if err = ob.Update([]string{"DetailPdfUrl"}); err != nil {
 					utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
 					return
 				}
 			} else if reportType == 2 {
-				err = models.ModifyEnglishReportPdfUrlMobile(reportId, resourceUrl)
+				err = models.ModifyEnglishReportPdfUrl(reportId, resourceUrl)
 				if err != nil {
 					utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
 					return
 				}
 			} else if reportType == 1 {
-				err = models.ModifyReportPdfUrlMobile(reportId, resourceUrl)
+				err = models.ModifyReportPdfUrl(reportId, resourceUrl)
 				if err != nil {
 					utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
 					return
@@ -532,11 +446,11 @@ func Report2pdfAndJpeg(reportUrl string, reportId, reportType int) {
 
 			time.Sleep(1 * time.Minute)
 
-			err = ReportToJpeg(width, reportUrl, jpegPathMobile)
+			err = ReportToJpeg(width, reportUrl, jpegPath)
 			if err != nil {
 				utils.FileLog.Info("ReportToJpeg failed: , error: \n" + err.Error())
 			}
-			file, err = os.Open(jpegPathMobile)
+			file, err = os.Open(jpegPath)
 			if err != nil {
 				utils.FileLog.Info("open file failed: , error: \n" + err.Error())
 				return
@@ -554,37 +468,165 @@ func Report2pdfAndJpeg(reportUrl string, reportId, reportType int) {
 				utils.FileLog.Info("初始化OSS服务失败")
 				return
 			}
-			resourceUrl, err = ossClient.UploadFile(fileName, jpegPathMobile, "")
+			resourceUrl, err = ossClient.UploadFile(fileName, jpegPath, "")
 			if err != nil {
 				utils.FileLog.Info("文件上传失败, Err: \n" + err.Error())
 				return
 			}
 			defer func() {
-				_ = os.Remove(jpegPathMobile)
+				_ = os.Remove(jpegPath)
 			}()
 
 			if reportType == 3 {
 				// 更新jpeg url
 				ob := new(smart_report.SmartReport)
 				ob.SmartReportId = reportId
-				ob.DetailImgUrlMobile = resourceUrl
-				if err = ob.Update([]string{"DetailImgUrlMobile"}); err != nil {
+				ob.DetailImgUrl = resourceUrl
+				if err = ob.Update([]string{"DetailImgUrl"}); err != nil {
 					utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
 					return
 				}
 			} else if reportType == 2 {
-				err = models.ModifyEnglishReportImgUrlMobile(reportId, resourceUrl)
+				err = models.ModifyEnglishReportImgUrl(reportId, resourceUrl)
 				if err != nil {
 					utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
 					return
 				}
 			} else if reportType == 1 {
-				err = models.ModifyReportImgUrlMobile(reportId, resourceUrl)
+				err = models.ModifyReportImgUrl(reportId, resourceUrl)
 				if err != nil {
 					utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
 					return
 				}
 			}
 		}()
+		var mobilePdf = true
+		if reportType == 1 && report != nil {
+			if report.ReportLayout == 3 {
+				mobilePdf = false
+			}
+		}
+		if mobilePdf {
+			// 移动端
+			go func() {
+				pdfPathMobile := `./static/` + reportCode + "_600.pdf"
+				jpegPathMobile := `./static/` + reportCode + "_600.jpg"
+				top, bottom, left, right := 20, 20, 20, 20
+				width := 600
+				err = ReportToPdf(width, reportUrl, pdfPathMobile, top, bottom, left, right)
+				if err != nil {
+					utils.FileLog.Info("ReportToPdf failed: , error: \n" + err.Error())
+					go alarm_msg.SendAlarmMsg("ReportToPdf failed:"+err.Error(), 3)
+				}
+
+				file, err := os.Open(pdfPathMobile)
+				if err != nil {
+					utils.FileLog.Info("Open failed: , error: \n" + err.Error())
+					go alarm_msg.SendAlarmMsg("Open failed:"+err.Error(), 3)
+					return
+				}
+
+				ext := path.Ext(file.Name())
+
+				randStr := utils.GetRandStringNoSpecialChar(28)
+				fileName := randStr + ext
+				defer file.Close() //关闭上传文件
+
+				resourceUrl := ``
+				ossClient := NewOssClient()
+				if ossClient == nil {
+					utils.FileLog.Info("初始化OSS服务失败")
+					return
+				}
+				resourceUrl, err = ossClient.UploadFile(fileName, pdfPathMobile, "")
+				if err != nil {
+					utils.FileLog.Info("文件上传失败, Err: \n" + err.Error())
+					go alarm_msg.SendAlarmMsg("文件上传失败:"+err.Error(), 3)
+					return
+				}
+				defer func() {
+					_ = os.Remove(pdfPathMobile)
+				}()
+
+				if reportType == 3 {
+					// 更新pdf url
+					ob := new(smart_report.SmartReport)
+					ob.SmartReportId = reportId
+					ob.DetailPdfUrlMobile = resourceUrl
+					if err = ob.Update([]string{"DetailPdfUrlMobile"}); err != nil {
+						utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+						return
+					}
+				} else if reportType == 2 {
+					err = models.ModifyEnglishReportPdfUrlMobile(reportId, resourceUrl)
+					if err != nil {
+						utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+						return
+					}
+				} else if reportType == 1 {
+					err = models.ModifyReportPdfUrlMobile(reportId, resourceUrl)
+					if err != nil {
+						utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+						return
+					}
+				}
+
+				time.Sleep(1 * time.Minute)
+
+				err = ReportToJpeg(width, reportUrl, jpegPathMobile)
+				if err != nil {
+					utils.FileLog.Info("ReportToJpeg failed: , error: \n" + err.Error())
+				}
+				file, err = os.Open(jpegPathMobile)
+				if err != nil {
+					utils.FileLog.Info("open file failed: , error: \n" + err.Error())
+					return
+				}
+
+				ext = path.Ext(file.Name())
+
+				randStr = utils.GetRandStringNoSpecialChar(28)
+				fileName = randStr + ext
+				defer file.Close() //关闭上传文件
+
+				resourceUrl = ``
+				ossClient = NewOssClient()
+				if ossClient == nil {
+					utils.FileLog.Info("初始化OSS服务失败")
+					return
+				}
+				resourceUrl, err = ossClient.UploadFile(fileName, jpegPathMobile, "")
+				if err != nil {
+					utils.FileLog.Info("文件上传失败, Err: \n" + err.Error())
+					return
+				}
+				defer func() {
+					_ = os.Remove(jpegPathMobile)
+				}()
+
+				if reportType == 3 {
+					// 更新jpeg url
+					ob := new(smart_report.SmartReport)
+					ob.SmartReportId = reportId
+					ob.DetailImgUrlMobile = resourceUrl
+					if err = ob.Update([]string{"DetailImgUrlMobile"}); err != nil {
+						utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+						return
+					}
+				} else if reportType == 2 {
+					err = models.ModifyEnglishReportImgUrlMobile(reportId, resourceUrl)
+					if err != nil {
+						utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+						return
+					}
+				} else if reportType == 1 {
+					err = models.ModifyReportImgUrlMobile(reportId, resourceUrl)
+					if err != nil {
+						utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+						return
+					}
+				}
+			}()
+		}
 	}
 }

+ 1 - 1
services/task.go

@@ -87,11 +87,11 @@ func Task() {
 	// 权益报告监听入库
 	go AutoInsertRaiReport()
 
-
 	go llm.DealHistoryArticleDafTags()
 
 	// 巡检信息发送
 	go AutoCheckWebsocketMessageList()
+	go StartGenerateReportPDF()
 
 	// TODO:数据修复
 	//FixNewEs()