8 Commits 009c70f82c ... c4c9b451c8

Author SHA1 Message Date
  yangcong c4c9b451c8 修改过往的逻辑 3 years ago
  yangcong 4aa9b10168 添加 model 和 mapper 3 years ago
  yangcong 538487cc10 opt sql 3 years ago
  yangcong cb487ceb68 opt sql 3 years ago
  yangcong af5f4fda26 opt code 3 years ago
  yangcong 9c02215997 opt sql 3 years ago
  予一兮 def870eeba 排班开发内容 3 years ago
  予一兮 057d10b198 创建排班的model 3 years ago
34 changed files with 954 additions and 0 deletions
  1. 4 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/constant/CommonConstant.java
  2. 56 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/controller/WorkScheduleController.java
  3. 10 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkPersonMapper.java
  4. 10 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkRuleMapper.java
  5. 17 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkScheduleMapper.java
  6. 10 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkShiftConflictMapper.java
  7. 10 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkShiftDurationMapper.java
  8. 10 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkShiftMapper.java
  9. 10 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkShiftRestMapper.java
  10. 10 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkTimeMapper.java
  11. 20 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkPerson.java
  12. 25 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkRule.java
  13. 23 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkSchedule.java
  14. 25 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkShift.java
  15. 18 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkShiftConflict.java
  16. 22 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkShiftDuration.java
  17. 20 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkShiftRest.java
  18. 26 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkTime.java
  19. 18 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/dto/ScheduleListQueryDto.java
  20. 11 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/dto/WorkScheduleDto.java
  21. 101 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/service/WorkScheduleService.java
  22. 21 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/transform/WorkScheduleTransform.java
  23. 34 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/utils/StreamUtil.java
  24. 41 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/utils/Validator.java
  25. 43 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/request/DownloadFileVO.java
  26. 33 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/request/ScheduleListQueryVO.java
  27. 30 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/request/UpdateScheduleVO.java
  28. 39 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/response/OnePersonScheduleVO.java
  29. 21 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/response/ScheduleListResultVO.java
  30. 25 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/response/StatisticalInfoVO.java
  31. 17 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/response/WorkTimeResultVO.java
  32. 9 0
      fm-scheduling/src/main/resources/bootstrap.yml
  33. 168 0
      fm-scheduling/src/main/resources/db.init/table.sql
  34. 17 0
      fm-scheduling/src/main/resources/mapper/WokeScheduleMapper.xml

+ 4 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/constant/CommonConstant.java

@@ -0,0 +1,4 @@
+package com.persagy.fm.scheduling.constant;
+
+public class CommonConstant {
+}

+ 56 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/controller/WorkScheduleController.java

@@ -0,0 +1,56 @@
+package com.persagy.fm.scheduling.controller;
+
+
+import com.persagy.fm.common.response.CommonResult;
+import com.persagy.fm.common.response.PageList;
+import com.persagy.fm.scheduling.service.WorkScheduleService;
+import com.persagy.fm.scheduling.vo.request.DownloadFileVO;
+import com.persagy.fm.scheduling.vo.request.ScheduleListQueryVO;
+import com.persagy.fm.scheduling.vo.request.UpdateScheduleVO;
+import com.persagy.fm.scheduling.vo.response.OnePersonScheduleVO;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Slf4j
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/fm/schedule/")
+public class WorkScheduleController {
+
+    private final WorkScheduleService workScheduleService;
+
+
+    @PostMapping("list")
+    public CommonResult<PageList<OnePersonScheduleVO>> scheduleList(@Validated @RequestBody ScheduleListQueryVO vo) {
+        PageList<OnePersonScheduleVO> personSchedulePage = workScheduleService.scheduleList(vo);
+        CommonResult<PageList<OnePersonScheduleVO>> success = CommonResult.SUCCESS;
+        success.setContent(personSchedulePage);
+        return success;
+    }
+
+    @PostMapping("update")
+    public CommonResult<Boolean> updateSchedule(@Validated @RequestBody UpdateScheduleVO vo) {
+        return CommonResult.success(workScheduleService.updateSchedule(vo));
+    }
+
+
+    @PostMapping("uploadFile")
+    public CommonResult<Boolean> uploadFile(HttpServletRequest file) {
+        return CommonResult.SUCCESS;
+    }
+
+
+    @PostMapping("downLoadFile")
+    public void downLoadFile(@Validated @RequestBody DownloadFileVO vo, HttpServletResponse response) {
+        vo.validData();
+    }
+
+}

