From 25cc1b887f5421353d94c5e6be0fca56b3f2e668 Mon Sep 17 00:00:00 2001
From: zhanghl <253316343@qq.com>
Date: 星期三, 21 五月 2025 16:29:24 +0800
Subject: [PATCH] 优化Job
---
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsWorkCalendarServiceImpl.java | 191 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 190 insertions(+), 1 deletions(-)
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsWorkCalendarServiceImpl.java b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsWorkCalendarServiceImpl.java
index 1a152b9..51c0189 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsWorkCalendarServiceImpl.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsWorkCalendarServiceImpl.java
@@ -1,5 +1,8 @@
package com.aps.core.service.impl;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
import com.aps.common.core.utils.DateUtils;
import com.aps.common.security.utils.SecurityUtils;
import com.aps.core.domain.ApsWorkCalendar;
@@ -8,7 +11,13 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import java.util.List;
+import java.text.SimpleDateFormat;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.YearMonth;
+import java.time.ZoneId;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
/**
* 鏃ュ巻绠$悊Service涓氬姟灞傚鐞�
@@ -97,4 +106,184 @@
{
return apsWorkCalendarMapper.deleteApsWorkCalendarById(id);
}
+
+ public JSONArray getWorkCalendar(String applicableFactory, String datetime) {
+ JSONArray res = new JSONArray();
+ // 鑾峰彇骞翠唤鍜屾湀浠�
+ String[] parts = datetime.split("-");
+ int year = Integer.parseInt(parts[0]);
+ int month = Integer.parseInt(parts[1]);
+ // 鑾峰彇鎸囧畾骞翠唤鍜屾湀浠界殑澶╂暟
+ YearMonth yearMonth = YearMonth.of(year, month);
+ int daysInMonth = yearMonth.lengthOfMonth();
+ ApsWorkCalendar apsWorkCalendar = new ApsWorkCalendar();
+ apsWorkCalendar.setApplicableFactory(applicableFactory);
+ apsWorkCalendar.setEffectiveDate(DateUtils.parseDate(datetime+" 00:00:00"));
+ apsWorkCalendar.setExpiringDate(DateUtils.parseDate(datetime+" 23:59:59"));
+ List<ApsWorkCalendar> list = apsWorkCalendarMapper.selectApsWorkCalendarList(apsWorkCalendar);
+ if (list.isEmpty()) {
+ // 寰幆閬嶅巻褰撴湀鐨勬瘡涓�澶╋紝鑾峰彇鏄熸湡淇℃伅
+ for (int day = 1; day <= daysInMonth; day++) {
+ LocalDate date = LocalDate.of(year, month, day);
+ DayOfWeek dayOfWeek = date.getDayOfWeek();
+ JSONObject dayInfo = new JSONObject();
+ dayInfo.put("date", date.toString());
+ dayInfo.put("dayOfWeek", dayOfWeek.toString());
+ if (dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY) {
+ dayInfo.put("isWorkDay", false);
+ } else {
+ dayInfo.put("isWorkDay", true);
+ }
+ res.add(dayInfo);
+ }
+ }
+ return res;
+ }
+
+ @Override
+ public JSONArray selectCalendarView(ApsWorkCalendar apsWorkCalendar) {
+ JSONArray res = new JSONArray();
+ String[] parts = new SimpleDateFormat("yyyy-MM-dd").format(apsWorkCalendar.getEffectiveDate()).split("-");
+ int year = Integer.parseInt(parts[0]);
+ int month = Integer.parseInt(parts[1]);
+ List<LocalDate> dates = getCalendarData(year, month);
+ apsWorkCalendar.setEffectiveDate(Date.from(dates.get(0).atStartOfDay(ZoneId.systemDefault()).toInstant()));
+ apsWorkCalendar.setExpiringDate(Date.from(dates.get(dates.size()-1).atStartOfDay(ZoneId.systemDefault()).toInstant()));
+ //鐢熸垚鏃ュ巻鍩虹鏁版嵁
+ LinkedHashMap<String, String> baseCalendar = new LinkedHashMap<>();
+ for (LocalDate date : dates) {
+ baseCalendar.put(date+"", "");
+ }
+ try {
+ List<ApsWorkCalendar> list = apsWorkCalendarMapper.selectApsWorkCalendarList(apsWorkCalendar);
+ for (ApsWorkCalendar apsWorkCalendarTemp : list) {
+ //宸ヤ綔鏃�
+ org.postgresql.util.PGobject pgObjectWeekdays = (org.postgresql.util.PGobject) apsWorkCalendarTemp.getContent();
+ JSONArray weekdays = (JSON.parseObject(pgObjectWeekdays.getValue())).getJSONArray("weekdays");
+ HashMap<String, String> weekdaysMap = new HashMap<>();
+ for (int i = 0; i < weekdays.size(); i++) {
+ weekdaysMap.put(weekdays.getJSONObject(i).getString("day"), weekdays.getJSONObject(i).getString("work"));
+ }
+ List<LocalDate> datesTempWeekdays = getDatesBetween(apsWorkCalendarTemp.getEffectiveDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(), apsWorkCalendarTemp.getExpiringDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
+ for (LocalDate dateTemp: datesTempWeekdays) {
+ if(baseCalendar.containsKey(dateTemp+"")){
+ if ("y".equals(weekdaysMap.get(dateTemp.getDayOfWeek().getDisplayName(java.time.format.TextStyle.FULL, Locale.ENGLISH)))) {
+ baseCalendar.put(dateTemp+"", "宸ヤ綔鏃�");
+ } else if("n".equals(weekdaysMap.get(dateTemp.getDayOfWeek().getDisplayName(java.time.format.TextStyle.FULL, Locale.ENGLISH)))) {
+ baseCalendar.put(dateTemp+"", "浼戞伅鏃�");
+ }
+ }
+ }
+ //浼戞伅鏃�
+ org.postgresql.util.PGobject pgObjectHolidays = (org.postgresql.util.PGobject) apsWorkCalendarTemp.getHolidays();
+ if(pgObjectHolidays!=null){
+ JSONArray holidays = (JSON.parseObject(pgObjectHolidays.getValue())).getJSONArray("holidays");
+ for (int i = 0; i < holidays.size(); i++){
+ JSONObject h = holidays.getJSONObject(i);
+ List<LocalDate> datesTempHolidays = getDatesBetween(h.getObject("startdate", LocalDate.class), h.getObject("enddate", LocalDate.class));
+ for (LocalDate dateTemp: datesTempHolidays) {
+ if(baseCalendar.containsKey(dateTemp+"")){
+ baseCalendar.put(dateTemp+"", "鑺傚亣鏃�");
+ }
+ }
+ }
+ }
+ }
+ for (Map.Entry<String, String> entry : baseCalendar.entrySet()) {
+ JSONObject dayInfo = new JSONObject();
+ dayInfo.put("date", entry.getKey());
+ dayInfo.put("type", entry.getValue());
+ res.add(dayInfo);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return res;
+ }
+ return res;
+ }
+
+ @Override
+ public int deleteApsWorkCalendar(ApsWorkCalendar apsWorkCalendar){
+ return apsWorkCalendarMapper.deleteApsWorkCalendar(apsWorkCalendar);
+ }
+
+ private List<LocalDate> getCalendarData(int year, int month) {
+ // 鑾峰彇4鏈�1鍙风殑褰撳懆鐨勫懆鏃�
+ LocalDate startDate = LocalDate.of(year, month, 1)
+ .with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));
+
+ // 鑾峰彇4鏈堢殑鏈�鍚庝竴澶�
+ LocalDate lastDayOfMonth = LocalDate.of(year, month, 1)
+ .with(TemporalAdjusters.lastDayOfMonth());
+
+ // 鑾峰彇4鏈堟渶鍚庝竴澶╃殑褰撳懆鐨勫懆鍏�
+ LocalDate endDate = lastDayOfMonth.with(TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY));
+
+ // 鑾峰彇鏃ユ湡鑼冨洿鍐呯殑鎵�鏈夋棩鏈�
+ List<LocalDate> dates = getDatesBetween(startDate, endDate);
+
+ // 鎵撳嵃缁撴灉
+// for (LocalDate date : dates) {
+// String dayOfWeekChinese = getChineseDayOfWeek(date.getDayOfWeek());
+// String dayOfWeekEnglish = date.getDayOfWeek().getDisplayName(java.time.format.TextStyle.FULL, Locale.ENGLISH);
+// System.out.println(date + " - " + dayOfWeekChinese + " (" + dayOfWeekEnglish + ")");
+// }
+ return dates;
+ }
+
+ private static List<LocalDate> getDatesBetween(LocalDate startDate, LocalDate endDate) {
+ List<LocalDate> dates = new ArrayList<>();
+ for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
+ dates.add(date);
+ }
+ return dates;
+ }
+
+ private static String getChineseDayOfWeek(DayOfWeek dayOfWeek) {
+ switch (dayOfWeek) {
+ case MONDAY:
+ return "鏄熸湡涓�";
+ case TUESDAY:
+ return "鏄熸湡浜�";
+ case WEDNESDAY:
+ return "鏄熸湡涓�";
+ case THURSDAY:
+ return "鏄熸湡鍥�";
+ case FRIDAY:
+ return "鏄熸湡浜�";
+ case SATURDAY:
+ return "鏄熸湡鍏�";
+ case SUNDAY:
+ return "鏄熸湡鏃�";
+ default:
+ return "";
+ }
+ }
+
+ public static void main(String[] args) {
+ // 瀹氫箟鐩爣鏈堜唤鍜屽勾浠�
+ int year = 2025;
+ int month = 4;
+
+ // 鑾峰彇4鏈�1鍙风殑褰撳懆鐨勫懆鏃�
+ LocalDate startDate = LocalDate.of(year, month, 1)
+ .with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));
+
+ // 鑾峰彇4鏈堢殑鏈�鍚庝竴澶�
+ LocalDate lastDayOfMonth = LocalDate.of(year, month, 1)
+ .with(TemporalAdjusters.lastDayOfMonth());
+
+ // 鑾峰彇4鏈堟渶鍚庝竴澶╃殑褰撳懆鐨勫懆鍏�
+ LocalDate endDate = lastDayOfMonth.with(TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY));
+
+ // 鑾峰彇鏃ユ湡鑼冨洿鍐呯殑鎵�鏈夋棩鏈�
+ List<LocalDate> dates = getDatesBetween(startDate, endDate);
+
+ // 鎵撳嵃缁撴灉
+ for (LocalDate date : dates) {
+ String dayOfWeekChinese = getChineseDayOfWeek(date.getDayOfWeek());
+ String dayOfWeekEnglish = date.getDayOfWeek().getDisplayName(java.time.format.TextStyle.FULL, Locale.ENGLISH);
+ System.out.println(date + " - " + dayOfWeekChinese + " (" + dayOfWeekEnglish + ")");
+ }
+ }
}
--
Gitblit v1.9.3