فهرست منبع

Merge remote-tracking branch 'origin/master'

liuyc 2 سال پیش
والد
کامیت
617adb632d

+ 10 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -607,5 +607,14 @@ public class ArchivesAutoController extends BladeController {
 	public R searchInfo(@RequestParam("file") MultipartFile file, BladeUser user) {
 		return archivesAutoService.searchInfo(file);
 	}
-
+    /**
+     * 获取案卷元数据信息
+     */
+    @PostMapping("/getArchivesAutoView")
+    @ApiOperationSupport(order = 10)
+    @ApiOperation(value = "获取信息", notes = "传入id")
+    public R getArchivesAutoView(@RequestParam Long id) {
+        ArchivesAuto archivesAuto = archivesAutoService.getById(id);
+        return R.data(archivesAuto);
+    }
 }

+ 6 - 2
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/MetadataClassificationServiceImpl.java

@@ -422,7 +422,11 @@ public class MetadataClassificationServiceImpl
                 }
                 //注意,user有可能获取不到,出错关注一下这个
                 sqlBuild.append("(id,tenant_id, create_user, create_time, update_user, update_time, status, is_deleted,contract_id, file_id " + fieldBuild.toString() + " ) ");
-                sqlBuild.append("values('" + SnowFlakeUtil.getId() + "','" +user==null?-1:user.getTenantId() + "','" + user==null?-1:user.getUserId() + "', '" + DateUtil.formatDateTime(new Date()) + "', '" + user==null?-1:user.getUserId() + "', '" + DateUtil.formatDateTime(new Date()) + "', '0', '0','" + byId.getContractId() + "', '" + fileId + "' " + valueBuild.toString() + ")");
+                if(user != null && user.getUserId()!=null) {
+                    sqlBuild.append("values('" + SnowFlakeUtil.getId() + "','" +  user.getTenantId() + "','" +  user.getUserId() + "', '" + DateUtil.formatDateTime(new Date()) + "', '" +  user.getUserId() + "', '" + DateUtil.formatDateTime(new Date()) + "', '0', '0','" + byId.getContractId() + "', '" + fileId + "' " + valueBuild.toString() + ")");
+                }else{
+                    sqlBuild.append("values('" + SnowFlakeUtil.getId() + "','" + (-1)  + "','" + (-1) + "', '" + DateUtil.formatDateTime(new Date()) + "', '" + (-1) + "', '" + DateUtil.formatDateTime(new Date()) + "', '0', '0','" + byId.getContractId() + "', '" + fileId + "' " + valueBuild.toString() + ")");
+                }
             } else {
                 sqlBuild.append("update u_metadata_file set ");
                 for (MetadataClassification key : metadataClassifications) {
@@ -431,7 +435,7 @@ public class MetadataClassificationServiceImpl
                     }
                 }
                 if(user != null && user.getUserId()!=null) {
-                    sqlBuild.append(" update_user = '" + user==null?-1:user.getUserId() + "' , ");
+                    sqlBuild.append(" update_user = '" + user.getUserId() + "' , ");
                 }
                 sqlBuild.append(" update_time = '" + DateUtil.formatDateTime(new Date()) + "' ");
                 sqlBuild.append(" where id = " + metadataMap.get("id"));

+ 3 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractInfoMapper.java

@@ -14,6 +14,7 @@ import org.springblade.control.vo.EMInvoiceInfoVO;
 import org.springblade.system.entity.DictBiz;
 
 import java.math.BigDecimal;
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -40,4 +41,6 @@ public interface ContractInfoMapper extends BaseMapper<ControlContractInfo> {
     List<EMInvoiceInfoVO> getContractInvoiceList(@Param("contractId") Long contractId);
 
     void realDeleteById(@Param("id") Long id);
+
+    List<ControlContractInfo> getContractByYear(@Param("year") int year, @Param("ids") Collection<?> coll);
 }

+ 8 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractInfoMapper.xml

@@ -50,4 +50,12 @@
         from c_control_contract_info cci left join c_expense_invoice_info eii on eii.project_id = cci.project_id
         WHERE  cci.id = #{contractId}
     </select>