+ 10 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkPersonMapper.java

@@ -0,0 +1,10 @@
+package com.persagy.fm.scheduling.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.fm.scheduling.model.WorkPerson;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface WorkPersonMapper extends BaseMapper<WorkPerson> {
+
+}

+ 10 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkRuleMapper.java

@@ -0,0 +1,10 @@
+package com.persagy.fm.scheduling.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.fm.scheduling.model.WorkRule;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface WorkRuleMapper extends BaseMapper<WorkRule> {
+
+}

+ 17 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkScheduleMapper.java

@@ -0,0 +1,17 @@
+package com.persagy.fm.scheduling.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.persagy.fm.scheduling.model.WorkSchedule;
+import com.persagy.fm.scheduling.model.dto.ScheduleListQueryDto;
+import com.persagy.fm.scheduling.model.dto.WorkScheduleDto;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface WorkScheduleMapper extends BaseMapper<WorkSchedule> {
+
+
+    IPage<WorkScheduleDto> getPage(IPage<WorkSchedule> page, @Param("schedule") ScheduleListQueryDto dto );
+
+}

+ 10 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkShiftConflictMapper.java

@@ -0,0 +1,10 @@
+package com.persagy.fm.scheduling.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.fm.scheduling.model.WorkShiftConflict;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface WorkShiftConflictMapper extends BaseMapper<WorkShiftConflict> {
+
+}

+ 10 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkShiftDurationMapper.java

@@ -0,0 +1,10 @@
+package com.persagy.fm.scheduling.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.fm.scheduling.model.WorkShiftDuration;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface WorkShiftDurationMapper extends BaseMapper<WorkShiftDuration> {
+
+}

+ 10 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkShiftMapper.java

@@ -0,0 +1,10 @@
+package com.persagy.fm.scheduling.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.fm.scheduling.model.WorkShift;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface WorkShiftMapper extends BaseMapper<WorkShift> {
+
+}

+ 10 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkShiftRestMapper.java

@@ -0,0 +1,10 @@
+package com.persagy.fm.scheduling.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.fm.scheduling.model.WorkShiftRest;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface WorkShiftRestMapper extends BaseMapper<WorkShiftRest> {
+
+}

+ 10 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/dao/WorkTimeMapper.java

@@ -0,0 +1,10 @@
+package com.persagy.fm.scheduling.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.fm.scheduling.model.WorkTime;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface WorkTimeMapper extends BaseMapper<WorkTime> {
+
+}

+ 20 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkPerson.java

@@ -0,0 +1,20 @@
+package com.persagy.fm.scheduling.model;
+
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.persagy.fm.common.model.entity.AuditableEntity;
+import lombok.Data;
+
+@Data
+@TableName(value = "work_person")
+public class WorkPerson extends AuditableEntity<WorkSchedule> {
+
+    @TableField(value = "person_id")
+    private String personId;
+    @TableField(value = "project_id")
+    private String projectId;
+    @TableField(value = "dept_id")
+    private String deptId;
+
+}

+ 25 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkRule.java

@@ -0,0 +1,25 @@
+package com.persagy.fm.scheduling.model;
+
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.persagy.fm.common.model.entity.AuditableEntity;
+import lombok.Data;
+
+@Data
+@TableName(value = "work_rule")
+public class WorkRule extends AuditableEntity<WorkSchedule> {
+
+    @TableField(value = "")
+    private Integer type;
+    @TableField(value = "")
+    private Integer operator;
+    @TableField(value = "")
+    private double value;
+    @TableField(value = "")
+    private String validator;
+    @TableField(value = "")
+    private Integer enable;
+
+
+}

+ 23 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkSchedule.java

@@ -0,0 +1,23 @@
+package com.persagy.fm.scheduling.model;
+
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.persagy.fm.common.model.entity.AuditableEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@TableName(value = "work_schedule")
+public class WorkSchedule extends AuditableEntity<WorkSchedule> {
+
+    @TableField(value = "work_day")
+    private Date workDay;
+    @TableField(value = "shift_id")
+    private String shiftId;
+    @TableField(value = "person_id")
+    private String personId;
+
+
+}

+ 25 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkShift.java

