Sfoglia il codice sorgente

生成下个月作息定时任务

luojun 2 anni fa
parent
commit
22d7adbe5c

+ 4 - 0
project_data/sql/0.0.2/quartz/quartz.sql

@@ -29,3 +29,7 @@ INSERT INTO `sys_job`( `job_name`, `job_group`, `invoke_target`, `cron_expressio
 -- 预案演练逾期任务状态修改定时任务
 DELETE from sys_job where invoke_target='CoreDrillTask.updateDrillTaskStatus()';
 INSERT INTO `sys_job`(`job_name`, `job_group`, `invoke_target`, `cron_expression`, `misfire_policy`, `concurrent`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ( '预案演练逾期任务状态修改', 'DEFAULT', 'CoreDrillTask.updateDrillTaskStatus()', '0 0 1 * * ?', '1', '1', '0', 'slsjyc', '2023-10-19 08:56:30', '', NULL);
+
+-- 生成下个月作息定时任务
+delete from `sys_job` where invoke_target like 'WorkTimeTask.generateNextMonth%';
+INSERT INTO `sys_job`( `job_name`, `job_group`, `invoke_target`, `cron_expression`, `misfire_policy`, `concurrent`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ( '生成下个月作息', 'DEFAULT', 'WorkTimeTask.generateNextMonth', '1 1 1 1 * ?', '1', '1', '0', '省联社账号', '2023-10-25 15:48:21', '', NULL);

+ 6 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteWorkTimeService.java

@@ -36,4 +36,10 @@ public interface RemoteWorkTimeService {
     Integer checkWorkTime(@RequestBody Map<String,Object> searchData,  @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
     @GetMapping("/work/time/findWorkTimeByOrgIdAndYmd")
     SysWorkTime findWorkTimeByOrgIdAndYmd(@RequestParam("ymdDate") Date startTime, @RequestParam("orgId") Long orgId);
+
+    /**
+     * 生成下个月作息
+     */
+    @GetMapping("/work/timeSet/generateNextMonth")
+    void generateNextMonth();
 }

+ 5 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteWorkTimesFallbackFactory.java

@@ -57,6 +57,11 @@ public class RemoteWorkTimesFallbackFactory implements FallbackFactory<RemoteWor
                 return null;
             }
 
+            @Override
+            public void generateNextMonth() {
+
+            }
+
 
         };
     }

+ 13 - 3
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysWorkTimeSetController.java

@@ -1,5 +1,7 @@
 package com.xunmei.system.controller;
 
+import cn.hutool.core.date.DateTime;
+import com.xunmei.common.core.utils.DateHelper;
 import com.xunmei.common.core.web.controller.BaseController;
 import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.common.core.web.page.TableDataInfo;
@@ -15,6 +17,9 @@ import org.springframework.web.bind.annotation.*;
 
 import java.text.ParseException;
 import java.util.Calendar;
+import java.util.Date;
+import java.util.Map;
+import java.util.TimeZone;
 
 /**
  * 作息设置Controller
@@ -67,7 +72,7 @@ public class SysWorkTimeSetController extends BaseController {
         } else {
             workTimeSet = sysWorkTimeSetService.selectSysWorkTimeSetById(id);
         }
-        if (workTimeSet!=null) {
+        if (workTimeSet != null) {
             workTimeSet.setMonthEnable(1L);
         }
         return success(workTimeSet);
@@ -107,8 +112,6 @@ public class SysWorkTimeSetController extends BaseController {
     }
 
 
-
-
     /**
      * 删除作息设置
      */
@@ -119,4 +122,11 @@ public class SysWorkTimeSetController extends BaseController {
     public AjaxResult remove(@PathVariable Long[] ids) {
         return toAjax(sysWorkTimeSetService.deleteSysWorkTimeSetByIds(ids));
     }
+
+    @ApiOperation(value = "生成下个月作息")
+    @GetMapping(value = "/generateNextMonth")
+    public AjaxResult generateNextMonth() {
+        sysWorkTimeSetService.generateNextMonth();
+        return AjaxResult.success("开始生成下个月作息!");
+    }
 }

+ 2 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysWorkTimeSetService.java

@@ -74,4 +74,6 @@ public interface ISysWorkTimeSetService extends IService<SysWorkTimeSet> {
     TableDataInfo selectPage(SysWorkTimeSet sysWorkTimeSet);
 
     AjaxResult workTimePageList(SysWorkTimeSet sysWorkTimeSet) throws ParseException;
+
+    void generateNextMonth();
 }

+ 167 - 97
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysWorkTimeSetServiceImpl.java

@@ -552,103 +552,173 @@ public class SysWorkTimeSetServiceImpl extends ServiceImpl<SysWorkTimeSetMapper,
     public int deleteSysWorkTimeSetById(Long id) {
         return sysWorkTimeSetMapper.deleteById(id);
     }
-//    /**
-//     * 生成下个月的作息
-//     */
-//    @Transactional(rollbackFor = Exception.class)
-//    public void generateNextMonth() {
-//        Calendar calendar = Calendar.getInstance();
-//        calendar.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
-//        System.out.println("============================ work_time_job 1================== : " + calendar.getTime());
-//
-//        calendar.set(Calendar.DAY_OF_MONTH, 1);
-//        calendar.add(Calendar.MONTH, 1);
-//        Integer year = calendar.get(Calendar.YEAR);
-//        generateWorkTime(year, calendar.get(Calendar.MONTH));
-//    }
-//
-//    @Transactional(rollbackFor = Exception.class)
-//    public void generateWorkTime(int year, int month) {
-//        Calendar calendar = Calendar.getInstance();
-//        calendar.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
-//        calendar.set(Calendar.DAY_OF_MONTH, 1);
-//        calendar.set(Calendar.MONTH, month);
-//        calendar.set(Calendar.YEAR, year);
-//        System.out.println("============================ work_time_job 1================== : " + calendar.getTime());
-//        List<SysWorkTimeSet> workTimes = this.list(new LambdaQueryWrapper<SysWorkTimeSet>().eq(SysWorkTimeSet::getYear,year));
-//        Map<Long,List<SysWorkTimeSet>> group= workTimes.stream()
-//                .sorted(Comparator.comparing(SysWorkTimeSet::getEffectiveDate).reversed())
-//                .collect(Collectors.groupingBy(w->w.getOrgId()));
-//
-//        final Date date = com.xunmei.common.core.utils.DateHelper.getDate(calendar.getTime());
-//        System.out.println("============================ work_time_job 2================== : " + date);
-//        final com.xunmei.common.core.utils.DateHelper dateTime = new com.xunmei.common.core.utils.DateHelper(date);
-//        final Date start = dateTime.monthStart();
-//        final Date end = dateTime.monthEnd();
-//        final List<DateTime> dateTimeList = DateUtil.rangeToList(start, end, DateField.DAY_OF_MONTH);
-//        System.out.println(JSON.toJSONString(dateTimeList));
-////        HolidayDto holidayDto = new HolidayDto();
-////        holidayDto.setYear(year);
-////        List<Holiday> holidayList = this.holidayService.all(holidayDto);
-////        List<Date> holidayDates = null;
-////        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(holidayList)) {
-////            holidayDates = holidayList.stream().map(p -> p.getYmdDate()).collect(Collectors.toList());
-////        }
-//        List<SysWorkTime> workTimeEditDtoList = new ArrayList<>();
-//        for (DateTime time : dateTimeList) {
-//            Date date1 = time.toJdkDate();
-//            System.out.println("date1:"+date1);
-//            for(Long orgId:group.keySet()) {
-//                Optional<SysWorkTimeSet> ws=   group.get(orgId).stream().filter(w->date1.after(w.getEffectiveDate())||DateUtil.isSameDay(date1,w.getEffectiveDate())).findFirst();
-//                if(!ws.isPresent()){
-//                    continue;
-//                }
-//                SysWorkTimeSet set=ws.get();
-//                List<SysWorkTimeSetDayofweek> temp=ws.get().getDayOfWeeks();
-//                int i = time.dayOfWeek();
-//                SysWorkTimeSetDayofweek dayOfWeekSet = temp.stream().filter(e->e.getDayOfWeek().equals(i)).findFirst().get();
-//                boolean isEnable = ObjectUtil.isNotNull(dayOfWeekSet) && dayOfWeekSet.getIsWorkday();
-//                WorkTimeEditDto dto = new WorkTimeEditDto();
-//                dto.setDate(time);
-//                dto.setOrgId(orgId);
-//                dto.setIsEnable(isEnable);
-//                if (ObjectUtil.isNull(dayOfWeekSet) || !dayOfWeekSet.getIsWorkday()) {
-//                    Optional<WorkTimeSetDayOfWeek> firstWorkDay = set.getDayOfWeeks().stream().filter(f -> f.getIsWorkday()).findFirst();
-//                    if (firstWorkDay.isPresent()) {
-//                        dayOfWeekSet = firstWorkDay.get();
-//                    }
-//                }
-//                //dto.setIsEnable(dayOfWeekSet.getIsWorkday());
-//                workTimeEditDtoList.add(dto);
-//                dto.setWorkTime(dayOfWeekSet.getWorkTime());
-//                dto.setWorkOffTime(dayOfWeekSet.getWorkOffTime());
-//                dto.setOpenTime(dayOfWeekSet.getOpenTime());
-//                dto.setCloseTime(dayOfWeekSet.getCloseTime());
-//                dto.setNoonbreakStart(dayOfWeekSet.getNoonbreakStart());
-//                dto.setNoonbreakEnd(dayOfWeekSet.getNoonbreakEnd());
-//                workTimeEditDtoList.add(dto);
-//            }
+    /**
+     * 生成下个月的作息
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void generateNextMonth() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        System.out.println("============================ work_time_job 1================== : " + calendar.getTime());
+
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        calendar.add(Calendar.MONTH, 1);
+        int year = calendar.get(Calendar.YEAR);
+        generateWorkTime(year, calendar.get(Calendar.MONTH));
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void generateWorkTime(int year, int month) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        calendar.set(Calendar.MONTH, month);
+        calendar.set(Calendar.YEAR, year);
+        System.out.println("============================ work_time_job 1================== : " + calendar.getTime());
+        List<SysWorkTimeSet> workTimes = this.list(new LambdaQueryWrapper<SysWorkTimeSet>().eq(SysWorkTimeSet::getYear,year));
+        Map<Long,List<SysWorkTimeSet>> group= workTimes.stream()
+                .sorted(Comparator.comparing(SysWorkTimeSet::getEffectiveDate).reversed())
+                .collect(Collectors.groupingBy(SysWorkTimeSet::getOrgId));
+
+        final Date date = com.xunmei.common.core.utils.DateHelper.getDate(calendar.getTime());
+        System.out.println("============================ work_time_job 2================== : " + date);
+        final com.xunmei.common.core.utils.DateHelper dateTime = new com.xunmei.common.core.utils.DateHelper(date);
+        final Date start = dateTime.monthStart();
+        final Date end = dateTime.monthEnd();
+        final List<DateTime> dateTimeList = DateUtil.rangeToList(start, end, DateField.DAY_OF_MONTH);
+        System.out.println(JSON.toJSONString(dateTimeList));
+//        HolidayDto holidayDto = new HolidayDto();
+//        holidayDto.setYear(year);
+//        List<Holiday> holidayList = this.holidayService.all(holidayDto);
+//        List<Date> holidayDates = null;
+//        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(holidayList)) {
+//            holidayDates = holidayList.stream().map(p -> p.getYmdDate()).collect(Collectors.toList());
 //        }
-//
-//        Map<Long,List<WorkTimeEditDto>> groupDay= workTimeEditDtoList.stream().collect(Collectors.groupingBy(w->w.getOrgId()));
-//        //获取所有机构下个月的按日配置的作息
-//        List<WorkTimeNewVo> list = new ArrayList<>();
-//        list = objectMapper.getNextMonthWorkTime(DateUtil.format(start, "yyyy-MM"));
-//        for(Long orgId:groupDay.keySet()){
-//            List<WorkTimeEditDto> workTimeEditDtos = groupDay.get(orgId);
-//            List<WorkTimeNewVo> workTimeNewVos = list.stream().filter(w -> w.getOrgId().equals(orgId)).collect(Collectors.toList());
-//            //去掉workTimeEditDtos中机构与日期在workTimeNewVos中存在的数据
-//            List<WorkTimeEditDto> list1 = null;
-//            if(org.apache.commons.collections4.CollectionUtils.isNotEmpty(workTimeNewVos)){
-//                list1 = workTimeEditDtos.stream().filter(s -> {
-//                    return workTimeNewVos.stream().noneMatch(f -> f.getOrgId().equals(s.getOrgId()) && f.getYmdDate().equals(s.getDate()));
-//                }).collect(Collectors.toList());
-//            }else{
-//                list1 = workTimeEditDtos;
-//            }
-//
-//            batch(orgId, date, list1);
+        List<SysWorkTime> workTimeEditDtoList = new ArrayList<>();
+        for (DateTime time : dateTimeList) {
+            Date date1 = time.toJdkDate();
+            System.out.println("date1:"+date1);
+            for(Long orgId:group.keySet()) {
+                Optional<SysWorkTimeSet> ws=   group.get(orgId).stream().filter(w->date1.after(w.getEffectiveDate())||DateUtil.isSameDay(date1,w.getEffectiveDate())).findFirst();
+                if(!ws.isPresent()){
+                    continue;
+                }
+                SysWorkTimeSet set=ws.get();
+                List<SysWorkTimeSetDayofweek> temp = this.sysWorkTimeSetDayofweekMapper.selectList(new LambdaQueryWrapper<SysWorkTimeSetDayofweek>().eq(SysWorkTimeSetDayofweek::getWorkTimeSetId, set.getId()));
+                set.setDayOfWeeks(temp);
+                Long i = (long) time.dayOfWeek();
+                SysWorkTimeSetDayofweek dayOfWeekSet = temp.stream().filter(e->e.getDayOfWeek().equals(i)).findFirst().orElse(null);;
+                boolean isEnable = ObjectUtil.isNotNull(dayOfWeekSet) && dayOfWeekSet.getIsWorkday()>0;
+                SysWorkTime dto = new SysWorkTime();
+                dto.setDate(time);
+                dto.setOrgId(orgId);
+                dto.setIsEnable(isEnable?1L:0L);
+                if (ObjectUtil.isNull(dayOfWeekSet) || !(dayOfWeekSet.getIsWorkday()>0)) {
+                    Optional<SysWorkTimeSetDayofweek> firstWorkDay = set.getDayOfWeeks().stream().filter(f -> f.getIsWorkday()>0).findFirst();
+                    if (firstWorkDay.isPresent()) {
+                        dayOfWeekSet = firstWorkDay.orElseGet(SysWorkTimeSetDayofweek::new);
+                    }
+                }
+                //dto.setIsEnable(dayOfWeekSet.getIsWorkday());
+//                workTimeEditDtoList.add(dto);
+                dto.setWorkTime(dayOfWeekSet.getWorkTime());
+                dto.setWorkOffTime(dayOfWeekSet.getWorkOffTime());
+                dto.setOpenTime(dayOfWeekSet.getOpenTime());
+                dto.setCloseTime(dayOfWeekSet.getCloseTime());
+                dto.setNoonbreakStart(dayOfWeekSet.getNoonbreakStart());
+                dto.setNoonbreakEnd(dayOfWeekSet.getNoonbreakEnd());
+                workTimeEditDtoList.add(dto);
+            }
+        }
+
+        Map<Long,List<SysWorkTime>> groupDay= workTimeEditDtoList.stream().collect(Collectors.groupingBy(SysWorkTime::getOrgId));
+        //获取所有机构下个月的按日配置的作息
+        List<SysWorkTime> list = new ArrayList<>();
+        list = this.sysWorkTimeMapper.selectList(new LambdaQueryWrapper<SysWorkTime>().eq(SysWorkTime::getIsManual,1L).likeRight(SysWorkTime::getYmdDate,DateUtil.format(start, "yyyy-MM")));
+        for(Long orgId:groupDay.keySet()){
+            List<SysWorkTime> workTimeEditDtos = groupDay.get(orgId);
+            List<SysWorkTime> workTimeNewVos = list.stream().filter(w -> w.getOrgId().equals(orgId)).collect(Collectors.toList());
+            //去掉workTimeEditDtos中机构与日期在workTimeNewVos中存在的数据
+            List<SysWorkTime> list1 = null;
+            if(org.apache.commons.collections4.CollectionUtils.isNotEmpty(workTimeNewVos)){
+                list1 = workTimeEditDtos.stream().filter(s -> {
+                    return workTimeNewVos.stream().noneMatch(f -> f.getOrgId().equals(s.getOrgId()) && f.getYmdDate().equals(s.getDate()));
+                }).collect(Collectors.toList());
+            }else{
+                list1 = workTimeEditDtos;
+            }
+
+            batch(orgId, date, list1);
+        }
+
+    }
+    /**
+     * @param orgId
+     * @param month
+     * @param workTimeEditDtoList
+     */
+    @Transactional
+    public void batch(final Long orgId, final Date month, final List<SysWorkTime> workTimeEditDtoList) {
+        // 小于现在时间的不允许修改
+        final Date now = DateUtil.beginOfDay(new Date());
+        List<SysWorkTime> workTimeList = StreamHelper.to(workTimeEditDtoList, workTimeEditDto -> {
+            final Date workDate = workTimeEditDto.getDate();
+            if (workTimeEditDto.getIsEnable() == null || workDate.before(now)) {
+//                WORKTIMEBUSINESSLOG.info("作息时间[ {} ]小于现在时间, 不允许改变", workDate);
+                return null;
+            }
+            final SysWorkTime workTime = new SysWorkTime();
+            workTime.setOrgId(orgId);
+            workTime.setYmd(Ymd.of(workTimeEditDto.getDate()));
+            workTime.setYmdDate(workTime.getYmd().getDate());
+            workTime.setYmdDay(Long.valueOf(workTime.getYmd().getDay()));
+            workTime.setYmdHalfyear(Long.valueOf(workTime.getYmd().getHalfyear()));
+            workTime.setYmdHour(Long.valueOf(workTime.getYmd().getHour()));
+            workTime.setYmdMinute(Long.valueOf(workTime.getYmd().getMinute()));
+            workTime.setYmdMonth(Long.valueOf(workTime.getYmd().getMonth()));
+            workTime.setYmdQuarter(Long.valueOf(workTime.getYmd().getQuarter()));
+            workTime.setYmdWeek(Long.valueOf(workTime.getYmd().getWeek()));
+            workTime.setYmdYear(Long.valueOf(workTime.getYmd().getYear()));
+            BeanHelper.copyProperties(workTime, workTimeEditDto);
+            workTime.setIsManual(0L);
+            workTime.setIsEnable(workTimeEditDto.getIsEnable());
+            if(!(workTimeEditDto.getIsEnable()>0)){
+                workTime.setWorkTime(null);
+                workTime.setWorkOffTime(null);
+                workTime.setOpenTime(null);
+                workTime.setCloseTime(null);
+                workTime.setNoonbreakStart(null);
+                workTime.setNoonbreakEnd(null);
+            }
+            return workTime;
+        }, true);
+
+        //
+        this.workTimeService.saveOrUpdateBatch(workTimeList);
+
+//        WorkTimeMonthFindMonthDto request = new WorkTimeMonthFindMonthDto();
+//        request.setMonth(month);
+//        request.setOrgId(orgId);
+//        SysWorkTimeMonth db = workTimeMonthService.findMonthTime(request);
+//        if (db != null) {
+//            int openCount = (int) workTimeEditDtoList.stream().filter(w -> w.getIsEnable() != null && w.getIsEnable() == true).count();
+//            int closeCount = (int) workTimeEditDtoList.stream().filter(w -> w.getIsEnable() != null && w.getIsEnable() == false).count();
+//            ;
+////            for (final WorkTime workTime : workTimeList) {
+////                if (workTime.getIsEnable()) {
+////                    openCount++;
+////                } else {
+////                    closeCount++;
+////                }
+////            }
+//            db.setUpdateTime(new Date());
+//            db.setCloseCount((long) closeCount);
+//            db.setOpenCount((long) openCount);
+//            return this.workTimeMonthService.save(db);
+//        } else {
+//            return this.workTimeMonthService.save(WorkTimeMonth.of(orgId, month, workTimeList));
 //        }
-//
-//    }
+
+    }
 }