Sfoglia il codice sorgente

完成工作组实施费用功能和若干工作组功能。

Cyangbin 2 anni fa
parent
commit
e6eecb95de
53 ha cambiato i file con 1625 aggiunte e 384 eliminazioni
  1. 23 1
      pom.xml
  2. 1 0
      src/main/java/com/galaxis/manatee/configuration/ScheduleConfig.java
  3. 19 0
      src/main/java/com/galaxis/manatee/configuration/SpringAsyncConfiguration.java
  4. 58 8
      src/main/java/com/galaxis/manatee/constant/ChuanYunConstant.java
  5. 20 4
      src/main/java/com/galaxis/manatee/controller/TestController.java
  6. 21 2
      src/main/java/com/galaxis/manatee/controller/WorkHourController.java
  7. 32 0
      src/main/java/com/galaxis/manatee/controller/WorkHourOperateController.java
  8. 23 0
      src/main/java/com/galaxis/manatee/dao/ChuanyunImplCostDao.java
  9. 15 4
      src/main/java/com/galaxis/manatee/dao/ChuanyunReimbursementDao.java
  10. 8 0
      src/main/java/com/galaxis/manatee/dao/ChuanyunSelfCostDao.java
  11. 5 2
      src/main/java/com/galaxis/manatee/dao/ChuanyunSelfWorkHourDao.java
  12. 40 40
      src/main/java/com/galaxis/manatee/dao/ChuanyunSubWorkHourDao.java
  13. 6 0
      src/main/java/com/galaxis/manatee/dao/ChuanyunUserCompanyDao.java
  14. 27 2
      src/main/java/com/galaxis/manatee/dao/ChuanyunWeekMemberHourDao.java
  15. 42 31
      src/main/java/com/galaxis/manatee/dao/ChuanyunWorkHourDao.java
  16. 22 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunBuildProject.java
  17. 3 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunDayLog.java
  18. 3 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunGroupProjectDO.java
  19. 69 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunImplCostDO.java
  20. 2 1
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunLogDO.java
  21. 60 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunProjectOrganizationStructureDO.java
  22. 8 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunReimbursementDO.java
  23. 11 5
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunSelfWorkHourDO.java
  24. 47 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunWeekLogDO.java
  25. 8 5
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunWeekMemberHourDO.java
  26. 59 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunWorkGroupDO.java
  27. 23 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunWorkGroupMemberDO.java
  28. 2 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunWorkHourDO.java
  29. 12 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/dto/ChuanyunSelfWorkHourDTO.java
  30. 11 0
      src/main/java/com/galaxis/manatee/event/ImplCostEvent.java
  31. 18 0
      src/main/java/com/galaxis/manatee/event/ImplCostListener.java
  32. 11 0
      src/main/java/com/galaxis/manatee/event/PushImplCostEvent.java
  33. 18 0
      src/main/java/com/galaxis/manatee/event/PushImplCostListener.java
  34. 13 0
      src/main/java/com/galaxis/manatee/mapper/WorkHourMapper.java
  35. 27 0
      src/main/java/com/galaxis/manatee/mapper/WorkHourMapper.xml
  36. 16 14
      src/main/java/com/galaxis/manatee/service/DataArcherService.java
  37. 79 25
      src/main/java/com/galaxis/manatee/service/LogCheckService.java
  38. 117 44
      src/main/java/com/galaxis/manatee/service/LogDownloadService.java
  39. 67 13
      src/main/java/com/galaxis/manatee/service/LogService.java
  40. 67 18
      src/main/java/com/galaxis/manatee/service/LogStandardService.java
  41. 46 8
      src/main/java/com/galaxis/manatee/service/LogUpdateService.java
  42. 271 0
      src/main/java/com/galaxis/manatee/service/WorkGroupService.java
  43. 4 2
      src/main/java/com/galaxis/manatee/service/impl/ChuanyunServiceImpl.java
  44. 12 91
      src/main/java/com/galaxis/manatee/task/ChuanyunBasicDataScheduledTask.java
  45. 43 33
      src/main/java/com/galaxis/manatee/task/ChuanyunFinancialScheduledTask.java
  46. 1 1
      src/main/java/com/galaxis/manatee/task/ChuanyunHumanResourceScheduledTask.java
  47. 11 19
      src/main/java/com/galaxis/manatee/task/LogCheckTask.java
  48. 72 0
      src/main/java/com/galaxis/manatee/task/ProjectOrganizationStructureTask.java
  49. 9 3
      src/main/java/com/galaxis/manatee/task/SubWorkHourStatistics.java
  50. 1 1
      src/main/java/com/galaxis/manatee/task/U9InfoTask.java
  51. 21 5
      src/main/java/com/galaxis/manatee/task/WorkHourStatistics.java
  52. 19 0
      src/main/java/com/galaxis/manatee/util/StringUtil.java
  53. 2 2
      src/main/resources/application.yml

+ 23 - 1
pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>2.6.7</version>
+        <version>2.6.3</version>
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
     <groupId>com.galaxis</groupId>
@@ -35,6 +35,13 @@
         </dependency>
 
         <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.2.2</version>
+        </dependency>
+
+
+        <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi</artifactId>
             <version>3.13</version>
@@ -141,6 +148,21 @@
     </dependencyManagement>
 
     <build>
+        <resources>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.xml</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/source</directory>
+                <includes>
+                    <include>**/*.*</include>
+                </includes>
+            </resource>
+        </resources>
+
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>

+ 1 - 0
src/main/java/com/galaxis/manatee/configuration/ScheduleConfig.java

@@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
 import org.springframework.scheduling.config.ScheduledTaskRegistrar;
 
 import java.util.concurrent.ScheduledThreadPoolExecutor;

+ 19 - 0
src/main/java/com/galaxis/manatee/configuration/SpringAsyncConfiguration.java

@@ -1,7 +1,12 @@
 package com.galaxis.manatee.configuration;
 
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
 
 /**
  * @author zcj
@@ -42,4 +47,18 @@ public class SpringAsyncConfiguration {
 //        executor.initialize();
 //        return executor;
 //    }
+
+    @Bean("threadPoolTaskExecutor")
+    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        executor.setCorePoolSize(8);
+        executor.setQueueCapacity(1024);
+        executor.setMaxPoolSize(64);
+        executor.setKeepAliveSeconds(600);
+        executor.setThreadNamePrefix("async-task-");
+        executor.setWaitForTasksToCompleteOnShutdown(true);
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
+        executor.initialize();
+        return executor;
+    }
 }

+ 58 - 8
src/main/java/com/galaxis/manatee/constant/ChuanYunConstant.java

@@ -3,7 +3,9 @@ package com.galaxis.manatee.constant;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -17,42 +19,52 @@ public class ChuanYunConstant {
     /**
      * 审核结束
      */
-    public static final String FINISH="1";
+    public static final String FINISH = "1";
 
     /**
      * 审核流程中
      */
-    public static final String IN_PROCESS="2";
+    public static final String IN_PROCESS = "2";
 
     /**
      * 生产项目项目类型
      */
-    public static final String PRODUCTION_PROJECT="生产项目";
+    public static final String PRODUCTION_PROJECT = "生产项目";
+
+    /**
+     * 生产项目项目类型
+     */
+    public static final String SALES_PROJECT = "销售项目";
+
+    /**
+     * 生产项目项目类型
+     */
+    public static final String SALES_PROJECT_ID = "sales_project";
 
     /**
      * 生产项目类型项目号
      */
-    public static final String PRODUCTION_PROJECT_ID="production_project";
+    public static final String PRODUCTION_PROJECT_ID = "production_project";
 
     /**
      * 保存项目号、项目ObjectId的映射关系
      */
-    public static Map<String,String> PROJECT_CODE=new HashMap<>(2048);
+    public static Map<String, String> PROJECT_CODE = new HashMap<>(2048);
 
     /**
      * 保存用户ID和工号的映射关系
      */
-    public static Map<String,String> USER_EMPLOYEE_NUMBER=new HashMap<>(2048);
+    public static Map<String, String> USER_EMPLOYEE_NUMBER = new HashMap<>(2048);
 
     /**
      * 保存用户id和所属部门id
      */
-    public static Map<String,Object> USER_DEPARTMENT=new HashMap<>();
+    public static Map<String, Object> USER_DEPARTMENT = new HashMap<>();
 
     /**
      * 用户ID和BG关系
      */
-    public static Map<String,String> USER_BUSINESS_GROUP=new HashMap<>();
+    public static Map<String, String> USER_BUSINESS_GROUP = new HashMap<>();
 
     /**
      * 调用地址
@@ -83,4 +95,42 @@ public class ChuanYunConstant {
     public void setChuanYunInvokeUrl(String chuanYunInvokeUrl) {
         CHUAN_YUN_INVOKE_URL = chuanYunInvokeUrl;
     }
+
+
+    /**
+     * 实施项目
+     */
+    public static final String IMPLEMENTATION_PROJECT = "实施";
+
+    /**
+     * 维保项目
+     */
+    public static final String MAINTENANCE_PROJECT = "维保";
+
+    /**
+     * 研发二开项目
+     */
+    public static final String R_D_TWO_PROJECT = "研发二开";
+
+    /**
+     * 售后项目
+     */
+    public static final String AFTER_SALE_PROJECT = "售后";
+
+    /**
+     * 周填写方式
+     */
+    public static final String LOG_FILL_IN_WEEK = "每周填写";
+
+    /**
+     * 每周工时
+     */
+    public static final String LOG_WEEKLY_HOURS = "每周工时";
+
+    public static final List<String> NEED_WORK_GROUP_PROJECT_TYPE = Arrays.asList(IMPLEMENTATION_PROJECT, MAINTENANCE_PROJECT, R_D_TWO_PROJECT, AFTER_SALE_PROJECT);
+    ;
+
+    public static final List<String> LOG_WEEK_TYPE = Arrays.asList(LOG_FILL_IN_WEEK, LOG_WEEKLY_HOURS);
+
+
 }

+ 20 - 4
src/main/java/com/galaxis/manatee/controller/TestController.java

