Răsfoiți Sursa

生成手机端PDF

kobe6258 1 zi în urmă
părinte
comite
4190c82cbf
8 a modificat fișierele cu 472 adăugiri și 170 ștergeri
  1. 2 1
      go.mod
  2. 2 0
      go.sum
  3. 6 1
      models/english_report.go
  4. 8 3
      models/report.go
  5. 48 0
      models/report/report_pdf_task.go
  6. 197 0
      services/report_pdf_service.go
  7. 207 165
      services/smart_report.go
  8. 2 0
      services/task.go

+ 2 - 1
go.mod

@@ -35,6 +35,7 @@ require (
 	github.com/mojocn/base64Captcha v1.3.6
 	github.com/nosixtools/solarlunar v0.0.0-20211112060703-1b6dea7b4a19
 	github.com/olivere/elastic/v7 v7.0.32
+	github.com/panjf2000/ants v1.3.0
 	github.com/pdfcpu/pdfcpu v0.8.0
 	github.com/qiniu/qmgo v1.1.8
 	github.com/rdlucklib/rdluck_tools v1.0.3
@@ -50,6 +51,7 @@ require (
 	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
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
 	gorm.io/driver/mysql v1.5.7
 	gorm.io/gorm v1.25.12
@@ -162,7 +164,6 @@ require (
 	golang.org/x/sync v0.2.0 // indirect
 	golang.org/x/sys v0.17.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
-	golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect
 	google.golang.org/protobuf v1.30.0 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect

+ 2 - 0
go.sum

@@ -464,6 +464,8 @@ github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9
 github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A=
 github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU=
 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=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pdfcpu/pdfcpu v0.8.0 h1:SuEB4uVsPFz1nb802r38YpFpj9TtZh/oB0bGG34IRZw=
 github.com/pdfcpu/pdfcpu v0.8.0/go.mod h1:jj03y/KKrwigt5xCi8t7px2mATcKuOzkIOoCX62yMho=

+ 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=? `

+ 8 - 3
models/report.go

@@ -1574,7 +1574,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=? `
@@ -1717,7 +1722,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)
 }
@@ -1731,7 +1736,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
 	}
 	// 更新章节

+ 48 - 0
models/report/report_pdf_task.go

@@ -0,0 +1,48 @@
+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"`
+}
+
+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
+}

+ 197 - 0
services/report_pdf_service.go

@@ -0,0 +1,197 @@
+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 ReportPDFService interface {
+	//RejectCallback 任务拒绝策略
+	RejectCallback(p interface{})
+	// SubmitTask 提交任务
+	SubmitTask(tasks *report.ReportPdfTask)
+
+	RegisterWorkPool(pool *ants.Pool)
+
+	ReleasePool()
+
+	TryTicker() *time.Ticker
+}
+type ReportPDFHandler struct {
+	Ticker     *time.Ticker
+	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) TryTicker() *time.Ticker {
+	return d.Ticker
+}
+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())
+			return
+		}
+	} 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())
+			return
+		}
+	} 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())
+			return
+		}
+	}
+	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", utils.SendWxTemplateMsgUrl, 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)
+	req.Header.Set("Authorization", utils.SendTemplateMsgAuthorization)
+	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(PdfResponse)
+	err = json.Unmarshal(b, &result)
+	return
+}
+
+func GetTaskHandlerInstance() (reportHandler ReportPDFService, err error) {
+	if reportHandler == nil {
+		reportOnce.Do(func() {
+			reportHandler = &ReportPDFHandler{
+				Ticker: time.NewTicker(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()
+
+	for {
+		select {
+		case <-reportHandler.TryTicker().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 {
+				reportHandler.SubmitTask(task)
+			}
+		}
+	}
+}

+ 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"
@@ -291,195 +292,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)
@@ -498,33 +412,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
@@ -533,11 +447,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
@@ -555,37 +469,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
+					}
+				}
+			}()
+		}
 	}
 }

+ 2 - 0
services/task.go

@@ -86,6 +86,8 @@ func Task() {
 	// 权益报告监听入库
 	go AutoInsertRaiReport()
 
+	go StartGenerateReportPDF()
+
 	// TODO:数据修复
 	//FixNewEs()
 	fmt.Println("task end")