|
@@ -4,7 +4,9 @@ import com.fasterxml.jackson.annotation.JsonProperty;
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
import com.fasterxml.jackson.core.type.TypeReference;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import com.galaxis.manatee.constant.ChuanYunConstant;
|
|
|
import com.galaxis.manatee.dao.ChuanyunImplCostDao;
|
|
|
+import com.galaxis.manatee.dao.ChuanyunMonthLaborCostWgDao;
|
|
|
import com.galaxis.manatee.dao.ChuanyunReimbursementDao;
|
|
|
import com.galaxis.manatee.dao.ChuanyunSelfWorkHourDao;
|
|
|
import com.galaxis.manatee.entity.chuanyun.data.object.*;
|
|
@@ -12,20 +14,23 @@ import com.galaxis.manatee.entity.chuanyun.dto.*;
|
|
|
import com.galaxis.manatee.event.PushImplCostEvent;
|
|
|
import com.galaxis.manatee.exception.BigSizeException;
|
|
|
import com.galaxis.manatee.manager.ChuanYunManager;
|
|
|
+import com.galaxis.manatee.service.GroupProjectService;
|
|
|
import com.galaxis.manatee.service.WorkGroupService;
|
|
|
+import com.galaxis.manatee.util.CollectionsUtils;
|
|
|
+import com.galaxis.manatee.util.TimeUtil;
|
|
|
import lombok.Data;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.context.ApplicationContext;
|
|
|
-import org.springframework.scheduling.annotation.Async;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Objects;
|
|
|
-import java.util.Optional;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 工作组相关操作
|
|
@@ -34,21 +39,49 @@ import java.util.Optional;
|
|
|
@Service
|
|
|
public class WorkGroupServiceImpl implements WorkGroupService {
|
|
|
|
|
|
- @Autowired
|
|
|
private ChuanYunManager chuanYunManager;
|
|
|
+ private ChuanyunImplCostDao implCostDao;
|
|
|
+ private ChuanyunReimbursementDao reimbursementDao;
|
|
|
+ private ChuanyunSelfWorkHourDao selfWorkHourDao;
|
|
|
+ private ApplicationContext applicationContext;
|
|
|
+ private ChuanyunMonthLaborCostWgDao chuanyunMonthLaborCostWgDao;
|
|
|
+ private GroupProjectService groupProjectService;
|
|
|
+
|
|
|
|
|
|
@Autowired
|
|
|
- private ChuanyunImplCostDao implCostDao;
|
|
|
+ public void setChuanYunManager(ChuanYunManager chuanYunManager) {
|
|
|
+ this.chuanYunManager = chuanYunManager;
|
|
|
+ }
|
|
|
|
|
|
@Autowired
|
|
|
- private ChuanyunReimbursementDao reimbursementDao;
|
|
|
+ public void setChuanYunManager(ChuanyunImplCostDao implCostDao) {
|
|
|
+ this.implCostDao = implCostDao;
|
|
|
+ }
|
|
|
|
|
|
@Autowired
|
|
|
- private ChuanyunSelfWorkHourDao selfWorkHourDao;
|
|
|
+ public void setReimbursementDao(ChuanyunReimbursementDao reimbursementDao) {
|
|
|
+ this.reimbursementDao = reimbursementDao;
|
|
|
+ }
|
|
|
|
|
|
@Autowired
|
|
|
- private ApplicationContext applicationContext;
|
|
|
+ public void setSelfWorkHourDao(ChuanyunSelfWorkHourDao selfWorkHourDao) {
|
|
|
+ this.selfWorkHourDao = selfWorkHourDao;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ public void setApplicationContext(ApplicationContext applicationContext) {
|
|
|
+ this.applicationContext = applicationContext;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ public void setChuanyunMonthLaborCostWgDao(ChuanyunMonthLaborCostWgDao chuanyunMonthLaborCostWgDao) {
|
|
|
+ this.chuanyunMonthLaborCostWgDao = chuanyunMonthLaborCostWgDao;
|
|
|
+ }
|
|
|
|
|
|
+ @Autowired
|
|
|
+ public void setGroupProjectService(GroupProjectService groupProjectService) {
|
|
|
+ this.groupProjectService = groupProjectService;
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* 汇算工作组级别实施费用
|
|
@@ -61,7 +94,7 @@ public class WorkGroupServiceImpl implements WorkGroupService {
|
|
|
// 查询组织架构录入
|
|
|
final Object monitor = new Object();
|
|
|
buildProjectList.parallelStream().forEach(chuanyunBuildProject -> {
|
|
|
- synchronized (monitor){
|
|
|
+ synchronized (monitor) {
|
|
|
String buildProjectId = chuanyunBuildProject.getObjectId();
|
|
|
List<String> m1 = List.of("F0000001_2," + buildProjectId);
|
|
|
Filter filter = Filter.instance(0, 10, true, Filter.AND, m1);
|
|
@@ -104,7 +137,7 @@ public class WorkGroupServiceImpl implements WorkGroupService {
|
|
|
} catch (JsonProcessingException e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
- if (!groupProjectResponse.getSuccessful() || groupProjectResponse.getReturnData() == null) {
|
|
|
+ if (Objects.isNull(groupProjectResponse) || !groupProjectResponse.getSuccessful() || groupProjectResponse.getReturnData() == null) {
|
|
|
return;
|
|
|
}
|
|
|
List<Object> bizObjectArray = groupProjectResponse.getReturnData().getBizObjectArray();
|
|
@@ -115,49 +148,99 @@ public class WorkGroupServiceImpl implements WorkGroupService {
|
|
|
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");
|
|
|
- // 查询项目工作组人天
|
|
|
+ Map<LocalDate, List<ChuanyunReimbursementDO>> reimbursementMap = new HashMap<>();
|
|
|
+ Map<LocalDate, List<ChuanyunSelfWorkHourDO>> workHoursMap = new HashMap<>();
|
|
|
+
|
|
|
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);
|
|
|
+ // 报销单按日期分组
|
|
|
+ Map<LocalDate, List<ChuanyunReimbursementDO>> map1 = reimbursements.stream().collect(Collectors.groupingBy(chuanyunReimbursementDO -> LocalDate.of(chuanyunReimbursementDO.getBusinessDate().getYear(), chuanyunReimbursementDO.getBusinessDate().getMonthValue(), 1)));
|
|
|
+ map1.forEach((localDate, chuanyunReimbursementDOS) -> {
|
|
|
+ boolean containsKey = reimbursementMap.containsKey(localDate);
|
|
|
+ if (containsKey) {
|
|
|
+ // 表示已经存在该key
|
|
|
+ List<ChuanyunReimbursementDO> reimbursementDOList = reimbursementMap.get(localDate);
|
|
|
+ reimbursementDOList.addAll(chuanyunReimbursementDOS);
|
|
|
+ reimbursementMap.put(localDate, reimbursementDOList);
|
|
|
+ } else {
|
|
|
+ reimbursementMap.put(localDate, chuanyunReimbursementDOS);
|
|
|
+ }
|
|
|
+ });
|
|
|
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);
|
|
|
-
|
|
|
+ Map<LocalDate, List<ChuanyunSelfWorkHourDO>> map2 = workHours.stream().collect(Collectors.groupingBy(chuanyunSelfWorkHourDO -> LocalDate.of(chuanyunSelfWorkHourDO.getDayLogDate().getYear(), chuanyunSelfWorkHourDO.getDayLogDate().getMonthValue(), 1)));
|
|
|
+ map2.forEach((localDate, chuanyunSelfWorkHourDOS) -> {
|
|
|
+ boolean containsKey = workHoursMap.containsKey(localDate);
|
|
|
+ if (containsKey) {
|
|
|
+ // 表示已经存在该key
|
|
|
+ List<ChuanyunSelfWorkHourDO> selfWorkHours = workHoursMap.get(localDate);
|
|
|
+ selfWorkHours.addAll(chuanyunSelfWorkHourDOS);
|
|
|
+ workHoursMap.put(localDate, selfWorkHours);
|
|
|
+ } else {
|
|
|
+ workHoursMap.put(localDate, chuanyunSelfWorkHourDOS);
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
- // 统计工作组所有的工时
|
|
|
- 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();
|
|
|
- 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);
|
|
|
+
|
|
|
+ Set<LocalDate> localDates = reimbursementMap.keySet();
|
|
|
+ Set<LocalDate> localDates1 = workHoursMap.keySet();
|
|
|
+ Set<LocalDate> mergeCollections = CollectionsUtils.mergeCollections(localDates, localDates1);
|
|
|
+
|
|
|
+ mergeCollections.forEach(localDate -> {
|
|
|
+ BigDecimal totalReimbursement;
|
|
|
+ BigDecimal totalManDay;
|
|
|
+ List<ChuanyunReimbursementDO> reimbursements = reimbursementMap.getOrDefault(localDate, Collections.emptyList());
|
|
|
+ if (reimbursements.isEmpty()) {
|
|
|
+ totalReimbursement = new BigDecimal("0.00");
|
|
|
+ } else {
|
|
|
+ totalReimbursement = reimbursements.stream().map(ChuanyunReimbursementDO::getTotalAmountNotTaxed).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
}
|
|
|
- } 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);
|
|
|
- }
|
|
|
+ List<ChuanyunSelfWorkHourDO> selfWorkHours = workHoursMap.getOrDefault(localDate, Collections.emptyList());
|
|
|
+ if (selfWorkHours.isEmpty()) {
|
|
|
+ totalManDay = new BigDecimal("0.00");
|
|
|
+ } else {
|
|
|
+ BigDecimal totalWorkHours = selfWorkHours.stream().map(ChuanyunSelfWorkHourDO::getStandardWorkHour).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ totalManDay = totalWorkHours.divide(BigDecimal.valueOf(8), 3, RoundingMode.UP);
|
|
|
+ }
|
|
|
+ // 统计工作组所有的工时
|
|
|
+ String projectObjectId = chuanyunGroupProjectDO.getObjectId();
|
|
|
+ String projectCode = chuanyunGroupProjectDO.getProjectCode();
|
|
|
+ String workGroupId = chuanyunWorkGroupDO.getObjectId();
|
|
|
+ // 查询人力成本
|
|
|
+ List<ChuanyunMonthLaborCostWgDTO> laborCostWgs = chuanyunMonthLaborCostWgDao.findAllByProjectCodeAndLogDateAndWorkGroupId(projectCode, localDate.atStartOfDay(), workGroupId);
|
|
|
+ BigDecimal totalLaborCost = laborCostWgs.stream().map(ChuanyunMonthLaborCostWgDTO::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ ChuanyunImplCostDO old = implCostDao.findByProjectIdAndProjectCodeAndWorkGroupAndLocalDate(projectObjectId, projectCode, workGroupId, localDate.atStartOfDay());
|
|
|
+ if (!Objects.isNull(old)) {
|
|
|
+ BigDecimal oldImplCost = old.getImplCost();
|
|
|
+ BigDecimal oldManDay = old.getManDay();
|
|
|
+ BigDecimal oldLaborCost = old.getLaborCost();
|
|
|
+ if (Objects.isNull(old.getLocalDate()) || Objects.isNull(oldImplCost) ||
|
|
|
+ Objects.isNull(oldManDay) || Objects.isNull(oldLaborCost) || oldImplCost.compareTo(totalReimbursement) != 0 ||
|
|
|
+ oldManDay.compareTo(totalManDay) != 0 || oldLaborCost.compareTo(totalLaborCost) != 0) {
|
|
|
+ old.setImplCost(totalReimbursement);
|
|
|
+ old.setManDay(totalManDay);
|
|
|
+ old.setLaborCost(totalLaborCost);
|
|
|
+ implCostDao.saveAndFlush(old);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ ChuanyunImplCostDO chuanyunImplCostDO = new ChuanyunImplCostDO();
|
|
|
+ chuanyunImplCostDO.setProjectId(projectObjectId);
|
|
|
+ chuanyunImplCostDO.setProjectCode(projectCode);
|
|
|
+ chuanyunImplCostDO.setLocalDate(localDate.atStartOfDay());
|
|
|
+ chuanyunImplCostDO.setWorkGroup(workGroupId);
|
|
|
+ chuanyunImplCostDO.setWorkGroupName(chuanyunWorkGroupDO.getWorkGroupName());
|
|
|
+ chuanyunImplCostDO.setImplCost(totalReimbursement);
|
|
|
+ chuanyunImplCostDO.setManDay(totalManDay);
|
|
|
+ chuanyunImplCostDO.setLaborCost(totalLaborCost);
|
|
|
+ implCostDao.saveAndFlush(chuanyunImplCostDO);
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
}
|
|
|
});
|
|
|
|
|
|
});
|
|
|
+
|
|
|
}
|
|
|
});
|
|
|
|
|
@@ -170,6 +253,7 @@ public class WorkGroupServiceImpl implements WorkGroupService {
|
|
|
|
|
|
private List<ChuanyunBuildProject> findAll() {
|
|
|
ArrayList<ChuanyunBuildProject> buildProjects = new ArrayList<>();
|
|
|
+ ObjectMapper objectMapper = new ObjectMapper();
|
|
|
int start = 0;
|
|
|
long totalCount = 0L;
|
|
|
boolean flag = true;
|
|
@@ -193,7 +277,6 @@ public class WorkGroupServiceImpl implements WorkGroupService {
|
|
|
totalCount = chuanyunFindAllResponse.getReturnData().getTotalCount();
|
|
|
//保存
|
|
|
List<Object> bizObjectArray = chuanyunFindAllResponse.getReturnData().getBizObjectArray();
|
|
|
- ObjectMapper objectMapper = new ObjectMapper();
|
|
|
List<ChuanyunBuildProject> bpList = objectMapper.convertValue(bizObjectArray, new TypeReference<>() {
|
|
|
});
|
|
|
buildProjects.addAll(bpList);
|
|
@@ -215,7 +298,9 @@ public class WorkGroupServiceImpl implements WorkGroupService {
|
|
|
String projectId = implCostDO.getProjectId();
|
|
|
String projectCode = implCostDO.getProjectCode();
|
|
|
String workGroup = implCostDO.getWorkGroup();
|
|
|
- List<String> m = List.of("F0000001_2," + projectId, "F0000002_2," + projectCode, "F0000006_2," + workGroup);
|
|
|
+ LocalDateTime localDate = implCostDO.getLocalDate();
|
|
|
+ // 时间转换为氚云的格式
|
|
|
+ List<String> m = List.of("F0000001_2," + projectId, "F0000002_2," + projectCode, "F0000006_2," + workGroup, "F0000008_2," + TimeUtil.formatDateTime(localDate));
|
|
|
Filter filter = Filter.instance(0, 10, true, Filter.AND, m);
|
|
|
ChuanyunFindAllBizDTO<Object> implCostResponse = null;
|
|
|
try {
|
|
@@ -233,11 +318,13 @@ public class WorkGroupServiceImpl implements WorkGroupService {
|
|
|
if (implCostOptional.isPresent()) {
|
|
|
ChuanyunImplCostDO chuanyunImplCostDO = implCostOptional.get();
|
|
|
if (Objects.isNull(chuanyunImplCostDO.getImplCost()) || Objects.isNull(chuanyunImplCostDO.getManDay()) ||
|
|
|
+ Objects.isNull(chuanyunImplCostDO.getLaborCost()) ||
|
|
|
chuanyunImplCostDO.getImplCost().compareTo(implCostDO.getImplCost()) != 0 ||
|
|
|
- chuanyunImplCostDO.getManDay().compareTo(implCostDO.getManDay()) != 0) {
|
|
|
+ chuanyunImplCostDO.getManDay().compareTo(implCostDO.getManDay()) != 0 ||
|
|
|
+ chuanyunImplCostDO.getLaborCost().compareTo(implCostDO.getLaborCost()) != 0) {
|
|
|
// 工作组实施费用发生变化
|
|
|
log.info("更新项目工作组实施费用");
|
|
|
- ImplCostUpdateDTO implCostUpdateDTO = new ImplCostUpdateDTO(implCostDO.getImplCost(), implCostDO.getManDay());
|
|
|
+ ImplCostUpdateDTO implCostUpdateDTO = new ImplCostUpdateDTO(implCostDO.getImplCost(), implCostDO.getManDay(), implCostDO.getLaborCost());
|
|
|
try {
|
|
|
String updateStr = objectMapper.writeValueAsString(implCostUpdateDTO);
|
|
|
chuanYunManager.update(ChuanyunImplCostDO.SCHEMA_CODE, chuanyunImplCostDO.getObjectId(), updateStr);
|
|
@@ -274,9 +361,13 @@ public class WorkGroupServiceImpl implements WorkGroupService {
|
|
|
@JsonProperty("F0000007")
|
|
|
private BigDecimal manDay;
|
|
|
|
|
|
- public ImplCostUpdateDTO(BigDecimal implCost, BigDecimal manDay) {
|
|
|
+ @JsonProperty("F0000009")
|
|
|
+ private BigDecimal laborCost;
|
|
|
+
|
|
|
+ public ImplCostUpdateDTO(BigDecimal implCost, BigDecimal manDay, BigDecimal laborCost) {
|
|
|
this.implCost = implCost;
|
|
|
this.manDay = manDay;
|
|
|
+ this.laborCost = laborCost;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -294,6 +385,13 @@ public class WorkGroupServiceImpl implements WorkGroupService {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ if (Objects.equals(ChuanYunConstant.DEFAULT_WORK_GROUP, objectId)) {
|
|
|
+ ChuanyunWorkGroupDO workGroupDO = new ChuanyunWorkGroupDO();
|
|
|
+ workGroupDO.setWorkGroupName(ChuanYunConstant.DEFAULT_WORK_GROUP_NAME);
|
|
|
+ workGroupDO.setSubWorkGroup(ChuanYunConstant.DEFAULT_WORK_GROUP_NAME);
|
|
|
+ workGroupDO.setObjectId(objectId);
|
|
|
+ return workGroupDO;
|
|
|
+ }
|
|
|
log.warn("无该工作组");
|
|
|
return null;
|
|
|
}
|
|
@@ -338,9 +436,240 @@ public class WorkGroupServiceImpl implements WorkGroupService {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- log.warn("组织架构查询中无该工作组");
|
|
|
+ if (Objects.equals(ChuanYunConstant.DEFAULT_WORK_GROUP, objectId)) {
|
|
|
+ ChuanyunHistoryWorkGroupDO historyWorkGroupDO = new ChuanyunHistoryWorkGroupDO();
|
|
|
+ historyWorkGroupDO.setWorkGroupName(ChuanYunConstant.DEFAULT_WORK_GROUP_NAME);
|
|
|
+ historyWorkGroupDO.setSubWorkGroup(ChuanYunConstant.DEFAULT_WORK_GROUP_NAME);
|
|
|
+ historyWorkGroupDO.setObjectId(objectId);
|
|
|
+ return historyWorkGroupDO;
|
|
|
+ }
|
|
|
+ log.warn("组织架构查询中无该工作组 workGroupId: {}", objectId);
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
|
|
|
+ @Override
|
|
|
+ public void implAllCost() {
|
|
|
+ // 查询立项表中数据
|
|
|
+ List<ChuanyunBuildProject> buildProjectList = findAll();
|
|
|
+ ObjectMapper objectMapper = new ObjectMapper();
|
|
|
+ // 查询组织架构录入
|
|
|
+ final Object monitor = new Object();
|
|
|
+ buildProjectList.parallelStream().forEach(chuanyunBuildProject -> {
|
|
|
+ log.info("汇算项目成本数据chuanyunBuildProject: {}", chuanyunBuildProject);
|
|
|
+ synchronized (monitor) {
|
|
|
+ // 查询总表中的项目id
|
|
|
+ // 查询该项目在总表中的记录
|
|
|
+ List<ChuanyunGroupProjectDO> groupProjectDOList = groupProjectService.findByProjectCode(chuanyunBuildProject.getProjectCode());
|
|
|
+ if (!Objects.isNull(groupProjectDOList)) {
|
|
|
+ if (groupProjectDOList.isEmpty()) {
|
|
|
+ log.info("集团项目总表找不到对应项目 chuanyunBuildProject: {}", chuanyunBuildProject);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ groupProjectDOList.forEach(chuanyunGroupProjectDO -> {
|
|
|
+ String groupProjectObjectId = chuanyunGroupProjectDO.getObjectId();
|
|
|
+ String groupProjectCode = chuanyunGroupProjectDO.getProjectCode();
|
|
|
+ // 查询项目报销单
|
|
|
+ Map<LocalDate, List<ChuanyunReimbursementDO>> reimbursementMap = new HashMap<>();
|
|
|
+ Map<LocalDate, List<ChuanyunSelfWorkHourDO>> workHoursMap = new HashMap<>();
|
|
|
+ Map<LocalDate, List<ChuanyunMonthLaborCostWgDTO>> laborCostMap = new HashMap<>();
|
|
|
+ List<ChuanyunReimbursementDO> reimbursements = reimbursementDao.findAllByGroupProjectIdAndStatusIn(chuanyunGroupProjectDO.getObjectId(), List.of(1, 2));
|
|
|
+ // 查询用户在该项目的报销单
|
|
|
+ // 报销单按日期分组
|
|
|
+ Map<LocalDate, List<ChuanyunReimbursementDO>> map1 = reimbursements.stream().collect(Collectors.groupingBy(chuanyunReimbursementDO -> {
|
|
|
+ if (!Objects.isNull(chuanyunReimbursementDO.getBusinessDate())) {
|
|
|
+ return LocalDate.of(chuanyunReimbursementDO.getBusinessDate().getYear(), chuanyunReimbursementDO.getBusinessDate().getMonthValue(), 1);
|
|
|
+ } else {
|
|
|
+ return LocalDate.of(2015, 1, 1);
|
|
|
+ }
|
|
|
+ }));
|
|
|
+
|
|
|
+ map1.forEach((localDate, chuanyunReimbursementDOS) -> {
|
|
|
+ boolean containsKey = reimbursementMap.containsKey(localDate);
|
|
|
+ if (containsKey) {
|
|
|
+ // 表示已经存在该key
|
|
|
+ List<ChuanyunReimbursementDO> reimbursementDOList = reimbursementMap.get(localDate);
|
|
|
+ reimbursementDOList.addAll(chuanyunReimbursementDOS);
|
|
|
+ reimbursementMap.put(localDate, reimbursementDOList);
|
|
|
+ } else {
|
|
|
+ reimbursementMap.put(localDate, chuanyunReimbursementDOS);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ List<ChuanyunSelfWorkHourDO> workHours = selfWorkHourDao.findAllByProjectIdAndStatusIn(groupProjectObjectId, List.of("1", "2"));
|
|
|
+ Map<LocalDate, List<ChuanyunSelfWorkHourDO>> map2 = workHours.stream().collect(Collectors.groupingBy(chuanyunSelfWorkHourDO -> {
|
|
|
+ if (!Objects.isNull(chuanyunSelfWorkHourDO.getDayLogDate())) {
|
|
|
+ return LocalDate.of(chuanyunSelfWorkHourDO.getDayLogDate().getYear(), chuanyunSelfWorkHourDO.getDayLogDate().getMonthValue(), 1);
|
|
|
+ } else {
|
|
|
+ return LocalDate.of(2015, 1, 1);
|
|
|
+ }
|
|
|
+ }));
|
|
|
+ map2.forEach((localDate, chuanyunSelfWorkHourDOS) -> {
|
|
|
+ boolean containsKey = workHoursMap.containsKey(localDate);
|
|
|
+ if (containsKey) {
|
|
|
+ // 表示已经存在该key
|
|
|
+ List<ChuanyunSelfWorkHourDO> selfWorkHours = workHoursMap.get(localDate);
|
|
|
+ selfWorkHours.addAll(chuanyunSelfWorkHourDOS);
|
|
|
+ workHoursMap.put(localDate, selfWorkHours);
|
|
|
+ } else {
|
|
|
+ workHoursMap.put(localDate, chuanyunSelfWorkHourDOS);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ List<ChuanyunMonthLaborCostWgDTO> laborCostWgs = chuanyunMonthLaborCostWgDao.findAllByProjectCode(groupProjectCode);
|
|
|
+ Map<LocalDate, List<ChuanyunMonthLaborCostWgDTO>> map3 = laborCostWgs.stream().collect(Collectors.groupingBy(chuanyunMonthLaborCostWgDTO -> {
|
|
|
+ if (!Objects.isNull(chuanyunMonthLaborCostWgDTO.getLogDate())) {
|
|
|
+ return LocalDate.of(chuanyunMonthLaborCostWgDTO.getLogDate().getYear(), chuanyunMonthLaborCostWgDTO.getLogDate().getMonthValue(), 1);
|
|
|
+ } else {
|
|
|
+ return LocalDate.of(2015, 1, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ }));
|
|
|
+ map3.forEach((localDate, chuanyunMonthLaborCostWgDTOS) -> {
|
|
|
+ boolean containsKey = laborCostMap.containsKey(localDate);
|
|
|
+ if (containsKey) {
|
|
|
+ // 表示已经存在该key
|
|
|
+ List<ChuanyunMonthLaborCostWgDTO> monthLaborCostWgs = laborCostMap.get(localDate);
|
|
|
+ monthLaborCostWgs.addAll(chuanyunMonthLaborCostWgDTOS);
|
|
|
+ laborCostMap.put(localDate, monthLaborCostWgs);
|
|
|
+ } else {
|
|
|
+ laborCostMap.put(localDate, chuanyunMonthLaborCostWgDTOS);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ Set<LocalDate> localDates1 = reimbursementMap.keySet();
|
|
|
+ Set<LocalDate> localDates2 = workHoursMap.keySet();
|
|
|
+ Set<LocalDate> localDates3 = laborCostMap.keySet();
|
|
|
+
|
|
|
+ Set<LocalDate> collections = CollectionsUtils.mergeCollections(localDates1, localDates2);
|
|
|
+ Set<LocalDate> mergeCollections = CollectionsUtils.mergeCollections(collections, localDates3);
|
|
|
+
|
|
|
+ mergeCollections.forEach(localDate -> {
|
|
|
+ List<ChuanyunReimbursementDO> reimbursementList = reimbursementMap.getOrDefault(localDate, Collections.emptyList());
|
|
|
+ List<ChuanyunSelfWorkHourDO> selfWorkHourList = workHoursMap.getOrDefault(localDate, Collections.emptyList());
|
|
|
+ List<ChuanyunMonthLaborCostWgDTO> laborCostWgList = laborCostMap.getOrDefault(localDate, Collections.emptyList());
|
|
|
+
|
|
|
+ Map<String, List<ChuanyunReimbursementDO>> workGroupIdReimbursementMap = reimbursementList.stream().collect(Collectors.groupingBy(chuanyunReimbursementDO -> {
|
|
|
+ if (Objects.isNull(chuanyunReimbursementDO.getWorkGroupId()) || !StringUtils.hasLength(chuanyunReimbursementDO.getWorkGroupId())) {
|
|
|
+ return ChuanYunConstant.DEFAULT_WORK_GROUP;
|
|
|
+ } else {
|
|
|
+ return chuanyunReimbursementDO.getWorkGroupId();
|
|
|
+ }
|
|
|
+ }));
|
|
|
+ Map<String, List<ChuanyunSelfWorkHourDO>> workGroupIdSelfWorkHourMap = selfWorkHourList.stream().collect(Collectors.groupingBy(chuanyunSelfWorkHourDO -> {
|
|
|
+ if (Objects.isNull(chuanyunSelfWorkHourDO.getWorkGroupId()) || !StringUtils.hasLength(chuanyunSelfWorkHourDO.getWorkGroupId())) {
|
|
|
+ return ChuanYunConstant.DEFAULT_WORK_GROUP;
|
|
|
+ } else {
|
|
|
+ return chuanyunSelfWorkHourDO.getWorkGroupId();
|
|
|
+ }
|
|
|
+ }));
|
|
|
+ Map<String, List<ChuanyunMonthLaborCostWgDTO>> workGroupIdLaborCostMap = laborCostWgList.stream().collect(Collectors.groupingBy(chuanyunMonthLaborCostWgDTO -> {
|
|
|
+ if (Objects.isNull(chuanyunMonthLaborCostWgDTO.getWorkGroupId()) || !StringUtils.hasLength(chuanyunMonthLaborCostWgDTO.getWorkGroupId())) {
|
|
|
+ return ChuanYunConstant.DEFAULT_WORK_GROUP;
|
|
|
+ } else {
|
|
|
+ return chuanyunMonthLaborCostWgDTO.getWorkGroupId();
|
|
|
+ }
|
|
|
+ }));
|
|
|
+
|
|
|
+ Set<String> workGroup1 = workGroupIdReimbursementMap.keySet();
|
|
|
+ Set<String> workGroup2 = workGroupIdSelfWorkHourMap.keySet();
|
|
|
+ Set<String> workGroup3 = workGroupIdLaborCostMap.keySet();
|
|
|
+
|
|
|
+
|
|
|
+ Set<String> workGroupMergeCollections = CollectionsUtils.mergeStringCollections(workGroup1, workGroup2, workGroup3);
|
|
|
+ // 避免默认工作与实际工作组数据重复,可能会存在历史数据没有工作组,后面标准化的时候又补充了工作组信息。
|
|
|
+ workGroupMergeCollections.add(ChuanYunConstant.DEFAULT_WORK_GROUP);
|
|
|
+
|
|
|
+ workGroupMergeCollections.forEach(workGroupId -> {
|
|
|
+ List<ChuanyunReimbursementDO> reimbursementDOList = workGroupIdReimbursementMap.getOrDefault(workGroupId, Collections.emptyList());
|
|
|
+ List<ChuanyunSelfWorkHourDO> selfWorkHourDOS = workGroupIdSelfWorkHourMap.getOrDefault(workGroupId, Collections.emptyList());
|
|
|
+ List<ChuanyunMonthLaborCostWgDTO> monthLaborCostWgDTOS = workGroupIdLaborCostMap.getOrDefault(workGroupId, Collections.emptyList());
|
|
|
+
|
|
|
+ BigDecimal totalReimbursement;
|
|
|
+ BigDecimal totalManDay;
|
|
|
+ BigDecimal totalLaborCost;
|
|
|
+
|
|
|
+ if (reimbursementDOList.isEmpty()) {
|
|
|
+ totalReimbursement = new BigDecimal("0.00");
|
|
|
+ } else {
|
|
|
+ totalReimbursement = reimbursementDOList.stream().map(ChuanyunReimbursementDO::getTotalAmountNotTaxed).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (selfWorkHourDOS.isEmpty()) {
|
|
|
+ totalManDay = new BigDecimal("0.00");
|
|
|
+ } else {
|
|
|
+ BigDecimal totalWorkHours = selfWorkHourDOS.stream().map(ChuanyunSelfWorkHourDO::getStandardWorkHour).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ totalManDay = totalWorkHours.divide(BigDecimal.valueOf(8), 3, RoundingMode.UP);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (monthLaborCostWgDTOS.isEmpty()) {
|
|
|
+ totalLaborCost = new BigDecimal("0.00");
|
|
|
+ } else {
|
|
|
+ totalLaborCost = monthLaborCostWgDTOS.stream().map(ChuanyunMonthLaborCostWgDTO::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ }
|
|
|
+
|
|
|
+ ChuanyunImplCostDO old = implCostDao.findByProjectCodeAndWorkGroupAndLocalDate(groupProjectCode, workGroupId, localDate.atStartOfDay());
|
|
|
+ if (!Objects.isNull(old)) {
|
|
|
+ BigDecimal oldImplCost = old.getImplCost();
|
|
|
+ BigDecimal oldManDay = old.getManDay();
|
|
|
+ BigDecimal oldLaborCost = old.getLaborCost();
|
|
|
+ if (Objects.isNull(old.getLocalDate()) ||
|
|
|
+ Objects.isNull(oldImplCost) ||
|
|
|
+ Objects.isNull(oldManDay) ||
|
|
|
+ Objects.isNull(oldLaborCost) ||
|
|
|
+ oldImplCost.compareTo(totalReimbursement) != 0 ||
|
|
|
+ oldManDay.compareTo(totalManDay) != 0 || oldLaborCost.compareTo(totalLaborCost) != 0) {
|
|
|
+ old.setImplCost(totalReimbursement);
|
|
|
+ old.setManDay(totalManDay);
|
|
|
+ old.setLaborCost(totalLaborCost);
|
|
|
+ if (!StringUtils.hasLength(old.getOwnerId()) && !Objects.isNull(chuanyunGroupProjectDO.getEbgProjectManagerObject())) {
|
|
|
+ old.setOwnerId(chuanyunGroupProjectDO.getEbgProjectManagerObject().getObjectId());
|
|
|
+ }
|
|
|
+ implCostDao.saveAndFlush(old);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 判断默认工作组数据
|
|
|
+ String defaultWorkGroupName = ChuanYunConstant.DEFAULT_WORK_GROUP_NAME;
|
|
|
+ ChuanyunWorkGroupDO workGroupDO = this.findByObjectId(workGroupId);
|
|
|
+ if (!Objects.isNull(workGroupDO)) {
|
|
|
+ defaultWorkGroupName = workGroupDO.getWorkGroupName();
|
|
|
+ } else {
|
|
|
+ ChuanyunHistoryWorkGroupDO historyWorkGroupDO = this.findInHistoryByObjectId(workGroupId);
|
|
|
+ if (!Objects.isNull(historyWorkGroupDO)) {
|
|
|
+ defaultWorkGroupName = historyWorkGroupDO.getWorkGroupName();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ChuanyunImplCostDO chuanyunImplCostDO = new ChuanyunImplCostDO();
|
|
|
+ chuanyunImplCostDO.setProjectId(chuanyunGroupProjectDO.getObjectId());
|
|
|
+ chuanyunImplCostDO.setProjectCode(groupProjectCode);
|
|
|
+ chuanyunImplCostDO.setLocalDate(localDate.atStartOfDay());
|
|
|
+ chuanyunImplCostDO.setWorkGroup(workGroupId);
|
|
|
+ chuanyunImplCostDO.setWorkGroupName(defaultWorkGroupName);
|
|
|
+ chuanyunImplCostDO.setImplCost(totalReimbursement);
|
|
|
+ chuanyunImplCostDO.setManDay(totalManDay);
|
|
|
+ chuanyunImplCostDO.setLaborCost(totalLaborCost);
|
|
|
+ if (!Objects.isNull(chuanyunGroupProjectDO.getEbgProjectManagerObject())) {
|
|
|
+
|
|
|
+ chuanyunImplCostDO.setOwnerId(chuanyunGroupProjectDO.getEbgProjectManagerObject().getObjectId());
|
|
|
+ }
|
|
|
+ implCostDao.saveAndFlush(chuanyunImplCostDO);
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ // 上传至氚云数据库,发布上传事件
|
|
|
+ log.info("发布工作组实施费用上传事件");
|
|
|
+ applicationContext.publishEvent(new PushImplCostEvent(this));
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|