Переглянути джерело

1.修复绩效bug
2.增加通用aop字典

lihui007 4 роки тому
батько
коміт
35b14464ee

+ 22 - 0
operation_manager/src/main/java/com/huaxu/annotation/Dict.java

@@ -0,0 +1,22 @@
+package com.huaxu.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/***
+ * 字典注解
+ * @author lihui
+ * @date 10:38 2021/5/24
+ **/
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Dict {
+
+    String dicCode();
+
+    String dicText() default "";
+
+    String dictTable() default "";
+}

+ 189 - 0
operation_manager/src/main/java/com/huaxu/aspect/DictAspect.java

@@ -0,0 +1,189 @@
+package com.huaxu.aspect;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.huaxu.annotation.Dict;
+import com.huaxu.dict.DictUtil;
+import com.huaxu.model.AjaxMessage;
+import com.huaxu.model.Pagination;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Field;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: 字典aop类
+ * @Author: lihui
+ * @Date: 2021-5-24
+ * @Version: 1.0
+ */
+@Aspect
+@Component
+@Slf4j
+public class  DictAspect {
+
+    private static final String DICT_TEXT_SUFFIX  = "_dict";
+
+    @Autowired
+    private DictUtil dictUtil;
+
+    /***
+     * 定义切点Pointcut
+     * @author lihui
+     * @date 11:26 2021/5/24
+     * @return void
+     **/
+    @Pointcut("execution(public * com.huaxu..*.*Controller.*(..))")
+    public void excudeService() {
+    }
+
+    @Around("excudeService()")
+    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
+        long time1 = System.currentTimeMillis();
+        Object result = pjp.proceed();
+        long time2 = System.currentTimeMillis();
+        log.debug("获取JSON数据 耗时:" + (time2 - time1) + "ms");
+        long start = System.currentTimeMillis();
+        this.parseDictText(result);
+        long end = System.currentTimeMillis();
+        log.debug("解析注入JSON数据  耗时" + (end - start) + "ms");
+        return result;
+    }
+
+    /**
+     * 本方法针对返回对象为Result 的IPage的分页列表数据进行动态字典注入
+     * 字典注入实现 通过对实体类添加注解@dict 来标识需要的字典内容,字典分为单字典code即可 ,table字典 code table text配合使用与原来jeecg的用法相同
+     * 示例为SysUser   字段为sex 添加了注解@Dict(dicCode = "sex") 会在字典服务立马查出来对应的text 然后在请求list的时候将这个字典text,已字段名称加_dict形式返回到前端
+     * 例输入当前返回值的就会多出一个sex_dictText字段
+     * {
+     * sex:1,
+     * sex_dictText:"男"
+     * }
+     * 前端直接取值sext_dictText在table里面无需再进行前端的字典转换了
+     * customRender:function (text) {
+     * if(text==1){
+     * return "男";
+     * }else if(text==2){
+     * return "女";
+     * }else{
+     * return text;
+     * }
+     * }
+     * 目前vue是这么进行字典渲染到table上的多了就很麻烦了 这个直接在服务端渲染完成前端可以直接用
+     * @param result
+     */
+    private void parseDictText(Object result) {
+        if (result instanceof AjaxMessage) {
+            if (((AjaxMessage) result).getData() instanceof Pagination) {
+                List<JSONObject> items = new ArrayList<>();
+                for (Object record : ((Pagination) ((AjaxMessage) result).getData()).getList()) {
+                    ObjectMapper mapper = new ObjectMapper();
+                    String json = "{}";
+                    try {
+                        //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat
+                        json = mapper.writeValueAsString(record);
+                    } catch (JsonProcessingException e) {
+                        log.error("json解析失败" + e.getMessage(), e);
+                    }
+                    JSONObject item = JSONObject.parseObject(json);
+                    for (Field field : getAllFields(record)) {
+                        if (field.getAnnotation(Dict.class) != null) {
+                            String code = field.getAnnotation(Dict.class).dicCode();
+                            String text = field.getAnnotation(Dict.class).dicText();
+                            String table = field.getAnnotation(Dict.class).dictTable();
+                            String key = String.valueOf(item.get(field.getName()));
+
+                            //翻译字典值对应的txt
+                            String textValue = translateDictValue(code, text, table, key);
+
+                            log.debug(" 字典Val : " + textValue);
+                            log.debug(" __翻译字典字段__ " + field.getName() + DICT_TEXT_SUFFIX + ": " + textValue);
+                            item.put(field.getName() + DICT_TEXT_SUFFIX, textValue);
+                        }
+                        //date类型默认转换string格式化日期
+                        if (field.getType().getName().equals("java.util.Date") && field.getAnnotation(JsonFormat.class) == null && item.get(field.getName()) != null) {
+                            SimpleDateFormat aDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                            //解决日期较小的情况下被解析为Integer,最后导致导致强转为Long的报错问题
+                            item.put(field.getName(), aDate.format(new Date(Long.valueOf(String.valueOf(item.get(field.getName()))))));
+                        }
+                    }
+                    items.add(item);
+                }
+                ((Pagination) ((AjaxMessage) result).getData()).setList(items);
+            }
+        }
+    }
+
+    /**
+     * 翻译字典文本
+     *
+     * @param code
+     * @param text
+     * @param table
+     * @param key
+     * @return
+     */
+    private String translateDictValue(String code, String text, String table, String key) {
+        if (isEmpty(key)) {
+            return null;
+        }
+        StringBuffer textValue = new StringBuffer();
+        String[] keys = key.split(",");
+        for (String k : keys) {
+            String tmpValue = null;
+            log.debug(" 字典 key : " + k);
+            if (k.trim().length() == 0) {
+                continue; //跳过循环
+            }
+            tmpValue = dictUtil.getDictName(code, Integer.parseInt(k.trim()));
+            if (tmpValue != null) {
+                if (!"".equals(textValue.toString())) {
+                    textValue.append(",");
+                }
+                textValue.append(tmpValue);
+            }
+        }
+        return textValue.toString();
+
+    }
+
+    private static Field[] getAllFields(Object object) {
+        Class<?> clazz = object.getClass();
+        List<Field> fieldList = new ArrayList<>();
+        while (clazz != null) {
+            fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
+            clazz = clazz.getSuperclass();
+        }
+        Field[] fields = new Field[fieldList.size()];
+        fieldList.toArray(fields);
+        return fields;
+    }
+
+    public static boolean isEmpty(Object object) {
+        if (object == null) {
+            return (true);
+        }
+        if ("".equals(object)) {
+            return (true);
+        }
+        if ("null".equals(object)) {
+            return (true);
+        }
+        return (false);
+    }
+
+}
+
+

