节假日工具类

该项目面临的问题是节假日API不稳定,导致效率降低。解决方案是将节假日数据存储到数据库中并定期更新,通过定时任务每年执行一次。主要涉及的功能包括判断是否为节假日、计算工作日后日期,并实现了接口调用工具类、数据库操作以及定时任务。此外,还提供了接口供外部查询和插入节假日数据。

节假日工具类

当前项目有个需求:合作伙伴下采购订单,我们把货品放入仓库,如果伙伴选择的提货方式是自提,经过5工作日后,如果合作伙伴没有自提,我们需要提醒合作伙伴来仓库提货,如果七个工作日后,合作伙伴还没有自提,就把伙伴下单的货品状态变更为报废。

原来项目中有判断节假日的方法,但节假日API已经过期,因此重新在网上找了个API:API测试
在这里插入图片描述

但找到的API不稳定,有时会需要六七秒钟,所以把节假日存到数据库中,由自己维护,下次需要查询只要从数据库查就行。

添加节假日的定时任务一年执行一次即可。

判断是否是节假日及获取指定几个工作日后日期

/**
     * 是否节假日  0 工作日  1 周末  2法定假日
     * @param date
     * @return
     */
public static Integer isHoliday(String date) throws Exception{
    String httpUrl = "http://timor.tech/api/holiday/info/"+date;

    HttpClientResult httpClientResult = null;
    httpClientResult = HttpsUtil.doGet1(httpUrl,null,10000);
    HolidaysDTO dateInfoDTO = JSON.parseObject(httpClientResult.getContent(), HolidaysDTO.class);
    HolidaysDTO.Type type = dateInfoDTO.getType();
    return type.getType();
}
/**
     *  当前时间往后推day个工作日
     * @param date
     * @param day
     * @return day个工作日后的日期
     */
public static Date pushBackDateDay(Date date,int day) throws Exception{

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    int count = 0;
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date);
    while( count <= day){
        calendar1.add(Calendar.DAY_OF_YEAR, 1);
        String format1 = dateFormat.format(calendar1.getTime());
        Integer holiday1 = HolidayUtil.isHoliday(format1);
        if (holiday1 == 0){
            count ++;
        }
    }
    return calendar1.getTime();
}

请求API工具类:HttpsUtil

public class HttpsUtil {

    /**
 * 指定超时时间,用于请求节假日API
 * @param url    请求地址
 * @param params 请求参数集合
 * @param timeOut 指定超时时间
 * @return
 * @throws Exception
 */
    public static HttpClientResult doGet1(String url, Map<String, String> params,int timeOut) throws Exception {
        return doGet1(url, null, params,timeOut);
    }

    public static HttpClientResult doGet1(String url, Map<String, String> headers, Map<String, String> params,int timeOut) throws Exception {
        // 创建httpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        // 创建访问的地址
        URIBuilder uriBuilder = new URIBuilder(url);
        if (params != null) {
            Set<Entry<String, String>> entrySet = params.entrySet();
            for (Entry<String, String> entry : entrySet) {
                uriBuilder.addParameter(entry.getKey(), entry.getValue());
            }
        }
        HttpGet httpGet = new HttpGet(uriBuilder.build());
        /**
         * setConnectTimeout:设置连接超时时间,单位毫秒。
         * setSocketTimeout:请求获取数据的超时时间(即响应时间),单位毫秒。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用。
         */
        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeOut).setSocketTimeout(timeOut).build();
        httpGet.setConfig(requestConfig);
        // 设置请求头
        packageHeader(headers, httpGet);
        // 创建httpResponse对象
        CloseableHttpResponse httpResponse = null;
        try {
            // 执行请求并获得响应结果
            return getHttpClientResult(httpResponse, httpClient, httpGet);
        } finally {
            release(httpResponse, httpClient);// 释放资源
        }
    }
}

把当前年份的节假日存入数据库

建表SQL:

create table holiday_date
(
	id int,
	holiday varchar(50) null,
	gmt_create datetime null
)
comment '假节日表,只存节假日日期';