@@ -0,0 +1,25 @@
+package com.persagy.fm.scheduling.model;
+
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.persagy.fm.common.model.entity.AuditableEntity;
+import lombok.Data;
+
+@Data
+@TableName(value = "work_shift")
+public class WorkShift extends AuditableEntity<WorkSchedule> {
+
+    @TableField(value = "shift_abbr")
+    private String shiftAbbr;
+    @TableField(value = "shift_name")
+    private String shiftName;
+    @TableField(value = "start_time")
+    private String startTime;
+    @TableField(value = "end_time")
+    private String endTime;
+    @TableField(value = "work_duration")
+    private long workDuration;
+
+
+}

+ 18 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkShiftConflict.java

@@ -0,0 +1,18 @@
+package com.persagy.fm.scheduling.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.persagy.fm.common.model.entity.AuditableEntity;
+import lombok.Data;
+
+@Data
+@TableName(value = "work_shift_conflict")
+public class WorkShiftConflict extends AuditableEntity<WorkSchedule> {
+
+    @TableField(value = "source_shift_id")
+    private String sourceShiftId;
+    @TableField(value = "current_shift_id")
+    private String currentShiftId;
+
+
+}

+ 22 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkShiftDuration.java

@@ -0,0 +1,22 @@
+package com.persagy.fm.scheduling.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.persagy.fm.common.model.entity.AuditableEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@TableName(value = "work_shift_duration")
+public class WorkShiftDuration extends AuditableEntity<WorkSchedule> {
+
+    @TableField(value = "shift_id")
+    private String shiftId;
+    @TableField(value = "start_time")
+    private Date startTime;
+    @TableField(value = "end_time")
+    private Date endTime;
+
+
+}

+ 20 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkShiftRest.java

@@ -0,0 +1,20 @@
+package com.persagy.fm.scheduling.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.persagy.fm.common.model.entity.AuditableEntity;
+import lombok.Data;
+
+@Data
+@TableName(value = "work_shift_rest")
+public class WorkShiftRest extends AuditableEntity<WorkSchedule> {
+
+    @TableField(value = "shift_id")
+    private String shiftId;
+    @TableField(value = "start_time")
+    private String startTime;
+    @TableField(value = "end_time")
+    private String endTime;
+
+
+}

+ 26 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkTime.java

@@ -0,0 +1,26 @@
+package com.persagy.fm.scheduling.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.persagy.fm.common.model.entity.AuditableEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@TableName(value = "work_time")
+public class WorkTime extends AuditableEntity<WorkSchedule> {
+
+    @TableField(value = "shift_id")
+    private String shiftId;
+    @TableField(value = "person_id")
+    private String personId;
+    @TableField(value = "start_time")
+    private Date startTime;
+    @TableField(value = "end_time")
+    private Date endTime;
+    @TableField(value = "work_times")
+    private long workTimes;
+
+
+}

+ 18 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/dto/ScheduleListQueryDto.java

@@ -0,0 +1,18 @@
+package com.persagy.fm.scheduling.model.dto;
+
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+@Data
+@Accessors(chain = true)
+public class ScheduleListQueryDto {
+
+
+    private Date minDate;
+    private Date maxDate;
+    private String projectId;
+    private String deptId;
+}

+ 11 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/dto/WorkScheduleDto.java

@@ -0,0 +1,11 @@
+package com.persagy.fm.scheduling.model.dto;
+
+import com.persagy.fm.scheduling.model.WorkSchedule;
+import lombok.Data;
+
+@Data
+public class WorkScheduleDto extends WorkSchedule {
+
+    private String shiftAbbr;
+
+}

+ 101 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/service/WorkScheduleService.java

