浏览代码

Merge remote-tracking branch 'origin/master'

liuyc 2 年之前
父节点
当前提交
6114b78be6
共有 31 个文件被更改,包括 1075 次插入369 次删除
  1. 35 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/AnnualBudgetDTO.java
  2. 8 2
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/AnnualBudget.java
  3. 2 2
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/AnnualBudgetIncome.java
  4. 31 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetDisburseVO.java
  5. 40 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetIncomeVO.java
  6. 32 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetVO.java
  7. 50 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetVO2.java
  8. 2 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ControlProjectInfoVO.java
  9. 1 152
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/DatumPointService.java
  10. 0 38
      blade-service/blade-business/src/main/java/org/springblade/business/utils/ExcelUtil.java
  11. 95 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java
  12. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetDisburseMapper.java
  13. 3 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetDisburseMapper.xml
  14. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetIncomeMapper.java
  15. 3 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetIncomeMapper.xml
  16. 18 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.java
  17. 42 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.xml
  18. 1 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetDisburseService.java
  19. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetIncomeService.java
  20. 16 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetService.java
  21. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetDisburseServiceImpl.java
  22. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetIncomeServiceImpl.java
  23. 357 9
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java
  24. 1 0
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  25. 29 0
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  26. 2 25
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITurnPointCalculator.java
  27. 3 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/TurnPoint.java
  28. 72 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaTurnPoint.java
  29. 4 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java
  30. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  31. 211 133
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

+ 35 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/AnnualBudgetDTO.java

@@ -0,0 +1,35 @@
+package org.springblade.control.dto;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.AnnualBudget;
+import org.springblade.control.entity.AnnualBudgetDisburse;
+import org.springblade.control.entity.AnnualBudgetIncome;
+import org.springblade.control.entity.ProjectCostBudget;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/13 13:52
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AnnualBudgetDTO extends AnnualBudget {
+
+    @ApiModelProperty(value = "年度预算收入")
+    private List<AnnualBudgetIncome> incomeList;
+
+    @ApiModelProperty(value = "年度预算支出")
+    private List<AnnualBudgetDisburse> disburseList;
+
+}

+ 8 - 2
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/AnnualBudget.java

@@ -33,7 +33,7 @@ public class AnnualBudget extends BaseEntity {
             pattern = "yyyy-MM-dd"
             pattern = "yyyy-MM-dd"
     )
     )
     @ApiModelProperty(value = "预算开始时间")
     @ApiModelProperty(value = "预算开始时间")
-    private LocalDate budgetStartDate;
+    private LocalDate budgetStartTime;
 
 
     @DateTimeFormat(
     @DateTimeFormat(
             pattern = "yyyy-MM-dd"
             pattern = "yyyy-MM-dd"
@@ -42,7 +42,7 @@ public class AnnualBudget extends BaseEntity {
             pattern = "yyyy-MM-dd"
             pattern = "yyyy-MM-dd"
     )
     )
     @ApiModelProperty(value = "预算结束时间")
     @ApiModelProperty(value = "预算结束时间")
-    private LocalDate budgetEndDate;
+    private LocalDate budgetEndTime;
 
 
     @ApiModelProperty(value = "总预算")
     @ApiModelProperty(value = "总预算")
     private BigDecimal totalBudget;
     private BigDecimal totalBudget;
@@ -52,4 +52,10 @@ public class AnnualBudget extends BaseEntity {
 
 
     @ApiModelProperty(value = "年度利润指标")
     @ApiModelProperty(value = "年度利润指标")
     private BigDecimal annualProfitTarget;
     private BigDecimal annualProfitTarget;
+
+    @ApiModelProperty(value = "人工成本")
+    private BigDecimal staffCost;
+
+    @ApiModelProperty(value = "管理支出")
+    private BigDecimal manageDisburse;
 }
 }

+ 2 - 2
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/AnnualBudgetIncome.java

