|
@@ -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();
|
|
|
+// }
|
|
|
}
|
|
|
}
|
|
|
}
|