#!/usr/bin/env python3 # -*- coding: utf-8 -*- """?????????admin-saas / fs-qw-task ?????? -> fs-task???????? @Scheduled""" import os import re import shutil from pathlib import Path ROOT = Path(__file__).resolve().parent.parent FS_TASK = ROOT / "fs-task" / "src" / "main" / "java" FS_SERVICE = ROOT / "fs-service" / "src" / "main" / "java" FS_ADMIN_SAAS = ROOT / "fs-admin-saas" / "src" / "main" / "java" FS_QW_TASK = ROOT / "fs-qw-task" / "src" / "main" / "java" ADMIN_SAAS_MOVE_DIRS = [ "com/fs/his/task", "com/fs/hisStore/task", "com/fs/course/task", "com/fs/tenant/task", "com/fs/ad/controller/task", ] ADMIN_SAAS_MOVE_FILES = [ "com/fs/admin/sync/LobsterBridgeDataSyncService.java", ] ADMIN_SAAS_TASK_FILES = [ "com/fs/task/CrmCustomerAiProcessingTask.java", "com/fs/task/ComprehensiveStatisticsTask.java", "com/fs/task/FsCompanyTask.java", "com/fs/task/FsStoreTask.java", "com/fs/task/MiniProgramSubTask.java", "com/fs/task/QwExternalAiAnalyzeTask.java", "com/fs/task/SyncTuLinStudentInfoTask.java", ] QW_MOVE_DIRS = [ "com/fs/app/task", "com/fs/app/taskService", ] SERVICE_TASK_DELETE_DIRS = [ "com/fs/his/task", "com/fs/hisStore/task", "com/fs/course/task", "com/fs/tenant/task", "com/fs/task", "com/fs/proxy/task", "com/fs/ad/controller/task", ] SCHEDULED_IMPORT = re.compile(r"^\s*import org\.springframework\.scheduling\.annotation\.Scheduled;\s*\n", re.M) SCHEDULED_ANN = re.compile(r"^\s*@Scheduled\([^)]*\)\s*\n", re.M) def ensure_parent(path: Path): path.parent.mkdir(parents=True, exist_ok=True) def move_path(src: Path, dst: Path): if not src.exists(): return ensure_parent(dst) if dst.exists(): dst.unlink() shutil.move(str(src), str(dst)) print(f"MOVE {src.relative_to(ROOT)} -> {dst.relative_to(ROOT)}") def move_tree(src_root: Path, rel: str, dst_root: Path): src = src_root / rel if not src.exists(): return dst = dst_root / rel if src.is_dir(): if dst.exists(): shutil.rmtree(dst) shutil.move(str(src), str(dst)) print(f"MOVE DIR {src.relative_to(ROOT)} -> {dst.relative_to(ROOT)}") else: move_path(src, dst) def strip_scheduled(content: str) -> str: content = SCHEDULED_ANN.sub("", content) content = SCHEDULED_IMPORT.sub("", content) return content def process_java_file(path: Path): for enc in ("utf-8", "gbk", "latin-1"): try: text = path.read_text(encoding=enc) break except UnicodeDecodeError: text = None if text is None: print(f"SKIP (encoding) {path.relative_to(ROOT)}") return new_text = strip_scheduled(text) if new_text != text: path.write_text(new_text, encoding="utf-8") print(f"STRIP @Scheduled {path.relative_to(ROOT)}") def strip_tree(root: Path): if not root.exists(): return for p in root.rglob("*.java"): process_java_file(p) def delete_tree(base: Path, rel: str): p = base / rel if p.exists(): if p.is_dir(): shutil.rmtree(p) else: p.unlink() print(f"DELETE {p.relative_to(ROOT)}") def main(): FS_TASK.mkdir(parents=True, exist_ok=True) for rel in ADMIN_SAAS_MOVE_DIRS: move_tree(FS_ADMIN_SAAS, rel, FS_TASK) for rel in ADMIN_SAAS_MOVE_FILES + ADMIN_SAAS_TASK_FILES: move_path(FS_ADMIN_SAAS / rel, FS_TASK / rel) for rel in QW_MOVE_DIRS: move_tree(FS_QW_TASK, rel, FS_TASK) for rel in SERVICE_TASK_DELETE_DIRS: delete_tree(FS_SERVICE, rel) strip_tree(FS_TASK) # fs-service ??? @Scheduled ????????????????? Quartz ????? for rel in [ "com/fs/proxy/service/impl/PlatformStatisticsServiceImpl.java", "com/fs/erp/service/impl/JstTokenService.java", "com/fs/company/service/workflow/heartbeat/impl/HeartbeatSchedulerImpl.java", "com/fs/company/service/workflow/evolution/impl/EvolutionSchedulerImpl.java", "com/fs/company/service/workflow/event/UserEventMonitor.java", "com/fs/fastgptApi/util/EventLogUtils.java", ]: p = FS_SERVICE / rel if p.exists(): process_java_file(p) print("DONE") if __name__ == "__main__": main()