Ver código fonte

Merge remote-tracking branch 'origin/master'

liuyc 2 anos atrás
pai
commit
365527b3e6
20 arquivos alterados com 436 adições e 118 exclusões
  1. 3 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ControlProjectInfo.java
  2. 6 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ProjectCostBudget.java
  3. 28 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ContractReturnedInfoVO2.java
  4. 2 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ControlProjectInfoVO.java
  5. 3 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileAutoController.java
  6. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.java
  7. 10 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.xml
  8. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.java
  9. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.xml
  10. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml
  11. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IContractReturnedInfoService.java
  12. 50 10
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java
  13. 15 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractReturnedInfoServiceImpl.java
  14. 41 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java
  15. 51 0
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  16. 39 19
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  17. 160 76
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  18. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITurnPointCalculator.java
  19. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  20. 10 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

+ 3 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ControlProjectInfo.java

@@ -54,6 +54,9 @@ public class ControlProjectInfo extends BaseEntity {
     @ApiModelProperty(value = "项目类型")
     private Integer projectType;
 
+    @ApiModelProperty(value = "项目类别")
+    private Integer projectClass;
+
     @ApiModelProperty(value = "项目服务类型")
     private Integer projectServerType;
 

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

@@ -159,4 +159,10 @@ public class ProjectCostBudget extends BaseEntity {
     @ApiModelProperty(value = "计划结束月工资")
     private BigDecimal planEndMoney;
 
+    @ApiModelProperty(value = "计划开始月工作天数")
+    private BigDecimal planStartMonthDays;
+
+    @ApiModelProperty(value = "计划结束月工作天数")
+    private BigDecimal planEndMonthDays;
+
 }

+ 28 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ContractReturnedInfoVO2.java

@@ -0,0 +1,28 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.ContractReturnedInfo;
+
+/**
+ * @Param  用于年度经营预算收入详情预览
+ * @Author wangwl
+ * @Date 2023/6/6 9:21
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ContractReturnedInfoVO2 extends ContractReturnedInfo {
+
+    @ApiModelProperty(value = "项目名称")
+    private String projectName;
+
+    @ApiModelProperty(value = "收入类别名称")
+    private String incomeTypeValue;
+
+    @ApiModelProperty(value = "项目类别名称")
+    private String projectTypeValue;
+
+    @ApiModelProperty(value = "产品线")
+    private String contractTypeValue;
+}

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

@@ -20,6 +20,8 @@ public class ControlProjectInfoVO extends ControlProjectInfo {
     private String projectTypeValue;
     @ApiModelProperty(value = "项目服务类型值")
     private String projectServerTypeValue;
+    @ApiModelProperty(value = "项目类别值")
+    private String projectClassValue;
     @ApiModelProperty(value = "合同金额")
     private BigDecimal contractMoney;
     @ApiModelProperty(value = "合同类型值")

+ 3 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileAutoController.java

@@ -109,7 +109,9 @@ ArchiveFileAutoController extends BladeController {
                     }
 
                     //新增不排序
-                    //archive.setAutoFileSort(archive.getAutoFileSort());
+                    archive.setAutoFileSort(null);
+
+                    //修改提不上去
                     //待修改
                     archive.setIsDeleted(0);
                     archive.setIsArchive(1);

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

@@ -44,4 +44,6 @@ public interface AnnualBudgetMapper extends BaseMapper<AnnualBudget> {
     Integer yearList();
 
     List<Dept> getAllDept();
+
+    List<ContractReturnedInfoVO2> getAllShouldReturnedMoney(@Param("id") Long id,@Param("year") int y);
 }

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

@@ -43,7 +43,7 @@
                 abi.predict_sign_date as returnTime,
                 abi.predict_annual_returned as returnMoney
         FROM c_annual_budget_income abi
-        WHERE abi.annual_budget_id = #{id}
+        WHERE abi.annual_budget_id = #{id} and abi.income_type = 2
     </select>
 
     <select id="getDisburseByAnnualBudgetId" resultType="org.springblade.control.vo.AnnualBudgetDisburseVO">
@@ -89,6 +89,15 @@
     <select id="getAllDept" resultType="org.springblade.system.entity.Dept">
         select * from blade_dept WHERE dept_type = 2 and is_deleted = 0
     </select>
+    <select id="getAllShouldReturnedMoney" resultType="org.springblade.control.vo.ContractReturnedInfoVO2">
+        select cri.*,
+               (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 as projectTypeValue ,
+               abi.contract_type_value as contractTypeValue
+        from c_annual_budget_income abi left join c_contract_returned_info cri on abi.project_id  = cri.project_id
+        WHERE abi.annual_budget_id = #{id} and abi.income_type = 1 and DATE_FORMAT(cri.should_returned_time, '%Y') = #{year}
+    </select>
 
 
 </mapper>

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

@@ -34,4 +34,6 @@ public interface ContractReturnedInfoMapper extends BaseMapper<ContractReturnedI
     List<ContractReturnedInfo> getAllMonthReturnedByYear(@Param("year") int y);
 
     List<ContractReturnedInfo> getAllMonthReturnedByYear2(@Param("year") int y);
+
+    BigDecimal getProjectShouldReturnedByYear(@Param("projectId") Long projectId,@Param("year") int year);
 }

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

@@ -61,4 +61,8 @@
         WHERE  is_deleted = 0
             and DATE_FORMAT(should_returned_time ,'%Y') = #{year}
     </select>
+    <select id="getProjectShouldReturnedByYear" resultType="java.math.BigDecimal">
+        select SUM(should_returned_money) from c_contract_returned_info
+        WHERE project_id = #{projectId} and  DATE_FORMAT(should_returned_time, '%Y') = #{year}
+    </select>
 </mapper>

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

@@ -7,6 +7,7 @@
         select
         pi.*,
         (select dict_name  from c_dict_info WHERE code = 'project_type' AND dict_value = pi.project_type) as projectTypeValue,
+        (select dict_name  from c_dict_info WHERE code = 'project_class' AND dict_value = pi.project_class) as projectClassValue,
         (select dict_name  from c_dict_info WHERE code = 'project_server_type' AND dict_value = pi.project_server_type) as projectServerTypeValue,
         (select contract_money from c_control_contract_info WHERE project_id = pi.id)as contractMoney,
         (select name from blade_user WHERE id = pi.project_principal) as projectPrincipalName,
@@ -16,6 +17,9 @@
         <if test="dto.projectType != null and dto.projectType != ''">
             and pi.project_type = #{dto.projectType}
         </if>
+        <if test="dto.projectClass != null and dto.projectClass != ''">
+            and pi.project_class = #{dto.projectClass}
+        </if>
         <if test="dto.projectServerType != null and dto.projectServerType != ''">
             and pi.project_server_type = #{dto.projectServerType}
         </if>

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

@@ -47,4 +47,7 @@ public interface IContractReturnedInfoService extends BaseService<ContractReturn
     //获取所有项目当年每月的应回款
     List<BigDecimal> getAllMonthReturnedByYear2(int y);
 
+    //根据项目id和年份获取项目当年应回款
+    BigDecimal getProjectShouldReturnedByYear(Long projectId,int year);
+
 }

+ 50 - 10
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -105,13 +105,13 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                 if (income.getIncomeType() == null){
                     throw new ServiceException("请选择收入类别");
                 }
-                if (income.getPredictSignDate() == null){
-                    throw new ServiceException("请选择预计签单时间");
+                if (income.getIncomeType() == 2 && income.getPredictSignDate() == null){
+                    throw new ServiceException("增量项目请选择预计签单时间");
                 }
-                if (income.getPredictContractMoney() == null){
+                if (income.getIncomeType() == 2 && income.getPredictContractMoney() == null){
                     throw new ServiceException("请输入预计新签合同额");
                 }
-                if (income.getPredictAnnualReturned() == null){
+                if (income.getIncomeType() == 2 && income.getPredictAnnualReturned() == null){
                     throw new ServiceException("请输入预计本年度回款额");
                 }
             }
@@ -205,8 +205,13 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         List<AnnualBudgetVO2.IncomeDetail> incomeDetails = new ArrayList<>();
         List<AnnualBudgetVO2.disburseDetail> disburseDetails = new ArrayList<>();
         List<BigDecimal> bigDecimals = new ArrayList<>();
-        //获取预算收入集合
+        //获取当前年度预算
+        AnnualBudget annualBudget = this.getById(id);
+        int y = Integer.parseInt(annualBudget.getName().substring(0,4));
+        //获取增量预算收入集合
         List<AnnualBudgetIncomeVO> incomeList = baseMapper.getReturnedByAnnualBudgetId(id);
+        //获取存量预算集合,根据存量预算的项目id,获取当年所有项目的回款
+        List<ContractReturnedInfoVO2> returnedInfos = baseMapper.getAllShouldReturnedMoney(id, y);
         //获取预算支出集合
         List<AnnualBudgetDisburseVO> disburseList = baseMapper.getDisburseByAnnualBudgetId(id);
         //分别计算12个月
@@ -215,6 +220,7 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
             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) {
@@ -226,7 +232,27 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                     }
                 }
             }
-            //移除集中和已经通过的月
+            //存量项目收入
+            if (returnedInfos != null && returnedInfos.size() > 0){
+                for (ContractReturnedInfoVO2 info : returnedInfos) {
+                    if (info.getShouldReturnedTime().getMonthValue() == i){
+                        if (info.getShouldReturnedMoney() == null){
+                            info.setShouldReturnedMoney(new BigDecimal(0));
+                        }
+                        incomeTotal = incomeTotal.add(info.getShouldReturnedMoney());
+                        AnnualBudgetIncomeVO vo = new AnnualBudgetIncomeVO();
+                        //设置详情预览
+                        vo.setProjectName(info.getProjectName());
+                        vo.setIncomeTypeValue(info.getIncomeTypeValue());
+                        vo.setProjectTypeValue(info.getProjectTypeValue());
+                        vo.setContractTypeValue(info.getContractTypeValue());
+                        vo.setReturnTime(info.getShouldReturnedTime());
+                        vo.setReturnMoney(info.getShouldReturnedMoney());
+                        list1.add(vo);
+                    }
+                }
+            }
+
             incomeDetail.setIncome(incomeTotal);
             incomeDetail.setIncomeList(list1);
             incomeDetails.add(incomeDetail);
@@ -1141,6 +1167,8 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
             //如果不为空,根据costType分组
             allPlanMap = allPlan.parallelStream()
                     .collect(Collectors.groupingBy(ProjectCostBudget::getCostType));
+            //分解出父计划和子计划,需要用父计划其他预算支出
+
         }else {
             isBudget = false;
         }
@@ -1815,7 +1843,8 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
     /**
      * 统计收入,1合同收入2计划回款
      */
-    public static Map<String,BigDecimal> statisticIncome(AnnualBudgetDTO dto){
+    public Map<String,BigDecimal> statisticIncome(AnnualBudgetDTO dto){
+        int y = Integer.parseInt(dto.getName().substring(0, 4));
         List<AnnualBudgetIncome> incomeList = dto.getIncomeList();
         BigDecimal contractTotal = new BigDecimal("0");
         BigDecimal planReturnedTotal = new BigDecimal("0");
@@ -1826,10 +1855,21 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                 if (income.getPredictContractMoney() != null) {
                     contractTotal = contractTotal.add(income.getPredictContractMoney());
                 }
-                //计划回款总和
-                if (income.getPredictAnnualReturned() != null){
-                    planReturnedTotal = planReturnedTotal.add(income.getPredictAnnualReturned());
+                //年度合同指标,
+                if (income.getIncomeType() == 1){
+                    //存量项目去查找当年合同应回款
+                    BigDecimal decimal = returnedInfoService.getProjectShouldReturnedByYear(income.getProjectId(), y);
+                    planReturnedTotal = planReturnedTotal.add(decimal);
+                }else if (income.getIncomeType() == 2){
+                    //增量项目直接统计
+                    //计划回款总和
+                    if (income.getPredictAnnualReturned() != null){
+                        planReturnedTotal = planReturnedTotal.add(income.getPredictAnnualReturned());
+                    }
+                }else {
+                    throw new ServiceException("收入类别错误");
                 }
+
             }
         }
         Map<String,BigDecimal> map = new HashMap<>();

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

@@ -192,4 +192,19 @@ public class ContractReturnedInfoServiceImpl extends BaseServiceImpl<ContractRet
         }
         return list;
     }
