Browse Source

完成工作组人力成本的相关开发及工作组实施费用功能相关的开发

Cyangbin 2 years ago
parent
commit
f0cbcf31bb
26 changed files with 1029 additions and 525 deletions
  1. 1 1
      pom.xml
  2. 17 0
      src/main/java/com/galaxis/manatee/controller/WorkHourController.java
  3. 2 0
      src/main/java/com/galaxis/manatee/dao/ChuanyunSelfWorkHourDao.java
  4. 1 1
      src/main/java/com/galaxis/manatee/dao/ChuanyunWeekMemberHourDao.java
  5. 53 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunHistoryWorkGroupDO.java
  6. 6 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunImplCostDO.java
  7. 53 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunMonthLaborCostWgDO.java
  8. 6 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunProjectDO.java
  9. 0 1
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunReimbursementDO.java
  10. 2 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunSelfWorkHourDO.java
  11. 4 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/dto/ChuanyunLaborCostDTO.java
  12. 19 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/dto/ChuanyunLaborCostWgDTO.java
  13. 6 0
      src/main/java/com/galaxis/manatee/entity/chuanyun/dto/ChuanyunSelfWorkHourDTO.java
  14. 4 0
      src/main/java/com/galaxis/manatee/event/ImplCostListener.java
  15. 4 0
      src/main/java/com/galaxis/manatee/event/PushImplCostListener.java
  16. 50 22
      src/main/java/com/galaxis/manatee/manager/ClawFeign.java
  17. 2 2
      src/main/java/com/galaxis/manatee/service/LogDownloadService.java
  18. 58 12
      src/main/java/com/galaxis/manatee/service/LogService.java
  19. 80 15
      src/main/java/com/galaxis/manatee/service/LogStandardService.java
  20. 3 3
      src/main/java/com/galaxis/manatee/service/ProjectMemberService.java
  21. 1 1
      src/main/java/com/galaxis/manatee/service/WorkGroupService.java
  22. 102 91
      src/main/java/com/galaxis/manatee/service/impl/WorkGroupServiceImpl.java
  23. 17 10
      src/main/java/com/galaxis/manatee/task/ChuanyunFinancialScheduledTask.java
  24. 509 358
      src/main/java/com/galaxis/manatee/task/U9InfoTask.java
  25. 26 5
      src/main/java/com/galaxis/manatee/task/WorkHourStatistics.java
  26. 3 3
      src/main/resources/application.yml

+ 1 - 1
pom.xml

@@ -162,7 +162,7 @@
                 </includes>
             </resource>
             <resource>
-                <directory>src/main/source</directory>
+                <directory>src/main/resources</directory>
                 <includes>
                     <include>**/*.*</include>
                 </includes>

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

@@ -137,4 +137,21 @@ public class WorkHourController {
     public void checkMemberHour(@RequestParam("year") Integer year, @RequestParam("month") Integer month, @RequestParam("maxDay") Integer maxDay) {
         logCheckService.checkChuanYunAll(year, month, maxDay);
     }
+
+    /**
+     * 标准化全部工时信息
+     */
+    @GetMapping("/test/workHour/standardAllDayWorkHourApi")
+    public void standardAllDayWorkHourApi() {
+        workHourStatistics.standardAllWorkHour();
+    }
+
+    /**
+     * 标准化全部工时信息
+     */
+    @GetMapping("/test/workHour/pushAllWorkHourApi")
+    public void pushAllWorkHourApi() {
+        workHourStatistics.pushAllWorkHour();
+    }
+
 }

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

@@ -217,4 +217,6 @@ public interface ChuanyunSelfWorkHourDao extends GalaxisRepository<ChuanyunSelfW
 
 
     List<ChuanyunSelfWorkHourDO> findByProjectId(String projectId);
+
+    List<ChuanyunSelfWorkHourDO> findAllByProjectIdAndUserIdAndStatusIn(String projectId, String userId, List<String> status);
 }

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

@@ -77,7 +77,7 @@ public interface ChuanyunWeekMemberHourDao extends GalaxisRepository<ChuanyunWee
             "SUM(standard_work_hour)AS standard_work_hour, " +
             "project_type, " +
             "`status` " +
-            "FROM chuanyun_self_work_hour  " +
+            "FROM manatee.chuanyun_self_work_hour  " +
             "WHERE project_id !='' and user_id=?1 " +
             "GROUP BY chuanyun_self_work_hour.project_id, " +
             "chuanyun_self_work_hour.project_type, " +

+ 53 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunHistoryWorkGroupDO.java

@@ -0,0 +1,53 @@
+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 java.util.List;
+
+@Slf4j
+@EqualsAndHashCode(callSuper = true)
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunHistoryWorkGroupDO extends BasicSubDO{
+
+    /**
+     * 表名
+     */
+    public static final String SCHEMA_CODE ="D001789f1de93b6cb324bb5a35290e7c59a0ebc";
+
+    /**
+     * 工作组
+     */
+    @JsonProperty(value = "F0000010")
+    private String workGroupName;
+
+    /**
+     * 工作负责人
+     */
+    @JsonProperty(value = "F0000004")
+    private String workGroupPrincipal;
+
+    /**
+     * 子工作组
+     */
+    @JsonProperty(value = "F0000007")
+    private String subWorkGroup;
+
+    /**
+     * 子工作组负责人
+     */
+    @JsonProperty(value = "F0000008")
+    private String subWorkGroupPrincipal;
+
+    @JsonProperty(value = "F0000009")
+    private List<String> subWorkGroupMember;
+
+    @JsonProperty(value = "F0000009Object")
+    private List<ChuanyunWorkGroupMemberDO> subWorkGroupMemberObject;
+
+}

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

@@ -66,4 +66,10 @@ public class ChuanyunImplCostDO{
     @JsonProperty("F0000004")
     private BigDecimal implCost;
 
+    /**
+     * 人天
+     */
+    @JsonProperty("F0000007")
+    private BigDecimal manDay;
+
 }

+ 53 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunMonthLaborCostWgDO.java

@@ -0,0 +1,53 @@
+package com.galaxis.manatee.entity.chuanyun.data.object;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.galaxis.manatee.util.ChuanyunLocalDateTimeDeserializer;
+import com.galaxis.manatee.util.ChuanyunLocalDateTimeSerializer;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Slf4j
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity(name = "CHUANYUN_MONTH_LABORCOST_WG")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunMonthLaborCostWgDO extends BasicDO{
+
+    /**
+     * 表名
+     */
+    public static final String SCHEMA_CODE ="D001789Sdzc3s28dpsjjdr7niay7kija3";
+
+    @JsonProperty("F0000005")
+    private String projectCode;
+
+    @JsonProperty("F0000019")
+    private String workGroupId;
+
+    @JsonProperty("F0000020")
+    private String workGroupName;
+
+    @JsonProperty("F0000003")
+    private BigDecimal amount;
+
+    @Transient
+    private BigDecimal totalamount;
+
+    @JsonSerialize(using = ChuanyunLocalDateTimeSerializer.class)
+    @JsonDeserialize(using = ChuanyunLocalDateTimeDeserializer.class)
+    @JsonProperty("F0000002")
+    private LocalDate logDate;
+
+    @JsonProperty("F0000004")
+    private String dataType;
+}

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

