瀏覽代碼

绩效考核

lihui007 4 年之前
父節點
當前提交
a17f669b33
共有 35 個文件被更改,包括 1093 次插入42 次删除
  1. 2 0
      operation_manager/src/main/java/com/huaxu/OperationManagerMain.java
  2. 6 0
      operation_manager/src/main/java/com/huaxu/client/UserCenterClient.java
  3. 89 0
      operation_manager/src/main/java/com/huaxu/config/AsyncConfig.java
  4. 6 0
      operation_manager/src/main/java/com/huaxu/config/FeignConfig.java
  5. 10 0
      operation_manager/src/main/java/com/huaxu/evaluation/controller/EvaluationGradeController.java
  6. 45 0
      operation_manager/src/main/java/com/huaxu/evaluation/controller/EvaluationResultReportController.java
  7. 2 1
      operation_manager/src/main/java/com/huaxu/evaluation/dao/EvaluationItemMapper.java
  8. 10 0
      operation_manager/src/main/java/com/huaxu/evaluation/dao/EvaluationResultDetailsMapper.java
  9. 13 1
      operation_manager/src/main/java/com/huaxu/evaluation/dao/EvaluationResultMapper.java
  10. 10 0
      operation_manager/src/main/java/com/huaxu/evaluation/dao/EvaluationResultTaskMapper.java
  11. 11 1
      operation_manager/src/main/java/com/huaxu/evaluation/dto/EvaluationResultDetailsDto.java
  12. 2 2
      operation_manager/src/main/java/com/huaxu/evaluation/dto/EvaluationResultDto.java
  13. 42 0
      operation_manager/src/main/java/com/huaxu/evaluation/dto/EvaluationResultUpdateDto.java
  14. 1 0
      operation_manager/src/main/java/com/huaxu/evaluation/entity/EvaluationResultDetailsEntity.java
  15. 3 0
      operation_manager/src/main/java/com/huaxu/evaluation/entity/EvaluationResultEntity.java
  16. 4 4
      operation_manager/src/main/java/com/huaxu/evaluation/entity/EvaluationResultTaskEntity.java
  17. 25 0
      operation_manager/src/main/java/com/huaxu/evaluation/enums/EvaluationCycleEnums.java
  18. 318 4
      operation_manager/src/main/java/com/huaxu/evaluation/job/EvaluationResultJob.java
  19. 10 0
      operation_manager/src/main/java/com/huaxu/evaluation/service/EvaluationGradeService.java
  20. 48 0
      operation_manager/src/main/java/com/huaxu/evaluation/service/impl/EvaluationGradeServiceImpl.java
  21. 22 13
      operation_manager/src/main/java/com/huaxu/evaluation/service/impl/EvaluationResultDetailsServiceImpl.java
  22. 2 1
      operation_manager/src/main/java/com/huaxu/evaluation/service/impl/EvaluationResultServiceImpl.java
  23. 32 0
      operation_manager/src/main/java/com/huaxu/evaluation/vo/EvaluationItemValueVo.java
  24. 46 0
      operation_manager/src/main/java/com/huaxu/evaluation/vo/EvaluationItemVo.java
  25. 13 4
      operation_manager/src/main/java/com/huaxu/evaluation/vo/EvaluationResultTaskDetailsVo.java
  26. 3 0
      operation_manager/src/main/java/com/huaxu/evaluation/vo/EvaluationResultVo.java
  27. 204 0
      operation_manager/src/main/java/com/huaxu/utils/EvaluationUtil.java
  28. 12 0
      operation_manager/src/main/resources/application-dev.properties
  29. 11 0
      operation_manager/src/main/resources/application-prd.properties
  30. 11 0
      operation_manager/src/main/resources/application-sit.properties
  31. 35 0
      operation_manager/src/main/resources/mapper/evaluation/EvaluationItemMapper.xml
  32. 6 0
      operation_manager/src/main/resources/mapper/evaluation/EvaluationResultDetailsMapper.xml
  33. 24 8
      operation_manager/src/main/resources/mapper/evaluation/EvaluationResultMapper.xml
  34. 13 1
      operation_manager/src/main/resources/mapper/evaluation/EvaluationResultTaskMapper.xml
  35. 2 2
      operation_manager/src/main/resources/mapper/order/WorkOrderManageMapper.xml

+ 2 - 0
operation_manager/src/main/java/com/huaxu/OperationManagerMain.java

@@ -7,6 +7,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.ApplicationContext;
 import org.springframework.core.env.Environment;
+import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
 import java.net.InetAddress;
@@ -16,6 +17,7 @@ import java.net.UnknownHostException;
 @SpringBootApplication
 @EnableFeignClients
 @Slf4j
+@EnableAsync
 public class OperationManagerMain {
     public static void main(String[] args) throws UnknownHostException {
         ApplicationContext context = SpringApplication.run(OperationManagerMain.class, args);

+ 6 - 0
operation_manager/src/main/java/com/huaxu/client/UserCenterClient.java

@@ -51,4 +51,10 @@ public interface UserCenterClient {
      */
     @RequestMapping(value = "/dict/selectList", method = RequestMethod.POST)
     AjaxMessage<List<Dict>> selectDictList(@RequestBody Dict dict);
+
+    @PostMapping(value = "/user/findUserIdsByPermissonOrg")
+    List<Integer> findUserIdsByPermissonOrg(
+            @RequestParam(value = "tenantId", required = false) String tenantId,
+            @RequestParam(value = "companyOrgId", required = false)Integer companyOrgId,
+            @RequestParam(value = "deptOrgId", required = false)Integer deptOrgId);
 }

+ 89 - 0
operation_manager/src/main/java/com/huaxu/config/AsyncConfig.java

@@ -0,0 +1,89 @@
+package com.huaxu.config;
+
+import com.alibaba.fastjson.JSON;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@Slf4j
+@Data
+public class AsyncConfig implements AsyncConfigurer {
+
+    /**
+     * 核心线程池大小
+     */
+    @Value("${aysnc.pool.core-size}")
+    private Integer coreSize;
+    /**
+     * 最大线程池大小
+     */
+    @Value("${aysnc.pool.max-size}")
+    private Integer maxSize;
+    /**
+     * 线程池队列容量(默认Integer.MAX_VALUE)
+     */
+    @Value("${aysnc.queue-capacity}")
+    private Integer queueCapacity;
+    /**
+     * 线程池空闲时长(秒)
+     */
+    @Value("${aysnc.pool.keep-alive}")
+    private Integer keepAlive;
+    /**
+     * 线程池名称
+     */
+    @Value("${aysnc.thread-name-prefix}")
+    private String threadNamePrefix;
+
+    /**
+     * 配置异步线程池
+     *
+     * @return
+     */
+    @Override
+    public Executor getAsyncExecutor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        executor.setCorePoolSize(getCoreSize());
+        executor.setMaxPoolSize(getMaxSize());
+        //queueCapacity Integer.Max= 21 4748 3647
+        executor.setQueueCapacity(getQueueCapacity());
+        executor.setThreadNamePrefix(getThreadNamePrefix());
+        executor.setKeepAliveSeconds(getKeepAlive());
+        /** 拒绝异常处理 - 在调用线程中执行(当线程池中线程都以被占用且queue已满,则拒绝新提交的task,
+         * 默认为ThreadPoolExecutor.AbortPolicy抛出异常到上层应用 - 导致异步调用死掉,无法再处理新任务,
+         * 此处实现照搬ThreadPoolExecutor.CallerRunsPolicy且添加日志记录
+         *
+        executor.setRejectedExecutionHandler((r, e) -> {
+            log.error("Async thread pool over load - caller run - queue.size={} - 请devops人员考虑扩展服务实例", e.getQueue().size());
+            if (!e.isShutdown()) {
+                r.run();
+            }
+        });*/
+        // 设置拒绝策略:当pool已经达到max size的时候,如何处理新任务
+        // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        //如果不初始化,导致找到不到执行器(此语句需放到最后)
+        executor.initialize();
+        return executor;
+    }
+
+    /**
+     * 异步线程池 - 全局异常处理
+     *
+     * @return
+     */
+    @Override
+    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
+        return (ex, method, params) -> {
+            log.info("Async method: {} has uncaught exception, params:{}", method.getName(), JSON.toJSONString(params), ex);
+        };
+    }
+}

+ 6 - 0
operation_manager/src/main/java/com/huaxu/config/FeignConfig.java

