Procházet zdrojové kódy

排班开发内容

予一兮 před 4 roky
rodič
revize
def870eeba
20 změnil soubory, kde provedl 535 přidání a 64 odebrání
  1. 0 25
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/constant/enums/WorkTime.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/WorkScheduleMapper.java
  4. 29 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/enums/WorkTimeType.java
  5. 4 4
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/model/WorkSchedule.java
  6. 113 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/service/WorkScheduleService.java
  7. 20 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/transform/WorkScheduleTransform.java
  8. 0 35
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/typehandler/WorkTimeTypeHandler.java
  9. 16 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/utils/StreamUtil.java
  10. 41 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/utils/Validator.java
  11. 43 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/request/DownloadFileVO.java
  12. 33 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/request/ScheduleListQueryVO.java
  13. 30 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/request/UpdateScheduleVO.java
  14. 42 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/response/OnePersonScheduleVO.java
  15. 21 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/response/ScheduleListResultVO.java
  16. 26 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/response/StatisticalInfoVO.java
  17. 18 0
      fm-scheduling/src/main/java/com/persagy/fm/scheduling/vo/response/WorkTimeResultVO.java
  18. 9 0
      fm-scheduling/src/main/resources/bootstrap.yml
  19. 18 0
      fm-scheduling/src/main/resources/db.init/table.sql
  20. 6 0
      fm-scheduling/src/main/resources/mapper/WokeScheduleMapper.xml

+ 0 - 25
fm-scheduling/src/main/java/com/persagy/fm/scheduling/constant/enums/WorkTime.java

@@ -1,25 +0,0 @@
-package com.persagy.fm.scheduling.constant.enums;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import org.springframework.lang.NonNull;
-
-import java.util.Arrays;
-
-@Getter
-@AllArgsConstructor
-public enum WorkTime {
-    DAY(1,"白班"),
-    NIGHT(2,"夜班"),
-    MIDDLE(3,"中班");
-
-    private Integer value;
-    private String desc;
-
-
-    public static WorkTime getByValue(@NonNull Integer value){
-        return Arrays.stream(WorkTime.values()).filter(a -> a.getValue().equals(value)).findFirst()
-                .orElseThrow(() -> new RuntimeException("workTime 的类型错误"));
-    }
-
-}

+ 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/WorkScheduleMapper.java

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

+ 29 - 0
fm-scheduling/src/main/java/com/persagy/fm/scheduling/enums/WorkTimeType.java

@@ -0,0 +1,29 @@
+package com.persagy.fm.scheduling.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.springframework.lang.NonNull;
+
+import java.util.Arrays;
+
+@Getter
+@AllArgsConstructor
+public enum WorkTimeType {
+    DAY(1,"白班"),
+    NIGHT(2,"夜班"),
+    MIDDLE(3,"中班");
+
+    @EnumValue
+    private final Integer value;
+    @JsonValue
+    private final  String desc;
+
+
+    public static WorkTimeType getByValue(@NonNull Integer value){
+        return Arrays.stream(WorkTimeType.values()).filter(a -> a.getValue().equals(value)).findFirst()
+                .orElseThrow(() -> new RuntimeException("workTime 的类型错误"));
+    }
+
+}

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

@@ -4,14 +4,14 @@ 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 com.persagy.fm.scheduling.typehandler.WorkTimeTypeHandler;
+import com.persagy.fm.scheduling.enums.WorkTimeType;
 import lombok.Data;
 
 import java.io.Serializable;
 
 
 @Data
-@TableName
+@TableName(value = "work_schedule")
 public class WorkSchedule extends AuditableEntity<WorkSchedule> implements Serializable {
 
     @TableField(value = "year")
@@ -26,6 +26,6 @@ public class WorkSchedule extends AuditableEntity<WorkSchedule> implements Seria
     private String departmentId;
     @TableField(value = "project_id")
     private String projectId;
-    @TableField(value = "work_time_type",typeHandler = WorkTimeTypeHandler.class)
-    private Integer workTimeType;
+    @TableField(value = "work_time_type")
+    private WorkTimeType workTimeType;
 }

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

