|
@@ -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)
|