+    <select id="getContractByYear" resultType="org.springblade.control.entity.ControlContractInfo">
+        SELECT * FROM c_control_contract_info
+        WHERE #{year} between DATE_FORMAT(start_time ,'%Y') and DATE_FORMAT(end_time ,'%Y')
+          and project_id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
 </mapper>

+ 5 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IContractInfoService.java

@@ -15,6 +15,7 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.system.entity.DictBiz;
 
 import java.math.BigDecimal;
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -44,4 +45,8 @@ public interface IContractInfoService extends BaseService<ControlContractInfo> {
     BigDecimal getYearContractMoney(int year);
 
     List<EMInvoiceInfoVO> getContractInvoiceList(Long contractId);
+
+    //根据年份获取合同
+    List<ControlContractInfo> getContractByYear(int year, Collection<?> coll);
+
 }

+ 11 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java

@@ -87,6 +87,15 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     //任务审批完成闭环时,计算当前任务的实际用时和人工成本,传入任务id和任务实际完成时间
     void taskFinishedStats(Long PlanId,LocalDate practicalFinishTime);
 
-    //获取所有项目截至当前的维护支出
-    BigDecimal getAllMaintainCost();
+    //获取所有项目截至当年的维护支出
+    BigDecimal getAllMaintainCost(int year);
+
+    //获取所有项目的维护支出
+    BigDecimal getAllMaintainCost2();
+
+    //获取所有项目截至当年的维护支出,分月返回
+    Map<Long,List<BigDecimal>> getAllMaintainCost3(int year);
+
+    //获取所有项目截至当年的维护支出,按年返回
+    Map<Long,BigDecimal> getAllMaintainCost4(int year);
 }

+ 36 - 3
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -330,7 +330,8 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         //统计今年的已盈利:已收入-支出 ,目前已支出只统计闭环的计划
         //获取一年人工支出
         BigDecimal yearStaffDisburse = budgetService.getYearStaffDisburse(year);
-        vo3.setYearProfit(yearReturned.subtract(yearStaffDisburse));
+        BigDecimal cost = budgetService.getAllMaintainCost(LocalDate.now().getYear());
+        vo3.setYearProfit(yearReturned.subtract(yearStaffDisburse).subtract(cost));
 
         //获取今年的年度预算
         AnnualBudget annualBudget = baseMapper.getThisYearBudget(year);
@@ -400,7 +401,14 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         map.put("yearReturned",yearReturned);
         //总实际支出:当年所有报销支出,和人工支出
         BigDecimal yearStaffDisburse = budgetService.getYearStaffDisburse(y);
-        map.put("yearStaffDisburse",yearStaffDisburse);
+        //维护支出
+        BigDecimal cost;
+        if (y == 0){
+            cost = budgetService.getAllMaintainCost2();
+        }else {
+            cost = budgetService.getAllMaintainCost(y);
+        }
+        map.put("yearStaffDisburse",yearStaffDisburse.add(cost));
         //总计划支出:年度预算总计划支出
         if (y == 0){
             List<AnnualBudget> list = baseMapper.getAllYearBudget(y);
@@ -456,6 +464,12 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         List<ProjectCostBudget> budgetByYear = budgetService.getBudgetByYear(y);
         Map<Long, List<ProjectCostBudget>> map = budgetByYear.parallelStream()
                 .collect(Collectors.groupingBy(ProjectCostBudget::getProjectId));
+        //维护支出
+        Map<Long, List<BigDecimal>> listMap = budgetService.getAllMaintainCost3(y);
+        Boolean isMaintain = true;
+        if (listMap == null && listMap.size() <= 0){
+            isMaintain = false;
+        }
         for (ControlProjectInfo project : list) {
             AnnualProjectCostVO vo = new AnnualProjectCostVO();
             List<Integer> integerList = new ArrayList<>();
@@ -469,6 +483,13 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                         }
                     }
                 }
+                //计算维护
+                if (isMaintain){
+                    List<BigDecimal> decimals = listMap.get(project.getId());
+                    if (decimals != null && decimals.size() > 0){
+                        big = big.add(decimals.get(i -1));
+                    }
+                }
                 integerList.add(big.intValue());
             }
             vo.setName(project.getName());
