From 5deaede4715d2703aadcd33f94256b339b9e9140 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 14 四月 2026 10:09:08 +0800
Subject: [PATCH] feat(sales): 添加发票和销售台账查询过滤功能

---
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java |  184 +++++++++++++++++----------------------------
 1 files changed, 70 insertions(+), 114 deletions(-)

diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
index 125f311..5671156 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
@@ -1,7 +1,17 @@
 package com.ruoyi.inspectiontask.service.impl;
 
 import com.ruoyi.inspectiontask.pojo.TimingTask;
-import org.quartz.*;
+import org.quartz.CronScheduleBuilder;
+import org.quartz.CronTrigger;
+import org.quartz.JobBuilder;
+import org.quartz.JobDataMap;
+import org.quartz.JobDetail;
+import org.quartz.JobKey;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerException;
+import org.quartz.Trigger;
+import org.quartz.TriggerBuilder;
+import org.quartz.TriggerKey;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -18,132 +28,86 @@
     @Autowired
     private Scheduler scheduler;
 
-    /**
-     * 娣诲姞鏂颁换鍔″埌璋冨害鍣�
-     */
     public void scheduleTimingTask(TimingTask task) throws SchedulerException {
         JobDetail jobDetail = buildJobDetail(task);
         Trigger trigger = buildJobTrigger(task, jobDetail);
         scheduler.scheduleJob(jobDetail, trigger);
     }
 
-    /**
-     * 鏇存柊宸叉湁浠诲姟
-     */
     public void rescheduleTimingTask(TimingTask task) throws SchedulerException {
         TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId());
-
-        // 鑾峰彇鐜版湁瑙﹀彂鍣ㄥ苟杞崲涓� CronTrigger
         Trigger oldTrigger = scheduler.getTrigger(triggerKey);
         if (!(oldTrigger instanceof CronTrigger)) {
             throw new SchedulerException("Existing trigger is not a CronTrigger");
         }
 
-        // 3. 鏋勫缓CronTrigger锛岀‘淇濇寔涔呭寲閰嶇疆
         CronTrigger newTrigger = TriggerBuilder.newTrigger()
-                .withIdentity(triggerKey)                // 鍞竴鏍囪瘑锛岀敤浜庢寔涔呭寲瀛樺偍
-                .withDescription(task.getTaskName() + "_TRIGGER") // 瑙﹀彂鍣ㄦ弿杩�
-                .forJob(oldTrigger.getJobKey())                       // 鍏宠仈瀵瑰簲鐨凧ob
-                .withSchedule(CronScheduleBuilder
-                        .cronSchedule(convertToCronExpression(task)) // 閿欒繃鎵ц鏃剁殑绛栫暐锛堟牴鎹笟鍔¤皟鏁达級
-                )
-                // 4. 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鍒欑珛鍗崇敓鏁堬級
+                .withIdentity(triggerKey)
+                .withDescription(task.getTaskName() + "_TRIGGER")
+                .forJob(oldTrigger.getJobKey())
+                .withSchedule(CronScheduleBuilder.cronSchedule(convertToCronExpression(task)))
                 .startAt(task.getNextExecutionTime() != null
                         ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
                         : new Date())
                 .build();
 
-        // 鏋勫缓鏂拌Е鍙戝櫒
-//        Trigger newTrigger = TriggerBuilder.newTrigger()
-//                .withIdentity(triggerKey)
-//                .withDescription(task.getTaskName())
-//                .withSchedule(CronScheduleBuilder.cronSchedule(convertToCronExpression(task)))
-//                .startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()))
-//                .forJob(oldTrigger.getJobKey())
-//                .build();
-
         scheduler.rescheduleJob(triggerKey, newTrigger);
     }
 
-    /**
-     * 鏆傚仠浠诲姟
-     */
     public void pauseTimingTask(Long taskId) throws SchedulerException {
-        JobKey jobKey = new JobKey("timingTask_" + taskId);
-        scheduler.pauseJob(jobKey);
+        scheduler.pauseJob(new JobKey("timingTask_" + taskId));
     }
 