@@ -0,0 +1,101 @@
+package com.persagy.fm.scheduling.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.common.collect.Sets;
+import com.persagy.fm.common.response.PageList;
+import com.persagy.fm.scheduling.dao.WorkScheduleMapper;
+import com.persagy.fm.scheduling.model.WorkSchedule;
+import com.persagy.fm.scheduling.model.dto.ScheduleListQueryDto;
+import com.persagy.fm.scheduling.model.dto.WorkScheduleDto;
+import com.persagy.fm.scheduling.transform.WorkScheduleTransform;
+import com.persagy.fm.scheduling.vo.request.ScheduleListQueryVO;
+import com.persagy.fm.scheduling.vo.request.UpdateScheduleVO;
+import com.persagy.fm.scheduling.vo.response.OnePersonScheduleVO;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.assertj.core.util.Lists;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class WorkScheduleService {
+
+    private final WorkScheduleMapper workScheduleMapper;
+    private final WorkScheduleTransform workScheduleTransform;
+
+
+    public PageList<OnePersonScheduleVO> scheduleList(ScheduleListQueryVO vo) {
+
+        //todo 根据父级部门id 获取下面所有子级部门的部门id
+        final Set<String> departmentIds = Sets.newHashSet();
+
+        Date minDate = new GregorianCalendar(vo.getYear(), vo.getMonth(), 1).getTime();
+        Date maxDate = new GregorianCalendar(vo.getYear(), vo.getMonth() + 1, 1).getTime();
+
+        ScheduleListQueryDto listQueryDto = new ScheduleListQueryDto().setDeptId(vo.getDeptId())
+                .setMaxDate(maxDate)
+                .setMinDate(minDate)
+                .setProjectId(vo.getProjectId());
+
+
+        Page<WorkSchedule> page = new Page<WorkSchedule>().setSize(vo.getPageSize()).setCurrent(vo.getPageNum());
+
+
+        IPage<WorkScheduleDto> workSchedulePage = workScheduleMapper.getPage(page, listQueryDto);
+        final List<WorkScheduleDto> records = workSchedulePage.getRecords();
+        if (CollectionUtils.isEmpty(records)) return new PageList<>(Lists.newArrayList(), 0);
+        ConcurrentMap<String, List<WorkScheduleDto>> personSchedulesMap = records.stream()
+                .collect(Collectors.groupingByConcurrent(WorkSchedule::getPersonId));
+
+        List<OnePersonScheduleVO> personScheduleList = personSchedulesMap
+                .entrySet()
+                .stream().map(entry -> {
+                    List<WorkScheduleDto> value = entry.getValue();
+                    List<OnePersonScheduleVO.WorkScheduleVO> workScheduleVOS = value.stream()
+                            .map(workScheduleTransform::toWorkScheduleVO)
+                            .collect(Collectors.toList());
+                    return new OnePersonScheduleVO()
+                            .setPersonInfo(new OnePersonScheduleVO.PersonInfo().setPersonId(entry.getKey()))
+                            .setWorkScheduleVOS(workScheduleVOS);
+                })
+
+                .collect(Collectors.toList());
+
+        return new PageList<>(personScheduleList, workSchedulePage.getTotal());
+    }
+
+    public Boolean updateSchedule(UpdateScheduleVO vo) {
+        List<UpdateScheduleVO.ScheduleVO> scheduleVOS = vo.getScheduleVOS();
+        if (CollectionUtils.isEmpty(scheduleVOS)) return true;
+        Set<String> ids = scheduleVOS.stream()
+                .map(UpdateScheduleVO.ScheduleVO::getId)
+                .collect(Collectors.toSet());
+        final List<Object> usefulIds = Lists.newArrayList();
+        List<WorkSchedule> workSchedules = workScheduleMapper.selectBatchIds(ids);
+        if (CollectionUtils.isEmpty(workSchedules)) throw new RuntimeException("排班数据id无效");
+        if (workSchedules.size() < ids.size()) {
+            final Set<String> dbIds = workSchedules.stream().map(WorkSchedule::getId).collect(Collectors.toSet());
+            usefulIds.addAll(dbIds);
+            String errorIdStr = ids.stream().filter(a -> !dbIds.contains(a)).collect(Collectors.joining(","));
+            log.info("错误的排班修改数据{}", errorIdStr);
+        }
+        scheduleVOS.stream().filter(usefulIds::contains).forEach(a -> workSchedules.forEach(b -> {
+            if (a.getId().equals(b.getId())) {
+                b.setShiftId(a.getShiftId());
+                b.setWorkDay(a.getWorkDay());
+            }
+        }));
+        workSchedules.forEach(workScheduleMapper::updateById);
+        return Boolean.TRUE;
+    }
+}

+ 21 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/transform/WorkScheduleTransform.java