@@ -618,6 +639,12 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         if (list == null || list.size() <= 0){
             return null;
         }
+        //维护支出
+        Map<Long, BigDecimal> listMap = budgetService.getAllMaintainCost4(Integer.parseInt(date.substring(0,4)));
+        Boolean isMaintain = true;
+        if (listMap == null || listMap.size() <= 0){
+            isMaintain = false;
+        }
         List<ProjectIncomeCostRatioVO> vos = new ArrayList<>();
         //按年获取闭环任务,根据项目分组
         List<ProjectCostBudget> costByMonth = budgetService.getPlanPracticalCostByMonth(date.substring(0,4));
@@ -626,7 +653,13 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
             for (ControlProjectInfo info : list) {
                 ProjectIncomeCostRatioVO vo = new ProjectIncomeCostRatioVO();
                 vo.setProjectName(info.getName());
-                vo.setProjectCost(0);
+                if (isMaintain){
+                    if (listMap.get(info.getId()) != null){
+                        vo.setProjectCost(listMap.get(info.getId()).intValue());
+                    }
+                }else {
+                    vo.setProjectCost(0);
+                }
                 vos.add(vo);
             }
             return vos;

+ 10 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractInfoServiceImpl.java

@@ -30,6 +30,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.util.Collection;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -199,4 +200,13 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
     public List<EMInvoiceInfoVO> getContractInvoiceList(Long contractId) {
         return baseMapper.getContractInvoiceList(contractId);
     }
+
+    /**
+     * 根据年份和项目id获取合同
+     * @return
+     */
+    @Override
+    public List<ControlContractInfo> getContractByYear(int year, Collection<?> coll) {
+        return baseMapper.getContractByYear(year,coll);
+    }
 }

+ 384 - 16
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -354,7 +354,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                     }
                     //没有子计划,则计算父计划成本是否超过测算,如果计划没有完成,有选择日期,有员工支出,则判断
                     if (vo2.getTaskFinishedStatus() == null && vo2.getPlanDays() != null && vo2.getBudgetDays() != null){
-                        if (vo2.getPlanDays().intValue() > vo2.getBudgetDays().intValue()) {
+                        if (vo2.getPlanDays().intValue() > vo2.getBudgetDays().multiply(vo2.getStaffCount()).intValue()) {
                             vo2.setTaskFinishedStatus(1);
                             vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue())+"天)");
                         }
@@ -914,7 +914,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                             }
                         }
                         if (total.compareTo(new BigDecimal(0)) != 0) {
-                            ratios.add(finished.divide(total, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue());
+                            ratios.add(finished.divide(total, 2,RoundingMode.HALF_UP).multiply(new BigDecimal(100)).intValue());
                         } else {
                             ratios.add(0);
                         }
@@ -1009,8 +1009,8 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                 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().multiply(vo2.getStaffCount()).intValue()){
+            vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(vo2.getPlanDays().intValue() - vo2.getBudgetDays().multiply(vo2.getStaffCount()).intValue())+")天");
             vo2.setTaskFinishedStatus(1);
         }else {
             vo2.setTaskFinishedStatus(0);
@@ -1096,9 +1096,9 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             }
             //计算是否超过预算
             if (vo2.getTaskFinishedStatus() == null || vo2.getTaskFinishedStatus() != 2) {
-                if (workDays.intValue() > vo2.getBudgetDays().intValue()) {
+                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().multiply(vo2.getStaffCount()).intValue()) + "天)");
                 } else {
                     vo2.setTaskFinishedStatus(null);
                 }
@@ -1210,11 +1210,11 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
     }
 
     /**
-     * 获取所有项目截至当前的维护支出
+     * 根据年份获取所有项目的维护支出
      * @return
      */
     @Override
