ScheduleTaskMgr.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. package io.github.pnoker.gateway.comtool;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import io.github.pnoker.gateway.bizmgr.*;
  5. import io.github.pnoker.gateway.dbdao.DBMgrProxy;
  6. import io.github.pnoker.gateway.utils.InfulxDbUtil;
  7. import io.github.pnoker.gateway.utils.InfulxJiangjinDbUtil;
  8. import io.github.pnoker.gateway.utils.InfulxTyDbUtil;
  9. import io.github.pnoker.gateway.utils.InfulxZilaishuiDbUtil;
  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;
  12. import org.springframework.beans.factory.annotation.Value;
  13. import org.springframework.scheduling.annotation.EnableAsync;
  14. import org.springframework.scheduling.annotation.EnableScheduling;
  15. import org.springframework.scheduling.annotation.Scheduled;
  16. import org.springframework.stereotype.Component;
  17. import org.springframework.web.bind.annotation.PostMapping;
  18. import javax.annotation.PostConstruct;
  19. import javax.annotation.Resource;
  20. import java.sql.Time;
  21. import java.time.LocalDate;
  22. import java.time.LocalDateTime;
  23. import java.time.LocalTime;
  24. import java.time.format.DateTimeFormatter;
  25. import java.time.temporal.TemporalAdjusters;
  26. import java.util.Timer;
  27. import java.util.TimerTask;
  28. import java.util.concurrent.Executors;
  29. import java.util.concurrent.ScheduledExecutorService;
  30. import java.util.concurrent.TimeUnit;
  31. /**
  32. * @ClassName ScheduleTaskMgr
  33. * @Description: TODO 定时任务
  34. * @Author LX
  35. * @Date 2024/2/20
  36. * @Version V1.0
  37. **/
  38. @Component
  39. @EnableScheduling // 1.开启定时任务
  40. @EnableAsync // 2.开启多线程
  41. public class ScheduleTaskMgr {
  42. private final String mBusinessType = "class";
  43. private String mStrClassName;
  44. public ScheduleTaskMgr() {
  45. mStrClassName = this.getClass().getSimpleName();
  46. }
  47. private static final Logger log = LoggerFactory.getLogger(ScheduleTaskMgr.class);
  48. @Resource
  49. private XuchangWaterConfig xuchangWaterConfig;
  50. /**
  51. * 许昌相关
  52. */
  53. // //TODO 启动时,判断当前是否超过两点 如果超过 ,查询昨日是否有数据插入, 如果没有,则在启动时执行一下xuchangWaterConfig.init()
  54. // @PostConstruct
  55. // public void postInit(){
  56. // new Timer().schedule(new TimerTask() {
  57. // @Override
  58. // public void run() {
  59. // DBMgrProxy.getInstance().init();
  60. // }
  61. // },3000);
  62. // new Timer().schedule(new TimerTask() {
  63. // @Override
  64. // public void run() {
  65. // xuchangWaterConfig.init();
  66. // }
  67. // },10000);
  68. // }
  69. //
  70. //
  71. // // @Scheduled(cron = "0 15 10 * * ?")
  72. // @Scheduled(cron = "0 10 12 * * ?")
  73. // public void checkXuchangMeter(){
  74. // xuchangWaterConfig.init();
  75. // }
  76. //TODO 当阳相关
  77. @Resource(name = "infulxDbUtil")
  78. private InfulxDbUtil infulxDbUtil;
  79. @Value("${dangyang.device.type:}")
  80. private String deviceTypeStr = ""; // 设备类型集合
  81. @Value("${dangyang.http.username:}")
  82. private String username = ""; // token调用账号
  83. @Value("${dangyang.http.password:}")
  84. private String password = ""; // token调用密码
  85. @Value("${dangyang.http.token:}")
  86. private String tokenUrl = ""; // token接口地址
  87. @Value("${dangyang.http.realtimeDataList:}")
  88. private String realtimeDataListUrl = ""; // 实时数据接口地址
  89. @Value("${dangyang.http.hisDataList:}")
  90. private String hisDataListUrl = ""; // 历史数据接口地址
  91. @Value("${dangyang.http.list:}")
  92. private String listUrl = ""; // 设备列表接口地址
  93. /**
  94. * 当阳相关
  95. */
  96. // //TODO 启动后5秒初始化所有配置参数
  97. // @PostConstruct
  98. // public void initDangyangApplication(){
  99. // new Timer().schedule(new TimerTask() {
  100. // @Override
  101. // public void run() {
  102. // try {
  103. // infulxDbUtil.initInfluxDataBase();
  104. // KprDangyangWaterBizFun.infulxDbUtil = infulxDbUtil;
  105. // KprDangyangWaterBizFun.deviceType = JSONArray.parseArray(deviceTypeStr);
  106. // KprDangyangWaterBizFun.username = username;
  107. // KprDangyangWaterBizFun.password = password;
  108. // KprDangyangWaterBizFun.tokenUrl = tokenUrl;
  109. // KprDangyangWaterBizFun.realtimeDataListUrl = realtimeDataListUrl;
  110. // KprDangyangWaterBizFun.hisDataListUrl = hisDataListUrl;
  111. // KprDangyangWaterBizFun.listUrl = listUrl;
  112. // }catch(Exception ex){
  113. // log.error("当阳启动时初始化配置参数失败:"+ex.getLocalizedMessage());
  114. // }
  115. // }
  116. // },5000);
  117. // }
  118. //
  119. // //TODO 根据失效时间定时获取token
  120. // //TODO 启动后8秒获取第一次token,在以失效时间为基础-5分钟为下一次获取token的条件
  121. // private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
  122. // private static final long INITIAL_DELAY = 8; // 初始延迟8秒
  123. // private static final long BUFFER_TIME = 5 * 60 * 1000; // 5分钟的缓冲时间(以毫秒为单位)
  124. //
  125. // @PostConstruct
  126. // public void getToken() {
  127. // scheduler.schedule(new TokenTask(), INITIAL_DELAY, TimeUnit.SECONDS);
  128. // }
  129. //
  130. // private class TokenTask implements Runnable {
  131. // @Override
  132. // public void run() {
  133. // // 获取 accessToken 和 expiresTime
  134. // JSONObject data = KprDangyangWaterBizFun.getDangyangToken();
  135. // if (data != null) {
  136. // String accessToken = data.getString("accessToken");
  137. // Long expiresTime = data.getLong("expiresTime");
  138. //
  139. // KprDangyangWaterBizFun.dangyangToken = accessToken;
  140. //
  141. // // 打印获取到的 token 和过期时间
  142. // System.out.println("Access Token: " + accessToken);
  143. // System.out.println("Expires Time: " + expiresTime);
  144. //
  145. // // 计算下一次获取 token 的延迟时间
  146. // long delayMillis = expiresTime - System.currentTimeMillis() - BUFFER_TIME;
  147. // long delaySeconds = delayMillis / 1000; // 转换为秒
  148. //
  149. // // 调度下一次任务
  150. // if (delaySeconds > 0) {
  151. // scheduler.schedule(this, delaySeconds, TimeUnit.SECONDS);
  152. // } else {
  153. // // 如果计算出来的延迟时间已经过期,立即执行下一次任务
  154. // scheduler.schedule(this, 0, TimeUnit.SECONDS);
  155. // }
  156. // }
  157. // }
  158. // }
  159. //
  160. // //可以做动态关联,暂时不用了
  161. //// @PostConstruct
  162. //// public void initDeviceDefine(){
  163. //// new Timer().schedule(new TimerTask() {
  164. //// @Override
  165. //// public void run() {
  166. //// KprDangyangWaterBizFun.flushDefine();
  167. //// }
  168. //// },5000);
  169. //// }
  170. //
  171. // @PostConstruct
  172. // public void initReal(){
  173. // new Timer().schedule(new TimerTask() {
  174. // @Override
  175. // public void run() {
  176. // KprDangyangWaterBizFun.checkRealtimeData();
  177. // }
  178. // },10000);
  179. // }
  180. // @PostConstruct
  181. // public void initHistory(){
  182. // new Timer().schedule(new TimerTask() {
  183. // @Override
  184. // public void run() {
  185. // KprDangyangWaterBizFun.checkOneMonth();
  186. // }
  187. // },11000);
  188. // }
  189. // @PostConstruct
  190. // public void initDingzhiHistory(){
  191. // new Timer().schedule(new TimerTask() {
  192. // @Override
  193. // public void run() {
  194. // KprDangyangWaterBizFun.checkDingzhiHistory();
  195. // }
  196. // },12000);
  197. // }
  198. //
  199. // @Scheduled(cron = "0 */10 * * * ?")
  200. // public void initToken(){
  201. // JSONObject data = KprDangyangWaterBizFun.getDangyangToken();
  202. // if (data != null) {
  203. // String accessToken = data.getString("accessToken");
  204. // Long expiresTime = data.getLong("expiresTime");
  205. //
  206. // KprDangyangWaterBizFun.dangyangToken = accessToken;
  207. // }
  208. // }
  209. //TODO 江津相关
  210. /*@Resource(name = "infulxJiangjinDbUtil")
  211. private InfulxJiangjinDbUtil infulxJiangjinDbUtil;
  212. //TODO 启动后5秒初始化所有配置参数
  213. @PostConstruct
  214. public void initJiangjinApplication(){
  215. new Timer().schedule(new TimerTask() {
  216. @Override
  217. public void run() {
  218. try {
  219. infulxJiangjinDbUtil.initInfluxDataBase();
  220. KprJiangjinWaterBizfun.infulxJiangjinDbUtil = infulxJiangjinDbUtil;
  221. }catch(Exception ex){
  222. log.error("江津启动时初始化配置参数失败:"+ex.getLocalizedMessage());
  223. }
  224. }
  225. },5000);
  226. }
  227. @PostConstruct
  228. public void initJiangjinHisData(){
  229. new Timer().schedule(new TimerTask() {
  230. @Override
  231. public void run() {
  232. try {
  233. KprJiangjinWaterBizfun.InitRealDb();
  234. // KprJiangjinWaterBizfun.InitDeviceFrequency();
  235. }catch(Exception ex){
  236. }
  237. }
  238. },7000,60000);
  239. //TODO 启动时同步当前月一号到当前时间的所有历史数据
  240. new Timer().schedule(new TimerTask() {
  241. @Override
  242. public void run() {
  243. try {
  244. KprJiangjinWaterBizfun.initHistoryDb(LocalDate.now().withDayOfMonth(1).atStartOfDay());
  245. // KprJiangjinWaterBizfun.initHistoryDb(LocalDateTime.now().withDayOfMonth(10).withHour(12)
  246. // .withMinute(0).withSecond(0));
  247. }catch(Exception ex){
  248. }
  249. }
  250. },8000);
  251. }
  252. //TODO 每分钟的第五秒执行
  253. @Scheduled(cron = "5 * * * * ?")
  254. public void executeTask() {
  255. KprJiangjinWaterBizfun.InitRealDb();
  256. }
  257. //TODO 每天凌晨1点执行前一天的
  258. @Scheduled(cron = "0 0 1 * * ?")
  259. public void executeHistoryTask() {
  260. //TODO 执行前一天的数据到当前
  261. KprJiangjinWaterBizfun.initHistoryDb(LocalDate.now().minusDays(1).atStartOfDay());
  262. }
  263. //TODO 江津水量预测相关
  264. //每天每个整点的5分
  265. @Scheduled(cron = "0 5 * * * *")
  266. public void executeRecord() {
  267. String formattedDateTime = LocalDate.now().minusDays(1)
  268. .atStartOfDay()
  269. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  270. KprJiangjinAimWaterBizFun.initTapWaterData(formattedDateTime);
  271. }
  272. //每天每个整点的5分
  273. @Scheduled(cron = "0 10 * * * *")
  274. public void executeRecordAll() {
  275. String formattedDateTime = LocalDate.now().minusDays(1)
  276. .atStartOfDay()
  277. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  278. KprJiangjinAimWaterBizFun.initWaterCollecationReacordAll(formattedDateTime);
  279. }
  280. //TODO 每天每小时的21分执行预测当前月日小时数据
  281. @Scheduled(cron = "0 21 * * * *")
  282. public void executeTbMHourWaterNow() {
  283. String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM"));
  284. // KprJiangjinAimWaterBizFun.insertYuceHourAddData(time);
  285. KprJiangjinAimWaterBizFun.insertYuceHourDataScheduled(time);
  286. }
  287. //TODO 启动时执行一次
  288. @PostConstruct
  289. public void initExecuteRecordAndAll(){
  290. String formattedDateTime = LocalDate.now().minusDays(1)
  291. .atStartOfDay()
  292. .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  293. Timer timer = new Timer();
  294. // 创建定时器任务
  295. TimerTask timerTask = new TimerTask() {
  296. @Override
  297. public void run() {
  298. KprJiangjinAimWaterBizFun.initTapWaterData(formattedDateTime);
  299. }
  300. };
  301. timer.schedule(timerTask, 10000); // 10秒后执行一次
  302. Timer timer1 = new Timer();
  303. // 创建定时器任务
  304. TimerTask timerTask1 = new TimerTask() {
  305. @Override
  306. public void run() {
  307. KprJiangjinAimWaterBizFun.initWaterCollecationReacordAll(formattedDateTime);
  308. }
  309. };
  310. timer1.schedule(timerTask1, 10000); // 10秒后执行一次
  311. }
  312. @PostConstruct
  313. public void initOneTapWater(){
  314. Timer timer = new Timer();
  315. // 创建定时器任务
  316. TimerTask timerTask = new TimerTask() {
  317. @Override
  318. public void run() {
  319. KprJiangjinAimWaterBizFun.initTapWaterData("2023-11-01 00:00:00");
  320. }
  321. };
  322. timer.schedule(timerTask, 10000); // 10秒后执行一次
  323. }
  324. @PostConstruct
  325. public void initWaterRecordAll(){
  326. Timer timer = new Timer();
  327. TimerTask timerTask1 = new TimerTask() {
  328. @Override
  329. public void run() {
  330. KprJiangjinAimWaterBizFun.initWaterCollecationReacordAll("2023-11-01 00:00:00");
  331. }
  332. };
  333. timer.schedule(timerTask1,11000);//11秒后执行一次
  334. }
  335. @PostConstruct
  336. public void initWaterHour(){
  337. Timer timer = new Timer();
  338. TimerTask timerTask1 = new TimerTask() {
  339. @Override
  340. public void run() {
  341. String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM"));
  342. KprJiangjinAimWaterBizFun.insertYuceHourDataScheduled(time);
  343. }
  344. };
  345. timer.schedule(timerTask1,9000);//9秒后执行一次
  346. }*/
  347. /**
  348. * TODO 自来水相关
  349. */
  350. /*@Resource(name = "infulxZilaishuiDbUtil")
  351. private InfulxZilaishuiDbUtil infulxZilaishuiDbUtil;
  352. //TODO 启动后5秒初始化所有配置参数
  353. @PostConstruct
  354. public void initZilaishuiApplication(){
  355. new Timer().schedule(new TimerTask() {
  356. @Override
  357. public void run() {
  358. try {
  359. infulxZilaishuiDbUtil.initInfluxDataBase();
  360. KprZilaishuiWaterBizFun.infulxZilaishuiDbUtil= infulxZilaishuiDbUtil;
  361. }catch(Exception ex){
  362. log.error("自来水启动时初始化配置参数失败:"+ex.getLocalizedMessage());
  363. }
  364. }
  365. },5000);
  366. }
  367. @PostConstruct
  368. public void initZilaishuiHisData(){
  369. //TODO 启动时同步当前月一号到当前时间的所有历史数据
  370. new Timer().schedule(new TimerTask() {
  371. @Override
  372. public void run() {
  373. try {
  374. KprZilaishuiWaterBizFun.initHistoryDb(LocalDate.now().withDayOfMonth(1).atStartOfDay());
  375. }catch(Exception ex){
  376. }
  377. }
  378. },7000);
  379. new Timer().schedule(new TimerTask() {
  380. @Override
  381. public void run() {
  382. try {
  383. }catch(Exception ex){
  384. }
  385. }
  386. },8000);
  387. }
  388. //TODO 每小时的第 0, 5, 10, 15, ..., 55 分钟执行一次
  389. @Scheduled(cron = "0 0/5 * * * ?")
  390. public void executeZilaishuiTask() {
  391. KprZilaishuiWaterBizFun.initHistoryDb(LocalDateTime.now()
  392. .withMinute(0)
  393. .withSecond(0)
  394. .withNano(0));
  395. }
  396. //TODO 每天凌晨1点执行前一天的
  397. @Scheduled(cron = "0 0 1 * * ?")
  398. public void executeZilaishuiHistoryTask() {
  399. //TODO 执行前一天的数据到当前
  400. KprZilaishuiWaterBizFun.initHistoryDb(LocalDate.now()
  401. .minusDays(1)
  402. .atStartOfDay());
  403. }
  404. //TODO 市自来水水位预测相关
  405. @PostConstruct
  406. public void initWaterCollecationReacordAll(){
  407. new Timer().schedule(new TimerTask() {
  408. @Override
  409. public void run() {
  410. LocalDateTime firstDayOfLastMonth = LocalDateTime.now()
  411. .minusMonths(1)
  412. .with(TemporalAdjusters.firstDayOfMonth())
  413. .withHour(0)
  414. .withMinute(0)
  415. .withSecond(0)
  416. .withNano(0);//上个月0点
  417. String formattedDate = firstDayOfLastMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  418. KprZilaishuiLevelBizFun.initWaterLevelReacordAll(formattedDate);
  419. }
  420. },5000);
  421. }
  422. //TODO 每小时的10分执行原始小时液位数据计算
  423. @Scheduled(cron = "0 10 * * * *")
  424. public void initHourWaterCollecationReacordAll(){
  425. new Timer().schedule(new TimerTask() {
  426. @Override
  427. public void run() {
  428. String formattedDate = LocalDate.now().atStartOfDay().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  429. KprZilaishuiLevelBizFun.initWaterLevelReacordAll(formattedDate);
  430. }
  431. },5000);
  432. }
  433. //TODO 每小时的10分执行原始小时液位数据计算
  434. @Scheduled(cron = "0 * * * * ?")
  435. public void initYuceLevel(){
  436. new Timer().schedule(new TimerTask() {
  437. @Override
  438. public void run() {
  439. KprZilaishuiLevelBizFun.insertDailyData();
  440. KprZilaishuiLevelBizFun.insertForecastData();
  441. }
  442. },5000);
  443. }
  444. //TODO 市自来水泵数据采集
  445. @PostConstruct
  446. public void initPumpRecordAll(){
  447. new Timer().schedule(new TimerTask() {
  448. @Override
  449. public void run() {
  450. //当前时间到去年对应月份1号0点开始
  451. LocalDateTime firstDayOfLastMonth = LocalDateTime.now()
  452. .minusYears(1)
  453. .with(TemporalAdjusters.firstDayOfMonth())
  454. .withHour(0)
  455. .withMinute(0)
  456. .withSecond(0)
  457. .withNano(0);//上个月0点
  458. String formattedDate = firstDayOfLastMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  459. KprZilaishuiPumpBizFun.initWaterPumpReacordAll(formattedDate);
  460. }
  461. },5000);
  462. }
  463. //TODO 每小时的10分执行原始小时泵数据计算
  464. @Scheduled(cron = "0 10 * * * *")
  465. public void checkPumpRecordAll(){
  466. new Timer().schedule(new TimerTask() {
  467. @Override
  468. public void run() {
  469. //当前时间到今天的0点开始
  470. LocalDateTime firstDayOfLastMonth = LocalDate.now().atStartOfDay();//上个月0点
  471. String formattedDate = firstDayOfLastMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  472. KprZilaishuiPumpBizFun.initWaterPumpReacordAll(formattedDate);
  473. }
  474. },5000);
  475. }*/
  476. /**
  477. * TODO 汤阴业务相关
  478. */
  479. @Resource(name = "infulxTyDbUtil")
  480. private InfulxTyDbUtil infulxTyDbUtil;
  481. //TODO 启动后5秒初始化所有配置参数
  482. @PostConstruct
  483. public void initTangyinApplication(){
  484. new Timer().schedule(new TimerTask() {
  485. @Override
  486. public void run() {
  487. try {
  488. infulxTyDbUtil.initInfluxDataBase();
  489. KprTangyinWaterBizFun.infulxTyDbUtil = infulxTyDbUtil;
  490. }catch(Exception ex){
  491. log.error("汤阴启动时初始化配置参数失败:"+ex.getLocalizedMessage());
  492. }
  493. }
  494. },5000);
  495. }
  496. @PostConstruct
  497. public void oneYearInit(){
  498. new Timer().schedule(new TimerTask() {
  499. @Override
  500. public void run() {
  501. KprTangyinWaterBizFun.selectOneYear();
  502. }
  503. },7000);
  504. }
  505. }