|
@@ -67,6 +67,15 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
if (l.getProjectProcess() == null){
|
|
|
throw new ServiceException("请选择项目环节");
|
|
|
}
|
|
|
+ if (l.getBudgetDays() == null){
|
|
|
+ throw new ServiceException("请填写预计工作量");
|
|
|
+ }
|
|
|
+ if (l.getPostType() == null){
|
|
|
+ throw new ServiceException("请选择岗位类型");
|
|
|
+ }
|
|
|
+ if (l.getStaffCount() == null){
|
|
|
+ throw new ServiceException("请填写投入人员数量");
|
|
|
+ }
|
|
|
if (l.getApprove() != null && (l.getApprove() == 1 || l.getApprove() == 2)){
|
|
|
return;
|
|
|
}
|
|
@@ -251,8 +260,17 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
LocalDate endDate = LocalDate.MIN;
|
|
|
StringBuilder descStr = new StringBuilder();
|
|
|
StringBuilder targetStr = new StringBuilder();
|
|
|
+ Boolean isFinished = true;
|
|
|
int j = 1;
|
|
|
for (ProjectCostBudgetVO2 budgetVO2 : vo2List) {
|
|
|
+ if (budgetVO2.getTaskApprove() != 1){
|
|
|
+ isFinished = false;
|
|
|
+ }
|
|
|
+ if (budgetVO2.getStatus() == 1){
|
|
|
+ budgetVO2.setIsShowDelete(1);
|
|
|
+ }else {
|
|
|
+ budgetVO2.setIsShowDelete(0);
|
|
|
+ }
|
|
|
//计算总天数
|
|
|
if (budgetVO2.getPlanDays() != null) {
|
|
|
workDays = workDays.add(budgetVO2.getPlanDays());
|
|
@@ -270,12 +288,11 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
targetStr.append(j+"."+budgetVO2.getPlanTarget()+"。");
|
|
|
j++;
|
|
|
}
|
|
|
- //如果计划已经完成,则不计算超预算
|
|
|
- if (vo2.getTaskFinishedStatus() == null) {
|
|
|
- if ((workDays.multiply(new BigDecimal((postMap.get(vo2.getPostType()).get(0).getDictValue())))).compareTo(vo2.getBudgetStaffCost()) == 1) {
|
|
|
- vo2.setTaskFinishedStatus(1);
|
|
|
- }
|
|
|
+ //所有子计划完成,设置父计划为绿色
|
|
|
+ if (isFinished){
|
|
|
+ vo2.setTaskFinishedStatus(2);
|
|
|
}
|
|
|
+
|
|
|
//根据子计划设置父计划任务类型
|
|
|
vo2.setPlanTaskType(vo2List.get(0).getPlanTaskType());
|
|
|
//根据子计划设置父计划任务类型值
|
|
@@ -303,6 +320,13 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
vo2.setPlanDays(new BigDecimal(CommonUtil.getWorkDays(startDate, endDate)));
|
|
|
}
|
|
|
}
|
|
|
+ //如果计划已经完成,则不计算超预算
|
|
|
+ if (vo2.getTaskFinishedStatus() == null && vo2.getPlanDays() != null && vo2.getBudgetDays() != null){
|
|
|
+ if (workDays.intValue() > vo2.getBudgetDays().intValue()) {
|
|
|
+ vo2.setTaskFinishedStatus(1);
|
|
|
+ vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(workDays.intValue() - vo2.getBudgetDays().intValue())+"天)");
|
|
|
+ }
|
|
|
+ }
|
|
|
vo2.setChildrenList(listMap.get(vo2.getId()));
|
|
|
}else {
|
|
|
//如果计划的status为2,3,4,或者计划有子计划,则不能编辑
|
|
@@ -312,9 +336,10 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
vo2.setIsShowEdit(0);
|
|
|
}
|
|
|
//没有子计划,则计算父计划成本是否超过测算,如果计划没有完成,有选择日期,有员工支出,则判断
|
|
|
- if (vo2.getTaskFinishedStatus() == null && vo2.getPlanDays() != null && vo2.getBudgetStaffCost() != null){
|
|
|
- if (vo2.getPlanDays().compareTo(vo2.getBudgetDays()) == 1) {
|
|
|
+ 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())+"天)");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -340,7 +365,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
//计算是否超过预算
|
|
|
if ((vo2.getPlanDays().multiply(new BigDecimal(postMap.get(vo2.getPostType()).get(0).getDictValue()))).compareTo(vo2.getBudgetStaffCost()) == 1){
|
|
|
vo2.setTaskFinishedStatus(1);
|
|
|
-// vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+vo2.getPlanDays().+"天)");
|
|
|
+ vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue())+"天)");
|
|
|
}
|
|
|
}else {
|
|
|
vo2.setIsShowChildren(1);
|
|
@@ -378,8 +403,6 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
@Override
|
|
|
@Transactional
|
|
|
public void updatePlan(ProjectCostBudgetVO vo) {
|
|
|
- //获取数据库中原来的计划
|
|
|
-
|
|
|
//把3个单位合成一个
|
|
|
List<ProjectCostBudgetVO2> list = new ArrayList<>();
|
|
|
Map<Integer, List<ProjectCostBudgetVO2>> buildUnit = vo.getBuildUnit();
|
|
@@ -402,9 +425,6 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
for (ProjectCostBudgetVO2 vo2 : list) {
|
|
|
List<ProjectCostBudgetVO2> vo2ChildrenList = vo2.getChildrenList();
|
|
|
if (vo2ChildrenList != null && vo2ChildrenList.size() > 0){
|
|
|
- //有子计划,则判断父计划是否也设置了计划日期
|
|
|
- //查询出数据库里当前项目所以的父计划,还有子计划,然后按id分组,在这里进行获取
|
|
|
- //然后判断是否存在计划时间,如果存在则提示已做父计划,不能再做子计划
|
|
|
for (ProjectCostBudget budget : vo2ChildrenList) {
|
|
|
budget.setProjectId(vo.getProjectId());
|
|
|
budget.setParentId(vo2.getId());
|
|
@@ -413,13 +433,11 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
budget.setDeptId(vo2.getDeptId());
|
|
|
budget.setBudgetType(vo2.getBudgetType());
|
|
|
budget.setProjectProcess(vo2.getProjectProcess());
|
|
|
+ budget.setTaskDetail(vo2.getTaskDetail());
|
|
|
}
|
|
|
childrenList.addAll(vo2ChildrenList);
|
|
|
- //把数据库里的父计划,添加进父计划中,因为有子计划,返回的父计划是有回显值的
|
|
|
}else {
|
|
|
//无子计划
|
|
|
- //先判断数据中有无子计划,有子计划,父计划的几个值应该为空
|
|
|
- //如果数据中无子计划,则保存返回的值
|
|
|
ProjectCostBudget budget = new ProjectCostBudget();
|
|
|
BeanUtils.copyProperties(vo2, budget);
|
|
|
parentList.add(budget);
|
|
@@ -913,6 +931,172 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
return budget;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 编辑主计划
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ProjectCostBudgetVO2 updateMainPlan(ProjectCostBudgetVO2 vo2) {
|
|
|
+ //先判断如果数据都没填写,则设置可以分解子计划
|
|
|
+ if (vo2.getPlanTaskType() == null && StringUtils.isBlank(vo2.getPlanTaskDesc()) && StringUtils.isBlank(vo2.getPlanTarget()) && vo2.getPlanDays() == null){
|
|
|
+ vo2.setPlanTaskTypeValue(null);
|
|
|
+ vo2.setIsShowChildren(1);
|
|
|
+ return vo2;
|
|
|
+ }
|
|
|
+ //如果填写了数据,则检查数据是否填写完成
|
|
|
+ if (vo2.getPlanTaskType() == null){
|
|
|
+ throw new ServiceException("请选择任务类型");
|
|
|
+ }else if (StringUtils.isBlank(vo2.getPlanTaskDesc())){
|
|
|
+ throw new ServiceException("请填写任务描述");
|
|
|
+ }else if (StringUtils.isBlank(vo2.getPlanTarget())){
|
|
|
+ throw new ServiceException("请填写完成指标");
|
|
|
+ }else if (vo2.getPlanStartTime() == null || vo2.getPlanEndTime() == null){
|
|
|
+ throw new ServiceException("请选择计划起止日期");
|
|
|
+ }
|
|
|
+ //如果数据都填写完成,则根据任务类型,设置工作日,并且设置子计划不可分解
|
|
|
+ DictInfo taskType = baseMapper.getTaskType(vo2.getPlanTaskType());
|
|
|
+ //回显任务类型名
|
|
|
+ vo2.setPlanTaskTypeValue(taskType.getDictName());
|
|
|
+ int type = taskType.getDictValue().intValue();
|
|
|
+ //根据任务类型设置父计划的工作天数,固定任务1,临时任务2
|
|
|
+ if (type == 1){
|
|
|
+ vo2.setPlanDays(new BigDecimal(vo2.getPlanEndTime().compareTo(vo2.getPlanStartTime())));
|
|
|
+ }else {
|
|
|
+ if (vo2.getPlanEndTime().compareTo(vo2.getPlanStartTime()) > 35){
|
|
|
+ //工作天数,工具只能获取50天之内的
|
|
|
+ LocalDate startDate = vo2.getPlanStartTime();
|
|
|
+ LocalDate endDate = vo2.getPlanEndTime();
|
|
|
+ int i = 0;
|
|
|
+ while (endDate.compareTo(startDate) > 0){
|
|
|
+ i += CommonUtil.getWorkDays(startDate, startDate.plusDays(35L));
|
|
|
+ startDate = startDate.plusDays(36L);
|
|
|
+ }
|
|
|
+ vo2.setPlanDays(new BigDecimal(i));
|
|
|
+ }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())+")天");
|
|
|
+ vo2.setTaskFinishedStatus(1);
|
|
|
+ }
|
|
|
+ vo2.setIsShowChildren(0);
|
|
|
+ return vo2;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 编辑子计划
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ProjectCostBudgetVO2 updateChildrenPlan(ProjectCostBudgetVO2 vo2) {
|
|
|
+ //如果子计划为空,则清空父计划,然后修改可以编辑父计划
|
|
|
+ List<ProjectCostBudgetVO2> list = vo2.getChildrenList();
|
|
|
+ if (list != null && list.size() > 0){
|
|
|
+ //获取子计划任务类型,用于判断子计划类型是否一致
|
|
|
+ ProjectCostBudgetVO2 budgetVO2 = list.get(0);
|
|
|
+ Long taskType;
|
|
|
+ if (budgetVO2.getPlanTaskType() == null){
|
|
|
+ throw new ServiceException("请选择任务类型");
|
|
|
+ }else {
|
|
|
+ taskType = budgetVO2.getPlanTaskType();
|
|
|
+ }
|
|
|
+ DictInfo task = baseMapper.getTaskType(vo2.getPlanTaskType());
|
|
|
+ //拼接父计划信息
|
|
|
+ BigDecimal workDays = new BigDecimal(0);
|
|
|
+ LocalDate startDate = LocalDate.MAX;
|
|
|
+ LocalDate endDate = LocalDate.MIN;
|
|
|
+ StringBuilder descStr = new StringBuilder();
|
|
|
+ StringBuilder targetStr = new StringBuilder();
|
|
|
+ int j = 1;
|
|
|
+ for (ProjectCostBudgetVO2 l : list) {
|
|
|
+ //校验数据
|
|
|
+ if (l.getPlanTaskType() == null){
|
|
|
+ throw new ServiceException("请选择任务类型");
|
|
|
+ }else if (StringUtils.isBlank(l.getPlanTaskDesc())){
|
|
|
+ throw new ServiceException("请填写任务描述");
|
|
|
+ }else if (StringUtils.isBlank(l.getPlanTarget())){
|
|
|
+ throw new ServiceException("请填写完成指标");
|
|
|
+ }else if (l.getPlanStartTime() == null || l.getPlanEndTime() == null){
|
|
|
+ throw new ServiceException("请选择计划起止日期");
|
|
|
+ }
|
|
|
+ //校验类型
|
|
|
+ if (!taskType.equals(l.getPlanTaskType())){
|
|
|
+ throw new ServiceException("子计划任务类型不一致");
|
|
|
+ }
|
|
|
+ //计算总天数
|
|
|
+ if (l.getPlanDays() != null) {
|
|
|
+ workDays = workDays.add(l.getPlanDays());
|
|
|
+ }else {
|
|
|
+ if (task.getDictValue().intValue() == 1) {
|
|
|
+ l.setPlanDays(new BigDecimal(endDate.compareTo(startDate)));
|
|
|
+ } else {
|
|
|
+ if (l.getPlanEndTime().compareTo(budgetVO2.getPlanStartTime()) > 35) {
|
|
|
+ throw new ServiceException("请不要制定超过一个月的临时计划");
|
|
|
+ }else {
|
|
|
+ l.setPlanDays(new BigDecimal(CommonUtil.getWorkDays(budgetVO2.getPlanStartTime(), budgetVO2.getPlanEndTime())));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //计算最大日期和最小日期
|
|
|
+ if (l.getPlanStartTime().isBefore(startDate)){
|
|
|
+ startDate = l.getPlanStartTime();
|
|
|
+ }
|
|
|
+ if (l.getPlanEndTime().isAfter(endDate)){
|
|
|
+ endDate = l.getPlanEndTime();
|
|
|
+ }
|
|
|
+ //拼接子计划的任务描述
|
|
|
+ descStr.append(j + "."+l.getPlanTaskDesc()+"。");
|
|
|
+ //拼接子计划的完成指标
|
|
|
+ targetStr.append(j+"."+l.getPlanTarget()+"。");
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+ //计算是否超过预算
|
|
|
+ if (workDays.intValue() > vo2.getBudgetDays().intValue()){
|
|
|
+ vo2.setTaskFinishedStatus(1);
|
|
|
+ vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(workDays.intValue() - vo2.getBudgetDays().intValue())+"天)");
|
|
|
+ }
|
|
|
+
|
|
|
+ //根据子计划设置父计划任务类型
|
|
|
+ vo2.setPlanTaskType(taskType);
|
|
|
+ //根据子计划设置父计划任务类型值
|
|
|
+ vo2.setPlanTaskTypeValue(task.getDictName());
|
|
|
+ //根据子计划设置父计划任务描述
|
|
|
+ vo2.setPlanTaskDesc(descStr.toString());
|
|
|
+ //根据子计划设置父计划完成指标
|
|
|
+ vo2.setPlanTarget(targetStr.toString());
|
|
|
+ //根据子计划设置父计划起止日期
|
|
|
+ vo2.setPlanStartTime(startDate);
|
|
|
+ vo2.setPlanEndTime(endDate);
|
|
|
+ //根据任务类型设置父计划的工作天数,固定任务1,临时任务2
|
|
|
+ if (task.getDictValue().intValue() == 1){
|
|
|
+ vo2.setPlanDays(new BigDecimal(endDate.compareTo(startDate)));
|
|
|
+ }else {
|
|
|
+ if (endDate.compareTo(startDate) > 35){
|
|
|
+ //工作天数,工具只能获取50天之内的
|
|
|
+ int i = 0;
|
|
|
+ while (endDate.compareTo(startDate) > 0){
|
|
|
+ i += CommonUtil.getWorkDays(startDate, startDate.plusDays(35L));
|
|
|
+ startDate = startDate.plusDays(36L);
|
|
|
+ }
|
|
|
+ vo2.setPlanDays(new BigDecimal(i));
|
|
|
+ }else {
|
|
|
+ vo2.setPlanDays(new BigDecimal(CommonUtil.getWorkDays(startDate, endDate)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ vo2.setIsShowEdit(0);
|
|
|
+
|
|
|
+ }else {
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 统计一行的几个总金额
|
|
|
*/
|