@@ -33,10 +33,10 @@ public class AnnualBudgetIncome extends BaseEntity {
     private Integer incomeType;
     private Integer incomeType;
 
 
     @ApiModelProperty(value = "项目类型")
     @ApiModelProperty(value = "项目类型")
-    private Integer projectType;
+    private String projectTypeValue;
 
 
     @ApiModelProperty(value = "合同类型")
     @ApiModelProperty(value = "合同类型")
-    private Integer contractType;
+    private String contractTypeValue;
 
 
     @DateTimeFormat(
     @DateTimeFormat(
             pattern = "yyyy-MM-dd"
             pattern = "yyyy-MM-dd"

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

@@ -0,0 +1,31 @@
+package org.springblade.control.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.AnnualBudgetDisburse;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/13 13:52
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AnnualBudgetDisburseVO extends AnnualBudgetDisburse {
+
+    @ApiModelProperty(value = "预算科目值")
+    private String budgetSubjectValue;
+
+    @ApiModelProperty(value = "二级科目值")
+    private String secondSubjectValue;
+
+    @ApiModelProperty(value = "当月金额")
+    private String currentMonthMoney;
+
+}

+ 40 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetIncomeVO.java

@@ -0,0 +1,40 @@
+package org.springblade.control.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.AnnualBudgetIncome;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/13 13:52
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AnnualBudgetIncomeVO extends AnnualBudgetIncome {
+
+    @ApiModelProperty(value = "年度预算id")
+    private String projectName;
+
+    @ApiModelProperty(value = "收入类型值")
+    private String incomeTypeValue;
+
+    @ApiModelProperty(value = "当月金额")
+    private String monthMoney;
+
+    @ApiModelProperty(value = "回款时间")
+    private LocalDate returnTime;
+
+    @ApiModelProperty(value = "回款金额")
+    private BigDecimal returnMoney;
+
+}

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

@@ -0,0 +1,32 @@
+package org.springblade.control.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.AnnualBudget;
+import org.springblade.control.entity.AnnualBudgetDisburse;
+import org.springblade.control.entity.AnnualBudgetIncome;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/13 13:52
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AnnualBudgetVO extends AnnualBudget {
+    @ApiModelProperty(value = "年度预算收入")
+    private List<AnnualBudgetIncome> incomeList;
+
+    @ApiModelProperty(value = "年度预算支出")
+    private List<AnnualBudgetDisburse> disburseList;
+}

+ 50 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetVO2.java

@@ -0,0 +1,50 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.AnnualBudget;
+import org.springblade.control.entity.AnnualBudgetDisburse;
+import org.springblade.control.entity.AnnualBudgetIncome;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/13 13:52
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AnnualBudgetVO2 extends AnnualBudget {
+
+    @ApiModelProperty(value = "收入")
+    private List<IncomeDetail> MonthIncome;
+
+    @ApiModelProperty(value = "支出")
+    private List<disburseDetail> MonthDisburse;
+
+    @ApiModelProperty(value = "月总计")
+    private List<BigDecimal> MonthTotal;
+
+    @Data
+    public static class IncomeDetail{
+        @ApiModelProperty(value = "收入")
+        private BigDecimal income;
+
+        @ApiModelProperty(value = "当月收入详情")
+        private List<AnnualBudgetIncomeVO> incomeList;
+    }
+
+    @Data
+    public static class disburseDetail{
+        @ApiModelProperty(value = "支出")
+        private BigDecimal disburse;
+
+        @ApiModelProperty(value = "当月支出详情")
+        private List<AnnualBudgetDisburseVO> disburseList;
+    }
+
+
+}

+ 2 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ControlProjectInfoVO.java

@@ -22,6 +22,8 @@ public class ControlProjectInfoVO extends ControlProjectInfo {
     private String projectServerTypeValue;
     private String projectServerTypeValue;
     @ApiModelProperty(value = "合同金额")
     @ApiModelProperty(value = "合同金额")
     private BigDecimal contractMoney;
     private BigDecimal contractMoney;
+    @ApiModelProperty(value = "合同类型值")
+    private String contractTypeValue;
     @ApiModelProperty(value = "项目负责人名称")
     @ApiModelProperty(value = "项目负责人名称")
     private String projectPrincipalName;
     private String projectPrincipalName;
     @ApiModelProperty(value = "实施负责人名称")
     @ApiModelProperty(value = "实施负责人名称")

+ 1 - 152
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/DatumPointService.java

@@ -2,15 +2,10 @@ package org.springblade.business.service.impl;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import io.reactivex.Single;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
-import org.apache.poi.ss.usermodel.*;
 import org.springblade.business.entity.DatumPoint;
 import org.springblade.business.entity.DatumPoint;
-import org.springblade.business.excel.DatumPointExcel;
 import org.springblade.business.excel.DatumPointxyExcel;
 import org.springblade.business.excel.DatumPointxyExcel;
-import org.springblade.business.excel.MileageExcel;
 import org.springblade.business.mapper.DatumPointMapper;
 import org.springblade.business.mapper.DatumPointMapper;
-import org.springblade.business.utils.ExcelUtil;
 import org.springblade.common.utils.BaseUtils;
 import org.springblade.common.utils.BaseUtils;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
@@ -141,154 +136,8 @@ public class DatumPointService extends BaseServiceImpl<DatumPointMapper, DatumPo
         return R.fail("导入失败");
         return R.fail("导入失败");
     }
     }
 
 
-//    public R importData_bak(MultipartFile file, Long contractId, Long projectId, Integer dataType) throws Exception {
-//        List<String> level=new ArrayList<>();
-//        level.add("一级");
-//        level.add("二级");
-//        level.add("三级");
-//        level.add("四级");
-//        try {
-//            Workbook wb = WorkbookFactory.create(file.getInputStream());
-//            Sheet sheet = wb.getSheetAt(0);
-//            List<DatumPoint> importList = new ArrayList<>();
-//            Row row1=sheet.getRow(0);
-//            if(dataType==0){
-//                String dengji= ExcelUtil.getValue(row1.getCell(2)).toString();
-//                String beizhu=ExcelUtil.getValue(row1.getCell(3)).toString();
-//                if( !"等级".equals(dengji)||!"备注".equals(beizhu)){
-//                    return  R.fail("导入的数据格式有错,请对准导入模板确认!");
-//                }
-//            }
-//            if(dataType==1){
-//                String dengji=ExcelUtil.getValue(row1.getCell(4)).toString();
-//                String beizhu=ExcelUtil.getValue(row1.getCell(5)).toString();
-//                if( !"等级".equals(dengji)||!"备注".equals(beizhu)){
-//                    return  R.fail("导入的数据格式有错,请对准导入模板确认!");
-//                }
-//            }
-//
-//            for (int i = 1; ; i++) {
-//                Row row = sheet.getRow(i);
-//                if(row == null) {
-//                    break;
-//                }
-//                if(dataType==0) {
-//                    DatumPoint obj = new DatumPoint();
-//                    for (int j = 0; j < 4; j++) {
-//                        String value = (String) ExcelUtil.getValue(row.getCell(j));
-//                        if (StringUtil.isEmpty(value)) {
-//                            value = "";
-//                        }
-//                        String msg="";
-//                        //判断测站点名称是否为空
-//                        String name=(String)ExcelUtil.getValue(row.getCell(0));
-//                        if(StringUtil.isEmpty(name)){
-//                            msg="第"+i+"行,测站点名称为空,请输入!";
-//                            return  R.fail(msg);
-//                        }
-//                        //判断,同一合同段下,测站点名称是否重复
-//                        if(this.count(Wrappers.<DatumPoint>lambdaQuery().eq(DatumPoint::getName,name).eq(DatumPoint::getContractId,contractId).eq(DatumPoint::getType,dataType))>0){
-//                            msg="第"+i+"行,测站点:"+name+"已存在,请修改";
-//                            return  R.fail(msg);
-//                        }
-//                        switch (j) {
-//                            case 0:
-//                                obj.setName(value);
-//                                break;
-//                            case 1:
-//                                obj.setH(Double.parseDouble(value));
-//                                break;
-//                            case 2:
-//                                //判断等级是否为:一级、二级、三级、四级
-//                                if(StringUtil.isNotBlank((String) ExcelUtil.getValue(row.getCell(j)))) {
-//                                    if(!level.contains(value)){
-//                                        msg="第"+i+"行,等级应该为:一级、二级、三级 或 四级,请修改!";
-//                                        return  R.fail(msg);
-//                                    }
-//                                    obj.setLevel(value);
-//                                }
-//                                break;
-//                            case 3:
-//                                obj.setRemark(value);
-//                                break;
-//                            default:
-//                                break;
-//                        }
-//
-//                    }
-//                    obj.setContractId(contractId);
-//                    obj.setProjectId(projectId);
-//                    obj.setCreateTime(new Date());
-//                    obj.setType(dataType);
-//                    importList.add(obj);
-//                }
-//                if(dataType==1){
-//                    DatumPoint obj = new DatumPoint();
-//                    for (int j = 0; j < 6; j++) {
-//                        String value = (String) ExcelUtil.getValue(row.getCell(j));
-//                        if (StringUtil.isEmpty(value)) {
-//                            value = "";
-//                        }
-//                        String msg="";
-//                        //判断测站点名称是否为空
-//                        String name=(String)ExcelUtil.getValue(row.getCell(0));
-//                        if(StringUtil.isEmpty(name)){
-//                            msg="第"+i+"行,测站点名称为空,请输入!";
-//                            return  R.fail(msg);
-//                        }
-//                        //判断,同一合同段下,测站点名称是否重复
-//                        if(this.count(Wrappers.<DatumPoint>lambdaQuery().eq(DatumPoint::getName,name).eq(DatumPoint::getContractId,contractId).eq(DatumPoint::getType,dataType))>0){
-//                            msg="第"+i+"行,测站点:"+name+"已存在,请修改";
-//                            return  R.fail(msg);
-//                        }
-//                        switch (j) {
-//                            case 0:
-//                                obj.setName(value);
-//                                break;
-//                            case 1:
-//                                obj.setX(Double.parseDouble(value));
-//                                break;
-//                            case 2:
-//                                obj.setY(Double.parseDouble(value));
-//                                break;
-//                            case 3:
-//                                obj.setH(Double.parseDouble(value));
-//                                break;
-//                            case 4:
-//                                //判断等级是否为:一级、二级、三级、四级
-//                                if(StringUtil.isNotBlank((String) ExcelUtil.getValue(row.getCell(j)))) {
-//                                    if(!level.contains(value)){
-//                                        msg="第"+i+"行,等级应该为:一级、二级、三级 或 四级,请修改!";
-//                                        return  R.fail(msg);
-//                                    }
-//                                    obj.setLevel(value);
-//                                }
-//                                break;
-//                            case 5:
-//                                obj.setRemark(value);
-//                                break;
-//                            default:
-//                                break;
-//                        }
-//
-//                    }
-//                    obj.setContractId(contractId);
-//                    obj.setProjectId(projectId);
-//                    obj.setCreateTime(new Date());
-//                    obj.setType(dataType);
-//                    importList.add(obj);
-//                }
-//            }
-//            //批量保存
-//            this.saveBatch(importList);
-//            return   R.success("导入成功");
-//        } catch (Exception e){
-//            e.printStackTrace();
-//        }
-//        return  R.fail("执行异常");
-//    }
 
 
-    /*导出数据*/
+    /**导出数据*/
     public List<DatumPoint> exportExcel(String contractId, Integer type, String search) {
     public List<DatumPoint> exportExcel(String contractId, Integer type, String search) {
         if (StringUtil.isBlank(search)) {
         if (StringUtil.isBlank(search)) {
             search = "";
             search = "";

+ 0 - 38
blade-service/blade-business/src/main/java/org/springblade/business/utils/ExcelUtil.java

@@ -1,38 +0,0 @@
-package org.springblade.business.utils;
-
-import org.apache.poi.hssf.usermodel.HSSFDataFormatter;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellType;
-
-/**
- * @author yangyj
- * @Date 2022/6/8 11:18
- * @description TODO
- */
-public class ExcelUtil {
-    public static Object getValue(Cell cell) {
-        if (cell != null) {
-            switch (cell.getCellTypeEnum()) {
-                case STRING:
-                    return cell.getStringCellValue() == null ? null : cell.getStringCellValue().trim();
-                case NUMERIC:
-                    HSSFDataFormatter dataFormatter = new HSSFDataFormatter();
-                    return dataFormatter.formatCellValue(cell);
-                case BOOLEAN:
-                    return cell.getBooleanCellValue();
-                case ERROR:
-                    return cell.getErrorCellValue();
-                case FORMULA:
-                    try {
-                        return cell.getStringCellValue();
-                    } catch (IllegalStateException e) {
-                        return cell.getNumericCellValue();
-                    }
-                default:
-                    cell.setCellType(CellType.STRING);
-                    return cell.getStringCellValue() == null ? null : cell.getStringCellValue().trim();
-            }
-        }
-        return null;
-    }
-}

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

@@ -1,11 +1,18 @@
 package org.springblade.control.controller;
 package org.springblade.control.controller;
 
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import org.springblade.control.dto.AnnualBudgetDTO;
+import org.springblade.control.dto.ControlProjectInfoDTO;
 import org.springblade.control.entity.DepartmentMonthPlan;
 import org.springblade.control.entity.DepartmentMonthPlan;
+import org.springblade.control.service.IAnnualBudgetService;
 import org.springblade.control.service.IDepartmentMonthPlanService;
 import org.springblade.control.service.IDepartmentMonthPlanService;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
@@ -19,6 +26,94 @@ import org.springframework.web.bind.annotation.*;
 @RequestMapping("/annualBudget")
 @RequestMapping("/annualBudget")
 @Api(value = "年度经营预算接口", tags = "年度经营预算接口")
 @Api(value = "年度经营预算接口", tags = "年度经营预算接口")
 public class AnnualBudgetController {
 public class AnnualBudgetController {
+    private final IAnnualBudgetService budgetService;
 
 
+    /**
+     * 新增年度经营预算
+     */
+    @PostMapping("/addAnnualBudget")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "新增年度经营预算")
+    public R addAnnualBudget(@RequestBody AnnualBudgetDTO dto) {
+        budgetService.addAnnualBudget(dto);
+        return R.success("新增成功");
+    }
+
+    /**
+     * 获取单个年度经营预算
+     */
+    @GetMapping("/getAnnualBudget")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "获取单个年度经营预算")
+    public R getAnnualBudget(Long id) {
+        return R.data(budgetService.getAnnualBudget(id));
+    }
+
+    /**
+     * 修改年度经营预算
+     */
+    @PostMapping("/updateAnnualBudget")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "修改年度经营预算")
+    public R updateAnnualBudget(@RequestBody AnnualBudgetDTO dto) {
+        budgetService.updateAnnualBudget(dto);
+        return R.success("修改成功");
+    }
+
+    /**
+     * 删除单个年度经营预算
+     */
+    @GetMapping("/deleteAnnualBudget")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "删除单个年度经营预算")
+    public R deleteAnnualBudget(Long id) {
+        budgetService.deleteAnnualBudget(id);
+        return R.success("删除成功");
+    }
+
+
+    /**
+     * 年度经营预算列表
+     */
+    @GetMapping("/page")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "年度经营预算列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "current", value = "当前页", required = true),
+            @ApiImplicitParam(name = "size", value = "每页的数量", required = true),
+    })
+    public R page(Query query) {
+        return R.data(budgetService.page(new Page<>(query.getCurrent(), query.getSize())));
+    }
+
+    /**
+     * 查询预览
+     */
+    @GetMapping("/preview")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "查询预览")
+    public R preview(Long id) {
+        return R.data(budgetService.preview(id));
+    }
+
+    /**
+     * 获取项目列表
+     */
+    @GetMapping("/getProjectList")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "获取项目列表")
+    public R getProjectList() {
+        return R.data(budgetService.getProjectList());
+    }
+
+    /**
+     * 获取二级科目
+     */
+    @GetMapping("/getSecondSubject")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "获取二级科目")
+    public R getSecondSubject() {
+        return R.data(budgetService.getSecondSubject());
+    }
 
 
 }
 }

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

@@ -1,6 +1,7 @@
 package org.springblade.control.mapper;
 package org.springblade.control.mapper;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 import org.springblade.control.entity.AnnualBudgetDisburse;
 import org.springblade.control.entity.AnnualBudgetDisburse;
 import org.springblade.control.entity.AnnualBudgetIncome;
 import org.springblade.control.entity.AnnualBudgetIncome;
 
 
@@ -11,4 +12,5 @@ import org.springblade.control.entity.AnnualBudgetIncome;
  **/
  **/
 public interface AnnualBudgetDisburseMapper extends BaseMapper<AnnualBudgetDisburse> {
 public interface AnnualBudgetDisburseMapper extends BaseMapper<AnnualBudgetDisburse> {
 
 
+    void deleteByAnnualId(@Param("id") Long id);
 }
 }

+ 3 - 1
blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetDisburseMapper.xml

@@ -3,5 +3,7 @@
 <mapper namespace="org.springblade.control.mapper.AnnualBudgetDisburseMapper">
 <mapper namespace="org.springblade.control.mapper.AnnualBudgetDisburseMapper">
 
 
 
 
-
+    <delete id="deleteByAnnualId">
+        delete from c_annual_budget_disburse where annual_budget_id = #{id}
+    </delete>
 </mapper>
 </mapper>

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

@@ -1,6 +1,7 @@
 package org.springblade.control.mapper;
 package org.springblade.control.mapper;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 import org.springblade.control.entity.AnnualBudget;
 import org.springblade.control.entity.AnnualBudget;
 import org.springblade.control.entity.AnnualBudgetIncome;
 import org.springblade.control.entity.AnnualBudgetIncome;
 
 
@@ -11,4 +12,5 @@ import org.springblade.control.entity.AnnualBudgetIncome;
  **/
  **/
 public interface AnnualBudgetIncomeMapper extends BaseMapper<AnnualBudgetIncome> {
 public interface AnnualBudgetIncomeMapper extends BaseMapper<AnnualBudgetIncome> {
 
 
+    void deleteByAnnualId(@Param("id") Long id);
 }
 }

+ 3 - 1
blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetIncomeMapper.xml

@@ -3,5 +3,7 @@
 <mapper namespace="org.springblade.control.mapper.AnnualBudgetIncomeMapper">
 <mapper namespace="org.springblade.control.mapper.AnnualBudgetIncomeMapper">
 
 
 
 
-
+    <delete id="deleteByAnnualId">
+        delete from c_annual_budget_income where annual_budget_id = #{id}
+    </delete>
 </mapper>
 </mapper>

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

@@ -1,12 +1,16 @@
 package org.springblade.control.mapper;
 package org.springblade.control.mapper;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.control.entity.AnnualBudget;
 import org.springblade.control.entity.AnnualBudget;
+import org.springblade.control.entity.ContractReturnedInfo;
 import org.springblade.control.entity.DepartmentMonthPlan;
 import org.springblade.control.entity.DepartmentMonthPlan;
 import org.springblade.control.entity.DictInfo;
 import org.springblade.control.entity.DictInfo;