-    /**
-     * 鎭㈠浠诲姟
-     */
     public void resumeTimingTask(Long taskId) throws SchedulerException {
-        JobKey jobKey = new JobKey("timingTask_" + taskId);
-        scheduler.resumeJob(jobKey);
+        scheduler.resumeJob(new JobKey("timingTask_" + taskId));
     }
 
-    /**
-     * 鍒犻櫎浠诲姟
-     */
-    public void unscheduleTimingTask(Long taskId){
+    public void unscheduleTimingTask(Long taskId) {
         try {
-            JobKey jobKey = new JobKey("timingTask_" + taskId);
-            scheduler.deleteJob(jobKey);
-        }catch (SchedulerException e){
+            scheduler.deleteJob(new JobKey("timingTask_" + taskId));
+        } catch (SchedulerException e) {
             throw new RuntimeException(e);
         }
     }
 
     private JobDetail buildJobDetail(TimingTask task) {
-        // 1. 鏋勫缓鍞竴JobKey锛堝熀浜庝换鍔D锛岀‘淇濋噸鍚悗鑳借瘑鍒級
         JobKey jobKey = new JobKey("timingTask_" + task.getId());
-
-        // 2. 灏佽浠诲姟鏁版嵁锛堜粎浣跨敤鍩烘湰绫诲瀷锛岀‘淇濆彲搴忓垪鍖栵級
         JobDataMap jobDataMap = new JobDataMap();
-        jobDataMap.put("taskId", task.getId());           // 浠诲姟ID锛圠ong锛屽彲搴忓垪鍖栵級
-        jobDataMap.put("taskName", task.getTaskName());   // 浠诲姟鍚嶇О锛圫tring锛屽彲搴忓垪鍖栵級
-        jobDataMap.put("taskType", task.getFrequencyType()); // 浠诲姟绫诲瀷锛圫tring锛�
-        // 鎸夐渶娣诲姞鍏朵粬蹇呰鐨勫熀鏈被鍨嬪弬鏁�
+        jobDataMap.put("taskId", task.getId());
+        jobDataMap.put("taskName", task.getTaskName());
+        jobDataMap.put("taskType", task.getFrequencyType());
 
-        // 3. 鏋勫缓JobDetail锛岃缃寔涔呭寲鐩稿叧灞炴��
         return JobBuilder.newJob(TimingTaskJob.class)
-                .withIdentity(jobKey)                    // 鍞竴鏍囪瘑锛岀敤浜庢寔涔呭寲瀛樺偍
-                .withDescription(task.getTaskName())     // 浠诲姟鎻忚堪锛屽瓨鍏ユ暟鎹簱
-                .usingJobData(jobDataMap)                // 缁戝畾浠诲姟鏁版嵁
-                .storeDurably(true)                          // 鍗充娇娌℃湁瑙﹀彂鍣ㄥ叧鑱斾篃鎸佷箙鍖栦繚瀛�
-                .requestRecovery(true)                   // 褰撹皟搴﹀櫒宕╂簝鍚庢仮澶嶆椂锛岄噸鏂版墽琛屾湭瀹屾垚鐨勪换鍔�
+                .withIdentity(jobKey)
+                .withDescription(task.getTaskName())
+                .usingJobData(jobDataMap)
+                .storeDurably(true)
+                .requestRecovery(true)
                 .build();
     }
 
     private Trigger buildJobTrigger(TimingTask task, JobDetail jobDetail) {
-        // 1. 鏋勫缓鍞竴TriggerKey锛堝熀浜庝换鍔D锛�
         TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId());
-
-        // 2. 鐢熸垚Cron琛ㄨ揪寮忥紙鍘熼�昏緫涓嶅彉锛�
         String cronExpression = convertToCronExpression(task);
 
-        // 3. 鏋勫缓CronTrigger锛岀‘淇濇寔涔呭寲閰嶇疆
         return TriggerBuilder.newTrigger()
-                .withIdentity(triggerKey)                // 鍞竴鏍囪瘑锛岀敤浜庢寔涔呭寲瀛樺偍
-                .withDescription(task.getTaskName() + "_TRIGGER") // 瑙﹀彂鍣ㄦ弿杩�
-                .forJob(jobDetail)                       // 鍏宠仈瀵瑰簲鐨凧ob
-                .withSchedule(CronScheduleBuilder
-                        .cronSchedule(cronExpression)
-                        .withMisfireHandlingInstructionDoNothing() // 閿欒繃鎵ц鏃剁殑绛栫暐锛堟牴鎹笟鍔¤皟鏁达級
-                )
-                // 4. 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鍒欑珛鍗崇敓鏁堬級
+                .withIdentity(triggerKey)
+                .withDescription(task.getTaskName() + "_TRIGGER")
+                .forJob(jobDetail)
+                .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)
+                        .withMisfireHandlingInstructionDoNothing())
                 .startAt(task.getNextExecutionTime() != null
                         ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
                         : new Date())
                 .build();
     }
