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<ApsWorkCalendar> 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<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 = JSONArray.parse(pgObjectHolidays.getValue());
|
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 + ")");
|
}
|
}
|
}
|