Browse Source

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

 Conflicts:
	src/main/java/com/galaxis/manatee/task/ChuanyunBasicDataScheduledTask.java
	src/main/java/com/galaxis/manatee/task/FixService.java
WoNiu 5 years ago
parent
commit
3a420ae3b8

+ 1 - 1
deploy.sh

@@ -10,7 +10,7 @@ APP_START_TIMEOUT=20    # 等待应用启动的时间
 APP_PORT=8080          # 应用端口
 HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT}  # 应用健康检查URL
 APP_HOME=/home/admin/${APP_NAME} # 从package.tgz中解压出来的jar包放到这个目录下
-JAR_NAME=${APP_HOME}/target/manatee-1.0.jar # jar包的名字
+JAR_NAME=${APP_HOME}/manatee-1.0.jar # jar包的名字
 JAVA_OUT=${APP_HOME}/logs/start.log  #应用的启动日志
 
 # 创建出相关目录

+ 6 - 0
src/main/java/com/galaxis/manatee/constant/ChuanYunConstant.java

@@ -28,6 +28,12 @@ public class ChuanYunConstant {
      * 保存用户id和所属部门id
      */
     public static Map<String,Object> USER_DEPARTMENT=new HashMap<>();
+
+    /**
+     * 用户ID和BG关系
+     */
+    public static Map<String,String> USER_BUSINESS_GROUP=new HashMap<>();
+
     /**
      * 调用地址
      */

+ 0 - 4
src/main/java/com/galaxis/manatee/controller/ChuanyunTestController.java

@@ -27,10 +27,6 @@ public class ChuanyunTestController {
 
     private final ChuanYunManager chuanYunManager;
     private final EntityManager entityManager;
-//    public ChuanyunTestController(ChuanYunManager chuanYunManager) {
-//        this.chuanYunManager = chuanYunManager;
-//    }
-
 
     public ChuanyunTestController(ChuanYunManager chuanYunManager, EntityManager entityManager) {
         this.chuanYunManager = chuanYunManager;

+ 33 - 0
src/main/java/com/galaxis/manatee/controller/GetController.java

@@ -0,0 +1,33 @@
+package com.galaxis.manatee.controller;
+
+import com.galaxis.manatee.task.ChuanyunHumanResourceScheduledTask;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.net.http.HttpResponse;
+
+/**
+ * 提供手工触发更新氚云数据的接口
+ * @author zcj
+ * @version 0.1
+ * @date 2020/6/7 10:26 上午
+ */
+@RestController
+public class GetController {
+
+    private final ChuanyunHumanResourceScheduledTask chuanyunHumanResourceScheduledTask;
+
+    public GetController(ChuanyunHumanResourceScheduledTask chuanyunHumanResourceScheduledTask) {
+        this.chuanyunHumanResourceScheduledTask = chuanyunHumanResourceScheduledTask;
+    }
+
+    /**
+     * 手动更新chuanyunPayRoll
+     * @return  提示信息
+     */
+    @GetMapping("/test/getChuanyunPayroll")
+    public String getChuanyunPayroll(){
+        chuanyunHumanResourceScheduledTask.getPayrollManually();
+        return "开始更新薪资数据";
+    }
+}

+ 14 - 0
src/main/java/com/galaxis/manatee/dao/ChuanyunSpecialProcedureDao.java

@@ -0,0 +1,14 @@
+package com.galaxis.manatee.dao;
+
+import com.galaxis.capsule.util.GalaxisRepository;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunSpecialProcedureDO;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author zcj
+ * @version 0.1
+ * @date 2020/6/6 10:07 上午
+ */
+@Repository
+public interface ChuanyunSpecialProcedureDao extends GalaxisRepository<ChuanyunSpecialProcedureDO,String> {
+}

+ 10 - 2
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunGroupProjectDO.java

@@ -5,7 +5,6 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.galaxis.capsule.bo.ChuanyunObject;
 import com.galaxis.manatee.util.ChuanyunLocalDateTimeDeserializer;
-import com.galaxis.manatee.util.StringArrayToStringDeserializer;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.extern.slf4j.Slf4j;
@@ -59,6 +58,14 @@ public class ChuanyunGroupProjectDO extends BasicDO {
      */
     @JsonProperty(value = "F0000033")
     private String businessGroup;
+    /**
+     * EBG
+     */
+    public static final String EBG="EBG";
+    /**
+     * IBG
+     */
+    public static final String IBG="IBG";
 
     /**
      * 氚云中项目立项时间
@@ -98,11 +105,12 @@ public class ChuanyunGroupProjectDO extends BasicDO {
      */
     @Transient
     @JsonProperty("F0000034")
-    private String[] projectMemberlist;
+    private String[] projectMemberList;
 
     /**
      * 项目组成员
      */
+    @Column(columnDefinition = "TEXT")
     private String projectMember;
 
     /**

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

@@ -15,6 +15,9 @@ import javax.persistence.Entity;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
+/**
+ * @author xuankechen
+ */
 @Slf4j
 @EqualsAndHashCode(callSuper = true)
 @Data

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

@@ -6,6 +6,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.extern.slf4j.Slf4j;
 
+import javax.persistence.Column;
 import javax.persistence.Entity;
 import java.math.BigDecimal;
 
@@ -89,5 +90,6 @@ public class ChuanyunReimbursementDetailDO extends BasicSubDO{
      * 备注
      */
     @JsonProperty("F0000042")
+    @Column(columnDefinition = "TEXT")
     private String content;
 }

+ 40 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunSpecialProcedureDO.java

@@ -0,0 +1,40 @@
+package com.galaxis.manatee.entity.chuanyun.data.object;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.persistence.Entity;
+import java.math.BigDecimal;
+
+/**
+ * @author zcj
+ * @version 0.1
+ * @date 2020/6/6 10:03 上午
+ */
+@Slf4j
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity(name = "CHUANYUN_SPECIAL_PROCEDURE")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunSpecialProcedureDO extends BasicSubDO{
+
+    public static final String SCHEMA_CODE="D001789Fb1f097907edc4fab84b5b18368a6d7dd";
+    /**
+     * 集团项目Id
+     */
+    @JsonProperty("F0000010")
+    private String projectId;
+    /**
+     * 分配比例
+     */
+    @JsonProperty("F0000013")
+    private BigDecimal rate;
+    /**
+     * 成本中心
+     */
+    @JsonProperty("F0000023")
+    private String costCenterId;
+}

+ 10 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunUserCompanyDO.java

@@ -65,6 +65,16 @@ public class ChuanyunUserCompanyDO extends BasicDO{
      */
     @JsonProperty("F0000007")
     private String department;
+    /**
+     * 人工专项处理
+     */
+    @JsonProperty("F0000020")
+    private String specialProcedure;
+    /**
+     * 是否报工
+     */
+    @JsonProperty("F0000009")
+    private String reportLog;
 
     /**
      * 人员所属部门对象

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

@@ -62,6 +62,7 @@ public interface ChuanYunManager {
      * @param isSubmit   是否为提交状态
      * @param schemaCode 表单编码
      * @param bizObject  数据字符串
+     * @throws BigSizeException 保存数据超长的异常
      * @return 保存结果
      */
     ChuanyunSaveDTO save(String schemaCode, String bizObject, Boolean isSubmit) throws BigSizeException;
@@ -71,6 +72,8 @@ public interface ChuanYunManager {
      * @param isSubmit       是否直接提交
      * @param schemaCode     表单编码
      * @param bizObjectArray 数据字符串
+     * @throws BigSizeException 保存数据超长的异常
+     * @throws JsonProcessingException  json转化异常
      * @return 保存结果
      */
     ChuanyunSaveAllDTO saveAll(String schemaCode, List<String> bizObjectArray, Boolean isSubmit) throws JsonProcessingException, BigSizeException;
@@ -81,6 +84,7 @@ public interface ChuanYunManager {
      * @param schemaCode 表单编码
      * @param bizObjectId   主键
      * @param bizObject  数据字符串
+     * @throws BigSizeException 保存数据超长的异常
      * @return 保存结果
      */
     ChuanyunSaveDTO update(String schemaCode,String bizObjectId, String bizObject) throws BigSizeException;

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

@@ -246,9 +246,9 @@ public class DefaultChuanyunManagerImpl implements ChuanYunManager {
         ChuanyunSaveDTO chuanyunSaveResponse =new ChuanyunSaveDTO();
         chuanyunSaveResponse = restTemplate.postForObject(ChuanYunConstant.CHUAN_YUN_INVOKE_URL,httpEntity, chuanyunSaveResponse.getClass());
         if (chuanyunSaveResponse!=null&&chuanyunSaveResponse.getSuccessful()) {
-            log.info("更新成功!");
+            log.info(bizObjectId+"更新成功!");
         }else {
-            log.info("更新失败!");
+            log.info(bizObjectId+"更新失败!"+bizObject);
         }
         return chuanyunSaveResponse;
     }

+ 206 - 36
src/main/java/com/galaxis/manatee/task/ChuanyunBasicDataScheduledTask.java

@@ -1,11 +1,11 @@
 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.bo.ChuanyunObject;
 import com.galaxis.manatee.constant.ChuanYunConstant;
+import com.galaxis.manatee.constant.StringConstant;
 import com.galaxis.manatee.dao.*;
 import com.galaxis.manatee.entity.chuanyun.data.object.*;
 import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunSaveDTO;
@@ -17,12 +17,7 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
-import javax.persistence.CascadeType;
-import javax.persistence.FetchType;
-import javax.persistence.OneToMany;
-import javax.persistence.Transient;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -44,8 +39,9 @@ public class ChuanyunBasicDataScheduledTask {
     private final ChuanyunCostDao chuanyunCostDao;
     private final ChuanyunReimbursementSubjectDao chuanyunReimbursementSubjectDao;
     private final ChuanyunProjectTypeDao chuanyunProjectTypeDao;
+    private final ChuanyunSpecialProcedureDao chuanyunSpecialProcedureDao;
 
-    public ChuanyunBasicDataScheduledTask(ChuanYunManager chuanYunManager, ChuanyunGroupProjectDao chuanyunGroupProjectDao, ChuanyunUserDao chuanyunUserDao, ChuanyunSupplierDao chuanyunSupplierDao, ChuanyunCompanyDao chuanyunCompanyDao, ChuanyunUserCompanyDao chuanyunUserCompanyDao, ChuanyunCostDao chuanyunCostDao, ChuanyunReimbursementSubjectDao chuanyunReimbursementSubjectDao, ChuanyunProjectTypeDao chuanyunProjectTypeDao) {
+    public ChuanyunBasicDataScheduledTask(ChuanYunManager chuanYunManager, ChuanyunGroupProjectDao chuanyunGroupProjectDao, ChuanyunUserDao chuanyunUserDao, ChuanyunSupplierDao chuanyunSupplierDao, ChuanyunCompanyDao chuanyunCompanyDao, ChuanyunUserCompanyDao chuanyunUserCompanyDao, ChuanyunCostDao chuanyunCostDao, ChuanyunReimbursementSubjectDao chuanyunReimbursementSubjectDao, ChuanyunProjectTypeDao chuanyunProjectTypeDao, ChuanyunSpecialProcedureDao chuanyunSpecialProcedureDao) {
         this.chuanYunManager = chuanYunManager;
         this.chuanyunGroupProjectDao = chuanyunGroupProjectDao;
         this.chuanyunUserDao = chuanyunUserDao;
@@ -55,14 +51,16 @@ public class ChuanyunBasicDataScheduledTask {
         this.chuanyunCostDao = chuanyunCostDao;
         this.chuanyunReimbursementSubjectDao = chuanyunReimbursementSubjectDao;
         this.chuanyunProjectTypeDao = chuanyunProjectTypeDao;
+        this.chuanyunSpecialProcedureDao = chuanyunSpecialProcedureDao;
     }
 
     /**
      * 定时将氚云中的数据保存到manatee
      */
-    @Scheduled(fixedDelay = 360000L)
+    @Scheduled(fixedDelay = 3600000L)
     private void getDataFromChuanyun() {
-
+        //专项费用分摊
+        getSpecialProcedure();
         //获取人员-归属公司信息
         getUserCompany();
         //支出档案类型
@@ -83,6 +81,21 @@ public class ChuanyunBasicDataScheduledTask {
     }
 
     /**
+     * 获取用户工号
+     */
+    @Scheduled(fixedDelay = 1800000L)
+    private void getUserEmployeeNumber(){
+        chuanyunUserDao.findAll().forEach(chuanyunUserDO -> {
+            if(StringUtils.isEmpty(chuanyunUserDO.getEmployeeNumber())){
+                ChuanYunConstant.USER_EMPLOYEE_NUMBER.put(chuanyunUserDO.getObjectId(),"");
+            }else{
+                ChuanYunConstant.USER_EMPLOYEE_NUMBER.put(chuanyunUserDO.getObjectId(),chuanyunUserDO.getEmployeeNumber());
+            }
+        });
+        log.info("用户工号MAP更新完成");
+    }
+
+    /**
      * 从氚云中获取用户列表
      */
     private void getUserList() {
@@ -91,13 +104,6 @@ public class ChuanyunBasicDataScheduledTask {
         var totalCount=0;
         try {
             List<ChuanyunUserDO> userList=objectMapper.readValue(chuanyunFindAllDTO.getReturnData().getData(),new TypeReference<>(){});
-            userList.forEach(chuanyunUserDO -> {
-                if(StringUtils.isEmpty(chuanyunUserDO.getEmployeeNumber())){
-                    ChuanYunConstant.USER_EMPLOYEE_NUMBER.put(chuanyunUserDO.getObjectId(),"");
-                }else{
-                    ChuanYunConstant.USER_EMPLOYEE_NUMBER.put(chuanyunUserDO.getObjectId(),chuanyunUserDO.getEmployeeNumber());
-                }
-            });
             totalCount=chuanyunUserDao.saveAll(userList).size();
         } catch (Exception e) {
             e.printStackTrace();
@@ -140,6 +146,80 @@ public class ChuanyunBasicDataScheduledTask {
                         chuanyunGroupProjectDao.delete(tmpGroupProjectDO.get());
                     });
                     //新增项目组织信息
+                    //TODO 这个地方不要做到定时更新的功能里,初始化组织信息只是独立一次的操作,初始化之后的数据维护会交给对应的项目经理。这个方法单独做一个controller来提供调用
+//                    if (chuanyunGroupProjectDO.getDetailList() == null || chuanyunGroupProjectDO.getDetailList().size() == 1) {
+//                        List<ChuanyunGroupProjectDetailDO> detailList = new ArrayList<>();
+//                        for (ChuanyunCompanyDO chuanyunCompanyDO : chuanyunCompanyDao.findAll()) {
+//                            if (!"浙江凯乐士无锡分公司".equals(chuanyunCompanyDO.getCompanyName())&&!"GALAXIS Automation management GmbH".equals(chuanyunCompanyDO.getCompanyName())) {
+//                                ChuanyunGroupProjectDetailDO chuanyunGroupProjectDetailDO = new ChuanyunGroupProjectDetailDO();
+//                                chuanyunGroupProjectDetailDO.setCompanyName(chuanyunCompanyDO.getCompanyName());
+//                                chuanyunGroupProjectDetailDO.setType(chuanyunGroupProjectDO.getProjectType());
+//                                chuanyunGroupProjectDetailDO.setParentObjectId(chuanyunGroupProjectDO.getObjectId());
+//                                detailList.add(chuanyunGroupProjectDetailDO);
+//                            }
+//                        }
+//                        chuanyunGroupProjectDO.setDetailList(detailList);
+//                    }
+
+
+                    //处理项目对象中的项目成员数据
+                    projectMemberCheck(chuanyunGroupProjectDO);
+                    //处理项目对象中的项目经理、项目负责人数据
+                    projectManagerCheck(chuanyunGroupProjectDO);
+                });
+                chuanyunGroupProjectDao.saveAll(result);
+            }catch (Exception e){
+                log.error(e.getMessage());
+                e.printStackTrace();
+            }
+        }
+        log.info("集团项目信息保存保存"+totalCount+"项目映射更新完成");
+    }
+
+    /**
+     * 通过更新集团项目中的项目负责人、EBG项目经理、IBG项目经理
+     * @param chuanyunGroupProjectDO    项目对象
+     */
+    private void projectManagerCheck(ChuanyunGroupProjectDO chuanyunGroupProjectDO){
+        //将projectManger和projectOwner替换为主键
+        if(!StringUtils.isEmpty(chuanyunGroupProjectDO.getProjectOwner())){
+            chuanyunGroupProjectDO.setProjectOwner(chuanyunGroupProjectDO.getProjectOwnerObject().getObjectId());
+        }
+        if (!StringUtils.isEmpty(chuanyunGroupProjectDO.getEbgProjectManager())){
+            chuanyunGroupProjectDO.setEbgProjectManager(chuanyunGroupProjectDO.getEbgProjectManagerObject().getObjectId());
+        }
+        if(!StringUtils.isEmpty(chuanyunGroupProjectDO.getIbgProjectManager())){
+            chuanyunGroupProjectDO.setIbgProjectManager(chuanyunGroupProjectDO.getIbgProjectManagerObject().getObjectId());
+        }
+        var objectMapper=new ObjectMapper();
+        //第一步,清除项目负责人、项目经理数据。保证能够触发权限修改流程
+        GroupProjectUpdateDTO groupProjectUpdateDTO=new GroupProjectUpdateDTO();
+        try {
+            chuanYunManager.update(ChuanyunGroupProjectDO.SCHEMA_CODE,chuanyunGroupProjectDO.getObjectId(),objectMapper.writeValueAsString(groupProjectUpdateDTO));
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.warn(chuanyunGroupProjectDO.getObjectId()+"更新项目经理失败"+e.getMessage());
+        }
+        groupProjectUpdateDTO=new GroupProjectUpdateDTO(chuanyunGroupProjectDO);
+        //保证项目经理信息更新成功
+        boolean updateFlag=false;
+        while (!updateFlag){
+            try {
+                var groupProjectUpdateString=objectMapper.writeValueAsString(groupProjectUpdateDTO);
+                ChuanyunSaveDTO chuanyunSaveDTO=chuanYunManager.update(ChuanyunGroupProjectDO.SCHEMA_CODE,chuanyunGroupProjectDO.getObjectId(),groupProjectUpdateString);
+                if(chuanyunSaveDTO.getSuccessful()){
+                    log.info(chuanyunGroupProjectDO.getObjectId()+"更新项目经理成功"+groupProjectUpdateString);
+                    updateFlag=true;
+                    //更新成功之后重新获取集团项目组信息,防止id为空
+                    var chuanyunFindResponse =  chuanYunManager.find(ChuanyunGroupProjectDO.SCHEMA_CODE,chuanyunGroupProjectDO.getObjectId());
+                    ChuanyunGroupProjectDO tmpChuanyunGroupProjectDO = objectMapper.convertValue(chuanyunFindResponse.getReturnData().getBizObject(), new TypeReference<>(){});
+                    chuanyunGroupProjectDO.setDetailList(tmpChuanyunGroupProjectDO.getDetailList());
+                }else{
+                    log.warn(chuanyunGroupProjectDO.getObjectId()+"更新项目经理失败"+groupProjectUpdateString);
+                    log.warn(chuanyunGroupProjectDO+"");
+                    Thread.sleep(5000L);
+                }
+            } catch (Exception e) {
                     if (chuanyunGroupProjectDO.getDetailList() == null || chuanyunGroupProjectDO.getDetailList().size() == 1) {
                         List<ChuanyunGroupProjectDetailDO> detaillist = new ArrayList<>();
                         for (ChuanyunCompanyDO chuanyunCompanyDO : chuanyunCompanyDao.findAll()) {
@@ -224,9 +304,58 @@ public class ChuanyunBasicDataScheduledTask {
             }catch (Exception e){
                 log.error(e.getMessage());
                 e.printStackTrace();
+                log.warn(chuanyunGroupProjectDO.getObjectId()+"更新项目经理失败"+e.getMessage());
+            }
+        }
+    }
+
+    /**
+     * 如果有项目组成员,将项目组成员projectMember替换为主键
+     * 如果没有项目组成员,判断是否是EBG的实施、研发二开、售后维保项目,如果是,则添加EBG全体成员
+     * @param chuanyunGroupProjectDO    项目对象
+     */
+    private void projectMemberCheck(ChuanyunGroupProjectDO chuanyunGroupProjectDO){
+        if (chuanyunGroupProjectDO.getProjectMemberList() != null) {
+            List<String> memberList = new ArrayList<>();
+            var builder = new StringBuilder();
+            for (ChuanyunObject chuanyunObject: chuanyunGroupProjectDO.getProjectMemberObject()) {
+                builder.append(chuanyunObject.getObjectId()).append(StringConstant.SEMICOLON);
+                memberList.add(chuanyunObject.getObjectId());
+            }
+            chuanyunGroupProjectDO.setProjectMember(builder.toString());
+            //替换为主键后更新氚云数据表来增加权限
+            chuanyunGroupProjectDO.setProjectMemberList(memberList.toArray(new String[0]));
+        }else {
+            //项目成员为空的情况判断
+            //判断项目BG是否为EBG
+            var specifiedBusinessGroupFlag=ChuanyunGroupProjectDO.EBG.equals(chuanyunGroupProjectDO.getBusinessGroup());
+            //判断项目类型是否为 下列项目类型中的一种
+            var specifiedProjectTypeFlag=("实施".equals(chuanyunGroupProjectDO.getProjectType())||
+                    "维保".equals(chuanyunGroupProjectDO.getProjectType())||
+                    "研发二开".equals(chuanyunGroupProjectDO.getProjectType())||
+                    "售后".equals(chuanyunGroupProjectDO.getProjectType()));
+            //如果项目组成员为空,则自动为项目添加所有EBG成员作为项目组成员
+            if (specifiedBusinessGroupFlag&&specifiedProjectTypeFlag) {
+                var projectMember = new ArrayList<String>();
+                var builder = new StringBuilder();
+                ChuanYunConstant.USER_BUSINESS_GROUP.forEach((k,v)->{
+                    if (ChuanyunGroupProjectDO.EBG.equals(v)&&null!=k){
+                        builder.append(k).append(StringConstant.SEMICOLON);
+                        projectMember.add(k);
+                    }
+                });
+                //TODO 这里可能存在chuanyunCompanyDO找不到的情况,防止NPE,我把下面的代码换成了上面的形式--钟崇杰
+//                for (ChuanyunUserCompanyDO chuanyunUserCompanyDO : chuanyunUserCompanyDao.findAll()) {
+//                    if ("EBG".equals(chuanyunCompanyDao.findByObjectId(chuanyunUserCompanyDO.getCompanyId()).getBusinessGroup())) {
+//                        builder.append(chuanyunUserCompanyDO.getUserId()).append(StringConstant.SEMICOLON);
+//                        projectMember.add(chuanyunUserCompanyDO.getUserId());
+//                    }
+//                }
+                chuanyunGroupProjectDO.setProjectMember(builder.toString());
+                chuanyunGroupProjectDO.setProjectMemberList(projectMember.toArray(new String[0]));
+                log.info("成员已更新"+chuanyunGroupProjectDO.getProjectCode()+chuanyunGroupProjectDO.getProjectType());
             }
         }
-        log.info("集团项目信息保存保存"+totalCount+"项目映射更新完成");
     }
 
     /**
@@ -374,6 +503,42 @@ public class ChuanyunBasicDataScheduledTask {
     }
 
     /**
+     * 获取专项分摊规则
+     */
+    private void getSpecialProcedure(){
+        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(ChuanyunSpecialProcedureDO.SCHEMA_CODE,filter);
+                if(chuanyunFindAllResponse.getReturnData()==null){
+                    flag=false;
+                    continue;
+                }
+                if(chuanyunFindAllResponse.getReturnData().getTotalCount()>=start+pageSize){
+                    start+=pageSize;
+                }else{
+                    flag=false;
+                }
+                //转化为POJO
+                List<ChuanyunSpecialProcedureDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                //获取项目总数
+                totalCount=chuanyunFindAllResponse.getReturnData().getTotalCount();
+                //保存
+                chuanyunSpecialProcedureDao.saveAll(result);
+            }catch (Exception e){
+                log.error(e.getMessage());
+                e.printStackTrace();
+            }
+        }
+        log.info("专项分摊信息保存保存"+totalCount);
+    }
+
+    /**
      * 获取人员-归属公司信息
      */
     private void getUserCompany(){
@@ -409,6 +574,11 @@ public class ChuanyunBasicDataScheduledTask {
                         log.warn(chuanyunUserCompanyDO+"");
                         log.warn(exception.getMessage());
                     }
+                    try{
+                        ChuanYunConstant.USER_BUSINESS_GROUP.put(chuanyunUserCompanyDO.getUserId(),chuanyunCompanyDao.findByObjectId(chuanyunUserCompanyDO.getCompanyId()).getBusinessGroup());
+                    }catch (Exception e){
+                        log.warn("更新用户BG信息时发生异常"+e.getMessage());
+                    }
                     ChuanYunConstant.USER_DEPARTMENT.put(chuanyunUserCompanyDO.getUserId(),chuanyunUserCompanyDO.getDepartmentObject().getObjectId());
                 });
                 chuanyunUserCompanyDao.saveAll(result);
@@ -480,21 +650,20 @@ public class ChuanyunBasicDataScheduledTask {
         @JsonProperty("F0000011")
         private String ebgProjectManager;
 
-        /**
-         * 项目组成员(前端传数据用)
-         */
-        @JsonProperty("F0000034")
-        private String[] projectMemberlist;
+//        /**
+//         * 项目组成员(前端传数据用)
+//         */
+//        @JsonProperty("F0000034")
+//        private String[] projectMemberList;
 
-        /**
-         * 项目组织信息
-         */
-        @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true,fetch = FetchType.EAGER)
+//        /**
+//         * 项目组织信息
+//         * TODO 这个DTO是用于更新氚云数据的,不需要使用@OneToMany注解吧?使用目的是啥
+//         */
+//        @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true,fetch = FetchType.EAGER)
 //        @JsonProperty("D001789Fd992bf8fbe114c9babe0f98cf676f8a2")
-        @JsonProperty("D001789Fvspc68z01idftf5nqt66pkuc0")
-        private List<ChuanyunGroupProjectDetailDO> detailList;
-
-
+////        @JsonProperty("D001789Fvspc68z01idftf5nqt66pkuc0")
+//        private List<ChuanyunGroupProjectDetailDO> detailList;
 
         public GroupProjectUpdateDTO() {
         }
@@ -510,12 +679,13 @@ public class ChuanyunBasicDataScheduledTask {
                 if(null!=chuanyunGroupProjectDO.getEbgProjectManagerObject()){
                     this.ebgProjectManager=chuanyunGroupProjectDO.getEbgProjectManagerObject().getObjectId();
                 }
-                if(null!=chuanyunGroupProjectDO.getProjectMemberlist()){
-                    this.projectMemberlist=chuanyunGroupProjectDO.getProjectMemberlist();
-                }
-                if(null!=chuanyunGroupProjectDO.getDetailList()){
-                    this.detailList=chuanyunGroupProjectDO.getDetailList();
-                }
+                //TODO 更新项目经理时更新项目组织信息会是这两个业务流程耦合,不方便后续维护需要考虑单独一个DTO作为更新项目组织信息的对象
+//                if(null!=chuanyunGroupProjectDO.getProjectMemberList()){
+//                    this.projectMemberList =chuanyunGroupProjectDO.getProjectMemberList();
+//                }
+//                if(null!=chuanyunGroupProjectDO.getDetailList()){
+//                    this.detailList=chuanyunGroupProjectDO.getDetailList();
+//                }
             }
         }
     }

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

@@ -12,6 +12,7 @@ import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunSaveDTO;
 import com.galaxis.manatee.entity.chuanyun.dto.Filter;
 import com.galaxis.manatee.manager.ChuanYunManager;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
@@ -34,20 +35,26 @@ public class ChuanyunHumanResourceScheduledTask {
     private final ChuanyunGroupProjectDao chuanyunGroupProjectDao;
     private final ChuanyunHolidaySalaryRuleDao chuanyunHolidaySalaryRuleDao;
     private final ChuanyunUserCompanyDao chuanyunUserCompanyDao;
-    private final ChuanyunCompanyDao chuanyunCompanyDao;
     private final ChuanyunPayrollDao chuanyunPayrollDao;
 
-    public ChuanyunHumanResourceScheduledTask(ChuanYunManager chuanYunManager, ChuanyunLogDao chuanyunLogDao, ChuanyunGroupProjectDao chuanyunGroupProjectDao, ChuanyunHolidaySalaryRuleDao chuanyunHolidaySalaryRuleDao, ChuanyunUserCompanyDao chuanyunUserCompanyDao, ChuanyunCompanyDao chuanyunCompanyDao, ChuanyunPayrollDao chuanyunPayrollDao) {
+    public ChuanyunHumanResourceScheduledTask(ChuanYunManager chuanYunManager, ChuanyunLogDao chuanyunLogDao, ChuanyunGroupProjectDao chuanyunGroupProjectDao, ChuanyunHolidaySalaryRuleDao chuanyunHolidaySalaryRuleDao, ChuanyunUserCompanyDao chuanyunUserCompanyDao, ChuanyunPayrollDao chuanyunPayrollDao) {
         this.chuanYunManager = chuanYunManager;
         this.chuanyunLogDao = chuanyunLogDao;
         this.chuanyunGroupProjectDao = chuanyunGroupProjectDao;
         this.chuanyunHolidaySalaryRuleDao = chuanyunHolidaySalaryRuleDao;
         this.chuanyunUserCompanyDao = chuanyunUserCompanyDao;
-        this.chuanyunCompanyDao = chuanyunCompanyDao;
         this.chuanyunPayrollDao = chuanyunPayrollDao;
     }
 
     /**
+     * 提供一个外部调用接口
+     */
+    @Async
+    public void getPayrollManually(){
+        this.getPayroll();
+    }
+
+    /**
      * 每天3点更新日志记录
      */
     @Scheduled(cron = "0 0 3 * * *")
@@ -102,29 +109,8 @@ public class ChuanyunHumanResourceScheduledTask {
                             }
                         });
                         //判断所属部门是否正确
-                        chuanyunUserCompanyDao.findById(chuanyunLogDO.getUserCompanyId()).ifPresent(chuanyunUserCompanyDO -> {
-                            String ownerDepartmentId = chuanyunUserCompanyDO.getDepartment();
-                            if (!chuanyunLogDO.getOwnerDepartmentId().equals(ownerDepartmentId)) {
-                                chuanyunLogDO.setOwnerDepartmentId(ChuanYunConstant.USER_DEPARTMENT.get(chuanyunUserCompanyDO.getUserId()).toString());
-                                boolean updateFlag=false;
-                                while (!updateFlag) {
-                                    try {
-                                        var groupProjectUpdateString = objectMapper.writeValueAsString(chuanyunLogDO);
-                                        ChuanyunSaveDTO chuanyunSaveDTO = chuanYunManager.update(ChuanyunLogDO.SCHEMA_CODE, chuanyunLogDO.getObjectId(), groupProjectUpdateString);
-                                        if (chuanyunSaveDTO.getSuccessful()) {
-                                            log.info(chuanyunLogDO.getObjectId() + "更新人员所属部门成功" + groupProjectUpdateString);
-                                            updateFlag = true;
-                                        } else {
-                                            log.warn(chuanyunLogDO.getObjectId() + "更新人员所属部门失败" + groupProjectUpdateString);
-                                            log.warn(chuanyunLogDO + "");
-                                            Thread.sleep(5000L);
-                                        }
-                                    } catch (Exception e) {
-                                        e.printStackTrace();
-                                    }
-                                }
-                            }
-                        });
+                        //目前已经通过excel方式更新完成这个方法暂时不需要使用
+//                        checkDepartment(chuanyunLogDO);
                     }
                     //处理项目userId
                     if(chuanyunLogDO.getUserObject()!=null){
@@ -144,9 +130,41 @@ public class ChuanyunHumanResourceScheduledTask {
     }
 
     /**
+     * 检查日志中人员所属部门和日志所属部门是否一致,用于处理手工excel导入日志造成的日志部门不一致的情况
+     * @param chuanyunLogDO 日志对象
+     */
+    @Deprecated
+    private void checkDepartment(ChuanyunLogDO chuanyunLogDO){
+        var objectMapper=new ObjectMapper();
+        chuanyunUserCompanyDao.findById(chuanyunLogDO.getUserCompanyId()).ifPresent(chuanyunUserCompanyDO -> {
+            String ownerDepartmentId = chuanyunUserCompanyDO.getDepartment();
+            if (!chuanyunLogDO.getOwnerDepartmentId().equals(ownerDepartmentId)) {
+                chuanyunLogDO.setOwnerDepartmentId(ChuanYunConstant.USER_DEPARTMENT.get(chuanyunUserCompanyDO.getUserId()).toString());
+                boolean updateFlag=false;
+                while (!updateFlag) {
+                    try {
+                        var groupProjectUpdateString = objectMapper.writeValueAsString(chuanyunLogDO);
+                        ChuanyunSaveDTO chuanyunSaveDTO = chuanYunManager.update(ChuanyunLogDO.SCHEMA_CODE, chuanyunLogDO.getObjectId(), groupProjectUpdateString);
+                        if (chuanyunSaveDTO.getSuccessful()) {
+                            log.info(chuanyunLogDO.getObjectId() + "更新人员所属部门成功" + groupProjectUpdateString);
+                            updateFlag = true;
+                        } else {
+                            log.warn(chuanyunLogDO.getObjectId() + "更新人员所属部门失败" + groupProjectUpdateString);
+                            log.warn(chuanyunLogDO + "");
+                            Thread.sleep(5000L);
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        });
+    }
+
+    /**
      * 法定假日薪资规则同步
      */
-    @Scheduled(fixedDelay = 1000000000L)
+    @Scheduled(fixedDelay = 86400000L)
     private void getHolidaySalaryRule() {
         var objectMapper = new ObjectMapper();
         var start = 0;
@@ -183,7 +201,7 @@ public class ChuanyunHumanResourceScheduledTask {
     /**
      * 凯乐士薪酬项同步
      */
-    @Scheduled(fixedDelay = 1000000000L)
+    @Scheduled(fixedDelay = 86400000L)
     private void getPayroll() {
         var objectMapper = new ObjectMapper();
         var start = 0;

+ 0 - 2
src/main/java/com/galaxis/manatee/task/ChuanyunScheduledTask.java

@@ -54,7 +54,6 @@ public class ChuanyunScheduledTask {
     /**
      * 定时将氚云中的数据保存到manatee
      */
-//    @Scheduled(fixedDelay = 43200000L)
     private void getDataFromChuanyun(){
         //获取项目数据
         getProjectInformationFromChuanyun();
@@ -63,7 +62,6 @@ public class ChuanyunScheduledTask {
     /**
      * 定时将物料信息从氚云中同步
      */
-//    @Scheduled(fixedDelay = 27600000L,initialDelay = 3600000L)
     public void materialInformationSync(){
         var pageSize=100;
         var start=0;

+ 3 - 4
src/main/java/com/galaxis/manatee/task/FixService.java

@@ -89,7 +89,7 @@ public class FixService {
                             String bizObjectString=objectMapper.writeValueAsString(reimbursementDTO);
                             ChuanyunSaveDTO chuanyunSaveDTO=chuanYunManager.update(ChuanyunReimbursementDO.SCHEMA_CODE,chuanyunReimbursementDO.getObjectId(),bizObjectString);
                             log.info(chuanyunSaveDTO+"");
-                        } catch (JsonProcessingException | BigSizeException e) {
+                        } catch (Exception e) {
                             e.printStackTrace();
                         }
                     });
@@ -182,7 +182,7 @@ public class FixService {
                             try {
                                 ChuanyunSaveDTO chuanyunSaveDTO=chuanYunManager.update(ChuanyunLogDO.SCHEMA_CODE,chuanyunLogDO.getObjectId(),objectMapper.writeValueAsString(logDTO));
                                 log.info(chuanyunSaveDTO+"");
-                            } catch (JsonProcessingException | BigSizeException e) {
+                            } catch (Exception e) {
                                 e.printStackTrace();
                             }
                         });
@@ -343,10 +343,9 @@ public class FixService {
                             String bizObjectString=objectMapper.writeValueAsString(logDTO);
                             ChuanyunSaveDTO chuanyunSaveDTO=chuanYunManager.update(ChuanyunLogDO.SCHEMA_CODE,chuanyunLogDO.getObjectId(),bizObjectString);
                             log.info(chuanyunSaveDTO+"");
-                        } catch (JsonProcessingException | BigSizeException e) {
+                        } catch (Exception e) {
                             e.printStackTrace();
                         }
-
                     }
                     if(chuanyunDayLogList.size()>0){
                          try {

+ 4 - 3
src/main/java/com/galaxis/manatee/task/U9ScheduledTask.java

@@ -10,7 +10,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.http.HttpStatus;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -36,16 +35,18 @@ public class U9ScheduledTask {
 
     /**
      * 定时将manatee中的信息同步到claw中
+     * @deprecated U9自动从mysql中读取,不需要写到claw服务了
      */
-//    @Scheduled(fixedDelay = 600000L,initialDelay = 10000L)
+    @Deprecated
     private void projectInformationSync(){
         putProjectToClaw();
     }
 
     /**
      *
+     * @deprecated U9自动从mysql中读取,不需要写到claw服务了
      */
-//    @Scheduled(fixedDelay = 43200000L)
+    @Deprecated
     private void reimbursementInformationSync(){
         putReimbursementToClaw();
     }