+
     private String convertToCronExpression(TimingTask task) {
-        // 鍙傛暟鏍¢獙
         if (task == null || task.getFrequencyType() == null || task.getFrequencyDetail() == null) {
             throw new IllegalArgumentException("浠诲姟鍙傛暟涓嶈兘涓虹┖");
         }
 
-        // 浣跨敤switch纭繚鏉′欢浜掓枼
-        String frequencyType = task.getFrequencyType().toUpperCase(); // 缁熶竴杞负澶у啓姣旇緝
+        String frequencyType = task.getFrequencyType().toUpperCase();
         switch (frequencyType) {
             case "DAILY":
                 return convertDailyToCron(task.getFrequencyDetail());
@@ -153,18 +117,18 @@
                 return convertMonthlyToCron(task.getFrequencyDetail());
             case "QUARTERLY":
                 return convertQuarterlyToCron(task.getFrequencyDetail());
+            case "YEARLY":
+                return convertYearlyToCron(task.getFrequencyDetail());
             default:
                 throw new IllegalArgumentException("涓嶆敮鎸佺殑棰戠巼绫诲瀷: " + task.getFrequencyType());
         }
     }
 
-    // 姣忔棩浠诲姟杞崲
     private String convertDailyToCron(String frequencyDetail) {
         LocalTime time = parseTime(frequencyDetail);
         return String.format("0 %d %d * * ?", time.getMinute(), time.getHour());
     }
 
-    // 姣忓懆浠诲姟杞崲
     private String convertWeeklyToCron(String frequencyDetail) {
         String[] parts = validateAndSplit(frequencyDetail, ",", 2);
         String daysOfWeek = convertDayNamesToCron(parts[0]);
@@ -172,7 +136,6 @@
         return String.format("0 %d %d ? * %s", time.getMinute(), time.getHour(), daysOfWeek);
     }
 
-    // 姣忔湀浠诲姟杞崲
     private String convertMonthlyToCron(String frequencyDetail) {
         String[] parts = validateAndSplit(frequencyDetail, ",", 2);
         int day = validateDayOfMonth(parts[0]);
@@ -180,29 +143,29 @@
         return String.format("0 %d %d %d * ?", time.getMinute(), time.getHour(), day);
     }
 
-    // 姣忓搴︿换鍔¤浆鎹�
     private String convertQuarterlyToCron(String frequencyDetail) {
         String[] parts = validateAndSplit(frequencyDetail, ",", 3);
-        int month = validateMonth(parts[0]);  // 楠岃瘉鏈堜唤(1-12)
-        int day = validateDayOfMonth(parts[1]);  // 楠岃瘉鏃ユ湡
-        LocalTime time = parseTime(parts[2]);  // 瑙f瀽鏃堕棿
+        int month = validateMonth(parts[0]);
+        int day = validateDayOfMonth(parts[1]);
+        LocalTime time = parseTime(parts[2]);
 
-        // 璁$畻瀛e害璧峰鏈堜唤(1鏈�=1, 4鏈�=4, 7鏈�=7, 10鏈�=10)
         int quarterStartMonth = ((month - 1) / 3) * 3 + 1;
-
-        return String.format("0 %d %d %d %d/3 ?",
-                time.getMinute(),
-                time.getHour(),
-                day,
-                quarterStartMonth);
+        return String.format("0 %d %d %d %d/3 ?", time.getMinute(), time.getHour(), day, quarterStartMonth);
     }
 
