湛江免費(fèi)建站模板短視頻剪輯培訓(xùn)班多少錢
文章目錄
- 一、建表:activity_holiday_info
- 二、java代碼
- 1、ActivitityHolidayController.java
- 2、ActivityHolidayInfoService.java
- 3、ActivityHolidayInfoServiceImpl.java
- 三、測(cè)試效果
有些場(chǎng)景需要計(jì)算數(shù)據(jù)非工作日的情況,eg:統(tǒng)計(jì)每個(gè)人每月工作日簽到情況等,就需要去除法定節(jié)假日和工作日,可以新建一個(gè)表用來(lái)存儲(chǔ)和維護(hù)這些非工作日。
一、建表:activity_holiday_info
CREATE TABLE `activity_holiday_info` (`holiday_id` int NOT NULL AUTO_INCREMENT,`holiday_name` varchar(20) DEFAULT NULL COMMENT '節(jié)假日名稱',`holiday_time` date DEFAULT NULL COMMENT '節(jié)假日時(shí)間',`remark` varchar(50) DEFAULT NULL COMMENT '備注',PRIMARY KEY (`holiday_id`)
) ENGINE=InnoDB COMMENT='節(jié)假日';
二、java代碼
- 可以先按照年月初始化周末數(shù)據(jù)入庫(kù) initHolidays();
- 按照年份查詢已錄入系統(tǒng)的非工作日給前端,標(biāo)記在日歷📅中回顯展示,供運(yùn)營(yíng)人員查看和修改 queryHolidays()。
- 特殊節(jié)假日帶官方發(fā)布該年份后,人工從前端日歷控件去修改維護(hù) mergeHolidays()。
1、ActivitityHolidayController.java
/*** @author qy* 非工作日維護(hù)*/
@RestController
@RequestMapping("/holidays")
@Slf4j
@Api(tags = "非工作日維護(hù)")
public class ActivitityHolidayController {@Autowiredprivate ActivityHolidayInfoService activityHolidayInfoService;/*** 非工作日維護(hù),周六周日按年份需初始化,特殊、節(jié)假日頁(yè)面維護(hù)*/@ApiOperation(value = "按年份初始化周末")@GetMapping(value = "/{year}/initDate")@ApiImplicitParams({@ApiImplicitParam(name = "year", dataType = "String", paramType = "path")})public Result<Boolean> initHolidays(@PathVariable String year) {activityHolidayInfoService.initHolidays(year);return Result.success(Boolean.TRUE);}/*** 查詢已錄入系統(tǒng)的非工作日給前端,標(biāo)記在日歷📅中展示。*/@ApiOperation(value = "查詢已錄入系統(tǒng)的非工作日")@GetMapping(value = "/{year}/list")@ApiImplicitParams({@ApiImplicitParam(name = "year", dataType = "String", paramType = "path")})public Result<List<ActivityHolidayInfo>> queryHolidays(@PathVariable String year) {return Result.success(activityHolidayInfoService.queryHolidays(year));}/*** 更新該年份的非工作日()*/@ApiOperation(value = "更新該年份的非工作日")@PutMapping(value = "/{year}/list")@ApiImplicitParams({@ApiImplicitParam(name = "year", dataType = "String", paramType = "path")})public Result<Boolean> mergeHolidays(@RequestBody List<ActivityHolidayInfo> holidayInfos, @PathVariable String year) {activityHolidayInfoService.mergeHolidays(holidayInfos, year);return Result.success(Boolean.TRUE);}
}
2、ActivityHolidayInfoService.java
public interface ActivityHolidayInfoService extends IService<ActivityHolidayInfo> {/*** 初始化當(dāng)年周六、周末*/void initHolidays(String year);/*** 查詢已錄入系統(tǒng)的非工作日*/List<ActivityHolidayInfo> queryHolidays(String year);/*** 更新該年份的非工作日*/void mergeHolidays(List<ActivityHolidayInfo> holidayInfos, String year);
}
3、ActivityHolidayInfoServiceImpl.java
@Service
public class ActivityHolidayInfoServiceImpl extends ServiceImpl<ActivityHolidayInfoMapper, ActivityHolidayInfo> implements ActivityHolidayInfoService {/*** 查詢改年份已錄入系統(tǒng)的非工作日*/@Overridepublic List<ActivityHolidayInfo> queryHolidays(String year) {QueryWrapper<ActivityHolidayInfo> queryWrapper = new QueryWrapper<>();queryWrapper.lambda().likeRight(ActivityHolidayInfo::getHolidayTime, year);return baseMapper.selectList(queryWrapper);}/*** 更新該年份的非工作日*/@Overridepublic void mergeHolidays(List<ActivityHolidayInfo> holidayInfos, String year) {remove(new QueryWrapper<ActivityHolidayInfo>().lambda().likeRight(ActivityHolidayInfo::getHolidayTime, year));saveBatch(holidayInfos);}// 根據(jù)年份和月份獲取當(dāng)月的所有日期public static List<String> getDayByMonth(int month, String year) {List<String> data = new ArrayList<>();try {Calendar c = Calendar.getInstance();// 獲取當(dāng)前的年份// int year = c.get(Calendar.YEAR);// 獲取本月的總天數(shù)int dayCount = c.getActualMaximum(Calendar.DAY_OF_MONTH);// 定義時(shí)間格式SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// 開(kāi)始日期為當(dāng)前年月拼接1號(hào)Date startDate = sdf.parse(year + "-" + month + "-01");// 結(jié)束日期為當(dāng)前年月拼接該月最大天數(shù)Date endDate = sdf.parse(year + "-" + month + "-" + dayCount);// 設(shè)置calendar的開(kāi)始日期c.setTime(startDate);// 當(dāng)前時(shí)間小于等于設(shè)定的結(jié)束時(shí)間while (c.getTime().compareTo(endDate) <= 0) {String time = sdf.format(c.getTime());data.add(time);// 當(dāng)前日期加1c.add(Calendar.DATE, 1);}} catch (ParseException e) {e.printStackTrace();}return data;}/*** 初始化當(dāng)年周六、周末*/@Overridepublic void initHolidays(String year) {try {// 拿到當(dāng)年中的所有日期List<String> dateList = new ArrayList<>();for (int i = 1; i <= 12; i++) {dateList.addAll(getDayByMonth(i, year));}dateList = dateList.stream().distinct().collect(Collectors.toList());// set 日期SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");List<ActivityHolidayInfo> activityHolidayInfo = new ArrayList<>();// 添加當(dāng)年所有日期數(shù)據(jù)for (String date : dateList) {ActivityHolidayInfo serviceDate = new ActivityHolidayInfo();Calendar calendar = Calendar.getInstance();calendar.setTime(simpleDateFormat.parse(date));// index 值為 7 時(shí) 是周六 值為 1 時(shí)是末, 美國(guó)周六是一周的最后一天,周日是一周的最后一天int index = calendar.get(Calendar.DAY_OF_WEEK);if (index == 7) {serviceDate.setHolidayName("周六");serviceDate.setRemark("周末");serviceDate.setHolidayTime(simpleDateFormat.parse(date));activityHolidayInfo.add(serviceDate);} else if (index == 1) {serviceDate.setHolidayName("周日");serviceDate.setRemark("周末");serviceDate.setHolidayTime(simpleDateFormat.parse(date));activityHolidayInfo.add(serviceDate);}}if (!CollectionUtils.isEmpty(activityHolidayInfo)) {//先刪除該年份數(shù)據(jù)remove(new QueryWrapper<ActivityHolidayInfo>().lambda().likeRight(ActivityHolidayInfo::getHolidayTime, year));//再批量插入saveBatch(activityHolidayInfo);}} catch (Exception e) {log.error("日期初始化錯(cuò)誤");e.printStackTrace();}}
}
三、測(cè)試效果
postman請(qǐng)求:http://x.x.x.x:8080/holidays/年份/initDate
數(shù)據(jù)庫(kù)情況: