Jelajahi Sumber

Merge remote-tracking branch 'origin/master'

liuyc 2 tahun lalu
induk
melakukan
3a43002a61
26 mengubah file dengan 332 tambahan dan 40 penghapusan
  1. 1 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ProjectCostBudget.java
  2. 32 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetVO3.java
  3. 13 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectCostBudgetVO2.java
  4. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java
  5. 5 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  6. 23 4
      blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java
  7. 4 4
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectCostBudgetController.java
  8. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.java
  9. 10 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.xml
  10. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractInfoMapper.java
  11. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractInfoMapper.xml
  12. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.java
  13. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.xml
  14. 6 2
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java
  15. 18 4
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml
  16. 5 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetService.java
  17. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IContractInfoService.java
  18. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IContractReturnedInfoService.java
  19. 4 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java
  20. 79 4
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java
  21. 14 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractInfoServiceImpl.java
  22. 14 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractReturnedInfoServiceImpl.java
  23. 53 12
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java
  24. 9 0
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  25. 7 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  26. 11 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

+ 1 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ProjectCostBudget.java

@@ -120,7 +120,7 @@ public class ProjectCostBudget extends BaseEntity {
     private BigDecimal practicalTaskDays;
 
     @ApiModelProperty(value = "任务完成后是否审批通过")
-    private String taskApprove;
+    private Integer taskApprove;
 
     @ApiModelProperty(value = "关联回款")
     @JsonSerialize(nullsUsing = NullSerializer.class)

+ 32 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetVO3.java

@@ -0,0 +1,32 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.AnnualBudget;
+import org.springblade.control.entity.AnnualBudgetDisburse;
+import org.springblade.control.entity.AnnualBudgetIncome;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @Param  门户-年度统计用
+ * @Author wangwl
+ * @Date 2023/6/13 13:52
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AnnualBudgetVO3 extends AnnualBudget {
+    @ApiModelProperty(value = "已收入")
+    private BigDecimal yearReturned;
+
+    @ApiModelProperty(value = "已盈利")
+    private BigDecimal yearProfit;
+
+    @ApiModelProperty(value = "合同进度统计")
+    private Integer contractSchedule;
+
+    @ApiModelProperty(value = "利润进度统计")
+    private Integer profitSchedule;
+}

+ 13 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectCostBudgetVO2.java

@@ -17,9 +17,21 @@ import java.util.Map;
 @EqualsAndHashCode(callSuper = true)
 public class ProjectCostBudgetVO2 extends ProjectCostBudget {
     @ApiModelProperty(value = "子计划")
-    private List<ProjectCostBudget> childrenList;
+    private List<ProjectCostBudgetVO2> childrenList;
 
     @ApiModelProperty(value = "回款条件")
     private String returnedValue;
 
+    @ApiModelProperty(value = "项目环节名称")
+    private String projectProcessValue;
+
+    @ApiModelProperty(value = "预算类型值")
+    private String budgetTypeValue;
+
+    @ApiModelProperty(value = "任务明细值")
+    private String taskDetailValue;
+
+    @ApiModelProperty(value = "任务完成状态,1黄色,2绿色")
+    private Integer taskFinishedStatus;
+
 }

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java

@@ -230,6 +230,8 @@ public class ArchiveTreeContractVO2 implements INodeEx<ArchiveTreeContractVO2> {
     //案卷后缀
     private String archiveNameSuffix;
 
+    private Integer treeNumber;
+
     public String toString() {
         return "TreeNode(parentId=" + this.getParentId()
                 + ",ancestors" + this.getAncestors()

+ 5 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -1011,7 +1011,11 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//TODO wbs节点
 		//不存在跨节点 项目名称+案卷题名规则(在后台归档目录树设置的)+后缀
 		//存在跨节点  获取当前所有节点的父级节点题名规则+所有同层级跨节点并卷的节点名称拼接+后缀
-		return archiveName+node.getArchiveNameSuffix();
+		String archiveNameSuffix=node.getArchiveNameSuffix();
+		if(archiveNameSuffix==null || archiveNameSuffix.equals("null")){
+			archiveNameSuffix="";
+		}
+		return archiveName+archiveNameSuffix;
 	}
 	private String builtFilePageNo(ArchivesAuto archivesAuto,List<ArchiveFile> waitArchiveFiles){
 		//生成文件对应的页码,返回url

+ 23 - 4
blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java

@@ -14,15 +14,14 @@ import org.springblade.control.entity.AnnualBudget;
 import org.springblade.control.entity.DepartmentMonthPlan;
 import org.springblade.control.service.IAnnualBudgetService;
 import org.springblade.control.service.IDepartmentMonthPlanService;
-import org.springblade.control.vo.AnnualBudgetVO;
-import org.springblade.control.vo.AnnualBudgetVO2;
-import org.springblade.control.vo.ControlProjectInfoVO;
-import org.springblade.control.vo.DictInfoVO;
+import org.springblade.control.vo.*;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Param
@@ -124,4 +123,24 @@ public class AnnualBudgetController {
         return R.data(budgetService.getSecondSubject());
     }
 
+    /**
+     * 门户-年度指标统计
+     */
+    @GetMapping("/portalAnnualTarget")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "门户-年度指标统计")
+    public R<AnnualBudgetVO3> portalAnnualTarget() {
+        return R.data(budgetService.portalAnnualTarget());
+    }
+
+    /**
+     * 门户-年度各项费用统计
+     */
+    @GetMapping("/portalAnnualCost")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "门户-年度各项费用统计")
+    public R<Map<String, BigDecimal>> portalAnnualCost(String year) {
+        return R.data(budgetService.portalAnnualCost(year));
+    }
+
 }