+import org.springblade.control.vo.*;
 
 
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 /**
 /**
  * @Param
  * @Param
@@ -15,4 +19,18 @@ import java.util.List;
  **/
  **/
 public interface AnnualBudgetMapper extends BaseMapper<AnnualBudget> {
 public interface AnnualBudgetMapper extends BaseMapper<AnnualBudget> {
 
 
+    AnnualBudgetVO getAnnualBudget(@Param("id") Long id);
+
+    void removeById(@Param("id") Long id);
+
+    List<ControlProjectInfoVO> getProjectList();
+
+    List<AnnualBudgetIncomeVO> getReturnedByAnnualBudgetId(@Param("id") Long id);
+
+    List<AnnualBudgetDisburseVO> getDisburseByAnnualBudgetId(@Param("id") Long id);
+
+
+    List<DictInfoVO> getAllBudgetSubject();
+
+    List<DictInfoVO> getAllSecondSubject();
 }
 }

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

@@ -1,7 +1,49 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.springblade.control.mapper.AnnualBudgetMapper">
 <mapper namespace="org.springblade.control.mapper.AnnualBudgetMapper">
+    <delete id="removeById">
+        delete from c_annual_budget where id = #{id}
+    </delete>
 
 
 
 
+    <select id="getAnnualBudget" resultType="org.springblade.control.vo.AnnualBudgetVO">
+        select * from c_annual_budget
+        where id = #{id}
+    </select>
+    <select id="getProjectList" resultType="org.springblade.control.vo.ControlProjectInfoVO">
+        select cpi.name,
+               (select dict_name  from c_dict_info WHERE code = 'project_type' AND dict_value = cpi.project_type) as projectTypeValue,
+               (select dict_name  from c_dict_info WHERE code = 'contract_type' AND dict_value= cci.contract_type) as contractTypeValue
+        from c_control_project_info cpi left join c_control_contract_info cci on cpi.id = cci.project_id
+    </select>
+    <select id="getReturnedByAnnualBudgetId" resultType="org.springblade.control.vo.AnnualBudgetIncomeVO">
+        SELECT
+                (select name from c_control_project_info WHERE id = abi.project_id ) as projectName,
+                (select dict_name  from c_dict_info WHERE code = 'project_income_type' AND dict_value = abi.income_type) as incomeTypeValue,
+                abi.project_type_value ,
+               abi.contract_type_value,
+               cri.practical_returned_time as returnTime,
+               cri.practical_returned_money as returnMoney
+        FROM c_annual_budget_income abi left join c_contract_returned_info cri on abi.project_id = cri.project_id
+        WHERE cri.practical_returned_time is not null and cri.practical_returned_money is not NULL
+          AND abi.annual_budget_id = #{id}
+    </select>
+    <select id="getDisburseByAnnualBudgetId" resultType="org.springblade.control.vo.AnnualBudgetDisburseVO">
+        select abd.*,
+               (select dict_name  from c_dict_info WHERE `type` = 1 AND dict_value = abd.budget_subject AND parent_id = 0) as budgetSubjectValue,
+               (select dict_name  from c_dict_info WHERE `type` = 1 AND dict_value = abd.second_subject
+                       AND parent_id = (select id  from c_dict_info WHERE `type` = 1 AND dict_value = abd.budget_subject AND parent_id = 0)) as secondSubjectValue
+        from c_annual_budget_disburse abd
+        WHERE abd.annual_budget_id = #{id}
+    </select>
+    <select id="getAllBudgetSubject" resultType="org.springblade.control.vo.DictInfoVO">
+        select *
+        from c_dict_info di WHERE di.`type` = 1 AND di.parent_id = 0 ORDER BY sort
+    </select>
+    <select id="getAllSecondSubject" resultType="org.springblade.control.vo.DictInfoVO">
+        select *
+        from c_dict_info di WHERE di.`type` = 1 AND di.parent_id > 0
+    </select>
+
 
 
 </mapper>
 </mapper>

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

@@ -11,5 +11,6 @@ import org.springblade.core.mp.base.BaseService;
  **/
  **/
 public interface IAnnualBudgetDisburseService extends BaseService<AnnualBudgetDisburse> {
 public interface IAnnualBudgetDisburseService extends BaseService<AnnualBudgetDisburse> {
 
 
+    void deleteByAnnualId(Long id);
 
 
 }
 }

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

@@ -11,5 +11,5 @@ import org.springblade.core.mp.base.BaseService;
  **/
  **/
 public interface IAnnualBudgetIncomeService extends BaseService<AnnualBudgetIncome> {
 public interface IAnnualBudgetIncomeService extends BaseService<AnnualBudgetIncome> {
 
 
-
+    void deleteByAnnualId(Long id);
 }
 }

+ 16 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetService.java

@@ -1,12 +1,14 @@
 package org.springblade.control.service;
 package org.springblade.control.service;
 
 
+import org.springblade.control.dto.AnnualBudgetDTO;
 import org.springblade.control.entity.AnnualBudget;
 import org.springblade.control.entity.AnnualBudget;
 import org.springblade.control.entity.DepartmentMonthPlan;
 import org.springblade.control.entity.DepartmentMonthPlan;
 import org.springblade.control.entity.DictInfo;
 import org.springblade.control.entity.DictInfo;
