Browse Source

Merge branch 'master' of http://47.110.251.215:3000/java_org/bladex

huangtf 2 năm trước cách đây
mục cha
commit
0fe8480f41
44 tập tin đã thay đổi với 1014 bổ sung161 xóa
  1. 29 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/DepartmentMonthPlanDTO.java
  2. 6 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/UserpayInfo.java
  3. 31 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/BudgetAndPracticalByManageVO.java
  4. 27 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/BudgetAndPracticalVO.java
  5. 6 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMFinancialReimbursementInfoVO.java
  6. 69 40
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  7. 0 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java
  8. 20 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java
  9. 2 1
      blade-service/blade-control/src/main/java/org/springblade/control/controller/DepartmentMonthPlanController.java
  10. 2 2
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ExMaTwoController.java
  11. 3 1
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectCostBudgetController.java
  12. 4 4
      blade-service/blade-control/src/main/java/org/springblade/control/excel/UserpayExcel.java
  13. 6 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetDisburseMapper.java
  14. 10 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetDisburseMapper.xml
  15. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.java
  16. 7 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.xml
  17. 2 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentMonthPlanMapper.java
  18. 6 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentMonthPlanMapper.xml
  19. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java
  20. 16 9
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml
  21. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.java
  22. 7 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml
  23. 5 2
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/UserpayInfoMapper.xml
  24. 9 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetDisburseService.java
  25. 6 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetService.java
  26. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IContractReturnedInfoService.java
  27. 2 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/IDepartmentMonthPlanService.java
  28. 9 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java
  29. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectInfoService.java
  30. 144 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetDisburseServiceImpl.java
  31. 149 8
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java
  32. 29 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractReturnedInfoServiceImpl.java
  33. 2 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentMonthPlanServiceImpl.java
  34. 12 8
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMOutsourcingPayServiceImpl.java
  35. 38 42
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java
  36. 3 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/PlanInformServiceImpl.java
  37. 194 20
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java
  38. 29 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java
  39. 54 16
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java
  40. 3 2
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  41. 10 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  42. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  43. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  44. 46 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

+ 29 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/DepartmentMonthPlanDTO.java

@@ -0,0 +1,29 @@
+package org.springblade.control.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.DepartmentMonthPlan;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/7/27 18:01
+ **/
+@Data
+public class DepartmentMonthPlanDTO {
+
+    @ApiModelProperty(value = "部门类型")
+    private Integer departmentType;
+
+
+    @ApiModelProperty(value = "计划开始日期")
+    private String planStartDate;
+
+    @ApiModelProperty(value = "计划结束日期")
+    private String planEndDate;
+}

+ 6 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/UserpayInfo.java

@@ -46,6 +46,12 @@ public class UserpayInfo extends BaseEntity {
     @ApiModelProperty(value = "用户id主键")
     private Long userId;
 
+    /**
+     * 用户id主键
+     */
+    @ApiModelProperty(value = "用户名称")
+    private String name;
+
     /**
      * yyyy-mm 格式
      */

+ 31 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/BudgetAndPracticalByManageVO.java

@@ -0,0 +1,31 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/7/24 14:22
+ **/
+@Data
+public class BudgetAndPracticalByManageVO {
+
+    @ApiModelProperty(value = "时间")
+    private String time;
+
+    @ApiModelProperty(value = "人工成本预算支出")
+    private BigDecimal disburse1;
+
+    @ApiModelProperty(value = "人工成本实际支出")
+    private BigDecimal disburse2;
+
+    @ApiModelProperty(value = "管理成本预算支出")
+    private BigDecimal disburse3;
+
+    @ApiModelProperty(value = "管理成本实际支出")
+    private BigDecimal disburse4;
+
+}

+ 27 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/BudgetAndPracticalVO.java

@@ -0,0 +1,27 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/7/27 14:25
+ **/
+@Data
+public class BudgetAndPracticalVO {
+
+    @ApiModelProperty(value = "总经营收入预算")
+    private BigDecimal budgetInput;
+
+    @ApiModelProperty(value = "总经营支出预算")
+    private BigDecimal budgetOutput;
+
+    @ApiModelProperty(value = "总经营实际收入")
+    private BigDecimal practicalInput;
+
+    @ApiModelProperty(value = "总经营实际支出")
+    private BigDecimal practicalOutput;
+}

+ 6 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMFinancialReimbursementInfoVO.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.control.entity.EMFinancialReimbursementInfo;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 @Data
@@ -41,4 +42,9 @@ public class EMFinancialReimbursementInfoVO extends EMFinancialReimbursementInfo
     @ApiModelProperty("创建时间")
     private Date createTime;
 
+    @ApiModelProperty(value = "借款信息")
+    private String deductLoanInfo;
+
+    @ApiModelProperty(value = "借款剩余未还金额")
+    private BigDecimal loanOutstandingBalance;
 }

+ 69 - 40
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -51,6 +51,9 @@ import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
@@ -1404,36 +1407,35 @@ public class InformationWriteQueryController extends BladeController {
                     nodeMap.put(node.getId().toString(), node);
                 });
 