@@ -24,6 +24,8 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -42,6 +44,9 @@ import java.util.stream.Collectors;
 @RestController
 public class TestController {
 
+    @Autowired
+    private ChuanyunUserCompanyDao chuanyunUserCompanyDao;
+
     private final LogUpdateService logUpdateService;
     private final LogStandardService logStandardService;
     private final LogCheckService logCheckService;
@@ -192,10 +197,11 @@ public class TestController {
      */
     @GetMapping("/test/api/checkWorkHour")
     public void checkWorkHour() {
-//        List<String> allUserIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
-//        logCheckService.checkHalfYearDayWorkHour(allUserIdList);
-//        logCheckService.checkHalfYearWeekWorkHour(allUserIdList);
-//        logCheckService.checkHalfYearMonthWorkHour(allUserIdList);
+        List<String> allUserIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        List<String> disUserIdList = allUserIdList.stream().distinct().collect(Collectors.toList());
+        logCheckService.checkDayWorkHourTimeAfter(disUserIdList, 90);
+        logCheckService.checkWeekWorkHour(disUserIdList);
+        logCheckService.checkMonthWorkHour(disUserIdList);
 
     }
 
@@ -243,6 +249,16 @@ public class TestController {
 
     }
 
+    /**
+     * 上传请假信息
+     */
+    @GetMapping("/test/pushAskForLeave")
+    public void pushAskForLeave() {
+
+        chuanyunBasicDataScheduledTask.pushAskForLeave();
+
+    }
+
 
 }
 

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

@@ -79,6 +79,7 @@ public class WorkHourController {
      */
     @GetMapping("/test/workHour/standardHalfYearDayWorkHourApi")
     public void standardHalfYearDayWorkHourApi() {
+        log.info("手动标准化每日工时信息");
         logStandardService.standardHalfYearWorkHour();
     }
 
@@ -99,12 +100,30 @@ public class WorkHourController {
     }
 
     /**
+     * 标准化一年内周工时和月工时
+     */
+    @GetMapping("/test/workHour/standardWeekAndMonth")
+    public void standardWeekAndMonth() {
+        workHourStatistics.standardWeekAndMonthWorkHour();
+    }
+
+    /**
+     * 上传一年内周工时和月工时工时至氚云数据库
+     */
+    @GetMapping("/test/workHour/pushWeekAndMonth")
+    public void pushWeekAndMonth() {
+        workHourStatistics.pushWorkHour();
+    }
+
+
+    /**
      * 检验一个季度的工时日志
      */
     @GetMapping("/test/workHour/checkQuarterDayWorkHour")
     public void checkQuarterDayWorkHour() {
         List<String> userIdList = userCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
-        logCheckService.checkDayWorkHourTimeAfter(userIdList, 90);
+        List<String> disUserIdList = userIdList.stream().distinct().collect(Collectors.toList());
+        logCheckService.checkDayWorkHourTimeAfter(disUserIdList, 90);
     }
 
     /**
@@ -115,7 +134,7 @@ public class WorkHourController {
      * @param maxDay 当月最后一天
      */
     @GetMapping("/test/api/checkAllMemberHour")
-    public void checkMemberHour(Integer year, Integer month, Integer maxDay) {
+    public void checkMemberHour(@RequestParam("year") Integer year, @RequestParam("month") Integer month, @RequestParam("maxDay") Integer maxDay) {
         logCheckService.checkChuanYunAll(year, month, maxDay);
     }
 }

+ 32 - 0
src/main/java/com/galaxis/manatee/controller/WorkHourOperateController.java

@@ -0,0 +1,32 @@
+package com.galaxis.manatee.controller;
+
+import com.galaxis.manatee.service.LogDownloadService;
+import com.galaxis.manatee.service.LogStandardService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 工时相关操作
+ */
+@RestController
+public class WorkHourOperateController {
+
+    @Autowired
+    private LogDownloadService logDownloadService;
+    @Autowired
+    private LogStandardService logStandardService;
+
+    /**
+     * 下载工时日志
+     *
+     * @param
+     */
+    @GetMapping("/test/operate/pullLog")
+    public void pullChuanyunLog() {
+        // 保存4月份工时至数据库
+        logDownloadService.saveDayLog();
+    }
+
+
+}

+ 23 - 0
src/main/java/com/galaxis/manatee/dao/ChuanyunImplCostDao.java

@@ -0,0 +1,23 @@
+package com.galaxis.manatee.dao;
+
+
+import com.galaxis.manatee.capsule.util.GalaxisRepository;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunImplCostDO;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunWorkHourDO;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author kxuan
+ */
+@Repository
+public interface ChuanyunImplCostDao extends GalaxisRepository<ChuanyunImplCostDO, String> {
+
+    ChuanyunImplCostDO findByProjectIdAndProjectCodeAndWorkGroup(String projectId, String projectCode, String workGroup);
+
+
+}

+ 15 - 4
src/main/java/com/galaxis/manatee/dao/ChuanyunReimbursementDao.java

@@ -14,17 +14,28 @@ import java.util.List;
  * @version 0.1
  */
 @Repository
-public interface ChuanyunReimbursementDao extends GalaxisRepository<ChuanyunReimbursementDO,String> {
+public interface ChuanyunReimbursementDao extends GalaxisRepository<ChuanyunReimbursementDO, String> {
 
     /**
      * 获取没有下发过的报销数据
-     * @param erpFlag   下发flag
-     * @param pageable  分页
-     * @return  列表
+     *
+     * @param erpFlag  下发flag
+     * @param pageable 分页
+     * @return 列表
      */
     Page<ChuanyunReimbursementDO> findAllByErpFlag(Integer erpFlag, Pageable pageable);
 
     List<ChuanyunReimbursementDO> findAllByGroupProjectId(String projectId);
 
+    /**
+     * 查询项目下用户的报销单
+     *
+     * @param projectId
+     * @param userId
+     * @param status
+     * @return
+     */
+    List<ChuanyunReimbursementDO> findAllByGroupProjectIdAndReimburseUserIdAndStatusIn(String projectId, String userId, List<Integer> status);
+
 
 }

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

@@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 @Repository
@@ -59,4 +60,11 @@ public interface ChuanyunSelfCostDao extends GalaxisRepository<ChuanyunSelfCostD
             "AND project_type=?3" +
             " AND DATE_FORMAT(chuanyun_self_cost.day_log_date,'%Y-%m')=DATE_FORMAT(?4,'%Y-%m') AND status=?5",nativeQuery = true)
     ChuanyunSelfCostDO getOldSelfDO(@Param("userId")String userId,@Param("projectId")String projectId,@Param("projectType") String projectType,@Param("dayLogDate")String dayLogDate,String status);
+
+    /**
+     * 根据用户ID获取月工时
+     * @param userId
+     * @return
+     */
+    List<ChuanyunSelfCostDO> findByUserIdAndDayLogDateGreaterThanEqual(String userId, LocalDateTime aYearAgo);
 }

+ 5 - 2
src/main/java/com/galaxis/manatee/dao/ChuanyunSelfWorkHourDao.java

@@ -185,7 +185,7 @@ public interface ChuanyunSelfWorkHourDao extends GalaxisRepository<ChuanyunSelfW
      * @param userId
      * @return
      */
-    List<ChuanyunSelfWorkHourDO> findByUserIdAndDayLogDateAfter(String userId, LocalDateTime halfYearDate);
+    List<ChuanyunSelfWorkHourDO> findByUserIdAndDayLogDateAfter(String userId, LocalDateTime afterDate);
 
 
     /**
@@ -206,7 +206,7 @@ public interface ChuanyunSelfWorkHourDao extends GalaxisRepository<ChuanyunSelfW
             "FROM chuanyun_self_work_hour " +
             "WHERE chuanyun_self_work_hour.user_id=? " +
             "and DATEDIFF(chuanyun_self_work_hour.day_log_date,NOW()) <= 0 " +
-            "and DATEDIFF(chuanyun_self_work_hour.day_log_date,NOW()) > -180 " +
+            "and DATEDIFF(chuanyun_self_work_hour.day_log_date,NOW()) >= -180 " +
             "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," +
@@ -214,4 +214,7 @@ public interface ChuanyunSelfWorkHourDao extends GalaxisRepository<ChuanyunSelfW
             "chuanyun_self_work_hour.project_type",
             nativeQuery = true)
     List<ChuanyunSelfWorkHourDO> getHalfYearMonthProjectHour(String userId);
+
+
+    List<ChuanyunSelfWorkHourDO> findByProjectId(String projectId);
 }

+ 40 - 40
src/main/java/com/galaxis/manatee/dao/ChuanyunSubWorkHourDao.java

@@ -17,49 +17,49 @@ public interface ChuanyunSubWorkHourDao extends GalaxisRepository<ChuanyunSubWor
      * @param userId
      * @return
      */
-    @Query(value="SELECT\n" +
-            "\tchuanyun_day_log.object_id,\n" +
-            "\tSUM(\n" +
-            "\t\tchuanyun_day_log.hours_worked\n" +
-            "\t) AS hours_worked,\n" +
-            "\tchuanyun_day_log.sub_porject_id AS project_id,\n" +
-            "\tchuanyun_day_log.project_type,\n" +
-            "\tchuanyun_log.user_id,\n" +
-            "\tchuanyun_log.department_name,\n" +
-            "\tchuanyun_day_log.sub_project_bg AS bg,\n" +
-            "\tchuanyun_log. STATUS,\n" +
-            "\tchuanyun_day_log.day_log_date\n" +
-            "FROM\n" +
-            "\tchuanyun_day_log\n" +
-            "LEFT JOIN chuanyun_log ON chuanyun_day_log.parent_object_id = chuanyun_log.object_id\n" +
-            "WHERE\n" +
-            "\tchuanyun_log.user_id = ?\n" +
-            "AND chuanyun_day_log.sub_porject_id != '' && chuanyun_day_log.sub_porject_id IS NOT NULL\n" +
-            "AND chuanyun_day_log.sub_project_bg != '' && chuanyun_day_log.sub_project_bg IS NOT NULL\n" +
-            "GROUP BY\n" +
-            "\tchuanyun_day_log.sub_porject_id,\n" +
-            "\tchuanyun_log.user_id,\n" +
-            "\tchuanyun_day_log.project_type,\n" +
-            "\tchuanyun_log. STATUS,\n" +
-            "\tchuanyun_day_log.day_log_date",nativeQuery = true)
+    @Query(value="SELECT " +
+            "chuanyun_day_log.object_id, " +
+            "SUM(chuanyun_day_log.hours_worked ) AS hours_worked, " +
+            "chuanyun_day_log.sub_porject_id AS project_id, " +
+            "chuanyun_day_log.project_type, " +
+            "chuanyun_log.user_id, " +
+            "chuanyun_log.department_name, " +
+            "chuanyun_day_log.sub_project_bg AS bg, " +
+            "chuanyun_log. STATUS, " +
+            "chuanyun_day_log.day_log_date " +
+            "FROM " +
+            "chuanyun_day_log " +
+            "LEFT JOIN chuanyun_log ON chuanyun_day_log.parent_object_id = chuanyun_log.object_id " +
+            "WHERE " +
+            "chuanyun_log.user_id = ? " +
+            "AND chuanyun_day_log.sub_porject_id != '' && chuanyun_day_log.sub_porject_id IS NOT NULL " +
+            "AND chuanyun_day_log.sub_project_bg != '' && chuanyun_day_log.sub_project_bg IS NOT NULL " +
+            "AND DATEDIFF(chuanyun_day_log.day_log_date,NOW()) <= 0 " +
+            "AND DATEDIFF(chuanyun_day_log.day_log_date,NOW()) > -180 " +
+            "GROUP BY " +
+            "chuanyun_day_log.sub_porject_id, " +
+            "chuanyun_log.user_id, " +
+            "chuanyun_day_log.project_type, " +
+            "chuanyun_log. STATUS, " +
+            "chuanyun_day_log.day_log_date",nativeQuery = true)
     List<ChuanyunSubWorkHourDO> getSubSelfWorkHour(@Param("userId") String userId);
 
 
-    @Query(value="SELECT chuanyun_day_log.object_id,\n" +
-            "            SUM(chuanyun_day_log.hours_worked) AS hours_worked,\n" +
-            "            chuanyun_day_log.sub_porject_id AS project_id,\n" +
-            "            chuanyun_day_log.project_type,\n" +
-            "            chuanyun_log.user_id,\n" +
-            "            chuanyun_day_log.sub_project_bg AS bg,\n" +
-            "            chuanyun_log.department_name,\n" +
-            "            chuanyun_log.status,\n" +
-            "            chuanyun_day_log.day_log_date \n" +
-            "            FROM chuanyun_day_log \n" +
-            "            LEFT JOIN chuanyun_log ON chuanyun_day_log.parent_object_id = chuanyun_log.object_id \n" +
-            "            WHERE chuanyun_log.user_id = ?\n" +
-            "            AND chuanyun_day_log.day_log_date =?\n" +
-            "            AND status!=3 \n" +
-            "            GROUP BY chuanyun_log.user_id,\n" +
+    @Query(value="SELECT chuanyun_day_log.object_id, " +
+            "            SUM(chuanyun_day_log.hours_worked) AS hours_worked, " +
+            "            chuanyun_day_log.sub_porject_id AS project_id, " +
+            "            chuanyun_day_log.project_type, " +
+            "            chuanyun_log.user_id, " +
+            "            chuanyun_day_log.sub_project_bg AS bg, " +
+            "            chuanyun_log.department_name, " +
+            "            chuanyun_log.status, " +
+            "            chuanyun_day_log.day_log_date  " +
+            "            FROM chuanyun_day_log  " +
+            "            LEFT JOIN chuanyun_log ON chuanyun_day_log.parent_object_id = chuanyun_log.object_id  " +
+            "            WHERE chuanyun_log.user_id = ? " +
+            "            AND chuanyun_day_log.day_log_date =? " +
+            "            AND status!=3  " +
+            "            GROUP BY chuanyun_log.user_id, " +
             "            chuanyun_day_log.day_log_date",nativeQuery = true)
     ChuanyunSubWorkHourDO getSubDayWorkHour(String userId, LocalDateTime day);
 }

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

@@ -21,6 +21,12 @@ public interface ChuanyunUserCompanyDao extends GalaxisRepository<ChuanyunUserCo
      * @return  返回值
      */
     List<ChuanyunUserCompanyDO> findAllByUserId(String userId);
+    /**
+     * 根据用户Id获取人员公司对象
+     * @param userId    人员Id
+     * @return  返回值
+     */
+    List<ChuanyunUserCompanyDO> findAllByUserIdOrderByModifiedTimeDesc(String userId);
 
     ChuanyunUserCompanyDO findByUserId(String userId);
 

+ 27 - 2
src/main/java/com/galaxis/manatee/dao/ChuanyunWeekMemberHourDao.java

@@ -88,6 +88,31 @@ public interface ChuanyunWeekMemberHourDao extends GalaxisRepository<ChuanyunWee
     List<ChuanyunWeekMemberHourDO> getWeekMemberHourByUserId(@Param("userId") String userId);
 
     /**
+     * 根据用户Id获取周工时列表
+     *
+     * @param userId 用户ID
+     * @return 周工时列表
+     */
+    @Query(value = "SELECT chuanyun_self_work_hour.object_id, " +
+            "LEFT(YEARWEEK(chuanyun_self_work_hour.day_log_date,1),4)as year, " +
+            "RIGHT(YEARWEEK(chuanyun_self_work_hour.day_log_date,1),2) AS week, " +
+            "project_id,user_id, " +
+            "SUM(standard_work_hour)AS standard_work_hour, " +
+            "project_type, " +
+            "`status` " +
+            "FROM manatee.chuanyun_self_work_hour  " +
+            "WHERE project_id !='' and user_id=?1 " +
+            "AND DATEDIFF(chuanyun_self_work_hour.day_log_date,NOW()) <= 0 " +
+            "AND DATEDIFF(chuanyun_self_work_hour.day_log_date,NOW()) > -365 " +
+            "GROUP BY chuanyun_self_work_hour.project_id, " +
+            "chuanyun_self_work_hour.project_type, " +
+            "chuanyun_self_work_hour.user_id, " +
+            "LEFT(YEARWEEK(chuanyun_self_work_hour.day_log_date,1),4), " +
+            "RIGHT(YEARWEEK(chuanyun_self_work_hour.day_log_date,1),2), " +
+            "chuanyun_self_work_hour.`status`", nativeQuery = true)
+    List<ChuanyunWeekMemberHourDO> getOneYearAgoWeekMemberHourByUserId(@Param("userId") String userId);
+
+    /**
      * 获取最近一个月周工时
      *
      * @param pageRequest 分页查询条件
@@ -170,7 +195,7 @@ public interface ChuanyunWeekMemberHourDao extends GalaxisRepository<ChuanyunWee
             "FROM chuanyun_self_work_hour  " +
             "WHERE project_id !='' and user_id=?1 " +
             "and DATEDIFF(chuanyun_self_work_hour.day_log_date,NOW()) <= 0 " +
-            "and DATEDIFF(chuanyun_self_work_hour.day_log_date,NOW()) > -180 " +
+            "and DATEDIFF(chuanyun_self_work_hour.day_log_date,NOW()) >= -180 " +
             "GROUP BY chuanyun_self_work_hour.project_id, " +
             "chuanyun_self_work_hour.project_type, " +
             "chuanyun_self_work_hour.user_id, " +
@@ -185,6 +210,6 @@ public interface ChuanyunWeekMemberHourDao extends GalaxisRepository<ChuanyunWee
      * @param userId
      * @return
      */
-    List<ChuanyunWeekMemberHourDO> findByUserIdAndYearAfterAndWeekAfter(String userId, int year, int week);
+    List<ChuanyunWeekMemberHourDO> findByUserIdAndYearGreaterThanEqual(String userId, String year);
 
 }

+ 42 - 31
src/main/java/com/galaxis/manatee/dao/ChuanyunWorkHourDao.java

@@ -14,14 +14,15 @@ import java.util.List;
  * @author kxuan
  */
 @Repository