@@ -0,0 +1,113 @@
+package com.persagy.fm.scheduling.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+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.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 com.persagy.fm.scheduling.vo.response.StatisticalInfoVO;
+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.List;
+import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicInteger;
+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();
+        QueryWrapper<WorkSchedule> wrapper = new QueryWrapper<WorkSchedule>().eq("project_id", vo.getProjectId())
+                .in("department_id", departmentIds)
+                .eq("year", vo.getYear())
+                .eq("month", vo.getMonth());
+
+        Page<WorkSchedule> page = new Page<WorkSchedule>().setSize(vo.getPageSize()).setCurrent(vo.getPageNum());
+
+
+        Page<WorkSchedule> workSchedulePage = workScheduleMapper.selectPage(page, wrapper);
+        final List<WorkSchedule> records = workSchedulePage.getRecords();
+        if (CollectionUtils.isEmpty(records)) return new PageList<>(Lists.newArrayList(), 0);
+        ConcurrentMap<String, List<WorkSchedule>> personSchedulesMap = records.stream()
+                .collect(Collectors.groupingByConcurrent(WorkSchedule::getPersonId));
+
+        //todo 根据personIds 获取用户信息
+        Set<String> personIds = personSchedulesMap.keySet();
+
+        List<OnePersonScheduleVO> personScheduleList = personSchedulesMap
+                .entrySet()
+                .stream().map(entry -> {
+                    List<WorkSchedule> value = entry.getValue();
+                    AtomicInteger workHours = new AtomicInteger();
+                    AtomicInteger remainWorkMinutes = new AtomicInteger();
+                    List<StatisticalInfoVO.OneStatisticalInfo> oneStatisticalInfos = value.stream()
+                            .collect(Collectors.groupingByConcurrent(WorkSchedule::getWorkTimeType))
+                            .entrySet().stream()
+                            .map(keyValue -> new StatisticalInfoVO.OneStatisticalInfo()
+                                    .setWorkTimeType(keyValue.getKey())
+                                    .setTimes(keyValue.getValue().size()))
+                            .peek(a -> {
+                                //todo 根据工作时间的配置 去处理工作时间的统计问题
+                            })
+                            .collect(Collectors.toList());
+                    List<OnePersonScheduleVO.WorkScheduleVO> workScheduleVOS = value.stream()
+                            .map(workScheduleTransform::toWorkScheduleVO)
+                            .collect(Collectors.toList());
+                    return new OnePersonScheduleVO()
+                            .setStatisticalInfoVO(new StatisticalInfoVO()
+                                    .setStatisticalInfos(oneStatisticalInfos)
+                                    .setWorkHours(workHours.get())
+                                    .setWorkMinutes(remainWorkMinutes.get()))
+                            .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.setWorkTimeType(a.getWorkTimeType());
+                b.setDay(a.getDay());
+            }
+        }));
+        workSchedules.forEach(workScheduleMapper::updateById);
+        return Boolean.TRUE;
+    }
+}

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

@@ -0,0 +1,20 @@
+package com.persagy.fm.scheduling.transform;
+
+import com.persagy.fm.scheduling.model.WorkSchedule;
+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(WorkSchedule workSchedule);
+
+
+    WorkSchedule toWorkSchedule(UpdateScheduleVO.ScheduleVO vo);
+
+
+}

+ 0 - 35
fm-scheduling/src/main/java/com/persagy/fm/scheduling/typehandler/WorkTimeTypeHandler.java

