""" 系统服务,用于读取服务配置文件,启动或停止相关的服务。 """ import logging import os import sys from typing import Optional from dock.dcm import dcm_scrape, dcm_security from dock.oa_dcm import oa_push_order, oa_sign_task from paste.core.logging import echo_log, set_logger_config from paste.service.task_service import TaskService logger_config_name = 'logger.dcm_service' """ 配置文件中日志配置字段名称。 """ task_serv: Optional[TaskService] = None """ 任务服务对象。 """ pid_file = os.path.join(os.path.curdir, 'dcm_service.pid') """ PID 文件路径。 """ service_name = '数字城管计划任务服务' """ 服务名称。 """ def init_task_service(): """ 初始化服务对象并安装具体任务。 """ global task_serv task_serv = TaskService(service_name=service_name, pid_file=pid_file) # 每隔 2 小时执行,更新数字城管 Cookies task_serv.add_task(creator=task_serv.create_delay_task, fn=renew_dcm_token, delay=3600 * 2) # 每隔 2 小时执行,抓取 DCM 数据 task_serv.add_task(creator=task_serv.create_delay_task, fn=scrape_dcm_task, delay=3600 * 2) return task_serv async def renew_dcm_token(): try: echo_log(f"开始执行数字城管 Cookies 更新...") await dcm_security.login() echo_log(f"完成数字城管 Cookies 更新.") except Exception as e: echo_log(msg=e, level=logging.ERROR, is_log_exc=True) async def scrape_dcm_task(): fetch_size = 30 try: echo_log(f"开始执行 DCM<=>OA 数据同步...") await dcm_scrape.fetch_dcm_task(fetch_size) # 工单推送 OA 平台 await oa_push_order.push_full_order(fetch_size) # 推送结束后,签收工单 await oa_sign_task.sign_task(fetch_size) echo_log(f"执行 DCM<=>OA 数据同步完成...") except Exception as e: echo_log(msg=e, level=logging.ERROR, is_log_exc=True) def start_service(): """ 控制台服务方式启动。 """ set_logger_config(logger_config_name) _ts = init_task_service() _ts.start_service(env_check=False) def start(): """ 驻内存服务方式启动。 """ set_logger_config(logger_config_name) _ts = init_task_service() _ts.start() def stop(): """ 驻内存服务方式停止。 """ set_logger_config(logger_config_name) _ts = init_task_service() _ts.stop() if __name__ == "__main__": if len(sys.argv) > 1: if sys.argv[1] == "start": start_service() elif sys.argv[1] == "stop": stop() else: print("用法: python service/task_service.py start") else: start_service()