+ 4 - 4
blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectCostBudgetController.java

@@ -30,7 +30,7 @@ import java.util.Map;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/projectCostBudget")
-@Api(value = "计划预算接口", tags = "计划预算接口")
+@Api(value = "项目计划预算", tags = "项目计划预算")
 public class ProjectCostBudgetController {
 
     private final IProjectCostBudgetService budgetService;
@@ -44,7 +44,7 @@ public class ProjectCostBudgetController {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "queryValue", value = "搜索值", required = false),
     })
-    public R<ControlProjectInfoVO> page(ControlProjectInfoDTO dto, Query query){
+    public R<List<ControlProjectInfoVO>> page(ControlProjectInfoDTO dto, Query query){
         return R.data(budgetService.page(dto,query));
     }
 
@@ -65,8 +65,8 @@ public class ProjectCostBudgetController {
      * 编辑项目计划
      */
     @PostMapping("/updatePlan")
-    @ApiOperationSupport(order = 5)
-    @ApiOperation(value = "获取项目计划")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "编辑项目计划")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "id", value = "项目id", required = true),
     })

+ 2 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.java

@@ -33,4 +33,6 @@ public interface AnnualBudgetMapper extends BaseMapper<AnnualBudget> {
     List<DictInfoVO> getAllBudgetSubject();
 
     List<DictInfoVO> getAllSecondSubject();
+
+    AnnualBudget getThisYearBudget(@Param("year") int year);
 }

+ 10 - 1
blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.xml

@@ -1,11 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.springblade.control.mapper.AnnualBudgetMapper">
+
+    <sql id="budget_column">
+        id, name,budget_start_time, budget_end_time, total_budget,staff_cost,manage_disburse,annual_contract_target,annual_profit_target,status
+    </sql>
+
+
     <delete id="removeById">
         delete from c_annual_budget where id = #{id}
     </delete>
 
-
     <select id="getAnnualBudget" resultType="org.springblade.control.vo.AnnualBudgetVO">
         select * from c_annual_budget
         where id = #{id}
@@ -44,6 +49,10 @@
         select *
         from c_dict_info di WHERE di.`type` = 1 AND di.parent_id > 0
     </select>
