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));
}
}
用的几个实体类很简单,自己看下代码就能写