| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- package com.xjrsoft.module.holiday.service.impl;
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONArray;
- import com.alibaba.fastjson.JSONObject;
- import com.baomidou.mybatisplus.core.toolkit.Wrappers;
- import com.github.yulichang.base.MPJBaseServiceImpl;
- import com.xjrsoft.common.exception.MyException;
- import com.xjrsoft.common.utils.DateUtils;
- import com.xjrsoft.common.utils.HolidayUtil;
- import com.xjrsoft.module.holiday.dto.AddHolidayDateDto;
- import com.xjrsoft.module.holiday.entity.HolidayDate;
- import com.xjrsoft.module.holiday.mapper.HolidayDateMapper;
- import com.xjrsoft.module.holiday.service.IHolidayDateService;
- import com.xjrsoft.module.holiday.vo.AlmanacVo;
- import lombok.AllArgsConstructor;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.time.LocalDateTime;
- import java.time.format.DateTimeFormatter;
- import java.util.*;
- import java.util.stream.Collectors;
- /**
- * @title:
- * @Author fanxp
- * @Date: 2024-03-26
- * @Version 1.0
- */
- @Service
- @AllArgsConstructor
- public class HolidayDateServiceImpl extends MPJBaseServiceImpl<HolidayDateMapper, HolidayDate> implements IHolidayDateService {
- private final HolidayDateMapper holidayDateMapper;
- /**
- * 当前时间是否休息
- */
- public Boolean currentIsRest() {
- LocalDateTime now = LocalDateTime.now();
- String day = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
- Long count = holidayDateMapper.selectCount(Wrappers.<HolidayDate>query().lambda()
- .eq(HolidayDate::getDate, day)
- .eq(HolidayDate::getStatus,3)
- );
- return count > 0;
- }
- /**
- * 添加数据
- *
- * @param dto
- * @return
- */
- @Transactional(rollbackFor = Exception.class)
- public Boolean add(AddHolidayDateDto dto) throws ParseException {
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
- Date start = sdf.parse(dto.getStartDate());
- Date end = sdf.parse(dto.getEndDate());
- if (start.compareTo(end) > 0) {
- throw new MyException("开始时间不能大于结束时间!");
- }
- while (start.compareTo(end) <= 0) {
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(start);
- HolidayDate param = HolidayDate.builder()
- .date(sdf.format(start))
- .way(2)
- .year(calendar.get(Calendar.YEAR))
- .month(calendar.get(Calendar.MONTH) + 1)
- .day(calendar.get(Calendar.DATE))
- .status(dto.getStatus())
- .build();
- holidayDateMapper.insert(param);
- start = DateUtils.addDateDays(start, 1);
- }
- return true;
- }
- /**
- * 删除数据
- *
- * @param ids
- * @return
- */
- @Transactional(rollbackFor = Exception.class)
- public Boolean delete(List<Long> ids) {
- List<HolidayDate> holidayDates = holidayDateMapper.selectBatchIds(ids);
- for (HolidayDate h : holidayDates) {
- // 用户数据直接删除,系统数据添加标识
- if (h.getWay() == 1) {
- h.setDeleteStatus(1);
- holidayDateMapper.updateById(h);
- } else {
- holidayDateMapper.deleteById(h.getId());
- }
- }
- return true;
- }
- /**
- * 初始化节假日
- *
- * @param year
- * @return
- */
- @Transactional(rollbackFor = Exception.class)
- public Boolean initHoliday(int year) {
- List<HolidayDate> allList = new ArrayList<>();
- for (int month = 1; month < 13; month++) {
- List<HolidayDate> monthList = getYearMonthHoliday(year, month);
- allList.addAll(monthList);
- }
- // List<HolidayDate> monthList = getYearMonthHoliday(year - 1, 12);
- // allList.addAll(monthList);
- Map<String, HolidayDate> mData = allList.stream().collect(Collectors.toMap(HolidayDate::getDate, item -> item));
- // 获取用户数据
- List<HolidayDate> userDates = holidayDateMapper.selectList(Wrappers.<HolidayDate>query().lambda().eq(HolidayDate::getYear, year).eq(HolidayDate::getWay, 2));
- for (HolidayDate uh : userDates) {
- mData.keySet().removeIf(key -> Objects.equals(key, uh.getDate()));
- }
- // 清除系统数据
- holidayDateMapper.delete(Wrappers.<HolidayDate>query().lambda().eq(HolidayDate::getYear, year).eq(HolidayDate::getWay, 1));
- // 保存系统数据
- for (Map.Entry<String, HolidayDate> entry : mData.entrySet()) {
- holidayDateMapper.insert(entry.getValue());
- }
- return true;
- }
- /**
- * Init month list.
- * 按月爬取节假日
- *
- * @param year the year
- * @param month the month
- * @return the list
- */
- public static List<HolidayDate> getYearMonthHoliday(int year, int month) {
- List<HolidayDate> holidayDateList = new ArrayList<>();
- try {
- String result = HolidayUtil.getMonth(year + "", month + "");
- JSONObject json = JSON.parseObject(result);
- System.out.println(result);
- JSONArray data = json.getJSONArray("data");
- JSONObject dataObj = JSON.parseObject(data.get(0).toString());
- List<AlmanacVo> almanacs = JSONArray.parseArray(dataObj.getString("almanac"), AlmanacVo.class);
- for (AlmanacVo almanac : almanacs) {
- if (almanac.getMonth().equals(String.valueOf(month)) && almanac.getStatus() != null) {
- HolidayDate date = HolidayDate.builder()
- .year(year).month(month).day(Integer.parseInt(almanac.getDay()))
- .date(DateUtils.format(new Date(year - 1900, month - 1, Integer.parseInt(almanac.getDay())), "yyyy-MM-dd"))
- .build();
- String status = almanac.getStatus();
- if (status.equals("1")) {
- date.setStatus(3);
- } else if (status.equals("2")) {
- date.setStatus(2);
- }
- holidayDateList.add(date);
- }
- }
- } catch (ClassCastException classCastException) {
- throw new MyException("可能是当前月份(" + month + "月)没有节日");
- } catch (Exception e) {
- throw new MyException(e.getMessage());
- }
- return holidayDateList;
- }
- }
|