-import org.springblade.control.vo.ProjectCostBudgetVO;
+import org.springblade.control.vo.*;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.base.BaseService;
 
 
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 /**
 /**
  * @Param
  * @Param
@@ -16,4 +18,17 @@ import java.util.List;
 public interface IAnnualBudgetService extends BaseService<AnnualBudget> {
 public interface IAnnualBudgetService extends BaseService<AnnualBudget> {
 
 
 
 
+    void addAnnualBudget(AnnualBudgetDTO dto);
+
+    void updateAnnualBudget(AnnualBudgetDTO dto);
+
+    AnnualBudgetVO getAnnualBudget(Long id);
+
+    void deleteAnnualBudget(Long id);
+
+    List<ControlProjectInfoVO> getProjectList();
+
+    AnnualBudgetVO2 preview(Long id);
+
+    List<DictInfoVO> getSecondSubject();
 }
 }

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

@@ -20,4 +20,8 @@ import org.springframework.stereotype.Service;
 public class AnnualBudgetDisburseServiceImpl extends BaseServiceImpl<AnnualBudgetDisburseMapper, AnnualBudgetDisburse> implements IAnnualBudgetDisburseService {
 public class AnnualBudgetDisburseServiceImpl extends BaseServiceImpl<AnnualBudgetDisburseMapper, AnnualBudgetDisburse> implements IAnnualBudgetDisburseService {
 
 
 
 
+    @Override
+    public void deleteByAnnualId(Long id) {
+        baseMapper.deleteByAnnualId(id);
+    }
 }
 }

+ 4 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetIncomeServiceImpl.java

@@ -20,4 +20,8 @@ import org.springframework.stereotype.Service;
 public class AnnualBudgetIncomeServiceImpl extends BaseServiceImpl<AnnualBudgetIncomeMapper, AnnualBudgetIncome> implements IAnnualBudgetIncomeService {
 public class AnnualBudgetIncomeServiceImpl extends BaseServiceImpl<AnnualBudgetIncomeMapper, AnnualBudgetIncome> implements IAnnualBudgetIncomeService {
 
 
 
 
+    @Override
+    public void deleteByAnnualId(Long id) {
+        baseMapper.deleteByAnnualId(id);
+    }
 }
 }

+ 357 - 9
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -2,21 +2,22 @@ package org.springblade.control.service.impl;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
-import org.springblade.control.entity.AnnualBudget;
-import org.springblade.control.entity.DepartmentMonthPlan;
-import org.springblade.control.entity.DictInfo;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.control.dto.AnnualBudgetDTO;
+import org.springblade.control.entity.*;
 import org.springblade.control.mapper.AnnualBudgetMapper;
 import org.springblade.control.mapper.AnnualBudgetMapper;
 import org.springblade.control.mapper.DepartmentMonthPlanMapper;
 import org.springblade.control.mapper.DepartmentMonthPlanMapper;
-import org.springblade.control.service.IAnnualBudgetService;
-import org.springblade.control.service.IDepartmentMonthPlanService;
-import org.springblade.control.service.IProjectCostBudgetService;
-import org.springblade.control.vo.ProjectCostBudgetVO;
+import org.springblade.control.service.*;
+import org.springblade.control.vo.*;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 
-import java.util.ArrayList;
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 
 /**
 /**
  * @Param
  * @Param
@@ -27,5 +28,352 @@ import java.util.List;
 @AllArgsConstructor
 @AllArgsConstructor
 public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper, AnnualBudget> implements IAnnualBudgetService {
 public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper, AnnualBudget> implements IAnnualBudgetService {
 
 
+    private final IAnnualBudgetIncomeService incomeService;
 
 
+    private final IAnnualBudgetDisburseService disburseService;
+
+    /**
+     * 新增年度经营预算
+     * @param dto
+     */
+    @Override
+    @Transactional
+    public void addAnnualBudget(AnnualBudgetDTO dto) {
+        Long id = SnowFlakeUtil.getId();
+        dto.setId(id);
+        //统计支出
+        Map<String, BigDecimal> map = statisticDisburse(dto);
+        BigDecimal disburseTotal = map.get("1");
+        BigDecimal staffTotal = map.get("2");
+        //统计收入
+        Map<String, BigDecimal> map2 = statisticIncome(dto);
+        BigDecimal contractTotal = map2.get("1");
+        BigDecimal planReturnedTotal = map2.get("2");
+
+        //总经营预算
+        dto.setTotalBudget(disburseTotal);
+        //年度合同指标
+        dto.setAnnualContractTarget(contractTotal);
+        //年度利润指标
+        dto.setAnnualProfitTarget(planReturnedTotal.subtract(disburseTotal));
+        //人工成本
+        dto.setStaffCost(staffTotal);
+        //管理支出
+        dto.setManageDisburse(disburseTotal.subtract(staffTotal));
+
+        //保存年度预算
+        AnnualBudget annualBudget = new AnnualBudget();
+        BeanUtils.copyProperties(dto,annualBudget);
+        this.save(annualBudget);
+        //保存年度收入
+        incomeService.saveBatch(dto.getIncomeList());
+        //保存年度支出
+        disburseService.saveBatch(dto.getDisburseList());
+
+    }
+
+    /**
+     * 修改年度经营预算
+     * @param dto
+     */
+    @Override
+    @Transactional
+    public void updateAnnualBudget(AnnualBudgetDTO dto) {
+        //统计支出
+        Map<String, BigDecimal> map = statisticDisburse(dto);
+        BigDecimal disburseTotal = map.get("1");
+        BigDecimal staffTotal = map.get("2");
+        //统计收入
+        Map<String, BigDecimal> map2 = statisticIncome(dto);
+        BigDecimal contractTotal = map2.get("1");
+        BigDecimal planReturnedTotal = map2.get("2");
+
+        //总经营预算
+        dto.setTotalBudget(disburseTotal);
+        //年度合同指标
+        dto.setAnnualContractTarget(contractTotal);
+        //年度利润指标
+        dto.setAnnualProfitTarget(planReturnedTotal.subtract(disburseTotal));
+        //人工成本
+        dto.setStaffCost(staffTotal);
+        //管理支出
+        dto.setManageDisburse(disburseTotal.subtract(staffTotal));
+
+        //保存年度预算
+        AnnualBudget annualBudget = new AnnualBudget();
+        BeanUtils.copyProperties(dto,annualBudget);
+        this.updateById(annualBudget);
+        //保存年度收入
+        incomeService.deleteByAnnualId(dto.getId());
+        incomeService.saveBatch(dto.getIncomeList());
+        //保存年度支出
+        disburseService.deleteByAnnualId(dto.getId());
+        disburseService.saveBatch(dto.getDisburseList());
+    }
+
+    /**
+     * 获取单个年度经营预算
+     */
+    @Override
+    public AnnualBudgetVO getAnnualBudget(Long id) {
+        //获取总预算
+        AnnualBudgetVO vo = baseMapper.getAnnualBudget(id);
+        //获取收入列表
+        List<AnnualBudgetIncome> incomeList = incomeService.list(new LambdaQueryWrapper<AnnualBudgetIncome>().eq(AnnualBudgetIncome::getAnnualBudgetId, id));
+        vo.setIncomeList(incomeList);
+        //获取支出列表
+        List<AnnualBudgetDisburse> disburseList = disburseService.list(new LambdaQueryWrapper<AnnualBudgetDisburse>().eq(AnnualBudgetDisburse::getAnnualBudgetId, id));
+        vo.setDisburseList(disburseList);
+        return vo;
+    }
+
+    /**
+     * 删除单个年度经营预算
+     */
+    @Override
+    @Transactional
+    public void deleteAnnualBudget(Long id) {
+        baseMapper.removeById(id);
+        incomeService.deleteByAnnualId(id);
+        disburseService.deleteByAnnualId(id);
+    }
+
+    /**
+     * 获取项目列表及相关信息
+     * @return
+     */
+    @Override
+    public List<ControlProjectInfoVO> getProjectList() {
+        return baseMapper.getProjectList();
+    }
+
+    /**
+     * 查询预览
+     */
+    @Override
+    public AnnualBudgetVO2 preview(Long id) {
+        AnnualBudgetVO2 vo2 = new AnnualBudgetVO2();
+        List<AnnualBudgetVO2.IncomeDetail> incomeDetails = new ArrayList<>();
+        List<AnnualBudgetVO2.disburseDetail> disburseDetails = new ArrayList<>();
+        List<BigDecimal> bigDecimals = new ArrayList<>();
+        //获取预算收入集合
+        List<AnnualBudgetIncomeVO> incomeList = baseMapper.getReturnedByAnnualBudgetId(id);
+        //获取预算支出集合
+        List<AnnualBudgetDisburseVO> disburseList = baseMapper.getDisburseByAnnualBudgetId(id);
+        //分别计算12个月
+        for (int i = 1; i <= 12; i++) {
+            //统计单月收入
+            AnnualBudgetVO2.IncomeDetail incomeDetail = new AnnualBudgetVO2.IncomeDetail();
+            BigDecimal incomeTotal = new BigDecimal("0");
+            List<AnnualBudgetIncomeVO> list1 = new ArrayList<>();
+            if (incomeList != null && incomeList.size() >0){
+                for (AnnualBudgetIncomeVO vo : incomeList) {
+                    if (vo.getReturnTime().getMonthValue() == i) {
+                        incomeTotal = incomeTotal.add(vo.getReturnMoney());
+                        list1.add(vo);
+                    }
+                }
+            }
+            //移除集中和已经通过的月
+            incomeDetail.setIncome(incomeTotal);
+            incomeDetail.setIncomeList(list1);
+            incomeDetails.add(incomeDetail);
+            //统计单月支出
+            AnnualBudgetVO2.disburseDetail disburseDetail = new AnnualBudgetVO2.disburseDetail();
+            BigDecimal disburseTotal = new BigDecimal("0");
+            List<AnnualBudgetDisburseVO> list2 = new ArrayList<>();
+            if (disburseList != null && disburseList.size() >0){
+                for (AnnualBudgetDisburseVO vo : disburseList) {
+                    if (i == 1){
+                        if (vo.getJanuary().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getJanuary());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 2){
+                        if (vo.getFebruary().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getFebruary());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 3){
+                        if (vo.getMarch().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getMarch());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 4){
+                        if (vo.getApril().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getApril());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 5){
+                        if (vo.getMay().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getMay());
+                            list2.add(vo);
+                          }
+                    }
+                    if (i == 6){
+                        if (vo.getJune().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getJune());
+                            list2.add(vo);
+                         }
+                    }
+                    if (i == 7){
+                        if (vo.getJuly().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getJuly());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 8){
+                        if (vo.getAugust().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getAugust());
+                        }
+                    }
+                    if (i == 9){
+                        if (vo.getSeptember().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getSeptember());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 10){
+                        if (vo.getOctober().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getOctober());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 11){
+                        if (vo.getNovember().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getNovember());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 12){
+                        if (vo.getDecember().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getDecember());
+                            list2.add(vo);
+                        }
+                    }
+                }
+            }
+            disburseDetail.setDisburse(disburseTotal);
+            disburseDetail.setDisburseList(list2);
+            disburseDetails.add(disburseDetail);
+            //统计单月盈利,月收入-月支出
+            bigDecimals.add(incomeTotal.subtract(disburseTotal));
+
+        }
+        vo2.setMonthIncome(incomeDetails);
+        vo2.setMonthDisburse(disburseDetails);
+        vo2.setMonthTotal(bigDecimals);
+        return vo2;
+    }
+
+    /**
+     * 获取二级科目
+     */
+    @Override
+    public List<DictInfoVO> getSecondSubject() {
+        List<DictInfoVO> allBudgetSubject = baseMapper.getAllBudgetSubject();
+        List<DictInfoVO> allSecondSubject =baseMapper.getAllSecondSubject();
+        for (DictInfoVO vo : allBudgetSubject) {
+            List<DictInfoVO> list = new ArrayList<>();
+            for (DictInfoVO v02 : allSecondSubject) {
+                if (vo.getId().equals(v02.getParentId())){
+                    list.add(v02);
+                }
+            }
+            list = list.stream().sorted(Comparator.comparing(DictInfo::getSort)).collect(Collectors.toList());
+            vo.setChildren(list);
+        }
+        return allBudgetSubject;
+    }
+
+    /**
+     * 统计支出 1支出总和2工资总和
+     */
+    public static Map<String,BigDecimal> statisticDisburse(AnnualBudgetDTO dto){
+        BigDecimal disburseTotal = new BigDecimal("0");
+        BigDecimal staffTotal = new BigDecimal("0");
+        List<AnnualBudgetDisburse> disburseList = dto.getDisburseList();
+        if (disburseList != null && disburseList.size() > 0){
+            for (AnnualBudgetDisburse disburse : disburseList) {
+                disburse.setAnnualBudgetId(dto.getId());
+                //统计支出总和
+                BigDecimal temp = new BigDecimal("0");
+                if (disburse.getJanuary() != null){
+                    temp = temp.add(disburse.getJanuary());
+                }
+                if (disburse.getFebruary() != null){
+                    temp = temp.add(disburse.getFebruary());
+                }
+                if (disburse.getMarch() != null){
+                    temp = temp.add(disburse.getMarch());
+                }
+                if (disburse.getApril() != null){
+                    temp = temp.add(disburse.getApril());
+                }
+                if (disburse.getMay() != null){
+                    temp = temp.add(disburse.getMay());
+                }
+                if (disburse.getJune() != null){
+                    temp = temp.add(disburse.getJune());
+                }
+                if (disburse.getJuly() != null){
+                    temp = temp.add(disburse.getJuly());
+                }
+                if (disburse.getAugust() != null){
+                    temp = temp.add(disburse.getAugust());
+                }
+                if (disburse.getSeptember() != null){
+                    temp = temp.add(disburse.getSeptember());
+                }
+                if (disburse.getOctober() != null){
+                    temp = temp.add(disburse.getOctober());
+                }
+                if (disburse.getNovember() != null){
+                    temp = temp.add(disburse.getNovember());
+                }
+                if (disburse.getDecember() != null){
+                    temp = temp.add(disburse.getDecember());
+                }
+                disburseTotal = disburseTotal.add(temp);
+                //单独统计支出中的人工成本总和
+                if (disburse.getBudgetSubject() == 3){
+                    staffTotal = staffTotal.add(temp);
+                }
+            }
+        }
+        Map<String,BigDecimal> map = new HashMap<>();
+        map.put("1",disburseTotal);
+        map.put("2",staffTotal);
+        return map;
+    }
+
+    /**
+     * 统计收入,1合同收入2计划回款
+     */
+    public static Map<String,BigDecimal> statisticIncome(AnnualBudgetDTO dto){
+        List<AnnualBudgetIncome> incomeList = dto.getIncomeList();
+        BigDecimal contractTotal = new BigDecimal("0");
+        BigDecimal planReturnedTotal = new BigDecimal("0");
+        if (incomeList != null && incomeList.size() > 0){
+            for (AnnualBudgetIncome income : incomeList) {
+                income.setAnnualBudgetId(dto.getId());
+                //合同额总和
+                if (income.getPredictContractMoney() != null) {
+                    contractTotal = contractTotal.add(income.getPredictContractMoney());
+                }
+                //计划回款总和
+                if (income.getPredictAnnualReturned() != null){
+                    planReturnedTotal = planReturnedTotal.add(income.getPredictAnnualReturned());
+                }
+            }
+        }
+        Map<String,BigDecimal> map = new HashMap<>();
+        map.put("1",contractTotal);
+        map.put("2",planReturnedTotal);
+        return map;
+    }
 }
 }

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

@@ -1499,6 +1499,7 @@ public class CustomFunction {
     }
     }
 
 
 
 
+
     public static Double[] scopeParse(Object dev, Object design, Object xN) {
     public static Double[] scopeParse(Object dev, Object design, Object xN) {
         if (StringUtils.isNotEmpty(dev)) {
         if (StringUtils.isNotEmpty(dev)) {
             Double[] result = new Double[2];
             Double[] result = new Double[2];

+ 29 - 0
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -14,6 +14,7 @@ import com.aliyun.oss.model.ObjectMetadata;
 import com.aliyun.oss.model.PutObjectRequest;
 import com.aliyun.oss.model.PutObjectRequest;
 import com.aliyun.oss.model.PutObjectResult;
 import com.aliyun.oss.model.PutObjectResult;
 import com.jfireel.expression.Expression;
 import com.jfireel.expression.Expression;
+import org.apache.poi.hssf.usermodel.HSSFDataFormatter;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.usermodel.*;
 import java.awt.Color;
 import java.awt.Color;
@@ -458,6 +459,34 @@ public class FormulaUtils {
         return null;
         return null;
     }
     }
 
 
+
+
+    public static Object getValue(Cell cell) {
+        if (cell != null) {
+            switch (cell.getCellTypeEnum()) {
+                case STRING:
+                    return cell.getStringCellValue() == null ? null : cell.getStringCellValue().trim();
+                case NUMERIC:
+                    HSSFDataFormatter dataFormatter = new HSSFDataFormatter();
+                    return dataFormatter.formatCellValue(cell);
+                case BOOLEAN:
+                    return cell.getBooleanCellValue();
+                case ERROR:
+                    return cell.getErrorCellValue();
+                case FORMULA:
+                    try {
+                        return cell.getStringCellValue();
+                    } catch (IllegalStateException e) {
+                        return cell.getNumericCellValue();
+                    }
+                default:
+                    cell.setCellType(CellType.STRING);
+                    return cell.getStringCellValue() == null ? null : cell.getStringCellValue().trim();
+            }
+        }
+        return null;
+    }
+
     /**
     /**
      * @Description  Poi 动态执行公式 测试
      * @Description  Poi 动态执行公式 测试
      * @Param [url]
      * @Param [url]

+ 2 - 25
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITurnPointCalculator.java

@@ -20,7 +20,7 @@ import static org.springblade.manager.formula.TurnPoint.*;
 public interface ITurnPointCalculator {
 public interface ITurnPointCalculator {
 
 
 
 
-    static List<Object> create(List<Map<String, Object>> data, LinkedHashMap<String, String> configMap, Map<String, Object> g8) {
+    static List<TurnPoint> create(List<Map<String, Object>> data, LinkedHashMap<String, String> configMap) {
         if (Func.isNotEmpty(data) && configMap != null) {
         if (Func.isNotEmpty(data) && configMap != null) {
             LevelInfo levelInfo = new LevelInfo();
             LevelInfo levelInfo = new LevelInfo();
             List<TurnPoint> tmp = new ArrayList<>();
             List<TurnPoint> tmp = new ArrayList<>();
@@ -107,16 +107,7 @@ public interface ITurnPointCalculator {
             }
             }
             List<TurnPoint> result = fill(tmp);
             List<TurnPoint> result = fill(tmp);
             if (ListUtils.isNotEmpty(result)) {
             if (ListUtils.isNotEmpty(result)) {
-                /*V判断*/
-                forG8(result, g8);
-                return result.stream().map(TurnPoint::getDataMap).flatMap(m -> {
-                    List<String> list = new ArrayList<>();
-                    for (String key : configMap.keySet()) {
-                        key = key.trim();
-                        list.add(StringUtils.handleNull(m.get(key)));
-                    }
-                    return list.stream();
-                }).collect(Collectors.toList());
+                return  result;
             }
             }
         }
         }
         return Collections.emptyList();
         return Collections.emptyList();