@@ -0,0 +1,21 @@
+package com.persagy.fm.scheduling.transform;
+
+import com.persagy.fm.scheduling.model.WorkSchedule;
+import com.persagy.fm.scheduling.model.dto.WorkScheduleDto;
+import com.persagy.fm.scheduling.vo.request.UpdateScheduleVO;
+import com.persagy.fm.scheduling.vo.response.OnePersonScheduleVO;
+import org.mapstruct.Mapper;
+
+@Mapper(componentModel = "spring")
+public interface WorkScheduleTransform {
+
+
+
+
+    OnePersonScheduleVO.WorkScheduleVO toWorkScheduleVO(WorkScheduleDto dto);
+
+
+    WorkSchedule toWorkSchedule(UpdateScheduleVO.ScheduleVO vo);
+
+
+}

+ 34 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/utils/StreamUtil.java

@@ -0,0 +1,34 @@
+package com.persagy.fm.scheduling.utils;
+
+import java.util.Optional;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+public interface StreamUtil {
+
+
+    static <T> void actionWhen(T t, Predicate<T> condition, Consumer<T> consumer) {
+        if (condition.test(t)) consumer.accept(t);
+    }
+
+    static <T, U> void actionWhen(T t, U u, Predicate<U> condition, Consumer<T> consumer) {
+        if (condition.test(u)) consumer.accept(t);
+    }
+
+    static <T> void actionWhen(T t, boolean flag, Consumer<T> consumer) {
+        if (flag) consumer.accept(t);
+    }
+
+
+    static <T, R> Optional<R> transformWhen(T t, Predicate<T> condition, Function<T, R> function) {
+        if (condition.test(t)) return Optional.of(function.apply(t));
+        return Optional.empty();
+    }
+
+
+    static <T, R> Optional<R> transformWhen(T t, boolean flag, Function<T, R> function) {
+        if (flag) return Optional.of(function.apply(t));
+        return Optional.empty();
+    }
+}

+ 41 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/utils/Validator.java

@@ -0,0 +1,41 @@
+package com.persagy.fm.scheduling.utils;
+
+import com.google.common.collect.Lists;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+@Getter
+@RequiredArgsConstructor
+public class Validator<T> {
+
+
+    private final T t;
+    private final List<String> errors = Lists.newArrayList();
+
+
+    public static <T> Validator<T> unit(T t) {
+        return new Validator<>(Objects.requireNonNull(t));
+    }
+
+    public <U> Validator<T> mapValidate(Function<T, U> f, Predicate<U> p, String message) {
+        return validate(f.andThen(p::test)::apply, message);
+    }
+
+
+    public Validator<T> validate(Predicate<T> p, String message) {
+        if (!p.test(t)) {
+            errors.add(message);
+        }
+        return this;
+    }
+
+    public <U> Validator<U> flatMap(Function<T, U> f, Function<U, Validator<U>> validator) {
+        return f.andThen(validator).apply(t);
+    }
+
+}

+ 43 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/request/DownloadFileVO.java

@@ -0,0 +1,43 @@
+package com.persagy.fm.scheduling.vo.request;
+
+
+import com.persagy.fm.scheduling.utils.Validator;
+import lombok.Data;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.Objects;
+
+@Data
+public class DownloadFileVO {
+
+    private Integer year;
+
+    private Integer month;
+
+    private String projectId;
+
+    private String departmentId;
+
+    private Boolean downLoadTemplate = false;
+
+
+    public void validData() {
+        if (!downLoadTemplate) {
+            Validator<DownloadFileVO> validate = Validator.unit(this)
+                    .mapValidate(DownloadFileVO::getYear, Objects::nonNull, "年份为空")
+                    .mapValidate(DownloadFileVO::getMonth, Objects::nonNull, "月份为空")
+                    .mapValidate(DownloadFileVO::getDepartmentId, StringUtils::isNotBlank, "缺少部门id")
+                    .mapValidate(DownloadFileVO::getProjectId, StringUtils::isNotBlank, "缺少项目id");
+            List<String> errors = validate.getErrors();
+            if (CollectionUtils.isNotEmpty(errors)) {
+                String errorStr = String.join(",", errors);
+                throw new RuntimeException(errorStr);
+            }
+
+        }
+    }
+
+
+}

+ 33 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/request/ScheduleListQueryVO.java