-                String finalTabOwner1 = tabOwner;
-                nodeChildAll.forEach(node -> {
+                for (WbsTreeContract nodeOld : nodeChildAll) {
                     WbsTreeContract newData = new WbsTreeContract();
-                    BeanUtils.copyProperties(node, newData);
+                    BeanUtils.copyProperties(nodeOld, newData);
                     //重塑关键信息
                     //重塑primaryKeyId
                     newData.setPKeyId(SnowFlakeUtil.getId());
                     //设置旧ID
-                    if (StringUtils.isNotEmpty(node.getOldId())) {
-                        newData.setOldId(node.getOldId());
+                    if (StringUtils.isNotEmpty(nodeOld.getOldId())) {
+                        newData.setOldId(nodeOld.getOldId());
                     } else {
-                        newData.setOldId(node.getId().toString());
+                        newData.setOldId(nodeOld.getId().toString());
                     }
 
                     //设置新ID
-                    if (new Integer("1").equals(node.getType())) {
+                    if (new Integer("1").equals(nodeOld.getType())) {
                         //如果是节点类型才重塑ID
-                        newData.setId(oldToNewIdMap.containsKey(node.getId()) ? oldToNewIdMap.get(node.getId()) : SnowFlakeUtil.getId());
+                        newData.setId(oldToNewIdMap.containsKey(nodeOld.getId()) ? oldToNewIdMap.get(nodeOld.getId()) : SnowFlakeUtil.getId());
                         //划分编号
                         newData.setPartitionCode(StringUtils.isNotEmpty(vo.getPartitionCode()) ? vo.getPartitionCode() : null);
                     }
                     //设置父节点ID
-                    if (vo.getNeedCopyPrimaryKeyId().equals(node.getPKeyId().toString())) {
+                    if (vo.getNeedCopyPrimaryKeyId().equals(nodeOld.getPKeyId().toString())) {
                         //找到复制的节点,将parentId更改为 parent.getId()
                         newData.setParentId(parent.getId());
                         //设置新名称
                         newData.setNodeName(vo.getNeedCopyNodeName());
                         newData.setFullName(vo.getNeedCopyNodeName());
                     } else {
-                        newData.setParentId(oldToNewIdMap.containsKey(node.getParentId()) ? oldToNewIdMap.get(node.getParentId()) : SnowFlakeUtil.getId());
+                        newData.setParentId(oldToNewIdMap.containsKey(nodeOld.getParentId()) ? oldToNewIdMap.get(nodeOld.getParentId()) : SnowFlakeUtil.getId());
                     }
                     newData.setCreateTime(new Date());
                     newData.setUpdateTime(new Date());
@@ -1450,13 +1452,13 @@ public class InformationWriteQueryController extends BladeController {
                     this.restoreParent(newData, oldToNewIdMap);
                     //保存到集合中
                     saveList.add(newData);
-                    if (new Integer("6").equals(node.getNodeType())) {
+                    if (new Integer("6").equals(nodeOld.getNodeType())) {
                         //生成施工日志
                         this.createLedger(newData, saveLedger, nodeMap, null);
                     }
                     //表单所属方,只有勾选了对应的所属方权限才复制数据;勾选了复制数据才能复制,否则只是创建节点、表
                     //组织复制值Sql
-                    if (node.getType() == 2 && StringUtils.isNotEmpty(newData.getInitTableName()) && finalTabOwner1.contains(node.getTableOwner()) && vo.getIsCopyData() == 1) {
+                    if (nodeOld.getType() == 2 && StringUtils.isNotEmpty(newData.getInitTableName()) && tabOwner.contains(nodeOld.getTableOwner()) && vo.getIsCopyData() == 1) {
                         String tableName = newData.getInitTableName();
                         String col = nodeTabColsMap.get(tableName);
                         String colVal = nodeTabColsMap.get(tableName);
@@ -1464,25 +1466,36 @@ public class InformationWriteQueryController extends BladeController {
                         //delete SQL (先删除旧数据,再新增)
                         String delSql = "delete from " + tableName + " where p_key_id = " + newData.getPKeyId() + " ; ";
                         //insert into SQL
-                        copeSql.append(delSql).append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(colVal).append(" from ").append(tableName).append(" where p_key_id='").append(node.getPKeyId()).append("' ;");
+                        copeSql.append(delSql).append("insert into ").append(tableName).append(" (").append(col).append(") select ").append(colVal).append(" from ").append(tableName).append(" where p_key_id='").append(nodeOld.getPKeyId()).append("' ;");
                     }
-                });
+                }
             }
             needCopyNode.setNodeName(vo.getNeedCopyNodeName());
+
             //复制保存节点、表信息
             R<Boolean> booleanR = this.saveOrCopyNodeTree(saveList, saveLedger, 32, needCopyNode);
 
+            try {
+                //复制表单数据
+                if (copeSql.length() >= 10 && booleanR.getData()) {
+                    jdbcTemplate.execute(copeSql.toString());
+                }
+            } catch (Exception e) {
+                //手动回滚,删除节点、表
+                List<String> collect = saveList.stream().map(WbsTreeContract::getPKeyId).map(String::valueOf).collect(Collectors.toList());
+                if (collect.size() > 0) {
+                    jdbcTemplate.execute("delete from m_wbs_tree_contract where p_key_id in(" + StringUtils.join(collect, ",") + ")");
+                }
+                e.printStackTrace();
+                throw new ServiceException("保存数据异常,请联系管理员");
+            }
+
             //复制元素表附件信息
             List<WbsTreeContract> newTabs = saveList.stream().filter(f -> (new Integer(2).equals(f.getType()))).collect(Collectors.toList());
             if (newTabs.size() > 0 && oldTabs.size() > 0 && vo.getIsCopyData() == 1) {
                 this.addCopyTabFile(new HashSet<>(newTabs), oldTabs);
             }
 
-            //复制表单数据
-            if (copeSql.length() >= 10) {
-                jdbcTemplate.execute(copeSql.toString());
-            }
-
             //更新redis缓存
             informationQueryService.delAsyncWbsTree(needCopyNode.getContractId());
 
@@ -1651,9 +1664,21 @@ public class InformationWriteQueryController extends BladeController {
 
                     if (resultTablesData.size() > 0 && vo.getIsCopyData() == 1) {
                         //复制新增表数据
-                        List<List<String>> partition = Lists.partition(resultTablesData, 20);
-                        for (List<String> strings : partition) {
-                            jdbcTemplate.execute(StringUtils.join(strings, ""));
+                        try {
+                            List<List<String>> partition = Lists.partition(resultTablesData, 20);
+                            for (List<String> strings : partition) {
+                                jdbcTemplate.execute(StringUtils.join(strings, ""));
+                            }
+                        } catch (Exception e) {
+                            //手动回滚,删除节点、表
+                            List<String> collect1 = nodes.stream().map(WbsTreeContract::getPKeyId).map(String::valueOf).collect(Collectors.toList());
+                            List<String> collect2 = tabs.stream().map(WbsTreeContract::getPKeyId).map(String::valueOf).collect(Collectors.toList());
+                            collect1.addAll(collect2);
+                            if (collect1.size() > 0) {
+                                jdbcTemplate.execute("delete from m_wbs_tree_contract where p_key_id in(" + StringUtils.join(collect1, ",") + ")");
+                            }
+                            e.printStackTrace();
+                            throw new ServiceException("保存数据异常,请联系管理员");
                         }
                     }
 
@@ -1721,7 +1746,8 @@ public class InformationWriteQueryController extends BladeController {
      * 新增复制的表单文件
      */
     @Async
-    public void addCopyTabFile(Set<WbsTreeContract> addChildNodesTables, Set<WbsTreeContract> addChildNodesTablesOld) {
+    public void addCopyTabFile
+    (Set<WbsTreeContract> addChildNodesTables, Set<WbsTreeContract> addChildNodesTablesOld) {
         //获取所有数据源附件文件
         List<Long> tabFileIds = addChildNodesTablesOld.stream().distinct().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
         Map<String, List<TableFile>> tableFileOldMap = tableFileClient.getTabFilesByTabIds(StringUtils.join(tabFileIds, ",")).stream().collect(Collectors.groupingBy(TableFile::getTabId));
@@ -1775,7 +1801,9 @@ public class InformationWriteQueryController extends BladeController {
     /**
      * 新增复制的数据
      */
-    private void addCopyTabData(WbsTreeContract needCopyNode, WbsTreeContract toCopyNode, String tabOwner, List<String> resultTablesData, List<WbsTreeContract> addChildNodesTablesAll, Integer isCopyData, Set<WbsTreeContract> addNewFileTabs) {
+    private void addCopyTabData(WbsTreeContract needCopyNode, WbsTreeContract toCopyNode, String
+            tabOwner, List<String> resultTablesData, List<WbsTreeContract> addChildNodesTablesAll, Integer
+                                        isCopyData, Set<WbsTreeContract> addNewFileTabs) {
         List<WbsTreeContract> wbsTreeContractsNeed = Collections.singletonList(needCopyNode);
         List<WbsTreeContract> wbsTreeContractsTo = Collections.singletonList(toCopyNode);
         List<WbsTreeContract> needCopyNodeTabs = this.getChildNodesTables(wbsTreeContractsNeed, needCopyNode.getContractId());
@@ -1867,7 +1895,10 @@ public class InformationWriteQueryController extends BladeController {
     /**
      * 新增复制的节点、表的数据构造
      */
-    private void addCopyNodesAndTabsBuildData(List<WbsTreeContract> addNodeList, List<WbsTreeContract> addTabList, List<WbsTreeContract> needNodes, List<WbsTreeContract> needTabs, WbsTreeContract needCopyNode, WbsTreeContract toCopyNode, List<String> resultTablesData, Integer isSameNode, String tabOwner, Integer isCopyData) {
+    private void addCopyNodesAndTabsBuildData
+    (List<WbsTreeContract> addNodeList, List<WbsTreeContract> addTabList, List<WbsTreeContract> needNodes, List<WbsTreeContract> needTabs, WbsTreeContract
+            needCopyNode, WbsTreeContract toCopyNode, List<String> resultTablesData, Integer isSameNode, String
+             tabOwner, Integer isCopyData) {
         int var = 0;
         if (needNodes.size() == 1) {
             //判断是否为最下级节点
@@ -2081,7 +2112,8 @@ public class InformationWriteQueryController extends BladeController {
     /**
      * 递归获取所有子级节点
      */
-    private void recursionGetChildNodes(List<WbsTreeContract> list, List<WbsTreeContract> result, String contractId) {
+    private void recursionGetChildNodes(List<WbsTreeContract> list, List<WbsTreeContract> result, String
+            contractId) {
         List<Long> ids = list.stream().map(WbsTreeContract::getId).collect(Collectors.toList());
         if (ids.size() > 0) {
             List<WbsTreeContract> query = jdbcTemplate.query("select * from m_wbs_tree_contract where type = 1 and parent_id in(" + StringUtils.join(ids, ",") + ") and status = 1 and is_deleted = 0 and contract_id = " + contractId, new BeanPropertyRowMapper<>(WbsTreeContract.class));
@@ -2906,7 +2938,9 @@ public class InformationWriteQueryController extends BladeController {
         }
     }
 
-    private List<WbsTreePrivate> unifiedCode(List<AddContractTreeNodeVO.Node> allSelectedNodeList, WbsTreeContract treeContract, String saveType, List<WbsTreePrivate> queryResultP) {
+    private List<WbsTreePrivate> unifiedCode
+            (List<AddContractTreeNodeVO.Node> allSelectedNodeList, WbsTreeContract treeContract, String
+                    saveType, List<WbsTreePrivate> queryResultP) {
         //获取项目节点树的主键
         List<Long> halfSelectedList = allSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).map(Long::parseLong).distinct().collect(Collectors.toList());
 
@@ -2931,13 +2965,10 @@ public class InformationWriteQueryController extends BladeController {
     }
 
     @NotNull
-    private R<Boolean> saveOrCopyNodeTree
-            (List<WbsTreeContract> saveList, List<ConstructionLedger> saveLedger, Integer
-                    operationType, WbsTreeContract currentNode) {
-
+    public R<Boolean> saveOrCopyNodeTree(List<WbsTreeContract> saveList, List<ConstructionLedger> saveLedger, Integer operationType, WbsTreeContract currentNode) {
         if (saveList.size() > 0) {
-//            StringBuilder str = new StringBuilder();
-//            str.append("-" + saveList.get(0).getFullName());
+            //StringBuilder str = new StringBuilder();
+            //str.append("-" + saveList.get(0).getFullName());
             //保存施工日志
             /*if (saveLedger.size() > 0) {
                 this.constructionLedgerService.saveBatch(saveLedger, 1000);
@@ -2978,13 +3009,10 @@ public class InformationWriteQueryController extends BladeController {
     }
 
     @NotNull
-    private R<Boolean> saveOrCopyNodeTree2
-            (List<WbsTreeContract> saveList, List<ConstructionLedger> saveLedger, Integer
-                    operationType, WbsTreeContract currentNode) {
-
+    private R<Boolean> saveOrCopyNodeTree2(List<WbsTreeContract> saveList, List<ConstructionLedger> saveLedger, Integer operationType, WbsTreeContract currentNode) {
         if (saveList.size() > 0) {
-//            StringBuilder str = new StringBuilder();
-//            str.append("-" + saveList.get(0).getFullName());
+            //StringBuilder str = new StringBuilder();
+            //str.append("-" + saveList.get(0).getFullName());
             //保存施工日志
             /*if (saveLedger.size() > 0) {
                 this.constructionLedgerService.saveBatch(saveLedger, 1000);
@@ -3035,7 +3063,8 @@ public class InformationWriteQueryController extends BladeController {
     /**
      * 处理半选集合
      */
-    private void disposeHalfSelectList(@RequestBody WbsTreeContract treeContract, List<AddContractTreeNodeVO.Node> allSelectedNodeList, List<WbsTreePrivate> selectedNodeList, List<WbsTreePrivate> queryResultP) {
+    private void disposeHalfSelectList(@RequestBody WbsTreeContract
+                                               treeContract, List<AddContractTreeNodeVO.Node> allSelectedNodeList, List<WbsTreePrivate> selectedNodeList, List<WbsTreePrivate> queryResultP) {
         if (allSelectedNodeList != null && allSelectedNodeList.size() > 0) {
             //获取主键
             List<Long> allSelectedList = allSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).map(Long::parseLong).distinct().collect(Collectors.toList());

+ 0 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java

@@ -16,7 +16,6 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 

+ 20 - 0
blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java

@@ -257,4 +257,24 @@ public class AnnualBudgetController {
         return R.data(budgetService.budgetAndPracticalByDept(year));
     }
 
+    /**
+     * 预算与实际统计-人工和管理统计
+     */
+    @GetMapping("/budgetAndPracticalByManage")
+    @ApiOperationSupport(order = 18)
+    @ApiOperation(value = "预算与实际统计-人工和管理统计",notes = "传入年:2023年")
+    public R<List<BudgetAndPracticalByManageVO>> budgetAndPracticalByManage(String year) {
+        return R.data(budgetService.budgetAndPracticalByManage(year));
+    }
+
+    /**
+     * 预算与实际统计-总经营
+     */
+    @GetMapping("/budgetAndPracticalByBusiness")
+    @ApiOperationSupport(order = 19)
+    @ApiOperation(value = "预算与实际统计-总经营",notes = "传入年:2023年")
+    public R<BudgetAndPracticalVO> budgetAndPracticalByBusiness(String year) {
+        return R.data(budgetService.budgetAndPracticalByBusiness(year));
+    }
+
 }

+ 2 - 1
blade-service/blade-control/src/main/java/org/springblade/control/controller/DepartmentMonthPlanController.java

@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springblade.control.dto.ControlContractInfoDTO;
+import org.springblade.control.dto.DepartmentMonthPlanDTO;
 import org.springblade.control.dto.ProjectCostBudgetDTO;
 import org.springblade.control.entity.DepartmentMonthPlan;
 import org.springblade.control.entity.DictInfo;
@@ -41,7 +42,7 @@ public class DepartmentMonthPlanController {
     @GetMapping("/getPage")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "部门月计划分页")
-    public R<List<DepartmentMonthPlanVO>> getPage(ControlContractInfoDTO dto, Query query) {
+    public R<List<DepartmentMonthPlanVO>> getPage(DepartmentMonthPlanDTO dto, Query query) {
         return R.data(planService.getPage(dto,query));
     }
 

+ 2 - 2
blade-service/blade-control/src/main/java/org/springblade/control/controller/ExMaTwoController.java

@@ -233,7 +233,7 @@ public class ExMaTwoController extends BladeController {
     public R<List<String>> getInvoiceContentList() {
         List<DictInfo> query = jdbcTemplate.query("select dict_name from c_dict_info where type = 7", new BeanPropertyRowMapper<>(DictInfo.class));
         if (query.size() > 0) {
-            return R.data(query.stream().map(DictInfo::getDictName).collect(Collectors.toList()));
+            return R.data(query.stream().map(DictInfo::getDictName).distinct().collect(Collectors.toList()));
         }
         return R.data(null);
     }
@@ -276,7 +276,7 @@ public class ExMaTwoController extends BladeController {
     @ApiOperation(value = "获取采购使用单位列表")
     public R<List<String>> getUseOrgNameList() {
         List<EMPurchaseInfo> emPurchaseInfos = emPurchaseService.getBaseMapper().selectList(Wrappers.<EMPurchaseInfo>lambdaQuery().select(EMPurchaseInfo::getUseOrgName).eq(EMPurchaseInfo::getIsTemp, 1));
-        List<String> collect = emPurchaseInfos.stream().map(EMPurchaseInfo::getUseOrgName).collect(Collectors.toList());
+        List<String> collect = emPurchaseInfos.stream().map(EMPurchaseInfo::getUseOrgName).distinct().collect(Collectors.toList());
         return R.data(collect);
     }
 

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

@@ -39,9 +39,11 @@ public class ProjectCostBudgetController {
      */
     @GetMapping("/page")
     @ApiOperationSupport(order = 1)
-    @ApiOperation(value = "分页获取计划列表")
+    @ApiOperation(value = "分页获取计划列表",notes = "搜索值queryValue")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "queryValue", value = "搜索值", required = false),
+            @ApiImplicitParam(name = "projectType", value = "项目类型", required = false),
+            @ApiImplicitParam(name = "projectServerType", value = "项目服务类型", required = false),
     })
     public R<List<ControlProjectInfoVO>> page(ControlProjectInfoDTO dto, Query query){
         return R.data(budgetService.page(dto,query));

+ 4 - 4
blade-service/blade-control/src/main/java/org/springblade/control/excel/UserpayExcel.java

@@ -34,18 +34,18 @@ import java.math.BigDecimal;
 @ColumnWidth(25)
 @HeadRowHeight(20)
 @ContentRowHeight(18)
-public class UserpayExcel implements Serializable {
+public class UserpayExcel{
     private static final long serialVersionUID = 1L;
 
     @ColumnWidth(15)
     @ExcelProperty("姓名")
-    private String userName;
+    private String name;
 
 /*    @ColumnWidth(15)
     @ExcelProperty("薪酬时间")
     private String costTime;*/
 
-
+/*
     @ColumnWidth(15)
     @ExcelProperty(value = "应出勤天数")
     private Integer yaAllDays;
@@ -120,6 +120,6 @@ public class UserpayExcel implements Serializable {
 
     @ColumnWidth(15)
     @ExcelProperty(value = "描述")
-    private String desc;
+    private String desc;*/
 
 }

+ 6 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetDisburseMapper.java

@@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Param;
 import org.springblade.control.entity.AnnualBudgetDisburse;
 import org.springblade.control.entity.AnnualBudgetIncome;
 
+import java.util.List;
+
 /**
  * @Param
  * @Author wangwl
@@ -13,4 +15,8 @@ import org.springblade.control.entity.AnnualBudgetIncome;
 public interface AnnualBudgetDisburseMapper extends BaseMapper<AnnualBudgetDisburse> {
 
     void deleteByAnnualId(@Param("id") Long id);
+
+    List<AnnualBudgetDisburse> budgetCostByYear(@Param("annualId") Long annualId);
+
+    List<AnnualBudgetDisburse> budgetNotCostByYear(@Param("annualId") Long annualId);
 }

+ 10 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetDisburseMapper.xml

@@ -6,4 +6,14 @@
     <delete id="deleteByAnnualId">
         delete from c_annual_budget_disburse where annual_budget_id = #{id}
     </delete>
+    <select id="budgetCostByYear" resultType="org.springblade.control.entity.AnnualBudgetDisburse">
+        SELECT *
+        from c_annual_budget_disburse
+        WHERE annual_budget_id = #{annualId} and budget_subject = 3 and is_deleted = 0
+    </select>
+    <select id="budgetNotCostByYear" resultType="org.springblade.control.entity.AnnualBudgetDisburse">
+        SELECT *
+        from c_annual_budget_disburse
+        WHERE annual_budget_id = #{annualId} and budget_subject != 3 and is_deleted = 0
+    </select>
 </mapper>

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

@@ -32,4 +32,6 @@ public interface ContractReturnedInfoMapper extends BaseMapper<ContractReturnedI
     void deleteByContractId(@Param("contractId") Long contractId);
 
     List<ContractReturnedInfo> getAllMonthReturnedByYear(@Param("year") int y);
+
+    List<ContractReturnedInfo> getAllMonthReturnedByYear2(@Param("year") int y);
 }

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

@@ -54,4 +54,11 @@
             and DATE_FORMAT(practical_returned_time ,'%Y') = #{year}
         </if>
     </select>
+
+    <select id="getAllMonthReturnedByYear2" resultType="org.springblade.control.entity.ContractReturnedInfo">
+        SELECT *
+        from c_contract_returned_info
+        WHERE  is_deleted = 0
+            and DATE_FORMAT(should_returned_time ,'%Y') = #{year}
+    </select>
 </mapper>

+ 2 - 1
blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentMonthPlanMapper.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.control.dto.ControlContractInfoDTO;
 import org.springblade.control.dto.ControlProjectInfoDTO;
+import org.springblade.control.dto.DepartmentMonthPlanDTO;
 import org.springblade.control.entity.ControlProjectInfo;
 import org.springblade.control.entity.DepartmentMonthPlan;
 import org.springblade.control.entity.DictInfo;
@@ -26,7 +27,7 @@ public interface DepartmentMonthPlanMapper extends BaseMapper<DepartmentMonthPla
 
     String getDepartmentName(@Param("departmentType") Integer departmentType);
 
-    List<DepartmentMonthPlanVO> getPage(IPage page,@Param("dto") ControlContractInfoDTO dto,@Param("userId") Long userId);
+    List<DepartmentMonthPlanVO> getPage(IPage page, @Param("dto") DepartmentMonthPlanDTO dto, @Param("userId") Long userId);
 
     List<BladeUser> getDepartmentUserDict(@Param("type") Integer departmentType);
 

+ 6 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentMonthPlanMapper.xml

@@ -28,6 +28,12 @@
                 (select bu.name from blade_user bu WHERE bu.id = dmp.plan_designer) as 'planDesignerName'
         FROM c_department_month_plan dmp
         where dmp.plan_designer = #{userId} and dmp.is_deleted = 0
+        <if test="dto.departmentType != null and dto.departmentType != ''">
+            and dmp.department_type = #{dto.departmentType}
+        </if>
+        <if test="dto.planStartDate != null and dto.planStartDate != ''">
+            and DATE_FORMAT(dmp.plan_start_date ,'%Y-%m') BETWEEN #{dto.planStartDate} AND #{dto.planEndDate}
+        </if>
         order by dmp.plan_start_date desc
     </select>
     <select id="getDepartmentUserDict" resultType="org.springblade.core.secure.BladeUser">

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

@@ -63,8 +63,12 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
     //获取一年人工支出
     BigDecimal getYearStaffDisburse(@Param("year") int year);
 
+    //获取一年的已经闭环的任务,按照任务真实开始结束时间
     List<ProjectCostBudget> getBudgetByYear(@Param("year") int y);
 
+    //获取一年的任务,不管是否闭环,按照任务计划开始结束时间
+    List<ProjectCostBudget> getBudgetByYear2(@Param("year") int y);
+
     List<ProjectCostBudgetVO2> getPlanByMonth(@Param("date") String date);
 
     List<ProjectCostBudget> getRiskPlan(@Param("projectId") Long projectId,@Param("costType") Integer costType);

+ 16 - 9
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml

@@ -35,7 +35,7 @@
             (select di.dict_name from c_dict_info di where di.code = 'cost_type' and di.dict_value = pcb.cost_type) as costTypeValue,
             (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 = 5 and di.dict_value = pcb.budget_type and di.parent_id = 0 and di.is_deleted = 0) as budgetTypeValue,
-            (select di.dict_name from c_dict_info di where di.type = 5 and and di.is_deleted = 0 di.dict_value = pcb.task_detail and di.parent_id =
+            (select di.dict_name from c_dict_info di where di.type = 5 and di.is_deleted = 0 and di.dict_value = pcb.task_detail and di.parent_id =
                 (select di.id from c_dict_info di where di.type = 5 and di.dict_value = pcb.budget_type and di.parent_id = 0 and di.is_deleted = 0)) as taskDetailValue,
             (select di.dict_name from c_dict_info di where di.type = 3 and di.id = pcb.post_type) as postTypeValue
         from c_project_cost_budget pcb
@@ -173,11 +173,11 @@
         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  is_deleted = 0 and task_approve = 1
+        SELECT SUM(pcb.actual_total_money)
+        from c_project_cost_budget pcb
+        WHERE  pcb.is_deleted = 0 and pcb.task_approve = 1 and (select cdi.dict_value from c_dict_info cdi WHERE cdi.id = pcb.plan_task_type) = 1
         <if test="year != 0">
-            and DATE_FORMAT(plan_end_time ,'%Y') = #{year}
+            and DATE_FORMAT(pcb.plan_end_time ,'%Y') = #{year}
         </if>
     </select>
     <select id="getAllChildrenPlan" resultType="org.springblade.control.vo.ProjectCostBudgetVO2">
@@ -189,10 +189,17 @@
                (select di.dict_name from c_dict_info di where di.type = 2 and di.id = pcb.plan_task_type) as planTaskTypeValue
         FROM c_project_cost_budget pcb WHERE pcb.project_id = #{id} AND pcb.parent_id > 0
     </select>
+
     <select id="getBudgetByYear" resultType="org.springblade.control.entity.ProjectCostBudget">
-        select *  from c_project_cost_budget
-        WHERE is_deleted = 0 and task_approve = 1 and DATE_FORMAT(practical_finish_time ,'%Y') = #{year} and DATE_FORMAT(real_plan_start_time ,'%Y') = #{year}
+        select *  from c_project_cost_budget pcb
+        WHERE pcb.is_deleted = 0  and task_approve = 1  and (select cdi.dict_value from c_dict_info cdi WHERE cdi.id = pcb.plan_task_type) = 1 and pcb.task_approve = 1 and (DATE_FORMAT(pcb.practical_finish_time ,'%Y') = #{year} or DATE_FORMAT(pcb.real_plan_start_time ,'%Y') = #{year})
     </select>
+
+    <select id="getBudgetByYear2" resultType="org.springblade.control.entity.ProjectCostBudget">
+        select *  from c_project_cost_budget pcb
+        WHERE pcb.is_deleted = 0  and (select cdi.dict_value from c_dict_info cdi WHERE cdi.id = pcb.plan_task_type) = 1 and (DATE_FORMAT(pcb.plan_start_time ,'%Y') = #{year} or DATE_FORMAT(pcb.plan_end_time ,'%Y') = #{year})
+    </select>
+
     <select id="getPlanByMonth" resultType="org.springblade.control.vo.ProjectCostBudgetVO2">
         select pcb.*,
                (pcb.plan_days * (select bu.one_money from blade_user bu WHERE bu.id = pcb.task_user)) as 'planCountMoney',
@@ -205,7 +212,7 @@
         and pcb.task_user is not null and pcb.plan_days is not null
     </select>
     <select id="getRiskPlan" resultType="org.springblade.control.entity.ProjectCostBudget">
-        SELECT * from c_project_cost_budget WHERE plan_end_time &lt; NOW() and status in (2,3)
+        SELECT * from c_project_cost_budget WHERE plan_end_time &lt; NOW() and status in (1,2,3)
         <if test="projectId != null">
             and project_id = #{projectId}
         </if>
@@ -330,7 +337,7 @@
                (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 = 2 and di.id = pcb.plan_task_type) as planTaskTypeValue
         from c_project_cost_budget pcb
-        WHERE pcb.cost_type = #{costType} and pcb.is_deleted = 0 and pcb.project_id = #{projectId} and pcb.plan_end_time &lt; NOW() and pcb.status in (2,3)
+        WHERE pcb.cost_type = #{costType} and pcb.is_deleted = 0 and pcb.project_id = #{projectId} and pcb.plan_end_time &lt; NOW() and pcb.status in (1,2,3)
         UNION ALL
         select pcb.*,
                case pcb.status

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

@@ -46,6 +46,8 @@ public interface ProjectInfoMapper extends BaseMapper<ControlProjectInfo> {
 
     BigDecimal getThisYearReimburse(@Param("year") int year);
 
+    List<EMFinancialReimbursementInfo> getThisYearReimburse2(@Param("year") int year);
+
     List<EMFinancialReimbursementInfo> getYearReimburseByMonth(@Param("year") int year);
 
     //返回报销对应的进程

+ 7 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml

@@ -117,5 +117,12 @@
         FROM  c_expense_financial_reimbursement_info fri inner join c_project_cost_budget pcb on fri.budget_plan_ids = pcb.id
         WHERE fri.is_deleted = 0 and fri.status = 2 and fri.project_id = #{projectId} and and pcb.costType = #{costType} and fri.budget_plan_ids > 0
     </select>
+    <select id="getThisYearReimburse2"
+            resultType="org.springblade.control.entity.EMFinancialReimbursementInfo">
+        SELECT fri.*
+        FROM c_expense_financial_reimbursement_info fri
+        WHERE fri.is_deleted = 0 and fri.status = 2
+            and #{year} = DATE_FORMAT(fri.fr_date ,'%Y')
+    </select>
 
 </mapper>

+ 5 - 2
blade-service/blade-control/src/main/java/org/springblade/control/mapper/UserpayInfoMapper.xml

@@ -27,6 +27,7 @@
         <result column="social_sec" property="socialSec"/>
         <result column="net_salary" property="netSalary"/>
         <result column="desc" property="desc"/>
+        <result column="name" property="name"/>
     </resultMap>
 
     <resultMap id="userpayInfoResultVOMap" type="org.springblade.control.vo.UserpayInfoVO">
@@ -58,14 +59,16 @@
 
 
     <select id="selectUserpayInfoPage" resultMap="userpayInfoResultVOMap">
-        select *,(SELECT name from blade_user b where a.user_id = b.id) as name from c_user_pay_info a
+        select *
+             /*,(SELECT name from blade_user b where a.user_id = b.id) as name */
+        from c_user_pay_info a
         where a.is_deleted = 0
     </select>
 
 
 
     <delete id="delUserPayInoByDate">
-        delete from m_role_post where cost_time = #{date}
+        delete from c_user_pay_info where DATE_FORMAT(cost_time,'%Y-%m') = #{date}
     </delete>
 
 </mapper>

+ 9 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetDisburseService.java

@@ -4,6 +4,9 @@ import org.springblade.control.entity.AnnualBudgetDisburse;
 import org.springblade.control.entity.AnnualBudgetIncome;
 import org.springblade.core.mp.base.BaseService;
 
+import java.math.BigDecimal;
+import java.util.List;
+
 /**
  * @Param
  * @Author wangwl
@@ -13,4 +16,10 @@ public interface IAnnualBudgetDisburseService extends BaseService<AnnualBudgetDi
 
     void deleteByAnnualId(Long id);
 
+    //年度预算人工成本,按月返回指定年
+    List<BigDecimal> budgetCostByYear(Long annualId);
+
+    //年度预算非人工成本,按月返回指定年
+    List<BigDecimal> budgetNotCostByYear(Long annualId);
+
 }

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

@@ -56,4 +56,10 @@ public interface IAnnualBudgetService extends BaseService<AnnualBudget> {
     List<BudgetAndPracticalByMonthVO> budgetAndPracticalByMonth(String year);
 
     List<BudgetAndPracticalByDeptVO> budgetAndPracticalByDept(String year);
+
+    BudgetAndPracticalVO budgetAndPracticalByBusiness(String year);
+
+    List<BudgetAndPracticalByManageVO> budgetAndPracticalByManage(String year);
+
+
 }

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

@@ -44,4 +44,7 @@ public interface IContractReturnedInfoService extends BaseService<ContractReturn
     //获取所有项目当年每月的,1返回应回款,2返回实际回款
     List<BigDecimal> getAllMonthReturnedByYear(int y,int type);
 
+    //获取所有项目当年每月的应回款
+    List<BigDecimal> getAllMonthReturnedByYear2(int y);
+
 }

+ 2 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/IDepartmentMonthPlanService.java

@@ -2,6 +2,7 @@ package org.springblade.control.service;
 
 import org.springblade.control.dto.ControlContractInfoDTO;
 import org.springblade.control.dto.ControlProjectInfoDTO;
+import org.springblade.control.dto.DepartmentMonthPlanDTO;
 import org.springblade.control.dto.ProjectCostBudgetDTO;
 import org.springblade.control.entity.DepartmentMonthPlan;
 import org.springblade.control.entity.DictInfo;
@@ -22,7 +23,7 @@ import java.util.List;
  **/
 public interface IDepartmentMonthPlanService extends BaseService<DepartmentMonthPlan> {
 
-    List<DepartmentMonthPlanVO> getPage(ControlContractInfoDTO dto, Query query) ;
+    List<DepartmentMonthPlanVO> getPage(DepartmentMonthPlanDTO dto, Query query) ;
 
     List<ProjectCostBudgetVO> addDepartmentPlan(DepartmentMonthPlan plan);
 

+ 9 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java

@@ -127,10 +127,19 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
 
     //根据年获取每月实际的人工支出
     List<BigDecimal> getAllMonthStaffCostByYear(int y);
+
+    //根据年获取每月预算人工支出,
+    List<BigDecimal> getAllMonthStaffCostByYear2(int y);
+
+    //根据年获取每月预算人工支出,包括其他支出
+    List<BigDecimal> getAllMonthStaffCostByYear3(int y);
+
     //根据年获取每月实际的维护支出
     List<BigDecimal> getAllMonthMaintainCostByYear(int y);
+
     //获取当年所有已经分配时间的固定计划
     List<ProjectCostBudget> getAllPlanByYear(int y);
+
     //获取当年所有已经完成的固定计划
     List<ProjectCostBudget> getAllFinishedPlanByYear(int y);
 }

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

@@ -48,6 +48,9 @@ public interface IProjectInfoService extends BaseService<ControlProjectInfo> {
     //获取当年所有的报销
     BigDecimal getThisYearReimburse(int year);
 
+    //获取当年所有的报销,分月返回
+    List<BigDecimal> getThisYearAllReimburseByYear(int year);
+
     //获取所有项目截至当年的报销支出,分月返回
     Map<Long,List<BigDecimal>> getYearReimburseByMonth(int year);
 

+ 144 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetDisburseServiceImpl.java

@@ -10,6 +10,10 @@ import org.springblade.control.service.IAnnualBudgetIncomeService;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @Param
  * @Author wangwl
@@ -24,4 +28,144 @@ public class AnnualBudgetDisburseServiceImpl extends BaseServiceImpl<AnnualBudge
     public void deleteByAnnualId(Long id) {
         baseMapper.deleteByAnnualId(id);
     }
+
+    /**
+     * 年度预算人工成本,按月返回指定年
+     * @param annualId
+     * @return
+     */
+    @Override
+    public List<BigDecimal> budgetCostByYear(Long annualId) {
+        List<BigDecimal> list = new ArrayList<>();
+        if (annualId == null){
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+            return list;
+        }
+        //获取所有的人工成本
+        List<AnnualBudgetDisburse> cost = baseMapper.budgetCostByYear(annualId);
+        if (cost != null && cost.size() > 0){
+            for (int i = 0; i < 12; i++) {
+                BigDecimal big = new BigDecimal(0);
+                for (AnnualBudgetDisburse disburse : cost) {
+                    switch (i) {
+                        case 0:
+                            big = big.add(disburse.getJanuary());
+                            break;
+                        case 1:
+                            big = big.add(disburse.getFebruary());
+                            break;
+                        case 2:
+                            big = big.add(disburse.getMarch());
+                            break;
+                        case 3:
+                            big = big.add(disburse.getApril());
+                            break;
+                        case 4:
+                            big = big.add(disburse.getMay());
+                            break;
+                        case 5:
+                            big = big.add(disburse.getJune());
+                            break;
+                        case 6:
+                            big = big.add(disburse.getJuly());
+                            break;
+                        case 7:
+                            big = big.add(disburse.getAugust());
+                            break;
+                        case 8:
+                            big = big.add(disburse.getSeptember());
+                            break;
+                        case 9:
+                            big = big.add(disburse.getOctober());
+                            break;
+                        case 10:
+                            big = big.add(disburse.getNovember());
+                            break;
+                        case 11:
+                            big = big.add(disburse.getDecember());
+                            break;
+                    }
+                    list.add(big);
+                }
+            }
+            return list;
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+            return list;
+        }
+    }
+
+    /**
+     * 年度预算非人工成本,按月返回指定年
+     * @param annualId
+     * @return
+     */
+    @Override
+    public List<BigDecimal> budgetNotCostByYear(Long annualId) {
+        List<BigDecimal> list = new ArrayList<>();
+        if (annualId == null){
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+            return list;
+        }
+        //获取所有的非人工成本
+        List<AnnualBudgetDisburse> cost = baseMapper.budgetNotCostByYear(annualId);
+        if (cost != null && cost.size() > 0){
+            for (int i = 0; i < 12; i++) {
+                BigDecimal big = new BigDecimal(0);
+                for (AnnualBudgetDisburse disburse : cost) {
+                    switch (i) {
+                        case 0:
+                            big = big.add(disburse.getJanuary());
+                            break;
+                        case 1:
+                            big = big.add(disburse.getFebruary());
+                            break;
+                        case 2:
+                            big = big.add(disburse.getMarch());
+                            break;
+                        case 3:
+                            big = big.add(disburse.getApril());
+                            break;
+                        case 4:
+                            big = big.add(disburse.getMay());
+                            break;
+                        case 5:
+                            big = big.add(disburse.getJune());
+                            break;
+                        case 6:
+                            big = big.add(disburse.getJuly());
+                            break;
+                        case 7:
+                            big = big.add(disburse.getAugust());
+                            break;
+                        case 8:
+                            big = big.add(disburse.getSeptember());
+                            break;
+                        case 9:
+                            big = big.add(disburse.getOctober());
+                            break;
+                        case 10:
+                            big = big.add(disburse.getNovember());
+                            break;
+                        case 11:
+                            big = big.add(disburse.getDecember());
+                            break;
+                    }
+                }
+                list.add(big);
+            }
+            return list;
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+            return list;
+        }
+    }
 }

+ 149 - 8
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -1022,9 +1022,9 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         }
 
         //获取所有项目当年每月的应回款
-        List<BigDecimal> returned1 = returnedInfoService.getAllMonthReturnedByYear(y,1);
-        //获取已经指定年分配月的成本测算
-        List<BigDecimal> budgets = budgetService.getAllMonthBudgetByYear(y);
+        List<BigDecimal> returned1 = returnedInfoService.getAllMonthReturnedByYear2(y);
+        //获取已经指定年分配月的计划成本
+        List<BigDecimal> budgets = budgetService.getAllMonthStaffCostByYear3(y);
         //获取所有项目当年每月的实际回款
         List<BigDecimal> returned2 = returnedInfoService.getAllMonthReturnedByYear(y,2);
         //获取每月实际的人工支出
@@ -1119,7 +1119,11 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                 isFinished = false;
             }
             //维护支出,返回null证明没有
-            budgetService.getAllMaintainCost9(y);
+            Map<Integer, List<BigDecimal>> maintainMap = budgetService.getAllMaintainCost9(y);
+            Boolean isMaintain = true;
+            if (maintainMap == null || maintainMap.size() <= 0){
+                isMaintain = false;
+            }
             //报销支出
 
             BigDecimal c1 = new BigDecimal(0);
@@ -1191,8 +1195,17 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                         vo.setPractical1(big);
                         c2 = c2.add(big);
                     }else {
-                        vo.setBudget1(new BigDecimal(0));
+                        vo.setPractical1(new BigDecimal(0));
                     }
+                }else {
+                    vo.setPractical1(new BigDecimal(0));
+                }
+                //设置维护支出
+                if (isMaintain && maintainMap.get(1) != null && maintainMap.get(1).size() > 0){
+                    vo.setBudget1(vo.getBudget1().add(maintainMap.get(1).get(i)));
+                    vo.setPractical1(vo.getPractical1().add(maintainMap.get(1).get(i)));
+                    c1 = c1.add(maintainMap.get(1).get(i));
+                    c2 = c2.add(maintainMap.get(1).get(i));
                 }
 
                 //设置研发部
@@ -1251,6 +1264,15 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                     }else {
                         vo.setPractical2(new BigDecimal(0));
                     }
+                }else {
+                    vo.setPractical2(new BigDecimal(0));
+                }
+                //设置维护支出
+                if (isMaintain && maintainMap.get(2) != null && maintainMap.get(2).size() > 0){
+                    vo.setBudget2(vo.getBudget2().add(maintainMap.get(2).get(i)));
+                    vo.setPractical2(vo.getPractical2().add(maintainMap.get(2).get(i)));
+                    c3 = c3.add(maintainMap.get(2).get(i));
+                    c4 = c4.add(maintainMap.get(2).get(i));
                 }
 
                 //设置实施部
@@ -1285,7 +1307,7 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                     List<ProjectCostBudget> d3 = finishedMap.get(3);
                     if (d3 != null && d3.size() > 0){
                         BigDecimal big = new BigDecimal(0);
-                        //循环市场部每一个支出
+                        //循环每一个支出
                         for (ProjectCostBudget budget : d3) {
                             //如果实际开始时间或实际结束时间是当月,则添加支出
                             if ((budget.getRealPlanStartTime().getMonthValue() == (i+1) && budget.getRealPlanStartTime().getYear() == y)
@@ -1309,13 +1331,22 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                     }else {
                         vo.setPractical3(new BigDecimal(0));
                     }
+                }else {
+                    vo.setPractical3(new BigDecimal(0));
+                }
+                //设置维护支出
+                if (isMaintain && maintainMap.get(3) != null && maintainMap.get(3).size() > 0){
+                    vo.setBudget3(vo.getBudget3().add(maintainMap.get(3).get(i)));
+                    vo.setPractical3(vo.getPractical3().add(maintainMap.get(3).get(i)));
+                    c5 = c5.add(maintainMap.get(3).get(i));
+                    c6 = c6.add(maintainMap.get(3).get(i));
                 }
 
                 //设置维护部
                 List<ProjectCostBudget> b4 = allPlanMap.get(4);
                 if (b4 != null && b4.size() > 0){
                     BigDecimal big = new BigDecimal(0);
-                    //循环研发部每一个预算
+                    //循环每一个预算
                     for (ProjectCostBudget budget : b4) {
                         //如果开始时间或结束时间是当月,则添加预算
                         if ((budget.getPlanStartTime().getMonthValue() == (i+1) && budget.getPlanStartTime().getYear() == y)
@@ -1343,7 +1374,7 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                     List<ProjectCostBudget> d4 = finishedMap.get(4);
                     if (d4 != null && d4.size() > 0){
                         BigDecimal big = new BigDecimal(0);
-                        //循环市场部每一个支出
+                        //循环每一个支出
                         for (ProjectCostBudget budget : d4) {
                             //如果实际开始时间或实际结束时间是当月,则添加支出
                             if ((budget.getRealPlanStartTime().getMonthValue() == (i+1) && budget.getRealPlanStartTime().getYear() == y)
@@ -1367,6 +1398,15 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                     }else {
                         vo.setPractical4(new BigDecimal(0));
                     }
+                }else {
+                    vo.setPractical4(new BigDecimal(0));
+                }
+                //设置维护支出
+                if (isMaintain && maintainMap.get(4) != null && maintainMap.get(4).size() > 0){
+                    vo.setBudget4(vo.getBudget4().add(maintainMap.get(4).get(i)));
+                    vo.setPractical4(vo.getPractical4().add(maintainMap.get(4).get(i)));
+                    c7 = c7.add(maintainMap.get(4).get(i));
+                    c8 = c8.add(maintainMap.get(4).get(i));
                 }
 
                 //设置管理中心 = 管理支出+外包劳务
@@ -1464,6 +1504,20 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                         }
                     }
                 }
+                //设置维护支出
+                if (isMaintain && maintainMap.get(5) != null && maintainMap.get(5).size() > 0){
+                    big1 = big1.add(maintainMap.get(5).get(i));
+                    big2 = big2.add(maintainMap.get(5).get(i));
+                    c9 = c9.add(maintainMap.get(5).get(i));
+                    c10 = c10.add(maintainMap.get(5).get(i));
+                }
+                //设置维护支出
+                if (isMaintain && maintainMap.get(6) != null && maintainMap.get(6).size() > 0){
+                    big1 = big1.add(maintainMap.get(6).get(i));
+                    big2 = big2.add(maintainMap.get(6).get(i));
+                    c9 = c9.add(maintainMap.get(6).get(i));
+                    c10 = c10.add(maintainMap.get(6).get(i));
+                }
                 vo.setBudget5(big1);
                 c9 = c9.add(big1);
                 vo.setPractical5(big2);
@@ -1518,6 +1572,93 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         }
     }
 
+    /**
+     * 预算与实际统计-总经营
+     */
+    @Override
+    public BudgetAndPracticalVO budgetAndPracticalByBusiness(String year) {
+        int y = Integer.parseInt(year.substring(0, 4));
+        BudgetAndPracticalVO vo = new BudgetAndPracticalVO();
+        //获取当年的年度经营预算
+        AnnualBudget budget = baseMapper.getThisYearBudget(y);
+        if (budget == null){
+            vo.setBudgetInput(new BigDecimal(0));
+            vo.setBudgetOutput(new BigDecimal(0));
+        }else {
+            vo.setBudgetInput(budget.getAnnualContractTarget());
+            vo.setBudgetOutput(budget.getTotalBudget());
+        }
+        //获取当年的所有已回款
+        BigDecimal yearReturned = returnedInfoService.getYearReturned(y);
+        vo.setPracticalInput(yearReturned);
+        //获取当年所有实际支出: 人工支出+维护支出+报销支出
+        //人工支出
+        BigDecimal disburse = budgetService.getYearStaffDisburse(y);
+        //维护支出
+        BigDecimal maintainCost = budgetService.getAllMaintainCost(y);
+        //报销支出
+        BigDecimal decimal = projectInfoService.getThisYearReimburse(LocalDate.now().getYear());
+        vo.setPracticalOutput(disburse.add(maintainCost).add(decimal));
+        return vo;
+    }
+
+    /**
+     * 预算与实际统计-人工和管理统计
+     */
+    @Override
+    public List<BudgetAndPracticalByManageVO> budgetAndPracticalByManage(String year) {
+        int y = Integer.parseInt(year.substring(0, 4));
+        //结果集
+        List<BudgetAndPracticalByManageVO> list = new ArrayList<>();
+        List<String> months = Arrays.asList("一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月");
+        //获取当年的年度经营预算
+        AnnualBudget budget = baseMapper.getThisYearBudget(y);
+        //年度经营的人工成本,按月返回指定年的,如果没有年度经营,则返回所有的0
+        Long annualId;
+        if (budget == null){
+            annualId = null;
+        }else {
+            annualId = budget.getId();
+        }
+        List<BigDecimal> costList = disburseService.budgetCostByYear(annualId);
+        //一年的实际人工支出,按月返回指定年的
+        List<BigDecimal> staffCostList = budgetService.getAllMonthStaffCostByYear2(y);
+        //管理成本预算支出  = 年度经营的非人工成本,按月返回指定年的
+        List<BigDecimal> notCostList = disburseService.budgetNotCostByYear(annualId);
+        //管理成本实际支出 = 指定年的每个月报销,按月返回
+        List<BigDecimal> reimburseList = projectInfoService.getThisYearAllReimburseByYear(y);
+        BigDecimal b1 = new BigDecimal(0);
+        BigDecimal b2 = new BigDecimal(0);
+        BigDecimal b3 = new BigDecimal(0);
+        BigDecimal b4 = new BigDecimal(0);
+        for (int i = 0; i < 12; i++) {
+            BudgetAndPracticalByManageVO vo = new BudgetAndPracticalByManageVO();
+            //设置月份
+            vo.setTime(months.get(i));
+            //设置人工成本预算支出
+            vo.setDisburse1(costList.get(i));
+            b1 = b1.add(costList.get(i));
+            //设置人工成本实际支出
+            vo.setDisburse2(staffCostList.get(i));
+            b2 = b2.add(staffCostList.get(i));
+            //设置管理成本预算支出
+            vo.setDisburse3(notCostList.get(i));
+            b3 = b3.add(notCostList.get(i));
+            //设置管理成本实际支出
+            vo.setDisburse4(reimburseList.get(i));
+            b4 = b4.add(reimburseList.get(i));
+            list.add(vo);
+        }
+        BudgetAndPracticalByManageVO vo = new BudgetAndPracticalByManageVO();
+        vo.setTime("总计");
+        vo.setDisburse1(b1);
+        vo.setDisburse2(b2);
+        vo.setDisburse3(b3);
+        vo.setDisburse4(b4);
+        list.add(vo);
+        return list;
+    }
+
     /**
      * 统计支出 1支出总和2工资总和
      */

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

@@ -163,4 +163,33 @@ public class ContractReturnedInfoServiceImpl extends BaseServiceImpl<ContractRet
         }
         return list;
     }
+
+    /**
+     * 获取所有项目当年每月的应回款
+     * @param y
+     * @return
+     */
+    @Override
+    public List<BigDecimal> getAllMonthReturnedByYear2(int y) {
+        //获取当年所有回款
+        List<ContractReturnedInfo> infos = baseMapper.getAllMonthReturnedByYear2(y);
+        List<BigDecimal> list = new ArrayList<>();
+        //计算每月回款
+        if (infos != null && infos.size() > 0){
+            for (int i = 0; i < 12; i++) {
+                BigDecimal big = new BigDecimal(0);
+                for (ContractReturnedInfo info : infos) {
+                    if (info.getShouldReturnedTime().getMonthValue() == (i+1)){
+                        big = big.add(info.getShouldReturnedMoney());
+                    }
+                }
+                list.add(big);
+            }
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+        }
+        return list;
+    }
 }

+ 2 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentMonthPlanServiceImpl.java

@@ -7,6 +7,7 @@ import lombok.AllArgsConstructor;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.control.dto.ControlContractInfoDTO;
 import org.springblade.control.dto.ControlProjectInfoDTO;
+import org.springblade.control.dto.DepartmentMonthPlanDTO;
 import org.springblade.control.dto.ProjectCostBudgetDTO;
 import org.springblade.control.entity.*;
 import org.springblade.control.mapper.DepartmentMonthPlanMapper;
@@ -50,7 +51,7 @@ public class DepartmentMonthPlanServiceImpl extends BaseServiceImpl<DepartmentMo
      * 部门月计划分页
      */
     @Override
-    public List<DepartmentMonthPlanVO> getPage(ControlContractInfoDTO dto, Query query) {
+    public List<DepartmentMonthPlanVO> getPage(DepartmentMonthPlanDTO dto, Query query) {
         IPage page = new Page(query.getCurrent(), query.getSize());
         BladeUser user = AuthUtil.getUser();
         return baseMapper.getPage(page,dto,user.getUserId());

+ 12 - 8
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMOutsourcingPayServiceImpl.java

@@ -53,17 +53,21 @@ public class EMOutsourcingPayServiceImpl extends BaseServiceImpl<ExMOutsourcingP
             vo.setApprovalStatusName(vo.getStatus().equals(1) ? "待审批" : (vo.getStatus().equals(2) ? "已审批" : (vo.getStatus().equals(3) ? "已驳回" : "未上报")));
             vo.setApprovalResultName(vo.getApprovalStatusName().equals("已审批") || vo.getApprovalStatusName().equals("已驳回") ? "已通过" : "未通过");
 
-            for (DictInfo dictInfo : dictInfoList) {
-                if (vo.getOutsourcingType().equals(dictInfo.getDictValue().intValue())) {
-                    vo.setOutsourcingTypeName(dictInfo.getDictName());
-                    break;
+            if (ObjectUtil.isNotEmpty(vo.getOutsourcingType())) {
+                for (DictInfo dictInfo : dictInfoList) {
+                    if (vo.getOutsourcingType().equals(dictInfo.getDictValue().intValue())) {
+                        vo.setOutsourcingTypeName(dictInfo.getDictName());
+                        break;
+                    }
                 }
             }
 
-            for (ControlProjectInfo projectInfo : controlProjectInfos) {
-                if (projectInfo.getId().equals(vo.getProjectId())) {
-                    vo.setProjectName(projectInfo.getName());
-                    break;
+            if (ObjectUtil.isNotEmpty(vo.getProjectId())) {
+                for (ControlProjectInfo projectInfo : controlProjectInfos) {
+                    if (projectInfo.getId().equals(vo.getProjectId())) {
+                        vo.setProjectName(projectInfo.getName());
+                        break;
+                    }
                 }
             }
 

+ 38 - 42
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java

@@ -201,8 +201,8 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                 //获取当天,当前用户所有的计划任务信息,新增关联信息
                 List<TaskPlanInfoVO> taskPlanInfoVOS = this.logTaskList();
                 if (taskPlanInfoVOS.size() > 0) {
-                    jdbcTemplate.execute("delete from c_log_history_task_record where log_id = " + dto.getId());
                     for (TaskPlanInfoVO task : taskPlanInfoVOS) {
+                        jdbcTemplate.execute("delete from c_log_history_task_record where log_id = " + dto.getId() + " and task_id = " + task.getId());
                         jdbcTemplate.execute("insert into c_log_history_task_record(id,log_id,task_id) values(" + SnowFlakeUtil.getId() + "," + dto.getId() + "," + task.getId() + ")");
                     }
                 }
@@ -244,8 +244,8 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                 //获取当天,当前用户所有的计划任务信息,新增关联信息
                 List<TaskPlanInfoVO> taskPlanInfoVOS = this.logTaskList();
                 if (taskPlanInfoVOS.size() > 0) {
-                    jdbcTemplate.execute("delete from c_log_history_task_record where log_id = " + dto.getId());
                     for (TaskPlanInfoVO task : taskPlanInfoVOS) {
+                        jdbcTemplate.execute("delete from c_log_history_task_record where log_id = " + dto.getId() + " and task_id = " + task.getId());
                         jdbcTemplate.execute("insert into c_log_history_task_record(id,log_id,task_id) values(" + SnowFlakeUtil.getId() + "," + dto.getId() + "," + task.getId() + ")");
                     }
                 }
@@ -326,9 +326,6 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                 }
 
                 if (taskIds.size() > 0) {
-                    //任务逾期完成关系信息
-                    //List<TaskPlanOverdueStatusVO> overdueStatusVOS = jdbcTemplate.query("select * from c_task_plan_overdue_status where user_id = " + obj.getUserId(), new BeanPropertyRowMapper<>(TaskPlanOverdueStatusVO.class));
-
                     //获取所有审批任务与计划任务关系
                     List<ExpenseTaskRecord> expenseTaskRecords = jdbcTemplate.query("select task_id,expense_info_id,is_transfer from c_expense_task_record where expense_info_type = 1 and expense_info_id in(" + StringUtils.join(taskIds, ",") + ")", new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
                     Map<String, ExpenseTaskRecord> taskRecordMaps = expenseTaskRecords.stream().collect(Collectors.toMap(ExpenseTaskRecord::getExpenseInfoId, Function.identity()));
@@ -339,6 +336,26 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                     LocalDate nowDateYQ = LocalDate.now();
                     for (ProjectCostBudget taskObj : taskObjs) {
                         TaskPlanInfoVO vos = new TaskPlanInfoVO();
+                        if (ObjectUtil.isNotEmpty(taskObj.getPlanStartTime()) && ObjectUtil.isNotEmpty(taskObj.getPlanEndTime())) {
+                            //如果任务结束时间在当前系统时间之前,视为逾期
+                            if (taskObj.getPlanEndTime().isBefore(nowDateYQ) && taskObj.getStatus() == 4 && taskObj.getTaskUser().equals(SecureUtil.getUserId())) {
+                                //逾期完成(自己不查看)
+                                continue;
+                            } else if (taskObj.getPlanEndTime().isBefore(nowDateYQ) && taskObj.getStatus() == 4 && !taskObj.getTaskUser().equals(SecureUtil.getUserId())) {
+                                //逾期完成(别人查看状态)
+                                vos.setIsOverdue(1);
+                            } else if (taskObj.getPlanEndTime().isBefore(nowDateYQ) && taskObj.getStatus() != 4) {
+                                //逾期未完成(都要查看)
+                                vos.setIsOverdue(1);
+                            }
+
+                            LocalDate planStartTime = taskObj.getPlanStartTime();
+                            LocalDate planEndTime = taskObj.getPlanEndTime();
+                            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
+                            String planStartTimeStr = planStartTime.format(formatter);
+                            String planEndTimeStr = planEndTime.format(formatter);
+                            vos.setStartAndEndDate(planStartTimeStr + "~" + planEndTimeStr);
+                        }
                         vos.setId(taskObj.getId());
                         for (ControlProjectInfo projectInfo : controlProjectInfos) {
                             if (projectInfo.getId().equals(taskObj.getProjectId())) {
@@ -346,7 +363,6 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                                 break;
                             }
                         }
-
                         //判断任务状态
                         ExpenseTaskRecord record = taskRecordMaps.getOrDefault(String.valueOf(taskObj.getId()), null);
                         if (record != null) {
@@ -364,35 +380,8 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                             vos.setStatus(0);
                             vos.setStatusName("未上报");
                         }
-
                         vos.setTaskDesc(ObjectUtil.isNotEmpty(taskObj.getPlanTaskDesc()) ? taskObj.getPlanTaskDesc() : "");
-                        if (ObjectUtil.isNotEmpty(taskObj.getPlanStartTime()) && ObjectUtil.isNotEmpty(taskObj.getPlanEndTime())) {
-                            LocalDate planStartTime = taskObj.getPlanStartTime();
-                            LocalDate planEndTime = taskObj.getPlanEndTime();
-                            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
-                            String planStartTimeStr = planStartTime.format(formatter);
-                            String planEndTimeStr = planEndTime.format(formatter);
-                            vos.setStartAndEndDate(planStartTimeStr + "~" + planEndTimeStr);
-                            /*if (vos.getStatus().equals(4)) { //TODO 业务说暂时不需要标记逾期完成的
-                                //逾期完成
-                                for (TaskPlanOverdueStatusVO overdueVO : overdueStatusVOS) {
-                                    if (overdueVO.getPlanTaskId().equals(taskObj.getId())) {
-                                        vos.setIsOverdue(1);
-                                        break;
-                                    }
-                                }
-                            } else {*/
-                            //逾期未完成
-                            if (taskObj.getPlanEndTime().isBefore(nowDateYQ) && obj.getStatus() != 4) {
-                                if (ObjectUtil.isNotEmpty(taskObj.getPlanStartTime()) && ObjectUtil.isNotEmpty(taskObj.getPlanEndTime())) {
-                                    vos.setIsOverdue(1);
-                                }
-                            }
-                            //}
-                        }
-
                         vos.setReimbursementAmount(taskObj.getBudgetCountMoney());
-
                         resultList.add(vos);
                     }
                     List<TaskPlanInfoVO> collect = resultList.stream().sorted(Comparator.comparing(TaskPlanInfoVO::getStatus)).collect(Collectors.toList());
@@ -427,6 +416,9 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
         if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
             throw new ServiceException("获取当前用户信息失败,请联系管理员");
         }
+        if (ObjectUtil.isEmpty(logId)) {
+            throw new ServiceException("请先提交日志后再进行计划任务关联!");
+        }
 
         ProjectCostBudget task = projectCostBudgetServiceImpl.getBaseMapper().selectById(taskId);
         if (ObjectUtil.isEmpty(task.getDeptId())) {
@@ -465,8 +457,8 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
             if (ObjectUtil.isNotEmpty(logId)) { //编辑时,点完成,那么重塑关系信息
                 List<TaskPlanInfoVO> taskPlanInfoVOS = this.logTaskList();
                 if (taskPlanInfoVOS.size() > 0) {
-                    jdbcTemplate.execute("delete from c_log_history_task_record where log_id = " + logId);
                     for (TaskPlanInfoVO taskPlanInfoVO : taskPlanInfoVOS) {
+                        jdbcTemplate.execute("delete from c_log_history_task_record where log_id = " + logId + " and task_id = " + taskPlanInfoVO.getId());
                         jdbcTemplate.execute("insert into c_log_history_task_record(id,log_id,task_id) values(" + SnowFlakeUtil.getId() + "," + logId + "," + taskPlanInfoVO.getId() + ")");
                     }
                 }
@@ -532,19 +524,11 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
         }
         //当前用户所有的计划任务信息
         List<ProjectCostBudget> projectCostBudgetsAllByTaskUser = jdbcTemplate.query("SELECT * FROM c_project_cost_budget WHERE task_user = " + SecureUtil.getUserId(), new BeanPropertyRowMapper<>(ProjectCostBudget.class));
-        //List<ProjectCostBudget> projectCostBudgets = jdbcTemplate.query("SELECT * FROM c_project_cost_budget WHERE CURDATE() BETWEEN plan_start_time AND plan_end_time AND task_user = " + SecureUtil.getUserId(), new BeanPropertyRowMapper<>(ProjectCostBudget.class));
         List<ControlProjectInfo> controlProjectInfos = projectInfoServiceImpl.getBaseMapper().selectList(Wrappers.<ControlProjectInfo>lambdaQuery().select(ControlProjectInfo::getId, ControlProjectInfo::getName));
         List<TaskPlanInfoVO> resultList = new ArrayList<>();
         LocalDate nowDate = LocalDate.now();
         for (ProjectCostBudget obj : projectCostBudgetsAllByTaskUser) {
             TaskPlanInfoVO vo = new TaskPlanInfoVO();
-            vo.setId(obj.getId());
-            for (ControlProjectInfo projectInfo : controlProjectInfos) {
-                if (projectInfo.getId().equals(obj.getProjectId())) {
-                    vo.setProjectName(projectInfo.getName());
-                    break;
-                }
-            }
             vo.setStatusName(obj.getStatus().equals(4) ? "已完成" : "未完成");
             vo.setTaskDesc(ObjectUtil.isNotEmpty(obj.getPlanTaskDesc()) ? obj.getPlanTaskDesc() : "");
             if (ObjectUtil.isNotEmpty(obj.getPlanStartTime()) && ObjectUtil.isNotEmpty(obj.getPlanEndTime())) {
@@ -554,12 +538,24 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
                 String planStartTimeStr = planStartTime.format(formatter);
                 String planEndTimeStr = planEndTime.format(formatter);
                 vo.setStartAndEndDate(planStartTimeStr + "~" + planEndTimeStr);
+                if (obj.getPlanEndTime().isBefore(nowDate) && obj.getStatus() == 4) {
+                    //如果当前任务是已完成任务,且起止时间已超过当前时间,那么跳过
+                    continue;
+                }
                 if (obj.getPlanEndTime().isBefore(nowDate) && obj.getStatus() != 4) {
                     if (ObjectUtil.isNotEmpty(obj.getPlanStartTime()) && ObjectUtil.isNotEmpty(obj.getPlanEndTime())) {
                         vo.setIsOverdue(1); //逾期任务
                     }
                 }
             }
+
+            vo.setId(obj.getId());
+            for (ControlProjectInfo projectInfo : controlProjectInfos) {
+                if (projectInfo.getId().equals(obj.getProjectId())) {
+                    vo.setProjectName(projectInfo.getName());
+                    break;
+                }
+            }
             resultList.add(vo);
         }
         if (resultList.size() > 0) {

+ 3 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/PlanInformServiceImpl.java

@@ -55,7 +55,7 @@ public class PlanInformServiceImpl extends BaseServiceImpl<PlanInformMapper, Pla
      * @param taskName 任务名称
      * @param taskUser 任务人Id
      * @param appUserName 审批人名称
-     * @param status 审批状态 0=未上报 1=待审批 2=已审批 3=已驳回
+     * @param status 审批状态 0=未上报 1=待审批 2=已审批 3=已驳回 4=转移已经通过
      */
     @Override
     public void taskFinishedInform(String taskName, Long taskUser, String appUserName,Integer status) {
@@ -66,6 +66,8 @@ public class PlanInformServiceImpl extends BaseServiceImpl<PlanInformMapper, Pla
             str.append("《" + taskName + "》" + "已被" + "【" + appUserName + "】" + "驳回");
         }else if (status == 1){
             str.append("【" + appUserName + "】" + "向您发起《"+taskName+"》审批");
+        }else if (status == 4){
+            str.append("《" + taskName + "》" + "已被" + "【" + appUserName + "】" + "审批通过");
         }
         PlanInform inform = new PlanInform();
         inform.setInformDetails(str.toString());

+ 194 - 20
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -1316,6 +1316,8 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         int taskType = dictInfo.getDictValue().intValue();
         //计划为临时计划,则不计算金额直接闭环
         if (taskType == 2){
+            //为临时任务设置任务实际实际,方便统计
+            budget.setPracticalTaskDays(new BigDecimal(1 + budget.getPracticalFinishTime().until(budget.getRealPlanStartTime(), ChronoUnit.DAYS)));
             this.updateById(budget);
         }else {
             //获取任务人工资
@@ -1740,7 +1742,14 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             Map<Long, List<ControlContractInfo>> contractMap = contractList.parallelStream()
                     .collect(Collectors.groupingBy(ControlContractInfo::getProjectId));
             //返回结果
-            Map<Long,List<BigDecimal>> map = new HashMap<>();
+            Map<Integer,List<BigDecimal>> map = new HashMap<>();
+            for (int i = 1; i <= 6; i++) {
+                List<BigDecimal> list = new ArrayList<>();
+                for (int j = 0; j < 12; j++) {
+                    list.add(new BigDecimal(0));
+                }
+                map.put(i,list);
+            }
             //循环项目,
             for (ControlProjectInfo info : projectInfos) {
                 List<ControlContractInfo> infos = contractMap.get(info.getId());
@@ -1751,23 +1760,43 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                 ControlContractInfo contract = contractMap.get(info.getId()).get(0);
                 LocalDate startTime = contract.getStartTime();
                 LocalDate endTime = contract.getEndTime();
+                //合同开始日期比今天大,直接跳过
+                if (LocalDate.now().compareTo(startTime) < 0){
+                    continue;
+                }
                 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);
+                //查询出每个部门的维护支出
+                BigDecimal b1 = new BigDecimal(0);
+                BigDecimal b2 = new BigDecimal(0);
+                BigDecimal b3 = new BigDecimal(0);
+                BigDecimal b4 = new BigDecimal(0);
+                BigDecimal b5 = new BigDecimal(0);
+                BigDecimal b6 = new BigDecimal(0);
                 for (ProjectCostBudget l : list) {
-                    big = big.add(l.getBudgetStaffCost());
-                }
-                if (big.compareTo(new BigDecimal(0)) == 0){
-                    continue;
+                    if (l.getCostType() == 1){
+                        b1 = b1.add(l.getBudgetStaffCost());
+                    }
+                    if (l.getCostType() == 2){
+                        b2 = b2.add(l.getBudgetStaffCost());
+                    }
+                    if (l.getCostType() == 3){
+                        b3 = b3.add(l.getBudgetStaffCost());
+                    }
+                    if (l.getCostType() == 4){
+                        b4 = b4.add(l.getBudgetStaffCost());
+                    }
+                    if (l.getCostType() == 5){
+                        b5 = b5.add(l.getBudgetStaffCost());
+                    }
+                    if (l.getCostType() == 6){
+                        b6 = b6.add(l.getBudgetStaffCost());
+                    }
                 }
-                //获得每个月的维护费
-                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;
                 //判断是否查询今年
@@ -1816,18 +1845,71 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                         }
                     }
                 }
-                //为项目设置值
-                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));
+                //为部门设置值
+                if (b1.intValue() != 0){
+                    //获得部门每个月的维护费
+                    BigDecimal scale = b1.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                    List<BigDecimal> l1 = map.get(1);
+                    for (int i = 1; i <= 12; i++) {
+                        if (i >= startMonth && i <= endMonth){
+                            l1.set(i-1,l1.get(i-1).add(scale));
+                        }
                     }
                 }
-                map.put(info.getId(),decimalList);
+                if (b2.intValue() != 0){
+                    //获得部门每个月的维护费
+                    BigDecimal scale = b2.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                    List<BigDecimal> l1 = map.get(2);
+                    for (int i = 1; i <= 12; i++) {
+                        if (i >= startMonth && i <= endMonth){
+                            l1.set(i-1,l1.get(i-1).add(scale));
+                        }
+                    }
+                }
+                if (b3.intValue() != 0){
+                    //获得部门每个月的维护费
+                    BigDecimal scale = b3.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                    List<BigDecimal> l1 = map.get(3);
+                    for (int i = 1; i <= 12; i++) {
+                        if (i >= startMonth && i <= endMonth){
+                            l1.set(i-1,l1.get(i-1).add(scale));
+                        }
+                    }
+                }
+                if (b4.intValue() != 0){
+                    //获得部门每个月的维护费
+                    BigDecimal scale = b4.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                    List<BigDecimal> l1 = map.get(4);
+                    for (int i = 1; i <= 12; i++) {
+                        if (i >= startMonth && i <= endMonth){
+                            l1.set(i-1,l1.get(i-1).add(scale));
+                        }
+                    }
+                }
+                if (b5.intValue() != 0){
+                    //获得部门每个月的维护费
+                    BigDecimal scale = b5.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                    List<BigDecimal> l1 = map.get(5);
+                    for (int i = 1; i <= 12; i++) {
+                        if (i >= startMonth && i <= endMonth){
+                            l1.set(i-1,l1.get(i-1).add(scale));
+                        }
+                    }
+                }
+
+                if (b6.intValue() != 0){
+                    //获得部门每个月的维护费
+                    BigDecimal scale = b6.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                    List<BigDecimal> l1 = map.get(6);
+                    for (int i = 1; i <= 12; i++) {
+                        if (i >= startMonth && i <= endMonth){
+                            l1.set(i-1,l1.get(i-1).add(scale));
+                        }
+                    }
+                }
+
             }
-            return null;
+            return map;
         }
         return null;
     }
@@ -2288,12 +2370,104 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         return list;
     }
 
+    /**
+     * 获取每月实际的人工支出+其他成本
+     * @param y
+     * @return
+     */
+    @Override
+    public List<BigDecimal> getAllMonthStaffCostByYear3(int y) {
+        //获取所有今年的固定计划,计划开始时间和结束时间是今年的
+        List<ProjectCostBudget> budgets = baseMapper.getBudgetByYear2(y);
+        List<BigDecimal> list = new ArrayList<>();
+        if (budgets != null && budgets.size() > 0){
+            for (int i = 0; i < 12; i++) {
+                BigDecimal big = new BigDecimal(0);
+                for (ProjectCostBudget budget : budgets) {
+                    //如果计划实际开始时间和实际结束时间中有当月
+                    if ((budget.getPlanStartTime().getMonthValue() == (i+1) && budget.getPlanStartTime().getYear() == y)
+                            || ((budget.getPlanEndTime().getMonthValue() == (i+1)) && budget.getPlanEndTime().getYear() == y)){
+                        //如果实际结束时间是当月
+                        if ((budget.getPlanEndTime().getMonthValue() == (i+1) && budget.getPlanEndTime().getYear() == y)) {
+                            if (budget.getPlanIsTwoMonth() == 0){
+                                //人工成本没跨月,证明开始时间和结束时间是同一个月,直接使用人工成本到当月
+                                big = big.add(budget.getPlanStaffCost());
+                            }else {
+                                big = big.add(budget.getPlanEndMoney());
+                            }
+                            ////如果实际开始时间是当月
+                        }else if ((budget.getPlanStartTime().getMonthValue() == (i+1)) && budget.getPlanStartTime().getYear() == y){
+                            if (budget.getPlanIsTwoMonth() == 0){
+                                //人工成本没跨月,证明开始时间和结束时间是同一个月,直接使用人工成本到当月
+                                big = big.add(budget.getPlanStaffCost());
+                            }else {
+                                big = big.add(budget.getPlanStartMoney());
+                            }
+                        }
+                    }
+                }
+                list.add(big);
+            }
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+        }
+        return list;
+    }
+
     /**
      * 获取每月实际的人工支出,
      * @param y
      * @return
      */
     @Override
+    public List<BigDecimal> getAllMonthStaffCostByYear2(int y) {
+        //获取所有今年的固定计划,计划开始时间和结束时间是今年的
+        List<ProjectCostBudget> budgets = baseMapper.getBudgetByYear2(y);
+        List<BigDecimal> list = new ArrayList<>();
+        if (budgets != null && budgets.size() > 0){
+            for (int i = 0; i < 12; i++) {
+                BigDecimal big = new BigDecimal(0);
+                for (ProjectCostBudget budget : budgets) {
+                    //如果计划实际开始时间和实际结束时间中有当月
+                    if ((budget.getPlanStartTime().getMonthValue() == (i+1) && budget.getPlanStartTime().getYear() == y)
+                            || ((budget.getPlanEndTime().getMonthValue() == (i+1)) && budget.getPlanEndTime().getYear() == y)){
+                        //如果实际结束时间是当月
+                        if ((budget.getPlanEndTime().getMonthValue() == (i+1) && budget.getPlanEndTime().getYear() == y)) {
+                            if (budget.getPlanIsTwoMonth() == 0){
+                                //人工成本没跨月,证明开始时间和结束时间是同一个月,直接使用人工成本到当月
+                                big = big.add(budget.getPlanStaffCost());
+                            }else {
+                                big = big.add(budget.getPlanEndMoney());
+                            }
+                            ////如果实际开始时间是当月
+                        }else if ((budget.getPlanStartTime().getMonthValue() == (i+1)) && budget.getPlanStartTime().getYear() == y){
+                            if (budget.getPlanIsTwoMonth() == 0){
+                                //人工成本没跨月,证明开始时间和结束时间是同一个月,直接使用人工成本到当月
+                                big = big.add(budget.getPlanStaffCost());
+                            }else {
+                                big = big.add(budget.getPlanStartMoney());
+                            }
+                        }
+                    }
+                }
+                list.add(big);
+            }
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 获取每月预算的人工支出,
+     * @param y
+     * @return
+     */
+    @Override
     public List<BigDecimal> getAllMonthStaffCostByYear(int y) {
         //获取已经闭环的任务
         List<ProjectCostBudget> budgets = baseMapper.getBudgetByYear(y);

+ 29 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java

@@ -361,6 +361,35 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
         return decimal;
     }
 
+    /**
+     * 获取当年所有的报销,分月返回
+     * @param year
+     * @return
+     */
+    @Override
+    public List<BigDecimal> getThisYearAllReimburseByYear(int year) {
+        List<BigDecimal> list = new ArrayList<>();
+        //获取当年所有的报销
+        List<EMFinancialReimbursementInfo> infos = baseMapper.getThisYearReimburse2(year);
+        if (infos != null && infos.size() > 0){
+            for (int i = 0; i < 12; i++) {
+                BigDecimal big = new BigDecimal(0);
+                for (EMFinancialReimbursementInfo info : infos) {
+                    if (info.getFrDate().getMonth() == i){
+                        big = big.add(info.getFrMoney());
+                    }
+                }
+                list.add(big);
+            }
+            return list;
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+            return list;
+        }
+    }
+
     /**
      * 获取所有项目截至当年的报销支出,分月返回
      * @param year

+ 54 - 16
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -88,9 +88,9 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                     break;
                 }
                 if (ObjectUtil.isNotEmpty(dto.getSelectStatus())) {
-                    queryWrapper.and(obj -> obj.apply("audit_user_ids_complete LIKE '%" + SecureUtil.getUserId() + "%' AND STATUS =" + dto.getSelectStatus()));
+                    queryWrapper.and(obj -> obj.apply("audit_user_ids_complete LIKE '%" + SecureUtil.getUserId() + "%' AND STATUS =" + dto.getSelectStatus() + ") OR (audit_user_ids LIKE '%" + SecureUtil.getUserId() + "%' AND STATUS =" + dto.getSelectStatus()));
                 } else {
-                    queryWrapper.and(obj -> obj.apply("audit_user_ids_complete LIKE '%" + SecureUtil.getUserId() + "%' AND STATUS IN(1,2,3)"));
+                    queryWrapper.and(obj -> obj.apply("audit_user_ids_complete LIKE '%" + SecureUtil.getUserId() + "%' AND STATUS IN(1,2,3)) OR (audit_user_ids LIKE '%" + SecureUtil.getUserId() + "%' AND STATUS = 3"));
                 }
                 break;
             case "3":  //我发起的任务
@@ -278,6 +278,24 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                                         }
                                     }
 
+                                    //借款信息
+                                    if (ObjectUtil.isNotEmpty(voCW.getDeductLoanId())) {
+                                        EMLoanInfo emLoanInfo = jdbcTemplate.queryForObject("select * from c_expense_loan_info where id = " + voCW.getDeductLoanId(), new BeanPropertyRowMapper<>(EMLoanInfo.class));
+                                        if (emLoanInfo != null) {
+                                            Date useDate = emLoanInfo.getUseDate();
+                                            SimpleDateFormat smp = new SimpleDateFormat("yyyy年MM月dd日");
+                                            String format = smp.format(useDate);
+                                            BigDecimal difference;
+                                            if (ObjectUtil.isNotEmpty(emLoanInfo.getReturnMoney())) {
+                                                difference = emLoanInfo.getLoanMoney().subtract(emLoanInfo.getReturnMoney()).abs();
+                                            } else {
+                                                difference = emLoanInfo.getLoanMoney();
+                                            }
+                                            String title = format + "借款" + emLoanInfo.getLoanMoney() + "元,剩余" + difference + "元未还";
+                                            voCW.setLoanOutstandingBalance(difference);
+                                            voCW.setDeductLoanInfo(title);
+                                        }
+                                    }
                                     data = voCW;
                                 }
                                 break;
@@ -629,7 +647,10 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         List<ProjectCostBudget> records = pages.getRecords();
         List<String> taskIds = records.stream().map(ProjectCostBudget::getId).map(String::valueOf).collect(Collectors.toList());
         List<String> deptIds = records.stream().map(ProjectCostBudget::getDeptId).filter(ObjectUtil::isNotEmpty).map(String::valueOf).collect(Collectors.toList());
-        List<DepartmentMonthPlan> departmentMonthPlans = jdbcTemplate.query("select * from c_department_month_plan where dept_id in(" + StringUtils.join(deptIds, ",") + ")", new BeanPropertyRowMapper<>(DepartmentMonthPlan.class));
+        List<DepartmentMonthPlan> departmentMonthPlans = new ArrayList<>();
+        if (deptIds.size() > 0) {
+            departmentMonthPlans = jdbcTemplate.query("select * from c_department_month_plan where dept_id in(" + StringUtils.join(deptIds, ",") + ")", new BeanPropertyRowMapper<>(DepartmentMonthPlan.class));
+        }
 
         //获取所有审批任务与计划任务关系
         Map<String, ExpenseTaskRecord> taskRecordMaps = new LinkedHashMap<>();
@@ -681,7 +702,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                 vo.setEndTime(planEndTime);
             }
 
-            if (ObjectUtil.isNotEmpty(obj.getDeptId()) && ObjectUtil.isNotEmpty(obj.getPlanStartTime()) && ObjectUtil.isNotEmpty(obj.getPlanEndTime())) {
+            if (departmentMonthPlans.size() > 0 && ObjectUtil.isNotEmpty(obj.getDeptId()) && ObjectUtil.isNotEmpty(obj.getPlanStartTime()) && ObjectUtil.isNotEmpty(obj.getPlanEndTime())) {
                 for (DepartmentMonthPlan departmentMonthPlan : departmentMonthPlans) {
                     SimpleDateFormat smp = new SimpleDateFormat("yyyy-MM");
                     ZoneId zoneId = ZoneId.systemDefault();
@@ -861,6 +882,9 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                             }
                         }
 
+                        //日志操作信息
+                        planInformService.taskFinishedInform2("计划任务完成", taskProcessInfo.getAuditUserIds(), SecureUtil.getNickName(), taskProcessInfo.getStatus());
+
                     } else if (dto.getUpdateType().equals("2")) {
                         //任务转移
                         TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
@@ -897,6 +921,9 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
 
                         //新增审批任务关联信息
                         jdbcTemplate.execute("delete from c_expense_task_record where expense_info_type = 1 and expense_info_id = " + planTaskInfo.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + planTaskInfo.getId() + ",1)");
+
+                        //日志操作信息
+                        planInformService.taskFinishedInform2("计划任务转移", taskProcessInfo.getAuditUserIds(), SecureUtil.getNickName(), 4);
                     }
                 }
                 //解锁
@@ -1018,6 +1045,9 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                 //修改projectCostBudgetList的approve=2(审批中)
                 projectCostBudgetService.update(Wrappers.<ProjectCostBudget>lambdaUpdate().set(ProjectCostBudget::getApprove, 2).in(ProjectCostBudget::getId, ids));
 
+                //日志操作信息
+                planInformService.taskFinishedInform2("成本测算申请", taskProcessInfo.getAuditUserIds(), SecureUtil.getNickName(), taskProcessInfo.getStatus());
+
                 return true;
             }
         }
@@ -1035,18 +1065,26 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
     private void updateTaskStatus(Integer businessDataType, Integer taskStatus, Long approveTaskId, String dataId) {
         switch (businessDataType) {
             case 1: //计划任务
-                if (taskStatus == 2) { //通过审批
-                    //任务转移后,标记关系信息为转移任务
-                    jdbcTemplate.execute("update c_expense_task_record set is_transfer = 1 where expense_info_type = 1 and task_id = " + approveTaskId + " and expense_info_id = " + dataId);
-
-                    //删除当前计划任务与日志关系信息(如果任务转移,那么就不属于该用户了,就应该在新用户写日志时,与新用户绑定)
-                    jdbcTemplate.execute("delete from c_log_history_task_record where task_id = " + dataId);
-
-                } else if (taskStatus == 3) { //驳回审批
-                    TaskProcessInfo taskProcessInfo = jdbcTemplate.query("select status from c_task_process_info where id = " + approveTaskId, new BeanPropertyRowMapper<>(TaskProcessInfo.class)).stream().findAny().orElse(null);
-                    ProjectCostBudget projectCostBudget = jdbcTemplate.query("select plan_task_desc,task_user from c_project_cost_budget where id = " + dataId, new BeanPropertyRowMapper<>(ProjectCostBudget.class)).stream().findAny().orElse(null);
-                    if (taskProcessInfo != null && projectCostBudget != null) {
-                        planInformService.taskFinishedInform(projectCostBudget.getPlanTaskDesc(), projectCostBudget.getTaskUser(), SecureUtil.getNickName(), taskProcessInfo.getStatus());
+                TaskProcessInfo taskProcessInfo = jdbcTemplate.query("select status,task_name from c_task_process_info where id = " + approveTaskId, new BeanPropertyRowMapper<>(TaskProcessInfo.class)).stream().findAny().orElse(null);
+                if (taskProcessInfo != null) {
+                    if (taskStatus == 2) { //通过审批
+                        if (taskProcessInfo.getTaskName().contains("计划任务转移")) {
+                            //任务转移后,标记关系信息为转移任务
+                            jdbcTemplate.execute("update c_expense_task_record set is_transfer = 1 where expense_info_type = 1 and task_id = " + approveTaskId + " and expense_info_id = " + dataId);
+
+                            //任务转移后,标记关系信息为转移任务
+                            jdbcTemplate.execute("update c_expense_task_record set is_transfer = 1 where expense_info_type = 1 and task_id = " + approveTaskId + " and expense_info_id = " + dataId);
+
+                            //删除当前计划任务与日志关系信息(如果任务转移,那么就不属于该用户了,就应该在新用户写日志时,与新用户绑定)
+                            jdbcTemplate.execute("delete from c_log_history_task_record where task_id = " + dataId);
+                        }
+
+                    } else if (taskStatus == 3) { //驳回审批
+                        ProjectCostBudget projectCostBudget = jdbcTemplate.query("select plan_task_desc,task_user from c_project_cost_budget where id = " + dataId, new BeanPropertyRowMapper<>(ProjectCostBudget.class)).stream().findAny().orElse(null);
+                        if (projectCostBudget != null) {
+                            //日志操作信息
+                            planInformService.taskFinishedInform(projectCostBudget.getPlanTaskDesc(), projectCostBudget.getTaskUser(), SecureUtil.getNickName(), taskProcessInfo.getStatus());
+                        }
                     }
                 }
                 break;

+ 3 - 2
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -11,6 +11,7 @@ import com.jfireel.expression.node.impl.VariableNode;
 import com.jfireel.expression.token.Token;
 import org.apache.commons.collections4.MapUtils;
 import org.springblade.core.tool.utils.*;
+import org.springblade.manager.dto.ParamElements;
 
 import java.math.BigDecimal;
 import java.text.ParseException;
@@ -1448,7 +1449,7 @@ public class CustomFunction {
     }
 
     public static Object tree(List<String> treeNodes, String param) {
-        if (CollectionUtil.isNotEmpty(treeNodes) && Func.isNotBlank(param)) {
+        if (CollectionUtil.isNotEmpty(treeNodes) && Func.isNotBlank(param)&&RegexUtil.match(ParamElements.LEVEL_REG, param.trim())) {
             List<String> nodes = new ArrayList<>(treeNodes);
             //Collections.reverse(nodes);
             List<String> result = new ArrayList<>();
@@ -1462,7 +1463,7 @@ public class CustomFunction {
             }
             return String.join("", result);
         }
-        return "";
+        return param;
     }
 
     public static Object tableNames(List<String> treeNodes) {

+ 10 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -214,4 +214,14 @@ public class WbsTreeContractController extends BladeController {
         return R.data(vos);
     }
 
+    /**
+     * 同步项目到合同段所有表单排序
+     */
+    @GetMapping("/syncContractTabSort")
+    @ApiOperationSupport(order = 10)
+    @ApiOperation(value = "同步项目到合同段所有表单排序", notes = "传入projectId")
+    public R<Object> syncContractTabSort(@RequestParam String projectId) {
+        return R.status(iWbsTreeContractService.syncContractTabSort(projectId));
+    }
+
 }

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java

@@ -63,4 +63,6 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
 
     List<WbsTreeContractLazyVO> lazyQueryContractWbsTree(String id, String contractId, String contractIdRelation, String tableOwner);
 
+    boolean syncContractTabSort(String projectId);
+
 }

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

@@ -752,7 +752,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                         Object value=se.getValue().getValue();
                                         if(CustomFunction.isNumber(value)){
                                             if(StringUtils.isDouble(value)||f.contains("/")){
-                                                em.put(se.getKey(), new BigDecimal(value.toString()));
+                                                em.put(se.getKey(),Double.parseDouble(value.toString()));
                                             }else{
                                                 em.put(se.getKey(),StringUtils.handleObj2Integer(value));
                                             }

+ 46 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.common.collect.Lists;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
+import org.jetbrains.annotations.NotNull;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
@@ -41,7 +42,9 @@ import org.springblade.manager.service.IWbsTreeContractService;
 import org.springblade.manager.vo.*;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataAccessException;
 import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.jdbc.core.BatchPreparedStatementSetter;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
@@ -54,6 +57,9 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.math.BigInteger;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
 import java.util.*;
 import java.util.function.Function;
 import java.util.regex.Matcher;
@@ -812,6 +818,46 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return null;
     }
 
+    @Override
+    public boolean syncContractTabSort(String projectId) {
+        if (ObjectUtil.isNotEmpty(projectId)) {
+            List<WbsTreePrivate> tabs = jdbcTemplate.query("select id,sort from m_wbs_tree_private where is_deleted = 0 and sort is not null and wbs_type = 1 and project_id = " + projectId, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+            List<ContractInfo> contractInfos = jdbcTemplate.query("select id from m_contract_info where is_deleted = 0 and contract_type = 1 and p_id = " + projectId, new BeanPropertyRowMapper<>(ContractInfo.class));
+            for (ContractInfo contractInfo : contractInfos) {
+                for (List<WbsTreePrivate> wbsTreePrivates : Lists.partition(tabs, 1000)) {
+                    try {
+                        this.batchUpdateData(wbsTreePrivates, contractInfo.getId());
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        throw new ServiceException("保存数据异常,请联系管理员");
+                    }
+                }
+            }
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 批量修改合同段表单sort
+     *
+     * @param wbsTreePrivates 表分组(1000一组)
+     * @param contractId      合同段id
+     */
+    private void batchUpdateData(List<WbsTreePrivate> wbsTreePrivates, Long contractId) {
+        StringBuilder updateSqlBuilder = new StringBuilder("UPDATE m_wbs_tree_contract SET sort = CASE id ");
+        for (WbsTreePrivate wbsTreePrivate : wbsTreePrivates) {
+            updateSqlBuilder.append("WHEN ").append(wbsTreePrivate.getId()).append(" THEN ").append(wbsTreePrivate.getSort()).append(" ");
+        }
+        updateSqlBuilder.append("END WHERE id IN (");
+        for (WbsTreePrivate wbsTreePrivate : wbsTreePrivates) {
+            updateSqlBuilder.append(wbsTreePrivate.getId()).append(",");
+        }
+        updateSqlBuilder.deleteCharAt(updateSqlBuilder.length() - 1); //删除最后一个逗号
+        updateSqlBuilder.append(") AND contract_id = ").append(contractId);
+        jdbcTemplate.update(updateSqlBuilder.toString());
+    }
+
     /**
      * 反向递归获取父级(父级Id=子级parentId)
      *