Procházet zdrojové kódy

Merge remote-tracking branch 'origin/1.0' into 1.0

WoNiu před 4 roky
rodič
revize
5b980e5047

+ 17 - 14
src/main/java/com/galaxis/manatee/controller/TestController.java

@@ -3,9 +3,10 @@ package com.galaxis.manatee.controller;
 import com.galaxis.manatee.service.LogCheckService;
 import com.galaxis.manatee.service.LogStandardService;
 import com.galaxis.manatee.service.LogUpdateService;
-import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 /**
  * @author zcj
@@ -31,17 +32,6 @@ public class TestController {
         return "hello";
     }
 
-    @PostMapping("/test/helloPost")
-    public String testPost(@RequestBody PostObject postObject) {
-        return "hello";
-    }
-
-    @Data
-    class PostObject {
-        private String a;
-        private String b;
-    }
-
     /**
      * 标准化所有周工时
      */
@@ -51,6 +41,14 @@ public class TestController {
     }
 
     /**
+     * 标准化所有月工时
+     */
+    @GetMapping("/test/api/standardAllSelfCost")
+    public void standardAllSelfCost(){
+        logStandardService.standardAllSelfCost();
+    }
+
+    /**
      * 根据用户Id标准化日工时
      * @param userId    用户Id
      */
@@ -68,8 +66,13 @@ public class TestController {
         logStandardService.standardWeekMemberHourByUserId(userId);
     }
 
+    /**
+     * 根据用户Id标准化月工时
+     * @param userId    用户Id
+     */
+    @GetMapping("/test/api/standardSelfCostByUserId")
     public void standardSelfCostByUserId(@RequestParam("userId") String userId) {
-
+        logStandardService.standardSelfCostByUserId(userId);
     }
 
     /**

+ 1 - 1
src/main/java/com/galaxis/manatee/controller/WorkHourController.java

@@ -41,7 +41,7 @@ public class WorkHourController {
      */
     @GetMapping("/test/workHour/updateWorkHour")
     public void updateWorkHour(){
-        workHourStatistics.updateHour();
+        workHourStatistics.standardHour();
     }
 
 

+ 0 - 35
src/main/java/com/galaxis/manatee/dao/ChuanyunSelfWorkHourDao.java

@@ -2,17 +2,13 @@ package com.galaxis.manatee.dao;
 
 
 import com.galaxis.capsule.util.GalaxisRepository;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunSelfCostDO;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunSelfWorkHourDO;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunWorkHourDO;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
-import org.springframework.transaction.annotation.Transactional;
 
-import java.awt.print.Pageable;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -117,30 +113,6 @@ public interface ChuanyunSelfWorkHourDao extends GalaxisRepository<ChuanyunSelfW
     List<ChuanyunSelfWorkHourDO> getMonthProjectHourRecently(String userId);
 
     /**
-     * 根据用户Id获取月工时
-     * @param userId
-     * @return
-     */
-    @Query(value="SELECT SUM(chuanyun_self_work_hour.standard_work_hour) AS standard_work_hour," +
-            "chuanyun_self_work_hour.day_log_date," +
-            "chuanyun_self_work_hour.user_id," +
-            "chuanyun_self_work_hour.project_id," +
-            "chuanyun_self_work_hour.project_type," +
-            "chuanyun_self_work_hour.status," +
-            "chuanyun_self_work_hour.department_id," +
-            "chuanyun_self_work_hour.department_name," +
-            "chuanyun_self_work_hour.object_id " +
-            "FROM chuanyun_self_work_hour " +
-            "WHERE chuanyun_self_work_hour.user_id=? " +
-            "GROUP BY chuanyun_self_work_hour.user_id," +
-            "DATE_FORMAT(chuanyun_self_work_hour.day_log_date,'%Y-%m')," +
-            "chuanyun_self_work_hour.project_id," +
-            "chuanyun_self_work_hour.status," +
-            "chuanyun_self_work_hour.project_type",
-            nativeQuery = true)
-    List<ChuanyunSelfWorkHourDO> getMonthProjectHourByUserId(String userId);
-
-    /**
      * 获取人员月度标准工时汇总
      * @param userId    用户ID
      * @param dayLogDate    查询月份日期
@@ -165,11 +137,4 @@ public interface ChuanyunSelfWorkHourDao extends GalaxisRepository<ChuanyunSelfW
             "DATE_FORMAT(chuanyun_self_work_hour.day_log_date,'%Y-%m')",
             nativeQuery = true)
     ChuanyunSelfWorkHourDO getMonthHour(@Param("userId") String userId,@Param("dayLogDate") String dayLogDate,@Param("status")String status);
-
-    /**
-     * 删除个人所有工时
-     * @param userId
-     */
-    @Transactional
-    void deleteByUserId(String userId);
 }

