Sfoglia il codice sorgente

优化定时任务

SpringSunYY 4 mesi fa
parent
commit
3f3dfcdfb1

+ 4 - 0
ruoyi_admin/app.py

@@ -2,6 +2,7 @@
 
 import os
 from flask import Flask
+from ruoyi_common.base.signal import app_completed
 from ruoyi_common.ruoyi.extension import FlaskRuoYi
 from ruoyi_common.config import RuoYiConfig
 
@@ -34,6 +35,9 @@ def create_app():
     except ImportError:
         print("测试模块未找到或未正确配置")
 
+    # 所有扩展和模块完成初始化后,发送应用完成信号
+    app_completed.send(app)
+
     return app
 
 

+ 9 - 3
ruoyi_apscheduler/domain/entity.py

@@ -7,7 +7,7 @@ from pydantic import BeforeValidator, Field
 from typing_extensions import Annotated
 
 from ruoyi_common.base.model import BaseEntity, AuditEntity
-from ruoyi_common.base.transformer import str_to_int, to_datetime
+from ruoyi_common.base.transformer import int_to_str, str_to_int, to_datetime
 from ruoyi_common.base.schema_vo import VoAccess
 from ruoyi_common.utils.base import DateUtil
 from ruoyi_apscheduler.constant import DATETIME_FORMAT
@@ -38,9 +38,15 @@ class SysJob(AuditEntity):
     
     cron_expression: Optional[str] = None
     
-    misfire_policy: Optional[str] = None
+    misfire_policy: Annotated[
+        Optional[str],
+        BeforeValidator(int_to_str)
+    ] = None
     
-    concurrent: Optional[str] = None
+    concurrent: Annotated[
+        Optional[str],
+        BeforeValidator(int_to_str)
+    ] = None
     
     status: Annotated[
         Optional[str],

+ 22 - 6
ruoyi_apscheduler/domain/po.py

@@ -2,7 +2,7 @@
 # @Author  : YY
 
 from typing import Optional
-from sqlalchemy import CHAR, DateTime, String, text
+from sqlalchemy import CHAR, DateTime, String, UniqueConstraint, text
 from sqlalchemy.dialects.mysql import BIGINT 
 from sqlalchemy.orm import Mapped, mapped_column 
 import datetime
@@ -12,11 +12,27 @@ from ruoyi_admin.ext import db
 
 class SysJobPo(db.Model):
     __tablename__ = 'sys_job'
-    __table_args__ = {'comment': '定时任务调度表'}
-
-    job_id: Mapped[int] = mapped_column(BIGINT(20), primary_key=True, comment='任务ID')
-    job_name: Mapped[str] = mapped_column(String(64), primary_key=True, server_default=text("''"), comment='任务名称')
-    job_group: Mapped[str] = mapped_column(String(64), primary_key=True, server_default=text("'DEFAULT'"), comment='任务组名')
+    __table_args__ = (
+        UniqueConstraint('job_name', 'job_group', name='uniq_job_name_group'),
+        {'comment': '定时任务调度表'}
+    )
+
+    job_id: Mapped[int] = mapped_column(
+        BIGINT(20),
+        primary_key=True,
+        autoincrement=True,
+        comment='任务ID'
+    )
+    job_name: Mapped[str] = mapped_column(
+        String(64),
+        server_default=text("''"),
+        comment='任务名称'
+    )
+    job_group: Mapped[str] = mapped_column(
+        String(64),
+        server_default=text("'DEFAULT'"),
+        comment='任务组名'
+    )
     invoke_target: Mapped[str] = mapped_column(String(500), comment='调用目标字符串')
     cron_expression: Mapped[Optional[str]] = mapped_column(String(255), server_default=text("''"), comment='cron执行表达式')
     misfire_policy: Mapped[Optional[str]] = mapped_column(String(20), server_default=text("'3'"), comment='计划执行错误策略(1立即执行 2执行一次 3放弃执行)')

+ 8 - 1
ruoyi_apscheduler/mapper/job.py

@@ -94,8 +94,15 @@ class SysJobMapper:
         data = job.model_dump(
             include=fields,exclude_unset=True,exclude_none=True
         )
+        # 如果未指定 job_id,则交由数据库自增
+        if not data.get("job_id"):
+            data.pop("job_id", None)
         stmt = insert(SysJobPo).values(data)
-        return db.session.execute(stmt).scalar_one_or_none()
+        result = db.session.execute(stmt)
+        pk_values = result.inserted_primary_key
+        if pk_values:
+            return pk_values[0]
+        return data.get("job_id")
     
     @classmethod
     def update_job(cls, job:SysJob) -> int: