package cn.huge.module.sy.service; import cn.huge.base.common.exception.ServiceException; import cn.huge.base.common.utils.DateUtils; import cn.huge.base.common.utils.IdUtils; import cn.huge.module.client.api.impl.UtilsClientImpl; import cn.huge.module.sy.dao.mapper.SyHolidayMapper; import cn.huge.module.sy.domain.po.SyHoliday; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.util.*; /** * @title: 节假日日期配置表业务逻辑处理 * @Description 节假日日期配置表业务逻辑处理 * @company hugeinfo * @author liyj * @Time 2025-01-20 10:56:54 * @version 1.0.0 */ @Slf4j @Service @Transactional(rollbackFor = Exception.class) public class SyHolidayService extends ServiceImpl{ @Autowired private SyHolidayMapper mapper; @Autowired private UtilsClientImpl utilsClient; /** * 更新对象 * @param entity 对象 */ public void updateSyHoliday(SyHoliday entity){ try{ mapper.updateSyHoliday(entity); }catch (Exception e){ log.error("[SyHolidayService.updateSyHoliday]调用失败,异常信息:"+e, e); throw new ServiceException("SyHolidayService.updateSyHoliday", e); } } /** * 条件更新对象 * @param entity 对象 * @param terms 条件 */ public void updateSyHolidayTerms(SyHoliday entity, Map terms){ try{ mapper.updateSyHolidayTerms(entity, terms); }catch (Exception e){ log.error("[SyHolidayService.updateSyHolidayTerms]调用失败,异常信息:"+e, e); throw new ServiceException("SyHolidayService.updateSyHolidayTerms", e); } } /** * 根据编号物理删除 * @param id 查询条件集合 */ public void deleteSyHoliday(String id){ try{ mapper.deleteSyHoliday(id); }catch (Exception e){ log.error("[SyHolidayService.deleteSyHoliday]调用失败,异常信息:"+e, e); throw new ServiceException("SyHolidayService.deleteSyHoliday", e); } } /** * 按条件查询 * @param terms 条件 * @return List */ public List listTerms(Map terms){ return mapper.listTerms(terms); } /** * 按条件统计 * @param terms 条件 * @return long */ public long countTerms(Map terms){ return mapper.countTerms(terms); } /** * 按条件分页查询 * @param page 分页对象 * @param terms 条件 * @return Page */ public Page pageQuery(PageRequest page, Map terms){ long total = mapper.countTerms(terms); List content = mapper.pageTerms(page, terms); return new PageImpl(content, page, total); } /** * 新增或更新对象 * @param syHoliday 实体对象 */ public void saveSyHoliday(SyHoliday syHoliday){ try{ Date nowDate = DateUtils.getNowDate(); // 判断是否新增 if (IdUtils.checkNewId(syHoliday.getId())){ syHoliday.setId(utilsClient.getNewTimeId()); syHoliday.setCreateTime(nowDate); } syHoliday.setUpdateTime(nowDate); this.saveOrUpdate(syHoliday); }catch (Exception e){ log.error("[SyHolidayService.saveSyHoliday]调用失败,异常信息:"+e, e); throw new ServiceException("SyHolidayService.saveSyHoliday", e); } } /** * 根据开始日期和需要添加的天数计算到期日期 * 此方法考虑了节假日因素,如果到期日遇到节假日,则向后顺延 * * @param startDate 开始日期 * @param daysToAdd 需要添加的天数 * @return 到期日期 */ public Date getExpiryDay(Date startDate, int daysToAdd){ try{ // 查询指定年份的节假日信息 QueryWrapper syHolidayQueryWrapper = new QueryWrapper<>(); syHolidayQueryWrapper.eq("year_time", DateUtils.getYear(startDate)); SyHoliday syHoliday = this.getOne(syHolidayQueryWrapper); // 如果没有找到节假日信息,则直接添加天数返回 if (syHoliday == null){ return DateUtils.addDay(startDate, daysToAdd); }else{ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf1 = new SimpleDateFormat("HH:mm:ss"); SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 存储节假日日期的集合 Set holidaySet = new HashSet<>(); // 将节假日日期字符串分割为数组并添加到集合中 String[] holidayDates = syHoliday.getHolidayDate().split(","); for (String holidayDate : holidayDates) { holidaySet.add(sdf.parse(holidayDate)); } // 初始化当前日期为开始日期 String currentDateStr = sdf.format(startDate); Date currentDate = sdf.parse(currentDateStr); int daysCounted = 0; // 循环直到添加足够的非节假日天数 while (daysCounted < daysToAdd || holidaySet.contains(currentDate)) { // 如果当前日期不是节假日,则计数加一 if (!holidaySet.contains(currentDate)) { daysCounted++; } currentDate = DateUtils.addDay(currentDate, 1); } // 返回计算后的到期日期 String endDateStr = sdf.format(currentDate) + " " + sdf1.format(startDate); Date endDate = sdf2.parse(endDateStr); return endDate; } }catch (Exception e){ log.error("[SyHolidayService.getExpiryDay]调用失败,异常信息:"+e, e); throw new ServiceException("SyHolidayService.getExpiryDay", e); } } /** * 根据开始日期和需要添加的天数计算到期日期 * 此方法考虑了节假日因素,如果到期日遇到节假日,则向后顺延 * * @param startDate 开始日期 * @param hourToAdd 需要添加的小时 * @return 到期日期 */ public Date getExpiryHour(Date startDate, int hourToAdd){ try{ // 查询指定年份的节假日信息 QueryWrapper syHolidayQueryWrapper = new QueryWrapper<>(); syHolidayQueryWrapper.eq("year_time", DateUtils.getYear(startDate)); SyHoliday syHoliday = this.getOne(syHolidayQueryWrapper); if (syHoliday == null){ return DateUtils.addHour(startDate, hourToAdd); }else{ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 存储节假日日期的集合 Set holidaySet = new HashSet<>(); // 将节假日日期字符串分割为数组并添加到集合中 String[] holidayDates = syHoliday.getHolidayDate().split(","); for (String holidayDate : holidayDates) { holidaySet.add(sdf.parse(holidayDate+" "+"00:00:00")); } // 初始化当前日期为开始日期 Date currentDate = startDate; int hoursCounted = 0; // 循环直到添加足够的非节假日天数 while (hoursCounted < hourToAdd || holidaySet.contains(currentDate)) { // 如果当前日期不是节假日,则计数加一 if (!holidaySet.contains(currentDate)) { hoursCounted++; } currentDate = DateUtils.addHour(currentDate, 1); } // 返回计算后的到期日期 String endDateStr = sdf.format(currentDate); Date endDate = currentDate; return endDate; } }catch (Exception e){ log.error("[SyHolidayService.getExpiryHour]调用失败,异常信息:"+e, e); throw new ServiceException("SyHolidayService.getExpiryHour", e); } } }