瀏覽代碼

合并冲突

kobe6258 1 天之前
父節點
當前提交
1afe11efd4
共有 3 個文件被更改,包括 46 次插入24 次删除
  1. 2 2
      models/report/report_pdf_task.go
  2. 44 9
      services/report_pdf_service.go
  3. 0 13
      services/smart_report.go

+ 2 - 2
models/report/report_pdf_task.go

@@ -43,8 +43,8 @@ func CreateReportPdfTask(url string, reportId, reportType int, freeLayout bool)
 	return
 }
 
-func GetPendingAndFailedTasks() (list []*ReportPdfTask, err error) {
-	err = global.DbMap[utils.DbNameReport].Where("status in (?,?)", ReportPdfTaskStatusPending, ReportPdfTaskStatusFailed).Find(&list).Error
+func GetPendingTasks() (list []*ReportPdfTask, err error) {
+	err = global.DbMap[utils.DbNameReport].Where("status = ?", ReportPdfTaskStatusPending).Order("created_time asc").Limit(20).Find(&list).Error
 	return
 }
 

+ 44 - 9
services/report_pdf_service.go

@@ -24,6 +24,8 @@ const (
 
 var (
 	reportOnce sync.Once
+
+	TaskPlanMap = new(sync.Map)
 )
 
 type PdfRequest struct {
@@ -89,10 +91,36 @@ func (d *ReportPDFHandler) SubmitTask(task *report.ReportPdfTask) {
 
 // processTask 处理单个任务:发送HTTP请求、更新数据库
 func (d *ReportPDFHandler) processTask(task *report.ReportPdfTask) {
+	var err error
+	if task.ReportType == 1 {
+		err = models.UpdatePdfUrlReportById(task.ReportId)
+		if err != nil {
+			utils.FileLog.Info("清空pdf长图字段失败, Err: \n" + err.Error())
+		}
+	} else if task.ReportType == 2 {
+		err = models.UpdatePdfUrlEnglishReportById(task.ReportId)
+		if err != nil {
+			utils.FileLog.Info("清空pdf长图字段失败, Err: \n" + err.Error())
+		}
+	} else if task.ReportType == 3 {
+		err = smart_report.UpdatePdfUrlSmartReportById(task.ReportId)
+		if err != nil {
+			utils.FileLog.Info("清空pdf长图字段失败, Err: \n" + err.Error())
+		}
+	}
+	if err != nil {
+		task.LastFinishTime = time.Now()
+		task.Message = err.Error()
+		_ = report.FailTask(task)
+		return
+	}
 	// 模拟调用 HTTP 接口获取 MinIO URL
-	pdfMinioURL, err := fetchPDFMinioURL(task)
+ a	pdfMinioURL, err := d.fetchPDFMinioURL(task)
 	if err != nil {
 		utils.FileLog.Error("获取 MinIO URL 失败: %v", err)
+		task.LastFinishTime = time.Now()
+		task.Message = err.Error()
+		_ = report.FailTask(task)
 		return
 	}
 	if task.ReportType == 3 {
@@ -124,11 +152,13 @@ func (d *ReportPDFHandler) processTask(task *report.ReportPdfTask) {
 		return
 	}
 	_ = report.DoneTask(task)
+
+	TaskPlanMap.Delete(task.ReportId)
 	utils.FileLog.Info("任务 %d 成功更新 pdf &jpeg URL: %s", task.ReportId, pdfMinioURL)
 }
 
 // fetchPDFMinioURL 发起 HTTP 请求获取 MinIO 地址(根据实际接口修改)
-func fetchPDFMinioURL(task *report.ReportPdfTask) (pdfResponse PdfResponse, err error) {
+func (d *ReportPDFHandler) fetchPDFMinioURL(task *report.ReportPdfTask) (pdfResponse PdfResponse, err error) {
 
 	postData, _ := json.Marshal(PdfRequest{
 		ReportUrl:  task.ReportURL,
@@ -136,8 +166,6 @@ func fetchPDFMinioURL(task *report.ReportPdfTask) (pdfResponse PdfResponse, err
 		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)
@@ -145,7 +173,7 @@ func fetchPDFMinioURL(task *report.ReportPdfTask) (pdfResponse PdfResponse, err
 	}
 	contentType := "application/json;charset=utf-8"
 	req.Header.Set("Content-Type", contentType)
-	resp, err := client.Do(req)
+	resp, err := d.HttpClient.Do(req)
 	if err != nil {
 		fmt.Println("PDF generate http client.Do Err:" + err.Error())
 		return
@@ -204,7 +232,7 @@ func StartGenerateReportPDF() {
 		select {
 		case <-reportHandler.TryTimer().C:
 			// 从数据库中获取待处理的任务
-			tasks, getErr := report.GetPendingAndFailedTasks()
+			tasks, getErr := report.GetPendingTasks()
 			if getErr != nil {
 				utils.FileLog.Error("获取待处理任务失败: %v", getErr)
 				continue
@@ -213,11 +241,18 @@ func StartGenerateReportPDF() {
 				utils.FileLog.Info("暂无待处理任务")
 				continue
 			}
-
 			// 提交任务到协程池
 			for _, task := range tasks {
-				task.PostUrl = conf.ConfVal
-				reportHandler.SubmitTask(task)
+				if _, replaced := TaskPlanMap.Load(task.ReportId); !replaced {
+					TaskPlanMap.Store(task.ReportId, true)
+					task.PostUrl = conf.ConfVal
+					reportHandler.SubmitTask(task)
+				} else {
+					utils.FileLog.Info("任务正在执行中,忽略当前任务,reportId:%d", task.ReportId)
+				}
+			}
+			for len(reportHandler.TryTimer().C) > 0 {
+				<-reportHandler.TryTimer().C
 			}
 			// 重置定时器,等待下一次执行
 			reportHandler.TryTimer().Reset(taskInterval)

+ 0 - 13
services/smart_report.go

@@ -142,7 +142,6 @@ func ReportToPdf(width int, reportUrl, filePath string, top, bottom, left, right
 import asyncio
 from pyppeteer import launch
 
-@asyncio.coroutine
 async def main():
     # 异步代码
     browser = await launch({
@@ -313,18 +312,6 @@ func Report2pdfAndJpeg(reportUrl string, reportId, reportType int) {
 			if reportDTO.ReportLayout == 3 {
 				freeLayout = true
 			}
-		} 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
-			}
 		}
 		err = report.CreateReportPdfTask(reportUrl, reportId, reportType, freeLayout)
 		if err != nil {