create unique index holiday_date_holiday_uindex
	on holiday_date (holiday);

create unique index holiday_date_id_uindex
	on holiday_date (id);

alter table holiday_date modify id int auto_increment;

HolidayDateDO

@Data
public class HolidayDateDO {
    private int id;
    private String holiday;
    private String gmtCreate;
}

HolidayDateDAO

public interface HolidayDateDAO {
    //查询记录数
    Integer queryHoliday(String holiday);

    Integer insert(HolidayDateDO holidayDateDO);
}

HolidayDateManager

@Component
public class HolidayDateManager {

    @Resource
    private HolidayDateDAO holidayDateDAO;

    public Integer queryHoliday(String holiday){
        Integer cnt = holidayDateDAO.queryHoliday(holiday);
        return cnt;
    }

    public Integer insert(HolidayDateDO holidayDateDO) {
        Integer cnt = holidayDateDAO.insert(holidayDateDO);
        return cnt;
    }

}

HolidayDateMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.songshu.snt.plan.dao.plan.HolidayDateDAO">

    <select id="queryHoliday" parameterType="String" resultType="Integer">
        select count(1) from holiday_date where HOLIDAY = #{holiday}
    </select>

    <insert id="insert" parameterType="com.songshu.snt.plan.entity.plan.HolidayDateDO">
           insert into holiday_date(HOLIDAY,GMT_CREATE) values (#{holiday},#{gmtCreate})
    </insert>
</mapper>

HolidayDateService

public interface HolidayDateService {

    //查询记录数
    Integer queryHoliday(String holiday);

    Integer insert() throws Exception;
}

HolidayDateServiceImpl

@Service
public class HolidayDateServiceImpl implements HolidayDateService {

    @Resource
    private HolidayDateManager holidayDateManager;

    @Autowired
    private HolidayDateServiceImpl holidayDateService;


    @Override
    public Integer queryHoliday(String holiday) {
        Integer cnt = holidayDateManager.queryHoliday(holiday);
        return cnt;
    }

    @Override
    public Integer insert() throws Exception {
        //当前年份执行
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        holidayDateService.OneYearHoliday(year);
        return -1;
    }
    /**
     * 插入一年的节假日
     * @param year 年份
     */
    public void OneYearHoliday(int year) throws Exception {
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        //得到今年天数
        int days = 365;
        if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
            days = 366;
        }
        //循环今年天数,为节假日就添加到数据库
        for (int i = 1; i <= days; i++) {
            calendar.set(Calendar.DAY_OF_YEAR,i);
            Date date = calendar.getTime();
            String format = sdf1.format(date);
            if (HolidayUtil.isHoliday(format) != 0 ){
                HolidayDateDO holidayDateDO = new HolidayDateDO();
                holidayDateDO.setHoliday(format);
                holidayDateDO.setGmtCreate(sdf1.format(new Date()));
                holidayDateManager.insert(holidayDateDO);
            }
        }
    }
}

定时任务执行插入节假日

@JobHandler(value = "holidayDateJob")
@Component
@Slf4j
public class HolidayDateJob extends IJobHandler {

    @Autowired
    private HolidayDateService holidayDateService;

    @Override
    public ReturnT<String> execute(String param) throws Exception {
        log.info("holidayDateJob start");
        holidayDateService.insert();
        log.info("holidayDateJob end");
        return ReturnT.SUCCESS;
    }
}

或者请求接口执行插入节假日:

@Autowired
private HolidayDateService holidayDateService;

@GetMapping("/query/{holiday}")
public SntResult<Integer> queryHoliday(@PathVariable String holiday){
    Integer cnt = holidayDateService.queryHoliday(holiday);
    return  SntResult.ok(cnt);
}

@GetMapping("/insert")
public SntResult<Integer> insert() throws Exception{
    Integer cnt = holidayDateService.insert();
    return  SntResult.ok(cnt);
}

执行部分效果:

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万里顾—程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值