日历-区分节假日
@Override public void initHoliday(HolidayDTO param) throws Exception { LocalDate startOfYear = param.getYear().atDay(1); LocalDate endOfYear = param.getYear().plusYears(1).atDay(1); LocalDate currentDate = startOfYear; List<HolidayDate> holidayDateList = new ArrayList<>(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); while (!currentDate.isAfter(endOfYear)) { HolidayDate holidayDate = new HolidayDate(); holidayDate.setYear(currentDate.getYear()); holidayDate.setMonth(currentDate.getMonthValue()); holidayDate.setDay(currentDate.getDayOfMonth()); holidayDate.setDate(currentDate.format(formatter)); holidayDate.setStatus(0); holidayDateList.add(holidayDate); currentDate = currentDate.plusDays(1); } /** * enum(0, 1, 2, 3), // 节假日类型,分别表示 工作日、周末、节日、调休。 参考https://timor.tech/api/holiday/ */ String url = "https://timor.tech/api/holiday/year/" + param.getYear() + "?type=Y&week=Y"; Map<String, Object> paramMap = new HashMap<>(); paramMap.put("type", "Y"); paramMap.put("week", "Y"); JSONObject jsonObject = HttpUtil.doGetJSON(url, paramMap); if (ObjectUtils.isEmpty(jsonObject)) { return; } HolidayDataDTO holidayDataDTO = jsonObject.toJavaObject(HolidayDataDTO.class); if (ObjectUtils.isEmpty(holidayDataDTO)) { return; } for (HolidayDate holidayDate : holidayDateList) { HolidayDataDTO.HolidayType holidayType = holidayDataDTO.getType().get(holidayDate.getDate()); if (ObjectUtils.isEmpty(holidayType)) { continue; } /** * 0普通工作日1周末2需要补班的工作日3法定节假日4调休节假日 */ if (holidayType.getType().equals(0)) { continue; } if (holidayType.getType().equals(1)) { holidayDate.setStatus(HolidayDateEnum.WEEKEND.getCode()); } if (holidayType.getType().equals(2)) { holidayDate.setStatus(HolidayDateEnum.LEGAL_HOLIDAY.getCode()); } if (holidayType.getType().equals(3)) { holidayDate.setStatus(HolidayDateEnum.NEED_MAKE_UP_DAY.getCode()); } /** * 一、元旦:1月1日 * 二、春节:1月28、29、30日 * 三、清明节:4月4日 * 四、劳动节:5月1日 * 五、端午节:5月31日 * 六、国庆节、中秋节:10月1、2、3日 */ //调休节假日手动更改 } deleteByYear(param); this.saveBatch(holidayDateList); } /** * 删除 * @param param */ private void deleteByYear(HolidayDTO param) { LambdaQueryWrapper<HolidayDate> wrapper = new LambdaQueryWrapper<HolidayDate>(); wrapper.eq(HolidayDate::getYear, param.getYear()); this.remove(wrapper); }
CREATE TABLE `holiday_date` ( `date` varchar(20) NOT NULL COMMENT '日期yyyy-MM-dd', `year` int(4) NOT NULL, `month` int(2) NOT NULL, `day` int(2) NOT NULL, `status` int(2) DEFAULT '0' COMMENT '0普通工作日1周末2需要补班的工作日3法定节假日4调休节假日', PRIMARY KEY (`date`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='日期类型';