+    <select id="getThisYearBudget" resultType="org.springblade.control.entity.AnnualBudget">
+        select   <include refid="budget_column" />
+        from c_annual_budget where name like concat('%', #{year}, '%')
+    </select>
 
 
 </mapper>

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

@@ -12,6 +12,7 @@ import org.springblade.control.vo.ControlContractInfoVO;
 import org.springblade.control.vo.ControlProjectInfoVO;
 import org.springblade.system.entity.DictBiz;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -32,4 +33,6 @@ public interface ContractInfoMapper extends BaseMapper<ControlContractInfo> {
     List<ControlProjectInfo> getNoConnectionProject2();
 
     List<ControlContractInfo> getList();
+
+    BigDecimal getYearContractMoney(@Param("year") int year);
 }

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

@@ -31,4 +31,8 @@
     <select id="getList" resultType="org.springblade.control.entity.ControlContractInfo">
         select * from c_control_contract_info WHERE is_deleted = 0
     </select>
+    <select id="getYearContractMoney" resultType="java.math.BigDecimal">
+        SELECT SUM(contract_money)
+        from c_control_contract_info WHERE DATE_FORMAT(contract_sign_time ,'%Y') = #{year} and is_deleted = 0
+    </select>
 </mapper>

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

@@ -9,6 +9,7 @@ import org.springblade.control.entity.DictInfo;
 import org.springblade.control.vo.ContractReturnedInfoVO;
 import org.springblade.control.vo.ControlContractInfoVO;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -23,4 +24,6 @@ public interface ContractReturnedInfoMapper extends BaseMapper<ContractReturnedI
     List<ContractReturnedInfoVO> getListByContractId(@Param("contractId") Long contractId);
 
     List<ContractReturnedInfoVO> getListByProjectId(@Param("projectId") Long projectId);
+
+    BigDecimal getYearReturned(@Param("year") int year);
 }

+ 4 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.xml

@@ -21,4 +21,8 @@
             (select name from blade_user WHERE id = ri.reminder_user) as reminderUserName
         from c_contract_returned_info ri where ri.project_id = #{projectId}
     </select>
+    <select id="getYearReturned" resultType="java.math.BigDecimal">
+        SELECT SUM(practical_returned_money)
+        from c_contract_returned_info WHERE DATE_FORMAT(practical_returned_time,'%Y') = #{year}
+    </select>
 </mapper>

+ 6 - 2
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java

@@ -10,6 +10,7 @@ import org.springblade.control.entity.*;
 import org.springblade.control.vo.*;
 import org.springblade.core.mp.support.Query;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.List;
 import java.util.Map;
@@ -28,11 +29,11 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
 
     ProjectCostBudgetStats getBudgetTotalByProjectId(@Param("projectId") Long projectId);
 
-    ControlProjectInfoVO page(IPage page,@Param("dto") ControlProjectInfoDTO dto);
+    List<ControlProjectInfoVO> page(IPage page,@Param("dto") ControlProjectInfoDTO dto);
 
     List<ProjectCostBudgetVO2> getApprovePlan(@Param("id") Long id);
 
-    List<ProjectCostBudget> getAllChildrenPlan(@Param("id") Long id);
+    List<ProjectCostBudgetVO2> getAllChildrenPlan(@Param("id") Long id);
 
     void removeChildrenPlan(@Param("projectId") Long projectId);
 
@@ -55,4 +56,7 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
     List<ProjectCostBudget> getProjectAllFinishedTask(@Param("projectId") Long projectId,@Param("costType") Integer costType);
 
     List<ProjectCostBudget> getAllPracticalBudgetByProjectId(@Param("projectId") Long projectId);
+
+    //获取一年人工支出
+    BigDecimal getYearStaffDisburse(@Param("year") int year);
 }

+ 18 - 4
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml

@@ -48,7 +48,7 @@
             pi.*,
             (select dict_name  from c_dict_info WHERE code = 'project_type' AND dict_value = pi.project_type) as projectTypeValue,
             (select dict_name  from c_dict_info WHERE code = 'project_server_type' AND dict_value = pi.project_server_type) as projectServerTypeValue,
-            IFNULL((select cpp.name from c_project_process cpp WHERE cpp.project_id = pi.id and cpp.start_time &lt;= NOW() order by cpp.sort desc limit 1),
+            IFNULL((select cpp.name from c_project_process cpp WHERE cpp.project_id = pi.id and cpp.process_start_time &lt;= NOW() order by cpp.sort desc limit 1),
                 (select cpp.name from c_project_process cpp WHERE cpp.project_id = pi.id order by cpp.sort limit 1)) as CurrentProcessName
         from c_control_project_info pi
         WHERE 1=1
@@ -67,12 +67,14 @@
     <select id="getApprovePlan" resultType="org.springblade.control.vo.ProjectCostBudgetVO2">
         SELECT
             pcb.*,
+            (select cpp.name from c_project_process cpp where cpp.id = pcb.project_process) as projectProcessValue,
+            (select di.dict_name from c_dict_info di where di.type = 1 and di.dict_value = pcb.budget_type and di.parent_id = 0) as budgetTypeValue,
+            (select di.dict_name from c_dict_info di where di.type = 1 and di.dict_value = pcb.task_detail and di.parent_id =
+            (select di.id from c_dict_info di where di.type = 1 and di.dict_value = pcb.budget_type and di.parent_id = 0)) as taskDetailValue,
             (select cri.returned_condition from c_contract_returned_info cri where cri.id = pcb.contract_returned_id) as returnedValue
         FROM c_project_cost_budget pcb WHERE pcb.project_id = #{id} AND pcb.approve = 1
     </select>
-    <select id="getAllChildrenPlan" resultType="org.springblade.control.entity.ProjectCostBudget">
-        SELECT * FROM c_project_cost_budget  WHERE project_id = #{id} AND parent_id is not null
-    </select>
+
     <select id="getDepartmentPlan" resultType="org.springblade.control.vo.ProjectCostBudgetVO">
         select pcb.*,
                case pcb.status
@@ -128,6 +130,18 @@
             resultType="org.springblade.control.entity.ProjectCostBudget">
         select * from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.project_id = #{projectId} and pcb.task_approve = 1
     </select>
+    <select id="getYearStaffDisburse" resultType="java.math.BigDecimal">
+        SELECT SUM(actual_total_money)
+        from c_project_cost_budget WHERE DATE_FORMAT(plan_end_time,'%Y') = #{year} and task_approve = 1
+    </select>
+    <select id="getAllChildrenPlan" resultType="org.springblade.control.vo.ProjectCostBudgetVO2">
+        SELECT pcb.plan_task_type,pcb.plan_task_desc,pcb.plan_target,pcb.plan_start_time,pcb.plan_end_time,pcb.plan_days,id,parent_id,
+               (select cpp.name from c_project_process cpp where cpp.id = pcb.project_process) as projectProcessValue,
+               (select di.dict_name from c_dict_info di where di.type = 1 and di.dict_value = pcb.budget_type and di.parent_id = 0) as budgetTypeValue,
+               (select di.dict_name from c_dict_info di where di.type = 1 and di.dict_value = pcb.task_detail and di.parent_id =
+                                                                                                                  (select di.id from c_dict_info di where di.type = 1 and di.dict_value = pcb.budget_type and di.parent_id = 0)) as taskDetailValue
+        FROM c_project_cost_budget pcb WHERE pcb.project_id = #{id} AND pcb.parent_id > 0
+    </select>
 
 
 </mapper>

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

@@ -7,6 +7,7 @@ import org.springblade.control.entity.DictInfo;
 import org.springblade.control.vo.*;
 import org.springblade.core.mp.base.BaseService;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -31,4 +32,8 @@ public interface IAnnualBudgetService extends BaseService<AnnualBudget> {
     AnnualBudgetVO2 preview(Long id);
 
     List<DictInfoVO> getSecondSubject();
+
+    AnnualBudgetVO3 portalAnnualTarget();
+
+    Map<String, BigDecimal> portalAnnualCost(String year);
 }

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

@@ -12,6 +12,7 @@ import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.support.Query;
 import org.springblade.system.entity.DictBiz;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -37,4 +38,6 @@ public interface IContractInfoService extends BaseService<ControlContractInfo> {
     List<ControlContractInfoVO> getPage(ControlContractInfoDTO dto,Query query);
 
     List<ControlContractInfo> getList();
+
+    BigDecimal getYearContractMoney(int year);
 }

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

@@ -30,4 +30,7 @@ public interface IContractReturnedInfoService extends BaseService<ContractReturn
     List<ContractReturnedInfoVO> getListByContractId(Long contractId);
 
     List<ContractReturnedInfoVO> getListByProjectId(Long projectId);
+
+    //获取指定一年的回款
+    BigDecimal getYearReturned(int year);
 }

