|
@@ -1801,6 +1801,75 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * //根据项目id获取项目截至目前-某个费用分类的的维护支出,按项目环节返回
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map<Long,BigDecimal> getAllMaintainCost7(Long projectId,Integer costType) {
|
|
|
+ //获取当前项目-指定费用分类的-维护支出,如果没有返回null
|
|
|
+ List<ProjectCostBudget> plans = baseMapper.getAllMaintainPlan3(projectId,costType);
|
|
|
+ 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());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //查询出所有维护计划
|
|
|
+ List<ProjectCostBudget> budgets = this.listByIds(bab);
|
|
|
+ //通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
|
|
|
+ ControlContractInfo contract = contractService.getOne(
|
|
|
+ new LambdaQueryWrapper<ControlContractInfo>().in(ControlContractInfo::getProjectId, projectId));
|
|
|
+ if (contract == null){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ //把合同根据项目分组
|
|
|
+ //返回值
|
|
|
+ Map<Long,BigDecimal> map = new HashMap<>();
|
|
|
+ //获取合同时间,获取多少个月
|
|
|
+ LocalDate startTime = contract.getStartTime();
|
|
|
+ LocalDate endTime = contract.getEndTime();
|
|
|
+ // 当前日期和合同开始时间比较,相差多少月 月 * 每个月维护费 = 当前项目截至当前的所有维护费
|
|
|
+ if (LocalDate.now().compareTo(startTime) < 0){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ int years = endTime.getYear() - startTime.getYear();
|
|
|
+ int months = years * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
|
|
|
+ //每个项目的维护总和 / 多少个月 = 该项目每个月的维护费
|
|
|
+ BigDecimal big = new BigDecimal(0);
|
|
|
+ for (ProjectCostBudget l : budgets) {
|
|
|
+ big = big.add(l.getBudgetStaffCost());
|
|
|
+ if (map.get(l.getProjectProcess()) == null){
|
|
|
+ map.put(l.getProjectProcess(),l.getBudgetStaffCost());
|
|
|
+ }else {
|
|
|
+ map.put(l.getProjectProcess(),map.get(l.getProjectProcess()).add(l.getBudgetStaffCost()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (big.compareTo(new BigDecimal(0)) == 0){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ //如果合同结束时间比当前大,就用当前时间
|
|
|
+ if (endTime.compareTo(LocalDate.now()) > 0){
|
|
|
+ endTime = LocalDate.now();
|
|
|
+ }
|
|
|
+ int year = LocalDate.now().getYear() - startTime.getYear();
|
|
|
+ int month = year * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
|
|
|
+ //目前是每个部门总金额,先计算每个月的总费用,再乘以month个月
|
|
|
+ for (Long process: map.keySet()) {
|
|
|
+ BigDecimal count = map.get(process);
|
|
|
+ //获得每个月的维护费
|
|
|
+ BigDecimal scale = count.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ map.put(process,scale.multiply(new BigDecimal(month)));
|
|
|
+ }
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* //获取项目的维护预算
|
|
|
* @return
|