ソースを参照

Merge remote-tracking branch 'origin/master' into master

yangyj 2 年 前
コミット
c61e7ce15d
16 ファイル変更372 行追加27 行削除
  1. 1 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/LogHistoryInfoVO.java
  2. 5 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/AppWbsTreeContractVO.java
  3. 22 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractVO7.java
  4. 3 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java
  5. 246 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java
  6. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java
  7. 39 19
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  8. 8 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  9. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TableFileMapper.java
  10. 6 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TableFileMapper.xml
  11. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/ITableFileService.java
  12. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  13. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  14. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/TableFileServiceImpl.java
  15. 28 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  16. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

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

@@ -20,7 +20,7 @@ public class LogHistoryInfoVO extends LogHistoryInfo {
     @ApiModelProperty(value = "已读状态 0=未读 1=已读")
     private Integer isRead;
 
-    @ApiModelProperty(value = "已读状态 0=否 1=是")
+    @ApiModelProperty(value = "是否可编辑 0=否 1=是")
     private Integer isEdit;
 
     @ApiModelProperty(value = "当前日志关联的任务信息List")

+ 5 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/AppWbsTreeContractVO.java

@@ -1,6 +1,8 @@
 package org.springblade.manager.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springblade.manager.entity.TableFile;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.entity.AppUser;
 
@@ -13,4 +15,7 @@ public class AppWbsTreeContractVO extends WbsTreeContract {
     // 填报用户信息
     private List<AppUser> appUserList;
 
+    @ApiModelProperty(value = "附件")
+    private List<TableFile> fileList;
+
 }

+ 22 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractVO7.java

@@ -0,0 +1,22 @@
+package org.springblade.manager.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.core.tool.node.INode;
+import org.springblade.core.tool.node.TreeNode;
+import org.springblade.manager.entity.TableFile;
+import org.springblade.manager.entity.WbsTreeContract;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class WbsTreeContractVO7 extends WbsTreeContract {
+
+    @ApiModelProperty(value = "附件")
+    private List<TableFile> fileList;
+
+}

+ 3 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java

@@ -147,6 +147,9 @@ public class ImageClassificationFileServiceImpl extends BaseServiceImpl<ImageCla
 
     @Override
     public String getFileTitleName(String pKeyId) {
+        if (ObjectUtil.isEmpty(pKeyId)) {
+            return "pKeyId不能为空";
+        }
         WbsTreeContract wbsTreeContract = jdbcTemplate.query("select * from m_wbs_tree_contract where is_deleted = 0 and status = 1 and p_key_id = " + pKeyId, new BeanPropertyRowMapper<>(WbsTreeContract.class)).stream().findAny().orElse(null);
         if (wbsTreeContract != null) {
             //获取当前节点所有父级节点

+ 246 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -18,6 +18,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.rmi.ServerException;
 import java.time.LocalDate;
 import java.util.*;
@@ -1163,11 +1164,95 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         List<ProjectCostBudget> allPlan = budgetService.getAllPlanByYear(y);
         Boolean isBudget = true;
         Map<Integer, List<ProjectCostBudget>> allPlanMap = new HashMap<>();
+        Boolean isOtherBudget = true;
+        Map<Integer, List<ProjectCostBudget>> otherBudgetMap = new HashMap<>();
         if (allPlan != null && allPlan.size() > 0){
+            List<ProjectCostBudget> parentList = new ArrayList<>();
             //如果不为空,根据costType分组
             allPlanMap = allPlan.parallelStream()
                     .collect(Collectors.groupingBy(ProjectCostBudget::getCostType));
-            //分解出父计划和子计划,需要用父计划其他预算支出
+            //所有父计划id
+            Set<Long> parentIds = new HashSet<>();
+            Set<Long> longs = allPlan.stream().filter(l -> l.getParentId() == 0).map(ProjectCostBudget::getId).collect(Collectors.toSet());
+            Set<Long> longs2 = allPlan.stream().filter(l -> l.getParentId() > 0).map(ProjectCostBudget::getParentId).collect(Collectors.toSet());
+            parentIds.addAll(longs);
+            parentIds.addAll(longs2);
+            parentList = budgetService.listByIds(parentIds);
+            Map<Long, List<ProjectCostBudget>> map = allPlan.parallelStream()
+                    .collect(Collectors.groupingBy(ProjectCostBudget::getParentId));
+            parentList = parentList.stream().filter(l->l.getBudgetCountMoney().subtract(l.getBudgetStaffCost()).intValue() != 0).collect(Collectors.toList());
+            if (parentList != null && parentList.size() > 0) {
+                //循环父计划,统计子计划
+                for (ProjectCostBudget budget : parentList) {
+                    BigDecimal noStaffCost = budget.getBudgetCountMoney().subtract(budget.getBudgetStaffCost());
+                    //有子计划直接设置
+                    if (map.get(budget.getId()) != null && map.get(budget.getId()).size() > 0) {
+                        List<ProjectCostBudget> budgetList = map.get(budget.getId());
+                        //有子计划才设置,没子计划证明有值
+                        //最小计划开始时间
+                        LocalDate start = LocalDate.MAX;
+                        //最大计划开始时间
+                        LocalDate end = LocalDate.MIN;
+                        //总天数
+                        BigDecimal total = new BigDecimal(0);
+                        //开始月工作日
+                        BigDecimal startDays = new BigDecimal(0);
+                        //结束月工作日
+                        BigDecimal endDays = new BigDecimal(0);
+                        for (ProjectCostBudget costBudget : budgetList) {
+                            if (costBudget.getPlanStartTime().isBefore(start)) {
+                                start = costBudget.getPlanStartTime();
+                            }
+                            if (costBudget.getPlanEndTime().isAfter(end)) {
+                                end = costBudget.getPlanEndTime();
+                            }
+                            total = total.add(costBudget.getPlanDays());
+                            if (costBudget.getPlanIsTwoMonth() == 0) {
+                                //如果开始时间和最小计划时间是一个月,则直接算入开始工作日
+                                if (start.getMonthValue() == costBudget.getPlanStartTime().getMonthValue()) {
+                                    startDays = startDays.add(costBudget.getPlanDays());
+                                } else {
+                                    //开始时间和最小计划时间不是一个月,算入结束工作日
+                                    endDays = endDays.add(costBudget.getPlanDays());
+                                }
+
+                            } else {
+                                startDays = startDays.add(costBudget.getPlanStartMonthDays());
+                                endDays = endDays.add(costBudget.getPlanEndMonthDays());
+                            }
+
+                        }
+                        budget.setPlanStartTime(start);
+                        budget.setPlanEndTime(end);
+                        budget.setPlanDays(total);
+                        //如果没跨月
+                        if (start.getMonthValue() == end.getMonthValue()) {
+                            budget.setPlanIsTwoMonth(0);
+                            budget.setPlanStartMoney(noStaffCost);
+                        } else {
+                            //跨月
+                            budget.setPlanIsTwoMonth(1);
+                            BigDecimal decimal = startDays.divide(total, 2, BigDecimal.ROUND_HALF_UP).multiply(noStaffCost).setScale(2, RoundingMode.HALF_UP);
+                            budget.setPlanStartMoney(decimal);
+                            budget.setPlanEndMoney(noStaffCost.subtract(decimal));
+                        }
+                    }else {
+                        //没有子计划如果没有跨月则直接把其他支出放入startMoney
+                        if (budget.getPlanIsTwoMonth() == 0){
+                            budget.setPlanStartMoney(noStaffCost);
+                        }else {
+                            BigDecimal decimal = budget.getPlanStartMonthDays().divide(budget.getPlanDays(), 2, BigDecimal.ROUND_HALF_UP).multiply(noStaffCost).setScale(2, RoundingMode.HALF_UP);
+                            budget.setPlanStartMoney(decimal);
+                            budget.setPlanEndMoney(noStaffCost.subtract(decimal));
+                        }
+                    }
+                }
+                //根据部门分组
+                otherBudgetMap = parentList.parallelStream()
+                        .collect(Collectors.groupingBy(ProjectCostBudget::getCostType));
+            }else {
+                isOtherBudget = false;
+            }
 
         }else {
             isBudget = false;
@@ -1258,6 +1343,33 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
             }else {
                  vo.setBudget1(new BigDecimal(0));
             }
+            //其他预算金额
+            if (isBudget && isOtherBudget && otherBudgetMap.get(1) != null && otherBudgetMap.get(1).size() > 0){
+                List<ProjectCostBudget> b1 = otherBudgetMap.get(1);
+                BigDecimal big = new BigDecimal(0);
+                //循环市场部每一个预算
+                for (ProjectCostBudget budget : b1) {
+                    //如果开始时间或结束时间是当月,则添加预算
+                    if ((budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y)
+                            || (budget.getPlanEndTime().getMonthValue() == (i + 1) && budget.getPlanEndTime().getYear() == y)) {
+                        //如果开始时间和结束时间的月相同,则直接用总预算
+                        if (budget.getPlanIsTwoMonth() == 0) {
+                            big = big.add(budget.getPlanStartMoney());
+                        } else {
+                            //如果开始月是当前月,则直接使用开始金额
+                            if (budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y) {
+                                big = big.add(budget.getPlanStartMoney());
+                            } else {
+                                //结束月是当前月,使用结束金额
+                                big = big.add(budget.getPlanEndMoney());
+                            }
+                        }
+                    }
+                }
+                vo.setBudget1(vo.getBudget1().add(big));
+                c1 = c1.add(big);
+            }
+
             if (isFinished){
                 List<ProjectCostBudget> d1 = finishedMap.get(1);
                 if (d1 != null && d1.size() > 0){
@@ -1337,6 +1449,33 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
             }else {
                 vo.setBudget2(new BigDecimal(0));
             }
+            //其他预算金额
+            if (isBudget && isOtherBudget && otherBudgetMap.get(2) != null && otherBudgetMap.get(2).size() > 0){
+                List<ProjectCostBudget> b1 = otherBudgetMap.get(2);
+                BigDecimal big = new BigDecimal(0);
+                //循环市场部每一个预算
+                for (ProjectCostBudget budget : b1) {
+                    //如果开始时间或结束时间是当月,则添加预算
+                    if ((budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y)
+                            || (budget.getPlanEndTime().getMonthValue() == (i + 1) && budget.getPlanEndTime().getYear() == y)) {
+                        //如果开始时间和结束时间的月相同,则直接用总预算
+                        if (budget.getPlanIsTwoMonth() == 0) {
+                            big = big.add(budget.getPlanStartMoney());
+                        } else {
+                            //如果开始月是当前月,则直接使用开始金额
+                            if (budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y) {
+                                big = big.add(budget.getPlanStartMoney());
+                            } else {
+                                //结束月是当前月,使用结束金额
+                                big = big.add(budget.getPlanEndMoney());
+                            }
+                        }
+                    }
+                }
+                vo.setBudget2(vo.getBudget2().add(big));
+                c3 = c3.add(big);
+            }
+
             if (isFinished){
                 List<ProjectCostBudget> d2 = finishedMap.get(2);
                 if (d2 != null && d2.size() > 0){
@@ -1417,6 +1556,33 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
             }else {
                 vo.setBudget3(new BigDecimal(0));
             }
+            //其他预算金额
+            if (isBudget && isOtherBudget && otherBudgetMap.get(3) != null && otherBudgetMap.get(3).size() > 0){
+                List<ProjectCostBudget> b1 = otherBudgetMap.get(3);
+                BigDecimal big = new BigDecimal(0);
+                //循环市场部每一个预算
+                for (ProjectCostBudget budget : b1) {
+                    //如果开始时间或结束时间是当月,则添加预算
+                    if ((budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y)
+                            || (budget.getPlanEndTime().getMonthValue() == (i + 1) && budget.getPlanEndTime().getYear() == y)) {
+                        //如果开始时间和结束时间的月相同,则直接用总预算
+                        if (budget.getPlanIsTwoMonth() == 0) {
+                            big = big.add(budget.getPlanStartMoney());
+                        } else {
+                            //如果开始月是当前月,则直接使用开始金额
+                            if (budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y) {
+                                big = big.add(budget.getPlanStartMoney());
+                            } else {
+                                //结束月是当前月,使用结束金额
+                                big = big.add(budget.getPlanEndMoney());
+                            }
+                        }
+                    }
+                }
+                vo.setBudget3(vo.getBudget3().add(big));
+                c5 = c5.add(big);
+            }
+
             if (isFinished){
                 List<ProjectCostBudget> d3 = finishedMap.get(3);
                 if (d3 != null && d3.size() > 0){
@@ -1497,6 +1663,33 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
             }else {
                 vo.setBudget4(new BigDecimal(0));
             }
+            //其他预算金额
+            if (isBudget && isOtherBudget && otherBudgetMap.get(4) != null && otherBudgetMap.get(4).size() > 0){
+                List<ProjectCostBudget> b1 = otherBudgetMap.get(4);
+                BigDecimal big = new BigDecimal(0);
+                //循环市场部每一个预算
+                for (ProjectCostBudget budget : b1) {
+                    //如果开始时间或结束时间是当月,则添加预算
+                    if ((budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y)
+                            || (budget.getPlanEndTime().getMonthValue() == (i + 1) && budget.getPlanEndTime().getYear() == y)) {
+                        //如果开始时间和结束时间的月相同,则直接用总预算
+                        if (budget.getPlanIsTwoMonth() == 0) {
+                            big = big.add(budget.getPlanStartMoney());
+                        } else {
+                            //如果开始月是当前月,则直接使用开始金额
+                            if (budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y) {
+                                big = big.add(budget.getPlanStartMoney());
+                            } else {
+                                //结束月是当前月,使用结束金额
+                                big = big.add(budget.getPlanEndMoney());
+                            }
+                        }
+                    }
+                }
+                vo.setBudget4(vo.getBudget4().add(big));
+                c7 = c7.add(big);
+            }
+
             if (isFinished){
                 List<ProjectCostBudget> d4 = finishedMap.get(4);
                 if (d4 != null && d4.size() > 0){
@@ -1574,6 +1767,32 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                     }
                 }
             }
+            //其他预算金额
+            if (isBudget && isOtherBudget && otherBudgetMap.get(5) != null && otherBudgetMap.get(5).size() > 0){
+                List<ProjectCostBudget> b1 = otherBudgetMap.get(5);
+                BigDecimal big = new BigDecimal(0);
+                //循环市场部每一个预算
+                for (ProjectCostBudget budget : b1) {
+                    //如果开始时间或结束时间是当月,则添加预算
+                    if ((budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y)
+                            || (budget.getPlanEndTime().getMonthValue() == (i + 1) && budget.getPlanEndTime().getYear() == y)) {
+                        //如果开始时间和结束时间的月相同,则直接用总预算
+                        if (budget.getPlanIsTwoMonth() == 0) {
+                            big = big.add(budget.getPlanStartMoney());
+                        } else {
+                            //如果开始月是当前月,则直接使用开始金额
+                            if (budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y) {
+                                big = big.add(budget.getPlanStartMoney());
+                            } else {
+                                //结束月是当前月,使用结束金额
+                                big = big.add(budget.getPlanEndMoney());
+                            }
+                        }
+                    }
+                }
+                big1 = big.add(big);
+            }
+
             if (isFinished){
                 List<ProjectCostBudget> d5 = finishedMap.get(5);
                 if (d5 != null && d5.size() > 0){
@@ -1620,6 +1839,32 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                     }
                 }
             }
+            //其他预算金额
+            if (isBudget && isOtherBudget && otherBudgetMap.get(6) != null && otherBudgetMap.get(6).size() > 0){
+                List<ProjectCostBudget> b1 = otherBudgetMap.get(6);
+                BigDecimal big = new BigDecimal(0);
+                //循环市场部每一个预算
+                for (ProjectCostBudget budget : b1) {
+                    //如果开始时间或结束时间是当月,则添加预算
+                    if ((budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y)
+                            || (budget.getPlanEndTime().getMonthValue() == (i + 1) && budget.getPlanEndTime().getYear() == y)) {
+                        //如果开始时间和结束时间的月相同,则直接用总预算
+                        if (budget.getPlanIsTwoMonth() == 0) {
+                            big = big.add(budget.getPlanStartMoney());
+                        } else {
+                            //如果开始月是当前月,则直接使用开始金额
+                            if (budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y) {
+                                big = big.add(budget.getPlanStartMoney());
+                            } else {
+                                //结束月是当前月,使用结束金额
+                                big = big.add(budget.getPlanEndMoney());
+                            }
+                        }
+                    }
+                }
+                big1 = big.add(big);
+            }
+
             if (isFinished){
                 List<ProjectCostBudget> d6 = finishedMap.get(6);
                 if (d6 != null && d6.size() > 0){

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

@@ -421,7 +421,7 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
         }
 
         ProjectCostBudget task = projectCostBudgetServiceImpl.getBaseMapper().selectById(taskId);
-        if (ObjectUtil.isEmpty(task.getDeptId())) {
+        if (ObjectUtil.isEmpty(task.getDeptId()) || ObjectUtil.isEmpty(SecureUtil.getDeptId())) {
             throw new ServiceException("获取部门信息失败,请联系管理员");
         }
 

+ 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"));

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

@@ -213,4 +213,12 @@ public class WbsTreeContractController extends BladeController {
         return R.data(wbsTreeContract);
     }
 
+    @GetMapping("/search-node-tablesAndFile")
+    @ApiOperationSupport(order = 12)
+    @ApiOperation(value = "查询当前节点下所有表的附件信息", notes = "传入节点primaryKeyId、type、合同段id、项目id")
+    public R<List<AppWbsTreeContractVO>> searchNodeAllTableAndFile(String primaryKeyId, String type, String contractId, String projectId) {
+        List<AppWbsTreeContractVO> list = iWbsTreeContractService.searchNodeAllTableAndFile(primaryKeyId, type, contractId, projectId);
+        return R.data(list);
+    }
+
 }

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

@@ -16,6 +16,7 @@
  */
 package org.springblade.manager.mapper;
 
+import org.apache.ibatis.annotations.Param;
 import org.springblade.manager.entity.TableFile;
 import org.springblade.manager.vo.TableFileVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -44,4 +45,5 @@ public interface TableFileMapper extends BaseMapper<TableFile> {
 
     void delDataById(String id, Long recordId);
 
+    List<TableFile> getAllFileByIds(@Param("ids") List<Long> ids);
 }

+ 6 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TableFileMapper.xml

@@ -36,6 +36,12 @@
     <select id="selectTableFileList" resultMap="TableFileVO">
         select *,domain_url as url from m_table_file where is_deleted = 0 and type=2 and tab_id = #{pKid}
     </select>
+    <select id="getAllFileByIds" resultType="org.springblade.manager.entity.TableFile">
+        SELECT mtf.* from m_table_file mtf WHERE  type = 2 and tab_id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
 
     <delete id="delDataById">
         delete from m_table_file where id= #{id}

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

@@ -32,6 +32,8 @@ import java.util.List;
  */
 public interface ITableFileService extends IService<TableFile> {
 
+    List<TableFile> getAllFileByIds(List<Long> list);
+
     /**
      * 自定义分页
      *

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

@@ -65,4 +65,5 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
 
     boolean syncContractTabSort(String projectId);
 
+    List<AppWbsTreeContractVO> searchNodeAllTableAndFile(String primaryKeyId, String type, String contractId, String projectId);
 }

+ 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");
                                                 }

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/TableFileServiceImpl.java

@@ -35,6 +35,11 @@ import java.util.List;
 @Service
 public class TableFileServiceImpl extends ServiceImpl<TableFileMapper, TableFile> implements ITableFileService {
 
+    @Override
+    public List<TableFile> getAllFileByIds(List<Long> ids) {
+        return baseMapper.getAllFileByIds(ids);
+    }
+
     @Override
     public IPage<TableFileVO> selectTableFilePage(IPage<TableFileVO> page, TableFileVO tableFile) {
         return page.setRecords(baseMapper.selectTableFilePage(page, tableFile));

+ 28 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -37,6 +37,7 @@ import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.mapper.ContractInfoMapper;
 import org.springblade.manager.mapper.WbsTreeContractMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
+import org.springblade.manager.service.ITableFileService;
 import org.springblade.manager.service.IWbsTreeContractService;
 import org.springblade.manager.vo.*;
 import org.springblade.system.cache.ParamCache;
@@ -54,6 +55,7 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.math.BigInteger;
+import java.time.Year;
 import java.util.*;
 import java.util.function.Function;
 import java.util.regex.Matcher;
@@ -71,6 +73,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     private final JdbcTemplate jdbcTemplate;
     private final InformationQueryClient informationQueryClient;
     private final ContractClient contractClient;
+    private final ITableFileService tableFileService;
     @Autowired
     StringRedisTemplate redisTemplate;
 
@@ -120,8 +123,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         //当前合同段所有节点ids
         List<String> nowContractNodeIds = new ArrayList<>();
         if (nowContractNodeAndTabAll.size() > 0) {
-            nowContractTabIds = nowContractNodeAndTabAll.stream().filter(f -> f.getType() == 2).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).map(String::valueOf).collect(Collectors.toList());
-            nowContractNodeIds = nowContractNodeAndTabAll.stream().filter(f -> f.getType() == 1).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).map(String::valueOf).collect(Collectors.toList());
+            nowContractTabIds = nowContractNodeAndTabAll.stream().filter(f -> f.getType() == 2).map(WbsTreeContract::getId).map(String::valueOf).collect(Collectors.toList());
+            nowContractNodeIds = nowContractNodeAndTabAll.stream().filter(f -> f.getType() == 1).map(WbsTreeContract::getId).map(String::valueOf).collect(Collectors.toList());
         }
 
         List<String> finalNowContractNodeIds = nowContractNodeIds;
@@ -875,6 +878,29 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return false;
     }
 
+    @Override
+    public List<AppWbsTreeContractVO> searchNodeAllTableAndFile(String primaryKeyId, String type, String contractId, String projectId) {
+        List<AppWbsTreeContractVO> vos = this.searchNodeAllTable(primaryKeyId, type, contractId, projectId);
+        if (vos != null && vos.size() > 0) {
+            List<Long> list = vos.stream().map(AppWbsTreeContractVO::getPKeyId).collect(Collectors.toList());
+            List<TableFile> files = tableFileService.getAllFileByIds(list);
+            if (files != null && files.size() > 0) {
+                Map<String, List<TableFile>> map = files.parallelStream()
+                        .collect(Collectors.groupingBy(TableFile::getTabId));
+                List<AppWbsTreeContractVO> voList = new ArrayList<>();
+                for (AppWbsTreeContractVO vo : vos) {
+                    if (map.get(vo.getPKeyId()+"") != null && map.get(vo.getPKeyId()+"").size() > 0) {
+                        vo.setFileList(map.get(vo.getPKeyId()+""));
+                        voList.add(vo);
+                    }
+                }
+                return voList;
+            }
+            return null;
+        }
+        return null;
+    }
+
     /**
      * 批量修改合同段表单sort
      *

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -674,12 +674,12 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             if (pawDTO.getReferenceType().equals("public")) {
                 //当前公有引用
                 List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().select(WbsTreePrivate::getId).eq(WbsTreePrivate::getWbsId, pawDTO.getWbsId()).eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId()).eq(WbsTreePrivate::getType, 1));
-                List<String> collect = wbsTreePrivates.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+                List<String> collect = wbsTreePrivates.stream().map(WbsTreePrivate::getId).map(String::valueOf).collect(Collectors.toList());
                 idList2.addAll(collect);
             } else if (pawDTO.getReferenceType().equals("private")) {
                 //当前私有引用
                 List<WbsTreePrivate> wbsTreePrivates2 = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().select(WbsTreePrivate::getId).eq(WbsTreePrivate::getWbsId, pawDTO.getPrimaryKeyId()).eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId()).eq(WbsTreePrivate::getType, 1));
-                List<String> collect = wbsTreePrivates2.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+                List<String> collect = wbsTreePrivates2.stream().map(WbsTreePrivate::getId).map(String::valueOf).collect(Collectors.toList());
                 idList2.addAll(collect);
             }