@@ -0,0 +1,33 @@
+package com.persagy.fm.scheduling.vo.request;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel("排版列表查询VO")
+public class ScheduleListQueryVO {
+
+
+    @NotNull(message = "年份为空")
+    @ApiModelProperty(value = "年份", example = "2021")
+    private Integer year;
+    @NotNull(message = "月份为空")
+    @ApiModelProperty(value = "月份", example = "1")
+    private Integer month;
+    @NotBlank(message = "项目数据为空")
+    @ApiModelProperty(value = "项目id", example = "3435654131")
+    private String projectId;
+    @NotBlank(message = "部门数据为空")
+    @ApiModelProperty(value = "部门id", example = "214457")
+    private String deptId;
+    @Min(1)
+    private Long pageSize;
+    @Min(1)
+    private Integer pageNum;
+}

+ 30 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/request/UpdateScheduleVO.java

@@ -0,0 +1,30 @@
+package com.persagy.fm.scheduling.vo.request;
+
+
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class UpdateScheduleVO {
+
+
+    private @Valid List<ScheduleVO> scheduleVOS;
+
+
+    @Data
+    public static class ScheduleVO {
+        @NotBlank
+        private String id;
+        @NotNull
+        private String shiftId;
+        @NotNull
+        private Date workDay;
+    }
+
+
+}

+ 39 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/response/OnePersonScheduleVO.java

@@ -0,0 +1,39 @@
+package com.persagy.fm.scheduling.vo.response;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+public class OnePersonScheduleVO {
+
+    private PersonInfo personInfo;
+
+    private List<WorkScheduleVO> workScheduleVOS;
+
+    private StatisticalInfoVO statisticalInfoVO;
+
+
+    @Data
+    @Accessors(chain = true)
+    public static class PersonInfo {
+        private String personId;
+        private String majorPosition;
+        private List<String> secondaryPositions;
+
+
+    }
+
+
+    @Data
+    @Accessors(chain = true)
+    public static class WorkScheduleVO {
+        private String id;
+        private Integer day;
+        private String shiftAbbr;
+    }
+
+
+}

+ 21 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/response/ScheduleListResultVO.java

@@ -0,0 +1,21 @@
+package com.persagy.fm.scheduling.vo.response;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+@ApiModel(description = "排班列表的返回结果vo")
+public class ScheduleListResultVO {
+
+    @ApiModelProperty(value = "一个人员的排班内容")
+    private List<OnePersonScheduleVO> personSchedules;
+    @ApiModelProperty(value = "白班夜班的工作时间以及休息时间")
+    private WorkTimeResultVO workTimeResultVO;
+
+}

+ 25 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/response/StatisticalInfoVO.java

@@ -0,0 +1,25 @@
+package com.persagy.fm.scheduling.vo.response;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+public class StatisticalInfoVO {
+
+    private List<OneStatisticalInfo> statisticalInfos;
+
+    private Integer workHours;
+
+    private Integer workMinutes;
+
+    @Data
+    @Accessors(chain = true)
+    public static class OneStatisticalInfo {
+        private WorkTimeType workTimeType;
+        private Integer times;
+    }
+}
+

+ 17 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/response/WorkTimeResultVO.java

@@ -0,0 +1,17 @@
+package com.persagy.fm.scheduling.vo.response;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+public class WorkTimeResultVO {
+
+    private String workTime;
+
+    private String restTime;
+
+    private WorkTimeType workTimeType;
+
+
+}

+ 9 - 0
fm-scheduling/src/main/resources/bootstrap.yml

@@ -0,0 +1,9 @@
+spring:
+  application:
+    name: fm-scheduling
+
+
+mybatis-plus:
+  type-enums-package: com.persagy.fm.scheduling.enums
+  configuration:
+    default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler

+ 168 - 0
fm-scheduling/src/main/resources/db.init/table.sql

