|
@@ -15,10 +15,7 @@ import org.springblade.control.entity.*;
|
|
|
import org.springblade.control.mapper.DepartmentPlanLogMapper;
|
|
|
import org.springblade.control.mapper.ProjectCostBudgetMapper;
|
|
|
import org.springblade.control.mapper.ProjectInfoMapper;
|
|
|
-import org.springblade.control.service.IDepartmentPlanLogService;
|
|
|
-import org.springblade.control.service.IProjectCostBudgetService;
|
|
|
-import org.springblade.control.service.IProjectInfoService;
|
|
|
-import org.springblade.control.service.IProjectProcessService;
|
|
|
+import org.springblade.control.service.*;
|
|
|
import org.springblade.control.vo.*;
|
|
|
import org.springblade.core.log.exception.ServiceException;
|
|
|
import org.springblade.core.mp.base.BaseServiceImpl;
|
|
@@ -30,6 +27,7 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.temporal.ChronoUnit;
|
|
|
import java.time.temporal.TemporalAdjusters;
|
|
@@ -51,9 +49,9 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
|
|
|
private final ProjectCostBudgetMapper budgetMapper;
|
|
|
|
|
|
+ private final IContractInfoService contractService;
|
|
|
/**
|
|
|
* 批量新增或修改预算
|
|
|
- *
|
|
|
* @param dto
|
|
|
*/
|
|
|
@Override
|
|
@@ -61,48 +59,48 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
public ProjectCostBudgetStats batchAddOrUpdate(ProjectCostBudgetStatsDTO dto) {
|
|
|
List<ProjectCostBudget> allBudget = new ArrayList<>();
|
|
|
//施工单位
|
|
|
- if (dto.getBuildUnit() != null && dto.getBuildUnit().size() > 0) {
|
|
|
- dto.getBuildUnit().stream().forEach(l -> {
|
|
|
- if (l.getDeptId() == null) {
|
|
|
+ if (dto.getBuildUnit() != null && dto.getBuildUnit().size() > 0){
|
|
|
+ dto.getBuildUnit().stream().forEach(l->{
|
|
|
+ if (l.getDeptId() == null){
|
|
|
throw new ServiceException("请选择费用分摊部门");
|
|
|
}
|
|
|
- if (l.getCostType() == null) {
|
|
|
+ if (l.getCostType() == null){
|
|
|
throw new ServiceException("请选择费用分类");
|
|
|
}
|
|
|
- if (l.getProjectProcess() == null) {
|
|
|
+ if (l.getProjectProcess() == null){
|
|
|
throw new ServiceException("请选择项目环节");
|
|
|
}
|
|
|
- if (l.getBudgetDays() == null) {
|
|
|
+ if (l.getBudgetDays() == null){
|
|
|
throw new ServiceException("请填写预计工作量");
|
|
|
}
|
|
|
- if (l.getPostType() == null) {
|
|
|
+ if (l.getPostType() == null){
|
|
|
throw new ServiceException("请选择岗位类型");
|
|
|
}
|
|
|
- if (l.getStaffCount() == null) {
|
|
|
+ if (l.getStaffCount() == null){
|
|
|
throw new ServiceException("请填写投入人员数量");
|
|
|
}
|
|
|
- if (l.getApprove() != null && (l.getApprove() == 1 || l.getApprove() == 2)) {
|
|
|
+ if (l.getApprove() != null && (l.getApprove() == 1 || l.getApprove() == 2)){
|
|
|
return;
|
|
|
}
|
|
|
- l.setProjectId(dto.getProjectId());
|
|
|
- l.setUnitType(1);
|
|
|
- countMoney(l);
|
|
|
+ l.setProjectId(dto.getProjectId());
|
|
|
+ l.setUnitType(1);
|
|
|
+ countMoney(l);
|
|
|
});
|
|
|
allBudget.addAll(dto.getBuildUnit());
|
|
|
}
|
|
|
//监理单位
|
|
|
- if (dto.getSupervisorUnit() != null && dto.getSupervisorUnit().size() > 0) {
|
|
|
- dto.getSupervisorUnit().stream().forEach(l -> {
|
|
|
- if (l.getDeptId() == null) {
|
|
|
+ if (dto.getSupervisorUnit() != null && dto.getSupervisorUnit().size() > 0){
|
|
|
+ dto.getSupervisorUnit().stream().forEach(l->{
|
|
|
+ if (l.getDeptId() == null){
|
|
|
throw new ServiceException("请选择费用分摊部门");
|
|
|
}
|
|
|
- if (l.getCostType() == null) {
|
|
|
+ if (l.getCostType() == null){
|
|
|
throw new ServiceException("请选择费用分类");
|
|
|
}
|
|
|
- if (l.getProjectProcess() == null) {
|
|
|
+ if (l.getProjectProcess() == null){
|
|
|
throw new ServiceException("请选择项目环节");
|
|
|
}
|
|
|
- if (l.getApprove() != null && (l.getApprove() == 1 || l.getApprove() == 2)) {
|
|
|
+ if (l.getApprove() != null && (l.getApprove() == 1 || l.getApprove() == 2)){
|
|
|
return;
|
|
|
}
|
|
|
l.setProjectId(dto.getProjectId());
|
|
@@ -112,18 +110,18 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
allBudget.addAll(dto.getSupervisorUnit());
|
|
|
}
|
|
|
//建设单位
|
|
|
- if (dto.getConstructUnit() != null && dto.getConstructUnit().size() > 0) {
|
|
|
- dto.getConstructUnit().stream().forEach(l -> {
|
|
|
- if (l.getDeptId() == null) {
|
|
|
+ if (dto.getConstructUnit() != null && dto.getConstructUnit().size() > 0){
|
|
|
+ dto.getConstructUnit().stream().forEach(l->{
|
|
|
+ if (l.getDeptId() == null){
|
|
|
throw new ServiceException("请选择费用分摊部门");
|
|
|
}
|
|
|
- if (l.getCostType() == null) {
|
|
|
+ if (l.getCostType() == null){
|
|
|
throw new ServiceException("请选择费用分类");
|
|
|
}
|
|
|
- if (l.getProjectProcess() == null) {
|
|
|
+ if (l.getProjectProcess() == null){
|
|
|
throw new ServiceException("请选择项目环节");
|
|
|
}
|
|
|
- if (l.getApprove() != null && (l.getApprove() == 1 || l.getApprove() == 2)) {
|
|
|
+ if (l.getApprove() != null && (l.getApprove() == 1 || l.getApprove() == 2)){
|
|
|
return;
|
|
|
}
|
|
|
l.setProjectId(dto.getProjectId());
|
|
@@ -141,7 +139,6 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
|
|
|
/**
|
|
|
* 项目预算列表,默认所有
|
|
|
- *
|
|
|
* @param costBudget
|
|
|
* @return
|
|
|
*/
|
|
@@ -152,13 +149,12 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
|
|
|
/**
|
|
|
* 查询项目下所有预算明细
|
|
|
- *
|
|
|
* @param projectId
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
public List<ProjectCostBudget> budgetListByProjectId(Long projectId) {
|
|
|
- return this.list(new LambdaQueryWrapper<ProjectCostBudget>().eq(ProjectCostBudget::getProjectId, projectId).eq(ProjectCostBudget::getParentId, 0));
|
|
|
+ return this.list(new LambdaQueryWrapper<ProjectCostBudget>().eq(ProjectCostBudget::getProjectId,projectId).eq(ProjectCostBudget::getParentId,0));
|
|
|
|
|
|
}
|
|
|
|
|
@@ -178,7 +174,6 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
|
|
|
/**
|
|
|
* 根据项目id删除项目
|
|
|
- *
|
|
|
* @param projectId
|
|
|
*/
|
|
|
@Override
|
|
@@ -189,12 +184,11 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
@Override
|
|
|
public List<ControlProjectInfoVO> page(ControlProjectInfoDTO dto, Query query) {
|
|
|
IPage page = new Page(query.getCurrent(), query.getSize());
|
|
|
- return baseMapper.page(page, dto);
|
|
|
+ return baseMapper.page(page,dto);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取项目计划
|
|
|
- *
|
|
|
* @param id
|
|
|
* @return
|
|
|
*/
|
|
@@ -208,51 +202,51 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
//获取所有岗位信息
|
|
|
List<DictInfo> allPostType = baseMapper.getAllPostType();
|
|
|
Map<Long, List<DictInfo>> postMap = new HashMap<>();
|
|
|
- if (allPostType != null && allPostType.size() > 0) {
|
|
|
+ if (allPostType != null && allPostType.size() >0){
|
|
|
postMap = allPostType.parallelStream()
|
|
|
.collect(Collectors.groupingBy(DictInfo::getId));
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
throw new ServiceException("参数配置暂无岗位信息");
|
|
|
}
|
|
|
//获取所有任务信息
|
|
|
List<DictInfo> allTaskInfo = baseMapper.getAllTaskInfo();
|
|
|
Map<Long, List<DictInfo>> taskMap = new HashMap<>();
|
|
|
- if (allPostType != null && allPostType.size() > 0) {
|
|
|
+ if (allPostType != null && allPostType.size() >0){
|
|
|
taskMap = allTaskInfo.parallelStream()
|
|
|
.collect(Collectors.groupingBy(DictInfo::getId));
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
throw new ServiceException("参数配置暂无任务信息");
|
|
|
}
|
|
|
//获取项目下所有计划关联回款信息
|
|
|
List<PlanRelationReturned> allRelationInfo = baseMapper.getAllRelationInfo(id);
|
|
|
Map<Long, List<PlanRelationReturned>> relationMap = null;
|
|
|
- if (allRelationInfo != null && allRelationInfo.size() > 0) {
|
|
|
+ if (allRelationInfo != null && allRelationInfo.size() > 0){
|
|
|
relationMap = allRelationInfo.parallelStream()
|
|
|
.collect(Collectors.groupingBy(PlanRelationReturned::getPlanId));
|
|
|
}
|
|
|
//获取项目下所有回款信息
|
|
|
List<ContractReturnedInfo> allReturnedInfo = baseMapper.getAllReturnedInfo(id);
|
|
|
Map<Long, List<ContractReturnedInfo>> returnedMap = null;
|
|
|
- if (allReturnedInfo != null && allReturnedInfo.size() > 0) {
|
|
|
+ if (allReturnedInfo != null && allReturnedInfo.size() > 0){
|
|
|
returnedMap = allReturnedInfo.parallelStream()
|
|
|
.collect(Collectors.groupingBy(ContractReturnedInfo::getId));
|
|
|
}
|
|
|
//获取项目下所有已审批的计划
|
|
|
List<ProjectCostBudgetVO2> list = baseMapper.getApprovePlan(id);
|
|
|
for (ProjectCostBudgetVO2 l : list) {
|
|
|
- if (l.getPlanTaskType() != null || l.getPlanDays() != null || l.getPlanStartTime() != null || l.getPlanEndTime() != null) {
|
|
|
+ if (l.getPlanTaskType() != null || l.getPlanDays() != null || l.getPlanStartTime() != null || l.getPlanEndTime() != null){
|
|
|
l.setIsShowChildren(0);
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
l.setIsShowChildren(1);
|
|
|
}
|
|
|
- if (relationMap != null) {
|
|
|
+ if (relationMap != null){
|
|
|
List<PlanRelationReturned> returnedList = relationMap.get(l.getId());
|
|
|
- if (returnedList != null && returnedList.size() > 0) {
|
|
|
+ if (returnedList != null && returnedList.size() > 0){
|
|
|
StringBuilder str = new StringBuilder();
|
|
|
int j = 1;
|
|
|
for (PlanRelationReturned returned : returnedList) {
|
|
|
ContractReturnedInfo info = returnedMap.get(returned.getReturnedId()).get(0);
|
|
|
- str.append(j + "." + info.getReturnedCondition() + "、");
|
|
|
+ str.append(j+"."+info.getReturnedCondition()+"、");
|
|
|
}
|
|
|
l.setReturnedValue(str.toString());
|
|
|
}
|
|
@@ -261,7 +255,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
//获取项目下所有的子计划
|
|
|
List<ProjectCostBudgetVO2> childrenList = baseMapper.getAllChildrenPlan(id);
|
|
|
//有子计划就插入父计划,没有子计划直接跳过
|
|
|
- if (childrenList != null && childrenList.size() > 0) {
|
|
|
+ if (childrenList != null && childrenList.size() >0) {
|
|
|
//把子计划按parentId分组
|
|
|
Map<Long, List<ProjectCostBudgetVO2>> listMap = childrenList.parallelStream()
|
|
|
.collect(Collectors.groupingBy(ProjectCostBudgetVO2::getParentId));
|
|
@@ -269,7 +263,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
//循环所有父计划
|
|
|
for (ProjectCostBudgetVO2 vo2 : list) {
|
|
|
if (vo2.getTaskApprove() == 1) {
|
|
|
- vo2.setTaskFinishedStatus(2);
|
|
|
+ vo2.setTaskFinishedStatus(2);
|
|
|
}
|
|
|
//如果子计划,把子计划插入计划里
|
|
|
if (key.contains(vo2.getId())) {
|
|
@@ -285,12 +279,12 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
Boolean isFinished = true;
|
|
|
int j = 1;
|
|
|
for (ProjectCostBudgetVO2 budgetVO2 : vo2List) {
|
|
|
- if (budgetVO2.getTaskApprove() != 1) {
|
|
|
+ if (budgetVO2.getTaskApprove() != 1){
|
|
|
isFinished = false;
|
|
|
}
|
|
|
- if (budgetVO2.getStatus() == 1) {
|
|
|
+ if (budgetVO2.getStatus() == 1){
|
|
|
budgetVO2.setIsShowDelete(1);
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
budgetVO2.setIsShowDelete(0);
|
|
|
}
|
|
|
//计算总天数
|
|
@@ -298,20 +292,20 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
workDays = workDays.add(budgetVO2.getPlanDays());
|
|
|
}
|
|
|
//计算最大日期和最小日期
|
|
|
- if (budgetVO2.getPlanStartTime().isBefore(startDate)) {
|
|
|
+ if (budgetVO2.getPlanStartTime().isBefore(startDate)){
|
|
|
startDate = budgetVO2.getPlanStartTime();
|
|
|
}
|
|
|
- if (budgetVO2.getPlanEndTime().isAfter(endDate)) {
|
|
|
+ if (budgetVO2.getPlanEndTime().isAfter(endDate)){
|
|
|
endDate = budgetVO2.getPlanEndTime();
|
|
|
}
|
|
|
//拼接子计划的任务描述
|
|
|
- descStr.append(j + "." + budgetVO2.getPlanTaskDesc() + "、");
|
|
|
+ descStr.append(j + "."+budgetVO2.getPlanTaskDesc()+"、");
|
|
|
//拼接子计划的完成指标
|
|
|
- targetStr.append(j + "." + budgetVO2.getPlanTarget() + "、");
|
|
|
+ targetStr.append(j+"."+budgetVO2.getPlanTarget()+"、");
|
|
|
j++;
|
|
|
}
|
|
|
//所有子计划完成,设置父计划为绿色
|
|
|
- if (isFinished) {
|
|
|
+ if (isFinished){
|
|
|
vo2.setTaskFinishedStatus(2);
|
|
|
}
|
|
|
|
|
@@ -327,10 +321,10 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
vo2.setPlanStartTime(startDate);
|
|
|
vo2.setPlanEndTime(endDate);
|
|
|
//根据任务类型设置父计划的工作天数,固定任务1,临时任务2
|
|
|
- if (taskMap.get(vo2.getPlanTaskType()).get(0).getDictValue().intValue() == 2) {
|
|
|
+ if (taskMap.get(vo2.getPlanTaskType()).get(0).getDictValue().intValue() == 2){
|
|
|
vo2.setPlanDays(new BigDecimal(endDate.compareTo(startDate) + 1));
|
|
|
- } else {
|
|
|
- if (startDate.until(endDate, ChronoUnit.DAYS) > 35) {
|
|
|
+ }else {
|
|
|
+ if (startDate.until(endDate,ChronoUnit.DAYS) > 35){
|
|
|
throw new ServiceException("请不要制定超过一个月的临时计划");
|
|
|
// //工作天数,工具只能获取50天之内的
|
|
|
// int i = 0;
|
|
@@ -339,58 +333,58 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
// startDate = startDate.plusDays(36L);
|
|
|
// }
|
|
|
// vo2.setPlanDays(new BigDecimal(i));
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
vo2.setPlanDays(new BigDecimal(CommonUtil.getWorkDays(startDate, endDate)));
|
|
|
}
|
|
|
}
|
|
|
//如果计划已经完成,则不计算超预算
|
|
|
- if (vo2.getTaskFinishedStatus() == null && vo2.getPlanDays() != null && vo2.getBudgetDays() != null) {
|
|
|
+ if (vo2.getTaskFinishedStatus() == null && vo2.getPlanDays() != null && vo2.getBudgetDays() != null){
|
|
|
if (workDays.intValue() > vo2.getBudgetDays().multiply(vo2.getStaffCount()).intValue()) {
|
|
|
vo2.setTaskFinishedStatus(1);
|
|
|
- vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长(" + (workDays.intValue() - vo2.getBudgetDays().intValue()) + "天)");
|
|
|
+ vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(workDays.intValue() - vo2.getBudgetDays().intValue())+"天)");
|
|
|
}
|
|
|
}
|
|
|
vo2.setChildrenList(listMap.get(vo2.getId()));
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
//如果计划的status为2,3,4,或者计划有子计划,则不能编辑
|
|
|
- if (vo2.getStatus() == 1) {
|
|
|
+ if (vo2.getStatus() == 1){
|
|
|
vo2.setIsShowEdit(1);
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
vo2.setIsShowEdit(0);
|
|
|
}
|
|
|
//没有子计划,则计算父计划成本是否超过测算,如果计划没有完成,有选择日期,有员工支出,则判断
|
|
|
- if (vo2.getTaskFinishedStatus() == null && vo2.getPlanDays() != null && vo2.getBudgetDays() != null) {
|
|
|
+ if (vo2.getTaskFinishedStatus() == null && vo2.getPlanDays() != null && vo2.getBudgetDays() != null){
|
|
|
if (vo2.getPlanDays().intValue() > vo2.getBudgetDays().intValue()) {
|
|
|
vo2.setTaskFinishedStatus(1);
|
|
|
- vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长(" + (vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue()) + "天)");
|
|
|
+ vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue())+"天)");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
//没有子计划也要为父计划设置颜色,是否显示编辑,是否显示分解子计划
|
|
|
for (ProjectCostBudgetVO2 vo2 : list) {
|
|
|
//设置颜色,已完成绿色,并且不能编辑,不能分解子计划
|
|
|
- if (vo2.getTaskApprove() == 1) {
|
|
|
+ if (vo2.getTaskApprove() == 1){
|
|
|
vo2.setTaskFinishedStatus(2);
|
|
|
vo2.setIsShowChildren(0);
|
|
|
vo2.setIsShowEdit(0);
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
//如果计划正在进行就不能编辑
|
|
|
- if (vo2.getStatus() == 1) {
|
|
|
+ if (vo2.getStatus() == 1){
|
|
|
vo2.setIsShowEdit(1);
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
vo2.setIsShowEdit(0);
|
|
|
}
|
|
|
//如果已经填写了任务类型和选择了任务时间,就不显示子计划
|
|
|
- if (vo2.getPostType() != null && vo2.getPlanDays() != null) {
|
|
|
+ if (vo2.getPostType() != null && vo2.getPlanDays() != null){
|
|
|
vo2.setIsShowChildren(0);
|
|
|
//计算是否超过预算
|
|
|
- if ((vo2.getPlanDays().multiply(new BigDecimal(postMap.get(vo2.getPostType()).get(0).getDictValue()))).compareTo(vo2.getBudgetStaffCost()) == 1) {
|
|
|
+ if ((vo2.getPlanDays().multiply(new BigDecimal(postMap.get(vo2.getPostType()).get(0).getDictValue()))).compareTo(vo2.getBudgetStaffCost()) == 1){
|
|
|
vo2.setTaskFinishedStatus(1);
|
|
|
- vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长(" + (vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue()) + "天)");
|
|
|
+ vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue())+"天)");
|
|
|
}
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
vo2.setIsShowChildren(1);
|
|
|
}
|
|
|
|
|
@@ -402,17 +396,17 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
Map<Integer, List<ProjectCostBudgetVO2>> map = list.parallelStream()
|
|
|
.collect(Collectors.groupingBy(ProjectCostBudgetVO2::getUnitType));
|
|
|
//在相同单位下,根据部门分类,1施工,2监理,3建设
|
|
|
- if (map.get(1) != null && map.get(1).size() > 0) {
|
|
|
+ if (map.get(1) != null && map.get(1).size() > 0){
|
|
|
Map<Integer, List<ProjectCostBudgetVO2>> build = map.get(1).parallelStream()
|
|
|
.collect(Collectors.groupingBy(ProjectCostBudgetVO2::getCostType));
|
|
|
vo.setBuildUnit(build);
|
|
|
}
|
|
|
- if (map.get(2) != null && map.get(2).size() > 0) {
|
|
|
+ if (map.get(2) != null && map.get(2).size() > 0){
|
|
|
Map<Integer, List<ProjectCostBudgetVO2>> supervisor = map.get(2).parallelStream()
|
|
|
.collect(Collectors.groupingBy(ProjectCostBudgetVO2::getCostType));
|
|
|
vo.setSupervisorUnit(supervisor);
|
|
|
}
|
|
|
- if (map.get(3) != null && map.get(3).size() > 0) {
|
|
|
+ if (map.get(3) != null && map.get(3).size() > 0){
|
|
|
Map<Integer, List<ProjectCostBudgetVO2>> construct = map.get(3).parallelStream()
|
|
|
.collect(Collectors.groupingBy(ProjectCostBudgetVO2::getCostType));
|
|
|
vo.setConstructUnit(construct);
|
|
@@ -447,7 +441,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
//把所有子计划分离出来,并且设置父类id
|
|
|
for (ProjectCostBudgetVO2 vo2 : list) {
|
|
|
List<ProjectCostBudgetVO2> vo2ChildrenList = vo2.getChildrenList();
|
|
|
- if (vo2ChildrenList != null && vo2ChildrenList.size() > 0) {
|
|
|
+ if (vo2ChildrenList != null && vo2ChildrenList.size() > 0){
|
|
|
for (ProjectCostBudget budget : vo2ChildrenList) {
|
|
|
budget.setProjectId(vo.getProjectId());
|
|
|
budget.setParentId(vo2.getId());
|
|
@@ -459,7 +453,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
budget.setTaskDetail(vo2.getTaskDetail());
|
|
|
}
|
|
|
childrenList.addAll(vo2ChildrenList);
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
//无子计划
|
|
|
ProjectCostBudget budget = new ProjectCostBudget();
|
|
|
BeanUtils.copyProperties(vo2, budget);
|
|
@@ -476,7 +470,6 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
|
|
|
/**
|
|
|
* 根据部门类型和日期查询计划
|
|
|
- *
|
|
|
* @param type
|
|
|
* @param date
|
|
|
* @return
|
|
@@ -489,16 +482,16 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
int month = Integer.parseInt(split[1]);
|
|
|
LocalDate startDate;
|
|
|
LocalDate endDate;
|
|
|
- startDate = LocalDate.of(year, month, 1);
|
|
|
- if (Arrays.asList("1,3,5,7,8,10,12".split(",")).contains(month)) {
|
|
|
- endDate = LocalDate.of(year, month, 31);
|
|
|
- } else {
|
|
|
+ startDate = LocalDate.of(year,month,1);
|
|
|
+ if (Arrays.asList("1,3,5,7,8,10,12".split(",")).contains(month)){
|
|
|
+ endDate = LocalDate.of(year,month,31);
|
|
|
+ }else {
|
|
|
if (month != 2) {
|
|
|
endDate = LocalDate.of(year, month, 30);
|
|
|
- } else {
|
|
|
- if (year % 4 == 0) {
|
|
|
+ }else {
|
|
|
+ if (year % 4 == 0){
|
|
|
endDate = LocalDate.of(year, month, 29);
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
endDate = LocalDate.of(year, month, 28);
|
|
|
}
|
|
|
}
|
|
@@ -509,17 +502,17 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
if (allTaskInfo != null && allTaskInfo.size() > 0) {
|
|
|
taskMap = allTaskInfo.parallelStream()
|
|
|
.collect(Collectors.groupingBy(DictInfo::getId));
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
throw new ServiceException("请选择任务类型");
|
|
|
}
|
|
|
- if (departmentPlan != null && departmentPlan.size() > 0) {
|
|
|
+ if (departmentPlan != null && departmentPlan.size() > 0){
|
|
|
for (ProjectCostBudgetVO vo : departmentPlan) {
|
|
|
//如果计划未开始,或者已完成,或者是固定计划,则不显示开启暂停
|
|
|
- if (vo.getStatus() == 1 || vo.getStatus() == 4 || taskMap.get(vo.getPlanTaskType()).get(0).getDictValue() == 2) {
|
|
|
+ if (vo.getStatus() == 1 || vo.getStatus() == 4 || taskMap.get(vo.getPlanTaskType()).get(0).getDictValue() == 2){
|
|
|
vo.setStartOrStop(0);
|
|
|
- } else if (vo.getStatus() == 2) {
|
|
|
+ }else if (vo.getStatus() == 2){
|
|
|
vo.setStartOrStop(1);
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
vo.setStartOrStop(2);
|
|
|
}
|
|
|
}
|
|
@@ -529,24 +522,23 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
|
|
|
/**
|
|
|
* 根据id修改状态
|
|
|
- *
|
|
|
* @param id
|
|
|
* @param status
|
|
|
*/
|
|
|
@Override
|
|
|
public void updateStatus(Long id, int status) {
|
|
|
- baseMapper.updateStatus(id, status);
|
|
|
+ baseMapper.updateStatus(id,status);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 根据起止日期获取工作日
|
|
|
*/
|
|
|
@Override
|
|
|
- public Integer getWorkDays(LocalDate startDate, LocalDate endDate, Long planTaskType) {
|
|
|
+ public Integer getWorkDays(LocalDate startDate, LocalDate endDate,Long planTaskType) {
|
|
|
DictInfo info = baseMapper.getTaskType(planTaskType);
|
|
|
- if (info.getDictValue().intValue() == 2) {
|
|
|
- return new BigDecimal(startDate.until(endDate, ChronoUnit.DAYS)).intValue() + 1;
|
|
|
- } else {
|
|
|
+ if (info.getDictValue().intValue() == 2){
|
|
|
+ return new BigDecimal(startDate.until(endDate,ChronoUnit.DAYS)).intValue() + 1 ;
|
|
|
+ }else {
|
|
|
return CommonUtil.getWorkDays(startDate, endDate);
|
|
|
}
|
|
|
}
|
|
@@ -574,16 +566,16 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
int month = Integer.parseInt(split[1]);
|
|
|
LocalDate startDate;
|
|
|
LocalDate endDate;
|
|
|
- startDate = LocalDate.of(year, month, 1);
|
|
|
- if (Arrays.asList("1,3,5,7,8,10,12".split(",")).contains(month)) {
|
|
|
- endDate = LocalDate.of(year, month, 31);
|
|
|
- } else {
|
|
|
+ startDate = LocalDate.of(year,month,1);
|
|
|
+ if (Arrays.asList("1,3,5,7,8,10,12".split(",")).contains(month)){
|
|
|
+ endDate = LocalDate.of(year,month,31);
|
|
|
+ }else {
|
|
|
if (month != 2) {
|
|
|
endDate = LocalDate.of(year, month, 30);
|
|
|
- } else {
|
|
|
- if (year % 4 == 0) {
|
|
|
+ }else {
|
|
|
+ if (year % 4 == 0){
|
|
|
endDate = LocalDate.of(year, month, 29);
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
endDate = LocalDate.of(year, month, 28);
|
|
|
}
|
|
|
}
|
|
@@ -626,11 +618,11 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
for (ProjectCostBudget budget : list) {
|
|
|
//先生成总计划数组
|
|
|
if ((budget.getPlanStartTime().getMonthValue() == i && budget.getPlanStartTime().getYear() == year)
|
|
|
- || (budget.getPlanEndTime().getMonthValue() == i && budget.getPlanEndTime().getYear() == year)) {
|
|
|
+ || (budget.getPlanEndTime().getMonthValue() == i && budget.getPlanEndTime().getYear() == year)){
|
|
|
total1++;
|
|
|
- if (budget.getStatus().equals(4)) {
|
|
|
+ if (budget.getStatus().equals(4)){
|
|
|
total2++;
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
total3++;
|
|
|
}
|
|
|
}
|
|
@@ -652,7 +644,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
mapList.add(vo2);
|
|
|
mapList.add(vo3);
|
|
|
return mapList;
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
@@ -666,14 +658,14 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
LocalDate startDate;
|
|
|
LocalDate endDate;
|
|
|
//判断是否选择部门,如果选择了部门再判断是否选择了具体的人,如果没有选择具体的人则查询整个部门
|
|
|
- if (StringUtils.isBlank(start) || StringUtils.isBlank(end)) {
|
|
|
- startDate = LocalDate.of(LocalDate.now().getYear(), 1, 1);
|
|
|
- endDate = LocalDate.of(LocalDate.now().getYear(), 12, 31);
|
|
|
- } else {
|
|
|
+ if (StringUtils.isBlank(start) || StringUtils.isBlank(end)){
|
|
|
+ startDate = LocalDate.of(LocalDate.now().getYear(),1,1);
|
|
|
+ endDate = LocalDate.of(LocalDate.now().getYear(),12,31);
|
|
|
+ }else {
|
|
|
String[] s1 = start.split("-");
|
|
|
- startDate = LocalDate.of(Integer.parseInt(s1[0]), Integer.parseInt(s1[1]), 1);
|
|
|
+ startDate = LocalDate.of(Integer.parseInt(s1[0]),Integer.parseInt(s1[1]),1);
|
|
|
String[] s2 = end.split("-");
|
|
|
- endDate = LocalDate.of(Integer.parseInt(s2[0]), Integer.parseInt(s2[1]), 1);
|
|
|
+ endDate = LocalDate.of(Integer.parseInt(s2[0]),Integer.parseInt(s2[1]),1);
|
|
|
endDate = endDate.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
}
|
|
|
//获取时间段中的计划,默认是今年
|
|
@@ -724,25 +716,25 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
|| (plan.getPlanEndTime().getYear() == startDate.getYear() && plan.getPlanEndTime().getMonthValue() == startDate.getMonthValue())) {
|
|
|
//计划统计图
|
|
|
total++;
|
|
|
- if (plan.getTaskApprove() == 1) {
|
|
|
+ if (plan.getTaskApprove() == 1){
|
|
|
finish++;
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
unfinish++;
|
|
|
}
|
|
|
|
|
|
//风险计划统计图
|
|
|
- if (plan.getStatus() == 4) {
|
|
|
- if (plan.getPlanEndTime().isBefore(plan.getPracticalFinishTime())) {
|
|
|
+ if (plan.getStatus() == 4){
|
|
|
+ if (plan.getPlanEndTime().isBefore(plan.getPracticalFinishTime())){
|
|
|
//风险计划
|
|
|
risk++;
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
normal++;
|
|
|
}
|
|
|
- } else {
|
|
|
- if (plan.getPlanEndTime().isBefore(LocalDate.now())) {
|
|
|
+ }else {
|
|
|
+ if (plan.getPlanEndTime().isBefore(LocalDate.now())){
|
|
|
//风险计划
|
|
|
risk++;
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
normal++;
|
|
|
}
|
|
|
}
|
|
@@ -755,7 +747,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
l1.add(total);
|
|
|
l2.add(finish);
|
|
|
l3.add(unfinish);
|
|
|
- dateList.add(startDate.getYear() + "年" + startDate.getMonthValue() + "月");
|
|
|
+ dateList.add(startDate.getYear()+"年"+startDate.getMonthValue()+"月");
|
|
|
startDate = startDate.plusMonths(1);
|
|
|
}
|
|
|
//统计图集合
|
|
@@ -789,18 +781,16 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
|
|
|
/**
|
|
|
* 获取当前项目所有预算已闭环的任务
|
|
|
- *
|
|
|
* @param projectId
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public List<ProjectCostBudget> getProjectAllFinishedTask(Long projectId, Integer costType) {
|
|
|
- return baseMapper.getProjectAllFinishedTask(projectId, costType);
|
|
|
+ public List<ProjectCostBudget> getProjectAllFinishedTask(Long projectId,Integer costType) {
|
|
|
+ return baseMapper.getProjectAllFinishedTask(projectId,costType);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取项目的所有实际费用
|
|
|
- *
|
|
|
* @param projectId
|
|
|
* @return
|
|
|
*/
|
|
@@ -811,14 +801,13 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
|
|
|
/**
|
|
|
* 获取一年的人工支出
|
|
|
- *
|
|
|
* @param year
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
public BigDecimal getYearStaffDisburse(int year) {
|
|
|
BigDecimal yearStaffDisburse = baseMapper.getYearStaffDisburse(year);
|
|
|
- if (yearStaffDisburse == null) {
|
|
|
+ if (yearStaffDisburse == null){
|
|
|
return new BigDecimal(0);
|
|
|
}
|
|
|
return yearStaffDisburse;
|
|
@@ -826,7 +815,6 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
|
|
|
/**
|
|
|
* 按年查询所有支出
|
|
|
- *
|
|
|
* @param y
|
|
|
* @return
|
|
|
*/
|
|
@@ -837,7 +825,6 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
|
|
|
/**
|
|
|
* 按月查询所有计划支出
|
|
|
- *
|
|
|
* @param date
|
|
|
* @return
|
|
|
*/
|
|
@@ -849,19 +836,17 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
|
|
|
/**
|
|
|
* 获取风险计划,如果参数为空获取所有
|
|
|
- *
|
|
|
* @param projectId
|
|
|
* @param costType
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public List<ProjectCostBudget> getRiskPlan(Long projectId, Integer costType) {
|
|
|
- return baseMapper.getRiskPlan(projectId, costType);
|
|
|
+ public List<ProjectCostBudget> getRiskPlan(Long projectId,Integer costType) {
|
|
|
+ return baseMapper.getRiskPlan(projectId,costType);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 根据月获取计划闭环后实际金额
|
|
|
- *
|
|
|
* @param date
|
|
|
* @return
|
|
|
*/
|
|
@@ -877,31 +862,31 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
public PlanFinishedRatioVO planFinishedRatio(Long deptId, Long userId, String start, String end) {
|
|
|
String tenantId = SecureUtil.getTenantId();
|
|
|
List<User> Employees = new ArrayList<>();
|
|
|
- if (deptId == null) {
|
|
|
+ if (deptId == null){
|
|
|
//查询所有员工
|
|
|
- Employees = baseMapper.getAllEmployees(tenantId, null, null);
|
|
|
- } else if (userId == null) {
|
|
|
+ Employees = baseMapper.getAllEmployees(tenantId,null,null);
|
|
|
+ }else if (userId == null){
|
|
|
//查询整个部门的员工
|
|
|
- Employees = baseMapper.getAllEmployees(tenantId, deptId, null);
|
|
|
- } else {
|
|
|
+ Employees = baseMapper.getAllEmployees(tenantId,deptId,null);
|
|
|
+ }else {
|
|
|
//查询指定员工
|
|
|
- Employees = baseMapper.getAllEmployees(tenantId, deptId, userId);
|
|
|
+ Employees = baseMapper.getAllEmployees(tenantId,deptId,userId);
|
|
|
}
|
|
|
- if (Employees != null && Employees.size() > 0) {
|
|
|
+ if (Employees != null && Employees.size() > 0 ){
|
|
|
PlanFinishedRatioVO vo = new PlanFinishedRatioVO();
|
|
|
List<String> names = new ArrayList<>();
|
|
|
List<Integer> ratios = new ArrayList<>();
|
|
|
LocalDate startDate;
|
|
|
LocalDate endDate;
|
|
|
//判断是否选择部门,如果选择了部门再判断是否选择了具体的人,如果没有选择具体的人则查询整个部门
|
|
|
- if (StringUtils.isBlank(start) || StringUtils.isBlank(end)) {
|
|
|
- startDate = LocalDate.of(LocalDate.now().getYear(), 1, 1);
|
|
|
- endDate = LocalDate.of(LocalDate.now().getYear(), 12, 31);
|
|
|
- } else {
|
|
|
+ if (StringUtils.isBlank(start) || StringUtils.isBlank(end)){
|
|
|
+ startDate = LocalDate.of(LocalDate.now().getYear(),1,1);
|
|
|
+ endDate = LocalDate.of(LocalDate.now().getYear(),12,31);
|
|
|
+ }else {
|
|
|
String[] s1 = start.split("-");
|
|
|
- startDate = LocalDate.of(Integer.parseInt(s1[0]), Integer.parseInt(s1[1]), 1);
|
|
|
+ startDate = LocalDate.of(Integer.parseInt(s1[0]),Integer.parseInt(s1[1]),1);
|
|
|
String[] s2 = end.split("-");
|
|
|
- endDate = LocalDate.of(Integer.parseInt(s2[0]), Integer.parseInt(s2[1]), 1);
|
|
|
+ endDate = LocalDate.of(Integer.parseInt(s2[0]),Integer.parseInt(s2[1]),1);
|
|
|
endDate = endDate.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
}
|
|
|
//获取员工id集合
|
|
@@ -933,7 +918,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
} else {
|
|
|
ratios.add(0);
|
|
|
}
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
ratios.add(0);
|
|
|
}
|
|
|
}
|
|
@@ -984,20 +969,20 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
public ProjectCostBudgetVO2 updateMainPlan(ProjectCostBudgetVO2 vo2) {
|
|
|
//先判断如果数据都没填写,则设置可以分解子计划
|
|
|
if (vo2.getPlanTaskType() == null && StringUtils.isBlank(vo2.getPlanTaskDesc()) && StringUtils.isBlank(vo2.getPlanTarget())
|
|
|
- && vo2.getPlanStartTime() == null && vo2.getPlanEndTime() == null) {
|
|
|
+ && vo2.getPlanStartTime() == null && vo2.getPlanEndTime() == null){
|
|
|
vo2.setPlanTaskTypeValue(null);
|
|
|
vo2.setPlanDays(null);
|
|
|
vo2.setIsShowChildren(1);
|
|
|
return vo2;
|
|
|
}
|
|
|
//如果填写了数据,则检查数据是否填写完成
|
|
|
- if (vo2.getPlanTaskType() == null) {
|
|
|
+ if (vo2.getPlanTaskType() == null){
|
|
|
throw new ServiceException("请选择任务类型");
|
|
|
- } else if (StringUtils.isBlank(vo2.getPlanTaskDesc())) {
|
|
|
+ }else if (StringUtils.isBlank(vo2.getPlanTaskDesc())){
|
|
|
throw new ServiceException("请填写任务描述");
|
|
|
- } else if (StringUtils.isBlank(vo2.getPlanTarget())) {
|
|
|
+ }else if (StringUtils.isBlank(vo2.getPlanTarget())){
|
|
|
throw new ServiceException("请填写完成指标");
|
|
|
- } else if (vo2.getPlanStartTime() == null || vo2.getPlanEndTime() == null) {
|
|
|
+ }else if (vo2.getPlanStartTime() == null || vo2.getPlanEndTime() == null){
|
|
|
throw new ServiceException("请选择计划起止日期");
|
|
|
}
|
|
|
//如果数据都填写完成,则根据任务类型,设置工作日,并且设置子计划不可分解
|
|
@@ -1006,10 +991,10 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
vo2.setPlanTaskTypeValue(taskType.getDictName());
|
|
|
int type = taskType.getDictValue().intValue();
|
|
|
//根据任务类型设置父计划的工作天数,固定任务1,临时任务2
|
|
|
- if (type == 2) {
|
|
|
- vo2.setPlanDays(new BigDecimal(vo2.getPlanStartTime().until(vo2.getPlanEndTime(), ChronoUnit.DAYS) + 1));
|
|
|
- } else {
|
|
|
- if (vo2.getPlanStartTime().until(vo2.getPlanEndTime(), ChronoUnit.DAYS) > 35) {
|
|
|
+ if (type == 2){
|
|
|
+ vo2.setPlanDays(new BigDecimal(vo2.getPlanStartTime().until(vo2.getPlanEndTime(),ChronoUnit.DAYS) + 1));
|
|
|
+ }else {
|
|
|
+ if (vo2.getPlanStartTime().until(vo2.getPlanEndTime(),ChronoUnit.DAYS) > 35){
|
|
|
throw new ServiceException("请不要制定超过一个月的临时计划");
|
|
|
// //工作天数,工具只能获取50天之内的
|
|
|
// LocalDate startDate = vo2.getPlanStartTime();
|
|
@@ -1020,14 +1005,14 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
// startDate = startDate.plusDays(36L);
|
|
|
// }
|
|
|
// vo2.setPlanDays(new BigDecimal(i));
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
vo2.setPlanDays(new BigDecimal(CommonUtil.getWorkDays(vo2.getPlanStartTime(), vo2.getPlanEndTime())));
|
|
|
}
|
|
|
}
|
|
|
- if (vo2.getPlanDays().intValue() > vo2.getBudgetDays().intValue()) {
|
|
|
- vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长(" + (vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue()) + ")天");
|
|
|
+ if (vo2.getPlanDays().intValue() > vo2.getBudgetDays().intValue()){
|
|
|
+ vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue())+")天");
|
|
|
vo2.setTaskFinishedStatus(1);
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
vo2.setTaskFinishedStatus(0);
|
|
|
}
|
|
|
vo2.setIsShowChildren(0);
|
|
@@ -1041,13 +1026,13 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
public ProjectCostBudgetVO2 updateChildrenPlan(ProjectCostBudgetVO2 vo2) {
|
|
|
//如果子计划为空,则清空父计划,然后修改可以编辑父计划
|
|
|
List<ProjectCostBudgetVO2> list = vo2.getChildrenList();
|
|
|
- if (list != null && list.size() > 0) {
|
|
|
+ if (list != null && list.size() > 0){
|
|
|
//获取子计划任务类型,用于判断子计划类型是否一致
|
|
|
ProjectCostBudgetVO2 budgetVO2 = list.get(0);
|
|
|
Long taskType;
|
|
|
- if (budgetVO2.getPlanTaskType() == null) {
|
|
|
+ if (budgetVO2.getPlanTaskType() == null){
|
|
|
throw new ServiceException("请选择任务类型");
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
taskType = budgetVO2.getPlanTaskType();
|
|
|
}
|
|
|
DictInfo task = baseMapper.getTaskType(taskType);
|
|
@@ -1061,52 +1046,52 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
Boolean isFinished = true;
|
|
|
for (ProjectCostBudgetVO2 l : list) {
|
|
|
//校验数据
|
|
|
- if (l.getPlanTaskType() == null) {
|
|
|
+ if (l.getPlanTaskType() == null){
|
|
|
throw new ServiceException("请选择任务类型");
|
|
|
- } else if (StringUtils.isBlank(l.getPlanTaskDesc())) {
|
|
|
+ }else if (StringUtils.isBlank(l.getPlanTaskDesc())){
|
|
|
throw new ServiceException("请填写任务描述");
|
|
|
- } else if (StringUtils.isBlank(l.getPlanTarget())) {
|
|
|
+ }else if (StringUtils.isBlank(l.getPlanTarget())){
|
|
|
throw new ServiceException("请填写完成指标");
|
|
|
- } else if (l.getPlanStartTime() == null || l.getPlanEndTime() == null) {
|
|
|
+ }else if (l.getPlanStartTime() == null || l.getPlanEndTime() == null){
|
|
|
throw new ServiceException("请选择计划起止日期");
|
|
|
}
|
|
|
//校验类型
|
|
|
- if (!taskType.equals(l.getPlanTaskType())) {
|
|
|
+ if (!taskType.equals(l.getPlanTaskType())){
|
|
|
throw new ServiceException("子计划任务类型不一致");
|
|
|
}
|
|
|
- if (budgetVO2.getTaskApprove() == null || budgetVO2.getTaskApprove() != 1) {
|
|
|
+ if (budgetVO2.getTaskApprove() == null || budgetVO2.getTaskApprove() != 1){
|
|
|
isFinished = false;
|
|
|
}
|
|
|
//计算总天数
|
|
|
if (l.getPlanDays() != null) {
|
|
|
workDays = workDays.add(l.getPlanDays());
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
if (task.getDictValue().intValue() == 2) {
|
|
|
- l.setPlanDays(new BigDecimal(l.getPlanStartTime().until(l.getPlanEndTime(), ChronoUnit.DAYS) + 1));
|
|
|
+ l.setPlanDays(new BigDecimal(l.getPlanStartTime().until(l.getPlanEndTime(),ChronoUnit.DAYS) + 1));
|
|
|
} else {
|
|
|
if (l.getPlanStartTime().until(l.getPlanEndTime(), ChronoUnit.DAYS) > 35) {
|
|
|
throw new ServiceException("请不要制定超过一个月的临时计划");
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
l.setPlanDays(new BigDecimal(CommonUtil.getWorkDays(budgetVO2.getPlanStartTime(), budgetVO2.getPlanEndTime())));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
//计算最大日期和最小日期
|
|
|
- if (l.getPlanStartTime().isBefore(startDate)) {
|
|
|
+ if (l.getPlanStartTime().isBefore(startDate)){
|
|
|
startDate = l.getPlanStartTime();
|
|
|
}
|
|
|
- if (l.getPlanEndTime().isAfter(endDate)) {
|
|
|
+ if (l.getPlanEndTime().isAfter(endDate)){
|
|
|
endDate = l.getPlanEndTime();
|
|
|
}
|
|
|
//拼接子计划的任务描述
|
|
|
- descStr.append(j + "." + l.getPlanTaskDesc() + "、");
|
|
|
+ descStr.append(j + "."+l.getPlanTaskDesc()+"、");
|
|
|
//拼接子计划的完成指标
|
|
|
- targetStr.append(j + "." + l.getPlanTarget() + "、");
|
|
|
+ targetStr.append(j+"."+l.getPlanTarget()+"、");
|
|
|
j++;
|
|
|
}
|
|
|
|
|
|
//所有子计划完成,设置父计划为绿色
|
|
|
- if (isFinished) {
|
|
|
+ if (isFinished){
|
|
|
vo2.setTaskFinishedStatus(2);
|
|
|
}
|
|
|
//计算是否超过预算
|
|
@@ -1131,10 +1116,10 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
vo2.setPlanStartTime(startDate);
|
|
|
vo2.setPlanEndTime(endDate);
|
|
|
//根据任务类型设置父计划的工作天数,固定任务1,临时任务2
|
|
|
- if (task.getDictValue().intValue() == 2) {
|
|
|
- vo2.setPlanDays(new BigDecimal(startDate.until(endDate, ChronoUnit.DAYS) + 1));
|
|
|
- } else {
|
|
|
- if (startDate.until(endDate, ChronoUnit.DAYS) > 35) {
|
|
|
+ if (task.getDictValue().intValue() == 2){
|
|
|
+ vo2.setPlanDays(new BigDecimal(startDate.until(endDate,ChronoUnit.DAYS)+ 1));
|
|
|
+ }else {
|
|
|
+ if (startDate.until(endDate,ChronoUnit.DAYS) > 35){
|
|
|
throw new ServiceException("请不要制定超过一个月的临时计划");
|
|
|
// //工作天数,工具只能获取50天之内的
|
|
|
// int i = 0;
|
|
@@ -1143,31 +1128,30 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
// startDate = startDate.plusDays(36L);
|
|
|
// }
|
|
|
// vo2.setPlanDays(new BigDecimal(i));
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
vo2.setPlanDays(new BigDecimal(CommonUtil.getWorkDays(startDate, endDate)));
|
|
|
}
|
|
|
}
|
|
|
vo2.setIsShowEdit(0);
|
|
|
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
vo2.setPlanTaskTypeValue(null);
|
|
|
- vo2.setPlanTaskType(null);
|
|
|
- vo2.setPlanTaskDesc(null);
|
|
|
- vo2.setPlanTarget(null);
|
|
|
- vo2.setPlanStartTime(null);
|
|
|
- vo2.setPlanEndTime(null);
|
|
|
- vo2.setPlanDays(null);
|
|
|
- vo2.setIsShowEdit(1);
|
|
|
- return vo2;
|
|
|
+ vo2.setPlanTaskType(null);
|
|
|
+ vo2.setPlanTaskDesc(null);
|
|
|
+ vo2.setPlanTarget(null);
|
|
|
+ vo2.setPlanStartTime(null);
|
|
|
+ vo2.setPlanEndTime(null);
|
|
|
+ vo2.setPlanDays(null);
|
|
|
+ vo2.setIsShowEdit(1);
|
|
|
+ return vo2;
|
|
|
}
|
|
|
return vo2;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 任务完成之后统计工作时间和人工成本
|
|
|
- *
|
|
|
- * @param PlanId 计划id
|
|
|
- * @param practicalFinishTime 实际完成时间
|
|
|
+ * @param PlanId 计划id
|
|
|
+ * @param practicalFinishTime 实际完成时间
|
|
|
*/
|
|
|
@Override
|
|
|
public void taskFinishedStats(Long PlanId, LocalDate practicalFinishTime) {
|
|
@@ -1179,12 +1163,12 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
DictInfo dictInfo = baseMapper.getTaskType(budget.getPlanTaskType());
|
|
|
int taskType = dictInfo.getDictValue().intValue();
|
|
|
//计划为临时计划,则不计算金额直接闭环
|
|
|
- if (taskType == 2) {
|
|
|
+ if (taskType == 2){
|
|
|
this.updateById(budget);
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
//获取任务人工资
|
|
|
User userInfo = baseMapper.getUserInfo(budget.getTaskUser());
|
|
|
- if (userInfo.getOneMoney() == null) {
|
|
|
+ if (userInfo.getOneMoney() == null){
|
|
|
throw new ServiceException("没有为任务人设置工资");
|
|
|
}
|
|
|
Double money = userInfo.getOneMoney();
|
|
@@ -1192,26 +1176,26 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
DepartmentPlanLog planLog = logMapper.getNewestPlanLog(PlanId);
|
|
|
Integer realWorkDays = 0;
|
|
|
//日志类型为暂停,和status=3则 直接用实际工作时间
|
|
|
- if (planLog.getStatus() == 0) {
|
|
|
+ if (planLog.getStatus() == 0){
|
|
|
//实际工作时间
|
|
|
realWorkDays = planLog.getRealWorkDays();
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
//日志类型为开启,和status=2则 计算计划结束时间到中途开启时间 + 实际工作时间
|
|
|
- if (planLog.getOpenPlanStartTime() == null) {
|
|
|
+ if (planLog.getOpenPlanStartTime() == null){
|
|
|
//中途没暂停,开启过任务
|
|
|
if (planLog.getRealPlanStartTime().until(practicalFinishTime, ChronoUnit.DAYS) > 35) {
|
|
|
throw new ServiceException("固定计划完成周期超过一个月,请联系管理员");
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
realWorkDays = CommonUtil.getWorkDays(planLog.getRealPlanStartTime(), practicalFinishTime);
|
|
|
}
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
//中途暂停,开启过任务
|
|
|
//获取上次暂停时实际工作日
|
|
|
Integer days = planLog.getRealWorkDays();
|
|
|
//计算这次开启后到任务完成之间的工作日
|
|
|
if (planLog.getOpenPlanStartTime().until(practicalFinishTime, ChronoUnit.DAYS) > 35) {
|
|
|
throw new ServiceException("固定计划完成周期超过一个月,请联系管理员");
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
int day = CommonUtil.getWorkDays(planLog.getOpenPlanStartTime(), practicalFinishTime);
|
|
|
realWorkDays = days + day;
|
|
|
}
|
|
@@ -1225,35 +1209,104 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取所有项目截至当前的维护支出
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public BigDecimal getAllMaintainCost() {
|
|
|
+ //获取所有已分配任务人的维护支出,如果没有返回0
|
|
|
+ List<ProjectCostBudget> plans = baseMapper.getAllMaintainPlan();
|
|
|
+ if (plans != null && plans.size() > 0) {
|
|
|
+ //分离出主计划和子计划,建立主计划的id,set集合
|
|
|
+ Set<Long> bab = new HashSet<>();
|
|
|
+ for (ProjectCostBudget plan : plans) {
|
|
|
+ if (plan.getParentId() == 0) {
|
|
|
+ bab.add(plan.getId());
|
|
|
+ } else {
|
|
|
+ bab.add(plan.getParentId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //查询出所有维护计划,根据项目id分组
|
|
|
+ List<ProjectCostBudget> budgets = this.listByIds(bab);
|
|
|
+ Map<Long, List<ProjectCostBudget>> budgetMap = budgets.parallelStream()
|
|
|
+ .collect(Collectors.groupingBy(ProjectCostBudget::getProjectId));
|
|
|
+ //查询出所有项目
|
|
|
+ List<ControlProjectInfo> projectInfos = infoMapper.selectList(new LambdaQueryWrapper<ControlProjectInfo>().in(ControlProjectInfo::getId, bab));
|
|
|
+ //通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
|
|
|
+ List<ControlContractInfo> contractList = contractService.list(
|
|
|
+ new LambdaQueryWrapper<ControlContractInfo>().in(ControlContractInfo::getProjectId, budgetMap.keySet()));
|
|
|
+ if (contractList == null || projectInfos.size() != contractList.size()){
|
|
|
+ throw new ServiceException("项目没有合同,无法计算维护支出");
|
|
|
+ }
|
|
|
+ //把合同根据项目分组
|
|
|
+ Map<Long, List<ControlContractInfo>> contractMap = contractList.parallelStream()
|
|
|
+ .collect(Collectors.groupingBy(ControlContractInfo::getProjectId));
|
|
|
+ //新建总金额字段
|
|
|
+ BigDecimal count = new BigDecimal(0);
|
|
|
+ //循环项目,
|
|
|
+ for (ControlProjectInfo info : projectInfos) {
|
|
|
+ //获取合同时间,获取多少个月
|
|
|
+ ControlContractInfo contract = contractMap.get(info.getId()).get(0);
|
|
|
+ LocalDate startTime = contract.getStartTime();
|
|
|
+ LocalDate endTime = contract.getEndTime();
|
|
|
+ int years = endTime.getYear() - startTime.getYear();
|
|
|
+ int months = years * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
|
|
|
+ //每个项目的维护总和 / 多少个月 = 该项目每个月的维护费
|
|
|
+ List<ProjectCostBudget> list = budgetMap.get(info.getId());
|
|
|
+ BigDecimal big = new BigDecimal(0);
|
|
|
+ for (ProjectCostBudget l : list) {
|
|
|
+ big = big.add(l.getBudgetStaffCost());
|
|
|
+ }
|
|
|
+ if (big.compareTo(new BigDecimal(0)) == 0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //获得每个月的维护费
|
|
|
+ BigDecimal scale = big.divide(new BigDecimal(months)).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ // 当前日期和合同开始时间比较,相差多少月 月 * 每个月维护费 = 当前项目截至当前的所有维护费
|
|
|
+ if (LocalDate.now().compareTo(startTime) < 0){
|
|
|
+// throw new ServiceException("合同开始时间超过当前时间,无法计算维护支出");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ int thisYears = LocalDate.now().getYear() - startTime.getYear();
|
|
|
+ int thisMonths = thisYears * 12 + (LocalDate.now().getYear()- startTime.getMonthValue()) + 1;
|
|
|
+ BigDecimal multiply = scale.multiply(new BigDecimal(thisMonths));
|
|
|
+ count = count.add(multiply);
|
|
|
+ }
|
|
|
+ return count;
|
|
|
+ }
|
|
|
+ return new BigDecimal(0);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 统计一行的几个总金额
|
|
|
*/
|
|
|
- public void countMoney(ProjectCostBudget budget) {
|
|
|
+ public void countMoney(ProjectCostBudget budget){
|
|
|
BigDecimal postMoney;
|
|
|
- if (budget.getPostType() != null && budget.getPostType() > 0) {
|
|
|
+ if (budget.getPostType() != null && budget.getPostType() > 0){
|
|
|
Double money = baseMapper.getPostMoney(budget.getPostType());
|
|
|
- postMoney = new BigDecimal(money + "");
|
|
|
- } else {
|
|
|
+ postMoney = new BigDecimal(money+"");
|
|
|
+ }else {
|
|
|
postMoney = new BigDecimal("0");
|
|
|
}
|
|
|
//人工成本 = 人员数量 * 单价 * 天数
|
|
|
if (budget.getStaffCount() != null && budget.getBudgetDays() != null) {
|
|
|
budget.setBudgetStaffCost(budget.getStaffCount().multiply(postMoney).multiply(budget.getBudgetDays()));
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
budget.setBudgetStaffCost(new BigDecimal("0"));
|
|
|
}
|
|
|
//外包金额 = 外包单价 * 外包数量
|
|
|
if (budget.getOutsourcePeopleCount() != null && budget.getOutsourceUnitPrice() != null) {
|
|
|
budget.setOutsourceCountMoney(budget.getOutsourceUnitPrice().multiply(budget.getOutsourcePeopleCount()));
|
|
|
- } else {
|
|
|
+ }else {
|
|
|
budget.setOutsourceCountMoney(new BigDecimal("0"));
|
|
|
}
|
|
|
//判断差旅费
|
|
|
- if (budget.getBudgetTravelExpense() == null) {
|
|
|
+ if (budget.getBudgetTravelExpense() == null){
|
|
|
budget.setBudgetTravelExpense(new BigDecimal("0"));
|
|
|
}
|
|
|
//判断其他预算金额
|
|
|
- if (budget.getOtherBudgetMoney() == null) {
|
|
|
+ if (budget.getOtherBudgetMoney() == null){
|
|
|
budget.setOtherBudgetMoney(new BigDecimal("0"));
|
|
|
}
|
|
|
//总预算 = 人工成本 + 外包金额 + 差旅费 + 其他费用
|