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; import com.aps.core.mapper.ApsWorkCalendarMapper; import com.aps.core.service.IApsWorkCalendarService; 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.time.ZoneId; import java.time.temporal.TemporalAdjusters; import java.util.*; /** * 日历管理Service业务层处理 * * @author hjy * @date 2025-04-22 */ @Service public class ApsWorkCalendarServiceImpl implements IApsWorkCalendarService { @Autowired private ApsWorkCalendarMapper apsWorkCalendarMapper; /** * 查询日历管理 * * @param id 日历管理主键 * @return 日历管理 */ @Override public ApsWorkCalendar selectApsWorkCalendarById(Long id) { return apsWorkCalendarMapper.selectApsWorkCalendarById(id); } /** * 查询日历管理列表 * * @param apsWorkCalendar 日历管理 * @return 日历管理 */ @Override public List selectApsWorkCalendarList(ApsWorkCalendar apsWorkCalendar) { return apsWorkCalendarMapper.selectApsWorkCalendarList(apsWorkCalendar); } /** * 新增日历管理 * * @param apsWorkCalendar 日历管理 * @return 结果 */ @Override public int insertApsWorkCalendar(ApsWorkCalendar apsWorkCalendar) { apsWorkCalendar.setCreateTime(DateUtils.getNowDate()); apsWorkCalendar.setCreateBy(SecurityUtils.getUsername()); return apsWorkCalendarMapper.insertApsWorkCalendar(apsWorkCalendar); } /** * 修改日历管理 * * @param apsWorkCalendar 日历管理 * @return 结果 */ @Override public int updateApsWorkCalendar(ApsWorkCalendar apsWorkCalendar) { apsWorkCalendar.setUpdateTime(DateUtils.getNowDate()); apsWorkCalendar.setUpdateBy(SecurityUtils.getUsername()); return apsWorkCalendarMapper.updateApsWorkCalendar(apsWorkCalendar); } /** * 批量删除日历管理 * * @param ids 需要删除的日历管理主键 * @return 结果 */ @Override public int deleteApsWorkCalendarByIds(Long[] ids) { return apsWorkCalendarMapper.deleteApsWorkCalendarByIds(ids); } /** * 删除日历管理信息 * * @param id 日历管理主键 * @return 结果 */ @Override public int deleteApsWorkCalendarById(Long id) { 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 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 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 baseCalendar = new LinkedHashMap<>(); for (LocalDate date : dates) { baseCalendar.put(date+"", ""); } try { List 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 weekdaysMap = new HashMap<>(); for (int i = 0; i < weekdays.size(); i++) { weekdaysMap.put(weekdays.getJSONObject(i).getString("day"), weekdays.getJSONObject(i).getString("work")); } List 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 = JSONArray.parse(pgObjectHolidays.getValue()); for (int i = 0; i < holidays.size(); i++){ JSONObject h = holidays.getJSONObject(i); List 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 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 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 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 getDatesBetween(LocalDate startDate, LocalDate endDate) { List 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 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 + ")"); } } }