-    // 鏂板楠岃瘉鏈堜唤鐨勬柟娉�(1-12)
+    private String convertYearlyToCron(String frequencyDetail) {
+        String[] parts = validateAndSplit(frequencyDetail, ",", 3);
+        int month = validateMonth(parts[0]);
+        int day = validateDayOfMonth(parts[1]);
+        LocalTime time = parseTime(parts[2]);
+        return String.format("0 %d %d %d %d ?", time.getMinute(), time.getHour(), day, month);
+    }
+
     private int validateMonth(String monthStr) {
         try {
             int month = Integer.parseInt(monthStr);
             if (month < 1 || month > 12) {
-                throw new IllegalArgumentException("鏈堜唤蹇呴』鍦�1-12涔嬮棿");
+                throw new IllegalArgumentException("鏈堜唤蹇呴』鍦� 1-12 涔嬮棿");
             }
             return month;
         } catch (NumberFormatException e) {
@@ -210,61 +173,54 @@
         }
     }
 
-    // 杈呭姪鏂规硶锛氳В鏋愭椂闂�
     private LocalTime parseTime(String timeStr) {
         try {
             return LocalTime.parse(timeStr);
         } catch (DateTimeParseException e) {
-            throw new IllegalArgumentException("鏃堕棿鏍煎紡蹇呴』涓篐H:mm", e);
+            throw new IllegalArgumentException("鏃堕棿鏍煎紡蹇呴』涓� HH:mm", e);
         }
     }
 
-    // 杈呭姪鏂规硶锛氶獙璇佸苟鍒嗗壊瀛楃涓�
     private String[] validateAndSplit(String input, String delimiter, int expectedParts) {
         String[] parts = input.split(delimiter);
         if (parts.length != expectedParts) {
-            throw new IllegalArgumentException(
-                    String.format("鏍煎紡閿欒锛屽簲涓�%d閮ㄥ垎鐢�'%s'鍒嗛殧", expectedParts, delimiter));
+            throw new IllegalArgumentException(String.format("鏍煎紡閿欒锛屽簲涓� %d 閮ㄥ垎锛屼互 '%s' 鍒嗛殧", expectedParts, delimiter));
         }
         return parts;
     }
 
-    // 杈呭姪鏂规硶锛氶獙璇佹湀浠戒腑鐨勬棩
     private int validateDayOfMonth(String dayStr) {
         int day = Integer.parseInt(dayStr);
         if (day < 1 || day > 31) {
-            throw new IllegalArgumentException("鏃ユ湡蹇呴』鍦�1-31涔嬮棿");
+            throw new IllegalArgumentException("鏃ユ湡蹇呴』鍦� 1-31 涔嬮棿");
         }
         return day;
     }
 
-    // 杈呭姪鏂规硶锛氶獙璇佸搴︿腑鐨勬湀
-    private int validateMonthInQuarter(String monthStr) {
-        int month = Integer.parseInt(monthStr);
-        if (month < 1 || month > 3) {
-            throw new IllegalArgumentException("瀛e害鏈堜唤蹇呴』鏄�1銆�2鎴�3");
-        }
-        return month;
-    }
-
-    // 杞崲鏄熸湡鍑犲悕绉�
     private String convertDayNamesToCron(String dayNames) {
         return Arrays.stream(dayNames.split("\\|"))
                 .map(this::convertSingleDayName)
                 .collect(Collectors.joining(","));
     }
 
-    // 杞崲鍗曚釜鏄熸湡鍑犲悕绉�
     private String convertSingleDayName(String dayName) {
         switch (dayName.toUpperCase()) {
-            case "MON": return "MON";
-            case "TUE": return "TUE";
-            case "WED": return "WED";
-            case "THU": return "THU";
-            case "FRI": return "FRI";
-            case "SAT": return "SAT";
-            case "SUN": return "SUN";
-            default: throw new IllegalArgumentException("鏃犳晥鐨勬槦鏈熷嚑: " + dayName);
+            case "MON":
+                return "MON";
+            case "TUE":
+                return "TUE";
+            case "WED":
+                return "WED";
+            case "THU":
+                return "THU";
+            case "FRI":
+                return "FRI";
+            case "SAT":
+                return "SAT";
+            case "SUN":
+                return "SUN";
+            default:
+                throw new IllegalArgumentException("鏃犳晥鐨勬槦鏈�: " + dayName);
         }
     }
-}
+}
\ No newline at end of file

--
Gitblit v1.9.3