job.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. # -*- coding: utf-8 -*-
  2. # @Author : YY
  3. from typing import List
  4. from typing_extensions import Annotated
  5. from pydantic import BeforeValidator
  6. from ruoyi_apscheduler.domain.entity import SysJob
  7. from ruoyi_apscheduler.service.job import SysJobService
  8. from ruoyi_apscheduler.util import ScheduleUtil
  9. from ruoyi_common.base.model import AjaxResponse, TableResponse
  10. from ruoyi_common.base.transformer import ids_to_list
  11. from ruoyi_common.constant import Constants
  12. from ruoyi_common.descriptor.serializer import JsonSerializer
  13. from ruoyi_common.descriptor.validator import BodyValidator, QueryValidator, PathValidator
  14. from ruoyi_common.domain.enum import BusinessType
  15. from ruoyi_common.utils import security_util as SecurityUtil
  16. from ruoyi_framework.descriptor.log import Log
  17. from ruoyi_framework.descriptor.permission import HasPerm, PreAuthorize
  18. from .. import reg
  19. @reg.api.route("/monitor/job/list", methods=["GET"])
  20. @QueryValidator(is_page=True)
  21. @PreAuthorize(HasPerm("monitor:job:list"))
  22. @JsonSerializer()
  23. def common_job_list(dto:SysJob) -> TableResponse:
  24. """
  25. 获取定时任务列表
  26. Args:
  27. dto(SysJob): 查询条件
  28. Returns:
  29. TableResponse: 数据响应
  30. """
  31. rows: List[SysJob] = SysJobService.select_job_list(dto)
  32. table_response = TableResponse(rows=rows)
  33. return table_response
  34. @reg.api.route("/monitor/job/export", methods=["POST"])
  35. @BodyValidator()
  36. @PreAuthorize(HasPerm("monitor:job:export"))
  37. @Log(title="定时任务",business_type=BusinessType.EXPORT)
  38. @JsonSerializer()
  39. def common_job_export(dto:SysJob):
  40. """
  41. 导出定时任务列表
  42. Args:
  43. dto(SysJob): 查询条件
  44. Returns:
  45. _type_: 数据响应
  46. """
  47. # todo
  48. rows: List[SysJob] = SysJobService.select_job_list(dto)
  49. return "Hello, World!"
  50. @reg.api.route("/monitor/job/<int:id>", methods=["GET"])
  51. @PathValidator()
  52. @PreAuthorize(HasPerm("monitor:job:query"))
  53. @JsonSerializer()
  54. def common_job_detail(id: int) -> AjaxResponse:
  55. """
  56. 获取定时任务详情
  57. Args:
  58. id (int): 任务ID
  59. Returns:
  60. AjaxResponse: 数据响应
  61. """
  62. job: SysJob = SysJobService.select_job_by_id(id)
  63. return AjaxResponse.from_success(data=job)
  64. @reg.api.route("/monitor/job", methods=["POST"])
  65. @BodyValidator()
  66. @PreAuthorize(HasPerm("monitor:job:add"))
  67. @Log(title="定时任务",business_type=BusinessType.INSERT)
  68. @JsonSerializer()
  69. def common_job_add(dto:SysJob) -> AjaxResponse:
  70. """
  71. 新增定时任务
  72. Args:
  73. dto (SysJob): 任务信息
  74. Returns:
  75. AjaxResponse: 数据响应
  76. """
  77. if not ScheduleUtil.check_cron_expression(dto.cron_expression):
  78. return AjaxResponse.from_error(f"新增任务{dto.job_name}失败,cron表达式格式错误")
  79. for forbid_word in [
  80. Constants.LOOKUP_LDAP,
  81. Constants.LOOKUP_LDAPS,
  82. Constants.LOOKUP_RMI,
  83. Constants.HTTP,
  84. Constants.HTTPS
  85. ]:
  86. if forbid_word.lower() in dto.invoke_target.lower():
  87. return AjaxResponse.from_error(f"新增任务{dto.job_name}失败,调用目标中包含非法字符{forbid_word}")
  88. if not ScheduleUtil.white_list_check(dto.invoke_target):
  89. return AjaxResponse.from_error(f"新增任务{dto.job_name}失败,目标字符串不在白名单中")
  90. dto.create_by_user(SecurityUtil.get_username())
  91. flag = SysJobService.insert_job(dto)
  92. return AjaxResponse.from_success() if flag else AjaxResponse.from_error()
  93. @reg.api.route("/monitor/job", methods=["PUT"])
  94. @BodyValidator()
  95. @PreAuthorize(HasPerm("monitor:job:edit"))
  96. @Log(title="定时任务",business_type=BusinessType.UPDATE)
  97. @JsonSerializer()
  98. def common_job_edit(dto:SysJob) -> AjaxResponse:
  99. """
  100. 修改定时任务
  101. Args:
  102. dto (SysJob): 任务信息
  103. Returns:
  104. AjaxResponse: 数据响应
  105. """
  106. if not ScheduleUtil.check_cron_expression(dto.cron_expression):
  107. return AjaxResponse.from_error(f"新增任务{dto.job_name}失败,cron表达式格式错误")
  108. for forbid_word in [
  109. Constants.LOOKUP_LDAP,
  110. Constants.LOOKUP_LDAPS,
  111. Constants.LOOKUP_RMI,
  112. Constants.HTTP,
  113. Constants.HTTPS
  114. ]:
  115. if forbid_word.lower() in dto.invoke_target.lower():
  116. return AjaxResponse.from_error(f"新增任务{dto.job_name}失败,调用目标中包含非法字符{forbid_word}")
  117. if not ScheduleUtil.white_list_check(dto.invoke_target):
  118. return AjaxResponse.from_error(f"新增任务{dto.job_name}失败,目标字符串不在白名单中")
  119. dto.update_by_user(SecurityUtil.get_username())
  120. flag = SysJobService.update_job(dto)
  121. return AjaxResponse.from_success() if flag else AjaxResponse.from_error()
  122. @reg.api.route("/monitor/job/changeStatus", methods=["PUT"])
  123. @BodyValidator()
  124. @PreAuthorize(HasPerm('monitor:job:changeStatus'))
  125. @Log(title = "定时任务", business_type = BusinessType.UPDATE)
  126. @JsonSerializer()
  127. def common_job_status_edit(dto:SysJob) -> AjaxResponse:
  128. """
  129. 修改定时任务状态
  130. Args:
  131. dto (SysJob): 任务实体
  132. Returns:
  133. AjaxResponse: 数据响应
  134. """
  135. job: SysJob = SysJobService.select_job_by_id(dto.job_id)
  136. job.status = dto.status
  137. flag = SysJobService.change_job_status(job)
  138. dto.update_by_user(SecurityUtil.get_username())
  139. return AjaxResponse.from_success() if flag else AjaxResponse.from_error()
  140. @reg.api.route("/monitor/job/run", methods=["PUT"])
  141. @BodyValidator()
  142. @PreAuthorize(HasPerm('monitor:job:changeStatus'))
  143. @Log(title = "定时任务", business_type = BusinessType.UPDATE)
  144. @JsonSerializer()
  145. def common_job_run(dto:SysJob) -> AjaxResponse:
  146. """
  147. 立即执行定时任务
  148. Args:
  149. dto (SysJob): 任务实体
  150. Returns:
  151. AjaxResponse: 数据响应
  152. """
  153. SysJobService.run(dto)
  154. return AjaxResponse.from_success()
  155. @reg.api.route("/monitor/job/<ids>", methods=["DELETE"])
  156. @reg.api.route("/monitor/job/remove", methods=["DELETE"])
  157. @PathValidator()
  158. @PreAuthorize(HasPerm('monitor:job:remove'))
  159. @Log(title = "定时任务", business_type = BusinessType.DELETE)
  160. @JsonSerializer()
  161. def common_job_remove(
  162. ids: Annotated[List[int],BeforeValidator(ids_to_list)]
  163. ) -> AjaxResponse:
  164. """
  165. 删除定时任务
  166. Args:
  167. ids (List[int]): 任务ID列表
  168. Returns:
  169. AjaxResponse: 数据响应
  170. """
  171. SysJobService.delete_job_by_ids(ids)
  172. return AjaxResponse.from_success()