Forráskód Böngészése

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

xuj 4 éve
szülő
commit
4cf153e828
33 módosított fájl, 2220 hozzáadás és 714 törlés
  1. 5 8
      src/main/java/com/galaxis/manatee/controller/GetController.java
  2. 2 0
      src/main/java/com/galaxis/manatee/dao/ChuanyunGroupProjectDao.java
  3. 10 0
      src/main/java/com/galaxis/manatee/dao/ChuanyunOutDepartmentDao.java
  4. 17 13
      src/main/java/com/galaxis/manatee/dao/ChuanyunProjectCostDao.java
  5. 11 0
      src/main/java/com/galaxis/manatee/dao/ChuanyunSelfCostDao.java
  6. 37 0
      src/main/java/com/galaxis/manatee/dao/ChuanyunSelfWorkHourDao.java
  7. 39 1
      src/main/java/com/galaxis/manatee/dao/ChuanyunWeekMemberHourDao.java
  8. 78 2
      src/main/java/com/galaxis/manatee/dao/ChuanyunWorkHourDao.java
  9. 28 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunDevelopProjectDO.java
  10. 27 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunManagerProjectDO.java
  11. 5 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunOutDepartmentDO.java
  12. 0 2
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunProjectCostDO.java
  13. 12 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunReimbursementDO.java
  14. 28 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunSaleProjectDO.java
  15. 42 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunU9DepartmentDO.java
  16. 16 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/dto/ChuanyunDeviceConfigureDTO.java
  17. 14 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/dto/ChuanyunDeviceConfigurePrimaryKey.java
  18. 15 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/dto/ChuanyunDeviceDTO.java
  19. 17 4
      src/main/java/com/galaxis/manatee/manager/ClawFeign.java
  20. 6 4
      src/main/java/com/galaxis/manatee/service/ChuanyunService.java
  21. 5 16
      src/main/java/com/galaxis/manatee/service/DingTalkScheduledTask.java
  22. 116 0
      src/main/java/com/galaxis/manatee/service/ProjectMemberService.java
  23. 106 71
      src/main/java/com/galaxis/manatee/service/impl/ChuanyunServiceImpl.java
  24. 32 425
      src/main/java/com/galaxis/manatee/task/ChuanyunBasicDataScheduledTask.java
  25. 0 45
      src/main/java/com/galaxis/manatee/task/ChuanyunFinancialScheduledTask.java
  26. 18 1
      src/main/java/com/galaxis/manatee/task/ChuanyunHumanResourceScheduledTask.java
  27. 78 52
      src/main/java/com/galaxis/manatee/task/ChuanyunProjectScheduledTask.java
  28. 252 0
      src/main/java/com/galaxis/manatee/task/EquipmentInfoTask.java
  29. 505 0
      src/main/java/com/galaxis/manatee/task/U9InfoTask.java
  30. 97 53
      src/main/java/com/galaxis/manatee/task/WorkHourStatistics.java
  31. 573 0
      src/main/java/com/galaxis/manatee/task/WorkHourStatisticsRecently.java
  32. 23 11
      src/main/java/com/galaxis/manatee/webservice/CountryEndpoint.java
  33. 6 6
      src/main/resources/application.yml

+ 5 - 8
src/main/java/com/galaxis/manatee/controller/GetController.java

@@ -134,14 +134,6 @@ public class GetController {
     }
 
     /**
-     * 将领导从特定项目中剔除
-     */
-    @GetMapping("/test/deleteProjectMember")
-    public void deleteProjectMember() {
-        chuanyunService.deleteProjectMember();
-    }
-
-    /**
      * 导入设备配置信息
      * @param file
      */
@@ -151,5 +143,10 @@ public class GetController {
         chuanyunService.importEquipment(list);
     }
 
+//    @GetMapping("/test/updateMember")
+//    public void updateMember(){
+//        chuanyunBasicDataScheduledTask.chuanyunUpdateProjectMemberManually();
+//    }
+
 
 }

+ 2 - 0
src/main/java/com/galaxis/manatee/dao/ChuanyunGroupProjectDao.java

@@ -15,4 +15,6 @@ import org.springframework.stereotype.Repository;
 public interface ChuanyunGroupProjectDao extends GalaxisRepository<ChuanyunGroupProjectDO,String> {
 
     Page<ChuanyunGroupProjectDO> findAllByStatus(int status,Pageable pageable);
+
+    ChuanyunGroupProjectDO findByProjectCode(String projectCode);
 }

+ 10 - 0
src/main/java/com/galaxis/manatee/dao/ChuanyunOutDepartmentDao.java

@@ -0,0 +1,10 @@
+package com.galaxis.manatee.dao;
+
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunOutDepartmentDO;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ChuanyunOutDepartmentDao extends JpaRepository<ChuanyunOutDepartmentDO,String> {
+
+}

+ 17 - 13
src/main/java/com/galaxis/manatee/dao/ChuanyunProjectCostDao.java

@@ -4,6 +4,7 @@ import com.galaxis.capsule.util.GalaxisRepository;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunMemberCostDO;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunProjectCostDO;
 import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -19,27 +20,30 @@ public interface ChuanyunProjectCostDao extends GalaxisRepository<ChuanyunProjec
      * 获取项目总工时成本
      * @return  项目总工时
      */
-    @Query(value="SELECT chuanyun_member_cost.object_id," +
-            "SUM(chuanyun_member_cost.cost) AS cost," +
-            "SUM(chuanyun_member_cost.total_hour) AS total_hour," +
-            "SUM(chuanyun_member_cost.person_days) AS person_days," +
-            "chuanyun_member_cost.project_type," +
-            "chuanyun_member_cost.status," +
-            "chuanyun_member_cost.project_id, " +
-            "chuanyun_member_cost.cost AS amount" +
-            " FROM chuanyun_member_cost " +
-            "GROUP BY chuanyun_member_cost.project_id,"+
-            "chuanyun_member_cost.status",
+    @Query(value="SELECT SUM(chuanyun_self_work_hour.standard_work_hour) AS total_hour," +
+            "SUM(chuanyun_self_work_hour.standard_work_hour)/8 AS person_days,chuanyun_self_work_hour.project_id," +
+            "chuanyun_self_work_hour.project_type,chuanyun_self_work_hour.`status` ,chuanyun_self_work_hour.object_id \n" +
+            "FROM chuanyun_self_work_hour where project_id!='' GROUP BY chuanyun_self_work_hour.project_id,chuanyun_self_work_hour.project_type," +
+            "chuanyun_self_work_hour.`status`",
             nativeQuery = true)
     List<ChuanyunProjectCostDO> getProjectCost();
 
+    @Query(value="SELECT SUM(chuanyun_self_work_hour.standard_work_hour) AS total_hour," +
+            "SUM(chuanyun_self_work_hour.standard_work_hour)/8 AS person_days,chuanyun_self_work_hour.project_id," +
+            "chuanyun_self_work_hour.project_type,chuanyun_self_work_hour.`status` ,chuanyun_self_work_hour.object_id \n" +
+            "FROM chuanyun_self_work_hour  WHERE project_id=?1 AND project_type = ?2 AND `status`=2 " +
+            "GROUP BY chuanyun_self_work_hour.project_id,chuanyun_self_work_hour.project_type," +
+            "chuanyun_self_work_hour.`status`",
+            nativeQuery = true)
+    ChuanyunProjectCostDO getProcessProjectCost(@Param("projectId")String projectId,@Param("projectType")String projectType);
+
     /**
      * 根据项目号获取工时数据
      * @param projectId 项目Id
      * @return  项目工时对象
      */
-    ChuanyunProjectCostDO findByProjectId(String projectId);
+    ChuanyunProjectCostDO findByProjectIdAndProjectTypeAndStatus(String projectId,String projectType,String status);
 
     @Transactional
-    void deleteAllByStatus(String status);
+    void deleteByProjectIdAndProjectTypeAndStatus(String projectId,String projectType,String status);
 }

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

@@ -3,6 +3,8 @@ package com.galaxis.manatee.dao;
 import com.galaxis.capsule.util.GalaxisRepository;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunSelfCostDO;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunSelfWorkHourDO;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
@@ -30,6 +32,15 @@ public interface ChuanyunSelfCostDao extends GalaxisRepository<ChuanyunSelfCostD
     List<ChuanyunSelfCostDO> getMemberCost();
 
     /**
+     * 获取最近一个月工时
+     * @param pagerequest
+     * @return
+     */
+    @Query(value="SELECT * FROM chuanyun_self_cost WHERE MONTH(chuanyun_self_cost.day_log_date)>=(MONTH(NOW())-1) AND YEAR(chuanyun_self_cost.day_log_date)=YEAR(NOW())"
+            ,countQuery="SELECT COUNT(1) FROM chuanyun_self_cost WHERE MONTH(chuanyun_self_cost.day_log_date)>=(MONTH(NOW())-1) AND YEAR(chuanyun_self_cost.day_log_date)=YEAR(NOW())",nativeQuery = true)
+    Page<ChuanyunSelfCostDO> getRecentlyMonthHour(PageRequest pagerequest);
+
+    /**
      * 根据用户ID和项目ID,日期获取工时成本数据
      * @param userId    用户Id
      * @param projectId 项目Id

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

@@ -4,10 +4,13 @@ package com.galaxis.manatee.dao;
 import com.galaxis.capsule.util.GalaxisRepository;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunSelfWorkHourDO;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunWorkHourDO;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
+import java.awt.print.Pageable;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -38,6 +41,15 @@ public interface ChuanyunSelfWorkHourDao extends GalaxisRepository<ChuanyunSelfW
     List<ChuanyunSelfWorkHourDO> findAllByUserIdAndProjectIdAndProjectTypeAndStatusAndDayLogDateBetween(String userId,String projectId,String projectType,String status,LocalDateTime start,LocalDateTime end);
 
     /**
+     * 获取最近一个月日工时
+     * @param pageable
+     * @return
+     */
+    @Query(value="SELECT * FROM chuanyun_self_work_hour WHERE DATE_SUB(CURDATE(), INTERVAL 1 MONTH) <= date(chuanyun_self_work_hour.day_log_date)\n",
+            countQuery="SELECT count(1) FROM chuanyun_self_work_hour WHERE DATE_SUB(CURDATE(), INTERVAL 1 MONTH) <= date(chuanyun_self_work_hour.day_log_date)\n",nativeQuery = true)
+    Page<ChuanyunSelfWorkHourDO> getRecentlyDayHour(PageRequest pageable);
+
+    /**
      * 获取人员-项目-月度标准总工时
      * @param userId    用户ID
      * @return  汇总数据
@@ -59,6 +71,31 @@ public interface ChuanyunSelfWorkHourDao extends GalaxisRepository<ChuanyunSelfW
             nativeQuery = true)
     List<ChuanyunSelfWorkHourDO> getMonthProjectHour(String userId);
 
+
+    /**
+     * 获取最近一个月工时
+     * @param userId
+     * @return
+     */
+    @Query(value="SELECT SUM(chuanyun_self_work_hour.standard_work_hour) AS standard_work_hour," +
+            "chuanyun_self_work_hour.day_log_date," +
+            "chuanyun_self_work_hour.user_id," +
+            "chuanyun_self_work_hour.project_id," +
+            "chuanyun_self_work_hour.project_type," +
+            "chuanyun_self_work_hour.status," +
+            "chuanyun_self_work_hour.object_id " +
+            "FROM chuanyun_self_work_hour " +
+            "WHERE chuanyun_self_work_hour.user_id=? " +
+            "AND MONTH(chuanyun_self_work_hour.day_log_date)>=(MONTH(NOW())-1) " +
+            "AND YEAR(chuanyun_self_work_hour.day_log_date)=YEAR(NOW()) " +
+            "GROUP BY chuanyun_self_work_hour.user_id," +
+            "DATE_FORMAT(chuanyun_self_work_hour.day_log_date,'%Y-%m')," +
+            "chuanyun_self_work_hour.project_id," +
+            "chuanyun_self_work_hour.status," +
+            "chuanyun_self_work_hour.project_type",
+            nativeQuery = true)
+    List<ChuanyunSelfWorkHourDO> getMonthProjectHourRecently(String userId);
+
     /**
      * 获取人员月度标准工时汇总
      * @param userId    用户ID

+ 39 - 1
src/main/java/com/galaxis/manatee/dao/ChuanyunWeekMemberHourDao.java

@@ -3,6 +3,8 @@ package com.galaxis.manatee.dao;
 import com.galaxis.capsule.util.GalaxisRepository;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunProjectCostDO;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunWeekMemberHourDO;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
@@ -33,7 +35,7 @@ public interface ChuanyunWeekMemberHourDao extends GalaxisRepository<ChuanyunWee
             "project_type," +
             "`status`" +
             "FROM chuanyun_self_work_hour " +
-            "WHERE project_id !='' " +
+            "WHERE project_id !='' and LENGTH(user_id) = CHAR_LENGTH(user_id)" +
             "GROUP BY chuanyun_self_work_hour.project_id," +
             "chuanyun_self_work_hour.project_type," +
             "chuanyun_self_work_hour.user_id," +
@@ -43,6 +45,41 @@ public interface ChuanyunWeekMemberHourDao extends GalaxisRepository<ChuanyunWee
     List<ChuanyunWeekMemberHourDO> getWeekMemberHour();
 
     /**
+     * 获取最近一个月周工时
+     * @return
+     */
+    @Query(value="SELECT chuanyun_self_work_hour.object_id," +
+            "DATE_FORMAT(day_log_date,'%Y') as year," +
+            "WEEKOFYEAR(chuanyun_self_work_hour.day_log_date) AS week," +
+            "project_id,user_id," +
+            "SUM(standard_work_hour)AS standard_work_hour," +
+            "project_type," +
+            "`status`" +
+            "FROM chuanyun_self_work_hour " +
+            "WHERE project_id !='' " +
+            "AND WEEKOFYEAR(chuanyun_self_work_hour.day_log_date)>=(WEEKOFYEAR(NOW())-4)" +
+            "AND DATE_FORMAT(day_log_date,'%Y')=YEAR(NOW()) " +
+            "and LENGTH(user_id) = CHAR_LENGTH(user_id) " +
+            "GROUP BY chuanyun_self_work_hour.project_id," +
+            "chuanyun_self_work_hour.project_type," +
+            "chuanyun_self_work_hour.user_id," +
+            "DATE_FORMAT(day_log_date,'%Y')," +
+            "WEEKOFYEAR(chuanyun_self_work_hour.day_log_date)," +
+            "chuanyun_self_work_hour.`status`",nativeQuery = true)
+    List<ChuanyunWeekMemberHourDO> getWeekMemberHourRecently();
+
+
+    /**
+     * 获取最近一个月周工时
+     * @param
+     * @param pagerequest
+     * @return
+     */
+    @Query(value="SELECT * FROM chuanyun_week_member_hour WHERE chuanyun_week_member_hour.`week` >= (WEEKOFYEAR(NOW())-4) AND chuanyun_week_member_hour.`year`=YEAR(NOW())",
+            countQuery="SELECT COUNT(1) FROM chuanyun_week_member_hour WHERE chuanyun_week_member_hour.`week` >= (WEEKOFYEAR(NOW())-4) AND chuanyun_week_member_hour.`year`=YEAR(NOW())",nativeQuery = true)
+    Page<ChuanyunWeekMemberHourDO> getRecentlyWeekHour(PageRequest pagerequest);
+
+    /**
      * 判断是否有流程中数据
      * @return
      */
@@ -76,5 +113,6 @@ public interface ChuanyunWeekMemberHourDao extends GalaxisRepository<ChuanyunWee
     /**
      * 删除状态为审核中的数据
      */
+    @Transactional
     void deleteByProjectIdAndUserIdAndYearAndWeekAndStatusAndProjectType(String projectId,String userId,String year,String week,String status,String projectType);
 }

+ 78 - 2
src/main/java/com/galaxis/manatee/dao/ChuanyunWorkHourDao.java

@@ -4,6 +4,7 @@ package com.galaxis.manatee.dao;
 import com.galaxis.capsule.util.GalaxisRepository;
 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;
@@ -29,8 +30,9 @@ public interface ChuanyunWorkHourDao extends GalaxisRepository<ChuanyunWorkHourD
             "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_log.log_date>='2020-08-01'" +
+            " WHERE chuanyun_log.user_id = ?" +
+            "and status!=3" +
+//            "AND chuanyun_log.log_date>='2020-08-12'" +
             " GROUP BY chuanyun_day_log.project_id," +
             "chuanyun_log.user_id," +
             "chuanyun_day_log.project_type," +
@@ -39,6 +41,52 @@ public interface ChuanyunWorkHourDao extends GalaxisRepository<ChuanyunWorkHourD
             nativeQuery = true)
     List<ChuanyunWorkHourDO> getSelfWorkHour(String userId);
 
+
+    /**
+     * 获取离职人员每天每个项目工时
+     * @return
+     */
+    @Query(value="SELECT\n" +
+            "\tchuanyun_day_log.project_id,\n" +
+            "  chuanyun_day_log.project_type,\n" +
+            "  chuanyun_log.user_id,\n" +
+            "  chuanyun_day_log.day_log_date,\n" +
+            "  chuanyun_day_log.hours_worked,\n" +
+            "  chuanyun_log.`status`,\n" +
+            "  chuanyun_day_log.object_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)
+    List<ChuanyunWorkHourDO> getQuitSelfWorkHour();
+
+    /**
+     * 根据用户Id获取用户最近一个月日志明细,并按日期拍
+     * @param userId
+     * @return
+     */
+    @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," +
+            "chuanyun_log.user_id," +
+            "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 DATE_SUB(CURDATE(), INTERVAL 1 MONTH) <= date(chuanyun_day_log.day_log_date)" +
+            "AND status!=3" +
+            " GROUP BY chuanyun_day_log.project_id," +
+            "chuanyun_log.user_id," +
+            "chuanyun_day_log.project_type," +
+            "chuanyun_log.status," +
+            "chuanyun_day_log.day_log_date",
+            nativeQuery = true)
+    List<ChuanyunWorkHourDO> getSelfWorkHourRecently(String userId);
+
     /**
      * 根据用户ID和日期筛选工时数据
      * @param userId    用户Id
@@ -56,8 +104,36 @@ public interface ChuanyunWorkHourDao extends GalaxisRepository<ChuanyunWorkHourD
             "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)
     ChuanyunWorkHourDO getDayWorkHour(String userId,LocalDateTime day);
+
+    /**
+     * 离职人员每天工时
+     * @param userId
+     * @param dayLogDate
+     * @return
+     */
+    @Query(value="SELECT\n" +
+            "\tchuanyun_day_log.project_id,\n" +
+            "\tchuanyun_day_log.project_type,\n" +
+            "\tchuanyun_log.user_id,\n" +
+            "\tchuanyun_day_log.day_log_date,\n" +
+            "\tSUM(\n" +
+            "\t\tchuanyun_day_log.hours_worked\n" +
+            "\t) AS hours_worked,\n" +
+            "\tchuanyun_log.`status`,\n" +
+            "\tchuanyun_day_log.object_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" +
+            "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);
+
 }