+ 42 - 40
operation_manager/src/main/java/com/huaxu/evaluation/job/EvaluationResultJob.java

@@ -10,15 +10,12 @@ import com.huaxu.evaluation.enums.EvaluationCycleEnums;
 import com.huaxu.evaluation.enums.EvaluationItemEnums;
 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.model.AjaxMessage;
 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;
@@ -31,7 +28,6 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * @ClassName EvaluationResultJob
@@ -86,13 +82,13 @@ public class EvaluationResultJob {
 
 
     /***
-     *  @Scheduled(cron = "0/5 * * * * ?")
+     *
      *  异步启动定时任务
      * @Author lihui
      * @Date 18:26 2021/5/17
      * @return void
      **/
-
+    @Scheduled(cron = "0/5 * * * * ?")
     @Async
     public void run(){
         if (lock){
@@ -149,9 +145,9 @@ public class EvaluationResultJob {
             return;
         }
         for (UserEntity userEntity : userEntityList) {
-            itemEntityList = findItem(userEntity);
             // 1.获取部门考评项设置,如果未设置直接过滤
             // 2.判断部门考评项目设置里面有没有设置对应的考评周期,没有就直接过滤
+            itemEntityList = findItem(userEntity);
             if (CollectionUtil.isEmpty(itemEntityList) || !EvaluationUtil.containsType(itemEntityList, cycle)) {
                 continue;
             }
@@ -183,20 +179,28 @@ public class EvaluationResultJob {
     }
 
 
-    /**
-    * @Author lihui
-    * @Description  保存用户考评结果
-    * @Date 10:26 2021/5/11
-    * @Param [userEntity, itemEntityList, startTime, endTime, cycle]
-    * @return void
-    **/
+    /***
+     * 1.计算用户完成任务情况
+     * 2.组装考评结果数据
+     * 3.保存考评结果
+     * 4.计算得分范围,保存考评结果详情
+     * @author lihui
+     * @date 15:38 2021/5/21
+     * @param userEntity :
+     * @param itemEntityList :
+     * @param startTime :
+     * @param endTime :
+     * @param cycle :
+     * @return void
+     **/
     @Transactional(rollbackFor = Exception.class)
     public void saveEvaluationResultInfo(UserEntity userEntity, List<EvaluationItemVo> itemEntityList, String startTime, String endTime, Integer cycle){
+        // 条件值
+        BigDecimal evaluationValue = null;
         // 计算用户完成任务情况
-        EvaluationResultTaskEntity taskDetailsVo = calculationTaskInfo(userEntity.getId().intValue(), userEntity.getTenantId(), startTime, endTime, getValueCondition(itemEntityList));
-        // 组装考评结果数据
+        EvaluationResultTaskEntity taskDetailsVo = calculationTaskInfo(userEntity.getId().intValue(), userEntity.getTenantId(),
+                startTime, endTime, getValueCondition(itemEntityList));
         EvaluationResultEntity resultEntity = packagesEvaluationResultEntity(userEntity, cycle, startTime, endTime);
-        // 保存考评结果
         if (evaluationResultMapper.insertEvaluationResult(resultEntity) != 1) {
             throw new ServiceException(500, "保存考评结果出错,退出。");
         }
@@ -206,8 +210,9 @@ public class EvaluationResultJob {
         evaluationResultTaskMapper.insertEvaluationResultTask(taskDetailsVo);
         BigDecimal completeCount   = new BigDecimal(taskDetailsVo.getCompleteCount()) ;
         // 按时完成率
-        BigDecimal completionRate  = EvaluationUtil.divide(taskDetailsVo.getCompleteCount() - taskDetailsVo.getDelayCompleteCount(), taskDetailsVo.getTotalCount());
-        BigDecimal evaluationValue = null;
+        BigDecimal completionRate  = EvaluationUtil.onTimeCompletionRate(taskDetailsVo.getCompleteCount(),
+                taskDetailsVo.getDelayCompleteCount(), taskDetailsVo.getTotalCount());
+        // 保存考评分数
         for (EvaluationItemVo item : itemEntityList) {
             // 不是当前季度的,过滤
             if (item.getCycle().indexOf(cycle.toString()) == -1 || item.getType() == null) {
@@ -226,18 +231,23 @@ public class EvaluationResultJob {
         }
     }
 
-    /**
-    * @Author lihui
-    * @Description 计算用户完成任务情况
-    * @Date 17:38 2021/5/10
-    * @Param [userId, tenantId, startTime, endTime,valueCondition:延期时间多少分钟内算正常]
-    * @return void
-    **/
+    /***
+     * 计算用户完成任务情况
+     * @author lihui
+     * @date 15:51 2021/5/21
+     * @param userId :     用户ID
+     * @param tenantId :   租户ID
+     * @param startTime :  开始时间
+     * @param endTime :    结束时间
+     * @param valueCondition :  条件值
+     * @return com.huaxu.evaluation.entity.EvaluationResultTaskEntity
+     **/
     private EvaluationResultTaskEntity calculationTaskInfo(Integer userId, String tenantId, String startTime, String endTime, BigDecimal valueCondition) {
         int page = 1;
+        boolean completedBoolean = false;
         IPage<WorkOrderManageDto> iPage = null;
+        int conditionInt = valueCondition == null ? 0 : valueCondition.intValue();
         EvaluationResultTaskEntity taskEntity = new EvaluationResultTaskEntity();
-        boolean completedBoolean = false;
         while (true) {
             iPage = new Page<>(page, 200);
             // 查询该用户的工单和任务
@@ -251,15 +261,15 @@ public class EvaluationResultJob {
                 taskEntity.setCompleteCount(taskEntity.getCompleteCount() + (completedBoolean ? 1 : 0));
                 taskEntity.setNoCompleteCount(taskEntity.getNoCompleteCount() + (!completedBoolean ? 1 : 0));
                 // 计算完成的是否属于延期完成
-                if (completedBoolean && isDelay(dto, EvaluationUtil.minute(dto.getDateLimit())  + valueCondition.intValue())) {
+                if (completedBoolean && isDelay(dto, EvaluationUtil.minute(dto.getDateLimit())  + conditionInt)) {
                     taskEntity.setDelayCompleteCount(taskEntity.getDelayCompleteCount() + 1);
                 }
             }
             page ++;
         }
         // 计算完成率和延期率
-        taskEntity.setCompletionRate(EvaluationUtil.divide(taskEntity.getCompleteCount(),taskEntity.getTotalCount()));
-        taskEntity.setDelayRate(EvaluationUtil.divide(taskEntity.getDelayCompleteCount(),taskEntity.getTotalCount()));
+        taskEntity.setCompletionRate(EvaluationUtil.divide(taskEntity.getCompleteCount(),taskEntity.getTotalCount(), 4));
+        taskEntity.setDelayRate(EvaluationUtil.divide(taskEntity.getDelayCompleteCount(),taskEntity.getTotalCount(), 4));
         taskEntity.setTenantId(tenantId);
         taskEntity.setStatus(1);
         taskEntity.setDateCreate(new Date());
@@ -278,8 +288,8 @@ public class EvaluationResultJob {
      *    完成时间:finish_date
      * @author lihui
      * @date 10:56 2021/5/20
-     * @param dto :
-     * @param addMinute :
+     * @param dto : 请求参数
+     * @param addMinute : 增加的分钟数
      * @return boolean
      **/
     private boolean isDelay(WorkOrderManageDto dto, int addMinute){
@@ -348,14 +358,6 @@ public class EvaluationResultJob {
         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));
-    }
-
     /***
      * 获取对应的分数
      * @Author lihui

+ 4 - 51
operation_manager/src/main/java/com/huaxu/evaluation/service/impl/EvaluationResultServiceImpl.java

@@ -18,7 +18,6 @@ import com.huaxu.model.LoginUser;
 import com.huaxu.org.OrgInfoUtil;
 import com.huaxu.util.UserUtil;
 import com.huaxu.utils.EvaluationUtil;
-import io.swagger.models.auth.In;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -26,7 +25,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.math.RoundingMode;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -112,7 +110,7 @@ public class EvaluationResultServiceImpl implements EvaluationResultService {
             return null;
         }
         if (queryDto.getCycle() == EvaluationCycleEnums.QUARTER.getType()) {
-            queryDto.setMonths(formatList(queryDto.getCycle(), queryDto.getMonth()));
+            queryDto.setMonths(EvaluationUtil.formatList(queryDto.getMonth()));
         }
         queryDto.setCycle(0);
         return evaluationResultMapper.countQualifiedNumber(queryDto, qualifiedValue);
@@ -128,7 +126,7 @@ public class EvaluationResultServiceImpl implements EvaluationResultService {
             return null;
         }
         if (queryDto.getCycle() == EvaluationCycleEnums.QUARTER.getType()) {
-            queryDto.setMonths(formatList(queryDto.getCycle(), queryDto.getMonth()));
+            queryDto.setMonths(EvaluationUtil.formatList(queryDto.getMonth()));
         }
         queryDto.setCycle(0);
         return evaluationResultMapper.countPerformanceAvg(queryDto);
@@ -167,7 +165,7 @@ public class EvaluationResultServiceImpl implements EvaluationResultService {
         queryDto.setPermissonType(currentUser.getPermissonType());
         // 季度需要格式化月份
         if (queryDto.getCycle() != null && queryDto.getCycle() == EvaluationCycleEnums.QUARTER.getType()){
-            queryDto.setMonth(format(queryDto.getCycle(), queryDto.getMonth()));
+            queryDto.setMonth(EvaluationUtil.format(queryDto.getMonth()));
         }
         return queryDto;
     }
@@ -184,7 +182,7 @@ public class EvaluationResultServiceImpl implements EvaluationResultService {
         BeanUtils.copyProperties(dto, queryDto);
         // 季度需要格式化月份
         if (dto.getCycle() == EvaluationCycleEnums.QUARTER.getType()){
-            queryDto.setMonth(format(dto.getCycle(), dto.getMonth()));
+            queryDto.setMonth(EvaluationUtil.format(dto.getMonth()));
         }
         // 获取用户权限
         LoginUser currentUser = UserUtil.getCurrentUser();
@@ -243,49 +241,4 @@ public class EvaluationResultServiceImpl implements EvaluationResultService {
     }
 
 
-    private Integer format(Integer cycle, Integer month){
-        if (cycle == null) {
-            throw new ServiceException(EvaluationResultStatus.PARAM_ERROR.getStatus(), EvaluationResultStatus.PARAM_ERROR.getMessage());
-        }
-        // 季度需要格式化
-        if (month == null){
-            throw new ServiceException(EvaluationResultStatus.PARAM_ERROR.getStatus(), EvaluationResultStatus.PARAM_ERROR.getMessage());
-        }
-        if (month == 1) {
-            return 3;
-        } else if (month == 2 ){
-            return 6;
-        } else if (month == 3) {
-            return 9;
-        } else if (month == 4) {
-            return 12;
-        } else {
-            throw new ServiceException(EvaluationResultStatus.PARAM_ERROR.getStatus(), EvaluationResultStatus.PARAM_ERROR.getMessage());
-        }
-    }
-
-    private List<Integer> formatList(Integer cycle, Integer month){
-        if (cycle == null) {
-            throw new ServiceException(EvaluationResultStatus.PARAM_ERROR.getStatus(), EvaluationResultStatus.PARAM_ERROR.getMessage());
-        }
-        // 季度需要格式化
-        if (month == null){
-            throw new ServiceException(EvaluationResultStatus.PARAM_ERROR.getStatus(), EvaluationResultStatus.PARAM_ERROR.getMessage());
-        }
-        if (month == 3) {
-            return Arrays.asList(1,2,3);
-        } else if (month == 6 ){
-            return Arrays.asList(4,5,6);
-        } else if (month == 9) {
-            return Arrays.asList(7,8,9);
-        } else if (month == 12) {
-            return Arrays.asList(10,11,12);
-        } else {
-            throw new ServiceException(EvaluationResultStatus.PARAM_ERROR.getStatus(), EvaluationResultStatus.PARAM_ERROR.getMessage());
-        }
-    }
-
-    public static void main(String[] args) {
-        System.out.println(new BigDecimal(1).divide( new BigDecimal(1),4, BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal("100")).setScale(2, BigDecimal.ROUND_HALF_DOWN));
-    }
 }

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

@@ -1,6 +1,7 @@
 package com.huaxu.evaluation.vo;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.huaxu.annotation.Dict;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 70 - 45
operation_manager/src/main/java/com/huaxu/utils/EvaluationUtil.java

@@ -1,8 +1,10 @@
 package com.huaxu.utils;
 
 import com.huaxu.evaluation.enums.EvaluationCycleEnums;
+import com.huaxu.evaluation.enums.EvaluationResultStatus;
 import com.huaxu.evaluation.vo.EvaluationItemVo;
 import com.huaxu.evaluation.vo.EvaluationResultVo;
+import com.huaxu.exception.ServiceException;
 import com.huaxu.order.dto.WorkOrderManageDto;
 import com.huaxu.util.DatesUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -73,14 +75,29 @@ public class EvaluationUtil {
      */
     static List<Integer> workList = Arrays.asList(1,2,3,4,5,6);
 
-    private static Calendar getCalendar(){
-        return Calendar.getInstance();
+    /**
+     * @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 Calendar getCalendar (String dateTime){
-        Calendar calendar = getCalendar();
-        calendar.setTime(DatesUtil.parseDate(dateTime, "yyyy-MM-dd HH:mm:ss"));
-        return calendar;
+    /***
+     * 计算按时完成率=(完成数-延期完成数)/任务总数
+     * @author lihui
+     * @date 15:35 2021/5/21
+     * @param completeCount :
+     * @param delayCompleteCount :
+     * @param totalCount :
+     * @return java.math.BigDecimal
+     **/
+    public static BigDecimal onTimeCompletionRate(int completeCount, int delayCompleteCount, int totalCount){
+        return divide(completeCount - delayCompleteCount,
+                totalCount, 4).multiply(new BigDecimal("100"));
     }
 
     /**
@@ -134,14 +151,14 @@ public class EvaluationUtil {
         return lon == null ? null : lon.intValue();
     }
 
-    public static BigDecimal divide(Integer completeCount, Integer total){
+    public static BigDecimal divide(Integer completeCount, Integer total, int scale){
         String defaultValue = "0";
         BigDecimal bigDecimalComplete =  new BigDecimal(completeCount.toString());
         BigDecimal bigDecimalTotal =  new BigDecimal(total.toString());
         if (bigDecimalTotal.compareTo(new BigDecimal(defaultValue)) == 0){
             return new BigDecimal(defaultValue);
         }
-        return bigDecimalComplete.divide(bigDecimalTotal,2, RoundingMode.HALF_UP);
+        return bigDecimalComplete.divide(bigDecimalTotal, scale, RoundingMode.HALF_UP);
     }
 
     /**
@@ -183,37 +200,6 @@ public class EvaluationUtil {
         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) {
@@ -240,12 +226,6 @@ public class EvaluationUtil {
         return null;
     }
 
-
-    private static String toString (Integer var){
-        String result = var.toString();
-        return result.length() == 1 ?   "0" + result : result;
-    }
-
     public static String getStartTime(int cycle, int day) {
         LocalDate localDate = LocalDate.now();
         if (cycle == EvaluationCycleEnums.MONTH.getType()) {
@@ -415,6 +395,51 @@ public class EvaluationUtil {
         return "";
     }
 
+
+    /***
+     * 根据1-4季度,获取对应末尾的月份
+     * @author lihui
+     * @date 14:53 2021/5/21
+     * @param cycle : 季度
+     * @return java.lang.Integer
+     **/
+    public static Integer format(Integer cycle){
+        switch (cycle) {
+            case 1 :
+                return 3;
+            case 2 :
+                return 6;
+            case 3 :
+                return 9;
+            case 4:
+                return 12;
+            default:
+                throw new ServiceException(EvaluationResultStatus.PARAM_ERROR.getStatus(), EvaluationResultStatus.PARAM_ERROR.getMessage());
+        }
+    }
+
+    /**
+     * 根据1-4季度末尾月份,获取每个季度对应的月份
+     * @author lihui
+     * @date 14:54 2021/5/21
+     * @param month : 月份
+     * @return java.util.List<java.lang.Integer>
+     **/
+    public static List<Integer> formatList(Integer month){
+        switch (month) {
+            case 3 :
+                return Arrays.asList(1,2,3);
+            case 6 :
+                return Arrays.asList(4,5,6);
+            case 9 :
+                return Arrays.asList(7,8,9);
+            case 12:
+                return Arrays.asList(10,11,12);
+            default:
+                throw new ServiceException(EvaluationResultStatus.PARAM_ERROR.getStatus(), EvaluationResultStatus.PARAM_ERROR.getMessage());
+        }
+    }
+
     public static void main(String[] args) {
         System.out.println(EvaluationUtil.getStartTime(1, 15));
         System.out.println(EvaluationUtil.getEndTime(1, 15));

+ 17 - 6
sms_water/src/main/java/com/huaxu/util/ReportExcelUtil.java

@@ -34,16 +34,22 @@ public class ReportExcelUtil {
     public static List<List<String>> toReportExcelDto(List<ReportDto> list){
         int number = 1;
         List<List<String>> result = new ArrayList<>();
+        if (CollectionUtil.isEmpty(list)){
+            return result;
+        }
         for (ReportDto reportDto : list) {
             List<String>  dataList = new ArrayList<>();
             dataList.add((number++) +"");
             dataList.add(reportDto.getParentSceneName());
             dataList.add(reportDto.getCollectDate());
-            dataList.add(reportDto.getIntakeWaterUsage().toString());
-            dataList.add(reportDto.getYieldWaterUsage().toString());
-            dataList.add(reportDto.getPowerUsage().toString());
-            dataList.add(reportDto.getDrugUsage().toString());
+            dataList.add(doubleToString(reportDto.getIntakeWaterUsage()));
+            dataList.add(doubleToString(reportDto.getYieldWaterUsage()));
+            dataList.add(doubleToString(reportDto.getPowerUsage()));
+            dataList.add(doubleToString(reportDto.getDrugUsage()));
             List<Map<String,Object>> childList = reportDto.getDataMapValues();
+            if (CollectionUtil.isEmpty(childList)) {
+                continue;
+            }
             for (Map<String,Object> childMap: childList) {
                 int ok = 0;
                 for (Map.Entry<String,Object> entry : childMap.entrySet()) {
@@ -51,7 +57,7 @@ public class ReportExcelUtil {
                         ok++;
                         continue;
                     }
-                    dataList.add(entry.getValue().toString());
+                    dataList.add(entry.getValue() != null ? entry.getValue().toString() : "");
                 }
             }
             result.add(dataList);
@@ -60,6 +66,8 @@ public class ReportExcelUtil {
     }
 
 
+
+
     /**
     * @Author lihui
     * @Description 按顺序组装导出的标题
@@ -88,7 +96,6 @@ public class ReportExcelUtil {
         return result;
     }
 
-
     private static List<List<String>> toTitleList(List<ReportTitleDto> list){
         if (CollectionUtil.isEmpty(list)) {
             return null;
@@ -109,4 +116,8 @@ public class ReportExcelUtil {
         }
         return  result;
     }
+
+    private static String doubleToString(Double doubleValue){
+        return doubleValue == null ? "" : doubleValue.toString();
+    }
 }