+ 4 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java

@@ -14,6 +14,7 @@ import org.springblade.control.vo.ProjectCostBudgetVO3;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.support.Query;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.List;
 import java.util.Map;
@@ -33,7 +34,7 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
 
     void deleteByProjectId(Long projectId);
     //分页获取列表
-    ControlProjectInfoVO page(ControlProjectInfoDTO dto, Query query);
+    List<ControlProjectInfoVO> page(ControlProjectInfoDTO dto, Query query);
     //根据id获取项目计划
     ProjectCostBudgetVO getPlanByProjectId(Long id);
     //修改项目计划
@@ -58,4 +59,6 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     List<ProjectCostBudget> getProjectAllFinishedTask(Long projectId,Integer costType);
 
     List<ProjectCostBudget> getAllPracticalBudgetByProjectId(Long projectId);
+
+    BigDecimal getYearStaffDisburse(int year);
 }

+ 79 - 4
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -16,6 +16,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -32,6 +33,12 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
 
     private final IAnnualBudgetDisburseService disburseService;
 
+    private final IContractReturnedInfoService returnedInfoService;
+
+    private final IProjectCostBudgetService budgetService;
+
+    private final IContractInfoService contractInfoService;
+
     /**
      * 新增年度经营预算
      * @param dto
@@ -50,11 +57,11 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         BigDecimal contractTotal = map2.get("1");
         BigDecimal planReturnedTotal = map2.get("2");
 
-        //总经营预算
+        //总经营预算,所有支出总额
         dto.setTotalBudget(disburseTotal);
-        //年度合同指标
-        dto.setAnnualContractTarget(contractTotal);
-        //年度利润指标
+        //年度合同指标,预计本年度回款总额
+        dto.setAnnualContractTarget(planReturnedTotal);
+        //年度利润指标, 合同指标减经营预算
         dto.setAnnualProfitTarget(planReturnedTotal.subtract(disburseTotal));
         //人工成本
         dto.setStaffCost(staffTotal);
@@ -290,6 +297,74 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         return allBudgetSubject;
     }
 
+    /**
+     * 门户-年度指标统计 ,统计今年的
+     */
+    @Override
+    public AnnualBudgetVO3 portalAnnualTarget() {
+        AnnualBudgetVO3 vo3 = new AnnualBudgetVO3();
+        //获取今年
+        int year = LocalDate.now().getYear();
+        //获取今年的年度预算
+        AnnualBudget annualBudget = baseMapper.getThisYearBudget(year);
+        if (annualBudget == null){
+            throw new ServiceException("请先做年度预算");
+        }
+        //年度利润指标
+        if (annualBudget.getAnnualContractTarget() == null){
+            annualBudget.setAnnualContractTarget(new BigDecimal(0));
+        }
+        if (annualBudget.getAnnualProfitTarget() == null){
+            annualBudget.setAnnualProfitTarget(new BigDecimal(0));
+        }
+        vo3.setAnnualProfitTarget(annualBudget.getAnnualProfitTarget());
+        //年度合同指标
+        vo3.setAnnualContractTarget(annualBudget.getAnnualContractTarget());
+        //获取今年的已收入:合同回款
+        BigDecimal yearReturned = returnedInfoService.getYearReturned(year);
+        vo3.setYearReturned(yearReturned);
+        //统计今年的已盈利:已收入-支出 ,目前已支出只统计闭环的计划
+        //获取一年人工支出
+        BigDecimal yearStaffDisburse = budgetService.getYearStaffDisburse(year);
+        vo3.setYearProfit(yearReturned.subtract(yearStaffDisburse));
+        //合同进度统计
+        if (vo3.getAnnualContractTarget() == null || vo3.getAnnualContractTarget().compareTo(BigDecimal.ZERO) == 0 || vo3.getYearReturned().compareTo(BigDecimal.ZERO) == 0){
+            vo3.setContractSchedule(0);
+        }else {
+            vo3.setContractSchedule(vo3.getYearReturned().divide(vo3.getAnnualContractTarget(),2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue());
+        }
+        //利润进度统计
+        if (vo3.getAnnualProfitTarget() == null || vo3.getAnnualProfitTarget().compareTo(BigDecimal.ZERO) == 0 || vo3.getYearProfit().compareTo(BigDecimal.ZERO) == 0){
+            vo3.setProfitSchedule(0);
+        }else {
+            vo3.setProfitSchedule(vo3.getYearProfit().divide(vo3.getAnnualProfitTarget(),2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue());
+        }
+        return vo3;
+    }
+
+    /**
+     * 门户-年度各项费用统计
+     */
+    @Override
+    public Map<String, BigDecimal> portalAnnualCost(String year) {
+        int y = Integer.parseInt(year);
+        Map<String,BigDecimal> map = new HashMap<>();
+        //总合同:当年所有合同金额
+        BigDecimal yearContractMoney = contractInfoService.getYearContractMoney(y);
+        map.put("yearContractMoney",yearContractMoney);
+        //总实际收入:当年所有回款
+        BigDecimal yearReturned = returnedInfoService.getYearReturned(y);
+        map.put("yearReturned",yearReturned);
+        //总实际支出:当年所有报销支出,和人工支出
+        BigDecimal yearStaffDisburse = budgetService.getYearStaffDisburse(y);
+        map.put("yearStaffDisburse",yearStaffDisburse);
+        //总计划支出:年度预算总计划支出
+        AnnualBudget annualBudget = baseMapper.getThisYearBudget(y);
+        BigDecimal totalBudget = annualBudget.getTotalBudget();
+        map.put("totalBudget",totalBudget);
+        return map;
+    }
+
     /**
      * 统计支出 1支出总和2工资总和
      */

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

@@ -132,4 +132,18 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
     public List<ControlContractInfo> getList() {
         return baseMapper.getList();
     }
+
+    /**
+     * 获取当年所有合同金额总和
+     * @param year
+     * @return
+     */
+    @Override
+    public BigDecimal getYearContractMoney(int year) {
+        BigDecimal decimal = baseMapper.getYearContractMoney(year);
+        if (decimal == null){
+            return new BigDecimal(0);
+        }
+        return decimal;
+    }
 }

+ 14 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractReturnedInfoServiceImpl.java

@@ -83,4 +83,18 @@ public class ContractReturnedInfoServiceImpl extends BaseServiceImpl<ContractRet
     public List<ContractReturnedInfoVO> getListByProjectId(Long projectId) {
         return baseMapper.getListByProjectId(projectId);
     }
+
+    /**
+     * 获取指定一年的回款
+     * @param year
+     * @return
+     */
+    @Override
+    public BigDecimal getYearReturned(int year) {
+        BigDecimal yearReturned = baseMapper.getYearReturned(year);
+        if (yearReturned == null){
+            return new BigDecimal(0);
+        }
+        return yearReturned;
+    }
 }