+ 28 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunDevelopProjectDO.java

@@ -0,0 +1,28 @@
+package com.galaxis.manatee.entity.chuanyun.data.object;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.persistence.Entity;
+
+@Slf4j
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunDevelopProjectDO extends BasicDO{
+
+    /**
+     * 表名
+     */
+    public static final String SCHEMA_CODE ="D001789RDProjectNo";
+
+    @JsonProperty("F0000001")
+    private String seqNo;
+
+    @JsonProperty("F0000002")
+    private String projectName;
+}

+ 27 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunManagerProjectDO.java

@@ -0,0 +1,27 @@
+package com.galaxis.manatee.entity.chuanyun.data.object;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.persistence.Entity;
+
+@Slf4j
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunManagerProjectDO extends BasicDO{
+    /**
+     * 表名
+     */
+    public static final String SCHEMA_CODE ="D001789ManagermentProjectNo";
+
+    @JsonProperty("SeqNo")
+    private String seqNo;
+
+    @JsonProperty("F0000002")
+    private String projectName;
+}

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

@@ -34,7 +34,12 @@ public class ChuanyunOutDepartmentDO extends BasicDO{
     @JsonProperty("F0000001Object")
     private ChuanyunObject departmentObject;
 
+    private String departmentId;
+
 
     @JsonProperty("F0000002")
     private String outDepartment;
+
+    @JsonProperty("F0000003")
+    private String departmentCode;
 }

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

@@ -39,9 +39,7 @@ public class ChuanyunProjectCostDO {
 
     private BigDecimal totalHour;
 
-    private BigDecimal cost;
 
     private BigDecimal personDays;
 
-    private BigDecimal amount;
 }

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