@@ -222,19 +213,5 @@ public interface ITurnPointCalculator {
         return Collections.emptyList();
         return Collections.emptyList();
     }
     }
 
 
-    static void forG8(List<TurnPoint> data, Map<String, Object> g8) {
-        g8.put("dx", data.stream().filter(e -> TurnPoint.CE.equals(e.getType())).map(tp -> CustomFunction.xN(tp.getDx(), 1000)).collect(Collectors.toList()));
-        g8.put("dxv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && e.getVertical()).map(tp -> CustomFunction.xN(tp.getDx(), 1000)).collect(Collectors.toList()));
-        g8.put("dxnv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && !e.getVertical()).map(tp -> CustomFunction.xN(tp.getDx(), 1000)).collect(Collectors.toList()));
-        g8.put("sc", data.stream().filter(e -> TurnPoint.CE.equals(e.getType())).map(TurnPoint::getSc).collect(Collectors.toList()));
-        g8.put("scv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && e.getVertical()).map(TurnPoint::getSc).collect(Collectors.toList()));
-        g8.put("scnv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && !e.getVertical()).map(TurnPoint::getSc).collect(Collectors.toList()));
-        g8.put("sj", data.stream().filter(e -> TurnPoint.CE.equals(e.getType())).map(TurnPoint::getSj).collect(Collectors.toList()));
-        g8.put("sjv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && e.getVertical()).map(TurnPoint::getSj).collect(Collectors.toList()));
-        g8.put("sjnv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && !e.getVertical()).map(TurnPoint::getSj).collect(Collectors.toList()));
-        g8.put("cd", data.stream().filter(e -> TurnPoint.CE.equals(e.getType())).map(TurnPoint::getName).collect(Collectors.toList()));
-        g8.put("cdv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && e.getVertical()).map(TurnPoint::getName).collect(Collectors.toList()));
-        g8.put("cdnv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && !e.getVertical()).map(TurnPoint::getName).collect(Collectors.toList()));
-    }
 
 
 }
 }

+ 3 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/TurnPoint.java

@@ -183,7 +183,9 @@ public class TurnPoint {
     public String getDx() {
     public String getDx() {
         return dx;
         return dx;
     }
     }
-
+    public String getDxX1000() {
+        return StringUtils.number2StringZero(StringUtils.isNotEmpty(getDx()) ? getDx0L() * 1000 : "", 0);
+    }
     public Double getDx0L() {
     public Double getDx0L() {
         return Double.parseDouble(dx);
         return Double.parseDouble(dx);
     }
     }

+ 72 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaTurnPoint.java

@@ -2,6 +2,7 @@ package org.springblade.manager.formula.impl;
 
 
 import cn.hutool.core.util.ReUtil;
 import cn.hutool.core.util.ReUtil;
 import com.jfireel.expression.Expression;
 import com.jfireel.expression.Expression;
+import com.mixsmart.utils.CustomFunction;
 import com.mixsmart.utils.FormulaUtils;
 import com.mixsmart.utils.FormulaUtils;
 import com.mixsmart.utils.StringUtils;
 import com.mixsmart.utils.StringUtils;
 import lombok.Data;
 import lombok.Data;
@@ -87,7 +88,17 @@ public class FormulaTurnPoint implements FormulaStrategy {
             }
             }
             @SuppressWarnings("unchecked")
             @SuppressWarnings("unchecked")
             Map<String, Object> g8 = (Map<String, Object>) tec.getConstantMap().computeIfAbsent("G8", k -> new HashMap<>());
             Map<String, Object> g8 = (Map<String, Object>) tec.getConstantMap().computeIfAbsent("G8", k -> new HashMap<>());
-            List<Object> data = ITurnPointCalculator.create(tableData, configMap, g8);
+            List<TurnPoint> result = ITurnPointCalculator.create(tableData, configMap);
+            /*V判断*/
+            forG8(result, g8,tec);
+            List<Object> data= result.stream().map(TurnPoint::getDataMap).flatMap(m -> {
+                List<String> list = new ArrayList<>();
+                for (String key : configMap.keySet()) {
+                    key = key.trim();
+                    list.add(StringUtils.handleNull(m.get(key)));
+                }
+                return list.stream();
+            }).collect(Collectors.toList());
             if (Func.isNotEmpty(data)) {
             if (Func.isNotEmpty(data)) {
                 AtomicInteger ai = new AtomicInteger();
                 AtomicInteger ai = new AtomicInteger();
                 Map<Integer, List<Object>> dataMap = data.stream().collect(Collectors.groupingBy(e -> ai.getAndAdd(1) % configMap.size()));
                 Map<Integer, List<Object>> dataMap = data.stream().collect(Collectors.groupingBy(e -> ai.getAndAdd(1) % configMap.size()));
@@ -102,7 +113,67 @@ public class FormulaTurnPoint implements FormulaStrategy {
 
 
         }
         }
     }
     }
+    private void forG8(List<TurnPoint> data, Map<String, Object> g8,TableElementConverter tec) {
+        g8.put("dx", data.stream().filter(e -> TurnPoint.CE.equals(e.getType())).map(tp -> CustomFunction.xN(tp.getDx(), 1000)).collect(Collectors.toList()));
+        g8.put("dxv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && e.getVertical()).map(tp -> CustomFunction.xN(tp.getDx(), 1000)).collect(Collectors.toList()));
+        g8.put("dxnv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && !e.getVertical()).map(tp -> CustomFunction.xN(tp.getDx(), 1000)).collect(Collectors.toList()));
+        g8.put("sc", data.stream().filter(e -> TurnPoint.CE.equals(e.getType())).map(TurnPoint::getSc).collect(Collectors.toList()));
+        g8.put("scv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && e.getVertical()).map(TurnPoint::getSc).collect(Collectors.toList()));
+        g8.put("scnv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && !e.getVertical()).map(TurnPoint::getSc).collect(Collectors.toList()));
+        g8.put("sj", data.stream().filter(e -> TurnPoint.CE.equals(e.getType())).map(TurnPoint::getSj).collect(Collectors.toList()));
+        g8.put("sjv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && e.getVertical()).map(TurnPoint::getSj).collect(Collectors.toList()));
+        g8.put("sjnv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && !e.getVertical()).map(TurnPoint::getSj).collect(Collectors.toList()));
+        g8.put("cd", data.stream().filter(e -> TurnPoint.CE.equals(e.getType())).map(TurnPoint::getName).collect(Collectors.toList()));
+        g8.put("cdv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && e.getVertical()).map(TurnPoint::getName).collect(Collectors.toList()));
+        g8.put("cdnv", data.stream().filter(e -> TurnPoint.CE.equals(e.getType()) && !e.getVertical()).map(TurnPoint::getName).collect(Collectors.toList()));
+        List<NodeTable> nodeTableList=tec.getTableAll();
+        /*c8.103*/
+        c8103( data,nodeTableList, tec);
+    }
 
 
+    public void c8103(List<TurnPoint> data,List<NodeTable> nodeTableList,TableElementConverter tec){
+        nodeTableList.stream().filter(e->e.getInitTableName().equals("m_20220928163111_1575040410223378432")).findFirst().ifPresent(t->{
+            List<FormData> fds= tec.formDataMap.values().stream().filter(k->k.getTableName().equals("m_20220928163111_1575040410223378432")&&k.getCoordsList().size()>1).collect(Collectors.toList());
+            /*[{"key":"#2","m":"垫石编号"},{"key":"#3","m":"顶面高程设计"},{"key":"#4","m":"顶面高程实测"},{"key":"#5","m":"顶面高程偏差"},{"key":"#6","m":"顶面四角高差实测"}]*/
+            FormData dsbh=null,dmgcsj=null, dmgcsc=null,dmgcpc=null,sjgcsc=null;
+            for(FormData u:fds){
+                if(u.getEName().equals("垫石编号")){
+                    dsbh=u;
+                }else  if(u.getEName().contains("顶面高程")&&u.getEName().contains("设计")){
+                    dmgcsj=u;
+                }else  if(u.getEName().contains("顶面高程")&&u.getEName().contains("实测")){
+                    dmgcsc=u;
+                }else  if(u.getEName().contains("顶面高程")&&u.getEName().contains("偏差")){
+                    dmgcpc=u;
+                }
+                else  if(u.getEName().contains("四角高差")&&u.getEName().contains("实测")){
+                    sjgcsc=u;
+                }
+            }
+            int n=0;
+            List<Object> tmpList= new ArrayList<>();
+            data.stream().filter(v->TurnPoint.CE.equals(v.getType())).forEach(v->{
+                tmpList.add(v.getName());
+                if(v.getName().matches("[\\d]+")){
+                    tmpList.addAll(Collections.nCopies(3,""));
+                    tmpList.add(v.getDx());
+                }else{
+                    tmpList.add(v.getSj());
+                    tmpList.add(v.getSc());
+                    tmpList.add(v.getDxX1000());
+                    tmpList.add("");
+                }
+            });
+            if(tmpList.size()>0){
+                FormData[] fda= new FormData[]{dsbh,dmgcsj,dmgcsc,dmgcpc,sjgcsc};
+                Map<Integer,List<Object>> group=tmpList.stream().collect(Collectors.groupingBy(e->tmpList.indexOf(e)/fda.length));
+                for(int i=0;i<fda.length;i++){
+                    FormData fd= fda[i];
+                    FormulaUtils.write(fd,group.get(i),true);
+                }
+            }
+        });
+    }
 
 
     private String c(String name) {
     private String c(String name) {
         if (Func.isNotEmpty(name) && Func.isNotEmpty(this.args)) {
         if (Func.isNotEmpty(name) && Func.isNotEmpty(this.args)) {

+ 4 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java

@@ -4,6 +4,7 @@ package org.springblade.manager.formula.impl;
 import cn.hutool.log.StaticLog;
 import cn.hutool.log.StaticLog;
 import com.mixsmart.utils.StringUtils;
 import com.mixsmart.utils.StringUtils;
 import lombok.Data;
 import lombok.Data;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springblade.common.utils.BaseUtils;
 import org.springblade.common.utils.BaseUtils;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
 import org.springblade.core.tool.utils.StringPool;
@@ -36,7 +37,6 @@ public class TableElementConverter implements ITableElementConverter {
     public static String JOIN_REG = "__\\d+_\\d+,?";
     public static String JOIN_REG = "__\\d+_\\d+,?";
     public static Pattern RP = Pattern.compile("(?<=E\\[)[^]]+(?=])");
     public static Pattern RP = Pattern.compile("(?<=E\\[)[^]]+(?=])");
 
 
-
     private List<TableInfo> tableInfoList;
     private List<TableInfo> tableInfoList;
     private Long contractId;
     private Long contractId;
     private Long projectId;
     private Long projectId;
@@ -58,6 +58,8 @@ public class TableElementConverter implements ITableElementConverter {
      * {tableName:{key:val}}
      * {tableName:{key:val}}
      */
      */
     Map<String, Map<String, String>> coordinateMap = new HashMap<>();
     Map<String, Map<String, String>> coordinateMap = new HashMap<>();
+    /**表单对应的Excel对象*/
+    public Map<String, Workbook> wkbMap = new HashMap<>();
     /**
     /**
      * {code:List<ElementData>}
      * {code:List<ElementData>}
      */
      */
@@ -115,7 +117,7 @@ public class TableElementConverter implements ITableElementConverter {
 
 
 
 
     public Boolean isPresent() {
     public Boolean isPresent() {
-        return BaseUtils.isNotNull(this.keyMappers, this.formulas, this.nodeId, this.contractId);
+        return BaseUtils.isNotNull(this.keyMappers, this.formulas, this.nodeId);
     }
     }
 
 
 
 

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -347,21 +347,25 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     CurrentNode currentNode = null;
                     CurrentNode currentNode = null;
                     Long pKeyId = null;
                     Long pKeyId = null;
                     Long contractId=null;
                     Long contractId=null;
+                    Long projectId=null;
                     if (type.equals(ExecuteType.INSPECTION)) {
                     if (type.equals(ExecuteType.INSPECTION)) {
                         WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, nodeId));
                         WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, nodeId));
                         pKeyId = wtc.getPKeyId();
                         pKeyId = wtc.getPKeyId();
                         currentNode = createCurrentNode(wtc);
                         currentNode = createCurrentNode(wtc);
                         contractId=Long.parseLong(wtc.getContractId());
                         contractId=Long.parseLong(wtc.getContractId());
+                        projectId=Long.parseLong(wtc.getProjectId());
                     } else if (type.equals(ExecuteType.TESTING)) {
                     } else if (type.equals(ExecuteType.TESTING)) {
                         WbsTreePrivate wtp = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, nodeId));
                         WbsTreePrivate wtp = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, nodeId));
                         pKeyId = wtp.getPKeyId();
                         pKeyId = wtp.getPKeyId();
                         currentNode = createCurrentNode(wtp);
                         currentNode = createCurrentNode(wtp);
+                        projectId=Long.parseLong(wtp.getProjectId());
                     }
                     }
                     if (currentNode != null) {
                     if (currentNode != null) {
                         TableElementConverter tec = new TableElementConverter(tableInfoList, keyMappers, formulas, coordinateMap, currentNode, tableAll);
                         TableElementConverter tec = new TableElementConverter(tableInfoList, keyMappers, formulas, coordinateMap, currentNode, tableAll);
                         tec.setExecuteType(type);
                         tec.setExecuteType(type);
                         tec.setLog(log);
                         tec.setLog(log);
                         tec.setContractId(contractId);
                         tec.setContractId(contractId);
+                        tec.setProjectId(projectId);
                         if (tec.isPresent()) {
                         if (tec.isPresent()) {
                             tec.before();
                             tec.before();
                             this.formulaService.execute(tec);
                             this.formulaService.execute(tec);

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

@@ -12,10 +12,13 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.jfireel.expression.Expression;
 import com.jfireel.expression.Expression;
 import com.mixsmart.utils.*;
 import com.mixsmart.utils.*;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
+import org.apache.poi.ss.usermodel.*;
 import org.jsoup.Jsoup;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.jsoup.select.Elements;
+import org.springblade.common.utils.BaseUtils;
+import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
@@ -114,33 +117,33 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     public IFormulaService init() {
     public IFormulaService init() {
         /*基础数据*/
         /*基础数据*/
         baseData();
         baseData();
-        /*依赖加载*/
-        checkingMissingList();
-        /*实测值参数*/
-        textInfo();
-        /*公式参数*/
-        option();
-        /*评定表*/
-        assessmentForm();
+        if(ExecuteType.INSPECTION.equals(tec.getExecuteType())) {
+            /*依赖加载*/
+            checkingMissingList();
+            /*实测值参数*/
+            textInfo();
+            /*公式参数*/
+            option();
+            /*评定表*/
+            assessmentForm();
+        }
         return this;
         return this;
     }
     }
 
 
     public  void option(){
     public  void option(){
-        FormulaOption formulaOption = this.formulaOptionService.getOne(Wrappers.<FormulaOption>lambdaQuery().eq(FormulaOption::getParentId,tec.getCurrentNode().getRelateId()).eq(FormulaOption::getContractId,tec.getContractId()));
-        if(formulaOption!=null){
-            tec.constantMap.put(FMOT,JSON.parseObject(formulaOption.getVal(),LinkedHashMap.class));
-        }
+            FormulaOption formulaOption = this.formulaOptionService.getOne(Wrappers.<FormulaOption>lambdaQuery().eq(FormulaOption::getParentId, tec.getCurrentNode().getRelateId()).eq(FormulaOption::getContractId, tec.getContractId()));
+            if (formulaOption != null) {
+                tec.constantMap.put(FMOT, JSON.parseObject(formulaOption.getVal(), LinkedHashMap.class));
+            }
     }
     }
 
 
     public void textInfo(){
     public void textInfo(){
-        if(ExecuteType.INSPECTION.equals(tec.getExecuteType())){
             List<Map<String,Object>>  textInfoMap= this.jdbcTemplate.queryForList("SELECT b.tab_id pkId,b.col_name val ,CONCAT(a.init_table_name,':',b.col_key)code from m_wbs_tree_contract a inner join m_textdict_info b on a.p_key_id=b.tab_id   " +
             List<Map<String,Object>>  textInfoMap= this.jdbcTemplate.queryForList("SELECT b.tab_id pkId,b.col_name val ,CONCAT(a.init_table_name,':',b.col_key)code from m_wbs_tree_contract a inner join m_textdict_info b on a.p_key_id=b.tab_id   " +
                     "where a.p_key_id in("+this.tec.getTableAll().stream().map(NodeTable::getPKeyId).map(Func::toStr).collect(Collectors.joining(","))+") and b.type=8 ");
                     "where a.p_key_id in("+this.tec.getTableAll().stream().map(NodeTable::getPKeyId).map(Func::toStr).collect(Collectors.joining(","))+") and b.type=8 ");
             if(Func.isNotEmpty(textInfoMap)){
             if(Func.isNotEmpty(textInfoMap)){
                 Map<String,List<Map<String,Object>>> tmap = textInfoMap.stream().collect(Collectors.groupingBy(m->m.get("code").toString()));
                 Map<String,List<Map<String,Object>>> tmap = textInfoMap.stream().collect(Collectors.groupingBy(m->m.get("code").toString()));
                 tec.constantMap.put(TEXT_INFO_MAP,tmap);
                 tec.constantMap.put(TEXT_INFO_MAP,tmap);
             }
             }
-        }
     }
     }
 
 
     public void baseData(){
     public void baseData(){
@@ -148,26 +151,27 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         CurrentNode one=this.tec.getCurrentNode();
         CurrentNode one=this.tec.getCurrentNode();
         tec.formDataList=list;
         tec.formDataList=list;
         keyWord(tec.constantMap);
         keyWord(tec.constantMap);
-        ContractInfo info =this.contractInfoService.getById(tec.getContractId());
-        ProjectInfo pji=this.projectInfoService.getById(info.getPId());
-        tec.setProjectId(pji.getId());
+     /*   ContractInfo info =this.contractInfoService.getById(tec.getContractId());
+        ProjectInfo pji=this.projectInfoService.getById(tec.getProjectId());*/
         /*wbs节点链*/
         /*wbs节点链*/
-        List<WbsTreeContract> nodes = wpService.chain(tec.getContractId(),one.getId(),one.getPkId(),null);
-        if(Func.isEmpty(nodes)){
-            nodes=wpService.chain(tec.getContractId(),one.getRelateId(),one.getPkId(),null);
-        }
-        if(Func.isEmpty(nodes)){
-            this.tec.getLog().append("【WBS信息缺失】");
+        if(ExecuteType.INSPECTION.equals(tec.getExecuteType())) {
+            List<WbsTreeContract> nodes = wpService.chain(tec.getContractId(), one.getId(), one.getPkId(), null);
+            if (Func.isEmpty(nodes)) {
+                nodes = wpService.chain(tec.getContractId(), one.getRelateId(), one.getPkId(), null);
+            }
+            if (Func.isEmpty(nodes)) {
+                this.tec.getLog().append("【WBS信息缺失】");
+            }
+            tec.constantMap.put(CHAIN,nodes.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
+            /*节点参数*/
+            tec.constantMap.put(WP,getWpMap(one));
+            /*表格名称*/
+            List<AppWbsTreeContractVO> tableList =wbsTreeContractService.searchNodeAllTable(one.getPkId().toString(), "1", tec.getContractId().toString(),tec.getProjectId().toString());
+            tec.constantMap.put(TABLE_LIST,tableList);
+            /*通过判断元素名称来确定,加入汇总公式延后执行*/
+            /*tec.constantMap.put("tableNames",tableList.stream().filter(e->StringUtils.isEquals(e.getIsBussShow(),1)).map(WbsTreeContract::getNodeName).collect(Collectors.toList()));*/
+            tec.constantMap.put("tableNames",tableList.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
         }
         }
-        tec.constantMap.put(CHAIN,nodes.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
-        /*节点参数*/
-        tec.constantMap.put(WP,getWpMap(one));
-        /*表格名称*/
-        List<AppWbsTreeContractVO> tableList =wbsTreeContractService.searchNodeAllTable(one.getPkId().toString(), "1", tec.getContractId().toString(),info.getPId());
-        tec.constantMap.put(TABLE_LIST,tableList);
-        /*通过判断元素名称来确定,加入汇总公式延后执行*/
-        /*tec.constantMap.put("tableNames",tableList.stream().filter(e->StringUtils.isEquals(e.getIsBussShow(),1)).map(WbsTreeContract::getNodeName).collect(Collectors.toList()));*/
-        tec.constantMap.put("tableNames",tableList.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
     }
     }
 
 
 
 
@@ -231,6 +235,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     }
     }
     /**评定表处理*/
     /**评定表处理*/
     public void assessmentForm(){
     public void assessmentForm(){
+        if(!ExecuteType.INSPECTION.equals(tec.getExecuteType())){
+                return;
+        }
         try {
         try {
             if (tec.getTableAll().stream().anyMatch(e -> StringUtils.isEquals(e.getTableType(), 5))) {
             if (tec.getTableAll().stream().anyMatch(e -> StringUtils.isEquals(e.getTableType(), 5))) {
                 /*评定节点*/
                 /*评定节点*/
@@ -647,18 +654,22 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
 
     @Override
     @Override
     public IFormulaService calculate() {
     public IFormulaService calculate() {
-        /*天气*/
-        weather();
+        if(ExecuteType.INSPECTION.equals(tec.getExecuteType())) {
+            /*天气*/
+            weather();
+        }
         /*通用计算*/
         /*通用计算*/
         generalCalc();
         generalCalc();
-       /*汇总信息处理*/
-        summaryCalc();
-       /*附表的处理*/
-        forSubTb();
+        if(ExecuteType.INSPECTION.equals(tec.getExecuteType())) {
+            /*汇总信息处理*/
+             summaryCalc();
+            /*附表的处理*/
+            forSubTb();
+        }
         return this;
         return this;
     }
     }
 
 
-
+    /*天气信息获取*/
     private void weather(){
     private void weather(){
           List<String> dateList=new ArrayList<>();
           List<String> dateList=new ArrayList<>();
           tec.formDataList.forEach(e->{
           tec.formDataList.forEach(e->{
@@ -676,7 +687,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                }
                }
           });
           });
            if(dateList.size()>0){
            if(dateList.size()>0){
-              List<Map<String,Object>> listMap= this.jdbcTemplate.queryForList(" select DATE(b.create_time) ds,b.weather from m_project_contract_area a join u_weather_info b on a.id=contract_area_id where a.contract_id=1530020611913850882 and DATE(b.create_time) in('"+ String.join(",", dateList) +"')");
+              List<Map<String,Object>> listMap= this.jdbcTemplate.queryForList(" select DATE(b.create_time) ds,b.weather from m_project_contract_area a join u_weather_info b on a.id=contract_area_id where a.contract_id="+tec.getContractId()+" and DATE(b.create_time) in('"+ String.join(",", dateList) +"')");
               Map<String,String> map= new HashMap<>();
               Map<String,String> map= new HashMap<>();
                listMap.forEach(m->{
                listMap.forEach(m->{
                    map.put(Func.toStr(m.get("ds")),Func.toStr(m.get("weather")));
                    map.put(Func.toStr(m.get("ds")),Func.toStr(m.get("weather")));
@@ -1519,6 +1530,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                          Map<String,List<Map<String,Object>>> textInfoMap= (Map<String, List<Map<String, Object>>>) tec.constantMap.getOrDefault(TEXT_INFO_MAP,new HashMap<>());
                          Map<String,List<Map<String,Object>>> textInfoMap= (Map<String, List<Map<String, Object>>>) tec.constantMap.getOrDefault(TEXT_INFO_MAP,new HashMap<>());
                          List<Map<String,Object>> tableColKeyVal= textInfoMap.get(codeList.get(0));
                          List<Map<String,Object>> tableColKeyVal= textInfoMap.get(codeList.get(0));
                          if(Func.isNotEmpty(tableColKeyVal)){
                          if(Func.isNotEmpty(tableColKeyVal)){
+                             /*TODO 允许多次右键插入之后,就无法满足计算要求*/
                              Optional<RangeInfo> op=tableColKeyVal.stream().map(map-> BeanUtil.toBean(JSON.parseObject(map.get("val").toString()),RangeInfo.class)).findFirst();
                              Optional<RangeInfo> op=tableColKeyVal.stream().map(map-> BeanUtil.toBean(JSON.parseObject(map.get("val").toString()),RangeInfo.class)).findFirst();
                              if(op.isPresent()){
                              if(op.isPresent()){
                                  RangeInfo d = op.get();
                                  RangeInfo d = op.get();
@@ -1527,15 +1539,72 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                              }
                              }
                          }else{
                          }else{
                              FormData dataFd=tec.formDataMap.get(codeList.get(0));
                              FormData dataFd=tec.formDataMap.get(codeList.get(0));
-                             FormData designFd=tec.formDataMap.get(codeList.get(1));
+                             String designStr=codeList.get(1);
+                             FormData designFd=tec.formDataMap.get(designStr);
+                             String devStr=StringUtils.isEmpty(formula.getDev())?formula.getDev():fd.getEAllowDeviation();
+                             if(StringUtils.isEmpty(devStr)){
+                                 /*数据库找不到的情况就读取Excel*/
+                                 if(tec.wkbMap.isEmpty()){
+                                     /*初始化*/
+                                    List<String> tableNames4Excel=  tec.getFormDataList().stream().filter(FormData::executable).filter(e->e.info().contains("quantity")).map(FormData::getTableName).distinct().collect(Collectors.toList());
+                                    if(!tableNames4Excel.isEmpty()){
+                                        List<String> ids =tec.getTableAll().stream().filter(e->tableNames4Excel.contains(e.getInitTableName())).map(NodeTable::getPKeyId).map(String::valueOf).collect(Collectors.toList());
+                                        List<Map<String,Object>> listMaps=  this.jdbcTemplate.queryForList("select a.p_key_id pkeyId,a.init_table_name tableName,b.file_url url from m_wbs_tree_contract a join m_excel_tab b on a.excel_id=b.id where a.p_key_id in("+String.join(",",ids)+")");
+                                        listMaps.forEach(mp->{
+                                            try {
+                                                Workbook wb = WorkbookFactory.create(Objects.requireNonNull(CommonUtil.getOSSInputStream(StringUtils.handleNull(mp.get("url")))));
+                                                tec.wkbMap.put(mp.get("pkeyId").toString(),wb);
+                                            } catch (Exception e) {
+                                                e.printStackTrace();
+                                            }
+                                        });
+                                    }
+                                 }
+                                Optional<NodeTable> nodeTableOp =tec.getTableAll().stream().filter(e->e.getInitTableName().equals(fd.getTableName())).findFirst();
+                                 if(nodeTableOp.isPresent()){
+                                     Workbook wb = tec.wkbMap.get(nodeTableOp.get().getPKeyId().toString());
+                                     if(wb!=null){
+                                         Cell deCell=null;
+                                         Sheet sheet = wb.getSheetAt(0);
+                                         outerLoop: for(int y=3;y<35;y++){
+                                             for(int x=0;x<35;x++){
+                                                 Row row = sheet.getRow(y);
+                                                 Cell cell=  row.getCell(x);
+                                                 String sv=StringUtils.handleNull(FormulaUtils.getValue(cell)).replaceAll("[^\u4e00-\u9fa5]+","");
+                                                 if(sv.contains("规定")&&sv.contains("偏差")){
+                                                     deCell=cell;
+                                                     break outerLoop;
+                                                 }
+                                             }
+                                         }
+                                         if(deCell!=null) {
+                                             int min = 0;
+                                             Optional<Integer> op = fd.getCoordsList().stream().map(Coords::getY).distinct().min(Comparator.comparingInt(e -> e));
+                                             if (op.isPresent()) {
+                                                 min = op.get();
+                                             }
+                                             Row row = sheet.getRow(min);
+                                             Cell cell = row.getCell(deCell.getColumnIndex());
+                                             devStr = FormulaUtils.getValue(cell).toString();
+                                         }
+                                     }
+                                 }
+                             }
+                             if(CustomFunction.containsZH(devStr)||StringUtils.isEmpty(devStr)||StringUtils.handleNull(devStr).contains("/")){
+                                 devStr="±100000";
+                             }
+                             /*设计值可以是数值类型,或空(等效0)*/
                              if(dataFd!=null&&designFd!=null){
                              if(dataFd!=null&&designFd!=null){
                                  if(dataFd.getValues().stream().map(ElementData::getValue).anyMatch(StringUtils::isNotEmpty)&&(designFd.getValues().size()>1||designFd.getValues().stream().map(ElementData::getValue).anyMatch(StringUtils::isEmpty))){
                                  if(dataFd.getValues().stream().map(ElementData::getValue).anyMatch(StringUtils::isNotEmpty)&&(designFd.getValues().size()>1||designFd.getValues().stream().map(ElementData::getValue).anyMatch(StringUtils::isEmpty))){
                                      /*多少个设计值暂时默认全部合格,满足绝大部分结果*/
                                      /*多少个设计值暂时默认全部合格,满足绝大部分结果*/
                                      data=dataFd.getValues().stream().map(ElementData::getValue).filter(StringUtils::isNotEmpty).count();
                                      data=dataFd.getValues().stream().map(ElementData::getValue).filter(StringUtils::isNotEmpty).count();
                                  }else{
                                  }else{
-                                     List<Object>  result =  CustomFunction.b445check(dataFd.getValues().stream().map(ElementData::getValue).collect(Collectors.toList()),designFd.getValues().stream().map(ElementData::getValue).collect(Collectors.toList()),formula.getDev(),1 );
+                                     List<Object>  result =  CustomFunction.b445check(dataFd.getValues().stream().map(ElementData::getValue).collect(Collectors.toList()),designFd.getValues().stream().map(ElementData::getValue).collect(Collectors.toList()),devStr,1 );
                                      data=result.get(1);
                                      data=result.get(1);
                                  }
                                  }
+                             }else if(dataFd!=null&& BaseUtils.isNumber(designStr)){
+                                     List<Object>  result =  CustomFunction.b445check(dataFd.getValues().stream().map(ElementData::getValue).collect(Collectors.toList()),0,devStr,1 );
+                                     data=result.get(1);
                              }
                              }
                          }
                          }
 
 
@@ -1664,7 +1733,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
         return new HashMap<>();
         return new HashMap<>();
     }
     }
 
 
-    public R getBussDataInfo(Long pkeyId,int type) {
+    public R getBussDataInfo(Long pkeyId, int type) {
 
 
         Map<String, Object> reData = new HashMap<>();
         Map<String, Object> reData = new HashMap<>();
 
 
@@ -1682,7 +1751,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
         String tabName = wbsTreeContract.getInitTableName();
         String tabName = wbsTreeContract.getInitTableName();
         String isExitSql = " select * from information_schema.TABLES where TABLE_NAME='" + tabName + "'";
         String isExitSql = " select * from information_schema.TABLES where TABLE_NAME='" + tabName + "'";
         List<Map<String, Object>> tabList = jdbcTemplate.queryForList(isExitSql);
         List<Map<String, Object>> tabList = jdbcTemplate.queryForList(isExitSql);
-        if (tabList == null || tabList.size() <= 0) {
+        if (tabList.size() <= 0) {
             return R.fail("无实体表对应");
             return R.fail("无实体表对应");
         }
         }
 
 
@@ -1692,96 +1761,99 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
         // 匹配关联
         // 匹配关联
         try {
         try {
             File file1 = ResourceUtil.getFile(wbsTreeContract.getHtmlUrl());
             File file1 = ResourceUtil.getFile(wbsTreeContract.getHtmlUrl());
-            String htmlString = IoUtil.readToString(new FileInputStream(file1));
-            Document doc = Jsoup.parse(htmlString);
-
-            // 解析
-            // 模糊匹配
-            Elements dwtitle = doc.select("el-input[placeholder~=.*承包单位]");
-            Elements sgtitle = doc.select("el-input[placeholder~=^施工单位]");
-            Elements sgtitle1 = doc.select("el-input[placeholder=安装单位]");
-            sgtitle.addAll(sgtitle1);
-
-            Elements htdtitle = doc.select("el-input[placeholder~=.*合同段.*]");
-            Elements htdtitle1 = doc.select("el-input[placeholder~=合同名称.*]");
-            htdtitle.addAll(htdtitle1);
-
-            Elements jltitle = doc.select("el-input[placeholder~=监理单位.*]");
-
-            Elements bhtitle = doc.select("el-input[placeholder~=^编号]");
-            Elements bhtitle1 = doc.select("el-input[placeholder~=合同编号.*]");
-            bhtitle.addAll(bhtitle1);
-
-
-            Elements xmtitle = doc.select("el-input[placeholder~=^项目名称]");
-
-
-            // Elements title = doc.select("el-input[placeholder~=^编号]");
-
-            /**
-             * 承包单位 承包单位、施工单位:引用施工单位名称 ,
-             * 监理单位:引用监理单位名称
-             * 合同段、所属建设项目(合同段):引用合同段编号
-             *
-             * 施工单位:施工单位 和 安装单位
-             *
-             */
-            ContractInfo contractInfo = contractInfoService.getById(wbsTreeContract.getContractId());
-            // 施工单位名称
-            if (dwtitle.size() >= 1) {
-                int y = Integer.parseInt(dwtitle.attr("trindex"));
-                if (y <= 10) {
-                    reData.put(dwtitle.attr("keyName"), contractInfo.getConstructionUnitName());
-                }
+            if (file1.exists()) {
+
+                String htmlString = IoUtil.readToString(new FileInputStream(file1));
+                Document doc = Jsoup.parse(htmlString);
+
+                // 解析
+                // 模糊匹配
+                Elements dwtitle = doc.select("el-input[placeholder~=.*承包单位]");
+                Elements sgtitle = doc.select("el-input[placeholder~=^施工单位]");
+                Elements sgtitle1 = doc.select("el-input[placeholder=安装单位]");
+                sgtitle.addAll(sgtitle1);
+
+                Elements htdtitle = doc.select("el-input[placeholder~=.*合同段.*]");
+                Elements htdtitle1 = doc.select("el-input[placeholder~=合同名称.*]");
+                htdtitle.addAll(htdtitle1);
+
+                Elements jltitle = doc.select("el-input[placeholder~=监理单位.*]");
+
+                Elements bhtitle = doc.select("el-input[placeholder~=^编号]");
+                Elements bhtitle1 = doc.select("el-input[placeholder~=合同编号.*]");
+                bhtitle.addAll(bhtitle1);
+
+
+                Elements xmtitle = doc.select("el-input[placeholder~=^项目名称]");
+
+
+                // Elements title = doc.select("el-input[placeholder~=^编号]");
+
+                /**
+                 * 承包单位 承包单位、施工单位:引用施工单位名称 ,
+                 * 监理单位:引用监理单位名称
+                 * 合同段、所属建设项目(合同段):引用合同段编号
+                 *
+                 * 施工单位:施工单位 和 安装单位
+                 *
+                 */
+                ContractInfo contractInfo = contractInfoService.getById(wbsTreeContract.getContractId());
+                // 施工单位名称
+                if (dwtitle.size() >= 1) {
+                    int y = Integer.parseInt(dwtitle.attr("trindex"));
+                    if (y <= 10) {
+                        reData.put(dwtitle.attr("keyName"), contractInfo.getConstructionUnitName());
+                    }
 
 
-            }
-            if (sgtitle.size() >= 1) {
-                int y = Integer.parseInt(sgtitle.attr("trindex"));
-                if (y <= 10) {
-                    reData.put(sgtitle.attr("keyName"), contractInfo.getConstructionUnitName());
                 }
                 }
-            }
+                if (sgtitle.size() >= 1) {
+                    int y = Integer.parseInt(sgtitle.attr("trindex"));
+                    if (y <= 10) {
+                        reData.put(sgtitle.attr("keyName"), contractInfo.getConstructionUnitName());
+                    }
+                }
 
 
-            // 合同段名称
-            if (htdtitle.size() >= 1) {
-                for (Element element : htdtitle) {
-                    int trindex = Integer.parseInt(element.attr("trindex"));
-                    if (trindex <= 8) {
-                        reData.put(element.attr("keyName"), contractInfo.getContractNumber());
+                // 合同段名称
+                if (htdtitle.size() >= 1) {
+                    for (Element element : htdtitle) {
+                        int trindex = Integer.parseInt(element.attr("trindex"));
+                        if (trindex <= 8) {
+                            reData.put(element.attr("keyName"), contractInfo.getContractNumber());
+                        }
                     }
                     }
                 }
                 }
-            }
-            // 监理单位名称
-            if (jltitle.size() >= 1) {
+                // 监理单位名称
+                if (jltitle.size() >= 1) {
 
 
-                for (Element element : jltitle) {
-                    int trindex = Integer.parseInt(element.attr("trindex"));
-                    if (trindex <= 10) {
-                        reData.put(element.attr("keyName"), contractInfo.getSupervisionUnitName());
+                    for (Element element : jltitle) {
+                        int trindex = Integer.parseInt(element.attr("trindex"));
+                        if (trindex <= 10) {
+                            reData.put(element.attr("keyName"), contractInfo.getSupervisionUnitName());
+                        }
                     }
                     }
                 }
                 }
-            }
-            //获取父节点划分编号
-            WbsTreeContract node = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
-                    .eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
-                    .eq(WbsTreeContract::getContractId, wbsTreeContract.getContractId()));
-            // 编号
-            if (bhtitle.size() >= 1 && contractInfo.getIsReferenceNumber() == 1) {
-                for (Element element : bhtitle) {
-                    int trindex = Integer.parseInt(element.attr("trindex"));
-                    if (trindex <= 10) {
-                        reData.put(element.attr("keyName"), node.getPartitionCode() == null ? "" : node.getPartitionCode());
+                //获取父节点划分编号
+                WbsTreeContract node = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                        .eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
+                        .eq(WbsTreeContract::getContractId, wbsTreeContract.getContractId()));
+                // 编号
+                if (bhtitle.size() >= 1 && contractInfo.getIsReferenceNumber() == 1) {
+                    for (Element element : bhtitle) {
+                        int trindex = Integer.parseInt(element.attr("trindex"));
+                        if (trindex <= 10) {
+                            reData.put(element.attr("keyName"), node.getPartitionCode() == null ? "" : node.getPartitionCode());
+                        }
                     }
                     }
                 }
                 }
-            }
 
 
-            // 项目名称
-            if (xmtitle.size() >= 1) {
-                for (Element element : xmtitle) {
-                    int trindex = Integer.parseInt(element.attr("trindex"));
-                    if (trindex <= 6) {
-                        ProjectInfo projectInfo = projectInfoService.getById(wbsTreeContract.getProjectId());
-                        reData.put(element.attr("keyName"), projectInfo.getProjectName());
+                // 项目名称
+                if (xmtitle.size() >= 1) {
+                    for (Element element : xmtitle) {
+                        int trindex = Integer.parseInt(element.attr("trindex"));
+                        if (trindex <= 6) {
+                            ProjectInfo projectInfo = projectInfoService.getById(wbsTreeContract.getProjectId());
+                            reData.put(element.attr("keyName"), projectInfo.getProjectName());
+                        }
                     }
                     }
                 }
                 }
             }
             }
@@ -1789,13 +1861,13 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
             e.printStackTrace();
             e.printStackTrace();
         }
         }
 
 
-        if (dataIn != null && dataIn.size() >= 1) {
+        if (dataIn.size() >= 1) {
             Map<String, Object> mysqlData = dataIn.get(0);
             Map<String, Object> mysqlData = dataIn.get(0);
             for (String key : mysqlData.keySet()) {
             for (String key : mysqlData.keySet()) {
                 String tabVal = mysqlData.get(key) + "";
                 String tabVal = mysqlData.get(key) + "";
                 // 时间段处理
                 // 时间段处理
                 if (org.apache.commons.lang.StringUtils.isNotEmpty(tabVal) && tabVal.indexOf("null") < 0) {
                 if (org.apache.commons.lang.StringUtils.isNotEmpty(tabVal) && tabVal.indexOf("null") < 0) {
-                    if (tabVal.indexOf("T") >= 0 && tabVal.indexOf(".000Z]") >= 0) {
+                    if (tabVal.contains("T") && tabVal.contains(".000Z]")) {
                         String[] tabData = tabVal.split("_\\^_");
                         String[] tabData = tabVal.split("_\\^_");
 
 
                         if (reData.containsKey("pickerKey")) {
                         if (reData.containsKey("pickerKey")) {
@@ -1814,9 +1886,9 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                         if (org.apache.commons.lang.StringUtils.isNotEmpty(tabData[0])) {
                         if (org.apache.commons.lang.StringUtils.isNotEmpty(tabData[0])) {
                             reData.put(key + "__" + tabData[1], sql);
                             reData.put(key + "__" + tabData[1], sql);
                         }
                         }
-                    } else if (tabVal.indexOf("T") >= 0 && tabVal.indexOf(".000Z") >= 0) { //时间
+                    } else if (tabVal.contains("T") && tabVal.contains(".000Z")) { //时间
                         // 时间和字符串合作
                         // 时间和字符串合作
-                        if (tabVal.indexOf("☆") >= 0) {
+                        if (tabVal.contains("☆")) {
                             String[] mysql = tabVal.split("☆");
                             String[] mysql = tabVal.split("☆");
                             for (String data : mysql) {
                             for (String data : mysql) {
                                 String[] tabData = data.split("_\\^_");
                                 String[] tabData = data.split("_\\^_");
@@ -1830,7 +1902,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                                 reData.put(key + "__" + tabData[1], tabData[0]);
                                 reData.put(key + "__" + tabData[1], tabData[0]);
                             }
                             }
                         }
                         }
-                    } else if (tabVal.indexOf("☆") >= 0) {
+                    } else if (tabVal.contains("☆")) {
                         String[] mysql = tabVal.split("☆");
                         String[] mysql = tabVal.split("☆");
                         for (String data : mysql) {
                         for (String data : mysql) {
                             String[] tabData = data.split("_\\^_");
                             String[] tabData = data.split("_\\^_");
@@ -1838,10 +1910,16 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                                 reData.put(key + "__" + tabData[1], tabData[0]);
                                 reData.put(key + "__" + tabData[1], tabData[0]);
                             }
                             }
                         }
                         }
-                    } else if (tabVal.indexOf("_^_") >= 0) {
+                    } else if (tabVal.contains("_^_")) {
                         String[] tabData = tabVal.split("_\\^_");
                         String[] tabData = tabVal.split("_\\^_");
                         if (org.apache.commons.lang.StringUtils.isNotEmpty(tabData[0])) {
                         if (org.apache.commons.lang.StringUtils.isNotEmpty(tabData[0])) {
-                            reData.put(key + "__" + tabData[1], tabData[0]);
+                            if (tabVal.contains("[") && tabVal.contains("年")) {
+                                String[] strings = org.apache.commons.lang.StringUtils.strip(tabData[0], "[]").split(",");
+
+                                reData.put(key + "__" + tabData[1], strings);
+                            } else {
+                                reData.put(key + "__" + tabData[1], tabData[0]);
+                            }
                         }
                         }
                     } else {
                     } else {
                         reData.put(key, tabVal);
                         reData.put(key, tabVal);
@@ -1866,7 +1944,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
         }
         }
 
 
         // 移除Id 和 p_key_id
         // 移除Id 和 p_key_id
-        if(type==0){
+        if (type == 0) {
             reData.remove("id");
             reData.remove("id");
             reData.remove("p_key_id");
             reData.remove("p_key_id");
             reData.remove("classify");
             reData.remove("classify");
@@ -1874,8 +1952,8 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
             reData.remove("pkeyId");
             reData.remove("pkeyId");
             reData.remove("projectId");
             reData.remove("projectId");
         }
         }
-        if(type==1){
-            reData.put("pkeyId",reData.get("p_key_id"));
+        if (type == 1) {
+            reData.put("pkeyId", reData.get("p_key_id"));
         }
         }
         reData.put("tabGroupId", wbsTreeContract.getTabGroupId());
         reData.put("tabGroupId", wbsTreeContract.getTabGroupId());
         return R.data(reData);
         return R.data(reData);