+ 84 - 49
src/main/java/com/galaxis/manatee/service/DataArcherService.java

@@ -2,10 +2,8 @@ package com.galaxis.manatee.service;
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunCommonDO;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunMemberHourDO;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunMemberMonthCostDO;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunProjectMemberWeekHourDO;
+import com.galaxis.manatee.constant.ChuanYunConstant;
+import com.galaxis.manatee.entity.chuanyun.data.object.*;
 import com.galaxis.manatee.entity.chuanyun.dto.*;
 import com.galaxis.manatee.manager.ChuanYunManager;
 import lombok.extern.slf4j.Slf4j;
@@ -18,6 +16,7 @@ import java.util.List;
 
 /**
  * 快速更新数据方法
+ *
  * @author zcj
  * @version 0.1
  * @date 2021/3/6 5:55 上午
@@ -68,52 +67,55 @@ public class DataArcherService {
 
         } catch (Exception e) {
             e.printStackTrace();
-            log.warn("更新标准工时异常"+chuanyunSelfWorkHourDTO);
+            log.warn("更新标准工时异常" + chuanyunSelfWorkHourDTO);
         }
     }
 
     /**
      * 异步更新每周工时
+     *
      * @param chuanyunWeekMemberHourDTO 每周工时数据对象
      */
     @Async