-    public BigDecimal getAllMaintainCost() {
+    public BigDecimal getAllMaintainCost(int year) {
         //获取所有已分配任务人的维护支出,如果没有返回0
         List<ProjectCostBudget> plans = baseMapper.getAllMaintainPlan();
         if (plans != null && plans.size() > 0) {
@@ -1232,12 +1232,11 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             Map<Long, List<ProjectCostBudget>> budgetMap = budgets.parallelStream()
                     .collect(Collectors.groupingBy(ProjectCostBudget::getProjectId));
             //查询出所有项目
-            List<ControlProjectInfo> projectInfos = infoMapper.selectList(new LambdaQueryWrapper<ControlProjectInfo>().in(ControlProjectInfo::getId, bab));
+            List<ControlProjectInfo> projectInfos = infoMapper.selectList(new LambdaQueryWrapper<ControlProjectInfo>().in(ControlProjectInfo::getId, budgetMap.keySet()));
             //通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
-            List<ControlContractInfo> contractList = contractService.list(
-                    new LambdaQueryWrapper<ControlContractInfo>().in(ControlContractInfo::getProjectId, budgetMap.keySet()));
-            if (contractList == null || projectInfos.size() != contractList.size()){
-                throw new ServiceException("项目没有合同,无法计算维护支出");
+            List<ControlContractInfo> contractList = contractService.getContractByYear(year, budgetMap.keySet());
+            if (contractList == null || contractList.size() <= 0){
+                return new BigDecimal(0);
             }
             //把合同根据项目分组
             Map<Long, List<ControlContractInfo>> contractMap = contractList.parallelStream()
@@ -1246,6 +1245,10 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             BigDecimal count = new BigDecimal(0);
             //循环项目,
             for (ControlProjectInfo info : projectInfos) {
+                List<ControlContractInfo> infos = contractMap.get(info.getId());
+                if (infos == null || infos.size() == 0){
+                    continue;
+                }
                 //获取合同时间,获取多少个月
                 ControlContractInfo contract = contractMap.get(info.getId()).get(0);
                 LocalDate startTime = contract.getStartTime();
@@ -1262,14 +1265,59 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                     continue;
                 }
                 //获得每个月的维护费
-                BigDecimal scale = big.divide(new BigDecimal(months)).setScale(2, RoundingMode.HALF_UP);
+                BigDecimal scale = big.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).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;
+                int startMonth = 0;
+                int endMonth = 0;
+                //判断是否查询今年
+                if (LocalDate.now().getYear() == year){
+                    //如果合同开始日期大于今年,则开始时间从一月算起
+                    if (startTime.getYear() < year){
+                        startMonth = 1;
+                    }else {
+                        //如果合同开始日期比今天要大,则不计算维护费
+                        if (startTime.getMonthValue() > LocalDate.now().getMonthValue()){
+                            continue;
+                        }else {
+                            //开始日期比今天小,从开始日期开始计算
+                            startMonth = startTime.getMonthValue();
+                        }
+                    }
+                    //如果合同时间大于当前,就用当前时间,如果合同时间小于当前,就用合同时间 -做结束时间
+                    if (endTime.compareTo(LocalDate.now()) > 0){
+                        endMonth = LocalDate.now().getMonthValue();
+                    }else {
+                        endMonth = endTime.getMonthValue();
+                    }
+                }else {
+                    //不是今年
+                    if (startTime.getYear() > year){
+                        startMonth = 1;
+                    }else {
+                        //如果合同开始月比1月要大,则用开始日期
+                        if (startTime.getMonthValue() > 1){
+                            startMonth = startTime.getMonthValue();
+                        }else {
+                            //开始月比1或者等于1,从1开始计算
+                            startMonth = 1;
+                        }
+                    }
+                    //如果合同时间大于当前,就用当前时间
+                    if (endTime.getYear() > year){
+                        endMonth = 12;
+                    }else {
+                        if (endTime.getMonthValue() < 12) {
+                            endMonth = endTime.getMonthValue();
+                        }else {
+                            endMonth = 12;
+                        }
+                    }
+                }
+                int thisMonths = endMonth - startMonth + 1;
                 BigDecimal multiply = scale.multiply(new BigDecimal(thisMonths));
                 count = count.add(multiply);
             }
@@ -1278,6 +1326,326 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         return new BigDecimal(0);
     }
 
+    /**
+     * 获取所有项目的维护支出
+     * @return
+     */
+    @Override
+    public BigDecimal getAllMaintainCost2() {
+        //获取所有已分配任务人的维护支出,如果没有返回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, budgetMap.keySet()));
+            //通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
+            List<ControlContractInfo> contractList = contractService.list(
+                    new LambdaQueryWrapper<ControlContractInfo>().in(ControlContractInfo::getProjectId,budgetMap.keySet()));
+            if (contractList == null || contractList.size() <= 0){
+                return new BigDecimal(0);
+            }
+            //把合同根据项目分组
+            Map<Long, List<ControlContractInfo>> contractMap = contractList.parallelStream()
+                    .collect(Collectors.groupingBy(ControlContractInfo::getProjectId));
+            //新建总金额字段
+            BigDecimal count = new BigDecimal(0);
+            //循环项目,
+            for (ControlProjectInfo info : projectInfos) {
+                List<ControlContractInfo> infos = contractMap.get(info.getId());
+                if (infos == null || infos.size() == 0){
+                    continue;
+                }
+                //获取合同时间,获取多少个月
+                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),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                // 当前日期和合同开始时间比较,相差多少月  月 * 每个月维护费 = 当前项目截至当前的所有维护费
+                if (LocalDate.now().compareTo(startTime) < 0){
+//                    throw new ServiceException("合同开始时间超过当前时间,无法计算维护支出");
+                    continue;
+                }
+                //如果合同结束时间比当前大,就用当前时间
+                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;
+                BigDecimal multiply = scale.multiply(new BigDecimal(month));
+                count = count.add(multiply);
+            }
+            return count;
+        }
+        return new BigDecimal(0);
+    }
+
+    /**
+     * //获取所有项目截至当年的维护支出,分月返回
+     * @param year
+     * @return
+     */
+    @Override
+    public Map<Long,List<BigDecimal>> getAllMaintainCost3(int year) {
+        //获取所有已分配任务人的维护支出,如果没有返回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, budgetMap.keySet()));
+            //通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
+            List<ControlContractInfo> contractList = contractService.getContractByYear(year, budgetMap.keySet());
+            if (contractList == null || contractList.size() <= 0){
+                return null;
+            }
+            //把合同根据项目分组
+            Map<Long, List<ControlContractInfo>> contractMap = contractList.parallelStream()
+                    .collect(Collectors.groupingBy(ControlContractInfo::getProjectId));
+            //返回结果
+            Map<Long,List<BigDecimal>> map = new HashMap<>();
+            //循环项目,
+            for (ControlProjectInfo info : projectInfos) {
+                List<ControlContractInfo> infos = contractMap.get(info.getId());
+                if (infos == null || infos.size() == 0){
+                    continue;
+                }
+                //获取合同时间,获取多少个月
+                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),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                // 当前日期和合同开始时间比较,相差多少月  月 * 每个月维护费 = 当前项目截至当前的所有维护费
+                if (LocalDate.now().compareTo(startTime) < 0){
+                    continue;
+                }
+                int startMonth = 0;
+                int endMonth = 0;
+                //判断是否查询今年
+                if (LocalDate.now().getYear() == year){
+                    //如果合同开始日期大于今年,则开始时间从一月算起
+                    if (startTime.getYear() < year){
+                        startMonth = 1;
+                    }else {
+                        //如果合同开始日期比今天要大,则不计算维护费
+                        if (startTime.getMonthValue() > LocalDate.now().getMonthValue()){
+                            continue;
+                        }else {
+                            //开始日期比今天小,从开始日期开始计算
+                            startMonth = startTime.getMonthValue();
+                        }
+                    }
+                    //如果合同时间大于当前,就用当前时间,如果合同时间小于当前,就用合同时间 -做结束时间
+                    if (endTime.compareTo(LocalDate.now()) > 0){
+                        endMonth = LocalDate.now().getMonthValue();
+                    }else {
+                        endMonth = endTime.getMonthValue();
+                    }
+                }else {
+                    //不是今年
+                    if (startTime.getYear() > year){
+                        startMonth = 1;
+                    }else {
+                        //如果合同开始月比1月要大,则用开始日期
+                        if (startTime.getMonthValue() > 1){
+                            startMonth = startTime.getMonthValue();
+                        }else {
+                            //开始月比1或者等于1,从1开始计算
+                            startMonth = 1;
+                        }
+                    }
+                    //如果合同时间大于当前,就用当前时间
+                    if (endTime.getYear() > year){
+                        endMonth = 12;
+                    }else {
+                        if (endTime.getMonthValue() < 12) {
+                            endMonth = endTime.getMonthValue();
+                        }else {
+                            endMonth = 12;
+                        }
+                    }
+                }
+                //为项目设置值
+                List<BigDecimal> decimalList = new ArrayList<>();
+                for (int i = 1; i <= 12; i++) {
+                    if (i >= startMonth && i <= endMonth){
+                        decimalList.add(scale);
+                    }else {
+                        decimalList.add(new BigDecimal(0));
+                    }
+                }
+                map.put(info.getId(),decimalList);
+            }
+            return map;
+        }
+        return null;
+    }
+
+    /**
+     * //获取所有项目截至当年的维护支出,按年返回
+     * @param year
+     * @return
+     */
+    @Override
+    public Map<Long, BigDecimal> getAllMaintainCost4(int year) {
+        //获取所有已分配任务人的维护支出,如果没有返回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, budgetMap.keySet()));
+            //通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
+            List<ControlContractInfo> contractList = contractService.getContractByYear(year, budgetMap.keySet());
+            if (contractList == null || contractList.size() <= 0){
+                return null;
+            }
+            //把合同根据项目分组
+            Map<Long, List<ControlContractInfo>> contractMap = contractList.parallelStream()
+                    .collect(Collectors.groupingBy(ControlContractInfo::getProjectId));
+            //返回结果
+            Map<Long,BigDecimal> map = new HashMap<>();
+            //循环项目,
+            for (ControlProjectInfo info : projectInfos) {
+                List<ControlContractInfo> infos = contractMap.get(info.getId());
+                if (infos == null || infos.size() == 0){
+                    continue;
+                }
+                //获取合同时间,获取多少个月
+                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),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                // 当前日期和合同开始时间比较,相差多少月  月 * 每个月维护费 = 当前项目截至当前的所有维护费
+                if (LocalDate.now().compareTo(startTime) < 0){
+                    continue;
+                }
+                int startMonth = 0;
+                int endMonth = 0;
+                //判断是否查询今年
+                if (LocalDate.now().getYear() == year){
+                    //如果合同开始日期大于今年,则开始时间从一月算起
+                    if (startTime.getYear() < year){
+                        startMonth = 1;
+                    }else {
+                        //如果合同开始日期比今天要大,则不计算维护费
+                        if (startTime.getMonthValue() > LocalDate.now().getMonthValue()){
+                            continue;
+                        }else {
+                            //开始日期比今天小,从开始日期开始计算
+                            startMonth = startTime.getMonthValue();
+                        }
+                    }
+                    //如果合同时间大于当前,就用当前时间,如果合同时间小于当前,就用合同时间 -做结束时间
+                    if (endTime.compareTo(LocalDate.now()) > 0){
+                        endMonth = LocalDate.now().getMonthValue();
+                    }else {
+                        endMonth = endTime.getMonthValue();
+                    }
+                }else {
+                    //不是今年
+                    if (startTime.getYear() > year){
+                        startMonth = 1;
+                    }else {
+                        //如果合同开始月比1月要大,则用开始日期
+                        if (startTime.getMonthValue() > 1){
+                            startMonth = startTime.getMonthValue();
+                        }else {
+                            //开始月比1或者等于1,从1开始计算
+                            startMonth = 1;
+                        }
+                    }
+                    //如果合同时间大于当前,就用当前时间
+                    if (endTime.getYear() > year){
+                        endMonth = 12;
+                    }else {
+                        if (endTime.getMonthValue() < 12) {
+                            endMonth = endTime.getMonthValue();
+                        }else {
+                            endMonth = 12;
+                        }
+                    }
+                }
+                //为项目设置值
+                int thisMonths = endMonth - startMonth + 1;
+                BigDecimal multiply = scale.multiply(new BigDecimal(thisMonths));
+                map.put(info.getId(),multiply);
+            }
+            return map;
+        }
+        return null;
+    }
+
     /**
      * 统计一行的几个总金额
      */