+
+    /**
+     * 根据项目id和年份获取项目当年应回款
+     * @param projectId
+     * @param year
+     * @return
+     */
+    @Override
+    public BigDecimal getProjectShouldReturnedByYear(Long projectId, int year) {
+        BigDecimal decimal = baseMapper.getProjectShouldReturnedByYear(projectId, year);
+        if (decimal == null){
+            return new BigDecimal(0);
+        }
+        return decimal;
+    }
 }

+ 41 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -463,6 +463,14 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         for (ProjectCostBudgetVO2 vo2 : list) {
             List<ProjectCostBudgetVO2> vo2ChildrenList = vo2.getChildrenList();
             if (vo2ChildrenList != null && vo2ChildrenList.size() > 0){
+//                //是否跨月
+//                Boolean isTwoMonth = false;
+//                //总计划天数
+//                BigDecimal totalDays = new BigDecimal(0);
+//                //子计划开始月计划总天数
+//                BigDecimal startTotalDays = new BigDecimal(0);
+//                //子计划结束月计划总天数
+//                BigDecimal endTotalDays = new BigDecimal(0);
                 for (ProjectCostBudget budget : vo2ChildrenList) {
                     //如果计划正在进行中或者已经完成,则跳过
                     if (budget.getStatus() != null && budget.getStatus() != 1){
@@ -481,26 +489,53 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                     budget.setProjectProcess(vo2.getProjectProcess());
                     budget.setTaskDetail(vo2.getTaskDetail());
                     budget.setPostType(vo2.getPostType());
+                    //设置主计划总天数
+//                    totalDays = totalDays.add(budget.getPlanDays());
                     //只计算固定计划的人工成本
                     if (map2.get(budget.getPlanTaskType()).get(0).getDictValue() == 1) {
                         //计划人工支出
                         budget.setPlanStaffCost(budget.getPlanDays().multiply(new BigDecimal(map.get(vo2.getPostType()).get(0).getDictValue())));
                         //如果跨月
                         if (budget.getPlanStartTime().getMonthValue() != budget.getPlanEndTime().getMonthValue()) {
+                            //跨月则改变状态
+//                            isTwoMonth = true;
                             budget.setPlanIsTwoMonth(1);
                             //计算开始到月底多少个工作日
                             int days = CommonUtil.getWorkDays(budget.getPlanStartTime(), LocalDate.of(vo2.getPlanStartTime().getYear(), budget.getPlanStartTime().getMonthValue(), budget.getPlanStartTime().getMonth().maxLength()));
                             if (days > budget.getPlanDays().intValue()){
+                                //如果这个月工作天数大于总天数,那么所有值都设置到本月
+//                                startTotalDays = startTotalDays.add(budget.getPlanDays());
+                                budget.setPlanStartMonthDays(budget.getPlanDays());
+                                budget.setPlanEndMonthDays(new BigDecimal(0));
                                 budget.setPlanStartMoney(budget.getPlanStaffCost());
                                 budget.setPlanEndMoney(new BigDecimal(0));
                             }else {
+                                //如果这个月工作天数小于总计划,则总计划相减
+//                                startTotalDays = startTotalDays.add(new BigDecimal(days));
+//                                endTotalDays = endTotalDays.add(budget.getPlanDays().subtract(new BigDecimal(days)));
+                                budget.setPlanStartMonthDays(new BigDecimal(days));
+                                budget.setPlanEndMonthDays(budget.getPlanDays().subtract(new BigDecimal(days)));
                                 budget.setPlanStartMoney(new BigDecimal(days).multiply(new BigDecimal(map.get(budget.getPostType()).get(0).getDictValue())));
                                 budget.setPlanEndMoney(budget.getPlanStaffCost().subtract(budget.getPlanStartMoney()));
                             }
+                        }else {
+//                            startTotalDays = startTotalDays.add(budget.getPlanDays());
                         }
                     }
                 }
                 childrenList.addAll(vo2ChildrenList);
+//                //有子计划也要为父计划设置是否跨月,并且跨月多少天,预算多少钱
+//                ProjectCostBudget costBudget = new ProjectCostBudget();
+//                costBudget.setId(vo2.getId());
+//                if (isTwoMonth){
+//                    costBudget.setPlanIsTwoMonth(1);
+//                    costBudget.setPlanStartMonthDays(startTotalDays);
+//                    costBudget.setPlanEndMonthDays(endTotalDays);
+//                }else {
+//                    costBudget.setPlanIsTwoMonth(0);
+//                }
+//                costBudget.setPlanDays(totalDays);
+//                parentList.add(costBudget);
             }else {
                 //无子计划
                 ProjectCostBudget budget = new ProjectCostBudget();
@@ -521,9 +556,15 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                             //计算开始到月底多少个工作日
                             int days = CommonUtil.getWorkDays(budget.getPlanStartTime(), LocalDate.of(budget.getPlanStartTime().getYear(), budget.getPlanStartTime().getMonthValue(), budget.getPlanStartTime().getMonth().maxLength()));
                             if (days > budget.getPlanDays().intValue()){
+                                //如果这个月工作天数大于总天数,那么所有值都设置到本月
+                                budget.setPlanStartMonthDays(budget.getPlanDays());
+                                budget.setPlanEndMonthDays(new BigDecimal(0));
                                 budget.setPlanStartMoney(budget.getPlanStaffCost());
                                 budget.setPlanEndMoney(new BigDecimal(0));
                             }else {
+                                //如果这个月工作天数小于总计划,则总计划相减
+                                budget.setPlanStartMonthDays(new BigDecimal(days));
+                                budget.setPlanEndMonthDays(budget.getPlanDays().subtract(new BigDecimal(days)));
                                 budget.setPlanStartMoney(new BigDecimal(days).multiply(new BigDecimal(map.get(budget.getPostType()).get(0).getDictValue())));
                                 budget.setPlanEndMoney(budget.getPlanStaffCost().subtract(budget.getPlanStartMoney()));
                             }

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

@@ -1,9 +1,11 @@
 package com.mixsmart.utils;
 
 
+import cn.hutool.log.StaticLog;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 
+import com.jfireel.expression.Expression;
 import org.apache.poi.hssf.usermodel.HSSFDataFormatter;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.*;
@@ -23,6 +25,7 @@ import org.jfree.data.xy.DefaultXYDataset;
 import org.jfree.data.xy.XYSeries;
 import org.jfree.data.xy.XYSeriesCollection;
 import org.jsoup.Jsoup;
+import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.IoUtil;
 import org.springblade.core.tool.utils.StringPool;
@@ -30,6 +33,7 @@ import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.dto.Coords;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
+import org.springblade.manager.dto.LocalVariable;
 import org.springblade.manager.entity.Formula;
 import org.springblade.manager.utils.FileUtils;
 
@@ -607,6 +611,53 @@ public class FormulaUtils {
            return coords;
      }
 
+    public static List<Object> slice(List<LocalVariable>  local, String formula){
+        int min =0;
+        List<Object> result = new ArrayList<>();
+        try {
+            pretreatment(local,formula);
+            List<Object>  r= local.stream().map(e-> {
+                /*所有依赖元素的内容必须非空才进行计算,否则返回空值*/
+                return e.hasEmptyElementValue()?"": Expression.parse(e.getFormula()).calculate(e.getCurrentMap()).toString();
+            }).collect(Collectors.toList());
+            if(CollectionUtil.isNotEmpty(r)&&r.stream().anyMatch(StringUtils::isNotEmpty)){
+                result.addAll(r);
+            }
+        }catch (Exception e){
+            StaticLog.error("公式:{},执行出错",formula);
+        }
+        return  result;
+    }
+
+    public static void  pretreatment(List<LocalVariable>  local,String formula){
+        formula=StringUtils.removeMultiSpace(formula);
+        if(formula.contains("LIST")){
+            Matcher  m=RegexUtils.matcher("\\(([^)]*)\\)/LIST",formula);
+            while (m.find()){
+                List<String> codes=getCodeList(m.group(1).replaceAll("[+-]",","));
+                local=local.stream().peek(e->{
+                    @SuppressWarnings("unckecked")
+                    Map<String,Object> map = (Map<String, Object>) e.getCurrentMap().getOrDefault("E",new HashMap<>());
+                    int listSize=(int)codes.stream().filter(c->StringUtils.isNotEmpty(map.get(c))).count();
+                    if(listSize<=0||listSize>codes.size()){
+                        listSize=codes.size();
+                    }
+                    map.put("LIST",listSize);
+                }).collect(Collectors.toList());
+            }
+        }
+    }
+    /*从方法参数中获取全部code*/
+    public static List<String> getCodeList(String param){
+        List<String> list = new ArrayList<>();
+        if(StringUtils.isNotEmpty(param)){
+            Arrays.stream(param.split(",")).forEach(s->{
+                list.add(s.replaceAll("[E\\[\\]']",""));
+            });
+        }
+        return list;
+    }
+
     public static FormData createFormDataFast(String name,String code,String values,String coords){
         if(StringUtils.isNotEmpty(code,name)){
             //String[] arr=code.split(":");

+ 39 - 19
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.spire.xls.*;
+import com.spire.xls.collections.PicturesCollection;
 import com.spire.xls.core.spreadsheet.HTMLOptions;
 import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
@@ -284,8 +285,7 @@ public class ExcelTabController extends BladeController {
     })
     public R putFileAttach(@RequestParam("file") MultipartFile file, Long nodeId) {
 
-        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        //String file_path = "/Users/hongchuangyanfa/Desktop/";
+        String file_path = FileUtils.getSysLocalFileUrl();
 
         ExcelTab detail = excelTabService.getById(nodeId);
         // 上传excel文件
@@ -302,8 +302,6 @@ public class ExcelTabController extends BladeController {
         //获取工作表
         Worksheet sheet = wb.getWorksheets().get(0);
         sheet.saveToHtml(thmlUrl, options);
-
-//        detail.setExtension(bladeFile1.getOriginalName());
         detail.setExtension(file.getOriginalFilename());
         detail.setFileUrl(bladeFile1.getLink());
         detail.setFileType(3); // 表示为清表信息  1 表示祖节点  2 表示为节点信息 3 表示清表
@@ -625,15 +623,7 @@ public class ExcelTabController extends BladeController {
         }
 
         String fileUrl = wbsTreeContract.getHtmlUrl();
-        File file1 = ResourceUtil.getFile(fileUrl);
-        InputStream fileInputStream = null;
-        if (file1.exists()) {
-            fileInputStream = new FileInputStream(file1);
-        } else {
-            String path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path, "");
-            fileInputStream = CommonUtil.getOSSInputStream(path);
-        }
-
+        InputStream fileInputStream = FileUtils.getInputStreamByUrl(fileUrl);
         String htmlString = IoUtil.readToString(fileInputStream);
         htmlString = htmlString.replaceAll("placeholder", "placeholderxx");
         htmlString = htmlString.replaceAll("title", "titlexx");
@@ -667,7 +657,7 @@ public class ExcelTabController extends BladeController {
                 String style = data.attr("style");
                 if (style.indexOf("font-size") >= 0) {
                     int fontsize = Integer.parseInt(style.substring(style.indexOf("font-size:") + 10, style.indexOf(".0pt")));
-                    if (StringUtils.isNotEmpty(data.text()) && fontsize >= 12) {
+                    if (StringUtils.isNotEmpty(data.text()) && fontsize >= 14) {
                         trs.get(i - 1).select("td").get(0).text(projectInfo.getProjectName());
                     }
                 }
@@ -829,7 +819,7 @@ public class ExcelTabController extends BladeController {
 
 
     // 上传解析 html
-    public void expailHtmlInfo(String thmlUrl, Long excelId) throws FileNotFoundException {
+    public void expailHtmlInfo(String thmlUrl, Long excelId) throws Exception {
 
         // 读取
         File file1 = ResourceUtil.getFile(thmlUrl);
@@ -853,12 +843,8 @@ public class ExcelTabController extends BladeController {
 
         // 获取图片信息
         Elements imgs = doc.select("img");
-        int imgIndex = 0;
 
 
-        // 移除图片
-        doc.select("img").remove();
-
         // 获取总行列数
         int maxCol = doc.select("Col").size();
         String[] rowData = new String[trs.size() + 5]; //本来加一的 害怕出现特殊情况 故意 加 5
@@ -1267,6 +1253,40 @@ public class ExcelTabController extends BladeController {
         }
         exctabCellService.saveBatch(colTitle2);
 
+
+        //对excel 的图片进行操作
+        ExcelTab exceltab = excelTabService.getById(excelId);
+        if(exceltab!=null){
+            // 获取excle 的数据
+            String fileUrl = exceltab.getFileUrl();
+            InputStream ossInputStream = CommonUtil.getOSSInputStream(fileUrl);
+            Workbook wb = new Workbook();
+            wb.loadFromMHtml(ossInputStream);
+            Worksheet sheet = wb.getWorksheets().get(0);
+            PicturesCollection pictures = sheet.getPictures();
+            if(pictures!=null && pictures.size()>=1){
+                for (int i=0 ; i<pictures.size() ; i++){
+                    ExcelPicture pic = pictures.get(i);
+                    int x = pic.getLeftColumn();
+                    int y = pic.getBottomRow();
+                    Elements select = doc.select("el-input[x1=" + x + "][y1=" + y + "]");
+                    System.out.println("xx=--"+x);
+                    System.out.println("yy=--"+y);
+                    if(select!=null && select.size()>=1){
+                        Element element = select.get(0);
+                        Element elementP = element.parent();
+                        element.remove();
+                        Element imgele = imgs.get(i);
+                        imgele.removeAttr("class");
+                        elementP.append(imgele.toString());
+                    }
+                }
+            }
+
+            ossInputStream.close();
+        }
+        // 移除图片
+        imgs.remove();
         // 保存
         File writefile = new File(thmlUrl);
         FileUtil.writeToFile(writefile, doc.html(), Boolean.parseBoolean("UTF-8"));

+ 160 - 76
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -28,6 +29,7 @@ import org.springblade.manager.dto.*;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.enums.ExecuteType;
 import org.springblade.manager.formula.KeyMapper;
+import org.springblade.manager.formula.impl.CompositeDataAccess;
 import org.springblade.manager.service.*;
 import org.springblade.manager.service.impl.FormulaServiceImpl;
 import org.springblade.manager.vo.AppWbsTreeContractVO;
@@ -497,6 +499,83 @@ public class FormulaController {
         return R.data(map);
     }
 
+  /*  public R<Object> chartInit(@RequestBody ChartOption option){
+        *//*1.获取公式配置,如果存在子公式,则一直查找到最终公式*//*
+        *//*2.查找所有依赖元素的所有数据,按表单排序*//*
+        *//*3.计算结果*//*
+        *//*4.查找当前表对应返回配置模版结合计算结果生成option*//*
+        Long pkeyId=option.getPkeyId();
+        String id=option.getId();
+        WbsTreePrivate wtp = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId,pkeyId));
+        if(wtp!=null&&Func.isNotEmpty(id)){
+            *//*获取配置*//*
+            List<Map<String,Object>> listMap= this.jdbcTemplate.queryForList("select content from m_formula_panel  a  join m_wbs_tree_private b on a.id=b.init_table_id where b.p_key_id="+pkeyId);
+            if(Func.isNotEmpty(listMap)){
+                JSONObject job = JSON.parseObject(listMap.get(0).get("content").toString());
+                *//*获取关联数据*//*
+                List<Map<String,Object>>  configList= this.jdbcTemplate.queryForList("select d.rely ,b.e_key ekey from m_wbs_tree_private a join  m_wbs_form_element b on a.init_table_id=b.f_id join m_element_formula_mapping c on b.id=c.element_id join m_formula d on c.formula_id=d.id  where p_key_id="+wtp.getPKeyId()+" and b.is_deleted=0 and  d.formula like 'FC.chart%' limit 1");
+                if(Func.isNotEmpty(configList)){
+                    Map<String,Object> config =configList.get(0);
+                    String[] rely = Func.toStr(config.get("rely")).split(",");
+                    String ky=rely[0].split(":")[1];
+                    String kx=rely[1].split(":")[1];
+                    Map<String,Map<String,Object>> formMap = option.getData();
+                    List<Map<String,Object>> dataMap;
+                    if(formMap!=null&&formMap.size()>0){
+                        dataMap=new ArrayList<>();
+                        Map<String,Object> md= new HashMap<>();
+                        dataMap.add(md);
+                        StringBuilder sy= new StringBuilder();
+                        StringBuilder sx = new StringBuilder();
+                        formMap.forEach((o,t)->{
+                            t.forEach((k,v)->{
+                                String[] ka=k.split("__");
+                                if(ky.equals(ka[0])){
+                                    sy.append(v).append("_^_").append(ka[1]).append("☆");
+                                }else if(kx.equals(ka[0])){
+                                    sx.append(v).append("_^_").append(ka[1]).append("☆");
+                                }
+                            });
+                        });
+                        if(sy.length()>1){
+                            sy.deleteCharAt(sy.length()-1);
+                        }
+                        if(sx.length()>1){
+                            sx.deleteCharAt(sx.length()-1);
+                        }
+                        md.put(ky,sy.toString());
+                        md.put(kx,sx.toString());
+                    }else{
+                        dataMap= this.jdbcTemplate.queryForList("select "+ky+","+kx+" from "+wtp.getInitTableName() +" where group_id="+id+" and p_key_id ="+pkeyId);
+                    }
+                    if(Func.isNotEmpty(dataMap)){
+                        Map<String,Object> data = dataMap.get(0);
+                        String dy= Func.toStr(data.get(ky));
+                        String dx=Func.toStr(data.get(kx));
+                        if(dy.length()>0&&dx.length()>0){
+                            Map<String,String> coordsMap = FormulaUtils.getElementCell(wtp.getHtmlUrl());
+                            List<ElementData> ly = FormulaUtils.getElementDataList(coordsMap.get(ky),dy);
+                            List<ElementData> lx = FormulaUtils.getElementDataList(coordsMap.get(kx),dx);
+                            JSONArray jsonArray =new JSONArray();
+                            for(int i=0;i< Math.min(ly.size(),lx.size());i++){
+                                ElementData edy= ly.get(i);
+                                ElementData edx = lx.get(i);
+                                if(StringUtils.isNotEmpty(edy.stringValue(),edx.stringValue())){
+                                    jsonArray.add(new JSONArray().fluentAdd(edx.numberValue()).fluentAdd(edy.numberValue()));;
+                                }
+                            }
+                            if(!jsonArray.isEmpty()){
+                                JSONObject chartData= job.getJSONArray("series").getJSONObject(0);
+                                chartData.put("data",jsonArray);
+                            }
+                        }
+                    }
+                    return R.data(job);
+                }
+            }
+        }
+        return R.data("{}");
+    }*/
     @PostMapping("/chart-init")
     @ApiOperationSupport(order = 11)
     public R<Object> chartInit(@RequestBody ChartOption option){
@@ -512,72 +591,24 @@ public class FormulaController {
                List<Map<String,Object>> listMap= this.jdbcTemplate.queryForList("select content from m_formula_panel  a  join m_wbs_tree_private b on a.id=b.init_table_id where b.p_key_id="+pkeyId);
                if(Func.isNotEmpty(listMap)){
                    JSONObject job = JSON.parseObject(listMap.get(0).get("content").toString());
-                   /*获取关联数据*/
-                   List<Map<String,Object>>  configList= this.jdbcTemplate.queryForList("select d.rely ,b.e_key ekey from m_wbs_tree_private a join  m_wbs_form_element b on a.init_table_id=b.f_id join m_element_formula_mapping c on b.id=c.element_id join m_formula d on c.formula_id=d.id  where p_key_id="+wtp.getPKeyId()+" and b.is_deleted=0 and  d.formula like 'FC.chart%' limit 1");
-                   if(Func.isNotEmpty(configList)){
-                       Map<String,Object> config =configList.get(0);
-                       String[] rely = Func.toStr(config.get("rely")).split(",");
-                       String ky=rely[0].split(":")[1];
-                       String kx=rely[1].split(":")[1];
-                       Map<String,Map<String,Object>> formMap = option.getData();
-                       List<Map<String,Object>> dataMap;
-                       if(formMap!=null&&formMap.size()>0){
-                           dataMap=new ArrayList<>();
-                           Map<String,Object> md= new HashMap<>();
-                           dataMap.add(md);
-                           StringBuilder sy= new StringBuilder();
-                           StringBuilder sx = new StringBuilder();
-                           formMap.forEach((o,t)->{
-                               t.forEach((k,v)->{
-                                   String[] ka=k.split("__");
-                                   if(ky.equals(ka[0])){
-                                       sy.append(v).append("_^_").append(ka[1]).append("☆");
-                                   }else if(kx.equals(ka[0])){
-                                       sx.append(v).append("_^_").append(ka[1]).append("☆");
-                                   }
-                               });
-                           });
-                           if(sy.length()>1){
-                               sy.deleteCharAt(sy.length()-1);
-                           }
-                           if(sx.length()>1){
-                               sx.deleteCharAt(sx.length()-1);
-                           }
-                           md.put(ky,sy.toString());
-                           md.put(kx,sx.toString());
-                       }else{
-                            dataMap= this.jdbcTemplate.queryForList("select "+ky+","+kx+" from "+wtp.getInitTableName() +" where group_id="+id+" and p_key_id ="+pkeyId);
-                       }
-                       if(Func.isNotEmpty(dataMap)){
-                           Map<String,Object> data = dataMap.get(0);
-                           String dy= Func.toStr(data.get(ky));
-                           String dx=Func.toStr(data.get(kx));
-                           if(dy.length()>0&&dx.length()>0){
-                              Map<String,String> coordsMap = FormulaUtils.getElementCell(wtp.getHtmlUrl());
-                              List<ElementData> ly = FormulaUtils.getElementDataList(coordsMap.get(ky),dy);
-                              List<ElementData> lx = FormulaUtils.getElementDataList(coordsMap.get(kx),dx);
-                              JSONArray jsonArray =new JSONArray();
-                              for(int i=0;i< Math.min(ly.size(),lx.size());i++){
-                                     ElementData edy= ly.get(i);
-                                     ElementData edx = lx.get(i);
-                                     if(StringUtils.isNotEmpty(edy.stringValue(),edx.stringValue())){
-                                         jsonArray.add(new JSONArray().fluentAdd(edx.numberValue()).fluentAdd(edy.numberValue()));;
-                                     }
-                              }
-                              if(!jsonArray.isEmpty()){
-                                  JSONObject chartData= job.getJSONArray("series").getJSONObject(0);
-                                  chartData.put("data",jsonArray);
-                              }
-                           }
+                   try {
+                       JSONArray  jsonArray= createSeries(wtp,id);
+                       if(!jsonArray.isEmpty()){
+                           JSONObject chartData= job.getJSONArray("series").getJSONObject(0);
+                           chartData.put("data",jsonArray);
+                           return R.data(job);
                        }
-                       return R.data(job);
+                   }catch (Exception e){
+                       e.printStackTrace();
                    }
                }
             }
             return R.data("{}");
     }
 
-    public Formula formulaAct(Long pkeyId){
+    public JSONArray createSeries(WbsTreePrivate wtp,String groupId){
+        Long pkeyId =wtp.getPKeyId();
+        JSONArray jsonArray =new JSONArray();
         List<Map<String,Object>>  configList= this.jdbcTemplate.queryForList("select d.rely,d.formula ,b.e_key ekey from m_wbs_tree_private a join  m_wbs_form_element b on a.init_table_id=b.f_id join m_element_formula_mapping c on b.id=c.element_id join m_formula d on c.formula_id=d.id  where p_key_id="+pkeyId+" and b.is_deleted=0 and  d.formula like 'FC.chart%' limit 1");
         if(Func.isNotEmpty(configList)) {
             Map<String, Object> config = configList.get(0);
@@ -585,18 +616,75 @@ public class FormulaController {
             String[] rely = relyStr.split(",");
             String ky=rely[0].split(":")[1];
             String kx=rely[1].split(":")[1];
-            Formula formulaY =new Formula();
-            formulaY.setFormula(config.get("formula").toString());
-            formulaY.setRely(relyStr);
-            formulaY.setFormula(nest(formulaY.getFormula(),formulaY.getRely()));
-            this.service.relyParse(formulaY);
+            Map<String,FormData> dataSource= getDataFromCodes(Arrays.asList(rely),wtp,groupId);
+            List<Object> ly= calc(ky,dataSource);
+            List<Object> lx= calc(kx,dataSource);
+            for(int i=0;i< Math.min(ly.size(),lx.size());i++){
+                Object edy= ly.get(i);
+                Object edx =lx.get(i);
+                if(StringUtils.isNotEmpty(edy,edx)){
+                    jsonArray.add(new JSONArray().fluentAdd(edx).fluentAdd(edy));;
+                }
+            }
         }
-        return null;
+        return jsonArray;
     }
 
 
-    public List<Object> calc(String formula,Map<String,List<ElementData>> dataSource){
-        return null;
+    public List<Object> calc(String formula,Map<String,FormData> dataSource){
+        List<Object> result = new ArrayList<>();
+        Formula formulaY =new Formula();
+        formulaY.setFormula(formula);
+        this.service.relyParse(formulaY);
+        formulaY.setFormula(nest(formulaY.getFormula(),formulaY.getRely()));
+        this.service.relyParse(formulaY);
+        formula=formulaY.getFormula();
+        List<FormData>  ele = new ArrayList<>();
+        formulaY.getRelyList().forEach(rely->{
+            FormData formData=  dataSource.get(rely);
+            if(!formData.empty()){
+                ele.add(formData);
+            }
+        });
+        LinkedHashMap<String,FormData> fdMap =new LinkedHashMap<>();
+        FormData maxFormData = Collections.max(ele, Comparator.comparingInt((FormData ef)->ef.getValues().size()));
+        FormData minFormData = Collections.min(ele, Comparator.comparingInt((FormData ef)->ef.getValues().size()));
+        if (maxFormData.getValues().size() != minFormData.getValues().size()) {
+            int baseLength = maxFormData.getValues().size();
+            for (FormData formData : ele) {
+                formData.setStep(baseLength / formData.getValues().size());
+            }
+        }
+        ele.forEach(e->{
+            fdMap.put(e.getCode(),e);
+        });
+        CompositeDataAccess cda = new CompositeDataAccess(fdMap);
+        List<LocalVariable>  local= new ArrayList<>();
+        while (cda.hasNext()){
+            LinkedHashMap<String,ElementData> tip= cda.next();
+            Map<String, Object> variable = new HashMap<>();
+            @SuppressWarnings("unchecked")
+            Map<String,Object> em= (Map<String, Object>) variable.computeIfAbsent("E", k->new HashMap<>());
+            int index= new ArrayList<>(tip.values()).get(0).getIndex();
+            for(Map.Entry<String,ElementData> se:tip.entrySet()){
+                Object value=se.getValue().getValue();
+                if(CustomFunction.isNumber(value)){
+                    if(StringUtils.isDouble(value)||formula.contains("/")){
+                        em.put(se.getKey(),Double.parseDouble(value.toString()));
+                    }else{
+                        em.put(se.getKey(),StringUtils.handleObj2Integer(value));
+                    }
+                }else{
+                    em.put(se.getKey(),value);
+                }
+
+            }
+            local.add(new LocalVariable(index,formula,variable));
+        }
+        if(local.size()>0){
+            List<Object> values = FormulaUtils.slice(local,formula);
+        }
+        return result;
     }
 
 
@@ -607,11 +695,11 @@ public class FormulaController {
      * @Author yangyj
      * @Date 2023.08.01 14:53
      **/
-    public Map<String,List<ElementData>> getDataFromCodes(List<String> codes,WbsTreePrivate wtp,String id){
+    public Map<String,FormData>  getDataFromCodes(List<String> codes,WbsTreePrivate wtp,String id){
         String s = codes.stream().collect(Collectors.joining("','","'","'"));
         List<Map<String,Object>> listMap = this.jdbcTemplate.queryForList("select a.id elementId,a.e_key ekey,a.e_name eName,b.init_table_name tableName,b.html_url url,b.p_key_id pkeyId,b.node_name nodeName,CONCAT(b.init_table_name,':',a.e_key) tk from m_wbs_form_element a join m_wbs_tree_private b on a.f_id=b.init_table_id where b.parent_id="+wtp.getParentId()
                 +" and b.project_id="+wtp.getProjectId()+" and b.is_deleted=0 and a.is_deleted=0  and CONCAT(b.init_table_name,':',a.e_key) in("+s+") ORDER BY b.sort,b.create_time");
-        Map<String,List<ElementData>> result = new HashMap<>();
+        Map<String,FormData> result = new HashMap<>();
         if(listMap.size()>codes.size()){
             Map<String,Map<String,String>> coordsMap = new HashMap<>();
             for(Map<String,Object> m:listMap){
@@ -635,15 +723,10 @@ public class FormulaController {
                     }
                 }
             });
-           Map<String,FormData> fdMap= codes.stream().map(c->{
+           result= codes.stream().map(c->{
                 String[] tc=c.split(":");
                 return FormulaUtils.createFormDataFast(c,c,codeDataMap.get(c),coordsMap.get(tc[0]).get(tc[1]));
             }).filter(Objects::nonNull).collect(Collectors.toMap(FormData::getCode, f->f));
-           if(fdMap.size()>0){
-               fdMap.forEach((k,v)->{
-                   result.put(k,v.getValues());
-               });
-           }
         }
         return  result;
     }
@@ -683,7 +766,6 @@ public class FormulaController {
 
 
     public R<Object> flushPri(){
-        /*刷inittablename*/
         List<Map<String,Object>> listMap=this.jdbcTemplate.queryForList("select p_key_id nodeId,init_table_id tableId from m_wbs_tree_private where project_id=1630011899725201410 and init_table_id is not null and init_table_name is null and is_deleted=0");
         if(listMap.size()>0){
             Map<Long,Long> idMap= listMap.stream().collect(Collectors.toMap(m->Long.parseLong(m.get("nodeId").toString()),m->Long.parseLong(m.get("tableId").toString())));
@@ -705,4 +787,6 @@ public class FormulaController {
         }
         return R.fail("失败");
     }
+
+
 }

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

@@ -108,6 +108,8 @@ public interface ITurnPointCalculator {
                 }
                 tmp.add(tp);
             }
+            /*根据黄飞扬反馈情况,暂时去掉手填转点的可能性,每次重新生成20230803*/
+            tmp.removeIf(e-> ZD.equals(e.getType()));
             List<TurnPoint> result = fill(tmp);
             if (ListUtils.isNotEmpty(result)) {
                 return  result;

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

@@ -1491,7 +1491,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                             if(StringUtils.isNotEmpty(dataJson)){
                                                 JSONArray jsonArray = JSONArray.parseArray(dataJson);
                                                 List<Integer> idList = Func.toIntList(myData);
-                                                String dataInfo = jsonArray.getJSONObject(0).getString("name");
+                                                String dataInfo = jsonArray.getJSONObject(idList.get(0)).getString("name");
                                                 for(int inx=1 ; inx<idList.size() ; inx++){
                                                     dataInfo = dataInfo+","+jsonArray.getJSONObject(inx).getString("name");
                                                 }

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

@@ -786,7 +786,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                     local.add(new LocalVariable(index,f,variable));
                                 }
                                 if(local.size()>0){
-                                    List<Object> values = slice(local,f);
+                                    List<Object> values = FormulaUtils.slice(local,f);
                                     FormulaUtils.write(fd,values, !fd.getTableName().equals(checkTable));
                                 }
                             }else{
@@ -1366,13 +1366,13 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
 
 
 
-    public  List<Object> slice(List<LocalVariable>  local,String formula){
+/*    public  List<Object> slice(List<LocalVariable>  local,String formula){
         int min =0;
         List<Object> result = new ArrayList<>();
         try {
             pretreatment(local,formula);
             List<Object>  r= local.stream().map(e-> {
-                /*所有依赖元素的内容必须非空才进行计算,否则返回空值*/
+                *//*所有依赖元素的内容必须非空才进行计算,否则返回空值*//*
                 return e.hasEmptyElementValue()?"": Expression.parse(e.getFormula()).calculate(e.getCurrentMap());
             }).collect(Collectors.toList());
             if(CollectionUtil.isNotEmpty(r)&&r.stream().anyMatch(StringUtils::isNotEmpty)){
@@ -1382,14 +1382,14 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
             StaticLog.error("公式:{},执行出错",formula);
         }
         return  result;
-    }
+    }*/
 
-    public void  pretreatment(List<LocalVariable>  local,String formula){
+/*    public void  pretreatment(List<LocalVariable>  local,String formula){
         formula=StringUtils.removeMultiSpace(formula);
         if(formula.contains("LIST")){
             Matcher  m=RegexUtils.matcher("\\(([^)]*)\\)/LIST",formula);
             while (m.find()){
-                List<String> codes=this.getCodeList(m.group(1).replaceAll("[+-]",","));
+                List<String> codes=FormulaUtils.getCodeList(m.group(1).replaceAll("[+-]",","));
                 local=local.stream().peek(e->{
                     @SuppressWarnings("unckecked")
                     Map<String,Object> map = (Map<String, Object>) e.getCurrentMap().getOrDefault(E,new HashMap<>());
@@ -1401,7 +1401,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                 }).collect(Collectors.toList());
             }
         }
-    }
+    }*/
 
 
     public  static void sort( List<FormData> list,int n){
@@ -1571,7 +1571,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                      Matcher m = RegexUtils.matcher(FC_REG+"(quantity)\\(([^)]+)\\)",f);
                      while (m.find()) {
                          Object data=null;
-                         List<String> codeList = getCodeList(m.group(2));
+                         List<String> codeList = FormulaUtils.getCodeList(m.group(2));
                          @SuppressWarnings("unchecked")
                          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));
@@ -1726,7 +1726,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
 
 
     /*从方法参数中获取全部code*/
-    public List<String> getCodeList(String param){
+/*    public List<String> getCodeList(String param){
         List<String> list = new ArrayList<>();
         if(StringUtils.isNotEmpty(param)){
             Arrays.stream(param.split(",")).forEach(s->{
@@ -1734,7 +1734,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
             });
         }
         return list;
-    }
+    }*/
 
     public List<String> getCodeByEl(String el){
         List<String> l = new ArrayList<>();