+ 53 - 12
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -122,7 +122,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
     }
 
     @Override
-    public ControlProjectInfoVO page(ControlProjectInfoDTO dto, Query query) {
+    public List<ControlProjectInfoVO> page(ControlProjectInfoDTO dto, Query query) {
         IPage page = new Page(query.getCurrent(), query.getSize());
         return baseMapper.page(page,dto);
     }
@@ -142,15 +142,42 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         //获取项目下所有已审批的计划
         List<ProjectCostBudgetVO2> list = baseMapper.getApprovePlan(id);
         //获取项目下所有的子计划
-        List<ProjectCostBudget> childrenList = baseMapper.getAllChildrenPlan(id);
-        //把子计划按parentId分组
-        Map<Long, List<ProjectCostBudget>> listMap = childrenList.parallelStream()
-                .collect(Collectors.groupingBy(ProjectCostBudget::getParentId));
-        Set<Long> key = listMap.keySet();
-        //把子计划插入计划里
-        for (ProjectCostBudgetVO2 vo2 : list) {
-            if (key.contains(vo2.getId())){
-                vo2.setChildrenList(listMap.get(vo2.getId()));
+        List<ProjectCostBudgetVO2> childrenList = baseMapper.getAllChildrenPlan(id);
+        if (childrenList != null && childrenList.size() >0) {
+            //把子计划按parentId分组
+            Map<Long, List<ProjectCostBudgetVO2>> listMap = childrenList.parallelStream()
+                    .collect(Collectors.groupingBy(ProjectCostBudgetVO2::getParentId));
+            Set<Long> key = listMap.keySet();
+            //循环所有父计划
+            for (ProjectCostBudgetVO2 vo2 : list) {
+                if (vo2.getTaskApprove() == 1) {
+                        vo2.setTaskFinishedStatus(2);
+                }
+                //如果子计划,把子计划插入计划里
+                if (key.contains(vo2.getId())) {
+                    //如果计划已经完成,则不计算超时
+                    if (vo2.getTaskFinishedStatus() == null) {
+                        //有子计划,判断子计划加起来是否超过预算天数
+                        BigDecimal workDays = new BigDecimal(0);
+                        List<ProjectCostBudgetVO2> vo2List = listMap.get(vo2.getId());
+                        for (ProjectCostBudgetVO2 budgetVO2 : vo2List) {
+                            if (budgetVO2.getPlanDays() != null) {
+                                workDays = workDays.add(budgetVO2.getPlanDays());
+                            }
+                        }
+                        if (workDays.compareTo(vo2.getBudgetDays()) == 1) {
+                            vo2.setTaskFinishedStatus(1);
+                        }
+                    }
+                    vo2.setChildrenList(listMap.get(vo2.getId()));
+                }else {
+                    //没有子计划,则计划父计划的时间是否超时
+                    if (vo2.getTaskFinishedStatus() == null && vo2.getPlanDays() != null){
+                        if (vo2.getPlanDays().compareTo(vo2.getBudgetDays()) == 1) {
+                            vo2.setTaskFinishedStatus(1);
+                        }
+                    }
+                }
             }
         }
         //根据单位分类
@@ -201,7 +228,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         List<ProjectCostBudget> parentList = new ArrayList<>();
         //把所有子计划分离出来,并且设置父类id
         for (ProjectCostBudgetVO2 vo2 : list) {
-            List<ProjectCostBudget> vo2ChildrenList = vo2.getChildrenList();
+            List<ProjectCostBudgetVO2> vo2ChildrenList = vo2.getChildrenList();
             if (vo2ChildrenList != null && vo2ChildrenList.size() > 0){
                 //有子计划
                 for (ProjectCostBudget budget : vo2ChildrenList) {
@@ -397,7 +424,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 
     /**
      * 获取项目的所有实际费用
-     * @param id
+     * @param projectId
      * @return
      */
     @Override
@@ -405,6 +432,20 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         return baseMapper.getAllPracticalBudgetByProjectId(projectId);
     }
 
+    /**
+     * 获取一年的人工支出
+     * @param year
+     * @return
+     */
+    @Override
+    public BigDecimal getYearStaffDisburse(int year) {
+        BigDecimal yearStaffDisburse = baseMapper.getYearStaffDisburse(year);
+        if (yearStaffDisburse == null){
+            return new BigDecimal(0);
+        }
+        return yearStaffDisburse;
+    }
+
     /**
      * 统计一行的几个总金额
      */

+ 9 - 0
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -2577,4 +2577,13 @@ public class CustomFunction {
     }
 
 
+    public static void main(String[] args) {
+        List<Double> list1 = Arrays.asList(8.2);
+        List<Double> list2 = Arrays.asList(7.9);
+        Map<String,Object> map = new HashMap<>();
+        map.put("A",list1);
+        map.put("B",list2);
+        System.out.println(Expression.parse("A-B").calculate(map).toString());
+    }
+
 }

+ 7 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -116,6 +116,7 @@
         <result column="reviewer" property="reviewer"/>
         <result column="specification" property="specification"/>
         <result column="archive_name_suffix" property="archiveNameSuffix"/>
+        <result column="tree_number" property="treeNumber"/>
     </resultMap>
 
 
@@ -215,7 +216,12 @@
         d.archive_name_suffix,
         d.contract_id,
         (SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_archive_tree_contract WHERE parent_id = d.id and is_deleted = 0 and project_id = #{projectId})
-        AS "has_children"
+        AS "has_children",
+        (SELECT  count(1)  FROM m_archive_tree_contract WHERE  is_deleted = 0 and project_id = #{projectId} and ancestors like CONCAT('%',d.id,'%')
+        <if test="code!=null and code!=''">
+            AND (tree_code = #{code} or tree_code = #{contractId} or parent_id = 0)
+        </if>
+        ) as tree_number
         FROM
         m_archive_tree_contract d
         WHERE

+ 11 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -715,6 +715,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                         Map<String, Object> currentMap = new HashMap<>(tec.constantMap);
                         List<String>  relyList = fd.getFormula().getRelyList();
                         if(CollectionUtil.isNotEmpty(relyList)){
+                            /*存在依赖*/
                             List<FormData>  ele = new ArrayList<>();
                             relyList.forEach(rely->{
                                 FormData formData=  this.tec.getFormDataMap().get(rely);
@@ -768,13 +769,19 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             }else{
                                 @SuppressWarnings("unchecked")
                                 Map<String,Object> em = (Map<String, Object>) currentMap.computeIfAbsent(E,(k)-> new HashMap<>());
-                                ele.forEach(e->{
-                                    em.put(e.getCode(),e.getValues().stream().map(ElementData::getValue).collect(Collectors.toList()));
-                                });
+                                if(ele.stream().map(e->e.getCoordsList().size()).max(Comparator.comparingInt(e->e)).orElse(1)==1&&fd.getCoordsList().size()==1){
+                                    ele.forEach(e->{
+                                        em.put(e.getCode(),e.getValues().get(0).getValue());
+                                    });
+                                }else{
+                                    ele.forEach(e->{
+                                        em.put(e.getCode(),e.getValues().stream().map(ElementData::getValue).collect(Collectors.toList()));
+                                    });
+                                }
                                 Object data =Expression.parse(formula.getFormula()).calculate(currentMap);
                                 write(fd,data);
                             }
-                            /*重置*/
+                            /*错位计算偏移量重置*/
                             ele.stream().filter(s->s.getOffset()>0).forEach(FormData::restore);
                         }else{
                             Object data =Expression.parse(formula.getFormula()).calculate(currentMap);