@@ -0,0 +1,168 @@
+CREATE DATABASE IF NOT EXISTS `fm-scheduling`;
+
+CREATE TABLE
+    IF
+    NOT EXISTS `work_rule`
+(
+    `id`            VARCHAR(64) NOT NULL COMMENT '主键',
+    `type`     int(1)      NOT NULL COMMENT '规则类型 1 日排班规则 2 月排班规则 0 特殊日期',
+    `operator` int(8) COMMENT '比较符号 1大于 -1 小于 0 等于  2 大于等于  -2 小于等于',
+    `value`    double(10, 2) COMMENT '规则的限定值',
+    `validator`     varchar(64) COMMENT '规则的校验器标记',
+    `enable`        tinyint(1)  NOT NULL DEFAULT 1 COMMENT '规则是否启用',
+    `ts`            TIMESTAMP            default current_timestamp on update current_timestamp NOT NULL COMMENT '乐观锁',
+    `creator`       VARCHAR(32) NOT NULL COMMENT '创建人',
+    `creation_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `modifier`      VARCHAR(32) NOT NULL COMMENT '最后修改人',
+    `modified_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
+    `valid`         INT(11)     NOT NULL COMMENT '合法标识',
+    PRIMARY KEY (`id`)
+) ENGINE = INNODB
+  CHARSET = utf8mb4 COMMENT '工作规则表';
+
+CREATE TABLE
+    IF
+    NOT EXISTS `work_shift`
+(
+    `id`            VARCHAR(64)  NOT NULL COMMENT '主键',
+    `shift_abbr`    VARCHAR(64)  NOT NULL COMMENT '班次的简称',
+    `shift_name`    VARCHAR(255) NOT NULL COMMENT '班次的全称',
+    `start_time`    VARCHAR(64)  NOT NULL COMMENT '班次的开始时间',
+    `end_time`      VARCHAR(64)  NOT NULL COMMENT '班次的结束时间',
+    `work_duration` INT(8)       NOT NULL COMMENT '班次的工作时间以分钟后为单位',
+    `ts`            TIMESTAMP             default current_timestamp on update current_timestamp NOT NULL COMMENT '乐观锁',
+    `creator`       VARCHAR(32)  NOT NULL COMMENT '创建人',
+    `creation_time` TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `modifier`      VARCHAR(32)  NOT NULL COMMENT '最后修改人',
+    `modified_time` TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
+    `valid`         INT(11)      NOT NULL COMMENT '合法标识',
+    PRIMARY KEY (`id`)
+) ENGINE = INNODB
+  CHARSET = utf8mb4 COMMENT '工作班次表';
+
+
+CREATE TABLE
+    IF
+    NOT EXISTS `work_shift_duration`
+(
+    `id`            VARCHAR(64) NOT NULL COMMENT '主键',
+    `shift_id`      VARCHAR(64) NOT NULL COMMENT '工作班次id',
+    `start_time`    date        NOT NULL COMMENT '适用时间的开始时间',
+    `end_time`      date        NOT NULL COMMENT '适用时间的结束时间',
+    `ts`            TIMESTAMP            default current_timestamp on update current_timestamp NOT NULL COMMENT '乐观锁',
+    `creator`       VARCHAR(32) NOT NULL COMMENT '创建人',
+    `creation_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `modifier`      VARCHAR(32) NOT NULL COMMENT '最后修改人',
+    `modified_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
+    `valid`         INT(11)     NOT NULL COMMENT '合法标识',
+    PRIMARY KEY (`id`)
+) ENGINE = INNODB
+  CHARSET = utf8mb4 COMMENT '工作班次适用日期表';
+
+CREATE TABLE
+    IF
+    NOT EXISTS `work_shift_rest`
+(
+    `id`            VARCHAR(64) NOT NULL COMMENT '主键',
+    `shift_id`      VARCHAR(64) NOT NULL COMMENT '班次的id',
+    `start_time`    VARCHAR(64) NULL COMMENT '班次的休息开始时间',
+    `end_time`      VARCHAR(64) NULL COMMENT '班次的休息结束时间',
+    `ts`            TIMESTAMP            default current_timestamp on update current_timestamp NOT NULL COMMENT '乐观锁',
+    `creator`       VARCHAR(32) NOT NULL COMMENT '创建人',
+    `creation_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `modifier`      VARCHAR(32) NOT NULL COMMENT '最后修改人',
+    `modified_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
+    `valid`         INT(11)     NOT NULL COMMENT '合法标识',
+    PRIMARY KEY (`id`)
+) ENGINE = INNODB
+  CHARSET = utf8mb4 COMMENT '工作班次休息时间表';
+
+
+CREATE TABLE
+    IF
+    NOT EXISTS `work_shift_conflict`
+(
+    `id`               VARCHAR(64) NOT NULL COMMENT '主键',
+    `source_shift_id`  VARCHAR(64) NOT NULL COMMENT '被比较的班次的id',
+    `current_shift_id` VARCHAR(64) NULL COMMENT '当前的班次的id',
+    `ts`            TIMESTAMP            default current_timestamp on update current_timestamp NOT NULL COMMENT '乐观锁',
+    `creator`          VARCHAR(32) NOT NULL COMMENT '创建人',
+    `creation_time`    TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `modifier`         VARCHAR(32) NOT NULL COMMENT '最后修改人',
+    `modified_time`    TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
+    `valid`            INT(11)     NOT NULL COMMENT '合法标识',
+    PRIMARY KEY (`id`)
+) ENGINE = INNODB
+  CHARSET = utf8mb4 COMMENT '工作班次冲突表';
+
+
+
+CREATE TABLE
+    IF
+    NOT EXISTS `work_person`
+(
+    `id`            VARCHAR(64) NOT NULL COMMENT '主键',
+    `person_id`     VARCHAR(64) NOT NULL COMMENT '工作人员id',
+    `dept_id`       VARCHAR ( 64) NOT NULL COMMENT '部门id',
+    `project_id`    VARCHAR(64) NOT NULL COMMENT '项目id',
+    `ts`            TIMESTAMP            default current_timestamp on update current_timestamp NOT NULL COMMENT '乐观锁',
+    `creator`       VARCHAR(32) NOT NULL COMMENT '创建人',
+    `creation_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `modifier`      VARCHAR(32) NOT NULL COMMENT '最后修改人',
+    `modified_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
+    `valid`         INT(11)     NOT NULL COMMENT '合法标识',
+    PRIMARY KEY (`id`)
+) ENGINE = INNODB
+  CHARSET = utf8mb4 COMMENT '工作人员档案表';
+
+
+CREATE TABLE
+    IF
+    NOT EXISTS `work_schedule`
+(
+    `id`            VARCHAR(64) NOT NULL COMMENT '主键',
+    `work_day`      datetime NOT NULL COMMENT '上班的日期',
+    `shift_id`      VARCHAR(11) NOT NULL COMMENT '班次id',
+    `person_id`      VARCHAR(64) NOT NULL COMMENT '工作人员id',
+    `ts`            TIMESTAMP            default current_timestamp on update current_timestamp NOT NULL COMMENT '乐观锁',
+    `creator`       VARCHAR(32) NOT NULL COMMENT '创建人',
+    `creation_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `modifier`      VARCHAR(32) NOT NULL COMMENT '最后修改人',
+    `modified_time` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
+    `valid`         INT(11)     NOT NULL COMMENT '合法标识',
+    PRIMARY KEY (`id`)
+) ENGINE = INNODB
+  CHARSET = utf8mb4 COMMENT '工作排班表';
+
+CREATE TABLE
+    IF
+    NOT EXISTS `work_time`
+(
+    `id`              VARCHAR(64) NOT NULL COMMENT '主键',
+    `shift_id`   VARCHAR(11) NOT NULL COMMENT '班次id',
+    `staff_id`   VARCHAR(64) NOT NULL COMMENT '工作人员id',
+    `start_time` datetime    NOT NULL COMMENT '工作人员的真实上班时间',
+    `end_time`   datetime    NOT NULL COMMENT '工作人员真实下班时间',
+    `work_times`  int(8)      NOT NULL COMMENT '工作人员的真实工作时长 以分钟计',
+    `ts`              TIMESTAMP            default current_timestamp on update current_timestamp NOT NULL COMMENT '乐观锁',
+    `creator`         VARCHAR(32) NOT NULL COMMENT '创建人',
+    `creation_time`   TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `modifier`        VARCHAR(32) NOT NULL COMMENT '最后修改人',
+    `modified_time`   TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
+    `valid`           INT(11)     NOT NULL COMMENT '合法标识',
+    PRIMARY KEY (`id`)
+) ENGINE = INNODB
+  CHARSET = utf8mb4 COMMENT '员工工作时长表';
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 17 - 0
fm-scheduling/src/main/resources/mapper/WokeScheduleMapper.xml

@@ -0,0 +1,17 @@
+<?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.persagy.fm.scheduling.dao.WorkScheduleMapper">
+
+    <select id="getPage" resultType="com.persagy.fm.scheduling.model.dto.WorkScheduleDto">
+
+        select a.*,b.shift_abbr as shiftAbbr
+        from work_schedule a , work_shift b, work_person c where a.shift_id = b.id
+        and a.person_id = c.id
+        and a. work_day &gt;= #{schedule.minDate}
+        and a.work_day &lt; #{schedule.maxDate}
+        and c.project_id = #{schedule.projectId}
+        and c.dept_id = #{schedule.deptId}
+
+    </select>
+</mapper>
+