From bec1e27df1cce02f0a4b9aa19a2fc50f4551fb64 Mon Sep 17 00:00:00 2001 From: huangjiayang <5265313@qq.com> Date: 星期日, 27 四月 2025 15:00:28 +0800 Subject: [PATCH] 【UPDATE】1.新增或修改日历数据时验证有效日期和失效日期是否重叠 2.增加日历视图页面接口 --- aps-modules/aps-core/src/main/java/com/aps/core/controller/basicData/ApsWorkCalendarController.java | 29 ++++++ aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsWorkCalendarServiceImpl.java | 151 +++++++++++++++++++++++++++++++++++++ aps-modules/aps-core/src/main/resources/mapper/core/ApsWorkCalendarMapper.xml | 3 aps-modules/aps-core/src/main/java/com/aps/core/service/IApsWorkCalendarService.java | 7 + 4 files changed, 185 insertions(+), 5 deletions(-) diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/controller/basicData/ApsWorkCalendarController.java b/aps-modules/aps-core/src/main/java/com/aps/core/controller/basicData/ApsWorkCalendarController.java index 88f8355..0e84a40 100644 --- a/aps-modules/aps-core/src/main/java/com/aps/core/controller/basicData/ApsWorkCalendarController.java +++ b/aps-modules/aps-core/src/main/java/com/aps/core/controller/basicData/ApsWorkCalendarController.java @@ -71,7 +71,16 @@ @PostMapping public AjaxResult add(@RequestBody ApsWorkCalendar apsWorkCalendar) { - return toAjax(apsWorkCalendarService.insertApsWorkCalendar(apsWorkCalendar)); + ApsWorkCalendar tempCheck = new ApsWorkCalendar(); + tempCheck.setEffectiveDate(apsWorkCalendar.getEffectiveDate()); + tempCheck.setExpiringDate(apsWorkCalendar.getExpiringDate()); + tempCheck.setApplicableFactory(apsWorkCalendar.getApplicableFactory()); + List<ApsWorkCalendar> list = apsWorkCalendarService.selectApsWorkCalendarList(tempCheck); + if(!list.isEmpty()){ + return AjaxResult.error("璇ユ椂闂存鏃ュ巻宸插瓨鍦�", list); + }else{ + return toAjax(apsWorkCalendarService.insertApsWorkCalendar(apsWorkCalendar)); + } } /** @@ -82,7 +91,16 @@ @PutMapping public AjaxResult edit(@RequestBody ApsWorkCalendar apsWorkCalendar) { - return toAjax(apsWorkCalendarService.updateApsWorkCalendar(apsWorkCalendar)); + ApsWorkCalendar tempCheck = new ApsWorkCalendar(); + tempCheck.setEffectiveDate(apsWorkCalendar.getEffectiveDate()); + tempCheck.setExpiringDate(apsWorkCalendar.getExpiringDate()); + tempCheck.setApplicableFactory(apsWorkCalendar.getApplicableFactory()); + List<ApsWorkCalendar> list = apsWorkCalendarService.selectApsWorkCalendarList(tempCheck); + if(!list.isEmpty()){ + return AjaxResult.error("璇ユ椂闂存鏃ュ巻宸插瓨鍦�", list); + }else{ + return toAjax(apsWorkCalendarService.updateApsWorkCalendar(apsWorkCalendar)); + } } /** @@ -106,4 +124,11 @@ List<ApsWorkCalendar> list = apsWorkCalendarService.selectApsWorkCalendarList(apsWorkCalendar); return AjaxResult.success(list); } + + @Log(title = "鏌ヨ鏃ュ巻瑙嗗浘鏁版嵁", businessType = BusinessType.INSERT) + @PostMapping("/selectCalendarView") + public AjaxResult selectCalendarView(@RequestBody ApsWorkCalendar apsWorkCalendar) + { + return AjaxResult.success(apsWorkCalendarService.selectCalendarView(apsWorkCalendar)); + } } diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/service/IApsWorkCalendarService.java b/aps-modules/aps-core/src/main/java/com/aps/core/service/IApsWorkCalendarService.java index 65e0b50..95d639f 100644 --- a/aps-modules/aps-core/src/main/java/com/aps/core/service/IApsWorkCalendarService.java +++ b/aps-modules/aps-core/src/main/java/com/aps/core/service/IApsWorkCalendarService.java @@ -68,4 +68,11 @@ * @return */ public JSONArray getWorkCalendar(String applicableFactory, String datetime); + + /** + * 鑾峰彇鏃ュ巻瑙嗗浘鏁版嵁 + * @param apsWorkCalendar + * @return JSONArray + */ + JSONArray selectCalendarView(ApsWorkCalendar apsWorkCalendar); } 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 758a32c..a88f928 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,6 @@ 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; @@ -10,10 +11,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.text.SimpleDateFormat; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.YearMonth; -import java.util.List; +import java.time.ZoneId; +import java.time.temporal.TemporalAdjusters; +import java.util.*; /** * 鏃ュ巻绠$悊Service涓氬姟灞傚鐞� @@ -135,4 +139,149 @@ } 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) { + String dayOfWeekChinese = getChineseDayOfWeek(date.getDayOfWeek()); + String dayOfWeekEnglish = date.getDayOfWeek().getDisplayName(java.time.format.TextStyle.FULL, Locale.ENGLISH); + System.out.println(date + " - " + dayOfWeekChinese + " (" + dayOfWeekEnglish + ")"); + baseCalendar.put(date+"", ""); + } + try { + List<ApsWorkCalendar> list = apsWorkCalendarMapper.selectApsWorkCalendarList(apsWorkCalendar); + for (ApsWorkCalendar apsWorkCalendarTemp : list) { + //宸ヤ綔鏃� + if("1".equals(apsWorkCalendarTemp.getType())){ + //鑾峰彇鏃ュ巻瑙勫垯 + org.postgresql.util.PGobject pgObject = (org.postgresql.util.PGobject) apsWorkCalendarTemp.getContent(); + JSONArray weekdays = (JSON.parseObject(pgObject.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")); + } + //鏍规嵁effectiveDate鍜宔xpiringDate绠楀嚭鏃ユ湡鑼冨洿鍐呯殑姣忎竴澶� + List<LocalDate> datesTemp = getDatesBetween(apsWorkCalendarTemp.getEffectiveDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(), apsWorkCalendarTemp.getExpiringDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); + for (LocalDate dateTemp: datesTemp) { + 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+"", "浼戞伅鏃�"); + } + } + } + }else if("2".equals(apsWorkCalendarTemp.getType())){ + //浼戞伅鏃� + org.postgresql.util.PGobject pgObject = (org.postgresql.util.PGobject) apsWorkCalendarTemp.getContent(); + JSONObject holidays = (JSON.parseObject(pgObject.getValue())).getJSONObject("holidays"); + List<LocalDate> datesTemp = getDatesBetween(holidays.getObject("startdate", LocalDate.class), holidays.getObject("enddate", LocalDate.class)); + for (LocalDate dateTemp: datesTemp) { + 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; + } + + 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 + ")"); + } + } } diff --git a/aps-modules/aps-core/src/main/resources/mapper/core/ApsWorkCalendarMapper.xml b/aps-modules/aps-core/src/main/resources/mapper/core/ApsWorkCalendarMapper.xml index 1552fe3..b0b0b98 100644 --- a/aps-modules/aps-core/src/main/resources/mapper/core/ApsWorkCalendarMapper.xml +++ b/aps-modules/aps-core/src/main/resources/mapper/core/ApsWorkCalendarMapper.xml @@ -29,8 +29,7 @@ <where> <if test="description != null and description != ''"> and description like '%' || #{description} || '%'</if> <if test="type != null and type != ''"> and type = #{type}</if> - <if test="effectiveDate != null "> and effective_date >= #{effectiveDate}</if> - <if test="expiringDate != null "> and expiring_date <= #{expiringDate}</if> + <if test="effectiveDate != null and expiringDate != null"> and ((effective_date >= #{effectiveDate} and effective_date <= #{expiringDate}) or (expiring_date >= #{effectiveDate} and expiring_date <= #{expiringDate}))</if> <if test="content != null and content != ''"> and content = #{content}</if> <if test="applicableFactory != null and applicableFactory != ''"> and applicable_factory = #{applicableFactory}</if> <if test="applicableWorkshop != null and applicableWorkshop != ''"> and applicable_workshop = #{applicableWorkshop}</if> -- Gitblit v1.9.3