@@ -59,6 +59,12 @@ public class ChuanyunProjectDO extends BasicDO {
     private String projectTypeCode;
 
     /**
+     * 项目类型
+     */
+    @JsonProperty(value = "F0000057")
+    private String projectType;
+
+    /**
      * 设备分类(前端传数据)
      */
     @Transient

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

@@ -35,7 +35,6 @@ public class ChuanyunReimbursementDO extends BasicDO{
 
     /**
      * 公司编码
-     *
      */
     private String reimburseUserCompanyCode;
 

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

@@ -58,6 +58,8 @@ public class ChuanyunSelfWorkHourDO {
 
     private String subWorkGroupName;
 
+    private String projectCode;
+
     /**
      * 根据ChuanyunWorkHourDO对象实例化ChuanyunSelfWorkHourDO对象
      *

+ 4 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/dto/ChuanyunLaborCostDTO.java

@@ -14,4 +14,8 @@ public class ChuanyunLaborCostDTO {
     private ChuanyunLaborCostPrimaryKey chuanyunLaborCostPrimaryKey;
 
     private BigDecimal costamount;
+
+    private String workGroupID;
+
+    private String workGroupName;
 }

+ 19 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/dto/ChuanyunLaborCostWgDTO.java

@@ -0,0 +1,19 @@
+package com.galaxis.manatee.entity.chuanyun.dto;
+
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class ChuanyunLaborCostWgDTO {
+
+
+    private ChuanyunLaborCostPrimaryKey chuanyunLaborCostPrimaryKey;
+
+    private BigDecimal costamount;
+
+    private String workgroupid;
+
+    private String workgroupname;
+}

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

@@ -43,6 +43,12 @@ public class ChuanyunSelfWorkHourDTO {
     private String projectType;
 
     /**
+     * 项目类型
+     */
+    @JsonProperty("F0000011")
+    private String projectCode;
+
+    /**
      * 部门名称
      */
     @JsonProperty("F0000009")

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

@@ -1,10 +1,13 @@
 package com.galaxis.manatee.event;
 
 import com.galaxis.manatee.service.WorkGroupService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationListener;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
+@Slf4j
 @Component
 public class ImplCostListener implements ApplicationListener<ImplCostEvent> {
 
@@ -13,6 +16,7 @@ public class ImplCostListener implements ApplicationListener<ImplCostEvent> {
 
     @Override
     public void onApplicationEvent(ImplCostEvent event) {
+        log.info("监听到实施费用事件");
         workGroupService.implCost();
     }
 }

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

@@ -1,10 +1,13 @@
 package com.galaxis.manatee.event;
 
 import com.galaxis.manatee.service.WorkGroupService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationListener;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
+@Slf4j
 @Component
 public class PushImplCostListener implements ApplicationListener<PushImplCostEvent> {
 
@@ -13,6 +16,7 @@ public class PushImplCostListener implements ApplicationListener<PushImplCostEve
 
     @Override
     public void onApplicationEvent(PushImplCostEvent event) {
+        log.info("监听到工作组实施费用上传事件");
         workGroupService.pushToChuanyun();
     }
 }

+ 50 - 22
src/main/java/com/galaxis/manatee/manager/ClawFeign.java

@@ -20,114 +20,128 @@ import java.util.Map;
  * @author zcj
  * @version 0.1
  */
-@FeignClient(name = "claw",url = "${claw.url}")
+@FeignClient(name = "claw", url = "${claw.url}")
 public interface ClawFeign {
     /**
      * 查询物料信息
-     * @param map   查询参数
-     * @return  请求结果
+     *
+     * @param map 查询参数
+     * @return 请求结果
      */
     @GetMapping("/material/findAllByParameters")
-    PageDTO<MaterialDTO> findMaterialPageable(@RequestParam Map<String,String> map);
+    PageDTO<MaterialDTO> findMaterialPageable(@RequestParam Map<String, String> map);
 
     /**
      * 查询项目信息
-     * @param map   查询参数
-     * @return  请求结果
+     *
+     * @param map 查询参数
+     * @return 请求结果
      */
     @GetMapping("/chuanyunProject/findAllByParameters")
-    PageDTO<ChuanyunProjectDTO> findChuanyunProjectPageable(@RequestParam Map<String,String> map);
+    PageDTO<ChuanyunProjectDTO> findChuanyunProjectPageable(@RequestParam Map<String, String> map);
 
     /**
      * 查询项目材料成本
+     *
      * @param map
      * @return
      */
     @GetMapping("/cashflow/findAllByParameters")
-    PageDTO<ChuanyunProjectCashFlowDTO> findChuanyunProjectCashFlow(@RequestParam Map<String,String> map);
+    PageDTO<ChuanyunProjectCashFlowDTO> findChuanyunProjectCashFlow(@RequestParam Map<String, String> map);
 
     /**
      * 查询项目收付款
+     *
      * @param map
      * @return
      */
     @GetMapping("/purcost/findAllByParameters")
-    PageDTO<ChuanyunPurCostDTO> findChuanyunPurCost(@RequestParam Map<String,String> map);
+    PageDTO<ChuanyunPurCostDTO> findChuanyunPurCost(@RequestParam Map<String, String> map);
 
     /**
      * 获取供应商
+     *
      * @param map
      * @return
      */
     @GetMapping("/supplier/findAllByParameters")
-    PageDTO<ChuanyunSupplierDTO> findChuanyunSupplier(@RequestParam Map<String,String> map);
+    PageDTO<ChuanyunSupplierDTO> findChuanyunSupplier(@RequestParam Map<String, String> map);
 
     /**
      * 查询人力成本
+     *
      * @param map
      * @return
      */
     @GetMapping("/laborcost/findAllByParameters")
-    PageDTO<ChuanyunLaborCostDTO> findChuanyunLaborCost(@RequestParam Map<String,String> map);
+    PageDTO<ChuanyunLaborCostDTO> findChuanyunLaborCost(@RequestParam Map<String, String> map);
 
     /**
      * 查询子项目人力成本
+     *
      * @param map
      * @return
      */
     @GetMapping("/sublaborcost/findAllByParameters")
-    PageDTO<ChuanyunSubLaborCostDTO> findChuanyunSubLaborCost(@RequestParam Map<String,String> map);
+    PageDTO<ChuanyunSubLaborCostDTO> findChuanyunSubLaborCost(@RequestParam Map<String, String> map);
 
     /**
      * 查询设备配置信息
+     *
      * @param map
      * @return
      */
     @GetMapping("/deviceconfigure/findAllByParameters")
-    PageDTO<ChuanyunDeviceConfigureDTO> findChuanyunDeviceConfigure(@RequestParam Map<String,String> map);
+    PageDTO<ChuanyunDeviceConfigureDTO> findChuanyunDeviceConfigure(@RequestParam Map<String, String> map);
 
     /**
      * 查询设备信息
+     *
      * @param map
      * @return
      */
     @GetMapping("/device/findAllByParameters")
-    PageDTO<ChuanyunDeviceDTO> findChuanyunDevice(@RequestParam Map<String,String> map);
+    PageDTO<ChuanyunDeviceDTO> findChuanyunDevice(@RequestParam Map<String, String> map);
 
     /**
      * 查询销售合同信息
+     *
      * @param map
      * @return
      */
     @GetMapping("/salescontract/findAllByParameters")
-    PageDTO<ChuanyunSalesContractDTO> findChuanyunSalesContract(@RequestParam Map<String,String> map);
+    PageDTO<ChuanyunSalesContractDTO> findChuanyunSalesContract(@RequestParam Map<String, String> map);
 
     /**
      * 查询销售合同报价信息
+     *
      * @param map
      * @return
      */
     @GetMapping("/salescontractoffer/findAllByParameters")
-    PageDTO<ChuanyunSalesContractOfferDTO> findChuanyunSalesContractOffer(@RequestParam Map<String,String> map);
+    PageDTO<ChuanyunSalesContractOfferDTO> findChuanyunSalesContractOffer(@RequestParam Map<String, String> map);
 
     /**
      * 查询销售合同回款明细
+     *
      * @param map
      * @return
      */
     @GetMapping("/salescollection/findAllByParameters")
-    PageDTO<ChuanyunSalesCollectionDetailDTO> findChuanyunSalesCollectionDetail(@RequestParam Map<String,String> map);
+    PageDTO<ChuanyunSalesCollectionDetailDTO> findChuanyunSalesCollectionDetail(@RequestParam Map<String, String> map);
 
     /**
      * 查询采购合同管理
+     *
      * @param map
      * @return
      */
     @GetMapping("/purcontract/findAllByParameters")
-    PageDTO<ChuanyunPurContractDTO> findChuanyunPurContract(@RequestParam Map<String,String> map);
+    PageDTO<ChuanyunPurContractDTO> findChuanyunPurContract(@RequestParam Map<String, String> map);
 
     /**
      * 根据合同号查询采购合同付款情况
+     *
      * @param docno
      * @return
      */
@@ -136,6 +150,7 @@ public interface ClawFeign {
 
     /**
      * 根据合同号查询采购明细
+     *
      * @param docno
      * @return
      */
@@ -144,6 +159,7 @@ public interface ClawFeign {
 
     /**
      * 根据合同号查询回款明细
+     *
      * @param docno
      * @return
      */
@@ -152,6 +168,7 @@ public interface ClawFeign {
 
     /**
      * 根据合同号查询报价
+     *
      * @param docno
      * @return
      */
@@ -161,18 +178,29 @@ public interface ClawFeign {
 
     /**
      * 测试
-     * @param chuanyunProjectDTO    保存DTO数据
-     * @return  请求结果
+     *
+     * @param chuanyunProjectDTO 保存DTO数据
+     * @return 请求结果
      */
     @GetMapping("/chuanyunProject/save")
     ResponseEntity<ChuanyunProjectDTO> saveChuanyunProject(@RequestBody ChuanyunProjectDTO chuanyunProjectDTO);
 
     /**
      * 保存报销信息
-     * @param chuanyunReimbursementDTO   报销数据
-     * @return  保存结果
+     *
+     * @param chuanyunReimbursementDTO 报销数据
+     * @return 保存结果
      */
     @PostMapping("/chuanyunReimbursement/save")
     ResponseEntity<U9ResponseDTO> saveReimbursement(@RequestBody ChuanyunReimbursementDTO chuanyunReimbursementDTO);
 
+    /**
+     * 查询项目工作组人力成本
+     *
+     * @param map 分页参数
+     * @return 保存结果
+     */
+    @GetMapping("/laborcostwg/findAllByParameters")
+    PageDTO<ChuanyunLaborCostWgDTO> findChuanyunLaborCostWg(@RequestParam Map<String, String> map);
+
 }

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

@@ -116,7 +116,7 @@ public class LogDownloadService {
      *
      * @param chuanyunLogDO 待处理数据
      */
-    private void updateChuanyunLogData(ChuanyunLogDO chuanyunLogDO) {
+    public void updateChuanyunLogData(ChuanyunLogDO chuanyunLogDO) {
         //处理项目userId
         if (chuanyunLogDO.getUserObject() != null) {
             chuanyunLogDO.setUserId(chuanyunLogDO.getUserObject().getObjectId());
@@ -162,7 +162,7 @@ public class LogDownloadService {
                             if (!Objects.isNull(workGroupDO)){
                                 chuanyunDayLog.setWorkGroupName(workGroupDO.getWorkGroupName());
                             }else {
-                                ChuanyunWorkGroupDO historyWorkGroup = workGroupService.findInHistoryByObjectId(workGroupId);
+                                ChuanyunHistoryWorkGroupDO historyWorkGroup = workGroupService.findInHistoryByObjectId(workGroupId);
                                 if (!Objects.isNull(historyWorkGroup)){
                                     chuanyunDayLog.setWorkGroupName(historyWorkGroup.getWorkGroupName());
                                 }

+ 58 - 12
src/main/java/com/galaxis/manatee/service/LogService.java

@@ -1,14 +1,28 @@
 package com.galaxis.manatee.service;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.galaxis.manatee.dao.ChuanyunLogDao;
 import com.galaxis.manatee.dao.ChuanyunUserCompanyDao;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunLogDO;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunUserCompanyDO;
+import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunFindAllBizDTO;
+import com.galaxis.manatee.entity.chuanyun.dto.Filter;
+import com.galaxis.manatee.manager.ChuanYunManager;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
 import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @author zcj
@@ -19,6 +33,15 @@ import java.util.stream.Collectors;
 @Service
 public class LogService {
 
+    @Autowired
+    private ChuanYunManager chuanYunManager;
+
+    @Autowired
+    private LogDownloadService logDownloadService;
+
+    @Autowired
+    private ChuanyunLogDao chuanyunLogDao;
+
     private final ChuanyunUserCompanyDao chuanyunUserCompanyDao;
     private final LogStandardService logStandardService;
     private final LogUpdateService logUpdateService;
@@ -32,10 +55,11 @@ public class LogService {
     /**
      * 标准化所有周工时信息
      */
+    @Async("threadPoolTaskExecutor")
     public void standardAllWeekMemberHour() {
         long start = Instant.now().getEpochSecond();
-        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
-        userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logStandardService::standardWeekMemberHourByUserId);
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).filter(StringUtils::hasLength).collect(Collectors.toList());
+        userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logStandardService::standardAllWeekMemberHourByUserId);
         log.info("标准化所有周工时耗时" + (Instant.now().getEpochSecond() - start) + "秒");
     }
 
@@ -45,7 +69,7 @@ public class LogService {
     @Async("threadPoolTaskExecutor")
     public void standardOneYearWeekMemberHour() {
         long start = Instant.now().getEpochSecond();
-        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).filter(StringUtils::hasLength).collect(Collectors.toList());
         userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logStandardService::standardWeekMemberHourByUserId);
         log.info("标准化所有周工时耗时" + (Instant.now().getEpochSecond() - start) + "秒");
     }
@@ -53,9 +77,10 @@ public class LogService {
     /**
      * 标准化所有月工时
      */
+    @Async("threadPoolTaskExecutor")
     public void standardAllSelfCost() {
         long start = Instant.now().getEpochSecond();
-        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).filter(StringUtils::hasLength).collect(Collectors.toList());
         userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logStandardService::standardSelfCostByUserId);
         log.info("标准化所有月工时耗时" + (Instant.now().getEpochSecond() - start) + "秒");
     }
@@ -66,7 +91,7 @@ public class LogService {
     @Async("threadPoolTaskExecutor")
     public void standardOneYearSelfCost() {
         long start = Instant.now().getEpochSecond();
-        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).filter(StringUtils::hasLength).collect(Collectors.toList());
         userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logStandardService::standardSelfCostByUserId);
         log.info("标准化所有月工时耗时 {} ", Instant.now().getEpochSecond() - start);
     }
@@ -76,7 +101,7 @@ public class LogService {
      */
     public void updateAllChuanyunSelfWorkHour() {
         long startTime = Instant.now().getEpochSecond();
-        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).filter(StringUtils::hasLength).collect(Collectors.toList());
         userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logUpdateService::updateChuanyunSelfWorkHourListByUserId);
         log.info("更新所有每日工时花费" + (Instant.now().getEpochSecond() - startTime) + "秒");
     }
@@ -86,7 +111,7 @@ public class LogService {
      */
     public void updateHalfYearChuanyunSelfWorkHour() {
         long startTime = Instant.now().getEpochSecond();
-        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).filter(StringUtils::hasLength).collect(Collectors.toList());
         userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logUpdateService::pushHalfYearDayWorkHour);
         log.info("更新所有每日工时花费 {} 秒", Instant.now().getEpochSecond() - startTime);
     }
@@ -96,19 +121,18 @@ public class LogService {
      */
     public void updateAllChuanyunWeekMemberHour() {
         long startTime = Instant.now().getEpochSecond();
-        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).filter(StringUtils::hasLength).collect(Collectors.toList());
         userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logUpdateService::updateChuanyunWeekMemberHourListByUserId);
         log.info("更新所有每周工时花费" + (Instant.now().getEpochSecond() - startTime) + "秒");
     }
 
 
-
     /**
      * 更新所有月工时
      */
     public void updateAllChuanyunSelfCost() {
         long startTime = Instant.now().getEpochSecond();
-        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).filter(StringUtils::hasLength).collect(Collectors.toList());
         userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logUpdateService::updateChuanyunSelfCostListByUserId);
         log.info("更新所有每月工时花费" + (Instant.now().getEpochSecond() - startTime) + "秒");
     }
@@ -118,7 +142,7 @@ public class LogService {
      */
     public void pushLastYearToPresentWeekMemberHour() {
         long startTime = Instant.now().getEpochSecond();
-        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).filter(StringUtils::hasLength).collect(Collectors.toList());
         userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logUpdateService::pushLastYearToPresentWeekMemberHourListByUserId);
         log.info("更新一年内每周工时花费" + (Instant.now().getEpochSecond() - startTime) + "秒");
     }
@@ -128,8 +152,30 @@ public class LogService {
      */
     public void pushOneYearChuanyunSelfCost() {
         long startTime = Instant.now().getEpochSecond();
-        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).collect(Collectors.toList());
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).filter(StringUtils::hasLength).collect(Collectors.toList());
         userIdList.stream().distinct().collect(Collectors.toList()).parallelStream().forEach(logUpdateService::pushOneYearSelfCostListByUserId);
         log.info("更新所有每月工时花费" + (Instant.now().getEpochSecond() - startTime) + "秒");
     }
+
+
+    public void downloadLogByUserId(String userId) {
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalDateTime localDateTime = LocalDateTime.now().minusDays(30);
+        List<String> m = List.of("user_2," + userId, "Status_6,[1;2;3]", "logDate_1," + df.format(localDateTime));
+        Filter filter = Filter.instance(0, 100, true, Filter.AND, m);
+
+        ChuanyunFindAllBizDTO<Object> chuanyunFindAllResponse = null;
+        try {
+            chuanyunFindAllResponse = chuanYunManager.findAll(ChuanyunLogDO.SCHEMA_CODE, filter);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+        ObjectMapper objectMapper = new ObjectMapper();
+        List<ChuanyunLogDO> result = objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
+        });
+        //处理日志数据
+        result.forEach(logDownloadService::updateChuanyunLogData);
+        chuanyunLogDao.saveAll(result);
+
+    }
 }

+ 80 - 15
src/main/java/com/galaxis/manatee/service/LogStandardService.java

@@ -40,7 +40,10 @@ public class LogStandardService {
     private WorkHourMapper workHourMapper;
 
     @Autowired
-    private  WorkGroupService workGroupService;
+    private WorkGroupService workGroupService;
+
+    @Autowired
+    private ChuanyunProjectDao chuanyunProjectDao;
 
     private final DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     private final ChuanyunWorkHourDao chuanyunWorkHourDao;
@@ -67,7 +70,7 @@ public class LogStandardService {
      * @param isRecent              是否只标准化最近一个月的数据
      * @param chuanyunUserCompanyDO 员工信息
      */
-    @Async
+    @Async("threadPoolTaskExecutor")
     public void standardHourByUserCompanyAndIsRecent(ChuanyunUserCompanyDO chuanyunUserCompanyDO, boolean isRecent) {
         if (!StringUtils.isEmpty(chuanyunUserCompanyDO.getUserId())) {
             long start = Instant.now().getEpochSecond();
@@ -84,7 +87,7 @@ public class LogStandardService {
     /**
      * 标准化最近一个月每周工时
      */
-    @Async
+    @Async("threadPoolTaskExecutor")
     public void standardWeekMemberHourRecent() {
         List<ChuanyunWeekMemberHourDO> list = chuanyunWeekMemberHourDao.getWeekMemberHourRecently();
         this.generateWeekMemberHourByWeekMemberHourList(list);
@@ -98,6 +101,7 @@ public class LogStandardService {
     @Async("threadPoolTaskExecutor")
     public void standardSelfWorkHourByUserId(String userId) {
         if (!Objects.isNull(userId) && !userId.isBlank()) {
+            log.info("标准化用户日工时 userId: {}", userId);
             //从日志原始数据中获取每人每个项目每天工时。
             List<ChuanyunWorkHourDO> selfList = chuanyunWorkHourDao.getSelfWorkHour(userId);
             this.generateSelfWorkHourByWorkHourList(selfList);
@@ -107,7 +111,24 @@ public class LogStandardService {
     }
 
     /**
-     * 根据用户Id标准化某个人的周工时
+     * 根据用户Id标准化某个人所有的周工时
+     *
+     * @param userId 用户Id
+     */
+    public void standardAllWeekMemberHourByUserId(String userId) {
+        if (!StringUtils.hasLength(userId)) {
+            long start = Instant.now().getEpochSecond();
+            //更新数据库
+            List<ChuanyunWeekMemberHourDO> list = chuanyunWeekMemberHourDao.getWeekMemberHourByUserId(userId);
+            this.generateWeekMemberHourByWeekMemberHourList(list);
+            log.info(userId + "统一周工时标准化" + (Instant.now().getEpochSecond() - start) + "秒");
+        } else {
+            log.warn("用户信息中userId缺失");
+        }
+    }
+
+    /**
+     * 根据用户Id标准化某个人一年内的周工时
      *
      * @param userId 用户Id
      */
@@ -153,9 +174,15 @@ public class LogStandardService {
 //        List<ChuanyunSelfWorkHourDO> userAllSelfWorkHours = chuanyunSelfWorkHourDao.findByUserId(userId);
         // 修改为获取一年内的记录
         // 获取一年前的时间节点
-        LocalDateTime aYearAgo = LocalDateTime.now().minusYears(1);
-        List<ChuanyunSelfWorkHourDO> userAllSelfWorkHours = chuanyunSelfWorkHourDao.findByUserIdAndDayLogDateAfter(userId, aYearAgo);
-        Map<LocalDate, Map<String, Map<String, Map<String, BigDecimal>>>> map = userAllSelfWorkHours.stream().collect(
+//        LocalDateTime aYearAgo = LocalDateTime.now().minusYears(1);
+//        List<ChuanyunSelfWorkHourDO> userAllSelfWorkHours = chuanyunSelfWorkHourDao.findByUserIdAndDayLogDateAfter(userId, aYearAgo);
+        List<ChuanyunSelfWorkHourDO> userAllSelfWorkHours = chuanyunSelfWorkHourDao.findByUserId(userId);
+        Map<LocalDate, Map<String, Map<String, Map<String, BigDecimal>>>> map = userAllSelfWorkHours.stream().filter(selfWorkHourDO ->
+                StringUtils.hasLength(selfWorkHourDO.getProjectId()) &&
+                        StringUtils.hasLength(selfWorkHourDO.getProjectType()) &&
+                        StringUtils.hasLength(selfWorkHourDO.getStatus()) &&
+                        selfWorkHourDO.getStandardWorkHour() != null &&
+                        selfWorkHourDO.getDayLogDate() != null).collect(
                 Collectors.groupingBy(chuanyunSelfWorkHourDO -> LocalDate.of(chuanyunSelfWorkHourDO.getDayLogDate().getYear(), chuanyunSelfWorkHourDO.getDayLogDate().getMonth(), 1),
                         Collectors.groupingBy(ChuanyunSelfWorkHourDO::getProjectId,
                                 Collectors.groupingBy(ChuanyunSelfWorkHourDO::getProjectType,
@@ -208,6 +235,25 @@ public class LogStandardService {
             try {
                 //新建标准化工时对象,并将原始数据更新到此对象中,并计算标准化之后的工时
                 ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO = this.fromChuanyunWorkHourDO(self);
+                // 设置工作组和子工作组
+                String workGroupId = self.getWorkGroupId();
+                if (!Objects.isNull(workGroupId) && !workGroupId.isBlank()) {
+
+                    ChuanyunWorkGroupDO workGroupDO = workGroupService.findByObjectId(workGroupId);
+                    if (!Objects.isNull(workGroupDO)) {
+                        chuanyunSelfWorkHourDO.setWorkGroupName(workGroupDO.getWorkGroupName());
+                        chuanyunSelfWorkHourDO.setSubWorkGroupName(workGroupDO.getSubWorkGroup());
+                    } else {
+                        // 从历史数据中查找
+                        ChuanyunHistoryWorkGroupDO historyWorkGroup = workGroupService.findInHistoryByObjectId(workGroupId);
+                        if (!Objects.isNull(historyWorkGroup)) {
+                            chuanyunSelfWorkHourDO.setWorkGroupName(historyWorkGroup.getWorkGroupName());
+                            chuanyunSelfWorkHourDO.setSubWorkGroupName(historyWorkGroup.getSubWorkGroup());
+                        }
+
+                    }
+
+                }
                 //查询系统中是否有重复的标准化工时数据,如果有重复的人、天、项目数据,将原数据删除后更新为最新的数据
                 try {
                     List<ChuanyunSelfWorkHourDO> list;
@@ -270,18 +316,34 @@ public class LogStandardService {
     private ChuanyunSelfWorkHourDO fromChuanyunWorkHourDO(ChuanyunWorkHourDO chuanyunWorkHourDO) throws Exception {
         //由于日志原始工时可能存在项目类型不准确的情况,需要根据项目ID获取真实的项目类型
         String projectType;
+        String projectCode = null;
         try {
             var chuanyunGroupProject = chuanyunGroupProjectDao.findByObjectId(chuanyunWorkHourDO.getProjectId());
             if (chuanyunGroupProject == null) {
-                throw new Exception("没有找到对应的项目");
+                log.info("没有找到该项目");
+                // 查询总况表中的数据
+                Optional<ChuanyunProjectDO> projectDO = chuanyunProjectDao.findById(chuanyunWorkHourDO.getProjectId());
+                if (projectDO.isPresent()){
+                    projectCode = projectDO.get().getProjectCode();
+                    ChuanyunGroupProjectDO projectByCode = chuanyunGroupProjectDao.findByProjectCode(projectCode);
+                    projectType = projectByCode.getProjectType();
+                }else {
+                    throw new Exception("没有找到对应的项目");
+                }
+            }else {
+                //如果找到相应的项目,则使用项目实际的项目类型
+                projectType = chuanyunGroupProject.getProjectType();
+                projectCode = chuanyunGroupProject.getProjectCode();
             }
-            //如果找到相应的项目,则使用项目实际的项目类型
-            projectType = chuanyunGroupProject.getProjectType();
         } catch (Exception e) {
             //没有找到对应项目,使用原项目类型
             projectType = chuanyunWorkHourDO.getProjectType();
         }
+
         ChuanyunSelfWorkHourDO chuanyunSelfWorkHourDO = ChuanyunSelfWorkHourDO.fromChuanyunWorkHourDO(chuanyunWorkHourDO, projectType);
+        if (projectCode != null) {
+            chuanyunSelfWorkHourDO.setProjectCode(projectCode);
+        }
         //获取每人每天总工时
 //        ChuanyunWorkHourDO oneDayTotalHour = chuanyunWorkHourDao.getDayWorkHour(chuanyunWorkHourDO.getUserId(), chuanyunWorkHourDO.getDayLogDate());
 
@@ -374,14 +436,17 @@ public class LogStandardService {
                 if (!Objects.isNull(workGroupId) && !workGroupId.isBlank()) {
 
                     ChuanyunWorkGroupDO workGroupDO = workGroupService.findByObjectId(workGroupId);
-                    if (!Objects.isNull(workGroupDO)){
+                    if (!Objects.isNull(workGroupDO)) {
                         chuanyunSelfWorkHourDO.setWorkGroupName(workGroupDO.getWorkGroupName());
                         chuanyunSelfWorkHourDO.setSubWorkGroupName(workGroupDO.getSubWorkGroup());
-                    }else {
+                    } else {
                         // 从历史数据中查找
-                        ChuanyunWorkGroupDO historyWorkGroup = workGroupService.findInHistoryByObjectId(workGroupId);
-                        chuanyunSelfWorkHourDO.setWorkGroupName(historyWorkGroup.getWorkGroupName());
-                        chuanyunSelfWorkHourDO.setSubWorkGroupName(historyWorkGroup.getSubWorkGroup());
+                        ChuanyunHistoryWorkGroupDO historyWorkGroup = workGroupService.findInHistoryByObjectId(workGroupId);
+                        if (!Objects.isNull(historyWorkGroup)) {
+                            chuanyunSelfWorkHourDO.setWorkGroupName(historyWorkGroup.getWorkGroupName());
+                            chuanyunSelfWorkHourDO.setSubWorkGroupName(historyWorkGroup.getSubWorkGroup());
+                        }
+
                     }
 
                 }

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

@@ -31,7 +31,7 @@ public class ProjectMemberService {
         this.chuanyunGroupProjectDao = chuanyunGroupProjectDao;
     }
 
-    @Async
+    @Async("threadPoolTaskExecutor")
     public void updateManagerMember(String param) throws InterruptedException {
         TimeUnit.SECONDS.sleep(5);
         log.info("同步管理项目组成员");
@@ -63,7 +63,7 @@ public class ProjectMemberService {
         }
     }
 
-    @Async
+    @Async("threadPoolTaskExecutor")
     public void updateSaleMember(String param) throws InterruptedException {
         TimeUnit.SECONDS.sleep(5);
         log.info("同步销售项目组成员");
@@ -91,7 +91,7 @@ public class ProjectMemberService {
         }
     }
 
-    @Async
+    @Async("threadPoolTaskExecutor")
     public void updateDevelopMember(String param) throws InterruptedException {
         TimeUnit.SECONDS.sleep(5);
         log.info("同步研发项目组成员");

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

@@ -35,6 +35,6 @@ public interface WorkGroupService {
      */
     List<ChuanyunWorkGroupDO> findByParentObjectId(String parentObjectId);
 
-    ChuanyunWorkGroupDO findInHistoryByObjectId(String objectId);
+    ChuanyunHistoryWorkGroupDO findInHistoryByObjectId(String objectId);
 
 }

+ 102 - 91
src/main/java/com/galaxis/manatee/service/impl/WorkGroupServiceImpl.java

@@ -6,6 +6,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.galaxis.manatee.dao.ChuanyunImplCostDao;
 import com.galaxis.manatee.dao.ChuanyunReimbursementDao;
+import com.galaxis.manatee.dao.ChuanyunSelfWorkHourDao;
 import com.galaxis.manatee.entity.chuanyun.data.object.*;
 import com.galaxis.manatee.entity.chuanyun.dto.*;
 import com.galaxis.manatee.event.PushImplCostEvent;
@@ -20,6 +21,7 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
@@ -42,6 +44,9 @@ public class WorkGroupServiceImpl implements WorkGroupService {
     private ChuanyunReimbursementDao reimbursementDao;
 
     @Autowired
+    private ChuanyunSelfWorkHourDao selfWorkHourDao;
+
+    @Autowired
     private ApplicationContext applicationContext;
 
 
@@ -49,116 +54,115 @@ public class WorkGroupServiceImpl implements WorkGroupService {
      * 汇算工作组级别实施费用
      */
     @Override
-    @Async
     public void implCost() {
         // 查询立项表中数据
         List<ChuanyunBuildProject> buildProjectList = findAll();
         ObjectMapper objectMapper = new ObjectMapper();
         // 查询组织架构录入
+        final Object monitor = new Object();
         buildProjectList.parallelStream().forEach(chuanyunBuildProject -> {
-            String buildProjectId = chuanyunBuildProject.getObjectId();
-            List<String> m1 = List.of("F0000001_2," + buildProjectId);
-            Filter filter = Filter.instance(0, 10, true, Filter.AND, m1);
-            ChuanyunFindAllBizDTO<Object> projectList = null;
-            try {
-                projectList = chuanYunManager.findAll(ChuanyunProjectOrganizationStructureDO.SCHEMA_CODE, filter);
-            } catch (JsonProcessingException e) {
-                e.printStackTrace();
-            }
-            if (projectList == null || projectList.getReturnData() == null) {
-                return;
-            }
-            List<ChuanyunProjectOrganizationStructureDO> projectOrganizationStructureList = objectMapper.convertValue(projectList.getReturnData().getBizObjectArray(), new TypeReference<>() {
-            });
-            List<String> parentIdList = projectOrganizationStructureList.stream().map(BasicDO::getObjectId).toList();
-            parentIdList.forEach(parentId -> {
-                // 查询工作组信息
-                List<String> m2 = List.of("parentObjectId_2," + parentId);
-                ChuanyunFindAllBizDTO<Object> workGroupResponse = null;
+            synchronized (monitor){
+                String buildProjectId = chuanyunBuildProject.getObjectId();
+                List<String> m1 = List.of("F0000001_2," + buildProjectId);
+                Filter filter = Filter.instance(0, 10, true, Filter.AND, m1);
+                ChuanyunFindAllBizDTO<Object> projectList = null;
                 try {
-                    workGroupResponse = chuanYunManager.findAll(ChuanyunWorkGroupDO.SCHEMA_CODE, Filter.instance(0, 30, true, Filter.AND, m2));
+                    projectList = chuanYunManager.findAll(ChuanyunProjectOrganizationStructureDO.SCHEMA_CODE, filter);
                 } catch (JsonProcessingException e) {
                     e.printStackTrace();
                 }
-                if (workGroupResponse == null || !workGroupResponse.getSuccessful()) {
+                if (projectList == null || projectList.getReturnData() == null) {
                     return;
                 }
-                if (workGroupResponse.getReturnData() == null) {
-                    return;
-                }
-                List<ChuanyunWorkGroupDO> workGroupList = objectMapper.convertValue(workGroupResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
+                List<ChuanyunProjectOrganizationStructureDO> projectOrganizationStructureList = objectMapper.convertValue(projectList.getReturnData().getBizObjectArray(), new TypeReference<>() {
                 });
-                workGroupList.forEach(chuanyunWorkGroupDO -> {
-                    // 查询该项目在总表中的记录
-                    List<String> m3 = List.of("F0000075_5,异常", "F0000002_2," + chuanyunBuildProject.getProjectCode());
-                    Filter instance = Filter.instance(0, 50, true, Filter.AND, m3);
-                    ChuanyunFindAllBizDTO<Object> groupProjectResponse = null;
+                List<String> parentIdList = projectOrganizationStructureList.stream().map(BasicDO::getObjectId).toList();
+                parentIdList.forEach(parentId -> {
+                    // 查询工作组信息
+                    List<String> m2 = List.of("parentObjectId_2," + parentId);
+                    ChuanyunFindAllBizDTO<Object> workGroupResponse = null;
                     try {
-                        groupProjectResponse = chuanYunManager.findAll(ChuanyunGroupProjectDO.SCHEMA_CODE, instance);
+                        workGroupResponse = chuanYunManager.findAll(ChuanyunWorkGroupDO.SCHEMA_CODE, Filter.instance(0, 30, true, Filter.AND, m2));
                     } catch (JsonProcessingException e) {
                         e.printStackTrace();
                     }
-                    if (!groupProjectResponse.getSuccessful() || groupProjectResponse.getReturnData() == null) {
+                    if (workGroupResponse == null || !workGroupResponse.getSuccessful()) {
+                        return;
+                    }
+                    if (workGroupResponse.getReturnData() == null) {
                         return;
                     }
-                    List<Object> bizObjectArray = groupProjectResponse.getReturnData().getBizObjectArray();
-                    List<ChuanyunGroupProjectDO> groupProjectDOList = objectMapper.convertValue(bizObjectArray, new TypeReference<>() {
+                    List<ChuanyunWorkGroupDO> workGroupList = objectMapper.convertValue(workGroupResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
                     });
-                    Optional<ChuanyunGroupProjectDO> groupProjectDO = groupProjectDOList.stream().findFirst();
-                    if (groupProjectDO.isPresent()) {
-                        ChuanyunGroupProjectDO chuanyunGroupProjectDO = groupProjectDO.get();
-                        List<String> userIdList = chuanyunWorkGroupDO.getSubWorkGroupMemberObject().stream().map(BasicSubDO::getObjectId).toList();
-                        // 查询报销单
-                        BigDecimal total = new BigDecimal("0.00");
-                        for (String userId : userIdList) {
-                            // 查询用户在该项目的报销单
-                            List<ChuanyunReimbursementDO> reimbursements = reimbursementDao.findAllByGroupProjectIdAndReimburseUserIdAndStatusIn(chuanyunGroupProjectDO.getObjectId(), userId, List.of(1, 2));
-                            BigDecimal totalReim = reimbursements.stream().map(ChuanyunReimbursementDO::getTotalAmountNotTaxed).reduce(BigDecimal.ZERO, BigDecimal::add);
-                            total = total.add(totalReim);
-                            /*Filter f = Filter.instance(0, 10, true, Filter.AND, List.of("F0000093_2," + chuanyunGroupProjectDO.getObjectId(), "F0000001_2," + userId));
-                            ChuanyunFindAllBizDTO<Object> reimbursementResponse = null;
-                            try {
-                                reimbursementResponse = chuanYunManager.findAll(ChuanyunReimbursementDO.SCHEMA_CODE, f);
-                            } catch (JsonProcessingException e) {
-                                e.printStackTrace();
-                            }
-                            if (!reimbursementResponse.getSuccessful() || reimbursementResponse.getReturnData() == null) {
-                                continue;
+                    workGroupList.forEach(chuanyunWorkGroupDO -> {
+                        // 查询该项目在总表中的记录
+                        List<String> m3 = List.of("F0000075_5,异常", "F0000002_2," + chuanyunBuildProject.getProjectCode());
+                        Filter instance = Filter.instance(0, 50, true, Filter.AND, m3);
+                        ChuanyunFindAllBizDTO<Object> groupProjectResponse = null;
+                        try {
+                            groupProjectResponse = chuanYunManager.findAll(ChuanyunGroupProjectDO.SCHEMA_CODE, instance);
+                        } catch (JsonProcessingException e) {
+                            e.printStackTrace();
+                        }
+                        if (!groupProjectResponse.getSuccessful() || groupProjectResponse.getReturnData() == null) {
+                            return;
+                        }
+                        List<Object> bizObjectArray = groupProjectResponse.getReturnData().getBizObjectArray();
+                        List<ChuanyunGroupProjectDO> groupProjectDOList = objectMapper.convertValue(bizObjectArray, new TypeReference<>() {
+                        });
+                        Optional<ChuanyunGroupProjectDO> groupProjectDO = groupProjectDOList.stream().findFirst();
+                        if (groupProjectDO.isPresent()) {
+                            ChuanyunGroupProjectDO chuanyunGroupProjectDO = groupProjectDO.get();
+                            List<String> userIdList = chuanyunWorkGroupDO.getSubWorkGroupMemberObject().stream().map(BasicSubDO::getObjectId).toList();
+                            // 查询报销单
+                            BigDecimal total = new BigDecimal("0.00");
+                            BigDecimal totalManDay = new BigDecimal("0.000");
+                            // 查询项目工作组人天
+                            for (String userId : userIdList) {
+                                // 查询用户在该项目的报销单
+                                List<ChuanyunReimbursementDO> reimbursements = reimbursementDao.findAllByGroupProjectIdAndReimburseUserIdAndStatusIn(chuanyunGroupProjectDO.getObjectId(), userId, List.of(1, 2));
+                                BigDecimal totalReim = reimbursements.stream().map(ChuanyunReimbursementDO::getTotalAmountNotTaxed).reduce(BigDecimal.ZERO, BigDecimal::add);
+                                total = total.add(totalReim);
+                                List<ChuanyunSelfWorkHourDO> workHours = selfWorkHourDao.findAllByProjectIdAndUserIdAndStatusIn(chuanyunGroupProjectDO.getObjectId(), userId, List.of("1", "2"));
+                                BigDecimal totalWorkHour = workHours.stream().map(ChuanyunSelfWorkHourDO::getStandardWorkHour).reduce(BigDecimal.ZERO, BigDecimal::add);
+                                // 人天
+                                BigDecimal manDay = totalWorkHour.divide(BigDecimal.valueOf(8), 3, RoundingMode.UP);
+                                totalManDay = totalManDay.add(manDay);
+
                             }
-                            List<ChuanyunReimbursementDO> reimbursementDOList = objectMapper.convertValue(reimbursementResponse.getReturnData().getBizObjectArray(), new TypeReference<>() {
-                            });
-                            BigDecimal totalReim = reimbursementDOList.stream().map(ChuanyunReimbursementDO::getTotalAmountNotTaxed).reduce(BigDecimal.ZERO, BigDecimal::add);
-                            total = total.add(totalReim);*/
+                            // 统计工作组所有的工时
+                            String projectObjectId = chuanyunGroupProjectDO.getObjectId();
+                            String projectCode = chuanyunGroupProjectDO.getProjectCode();
+                            String workGroupId = chuanyunWorkGroupDO.getObjectId();
 
-                        }
-                        // 统计工作组所有的工时
-                        String projectObjectId = chuanyunGroupProjectDO.getObjectId();
-                        String projectCode = chuanyunGroupProjectDO.getProjectCode();
-                        String workGroupId = chuanyunWorkGroupDO.getObjectId();
-
-                        ChuanyunImplCostDO old = implCostDao.findByProjectIdAndProjectCodeAndWorkGroup(projectObjectId, projectCode, workGroupId);
-                        if (!Objects.isNull(old)) {
-                            BigDecimal oldImplCost = old.getImplCost();
-                            if (Objects.isNull(oldImplCost) || oldImplCost.compareTo(total) != 0) {
-                                old.setImplCost(total);
-                                implCostDao.save(old);
+                            ChuanyunImplCostDO old = implCostDao.findByProjectIdAndProjectCodeAndWorkGroup(projectObjectId, projectCode, workGroupId);
+                            if (!Objects.isNull(old)) {
+                                BigDecimal oldImplCost = old.getImplCost();
+                                BigDecimal oldManDay = old.getManDay();
+                                if (Objects.isNull(oldImplCost) || Objects.isNull(oldManDay) || oldImplCost.compareTo(total) != 0 || oldManDay.compareTo(totalManDay) != 0) {
+                                    old.setImplCost(total);
+                                    old.setManDay(totalManDay);
+                                    implCostDao.save(old);
+                                }
+                            } else {
+                                ChuanyunImplCostDO chuanyunImplCostDO = new ChuanyunImplCostDO();
+                                chuanyunImplCostDO.setProjectId(projectObjectId);
+                                chuanyunImplCostDO.setProjectCode(projectCode);
+                                chuanyunImplCostDO.setWorkGroup(workGroupId);
+                                chuanyunImplCostDO.setWorkGroupName(chuanyunWorkGroupDO.getWorkGroupName());
+                                chuanyunImplCostDO.setImplCost(total);
+                                chuanyunImplCostDO.setManDay(totalManDay);
+                                implCostDao.saveAndFlush(chuanyunImplCostDO);
                             }
-                        } else {
-                            ChuanyunImplCostDO chuanyunImplCostDO = new ChuanyunImplCostDO();
-                            chuanyunImplCostDO.setProjectId(projectObjectId);
-                            chuanyunImplCostDO.setProjectCode(projectCode);
-                            chuanyunImplCostDO.setWorkGroup(workGroupId);
-                            chuanyunImplCostDO.setWorkGroupName(chuanyunWorkGroupDO.getWorkGroupName());
-                            chuanyunImplCostDO.setImplCost(total);
-                            implCostDao.saveAndFlush(chuanyunImplCostDO);
                         }
-                    }
-                });
+                    });
 
-            });
+                });
+            }
         });
 
         // 上传至氚云数据库,发布上传事件
+        log.info("发布工作组实施费用上传事件");
         applicationContext.publishEvent(new PushImplCostEvent(this));
 
 
@@ -203,7 +207,6 @@ public class WorkGroupServiceImpl implements WorkGroupService {
     }
 
     @Override
-    @Async
     public void pushToChuanyun() {
 
         List<ChuanyunImplCostDO> all = implCostDao.findAll();
@@ -229,10 +232,12 @@ public class WorkGroupServiceImpl implements WorkGroupService {
                     Optional<ChuanyunImplCostDO> implCostOptional = chuanyunImplCostDOList.stream().findFirst();
                     if (implCostOptional.isPresent()) {
                         ChuanyunImplCostDO chuanyunImplCostDO = implCostOptional.get();
-                        if (chuanyunImplCostDO.getImplCost().compareTo(implCostDO.getImplCost()) != 0) {
+                        if (Objects.isNull(chuanyunImplCostDO.getImplCost()) || Objects.isNull(chuanyunImplCostDO.getManDay()) ||
+                                chuanyunImplCostDO.getImplCost().compareTo(implCostDO.getImplCost()) != 0 ||
+                                chuanyunImplCostDO.getManDay().compareTo(implCostDO.getManDay()) != 0) {
                             // 工作组实施费用发生变化
                             log.info("更新项目工作组实施费用");
-                            ImplCostUpdateDTO implCostUpdateDTO = new ImplCostUpdateDTO(implCostDO.getImplCost());
+                            ImplCostUpdateDTO implCostUpdateDTO = new ImplCostUpdateDTO(implCostDO.getImplCost(), implCostDO.getManDay());
                             try {
                                 String updateStr = objectMapper.writeValueAsString(implCostUpdateDTO);
                                 chuanYunManager.update(ChuanyunImplCostDO.SCHEMA_CODE, chuanyunImplCostDO.getObjectId(), updateStr);
@@ -266,8 +271,12 @@ public class WorkGroupServiceImpl implements WorkGroupService {
         @JsonProperty("F0000004")
         private BigDecimal implCost;
 
-        public ImplCostUpdateDTO(BigDecimal implCost) {
+        @JsonProperty("F0000007")
+        private BigDecimal manDay;
+
+        public ImplCostUpdateDTO(BigDecimal implCost, BigDecimal manDay) {
             this.implCost = implCost;
+            this.manDay = manDay;
         }
     }
 
@@ -316,20 +325,22 @@ public class WorkGroupServiceImpl implements WorkGroupService {
     }
 
     @Override
-    public ChuanyunWorkGroupDO findInHistoryByObjectId(String objectId) {
-        ChuanyunFindBizDTO<Object> objectChuanyunFindBizDTO = chuanYunManager.find("D001789f1de93b6cb324bb5a35290e7c59a0ebc", objectId);
+    public ChuanyunHistoryWorkGroupDO findInHistoryByObjectId(String objectId) {
+        ChuanyunFindBizDTO<Object> objectChuanyunFindBizDTO = chuanYunManager.find(ChuanyunHistoryWorkGroupDO.SCHEMA_CODE, objectId);
         if (!Objects.isNull(objectChuanyunFindBizDTO)) {
             ChuanyunFindBizReturnData<Object> returnData = objectChuanyunFindBizDTO.getReturnData();
             if (objectChuanyunFindBizDTO.getSuccessful() && !Objects.isNull(returnData)) {
                 Object bizObject = returnData.getBizObject();
                 ObjectMapper objectMapper = new ObjectMapper();
-                ChuanyunWorkGroupDO chuanyunWorkGroupDO = objectMapper.convertValue(bizObject, ChuanyunWorkGroupDO.class);
-                if (chuanyunWorkGroupDO != null) {
-                    return chuanyunWorkGroupDO;
+                ChuanyunHistoryWorkGroupDO chuanyunHistoryWorkGroupDO = objectMapper.convertValue(bizObject, ChuanyunHistoryWorkGroupDO.class);
+                if (chuanyunHistoryWorkGroupDO != null) {
+                    return chuanyunHistoryWorkGroupDO;
                 }
             }
         }
         log.warn("组织架构查询中无该工作组");
         return null;
     }
+
+
 }

+ 17 - 10
src/main/java/com/galaxis/manatee/task/ChuanyunFinancialScheduledTask.java

@@ -19,10 +19,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * @author zcj
@@ -71,6 +68,10 @@ public class ChuanyunFinancialScheduledTask {
         getReimbursementFromChuanyun();
     }
 
+    public void syncReimbursement() {
+        getReimbursementFromChuanyun();
+    }
+
     /**
      * 获取报销单
      */
@@ -126,12 +127,17 @@ public class ChuanyunFinancialScheduledTask {
                         chuanyunReimbursementDO.setReimburseUserId(chuanyunReimbursementDO.getReimburseUserObject().getObjectId());
                         ChuanyunUserDO chuanyunUserDO = chuanyunUserDao.findById(chuanyunReimbursementDO.getReimburseUserId()).orElseThrow();
                         List<ChuanyunUserCompanyDO> userCompanyList = chuanyunUserCompanyDao.findAllByUserId(chuanyunReimbursementDO.getReimburseUserId());
-                        if (userCompanyList.size() != 1) {
-                            log.error(chuanyunUserDO.getName() + chuanyunReimbursementDO.getReimburseUserId());
-                        } else {
-                            ChuanyunUserCompanyDO chuanyunUserCompany = userCompanyList.get(0);
-                            chuanyunReimbursementDO.setReimburseUserCostCode(chuanyunUserCompany.getCostCode());
+                        Optional<ChuanyunUserCompanyDO> first = userCompanyList.stream().findFirst();
+                        if (first.isPresent()) {
+                            ChuanyunUserCompanyDO chuanyunUserCompanyDO = first.get();
+                            chuanyunReimbursementDO.setReimburseUserCostCode(chuanyunUserCompanyDO.getCostCode());
                         }
+//                        if (userCompanyList.size() != 1) {
+//                            log.error(chuanyunUserDO.getName() + chuanyunReimbursementDO.getReimburseUserId());
+//                        } else {
+//                            ChuanyunUserCompanyDO chuanyunUserCompany = userCompanyList.get(0);
+//                            chuanyunReimbursementDO.setReimburseUserCostCode(chuanyunUserCompany.getCostCode());
+//                        }
 //                        ChuanyunCostDO chuanyunCostDO=chuanyunCostDao.findById(chuanyunReimbursementDO.getBeneficiaryCostId()).orElseThrow();
                         chuanyunReimbursementDO.setBusinessDate(chuanyunReimbursementDO.getCreatedTime());
                         chuanyunReimbursementDO.setReimburseUserCompanyCode(chuanyunCompanyDO.getErpCode());
@@ -160,7 +166,7 @@ public class ChuanyunFinancialScheduledTask {
                                     chuanyunReimbursementDO.setWorkGroupName(workGroupDO.getWorkGroupName());
                                 } else {
                                     // 查询历史数据中是否存在工作组
-                                    ChuanyunWorkGroupDO inHistoryWorkGroup = workGroupService.findInHistoryByObjectId(workGroupId);
+                                    ChuanyunHistoryWorkGroupDO inHistoryWorkGroup = workGroupService.findInHistoryByObjectId(workGroupId);
                                     chuanyunReimbursementDO.setWorkGroupName(inHistoryWorkGroup.getWorkGroupName());
                                 }
                             } else {
@@ -198,6 +204,7 @@ public class ChuanyunFinancialScheduledTask {
 
                 });
                 chuanyunReimbursementDao.saveAll(result);
+                log.info("start: {}", start);
             } catch (Exception e) {
                 log.error(e.getMessage());
                 e.printStackTrace();

File diff suppressed because it is too large
+ 509 - 358
src/main/java/com/galaxis/manatee/task/U9InfoTask.java


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

@@ -5,12 +5,14 @@ import com.galaxis.manatee.dao.ChuanyunSelfWorkHourDao;
 import com.galaxis.manatee.dao.ChuanyunUserCompanyDao;
 import com.galaxis.manatee.dao.ChuanyunWorkHourDao;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunSelfWorkHourDO;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunUserCompanyDO;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunWorkHourDO;
 import com.galaxis.manatee.service.LogService;
 import com.galaxis.manatee.service.LogStandardService;
 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.math.RoundingMode;
@@ -65,10 +67,12 @@ public class WorkHourStatistics {
     public void standardWeekAndMonthWorkHour(){
         // 标准化周工时
         log.info("开始标准化周工时");
-        logService.standardOneYearWeekMemberHour();
+//        logService.standardOneYearWeekMemberHour();
+        logService.standardAllWeekMemberHour();
         // 标准化月工时
         log.info("开始标准化月工时");
-        logService.standardOneYearSelfCost();
+//        logService.standardOneYearSelfCost();
+        logService.standardAllSelfCost();
     }
 
 
@@ -78,9 +82,10 @@ public class WorkHourStatistics {
     @Scheduled(fixedDelay = 172800000L, initialDelay = 7200000L)
     public void pushWorkHour(){
         log.info("开始上传标准化周工时");
-        logService.pushLastYearToPresentWeekMemberHour();
+//        logService.pushLastYearToPresentWeekMemberHour();
+        logService.updateAllChuanyunWeekMemberHour();
         log.info("开始上传标准化月工时");
-        logService.pushOneYearChuanyunSelfCost();
+        logService.updateAllChuanyunSelfCost();
     }
 
     /**
@@ -95,7 +100,9 @@ public class WorkHourStatistics {
      * 每日工时标准化
      */
     private void standardWorkHour() {
-        chuanyunUserCompanyDao.findAll().forEach(chuanyunUserCompanyDO -> logStandardService.standardSelfWorkHourByUserId(chuanyunUserCompanyDO.getUserId()));
+        List<String> userIdList = chuanyunUserCompanyDao.findAll().stream().map(ChuanyunUserCompanyDO::getUserId).filter(StringUtils::hasLength).toList();
+        userIdList.stream().distinct().toList().forEach(logStandardService::standardSelfWorkHourByUserId);
+//        chuanyunUserCompanyDao.findAll().forEach(chuanyunUserCompanyDO -> logStandardService.standardSelfWorkHourByUserId(chuanyunUserCompanyDO.getUserId()));
     }
 
     /**
@@ -150,4 +157,18 @@ public class WorkHourStatistics {
         log.info("离职人员工时标准化完成" + selfList.size());
     }
 
+    /**
+     * 标准化所有的日工时数据,补全工作组和项目号。
+     */
+    public void standardAllWorkHour(){
+        standardWorkHour();
+    }
+
+    /**
+     * 标准化所有的日工时数据,补全工作组和项目号。
+     */
+    public void pushAllWorkHour(){
+        logService.updateAllChuanyunSelfWorkHour();
+    }
+
 }

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

@@ -49,9 +49,9 @@ spring:
         size: 500
       thread-name-prefix: scheduled-task-
   datasource:
-    url: jdbc:mysql://10.2.5.35:3306/manatee?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
+    url: jdbc:mysql://localhost:3306/manatee?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
     username: root
-    password: j$%rW-GRu$H#pj%V2M-B
+    password: your_password
     hikari:
       maximum-pool-size: 128
   jpa:
@@ -59,7 +59,7 @@ spring:
     hibernate:
       ddl-auto: update
 claw:
-  url: 127.0.0.1
+  url: http://119.3.27.148:18081
 logging:
   file:
     name: "logs/manatee.log"