@@ -19,7 +19,13 @@ public class FeignConfig implements RequestInterceptor {
     @Override
     public void apply(RequestTemplate requestTemplate) {
         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if (attributes == null) {
+            return;
+        }
         HttpServletRequest request = attributes.getRequest();
+        if (request == null) {
+            return;
+        }
         requestTemplate.header(HttpHeaders.AUTHORIZATION, request.getHeader(HttpHeaders.AUTHORIZATION));
     }
 }

+ 10 - 0
operation_manager/src/main/java/com/huaxu/evaluation/controller/EvaluationGradeController.java

@@ -10,11 +10,13 @@ import com.huaxu.util.UserUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import io.swagger.models.auth.In;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.ui.ModelMap;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -130,4 +132,12 @@ public class EvaluationGradeController {
             return new AjaxMessage<>(ResultStatus.OK, result);
         }
     }
+
+    @ApiOperation(value = "获取绩效等级")
+    @RequestMapping(value = "/getScoreGrade", method = RequestMethod.POST)
+    public AjaxMessage<String> getScoreGrade(@ApiParam(value = "租户ID", required = true) @RequestParam String tenantId,
+                                         @ApiParam(value = "租户ID", required = true) @RequestParam Integer companyOrgId,
+                                         @ApiParam(value = "租户ID", required = true) @RequestParam BigDecimal score) {
+        return new AjaxMessage<>(ResultStatus.OK, evaluationGradeService.getScoreGrade(tenantId, companyOrgId, score, true));
+    }
 }

+ 45 - 0
operation_manager/src/main/java/com/huaxu/evaluation/controller/EvaluationResultReportController.java

@@ -0,0 +1,45 @@
+package com.huaxu.evaluation.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.huaxu.evaluation.dto.EvaluationResultDto;
+import com.huaxu.evaluation.enums.EvaluationResultStatus;
+import com.huaxu.evaluation.service.EvaluationResultService;
+import com.huaxu.evaluation.vo.EvaluationResultVo;
+import com.huaxu.model.AjaxMessage;
+import com.huaxu.model.Pagination;
+import com.huaxu.model.ResultStatus;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * @ClassName EvaluationResultReportController
+ * @Description: 绩效报表
+ * @Author lihui
+ * @Date 2021/5/7
+ * @Version V1.0
+ **/
+@RestController
+@RequestMapping("/evaluation/report")
+@Api(tags = "绩效考评报表")
+public class EvaluationResultReportController {
+
+    @Autowired
+    private EvaluationResultService evaluationResultService;
+
+    @ApiOperation(value = "人员绩效排名")
+    @RequestMapping(value = "/find/page", method = RequestMethod.POST)
+    @ResponseBody
+    public AjaxMessage<Pagination<EvaluationResultVo>> findPage(@RequestBody @Valid EvaluationResultDto dto) {
+        IPage<EvaluationResultVo> page = evaluationResultService.findPage(dto);
+        if (page == null) {
+            return new AjaxMessage<>(EvaluationResultStatus.DATA_NOT_FOUND.getStatus(), EvaluationResultStatus.DATA_NOT_FOUND.getMessage(),null);
+        }
+        return new AjaxMessage<>(ResultStatus.OK, new Pagination<>(page));
+    }
+
+}
+

+ 2 - 1
operation_manager/src/main/java/com/huaxu/evaluation/dao/EvaluationItemMapper.java

@@ -4,6 +4,7 @@ import com.huaxu.evaluation.entity.EvaluationItemEntity;
 import java.io.Serializable;
 import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.huaxu.evaluation.vo.EvaluationItemVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -30,5 +31,5 @@ public interface EvaluationItemMapper extends BaseMapper<EvaluationItemEntity> {
 
      List<EvaluationItemEntity> findList(EvaluationItemEntity evaluationItemEntity);
 
-     /**删除相关方法  使用mybatis-plus集成的 **/
+    List<EvaluationItemVo> findListItem(EvaluationItemEntity evaluationItemEntity);
 }

+ 10 - 0
operation_manager/src/main/java/com/huaxu/evaluation/dao/EvaluationResultDetailsMapper.java

@@ -19,6 +19,16 @@ import java.util.List;
 @Mapper
 public interface EvaluationResultDetailsMapper extends BaseMapper<EvaluationResultDetailsEntity> {
 
+
+    /**
+    * @Author lihui
+    * @Description 插入考评结果详情
+    * @Date  2021/5/10
+    * @Param [entity]
+    * @return java.lang.Integer
+    **/
+    Integer insertEvaluationResultDetails(EvaluationResultDetailsEntity entity);
+
     /**
     * @Author lihui
     * @Description 查询考评结果详情ids

+ 13 - 1
operation_manager/src/main/java/com/huaxu/evaluation/dao/EvaluationResultMapper.java

@@ -3,12 +3,15 @@ package com.huaxu.evaluation.dao;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huaxu.evaluation.dto.EvaluationResultQueryDto;
+import com.huaxu.evaluation.dto.EvaluationResultUpdateDto;
+import com.huaxu.evaluation.entity.EvaluationResultEntity;
 import com.huaxu.evaluation.vo.EvaluationResultVo;
 import io.swagger.models.auth.In;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * @ClassName EvaluationResultMapper
@@ -20,6 +23,15 @@ import java.math.BigDecimal;
 @Mapper
 public interface EvaluationResultMapper {
 
+    /**
+    * @Author lihui
+    * @Description 插入考评结果
+    * @Date  2021/5/10
+    * @Param [evaluationResultEntity]
+    * @return void
+    **/
+    Integer insertEvaluationResult(@Param("item")EvaluationResultEntity item);
+
     /**
     * @Author lihui
     * @Description 分页查询考评结果
@@ -45,6 +57,6 @@ public interface EvaluationResultMapper {
     * @Param [evaluationResultId, Score]
     * @return java.lang.Integer
     **/
-    Integer updateEvaluationScore(Integer evaluationResultId, BigDecimal score);
+    Integer updateEvaluationScore(EvaluationResultUpdateDto updateDto);
 
 }

+ 10 - 0
operation_manager/src/main/java/com/huaxu/evaluation/dao/EvaluationResultTaskMapper.java

@@ -1,5 +1,6 @@
 package com.huaxu.evaluation.dao;
 
+import com.huaxu.evaluation.entity.EvaluationResultTaskEntity;
 import com.huaxu.evaluation.vo.EvaluationResultTaskDetailsVo;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -14,6 +15,15 @@ import org.apache.ibatis.annotations.Mapper;
 public interface EvaluationResultTaskMapper {
 
 
+    Integer insertEvaluationResultTask(EvaluationResultTaskEntity entity);
+
+    /**
+    * @Author lihui
+    * @Description 查询考评结果
+    * @Date 16:12 2021/5/10
+    * @Param [evaluationResultId]
+    * @return com.huaxu.evaluation.vo.EvaluationResultTaskDetailsVo
+    **/
     EvaluationResultTaskDetailsVo findResultTaskDetail(Integer evaluationResultId);
 
 }

+ 11 - 1
operation_manager/src/main/java/com/huaxu/evaluation/dto/EvaluationResultDetailsDto.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.util.List;
 
@@ -19,7 +20,16 @@ import java.util.List;
 public class EvaluationResultDetailsDto {
 
     @ApiModelProperty(value = "考评结果Id")
-    private Integer resultDetailsId;
+    @NotNull
+    private Integer resultId;
+
+    @ApiModelProperty(value = "租户Id")
+    @NotNull
+    private String tenantId;
+
+    @ApiModelProperty(value = "公司Id")
+    @NotNull
+    private Integer companyOrgId;
 
     @ApiModelProperty(value = "考评结果详情Id")
     private List<EvaluationDetailsDto> detailsDtoList;

+ 2 - 2
operation_manager/src/main/java/com/huaxu/evaluation/dto/EvaluationResultDto.java

@@ -30,7 +30,7 @@ public class EvaluationResultDto extends  BasePageDto{
     @ApiModelProperty(value="考评状态:0未考评 1已考评")
     private Integer state;
 
-    @ApiModelProperty(value="类型:1月度,2季度,3年度")
+    @ApiModelProperty(value="类型:周期(0月度 1季度 2年度)")
     private Integer cycle;
 
     @ApiModelProperty(value="年")
@@ -40,5 +40,5 @@ public class EvaluationResultDto extends  BasePageDto{
     private Integer month;
 
     @ApiModelProperty(value="1:考评,2:得分")
-    private Integer sort;
+    private int sort;
 }

+ 42 - 0
operation_manager/src/main/java/com/huaxu/evaluation/dto/EvaluationResultUpdateDto.java

@@ -0,0 +1,42 @@
+package com.huaxu.evaluation.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @ClassName EvaluationResultUpdateDto
+ * @Description: 考评结果修改
+ * @Author lihui
+ * @Date 2021/5/11
+ * @Version V1.0
+ **/
+@Data
+@ApiModel(value = "考评结果修改")
+public class EvaluationResultUpdateDto {
+
+    @ApiModelProperty(value="考评结果ID")
+    private Integer evaluationResultId;
+
+    @ApiModelProperty(value="得分")
+    private BigDecimal score;
+
+    @ApiModelProperty(value="等级")
+    private Integer evaluationGrade;
+
+    @ApiModelProperty(value="更新人")
+    private String updateBy;
+
+    @ApiModelProperty(value="更新时间")
+    private Date dateUpdate;
+
+    @ApiModelProperty(value="考评时间")
+    private Date dateEvaluation;
+
+    @ApiModelProperty(value="考评人")
+    private String evaluationBy;
+
+}

+ 1 - 0
operation_manager/src/main/java/com/huaxu/evaluation/entity/EvaluationResultDetailsEntity.java

@@ -3,6 +3,7 @@ package com.huaxu.evaluation.entity;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.huaxu.base.BaseEntity;
 import io.swagger.annotations.ApiModelProperty;
+import io.swagger.models.auth.In;
 import lombok.Data;
 
 import java.math.BigDecimal;

+ 3 - 0
operation_manager/src/main/java/com/huaxu/evaluation/entity/EvaluationResultEntity.java

@@ -27,6 +27,9 @@ public class EvaluationResultEntity extends BaseEntity {
     @ApiModelProperty(value = "被考评人")
     private String evaluationBe;
 
+    @ApiModelProperty(value = "被考评人")
+    private Long evaluationBeUserId;
+
     @ApiModelProperty(value = "考评状态(0未考评 1已考评)")
     private Integer state;
 

+ 4 - 4
operation_manager/src/main/java/com/huaxu/evaluation/entity/EvaluationResultTaskEntity.java

@@ -23,16 +23,16 @@ public class EvaluationResultTaskEntity extends BaseEntity {
     private Integer evaluationResultId;
 
     @ApiModelProperty(value = "任务总数")
-    private Integer totalCount;
+    private int totalCount;
 
     @ApiModelProperty(value = "已完成")
-    private Integer completeCount;
+    private int completeCount;
 
     @ApiModelProperty(value = "待完成")
-    private Integer noCompleteCount;
+    private int noCompleteCount;
 
     @ApiModelProperty(value = "延期完成")
-    private Integer delayCompleteCount;
+    private int delayCompleteCount;
 
     @ApiModelProperty(value = "完成率")
     private BigDecimal completionRate;

+ 25 - 0
operation_manager/src/main/java/com/huaxu/evaluation/enums/EvaluationCycleEnums.java

@@ -0,0 +1,25 @@
+package com.huaxu.evaluation.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum EvaluationCycleEnums {
+
+    MONTH(0,"月"),
+
+    QUARTER(1,"季度"),
+
+    YEAR(2,"年度")
+
+    ,
+    ;
+
+    private final int type;
+
+    private final String message;
+
+    EvaluationCycleEnums(int type, String message) {
+        this.type = type;
+        this.message = message;
+    }
+}

+ 318 - 4
operation_manager/src/main/java/com/huaxu/evaluation/job/EvaluationResultJob.java

@@ -1,11 +1,34 @@
 package com.huaxu.evaluation.job;
 
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huaxu.client.UserCenterClient;
+import com.huaxu.evaluation.dao.*;
+import com.huaxu.evaluation.entity.*;
+import com.huaxu.evaluation.enums.EvaluationCycleEnums;
+import com.huaxu.evaluation.vo.EvaluationItemValueVo;
+import com.huaxu.evaluation.vo.EvaluationItemVo;
+import com.huaxu.evaluation.vo.EvaluationResultTaskDetailsVo;
+import com.huaxu.exception.ServiceException;
 import com.huaxu.order.dao.WorkOrderManageMapper;
+import com.huaxu.order.dto.WorkOrderManageDto;
+import com.huaxu.task.entity.UserEntity;
+import com.huaxu.util.DatesUtil;
+import com.huaxu.utils.EvaluationUtil;
+import io.swagger.models.auth.In;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @ClassName EvaluationResultJob
@@ -22,12 +45,303 @@ public class EvaluationResultJob {
     @Autowired
     private WorkOrderManageMapper workOrderManageMapper;
 
-    @Scheduled(cron = "0/5 * * * * ?")
+    @Autowired
+    private UserCenterClient userCenterClient;
+
+    @Autowired
+    private EvaluationCycleMapper evaluationCycleMapper;
+
+    @Autowired
+    private EvaluationResultDetailsMapper evaluationResultDetailsMapper;
+
+    @Autowired
+    private EvaluationResultMapper evaluationResultMapper;
+
+    @Autowired
+    private EvaluationResultTaskMapper evaluationResultTaskMapper;
+
+    @Autowired
+    private EvaluationItemMapper evaluationItemMapper;
+
+    private static boolean lock = false;
+
+    // 保存考评项目设置
+    static Map<String, List<EvaluationItemVo>> itemMap = new HashMap<>();
+
+    static Map<String,  List<Integer>> userIdsMap = new HashMap<>();
+
+
+
+    //@Scheduled(cron = "0/5 * * * * ?")
+    @Async
     public void run(){
-        log.info("开始了");
+        if (lock){
+            return;
+        }
+        lock = true;
+        log.info("============绩效考评数据生成begin=====================");
+        // 首先查询哪些公司设置了绩效考评
+        List<EvaluationCycleEntity> evaluationCycleEntities =  evaluationCycleMapper.findList(new EvaluationCycleEntity());
+        try {
+            for (EvaluationCycleEntity evaluationCycleEntity : evaluationCycleEntities) {
+                // 查询公司设置的考评日期是否是今天
+                if (!EvaluationUtil.isToday(evaluationCycleEntity.getEvaluationDay())) {
+                    continue;
+                }
+                // 如果是年度,需要检查当前日期是否是在1月份
+                if (evaluationCycleEntity.getType() == EvaluationCycleEnums.YEAR.getType() &&
+                        !EvaluationUtil.sameMonth(1)) {
+                    continue;
+                }
+                userTask(evaluationCycleEntity.getTenantId(), evaluationCycleEntity.getCompanyOrgId(), evaluationCycleEntity.getType());
+            }
+        } catch (Exception e) {
+            log.error("绩效考评定时任务出错->", e);
+        } finally {
+            // 用完直接clear
+            itemMap.clear();
+            //lock = false;
+        }
+        log.info("============绩效考评数据生成end=====================");
+    }
+
+    /**
+    * @Author lihui
+    * @Description 用户任务分解
+    * @Date 18:19 2021/5/10
+    * @Param [tenantId:租户ID, companyOrgId : 公司ID, cycle : 类型(0月度 1季度 2年度)]
+    * @return void
+    **/
+    public void userTask(String tenantId, Integer companyOrgId, Integer cycle){
+        // 查询该租户公司下的所有用户
+        List<Integer> userIds = getUserIds(tenantId, companyOrgId);
+        Map<Long, UserEntity> userEntityMap = toMap(userIds);
+        String startTime = null;
+        String endTime   = null;
+        List<EvaluationItemVo> itemEntityList = null;
+        for (Integer userId : userIds) {
+            UserEntity userEntity = userEntityMap.get(Long.parseLong(userId.toString()));
+            if (userEntity == null) {
+                continue;
+            }
+            itemEntityList = findItem(userEntity);
+            // 1.获取部门考评项设置,如果未设置直接过滤
+            // 2.判断部门考评项目设置里面有没有设置对应的考评周期,没有就直接过滤
+            if (CollectionUtil.isEmpty(itemEntityList) || !EvaluationUtil.containsType(itemEntityList, cycle)) {
+                continue;
+            }
+            try {
+                // 根据类型(0月度 1季度 2年度)得到当前的开始时间和结束时间,如果是按季度,当月必须是1,4,7,10
+                startTime = EvaluationUtil.getStartTime(cycle, null, null);
+                endTime   = EvaluationUtil.getEndTime(cycle, null,null);
+                if (startTime == null || endTime == null) {
+                    continue;
+                }
+                // 保存用户考评结果
+                saveEvaluationResultInfo(userEntity, itemEntityList , startTime, endTime ,cycle);
+            } catch (Exception e) {
+                log.error("保存用户考评信息出错->", e);
+            }
+        }
+    }
+
+    private List<Integer> getUserIds(String tenantId, Integer companyOrgId){
+        String key = tenantId + "_" + companyOrgId;
+        List<Integer> result = userIdsMap.get(key);
+        if (result == null){
+            result = userCenterClient.findUserIdsByPermissonOrg(tenantId, companyOrgId, null);
+            userIdsMap.put(key, result);
+        }
+        return result;
+    }
+
+
+    /**
+    * @Author lihui
+    * @Description  保存用户考评结果
+    * @Date 10:26 2021/5/11
+    * @Param [userEntity, itemEntityList, startTime, endTime, cycle]
+    * @return void
+    **/
+    @Transactional
+    public void saveEvaluationResultInfo(UserEntity userEntity, List<EvaluationItemVo> itemEntityList, String startTime, String endTime, Integer cycle){
+        Calendar calendar = EvaluationUtil.getCalendar(endTime);
+        // 计算用户完成任务情况
+        EvaluationResultTaskEntity taskDetailsVo = calculationTaskInfo(userEntity.getId().intValue(), userEntity.getTenantId(), startTime, endTime, getValueCondition(itemEntityList));
+        // 组装考评结果数据
+        EvaluationResultEntity resultEntity = packagesEvaluationResultEntity(userEntity, calendar, cycle, startTime, endTime);
+        // 保存考评结果
+        if (evaluationResultMapper.insertEvaluationResult(resultEntity) != 1) {
+            throw new ServiceException(500, "保存考评结果出错,退出。");
+        }
+        Integer resultId = resultEntity.getId().intValue();
+        taskDetailsVo.setEvaluationResultId(resultId);
+        // 保存考评结果任务详情
+        evaluationResultTaskMapper.insertEvaluationResultTask(taskDetailsVo);
+        BigDecimal completeCount   = new BigDecimal(taskDetailsVo.getCompleteCount()) ;
+        BigDecimal completionRate  = taskDetailsVo.getCompletionRate();
+        BigDecimal evaluationValue = null;
+        for (EvaluationItemVo item : itemEntityList) {
+            // 不是当前季度的,过滤
+            if (item.getCycle().indexOf(cycle.toString()) == -1 || item.getType() == null) {
+                continue;
+            }
+            evaluationValue = item.getType() == 1 ? completeCount : completionRate;
+            EvaluationResultDetailsEntity detailsEntity = new EvaluationResultDetailsEntity();
+            detailsEntity.setEvaluationResultId(resultId);
+            detailsEntity.setEvaluationItemId(item.getItemId());
+            detailsEntity.setValue(getScore(item.getType(), item.getEvaluationItemValueVoList(), evaluationValue));
+            detailsEntity.setDateCreate(new Date());
+            detailsEntity.setDateUpdate(new Date());
+            detailsEntity.setTenantId(userEntity.getTenantId());
+            detailsEntity.setStatus(1);
+            evaluationResultDetailsMapper.insertEvaluationResultDetails(detailsEntity);
+        }
+    }
+
+    /**
+    * @Author lihui
+    * @Description 计算用户完成任务情况
+    * @Date 17:38 2021/5/10
+    * @Param [userId, tenantId, startTime, endTime,valueCondition:延期时间多少分钟内算正常]
+    * @return void
+    **/
+    private EvaluationResultTaskEntity calculationTaskInfo(Integer userId, String tenantId, String startTime, String endTime, BigDecimal valueCondition) {
+        int page = 1;
+        IPage<WorkOrderManageDto> iPage = null;
+        EvaluationResultTaskEntity taskEntity = new EvaluationResultTaskEntity();
+        boolean completedBoolean = false;
+        while (true) {
+            iPage = new Page<>(page, 200);
+            // 查询该用户的工单和任务
+            Page<WorkOrderManageDto> pageList = workOrderManageMapper.selectByTime(iPage,  userId, tenantId, startTime, endTime);
+            if (pageList == null || CollectionUtil.isEmpty(pageList.getRecords())) {
+                break;
+            }
+            for (WorkOrderManageDto dto : pageList.getRecords()) {
+                completedBoolean = EvaluationUtil.completed(dto.getOrderStatus());
+                taskEntity.setTotalCount(taskEntity.getTotalCount() + 1);
+                taskEntity.setCompleteCount(taskEntity.getCompleteCount() + (completedBoolean ? 1 : 0));
+                taskEntity.setNoCompleteCount(taskEntity.getNoCompleteCount() + (!completedBoolean ? 1 : 0));
+                int addMinute = valueCondition == null ? EvaluationUtil.minute(dto.getDateLimit()) : valueCondition.intValue();
+                // 计算完成的是否属于延期完成
+                if (completedBoolean && EvaluationUtil.isDelay(dto.getFinishDate(), dto.getPlanFinishDate(), addMinute)) {
+                    taskEntity.setDelayCompleteCount(taskEntity.getDelayCompleteCount() + 1);
+                }
+            }
+            page ++;
+        }
+        // 计算完成率和延期率
+        taskEntity.setCompletionRate(EvaluationUtil.divide(taskEntity.getCompleteCount(),taskEntity.getTotalCount()));
+        taskEntity.setDelayRate(EvaluationUtil.divide(taskEntity.getDelayCompleteCount(),taskEntity.getTotalCount()));
+        taskEntity.setTenantId(tenantId);
+        taskEntity.setStatus(1);
+        taskEntity.setDateCreate(new Date());
+        return taskEntity;
+    }
+
+    /**
+     * @Author lihui
+     * @Description 获取部门考评项
+     * @Date 17:36 2021/5/10
+     * @Param [userEntity]
+     * @return java.util.List<com.huaxu.evaluation.entity.EvaluationItemEntity>
+     **/
+    private List<EvaluationItemVo> findItem(UserEntity userEntity){
+        Integer companyOrgId = EvaluationUtil.toInteger(userEntity.getCompanyOrgId());
+        Integer deptOrgId    = EvaluationUtil.toInteger(userEntity.getDeptOrgId());
+        String  tenantId = userEntity.getTenantId();
+        String key = tenantId + "_" + companyOrgId + "_" + deptOrgId;
+        List<EvaluationItemVo> itemVos = itemMap.get(key);
+        if (itemVos != null) {
+            return  itemVos;
+        }
+        EvaluationItemEntity queryItem = new EvaluationItemEntity();
+        queryItem.setCompanyOrgId(companyOrgId);
+        queryItem.setDeptOrgId(deptOrgId);
+        queryItem.setTenantId(tenantId);
+        itemVos = evaluationItemMapper.findListItem(queryItem);
+        itemMap.put(key, itemVos);
+        return itemVos;
+    }
 
-        // 首先查询设置表
 
-        // workOrderManageMapper.selectByTime();
+    /**
+    * @Author lihui
+    * @Description 组装考评结果数据
+    * @Date 15:03 2021/5/11
+    * @Param [userEntity, calendar, cycle, startTime, endTime]
+    * @return com.huaxu.evaluation.entity.EvaluationResultEntity
+    **/
+    private EvaluationResultEntity packagesEvaluationResultEntity(UserEntity userEntity, Calendar calendar, Integer cycle, String startTime, String endTime){
+        EvaluationResultEntity resultEntity = new EvaluationResultEntity();
+        resultEntity.setYear(calendar.get(Calendar.YEAR));
+        resultEntity.setMonth(calendar.get(Calendar.MONTH) + 1);
+        resultEntity.setEvaluationBe(userEntity.getUsername());
+        resultEntity.setEvaluationBeUserId(userEntity.getId());
+        resultEntity.setCycle(cycle);
+        resultEntity.setState(0);
+        resultEntity.setDateStart(DatesUtil.parseDate(startTime, "yyyy-MM-dd HH:mm:ss"));
+        resultEntity.setDateEnd(DatesUtil.parseDate(endTime, "yyyy-MM-dd HH:mm:ss"));
+        resultEntity.setTenantId(userEntity.getTenantId());
+        resultEntity.setCompanyOrgId(EvaluationUtil.toInteger(userEntity.getCompanyOrgId()));
+        resultEntity.setDeptOrgId(EvaluationUtil.toInteger(userEntity.getDeptOrgId()));
+        resultEntity.setDateCreate(new Date());
+        resultEntity.setStatus(1);
+        return resultEntity;
     }
+
+    private Map<Long, UserEntity> toMap(List<Integer> userIds){
+        List<UserEntity> userEntities = userCenterClient.findUserIdsByUserIds(EvaluationUtil.toLong(userIds));
+        if (CollectionUtil.isEmpty(userEntities)){
+            return  null;
+        }
+        return userEntities.stream().collect(Collectors.toMap(UserEntity::getId, a -> a,(k1, k2)->k1));
+    }
+
+    private BigDecimal getScore (Integer type, List<EvaluationItemValueVo> list, BigDecimal evaluationValue){
+        if (type != 1 && type != 2) {
+            return null;
+        }
+        Integer itemType     = null;
+        BigDecimal itemValue = null;
+        BigDecimal valueOne  = null;
+        BigDecimal valueTwo  = null;
+        for (EvaluationItemValueVo evaluationItemValueVo: list) {
+            itemType  = evaluationItemValueVo.getItemType();
+            itemValue = evaluationItemValueVo.getItemValue();
+            valueOne  = evaluationItemValueVo.getValueOne();
+            valueTwo  = evaluationItemValueVo.getValueTwo();
+            // 大于等于 0大于等于 2小于 1介于
+            if (itemType == 0 && evaluationValue.compareTo(valueOne) > -1) {
+                return itemValue;
+            }
+            // 小于
+            if (itemType == 2 &&  evaluationValue.compareTo(valueOne) == -1) {
+                return itemValue;
+            }
+            // 介于 : 比如取8-10,就是≥8,<10
+            if (itemType == 1 && evaluationValue.compareTo(valueOne) > -1  && evaluationValue.compareTo(valueTwo) == -1) {
+                return itemValue;
+            }
+        }
+        return new BigDecimal("0");
+    }
+
+    /**
+     * @Author lihui
+     * @Description 获取任务按时完成率设定的条件值
+     * @Date 9:40 2021/5/11
+     * @Param [itemEntityList]
+     * @return java.math.BigDecimal
+     **/
+    private BigDecimal getValueCondition(List<EvaluationItemVo> itemEntityList){
+        for (EvaluationItemVo evaluationItemVo: itemEntityList) {
+            if (evaluationItemVo.getType() == 2) {
+                return evaluationItemVo.getValueCondition();
+            }
+        }
+        return null;
+    }
+
 }

+ 10 - 0
operation_manager/src/main/java/com/huaxu/evaluation/service/EvaluationGradeService.java

@@ -13,6 +13,7 @@ import javax.annotation.Resource;
 
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.Map;
 import java.util.List;
 import java.util.Arrays;
@@ -61,4 +62,13 @@ public interface EvaluationGradeService {
      * 根居ID获取对象
      */
     public EvaluationGradeEntity findEvaluationGradeById(Long id) ;
+
+    /**
+    * @Author lihui
+    * @Description 获取得分等级
+    * @Date 15:57 2021/5/11
+    * @Param [tenantId, companyOrgId, score]
+    * @return java.lang.String
+    **/
+    String getScoreGrade(String tenantId, Integer companyOrgId, BigDecimal score, boolean formatName);
 }

+ 48 - 0
operation_manager/src/main/java/com/huaxu/evaluation/service/impl/EvaluationGradeServiceImpl.java

@@ -9,7 +9,9 @@ import com.huaxu.dict.DictUtil;
 import com.huaxu.evaluation.dao.EvaluationGradeMapper;
 import com.huaxu.evaluation.entity.EvaluationGradeEntity;
 import com.huaxu.evaluation.service.EvaluationGradeService;
+import com.huaxu.model.AjaxMessage;
 import com.huaxu.model.LoginUser;
+import com.huaxu.model.ResultStatus;
 import com.huaxu.org.OrgInfoUtil;
 import com.huaxu.util.UserUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,6 +19,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -114,4 +117,49 @@ public class EvaluationGradeServiceImpl extends ServiceImpl<EvaluationGradeMappe
     public EvaluationGradeEntity findEvaluationGradeById(Long id) {
         return evaluationGradeMapper.findEvaluationGradeById(id);
     }
+
+    @Override
+    public String getScoreGrade(String tenantId, Integer companyOrgId, BigDecimal score, boolean formatName){
+        EvaluationGradeEntity gradeEntity = new EvaluationGradeEntity();
+        gradeEntity.setTenantId(tenantId);
+        gradeEntity.setCompanyOrgId(companyOrgId);
+        List<EvaluationGradeEntity> list = evaluationGradeMapper.findList(gradeEntity);
+        if (list == null) {
+            return null;
+        }
+        // 0大于等于 2小于 1介于
+        Long type = null;
+        BigDecimal valueOne= null;
+        BigDecimal valueTwo= null;
+        Long grade = null;
+        for (EvaluationGradeEntity evaluationGradeEntity: list) {
+            type  = evaluationGradeEntity.getType();
+            valueOne  = new BigDecimal(evaluationGradeEntity.getValueOne() == null ? 0 : evaluationGradeEntity.getValueOne());
+            valueTwo  = new BigDecimal(evaluationGradeEntity.getValueTwo() == null ? 0 : evaluationGradeEntity.getValueTwo());
+            // 大于等于 0大于等于 2小于 1介于
+            if (type == 0 && score.compareTo(valueOne) > -1) {
+                grade = evaluationGradeEntity.getEvaluationGrade();
+                break;
+            }
+            // 小于
+            if (type == 2 &&  score.compareTo(valueOne) == -1) {
+                grade = evaluationGradeEntity.getEvaluationGrade();
+                break;
+            }
+            // 介于 : 比如取8-10,就是≥8,<10
+            if (type == 1 && score.compareTo(valueOne) > -1  && score.compareTo(valueTwo) == -1) {
+                grade = evaluationGradeEntity.getEvaluationGrade();
+                break;
+            }
+        }
+        if (grade == null) {
+            return null;
+        }
+        return formatName ? dictUtil.getDictName("SC_EVALUATION_GRADE", grade.intValue()) : grade.toString();
+    }
+
+    public static void main(String[] args) {
+        BigDecimal score = new BigDecimal("60");
+        System.out.println(score.compareTo(new BigDecimal("40")) > -1 && score.compareTo(new BigDecimal("50"))== -1);
+    }
 }

+ 22 - 13
operation_manager/src/main/java/com/huaxu/evaluation/service/impl/EvaluationResultDetailsServiceImpl.java

@@ -6,11 +6,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huaxu.client.UserCenterClient;
 import com.huaxu.evaluation.dao.EvaluationResultDetailsMapper;
 import com.huaxu.evaluation.dao.EvaluationResultMapper;
-import com.huaxu.evaluation.dto.EvaluationDetailsDto;
-import com.huaxu.evaluation.dto.EvaluationResultDetailsDto;
-import com.huaxu.evaluation.dto.EvaluationResultDto;
-import com.huaxu.evaluation.dto.EvaluationResultQueryDto;
+import com.huaxu.evaluation.dto.*;
 import com.huaxu.evaluation.enums.EvaluationResultStatus;
+import com.huaxu.evaluation.service.EvaluationGradeService;
 import com.huaxu.evaluation.service.EvaluationResultDetailsService;
 import com.huaxu.evaluation.vo.EvaluationResultVo;
 import com.huaxu.exception.ServiceException;
@@ -29,10 +27,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -52,21 +47,25 @@ public class EvaluationResultDetailsServiceImpl  implements EvaluationResultDeta
     @Autowired
     private EvaluationResultMapper evaluationResultMapper;
 
+    @Autowired
+    private EvaluationGradeService evaluationGradeService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateEvaluateScore(EvaluationResultDetailsDto dto) {
-        Integer resultDetailsId = dto.getResultDetailsId();
-        if (IntegerUtil.isNullOrZero(resultDetailsId)){
+        LoginUser currentUser = UserUtil.getCurrentUser();
+        Integer resultId = dto.getResultId();
+        if (IntegerUtil.isNullOrZero(resultId)){
             throw new ServiceException(EvaluationResultStatus.PARAM_ERROR.getStatus(), EvaluationResultStatus.PARAM_ERROR.getMessage());
         }
-        Integer state = evaluationResultMapper.findEvaluationState(resultDetailsId);
+        Integer state = evaluationResultMapper.findEvaluationState(resultId);
         if (state == null){
             throw new ServiceException(EvaluationResultStatus.DATA_NOT_FOUND.getStatus(), EvaluationResultStatus.DATA_NOT_FOUND.getMessage());
         }
         if (state == 1) {
             throw new ServiceException(EvaluationResultStatus.IS_ASSESSED.getStatus(), EvaluationResultStatus.IS_ASSESSED.getMessage());
         }
-        List<Integer> ids = evaluationResultDetailsMapper.findResultDetailsIds(resultDetailsId);
+        List<Integer> ids = evaluationResultDetailsMapper.findResultDetailsIds(resultId);
         List<EvaluationDetailsDto>  evaluationDetailsDtos =  dto.getDetailsDtoList();
         List<Integer> detailIds = evaluationDetailsDtos.stream().map(EvaluationDetailsDto::getDetailId).collect(Collectors.toList());
         if (!OperactionStringUtils.checkDifferent(ids, detailIds)){
@@ -79,8 +78,18 @@ public class EvaluationResultDetailsServiceImpl  implements EvaluationResultDeta
              evaluationResultDetailsMapper.updateEvaluateScore(detailsDto);
              score = score.add(detailsDto.getScore());
         }
+        // 获取分数对应的等级
+        String evaluationGrade = evaluationGradeService.getScoreGrade(dto.getTenantId(), dto.getCompanyOrgId(), score, false);
+        EvaluationResultUpdateDto updateDto = new EvaluationResultUpdateDto();
+        updateDto.setUpdateBy(currentUser.getUsername());
+        updateDto.setEvaluationGrade(StringUtils.isEmpty(evaluationGrade) ? null : Integer.parseInt(evaluationGrade));
+        updateDto.setEvaluationResultId(resultId);
+        updateDto.setDateEvaluation(new Date());
+        updateDto.setDateUpdate(new Date());
+        updateDto.setScore(score);
+        updateDto.setEvaluationBy(currentUser.getUsername());
         // 修改最终得分
-        evaluationResultMapper.updateEvaluationScore(resultDetailsId, score);
+        evaluationResultMapper.updateEvaluationScore(updateDto);
     }
 
 

+ 2 - 1
operation_manager/src/main/java/com/huaxu/evaluation/service/impl/EvaluationResultServiceImpl.java

@@ -7,6 +7,7 @@ import com.huaxu.client.UserCenterClient;
 import com.huaxu.evaluation.dao.EvaluationResultMapper;
 import com.huaxu.evaluation.dto.EvaluationResultDto;
 import com.huaxu.evaluation.dto.EvaluationResultQueryDto;
+import com.huaxu.evaluation.enums.EvaluationCycleEnums;
 import com.huaxu.evaluation.enums.EvaluationResultStatus;
 import com.huaxu.evaluation.service.EvaluationResultService;
 import com.huaxu.evaluation.vo.EvaluationResultVo;
@@ -108,7 +109,7 @@ public class EvaluationResultServiceImpl implements EvaluationResultService {
             throw new ServiceException(EvaluationResultStatus.PARAM_ERROR.getStatus(), EvaluationResultStatus.PARAM_ERROR.getMessage());
         }
         // 季度需要格式化
-        if (cycle == 2){
+        if (cycle == EvaluationCycleEnums.QUARTER.getType()){
             Integer month = dto.getMonth();
             if (month == null){
                 throw new ServiceException(EvaluationResultStatus.PARAM_ERROR.getStatus(), EvaluationResultStatus.PARAM_ERROR.getMessage());

+ 32 - 0
operation_manager/src/main/java/com/huaxu/evaluation/vo/EvaluationItemValueVo.java

@@ -0,0 +1,32 @@
+package com.huaxu.evaluation.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @ClassName EvaluationItemValueVo
+ * @Description: 考评项分值
+ * @Author lihui
+ * @Date 2021/5/7
+ * @Version V1.0
+ **/
+@Data
+@ApiModel(value = "考评项分值")
+public class EvaluationItemValueVo {
+
+    @ApiModelProperty(value = "类型(0大于等于 1小于 2介于)")
+    private Integer itemType;
+
+    @ApiModelProperty(value = "得分")
+    private BigDecimal itemValue;
+
+    @ApiModelProperty(value = "分值区间1")
+    private BigDecimal valueOne;
+
+    @ApiModelProperty(value = "分值区间2")
+    private BigDecimal valueTwo;
+
+}

+ 46 - 0
operation_manager/src/main/java/com/huaxu/evaluation/vo/EvaluationItemVo.java

@@ -0,0 +1,46 @@
+package com.huaxu.evaluation.vo;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @ClassName EvaluationItemVo
+ * @Description: 考评项信息
+ * @Author lihui
+ * @Date 2021/5/7
+ * @Version V1.0
+ **/
+@Data
+@ApiModel(value = "考评项信息")
+public class EvaluationItemVo {
+
+    @ApiModelProperty(value = "考评项Id")
+    private Integer itemId;
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "类型(0任务完成数 1任务按时完成率 2自定义)")
+    private Integer type;
+
+    @ApiModelProperty(value = "分值")
+    private BigDecimal value;
+
+    @ApiModelProperty(value = "条件值")
+    private BigDecimal valueCondition;
+
+    @ApiModelProperty(value = "周期(0月度 1季度 2年度)")
+    private String cycle;
+
+    @ApiModelProperty(value = "评分标准")
+    private String remarks;
+
+    @ApiModelProperty(value = "考评项分值")
+    private List<EvaluationItemValueVo> evaluationItemValueVoList;
+
+}

+ 13 - 4
operation_manager/src/main/java/com/huaxu/evaluation/vo/EvaluationResultTaskDetailsVo.java

@@ -21,16 +21,25 @@ import java.util.List;
 public class EvaluationResultTaskDetailsVo {
 
     @ApiModelProperty(value = "任务总数")
-    private Integer totalCount;
+    private Integer resultId;
+
+    @ApiModelProperty(value = "租户ID")
+    private String tenantId;
+
+    @ApiModelProperty(value = "公司ID")
+    private Integer companyOrgId;
+
+    @ApiModelProperty(value = "任务总数")
+    private int totalCount;
 
     @ApiModelProperty(value = "已完成")
-    private Integer completeCount;
+    private int completeCount;
 
     @ApiModelProperty(value = "待完成")
-    private Integer noCompleteCount;
+    private int noCompleteCount;
 
     @ApiModelProperty(value = "延期完成")
-    private Integer delayCompleteCount;
+    private int delayCompleteCount;
 
     @ApiModelProperty(value = "完成率")
     private BigDecimal completionRate;

+ 3 - 0
operation_manager/src/main/java/com/huaxu/evaluation/vo/EvaluationResultVo.java

@@ -21,6 +21,9 @@ public class EvaluationResultVo {
     @ApiModelProperty(value = "主键ID")
     private String id;
 
+    @ApiModelProperty(value = "主键ID")
+    private String tenantId;
+
     @ApiModelProperty(value = "被考评人")
     private String evaluationBe;
 

+ 204 - 0
operation_manager/src/main/java/com/huaxu/utils/EvaluationUtil.java

@@ -0,0 +1,204 @@
+package com.huaxu.utils;
+
+import com.huaxu.evaluation.enums.EvaluationCycleEnums;
+import com.huaxu.evaluation.vo.EvaluationItemVo;
+import com.huaxu.util.DatesUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName EvaluationJobUtil
+ * @Description: TODO
+ * @Author lihui
+ * @Date 2021/5/10
+ * @Version V1.0
+ **/
+public class EvaluationUtil {
+
+    private static Calendar getCalendar(){
+        return Calendar.getInstance();
+    }
+
+    public static Calendar getCalendar (String dateTime){
+        Calendar calendar = getCalendar();
+        calendar.setTime(DatesUtil.parseDate(dateTime, "yyyy-MM-dd HH:mm:ss"));
+        return calendar;
+    }
+
+    public static Integer toInteger(Long lon) {
+        return lon == null ? null : lon.intValue();
+    }
+
+    public static BigDecimal divide(Integer completeCount, Integer total){
+        BigDecimal bigDecimalComplete =  new BigDecimal(completeCount.toString());
+        BigDecimal bigDecimalTotal =  new BigDecimal(total.toString());
+        return bigDecimalComplete.divide(bigDecimalTotal,2, RoundingMode.HALF_UP);
+    }
+
+    /**
+    * @Author lihui
+    * @Description 转换分钟
+    * @Date 17:11 2021/5/11
+    * @Param [dataLimit]
+    * @return int
+    **/
+    public static int minute(String dataLimit){
+        if (StringUtils.isEmpty(dataLimit)){
+            return 0;
+        }
+        return new BigDecimal(dataLimit).multiply(new BigDecimal("60")).intValue();
+    }
+
+    /**
+    * @Author lihui
+    * @Description 完成状态
+    * @Date 17:08 2021/5/11
+    * @Param [status]
+    * @return boolean
+    **/
+    public static boolean completed(Integer status){
+        return status == 2 || status == 3 ;
+    }
+
+    /**
+     * @Author lihui
+     * @Description 计算是否延期完成
+     * @Date 11:06 2021/5/11
+     * @Param [finishDate :最终完成时间, planFinishDate:预计完成时间, addMinute:可延期的时间]
+     * @return boolean
+     **/
+    public static boolean isDelay(Date finishDate, Date planFinishDate, int addMinute){
+        if (finishDate == null || planFinishDate == null) {
+            return false;
+        }
+        return finishDate.after(DatesUtil.addMinuteOfDate(planFinishDate,addMinute));
+    }
+
+    public static Long[] toLong (List<Integer> userIds){
+        Long [] longs = new Long[userIds.size()];
+        for (int i = 0 ; i < userIds.size(); i++) {
+            longs[i] =Long.parseLong(userIds.get(i).toString()) ;
+        }
+        return longs;
+    }
+
+    /**
+    * @Author lihui
+    * @Description 是否是当天
+    * @Date 17:08 2021/5/11
+    * @Param [evaluationDay]
+    * @return boolean
+    **/
+    public static boolean isToday(int evaluationDay){
+        return Calendar.getInstance().get(Calendar.DAY_OF_MONTH)  == evaluationDay;
+    }
+
+    /**
+    * @Author lihui
+    * @Description 是否是同月
+    * @Date 18:14 2021/5/11
+    * @Param [month]
+    * @return boolean
+    **/
+    public static boolean sameMonth(int month){
+        return Calendar.getInstance().get(Calendar.MONTH) + 1  == month;
+    }
+
+    public static boolean containsType(List<EvaluationItemVo> itemEntityList, Integer type){
+        List<String> list = itemEntityList.stream().map(EvaluationItemVo::getCycle).collect(Collectors.toList());
+        for (String str: list) {
+            if (str.indexOf(type.toString()) != -1) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static String getStartTime(int cycle, Integer year, Integer month){
+        int mark = month == null ? 1 : 2;
+        Calendar calendar = getCalendar();
+        year  = year == null ? calendar.get(Calendar.YEAR) : year;
+        Integer calendarMonth =  calendar.get(Calendar.MONTH) + 1;
+        Integer newMonth = month == null ? calendarMonth : month;
+        // 月度
+        if (cycle == EvaluationCycleEnums.MONTH.getType()) {
+            return year + "-" + toString(newMonth) + "-01 00:00:00";
+        }
+        if (cycle == EvaluationCycleEnums.QUARTER.getType()) {
+            Integer quMonth = null;
+            month = month == null ? calendarMonth(calendarMonth) : month;
+            if (month != null) {
+                quMonth = month == 1 ? 1 :
+                          month == 2 ? 4 :
+                          month == 3 ? 7 :
+                          month == 4 ? 10 : null;
+                year = mark == 1 && month == 4  ? year -1 : year;
+            }
+            if (quMonth == null) {
+                return null;
+            }
+            return year + "-"+toString(quMonth)+"-01 00:00:00";
+        }
+        if (cycle == EvaluationCycleEnums.YEAR.getType()) {
+            return year + "-01-01 00:00:00";
+        }
+        return null;
+    }
+
+    private static Integer calendarMonth(Integer calendarMonth){
+        switch (calendarMonth){
+            case 1 :
+                return 4;
+            case 4 :
+                return 1;
+            case 7 :
+                return 2;
+            case 10 :
+                return 3;
+        }
+        return null;
+    }
+
+    public static String getEndTime(int cycle, Integer year, Integer month){
+        int mark = month == null ? 1 : 2;
+        Calendar calendar = getCalendar();
+        year  = year == null ? calendar.get(Calendar.YEAR) : year;
+        Integer calendarMonth =  calendar.get(Calendar.MONTH) + 1;
+        Integer newMonth = month == null ? calendarMonth : month;
+        Integer quMonth = null;
+        // 月度
+        if (cycle == EvaluationCycleEnums.MONTH.getType()) {
+            quMonth = newMonth;
+        }
+        if (cycle == EvaluationCycleEnums.QUARTER.getType()) {
+            month = month == null ? calendarMonth(calendarMonth) : month;
+            if (month != null) {
+                quMonth = month == 1 ? 3 :
+                          month == 2 ? 6 :
+                          month == 3 ? 9 :
+                          month == 4 ? 12 : null;
+                year = mark == 1 && month == 4  ? year -1 : year;
+            }
+            if (quMonth == null) {
+                return null;
+            }
+        }
+        if (cycle == EvaluationCycleEnums.YEAR.getType()) {
+            quMonth = 12;
+        }
+        String monthStr = toString(quMonth);
+        return year + "-" + monthStr + "-" + DatesUtil.getMouthDays( year + "-" +monthStr) + " 23:59:59";
+    }
+
+    private static String toString (Integer var){
+        String result = var.toString();
+        return result.length() == 1 ?   "0" + result : result;
+    }
+
+}

+ 12 - 0
operation_manager/src/main/resources/application-dev.properties

@@ -86,6 +86,18 @@ UMIS.sys_excel_path=/UMIS_USER_EXCEL/
 UMIS.sys_video_path=/UMIS_USER_VIDEOS/
 wf.svg.file.path=D:/test/
 
+#=====================新增参数线程池配置
+#核心线程数
+aysnc.pool.core-size=50
+#最大线程数
+aysnc.pool.max-size=200
+#空闲线程保留时间
+aysnc.pool.keep-alive=200
+#队列容量
+aysnc.queue-capacity=100000
+#线程名称前缀
+aysnc.thread-name-prefix=aysnc-thread-
+
 
 
 

+ 11 - 0
operation_manager/src/main/resources/application-prd.properties

@@ -94,3 +94,14 @@ ribbon.ReadTimeout=5000
 ribbon.ConnectionTimeout=5000
 
 
+#=====================新增参数线程池配置
+#核心线程数
+aysnc.pool.core-size=50
+#最大线程数
+aysnc.pool.max-size=200
+#空闲线程保留时间
+aysnc.pool.keep-alive=200
+#队列容量
+aysnc.queue-capacity=100000
+#线程名称前缀
+aysnc.thread-name-prefix=aysnc-thread-

+ 11 - 0
operation_manager/src/main/resources/application-sit.properties

@@ -93,3 +93,14 @@ ribbon.ReadTimeout=5000
 ribbon.ConnectionTimeout=5000
 
 
+#=====================新增参数线程池配置
+#核心线程数
+aysnc.pool.core-size=50
+#最大线程数
+aysnc.pool.max-size=200
+#空闲线程保留时间
+aysnc.pool.keep-alive=200
+#队列容量
+aysnc.queue-capacity=100000
+#线程名称前缀
+aysnc.thread-name-prefix=aysnc-thread-

+ 35 - 0
operation_manager/src/main/resources/mapper/evaluation/EvaluationItemMapper.xml

@@ -23,6 +23,24 @@
         <result property="updateBy" column="update_by"/>
     </resultMap>
 
+    <resultMap  id="evaluationItemVo" type="com.huaxu.evaluation.vo.EvaluationItemVo">
+        <result property="itemId" column="itemId"/>
+        <result property="name" column="NAME"/>
+        <result property="type" column="TYPE"/>
+        <result property="value" column="VALUE"/>
+        <result property="valueCondition" column="VALUE_CONDITION"/>
+        <result property="cycle" column="CYCLE"/>
+        <result property="remarks" column="REMARKS"/>
+        <collection property="evaluationItemValueVoList" resultMap="evaluationItemValueVo"></collection>
+    </resultMap>
+
+    <resultMap  id="evaluationItemValueVo" type="com.huaxu.evaluation.vo.EvaluationItemValueVo">
+        <result property="itemType" column="itemType"/>
+        <result property="itemValue" column="itemValue"/>
+        <result property="valueOne" column="VALUE_ONE"/>
+        <result property="valueTwo" column="VALUE_TWO"/>
+    </resultMap>
+
     <!--  实体栏位  -->
     <sql id="evaluationItemColumns">
          a.id as "id" ,
@@ -122,4 +140,21 @@
             </if>
         </where>
     </select>
+
+    <select id="findListItem" resultMap="evaluationItemVo">
+        SELECT
+        a.id as "itemId", a.`NAME`, a.`TYPE`,a.`VALUE`,a.VALUE_CONDITION,a.`CYCLE`,a.REMARKS,
+        v.`TYPE` as "itemType", v.`VALUE` as "itemValue", v.VALUE_ONE, v.VALUE_TWO
+        FROM sc_evaluation_item a
+        inner join sc_evaluation_item_value v on a.id = v.EVALUATION_ITEM_ID
+        <where>
+            a.COMPANY_ORG_ID = #{companyOrgId}
+            <if test="deptOrgId == null">
+                and a.DEPT_ORG_ID is null
+            </if>
+            and a.TENANT_ID = #{tenantId}
+            and a.status=1
+        </where>
+    </select>
+
 </mapper>

+ 6 - 0
operation_manager/src/main/resources/mapper/evaluation/EvaluationResultDetailsMapper.xml

@@ -2,6 +2,12 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.huaxu.evaluation.dao.EvaluationResultDetailsMapper" >
 
+
+    <insert id="insertEvaluationResultDetails">
+        insert sc_evaluation_result_details (TENANT_ID,EVALUATION_RESULT_ID,EVALUATION_ITEM_ID,`VALUE`,`STATUS`,DATE_CREATE,CREATE_BY,DATE_UPDATE,UPDATE_BY)
+        values (#{tenantId}, #{evaluationResultId}, #{evaluationItemId}, #{value}, #{status}, #{dateCreate}, #{createBy}, #{dateUpdate}, #{updateBy})
+    </insert>
+
     <select id="findResultDetailsIds" resultType="java.lang.Integer">
         select  d.id
         from  sc_evaluation_result r

+ 24 - 8
operation_manager/src/main/resources/mapper/evaluation/EvaluationResultMapper.xml

@@ -4,6 +4,7 @@
 
     <sql id="evaluation_result_list" >
            a.ID,
+           a.TENANT_ID,
            a.COMPANY_ORG_ID,
            a.DEPT_ORG_ID,
            a.EVALUATION_BY,
@@ -19,6 +20,17 @@
            a.DATE_EVALUATION
     </sql>
 
+    <insert id="insertEvaluationResult" useGeneratedKeys="true"  keyProperty="id" parameterType="com.huaxu.evaluation.entity.EvaluationResultEntity">
+        insert sc_evaluation_result (TENANT_ID,COMPANY_ORG_ID,DEPT_ORG_ID,EVALUATION_BE,`STATE`,`CYCLE`,`YEAR`,`MONTH`,EVALUATION_GRADE,
+                `VALUE`,DATE_START,DATE_END,DATE_EVALUATION,STATUS,DATE_CREATE,CREATE_BY,DATE_UPDATE,UPDATE_BY)
+        values
+            (
+            #{item.tenantId}, #{item.companyOrgId}, #{item.deptOrgId}, #{item.evaluationBe}, #{item.state},
+            #{item.cycle}, #{item.year}, #{item.month}, #{item.evaluationGrade}, #{item.value},
+            #{item.dateStart}, #{item.dateEnd}, #{item.dateEvaluation}, #{item.status}, #{item.dateCreate},
+            #{item.createBy}, #{item.dateUpdate}, #{item.updateBy})
+    </insert>
+
     <select id="findPage" resultType="com.huaxu.evaluation.vo.EvaluationResultVo">
         select
         <include refid="evaluation_result_list"></include>
@@ -60,21 +72,24 @@
                 <if test="dto.deptOrgId != null">
                     and a.DEPT_ORG_ID = #{dto.deptOrgId}
                 </if>
-                <if test="dto.state != null">
+                <if test="dto.sort == 1 and dto.state != null">
                     and a.`STATE` = #{dto.state}
                 </if>
+                <if test="dto.sort == 2">
+                    and a.`STATE` = 1
+                </if>
                 and a.`cycle` = #{dto.cycle}
                 and a.`YEAR`  = #{dto.year}
-                <if test="dto.cycle == 3">
-                    and a.`month` = #{dto.year}
+                <if test="dto.cycle != 2">
+                    and a.`month` = #{dto.month}
                 </if>
             </if>
         </where>
-        <if test="dto.sort != null and dto.sort == 1">
-            order by a.`YEAR` desc,a.`MONTH` desc, a.`state`
+        <if test="dto.sort == 1">
+            order by a.date_start desc,a.`state`
         </if>
-        <if test="dto.sort != null and dto.sort == 2">
-            order by a.`YEAR` desc,a.`MONTH` desc,a.`VALUE` desc
+        <if test="dto.sort == 2">
+            order by a.date_start desc,a.`VALUE` desc
         </if>
     </select>
 
@@ -84,7 +99,8 @@
 
     <update id="updateEvaluationScore">
         update  sc_evaluation_result
-        set `VALUE` = #{score}, `state` = 1
+        set `VALUE` = #{score}, `state` = 1, EVALUATION_GRADE = #{evaluationGrade},UPDATE_BY = #{updateBy},
+            DATE_UPDATE = #{dateUpdate},DATE_EVALUATION =#{dateEvaluation},EVALUATION_BY =#{evaluationBy}
         where id = #{evaluationResultId}
     </update>
 </mapper>

+ 13 - 1
operation_manager/src/main/resources/mapper/evaluation/EvaluationResultTaskMapper.xml

@@ -4,6 +4,9 @@
 
 
     <resultMap id="evaluationResultTaskDetailsVo" type="com.huaxu.evaluation.vo.EvaluationResultTaskDetailsVo">
+        <result property="resultId" column="resultId" jdbcType="INTEGER"/>
+        <result property="tenantId" column="TENANT_ID" jdbcType="INTEGER"/>
+        <result property="companyOrgId" column="COMPANY_ORG_ID" jdbcType="INTEGER"/>
         <result property="totalCount" column="TOTAL_COUNT" jdbcType="INTEGER"/>
         <result property="completeCount" column="COMPLETE_COUNT" jdbcType="INTEGER"/>
         <result property="noCompleteCount" column="NO_COMPLETE_COUNT" jdbcType="INTEGER"/>
@@ -30,7 +33,7 @@
 
     <select id="findResultTaskDetail" resultMap="evaluationResultTaskDetailsVo">
         select
-            r.`YEAR`, r.`MONTH`,r.`VALUE` as "performanceScore",r.EVALUATION_GRADE,
+            r.id as "resultId",r.`YEAR`, r.`MONTH`,r.`VALUE` as "performanceScore",r.EVALUATION_GRADE,r.COMPANY_ORG_ID,r.TENANT_ID,
             t.TOTAL_COUNT,t.COMPLETE_COUNT,t.NO_COMPLETE_COUNT,t.DELAY_COMPLETE_COUNT,t.COMPLETION_RATE,t.DELAY_RATE,
             d.ID as "resultDetailsId", d.`VALUE` as "score",
             i.`NAME` as "itemName",i.`VALUE` as "itemScore",i.REMARKS
@@ -42,4 +45,13 @@
         where
               r.id = #{evaluationResultId} and r.status = 1 and t.status =1 and d.status = 1 and i.status = 1
     </select>
+
+    <insert id="insertEvaluationResultTask">
+        insert sc_evaluation_result_task (TENANT_ID,EVALUATION_RESULT_ID,TOTAL_COUNT,COMPLETE_COUNT,NO_COMPLETE_COUNT,DELAY_COMPLETE_COUNT,COMPLETION_RATE
+                ,DELAY_RATE,`STATUS`,DATE_CREATE,CREATE_BY,DATE_UPDATE,UPDATE_BY)
+        values
+            (#{tenantId}, #{evaluationResultId}, #{totalCount}, #{completeCount}, #{noCompleteCount},
+        #{delayCompleteCount}, #{completionRate}, #{delayRate}, #{status}, #{dateCreate},
+        #{createBy}, #{dateUpdate}, #{updateBy})
+    </insert>
 </mapper>

+ 2 - 2
operation_manager/src/main/resources/mapper/order/WorkOrderManageMapper.xml

@@ -909,7 +909,7 @@
   </select>
 
   <select id="selectByTime" resultMap="BaseResultMap">
-    select distinct t1.id,task_no,send_time,address,order_type_id,current_task_name,t1.create_by,t1.update_by,task_desc,order_status,in_process_status
+    select distinct t1.id,task_no,send_time,address,order_type_id,current_task_name,t1.create_by,t1.update_by,task_desc,order_status,in_process_status,t1.plan_finish_date,t1.finish_date,t1.date_create,t1.date_limit
     from sc_work_order_manage t1
            left join sc_work_flow_log t2 ON t1.id=t2.flow_id and flow_type=2 and find_in_set(#{userId},handle_user_id) and left(flow_result,2)='拒单'
     where (find_in_set(#{userId},current_users)
@@ -918,7 +918,7 @@
       and (t2.id is null or t1.order_user_id=t2.handle_user_id)
       and t1.date_create between #{startTime} and #{endTime}
     union
-    select id,plan_id,plan_date,task_area_name,task_type,current_task_name,create_by,update_by,task_content,plan_status,in_process_status
+    select id,plan_id,plan_date,task_area_name,task_type,current_task_name,create_by,update_by,task_content,plan_status,in_process_status,plan_end_date,finish_date,date_create,"0"
     from sc_plan_manage
     where (find_in_set(#{userId},current_users)
       or id in(select flow_id from sc_work_flow_log where flow_type=1 and find_in_set(#{userId},handle_user_id)))