-public interface ChuanyunWorkHourDao extends GalaxisRepository<ChuanyunWorkHourDO,String> {
+public interface ChuanyunWorkHourDao extends GalaxisRepository<ChuanyunWorkHourDO, String> {
 
     /**
      * 根据用户Id获取用户日志明细,并按日期拍
-     * @param userId    用户Id
-     * @return  日志数据
+     *
+     * @param userId 用户Id
+     * @return 日志数据
      */
-    @Query(value="SELECT chuanyun_day_log.object_id," +
+    @Query(value = "SELECT chuanyun_day_log.object_id," +
             "SUM(chuanyun_day_log.hours_worked) AS hours_worked," +
             "chuanyun_day_log.project_id," +
             "chuanyun_day_log.project_type," +
@@ -29,9 +30,10 @@ public interface ChuanyunWorkHourDao extends GalaxisRepository<ChuanyunWorkHourD
             "chuanyun_log.department_name," +
             "chuanyun_log.status," +
             "chuanyun_log.bg_name," +
-            "chuanyun_day_log.day_log_date " +
-            "FROM chuanyun_day_log "+
-            "LEFT JOIN chuanyun_log ON chuanyun_day_log.parent_object_id = chuanyun_log.object_id " +
+            "chuanyun_day_log.day_log_date," +
+            "chuanyun_day_log.work_group_id  " +
+            "FROM manatee.chuanyun_day_log " +
+            "LEFT JOIN manatee.chuanyun_log ON chuanyun_day_log.parent_object_id = chuanyun_log.object_id " +
             " WHERE chuanyun_log.user_id = ? " +
             " GROUP BY chuanyun_day_log.project_id," +
             "chuanyun_log.user_id," +
@@ -44,9 +46,10 @@ public interface ChuanyunWorkHourDao extends GalaxisRepository<ChuanyunWorkHourD
 
     /**
      * 获取离职人员每天每个项目工时
+     *
      * @return
      */
-    @Query(value="SELECT\n" +
+    @Query(value = "SELECT\n" +
             "\tchuanyun_day_log.project_id,\n" +
             "  chuanyun_day_log.project_type,\n" +
             "chuanyun_log.department_name," +
@@ -55,21 +58,23 @@ public interface ChuanyunWorkHourDao extends GalaxisRepository<ChuanyunWorkHourD
             "  chuanyun_day_log.hours_worked,\n" +
             "  chuanyun_log.`status`,\n" +
             "chuanyun_log.bg_name," +
-            "  chuanyun_day_log.object_id\n" +
+            "chuanyun_day_log.object_id," +
+            "chuanyun_day_log.work_group_id \n" +
             "FROM\n" +
             "\tchuanyun_log\n" +
             "LEFT JOIN chuanyun_day_log ON chuanyun_log.object_id = chuanyun_day_log.parent_object_id\n" +
             "WHERE\n" +
             "\tLENGTH(chuanyun_log.user_id) != CHAR_LENGTH(chuanyun_log.user_id)\n" +
-            "  AND project_id!=''",nativeQuery = true)
+            "  AND project_id!=''", nativeQuery = true)
     List<ChuanyunWorkHourDO> getQuitSelfWorkHour();
 
     /**
      * 根据用户Id获取用户最近一个月日志明细,并按日期拍
+     *
      * @param userId
      * @return
      */
-    @Query(value="SELECT chuanyun_day_log.object_id," +
+    @Query(value = "SELECT chuanyun_day_log.object_id," +
             "SUM(chuanyun_day_log.hours_worked) AS hours_worked," +
             "chuanyun_day_log.project_id," +
             "chuanyun_day_log.project_type," +
@@ -77,8 +82,9 @@ public interface ChuanyunWorkHourDao extends GalaxisRepository<ChuanyunWorkHourD
             "chuanyun_log.department_name," +
             "chuanyun_log.status," +
             "chuanyun_log.bg_name," +
-            "chuanyun_day_log.day_log_date " +
-            "FROM chuanyun_day_log "+
+            "chuanyun_day_log.day_log_date," +
+            "chuanyun_day_log.work_group_id " +
+            "FROM chuanyun_day_log " +
             "LEFT JOIN chuanyun_log ON chuanyun_day_log.parent_object_id = chuanyun_log.object_id " +
             " WHERE chuanyun_log.user_id = ? " +
             "AND DATE_SUB(CURDATE(), INTERVAL 1 MONTH) <= date(chuanyun_day_log.day_log_date)" +
@@ -92,11 +98,12 @@ public interface ChuanyunWorkHourDao extends GalaxisRepository<ChuanyunWorkHourD
 
     /**
      * 根据用户ID和日期筛选工时数据
-     * @param userId    用户Id
-     * @param day   日期
-     * @return  人员工时数据
+     *
+     * @param userId 用户Id
+     * @param day    日期
+     * @return 人员工时数据
      */
-    @Query(value="SELECT chuanyun_day_log.object_id," +
+    @Query(value = "SELECT chuanyun_day_log.object_id," +
             "SUM(chuanyun_day_log.hours_worked) AS hours_worked," +
             "chuanyun_day_log.project_id," +
             "chuanyun_day_log.project_type," +
@@ -104,24 +111,26 @@ public interface ChuanyunWorkHourDao extends GalaxisRepository<ChuanyunWorkHourD
             "chuanyun_log.department_name," +
             "chuanyun_log.status," +
             "chuanyun_log.bg_name," +
-            "chuanyun_day_log.day_log_date " +
-            "FROM chuanyun_day_log "+
+            "chuanyun_day_log.day_log_date," +
+            "chuanyun_day_log.work_group_id " +
+            "FROM chuanyun_day_log " +
             "LEFT JOIN chuanyun_log ON chuanyun_day_log.parent_object_id = chuanyun_log.object_id " +
-            "WHERE chuanyun_log.user_id = ? " +
-            "AND chuanyun_day_log.day_log_date =? " +
+            "WHERE chuanyun_log.user_id = ?1 " +
+            "AND chuanyun_day_log.day_log_date =?2 " +
             "AND status!=3 " +
-            "GROUP BY chuanyun_log.user_id," +
-            "chuanyun_day_log.day_log_date",
+            "GROUP BY chuanyun_log.user_id, " +
+            "chuanyun_day_log.day_log_date ",
             nativeQuery = true)
-    ChuanyunWorkHourDO getDayWorkHour(String userId,LocalDateTime day);
+    ChuanyunWorkHourDO getDayWorkHour(@Param("userId") String userId, @Param("dayLogDate") LocalDateTime dayLogDate);
 
     /**
      * 离职人员每天工时
+     *
      * @param userId
      * @param dayLogDate
      * @return
      */
-    @Query(value="SELECT\n" +
+    @Query(value = "SELECT\n" +
             "\tchuanyun_day_log.project_id,\n" +
             "\tchuanyun_day_log.project_type,\n" +
             "\tchuanyun_log.user_id,\n" +
@@ -132,7 +141,8 @@ public interface ChuanyunWorkHourDao extends GalaxisRepository<ChuanyunWorkHourD
             "\t) AS hours_worked,\n" +
             "\tchuanyun_log.`status`,\n" +
             "chuanyun_log.bg_name," +
-            "\tchuanyun_day_log.object_id\n" +
+            "\tchuanyun_day_log.object_id," +
+            "chuanyun_day_log.work_group_id \n" +
             "FROM\n" +
             "\tchuanyun_log\n" +
             "LEFT JOIN chuanyun_day_log ON chuanyun_log.object_id = chuanyun_day_log.parent_object_id\n" +
@@ -140,8 +150,8 @@ public interface ChuanyunWorkHourDao extends GalaxisRepository<ChuanyunWorkHourD
             "chuanyun_log.user_id = ?1 AND chuanyun_day_log.day_log_date=?2 \n" +
             "GROUP BY\n" +
             "\tchuanyun_log.user_id,\n" +
-            "\tchuanyun_day_log.day_log_date",nativeQuery = true)
-    ChuanyunWorkHourDO getQuitDayWorkHour(@Param("userId")String userId,@Param("dayLogDate")LocalDateTime dayLogDate);
+            "\tchuanyun_day_log.day_log_date", nativeQuery = true)
+    ChuanyunWorkHourDO getQuitDayWorkHour(@Param("userId") String userId, @Param("dayLogDate") LocalDateTime dayLogDate);
 
     /**
      * 获取半年内工时列表
@@ -157,8 +167,9 @@ public interface ChuanyunWorkHourDao extends GalaxisRepository<ChuanyunWorkHourD
             "chuanyun_log.department_name," +
             "chuanyun_log.status," +
             "chuanyun_log.bg_name," +
-            "chuanyun_day_log.day_log_date " +
-            "FROM chuanyun_day_log "+
+            "chuanyun_day_log.day_log_date," +
+            "chuanyun_day_log.work_group_id " +
+            "FROM chuanyun_day_log " +
             "LEFT JOIN chuanyun_log ON chuanyun_day_log.parent_object_id = chuanyun_log.object_id " +
             " WHERE chuanyun_log.user_id = ? " +
             "and DATEDIFF(chuanyun_day_log.day_log_date,NOW()) <= 0 " +
@@ -167,6 +178,6 @@ public interface ChuanyunWorkHourDao extends GalaxisRepository<ChuanyunWorkHourD
             "chuanyun_log.user_id," +
             "chuanyun_day_log.project_type," +
             "chuanyun_log.status," +
-            "chuanyun_day_log.day_log_date",nativeQuery = true)
+            "chuanyun_day_log.day_log_date", nativeQuery = true)
     List<ChuanyunWorkHourDO> getHalfYearSelfWorkHour(String userId);
 }

+ 22 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunBuildProject.java

@@ -0,0 +1,22 @@
+package com.galaxis.manatee.entity.chuanyun.data.object;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunBuildProject extends BasicDO {
+    /**
+     * 表名
+     */
+    public static final String SCHEMA_CODE = "D00178955900d6e8f104217b7ff8f7d36b34de1";
+
+    /**
+     * 项目编号
+     */
+    @JsonProperty(value = "F0000003")
+    private String projectCode;
+
+
+}

+ 3 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunDayLog.java

@@ -89,4 +89,7 @@ public class ChuanyunDayLog extends BasicSubDO{
      */
     @Column(length = Integer.MAX_VALUE)
     private String content;
+
+    @JsonProperty("F0000087")
+    private String workGroupId;
 }

+ 3 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunGroupProjectDO.java

@@ -150,6 +150,9 @@ public class ChuanyunGroupProjectDO extends BasicDO {
     @JsonProperty("F0000045")
     private String beneDepartmentCode;
 
+    @JsonProperty("F0000075")
+    private String projectState;
+
     /**
      * 项目组成员对象
      */

+ 69 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunImplCostDO.java

@@ -0,0 +1,69 @@
+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 org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import java.math.BigDecimal;
+
+@Slf4j
+@Data
+@Entity(name = "CHUANYUN_IMPL_COST")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunImplCostDO{
+
+    /**
+     * 表名
+     */
+    public static final String SCHEMA_CODE ="D001789implCost";
+
+    @Id
+    @GeneratedValue(generator = "idGeneratorChuanyunImplCos")
+    @GenericGenerator(name ="idGeneratorChuanyunImplCos" ,strategy="com.galaxis.manatee.capsule.util.GalaxisIdGenerator")
+    private Long id;
+
+    /**
+     * 项目ID、
+     */
+    @JsonProperty("ObjectId")
+    private String objectId;
+
+
+    /**
+     * 项目ID、
+     */
+    @JsonProperty("F0000001")
+    private String projectId;
+
+    /**
+     * 项目编号
+     */
+    @JsonProperty("F0000002")
+    private String projectCode;
+
+    /**
+     * 工作组id
+     */
+    @JsonProperty("F0000006")
+    private String workGroup;
+
+    /**
+     * 工作组名称
+     */
+    @JsonProperty("F0000005")
+    private String workGroupName;
+
+    /**
+     * 费用
+     */
+    @JsonProperty("F0000004")
+    private BigDecimal implCost;
+
+}

+ 2 - 1
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunLogDO.java

@@ -91,7 +91,8 @@ public class ChuanyunLogDO extends BasicDO{
      */
     @JsonProperty("D001789WeekLog")
     @Transient
-    private List<Object> weekLogList;
+    private List<ChuanyunWeekLogDO> weekLogList;
+
     /**
      * 销售日志
      */

+ 60 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunProjectOrganizationStructureDO.java

@@ -0,0 +1,60 @@
+package com.galaxis.manatee.entity.chuanyun.data.object;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.galaxis.manatee.capsule.bo.ChuanyunObject;
+import com.galaxis.manatee.util.ChuanyunLocalDateTimeDeserializer;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 项目组织架构录入表单
+ */
+@Slf4j
+@EqualsAndHashCode(callSuper = true)
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunProjectOrganizationStructureDO extends BasicDO {
+
+    /**
+     * 表名
+     */
+    public static final String SCHEMA_CODE = "D0017898ca51050267c4ac8b31bc961d9f86a14";
+
+    /**
+     * 项目编号
+     */
+    @JsonProperty(value = "F0000001")
+    private String projectId;
+
+    /**
+     * 项目编号
+     */
+    @JsonProperty(value = "F0000007")
+    private String projectCode;
+    /**
+     * 项目名称
+     */
+    @JsonProperty(value = "F0000008")
+    private String projectName;
+
+    /**
+     * 项目类型
+     */
+    @JsonProperty(value = "F0000018")
+    private String projectType;
+
+    /**
+     * 工作组
+     */
+    @JsonProperty(value = "D001789Ffc523b16e9fc4ec8b4e8a08f1036af91")
+    private List<ChuanyunWorkGroupDO> workGroup;
+
+
+}

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

@@ -226,6 +226,14 @@ public class ChuanyunReimbursementDO extends BasicDO{
      */
     private String beneficiaryCostCode;
 
+    @JsonProperty("F0000046")
+    private BigDecimal totalAmountNotTaxed;
+
+    @JsonProperty("F0000145")
+    private String workGroupId;
+
+    private String workGroupName;
+
     /**
      * 报销明细
      */

+ 11 - 5
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunSelfWorkHourDO.java

@@ -14,6 +14,7 @@ import org.hibernate.annotations.GenericGenerator;
 import javax.persistence.*;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.Objects;
 
 /**
  * @author kxuan
@@ -22,12 +23,12 @@ import java.time.LocalDateTime;
 @Data
 @Entity(name = "CHUANYUN_SELF_WORK_HOUR")
 @JsonIgnoreProperties(ignoreUnknown = true)
-@Table(indexes = {@Index(name="project_user_hour", columnList="projectId,userId,standardWorkHour", unique=false)})
+@Table(indexes = {@Index(name = "project_user_hour", columnList = "projectId,userId,standardWorkHour", unique = false)})
 public class ChuanyunSelfWorkHourDO {
 
     @Id
     @GeneratedValue(generator = "idGeneratorUser")
-    @GenericGenerator(name ="idGeneratorUser" ,strategy="com.galaxis.manatee.capsule.util.GalaxisIdGenerator")
+    @GenericGenerator(name = "idGeneratorUser", strategy = "com.galaxis.manatee.capsule.util.GalaxisIdGenerator")
     private Long objectId;
 
     private String userId;
@@ -53,13 +54,18 @@ public class ChuanyunSelfWorkHourDO {
 
     private BigDecimal standardWorkHour;
 
+    private String workGroupName;
+
+    private String subWorkGroupName;
+
     /**
      * 根据ChuanyunWorkHourDO对象实例化ChuanyunSelfWorkHourDO对象
-     * @param projectType 由于日志原始数据可能出现项目类型错误的情况,需要单独为projectType赋值
+     *
+     * @param projectType        由于日志原始数据可能出现项目类型错误的情况,需要单独为projectType赋值
      * @param chuanyunWorkHourDO 从日志原始数据中统计出来的人员单日项目工时对象
-     * @return  更新了ChuanyunWorkHourDO对象中数据的ChuanyunSelfWorkHourDO对象
+     * @return 更新了ChuanyunWorkHourDO对象中数据的ChuanyunSelfWorkHourDO对象
      */
-    public static ChuanyunSelfWorkHourDO fromChuanyunWorkHourDO(ChuanyunWorkHourDO chuanyunWorkHourDO,String projectType){
+    public static ChuanyunSelfWorkHourDO fromChuanyunWorkHourDO(ChuanyunWorkHourDO chuanyunWorkHourDO, String projectType) {
         ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO = new ChuanyunSelfWorkHourDO();
         chuanyunSelfWorkHourDO.setStatus(chuanyunWorkHourDO.getStatus());
         chuanyunSelfWorkHourDO.setDepartmentName(chuanyunWorkHourDO.getDepartmentName());

+ 47 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunWeekLogDO.java

@@ -0,0 +1,47 @@
+package com.galaxis.manatee.entity.chuanyun.data.object;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.galaxis.manatee.util.ChuanyunLocalDateTimeDeserializer;
+import com.galaxis.manatee.util.ChuanyunLocalDateTimeSerializer;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+
+import java.time.LocalDateTime;
+
+@Slf4j
+@Data
+@EqualsAndHashCode(callSuper = true)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunWeekLogDO extends BasicDO {
+
+    /**
+     * 周工时项目Id
+     */
+    @JsonProperty("project")
+    private String projectId;
+
+    /**
+     * 项目编码
+     */
+    @JsonProperty("ProjectCode")
+    private String projectCode;
+
+    /**
+     * 日期
+     */
+    @JsonSerialize(using = ChuanyunLocalDateTimeSerializer.class)
+    @JsonDeserialize(using = ChuanyunLocalDateTimeDeserializer.class)
+    private LocalDateTime dayLogDate;
+
+    /**
+     * 工作组id
+     */
+    @JsonProperty("F0000084")
+    private String workGroupId;
+
+
+}

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

@@ -2,6 +2,7 @@ package com.galaxis.manatee.entity.chuanyun.data.object;
 
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.galaxis.manatee.constant.ChuanYunConstant;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.hibernate.annotations.GenericGenerator;
@@ -10,6 +11,7 @@ import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import java.math.BigDecimal;
+import java.util.Objects;
 
 @Slf4j
 @Data
@@ -19,7 +21,7 @@ public class ChuanyunWeekMemberHourDO {
 
     @Id
     @GeneratedValue(generator = "idGeneratorUser")
-    @GenericGenerator(name ="idGeneratorUser" ,strategy="com.galaxis.manatee.capsule.util.GalaxisIdGenerator")
+    @GenericGenerator(name = "idGeneratorUser", strategy = "com.galaxis.manatee.capsule.util.GalaxisIdGenerator")
     private Long objectId;
 
     private String userId;
@@ -47,11 +49,12 @@ public class ChuanyunWeekMemberHourDO {
 
     /**
      * 将一个ChuanyunWeekMemberHourDO对象的属性赋予另外一个ChuanyunWeekMemberHourDO对象,并返回该对象
-     * @param chuanyunWeekMemberHourDO  原来的ChuanyunWeekMemberHourDO对象
-     * @return  新的对象
+     *
+     * @param chuanyunWeekMemberHourDO 原来的ChuanyunWeekMemberHourDO对象
+     * @return 新的对象
      */
-    public static ChuanyunWeekMemberHourDO fromChuanyunWeekMemberHourDO(ChuanyunWeekMemberHourDO chuanyunWeekMemberHourDO){
-        ChuanyunWeekMemberHourDO newChuanyunWeekMemberHourDO=new ChuanyunWeekMemberHourDO();
+    public static ChuanyunWeekMemberHourDO fromChuanyunWeekMemberHourDO(ChuanyunWeekMemberHourDO chuanyunWeekMemberHourDO) {
+        ChuanyunWeekMemberHourDO newChuanyunWeekMemberHourDO = new ChuanyunWeekMemberHourDO();
         newChuanyunWeekMemberHourDO.setProjectId(chuanyunWeekMemberHourDO.getProjectId());
         newChuanyunWeekMemberHourDO.setProjectType(chuanyunWeekMemberHourDO.getProjectType());
         newChuanyunWeekMemberHourDO.setStandardWorkHour(chuanyunWeekMemberHourDO.getStandardWorkHour());

+ 59 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunWorkGroupDO.java

@@ -0,0 +1,59 @@
+package com.galaxis.manatee.entity.chuanyun.data.object;
+
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.galaxis.manatee.capsule.bo.ChuanyunObject;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.OneToMany;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@EqualsAndHashCode(callSuper = true)
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunWorkGroupDO extends BasicSubDO{
+
+    /**
+     * 表名
+     */
+    public static final String SCHEMA_CODE ="D001789Ffc523b16e9fc4ec8b4e8a08f1036af91";
+
+    /**
+     * 工作组
+     */
+    @JsonProperty(value = "F0000009")
+    private String workGroupName;
+
+    /**
+     * 工作负责人
+     */
+    @JsonProperty(value = "F0000010")
+    private String workGroupPrincipal;
+
+    /**
+     * 子工作组
+     */
+    @JsonProperty(value = "F0000012")
+    private String subWorkGroup;
+
+    /**
+     * 子工作组负责人
+     */
+    @JsonProperty(value = "F0000013")
+    private String subWorkGroupPrincipal;
+
+    @JsonProperty(value = "F0000014")
+    private List<String> subWorkGroupMember;
+
+    @JsonProperty(value = "F0000014Object")
+    private List<ChuanyunWorkGroupMemberDO> subWorkGroupMemberObject;
+
+}

+ 23 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunWorkGroupMemberDO.java

@@ -0,0 +1,23 @@
+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;
+import java.util.List;
+
+@Slf4j
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity(name = "CHUANYUN_WORK_GROUP_MEMBER")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunWorkGroupMemberDO extends BasicSubDO {
+
+    @JsonProperty("userId")
+    private String userId;
+
+}

+ 2 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunWorkHourDO.java

@@ -49,4 +49,6 @@ public class ChuanyunWorkHourDO {
     private LocalDateTime dayLogDate;
 
     private BigDecimal hoursWorked;
+
+    private String workGroupId;
 }

+ 12 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/dto/ChuanyunSelfWorkHourDTO.java

@@ -82,4 +82,16 @@ public class ChuanyunSelfWorkHourDTO {
      */
     @JsonProperty("F0000010")
     private String bg;
+
+    /**
+     * 工作组
+     */
+    @JsonProperty("workGroup")
+    private String workGroup;
+
+    /**
+     * 子工作组
+     */
+    @JsonProperty("subWorkGroup")
+    private String subWorkGroup;
 }

+ 11 - 0
src/main/java/com/galaxis/manatee/event/ImplCostEvent.java

@@ -0,0 +1,11 @@
+package com.galaxis.manatee.event;
+
+import lombok.Getter;
+import org.springframework.context.ApplicationEvent;
+
+@Getter
+public class ImplCostEvent extends ApplicationEvent {
+    public ImplCostEvent(Object source) {
+        super(source);
+    }
+}

+ 18 - 0
src/main/java/com/galaxis/manatee/event/ImplCostListener.java

@@ -0,0 +1,18 @@
+package com.galaxis.manatee.event;
+
+import com.galaxis.manatee.service.WorkGroupService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ImplCostListener implements ApplicationListener<ImplCostEvent> {
+
+    @Autowired
+    private WorkGroupService workGroupService;
+
+    @Override
+    public void onApplicationEvent(ImplCostEvent event) {
+        workGroupService.implCost();
+    }
+}

+ 11 - 0
src/main/java/com/galaxis/manatee/event/PushImplCostEvent.java

@@ -0,0 +1,11 @@
+package com.galaxis.manatee.event;
+
+import lombok.Getter;
+import org.springframework.context.ApplicationEvent;
+
+@Getter
+public class PushImplCostEvent extends ApplicationEvent {
+    public PushImplCostEvent(Object source) {
+        super(source);
+    }
+}

+ 18 - 0
src/main/java/com/galaxis/manatee/event/PushImplCostListener.java

@@ -0,0 +1,18 @@
+package com.galaxis.manatee.event;
+
+import com.galaxis.manatee.service.WorkGroupService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PushImplCostListener implements ApplicationListener<PushImplCostEvent> {
+
+    @Autowired
+    private WorkGroupService workGroupService;
+
+    @Override
+    public void onApplicationEvent(PushImplCostEvent event) {
+        workGroupService.pushToChuanyun();
+    }
+}

+ 13 - 0
src/main/java/com/galaxis/manatee/mapper/WorkHourMapper.java

@@ -0,0 +1,13 @@
+package com.galaxis.manatee.mapper;
+
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunWorkHourDO;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.time.LocalDateTime;
+
+@Repository
+public interface WorkHourMapper {
+
+    ChuanyunWorkHourDO selectByUserIdAndDayLogDate(@Param("userId") String userId, @Param("dayLogDate") LocalDateTime dayLogDate);
+}

+ 27 - 0
src/main/java/com/galaxis/manatee/mapper/WorkHourMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.galaxis.manatee.mapper.WorkHourMapper">
+    <resultMap id="BaseResultMap" type="com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunWorkHourDO">
+        <result column="hours_worked" jdbcType="DECIMAL" property="hoursWorked"/>
+        <result column="user_id" jdbcType="VARCHAR" property="userId"/>
+        <result column="day_log_date" jdbcType="TIMESTAMP" property="dayLogDate"/>
+    </resultMap>
+    <select id="selectByUserIdAndDayLogDate" parameterType="map"
+            resultMap="BaseResultMap">
+        SELECT SUM(chuanyun_day_log.hours_worked) AS hours_worked,
+        chuanyun_log.user_id,
+        chuanyun_day_log.day_log_date
+        FROM manatee.chuanyun_day_log
+        LEFT JOIN manatee.chuanyun_log ON chuanyun_day_log.parent_object_id = chuanyun_log.object_id
+        <where>
+            <if test="userId != null">
+                and chuanyun_log.user_id = #{userId,jdbcType=VARCHAR}
+            </if>
+            <if test="dayLogDate != null">
+                and chuanyun_day_log.day_log_date = #{dayLogDate,jdbcType=TIMESTAMP}
+            </if>
+            AND STATUS != 3
+        </where>
+        GROUP BY chuanyun_log.user_id, chuanyun_day_log.day_log_date
+    </select>
+</mapper>

+ 16 - 14
src/main/java/com/galaxis/manatee/service/DataArcherService.java

@@ -6,6 +6,7 @@ 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 com.galaxis.manatee.util.TimeUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -40,9 +41,9 @@ public class DataArcherService {
             List<String> matchers = new ArrayList<>();
             matchers.add("F0000001_2," + chuanyunSelfWorkHourDTO.getProjectId());
             matchers.add("F0000002_2," + chuanyunSelfWorkHourDTO.getUserId());
-            matchers.add("F0000003_2," + chuanyunSelfWorkHourDTO.getDayLogDate());
+            matchers.add("F0000003_2," + TimeUtil.formatDateTime(chuanyunSelfWorkHourDTO.getDayLogDate()));
             matchers.add("F0000005_2," + chuanyunSelfWorkHourDTO.getProjectType());
-            if (chuanyunSelfWorkHourDTO.getStatus().equals("3")){
+            if ("3".equals(chuanyunSelfWorkHourDTO.getStatus())) {
                 matchers.add("F0000006_2," + chuanyunSelfWorkHourDTO.getStatus());
             }
             var filter = Filter.instance(0, Integer.MAX_VALUE, true, "And", matchers);
@@ -53,19 +54,19 @@ public class DataArcherService {
                 List<ChuanyunMemberHourDO> result = objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
                 });
                 result.forEach(chuanyunMemberHourDO -> {
-                    chuanYunManager.delete(ChuanyunMemberHourDO.SCHEMA_CODE,chuanyunMemberHourDO.getObjectId());
+                    chuanYunManager.delete(ChuanyunMemberHourDO.SCHEMA_CODE, chuanyunMemberHourDO.getObjectId());
                 });
             }
             chuanyunSaveDTO = chuanYunManager.save(ChuanyunMemberHourDO.SCHEMA_CODE, selfMonthString, true);
             if (!chuanyunSaveDTO.getSuccessful()) {
-                log.warn("新增工时标准化失败:"+chuanyunSelfWorkHourDTO);
-            }else {
-                log.info("新增工时标准化成功:"+chuanyunSelfWorkHourDTO);
+                log.warn("新增工时标准化失败:" + chuanyunSelfWorkHourDTO);
+            } else {
+                log.info("新增工时标准化成功:" + chuanyunSelfWorkHourDTO);
             }
 
 
         } catch (Exception e) {
-            log.warn("更新标准工时异常" + chuanyunSelfWorkHourDTO,e);
+            log.warn("更新标准工时异常" + chuanyunSelfWorkHourDTO, e);
         }
     }
 
@@ -92,7 +93,7 @@ public class DataArcherService {
                 List<ChuanyunProjectMemberWeekHourDO> result = objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
                 });
                 result.forEach(chuanyunProjectMemberWeekHourDO -> {
-                    chuanYunManager.delete(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,chuanyunProjectMemberWeekHourDO.getObjectId());
+                    chuanYunManager.delete(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE, chuanyunProjectMemberWeekHourDO.getObjectId());
                 });
             }
 
@@ -119,7 +120,7 @@ public class DataArcherService {
             matchers.add("F0000009_2," + chuanyunSelfCostDTO.getStatus());
             matchers.add("F0000002_2," + chuanyunSelfCostDTO.getUserId());
             matchers.add("F0000008_2," + chuanyunSelfCostDTO.getProjectType());
-            matchers.add("F0000004_2," + chuanyunSelfCostDTO.getDayLogDate());
+            matchers.add("F0000004_2," + TimeUtil.formatDateTime(chuanyunSelfCostDTO.getDayLogDate()));
             var filter = Filter.instance(0, Integer.MAX_VALUE, true, "And", matchers);
             var chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunSelfCostDTO.SCHEMA_CODE, filter);
             var memberMonthString = objectMapper.writeValueAsString(chuanyunSelfCostDTO);
@@ -128,7 +129,7 @@ public class DataArcherService {
                 List<ChuanyunMemberMonthCostDO> result = objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
                 });
                 result.forEach(chuanyunMemberMonthCostDO -> {
-                    chuanYunManager.delete(ChuanyunMemberMonthCostDO.SCHEMA_CODE,chuanyunMemberMonthCostDO.getObjectId());
+                    chuanYunManager.delete(ChuanyunMemberMonthCostDO.SCHEMA_CODE, chuanyunMemberMonthCostDO.getObjectId());
                 });
             }
 
@@ -144,18 +145,19 @@ public class DataArcherService {
 
     /**
      * 删除审核中的每月工时
-     * @param chuanyunSelfCostDO    氚云每月工时
+     *
+     * @param chuanyunSelfCostDO 氚云每月工时
      */
     public void deleteSelfCostInProcess(ChuanyunSelfCostDO chuanyunSelfCostDO) {
-        ObjectMapper objectMapper=new ObjectMapper();
+        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);
+        matchers.add("F0000004_2," + TimeUtil.formatDateTime(chuanyunSelfCostDO.getDayLogDate()));
+        var filter = Filter.instance(0, 10, true, "And", matchers);
         try {
             ChuanyunFindAllBizDTO<Object> chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunMemberMonthCostDO.SCHEMA_CODE, filter);
             if (chuanyunFindAllResponse.getReturnData() != null) {

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

@@ -21,10 +21,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @author zcj
@@ -184,7 +183,11 @@ public class LogCheckService {
         if (chuanyunWorkHourList.size() != chuanyunSelfWorkHourList.size()) {
             //如果有变动将
             for (ChuanyunWorkHourDO chuanyunWorkHourDO : chuanyunWorkHourList) {
-                map.put(chuanyunWorkHourDO.getUserId() + chuanyunWorkHourDO.getProjectId() + chuanyunWorkHourDO.getProjectType() + chuanyunWorkHourDO.getDayLogDate(), 1);
+                String key = chuanyunWorkHourDO.getUserId() + chuanyunWorkHourDO.getProjectId() + chuanyunWorkHourDO.getProjectType() + chuanyunWorkHourDO.getDayLogDate();
+                if (map.containsKey(key)) {
+                    log.info("重复的key: {}", key);
+                }
+                map.put(key, 1);
             }
             //比较是否有撤回工时
             for (ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO : chuanyunSelfWorkHourList) {
@@ -239,28 +242,33 @@ public class LogCheckService {
      * @param allUserIdList 用户id集合
      * @param afterDay      多少天后
      */
-    @Async
+    @Async("threadPoolTaskExecutor")
     public void checkDayWorkHourTimeAfter(List<String> allUserIdList, Integer afterDay) {
         allUserIdList.parallelStream().forEach(userId -> {
+            if (Objects.isNull(userId)){
+                log.error("用户Id为null");
+                return;
+            }
             List<ChuanyunWorkHourDO> halfYearSelfWorkHour = chuanyunWorkHourDao.getHalfYearSelfWorkHour(userId);
             LocalDateTime localDateTime = LocalDateTime.now().minusDays(afterDay);
             List<ChuanyunSelfWorkHourDO> chuanyunSelfWorkHourList = chuanyunSelfWorkHourDao.findByUserIdAndDayLogDateAfter(userId, localDateTime);
             compareDayWorkHour(halfYearSelfWorkHour, chuanyunSelfWorkHourList);
         });
-
+        log.info("核对日工时记录完成");
     }
 
-    @Async
-    public void checkHalfYearWeekWorkHour(List<String> allUserIdList) {
+    @Async("threadPoolTaskExecutor")
+    public void checkWeekWorkHour(List<String> allUserIdList) {
         allUserIdList.parallelStream().forEach(userId -> {
             log.info("开始核对用户: {} 标准化周工时", userId);
+            if (Objects.isNull(userId)){
+                log.error("用户Id为null");
+                return;
+            }
             // 根据日工时聚合得到周工时
-            List<ChuanyunWeekMemberHourDO> list = chuanyunWeekMemberHourDao.getHalfYearWeekMemberHourByUserId(userId);
+            List<ChuanyunWeekMemberHourDO> list = chuanyunWeekMemberHourDao.getWeekMemberHourByUserId(userId);
             // 数据库已存在的周工时
-            LocalDateTime localDateTime = LocalDateTime.now().minusDays(180);
-            int year = localDateTime.getYear();
-            int week = localDateTime.getDayOfWeek().getValue();
-            List<ChuanyunWeekMemberHourDO> oldList = chuanyunWeekMemberHourDao.findByUserIdAndYearAfterAndWeekAfter(userId, year, week);
+            List<ChuanyunWeekMemberHourDO> oldList = chuanyunWeekMemberHourDao.findByUserId(userId);
             Map<String, Integer> map = new HashMap<>(list.size() + oldList.size());
 
             if (list.size() != oldList.size()) {
@@ -299,10 +307,52 @@ public class LogCheckService {
         });
     }
 
-    @Async
-    public void checkHalfYearMonthWorkHour(List<String> allUserIdList) {
+    @Async("threadPoolTaskExecutor")
+    public void checkMonthWorkHour(List<String> allUserIdList) {
+        long start = System.currentTimeMillis();
+        log.info("开始核对标准化月工时");
         allUserIdList.parallelStream().forEach(userId -> {
+            if (Objects.isNull(userId)){
+                log.error("用户Id为null");
+                return;
+            }
+            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());
+                for (ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO : list) {
+                    map.put(chuanyunSelfWorkHourDO.getUserId() + chuanyunSelfWorkHourDO.getProjectId() + chuanyunSelfWorkHourDO.getProjectType() + chuanyunSelfWorkHourDO.getDayLogDate().withDayOfMonth(1), 1);
+                }
+                for (ChuanyunSelfCostDO chuanyunSelfCostDO : costDOList) {
+                    Integer count = map.get(chuanyunSelfCostDO.getUserId() + chuanyunSelfCostDO.getProjectId() + chuanyunSelfCostDO.getProjectType() + chuanyunSelfCostDO.getDayLogDate().withDayOfMonth(1));
+                    if (count == null) {
+                        chuanyunSelfCostDao.delete(chuanyunSelfCostDO);
+                        List<String> matchers = new ArrayList<>();
+                        matchers.add("F0000003_2," + chuanyunSelfCostDO.getProjectId());
+                        matchers.add("F0000002_2," + chuanyunSelfCostDO.getUserId());
+                        matchers.add("F0000004_2," + chuanyunSelfCostDO.getDayLogDate().plusDays(1).withDayOfMonth(1));
+
+                        var filter = Filter.instance(0, 10, true, "And", matchers);
+                        ChuanyunFindAllBizDTO<Object> chuanyunFindAllResponse = null;
+                        try {
+                            chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunMemberMonthCostDO.SCHEMA_CODE, filter);
+                        } catch (JsonProcessingException e) {
+                            e.printStackTrace();
+                        }
+                        ChuanyunSaveDTO chuanyunSaveDTO;
+                        if (chuanyunFindAllResponse.getReturnData() != null) {
+                            List<ChuanyunMemberMonthCostDO> result = objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
+                            });
+                            chuanyunSaveDTO = chuanYunManager.delete(ChuanyunMemberMonthCostDO.SCHEMA_CODE, result.get(0).getObjectId());
+                        }
+                        log.info(chuanyunSelfCostDO.getUserId() + "删除项目" + chuanyunSelfCostDO.getProjectId() + "时间为" + chuanyunSelfCostDO.getDayLogDate() + "月工时");
+                    }
+                }
+            }
+
         });
+
+        log.info("核对耗时" + (System.currentTimeMillis() - start) + "毫秒");
     }
 
     /**
@@ -315,15 +365,19 @@ public class LogCheckService {
     public void checkChuanYunAll(Integer year, Integer month, Integer maxDay) {
         for (int i = 1; i <= maxDay; i++) {
             List<String> matchers = new ArrayList<>();
-            LocalDateTime of = LocalDateTime.of(year, month, i, 8, 0, 0);
-            String dateTime = TimeUtil.formatDateTime(of);
-            log.info("dateTime: {}", dateTime);
-            matchers.add("F0000003_2," + dateTime);
+            LocalDateTime start = LocalDateTime.of(year, month, i, 0, 0, 0);
+            LocalDateTime end = LocalDateTime.of(year, month, i, 23, 59, 59);
+            String startDateTime = TimeUtil.formatDateTime(start);
+            String endDateTime = TimeUtil.formatDateTime(end);
+            log.info("startDateTime: {}", startDateTime);
+            log.info("endDateTime: {}", endDateTime);
+            matchers.add("F0000003_0," + startDateTime);
+            matchers.add("F0000003_3," + endDateTime);
             boolean flag = true;
-            int start = -1;
-            int pageSize = 100;
+            int startIndex = -1;
+            int pageSize = 500;
             while (flag) {
-                Filter filter = Filter.instance(start, start + pageSize, true, Filter.AND, matchers);
+                Filter filter = Filter.instance(startIndex, startIndex + pageSize, true, Filter.AND, matchers);
                 ChuanyunFindAllBizDTO<Object> all = null;
                 try {
                     all = chuanYunManager.findAll(ChuanyunMemberHourDO.SCHEMA_CODE, filter);
@@ -334,8 +388,8 @@ public class LogCheckService {
                     flag = false;
                     continue;
                 }
-                if (all.getReturnData().getTotalCount() >= start + pageSize) {
-                    start += pageSize;
+                if (all.getReturnData().getTotalCount() >= startIndex + pageSize) {
+                    startIndex += pageSize;
                 } else {
                     flag = false;
                 }

+ 117 - 44
src/main/java/com/galaxis/manatee/service/LogDownloadService.java

@@ -7,12 +7,10 @@ import com.galaxis.manatee.dao.ChuanyunGroupProjectDao;
 import com.galaxis.manatee.dao.ChuanyunLogDao;
 import com.galaxis.manatee.dao.ChuanyunUserCompanyDao;
 import com.galaxis.manatee.dao.ChuanyunUserDepartmentNameDao;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunGroupProjectDO;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunLogDO;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunUserCompanyDO;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunUserDepartmentNameDO;
+import com.galaxis.manatee.entity.chuanyun.data.object.*;
 import com.galaxis.manatee.entity.chuanyun.dto.Filter;
 import com.galaxis.manatee.manager.ChuanYunManager;
+import com.galaxis.manatee.util.TimeUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
@@ -23,9 +21,12 @@ import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
 
 /**
  * 下载日志原始数据
+ *
  * @author zcj
  * @version 0.1
  * @date 2021/3/13 2:14 上午
@@ -36,47 +37,48 @@ public class LogDownloadService {
 
     private final ChuanYunManager chuanYunManager;
     private final ChuanyunLogDao chuanyunLogDao;
-    private final ChuanyunUserCompanyDao chuanyunUserCompanyDao;
+    private final ChuanyunUserCompanyDao userCompanyDao;
     private final ChuanyunGroupProjectDao chuanyunGroupProjectDao;
     private final ChuanyunUserDepartmentNameDao chuanyunUserDepartmentNameDao;
 
     public LogDownloadService(ChuanYunManager chuanYunManager, ChuanyunLogDao chuanyunLogDao, ChuanyunUserCompanyDao chuanyunUserCompanyDao, ChuanyunGroupProjectDao chuanyunGroupProjectDao, ChuanyunUserDepartmentNameDao chuanyunUserDepartmentNameDao) {
         this.chuanYunManager = chuanYunManager;
         this.chuanyunLogDao = chuanyunLogDao;
-        this.chuanyunUserCompanyDao = chuanyunUserCompanyDao;
+        this.userCompanyDao = chuanyunUserCompanyDao;
         this.chuanyunGroupProjectDao = chuanyunGroupProjectDao;
         this.chuanyunUserDepartmentNameDao = chuanyunUserDepartmentNameDao;
     }
 
     /**
      * 更新日志数据
-     * @param isRecent  是否只更新最近30天
+     *
+     * @param isRecent 是否只更新最近30天
      */
-    public void saveChuanyunLogDO(boolean isRecent){
+    public void saveChuanyunLogDO(boolean isRecent) {
         var objectMapper = new ObjectMapper();
         var start = 0;
         var totalCount = 0L;
         var flag = true;
-        var pageSize=100;
-        List<String> matchersString=new ArrayList<>();
+        var pageSize = 100;
+        List<String> matchersString = new ArrayList<>();
         //由于需要统计流程中的日志,在日志数据同步时将状态为2的数据一并统计
         matchersString.add("Status_6,[1;2;3]");
         // 默认获取半年的日志
         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         // 按要求同步两个月的记录
-        LocalDateTime localDateTime = LocalDateTime.now().minusDays(60);
+        LocalDateTime localDateTime = LocalDateTime.now().minusDays(90);
         matchersString.add("logDate_1," + df.format(localDateTime));
-        if(isRecent){
+        if (isRecent) {
             //获取当前时间30天前日期
             LocalDateTime now = LocalDateTime.now();
             now = now.minus(30, ChronoUnit.DAYS);
-            matchersString.add("logDate_1,"+df.format(now));
+            matchersString.add("logDate_1," + df.format(now));
         }
         while (flag) {
-            long startTime= Instant.now().getEpochSecond();
+            long startTime = Instant.now().getEpochSecond();
             try {
                 //从氚云查询数据
-                var filter= Filter.instance(start,start+pageSize,true,Filter.AND,matchersString);
+                var filter = Filter.instance(start, start + pageSize, true, Filter.AND, matchersString);
                 var chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunLogDO.SCHEMA_CODE, filter);
                 if (chuanyunFindAllResponse.getReturnData() == null) {
                     flag = false;
@@ -100,83 +102,154 @@ public class LogDownloadService {
                 log.error(e.getMessage());
                 e.printStackTrace();
             }
-            log.info("日志100条保存时间"+(Instant.now().getEpochSecond()-startTime)+"秒");
+            log.info("日志100条保存时间" + (Instant.now().getEpochSecond() - startTime) + "秒");
         }
         log.info("最近一月历史日志信息保存" + totalCount);
     }
 
     /**
      * 更新氚云日志数据
+     *
      * @param chuanyunLogDO 待处理数据
      */
-    private void updateChuanyunLogData(ChuanyunLogDO chuanyunLogDO){
+    private void updateChuanyunLogData(ChuanyunLogDO chuanyunLogDO) {
         //处理项目userId
-        if(chuanyunLogDO.getUserObject()!=null){
+        if (chuanyunLogDO.getUserObject() != null) {
             chuanyunLogDO.setUserId(chuanyunLogDO.getUserObject().getObjectId());
         }
         //日志人员所属部门名称
-        if (!StringUtils.isEmpty(chuanyunLogDO.getDepartment())){
+        if (!StringUtils.isEmpty(chuanyunLogDO.getDepartment())) {
             chuanyunLogDO.setDepartmentName(chuanyunLogDO.getDepartment());
-        }else {
+        } else {
             chuanyunLogDao.findById(chuanyunLogDO.getObjectId()).ifPresent(oldLogDO -> {
                 chuanyunLogDO.setDepartmentName(oldLogDO.getDepartmentName());
             });
         }
+
+        // 补全部门信息
+        if (Objects.isNull(chuanyunLogDO.getDepartmentName()) || chuanyunLogDO.getDepartmentName().isBlank()) {
+            // 任没有部门,查询该用户所属公司获取部门
+            Optional<ChuanyunUserCompanyDO> first = userCompanyDao.findAllByUserIdOrderByModifiedTimeDesc(chuanyunLogDO.getUserId()).stream().findFirst();
+            first.ifPresent(chuanyunUserCompanyDO -> {
+                String[] split = chuanyunUserCompanyDO.getDepartment().split("/");
+                int length = split.length;
+                chuanyunLogDO.setDepartmentName(split[length - 1]);
+            });
+        }
         //处理数据
-        if(chuanyunLogDO.getDayLogList()==null||chuanyunLogDO.getDayLogList().size()==0){
+        if (chuanyunLogDO.getDayLogList() == null || chuanyunLogDO.getDayLogList().size() == 0) {
             chuanyunLogDO.setDayLogList(new ArrayList<>());
-            log.warn(chuanyunLogDO+"");
+            log.warn(chuanyunLogDO + "");
             log.warn("异常数据");
-        }else{
+        } else {
             //如果有重复就删除
-            // todo 保存判断是否无变更,无变更返回0则修改该条数据为没变化的数据。
-
             chuanyunLogDao.findById(chuanyunLogDO.getObjectId()).ifPresent(chuanyunLogDao::delete);
             //根据projectId获取code,如果是生产项目,则不用处理
             //针对前期测试数据,可能出现日志为空的情况,跳过不处理
             chuanyunLogDO.getDayLogList().forEach(chuanyunDayLog -> {
+                // 补全工作组
+                if (ChuanYunConstant.LOG_WEEK_TYPE.contains(chuanyunLogDO.getDayOrWeek()) && ChuanYunConstant.NEED_WORK_GROUP_PROJECT_TYPE.contains(chuanyunDayLog.getProjectType())) {
+                    List<ChuanyunWeekLogDO> weekLogList = chuanyunLogDO.getWeekLogList();
+                    for (ChuanyunWeekLogDO chuanyunWeekLogDO : weekLogList) {
+                        if (Objects.equals(chuanyunDayLog.getProjectId(), chuanyunWeekLogDO.getProjectId())) {
+                            chuanyunDayLog.setWorkGroupId(chuanyunWeekLogDO.getWorkGroupId());
+                            break;
+                        }
+                    }
+                }
+
                 //离职人员补全用户Id及部门ID
-                if (StringUtils.isEmpty(chuanyunLogDO.getUserId())){
-                    var name="";
-                    if (StringUtils.isEmpty(chuanyunDayLog.getContent())){
-                        name=chuanyunLogDO.getName();
-                    }else {
-                        name=chuanyunDayLog.getContent();
+                if (StringUtils.isEmpty(chuanyunLogDO.getUserId())) {
+                    var name = "";
+                    if (StringUtils.isEmpty(chuanyunDayLog.getContent())) {
+                        name = chuanyunLogDO.getName();
+                    } else {
+                        name = chuanyunDayLog.getContent();
                     }
                     chuanyunLogDO.setUserId(getCharacters(name));
                     ChuanyunUserDepartmentNameDO chuanyunUserDepartmentNameDO = chuanyunUserDepartmentNameDao.findByUserName(chuanyunLogDO.getUserId());
-                    if (chuanyunUserDepartmentNameDO!=null){
+                    if (chuanyunUserDepartmentNameDO != null) {
                         chuanyunLogDO.setDepartmentName(chuanyunUserDepartmentNameDO.getDepartmentName());
                     }
                 }
-                try{
-                    if(!ChuanYunConstant.PRODUCTION_PROJECT.equals(chuanyunDayLog.getProjectType())&& StringUtils.isEmpty(chuanyunDayLog.getProjectId())){
-                        log.info(chuanyunLogDO+"");
-                    }else if(!ChuanYunConstant.PRODUCTION_PROJECT.equals(chuanyunDayLog.getProjectType())){
-                        ChuanyunGroupProjectDO chuanyunGroupProjectDO=chuanyunGroupProjectDao.findById(chuanyunDayLog.getProjectId()).orElseThrow();
+                try {
+                    if (!ChuanYunConstant.PRODUCTION_PROJECT.equals(chuanyunDayLog.getProjectType()) && StringUtils.isEmpty(chuanyunDayLog.getProjectId())) {
+                        log.info(chuanyunLogDO + "");
+                    } else if (!ChuanYunConstant.PRODUCTION_PROJECT.equals(chuanyunDayLog.getProjectType())) {
+                        ChuanyunGroupProjectDO chuanyunGroupProjectDO = chuanyunGroupProjectDao.findById(chuanyunDayLog.getProjectId()).orElseThrow();
                         chuanyunDayLog.setProjectCode(chuanyunGroupProjectDO.getProjectCode());
                     }
-                }catch (Exception e){
+                } catch (Exception e) {
                     e.printStackTrace();
-                    log.warn(chuanyunDayLog+"");
+                    log.warn(chuanyunDayLog + "");
                 }
             });
         }
 
     }
 
-    private String getCharacters(String str){
+    private String getCharacters(String str) {
         String reg = "[^\u4e00-\u9fa5]";
         str = str.replaceAll(reg, " ");
         return str.trim();
     }
 
-    private String getDepartmentName(String str){
-        if (str.contains("/")){
+    private String getDepartmentName(String str) {
+        if (str.contains("/")) {
             String[] department = str.split("/");
-            return department[department.length-1];
-        }else {
+            return department[department.length - 1];
+        } else {
             return str;
         }
     }
+
+
+    /**
+     * 更新日志数据
+     */
+    public void saveDayLog() {
+        var objectMapper = new ObjectMapper();
+        var start = 0;
+        var totalCount = 0L;
+        var flag = true;
+        var pageSize = 100;
+        List<String> matchersString = new ArrayList<>();
+        //由于需要统计流程中的日志,在日志数据同步时将状态为2的数据一并统计
+        matchersString.add("Status_6,[1;2;3]");
+        LocalDateTime localDateTimeStart = LocalDateTime.of(2022, 5, 1, 0, 0, 0);
+        LocalDateTime localDateTimeEnd = LocalDateTime.of(2022, 6, 30, 23, 59, 59);
+        matchersString.add("logDate_1," + TimeUtil.formatDateTime(localDateTimeStart));
+        matchersString.add("logDate_3," + TimeUtil.formatDateTime(localDateTimeEnd));
+        while (flag) {
+            long startTime = Instant.now().getEpochSecond();
+            try {
+                //从氚云查询数据
+                var filter = Filter.instance(start, start + pageSize, true, Filter.AND, matchersString);
+                var chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunLogDO.SCHEMA_CODE, filter);
+                if (chuanyunFindAllResponse.getReturnData() == null) {
+                    flag = false;
+                    continue;
+                }
+                if (chuanyunFindAllResponse.getReturnData().getTotalCount() >= start + pageSize) {
+                    start += pageSize;
+                } else {
+                    flag = false;
+                }
+                //转化为POJO
+                List<ChuanyunLogDO> result = objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
+                });
+                //处理日志数据
+                result.forEach(this::updateChuanyunLogData);
+                //获取项目总数
+                totalCount = chuanyunFindAllResponse.getReturnData().getTotalCount();
+                //保存
+                chuanyunLogDao.saveAll(result);
+            } catch (Exception e) {
+                log.error(e.getMessage());
+                e.printStackTrace();
+            }
+            log.info("日志100条保存时间" + (Instant.now().getEpochSecond() - startTime) + "秒");
+        }
+        log.info("最近一月历史日志信息保存" + totalCount);
+    }
 }

+ 67 - 13
src/main/java/com/galaxis/manatee/service/LogService.java

@@ -1,10 +1,14 @@
 package com.galaxis.manatee.service;
 
 import com.galaxis.manatee.dao.ChuanyunUserCompanyDao;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunUserCompanyDO;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.time.Instant;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author zcj
@@ -28,19 +32,43 @@ public class LogService {
     /**
      * 标准化所有周工时信息
      */
-    public void standardAllWeekMemberHour(){
-        long start= Instant.now().getEpochSecond();
-        chuanyunUserCompanyDao.findAll().parallelStream().forEach(chuanyunUserCompanyDO -> logStandardService.standardWeekMemberHourByUserId(chuanyunUserCompanyDO.getUserId()));
-        log.info("标准化所有周工时耗时"+(Instant.now().getEpochSecond()-start)+"秒");
+    public void standardAllWeekMemberHour() {
+        long start = Instant.now().getEpochSecond();
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logStandardService::standardWeekMemberHourByUserId);
+        log.info("标准化所有周工时耗时" + (Instant.now().getEpochSecond() - start) + "秒");
+    }
+
+    /**
+     * 标准化一年内周工时信息
+     */
+    @Async("threadPoolTaskExecutor")
+    public void standardOneYearWeekMemberHour() {
+        long start = Instant.now().getEpochSecond();
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logStandardService::standardWeekMemberHourByUserId);
+        log.info("标准化所有周工时耗时" + (Instant.now().getEpochSecond() - start) + "秒");
     }
 
     /**
      * 标准化所有月工时
      */
-    public void standardAllSelfCost(){
-        long start=Instant.now().getEpochSecond();
-        chuanyunUserCompanyDao.findAll().parallelStream().forEach(chuanyunUserCompanyDO -> logStandardService.standardSelfCostByUserId(chuanyunUserCompanyDO.getUserId()));
-        log.info("标准化所有月工时耗时"+(Instant.now().getEpochSecond()-start)+"秒");
+    public void standardAllSelfCost() {
+        long start = Instant.now().getEpochSecond();
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logStandardService::standardSelfCostByUserId);
+        log.info("标准化所有月工时耗时" + (Instant.now().getEpochSecond() - start) + "秒");
+    }
+
+    /**
+     * 标准化一年内月工时
+     */
+    @Async("threadPoolTaskExecutor")
+    public void standardOneYearSelfCost() {
+        long start = Instant.now().getEpochSecond();
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logStandardService::standardSelfCostByUserId);
+        log.info("标准化所有月工时耗时 {} ", Instant.now().getEpochSecond() - start);
     }
 
     /**
@@ -48,7 +76,8 @@ public class LogService {
      */
     public void updateAllChuanyunSelfWorkHour() {
         long startTime = Instant.now().getEpochSecond();
-        chuanyunUserCompanyDao.findAll().parallelStream().forEach(chuanyunUserCompanyDO -> logUpdateService.updateChuanyunSelfWorkHourListByUserId(chuanyunUserCompanyDO.getUserId()));
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logUpdateService::updateChuanyunSelfWorkHourListByUserId);
         log.info("更新所有每日工时花费" + (Instant.now().getEpochSecond() - startTime) + "秒");
     }
 
@@ -57,8 +86,9 @@ public class LogService {
      */
     public void updateHalfYearChuanyunSelfWorkHour() {
         long startTime = Instant.now().getEpochSecond();
-        chuanyunUserCompanyDao.findAll().parallelStream().forEach(chuanyunUserCompanyDO -> logUpdateService.pushHalfYearDayWorkHour(chuanyunUserCompanyDO.getUserId()));
-        log.info("更新所有每日工时花费" + (Instant.now().getEpochSecond() - startTime) + "秒");
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logUpdateService::pushHalfYearDayWorkHour);
+        log.info("更新所有每日工时花费 {} 秒", Instant.now().getEpochSecond() - startTime);
     }
 
     /**
@@ -66,16 +96,40 @@ public class LogService {
      */
     public void updateAllChuanyunWeekMemberHour() {
         long startTime = Instant.now().getEpochSecond();
-        chuanyunUserCompanyDao.findAll().parallelStream().forEach(chuanyunUserCompanyDO -> logUpdateService.updateChuanyunWeekMemberHourListByUserId(chuanyunUserCompanyDO.getUserId()));
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logUpdateService::updateChuanyunWeekMemberHourListByUserId);
         log.info("更新所有每周工时花费" + (Instant.now().getEpochSecond() - startTime) + "秒");
     }
 
+
+
     /**
      * 更新所有月工时
      */
     public void updateAllChuanyunSelfCost() {
         long startTime = Instant.now().getEpochSecond();
-        chuanyunUserCompanyDao.findAll().parallelStream().forEach(chuanyunUserCompanyDO -> logUpdateService.updateChuanyunSelfCostListByUserId(chuanyunUserCompanyDO.getUserId()));
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logUpdateService::updateChuanyunSelfCostListByUserId);
+        log.info("更新所有每月工时花费" + (Instant.now().getEpochSecond() - startTime) + "秒");
+    }
+
+    /**
+     * 更新去年至今周工时
+     */
+    public void pushLastYearToPresentWeekMemberHour() {
+        long startTime = Instant.now().getEpochSecond();
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logUpdateService::pushLastYearToPresentWeekMemberHourListByUserId);
+        log.info("更新一年内每周工时花费" + (Instant.now().getEpochSecond() - startTime) + "秒");
+    }
+
+    /**
+     * 更新一年内月工时
+     */
+    public void pushOneYearChuanyunSelfCost() {
+        long startTime = Instant.now().getEpochSecond();
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logUpdateService::pushOneYearSelfCostListByUserId);
         log.info("更新所有每月工时花费" + (Instant.now().getEpochSecond() - startTime) + "秒");
     }
 }

+ 67 - 18
src/main/java/com/galaxis/manatee/service/LogStandardService.java

@@ -1,9 +1,14 @@
 package com.galaxis.manatee.service;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.galaxis.manatee.constant.ChuanYunConstant;
 import com.galaxis.manatee.dao.*;
 import com.galaxis.manatee.entity.chuanyun.data.object.*;
+import com.galaxis.manatee.entity.chuanyun.dto.Filter;
+import com.galaxis.manatee.manager.ChuanYunManager;
+import com.galaxis.manatee.mapper.WorkHourMapper;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
@@ -28,6 +33,12 @@ import java.util.stream.Collectors;
 @Service
 public class LogStandardService {
 
+    @Autowired
+    private ChuanYunManager chuanYunManager;
+
+    @Autowired
+    private WorkHourMapper workHourMapper;
+
     private final DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     private final ChuanyunWorkHourDao chuanyunWorkHourDao;
     private final ChuanyunSelfCostDao chuanyunSelfCostDao;
@@ -81,9 +92,9 @@ public class LogStandardService {
      *
      * @param userId 用户Id
      */
-    @Async
+    @Async("threadPoolTaskExecutor")
     public void standardSelfWorkHourByUserId(String userId) {
-        if (!Objects.isNull(userId) && userId.isBlank()) {
+        if (!Objects.isNull(userId) && !userId.isBlank()) {
             //从日志原始数据中获取每人每个项目每天工时。
             List<ChuanyunWorkHourDO> selfList = chuanyunWorkHourDao.getSelfWorkHour(userId);
             this.generateSelfWorkHourByWorkHourList(selfList);
@@ -93,16 +104,15 @@ public class LogStandardService {
     }
 
     /**
-     * 根据用户Id标准化某个人的工时
+     * 根据用户Id标准化某个人的工时
      *
      * @param userId 用户Id
      */
-    @Async
     public void standardWeekMemberHourByUserId(String userId) {
         if (!StringUtils.isEmpty(userId)) {
             long start = Instant.now().getEpochSecond();
             //更新数据库
-            List<ChuanyunWeekMemberHourDO> list = chuanyunWeekMemberHourDao.getWeekMemberHourByUserId(userId);
+            List<ChuanyunWeekMemberHourDO> list = chuanyunWeekMemberHourDao.getOneYearAgoWeekMemberHourByUserId(userId);
             this.generateWeekMemberHourByWeekMemberHourList(list);
             log.info(userId + "统一周工时标准化" + (Instant.now().getEpochSecond() - start) + "秒");
         } else {
@@ -117,7 +127,6 @@ public class LogStandardService {
      *
      * @param userId 用户Id
      */
-    @Async
     public void standardSelfCostByUserId(String userId) {
         long start = Instant.now().getEpochSecond();
         //删除上一次状态为审核中,但本次已经审核通过的数据
@@ -138,7 +147,11 @@ public class LogStandardService {
         });
 
         // 获取单人月度各项目总工时
-        List<ChuanyunSelfWorkHourDO> userAllSelfWorkHours = chuanyunSelfWorkHourDao.findByUserId(userId);
+//        List<ChuanyunSelfWorkHourDO> userAllSelfWorkHours = chuanyunSelfWorkHourDao.findByUserId(userId);
+        // 修改为获取一年内的记录
+        // 获取一年前的时间节点
+        LocalDateTime aYearAgo = LocalDateTime.now().minusYears(1);
+        List<ChuanyunSelfWorkHourDO> userAllSelfWorkHours = chuanyunSelfWorkHourDao.findByUserIdAndDayLogDateAfter(userId, aYearAgo);
         Map<LocalDate, Map<String, Map<String, Map<String, BigDecimal>>>> map = userAllSelfWorkHours.stream().collect(
                 Collectors.groupingBy(chuanyunSelfWorkHourDO -> LocalDate.of(chuanyunSelfWorkHourDO.getDayLogDate().getYear(), chuanyunSelfWorkHourDO.getDayLogDate().getMonth(), 1),
                         Collectors.groupingBy(ChuanyunSelfWorkHourDO::getProjectId,
@@ -210,7 +223,6 @@ public class LogStandardService {
             } catch (Exception e) {
                 log.error(e.getMessage());
                 log.error("" + self);
-                e.printStackTrace();
             }
         });
     }
@@ -268,18 +280,25 @@ public class LogStandardService {
         }
         ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO = ChuanyunSelfWorkHourDO.fromChuanyunWorkHourDO(chuanyunWorkHourDO, projectType);
         //获取每人每天总工时
-        ChuanyunWorkHourDO oneDayTotalHour = chuanyunWorkHourDao.getDayWorkHour(chuanyunWorkHourDO.getUserId(), chuanyunWorkHourDO.getDayLogDate());
+//        ChuanyunWorkHourDO oneDayTotalHour = chuanyunWorkHourDao.getDayWorkHour(chuanyunWorkHourDO.getUserId(), chuanyunWorkHourDO.getDayLogDate());
 
         // 获取每天总工时
-//        ChuanyunOneDayWorkHourDO oneDayTotalHour = chuanyunOneDayWorkHourDao.getOneDayTotalHour(chuanyunWorkHourDO.getUserId(), chuanyunWorkHourDO.getDayLogDate());
+//        ChuanyunWorkHourDO oneDayTotalHour = chuanyunWorkHourDao.getOneDayTotalHour(chuanyunWorkHourDO.getUserId(), chuanyunWorkHourDO.getDayLogDate());
+        ChuanyunWorkHourDO oneDayTotalHour = workHourMapper.selectByUserIdAndDayLogDate(chuanyunWorkHourDO.getUserId(), chuanyunWorkHourDO.getDayLogDate());
 
         //工时标准化
         if (oneDayTotalHour != null) {
-            BigDecimal standard = new BigDecimal(8);
-            if (oneDayTotalHour.getHoursWorked().compareTo(standard) <= 0) {
+            BigDecimal hoursWorked = oneDayTotalHour.getHoursWorked();
+            if (hoursWorked.compareTo(BigDecimal.ZERO) == 0) {
+                throw new Exception("每日工时为0");
+            }
+            BigDecimal standard = new BigDecimal("8.00");
+            if (hoursWorked.compareTo(standard) <= 0) {
                 chuanyunSelfWorkHourDO.setStandardWorkHour(chuanyunWorkHourDO.getHoursWorked());
             } else {
-                BigDecimal personDays = (chuanyunWorkHourDO.getHoursWorked().divide(oneDayTotalHour.getHoursWorked(), 2, RoundingMode.HALF_UP)).multiply(standard);
+                BigDecimal worked = chuanyunWorkHourDO.getHoursWorked();
+                BigDecimal divide = worked.divide(hoursWorked, 2, RoundingMode.HALF_UP);
+                BigDecimal personDays = divide.multiply(standard);
                 chuanyunSelfWorkHourDO.setStandardWorkHour(personDays);
             }
         } else {
@@ -315,17 +334,19 @@ public class LogStandardService {
         chuanyunSelfCostDO.setUserId(chuanyunSelfWorkHourDO.getUserId());
         chuanyunSelfCostDO.setDayLogDate(chuanyunSelfWorkHourDO.getDayLogDate().withDayOfMonth(1));
         chuanyunSelfCostDO.setTotalHour(chuanyunSelfWorkHourDO.getStandardWorkHour());
-        ChuanyunUserCompanyDO chuanyunUserCompanyDO = chuanyunUserCompanyDao.findByUserId(chuanyunSelfWorkHourDO.getUserId());
-        chuanyunSelfCostDO.setDepartmentId(chuanyunUserCompanyDO.getDepartmentId());
+        Optional<ChuanyunUserCompanyDO> chuanyunUserCompanyDO = chuanyunUserCompanyDao.findAllByUserIdOrderByModifiedTimeDesc(chuanyunSelfWorkHourDO.getUserId()).stream().findFirst();
+        chuanyunUserCompanyDO.ifPresent(userCompanyDO -> chuanyunSelfCostDO.setDepartmentId(userCompanyDO.getDepartmentId()));
         return chuanyunSelfCostDO;
     }
 
     /**
      * 标准化半年内每日工时
      */
-    @Async
     public void standardHalfYearWorkHour() {
-        chuanyunUserCompanyDao.findAll().forEach(chuanyunUserCompanyDO -> this.standardHalfYearDayWorkHour(chuanyunUserCompanyDO.getUserId()));
+//        chuanyunUserCompanyDao.findAll().parallelStream().forEach(chuanyunUserCompanyDO -> this.standardHalfYearDayWorkHour(chuanyunUserCompanyDO.getUserId()));
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        List<String> distinctUserIdList = userIdList.stream().distinct().collect(Collectors.toList());
+        distinctUserIdList.parallelStream().forEach(this::standardHalfYearDayWorkHour);
     }
 
     public void standardHalfYearWorkHourByUserId(String userId) {
@@ -341,10 +362,37 @@ public class LogStandardService {
         //逐一将原始工时数据标准化后,更新到标准化工时表和氚云中
         log.info("标准化用户日工时 userId: {}", userId);
         List<ChuanyunWorkHourDO> halfYearSelfWorkHour = chuanyunWorkHourDao.getHalfYearSelfWorkHour(userId);
-        halfYearSelfWorkHour.parallelStream().forEach(self -> {
+        halfYearSelfWorkHour.forEach(self -> {
             try {
                 //新建标准化工时对象,并将原始数据更新到此对象中,并计算标准化之后的工时
                 ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO = this.fromChuanyunWorkHourDO(self);
+                // 设置工作组和子工作组
+                String workGroupId = self.getWorkGroupId();
+                if (!Objects.isNull(workGroupId) && !workGroupId.isBlank()) {
+                    // 查询工作组
+                    ObjectMapper objectMapper = new ObjectMapper();
+                    try {
+                        var chuanyunFindAllResponse = chuanYunManager.find(ChuanyunWorkGroupDO.SCHEMA_CODE, workGroupId);
+                        if (chuanyunFindAllResponse.getReturnData() != null) {
+                            Object bizObject = chuanyunFindAllResponse.getReturnData().getBizObject();
+                            if (bizObject != null) {
+                                ChuanyunWorkGroupDO chuanyunWorkGroupDO = objectMapper.convertValue(bizObject, ChuanyunWorkGroupDO.class);
+                                chuanyunSelfWorkHourDO.setWorkGroupName(chuanyunWorkGroupDO.getWorkGroupName());
+                                chuanyunSelfWorkHourDO.setSubWorkGroupName(chuanyunWorkGroupDO.getSubWorkGroup());
+                            }
+                        }
+                        if (!chuanyunFindAllResponse.getSuccessful()) {
+                            // 找不到该工作组,工作组可能已经被删掉了
+                            // 找该用户该项目当前工作组
+                            ArrayList<String> matchers = new ArrayList<>();
+
+                            Filter filter = Filter.instance(0, 10, true, Filter.AND, matchers);
+                            chuanYunManager.findAll(ChuanyunWorkGroupDO.SCHEMA_CODE, filter);
+                        }
+                    } catch (Exception e) {
+                        log.error(e.getMessage());
+                    }
+                }
                 //查询系统中是否有重复的标准化工时数据,如果有重复的人、天、项目数据,将原数据删除后更新为最新的数据
                 try {
                     List<ChuanyunSelfWorkHourDO> list;
@@ -366,6 +414,7 @@ public class LogStandardService {
                 e.printStackTrace();
             }
         });
+        log.info("标准化用户日工时完成 userId: {}", userId);
     }
 
 }

+ 46 - 8
src/main/java/com/galaxis/manatee/service/LogUpdateService.java

@@ -17,9 +17,12 @@ import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import java.time.DayOfWeek;
 import java.time.Instant;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * @author zcj
@@ -74,6 +77,28 @@ public class LogUpdateService {
         this.updateChuanyunSelfWorkHourList(updateList);
     }
 
+
+    /**
+     * 根据用户Id更新氚云每周工时列表
+     *
+     * @param userId 用户ID
+     */
+    public void updateChuanyunWeekMemberHourListByUserId(String userId) {
+        List<ChuanyunWeekMemberHourDO> updateList = chuanyunWeekMemberHourDao.findByUserId(userId);
+        this.updateChuanyunWeekMemberHourList(updateList);
+    }
+
+
+    /**
+     * 根据用户Id更新氚云每月工时列表
+     *
+     * @param userId 用户ID
+     */
+    public void updateChuanyunSelfCostListByUserId(String userId) {
+        List<ChuanyunSelfCostDO> updateList = chuanyunSelfCostDao.findByUserId(userId);
+        this.updateChuanyunSelfCostList(updateList);
+    }
+
     /**
      * 更新至氚云半内内的数据
      */
@@ -85,12 +110,14 @@ public class LogUpdateService {
     }
 
     /**
-     * 根据用户Id更新氚云每周工时列表
+     * 根据用户Id更新氚云一年内每周工时列表
      *
      * @param userId 用户ID
      */
-    public void updateChuanyunWeekMemberHourListByUserId(String userId) {
-        List<ChuanyunWeekMemberHourDO> updateList = chuanyunWeekMemberHourDao.findByUserId(userId);
+    public void pushLastYearToPresentWeekMemberHourListByUserId(String userId) {
+        LocalDate localDate = LocalDate.now().minusYears(1);
+        int year = localDate.getYear();
+        List<ChuanyunWeekMemberHourDO> updateList = chuanyunWeekMemberHourDao.findByUserIdAndYearGreaterThanEqual(userId, String.valueOf(year));
         this.updateChuanyunWeekMemberHourList(updateList);
     }
 
@@ -99,8 +126,10 @@ public class LogUpdateService {
      *
      * @param userId 用户ID
      */
-    public void updateChuanyunSelfCostListByUserId(String userId) {
-        List<ChuanyunSelfCostDO> updateList = chuanyunSelfCostDao.findByUserId(userId);
+    public void pushOneYearSelfCostListByUserId(String userId) {
+        LocalDate localDate = LocalDate.now().minusYears(1);
+        LocalDateTime aYearAgo = LocalDateTime.of(localDate.getYear(), localDate.getMonth(), localDate.getDayOfMonth(), 0, 0);
+        List<ChuanyunSelfCostDO> updateList = chuanyunSelfCostDao.findByUserIdAndDayLogDateGreaterThanEqual(userId, aYearAgo);
         this.updateChuanyunSelfCostList(updateList);
     }
 
@@ -115,9 +144,13 @@ public class LogUpdateService {
                 //
                 ChuanyunSelfWorkHourDTO chuanyunSelfWorkHourDTO = new ChuanyunSelfWorkHourDTO();
                 BeanUtils.copyProperties(chuanyunSelfWorkHourDO, chuanyunSelfWorkHourDTO);
+                chuanyunSelfWorkHourDTO.setWorkGroup(chuanyunSelfWorkHourDO.getWorkGroupName());
+                chuanyunSelfWorkHourDTO.setSubWorkGroup(chuanyunSelfWorkHourDO.getSubWorkGroupName());
                 // fixme 用户表中userId存在两条记录
-                ChuanyunUserCompanyDO chuanyunUserCompanyDO = chuanyunUserCompanyDao.findByUserId(chuanyunSelfWorkHourDO.getUserId());
-                if (chuanyunUserCompanyDO != null) {
+//                ChuanyunUserCompanyDO chuanyunUserCompanyDO = chuanyunUserCompanyDao.findByUserId(chuanyunSelfWorkHourDO.getUserId());
+                Optional<ChuanyunUserCompanyDO> firstUserOptional = chuanyunUserCompanyDao.findAllByUserIdOrderByModifiedTimeDesc(chuanyunSelfWorkHourDO.getUserId()).stream().findFirst();
+                if (firstUserOptional.isPresent()) {
+                    ChuanyunUserCompanyDO chuanyunUserCompanyDO = firstUserOptional.get();
                     chuanyunSelfWorkHourDTO.setUserName(chuanyunUserCompanyDO.getUserName());
                     chuanyunSelfWorkHourDTO.setBg(chuanyunSelfWorkHourDO.getBg());
                     //由于人员所在部门信息可能会表,所以每次更新的时候需要获取人员最新的部门信息
@@ -146,7 +179,12 @@ public class LogUpdateService {
         updateList.forEach(chuanyunWeekMemberHourDO -> {
             //更新氚云
             try {
-                String departmentId = chuanyunUserCompanyDao.findByUserId(chuanyunWeekMemberHourDO.getUserId()).getDepartmentId();
+//                String departmentId = chuanyunUserCompanyDao.findByUserId(chuanyunWeekMemberHourDO.getUserId()).getDepartmentId();
+                String departmentId = "";
+                Optional<ChuanyunUserCompanyDO> userCompanyDO = chuanyunUserCompanyDao.findAllByUserIdOrderByModifiedTimeDesc(chuanyunWeekMemberHourDO.getUserId()).stream().findFirst();
+                if (userCompanyDO.isPresent()) {
+                    departmentId = userCompanyDO.get().getDepartmentId();
+                }
                 ChuanyunWeekMemberHourDTO chuanyunWeekMemberHourDTO = new ChuanyunWeekMemberHourDTO();
                 chuanyunWeekMemberHourDTO.setProjectId(chuanyunWeekMemberHourDO.getProjectId());
                 chuanyunWeekMemberHourDTO.setUserId(chuanyunWeekMemberHourDO.getUserId());

+ 271 - 0
src/main/java/com/galaxis/manatee/service/WorkGroupService.java

@@ -0,0 +1,271 @@
+package com.galaxis.manatee.service;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.galaxis.manatee.dao.ChuanyunImplCostDao;
+import com.galaxis.manatee.dao.ChuanyunReimbursementDao;
+import com.galaxis.manatee.entity.chuanyun.data.object.*;
+import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunFindAllBizDTO;
+import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunFindAllBizReturnData;
+import com.galaxis.manatee.entity.chuanyun.dto.Filter;
+import com.galaxis.manatee.event.PushImplCostEvent;
+import com.galaxis.manatee.exception.BigSizeException;
+import com.galaxis.manatee.manager.ChuanYunManager;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * 工作组相关操作
+ */
+@Slf4j
+@Service
+public class WorkGroupService {
+
+    @Autowired
+    private ChuanYunManager chuanYunManager;
+
+    @Autowired
+    private ChuanyunImplCostDao implCostDao;
+
+    @Autowired
+    private ChuanyunReimbursementDao reimbursementDao;
+
+    @Autowired
+    private ApplicationContext applicationContext;
+
+
+    /**
+     * 汇算工作组级别实施费用
+     */
+    @Async
+    public void implCost() {
+        // 查询立项表中数据
+        List<ChuanyunBuildProject> buildProjectList = findAll();
+        ObjectMapper objectMapper = new ObjectMapper();
+        // 查询组织架构录入
+        buildProjectList.parallelStream().forEach(chuanyunBuildProject -> {
+            String buildProjectId = chuanyunBuildProject.getObjectId();
+            List<String> m1 = List.of("F0000001_2," + buildProjectId);
+            Filter filter = Filter.instance(0, 10, true, Filter.AND, m1);
+            ChuanyunFindAllBizDTO<Object> projectList = null;
+            try {
+                projectList = chuanYunManager.findAll(ChuanyunProjectOrganizationStructureDO.SCHEMA_CODE, filter);
+            } catch (JsonProcessingException e) {
+                e.printStackTrace();
+            }
+            if (projectList == null || projectList.getReturnData() == null) {
+                return;
+            }
+            List<ChuanyunProjectOrganizationStructureDO> projectOrganizationStructureList = objectMapper.convertValue(projectList.getReturnData().getBizObjectArray(), new TypeReference<>() {
+            });
+            List<String> parentIdList = projectOrganizationStructureList.stream().map(BasicDO::getObjectId).toList();
+            parentIdList.forEach(parentId -> {
+                // 查询工作组信息
+                List<String> m2 = List.of("parentObjectId_2," + parentId);
+                ChuanyunFindAllBizDTO<Object> workGroupResponse = null;
+                try {
+                    workGroupResponse = chuanYunManager.findAll(ChuanyunWorkGroupDO.SCHEMA_CODE, Filter.instance(0, 30, true, Filter.AND, m2));
+                } catch (JsonProcessingException e) {
+                    e.printStackTrace();
+                }
+                if (workGroupResponse == null || !workGroupResponse.getSuccessful()) {
+                    return;
+                }
+                if (workGroupResponse.getReturnData() == null) {
+                    return;
+                }
+                List<ChuanyunWorkGroupDO> workGroupList = objectMapper.convertValue(workGroupResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
+                });
+                workGroupList.forEach(chuanyunWorkGroupDO -> {
+                    // 查询该项目在总表中的记录
+                    List<String> m3 = List.of("F0000075_5,异常", "F0000002_2," + chuanyunBuildProject.getProjectCode());
+                    Filter instance = Filter.instance(0, 50, true, Filter.AND, m3);
+                    ChuanyunFindAllBizDTO<Object> groupProjectResponse = null;
+                    try {
+                        groupProjectResponse = chuanYunManager.findAll(ChuanyunGroupProjectDO.SCHEMA_CODE, instance);
+                    } catch (JsonProcessingException e) {
+                        e.printStackTrace();
+                    }
+                    if (!groupProjectResponse.getSuccessful() || groupProjectResponse.getReturnData() == null) {
+                        return;
+                    }
+                    List<Object> bizObjectArray = groupProjectResponse.getReturnData().getBizObjectArray();
+                    List<ChuanyunGroupProjectDO> groupProjectDOList = objectMapper.convertValue(bizObjectArray, new TypeReference<>() {
+                    });
+                    Optional<ChuanyunGroupProjectDO> groupProjectDO = groupProjectDOList.stream().findFirst();
+                    if (groupProjectDO.isPresent()) {
+                        ChuanyunGroupProjectDO chuanyunGroupProjectDO = groupProjectDO.get();
+                        List<String> userIdList = chuanyunWorkGroupDO.getSubWorkGroupMemberObject().stream().map(BasicSubDO::getObjectId).toList();
+                        // 查询报销单
+                        BigDecimal total = new BigDecimal("0.00");
+                        for (String userId : userIdList) {
+                            // 查询用户在该项目的报销单
+                            List<ChuanyunReimbursementDO> reimbursements = reimbursementDao.findAllByGroupProjectIdAndReimburseUserIdAndStatusIn(chuanyunGroupProjectDO.getObjectId(), userId, List.of(1, 2));
+                            BigDecimal totalReim = reimbursements.stream().map(ChuanyunReimbursementDO::getTotalAmountNotTaxed).reduce(BigDecimal.ZERO, BigDecimal::add);
+                            total = total.add(totalReim);
+                            /*Filter f = Filter.instance(0, 10, true, Filter.AND, List.of("F0000093_2," + chuanyunGroupProjectDO.getObjectId(), "F0000001_2," + userId));
+                            ChuanyunFindAllBizDTO<Object> reimbursementResponse = null;
+                            try {
+                                reimbursementResponse = chuanYunManager.findAll(ChuanyunReimbursementDO.SCHEMA_CODE, f);
+                            } catch (JsonProcessingException e) {
+                                e.printStackTrace();
+                            }
+                            if (!reimbursementResponse.getSuccessful() || reimbursementResponse.getReturnData() == null) {
+                                continue;
+                            }
+                            List<ChuanyunReimbursementDO> reimbursementDOList = objectMapper.convertValue(reimbursementResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
+                            });
+                            BigDecimal totalReim = reimbursementDOList.stream().map(ChuanyunReimbursementDO::getTotalAmountNotTaxed).reduce(BigDecimal.ZERO, BigDecimal::add);
+                            total = total.add(totalReim);*/
+
+                        }
+                        // 统计工作组所有的工时
+                        String projectObjectId = chuanyunGroupProjectDO.getObjectId();
+                        String projectCode = chuanyunGroupProjectDO.getProjectCode();
+                        String workGroupId = chuanyunWorkGroupDO.getObjectId();
+
+                        ChuanyunImplCostDO old = implCostDao.findByProjectIdAndProjectCodeAndWorkGroup(projectObjectId, projectCode, workGroupId);
+                        if (!Objects.isNull(old)) {
+                            BigDecimal oldImplCost = old.getImplCost();
+                            if (Objects.isNull(oldImplCost) || oldImplCost.compareTo(total) != 0) {
+                                old.setImplCost(total);
+                                implCostDao.save(old);
+                            }
+                        } else {
+                            ChuanyunImplCostDO chuanyunImplCostDO = new ChuanyunImplCostDO();
+                            chuanyunImplCostDO.setProjectId(projectObjectId);
+                            chuanyunImplCostDO.setProjectCode(projectCode);
+                            chuanyunImplCostDO.setWorkGroup(workGroupId);
+                            chuanyunImplCostDO.setWorkGroupName(chuanyunWorkGroupDO.getWorkGroupName());
+                            chuanyunImplCostDO.setImplCost(total);
+                            implCostDao.saveAndFlush(chuanyunImplCostDO);
+                        }
+                    }
+                });
+
+            });
+        });
+
+        // 上传至氚云数据库,发布上传事件
+        applicationContext.publishEvent(new PushImplCostEvent(this));
+
+
+    }
+
+    private List<ChuanyunBuildProject> findAll() {
+        ArrayList<ChuanyunBuildProject> buildProjects = new ArrayList<>();
+        int start = 0;
+        long totalCount = 0L;
+        boolean flag = true;
+        int pageSize = 100;
+        while (flag) {
+            try {
+                //从氚云查询数据
+                List<String> m = List.of("status_2,1");
+                var filter = Filter.instance(start, start + pageSize, true, Filter.AND, m);
+                var chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunBuildProject.SCHEMA_CODE, filter);
+                if (chuanyunFindAllResponse.getReturnData() == null || chuanyunFindAllResponse.getReturnData().getBizObjectArray() == null) {
+                    flag = false;
+                    continue;
+                }
+                if (chuanyunFindAllResponse.getReturnData().getTotalCount() >= start + pageSize) {
+                    start += pageSize;
+                } else {
+                    flag = false;
+                }
+                //获取项目总数
+                totalCount = chuanyunFindAllResponse.getReturnData().getTotalCount();
+                //保存
+                List<Object> bizObjectArray = chuanyunFindAllResponse.getReturnData().getBizObjectArray();
+                ObjectMapper objectMapper = new ObjectMapper();
+                List<ChuanyunBuildProject> bpList = objectMapper.convertValue(bizObjectArray, new TypeReference<>() {
+                });
+                buildProjects.addAll(bpList);
+                flag = false;
+            } catch (Exception e) {
+                log.error(e.getMessage());
+                e.printStackTrace();
+            }
+
+        }
+        return buildProjects;
+    }
+
+    @Async
+    public void pushToChuanyun() {
+
+        List<ChuanyunImplCostDO> all = implCostDao.findAll();
+        ObjectMapper objectMapper = new ObjectMapper();
+        all.forEach(implCostDO -> {
+            String projectId = implCostDO.getProjectId();
+            String projectCode = implCostDO.getProjectCode();
+            String workGroup = implCostDO.getWorkGroup();
+            List<String> m = List.of("F0000001_2," + projectId, "F0000002_2," + projectCode, "F0000006_2," + workGroup);
+            Filter filter = Filter.instance(0, 10, true, Filter.AND, m);
+            ChuanyunFindAllBizDTO<Object> implCostResponse = null;
+            try {
+                implCostResponse = chuanYunManager.findAll(ChuanyunImplCostDO.SCHEMA_CODE, filter);
+            } catch (JsonProcessingException e) {
+                log.error(e.getMessage());
+            }
+            assert implCostResponse != null;
+            if (implCostResponse.getSuccessful()) {
+                ChuanyunFindAllBizReturnData<Object> returnData = implCostResponse.getReturnData();
+                if (returnData != null && returnData.getBizObjectArray() != null) {
+                    List<ChuanyunImplCostDO> chuanyunImplCostDOList = objectMapper.convertValue(returnData.getBizObjectArray(), new TypeReference<>() {
+                    });
+                    Optional<ChuanyunImplCostDO> implCostOptional = chuanyunImplCostDOList.stream().findFirst();
+                    if (implCostOptional.isPresent()) {
+                        ChuanyunImplCostDO chuanyunImplCostDO = implCostOptional.get();
+                        if (chuanyunImplCostDO.getImplCost().compareTo(implCostDO.getImplCost()) != 0) {
+                            // 工作组实施费用发生变化
+                            log.info("更新项目工作组实施费用");
+                            ImplCostUpdateDTO implCostUpdateDTO = new ImplCostUpdateDTO(implCostDO.getImplCost());
+                            try {
+                                String updateStr = objectMapper.writeValueAsString(implCostUpdateDTO);
+                                chuanYunManager.update(ChuanyunImplCostDO.SCHEMA_CODE, chuanyunImplCostDO.getObjectId(), updateStr);
+                            } catch (JsonProcessingException | BigSizeException e) {
+                                log.error(e.getMessage());
+                            }
+                        }
+                    }
+
+                } else {
+                    // 直接保存
+                    try {
+                        String implCostStr = objectMapper.writeValueAsString(implCostDO);
+                        chuanYunManager.save(ChuanyunImplCostDO.SCHEMA_CODE, implCostStr, true);
+                    } catch (JsonProcessingException | BigSizeException e) {
+                        log.error(e.getMessage());
+                    }
+
+                }
+
+            }
+
+
+        });
+        log.info("上传项目工作组实施费用完成");
+
+    }
+
+    @Data
+    static class ImplCostUpdateDTO {
+        @JsonProperty("F0000004")
+        private BigDecimal implCost;
+
+        public ImplCostUpdateDTO(BigDecimal implCost) {
+            this.implCost = implCost;
+        }
+    }
+
+}

+ 4 - 2
src/main/java/com/galaxis/manatee/service/impl/ChuanyunServiceImpl.java

@@ -25,6 +25,7 @@ import javax.persistence.OneToMany;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * @author chongjiezhong
@@ -134,8 +135,9 @@ public class ChuanyunServiceImpl implements ChuanyunService {
                 result.forEach(chuanyunUpdateDeptDO ->  {
                     //更新拥有者id,更新所属部门
                     chuanyunUpdateDeptDO.setOwnerId(chuanyunUpdateDeptDO.getOwnerIdObject().getObjectId());
-                    ChuanyunUserCompanyDO chuanyunUserCompanyDO = chuanyunUserCompanyDao.findByUserId(chuanyunUpdateDeptDO.getOwnerIdObject().getObjectId());
-                    chuanyunUpdateDeptDO.setOwnerDepartmentId(chuanyunUserCompanyDO.getDepartmentId());
+                    Optional<ChuanyunUserCompanyDO> chuanyunUserCompanyDOOptional = chuanyunUserCompanyDao.findAllByUserIdOrderByModifiedTimeDesc(chuanyunUpdateDeptDO.getOwnerIdObject().getObjectId()).stream().findFirst();
+//                    ChuanyunUserCompanyDO chuanyunUserCompanyDO = chuanyunUserCompanyDao.findByUserId(chuanyunUpdateDeptDO.getOwnerIdObject().getObjectId());
+                    chuanyunUserCompanyDOOptional.ifPresent(userCompanyDO -> chuanyunUpdateDeptDO.setOwnerDepartmentId(userCompanyDO.getDepartmentId()));
                     ProjectUpdateDTO projectUpdateDTO = new ProjectUpdateDTO(chuanyunUpdateDeptDO);
                     try {
                         var groupProjectUpdateString=objectMapper.writeValueAsString(projectUpdateDTO);

+ 12 - 91
src/main/java/com/galaxis/manatee/task/ChuanyunBasicDataScheduledTask.java

@@ -27,6 +27,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
@@ -132,8 +133,7 @@ public class ChuanyunBasicDataScheduledTask {
     /**
      * 定时将氚云中的数据保存到manatee
      */
-    // fixme 暂时屏蔽
-//    @Scheduled(fixedDelay = 3600000L)
+    @Scheduled(fixedDelay = 3600000L)
     private void scheduledGroupProject() {
         //获取集团项目数据
         getGroupProject();
@@ -152,126 +152,41 @@ public class ChuanyunBasicDataScheduledTask {
      * 定时将氚云中的数据保存到manatee
      */
     @Scheduled(fixedDelay = 3600000L)
-    private void scheduledUserList() {
+    private void scheduledGetDate() {
         //获取用户数据
         getUserList();
-    }
-
-    /**
-     * 定时将氚云中的数据保存到manatee
-     */
-    @Scheduled(fixedDelay = 3600000L)
-    private void scheduledProjectType() {
         //支出档案类型
         getProjectType();
-    }
-
-    /**
-     * 定时将氚云中的数据保存到manatee
-     */
-    @Scheduled(fixedDelay = 3600000L)
-    private void scheduledAttachmentId() {
         //项目备件明细
         getAttachmentId();
-    }
-
-    /**
-     * 定时将氚云中的数据保存到manatee
-     */
-    @Scheduled(fixedDelay = 3600000L)
-    private void scheduledReimbursementSubject() {
         //获取报销科目
         getReimbursementSubject();
-    }
-
-    /**
-     * 定时将氚云中的数据保存到manatee
-     */
-    @Scheduled(fixedDelay = 3600000L)
-    private void scheduledCost() {
         //获取成本中心
         getCost();
-    }
-
-
-    /**
-     * 定时将氚云中的数据保存到manatee
-     */
-    @Scheduled(fixedDelay = 3600000L)
-    private void scheduledCompany() {
         //获取公司信息
         getCompany();
-    }
-
-    /**
-     * 定时将氚云中的数据保存到manatee
-     */
-    @Scheduled(fixedDelay = 3600000L)
-    private void scheduledSupplier() {
         //获取供应商
         getSupplier();
-    }
-
-    /**
-     * 定时将氚云中的数据保存到manatee
-     */
-    @Scheduled(fixedDelay = 3600000L)
-    private void scheduledReimbursementItems() {
         //人员报销特殊项目
         getReimbursementItems();
-    }
-
-    /**
-     * 定时将氚云中的数据保存到manatee
-     */
-    @Scheduled(fixedDelay = 3600000L)
-    private void scheduledCostCollection() {
         //人工成本特殊项目
         getCostCollection();
-    }
-
-    /**
-     * 定时将氚云中的数据保存到manatee
-     */
-    @Scheduled(fixedDelay = 3600000L)
-    private void scheduledSpecialProcedure() {
-
         //专项费用分摊
         getSpecialProcedure();
     }
 
     /**
      * 定时将氚云中的数据保存到manatee
+     * 修改为两天同步一次
      */
-    @Scheduled(fixedDelay = 3600000L)
-    private void scheduledAskForLeave() {
+    @Scheduled(fixedDelay = 172800000L)
+    private void scheduledPushData() {
         //钉钉请假
         saveAskForLeave();
-    }
-
-    /**
-     * 定时将氚云中的数据保存到manatee
-     */
-    @Scheduled(fixedDelay = 3600000L)
-    private void scheduledOutDepartment() {
         //更新受益部门名称
         getOutDepartment();
-    }
-
-    /**
-     * 定时将氚云中的数据保存到manatee
-     */
-    @Scheduled(fixedDelay = 3600000L)
-    private void scheduledBusinessEntertainment() {
         //更新业务招待申请
         updateBusinessEntertainment();
-    }
-
-    /**
-     * 定时将氚云中的数据保存到manatee
-     */
-    @Scheduled(fixedDelay = 3600000L)
-    private void scheduledProjectChange() {
         //项目实施变更
         saveProjectChange();
     }
@@ -582,6 +497,10 @@ public class ChuanyunBasicDataScheduledTask {
         });
     }
 
+    public void pushAskForLeave(){
+        saveAskForLeave();
+    }
+
     /**
      * 更新请假信息
      */
@@ -589,6 +508,7 @@ public class ChuanyunBasicDataScheduledTask {
         var objectMapper = new ObjectMapper();
         //获取请假的信息
         List<ChuanyunAskForLeaveDO> askForLeaveList = chuanyunAskForLeaveDao.findAll();
+        log.info("开始上传请假信息");
         askForLeaveList.forEach(askForLeave -> {
             try {
                 //根据钉钉号获取氚云用户Id
@@ -626,6 +546,7 @@ public class ChuanyunBasicDataScheduledTask {
                 e.printStackTrace();
             }
         });
+        log.info("新增请假信息完成");
     }
 
     /**

+ 43 - 33
src/main/java/com/galaxis/manatee/task/ChuanyunFinancialScheduledTask.java

@@ -5,8 +5,11 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.galaxis.manatee.dao.*;
 import com.galaxis.manatee.entity.chuanyun.data.object.*;
 import com.galaxis.manatee.entity.chuanyun.dto.Filter;
+import com.galaxis.manatee.event.ImplCostEvent;
 import com.galaxis.manatee.manager.ChuanYunManager;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
@@ -25,7 +28,10 @@ import java.util.NoSuchElementException;
 @Service
 public class ChuanyunFinancialScheduledTask {
 
-    private final Integer pageSize=20;
+    @Autowired
+    private ApplicationContext applicationContext;
+
+    private final Integer pageSize = 100;
     private final ChuanYunManager chuanYunManager;
     private final ChuanyunReimbursementDao chuanyunReimbursementDao;
     private final ChuanyunCompanyDao chuanyunCompanyDao;
@@ -50,7 +56,7 @@ public class ChuanyunFinancialScheduledTask {
      * 将报销信息从氚云中同步
      */
     @Scheduled(cron = "0 0 2 * * *")
-    private void reimbursementInformationSync(){
+    private void reimbursementInformationSync() {
         getReimbursementFromChuanyun();
     }
 
@@ -65,53 +71,54 @@ public class ChuanyunFinancialScheduledTask {
         List<String> matchersString=new ArrayList<>();
 //        matchersString.add("Status_2,1");
         matchersString.add("Status_6,[1;2;3]");
-        while (flag){
+        while (flag) {
             try {
                 //从氚云查询数据
-                var filter= Filter.instance(start,start+pageSize,true,Filter.AND,matchersString);
-                var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunReimbursementDO.SCHEMA_CODE,filter);
-                if(chuanyunFindAllResponse.getReturnData()==null){
-                    flag=false;
+                var filter = Filter.instance(start, start + pageSize, true, Filter.AND, matchersString);
+                var chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunReimbursementDO.SCHEMA_CODE, filter);
+                if (chuanyunFindAllResponse.getReturnData() == null) {
+                    flag = false;
                     continue;
                 }
-                if(chuanyunFindAllResponse.getReturnData().getTotalCount()>=start+pageSize){
-                    start+=pageSize;
-                }else{
-                    flag=false;
+                if (chuanyunFindAllResponse.getReturnData().getTotalCount() >= start + pageSize) {
+                    start += pageSize;
+                } else {
+                    flag = false;
                 }
                 //转化为POJO
-                List<ChuanyunReimbursementDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                List<ChuanyunReimbursementDO> result = objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
+                });
                 //获取项目总数
-                totalCount=chuanyunFindAllResponse.getReturnData().getTotalCount();
+                totalCount = chuanyunFindAllResponse.getReturnData().getTotalCount();
                 //保存
-                result.forEach(chuanyunReimbursementDO -> {
-                    try{
+                result.parallelStream().forEach(chuanyunReimbursementDO -> {
+                    try {
                         //找到以前的数据的话就删除
                         chuanyunReimbursementDao.delete(chuanyunReimbursementDao.findById(chuanyunReimbursementDO.getObjectId()).orElseThrow());
-                    }catch (NoSuchElementException e){
+                    } catch (NoSuchElementException e) {
                         //没有之前的数据不做处理
                     }
 
                     //将报销单中关联信息的id转化为具体的数据
-                    try{
-                        ChuanyunCompanyDO chuanyunCompanyDO=chuanyunCompanyDao.findById(chuanyunReimbursementDO.getBeneficiaryId()).orElseThrow();
-                        if("对公".equals(chuanyunReimbursementDO.getPrivateOrPublic())&&!StringUtils.isEmpty(chuanyunReimbursementDO.getSupplierId())){
-                            ChuanyunSupplierDO chuanyunSupplierDO=chuanyunSupplierDao.findById(chuanyunReimbursementDO.getSupplierId()).orElseThrow();
+                    try {
+                        ChuanyunCompanyDO chuanyunCompanyDO = chuanyunCompanyDao.findById(chuanyunReimbursementDO.getBeneficiaryId()).orElseThrow();
+                        if ("对公".equals(chuanyunReimbursementDO.getPrivateOrPublic()) && !StringUtils.isEmpty(chuanyunReimbursementDO.getSupplierId())) {
+                            ChuanyunSupplierDO chuanyunSupplierDO = chuanyunSupplierDao.findById(chuanyunReimbursementDO.getSupplierId()).orElseThrow();
                             chuanyunReimbursementDO.setSupplierCode(chuanyunSupplierDO.getSupplierCode());
                         }
-                        StringBuilder chuanyunGroupProjectCode=new StringBuilder();
-                        if(!StringUtils.isEmpty(chuanyunReimbursementDO.getGroupProjectId())){
-                            ChuanyunGroupProjectDO chuanyunGroupProjectDO=chuanyunGroupProjectDao.findById(chuanyunReimbursementDO.getGroupProjectId()).orElseThrow();
+                        StringBuilder chuanyunGroupProjectCode = new StringBuilder();
+                        if (!StringUtils.isEmpty(chuanyunReimbursementDO.getGroupProjectId())) {
+                            ChuanyunGroupProjectDO chuanyunGroupProjectDO = chuanyunGroupProjectDao.findById(chuanyunReimbursementDO.getGroupProjectId()).orElseThrow();
                             chuanyunReimbursementDO.setGroupProjectCode(chuanyunGroupProjectDO.getProjectCode());
                             chuanyunGroupProjectCode.append(chuanyunGroupProjectDO.getProjectCode());
                         }
                         chuanyunReimbursementDO.setReimburseUserId(chuanyunReimbursementDO.getReimburseUserObject().getObjectId());
-                        ChuanyunUserDO chuanyunUserDO=chuanyunUserDao.findById(chuanyunReimbursementDO.getReimburseUserId()).orElseThrow();
-                        List<ChuanyunUserCompanyDO> userCompanyList=chuanyunUserCompanyDao.findAllByUserId(chuanyunReimbursementDO.getReimburseUserId());
-                        if(userCompanyList.size()!=1){
-                            log.error(chuanyunUserDO.getName()+chuanyunReimbursementDO.getReimburseUserId());
-                        }else{
-                            ChuanyunUserCompanyDO chuanyunUserCompany=userCompanyList.get(0);
+                        ChuanyunUserDO chuanyunUserDO = chuanyunUserDao.findById(chuanyunReimbursementDO.getReimburseUserId()).orElseThrow();
+                        List<ChuanyunUserCompanyDO> userCompanyList = chuanyunUserCompanyDao.findAllByUserId(chuanyunReimbursementDO.getReimburseUserId());
+                        if (userCompanyList.size() != 1) {
+                            log.error(chuanyunUserDO.getName() + chuanyunReimbursementDO.getReimburseUserId());
+                        } else {
+                            ChuanyunUserCompanyDO chuanyunUserCompany = userCompanyList.get(0);
                             chuanyunReimbursementDO.setReimburseUserCostCode(chuanyunUserCompany.getCostCode());
                         }
 //                        ChuanyunCostDO chuanyunCostDO=chuanyunCostDao.findById(chuanyunReimbursementDO.getBeneficiaryCostId()).orElseThrow();
@@ -126,25 +133,28 @@ public class ChuanyunFinancialScheduledTask {
                         chuanyunReimbursementDO.setSettlementMethod("101");
                         chuanyunReimbursementDO.setErpFlag(0);
                         chuanyunReimbursementDO.getDetailList().forEach(chuanyunReimbursementDetailDO -> {
-                            ChuanyunReimbursementSubjectDO chuanyunReimbursementSubjectDO=chuanyunReimbursementSubjectDao.findById(chuanyunReimbursementDetailDO.getReimburseSubjectId()).orElseThrow();
+                            ChuanyunReimbursementSubjectDO chuanyunReimbursementSubjectDO = chuanyunReimbursementSubjectDao.findById(chuanyunReimbursementDetailDO.getReimburseSubjectId()).orElseThrow();
                             chuanyunReimbursementDetailDO.setReimburseSubjectCode(chuanyunReimbursementSubjectDO.getSubjectCode());
                             chuanyunReimbursementDetailDO.setReimburseSubjectName(chuanyunReimbursementSubjectDO.getSubjectName());
                             chuanyunReimbursementDetailDO.setReimburseUserCompanyCode(chuanyunCompanyDO.getErpCode());
                             chuanyunReimbursementDetailDO.setGroupProjectCode(chuanyunGroupProjectCode.toString());
 //                            chuanyunReimbursementDetailDO.setReimburseUserCostCode(chuanyunCostDO.getCostCode());
                         });
-                    }catch (Exception e){
+                    } catch (Exception e) {
                         log.warn(e.getMessage());
                         e.printStackTrace();
                     }
+
                 });
                 chuanyunReimbursementDao.saveAll(result);
-            }catch (Exception e){
+            } catch (Exception e) {
                 log.error(e.getMessage());
                 e.printStackTrace();
             }
         }
-        log.info("报销信息保存保存"+totalCount);
+        log.info("报销信息保存保存" + totalCount);
+        // 发布事件汇总工作组实施费用
+        applicationContext.publishEvent(new ImplCostEvent(this));
     }
 
 

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

@@ -58,7 +58,7 @@ public class ChuanyunHumanResourceScheduledTask {
     }
 
     /**
-     * 每天3点更新日志记录
+     * 每天16点更新日志记录
      */
     @Scheduled(cron = "0 0 16 * * ?")
     private void updateLog() {

+ 11 - 19
src/main/java/com/galaxis/manatee/task/LogCheckTask.java

@@ -34,25 +34,17 @@ public class LogCheckTask {
      * 2.遍历每个用户,核对每周、每月工时准确性
      * 3.遍历每个项目核对每个项目总工时
      */
-    @Scheduled(fixedDelay = 432000000L)
-    private void checkLod(){
-        chuanyunUserCompanyDao.findAll().forEach(chuanyunUserCompanyDO -> {
-            long start=System.currentTimeMillis();
-            try {
-                //核对原始数据和标准化每日工时
-                logCheckService.checkDayWorkHour(chuanyunUserCompanyDO.getUserId());
-                logCheckService.checkWeekWorkHour(chuanyunUserCompanyDO.getUserId());
-                logCheckService.checkMonthWorkHour(chuanyunUserCompanyDO.getUserId());
-            } catch (Exception e) {
-                log.error(""+chuanyunUserCompanyDO);
-                log.error(e.getMessage());
-            }
-            log.info("修改"+chuanyunUserCompanyDO.getUserName()+"工时信息耗时"+(System.currentTimeMillis()-start));
-        });
+    @Scheduled(fixedDelay = 432000000L, initialDelay = 3600000L)
+    private void checkLod() {
+        //核对原始数据和标准化每日工时
+//                logCheckService.checkDayWorkHour(chuanyunUserCompanyDO.getUserId());
+//                logCheckService.checkWeekWorkHour(chuanyunUserCompanyDO.getUserId());
+//                logCheckService.checkMonthWorkHour(chuanyunUserCompanyDO.getUserId());
 
-//        List<String> allUserIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
-//        logCheckService.checkHalfYearDayWorkHour(allUserIdList);
-//        logCheckService.checkHalfYearWeekWorkHour(allUserIdList);
-//        logCheckService.checkHalfYearMonthWorkHour(allUserIdList);
+        List<String> allUserIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        List<String> disUserIdList = allUserIdList.stream().distinct().collect(Collectors.toList());
+        logCheckService.checkDayWorkHourTimeAfter(disUserIdList, 90);
+        logCheckService.checkWeekWorkHour(disUserIdList);
+        logCheckService.checkMonthWorkHour(disUserIdList);
     }
 }

+ 72 - 0
src/main/java/com/galaxis/manatee/task/ProjectOrganizationStructureTask.java

@@ -0,0 +1,72 @@
+package com.galaxis.manatee.task;
+
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunProjectOrganizationStructureDO;
+import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunFindAllBizDTO;
+import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunFindAllBizReturnData;
+import com.galaxis.manatee.entity.chuanyun.dto.Filter;
+import com.galaxis.manatee.manager.ChuanYunManager;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@Slf4j
+public class ProjectOrganizationStructureTask {
+
+    @Autowired
+    private ChuanYunManager chuanYunManager;
+
+//    @Autowired
+//    private ProjectOrganizationStructureDao projectOrganizationStructureDao;
+
+    /**
+     * 存储项目组织架构和工作组数据
+     */
+    public void syncData() {
+        // 查询项目组织架构录入数据
+        try {
+            List<ChuanyunProjectOrganizationStructureDO> allPos = getAll();
+//            projectOrganizationStructureDao.saveAll(allPos);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    private List<ChuanyunProjectOrganizationStructureDO> getAll() throws Exception {
+        List<ChuanyunProjectOrganizationStructureDO> result = new ArrayList<>();
+        var start = 0;
+        var totalCount = 0L;
+        var flag = true;
+        var pageSize = 100;
+        while (flag) {
+            Filter filter = Filter.instance(start, start + pageSize, true);
+            ChuanyunFindAllBizDTO<Object> response = chuanYunManager.findAll(ChuanyunProjectOrganizationStructureDO.SCHEMA_CODE, filter);
+            ChuanyunFindAllBizReturnData<Object> returnData = response.getReturnData();
+            if (!response.getSuccessful() || returnData == null) {
+                flag = false;
+                continue;
+            }
+            totalCount = returnData.getTotalCount();
+            if (totalCount >= start + pageSize) {
+                start += pageSize;
+            } else {
+                flag = false;
+            }
+            List<Object> bizObjectArray = returnData.getBizObjectArray();
+            ObjectMapper objectMapper = new ObjectMapper();
+            List<ChuanyunProjectOrganizationStructureDO> posList = objectMapper.convertValue(bizObjectArray, new TypeReference<>() {
+            });
+            result.addAll(posList);
+        }
+        return result;
+
+    }
+
+}

+ 9 - 3
src/main/java/com/galaxis/manatee/task/SubWorkHourStatistics.java

@@ -22,6 +22,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 @Service
 @Slf4j
@@ -45,7 +46,7 @@ public class SubWorkHourStatistics {
 
 
 
-    @Scheduled(fixedDelay = 86400000L)
+    @Scheduled(fixedDelay = 86400000L, initialDelay = 3600000L)
     public void updateHour(){
         standardWorkHour();
         updateAllChuanyunSelfSubWorkHour();
@@ -61,7 +62,7 @@ public class SubWorkHourStatistics {
             List<ChuanyunSubWorkHourDO> list = chuanyunSubProjectDao.getSubSelfWorkHour(chuanyunUserCompanyDO.getUserId());
             if (list!=null&&list.size()>0){
                 list.forEach(chuanyunSubWorkHourDO -> {
-                    log.info("gongshi:"+chuanyunSubWorkHourDO);
+                    log.info("用户子项目每日工时标准化: {}:", chuanyunUserCompanyDO);
                     ChuanyunSelfSubWorkHourDO chuanyunSelfSubWorkHourDO = new ChuanyunSelfSubWorkHourDO();
                     chuanyunSelfSubWorkHourDO.setBg(chuanyunSubWorkHourDO.getBg());
                     chuanyunSelfSubWorkHourDO.setUserId(chuanyunSubWorkHourDO.getUserId());
@@ -179,7 +180,12 @@ public class SubWorkHourStatistics {
             List<ChuanyunSubWeekHourDO> list = chuanyunSubWeekHourDao.findByUserId(chuanyunUserCompanyDO.getUserId());
             if (list!=null&&list.size()>0){
                 list.forEach(chuanyunSubWeekHourDO -> {
-                    String departmentId = chuanyunUserCompanyDao.findByUserId(chuanyunSubWeekHourDO.getUserId()).getDepartmentId();
+//                    String departmentId = chuanyunUserCompanyDao.findByUserId(chuanyunSubWeekHourDO.getUserId()).getDepartmentId();
+                    String departmentId = "";
+                    Optional<ChuanyunUserCompanyDO> userCompanyDO = chuanyunUserCompanyDao.findAllByUserIdOrderByModifiedTimeDesc(chuanyunSubWeekHourDO.getUserId()).stream().findFirst();
+                    if (userCompanyDO.isPresent()) {
+                        departmentId = userCompanyDO.get().getDepartmentId();
+                    }
                     ChuanyunWeekMemberHourDTO chuanyunWeekMemberHourDTO = new ChuanyunWeekMemberHourDTO();
                     chuanyunWeekMemberHourDTO.setProjectId(chuanyunSubWeekHourDO.getProjectId());
                     chuanyunWeekMemberHourDTO.setUserId(chuanyunSubWeekHourDO.getUserId());

+ 1 - 1
src/main/java/com/galaxis/manatee/task/U9InfoTask.java

@@ -56,7 +56,7 @@ public class U9InfoTask {
         this.chuanyunSupplierDao = chuanyunSupplierDao;
     }
 
-    @Scheduled(fixedDelay = 3600000L)
+    @Scheduled(fixedDelay = 3600000L,initialDelay = 3600000L)
     private void getDataFromU9() {
 //        savePurCost();
 //        saveCashFlow();

+ 21 - 5
src/main/java/com/galaxis/manatee/task/WorkHourStatistics.java

@@ -59,12 +59,28 @@ public class WorkHourStatistics {
     }
 
     /**
-     * 更新数据到氚云
+     * 标准化周工时和月工时
      */
-//    @Scheduled(fixedDelay = 86400000L)
-    public void updateWorkHour(){
-//        logService.updateAllChuanyunWeekMemberHour();
-//        logService.updateAllChuanyunSelfCost();
+    @Scheduled(fixedDelay = 172800000L ,initialDelay = 7200000L)
+    public void standardWeekAndMonthWorkHour(){
+        // 标准化周工时
+        log.info("开始标准化周工时");
+        logService.standardOneYearWeekMemberHour();
+        // 标准化月工时
+        log.info("开始标准化月工时");
+        logService.standardOneYearSelfCost();
+    }
+
+
+    /**
+     * 上传周工时和月工时至氚云
+     */
+    @Scheduled(fixedDelay = 172800000L, initialDelay = 7200000L)
+    public void pushWorkHour(){
+        log.info("开始上传标准化周工时");
+        logService.pushLastYearToPresentWeekMemberHour();
+        log.info("开始上传标准化月工时");
+        logService.pushOneYearChuanyunSelfCost();
     }
 
     /**

+ 19 - 0
src/main/java/com/galaxis/manatee/util/StringUtil.java

@@ -0,0 +1,19 @@
+package com.galaxis.manatee.util;
+
+public class StringUtil {
+
+    public static String getCharacters(String str) {
+        String reg = "[^\u4e00-\u9fa5]";
+        str = str.replaceAll(reg, " ");
+        return str.trim();
+    }
+
+    public static String getDepartmentName(String str) {
+        if (str.contains("/")) {
+            String[] department = str.split("/");
+            return department[department.length - 1];
+        } else {
+            return str;
+        }
+    }
+}

+ 2 - 2
src/main/resources/application.yml

@@ -10,11 +10,11 @@ dingTalk:
   #获取token的uri
   getTokenUri: https://oapi.dingtalk.com/gettoken
   #钉钉appKey
-  appKey : ding8orokzhrrnfc898k
+  appKey: ding8orokzhrrnfc898k
   #钉钉AgentId
   AgentId: 345024272
   #钉钉appSecret
-  appSecret : xIwNfl7lVIBwQgKeLBNsDOuKZ-KJWRRBnr_we_-S3GFP32BkdeWzVMsm8z-rTJv8
+  appSecret: xIwNfl7lVIBwQgKeLBNsDOuKZ-KJWRRBnr_we_-S3GFP32BkdeWzVMsm8z-rTJv8
   processUrl:
     #获取审批列表
     listIds: https://oapi.dingtalk.com/topapi/processinstance/listids