Selaa lähdekoodia

Merge branch '1.0' of https://codeup.aliyun.com/5ec7ea24405cdab50f3fd8f0/galaxis/manatee into 1.0

xuj 4 vuotta sitten
vanhempi
commit
837a0026ee

+ 8 - 0
src/main/java/com/galaxis/manatee/dao/ChuanyunMemberCostDao.java

@@ -5,6 +5,7 @@ import com.galaxis.capsule.util.GalaxisRepository;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunMemberCostDO;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -41,4 +42,11 @@ public interface ChuanyunMemberCostDao extends GalaxisRepository<ChuanyunMemberC
      * @return  人员-项目工时
      */
     ChuanyunMemberCostDO findByUserIdAndProjectIdAndStatus(String userId,String projectId,String status);
+
+    /**
+     * 删除审核中数据
+     * @param status
+     */
+    @Transactional
+    void deleteAllByStatus(String status);
 }

+ 6 - 0
src/main/java/com/galaxis/manatee/dao/ChuanyunMonthLaborCostDao.java

@@ -3,8 +3,14 @@ package com.galaxis.manatee.dao;
 import com.galaxis.capsule.util.GalaxisRepository;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunMonthLaborCostDO;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunPayrollDO;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
 @Repository
 public interface ChuanyunMonthLaborCostDao extends GalaxisRepository<ChuanyunMonthLaborCostDO,String> {
+
+    @Query(value="SELECT SUM(chuanyun_month_laborcost.amount)AS totoalamount ,chuanyun_month_laborcost.* FROM chuanyun_month_laborcost \n" +
+            "LEFT JOIN chuanyun_group_project ON chuanyun_group_project.project_code = chuanyun_month_laborcost.project_code\n" +
+            "WHERE chuanyun_group_project.object_id = ? GROUP BY chuanyun_month_laborcost.project_code",nativeQuery = true)
+    ChuanyunMonthLaborCostDO getTotalCost(String projectCode);
 }

+ 3 - 0
src/main/java/com/galaxis/manatee/dao/ChuanyunProjectCostDao.java

@@ -5,6 +5,7 @@ import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunMemberCostDO;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunProjectCostDO;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -39,4 +40,6 @@ public interface ChuanyunProjectCostDao extends GalaxisRepository<ChuanyunProjec
      */
     ChuanyunProjectCostDO findByProjectId(String projectId);
 
+    @Transactional
+    void deleteAllByStatus(String status);
 }

+ 8 - 0
src/main/java/com/galaxis/manatee/dao/ChuanyunSelfCostDao.java

@@ -6,6 +6,7 @@ import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunSelfWorkHourDO;
 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.util.List;
 
@@ -30,4 +31,11 @@ public interface ChuanyunSelfCostDao extends GalaxisRepository<ChuanyunSelfCostD
     @Query(value="SELECT * FROM chuanyun_self_cost WHERE user_id = ?1 AND project_id = ?2 AND DATE_FORMAT(chuanyun_self_cost.day_log_date,'%Y-%m')=DATE_FORMAT(?3,'%Y-%m')",nativeQuery = true)
     ChuanyunSelfCostDO getOldSelfDO(@Param("userId")String userId,@Param("projectId")String projectId,@Param("dayLogDate")String dayLogDate);
 
+    /**
+     * 根据流程状态删除数据
+     * @param status
+     */
+    @Transactional
+    void deleteAllByStatus(String status);
+
 }

+ 24 - 3
src/main/java/com/galaxis/manatee/dao/ChuanyunWeekMemberHourDao.java

@@ -5,6 +5,7 @@ import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunProjectCostDO;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunWeekMemberHourDO;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -12,11 +13,31 @@ import java.util.List;
 public interface ChuanyunWeekMemberHourDao extends GalaxisRepository<ChuanyunWeekMemberHourDO,String> {
 
     /**
+     * 根据状态删除数据
+     * @param status    状态
+     * @return  删除条数
+     */
+    @Transactional
+    Integer deleteAllByStatus(String status);
+
+    /**
      * 人员-项目-周度工时汇总
      * @return
      */
-    @Query(value="SELECT chuanyun_self_work_hour.object_id,WEEKOFYEAR(chuanyun_self_work_hour.day_log_date) AS week,project_id,user_id,SUM(standard_work_hour)AS standard_work_hour,project_type,`status`" +
-            "FROM chuanyun_self_work_hour WHERE project_id !='' GROUP BY chuanyun_self_work_hour.project_id,chuanyun_self_work_hour.user_id,WEEKOFYEAR(chuanyun_self_work_hour.day_log_date),chuanyun_self_work_hour.`status`",nativeQuery = true)
+    @Query(value="SELECT chuanyun_self_work_hour.object_id," +
+            "DATE_FORMAT(day_log_date,'%Y') as year," +
+            "WEEKOFYEAR(chuanyun_self_work_hour.day_log_date) AS week," +
+            "project_id,user_id," +
+            "SUM(standard_work_hour)AS standard_work_hour," +
+            "project_type," +
+            "`status`" +
+            "FROM chuanyun_self_work_hour " +
+            "WHERE project_id !='' " +
+            "GROUP BY chuanyun_self_work_hour.project_id," +
+            "chuanyun_self_work_hour.user_id," +
+            "DATE_FORMAT(day_log_date,'%Y')," +
+            "WEEKOFYEAR(chuanyun_self_work_hour.day_log_date)," +
+            "chuanyun_self_work_hour.`status`",nativeQuery = true)
     List<ChuanyunWeekMemberHourDO> getWeekMemberHour();
 
     /**
@@ -26,5 +47,5 @@ public interface ChuanyunWeekMemberHourDao extends GalaxisRepository<ChuanyunWee
      * @param week
      * @return
      */
-    ChuanyunWeekMemberHourDO findByProjectIdAndUserIdAndWeekAndStatusAndProjectType(String projectId,String userId,String week,String status,String projectType);
+    ChuanyunWeekMemberHourDO findByProjectIdAndUserIdAndWeekAndStatusAndProjectTypeAndYear(String projectId,String userId,String week,String status,String projectType,String year);
 }

+ 21 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunCommonDO.java

@@ -0,0 +1,21 @@
+package com.galaxis.manatee.entity.chuanyun.data.object;
+
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.persistence.Entity;
+
+@Slf4j
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunCommonDO extends BasicDO{
+
+    @JsonProperty("OwnerId")
+    private String ownerId;
+}

+ 4 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunMonthLaborCostDO.java

