查询国家法定假日,任务提醒,跳过法定假日和周末时间,但不跳过法定工作日,具体service实现类

package com.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.bean.Holiday;
import com.bean.HolidayEntity;
import com.bean.TblNoticeTimeTask;
import com.mapper.HolidayMapper;
import com.mapper.TblNoticeTimeTaskMapper;
import com.service.TblNoticeTimeTaskService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@Service
@Slf4j
public class TblNoticeTimeTaskServiceImpl implements TblNoticeTimeTaskService {

    @Autowired
    private TblNoticeTimeTaskMapper noticeTimeTaskMapper;

    @Autowired
    private HolidayMapper holidayMapper;

    @Override
    public List<TblNoticeTimeTask> list() {
        return noticeTimeTaskMapper.selectList(Wrappers.lambdaQuery(TblNoticeTimeTask.class));
    }

    @Override
    public List<TblNoticeTimeTask> getNoCreate() {
        List<TblNoticeTimeTask> noCreate = noticeTimeTaskMapper.getNoCreate();
        List<Holiday> holiday = getHoliday();
        Map<Boolean, List<Holiday>> collect = holiday.stream().collect(Collectors.groupingBy(Holiday::getHoliday));
        List<String> holidays = collect.get(true).stream().map(Holiday::getDate).collect(Collectors.toList());
        List<String> work = collect.get(false).stream().map(Holiday::getDate).collect(Collectors.toList());
        for (TblNoticeTimeTask tblNoticeTimeTask : noCreate) {
            LocalDateTime createTime = tblNoticeTimeTask.getCreateTime();
            Long time = tblNoticeTimeTask.getTime();
            List<HolidayEntity> dateList = CollUtil.newLinkedList();
            for (int i = 0; i <= time; i++) {
                LocalDateTime lastDate = LocalDateTimeUtil.offset(createTime, i, ChronoUnit.DAYS);
                dateList.add(HolidayEntity.builder().date(lastDate).state(0).build());
            }
            // 如果是法定假日,就多数一天
            // 如果是周末,但是是法定工作日,就不变
            // 如果是周末,不是法定工作日,就多数一天
            List<HolidayEntity> allDate = getAllDate(dateList, holidays, work);
            HolidayEntity end = allDate.get(allDate.size() - 1);
            tblNoticeTimeTask.setEndTime(end.getDate());
            noticeTimeTaskMapper.insert(tblNoticeTimeTask);
        }
        return noCreate;
    }

    /**
     * 递归得到正确的最后时间
     *
     * @param holidayEntityList 时间List
     * @param holiday           法定假期
     * @param workday           法定工作日
     * @return 时间集合
     */
    public List<HolidayEntity> getAllDate(List<HolidayEntity> holidayEntityList, List<String> holiday, List<String> workday) {
        // 用于暂时接收因假日新添加的时间
        List<HolidayEntity> temp = CollUtil.newArrayList();
        LocalDateTime lastDay = holidayEntityList.get(holidayEntityList.size() - 1).getDate();
        for (HolidayEntity time : holidayEntityList) {
            if (time.getState() == 0) {
                String string = time.getDate().toLocalDate().toString();
                if (holiday.contains(string)) {
                    // 如果有法定假日,就从后边多加一天
                    log.info(string + "是节假日,+1天");
                    LocalDateTime offset = LocalDateTimeUtil.offset(lastDay, 1, ChronoUnit.DAYS);
                    // 多添加一天
                    temp.add(HolidayEntity.builder().date(offset).state(0).build());
                    // 修改最后一天时间
                    lastDay = offset;
                    time.setState(1);
                    continue;
                }
                if (time.getDate().getDayOfWeek().getValue() == 6 || time.getDate().getDayOfWeek().getValue() == 7) {
                    // 如果是周末但是法定工作日,就不跳过
                    if (workday.contains(string)) {
                        log.info(string + "是工作日,不变");
                        time.setState(1);
                        continue;
                    }
                    // 周末跳过
                    LocalDateTime offset = LocalDateTimeUtil.offset(lastDay, 1, ChronoUnit.DAYS);
                    // 多添加一天
                    temp.add(HolidayEntity.builder().date(offset).state(0).build());
                    // 修改最后一天时间
                    lastDay = offset;
                    log.info(string + "是周末,+1天");
                }
            }
            time.setState(1);
        }
        // 如果没有法定工作日了就跳出递归
        if (CollUtil.isEmpty(temp)) {
            return holidayEntityList;
        }
        // 把新添加的时间加入到总体集合
        holidayEntityList.addAll(temp);
        // 对有新时间假日的集合重新洗牌
        return getAllDate(holidayEntityList, holiday, workday);
    }

    @Override
    public void addHoliday() {
        List<Holiday> jjr = getJjr(2023);
        for (Holiday holiday : jjr) {
            holidayMapper.insert(holiday);
        }
    }

    /**
     * 获取节假日不含周末------获取指定月份
     *
     * @param year 例如:2022
     * @return
     */
    private List<Holiday> getJjr(int year) {
        HashMap<String, Object> newHashMap = MapUtil.newHashMap();
        String rsa = HttpUtil.get("http://timor.tech/api/holiday/year", newHashMap);
        JSONObject map = JSONUtil.parseObj(rsa);
        String holidayStr = map.getStr("holiday");
        Map<String, JSONObject> map1 = JSONUtil.toBean(holidayStr, Map.class);
        Set<String> set = map1.keySet();
        List<Holiday> list = CollUtil.newArrayList();
        for (String str : set) {
            JSONObject jsonObject = map1.get(str);
            Holiday holiday = JSONUtil.toBean(jsonObject, Holiday.class);
            list.add(holiday);
        }
        return list;
    }

    public List<Holiday> getHoliday() {
        return holidayMapper.selectList(Wrappers.lambdaQuery(Holiday.class));
    }

}

用的几个实体类很简单,自己看下代码就能写

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值