-    public void updateWeekMemberHour(ChuanyunWeekMemberHourDTO chuanyunWeekMemberHourDTO){
-        ObjectMapper objectMapper=new ObjectMapper();
-        try{
+    public void updateWeekMemberHour(ChuanyunWeekMemberHourDTO chuanyunWeekMemberHourDTO) {
+        ObjectMapper objectMapper = new ObjectMapper();
+        try {
             List<String> matchers = new ArrayList<>();
-            matchers.add("F0000001_2,"+chuanyunWeekMemberHourDTO.getProjectId());
-            matchers.add("F0000002_2,"+chuanyunWeekMemberHourDTO.getUserId());
-            matchers.add("F0000006_2,"+chuanyunWeekMemberHourDTO.getWeek());
-            matchers.add("F0000008_2,"+chuanyunWeekMemberHourDTO.getYear());
-            matchers.add("F0000003_2,"+chuanyunWeekMemberHourDTO.getProjectType());
-            matchers.add("F0000007_2,"+chuanyunWeekMemberHourDTO.getStatus());
-            var filter= Filter.instance(0,1,true,"And",matchers);
-            var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,filter);
-            var selfMonthString=objectMapper.writeValueAsString(chuanyunWeekMemberHourDTO);
+            matchers.add("F0000001_2," + chuanyunWeekMemberHourDTO.getProjectId());
+            matchers.add("F0000002_2," + chuanyunWeekMemberHourDTO.getUserId());
+            matchers.add("F0000006_2," + chuanyunWeekMemberHourDTO.getWeek());
+            matchers.add("F0000008_2," + chuanyunWeekMemberHourDTO.getYear());
+            matchers.add("F0000003_2," + chuanyunWeekMemberHourDTO.getProjectType());
+            matchers.add("F0000007_2," + chuanyunWeekMemberHourDTO.getStatus());
+            var filter = Filter.instance(0, 1, true, "And", matchers);
+            var chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE, filter);
+            var selfMonthString = objectMapper.writeValueAsString(chuanyunWeekMemberHourDTO);
             ChuanyunSaveDTO chuanyunSaveDTO;
-            if (chuanyunFindAllResponse.getReturnData()!=null) {
-                List<ChuanyunProjectMemberWeekHourDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+            if (chuanyunFindAllResponse.getReturnData() != null) {
+                List<ChuanyunProjectMemberWeekHourDO> result = objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
+                });
                 ChuanyunProjectMemberWeekHourDO firstResult = result.get(0);
-                chuanyunSaveDTO = chuanYunManager.update(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,firstResult.getObjectId(),selfMonthString);
-            }else {
-                chuanyunSaveDTO = chuanYunManager.save(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,selfMonthString,true);
+                chuanyunSaveDTO = chuanYunManager.update(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE, firstResult.getObjectId(), selfMonthString);
+            } else {
+                chuanyunSaveDTO = chuanYunManager.save(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE, selfMonthString, true);
             }
-            if(!chuanyunSaveDTO.getSuccessful()){
+            if (!chuanyunSaveDTO.getSuccessful()) {
                 log.warn("新增人员项目周度工时失败");
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
-            log.warn("更新标准工时异常"+chuanyunWeekMemberHourDTO);
+            log.warn("更新标准工时异常" + chuanyunWeekMemberHourDTO);
         }
     }
 
     /**
      * 异步更新每月工时
+     *
      * @param chuanyunSelfCostDTO 每周工时数据对象
      */
     @Async
-    public void updateChuanyunSelfCost(ChuanyunSelfCostDTO chuanyunSelfCostDTO){
-        ObjectMapper objectMapper=new ObjectMapper();
+    public void updateChuanyunSelfCost(ChuanyunSelfCostDTO chuanyunSelfCostDTO) {
+        ObjectMapper objectMapper = new ObjectMapper();
         try {
             List<String> matchers = new ArrayList<>();
             matchers.add("F0000003_2," + chuanyunSelfCostDTO.getProjectId());
@@ -142,44 +144,77 @@ public class DataArcherService {
         }
     }
 
-
+    /**
+     * 删除审核中的每月工时
+     * @param chuanyunSelfCostDO    氚云每月工时
+     */
+    @Async
+    public void deleteSelfCostInProcess(ChuanyunSelfCostDO chuanyunSelfCostDO) {
+        ObjectMapper objectMapper=new ObjectMapper();
+        //删除氚云中的在审核工时
+        List<String> matchers = new ArrayList<>();
+        matchers.add("F0000003_2," + chuanyunSelfCostDO.getProjectId());
+        matchers.add("F0000009_2," + ChuanYunConstant.IN_PROCESS);
+        matchers.add("F0000002_2," + chuanyunSelfCostDO.getUserId());
+        matchers.add("F0000008_2," + chuanyunSelfCostDO.getProjectType());
+        matchers.add("F0000004_2," + chuanyunSelfCostDO.getDayLogDate());
+        var filter = Filter.instance(0, 1, true, "And", matchers);
+        try {
+            ChuanyunFindAllBizDTO<Object> chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunMemberMonthCostDO.SCHEMA_CODE, filter);
+            if (chuanyunFindAllResponse.getReturnData() != null) {
+                List<ChuanyunMemberMonthCostDO> result = objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
+                });
+                result.forEach(chuanyunMemberMonthCostDO -> {
+                    try {
+                        chuanYunManager.delete(ChuanyunMemberMonthCostDO.SCHEMA_CODE, chuanyunMemberMonthCostDO.getObjectId());
+                    } catch (Exception e) {
+                        log.error("逐条删除失败" + e.getMessage());
+                    }
+                });
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("删除已审核通过的月度数据汇总失败");
+        }
+    }
 
     /**
      * 删除状态为审核中数据
      */
-    public void deleteExamineStatus(String schemaCode,String statusCode,String projectCode,String projectId,String userCode,String userId,String yearCode,String year,String monthCode,String month,String weekCode,String week,String typeCode,String projectType) {
-        ObjectMapper objectMapper=new ObjectMapper();
+    public void deleteExamineStatus(String schemaCode, String statusCode, String projectCode, String projectId, String userCode, String userId, String yearCode, String year, String monthCode, String month, String weekCode, String week, String typeCode, String projectType) {
+        ObjectMapper objectMapper = new ObjectMapper();
         try {
             List<String> matchers = new ArrayList<>();
-            matchers.add(statusCode+"_2,"+"2");
-            matchers.add(projectCode+"_2,"+projectId);
-            if (!StringUtils.isEmpty(userId)){
-                matchers.add(userCode+"_2,"+userId);
+            matchers.add(statusCode + "_2," + "2");
+            matchers.add(projectCode + "_2," + projectId);
+            if (!StringUtils.isEmpty(userId)) {
+                matchers.add(userCode + "_2," + userId);
             }
-            if (!StringUtils.isEmpty(year)){
-                matchers.add(yearCode+"_2,"+year);
+            if (!StringUtils.isEmpty(year)) {
+                matchers.add(yearCode + "_2," + year);
             }
-            if (!StringUtils.isEmpty(month)){
-                matchers.add(monthCode+"_2,"+month);
+            if (!StringUtils.isEmpty(month)) {
+                matchers.add(monthCode + "_2," + month);
             }
-            if (!StringUtils.isEmpty(week)){
-                matchers.add(weekCode+"_2,"+week);
+            if (!StringUtils.isEmpty(week)) {
+                matchers.add(weekCode + "_2," + week);
             }
-            if (!StringUtils.isEmpty(projectType)){
-                matchers.add(typeCode+"_2,"+projectType);
+            if (!StringUtils.isEmpty(projectType)) {
+                matchers.add(typeCode + "_2," + projectType);
             }
-            var filter= Filter.instance(0,Integer.MAX_VALUE,true,"And",matchers);
-            var chuanyunFindAllResponse=chuanYunManager.findAll(schemaCode,filter);
-            if (chuanyunFindAllResponse.getReturnData()!=null){
-                List<ChuanyunCommonDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+            var filter = Filter.instance(0, Integer.MAX_VALUE, true, "And", matchers);
+            var chuanyunFindAllResponse = chuanYunManager.findAll(schemaCode, filter);
+            if (chuanyunFindAllResponse.getReturnData() != null) {
+                List<ChuanyunCommonDO> result = objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
+                });
                 result.forEach(basicDO -> {
-                    ChuanyunSaveDTO chuanyunSaveDTO = chuanYunManager.delete(schemaCode,basicDO.getObjectId());
-                    if(!chuanyunSaveDTO.getSuccessful()){
+                    ChuanyunSaveDTO chuanyunSaveDTO = chuanYunManager.delete(schemaCode, basicDO.getObjectId());
+                    if (!chuanyunSaveDTO.getSuccessful()) {
                         log.warn("删除状态为审核中数据失败");
                     }
                 });
             }
-        }catch (Exception e) {
+        } catch (Exception e) {
             e.printStackTrace();
             log.error(e.getMessage());
         }

+ 1 - 2
src/main/java/com/galaxis/manatee/service/DingTalkAuthorization.java

@@ -6,7 +6,6 @@ import com.galaxis.manatee.constant.DingTalkConstant;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
 
@@ -30,7 +29,7 @@ public class DingTalkAuthorization {
      * 自动获取钉钉授权
      * @throws URISyntaxException   URI异常
      */
-    @Scheduled(fixedDelay = 7000000L)
+//    @Scheduled(fixedDelay = 7000000L)
     private void getToken() throws URISyntaxException {
         var restTemplate=new RestTemplate();
         var uri=new URI(getTokenUri+"?appkey="+ DingTalkConstant.DING_TALK_APP_KEY +"&appsecret="+DingTalkConstant.DING_TALK_APP_SECRET);

+ 4 - 4
src/main/java/com/galaxis/manatee/service/DingTalkScheduledTask.java

@@ -74,7 +74,7 @@ public class DingTalkScheduledTask {
      * 每个小时定期更新出差申请数据
      * 出差申请信息暂时不进行更新
      */
-    @Scheduled(fixedDelay = 3600000L,initialDelay = 10000L)
+//    @Scheduled(fixedDelay = 3600000L,initialDelay = 10000L)
     void updateBusinessTripProcessInstanceIdList() throws ApiException {
         updateProcessInstanceIdList(DingTalkConstant.PROCESS_CODE_BUSINESS_TRIP);
     }
@@ -85,7 +85,7 @@ public class DingTalkScheduledTask {
      * 每小时根据出差申请Id跟新出差申请信息。
      * 出差申请信息暂时不进行更新
      */
-    @Scheduled(fixedDelay = 3600000L,initialDelay = 10000L)
+//    @Scheduled(fixedDelay = 3600000L,initialDelay = 10000L)
     void updateProcessInstanceList() throws ApiException {
          updateChuanyunAskForLeave(DingTalkConstant.PROCESS_CODE_ASKFORLEAVE);
     }
@@ -94,7 +94,7 @@ public class DingTalkScheduledTask {
      * 业务招待申请更新
      * @throws ApiException
      */
-    @Scheduled(fixedDelay = 3600000L,initialDelay = 10000L)
+//    @Scheduled(fixedDelay = 3600000L,initialDelay = 10000L)
     void updateChuanyunBusinessEntertainmentProcessInstanceList() throws ApiException {
         updateChuanyunBusinessEntertainment(DingTalkConstant.PROCESS_CODE_BUSINESSENTERTAINMENT);
     }
@@ -102,7 +102,7 @@ public class DingTalkScheduledTask {
     /**
      * 每个小时定期更新项目实施变更申请数据
      */
-    @Scheduled(fixedDelay = 3600000L,initialDelay = 10000L)
+//    @Scheduled(fixedDelay = 3600000L,initialDelay = 10000L)
     void updateProjectChangeProcessInstanceIdList() throws ApiException {
         updateChuanyunProjectChangeProcessInstanceIdList(DingTalkConstant.PROCESS_CODE_PROJECT_CHANGE);
     }

+ 1 - 1
src/main/java/com/galaxis/manatee/service/LogCheckService.java

@@ -132,7 +132,7 @@ public class LogCheckService {
 
         long start = System.currentTimeMillis();
         log.info("开始核对标准化月工时");
-        List<ChuanyunSelfWorkHourDO> list = chuanyunSelfWorkHourDao.getMonthProjectHourByUserId(userId);
+        List<ChuanyunSelfWorkHourDO> list = chuanyunSelfWorkHourDao.getMonthProjectHour(userId);
         List<ChuanyunSelfCostDO> costDOList = chuanyunSelfCostDao.findByUserId(userId);
         if (list.size()!=costDOList.size()){
             Map<String, Integer> map = new HashMap<>(list.size()+costDOList.size());

+ 81 - 5
src/main/java/com/galaxis/manatee/service/LogStandardService.java

@@ -11,6 +11,7 @@ import org.springframework.util.StringUtils;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.Instant;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 /**
@@ -23,15 +24,19 @@ import java.util.List;
 @Slf4j
 @Service
 public class LogStandardService {
+
+    private final DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     private final ChuanyunWorkHourDao chuanyunWorkHourDao;
+    private final ChuanyunSelfCostDao chuanyunSelfCostDao;
     private final ChuanyunSelfWorkHourDao chuanyunSelfWorkHourDao;
     private final ChuanyunGroupProjectDao chuanyunGroupProjectDao;
     private final ChuanyunWeekMemberHourDao chuanyunWeekMemberHourDao;
     private final ChuanyunUserCompanyDao chuanyunUserCompanyDao;
     private final DataArcherService dataArcherService;
 
-    public LogStandardService(ChuanyunWorkHourDao chuanyunWorkHourDao, ChuanyunSelfWorkHourDao chuanyunSelfWorkHourDao, ChuanyunGroupProjectDao chuanyunGroupProjectDao, ChuanyunWeekMemberHourDao chuanyunWeekMemberHourDao, ChuanyunUserCompanyDao chuanyunUserCompanyDao, DataArcherService dataArcherService) {
+    public LogStandardService(ChuanyunWorkHourDao chuanyunWorkHourDao, ChuanyunSelfCostDao chuanyunSelfCostDao, ChuanyunSelfWorkHourDao chuanyunSelfWorkHourDao, ChuanyunGroupProjectDao chuanyunGroupProjectDao, ChuanyunWeekMemberHourDao chuanyunWeekMemberHourDao, ChuanyunUserCompanyDao chuanyunUserCompanyDao, DataArcherService dataArcherService) {
         this.chuanyunWorkHourDao = chuanyunWorkHourDao;
+        this.chuanyunSelfCostDao = chuanyunSelfCostDao;
         this.chuanyunSelfWorkHourDao = chuanyunSelfWorkHourDao;
         this.chuanyunGroupProjectDao = chuanyunGroupProjectDao;
         this.chuanyunWeekMemberHourDao = chuanyunWeekMemberHourDao;
@@ -45,7 +50,6 @@ public class LogStandardService {
      * @param isRecent              是否只标准化最近一个月的数据
      * @param chuanyunUserCompanyDO 员工信息
      */
-    @Async
     public void standardHourByUserCompanyAndIsRecent(ChuanyunUserCompanyDO chuanyunUserCompanyDO, boolean isRecent) {
         if (!StringUtils.isEmpty(chuanyunUserCompanyDO.getUserId())) {
             long start = Instant.now().getEpochSecond();
@@ -62,11 +66,19 @@ public class LogStandardService {
     /**
      * 标准化所有周工时信息
      */
-    @Async
     public void standardAllWeekMemberHour(){
         long start=Instant.now().getEpochSecond();
         chuanyunUserCompanyDao.findAll().forEach(chuanyunUserCompanyDO -> this.standardWeekMemberHourByUserId(chuanyunUserCompanyDO.getUserId()));
-        log.info("标准化所有日工时耗时"+(Instant.now().getEpochSecond()-start)+"秒");
+        log.info("标准化所有周工时耗时"+(Instant.now().getEpochSecond()-start)+"秒");
+    }
+
+    /**
+     * 标准化所有月工时
+     */
+    public void standardAllSelfCost(){
+        long start=Instant.now().getEpochSecond();
+        chuanyunUserCompanyDao.findAll().forEach(chuanyunUserCompanyDO -> this.standardSelfCostByUserId(chuanyunUserCompanyDO.getUserId()));
+        log.info("标准化所有月工时耗时"+(Instant.now().getEpochSecond()-start)+"秒");
     }
 
     /**
@@ -103,6 +115,49 @@ public class LogStandardService {
     }
 
     /**
+     * 根据用户Id标准化某个人的月工时
+     * 1.删除审核中的月工时
+     * 2.将新工时数据保存在manatee中
+     * @param userId    用户Id
+     */
+    @Async
+    public void standardSelfCostByUserId(String userId){
+        long start=Instant.now().getEpochSecond();
+        //删除上一次状态为审核中,但本次已经审核通过的数据
+        chuanyunSelfCostDao.findAllByStatusAndUserId(ChuanYunConstant.IN_PROCESS,userId).forEach(chuanyunSelfCostDO -> {
+            List<ChuanyunSelfWorkHourDO> chuanyunSelfWorkHourList=chuanyunSelfWorkHourDao.findAllByUserIdAndProjectIdAndProjectTypeAndStatusAndDayLogDateBetween(
+                    chuanyunSelfCostDO.getUserId(),
+                    chuanyunSelfCostDO.getProjectId(),
+                    chuanyunSelfCostDO.getProjectType(),
+                    ChuanYunConstant.IN_PROCESS,
+                    chuanyunSelfCostDO.getDayLogDate(),
+                    chuanyunSelfCostDO.getDayLogDate().plusMonths(1L));
+            //如果没有仍在审批中的每日工时,则将该月、该项目的审核中的月工时统计删除,manatee数据库与氚云
+            if(chuanyunSelfWorkHourList.size()==0){
+                //删除manatee中的在审核工时
+                chuanyunSelfCostDao.delete(chuanyunSelfCostDO);
+                dataArcherService.deleteSelfCostInProcess(chuanyunSelfCostDO);
+            }
+        });
+        //每月每项目工时,按月-项目-用户分组统计标准工时
+        List<ChuanyunSelfWorkHourDO> list = chuanyunSelfWorkHourDao.getMonthProjectHour(userId);
+        list.forEach(projectMonth->{
+            //获取人员-月度-相同工时状态标准工时汇总
+            ChuanyunSelfCostDO chuanyunSelfCostDO=this.fromChuanyunSelfWorkHourDO(projectMonth);
+            ChuanyunSelfCostDO oldSelfDO = chuanyunSelfCostDao.getOldSelfDO(chuanyunSelfCostDO.getUserId(),
+                    chuanyunSelfCostDO.getProjectId(),
+                    chuanyunSelfCostDO.getProjectType(),
+                    df.format(chuanyunSelfCostDO.getDayLogDate()),
+                    projectMonth.getStatus());
+            if (oldSelfDO !=null) {
+                chuanyunSelfCostDao.delete(oldSelfDO);
+            }
+            chuanyunSelfCostDao.save(chuanyunSelfCostDO);
+        });
+        log.info(userId+"统一月工时标准化"+(Instant.now().getEpochSecond()-start)+"秒");
+    }
+
+    /**
      * 根据日工时列表生成
      * @param updateList    待更新列表
      */
@@ -135,7 +190,6 @@ public class LogStandardService {
      * @param updateList    待更新的周工时列表
      */
     private void generateWeekMemberHourByWeekMemberHourList(List<ChuanyunWeekMemberHourDO> updateList){
-        long start= Instant.now().getEpochSecond();
         updateList.forEach(chuanyunWeekMemberHourDO -> {
             try{
                 if (chuanyunWeekMemberHourDO!=null){
@@ -195,4 +249,26 @@ public class LogStandardService {
         }
         return chuanyunSelfWorkHourDO;
     }
+
+    /**
+     * 根据ChuanyunSelfWorkHourDO获取ChuanyunSelfCostDO对象
+     * @param chuanyunSelfWorkHourDO    统计月工时对象
+     * @return  待保存的月工时对象
+     */
+    private ChuanyunSelfCostDO fromChuanyunSelfWorkHourDO(ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO){
+        ChuanyunSelfWorkHourDO monthHour = chuanyunSelfWorkHourDao.getMonthHour(chuanyunSelfWorkHourDO.getUserId(),df.format(chuanyunSelfWorkHourDO.getDayLogDate()),chuanyunSelfWorkHourDO.getStatus());
+        ChuanyunSelfCostDO chuanyunSelfCostDO = new ChuanyunSelfCostDO();
+        chuanyunSelfCostDO.setStatus(chuanyunSelfWorkHourDO.getStatus());
+        if (monthHour!=null){
+            chuanyunSelfCostDO.setMonthlyTotalHour(monthHour.getStandardWorkHour());
+        }
+        chuanyunSelfCostDO.setProjectId(chuanyunSelfWorkHourDO.getProjectId());
+        chuanyunSelfCostDO.setProjectType(chuanyunSelfWorkHourDO.getProjectType());
+        chuanyunSelfCostDO.setUserId(chuanyunSelfWorkHourDO.getUserId());
+        chuanyunSelfCostDO.setDayLogDate(chuanyunSelfWorkHourDO.getDayLogDate().withDayOfMonth(1));
+        chuanyunSelfCostDO.setTotalHour(chuanyunSelfWorkHourDO.getStandardWorkHour());
+        ChuanyunUserCompanyDO chuanyunUserCompanyDO=chuanyunUserCompanyDao.findByUserId(chuanyunSelfWorkHourDO.getUserId());
+        chuanyunSelfCostDO.setDepartmentId(chuanyunUserCompanyDO.getDepartmentId());
+        return chuanyunSelfCostDO;
+    }
 }

+ 16 - 4
src/main/java/com/galaxis/manatee/task/WorkHourStatistics.java

@@ -15,12 +15,14 @@ import com.galaxis.manatee.entity.chuanyun.dto.Filter;
 import com.galaxis.manatee.exception.BigSizeException;
 import com.galaxis.manatee.manager.ChuanYunManager;
 import com.galaxis.manatee.service.LogStandardService;
+import com.galaxis.manatee.service.LogUpdateService;
 import com.galaxis.manatee.util.ChuanyunLocalDateTimeDeserializer;
 import com.galaxis.manatee.util.ChuanyunLocalDateTimeSerializer;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
@@ -45,19 +47,29 @@ public class WorkHourStatistics {
     private final ChuanyunWorkHourDao chuanyunWorkHourDao;
     private final ChuanyunSelfWorkHourDao chuanyunSelfWorkHourDao;
     private final ChuanyunSelfCostDao chuanyunSelfCostDao;
-    private final ChuanyunWeekMemberHourDao chuanyunWeekMemberHourDao;
     private final ChuanyunMemberCostDao chuanyunMemberCostDao;
     private final LogStandardService logStandardService;
+    private final LogUpdateService logUpdateService;
 
-    public WorkHourStatistics(ChuanYunManager chuanYunManager, ChuanyunUserCompanyDao chuanyunUserCompanyDao, ChuanyunWorkHourDao chuanyunWorkHourDao, ChuanyunSelfWorkHourDao chuanyunSelfWorkHourDao, ChuanyunSelfCostDao chuanyunSelfCostDao, ChuanyunWeekMemberHourDao chuanyunWeekMemberHourDao, ChuanyunMemberCostDao chuanyunMemberCostDao, LogStandardService logStandardService) {
+    public WorkHourStatistics(ChuanYunManager chuanYunManager, ChuanyunUserCompanyDao chuanyunUserCompanyDao, ChuanyunWorkHourDao chuanyunWorkHourDao, ChuanyunSelfWorkHourDao chuanyunSelfWorkHourDao, ChuanyunSelfCostDao chuanyunSelfCostDao, ChuanyunMemberCostDao chuanyunMemberCostDao, LogStandardService logStandardService, LogUpdateService logUpdateService) {
         this.chuanYunManager = chuanYunManager;
         this.chuanyunUserCompanyDao = chuanyunUserCompanyDao;
         this.chuanyunWorkHourDao = chuanyunWorkHourDao;
         this.chuanyunSelfWorkHourDao = chuanyunSelfWorkHourDao;
         this.chuanyunSelfCostDao = chuanyunSelfCostDao;
-        this.chuanyunWeekMemberHourDao = chuanyunWeekMemberHourDao;
         this.chuanyunMemberCostDao = chuanyunMemberCostDao;
         this.logStandardService = logStandardService;
+        this.logUpdateService = logUpdateService;
+    }
+
+    /**
+     * 每3小时上传一次所有日工时、周工时、月工时
+     */
+    @Scheduled(fixedDelay = 10800000L)
+    public void updateHour(){
+        logUpdateService.updateAllChuanyunSelfWorkHour();
+        logUpdateService.updateAllChuanyunWeekMemberHour();
+        logUpdateService.updateAllChuanyunSelfCost();
     }
 
     /**
@@ -65,7 +77,7 @@ public class WorkHourStatistics {
      */
 //    @Scheduled(fixedDelay = 432000000L)
     @Async
-    public void updateHour() {
+    public void standardHour() {
         //每日工时标准化
         standardWorkHour();
         standardWeeklyWorkHour();