@@ -191,6 +191,18 @@ public class ChuanyunReimbursementDO extends BasicDO{
     private String outDepartment;
 
     /**
+     * 受益部门名称
+     */
+    @JsonProperty("F0000117")
+    private String benefitDepartmentName;
+
+    /**
+     * 受益部门编码
+     */
+    @JsonProperty("F0000123")
+    private String benefitDepartmentCode;
+
+    /**
      * 受益成本中心编码
      * todo 由beneficiaryCostId获得
      */

+ 28 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunSaleProjectDO.java

@@ -0,0 +1,28 @@
+package com.galaxis.manatee.entity.chuanyun.data.object;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.persistence.Entity;
+
+@Slf4j
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunSaleProjectDO extends BasicDO{
+
+    /**
+     * 表名
+     */
+    public static final String SCHEMA_CODE ="D001789Sb95ajzudvc8qtmiqe29topk22";
+
+    @JsonProperty("F0000034")
+    private String seqNo;
+
+    @JsonProperty("F0000025")
+    private String projectName;
+}

+ 42 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunU9DepartmentDO.java

@@ -0,0 +1,42 @@
+package com.galaxis.manatee.entity.chuanyun.data.object;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.galaxis.capsule.bo.ChuanyunObject;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+
+@Slf4j
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunU9DepartmentDO extends BasicDO{
+
+    /**
+     * 表名
+     */
+    public static final String SCHEMA_CODE ="D001789Sb95ajzudvc8qtmiqe29topk22";
+
+    @JsonProperty("F0000025")
+    private String projectName;
+
+    @JsonProperty("F0000061")
+    private String actualDepartment;
+
+    @JsonProperty("F0000062")
+    private String departmentName;
+
+    @JsonProperty("F0000063")
+    private String departmentCode;
+
+    @Transient
+    @JsonProperty("F0000061Object")
+    private ChuanyunObject actualDepartmentObject;
+
+
+}

+ 16 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/dto/ChuanyunDeviceConfigureDTO.java

@@ -0,0 +1,16 @@
+package com.galaxis.manatee.entity.chuanyun.dto;
+
+import lombok.Data;
+
+import javax.persistence.EmbeddedId;
+
+@Data
+public class ChuanyunDeviceConfigureDTO {
+
+    private ChuanyunDeviceConfigurePrimaryKey chuanyunDeviceConfigurePrimaryKey;
+
+    private String propertyname;
+
+    private String propertyvaluename;
+
+}

+ 14 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/dto/ChuanyunDeviceConfigurePrimaryKey.java

@@ -0,0 +1,14 @@
+package com.galaxis.manatee.entity.chuanyun.dto;
+
+import lombok.Data;
+
+import javax.persistence.Embeddable;
+
+@Embeddable
+@Data
+public class ChuanyunDeviceConfigurePrimaryKey {
+
+    private String sncode;
+
+    private String linenum;
+}

+ 15 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/dto/ChuanyunDeviceDTO.java

@@ -0,0 +1,15 @@
+package com.galaxis.manatee.entity.chuanyun.dto;
+
+import lombok.Data;
+
+import javax.persistence.Id;
+
+@Data
+public class ChuanyunDeviceDTO {
+
+    private String sncode;
+
+    private String itemcode;
+
+    private String projectcode;
+}

+ 17 - 4
src/main/java/com/galaxis/manatee/manager/ClawFeign.java

@@ -4,10 +4,7 @@ import com.galaxis.capsule.dto.*;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunProjectCashFlowDO;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunPurCostDO;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunReimbursementDO;
-import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunLaborCostDTO;
-import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunProjectCashFlowDTO;
-import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunPurCostDTO;
-import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunSupplierDTO;
+import com.galaxis.manatee.entity.chuanyun.dto.*;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -72,6 +69,22 @@ public interface ClawFeign {
     @GetMapping("/laborcost/findAllByParameters")
     PageDTO<ChuanyunLaborCostDTO> findChuanyunLaborCost(@RequestParam Map<String,String> map);
 
+    /**
+     * 查询设备配置信息
+     * @param map
+     * @return
+     */
+    @GetMapping("/deviceconfigure/findAllByParameters")
+    PageDTO<ChuanyunDeviceConfigureDTO> findChuanyunDeviceConfigure(@RequestParam Map<String,String> map);
+
+    /**
+     * 查询设备信息
+     * @param map
+     * @return
+     */
+    @GetMapping("/device/findAllByParameters")
+    PageDTO<ChuanyunDeviceDTO> findChuanyunDevice(@RequestParam Map<String,String> map);
+
 
     /**
      * 测试

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

@@ -28,13 +28,15 @@ public interface ChuanyunService {
      */
     void updateChuanyunDept(String code);
 
-    /**
-     * 将领导从特定项目中剔除
-     */
-    void deleteProjectMember();
 
     /**
      * 设备配置信息导入
      */
     void importEquipment(List<ChuanyunEquipmentDO> list);
+
+    /**
+     * 更新项目中受益部门名称
+     */
+    void updateU9Department();
+
 }

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

@@ -6,7 +6,6 @@ import com.dingtalk.api.response.OapiProcessinstanceGetResponse;
 import com.dingtalk.api.response.OapiProcessinstanceListidsResponse;
 import com.galaxis.manatee.constant.DingTalkConstant;
 import com.galaxis.manatee.dao.ChuanyunAskForLeaveDao;
-import com.galaxis.manatee.dao.ChuanyunUserCompanyDao;
 import com.galaxis.manatee.dao.DingTalkProcessInstanceDao;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunAskForLeaveDO;
 import com.galaxis.manatee.entity.ding.DingTalkProcessInstance;
@@ -50,29 +49,19 @@ public class DingTalkScheduledTask {
      */
     private final ChuanyunAskForLeaveDao chuanyunAskForLeaveDao;
 
-    private final ChuanyunUserCompanyDao userCompanyDao;
-
-    public DingTalkScheduledTask(DingTalkClient processInstanceListIdsClient, DingTalkClient processInstanceClient,ChuanyunUserCompanyDao chuanyunUserDao,
+    public DingTalkScheduledTask(DingTalkClient processInstanceListIdsClient, DingTalkClient processInstanceClient,
                                  ChuanyunAskForLeaveDao chuanyunAskForLeaveDao,DingTalkProcessInstanceDao dingTalkProcessInstanceDao) {
         this.processInstanceListIdsClient = processInstanceListIdsClient;
         this.processInstanceClient = processInstanceClient;
         this.dingTalkProcessInstanceDao = dingTalkProcessInstanceDao;
         this.chuanyunAskForLeaveDao = chuanyunAskForLeaveDao;
-        this.userCompanyDao = chuanyunUserDao;
-    }
-
-    /**
-     * 每小时更新
-     */
-//    @Scheduled(fixedDelay = 3600000L)
-    private void updateBusinessTripProcessInstance(){
     }
 
     /**
      * 每个小时定期更新出差申请数据
      * 出差申请信息暂时不进行更新
      */
-//    @Scheduled(fixedDelay = 3600000L,initialDelay = 10000L)
+    @Scheduled(fixedDelay = 3600000L,initialDelay = 10000L)
     void updateBusinessTripProcessInstanceIdList() throws ApiException {
         updateProcessInstanceIdList(DingTalkConstant.PROCESS_CODE_BUSINESS_TRIP);
     }
@@ -83,7 +72,7 @@ public class DingTalkScheduledTask {
      * 每小时根据出差申请Id跟新出差申请信息。
      * 出差申请信息暂时不进行更新
      */
-//    @Scheduled(fixedDelay = 3600000L,initialDelay = 10000L)
+    @Scheduled(fixedDelay = 3600000L,initialDelay = 10000L)
     void updateProcessInstanceList() throws ApiException {
          updateChuanyunAskForLeave(DingTalkConstant.PROCESS_CODE_ASKFORLEAVE);
     }
@@ -113,7 +102,7 @@ public class DingTalkScheduledTask {
                 //逐个请求
                 oapiProcessinstanceListidsResponse.getResult().getList().forEach(resultId->{
                     Optional<DingTalkProcessInstance> instance=dingTalkProcessInstanceDao.findById(resultId);
-                    if(!instance.isPresent()){
+                    if(instance.isEmpty()){
                         OapiProcessinstanceGetRequest request=new OapiProcessinstanceGetRequest();
                         request.setProcessInstanceId(resultId);
                         try {
@@ -165,7 +154,7 @@ public class DingTalkScheduledTask {
             //逐个请求
             oapiProcessinstanceListidsResponse.getResult().getList().forEach(resultId->{
                 Optional<DingTalkProcessInstance> instance=dingTalkProcessInstanceDao.findById(resultId);
-                if(!instance.isPresent()){
+                if(instance.isEmpty()){
                     //&&instance.get()==null
                     //淘宝SDK方法
                     OapiProcessinstanceGetRequest request=new OapiProcessinstanceGetRequest();

+ 116 - 0
src/main/java/com/galaxis/manatee/service/ProjectMemberService.java

@@ -0,0 +1,116 @@
+package com.galaxis.manatee.service;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.galaxis.manatee.dao.ChuanyunGroupProjectDao;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunDevelopProjectDO;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunGroupProjectDO;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunManagerProjectDO;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunSaleProjectDO;
+import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunFindAllBizDTO;
+import com.galaxis.manatee.entity.chuanyun.dto.Filter;
+import com.galaxis.manatee.manager.ChuanYunManager;
+import com.galaxis.manatee.task.ChuanyunBasicDataScheduledTask;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@Slf4j
+public class ProjectMemberService {
+
+    private final ChuanyunBasicDataScheduledTask chuanyunBasicDataScheduledTask;
+    private final ChuanYunManager chuanYunManager;
+    private final ChuanyunGroupProjectDao chuanyunGroupProjectDao;
+
+    public ProjectMemberService(ChuanyunBasicDataScheduledTask chuanyunBasicDataScheduledTask, ChuanYunManager chuanYunManager, ChuanyunGroupProjectDao chuanyunGroupProjectDao) {
+        this.chuanyunBasicDataScheduledTask = chuanyunBasicDataScheduledTask;
+        this.chuanYunManager = chuanYunManager;
+        this.chuanyunGroupProjectDao = chuanyunGroupProjectDao;
+    }
+
+    @Async
+    public void updateManagerMember(String param){
+        var objectMapper=new ObjectMapper();
+        param=param.substring(14,param.length()-2);
+        log.info(param);
+        boolean updateFlag=false;
+        while (!updateFlag){
+            var chuanyunFindResponse =  chuanYunManager.find(ChuanyunManagerProjectDO.SCHEMA_CODE,param);
+            ChuanyunManagerProjectDO chuanyunManagerProjectDO = objectMapper.convertValue(chuanyunFindResponse.getReturnData().getBizObject(), new TypeReference<>(){});
+            if (chuanyunManagerProjectDO!=null){
+                updateFlag=true;
+                try {
+                    List<String> matchers = new ArrayList<>();
+                    matchers.add("F0000002_2,"+chuanyunManagerProjectDO.getSeqNo());
+                    var filter= Filter.instance(0,1,true,"And",matchers);
+                    ChuanyunFindAllBizDTO<Object> chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunGroupProjectDO.SCHEMA_CODE,filter);
+                    if (chuanyunFindAllResponse.getReturnData()!=null){
+                        List<ChuanyunGroupProjectDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                        log.info("集团项目"+result.get(0));
+                        chuanyunBasicDataScheduledTask.chuanyunUpdateProjectMemberManually(result.get(0));
+                    }
+                }catch (Exception e){
+                    e.printStackTrace();
+                    log.warn(e.getMessage());
+                }
+                log.info("管理项目更新项目组成员成功");
+            }
+        }
+    }
+
+    @Async
+    public void updateSaleMember(String param){
+        var objectMapper=new ObjectMapper();
+        param=param.substring(14,param.length()-2);
+        log.info(param);
+        boolean updateFlag=false;
+        while (!updateFlag){
+            try {
+                List<String> matchers = new ArrayList<>();
+                matchers.add("F0000002_2,"+param);
+                var filter= Filter.instance(0,1,true,"And",matchers);
+                ChuanyunFindAllBizDTO<Object> chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunGroupProjectDO.SCHEMA_CODE,filter);
+                if (chuanyunFindAllResponse.getReturnData()!=null){
+                    updateFlag=true;
+                    List<ChuanyunGroupProjectDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                    log.info("集团项目"+result.get(0));
+                    chuanyunBasicDataScheduledTask.chuanyunUpdateProjectMemberManually(result.get(0));
+                    log.info("销售项目更新项目组成员成功");
+                }
+            }catch (Exception e){
+                e.printStackTrace();
+                log.warn(e.getMessage());
+            }
+        }
+    }
+
+    @Async
+    public void updateDevelopMember(String param){
+        var objectMapper=new ObjectMapper();
+        param=param.substring(14,param.length()-2);
+        log.info(param);
+        boolean updateFlag=false;
+        while (!updateFlag){
+            try {
+                List<String> matchers = new ArrayList<>();
+                matchers.add("F0000002_2,"+param);
+                var filter= Filter.instance(0,1,true,"And",matchers);
+                ChuanyunFindAllBizDTO<Object> chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunGroupProjectDO.SCHEMA_CODE,filter);
+                if (chuanyunFindAllResponse.getReturnData()!=null){
+                    updateFlag=true;
+                    List<ChuanyunGroupProjectDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                    log.info("集团项目"+result.get(0));
+                    chuanyunBasicDataScheduledTask.chuanyunUpdateProjectMemberManually(result.get(0));
+                    log.info("研发项目更新项目组成员成功");
+                }
+            }catch (Exception e){
+                e.printStackTrace();
+                log.warn(e.getMessage());
+            }
+        }
+    }
+}

+ 106 - 71
src/main/java/com/galaxis/manatee/service/impl/ChuanyunServiceImpl.java

@@ -9,6 +9,7 @@ import com.galaxis.manatee.constant.ChuanYunConstant;
 import com.galaxis.manatee.constant.StringConstant;
 import com.galaxis.manatee.dao.ChuanyunCostCollectionDao;
 import com.galaxis.manatee.dao.ChuanyunEquipmentInformDao;
+import com.galaxis.manatee.dao.ChuanyunGroupProjectDao;
 import com.galaxis.manatee.dao.ChuanyunUserCompanyDao;
 import com.galaxis.manatee.entity.chuanyun.data.object.*;
 import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunSaveDTO;
@@ -16,12 +17,13 @@ import com.galaxis.manatee.entity.chuanyun.dto.Filter;
 import com.galaxis.manatee.exception.BigSizeException;
 import com.galaxis.manatee.manager.ChuanYunManager;
 import com.galaxis.manatee.service.ChuanyunService;
+import com.galaxis.manatee.task.ChuanyunBasicDataScheduledTask;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -36,13 +38,16 @@ public class ChuanyunServiceImpl implements ChuanyunService {
     private final ChuanyunCostCollectionDao chuanyunCostCollectionDao;
     private final ChuanyunUserCompanyDao chuanyunUserCompanyDao;
     private final ChuanyunEquipmentInformDao chuanyunEquipmentInformDao;
-    private String[] leader = {"e1feb431-91fd-4a01-8d81-a2e618b571ff","1c8c4dfa-7e22-4f4e-a672-3e080e01a283","18bf4c09-f7d7-4c01-8509-ec554c6592f0","9df86c86-87f4-4d91-ba1e-29657c6cdb65","3fcbf0e0-bf06-411b-9ce4-b77dc897ee93","0fb67380-3408-4786-bac4-44dfef738110"};
+    private final ChuanyunGroupProjectDao chuanyunGroupProjectDao;
+    private final ChuanyunBasicDataScheduledTask chuanyunBasicDataScheduledTask;
 
-    public ChuanyunServiceImpl(ChuanYunManager chuanYunManager, ChuanyunCostCollectionDao chuanyunCostCollectionDao, ChuanyunUserCompanyDao chuanyunUserCompanyDao, ChuanyunEquipmentInformDao chuanyunEquipmentInformDao) {
+    public ChuanyunServiceImpl(ChuanYunManager chuanYunManager, ChuanyunCostCollectionDao chuanyunCostCollectionDao, ChuanyunUserCompanyDao chuanyunUserCompanyDao, ChuanyunEquipmentInformDao chuanyunEquipmentInformDao, ChuanyunGroupProjectDao chuanyunGroupProjectDao, ChuanyunBasicDataScheduledTask chuanyunBasicDataScheduledTask) {
         this.chuanYunManager = chuanYunManager;
         this.chuanyunCostCollectionDao = chuanyunCostCollectionDao;
         this.chuanyunUserCompanyDao = chuanyunUserCompanyDao;
         this.chuanyunEquipmentInformDao = chuanyunEquipmentInformDao;
+        this.chuanyunGroupProjectDao = chuanyunGroupProjectDao;
+        this.chuanyunBasicDataScheduledTask = chuanyunBasicDataScheduledTask;
     }
 
     @Override
@@ -157,67 +162,6 @@ public class ChuanyunServiceImpl implements ChuanyunService {
         }
     }
 
-    @Override
-    public void deleteProjectMember() {
-        var objectMapper=new ObjectMapper();
-        var start=0;
-        var flag=true;
-        while (flag){
-            try {
-                //从氚云查询数据
-                var filter= Filter.instance(start,start+pageSize,true);
-                var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunGroupProjectDO.SCHEMA_CODE,filter);
-                if(chuanyunFindAllResponse.getReturnData()==null){
-                    flag=false;
-                    continue;
-                }
-                if(chuanyunFindAllResponse.getReturnData().getTotalCount()>=start+pageSize){
-                    start+=pageSize;
-                }else{
-                    flag=false;
-                }
-                //转化为POJO
-                List<ChuanyunGroupProjectDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
-                //保存
-                result.forEach(chuanyunGroupProjectDO ->  {
-                    if (chuanyunGroupProjectDO.getProjectMemberObject()!=null&&chuanyunGroupProjectDO.getProjectMemberObject().size()>0){
-                        //判断是否是实施、研发二开、售后维保项目
-                        var specifiedProjectTypeFlag=("实施".equals(chuanyunGroupProjectDO.getProjectType())||
-                                "维保".equals(chuanyunGroupProjectDO.getProjectType())||
-                                "研发二开".equals(chuanyunGroupProjectDO.getProjectType())||
-                                "售后".equals(chuanyunGroupProjectDO.getProjectType()));
-                        var specifiedBusinessGroupFlag=ChuanyunGroupProjectDO.EBG.equals(chuanyunGroupProjectDO.getBusinessGroup());
-                        //项目组成员去除领导
-                        List<String> projectMember = new ArrayList<String>();
-                        if (specifiedBusinessGroupFlag&&specifiedProjectTypeFlag){
-                            List<ChuanyunObject> list = chuanyunGroupProjectDO.getProjectMemberObject();
-                            for (ChuanyunObject chuanyunObject:list){
-                                if (!Arrays.asList(leader).contains(chuanyunObject.getObjectId())){
-                                    projectMember.add(chuanyunObject.getObjectId());
-                                }
-                            }
-                            chuanyunGroupProjectDO.setProjectMemberList(projectMember.toArray(new String[0]));
-                            GroupProjectUpdateDTO groupProjectUpdateDTO = new GroupProjectUpdateDTO(chuanyunGroupProjectDO);
-                            try {
-                                var groupProjectUpdateString=objectMapper.writeValueAsString(groupProjectUpdateDTO);
-                                ChuanyunSaveDTO chuanyunSaveDTO=chuanYunManager.update(ChuanyunGroupProjectDO.SCHEMA_CODE,chuanyunGroupProjectDO.getObjectId(),groupProjectUpdateString);
-                                if(chuanyunSaveDTO.getSuccessful()){
-                                    log.info("删除项目组成员成功");
-                                }else{
-                                    log.warn("删除项目组成员失败");
-                                }
-                            } catch (JsonProcessingException | BigSizeException e) {
-                                e.printStackTrace();
-                            }
-                        }
-                    }
-                });
-            }catch (Exception e){
-                log.error(e.getMessage());
-                e.printStackTrace();
-            }
-        }
-    }
 
     @Override
     public void importEquipment(List<ChuanyunEquipmentDO> list) {
@@ -225,14 +169,18 @@ public class ChuanyunServiceImpl implements ChuanyunService {
         list.forEach(chuanyunEquipmentDO -> {
             //更新氚云
             try {
-//                List<String> matchers = new ArrayList<>();
-//                matchers.add("F0000001_2,"+chuanyunEquipmentDO.getEquipmentCode());
-//                var filter= Filter.instance(0,1,true,"And",matchers);
-//                var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunEquipmentDO.SCHEMA_CODE,filter);
-                ChuanyunEquipmentInformDO chuanyunEquipmentInformDO = chuanyunEquipmentInformDao.findByEquipmentCode(chuanyunEquipmentDO.getEquipmentCode());
-                if (chuanyunEquipmentInformDO!=null){
-                    chuanyunEquipmentDO.setEquipmentCode(chuanyunEquipmentInformDO.getObjectId());
+                List<String> matchers = new ArrayList<>();
+                matchers.add("F0000001_2,"+chuanyunEquipmentDO.getEquipmentCode());
+                var filter= Filter.instance(0,1,true,"And",matchers);
+                var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunEquipmentInformDO.SCHEMA_CODE,filter);
+                if (chuanyunFindAllResponse.getReturnData()!=null){
+                    List<ChuanyunEquipmentInformDO> projectresult=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                    chuanyunEquipmentDO.setEquipmentCode(projectresult.get(0).getObjectId());
                 }
+//                ChuanyunEquipmentInformDO chuanyunEquipmentInformDO = chuanyunEquipmentInformDao.findByEquipmentCode(chuanyunEquipmentDO.getEquipmentCode());
+//                if (chuanyunEquipmentInformDO!=null){
+//                    chuanyunEquipmentDO.setEquipmentCode(chuanyunEquipmentInformDO.getObjectId());
+//                }
                 EquipmentDTO equipmentDTO = new EquipmentDTO(chuanyunEquipmentDO);
                 var equipmentString = objectMapper.writeValueAsString(equipmentDTO);
                 ChuanyunSaveDTO chuanyunSaveDTO;
@@ -253,6 +201,71 @@ public class ChuanyunServiceImpl implements ChuanyunService {
         });
     }
 
+    @Override
+    public void updateU9Department() {
+        var objectMapper=new ObjectMapper();
+        var start=0;
+        var totalCount=0L;
+        var flag=true;
+        while (flag){
+            try{
+                //从氚云查询数据
+                var filter= Filter.instance(start,start+pageSize,true);
+                var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunU9DepartmentDO.SCHEMA_CODE,filter);
+                if(chuanyunFindAllResponse.getReturnData()==null){
+                    flag=false;
+                    continue;
+                }
+                if(chuanyunFindAllResponse.getReturnData().getTotalCount()>=start+pageSize){
+                    start+=pageSize;
+                }else{
+                    flag=false;
+                }
+                List<ChuanyunU9DepartmentDO> result = objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                result.forEach(chuanyunU9DepartmentDO -> {
+                    synchroOutDepartment(chuanyunU9DepartmentDO);
+                });
+            }catch (JsonProcessingException  e){
+                e.printStackTrace();
+                log.warn(e.getMessage());
+            }
+        }
+    }
+
+    /**
+     * 更新外部部门名称
+     * @param
+     */
+    private void synchroOutDepartment(ChuanyunU9DepartmentDO chuanyunU9DepartmentDO) {
+        try {
+            if (!StringUtils.isEmpty(chuanyunU9DepartmentDO.getActualDepartmentObject().getObjectId())){
+                var objectMapper=new ObjectMapper();
+                List<String> matchers = new ArrayList<>();
+                matchers.add("F0000001_2,"+chuanyunU9DepartmentDO.getActualDepartmentObject().getObjectId());
+                var filter= Filter.instance(0,1,true,"And",matchers);
+                var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunOutDepartmentDO.SCHEMA_CODE,filter);
+                if (chuanyunFindAllResponse.getReturnData()!=null) {
+                    List<ChuanyunOutDepartmentDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                    ChuanyunOutDepartmentDO firstResult = result.get(0);
+                    chuanyunU9DepartmentDO.setDepartmentName(firstResult.getOutDepartment());
+                    chuanyunU9DepartmentDO.setDepartmentCode(firstResult.getDepartmentCode());
+                }
+                outDepartmentDTO departmentDTO = new outDepartmentDTO(chuanyunU9DepartmentDO);
+                var departmentString = objectMapper.writeValueAsString(departmentDTO);
+                ChuanyunSaveDTO chuanyunSaveDTO = chuanYunManager.update(ChuanyunU9DepartmentDO.SCHEMA_CODE,chuanyunU9DepartmentDO.getObjectId(),departmentString);
+                if(chuanyunSaveDTO.getSuccessful()){
+                    log.info("更新外部部门名称成功");
+                }else{
+                    log.warn("更新外部部门名称失败");
+                }
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+            log.error(e.getMessage());
+        }
+
+    }
+
     /**
      * 如果没有项目组成员,判断是否是EBG的实施、研发二开、售后维保项目,如果是,则添加EBG全体成员
      * @param chuanyunGroupProjectDO    项目对象
@@ -323,6 +336,28 @@ public class ChuanyunServiceImpl implements ChuanyunService {
         }
     }
 
+
+    @Data
+    class outDepartmentDTO {
+
+        @JsonProperty("F0000062")
+        private String outDepartment;
+
+        @JsonProperty("F0000063")
+        private String departmentCode;
+
+        public outDepartmentDTO(ChuanyunU9DepartmentDO chuanyunU9DepartmentDO) {
+            if (null!=chuanyunU9DepartmentDO){
+                if(null!=chuanyunU9DepartmentDO.getDepartmentName()){
+                    this.outDepartment=chuanyunU9DepartmentDO.getDepartmentName();
+                }
+                if (null!=chuanyunU9DepartmentDO.getDepartmentCode()){
+                    this.departmentCode=chuanyunU9DepartmentDO.getDepartmentCode();
+                }
+            }
+        }
+    }
+
     @Data
     class EquipmentDTO{
         /**

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 32 - 425
src/main/java/com/galaxis/manatee/task/ChuanyunBasicDataScheduledTask.java


+ 0 - 45
src/main/java/com/galaxis/manatee/task/ChuanyunFinancialScheduledTask.java

@@ -156,51 +156,6 @@ public class ChuanyunFinancialScheduledTask {
         log.info("报销信息保存保存"+totalCount);
     }
 
-    /**
-     * 更新外部部门名称
-     * @param chuanyunReimbursementDO
-     */
-    private void synchroOutDepartment(ChuanyunReimbursementDO chuanyunReimbursementDO) {
-        try {
-            var objectMapper=new ObjectMapper();
-            List<String> matchers = new ArrayList<>();
-            matchers.add("F0000001_2,"+chuanyunReimbursementDO.getDepartmentObject().getObjectId());
-            var filter= Filter.instance(0,1,true,"And",matchers);
-            var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunOutDepartmentDO.SCHEMA_CODE,filter);
-            if (chuanyunFindAllResponse.getReturnData()!=null) {
-                List<ChuanyunOutDepartmentDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
-                ChuanyunOutDepartmentDO firstResult = result.get(0);
-                chuanyunReimbursementDO.setOutDepartment(firstResult.getOutDepartment());
-            }else {
-                chuanyunReimbursementDO.setOutDepartment(chuanyunReimbursementDO.getDepartment());
-            }
-            outDepartmentDTO departmentDTO = new outDepartmentDTO(chuanyunReimbursementDO);
-            var departmentString = objectMapper.writeValueAsString(departmentDTO);
-            ChuanyunSaveDTO chuanyunSaveDTO = chuanYunManager.update(ChuanyunReimbursementDO.SCHEMA_CODE,chuanyunReimbursementDO.getObjectId(),departmentString);
-            if(chuanyunSaveDTO.getSuccessful()){
-                log.info("更新外部部门名称成功");
-            }else{
-                log.warn("更新外部部门名称失败");
-            }
-        }catch (Exception e) {
-            e.printStackTrace();
-            log.error(e.getMessage());
-        }
-
-    }
-
-    @Data
-    class outDepartmentDTO {
 
-        @JsonProperty("F0000112")
-        private String outDepartment;
 
-        public outDepartmentDTO(ChuanyunReimbursementDO chuanyunReimbursementDO) {
-            if (chuanyunReimbursementDO!=null){
-                if (chuanyunReimbursementDO.getOutDepartment()!=null){
-                    this.outDepartment=chuanyunReimbursementDO.getOutDepartment();
-                }
-            }
-        }
-    }
 }

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

@@ -69,7 +69,7 @@ public class ChuanyunHumanResourceScheduledTask {
         List<String> matchersString=new ArrayList<>();
         //由于需要统计流程中的日志,在日志数据同步时将状态为2的数据一并统计
 //        matchersString.add("Status_2,1");
-        matchersString.add("Status_6,[1;2]");
+        matchersString.add("Status_6,[1;2;3]");
 //        matchersString.add("logDate_4,2020-08-01 00:00:00");
         while (flag) {
             Long startTime= Instant.now().getEpochSecond();
@@ -104,6 +104,17 @@ public class ChuanyunHumanResourceScheduledTask {
                         //针对前期测试数据,可能出现日志为空的情况,跳过不处理
                         chuanyunLogDO.getDayLogList().forEach(chuanyunDayLog -> {
                             try{
+                                //离职人员补全用户Id
+                                if (StringUtils.isEmpty(chuanyunLogDO.getUserId())){
+                                    var name="";
+                                    if (StringUtils.isEmpty(chuanyunDayLog.getContent())){
+                                        name=chuanyunLogDO.getName();
+                                    }else {
+                                        name=chuanyunDayLog.getContent();
+                                    }
+                                    chuanyunLogDO.setUserId(getCharacters(name));
+                                }
+
                                 if(!"生产项目".equals(chuanyunDayLog.getProjectType())&& StringUtils.isEmpty(chuanyunDayLog.getProjectId())){
                                     log.info(chuanyunLogDO+"");
                                 }else if(!"生产项目".equals(chuanyunDayLog.getProjectType())){
@@ -317,4 +328,10 @@ public class ChuanyunHumanResourceScheduledTask {
         }
         log.info("最近的日志日志信息保存" + totalCount);
     }
+
+    private String getCharacters(String str){
+        String reg = "[^\u4e00-\u9fa5]";
+        str = str.replaceAll(reg, " ");
+        return str.trim();
+    }
 }

+ 78 - 52
src/main/java/com/galaxis/manatee/task/ChuanyunProjectScheduledTask.java

@@ -215,61 +215,50 @@ public class ChuanyunProjectScheduledTask {
     @Scheduled(fixedDelay = 3600000L)
     private void projectHour() {
         List<ChuanyunProjectCostDO> list1 = chuanyunProjectCostDao.getProjectCost();
-//        deleteExamineStatus(ChuanyunProjectTotalCostDO.SCHEMA_CODE,"F0000006");
-        chuanyunProjectCostDao.deleteAllByStatus("2");
+
         list1.forEach(chuanyunProjectCostDO -> {
-            //获取项目实施费用
-            ChuanyunReimbursementAmountDO chuanyunReimbursementAmountDO = chuanyunReimbursementAmountDao.getAmount(chuanyunProjectCostDO.getProjectId());
-            //人力成本
-            ChuanyunMonthLaborCostDO chuanyunMonthLaborCostDO = chuanyunMonthLaborCostDao.getTotalCost(chuanyunProjectCostDO.getProjectId());
             //更新数据库
-            ChuanyunProjectCostDO projectCostDO = new ChuanyunProjectCostDO();
-            if (chuanyunMonthLaborCostDO!=null){
-                projectCostDO.setCost(chuanyunMonthLaborCostDO.getAmount());
-            }
-            projectCostDO.setProjectType(chuanyunProjectCostDO.getProjectType());
-            projectCostDO.setProjectId(chuanyunProjectCostDO.getProjectId());
-            projectCostDO.setTotalHour(chuanyunProjectCostDO.getTotalHour());
-            projectCostDO.setStatus(chuanyunProjectCostDO.getStatus());
-            projectCostDO.setPersonDays(chuanyunProjectCostDO.getPersonDays());
-            if (chuanyunReimbursementAmountDO !=null) {
-                projectCostDO.setAmount(chuanyunReimbursementAmountDO.getTotalAmount());
-            }
-            ChuanyunProjectCostDO oldProjectDO = chuanyunProjectCostDao.findByProjectId(chuanyunProjectCostDO.getProjectId());
+            BigDecimal standard = new BigDecimal(8);
+            chuanyunProjectCostDO.setPersonDays(chuanyunProjectCostDO.getTotalHour().divide(standard,2,RoundingMode.HALF_UP));
+            ChuanyunProjectCostDO oldProjectDO = chuanyunProjectCostDao.findByProjectIdAndProjectTypeAndStatus(chuanyunProjectCostDO.getProjectId(),chuanyunProjectCostDO.getProjectType(),chuanyunProjectCostDO.getStatus());
             if (oldProjectDO !=null) {
                 chuanyunProjectCostDao.delete(oldProjectDO);
             }
-            chuanyunProjectCostDao.save(projectCostDO);
+            chuanyunProjectCostDao.save(chuanyunProjectCostDO);
+            //搜索是否有审批中的数据
+            ChuanyunProjectCostDO processDO = chuanyunProjectCostDao.getProcessProjectCost(chuanyunProjectCostDO.getProjectId(),chuanyunProjectCostDO.getProjectType());
+            if (processDO==null){
+                chuanyunProjectCostDao.deleteByProjectIdAndProjectTypeAndStatus(chuanyunProjectCostDO.getProjectId(),chuanyunProjectCostDO.getProjectType(),"2");
+                deleteExamineStatus(ChuanyunProjectTotalCostDO.SCHEMA_CODE,"F0000006","F0000001",chuanyunProjectCostDO.getProjectId(),"","","","","","","","","F0000004",chuanyunProjectCostDO.getProjectType());
+            }
+
             try {
-                ChuanyunProjectTotalCostDTO chuanyunProjectTotalCostDTO = new ChuanyunProjectTotalCostDTO();
+                ProjectTotalCostDTO chuanyunProjectTotalCostDTO = new ProjectTotalCostDTO();
                 chuanyunProjectTotalCostDTO.setProjectType(chuanyunProjectCostDO.getProjectType());
                 chuanyunProjectTotalCostDTO.setProjectId(chuanyunProjectCostDO.getProjectId());
-                if (chuanyunMonthLaborCostDO!=null){
-                    chuanyunProjectTotalCostDTO.setCost(chuanyunMonthLaborCostDO.getAmount());
-                }
                 chuanyunProjectTotalCostDTO.setStatus(chuanyunProjectCostDO.getStatus());
                 chuanyunProjectTotalCostDTO.setWorkHour(chuanyunProjectCostDO.getTotalHour());
                 chuanyunProjectTotalCostDTO.setPersonDays(chuanyunProjectCostDO.getPersonDays());
-                if (chuanyunReimbursementAmountDO !=null) {
-                    chuanyunProjectTotalCostDTO.setAmount(chuanyunReimbursementAmountDO.getTotalAmount());
-                }
-                List<String> matchers = new ArrayList<>();
-                matchers.add("F0000001_2,"+chuanyunProjectCostDO.getProjectId());
-                matchers.add("F0000006_2,"+chuanyunProjectCostDO.getStatus());
-                var filter= Filter.instance(0,1,true,"And",matchers);
-                var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunProjectTotalCostDO.SCHEMA_CODE,filter);
-                var projectTotalString=objectMapper.writeValueAsString(chuanyunProjectTotalCostDTO);
-                ChuanyunSaveDTO chuanyunSaveDTO;
-                if (chuanyunFindAllResponse.getReturnData()!=null) {
-                    List<ChuanyunProjectTotalCostDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
-                    ChuanyunProjectTotalCostDO firstResult = result.get(0);
-                    chuanyunSaveDTO = chuanYunManager.update(ChuanyunProjectTotalCostDO.SCHEMA_CODE,firstResult.getObjectId(),projectTotalString);
-                }else {
-                    chuanyunSaveDTO = chuanYunManager.save(ChuanyunProjectTotalCostDO.SCHEMA_CODE,projectTotalString,true);
+                if (!StringUtils.isEmpty(chuanyunProjectCostDO.getProjectId()) && !StringUtils.isEmpty(chuanyunProjectCostDO.getProjectType())){
+                    List<String> matchers = new ArrayList<>();
+                    matchers.add("F0000001_2,"+chuanyunProjectCostDO.getProjectId());
+                    matchers.add("F0000004_2,"+chuanyunProjectCostDO.getProjectType());
+                    matchers.add("F0000006_2,"+chuanyunProjectCostDO.getStatus());
+                    var filter= Filter.instance(0,1,true,"And",matchers);
+                    var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunProjectTotalCostDO.SCHEMA_CODE,filter);
+                    var projectTotalString=objectMapper.writeValueAsString(chuanyunProjectTotalCostDTO);
+                    ChuanyunSaveDTO chuanyunSaveDTO;
+                    if (chuanyunFindAllResponse.getReturnData()!=null) {
+                        List<ChuanyunProjectTotalCostDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                        ChuanyunProjectTotalCostDO firstResult = result.get(0);
+                        chuanyunSaveDTO = chuanYunManager.update(ChuanyunProjectTotalCostDO.SCHEMA_CODE,firstResult.getObjectId(),projectTotalString);
+                    }else {
+                        chuanyunSaveDTO = chuanYunManager.save(ChuanyunProjectTotalCostDO.SCHEMA_CODE,projectTotalString,true);
 
-                }
-                if(!chuanyunSaveDTO.getSuccessful()){
-                    log.warn("新增项目成本汇总失败");
+                    }
+                    if(!chuanyunSaveDTO.getSuccessful()){
+                        log.warn("新增项目成本汇总失败");
+                    }
                 }
             } catch (JsonProcessingException | BigSizeException e) {
                 log.error(e.getMessage());
@@ -277,6 +266,7 @@ public class ChuanyunProjectScheduledTask {
                 e.printStackTrace();
             }
         });
+        log.info("项目工时汇总更新完成"+list1.size());
     }
 
     /**
@@ -383,6 +373,50 @@ public class ChuanyunProjectScheduledTask {
         });
     }
 
+    /**
+     * 删除状态为审核中数据
+     * @param schemaCode
+     * @param
+     */
+    public void deleteExamineStatus(String schemaCode,String statusCode,String projectCode,String projectId,String userCode,String userId,String yearCode,String year,String monthCode,String month,String weekCode,String week,String typeCode,String projectType) {
+        try {
+            List<String> matchers = new ArrayList<>();
+            matchers.add(statusCode+"_2,"+"2");
+            matchers.add(projectCode+"_2,"+projectId);
+            if (!StringUtils.isEmpty(userId)){
+                matchers.add(userCode+"_2,"+userId);
+            }
+            if (!StringUtils.isEmpty(year)){
+                matchers.add(yearCode+"_2,"+year);
+            }
+            if (!StringUtils.isEmpty(month)){
+                matchers.add(monthCode+"_2,"+month);
+            }
+            if (!StringUtils.isEmpty(week)){
+                matchers.add(weekCode+"_2,"+week);
+            }
+            if (!StringUtils.isEmpty(projectType)){
+                matchers.add(typeCode+"_2,"+projectType);
+            }
+            var filter= Filter.instance(0,Integer.MAX_VALUE,true,"And",matchers);
+            var chuanyunFindAllResponse=chuanYunManager.findAll(schemaCode,filter);
+            if (chuanyunFindAllResponse.getReturnData()!=null){
+                List<ChuanyunCommonDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                result.forEach(basicDO -> {
+                    ChuanyunSaveDTO chuanyunSaveDTO = chuanYunManager.delete(schemaCode,basicDO.getObjectId());
+                    if(chuanyunSaveDTO.getSuccessful()){
+//                        log.info("删除状态为审核中数据成功");
+                    }else{
+                        log.warn("删除状态为审核中数据失败");
+                    }
+                });
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+            log.error(e.getMessage());
+        }
+    }
+
     @Data
     static
     class ChuanyunProjectMemberCostDTO {
@@ -436,7 +470,7 @@ public class ChuanyunProjectScheduledTask {
      */
     @Data
     static
-    class ChuanyunProjectTotalCostDTO{
+    class ProjectTotalCostDTO{
 
         /**
          * 项目ID
@@ -457,12 +491,6 @@ public class ChuanyunProjectScheduledTask {
         private BigDecimal workHour;
 
         /**
-         * 成本
-         */
-        @JsonProperty("F0000002")
-        private BigDecimal cost;
-
-        /**
          * 总人天
          */
         @JsonProperty("F0000005")
@@ -474,8 +502,6 @@ public class ChuanyunProjectScheduledTask {
         @JsonProperty("F0000006")
         private String status;
 
-        @JsonProperty("F0000007")
-        private BigDecimal amount;
     }
 
     @Data

+ 252 - 0
src/main/java/com/galaxis/manatee/task/EquipmentInfoTask.java

@@ -0,0 +1,252 @@
+package com.galaxis.manatee.task;
+
+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.capsule.dto.PageDTO;
+import com.galaxis.manatee.dao.*;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunEquipmentDO;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunEquipmentInformDO;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunGroupProjectDO;
+import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunDeviceConfigureDTO;
+import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunDeviceDTO;
+import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunSaveDTO;
+import com.galaxis.manatee.entity.chuanyun.dto.Filter;
+import com.galaxis.manatee.exception.BigSizeException;
+import com.galaxis.manatee.manager.ChuanYunManager;
+import com.galaxis.manatee.manager.ClawFeign;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+@Slf4j
+public class EquipmentInfoTask {
+
+    private final Integer pageSize=20;
+    private final ChuanYunManager chuanYunManager;
+    private final ClawFeign clawFeign;
+    private final ChuanyunMaterialDao chuanyunMaterialDao;
+
+
+    public EquipmentInfoTask(ChuanYunManager chuanYunManager, ClawFeign clawFeign, ChuanyunMaterialDao chuanyunMaterialDao) {
+        this.chuanYunManager = chuanYunManager;
+        this.clawFeign = clawFeign;
+        this.chuanyunMaterialDao = chuanyunMaterialDao;
+    }
+
+    @Scheduled(fixedDelay = 3600000L)
+    private void getDataFromChuanyun() {
+        saveDeviceInfo();
+        saveDeviceConfigure();
+    }
+
+    /**
+     * U9设备信息
+     */
+    private void saveDeviceInfo(){
+        var objectMapper=new ObjectMapper();
+        var totalCount=0L;
+        var page = 1;
+        var size = 20;
+        var flag=true;
+        while (flag){
+            Map<String,String> map=new HashMap<>(1);
+            map.put("page",String.valueOf(page));
+            map.put("size",String.valueOf(size));
+            PageDTO<ChuanyunDeviceDTO> pageInfo=clawFeign.findChuanyunDevice(map);
+            totalCount=pageInfo.getTotalElements();
+            if (page<=pageInfo.getTotalPages()){
+                page += 1;
+            }else {
+                flag = false;
+                break;
+            }
+            List<ChuanyunDeviceDTO> list = pageInfo.getContent();
+            list.forEach(chuanyunDeviceDTO -> {
+                try {
+                    if(chuanyunDeviceDTO != null) {
+                        List<String> projectmatchers = new ArrayList<>();
+                        projectmatchers.add("F0000002_2,"+chuanyunDeviceDTO.getProjectcode());
+                        var projectfilter= Filter.instance(0,Integer.MAX_VALUE,true,"And",projectmatchers);
+                        var chuanyunFindResponse = chuanYunManager.findAll(ChuanyunGroupProjectDO.SCHEMA_CODE,projectfilter);
+                        if (chuanyunFindResponse.getReturnData()!=null){
+                            List<ChuanyunGroupProjectDO> projectresult=objectMapper.convertValue(chuanyunFindResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                            projectresult.forEach(chuanyunGroupProjectDO -> {
+                                if (chuanyunGroupProjectDO.getProjectType().equals("实施")||chuanyunGroupProjectDO.getProjectType().equals("售后")){
+                                    chuanyunDeviceDTO.setProjectcode(chuanyunGroupProjectDO.getObjectId());
+                                }
+                            });
+                        }
+
+                        chuanyunMaterialDao.findByCode(chuanyunDeviceDTO.getItemcode()).ifPresent(chuanyunMaterialDO -> {
+                            chuanyunDeviceDTO.setItemcode(chuanyunMaterialDO.getObjectId());
+                        });
+                        DeviceInfoDTO deviceInfoDTO = new DeviceInfoDTO(chuanyunDeviceDTO);
+                        var purcostString=objectMapper.writeValueAsString(deviceInfoDTO);
+                        ChuanyunSaveDTO chuanyunSaveDTO;
+                        //根据项目号判断是否存在
+                        List<String> macthers = new ArrayList<>();
+                        macthers.add("F0000001_2,"+chuanyunDeviceDTO.getSncode());
+                        var filter= Filter.instance(0,1,true,"And",macthers);
+                        var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunEquipmentInformDO.SCHEMA_CODE,filter);
+                        if (chuanyunFindAllResponse.getReturnData() == null) {
+                            //新增
+                            chuanyunSaveDTO =chuanYunManager.save(ChuanyunEquipmentInformDO.SCHEMA_CODE,purcostString,true);
+                        }else {
+                            List<ChuanyunEquipmentInformDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                            ChuanyunEquipmentInformDO chuanyunProjectCashFlowDO = result.get(0);
+                            //更新
+                            chuanyunSaveDTO = chuanYunManager.update(ChuanyunEquipmentInformDO.SCHEMA_CODE,chuanyunProjectCashFlowDO.getObjectId(),purcostString);
+                        }
+                        if(chuanyunSaveDTO.getSuccessful()){
+//                            log.info("新增设备信息成功");
+                        }else{
+                            log.warn("新增设备信息失败");
+                        }
+                    }
+                } catch (JsonProcessingException | BigSizeException e) {
+                    e.printStackTrace();
+                }
+            });
+        }
+        log.info("设备信息完成更更新"+totalCount);
+    }
+
+    /**
+     * U9获取设备配置信息
+     */
+    private void saveDeviceConfigure(){
+        var objectMapper=new ObjectMapper();
+        var totalCount=0L;
+        var page = 1;
+        var size = 20;
+        var flag=true;
+        while (flag){
+            Map<String,String> map=new HashMap<>(1);
+            map.put("page",String.valueOf(page));
+            map.put("size",String.valueOf(size));
+            PageDTO<ChuanyunDeviceConfigureDTO> pageInfo=clawFeign.findChuanyunDeviceConfigure(map);
+            totalCount=pageInfo.getTotalElements();
+            if (page<=pageInfo.getTotalPages()){
+                page += 1;
+            }else {
+                flag = false;
+                break;
+            }
+            List<ChuanyunDeviceConfigureDTO> list = pageInfo.getContent();
+            list.forEach(chuanyunDeviceConfigureDTO -> {
+                try {
+                    List<String> matchers = new ArrayList<>();
+                    matchers.add("F0000001_2,"+chuanyunDeviceConfigureDTO.getChuanyunDeviceConfigurePrimaryKey().getSncode());
+                    var filter= Filter.instance(0,1,true,"And",matchers);
+                    var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunEquipmentInformDO.SCHEMA_CODE,filter);
+                    if (chuanyunFindAllResponse.getReturnData()!=null){
+                        List<ChuanyunEquipmentInformDO> projectresult=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                        chuanyunDeviceConfigureDTO.getChuanyunDeviceConfigurePrimaryKey().setSncode(projectresult.get(0).getObjectId());
+                    }
+
+                    List<String> projectmatchers = new ArrayList<>();
+                    projectmatchers.add("F0000001_2,"+chuanyunDeviceConfigureDTO.getChuanyunDeviceConfigurePrimaryKey().getSncode());
+                    projectmatchers.add("F0000002_2,"+chuanyunDeviceConfigureDTO.getChuanyunDeviceConfigurePrimaryKey().getLinenum());
+                    var projectfilter= Filter.instance(0,Integer.MAX_VALUE,true,"And",projectmatchers);
+                    var chuanyunFindResponse = chuanYunManager.findAll(ChuanyunEquipmentDO.SCHEMA_CODE,projectfilter);
+                    ChuanyunSaveDTO chuanyunSaveDTO;
+                    EquipmentDTO equipmentDTO = new EquipmentDTO(chuanyunDeviceConfigureDTO);
+                    var purcostString=objectMapper.writeValueAsString(equipmentDTO);
+                    if (chuanyunFindResponse.getReturnData()!=null){
+                        List<ChuanyunEquipmentDO> projectresult=objectMapper.convertValue(chuanyunFindResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                        chuanyunSaveDTO = chuanYunManager.update(ChuanyunEquipmentDO.SCHEMA_CODE,projectresult.get(0).getObjectId(),purcostString);
+                    }else {
+                        chuanyunSaveDTO =chuanYunManager.save(ChuanyunEquipmentDO.SCHEMA_CODE,purcostString,true);
+                    }
+                    if(chuanyunSaveDTO.getSuccessful()){
+//                        log.info("新增配置设备信息成功");
+                    }else{
+                        log.warn("新增配置设备信息失败");
+                    }
+                } catch (JsonProcessingException | BigSizeException e) {
+                    e.printStackTrace();
+                }
+            });
+        }
+        log.info("设备配置信息完成更新"+totalCount);
+    }
+
+    @Data
+    class EquipmentDTO{
+        /**
+         * 设备编号
+         */
+        @JsonProperty("F0000001")
+        private String equipmentCode;
+
+        /**
+         * 设备配置编号
+         */
+        @JsonProperty("F0000002")
+        private String equipmentConfigureCode;
+
+        /**
+         * 设备配置属性
+         */
+        @JsonProperty("F0000003")
+        private String equipmentConfigureAttribute;
+
+        /**
+         * 设备配置值
+         */
+        @JsonProperty("F0000004")
+        private String equipmentConfigureValue;
+
+        public EquipmentDTO(ChuanyunDeviceConfigureDTO chuanyunDeviceConfigureDTO){
+            if (null!=chuanyunDeviceConfigureDTO){
+                if (null!=chuanyunDeviceConfigureDTO.getChuanyunDeviceConfigurePrimaryKey().getSncode()){
+                    this.equipmentCode=chuanyunDeviceConfigureDTO.getChuanyunDeviceConfigurePrimaryKey().getSncode();
+                }
+                if (null!=chuanyunDeviceConfigureDTO.getChuanyunDeviceConfigurePrimaryKey().getLinenum()){
+                    this.equipmentConfigureCode=chuanyunDeviceConfigureDTO.getChuanyunDeviceConfigurePrimaryKey().getLinenum();
+                }
+                if (null!=chuanyunDeviceConfigureDTO.getPropertyname()){
+                    this.equipmentConfigureAttribute=chuanyunDeviceConfigureDTO.getPropertyname();
+                }
+                if (null!=chuanyunDeviceConfigureDTO.getPropertyvaluename()){
+                    this.equipmentConfigureValue=chuanyunDeviceConfigureDTO.getPropertyvaluename();
+                }
+            }
+        }
+    }
+
+    class DeviceInfoDTO {
+        @JsonProperty("F0000001")
+        private String equipmentCode;
+
+        @JsonProperty("F0000002")
+        private String equipmentMaterielCode;
+
+        @JsonProperty("F0000003")
+        private String projectId;
+
+        public DeviceInfoDTO(ChuanyunDeviceDTO chuanyunDeviceDTO){
+            if (null!=chuanyunDeviceDTO){
+                if (null!=chuanyunDeviceDTO.getSncode()){
+                    this.equipmentCode=chuanyunDeviceDTO.getSncode();
+                }
+                if(null!=chuanyunDeviceDTO.getItemcode()){
+                    this.equipmentMaterielCode=chuanyunDeviceDTO.getItemcode();
+                }
+                if (null!=chuanyunDeviceDTO.getProjectcode()){
+                    this.projectId=chuanyunDeviceDTO.getProjectcode();
+                }
+            }
+        }
+    }
+}

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

@@ -0,0 +1,505 @@
+package com.galaxis.manatee.task;
+
+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.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.galaxis.capsule.dto.PageDTO;
+import com.galaxis.manatee.dao.*;
+import com.galaxis.manatee.entity.chuanyun.data.object.*;
+import com.galaxis.manatee.entity.chuanyun.dto.*;
+import com.galaxis.manatee.exception.BigSizeException;
+import com.galaxis.manatee.manager.ChuanYunManager;
+import com.galaxis.manatee.manager.ClawFeign;
+import com.galaxis.manatee.util.ChuanyunLocalDateTimeDeserializer;
+import com.galaxis.manatee.util.ChuanyunLocalDateTimeSerializer;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class U9InfoTask {
+
+    private final Integer pageSize=20;
+    private final ChuanYunManager chuanYunManager;
+    private final ClawFeign clawFeign;
+    private final ChuanyunBudgetStatisticsDao chuanyunBudgetStatisticsDao;
+
+
+    public U9InfoTask(ChuanYunManager chuanYunManager, ClawFeign clawFeign, ChuanyunBudgetStatisticsDao chuanyunBudgetStatisticsDao) {
+        this.chuanYunManager = chuanYunManager;
+        this.clawFeign = clawFeign;
+        this.chuanyunBudgetStatisticsDao = chuanyunBudgetStatisticsDao;
+
+    }
+
+    @Scheduled(fixedDelay = 3600000L)
+    private void getDataFromU9() {
+        savePurCost();
+        saveCashFlow();
+        saveSupplier();
+        saveLaborCost();
+        saveBudgetStatistics();
+    }
+
+    /**
+     * 更新项目物料成本
+     */
+    private void savePurCost() {
+        var objectMapper=new ObjectMapper();
+        var page = 1;
+        var size = 20;
+        var flag=true;
+        while (flag) {
+            Map<String,String> map=new HashMap<>(1);
+            map.put("page",String.valueOf(page));
+            map.put("size",String.valueOf(size));
+            //获取物料成本
+            PageDTO<ChuanyunPurCostDTO> pageInfo = clawFeign.findChuanyunPurCost(map);
+            if (page<=pageInfo.getTotalPages()){
+                page += 1;
+            }else {
+                flag = false;
+                break;
+            }
+            List<ChuanyunPurCostDTO> list = pageInfo.getContent();
+            list.forEach(chuanyunPurCostDTO -> {
+                try {
+                    if(chuanyunPurCostDTO != null) {
+                        PurCostDTO purCostDTO = new PurCostDTO(chuanyunPurCostDTO);
+                        var purcostString=objectMapper.writeValueAsString(purCostDTO);
+                        ChuanyunSaveDTO chuanyunSaveDTO;
+                        //根据项目号判断是否存在
+                        List<String> macthers = new ArrayList<>();
+                        macthers.add("F0000001_2,"+chuanyunPurCostDTO.getProjectcode());
+                        var filter= Filter.instance(0,1,true,"And",macthers);
+                        var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunPurCostDO.SCHEMA_CODE,filter);
+                        if (chuanyunFindAllResponse.getReturnData() == null) {
+                            //新增
+                            chuanyunSaveDTO =chuanYunManager.save(ChuanyunPurCostDO.SCHEMA_CODE,purcostString,true);
+                        }else {
+                            List<ChuanyunPurCostDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                            ChuanyunPurCostDO chuanyunPurCostDO = result.get(0);
+                            //更新
+                            chuanyunSaveDTO = chuanYunManager.update(ChuanyunPurCostDO.SCHEMA_CODE,chuanyunPurCostDO.getObjectId(),purcostString);
+                        }
+                        if(chuanyunSaveDTO.getSuccessful()){
+//                            log.info("新增项目物料成本成功");
+                        }else{
+                            log.warn("新增项目物料成本失败");
+                        }
+                    }
+                } catch (JsonProcessingException | BigSizeException e) {
+                    e.printStackTrace();
+                }
+            });
+        }
+    }
+
+    /**
+     * 更新项目收付款
+     */
+    private void saveCashFlow() {
+        var objectMapper=new ObjectMapper();
+        var page = 1;
+        var size = 20;
+        var flag=true;
+        while (flag) {
+            Map<String,String> map=new HashMap<>(1);
+            map.put("page",String.valueOf(page));
+            map.put("size",String.valueOf(size));
+            //获取收付款
+            PageDTO<ChuanyunProjectCashFlowDTO> pageInfo = clawFeign.findChuanyunProjectCashFlow(map);
+            if (page<=pageInfo.getTotalPages()){
+                page += 1;
+            }else {
+                flag = false;
+                break;
+            }
+            List<ChuanyunProjectCashFlowDTO> list = pageInfo.getContent();
+            list.forEach(chuanyunProjectCashFlowDTO -> {
+                try {
+                    if(chuanyunProjectCashFlowDTO != null) {
+                        CashFlowDTO cashFlowDTO = new CashFlowDTO(chuanyunProjectCashFlowDTO);
+                        var purcostString=objectMapper.writeValueAsString(cashFlowDTO);
+                        ChuanyunSaveDTO chuanyunSaveDTO;
+                        //根据项目号判断是否存在
+                        List<String> macthers = new ArrayList<>();
+                        macthers.add("F0000001_2,"+chuanyunProjectCashFlowDTO.getProjectcode());
+                        var filter= Filter.instance(0,1,true,"And",macthers);
+                        var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunProjectCashFlowDO.SCHEMA_CODE,filter);
+                        if (chuanyunFindAllResponse.getReturnData() == null) {
+                            //新增
+                            chuanyunSaveDTO =chuanYunManager.save(ChuanyunProjectCashFlowDO.SCHEMA_CODE,purcostString,true);
+                        }else {
+                            List<ChuanyunProjectCashFlowDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                            ChuanyunProjectCashFlowDO chuanyunProjectCashFlowDO = result.get(0);
+                            //更新
+                            chuanyunSaveDTO = chuanYunManager.update(ChuanyunProjectCashFlowDO.SCHEMA_CODE,chuanyunProjectCashFlowDO.getObjectId(),purcostString);
+                        }
+                        if(chuanyunSaveDTO.getSuccessful()){
+//                            log.info("新增项目收付款成功");
+                        }else{
+                            log.warn("新增项目收付款失败");
+                        }
+                    }
+                } catch (JsonProcessingException | BigSizeException e) {
+                    e.printStackTrace();
+                }
+            });
+        }
+    }
+
+    /**
+     * U9供应商信息
+     */
+    private void saveSupplier() {
+        var objectMapper=new ObjectMapper();
+        var page = 1;
+        var size = 20;
+        var flag=true;
+        while (flag) {
+            Map<String,String> map=new HashMap<>(1);
+            map.put("page",String.valueOf(page));
+            map.put("size",String.valueOf(size));
+            //获取供应商信息
+            PageDTO<ChuanyunSupplierDTO> pageInfo=clawFeign.findChuanyunSupplier(map);
+            if (page<=pageInfo.getTotalPages()){
+                page += 1;
+            }else {
+                flag = false;
+                break;
+            }
+            List<ChuanyunSupplierDTO> list = pageInfo.getContent();
+            list.forEach(chuanyunSupplierDTO -> {
+                SupplierDTO supplierDTO = new SupplierDTO(chuanyunSupplierDTO);
+                try {
+                    var supplierString = objectMapper.writeValueAsString(supplierDTO);
+                    ChuanyunSaveDTO chuanyunSaveDTO;
+                    //根据编码判断供应商是否存在
+                    List<String> macthers = new ArrayList<>();
+                    macthers.add("F0000001_2,"+chuanyunSupplierDTO.getName());
+                    var filter= Filter.instance(0,1,true,"And",macthers);
+                    var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunSupplierDO.SCHEMA_CODE,filter);
+                    if (chuanyunFindAllResponse.getReturnData() == null) {
+                        chuanyunSaveDTO=chuanYunManager.save(ChuanyunSupplierDO.SCHEMA_CODE,supplierString,true);
+                    }else {
+                        List<ChuanyunSupplierDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                        chuanyunSaveDTO=chuanYunManager.update(ChuanyunSupplierDO.SCHEMA_CODE,result.get(0).getObjectId(),supplierString);
+                    }
+                    if(chuanyunSaveDTO.getSuccessful()){
+//                        log.info("新增供应商信息成功");
+                    }else{
+                        log.warn("新增供应商信息失败");
+                    }
+                } catch (JsonProcessingException | BigSizeException e) {
+                    e.printStackTrace();
+                }
+
+            });
+        }
+    }
+
+    /**
+     * 新增人力成本
+     */
+    private void saveLaborCost() {
+        var objectMapper=new ObjectMapper();
+        var page = 1;
+        var size = 20;
+        var flag=true;
+        while (flag) {
+            Map<String,String> map=new HashMap<>(1);
+            map.put("page",String.valueOf(page));
+            map.put("size",String.valueOf(size));
+            //获取物料成本
+            PageDTO<ChuanyunLaborCostDTO> pageInfo = clawFeign.findChuanyunLaborCost(map);
+            if (page<=pageInfo.getTotalPages()){
+                page += 1;
+            }else {
+                flag = false;
+                break;
+            }
+            List<ChuanyunLaborCostDTO> list = pageInfo.getContent();
+            list.forEach(chuanyunLaborCostDTO -> {
+                try {
+                    if(chuanyunLaborCostDTO != null) {
+                        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
+                        String newDate = dateTimeFormatter.format(chuanyunLaborCostDTO.getChuanyunLaborCostPrimaryKey().getPeriod());
+                        LocalDateTime dt = LocalDateTime.parse(newDate,dateTimeFormatter);
+                        chuanyunLaborCostDTO.getChuanyunLaborCostPrimaryKey().setPeriod(dt);
+                        LaborCostDTO laborCostDTO = new LaborCostDTO(chuanyunLaborCostDTO);
+                        laborCostDTO.setDataType("U9");
+                        var purcostString=objectMapper.writeValueAsString(laborCostDTO);
+                        ChuanyunSaveDTO chuanyunSaveDTO;
+                        //根据项目号判断是否存在
+                        List<String> matchers = new ArrayList<>();
+                        matchers.add("F0000005_2,"+chuanyunLaborCostDTO.getChuanyunLaborCostPrimaryKey().getProjectcode());
+                        matchers.add("F0000002_2,"+chuanyunLaborCostDTO.getChuanyunLaborCostPrimaryKey().getPeriod());
+                        var filter= Filter.instance(0,1,true,"And",matchers);
+                        var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunMonthLaborCostDO.SCHEMA_CODE,filter);
+                        if (chuanyunFindAllResponse.getReturnData() == null) {
+                            //新增
+                            chuanyunSaveDTO =chuanYunManager.save(ChuanyunMonthLaborCostDO.SCHEMA_CODE,purcostString,true);
+                        }else {
+                            List<ChuanyunMonthLaborCostDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+//                            ChuanyunMonthLaborCostDO chuanyunMonthLaborCostDO = result.get(0);
+                            //更新
+                            chuanyunSaveDTO = chuanYunManager.update(ChuanyunMonthLaborCostDO.SCHEMA_CODE,result.get(0).getObjectId(),purcostString);
+                        }
+                        if(chuanyunSaveDTO.getSuccessful()){
+//                            log.info("新增项目人力成本成功");
+                        }else{
+                            log.warn("新增项目人力成本失败");
+                        }
+                    }
+                } catch (JsonProcessingException | BigSizeException e) {
+                    e.printStackTrace();
+                }
+            });
+        }
+    }
+
+    /**
+     * 更新项目预决算统计
+     */
+    private void saveBudgetStatistics() {
+        List<ChuanyunBudgetStatisticsDO> list = chuanyunBudgetStatisticsDao.findAll();
+        list.forEach(chuanyunBudgetStatisticsDO -> {
+            if (!StringUtils.isEmpty(chuanyunBudgetStatisticsDO.getProject())){
+                var objectMapper = new ObjectMapper();
+                try {
+                    //集团总表中查找项目
+                    List<String> projectmatchers = new ArrayList<>();
+                    projectmatchers.add("Name_2,"+chuanyunBudgetStatisticsDO.getProject());
+                    var projectfilter= Filter.instance(0,1,true,"And",projectmatchers);
+                    var chuanyunFindResponse = chuanYunManager.findAll(ChuanyunGroupProjectDO.SCHEMA_CODE,projectfilter);
+                    if (chuanyunFindResponse.getReturnData()!=null){
+                        List<ChuanyunGroupProjectDO> projectresult=objectMapper.convertValue(chuanyunFindResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                        chuanyunBudgetStatisticsDO.setProject(projectresult.get(0).getObjectId());
+                        List<String> matchers = new ArrayList<>();
+                        ChuanyunSaveDTO chuanyunSaveDTO;
+                        matchers.add("F0000001_2,"+chuanyunBudgetStatisticsDO.getProject());
+                        matchers.add("F0000002_2,"+chuanyunBudgetStatisticsDO.getFeeType());
+                        var filter= Filter.instance(0,1,true,"And",matchers);
+                        var chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunBudgetAmountDO.SCHEMA_CODE,filter);
+                        BudgetDTO budgetDTO = new BudgetDTO(chuanyunBudgetStatisticsDO);
+                        budgetDTO.setDate(LocalDateTime.of(2020,2,1,0,0));
+                        var budgetString = objectMapper.writeValueAsString(budgetDTO);
+                        if (chuanyunFindAllResponse.getReturnData() != null) {
+                            List<ChuanyunBudgetAmountDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                            ChuanyunBudgetAmountDO chuanyunBudgetAmountDO = result.get(0);
+                            chuanyunSaveDTO = chuanYunManager.update(ChuanyunBudgetAmountDO.SCHEMA_CODE,chuanyunBudgetAmountDO.getObjectId(),budgetString);
+                        }else {
+                            chuanyunSaveDTO = chuanYunManager.save(ChuanyunBudgetAmountDO.SCHEMA_CODE,budgetString,true);
+                        }
+                        if(chuanyunSaveDTO.getSuccessful()){
+//                            log.info("新增项目预决算统计成功");
+                        }else{
+                            log.warn("新增项目预决算统计失败");
+                        }
+                    }
+                } catch (JsonProcessingException | BigSizeException e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+    }
+
+    @Data
+    class PurCostDTO {
+        @JsonProperty("F0000001")
+        private String projectcode;
+
+        /**
+         * 采购成本
+         */
+        @JsonProperty("F0000002")
+        private BigDecimal purcost;
+
+        /**
+         * 领料成本
+         */
+        @JsonProperty("F0000003")
+        private BigDecimal issuedcost;
+
+        public PurCostDTO(ChuanyunPurCostDTO chuanyunPurCostDTO) {
+            if (null!=chuanyunPurCostDTO) {
+                if (null != chuanyunPurCostDTO.getProjectcode()) {
+                    this.projectcode = chuanyunPurCostDTO.getProjectcode();
+                }
+                if (null != chuanyunPurCostDTO.getPurcost()) {
+                    this.purcost = chuanyunPurCostDTO.getPurcost();
+                }
+                if (null != chuanyunPurCostDTO.getIssuedcost()) {
+                    this.issuedcost = chuanyunPurCostDTO.getIssuedcost();
+                }
+            }
+        }
+    }
+
+    @Data
+    class SupplierDTO{
+        /**
+         * 供应商名称
+         */
+        @JsonProperty("F0000001")
+        private String supplierName;
+
+        /**
+         * U9代码
+         */
+        @JsonProperty("F0000002")
+        private String supplierCode;
+
+        public SupplierDTO(ChuanyunSupplierDTO chuanyunSupplierDTO) {
+            if (null!=chuanyunSupplierDTO){
+                if (null!=chuanyunSupplierDTO.getCode()){
+                    this.supplierCode=chuanyunSupplierDTO.getCode();
+                }
+                if (null!=chuanyunSupplierDTO.getName()){
+                    this.supplierName=chuanyunSupplierDTO.getName();
+                }
+            }
+        }
+    }
+
+    @Data
+    class LaborCostDTO {
+
+        @JsonProperty("F0000005")
+        private String projectCode;
+
+        @JsonProperty("F0000003")
+        private BigDecimal amount;
+
+        @JsonProperty("F0000002")
+        @JsonSerialize(using = ChuanyunLocalDateTimeSerializer.class)
+        @JsonDeserialize(using = ChuanyunLocalDateTimeDeserializer.class)
+        private LocalDateTime logDate;
+
+        @JsonProperty("F0000004")
+        private String dataType;
+
+        public LaborCostDTO(ChuanyunLaborCostDTO chuanyunMonthLaborCostDTO) {
+            if (null!=chuanyunMonthLaborCostDTO){
+                if (null!=chuanyunMonthLaborCostDTO.getCostamount()){
+                    this.amount=chuanyunMonthLaborCostDTO.getCostamount();
+                }
+                if (null!=chuanyunMonthLaborCostDTO.getChuanyunLaborCostPrimaryKey().getProjectcode()){
+                    this.projectCode=chuanyunMonthLaborCostDTO.getChuanyunLaborCostPrimaryKey().getProjectcode();
+                }
+                if (null!=chuanyunMonthLaborCostDTO.getChuanyunLaborCostPrimaryKey().getPeriod()){
+                    this.logDate=chuanyunMonthLaborCostDTO.getChuanyunLaborCostPrimaryKey().getPeriod();
+                }
+            }
+        }
+    }
+
+    @Data
+    class BudgetDTO{
+
+        /**
+         * 所属项目
+         */
+        @JsonProperty("F0000001")
+        private String project;
+
+        /**
+         * 费用类型
+         */
+        @JsonProperty("F0000002")
+        private String feeType;
+
+        /**
+         * 预算金额
+         */
+        @JsonProperty("F0000003")
+        private BigDecimal budgetAmount;
+
+        /**
+         * 默认日期(4月份)
+         */
+        @JsonProperty("F0000006")
+        @JsonSerialize(using = ChuanyunLocalDateTimeSerializer.class)
+        @JsonDeserialize(using = ChuanyunLocalDateTimeDeserializer.class)
+        private LocalDateTime date;
+
+        /**
+         * 决算金额
+         */
+        @JsonProperty("F0000004")
+        private BigDecimal finalAmount;
+
+        /**
+         * 预算绝算差异
+         */
+        @JsonProperty("F0000005")
+        private BigDecimal differenceAmount;
+
+        public BudgetDTO(ChuanyunBudgetStatisticsDO chuanyunBudgetStatisticsDO) {
+            if (null!=chuanyunBudgetStatisticsDO){
+                if (null!=chuanyunBudgetStatisticsDO.getBudgetAmount()){
+                    this.budgetAmount=chuanyunBudgetStatisticsDO.getBudgetAmount();
+                }
+                if (null!=chuanyunBudgetStatisticsDO.getFinalAmount()){
+                    this.finalAmount=chuanyunBudgetStatisticsDO.getFinalAmount();
+                }
+                if (null!=chuanyunBudgetStatisticsDO.getFeeType()){
+                    this.feeType=chuanyunBudgetStatisticsDO.getFeeType();
+                }
+                if (null!=chuanyunBudgetStatisticsDO.getProject()){
+                    this.project=chuanyunBudgetStatisticsDO.getProject();
+                }
+                if (null!=chuanyunBudgetStatisticsDO.getDifferenceAmount()){
+                    this.differenceAmount=chuanyunBudgetStatisticsDO.getDifferenceAmount();
+                }
+            }
+        }
+    }
+
+    @Data
+    class CashFlowDTO {
+        @JsonProperty("F0000001")
+        private String projectcode;
+
+        /**
+         * 收款金额
+         */
+        @JsonProperty("F0000002")
+        private BigDecimal income;
+
+        /**
+         * 付款金额
+         */
+        @JsonProperty("F0000003")
+        private BigDecimal outcome;
+
+        public CashFlowDTO(ChuanyunProjectCashFlowDTO chuanyunProjectCashFlowDTO) {
+            if (null!=chuanyunProjectCashFlowDTO) {
+                if (null!=chuanyunProjectCashFlowDTO.getProjectcode()) {
+                    this.projectcode=chuanyunProjectCashFlowDTO.getProjectcode();
+                }
+                if (null!=chuanyunProjectCashFlowDTO.getOutcome()) {
+                    this.outcome=chuanyunProjectCashFlowDTO.getOutcome();
+                }
+                if (null!=chuanyunProjectCashFlowDTO.getIncome()) {
+                    this.income=chuanyunProjectCashFlowDTO.getIncome();
+                }
+            }
+        }
+    }
+}

+ 97 - 53
src/main/java/com/galaxis/manatee/task/WorkHourStatistics.java

@@ -57,10 +57,18 @@ public class WorkHourStatistics {
         this.chuanyunWeekMemberHourDao = chuanyunWeekMemberHourDao;
     }
 
+
+    @Scheduled(cron = "0 0 2 ? * SAT")
+    public void updateHour() {
+        standardWorkHour();
+        standardWeeklyWorkHour();
+        standardMonthlyWorkHour();
+        quitStandradHour();
+    }
+
     /**
-     * 人力成本
+     * 每日工时标准化
      */
-    @Scheduled(fixedDelay = 3600000L)
     private void standardWorkHour() {
         var flag = true;
         var pageSize = 20;
@@ -134,35 +142,37 @@ public class WorkHourStatistics {
     /**
      * 人员-项目-周度工时汇总
      */
-    @Scheduled(fixedDelay = 3600000L)
     private void standardWeeklyWorkHour() {
         long start=Instant.now().getEpochSecond();
-
         //更新数据库
         log.info("开始周工时标准化");
         List<ChuanyunWeekMemberHourDO> list = chuanyunWeekMemberHourDao.getWeekMemberHour();
         list.forEach(chuanyunWeekMemberHourDO -> {
-            if (chuanyunWeekMemberHourDO!=null){
-                ChuanyunWeekMemberHourDO weekMemberHourDO = new ChuanyunWeekMemberHourDO();
-                weekMemberHourDO.setProjectId(chuanyunWeekMemberHourDO.getProjectId());
-                weekMemberHourDO.setProjectType(chuanyunWeekMemberHourDO.getProjectType());
-                weekMemberHourDO.setStandardWorkHour(chuanyunWeekMemberHourDO.getStandardWorkHour());
-                weekMemberHourDO.setStatus(chuanyunWeekMemberHourDO.getStatus());
-                weekMemberHourDO.setUserId(chuanyunWeekMemberHourDO.getUserId());
-                weekMemberHourDO.setYear(chuanyunWeekMemberHourDO.getYear());
-                weekMemberHourDO.setWeek(chuanyunWeekMemberHourDO.getWeek());
-                ChuanyunWeekMemberHourDO oldWeekHour = chuanyunWeekMemberHourDao.findByProjectIdAndUserIdAndWeekAndStatusAndProjectTypeAndYear(chuanyunWeekMemberHourDO.getProjectId(),chuanyunWeekMemberHourDO.getUserId(),chuanyunWeekMemberHourDO.getWeek(),chuanyunWeekMemberHourDO.getStatus(),chuanyunWeekMemberHourDO.getProjectType(),chuanyunWeekMemberHourDO.getYear());
-                if (oldWeekHour != null) {
-                    chuanyunWeekMemberHourDao.delete(oldWeekHour);
-                }
-                chuanyunWeekMemberHourDao.save(weekMemberHourDO);
-                //搜索是否还有处于审批中的数据
-                ChuanyunWeekMemberHourDO processWeekHour = chuanyunWeekMemberHourDao.getProcessWeekHour(chuanyunWeekMemberHourDO.getProjectId(),chuanyunWeekMemberHourDO.getUserId(),chuanyunWeekMemberHourDO.getYear(),chuanyunWeekMemberHourDO.getWeek(),chuanyunWeekMemberHourDO.getProjectType());
-                if (processWeekHour == null){
-                    chuanyunWeekMemberHourDao.deleteByProjectIdAndUserIdAndYearAndWeekAndStatusAndProjectType(chuanyunWeekMemberHourDO.getProjectId(),chuanyunWeekMemberHourDO.getUserId(),chuanyunWeekMemberHourDO.getYear(),chuanyunWeekMemberHourDO.getWeek(),"2",chuanyunWeekMemberHourDO.getProjectType());
-                    //同时删除氚云钟数据
-                    deleteExamineStatus(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,"F0000007","F0000001",chuanyunWeekMemberHourDO.getProjectId(),"F0000002",chuanyunWeekMemberHourDO.getUserId(),"F0000008",chuanyunWeekMemberHourDO.getYear(),"","","F0000006",chuanyunWeekMemberHourDO.getWeek(),"F0000003",chuanyunWeekMemberHourDO.getProjectType());
+            try{
+                if (chuanyunWeekMemberHourDO!=null){
+                    ChuanyunWeekMemberHourDO weekMemberHourDO = new ChuanyunWeekMemberHourDO();
+                    weekMemberHourDO.setProjectId(chuanyunWeekMemberHourDO.getProjectId());
+                    weekMemberHourDO.setProjectType(chuanyunWeekMemberHourDO.getProjectType());
+                    weekMemberHourDO.setStandardWorkHour(chuanyunWeekMemberHourDO.getStandardWorkHour());
+                    weekMemberHourDO.setStatus(chuanyunWeekMemberHourDO.getStatus());
+                    weekMemberHourDO.setUserId(chuanyunWeekMemberHourDO.getUserId());
+                    weekMemberHourDO.setYear(chuanyunWeekMemberHourDO.getYear());
+                    weekMemberHourDO.setWeek(chuanyunWeekMemberHourDO.getWeek());
+                    ChuanyunWeekMemberHourDO oldWeekHour = chuanyunWeekMemberHourDao.findByProjectIdAndUserIdAndWeekAndStatusAndProjectTypeAndYear(chuanyunWeekMemberHourDO.getProjectId(),chuanyunWeekMemberHourDO.getUserId(),chuanyunWeekMemberHourDO.getWeek(),chuanyunWeekMemberHourDO.getStatus(),chuanyunWeekMemberHourDO.getProjectType(),chuanyunWeekMemberHourDO.getYear());
+                    if (oldWeekHour != null) {
+                        chuanyunWeekMemberHourDao.delete(oldWeekHour);
+                    }
+                    chuanyunWeekMemberHourDao.save(weekMemberHourDO);
+                    //搜索是否还有处于审批中的数据
+                    ChuanyunWeekMemberHourDO processWeekHour = chuanyunWeekMemberHourDao.getProcessWeekHour(chuanyunWeekMemberHourDO.getProjectId(),chuanyunWeekMemberHourDO.getUserId(),chuanyunWeekMemberHourDO.getYear(),chuanyunWeekMemberHourDO.getWeek(),chuanyunWeekMemberHourDO.getProjectType());
+                    if (processWeekHour == null){
+                        chuanyunWeekMemberHourDao.deleteByProjectIdAndUserIdAndYearAndWeekAndStatusAndProjectType(chuanyunWeekMemberHourDO.getProjectId(),chuanyunWeekMemberHourDO.getUserId(),chuanyunWeekMemberHourDO.getYear(),chuanyunWeekMemberHourDO.getWeek(),"2",chuanyunWeekMemberHourDO.getProjectType());
+                        //同时删除氚云钟数据
+                        deleteExamineStatus(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,"F0000007","F0000001",chuanyunWeekMemberHourDO.getProjectId(),"F0000002",chuanyunWeekMemberHourDO.getUserId(),"F0000008",chuanyunWeekMemberHourDO.getYear(),"","","F0000006",chuanyunWeekMemberHourDO.getWeek(),"F0000003",chuanyunWeekMemberHourDO.getProjectType());
+                    }
                 }
+            }catch (Exception e){
+                log.error(e.getMessage()+"周工时标准化异常");
             }
         });
         log.info("周工时标准化"+(Instant.now().getEpochSecond()-start)+"秒");
@@ -172,7 +182,6 @@ public class WorkHourStatistics {
     /**
      * 单月工时汇总
      */
-    @Scheduled(fixedDelay = 3600000L)
     private void standardMonthlyWorkHour() {
         var flag = true;
         var pageSize = 20;
@@ -242,7 +251,6 @@ public class WorkHourStatistics {
         list.forEach(projectMonth->{
             //获取人员-月度-相同工时状态标准工时汇总
             ChuanyunSelfWorkHourDO monthHour = chuanyunSelfWorkHourDao.getMonthHour(projectMonth.getUserId(),df.format(projectMonth.getDayLogDate()),projectMonth.getStatus());
-
             ChuanyunSelfCostDO chuanyunSelfCostDO = new ChuanyunSelfCostDO();
             chuanyunSelfCostDO.setStatus(projectMonth.getStatus());
             if (monthHour!=null){
@@ -327,7 +335,6 @@ public class WorkHourStatistics {
         var pageSize = 20;
         var page = 0;
         log.info("开始更新周工时汇总");
-//        deleteExamineStatus(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,"F0000007");
         long startTime=Instant.now().getEpochSecond();
         while(flag) {
             var pageable = PageRequest.of(page, pageSize);
@@ -391,8 +398,6 @@ public class WorkHourStatistics {
         var pageSize = 20;
         var page = 0;
         log.info("开始更新月工时汇总");
-        //删除氚云表单审核中数据
-//        deleteExamineStatus(ChuanyunMemberMonthCostDO.SCHEMA_CODE,"F0000009");
         long startTime=Instant.now().getEpochSecond();
         while(flag) {
             var pageable = PageRequest.of(page, pageSize);
@@ -401,7 +406,6 @@ public class WorkHourStatistics {
                 page += 1;
                 updateList.getContent().forEach(chuanyunSelfCostDO -> {
                     ChuanyunMemberMonthCostDTO chuanyunMemberMonthCostDTO = new ChuanyunMemberMonthCostDTO();
-
                     //更新氚云数据
                     chuanyunMemberMonthCostDTO.setCost(chuanyunSelfCostDO.getCost());
                     chuanyunMemberMonthCostDTO.setProjectId(chuanyunSelfCostDO.getProjectId());
@@ -412,30 +416,32 @@ public class WorkHourStatistics {
                     chuanyunMemberMonthCostDTO.setDayLogDate(chuanyunSelfCostDO.getDayLogDate());
                     chuanyunMemberMonthCostDTO.setWorkHour(chuanyunSelfCostDO.getTotalHour());
                     chuanyunMemberMonthCostDTO.setDepartmentId(chuanyunSelfCostDO.getDepartmentId());
-                    try {
-                        List<String> matchers = new ArrayList<>();
-                        matchers.add("F0000003_2,"+chuanyunSelfCostDO.getProjectId());
-                        matchers.add("F0000009_2,"+chuanyunSelfCostDO.getStatus());
-                        matchers.add("F0000002_2,"+chuanyunSelfCostDO.getUserId());
-                        matchers.add("F0000008_2,"+chuanyunSelfCostDO.getProjectType());
-                        matchers.add("F0000004_2,"+chuanyunSelfCostDO.getDayLogDate());
-                        var filter= Filter.instance(0,1,true,"And",matchers);
-                        var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunMemberMonthCostDO.SCHEMA_CODE,filter);
-                        var memberMonthString=objectMapper.writeValueAsString(chuanyunMemberMonthCostDTO);
-                        ChuanyunSaveDTO chuanyunSaveDTO;
-                        if (chuanyunFindAllResponse.getReturnData()!=null){
-                            List<ChuanyunMemberMonthCostDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
-                            ChuanyunMemberMonthCostDO firstResult = result.get(0);
-                            chuanyunSaveDTO =chuanYunManager.update(ChuanyunMemberMonthCostDO.SCHEMA_CODE,firstResult.getObjectId(),memberMonthString);
-                        }else {
-                            chuanyunSaveDTO =chuanYunManager.save(ChuanyunMemberMonthCostDO.SCHEMA_CODE,memberMonthString,true);
-                        }
-                        if(!chuanyunSaveDTO.getSuccessful()){
-                            log.warn("新增项目成员月度成本汇总失败");
+                    if (!StringUtils.isEmpty(chuanyunSelfCostDO.getProjectId())){
+                        try {
+                            List<String> matchers = new ArrayList<>();
+                            matchers.add("F0000003_2,"+chuanyunSelfCostDO.getProjectId());
+                            matchers.add("F0000009_2,"+chuanyunSelfCostDO.getStatus());
+                            matchers.add("F0000002_2,"+chuanyunSelfCostDO.getUserId());
+                            matchers.add("F0000008_2,"+chuanyunSelfCostDO.getProjectType());
+                            matchers.add("F0000004_2,"+chuanyunSelfCostDO.getDayLogDate());
+                            var filter= Filter.instance(0,1,true,"And",matchers);
+                            var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunMemberMonthCostDO.SCHEMA_CODE,filter);
+                            var memberMonthString=objectMapper.writeValueAsString(chuanyunMemberMonthCostDTO);
+                            ChuanyunSaveDTO chuanyunSaveDTO;
+                            if (chuanyunFindAllResponse.getReturnData()!=null){
+                                List<ChuanyunMemberMonthCostDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                                ChuanyunMemberMonthCostDO firstResult = result.get(0);
+                                chuanyunSaveDTO =chuanYunManager.update(ChuanyunMemberMonthCostDO.SCHEMA_CODE,firstResult.getObjectId(),memberMonthString);
+                            }else {
+                                chuanyunSaveDTO =chuanYunManager.save(ChuanyunMemberMonthCostDO.SCHEMA_CODE,memberMonthString,true);
+                            }
+                            if(!chuanyunSaveDTO.getSuccessful()){
+                                log.warn("新增项目成员月度成本汇总失败");
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                            log.warn("########"+chuanyunSelfCostDO+"");
                         }
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                        log.warn("########"+chuanyunSelfCostDO+"");
                     }
                 });
             }else {
@@ -447,6 +453,44 @@ public class WorkHourStatistics {
     }
 
     /**
+     * 离职人员工时标准化
+     */
+    private void quitStandradHour() {
+        List<ChuanyunWorkHourDO> selfList = chuanyunWorkHourDao.getQuitSelfWorkHour();
+        selfList.forEach(self -> {
+            BigDecimal standard = new BigDecimal(8);
+            if (self!=null){
+                ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO = new ChuanyunSelfWorkHourDO();
+                chuanyunSelfWorkHourDO.setStatus(self.getStatus());
+                chuanyunSelfWorkHourDO.setUserId(self.getUserId());
+                chuanyunSelfWorkHourDO.setProjectType(self.getProjectType());
+                if(ChuanYunConstant.PRODUCTION_PROJECT.equals(self.getProjectType())){
+                    chuanyunSelfWorkHourDO.setProjectId(ChuanYunConstant.PRODUCTION_PROJECT_ID);
+                }else{
+                    chuanyunSelfWorkHourDO.setProjectId(self.getProjectId());
+                }
+                chuanyunSelfWorkHourDO.setDayLogDate(self.getDayLogDate());
+                ChuanyunWorkHourDO chuanyunWorkHourDO = chuanyunWorkHourDao.getQuitDayWorkHour(self.getUserId(),self.getDayLogDate());
+                if (chuanyunWorkHourDO!=null){
+                    if (chuanyunWorkHourDO.getHoursWorked().compareTo(standard)<=0) {
+                        chuanyunSelfWorkHourDO.setStandardWorkHour(self.getHoursWorked());
+                    }else {
+                        BigDecimal personDays = (self.getHoursWorked().divide(chuanyunWorkHourDO.getHoursWorked(), 2, RoundingMode.HALF_UP)).multiply(standard);
+                        chuanyunSelfWorkHourDO.setStandardWorkHour(personDays);
+                    }
+                    ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO1 = chuanyunSelfWorkHourDao.findByUserIdAndAndProjectIdAndAndDayLogDateAndProjectType(self.getUserId(),ChuanYunConstant.PRODUCTION_PROJECT.equals(self.getProjectType())?ChuanYunConstant.PRODUCTION_PROJECT_ID:self.getProjectId(),self.getDayLogDate(),self.getProjectType());
+                    if (chuanyunSelfWorkHourDO1!=null){
+                        chuanyunSelfWorkHourDao.delete(chuanyunSelfWorkHourDO1);
+                    }
+                    chuanyunSelfWorkHourDao.save(chuanyunSelfWorkHourDO);
+//                    log.info(chuanyunSelfWorkHourDO.getUserId()+"工时标准化");
+                }
+            }
+        });
+        log.info("离职人员工时标准化完成"+selfList.size());
+    }
+
+    /**
      * 删除状态为审核中数据
      * @param schemaCode
      * @param

+ 573 - 0
src/main/java/com/galaxis/manatee/task/WorkHourStatisticsRecently.java

@@ -0,0 +1,573 @@
+package com.galaxis.manatee.task;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+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.ChuanyunFindAllBizDTO;
+import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunSaveDTO;
+import com.galaxis.manatee.entity.chuanyun.dto.Filter;
+import com.galaxis.manatee.exception.BigSizeException;
+import com.galaxis.manatee.manager.ChuanYunManager;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@Slf4j
+public class WorkHourStatisticsRecently {
+
+    private final Integer pageSize = 100;
+    private final ChuanYunManager chuanYunManager;
+    private final ChuanyunLogDao chuanyunLogDao;
+    private final ChuanyunGroupProjectDao chuanyunGroupProjectDao;
+    private final ChuanyunUserCompanyDao chuanyunUserCompanyDao;
+    private final ChuanyunWorkHourDao chuanyunWorkHourDao;
+    private final ChuanyunSelfWorkHourDao chuanyunSelfWorkHourDao;
+    private final ObjectMapper objectMapper=new ObjectMapper();
+    private final ChuanyunWeekMemberHourDao chuanyunWeekMemberHourDao;
+    private final ChuanyunSelfCostDao chuanyunSelfCostDao;
+
+    public WorkHourStatisticsRecently(ChuanYunManager chuanYunManager, ChuanyunLogDao chuanyunLogDao, ChuanyunGroupProjectDao chuanyunGroupProjectDao, ChuanyunUserCompanyDao chuanyunUserCompanyDao, ChuanyunWorkHourDao chuanyunWorkHourDao, ChuanyunSelfWorkHourDao chuanyunSelfWorkHourDao, ChuanyunWeekMemberHourDao chuanyunWeekMemberHourDao, ChuanyunSelfCostDao chuanyunSelfCostDao) {
+        this.chuanYunManager = chuanYunManager;
+        this.chuanyunLogDao = chuanyunLogDao;
+        this.chuanyunGroupProjectDao = chuanyunGroupProjectDao;
+        this.chuanyunUserCompanyDao = chuanyunUserCompanyDao;
+        this.chuanyunWorkHourDao = chuanyunWorkHourDao;
+        this.chuanyunSelfWorkHourDao = chuanyunSelfWorkHourDao;
+        this.chuanyunWeekMemberHourDao = chuanyunWeekMemberHourDao;
+        this.chuanyunSelfCostDao = chuanyunSelfCostDao;
+    }
+
+    @Scheduled(fixedDelay = 3600000L)
+    public void updateHour() {
+//        dayLog();
+        standardWorkHour();
+        standardWeeklyWorkHour();
+        standardMonthlyWorkHour();
+    }
+
+    /**
+     * 更新最近一个月的日志信息
+     */
+    public void dayLog() {
+        var objectMapper = new ObjectMapper();
+        var start = 0;
+        var totalCount = 0L;
+        var flag = true;
+        List<String> matchersString=new ArrayList<>();
+        //由于需要统计流程中的日志,在日志数据同步时将状态为2的数据一并统计
+        matchersString.add("Status_6,[1;2;3]");
+        //获取当前时间30天前日期
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalDateTime now = LocalDateTime.now();
+        now = now.minus(30, ChronoUnit.DAYS);
+        matchersString.add("logDate_1,"+df.format(now));
+        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(chuanyunLogDO -> {
+                    if(chuanyunLogDO.getDayLogList()==null||chuanyunLogDO.getDayLogList().size()==0){
+                        chuanyunLogDO.setDayLogList(new ArrayList<>());
+                        log.warn(chuanyunLogDO+"");
+                        log.warn("异常数据");
+                    }else{
+                        //如果有重复就删除
+                        chuanyunLogDao.findById(chuanyunLogDO.getObjectId()).ifPresent(toDelete -> {
+                            chuanyunLogDao.delete(toDelete);
+                        });
+                        //根据projectId获取code,如果是生产项目,则不用处理
+                        //针对前期测试数据,可能出现日志为空的情况,跳过不处理
+                        chuanyunLogDO.getDayLogList().forEach(chuanyunDayLog -> {
+                            try{
+                                if(!"生产项目".equals(chuanyunDayLog.getProjectType())&& StringUtils.isEmpty(chuanyunDayLog.getProjectId())){
+                                    log.info(chuanyunLogDO+"");
+                                }else if(!"生产项目".equals(chuanyunDayLog.getProjectType())){
+                                    ChuanyunGroupProjectDO chuanyunGroupProjectDO=chuanyunGroupProjectDao.findById(chuanyunDayLog.getProjectId()).orElseThrow();
+                                    chuanyunDayLog.setProjectCode(chuanyunGroupProjectDO.getProjectCode());
+                                }
+                            }catch (Exception e){
+                                e.printStackTrace();
+                                log.warn(chuanyunDayLog+"");
+                            }
+                        });
+                    }
+                    //处理项目userId
+                    if(chuanyunLogDO.getUserObject()!=null){
+                        chuanyunLogDO.setUserId(chuanyunLogDO.getUserObject().getObjectId());
+                    }
+                });
+                //获取项目总数
+                totalCount = chuanyunFindAllResponse.getReturnData().getTotalCount();
+                //保存
+                chuanyunLogDao.saveAll(result);
+            } catch (Exception e) {
+                log.error(e.getMessage());
+                e.printStackTrace();
+            }
+//            log.info(Instant.now().getEpochSecond()-startTime+"日志100条保存时间");
+        }
+        log.info("最近一月历史日志信息保存" + totalCount);
+    }
+
+    /**
+     * 同步最近一个月每日工时
+     */
+    public void standardWorkHour() {
+        var flag = true;
+        var pageSize = 20;
+        var page = 0;
+        long startTime=Instant.now().getEpochSecond();
+        while(flag) {
+            var pageable= PageRequest.of(page,pageSize);
+            var chuanyunUserCompanyList = chuanyunUserCompanyDao.findAllByStatus(1,pageable);
+            if (page<=chuanyunUserCompanyList.getTotalPages()){
+                page += 1;
+                //逐个将员工每天工时进行统计汇总
+                List<ChuanyunUserCompanyDO> userCompanyDOList = chuanyunUserCompanyList.getContent();
+                userCompanyDOList.forEach(chuanyunUserCompanyDO -> {
+                    long start= Instant.now().getEpochSecond();
+                    //工时标准化
+                    standardHour(chuanyunUserCompanyDO);
+//                    log.info("每日工时标准化"+chuanyunUserCompanyDO.getUserName()+(Instant.now().getEpochSecond()-start)+"秒");
+                });
+            }else {
+                break;
+            }
+        }
+        log.info("每日工时标准化"+(Instant.now().getEpochSecond()-startTime)+"秒");
+        updateChuanyunStandardWorkHour();
+    }
+
+    /**
+     * 员工单日、各个项目工时标准化,并保存
+     * @param chuanyunUserCompanyDO 员工信息
+     */
+    private void standardHour(ChuanyunUserCompanyDO chuanyunUserCompanyDO) {
+        BigDecimal standard = new BigDecimal(8);
+        //每人每个项目每天工时
+        List<ChuanyunWorkHourDO> selfList = chuanyunWorkHourDao.getSelfWorkHourRecently(chuanyunUserCompanyDO.getUserId());
+        selfList.forEach(self->{
+            try{
+                ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO = new ChuanyunSelfWorkHourDO();
+                chuanyunSelfWorkHourDO.setStatus(self.getStatus());
+                chuanyunSelfWorkHourDO.setUserId(chuanyunUserCompanyDO.getUserId());
+                chuanyunSelfWorkHourDO.setProjectType(self.getProjectType());
+                if(ChuanYunConstant.PRODUCTION_PROJECT.equals(self.getProjectType())){
+                    chuanyunSelfWorkHourDO.setProjectId(ChuanYunConstant.PRODUCTION_PROJECT_ID);
+                }else{
+                    chuanyunSelfWorkHourDO.setProjectId(self.getProjectId());
+                }
+                chuanyunSelfWorkHourDO.setDayLogDate(self.getDayLogDate());
+                //每人每天工时
+                ChuanyunWorkHourDO chuanyunWorkHourDO = chuanyunWorkHourDao.getDayWorkHour(chuanyunUserCompanyDO.getUserId(),self.getDayLogDate());
+                //工时标准化
+                if (chuanyunWorkHourDO != null) {
+                    if (chuanyunWorkHourDO.getHoursWorked().compareTo(standard)<=0) {
+                        chuanyunSelfWorkHourDO.setStandardWorkHour(self.getHoursWorked());
+                    }else {
+                        BigDecimal personDays = (self.getHoursWorked().divide(chuanyunWorkHourDO.getHoursWorked(), 2, RoundingMode.HALF_UP)).multiply(standard);
+                        chuanyunSelfWorkHourDO.setStandardWorkHour(personDays);
+                    }
+                    ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO1 = chuanyunSelfWorkHourDao.findByUserIdAndAndProjectIdAndAndDayLogDateAndProjectType(chuanyunUserCompanyDO.getUserId(),ChuanYunConstant.PRODUCTION_PROJECT.equals(self.getProjectType())?ChuanYunConstant.PRODUCTION_PROJECT_ID:self.getProjectId(),self.getDayLogDate(),self.getProjectType());
+                    if (chuanyunSelfWorkHourDO1!=null) {
+                        chuanyunSelfWorkHourDao.delete(chuanyunSelfWorkHourDO1);
+                    }
+                    chuanyunSelfWorkHourDao.save(chuanyunSelfWorkHourDO);
+                }
+            }catch (Exception e){
+                log.error(e.getMessage());
+                log.error(""+self);
+                e.printStackTrace();
+            }
+        });
+    }
+
+    /**
+     * 定时更新氚云数据
+     */
+    private void updateChuanyunStandardWorkHour(){
+        var flag = true;
+        var pageSize = 20;
+        var page = 0;
+        log.info("开始更新日工时汇总");
+        long startTime=Instant.now().getEpochSecond();
+        while(flag) {
+            var pageable= PageRequest.of(page,pageSize);
+            var updateList=chuanyunSelfWorkHourDao.getRecentlyDayHour(pageable);
+            if (page<=updateList.getTotalPages()){
+                page += 1;
+                updateList.forEach(chuanyunSelfWorkHourDO -> {
+                    try{
+                        String departmentId=chuanyunUserCompanyDao.findAllByUserId(chuanyunSelfWorkHourDO.getUserId()).get(0).getDepartmentId();
+                        WorkHourStatistics.ChuanyunSelfWorkHourDTO chuanyunSelfWorkHourDTO = new WorkHourStatistics.ChuanyunSelfWorkHourDTO();
+                        BeanUtils.copyProperties(chuanyunSelfWorkHourDO,chuanyunSelfWorkHourDTO);
+                        chuanyunSelfWorkHourDTO.setDepartmentId(departmentId);
+                        List<String> matchers = new ArrayList<>();
+                        matchers.add("F0000001_2,"+chuanyunSelfWorkHourDO.getProjectId());
+                        matchers.add("F0000002_2,"+chuanyunSelfWorkHourDO.getUserId());
+                        matchers.add("F0000003_2,"+chuanyunSelfWorkHourDO.getDayLogDate());
+                        matchers.add("F0000005_2,"+chuanyunSelfWorkHourDO.getProjectType());
+//                    matchers.add("F0000006_2,"+self.getStatus());
+                        var filter= Filter.instance(0,1,true,"And",matchers);
+                        var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunMemberHourDO.SCHEMA_CODE,filter);
+                        var selfMonthString=objectMapper.writeValueAsString(chuanyunSelfWorkHourDTO);
+                        ChuanyunSaveDTO chuanyunSaveDTO;
+                        if (chuanyunFindAllResponse.getReturnData()!=null){
+                            List<ChuanyunMemberHourDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                            ChuanyunMemberHourDO firstResult = result.get(0);
+                            chuanyunSaveDTO =chuanYunManager.update(ChuanyunMemberHourDO.SCHEMA_CODE,firstResult.getObjectId(),selfMonthString);
+                        }else {
+                            chuanyunSaveDTO =chuanYunManager.save(ChuanyunMemberHourDO.SCHEMA_CODE,selfMonthString,true);
+                        }
+                        if(!chuanyunSaveDTO.getSuccessful()){
+                            log.warn("新增工时标准化失败");
+                        }
+                    }catch (Exception e){
+                        e.printStackTrace();
+                        log.warn("更新标准工时异常");
+                    }
+                });
+            }else {
+                //流程执行完
+                flag=false;
+            }
+        }
+        log.info("日工时更新花费"+(Instant.now().getEpochSecond()-startTime));
+    }
+
+
+    /**
+     * 人员-项目-周度工时汇总
+     */
+    private void standardWeeklyWorkHour() {
+        long start=Instant.now().getEpochSecond();
+        //更新数据库
+        log.info("开始周工时标准化");
+        List<ChuanyunWeekMemberHourDO> list = chuanyunWeekMemberHourDao.getWeekMemberHourRecently();
+        list.forEach(chuanyunWeekMemberHourDO -> {
+            try{
+                if (chuanyunWeekMemberHourDO!=null){
+                    ChuanyunWeekMemberHourDO weekMemberHourDO = new ChuanyunWeekMemberHourDO();
+                    weekMemberHourDO.setProjectId(chuanyunWeekMemberHourDO.getProjectId());
+                    weekMemberHourDO.setProjectType(chuanyunWeekMemberHourDO.getProjectType());
+                    weekMemberHourDO.setStandardWorkHour(chuanyunWeekMemberHourDO.getStandardWorkHour());
+                    weekMemberHourDO.setStatus(chuanyunWeekMemberHourDO.getStatus());
+                    weekMemberHourDO.setUserId(chuanyunWeekMemberHourDO.getUserId());
+                    weekMemberHourDO.setYear(chuanyunWeekMemberHourDO.getYear());
+                    weekMemberHourDO.setWeek(chuanyunWeekMemberHourDO.getWeek());
+                    ChuanyunWeekMemberHourDO oldWeekHour = chuanyunWeekMemberHourDao.findByProjectIdAndUserIdAndWeekAndStatusAndProjectTypeAndYear(chuanyunWeekMemberHourDO.getProjectId(),chuanyunWeekMemberHourDO.getUserId(),chuanyunWeekMemberHourDO.getWeek(),chuanyunWeekMemberHourDO.getStatus(),chuanyunWeekMemberHourDO.getProjectType(),chuanyunWeekMemberHourDO.getYear());
+                    if (oldWeekHour != null) {
+                        chuanyunWeekMemberHourDao.delete(oldWeekHour);
+                    }
+                    chuanyunWeekMemberHourDao.save(weekMemberHourDO);
+                    //搜索是否还有处于审批中的数据
+                    ChuanyunWeekMemberHourDO processWeekHour = chuanyunWeekMemberHourDao.getProcessWeekHour(chuanyunWeekMemberHourDO.getProjectId(),chuanyunWeekMemberHourDO.getUserId(),chuanyunWeekMemberHourDO.getYear(),chuanyunWeekMemberHourDO.getWeek(),chuanyunWeekMemberHourDO.getProjectType());
+                    if (processWeekHour == null){
+                        chuanyunWeekMemberHourDao.deleteByProjectIdAndUserIdAndYearAndWeekAndStatusAndProjectType(chuanyunWeekMemberHourDO.getProjectId(),chuanyunWeekMemberHourDO.getUserId(),chuanyunWeekMemberHourDO.getYear(),chuanyunWeekMemberHourDO.getWeek(),"2",chuanyunWeekMemberHourDO.getProjectType());
+                        //同时删除氚云钟数据
+                        deleteExamineStatus(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,"F0000007","F0000001",chuanyunWeekMemberHourDO.getProjectId(),"F0000002",chuanyunWeekMemberHourDO.getUserId(),"F0000008",chuanyunWeekMemberHourDO.getYear(),"","","F0000006",chuanyunWeekMemberHourDO.getWeek(),"F0000003",chuanyunWeekMemberHourDO.getProjectType());
+                    }
+                }
+            }catch (Exception e){
+                log.error(e.getMessage()+"周工时标准化异常");
+            }
+        });
+        log.info("周工时标准化"+(Instant.now().getEpochSecond()-start)+"秒");
+        updateChuanyunWeekHour();
+    }
+
+    /**
+     * 人员-项目-周度工时汇总,更新氚云数据
+     */
+    private void updateChuanyunWeekHour(){
+        var flag = true;
+        var pageSize = 20;
+        var page = 0;
+        log.info("开始更新周工时汇总");
+        long startTime=Instant.now().getEpochSecond();
+        while(flag) {
+            var pageable = PageRequest.of(page, pageSize);
+            var updateList = chuanyunWeekMemberHourDao.getRecentlyWeekHour(pageable);
+            if (page<=updateList.getTotalPages()){
+                page += 1;
+                updateList.getContent().forEach(chuanyunWeekMemberHourDO -> {
+                    //更新氚云
+                    try {
+                        String departmentId=chuanyunUserCompanyDao.findAllByUserId(chuanyunWeekMemberHourDO.getUserId()).get(0).getDepartmentId();
+                        BigDecimal standard = new BigDecimal(8);
+                        WorkHourStatistics.ChuanyunProjectMemberWeekHourDTO chuanyunProjectMemberWeekHourDTO = new WorkHourStatistics.ChuanyunProjectMemberWeekHourDTO();
+                        chuanyunProjectMemberWeekHourDTO.setProjectId(chuanyunWeekMemberHourDO.getProjectId());
+                        chuanyunProjectMemberWeekHourDTO.setUserId(chuanyunWeekMemberHourDO.getUserId());
+                        chuanyunProjectMemberWeekHourDTO.setWeek(chuanyunWeekMemberHourDO.getWeek());
+                        chuanyunProjectMemberWeekHourDTO.setProjectType(chuanyunWeekMemberHourDO.getProjectType());
+                        chuanyunProjectMemberWeekHourDTO.setTotalHour(chuanyunWeekMemberHourDO.getStandardWorkHour());
+                        chuanyunProjectMemberWeekHourDTO.setPersonDays(chuanyunWeekMemberHourDO.getStandardWorkHour().divide(standard,2,RoundingMode.HALF_UP));
+                        chuanyunProjectMemberWeekHourDTO.setHourStatus(chuanyunWeekMemberHourDO.getStatus());
+                        chuanyunProjectMemberWeekHourDTO.setYear(chuanyunWeekMemberHourDO.getYear());
+                        chuanyunProjectMemberWeekHourDTO.setDepartmentId(departmentId);
+
+                        List<String> matchers = new ArrayList<>();
+                        matchers.add("F0000001_2,"+chuanyunWeekMemberHourDO.getProjectId());
+                        matchers.add("F0000002_2,"+chuanyunWeekMemberHourDO.getUserId());
+                        matchers.add("F0000006_2,"+chuanyunWeekMemberHourDO.getWeek());
+                        matchers.add("F0000008_2,"+chuanyunWeekMemberHourDO.getYear());
+                        matchers.add("F0000003_2,"+chuanyunWeekMemberHourDO.getProjectType());
+                        matchers.add("F0000007_2,"+chuanyunWeekMemberHourDO.getStatus());
+                        var filter= Filter.instance(0,1,true,"And",matchers);
+                        var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,filter);
+                        var selfMonthString=objectMapper.writeValueAsString(chuanyunProjectMemberWeekHourDTO);
+                        ChuanyunSaveDTO chuanyunSaveDTO;
+                        if (chuanyunFindAllResponse.getReturnData()!=null) {
+                            List<ChuanyunProjectMemberWeekHourDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                            ChuanyunProjectMemberWeekHourDO firstResult = result.get(0);
+                            chuanyunSaveDTO = chuanYunManager.update(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,firstResult.getObjectId(),selfMonthString);
+                        }else {
+                            chuanyunSaveDTO = chuanYunManager.save(ChuanyunProjectMemberWeekHourDO.SCHEMA_CODE,selfMonthString,true);
+                        }
+                        if(!chuanyunSaveDTO.getSuccessful()){
+                            log.warn("新增人员项目周度工时失败");
+                        }
+                    } catch (JsonProcessingException | BigSizeException e) {
+                        e.printStackTrace();
+                    }
+                });
+            }else {
+                //流程执行完
+                flag=false;
+            }
+        }
+        log.info("周工时更新花费"+(Instant.now().getEpochSecond()-startTime));
+    }
+
+
+    /**
+     * 单月工时汇总
+     */
+    private void standardMonthlyWorkHour() {
+        var flag = true;
+        var pageSize = 20;
+        var page = 0;
+        while(flag) {
+            var pageable= PageRequest.of(page,pageSize);
+            var chuanyunUserCompanyList = chuanyunUserCompanyDao.findAllByStatus(1,pageable);
+            if (page<=chuanyunUserCompanyList.getTotalPages()){
+                page += 1;
+                List<ChuanyunUserCompanyDO> userCompanyDOList = chuanyunUserCompanyList.getContent();
+                //单项目单人单月成本
+                userCompanyDOList.forEach(this::standardMonthlyHour);
+            }else {
+                flag = false;
+            }
+        }
+        updateChuanyunMonthHour();
+    }
+
+    /**
+     * 员工每月、各个项目标准工时会职工
+     * @param chuanyunUserCompanyDO 员工信息
+     */
+    private void standardMonthlyHour(ChuanyunUserCompanyDO chuanyunUserCompanyDO) {
+        //删除上一次状态为审核中,但本次已经审核通过的数据
+        chuanyunSelfCostDao.findAllByStatusAndUserId(ChuanYunConstant.IN_PROCESS,chuanyunUserCompanyDO.getUserId()).forEach(chuanyunSelfCostDO -> {
+            List<ChuanyunSelfWorkHourDO> chuanyunSelfWorkHourList=chuanyunSelfWorkHourDao.findAllByUserIdAndProjectIdAndProjectTypeAndStatusAndDayLogDateBetween(
+                    chuanyunSelfCostDO.getUserId(),
+                    chuanyunSelfCostDO.getProjectId(),
+                    chuanyunSelfCostDO.getProjectType(),
+                    ChuanYunConstant.IN_PROCESS,
+                    chuanyunSelfCostDO.getDayLogDate(),
+                    chuanyunSelfCostDO.getDayLogDate().plusMonths(1L));
+            //如果没有仍在审批中的每日工时,则将该月、该项目的审核中的月工时统计删除,manatee数据库与氚云
+            if(chuanyunSelfWorkHourList.size()==0){
+                //删除manatee中的在审核工时
+                chuanyunSelfCostDao.delete(chuanyunSelfCostDO);
+                //删除氚云中的在审核工时
+                List<String> matchers = new ArrayList<>();
+                matchers.add("F0000003_2,"+chuanyunSelfCostDO.getProjectId());
+                matchers.add("F0000009_2,"+ChuanYunConstant.IN_PROCESS);
+                matchers.add("F0000002_2,"+chuanyunSelfCostDO.getUserId());
+                matchers.add("F0000008_2,"+chuanyunSelfCostDO.getProjectType());
+                matchers.add("F0000004_2,"+chuanyunSelfCostDO.getDayLogDate());
+                var filter= Filter.instance(0,1,true,"And",matchers);
+                try {
+                    ChuanyunFindAllBizDTO<Object> chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunMemberMonthCostDO.SCHEMA_CODE,filter);
+                    if (chuanyunFindAllResponse.getReturnData()!=null){
+                        List<ChuanyunMemberMonthCostDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                        result.forEach(chuanyunMemberMonthCostDO -> {
+                            try{
+                                chuanYunManager.delete(ChuanyunMemberMonthCostDO.SCHEMA_CODE,chuanyunMemberMonthCostDO.getObjectId());
+                            }catch (Exception e){
+                                log.error("逐条删除失败"+e.getMessage());
+                            }
+                        });
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    log.error("删除已审核通过的月度数据汇总失败");
+                }
+            }
+        });
+        //每月每项目工时,按月-项目-用户分组统计标准工时
+        List<ChuanyunSelfWorkHourDO> list = chuanyunSelfWorkHourDao.getMonthProjectHourRecently(chuanyunUserCompanyDO.getUserId());
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        list.forEach(projectMonth->{
+            //获取人员-月度-相同工时状态标准工时汇总
+            ChuanyunSelfWorkHourDO monthHour = chuanyunSelfWorkHourDao.getMonthHour(projectMonth.getUserId(),df.format(projectMonth.getDayLogDate()),projectMonth.getStatus());
+            ChuanyunSelfCostDO chuanyunSelfCostDO = new ChuanyunSelfCostDO();
+            chuanyunSelfCostDO.setStatus(projectMonth.getStatus());
+            if (monthHour!=null){
+                chuanyunSelfCostDO.setMonthlyTotalHour(monthHour.getStandardWorkHour());
+            }
+            chuanyunSelfCostDO.setProjectId(projectMonth.getProjectId());
+            chuanyunSelfCostDO.setProjectType(projectMonth.getProjectType());
+            chuanyunSelfCostDO.setUserId(projectMonth.getUserId());
+            chuanyunSelfCostDO.setDayLogDate(projectMonth.getDayLogDate().withDayOfMonth(1));
+            chuanyunSelfCostDO.setTotalHour(projectMonth.getStandardWorkHour());
+            chuanyunSelfCostDO.setDepartmentId(chuanyunUserCompanyDO.getDepartmentId());
+            ChuanyunSelfCostDO oldSelfDO = chuanyunSelfCostDao.getOldSelfDO(chuanyunSelfCostDO.getUserId(),
+                    chuanyunSelfCostDO.getProjectId(),
+                    chuanyunSelfCostDO.getProjectType(),
+                    df.format(chuanyunSelfCostDO.getDayLogDate()),
+                    projectMonth.getStatus());
+            if (oldSelfDO !=null) {
+                chuanyunSelfCostDao.delete(oldSelfDO);
+            }
+            chuanyunSelfCostDao.save(chuanyunSelfCostDO);
+        });
+    }
+
+    /**
+     * 人员-项目-月度工时汇总,更新氚云数据
+     */
+    private void updateChuanyunMonthHour(){
+        var flag = true;
+        var pageSize = 20;
+        var page = 0;
+        log.info("开始更新月工时汇总");
+        long startTime=Instant.now().getEpochSecond();
+        while(flag) {
+            var pageable = PageRequest.of(page, pageSize);
+            var updateList = chuanyunSelfCostDao.getRecentlyMonthHour(pageable);
+            if (page<=updateList.getTotalPages()){
+                page += 1;
+                updateList.getContent().forEach(chuanyunSelfCostDO -> {
+                    WorkHourStatistics.ChuanyunMemberMonthCostDTO chuanyunMemberMonthCostDTO = new WorkHourStatistics.ChuanyunMemberMonthCostDTO();
+                    //更新氚云数据
+                    chuanyunMemberMonthCostDTO.setCost(chuanyunSelfCostDO.getCost());
+                    chuanyunMemberMonthCostDTO.setProjectId(chuanyunSelfCostDO.getProjectId());
+                    chuanyunMemberMonthCostDTO.setProjectType(chuanyunSelfCostDO.getProjectType());
+                    chuanyunMemberMonthCostDTO.setStatus(chuanyunSelfCostDO.getStatus());
+                    chuanyunMemberMonthCostDTO.setUserId(chuanyunSelfCostDO.getUserId());
+                    chuanyunMemberMonthCostDTO.setMonthWorkHour(chuanyunSelfCostDO.getMonthlyTotalHour());
+                    chuanyunMemberMonthCostDTO.setDayLogDate(chuanyunSelfCostDO.getDayLogDate());
+                    chuanyunMemberMonthCostDTO.setWorkHour(chuanyunSelfCostDO.getTotalHour());
+                    chuanyunMemberMonthCostDTO.setDepartmentId(chuanyunSelfCostDO.getDepartmentId());
+                    if (!StringUtils.isEmpty(chuanyunSelfCostDO.getProjectId())){
+                        try {
+                            List<String> matchers = new ArrayList<>();
+                            matchers.add("F0000003_2,"+chuanyunSelfCostDO.getProjectId());
+                            matchers.add("F0000009_2,"+chuanyunSelfCostDO.getStatus());
+                            matchers.add("F0000002_2,"+chuanyunSelfCostDO.getUserId());
+                            matchers.add("F0000008_2,"+chuanyunSelfCostDO.getProjectType());
+                            matchers.add("F0000004_2,"+chuanyunSelfCostDO.getDayLogDate());
+                            var filter= Filter.instance(0,1,true,"And",matchers);
+                            var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunMemberMonthCostDO.SCHEMA_CODE,filter);
+                            var memberMonthString=objectMapper.writeValueAsString(chuanyunMemberMonthCostDTO);
+                            ChuanyunSaveDTO chuanyunSaveDTO;
+                            if (chuanyunFindAllResponse.getReturnData()!=null){
+                                List<ChuanyunMemberMonthCostDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                                ChuanyunMemberMonthCostDO firstResult = result.get(0);
+                                chuanyunSaveDTO =chuanYunManager.update(ChuanyunMemberMonthCostDO.SCHEMA_CODE,firstResult.getObjectId(),memberMonthString);
+                            }else {
+                                chuanyunSaveDTO =chuanYunManager.save(ChuanyunMemberMonthCostDO.SCHEMA_CODE,memberMonthString,true);
+                            }
+                            if(!chuanyunSaveDTO.getSuccessful()){
+                                log.warn("新增项目成员月度成本汇总失败");
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                            log.warn("########"+chuanyunSelfCostDO+"");
+                        }
+                    }
+                });
+            }else {
+                //流程执行完
+                flag=false;
+            }
+        }
+        log.info("月工时更新花费"+(Instant.now().getEpochSecond()-startTime));
+    }
+
+    /**
+     * 删除状态为审核中数据
+     * @param schemaCode
+     * @param
+     */
+    public void deleteExamineStatus(String schemaCode,String statusCode,String projectCode,String projectId,String userCode,String userId,String yearCode,String year,String monthCode,String month,String weekCode,String week,String typeCode,String projectType) {
+        try {
+            List<String> matchers = new ArrayList<>();
+            matchers.add(statusCode+"_2,"+"2");
+            matchers.add(projectCode+"_2,"+projectId);
+            if (!StringUtils.isEmpty(userId)){
+                matchers.add(userCode+"_2,"+userId);
+            }
+            if (!StringUtils.isEmpty(year)){
+                matchers.add(yearCode+"_2,"+year);
+            }
+            if (!StringUtils.isEmpty(month)){
+                matchers.add(monthCode+"_2,"+month);
+            }
+            if (!StringUtils.isEmpty(week)){
+                matchers.add(weekCode+"_2,"+week);
+            }
+            if (!StringUtils.isEmpty(projectType)){
+                matchers.add(typeCode+"_2,"+projectType);
+            }
+            var filter= Filter.instance(0,Integer.MAX_VALUE,true,"And",matchers);
+            var chuanyunFindAllResponse=chuanYunManager.findAll(schemaCode,filter);
+            if (chuanyunFindAllResponse.getReturnData()!=null){
+                List<ChuanyunCommonDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                result.forEach(basicDO -> {
+                    ChuanyunSaveDTO chuanyunSaveDTO = chuanYunManager.delete(schemaCode,basicDO.getObjectId());
+                    if(chuanyunSaveDTO.getSuccessful()){
+//                        log.info("删除状态为审核中数据成功");
+                    }else{
+                        log.warn("删除状态为审核中数据失败");
+                    }
+                });
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+            log.error(e.getMessage());
+        }
+    }
+}

+ 23 - 11
src/main/java/com/galaxis/manatee/webservice/CountryEndpoint.java

@@ -5,11 +5,11 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.galaxis.manatee.chuanyun_web_service.*;
 import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunWebServiceDTO;
+import com.galaxis.manatee.service.ChuanyunService;
+import com.galaxis.manatee.service.ProjectMemberService;
 import com.galaxis.manatee.task.ChuanyunBasicDataScheduledTask;
 import com.galaxis.manatee.task.ChuanyunHumanResourceScheduledTask;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.json.JSONParser;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.ws.server.endpoint.annotation.Endpoint;
 import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
 import org.springframework.ws.server.endpoint.annotation.RequestPayload;
@@ -26,10 +26,14 @@ public class CountryEndpoint {
 
 	private final ChuanyunHumanResourceScheduledTask chuanyunHumanResourceScheduledTask;
 	private final ChuanyunBasicDataScheduledTask chuanyunBasicDataScheduledTask;
+	private final ChuanyunService chuanyunService;
+	private final ProjectMemberService projectMemberService;
 
-	public CountryEndpoint(ChuanyunHumanResourceScheduledTask chuanyunHumanResourceScheduledTask, ChuanyunBasicDataScheduledTask chuanyunBasicDataScheduledTask) {
+	public CountryEndpoint(ChuanyunHumanResourceScheduledTask chuanyunHumanResourceScheduledTask, ChuanyunBasicDataScheduledTask chuanyunBasicDataScheduledTask, ChuanyunService chuanyunService, ProjectMemberService projectMemberService) {
 		this.chuanyunHumanResourceScheduledTask = chuanyunHumanResourceScheduledTask;
 		this.chuanyunBasicDataScheduledTask = chuanyunBasicDataScheduledTask;
+		this.chuanyunService = chuanyunService;
+		this.projectMemberService = projectMemberService;
 	}
 
 
@@ -65,16 +69,24 @@ public class CountryEndpoint {
 	@PayloadRoot(namespace = NAMESPACE_URI, localPart = "Invoke")
 	@ResponsePayload
 	public InvokeResponse invoke(@RequestPayload Invoke request) throws JsonProcessingException {
-		//书写调用第三方接口方法
-		log.info("开始数据同步");
 		var objectMapper=new ObjectMapper();
 		InvokeResponse invokeResponse=new InvokeResponse();
-		chuanyunHumanResourceScheduledTask.getPayrollManually();
-		chuanyunBasicDataScheduledTask.getUserCompanyManually();
-		chuanyunBasicDataScheduledTask.getCompanyManually();
-		chuanyunBasicDataScheduledTask.getCostCollectionManually();
-		chuanyunBasicDataScheduledTask.getReimbursementItemsManually();
-		chuanyunBasicDataScheduledTask.getGroupProjectForSynchronizationManually();
+		//书写调用第三方接口方法
+		log.info("开始数据同步");
+		if (request.getMethodName().equals("managerProject")){
+			projectMemberService.updateManagerMember(request.getParam());
+		}else if (request.getMethodName().equals("saleProject")){
+			projectMemberService.updateSaleMember(request.getParam());
+		}else if (request.getMethodName().equals("developProject")){
+			projectMemberService.updateDevelopMember(request.getParam());
+		}else {
+			chuanyunHumanResourceScheduledTask.getPayrollManually();
+			chuanyunBasicDataScheduledTask.getUserCompanyManually();
+			chuanyunBasicDataScheduledTask.getCompanyManually();
+			chuanyunBasicDataScheduledTask.getCostCollectionManually();
+			chuanyunBasicDataScheduledTask.getReimbursementItemsManually();
+			chuanyunBasicDataScheduledTask.getGroupProjectForSynchronizationManually();
+		}
 		log.info("数据同步成功");
 		ChuanyunWebServiceDTO chuanyunWebServiceDTO = new ChuanyunWebServiceDTO();
 		chuanyunWebServiceDTO.setMessage("数据同步完成");

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

@@ -29,12 +29,12 @@ dingTalk:
     askForLeave: PROC-EF6Y0XWVO2-GBP690HMRWVELM4WJ0WT1-DEP53YII-PR1
 
 #阿里云
-aliyun:
-  access:
-    key:
-      id: ${ACCESS_KEY_ID}
-      secret: ${ACCESS_KEY_SECRET}
-    mobile: ${ALIYUN_MOBILE}
+#aliyun:
+#  access:
+#    key:
+#      id: ${ACCESS_KEY_ID}
+#      secret: ${ACCESS_KEY_SECRET}
+#    mobile: ${ALIYUN_MOBILE}
 #spring data jpa database
 spring:
   task: