【UPDATE】1.新增或修改日历数据时验证有效日期和失效日期是否重叠 2.增加日历视图页面接口
已修改4个文件
190 ■■■■■ 文件已修改
aps-modules/aps-core/src/main/java/com/aps/core/controller/basicData/ApsWorkCalendarController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/IApsWorkCalendarService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsWorkCalendarServiceImpl.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-core/src/main/resources/mapper/core/ApsWorkCalendarMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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));
    }
}
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);
}
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和expiringDate算出日期范围内的每一天
                    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 + ")");
        }
    }
}
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 &gt;= #{effectiveDate}</if>
            <if test="expiringDate != null "> and expiring_date &lt;= #{expiringDate}</if>
            <if test="effectiveDate != null and expiringDate != null"> and ((effective_date &gt;= #{effectiveDate} and effective_date &lt;= #{expiringDate}) or (expiring_date &gt;= #{effectiveDate} and expiring_date &lt;= #{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>