@@ -14,6 +14,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.persistence.Entity;
+import javax.persistence.Transient;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
@@ -35,6 +36,9 @@ public class ChuanyunMonthLaborCostDO extends BasicDO{
     @JsonProperty("F0000003")
     private BigDecimal amount;
 
+    @Transient
+    private BigDecimal totalamount;
+
     @JsonSerialize(using = ChuanyunLocalDateTimeSerializer.class)
     @JsonDeserialize(using = ChuanyunLocalDateTimeDeserializer.class)
     @JsonProperty("F0000002")

+ 6 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunProjectMemberWeekHourDO.java

@@ -51,6 +51,12 @@ public class ChuanyunProjectMemberWeekHourDO extends BasicDO{
     private BigDecimal personDays;
 
     /**
+     * 年份
+     */
+    @JsonProperty("F0000008")
+    private String year;
+
+    /**
      * 周数
      */
     @JsonProperty("F0000006")

+ 5 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunSelfCostDO.java

@@ -72,4 +72,9 @@ public class ChuanyunSelfCostDO {
      * 人员每月工时汇总
      */
     private BigDecimal monthlyTotalHour;
+
+    /**
+     * 部门Id
+     */
+    private String departmentId;
 }

+ 8 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunWeekMemberHourDO.java

@@ -33,6 +33,14 @@ public class ChuanyunWeekMemberHourDO {
      */
     private String status;
 
+    /**
+     * 年
+     */
+    private String year;
+
+    /**
+     * 周
+     */
     private String week;
 
     private BigDecimal standardWorkHour;

+ 8 - 0
src/main/java/com/galaxis/manatee/manager/ChuanYunManager.java

@@ -88,4 +88,12 @@ public interface ChuanYunManager {
      * @return 保存结果
      */
     ChuanyunSaveDTO update(String schemaCode,String bizObjectId, String bizObject) throws BigSizeException;
+
+    /**
+     * 删除
+     * @param schemaCode
+     * @param bizObjectId
+     * @return
+     */
+    ChuanyunSaveDTO delete(String schemaCode, String bizObjectId);
 }

+ 27 - 0
src/main/java/com/galaxis/manatee/manager/impl/DefaultChuanyunManagerImpl.java

@@ -252,4 +252,31 @@ public class DefaultChuanyunManagerImpl implements ChuanYunManager {
         }
         return chuanyunSaveResponse;
     }
+
+    @Override
+    public ChuanyunSaveDTO delete(String schemaCode, String bizObjectId) {
+        @Data
+        class Find{
+            @JsonProperty(value = "ActionName")
+            private String actionName="RemoveBizObject";
+            @JsonProperty(value = "SchemaCode")
+            private String schemaCode;
+            @JsonProperty(value = "BizObjectId")
+            private String bizObjectId;
+
+            public Find(String schemaCode, String bizObjectId) {
+                this.schemaCode = schemaCode;
+                this.bizObjectId = bizObjectId;
+            }
+        }
+        Find find=new Find(schemaCode,bizObjectId);
+        //请求客户端
+        RestTemplate restTemplate=new RestTemplate();
+        HttpHeaders httpHeaders=new HttpHeaders();
+        httpHeaders.add("EngineCode",ChuanYunConstant.ENGINE_CODE);
+        httpHeaders.add("EngineSecret",ChuanYunConstant.ENGINE_SECRET);
+        HttpEntity<Find> httpEntity=new HttpEntity<>(find,httpHeaders);
+        ChuanyunSaveDTO chuanyunSaveResponse =new ChuanyunSaveDTO();
+        return chuanyunSaveResponse = restTemplate.postForObject(ChuanYunConstant.CHUAN_YUN_INVOKE_URL,httpEntity, chuanyunSaveResponse.getClass());
+    }
 }

+ 2 - 3
src/main/java/com/galaxis/manatee/task/ChuanyunFinancialScheduledTask.java

@@ -56,8 +56,7 @@ public class ChuanyunFinancialScheduledTask {
     /**
      * 将报销信息从氚云中同步
      */
-//    @Scheduled(cron = "0 0 2 * * *")
-    @Scheduled(fixedDelay = 3600000L)
+    @Scheduled(cron = "0 0 2 * * *")
     private void reimbursementInformationSync(){
         getReimbursementFromChuanyun();
     }
@@ -99,7 +98,7 @@ public class ChuanyunFinancialScheduledTask {
                         //没有之前的数据不做处理
                     }
                     //同步报销单中外部部门名称
-                    synchroOutDepartment(chuanyunReimbursementDO);
+//                    synchroOutDepartment(chuanyunReimbursementDO);
 
                     //将报销单中关联信息的id转化为具体的数据
                     try{

+ 3 - 0
src/main/java/com/galaxis/manatee/task/ChuanyunHumanResourceScheduledTask.java

@@ -16,6 +16,7 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -70,6 +71,7 @@ public class ChuanyunHumanResourceScheduledTask {
 //        matchersString.add("Status_2,1");
         matchersString.add("Status_6,[1;2]");
         while (flag) {
+            Long startTime= Instant.now().getEpochSecond();
             try {
                 //从氚云查询数据
                 var filter= Filter.instance(start,start+pageSize,true,Filter.AND,matchersString);
@@ -129,6 +131,7 @@ public class ChuanyunHumanResourceScheduledTask {
                 log.error(e.getMessage());
                 e.printStackTrace();
             }
+            log.info(Instant.now().getEpochSecond()-startTime+"日志100条保存时间");
         }
         log.info("日志信息保存" + totalCount);
     }

+ 404 - 276
src/main/java/com/galaxis/manatee/task/ChuanyunProjectScheduledTask.java

@@ -17,6 +17,7 @@ import com.galaxis.manatee.util.ChuanyunLocalDateTimeDeserializer;
 import com.galaxis.manatee.util.ChuanyunLocalDateTimeSerializer;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
@@ -24,6 +25,7 @@ import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
@@ -230,6 +232,76 @@ public class ChuanyunProjectScheduledTask {
     }
 
     /**
+     * 项目工时汇总
+     */
+    @Scheduled(fixedDelay = 3600000L)
+    private void projectHour() {
+        List<ChuanyunProjectCostDO> list1 = chuanyunProjectCostDao.getProjectCost();
+        deleteExamineStatus(ChuanyunProjectTotalCostDO.SCHEMA_CODE,"F0000006");
+        chuanyunProjectCostDao.deleteAllByStatus("2");
+        list1.forEach(chuanyunProjectCostDO -> {
+            //获取项目实施费用
+            ChuanyunReimbursementAmountDO chuanyunReimbursementAmountDO = chuanyunReimbursementAmountDao.getAmount(chuanyunProjectCostDO.getProjectId());
+            //人力成本
+            ChuanyunMonthLaborCostDO chuanyunMonthLaborCostDO = chuanyunMonthLaborCostDao.getTotalCost(chuanyunProjectCostDO.getProjectId());
+            //更新数据库
+            ChuanyunProjectCostDO projectCostDO = new ChuanyunProjectCostDO();
+            if (chuanyunMonthLaborCostDO!=null){
+                projectCostDO.setCost(chuanyunMonthLaborCostDO.getAmount());
+            }
+            projectCostDO.setProjectType(chuanyunProjectCostDO.getProjectType());
+            projectCostDO.setProjectId(chuanyunProjectCostDO.getProjectId());
+            projectCostDO.setTotalHour(chuanyunProjectCostDO.getTotalHour());
+            projectCostDO.setStatus(chuanyunProjectCostDO.getStatus());
+            projectCostDO.setPersonDays(chuanyunProjectCostDO.getPersonDays());
+            if (chuanyunReimbursementAmountDO !=null) {
+                projectCostDO.setAmount(chuanyunReimbursementAmountDO.getTotalAmount());
+            }
+            ChuanyunProjectCostDO oldProjectDO = chuanyunProjectCostDao.findByProjectId(chuanyunProjectCostDO.getProjectId());
+            if (oldProjectDO !=null) {
+                chuanyunProjectCostDao.delete(oldProjectDO);
+            }
+            chuanyunProjectCostDao.save(projectCostDO);
+            try {
+                ChuanyunProjectTotalCostDTO chuanyunProjectTotalCostDTO = new ChuanyunProjectTotalCostDTO();
+                chuanyunProjectTotalCostDTO.setProjectType(chuanyunProjectCostDO.getProjectType());
+                chuanyunProjectTotalCostDTO.setProjectId(chuanyunProjectCostDO.getProjectId());
+                if (chuanyunMonthLaborCostDO!=null){
+                    chuanyunProjectTotalCostDTO.setCost(chuanyunMonthLaborCostDO.getAmount());
+                }
+                chuanyunProjectTotalCostDTO.setStatus(chuanyunProjectCostDO.getStatus());
+                chuanyunProjectTotalCostDTO.setWorkHour(chuanyunProjectCostDO.getTotalHour());
+                chuanyunProjectTotalCostDTO.setPersonDays(chuanyunProjectCostDO.getPersonDays());
+                if (chuanyunReimbursementAmountDO !=null) {
+                    chuanyunProjectTotalCostDTO.setAmount(chuanyunReimbursementAmountDO.getTotalAmount());
+                }
+                List<String> matchers = new ArrayList<>();
+                matchers.add("F0000001_2,"+chuanyunProjectCostDO.getProjectId());
+                matchers.add("F0000006_2,"+chuanyunProjectCostDO.getStatus());
+                var filter= Filter.instance(0,1,true,"And",matchers);
+                var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunProjectTotalCostDO.SCHEMA_CODE,filter);
+                var projectTotalString=objectMapper.writeValueAsString(chuanyunProjectTotalCostDTO);
+                ChuanyunSaveDTO chuanyunSaveDTO;
+                if (chuanyunFindAllResponse.getReturnData()!=null) {
+                    List<ChuanyunProjectTotalCostDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                    ChuanyunProjectTotalCostDO firstResult = result.get(0);
+                    chuanyunSaveDTO = chuanYunManager.update(ChuanyunProjectTotalCostDO.SCHEMA_CODE,firstResult.getObjectId(),projectTotalString);
+                }else {
+                    chuanyunSaveDTO = chuanYunManager.save(ChuanyunProjectTotalCostDO.SCHEMA_CODE,projectTotalString,true);
+
+                }
+                if(!chuanyunSaveDTO.getSuccessful()){
+                    log.warn("新增项目成本汇总失败");
+                }
+            } catch (JsonProcessingException | BigSizeException e) {
+                log.error(e.getMessage());
+                log.error(""+chuanyunProjectCostDO);
+                e.printStackTrace();
+            }
+        });
+    }
+
+    /**
      * 更新销售合同回款数据
      */
     @Scheduled(fixedDelay = 3600000L)
@@ -269,13 +341,11 @@ public class ChuanyunProjectScheduledTask {
         log.info("项目销售合同回款信息保存保存"+totalCount);
     }
 
-
     /**
      * 人力成本
      */
     @Scheduled(fixedDelay = 3600000L)
-    private void laborCost() {
-        var objectMapper=new ObjectMapper();
+    private void standardWorkHour() {
         var flag = true;
         var pageSize = 20;
         var page = 0;
@@ -284,160 +354,161 @@ public class ChuanyunProjectScheduledTask {
             var chuanyunUserCompanyList = chuanyunUserCompanyDao.findAllByStatus(1,pageable);
             if (page<=chuanyunUserCompanyList.getTotalPages()){
                 page += 1;
+                //逐个将员工每天工时进行统计汇总
+                List<ChuanyunUserCompanyDO> userCompanyDOList = chuanyunUserCompanyList.getContent();
+                userCompanyDOList.forEach(chuanyunUserCompanyDO -> {
+                    long start= Instant.now().getEpochSecond();
+                    //工时标准化
+                    standardHour(chuanyunUserCompanyDO);
+                    log.info("每日工时标准化"+chuanyunUserCompanyDO.getUserName()+(Instant.now().getEpochSecond()-start)+"秒");
+                });
             }else {
-                flag = false;
                 break;
             }
-            //逐个将员工每天工时进行统计汇总
-            List<ChuanyunUserCompanyDO> userCompanyDOList = chuanyunUserCompanyList.getContent();
-            userCompanyDOList.forEach(chuanyunUserCompanyDO -> {
-                //工时标准化
-                standardHour(chuanyunUserCompanyDO);
-                //单项目单人单月成本
-                standardMonthlyHour(chuanyunUserCompanyDO);
-            });
         }
-        //人员项目周工时汇总
-        weekhour();
-        //按项目汇总用户工时
-        monthhour();
-        //项目汇总
-        projecthour();
+    }
+
+    /**
+     * 员工单日、各个项目工时标准化,并保存
+     * @param chuanyunUserCompanyDO 员工信息
+     */
+    private void standardHour(ChuanyunUserCompanyDO chuanyunUserCompanyDO) {
+        BigDecimal standard = new BigDecimal(8);
+        //每人每个项目每天工时
+        List<ChuanyunWorkHourDO> selfList = chuanyunWorkHourDao.getSelfWorkHour(chuanyunUserCompanyDO.getUserId());
+        selfList.forEach(self->{
+            try{
+                ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO = new ChuanyunSelfWorkHourDO();
+                chuanyunSelfWorkHourDO.setStatus(self.getStatus());
+                chuanyunSelfWorkHourDO.setUserId(chuanyunUserCompanyDO.getUserId());
+                chuanyunSelfWorkHourDO.setProjectType(self.getProjectType());
+                if(ChuanYunConstant.PRODUCTION_PROJECT.equals(self.getProjectType())){
+                    chuanyunSelfWorkHourDO.setProjectId(ChuanYunConstant.PRODUCTION_PROJECT_ID);
+                }else{
+                    chuanyunSelfWorkHourDO.setProjectId(self.getProjectId());
+                }
+                chuanyunSelfWorkHourDO.setDayLogDate(self.getDayLogDate());
+                //每人每天工时
+                ChuanyunWorkHourDO chuanyunWorkHourDO = chuanyunWorkHourDao.getDayWorkHour(chuanyunUserCompanyDO.getUserId(),self.getDayLogDate());
+                //工时标准化
+                if (chuanyunWorkHourDO != null) {
+                    if (chuanyunWorkHourDO.getHoursWorked().compareTo(standard)<0) {
+                        chuanyunSelfWorkHourDO.setStandardWorkHour(self.getHoursWorked());
+                    }else {
+                        BigDecimal personDays = (self.getHoursWorked().divide(chuanyunWorkHourDO.getHoursWorked(), 2, RoundingMode.HALF_UP)).multiply(standard);
+                        chuanyunSelfWorkHourDO.setStandardWorkHour(personDays);
+                    }
+                    ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO1 = chuanyunSelfWorkHourDao.findByUserIdAndAndProjectIdAndAndDayLogDate(chuanyunUserCompanyDO.getUserId(),ChuanYunConstant.PRODUCTION_PROJECT.equals(self.getProjectType())?ChuanYunConstant.PRODUCTION_PROJECT_ID:self.getProjectId(),self.getDayLogDate());
+                    if (chuanyunSelfWorkHourDO1!=null) {
+                        chuanyunSelfWorkHourDao.delete(chuanyunSelfWorkHourDO1);
+                    }
+                    chuanyunSelfWorkHourDao.save(chuanyunSelfWorkHourDO);
+                }
+            }catch (Exception e){
+                log.error(e.getMessage());
+                log.error(""+self);
+                e.printStackTrace();
+            }
+        });
     }
 
     /**
      * 人员-项目-周度工时汇总
      */
-    private void weekhour() {
+    @Scheduled(fixedDelay = 3600000L)
+    private void standardWeeklyWorkHour() {
+        long start=Instant.now().getEpochSecond();
+        //删除数据库中审批中的数据,防止重复记录工时
+        chuanyunWeekMemberHourDao.deleteAllByStatus("2");
         //更新数据库
-       List<ChuanyunWeekMemberHourDO> list = chuanyunWeekMemberHourDao.getWeekMemberHour();
-       list.forEach(chuanyunWeekMemberHourDO -> {
-           if (chuanyunWeekMemberHourDO!=null){
-               BigDecimal standard = new BigDecimal(8);
-               ChuanyunWeekMemberHourDO weekMemberHourDO = new ChuanyunWeekMemberHourDO();
-               weekMemberHourDO.setProjectId(chuanyunWeekMemberHourDO.getProjectId());
-               weekMemberHourDO.setProjectType(chuanyunWeekMemberHourDO.getProjectType());
-               weekMemberHourDO.setStandardWorkHour(chuanyunWeekMemberHourDO.getStandardWorkHour());
-               weekMemberHourDO.setStatus(chuanyunWeekMemberHourDO.getStatus());
-               weekMemberHourDO.setUserId(chuanyunWeekMemberHourDO.getUserId());
-               weekMemberHourDO.setWeek(chuanyunWeekMemberHourDO.getWeek());
-               ChuanyunWeekMemberHourDO oldWeekHour = chuanyunWeekMemberHourDao.findByProjectIdAndUserIdAndWeekAndStatusAndProjectType(chuanyunWeekMemberHourDO.getProjectId(),chuanyunWeekMemberHourDO.getUserId(),chuanyunWeekMemberHourDO.getWeek(),chuanyunWeekMemberHourDO.getStatus(),chuanyunWeekMemberHourDO.getProjectType());
-               if (oldWeekHour != null) {
-                   chuanyunWeekMemberHourDao.delete(oldWeekHour);
-               }
-               chuanyunWeekMemberHourDao.save(weekMemberHourDO);
-               //更新氚云
-               try {
-                   ChuanyunProjectMemberWeekHourDTO chuanyunProjectMemberWeekHourDTO = new ChuanyunProjectMemberWeekHourDTO();
-                   chuanyunProjectMemberWeekHourDTO.setProjectId(chuanyunWeekMemberHourDO.getProjectId());
-                   chuanyunProjectMemberWeekHourDTO.setUserId(chuanyunWeekMemberHourDO.getUserId());
-                   chuanyunProjectMemberWeekHourDTO.setWeek(chuanyunWeekMemberHourDO.getWeek());
-                   chuanyunProjectMemberWeekHourDTO.setProjectType(chuanyunWeekMemberHourDO.getProjectType());
-                   chuanyunProjectMemberWeekHourDTO.setTotalHour(chuanyunWeekMemberHourDO.getStandardWorkHour());
-                   chuanyunProjectMemberWeekHourDTO.setPersonDays(chuanyunWeekMemberHourDO.getStandardWorkHour().divide(standard,2,RoundingMode.HALF_UP));
-                   chuanyunProjectMemberWeekHourDTO.setHourStatus(chuanyunWeekMemberHourDO.getStatus());
-                   List<String> matchers = new ArrayList<>();
-                   matchers.add("F0000001_2,"+chuanyunWeekMemberHourDO.getProjectId());
-                   matchers.add("F0000002_2,"+chuanyunWeekMemberHourDO.getUserId());
-                   matchers.add("F0000006_2,"+chuanyunWeekMemberHourDO.getWeek());
-                   matchers.add("F0000003_2,"+chuanyunWeekMemberHourDO.getProjectType());
-                   matchers.add("F0000007_2,"+chuanyunWeekMemberHourDO.getStatus());
-                   var filter= Filter.instance(0,1,true,"And",matchers);
-                   var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,filter);
-                   var selfMonthString=objectMapper.writeValueAsString(chuanyunProjectMemberWeekHourDTO);
-                   ChuanyunSaveDTO chuanyunSaveDTO;
-                   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);
-                   }
-                   if(chuanyunSaveDTO.getSuccessful()){
-                       log.info("新增人员项目周度工时成功");
-                   }else{
-                       log.warn("新增人员项目周度工时失败");
-                   }
-               } catch (JsonProcessingException | BigSizeException e) {
-                   e.printStackTrace();
-               }
-           }
-       });
+        log.info("开始周工时标准化");
+        List<ChuanyunWeekMemberHourDO> list = chuanyunWeekMemberHourDao.getWeekMemberHour();
+        list.forEach(chuanyunWeekMemberHourDO -> {
+            if (chuanyunWeekMemberHourDO!=null){
+                ChuanyunWeekMemberHourDO weekMemberHourDO = new ChuanyunWeekMemberHourDO();
+                weekMemberHourDO.setProjectId(chuanyunWeekMemberHourDO.getProjectId());
+                weekMemberHourDO.setProjectType(chuanyunWeekMemberHourDO.getProjectType());
+                weekMemberHourDO.setStandardWorkHour(chuanyunWeekMemberHourDO.getStandardWorkHour());
+                weekMemberHourDO.setStatus(chuanyunWeekMemberHourDO.getStatus());
+                weekMemberHourDO.setUserId(chuanyunWeekMemberHourDO.getUserId());
+                weekMemberHourDO.setYear(chuanyunWeekMemberHourDO.getYear());
+                weekMemberHourDO.setWeek(chuanyunWeekMemberHourDO.getWeek());
+                ChuanyunWeekMemberHourDO oldWeekHour = chuanyunWeekMemberHourDao.findByProjectIdAndUserIdAndWeekAndStatusAndProjectTypeAndYear(chuanyunWeekMemberHourDO.getProjectId(),chuanyunWeekMemberHourDO.getUserId(),chuanyunWeekMemberHourDO.getWeek(),chuanyunWeekMemberHourDO.getStatus(),chuanyunWeekMemberHourDO.getProjectType(),chuanyunWeekMemberHourDO.getYear());
+                if (oldWeekHour != null) {
+                    chuanyunWeekMemberHourDao.delete(oldWeekHour);
+                }
+                chuanyunWeekMemberHourDao.save(weekMemberHourDO);
+            }
+        });
+        log.info("周工时标准化"+(Instant.now().getEpochSecond()-start)+"秒");
     }
 
     /**
-     * 项目工时汇总
+     * 单月工时汇总
      */
-    private void projecthour() {
-        List<ChuanyunProjectCostDO> list1 = chuanyunProjectCostDao.getProjectCost();
-        list1.forEach(chuanyunProjectCostDO -> {
-            //获取项目实施费用
-            ChuanyunReimbursementAmountDO chuanyunReimbursementAmountDO = chuanyunReimbursementAmountDao.getAmount(chuanyunProjectCostDO.getProjectId());
-            //更新数据库
-            ChuanyunProjectCostDO projectCostDO = new ChuanyunProjectCostDO();
-            projectCostDO.setCost(chuanyunProjectCostDO.getCost());
-            projectCostDO.setProjectType(chuanyunProjectCostDO.getProjectType());
-            projectCostDO.setProjectId(chuanyunProjectCostDO.getProjectId());
-            projectCostDO.setTotalHour(chuanyunProjectCostDO.getTotalHour());
-            projectCostDO.setStatus(chuanyunProjectCostDO.getStatus());
-            projectCostDO.setPersonDays(chuanyunProjectCostDO.getPersonDays());
-            if (chuanyunReimbursementAmountDO !=null) {
-                projectCostDO.setAmount(chuanyunReimbursementAmountDO.getTotalAmount());
-            }
-            ChuanyunProjectCostDO oldProjectDO = chuanyunProjectCostDao.findByProjectId(chuanyunProjectCostDO.getProjectId());
-            if (oldProjectDO !=null) {
-                chuanyunProjectCostDao.delete(oldProjectDO);
+    @Scheduled(fixedDelay = 3600000L)
+    private void standardMonthlyWorkHour() {
+        var flag = true;
+        var pageSize = 20;
+        var page = 0;
+        while(flag) {
+            long start=Instant.now().getEpochSecond();
+            var pageable= PageRequest.of(page,pageSize);
+            var chuanyunUserCompanyList = chuanyunUserCompanyDao.findAllByStatus(1,pageable);
+            if (page<=chuanyunUserCompanyList.getTotalPages()){
+                page += 1;
+                List<ChuanyunUserCompanyDO> userCompanyDOList = chuanyunUserCompanyList.getContent();
+                //单项目单人单月成本
+                userCompanyDOList.forEach(this::standardMonthlyHour);
+            }else {
+                flag = false;
             }
-            chuanyunProjectCostDao.save(projectCostDO);
-            try {
-                ChuanyunProjectTotalCostDTO chuanyunProjectTotalCostDTO = new ChuanyunProjectTotalCostDTO();
-                chuanyunProjectTotalCostDTO.setProjectType(chuanyunProjectCostDO.getProjectType());
-                chuanyunProjectTotalCostDTO.setProjectId(chuanyunProjectCostDO.getProjectId());
-                chuanyunProjectTotalCostDTO.setCost(chuanyunProjectCostDO.getCost());
-                chuanyunProjectTotalCostDTO.setStatus(chuanyunProjectCostDO.getStatus());
-                chuanyunProjectTotalCostDTO.setWorkHour(chuanyunProjectCostDO.getTotalHour());
-                chuanyunProjectTotalCostDTO.setPersonDays(chuanyunProjectCostDO.getPersonDays());
-                if (chuanyunReimbursementAmountDO !=null) {
-                    chuanyunProjectTotalCostDTO.setAmount(chuanyunReimbursementAmountDO.getTotalAmount());
-                }
-                List<String> matchers = new ArrayList<>();
-                matchers.add("F0000001_2,"+chuanyunProjectCostDO.getProjectId());
-                matchers.add("F0000006_2,"+chuanyunProjectCostDO.getStatus());
-                var filter= Filter.instance(0,1,true,"And",matchers);
-                var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunProjectTotalCostDO.SCHEMA_CODE,filter);
-                var projectTotalString=objectMapper.writeValueAsString(chuanyunProjectTotalCostDTO);
-                ChuanyunSaveDTO chuanyunSaveDTO;
-                if (chuanyunFindAllResponse.getReturnData()!=null) {
-                    List<ChuanyunProjectTotalCostDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
-                    ChuanyunProjectTotalCostDO firstResult = result.get(0);
-                    chuanyunSaveDTO = chuanYunManager.update(ChuanyunProjectTotalCostDO.SCHEMA_CODE,firstResult.getObjectId(),projectTotalString);
-                }else {
-                    chuanyunSaveDTO = chuanYunManager.save(ChuanyunProjectTotalCostDO.SCHEMA_CODE,projectTotalString,true);
+        }
+    }
 
-                }
-                if(chuanyunSaveDTO.getSuccessful()){
-//                    log.info("新增项目成本汇总成功");
-                }else{
-                    log.warn("新增项目成本汇总失败");
-                }
-            } catch (JsonProcessingException | BigSizeException e) {
-                log.error(e.getMessage());
-                log.error(""+chuanyunProjectCostDO);
-                e.printStackTrace();
+    /**
+     * 员工每月、各个项目标准工时会职工
+     * @param chuanyunUserCompanyDO 员工信息
+     */
+    private void standardMonthlyHour(ChuanyunUserCompanyDO chuanyunUserCompanyDO) {
+        //每月每项目工时,按月-项目-用户分组统计标准工时
+        List<ChuanyunSelfWorkHourDO> list = chuanyunSelfWorkHourDao.getMonthProjectHour(chuanyunUserCompanyDO.getUserId());
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        //删除审核中数据
+        chuanyunSelfCostDao.deleteAllByStatus("2");
+        list.forEach(projectMonth->{
+            //获取人员-月度-相同工时状态标准工时汇总
+            ChuanyunSelfWorkHourDO monthHour = chuanyunSelfWorkHourDao.getMonthHour(projectMonth.getUserId(),df.format(projectMonth.getDayLogDate()),projectMonth.getStatus());
+
+            ChuanyunSelfCostDO chuanyunSelfCostDO = new ChuanyunSelfCostDO();
+            chuanyunSelfCostDO.setStatus(projectMonth.getStatus());
+            chuanyunSelfCostDO.setMonthlyTotalHour(monthHour.getStandardWorkHour());
+            chuanyunSelfCostDO.setProjectId(projectMonth.getProjectId());
+            chuanyunSelfCostDO.setProjectType(projectMonth.getProjectType());
+            chuanyunSelfCostDO.setUserId(projectMonth.getUserId());
+            chuanyunSelfCostDO.setDayLogDate(projectMonth.getDayLogDate().withDayOfMonth(1));
+            chuanyunSelfCostDO.setTotalHour(projectMonth.getStandardWorkHour());
+            chuanyunSelfCostDO.setDepartmentId(chuanyunUserCompanyDO.getDepartmentId());
+            ChuanyunSelfCostDO oldSelfDO = chuanyunSelfCostDao.getOldSelfDO(chuanyunSelfCostDO.getUserId(),chuanyunSelfCostDO.getProjectId(),df.format(chuanyunSelfCostDO.getDayLogDate()));
+            if (oldSelfDO !=null) {
+                chuanyunSelfCostDao.delete(oldSelfDO);
             }
+            chuanyunSelfCostDao.save(chuanyunSelfCostDO);
         });
     }
 
     /**
      * 人员项目工时汇总
      */
-    private void monthhour() {
+    @Scheduled(fixedDelay = 3600000L)
+    private void projectTotalHour() {
         List<ChuanyunMemberCostDO> list = chuanyunMemberCostDao.getMemberCost();
+        deleteExamineStatus(ChuanyunProjectMemberCostDO.SCHEMA_CODE,"F0000007");
+        chuanyunMemberCostDao.deleteAllByStatus("2");
         list.forEach(chuanyunMemberCostDO -> {
             if(StringUtils.isEmpty(chuanyunMemberCostDO.getProjectId())||StringUtils.isEmpty(chuanyunMemberCostDO.getUserId())){
                 log.info("########"+chuanyunMemberCostDO+"");
             }else{
-
                 BigDecimal standard = new BigDecimal(8);
                 ChuanyunMemberCostDO memberCostDO = new ChuanyunMemberCostDO();
                 memberCostDO.setCost(chuanyunMemberCostDO.getCost());
@@ -478,9 +549,7 @@ public class ChuanyunProjectScheduledTask {
                     }else {
                         chuanyunSaveDTO = chuanYunManager.save(ChuanyunProjectMemberCostDO.SCHEMA_CODE, projectMemberString,true);
                     }
-                    if(chuanyunSaveDTO.getSuccessful()){
-//                        log.info("新增项目成员成本汇总成功");
-                    }else{
+                    if(!chuanyunSaveDTO.getSuccessful()){
                         log.warn("新增项目成员成本汇总失败");
                     }
                 } catch (JsonProcessingException | BigSizeException e) {
@@ -488,167 +557,217 @@ public class ChuanyunProjectScheduledTask {
                     log.warn("########"+chuanyunMemberCostDO+"");
                 }
             }
-
         });
     }
 
     /**
-     * 员工单日、各个项目工时标准化,并保存
-     * @param chuanyunUserCompanyDO 员工信息
+     * 定时更新氚云数据
      */
-    private void standardHour(ChuanyunUserCompanyDO chuanyunUserCompanyDO) {
-        BigDecimal standard = new BigDecimal(8);
-        //每人每个项目每天工时
-        List<ChuanyunWorkHourDO> selfList = chuanyunWorkHourDao.getSelfWorkHour(chuanyunUserCompanyDO.getUserId());
-        selfList.forEach(self->{
-            try{
-                ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO = new ChuanyunSelfWorkHourDO();
-                chuanyunSelfWorkHourDO.setStatus(self.getStatus());
-                chuanyunSelfWorkHourDO.setUserId(chuanyunUserCompanyDO.getUserId());
-                chuanyunSelfWorkHourDO.setProjectType(self.getProjectType());
-                if(ChuanYunConstant.PRODUCTION_PROJECT.equals(self.getProjectType())){
-                    chuanyunSelfWorkHourDO.setProjectId(ChuanYunConstant.PRODUCTION_PROJECT_ID);
-                }else{
-                    chuanyunSelfWorkHourDO.setProjectId(self.getProjectId());
-                }
-                chuanyunSelfWorkHourDO.setDayLogDate(self.getDayLogDate());
-                //每人每天工时
-                ChuanyunWorkHourDO chuanyunWorkHourDO = chuanyunWorkHourDao.getDayWorkHour(chuanyunUserCompanyDO.getUserId(),self.getDayLogDate());
-                //工时标准化
-                if (chuanyunWorkHourDO != null) {
-                    if (chuanyunWorkHourDO.getHoursWorked().compareTo(standard)<0) {
-                        chuanyunSelfWorkHourDO.setStandardWorkHour(self.getHoursWorked());
-                    }else {
-                        BigDecimal personDays = (self.getHoursWorked().divide(chuanyunWorkHourDO.getHoursWorked(), 2, RoundingMode.HALF_UP)).multiply(standard);
-                        chuanyunSelfWorkHourDO.setStandardWorkHour(personDays);
-                    }
-                    ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO1 = chuanyunSelfWorkHourDao.findByUserIdAndAndProjectIdAndAndDayLogDate(chuanyunUserCompanyDO.getUserId(),self.getProjectId(),self.getDayLogDate());
-                    if (chuanyunSelfWorkHourDO1!=null) {
-                        chuanyunSelfWorkHourDao.delete(chuanyunSelfWorkHourDO1);
+    @Scheduled(fixedDelay = 3600000L)
+    private void updateChuanyunStandardWorkHour(){
+        var flag = true;
+        var pageSize = 20;
+        var page = 0;
+        log.info("开始更新日工时汇总");
+        long startTime=Instant.now().getEpochSecond();
+        while(flag) {
+            var pageable= PageRequest.of(page,pageSize);
+            var updateList=chuanyunSelfWorkHourDao.findAll(pageable);
+            if (page<=updateList.getTotalPages()){
+                page += 1;
+                updateList.forEach(chuanyunSelfWorkHourDO -> {
+                    try{
+                        String departmentId=chuanyunUserCompanyDao.findAllByUserId(chuanyunSelfWorkHourDO.getUserId()).get(0).getDepartmentId();
+                        ChuanyunSelfWorkHourDTO chuanyunSelfWorkHourDTO = new ChuanyunSelfWorkHourDTO();
+                        BeanUtils.copyProperties(chuanyunSelfWorkHourDO,chuanyunSelfWorkHourDTO);
+                        chuanyunSelfWorkHourDTO.setDepartmentId(departmentId);
+                        List<String> matchers = new ArrayList<>();
+                        matchers.add("F0000001_2,"+chuanyunSelfWorkHourDO.getProjectId());
+                        matchers.add("F0000002_2,"+chuanyunSelfWorkHourDO.getUserId());
+                        matchers.add("F0000003_2,"+chuanyunSelfWorkHourDO.getDayLogDate());
+                        matchers.add("F0000005_2,"+chuanyunSelfWorkHourDO.getProjectType());
+//                    matchers.add("F0000006_2,"+self.getStatus());
+                        var filter= Filter.instance(0,1,true,"And",matchers);
+                        var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunMemberHourDO.SCHEMA_CODE,filter);
+                        var selfMonthString=objectMapper.writeValueAsString(chuanyunSelfWorkHourDTO);
+                        ChuanyunSaveDTO chuanyunSaveDTO;
+                        if (chuanyunFindAllResponse.getReturnData()!=null){
+                            List<ChuanyunMemberHourDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                            ChuanyunMemberHourDO firstResult = result.get(0);
+                            chuanyunSaveDTO =chuanYunManager.update(ChuanyunMemberHourDO.SCHEMA_CODE,firstResult.getObjectId(),selfMonthString);
+                        }else {
+                            chuanyunSaveDTO =chuanYunManager.save(ChuanyunMemberHourDO.SCHEMA_CODE,selfMonthString,true);
+                        }
+                        if(!chuanyunSaveDTO.getSuccessful()){
+                            log.warn("新增工时标准化失败");
+                        }
+                    }catch (Exception e){
+                        e.printStackTrace();
+                        log.warn("更新标准工时异常");
                     }
-                    chuanyunSelfWorkHourDao.save(chuanyunSelfWorkHourDO);
-//                log.info("工时标准化新增成功");
-                    //更新氚云数据
+                });
+            }else {
+                //流程执行完
+                break;
+            }
+        }
+        log.info("日工时更新花费"+(Instant.now().getEpochSecond()-startTime));
+    }
 
-                    ChuanyunSelfWorkHourDTO chuanyunSelfWorkHourDTO = new ChuanyunSelfWorkHourDTO();
-                    if(ChuanYunConstant.PRODUCTION_PROJECT.equals(self.getProjectType())){
-                        chuanyunSelfWorkHourDTO.setProjectId(ChuanYunConstant.PRODUCTION_PROJECT_ID);
-                    }else{
-                        chuanyunSelfWorkHourDTO.setProjectId(self.getProjectId());
-                    }
-                    chuanyunSelfWorkHourDTO.setUserId(chuanyunUserCompanyDO.getUserId());
-                    chuanyunSelfWorkHourDTO.setDayLogDate(self.getDayLogDate());
-                    chuanyunSelfWorkHourDTO.setProjectType(self.getProjectType());
-                    chuanyunSelfWorkHourDTO.setStatus(self.getStatus());
-                    chuanyunSelfWorkHourDTO.setDepartmentId(chuanyunUserCompanyDO.getDepartmentId());
-                    chuanyunSelfWorkHourDTO.setStandardWorkHour(chuanyunSelfWorkHourDO.getStandardWorkHour());
-                    List<String> matchers = new ArrayList<>();
-                    matchers.add("F0000001_2,"+self.getProjectId());
-                    matchers.add("F0000002_2,"+chuanyunUserCompanyDO.getUserId());
-                    matchers.add("F0000003_2,"+self.getDayLogDate());
-                    matchers.add("F0000005_2,"+self.getProjectType());
-                    matchers.add("F0000006_2,"+self.getStatus());
-                    var filter= Filter.instance(0,1,true,"And",matchers);
-                    var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunMemberHourDO.SCHEMA_CODE,filter);
-                    var selfMonthString=objectMapper.writeValueAsString(chuanyunSelfWorkHourDTO);
-                    ChuanyunSaveDTO chuanyunSaveDTO;
-                    if (chuanyunFindAllResponse.getReturnData()!=null){
-                        List<ChuanyunMemberHourDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
-                        ChuanyunMemberHourDO firstResult = result.get(0);
-                        chuanyunSaveDTO =chuanYunManager.update(ChuanyunMemberHourDO.SCHEMA_CODE,firstResult.getObjectId(),selfMonthString);
-                    }else {
-                        chuanyunSaveDTO =chuanYunManager.save(ChuanyunMemberHourDO.SCHEMA_CODE,selfMonthString,true);
-                    }
-                    if(chuanyunSaveDTO.getSuccessful()){
-//                    log.info("新增工时标准化成功");
-                    }else{
-                        log.warn("新增工时标准化失败");
+    /**
+     * 人员-项目-周度工时汇总,更新氚云数据
+     */
+    @Scheduled(fixedDelay = 3600000L)
+    private void updateChuanyunWeekHour(){
+        var flag = true;
+        var pageSize = 20;
+        var page = 0;
+        log.info("开始更新周工时汇总");
+        deleteExamineStatus(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,"F0000007");
+        long startTime=Instant.now().getEpochSecond();
+        while(flag) {
+            var pageable = PageRequest.of(page, pageSize);
+            var updateList = chuanyunWeekMemberHourDao.findAll(pageable);
+            if (page<=updateList.getTotalPages()){
+                page += 1;
+                updateList.getContent().forEach(chuanyunWeekMemberHourDO -> {
+                    //更新氚云
+                    try {
+                        String departmentId=chuanyunUserCompanyDao.findAllByUserId(chuanyunWeekMemberHourDO.getUserId()).get(0).getDepartmentId();
+                        BigDecimal standard = new BigDecimal(8);
+                        ChuanyunProjectMemberWeekHourDTO chuanyunProjectMemberWeekHourDTO = new ChuanyunProjectMemberWeekHourDTO();
+                        chuanyunProjectMemberWeekHourDTO.setProjectId(chuanyunWeekMemberHourDO.getProjectId());
+                        chuanyunProjectMemberWeekHourDTO.setUserId(chuanyunWeekMemberHourDO.getUserId());
+                        chuanyunProjectMemberWeekHourDTO.setWeek(chuanyunWeekMemberHourDO.getWeek());
+                        chuanyunProjectMemberWeekHourDTO.setProjectType(chuanyunWeekMemberHourDO.getProjectType());
+                        chuanyunProjectMemberWeekHourDTO.setTotalHour(chuanyunWeekMemberHourDO.getStandardWorkHour());
+                        chuanyunProjectMemberWeekHourDTO.setPersonDays(chuanyunWeekMemberHourDO.getStandardWorkHour().divide(standard,2,RoundingMode.HALF_UP));
+                        chuanyunProjectMemberWeekHourDTO.setHourStatus(chuanyunWeekMemberHourDO.getStatus());
+                        chuanyunProjectMemberWeekHourDTO.setYear(chuanyunProjectMemberWeekHourDTO.getYear());
+                        chuanyunProjectMemberWeekHourDTO.setDepartmentId(departmentId);
+
+                        List<String> matchers = new ArrayList<>();
+                        matchers.add("F0000001_2,"+chuanyunWeekMemberHourDO.getProjectId());
+                        matchers.add("F0000002_2,"+chuanyunWeekMemberHourDO.getUserId());
+                        matchers.add("F0000006_2,"+chuanyunWeekMemberHourDO.getWeek());
+                        matchers.add("F0000008_2,"+chuanyunWeekMemberHourDO.getYear());
+                        matchers.add("F0000003_2,"+chuanyunWeekMemberHourDO.getProjectType());
+                        matchers.add("F0000007_2,"+chuanyunWeekMemberHourDO.getStatus());
+                        var filter= Filter.instance(0,1,true,"And",matchers);
+                        var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,filter);
+                        var selfMonthString=objectMapper.writeValueAsString(chuanyunProjectMemberWeekHourDTO);
+                        ChuanyunSaveDTO chuanyunSaveDTO;
+                        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);
+                        }
+                        if(!chuanyunSaveDTO.getSuccessful()){
+                            log.warn("新增人员项目周度工时失败");
+                        }
+                    } catch (JsonProcessingException | BigSizeException e) {
+                        e.printStackTrace();
                     }
-                }
-            }catch (Exception e){
-                log.error(e.getMessage());
-                log.error(""+self);
-                e.printStackTrace();
+                });
+            }else {
+                //流程执行完
+                break;
             }
-        });
+        }
+        log.info("周工时更新花费"+(Instant.now().getEpochSecond()-startTime));
     }
 
     /**
-     * 员工每月、各个项目标准工时会职工
-     * @param chuanyunUserCompanyDO 员工信息
+     * 人员-项目-月度工时汇总,更新氚云数据
      */
-    private void standardMonthlyHour(ChuanyunUserCompanyDO chuanyunUserCompanyDO) {
-        var objectMapper=new ObjectMapper();
-        //每月每项目工时,按月-项目-用户分组统计标准工时
-        List<ChuanyunSelfWorkHourDO> list = chuanyunSelfWorkHourDao.getMonthProjectHour(chuanyunUserCompanyDO.getUserId());
-        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        list.forEach(projectMonth->{
-            //获取人员-月度-相同工时状态标准工时汇总
-            ChuanyunSelfWorkHourDO monthHour = chuanyunSelfWorkHourDao.getMonthHour(projectMonth.getUserId(),df.format(projectMonth.getDayLogDate()),projectMonth.getStatus());
+    @Scheduled(fixedDelay = 3600000L)
+    private void updateChuanyunMonthHour(){
+        var flag = true;
+        var pageSize = 20;
+        var page = 0;
+        log.info("开始更新月工时汇总");
+        //删除氚云表单审核中数据
+        deleteExamineStatus(ChuanyunMemberMonthCostDO.SCHEMA_CODE,"F0000009");
+        long startTime=Instant.now().getEpochSecond();
+        while(flag) {
+            var pageable = PageRequest.of(page, pageSize);
+            var updateList = chuanyunSelfCostDao.findAll(pageable);
+            if (page<=updateList.getTotalPages()){
+                page += 1;
+                updateList.getContent().forEach(chuanyunSelfCostDO -> {
+                    ChuanyunMemberMonthCostDTO chuanyunMemberMonthCostDTO = new ChuanyunMemberMonthCostDTO();
 
-            //获取人员月度工资信息
-            //TODO 张曦铭的薪资信息同步之后需要使用U9中的数据更新薪资信息
-            ChuanyunPayrollDO chuanyunPayrollDO = chuanyunPayrollDao.getPayroll(projectMonth.getUserId(),df.format(projectMonth.getDayLogDate()));
-            ChuanyunSelfCostDO chuanyunSelfCostDO = new ChuanyunSelfCostDO();
-            ChuanyunMemberMonthCostDTO chuanyunMemberMonthCostDTO = new ChuanyunMemberMonthCostDTO();
-            if (chuanyunPayrollDO != null) {
-                BigDecimal cost = (projectMonth.getStandardWorkHour().divide(monthHour.getStandardWorkHour(), 2, RoundingMode.HALF_UP)).multiply(chuanyunPayrollDO.getWagesPayable());
-                chuanyunSelfCostDO.setCost(cost);
-                chuanyunMemberMonthCostDTO.setCost(cost);
-            }else{
-                chuanyunSelfCostDO.setCost(BigDecimal.ZERO);
-                chuanyunMemberMonthCostDTO.setCost(BigDecimal.ZERO);
-            }
-            chuanyunSelfCostDO.setStatus(projectMonth.getStatus());
-            chuanyunSelfCostDO.setMonthlyTotalHour(monthHour.getStandardWorkHour());
-            chuanyunSelfCostDO.setProjectId(projectMonth.getProjectId());
-            chuanyunSelfCostDO.setProjectType(projectMonth.getProjectType());
-            chuanyunSelfCostDO.setUserId(projectMonth.getUserId());
-            chuanyunSelfCostDO.setDayLogDate(projectMonth.getDayLogDate().withDayOfMonth(1));
-            chuanyunSelfCostDO.setTotalHour(projectMonth.getStandardWorkHour());
-            ChuanyunSelfCostDO oldSelfDO = chuanyunSelfCostDao.getOldSelfDO(chuanyunSelfCostDO.getUserId(),chuanyunSelfCostDO.getProjectId(),df.format(chuanyunSelfCostDO.getDayLogDate()));
-            if (oldSelfDO !=null) {
-                chuanyunSelfCostDao.delete(oldSelfDO);
+                    //更新氚云数据
+                    chuanyunMemberMonthCostDTO.setCost(chuanyunSelfCostDO.getCost());
+                    chuanyunMemberMonthCostDTO.setProjectId(chuanyunSelfCostDO.getProjectId());
+                    chuanyunMemberMonthCostDTO.setProjectType(chuanyunSelfCostDO.getProjectType());
+                    chuanyunMemberMonthCostDTO.setStatus(chuanyunSelfCostDO.getStatus());
+                    chuanyunMemberMonthCostDTO.setUserId(chuanyunSelfCostDO.getUserId());
+                    chuanyunMemberMonthCostDTO.setMonthWorkHour(chuanyunSelfCostDO.getMonthlyTotalHour());
+                    chuanyunMemberMonthCostDTO.setDayLogDate(chuanyunSelfCostDO.getDayLogDate());
+                    chuanyunMemberMonthCostDTO.setWorkHour(chuanyunSelfCostDO.getTotalHour());
+                    chuanyunMemberMonthCostDTO.setDepartmentId(chuanyunSelfCostDO.getDepartmentId());
+                    try {
+                        List<String> matchers = new ArrayList<>();
+                        matchers.add("F0000003_2,"+chuanyunSelfCostDO.getProjectId());
+                        matchers.add("F0000009_2,"+chuanyunSelfCostDO.getStatus());
+                        matchers.add("F0000002_2,"+chuanyunSelfCostDO.getUserId());
+                        matchers.add("F0000004_2,"+chuanyunSelfCostDO.getDayLogDate());
+                        var filter= Filter.instance(0,1,true,"And",matchers);
+                        var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunMemberMonthCostDO.SCHEMA_CODE,filter);
+                        var memberMonthString=objectMapper.writeValueAsString(chuanyunMemberMonthCostDTO);
+                        ChuanyunSaveDTO chuanyunSaveDTO;
+                        if (chuanyunFindAllResponse.getReturnData()!=null){
+                            List<ChuanyunMemberMonthCostDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                            ChuanyunMemberMonthCostDO firstResult = result.get(0);
+                            chuanyunSaveDTO =chuanYunManager.update(ChuanyunMemberMonthCostDO.SCHEMA_CODE,firstResult.getObjectId(),memberMonthString);
+                        }else {
+                            chuanyunSaveDTO =chuanYunManager.save(ChuanyunMemberMonthCostDO.SCHEMA_CODE,memberMonthString,true);
+                        }
+                        if(!chuanyunSaveDTO.getSuccessful()){
+                            log.warn("新增项目成员月度成本汇总失败");
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        log.warn("########"+chuanyunSelfCostDO+"");
+                    }
+                });
+            }else {
+                //流程执行完
+                break;
             }
-            chuanyunSelfCostDao.save(chuanyunSelfCostDO);
-
+        }
+        log.info("月工时更新花费"+(Instant.now().getEpochSecond()-startTime));
+    }
 
-            //更新氚云数据
-            chuanyunMemberMonthCostDTO.setProjectId(projectMonth.getProjectId());
-            chuanyunMemberMonthCostDTO.setProjectType(projectMonth.getProjectType());
-            chuanyunMemberMonthCostDTO.setStatus(projectMonth.getStatus());
-            chuanyunMemberMonthCostDTO.setUserId(projectMonth.getUserId());
-            chuanyunMemberMonthCostDTO.setMonthWorkHour(monthHour.getStandardWorkHour());
-            chuanyunMemberMonthCostDTO.setDayLogDate(projectMonth.getDayLogDate().withDayOfMonth(1));
-            chuanyunMemberMonthCostDTO.setWorkHour(projectMonth.getStandardWorkHour());
-            chuanyunMemberMonthCostDTO.setDepartmentId(chuanyunUserCompanyDO.getDepartmentId());
-            try {
-                List<String> matchers = new ArrayList<>();
-                matchers.add("F0000003_2,"+projectMonth.getProjectId());
-                matchers.add("F0000009_2,"+projectMonth.getStatus());
-                matchers.add("F0000002_2,"+projectMonth.getUserId());
-                matchers.add("F0000004_2,"+projectMonth.getDayLogDate().withDayOfMonth(1));
-                var filter= Filter.instance(0,1,true,"And",matchers);
-                var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunMemberMonthCostDO.SCHEMA_CODE,filter);
-                var memberMonthString=objectMapper.writeValueAsString(chuanyunMemberMonthCostDTO);
-                ChuanyunSaveDTO chuanyunSaveDTO;
-                if (chuanyunFindAllResponse.getReturnData()!=null){
-                    List<ChuanyunMemberMonthCostDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
-                    ChuanyunMemberMonthCostDO firstResult = result.get(0);
-                    chuanyunSaveDTO =chuanYunManager.update(ChuanyunMemberMonthCostDO.SCHEMA_CODE,firstResult.getObjectId(),memberMonthString);
-                }else {
-                    chuanyunSaveDTO =chuanYunManager.save(ChuanyunMemberMonthCostDO.SCHEMA_CODE,memberMonthString,true);
-                }
-                if(chuanyunSaveDTO.getSuccessful()){
-//                    log.info("新增项目成员月度成本汇总成功");
-                }else{
-                    log.warn("新增项目成员月度成本汇总失败");
-                }
-            } catch (JsonProcessingException | BigSizeException e) {
-                e.printStackTrace();
-                log.warn("########"+projectMonth+"");
+    /**
+     * 删除状态为审核中数据
+     * @param schemaCode
+     * @param buttonCode
+     */
+    public void deleteExamineStatus(String schemaCode,String buttonCode) {
+        try {
+            List<String> matchers = new ArrayList<>();
+            matchers.add(buttonCode+"_2,"+"2");
+            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()){
+                        log.info("删除状态为审核中数据成功");
+                    }else{
+                        log.warn("删除状态为审核中数据失败");
+                    }
+                });
             }
-        });
+        }catch (Exception e) {
+            e.printStackTrace();
+            log.error(e.getMessage());
+        }
     }
 }
 
@@ -778,11 +897,20 @@ class ChuanyunProjectMemberWeekHourDTO{
     @JsonProperty("F0000005")
     private BigDecimal personDays;
 
+    @JsonProperty("F0000008")
+    private String year;
+
     @JsonProperty("F0000006")
     private String week;
 
     @JsonProperty("F0000007")
     private String hourStatus;
+
+    /**
+     * 部门信息
+     */
+    @JsonProperty("F0000009")
+    private String departmentId;
 }
 
 /**