@@ -1,35 +0,0 @@
-package com.persagy.fm.scheduling.typehandler;
-
-import com.persagy.fm.scheduling.constant.enums.WorkTime;
-import org.apache.ibatis.type.JdbcType;
-import org.apache.ibatis.type.TypeHandler;
-
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-public class WorkTimeTypeHandler implements TypeHandler<WorkTime> {
-    @Override
-    public void setParameter(PreparedStatement ps, int i, WorkTime parameter, JdbcType jdbcType) throws SQLException {
-        ps.setInt(i, parameter.getValue());
-    }
-
-    @Override
-    public WorkTime getResult(ResultSet rs, String columnName) throws SQLException {
-        int anInt = rs.getInt(columnName);
-        return WorkTime.getByValue(anInt);
-    }
-
-    @Override
-    public WorkTime getResult(ResultSet rs, int columnIndex) throws SQLException {
-        int anInt = rs.getInt(columnIndex);
-        return WorkTime.getByValue(anInt);
-    }
-
-    @Override
-    public WorkTime getResult(CallableStatement cs, int columnIndex) throws SQLException {
-        int anInt = cs.getInt(columnIndex);
-        return WorkTime.getByValue(anInt);
-    }
-}

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

@@ -0,0 +1,16 @@
+package com.persagy.fm.scheduling.utils;
+
+import java.util.function.Consumer;
+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> void actionWhen(T t, Boolean flag, Consumer<T> consumer) {
+        if (flag) consumer.accept(t);
+    }
+}

+ 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 departmentId;
+    @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 com.persagy.fm.scheduling.enums.WorkTimeType;
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Data
+public class UpdateScheduleVO {
+
+
+    private @Valid List<ScheduleVO> scheduleVOS;
+
+
+    @Data
+    public static class ScheduleVO {
+        @NotBlank
+        private String id;
+        @NotNull
+        private WorkTimeType workTimeType;
+        @NotNull
+        private Integer day;
+    }
+
+
+}

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

@@ -0,0 +1,42 @@
+package com.persagy.fm.scheduling.vo.response;
+
+import com.persagy.fm.scheduling.enums.WorkTimeType;
+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 WorkTimeType workTimeType;
+    }
+
+
+}

+ 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;
+
+}

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

@@ -0,0 +1,26 @@
+package com.persagy.fm.scheduling.vo.response;
+
+import com.persagy.fm.scheduling.enums.WorkTimeType;
+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;
+    }
+}
+

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

@@ -0,0 +1,18 @@
+package com.persagy.fm.scheduling.vo.response;
+
+import com.persagy.fm.scheduling.enums.WorkTimeType;
+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

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

@@ -0,0 +1,18 @@
+CREATE TABLE IF NOT EXISTS `work_schedule` (
+`id` varchar(64) NOT NULL  COMMENT '主键',
+`year` int(11) NOT NULL COMMENT '年',
+`month` int(11) NOT NULL COMMENT '月',
+`day` int(11) NOT NULL COMMENT '日',
+`work_time_type` int(11) NOT NULL COMMENT '工作时间类型 1 白班 2 夜班  3 中班 ',
+`department_id` varchar(64) NOT NULL COMMENT '部门id',
+`project_id` varchar(80) NOT NULL COMMENT '项目id',
+`person_id` varchar(80) NOT NULL COMMENT '人员id',
+`ts` timestamp NULL NOT NULL COMMENT '乐观锁',
+`creator` varchar(32) NOT NULL COMMENT '创建人',
+`creation_time` timestamp NOT NULL COMMENT '创建时间',
+`modifier` varchar(32) NOT NULL COMMENT '最后修改人',
+`modified_time` timestamp NOT NULL COMMENT '最后修改时间',
+`valid` int(11) NOT NULL COMMENT '合法标识',
+ PRIMARY KEY (`id`)) ENGINE = InnoDB CHARSET = utf8mb4 COMMENT '工作排班表';
+CREATE index idx_year_month_day USING BTREE on work_schedule(`year`,`month`,`day`) ;
+CREATE index idx_work_time_type using HASH on work_schedule(`work_time_type`) ;

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

@@ -0,0 +1,6 @@
+<?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.WokeScheduleMapper">
+
+</mapper>
+