Browse Source

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

yangyj 2 years ago
parent
commit
e474956f62
27 changed files with 948 additions and 359 deletions
  1. 35 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/AppVersion.java
  2. 48 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/AppVersionDetail.java
  3. 44 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/DateFormat.java
  4. 4 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TextdictDataInfoVO.java
  5. 20 7
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  6. 78 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/AppVersionController.java
  7. 87 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/AppVersionDetailController.java
  8. 2 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  9. 82 82
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/LinkdataInfoController.java
  10. 12 14
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  11. 301 109
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  12. 9 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/AppVersionDetailMapper.java
  13. 6 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/AppVersionDetailMapper.xml
  14. 17 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/AppVersionMapper.java
  15. 6 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/AppVersionMapper.xml
  16. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/MixProportionInfoMapper.xml
  17. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  18. 32 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IAppVersionDetailService.java
  19. 34 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IAppVersionService.java
  20. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java
  21. 19 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/AppVersionDetailImpl.java
  22. 24 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/AppVersionImpl.java
  23. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java
  24. 2 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  25. 68 28
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/MixProportionInfoServiceImpl.java
  26. 0 95
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelParser.java
  27. 14 12
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java

+ 35 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/AppVersion.java

@@ -0,0 +1,35 @@
+package org.springblade.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.time.LocalDateTime;
+
+/**
+ * @Param   APP版本
+ * @Author wangwl
+ * @Date 2023/8/29 10:02
+ **/
+@Data
+@TableName("m_app_version")
+@EqualsAndHashCode(callSuper = true)
+public class AppVersion extends BaseEntity {
+
+    @ApiModelProperty("应用平台")
+    private String platform;
+
+    @ApiModelProperty("应用名称")
+    private String name;
+
+    @ApiModelProperty("当前版本")
+    private String currentVersion;
+
+    @ApiModelProperty("应用说明")
+    private String appExplain;
+
+    @ApiModelProperty("更新时间")
+    private LocalDateTime updateDate;
+}

+ 48 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/AppVersionDetail.java

@@ -0,0 +1,48 @@
+package org.springblade.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.time.LocalDateTime;
+
+/**
+ * @Param   APP版本详情
+ * @Author wangwl
+ * @Date 2023/8/29 10:02
+ **/
+@Data
+@TableName("m_app_version_detail")
+@EqualsAndHashCode(callSuper = true)
+public class AppVersionDetail extends BaseEntity {
+
+    @ApiModelProperty(" 版本id")
+    private Long versionId;
+
+    @ApiModelProperty("版本号")
+    private String versionNumber ;
+
+    @ApiModelProperty("软件类型")
+    private Integer softwareType ;
+
+    @ApiModelProperty("文件类型")
+    private Integer fileType;
+
+    @ApiModelProperty("更新内容")
+    private String updateContent;
+
+    @ApiModelProperty("文件地址")
+    private String fileUrl;
+
+    @ApiModelProperty("文件大小")
+    private Long fileSize;
+
+    @ApiModelProperty(" 是否强制更新")
+    private Integer constraintUpdate;
+
+    @ApiModelProperty(" 更新时间")
+    private LocalDateTime updateDate;
+
+}

+ 44 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/DateFormat.java

@@ -0,0 +1,44 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.manager.vo;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 参数信息表实体类
+ *
+ * @author BladeX
+ * @since 2022-06-17
+ */
+@Data
+@ApiModel(value = "日期格式", description = "日期格式")
+public class DateFormat implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * 值
+     */
+    private String val;
+}

+ 4 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TextdictDataInfoVO.java

@@ -54,4 +54,8 @@ public class TextdictDataInfoVO implements Serializable {
     @ApiModelProperty(value = "字段Id")
     private List<TextdictInfo_vo> textInfo;
 
+    @ApiModelProperty(value = "时间格式组合")
+    private List<DateFormat> dateFormat;
+
+
 }

+ 20 - 7
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -11,6 +11,8 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.time.DateUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springblade.archive.entity.ArchiveProjectConfig;
+import org.springblade.archive.feign.ArchiveAutoClient;
 import org.springblade.business.entity.*;
 import org.springblade.business.mapper.TaskMapper;
 import org.springblade.business.service.*;
@@ -114,6 +116,10 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
     private final CommonFileClient commonFileClient;
 
+    private ArchiveTreeContractClient archiveTreeContractClient;
+
+    private final ArchiveAutoClient archiveAutoClient;
+
 
     @Autowired
     StringRedisTemplate RedisTemplate;
@@ -1036,13 +1042,20 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         }
 
         //TODO 测试完成后打开
-//        InformationQuery query = this.informationQueryService.getById(formDataId);
-//        if (query != null) {
-//            try {
-//                archiveTreeContractClient.writeBusinessData(query.getWbsId(),query.getContractId(),formDataId);
-//            } catch (Exception e) {
-//            }
-//        }
+        InformationQuery query = this.informationQueryService.getById(formDataId);
+        if (query != null) {
+
+            ArchiveProjectConfig archiveProjectConfig = archiveAutoClient.getByProjectIdOrNew(query.getProjectId());
+
+            //测试阶段,必须打开项目配置才能同步wbs节点
+            if (archiveProjectConfig!= null && archiveProjectConfig.getFactorType().contains("6")) {
+                //todo 等测试OK再打开
+                try {
+                    archiveTreeContractClient.writeBusinessData(query.getWbsId(),query.getContractId(),formDataId);
+                } catch (Exception e) {
+                }
+            }
+        }
 
     }
 

+ 78 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/AppVersionController.java

@@ -0,0 +1,78 @@
+package org.springblade.manager.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.manager.entity.AppVersion;
+import org.springblade.manager.entity.MixProportionInfo;
+import org.springblade.manager.service.IAppVersionService;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/appVersion")
+@Api(value = "后管APP管理版本", tags = "后管APP管理版本")
+public class AppVersionController extends BladeController {
+
+    private final IAppVersionService versionService;
+
+    /**
+     * 新增
+     */
+    @PostMapping("/add")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "新增", notes = "传入版本信息")
+    public R add(@RequestBody AppVersion appVersion){
+        appVersion.setUpdateDate(LocalDateTime.now());
+        versionService.save(appVersion);
+        return R.data("新增成功");
+    }
+
+    /**
+     * 分页
+     */
+    @GetMapping("/page")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "分页", notes = "传入分页信息")
+    public R<IPage<AppVersion>> page(Query query){
+        IPage<AppVersion> page = new Page<>(query.getCurrent(),query.getSize());
+        IPage<AppVersion> iPage = versionService.page(page,new LambdaQueryWrapper<AppVersion>().orderByDesc(AppVersion::getCreateTime));
+        return R.data(iPage);
+    }
+
+    /**
+     * 修改
+     */
+    @PostMapping("/update")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "修改", notes = "传入版本信息")
+    public R update(@RequestBody AppVersion appVersion){
+        versionService.updateById(appVersion);
+        return R.data("修改成功");
+    }
+
+    /**
+     * 删除
+     */
+    @GetMapping("/delete")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "删除", notes = "传入id")
+    public R page(Long id){
+        versionService.removeById(id);
+        return R.data("删除成功");
+    }
+
+
+
+}

+ 87 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/AppVersionDetailController.java

@@ -0,0 +1,87 @@
+package org.springblade.manager.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.manager.entity.AppVersion;
+import org.springblade.manager.entity.AppVersionDetail;
+import org.springblade.manager.service.IAppVersionDetailService;
+import org.springblade.manager.service.IAppVersionService;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/appVersionDetail")
+@Api(value = "后管APP管理版本详情", tags = "后管APP管理版本详情")
+public class AppVersionDetailController extends BladeController {
+    private final IAppVersionDetailService versionDetailService;
+    private final IAppVersionService versionService;
+
+    /**
+     * 新增
+     */
+    @PostMapping("/add")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "新增", notes = "传入版本信息")
+    @Transactional
+    public R add(@RequestBody AppVersionDetail detail){
+        detail.setUpdateDate(LocalDateTime.now());
+        versionDetailService.save(detail);
+        AppVersion appVersion = new AppVersion();
+        appVersion.setId(detail.getVersionId());
+        appVersion.setCurrentVersion(detail.getVersionNumber());
+        appVersion.setUpdateDate(LocalDateTime.now());
+        versionService.updateById(appVersion);
+        return R.data("新增成功");
+    }
+
+    /**
+     * 分页
+     */
+    @GetMapping("/page")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "分页", notes = "传入版本id与分页信息")
+    public R<IPage<AppVersionDetail>> page(Long versionId,Query query){
+        IPage<AppVersionDetail> page = new Page<>(query.getCurrent(),query.getSize());
+        IPage<AppVersionDetail> iPage = versionDetailService.page(page,
+                new LambdaQueryWrapper<AppVersionDetail>().eq(AppVersionDetail::getVersionId,versionId).orderByDesc(BaseEntity::getCreateTime));
+        return R.data(iPage);
+    }
+
+    /**
+     * 修改
+     */
+    @PostMapping("/update")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "修改", notes = "传入版本详情")
+    public R update(@RequestBody AppVersionDetail detail){
+        versionDetailService.updateById(detail);
+        return R.data("修改成功");
+    }
+
+    /**
+     * 删除
+     */
+    @GetMapping("/delete")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "删除", notes = "传入id")
+    public R page(Long id){
+        versionDetailService.removeById(id);
+        return R.data("删除成功");
+    }
+
+
+}

+ 2 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -297,8 +297,6 @@ public class ExcelTabController extends BladeController {
         FileUtils.excelInfo(file.getInputStream(),exceUrl,thmlUrl,"1");
         // 上传excel文件
         BladeFile bladeFile = newIOSSClient.uploadFile(file.getOriginalFilename(),exceUrl);
-      //  R<BladeFile> bladeFile = iossClient.addFileInfo(file);
-      //  BladeFile bladeFile1 = bladeFile.getData();
         detail.setExtension(file.getOriginalFilename());
         detail.setFileUrl(bladeFile.getLink());
         detail.setFileType(3); // 表示为清表信息  1 表示祖节点  2 表示为节点信息 3 表示清表
@@ -466,9 +464,7 @@ public class ExcelTabController extends BladeController {
         updateWrapper.set("excel_id", exceTabId);
 
         // 复制模版htmlURL
-
         File file_in = ResourceUtil.getFile(excelTab.getHtmlUrl());
-
         String filecode = SnowFlakeUtil.getId() + "";
         String thmlUrl = file_path + "/privateUrl/" + filecode + ".html";
         File file_out = ResourceUtil.getFile(thmlUrl);
@@ -488,6 +484,7 @@ public class ExcelTabController extends BladeController {
             updateWrapper.set("init_table_id", excelTab.getTabId());
             org.springblade.manager.entity.TableInfo tableInfo = tableInfoService.getById(excelTab.getTabId());
             updateWrapper.set("init_table_name", tableInfo.getTabEnName());
+            aPrivate.setInitTableName(tableInfo.getTabEnName());
         } else {
             if (aPrivate.getInitTableId() == null) {
                 org.springblade.manager.entity.TableInfo tableInfo = tableInfoService.getOne(new LambdaQueryWrapper<org.springblade.manager.entity.TableInfo>()
@@ -919,7 +916,6 @@ public class ExcelTabController extends BladeController {
                             zikey.add(dataInfo);
                         }
                     } else { //空行
-
                         List<Map<String, String>> left = new ArrayList<>();
                         List<Map<String, String>> top = new ArrayList<>();
                         for (int k = 0; k < zikey.size(); k++) {
@@ -3584,7 +3580,7 @@ public class ExcelTabController extends BladeController {
             @ApiImplicitParam(name = "pkeyId", value = "WBS私有库的pkeyId", required = true),
             @ApiImplicitParam(name = "tabId", value = "表信息id", required = true)
     })
-    public R<List<WbsFormElement>> getUnMatchField(Long pkeyId,Long tabId) throws FileNotFoundException {
+    public R<List<WbsFormElement>> getUnMatchField(Long pkeyId,Long tabId) throws Exception {
         return R.data(excelTabService.getUnMatchField(pkeyId,tabId));
     }
 

+ 82 - 82
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/LinkdataInfoController.java

@@ -39,6 +39,7 @@ import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.ILinkdataInfoService;
 import org.springblade.manager.service.IWbsFormElementService;
+import org.springblade.manager.utils.FileUtils;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 
@@ -46,6 +47,7 @@ import javax.validation.Valid;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
 import java.util.Map;
 
@@ -169,83 +171,83 @@ public class LinkdataInfoController extends BladeController {
     }
 
 
-    /**
-     * 编辑表单-替换元素||删除文本信息 单个保存
-     */
-    @PostMapping("/saveTabColInfo")
-    @ApiOperationSupport(order = 9)
-    @ApiOperation(value = "编辑表单-替换元素||删除文本信息 保存", notes = "传入linkdataInfo")
-    public R saveTabColInfo(@Valid @RequestBody LinkdataInfo linkdataInfo) throws IOException {
-
-        // 获取 节点信息
-        WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.getByPKeyId(linkdataInfo.getTabId());
-        // 读取html页面信息
-        File file1 = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
-        FileInputStream inputStream = new FileInputStream(file1);
-        String htmlString = IoUtil.readToString(inputStream);
-        // 样式集合
-        Document doc = Jsoup.parse(htmlString);
-        //解析
-        Element table = doc.select("table").first();
-        Elements trs = table.select("tr");
-        Element element = trs.get(linkdataInfo.getTrIndex()).select("td").get(linkdataInfo.getTdIndex());
-        String keyId = "";
-        if (linkdataInfo.getColName().equals("/")) {
-            element.empty();
-        } else {
-            // 获取元素基本信息
-            WbsFormElement wbsFormElement = wbsFormElementService.getById(linkdataInfo.getHtmlType());
-            String enName = wbsFormElement.getEName();
-            element.removeAttr("title");
-            element.attr("title", enName);
-            String dataInfo2 = wbsFormElement.getEKey() + "__" + linkdataInfo.getTrIndex() + "_" + linkdataInfo.getTdIndex();
-            Element element1 = element1 = element.children().get(0);
-
-            if (element.html().indexOf("el-tooltip") >= 0) {
-                element1.removeAttr("placeholder");
-                element1.removeAttr("keyName");
-                element1.removeAttr("id");
-                element1.removeAttr("weighing");
-                element1.removeAttr("v-model");
-                element1.removeAttr("@focus");
-                keyId = element1.attr("keyName");
-                element1 = element.children().get(0).children().get(0);
-            }
-
-            element1.removeAttr("placeholder");
-            element1.removeAttr("keyName");
-            element1.removeAttr("id");
-            element1.removeAttr("weighing");
-            element1.removeAttr("v-model");
-            element1.removeAttr("@focus");
-            keyId = element1.attr("keyName");
-            if (element.html().indexOf("hc-form-checkbox-group") >= 0) {
-                element1.removeAttr(":val");
-                element1.attr(":val", "formData." + dataInfo2);
-            }
-
-            element1.attr("placeholder", enName).attr("keyName", dataInfo2).attr("id", dataInfo2);
-            element1.attr("weighing", "100");
-            element1.attr("v-model", "formData." + dataInfo2);
-            element.attr("@click", "getInformation('" + enName + "'," + linkdataInfo.getTrIndex() + "," + linkdataInfo.getTdIndex() + ")");
-        }
-
-        File writefile = new File(wbsTreePrivate.getHtmlUrl());
-        FileUtil.writeToFile(writefile, doc.html(), Boolean.parseBoolean("UTF-8"));
-        inputStream.close();
-
-        // 清空数据
-        if (StringUtils.isNotEmpty(keyId)) {
-            String tabName = wbsTreePrivate.getInitTableName();
-            String isExitSql = " select * from information_schema.TABLES where TABLE_NAME='" + tabName + "'";
-            List<Map<String, Object>> tablist = jdbcTemplate.queryForList(isExitSql);
-            if (tablist != null && tablist.size() > 0 && wbsTreePrivate.getType() != 10) {
-                String clarSql = "update  " + tabName + " set " + keyId.split("__")[0] + "=null where p_key_id in(SELECT p_key_id FROM m_wbs_tree_contract WHERE id ='" + wbsTreePrivate.getId() + "' and project_id='" + wbsTreePrivate.getProjectId() + "' )";
-                jdbcTemplate.execute(clarSql);
-            }
-        }
-        return R.success("操作成功");
-    }
+//    /**
+//     * 编辑表单-替换元素||删除文本信息 单个保存
+//     */
+//    @PostMapping("/saveTabColInfo")
+//    @ApiOperationSupport(order = 9)
+//    @ApiOperation(value = "编辑表单-替换元素||删除文本信息 保存", notes = "传入linkdataInfo")
+//    public R saveTabColInfo(@Valid @RequestBody LinkdataInfo linkdataInfo) throws IOException {
+//
+//        // 获取 节点信息
+//        WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.getByPKeyId(linkdataInfo.getTabId());
+//        // 读取html页面信息
+//        File file1 = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
+//        FileInputStream inputStream = new FileInputStream(file1);
+//        String htmlString = IoUtil.readToString(inputStream);
+//        // 样式集合
+//        Document doc = Jsoup.parse(htmlString);
+//        //解析
+//        Element table = doc.select("table").first();
+//        Elements trs = table.select("tr");
+//        Element element = trs.get(linkdataInfo.getTrIndex()).select("td").get(linkdataInfo.getTdIndex());
+//        String keyId = "";
+//        if (linkdataInfo.getColName().equals("/")) {
+//            element.empty();
+//        } else {
+//            // 获取元素基本信息
+//            WbsFormElement wbsFormElement = wbsFormElementService.getById(linkdataInfo.getHtmlType());
+//            String enName = wbsFormElement.getEName();
+//            element.removeAttr("title");
+//            element.attr("title", enName);
+//            String dataInfo2 = wbsFormElement.getEKey() + "__" + linkdataInfo.getTrIndex() + "_" + linkdataInfo.getTdIndex();
+//            Element element1 = element1 = element.children().get(0);
+//
+//            if (element.html().indexOf("el-tooltip") >= 0) {
+//                element1.removeAttr("placeholder");
+//                element1.removeAttr("keyName");
+//                element1.removeAttr("id");
+//                element1.removeAttr("weighing");
+//                element1.removeAttr("v-model");
+//                element1.removeAttr("@focus");
+//                keyId = element1.attr("keyName");
+//                element1 = element.children().get(0).children().get(0);
+//            }
+//
+//            element1.removeAttr("placeholder");
+//            element1.removeAttr("keyName");
+//            element1.removeAttr("id");
+//            element1.removeAttr("weighing");
+//            element1.removeAttr("v-model");
+//            element1.removeAttr("@focus");
+//            keyId = element1.attr("keyName");
+//            if (element.html().indexOf("hc-form-checkbox-group") >= 0) {
+//                element1.removeAttr(":val");
+//                element1.attr(":val", "formData." + dataInfo2);
+//            }
+//
+//            element1.attr("placeholder", enName).attr("keyName", dataInfo2).attr("id", dataInfo2);
+//            element1.attr("weighing", "100");
+//            element1.attr("v-model", "formData." + dataInfo2);
+//            element.attr("@click", "getInformation('" + enName + "'," + linkdataInfo.getTrIndex() + "," + linkdataInfo.getTdIndex() + ")");
+//        }
+//
+//        File writefile = new File(wbsTreePrivate.getHtmlUrl());
+//        FileUtil.writeToFile(writefile, doc.html(), Boolean.parseBoolean("UTF-8"));
+//        inputStream.close();
+//
+//        // 清空数据
+//        if (StringUtils.isNotEmpty(keyId)) {
+//            String tabName = wbsTreePrivate.getInitTableName();
+//            String isExitSql = " select * from information_schema.TABLES where TABLE_NAME='" + tabName + "'";
+//            List<Map<String, Object>> tablist = jdbcTemplate.queryForList(isExitSql);
+//            if (tablist != null && tablist.size() > 0 && wbsTreePrivate.getType() != 10) {
+//                String clarSql = "update  " + tabName + " set " + keyId.split("__")[0] + "=null where p_key_id in(SELECT p_key_id FROM m_wbs_tree_contract WHERE id ='" + wbsTreePrivate.getId() + "' and project_id='" + wbsTreePrivate.getProjectId() + "' )";
+//                jdbcTemplate.execute(clarSql);
+//            }
+//        }
+//        return R.success("操作成功");
+//    }
 
 
 
@@ -256,16 +258,15 @@ public class LinkdataInfoController extends BladeController {
     @PostMapping("/saveTabColInfo2")
     @ApiOperationSupport(order = 9)
     @ApiOperation(value = "编辑表单-替换元素||删除文本信息 保存", notes = "传入linkdataInfo数组")
-    public R saveTabColInfo2(@Valid @RequestBody List<LinkdataInfo> list) throws IOException {
+    public R saveTabColInfo2(@Valid @RequestBody List<LinkdataInfo> list) throws Exception {
         if (list != null && list.size() > 0) {
             // 获取 节点信息
             WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.getByPKeyId(list.get(0).getTabId());
             // 获取元素基本信息
             WbsFormElement wbsFormElement = wbsFormElementService.getById(list.get(0).getHtmlType());
             // 读取html页面信息
-            File file1 = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
-//                File file1 = ResourceUtil.getFile("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1696003315218776064.html");
-            FileInputStream inputStream = new FileInputStream(file1);
+
+            InputStream inputStream = FileUtils.getInputStreamByUrl(wbsTreePrivate.getHtmlUrl());
             String htmlString = IoUtil.readToString(inputStream);
             // 样式集合
             Document doc = Jsoup.parse(htmlString);
@@ -333,7 +334,6 @@ public class LinkdataInfoController extends BladeController {
 
             }
             File writefile = new File(wbsTreePrivate.getHtmlUrl());
-//                File writefile = new File("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1696003315218776064.html");
             FileUtil.writeToFile(writefile, doc.html(), Boolean.parseBoolean("UTF-8"));
             inputStream.close();
             return R.success("操作成功");

+ 12 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java

@@ -235,22 +235,16 @@ public class TextdictInfoController extends BladeController {
     @ApiOperationSupport(order = 9)
     @ApiOperation(value = "新增或修改", notes = "传入textdictInfo")
     public R saveTextInfo(@Valid @RequestBody TextdictDataInfoVO textdictInfo) throws Exception {
-        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        String sys_file_net_url = ParamCache.getValue(CommonConstant.SYS_FILE_NET_URL);
+
         // 获取 节点信息
         WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.getByPKeyId(textdictInfo.getTableId());
 
         // 读取html页面信息
         String path = "";
         String fileUrl = wbsTreePrivate.getHtmlUrl();
-        File file1 = ResourceUtil.getFile(fileUrl);
-        InputStream fileInputStream;
-        if (file1.exists()) {
-            fileInputStream = new FileInputStream(file1);
-        } else {
-            path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path, "");
-            fileInputStream = CommonUtil.getOSSInputStream(path);
-        }
+
+        InputStream fileInputStream = FileUtils.getInputStreamByUrl(fileUrl);
+
         String htmlString = IoUtil.readToString(fileInputStream);
         // 样式集合
         Document doc = Jsoup.parse(htmlString);
@@ -318,8 +312,11 @@ public class TextdictInfoController extends BladeController {
                 element.empty().append(checkbox);
             }
         } else if (textdictInfo.getTextId().equals("date")) { // 日期--年月日时分秒
+
             element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='datetime' format='YYYY年MM月DD日 HH:mm:ss' value-format='YYYY年MM月DD日 HH:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
-        } else if (textdictInfo.getTextId().equals("dateYMD")) { // 日期--年月日
+        }
+
+        /*else if (textdictInfo.getTextId().equals("dateYMD")) { // 日期--年月日
             element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='date' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
         } else if (textdictInfo.getTextId().equals("dateHMS")) { // 日期--时分秒
             element.empty().append("<el-time-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='date' format='HH:mm:ss' value-format='HH:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
@@ -329,7 +326,9 @@ public class TextdictInfoController extends BladeController {
             element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='datetime' format='MM月DD日 HH:mm' value-format='MM月DD日 HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("dateDHM")) { // 日期--日时分
             element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='datetime' format='DD日 HH:mm' value-format='DD日 HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
-        } else if (textdictInfo.getTextId().equals("daterange")) { // 时间段
+        }*/
+
+        else if (textdictInfo.getTextId().equals("daterange")) { // 时间段
             element.empty().append("<el-date-picker @keyDowns='dateKeydown()' v-model=" + vmode + " type='datetimerange' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='YYYY年MM月DD日' trIndex=" + trindex + " keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
             element.children().get(0).attr("@change", "datePickerChange($event,'" + keyname + "')");
         } else if (textdictInfo.getTextId().equals("daterangeYMD")) { // 时间段 /
@@ -358,9 +357,7 @@ public class TextdictInfoController extends BladeController {
         } else {
             FileUtil.writeToFile(writeFile, doc.html(), Boolean.parseBoolean("UTF-8"));
         }
-
         Thread.sleep(300);
-
         // 清空相关的保存数据
         String tabName = wbsTreePrivate.getInitTableName();
         String isExitSql = " select * from information_schema.TABLES where TABLE_NAME='" + tabName + "'";
@@ -369,6 +366,7 @@ public class TextdictInfoController extends BladeController {
             String clarSql = "update  " + tabName + " set " + keyname.split("__")[0] + "=null where p_key_id in(SELECT p_key_id FROM m_wbs_tree_contract WHERE id ='" + wbsTreePrivate.getId() + "' and project_id='" + wbsTreePrivate.getProjectId() + "' )";
             jdbcTemplate.execute(clarSql);
         }
+        fileInputStream.close();
         return R.success("操作成功");
     }
 

+ 301 - 109
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -2,42 +2,58 @@ package org.springblade.manager.controller;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.spire.xls.*;
 import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
 import org.apache.commons.lang.StringUtils;
-import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.ss.util.RegionUtil;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
-import org.springblade.common.utils.CommonUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.IoUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.manager.dto.WbsTreeContractDTO2;
 import org.springblade.manager.entity.ContractInfo;
-import org.springblade.manager.entity.ExcelTab;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.service.IWbsTreeContractService;
 import org.springblade.manager.service.impl.WbsTreeContractServiceImpl;
-import org.springblade.manager.utils.ExcelParser;
+import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.vo.*;
+import org.springblade.resource.feign.NewIOSSClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.net.URLEncoder;
-import java.text.ParseException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 @RestController
 @AllArgsConstructor
@@ -48,9 +64,11 @@ public class WbsTreeContractController extends BladeController {
     @Autowired
     StringRedisTemplate redisTemplate;
     private final JdbcTemplate jdbcTemplate;
+    private final NewIOSSClient newIOSSClient;
     private final IWbsTreeContractService iWbsTreeContractService;
     private final WbsTreeContractServiceImpl wbsTreeContractServiceImpl;
     private final ContractClient contractClient;
+    private static Logger logger = LoggerFactory.getLogger(WbsTreeContractController.class);
 
     @GetMapping("/search-node-tables")
     @ApiOperationSupport(order = 1)
@@ -224,7 +242,7 @@ public class WbsTreeContractController extends BladeController {
         if (StringUtils.isNotEmpty(primaryKeyId)) {
             parentId = primaryKeyId;
         }
-        List<WbsTreeContractLazyVO> vos = iWbsTreeContractService.imageLazyQueryContractWbsTree(parentId, contractId, contractIdRelation,classId);
+        List<WbsTreeContractLazyVO> vos = iWbsTreeContractService.imageLazyQueryContractWbsTree(parentId, contractId, contractIdRelation, classId);
         return R.data(vos);
     }
 
@@ -262,148 +280,322 @@ public class WbsTreeContractController extends BladeController {
         return R.data(list);
     }
 
+    @SneakyThrows
     @GetMapping("/download-excel")
     @ApiOperationSupport(order = 13)
     @ApiOperation(value = "客户端-下载元素表对应的excel模板", notes = "传入表的pKeyId")
-    public void downloadExcel(@RequestParam String pKeyId, HttpServletResponse response) throws Exception {
-        WbsTreeContract tab = iWbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pKeyId));
-        if (tab != null && Objects.nonNull(tab.getExcelId())) {
-            ExcelTab excelTab = jdbcTemplate.queryForObject("select file_url,name from m_excel_tab where id = " + tab.getExcelId(), new BeanPropertyRowMapper<>(ExcelTab.class));
-            if (excelTab != null) {
-                InputStream inputStream = CommonUtil.getOSSInputStream(excelTab.getFileUrl());
-                if (inputStream != null) {
-                    response.setContentType("application/vnd.ms-excel;charset=UTF-8");
-                    response.setCharacterEncoding("UTF-8");
-                    response.setHeader("Content-disposition", ";filename=" + URLEncoder.encode(excelTab.getName().replace(" ", ""), "UTF-8") + ".xlsx");
-                    ServletOutputStream servletOutputStream = response.getOutputStream();
-                    byte[] buffer = new byte[4096];
-                    int bytesRead;
-                    while ((bytesRead = inputStream.read(buffer)) != -1) {
-                        servletOutputStream.write(buffer, 0, bytesRead);
+    public void downloadExcel(@RequestParam String pKeyId, HttpServletResponse response) {
+        com.spire.xls.Workbook workbook = null;
+        try {
+            WbsTreeContract tab = iWbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pKeyId));
+            if (ObjectUtil.isEmpty(tab) || ObjectUtil.isEmpty(tab.getHtmlUrl())) {
+                throw new ServiceException("未获取到对应的表信息");
+            }
+
+            //将html转换为excel
+            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+            InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(tab.getHtmlUrl());
+            workbook = new com.spire.xls.Workbook();
+            workbook.loadFromHtml(inputStreamByUrl);
+            workbook.saveToStream(byteArrayOutputStream, FileFormat.Version2007);
+            //将转换的spireExcel存储到流中
+            byte[] excelBytes = byteArrayOutputStream.toByteArray();
+
+            //把spireExcel转为poiExcel
+            try (InputStream inputStream = new ByteArrayInputStream(excelBytes)) {
+                org.apache.poi.ss.usermodel.Workbook poiWorkbook = new XSSFWorkbook(inputStream);
+                Sheet poiSheet = poiWorkbook.getSheetAt(0); //获取第一个工作表
+                //存储需要修改的单元格和相关信息的列表
+                List<CellModificationInfo> cellsToModify = new ArrayList<>();
+                for (Row row : poiSheet) {
+                    for (Cell cell : row) {
+                        int cellType = cell.getCellType();
+                        if (cellType == CellType.STRING.getCode() && ObjectUtil.isNotEmpty(cell.getStringCellValue())) {
+                            //存储需要修改的单元格信息
+                            cellsToModify.add(new CellModificationInfo(cell, cell.getStringCellValue().trim()));
+                        }
+
+                        //获取单元格所属的合并单元格区域
+                        CellRangeAddress mergedRegion = findMergedRegion(poiSheet, cell.getRowIndex(), cell.getColumnIndex());
+                        if (mergedRegion != null) {
+                            // 存储需要修改的合并单元格信息
+                            cellsToModify.add(new CellModificationInfo(cell, mergedRegion));
+                        }
                     }
-                    servletOutputStream.flush();
-                    inputStream.close();
                 }
-            }
-        }
-    }
 
-    /*public void downloadExcel(@RequestParam String pKeyId, HttpServletResponse response) throws Exception {
-        WbsTreeContract tab = iWbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pKeyId));
-        if (tab != null && Objects.nonNull(tab.getExcelId())) {
-            ExcelTab excelTab = jdbcTemplate.queryForObject("select file_url,name from m_excel_tab where id = " + tab.getExcelId(), new BeanPropertyRowMapper<>(ExcelTab.class));
-            if (excelTab != null) {
-                InputStream inputStream = CommonUtil.getOSSInputStream(excelTab.getFileUrl());
-                if (inputStream != null) {
-                    try (Workbook workbook = parseExcelFile(inputStream)) {
-                        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
-                        response.setCharacterEncoding("UTF-8");
-                        response.setHeader("Content-disposition", ";filename=" + URLEncoder.encode(excelTab.getName().replace(" ", ""), "UTF-8") + ".xlsx");
-                        ServletOutputStream servletOutputStream = response.getOutputStream();
-                        workbook.write(servletOutputStream);
-                        servletOutputStream.flush();
-                    } catch (Exception e) {
-                        e.printStackTrace();
+                //遍历结束后,实际修改单元格样式和内容
+                for (CellModificationInfo info : cellsToModify) {
+                    Cell cell = info.getCell();
+                    if (info.hasStringContent()) {
+                        cell.setCellValue(info.getStringContent());
+                    }
+
+                    //复制单元格样式
+                    CellStyle cellStyle = poiWorkbook.createCellStyle();
+                    CellStyle sourceCellStyle = cell.getCellStyle(); //获取原单元格的样式
+                    cellStyle.cloneStyleFrom(sourceCellStyle); //复制样式
+                    setBlackBorder(cellStyle); // 设置边框
+                    cell.setCellStyle(cellStyle);
+
+                    if (info.hasMergedRegion()) { //修改合并单元格边框线
+                        CellRangeAddress mergedRegion = info.getMergedRegion();
+                        RegionUtil.setBorderTop(BorderStyle.THIN, mergedRegion, poiSheet);
+                        RegionUtil.setTopBorderColor(IndexedColors.BLACK.getIndex(), mergedRegion, poiSheet);
+                        RegionUtil.setBorderBottom(BorderStyle.THIN, mergedRegion, poiSheet);
+                        RegionUtil.setBottomBorderColor(IndexedColors.BLACK.getIndex(), mergedRegion, poiSheet);
+                        RegionUtil.setBorderLeft(BorderStyle.THIN, mergedRegion, poiSheet);
+                        RegionUtil.setLeftBorderColor(IndexedColors.BLACK.getIndex(), mergedRegion, poiSheet);
+                        RegionUtil.setBorderRight(BorderStyle.THIN, mergedRegion, poiSheet);
+                        RegionUtil.setRightBorderColor(IndexedColors.BLACK.getIndex(), mergedRegion, poiSheet);
                     }
                 }
+
+                //返回响应
+                try (ServletOutputStream outputStream = response.getOutputStream();
+                     ByteArrayOutputStream byteArrayOutputStreamResult = new ByteArrayOutputStream()) {
+                    //设置响应头
+                    response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(tab.getFullName(), "UTF-8") + ".xlsx");
+                    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+                    poiWorkbook.write(byteArrayOutputStreamResult);
+                    byte[] excelBytesResult = byteArrayOutputStreamResult.toByteArray();
+                    outputStream.write(excelBytesResult);
+                } catch (IOException e) {
+                    logger.error("下载excel时出现异常:" + e.getMessage(), e);
+                    e.printStackTrace();
+                }
+            } catch (IOException e) {
+                logger.error("下载excel时出现异常:" + e.getMessage(), e);
+                e.printStackTrace();
+            }
+        } catch (Exception e) {
+            logger.error("下载excel时出现异常:" + e.getMessage(), e);
+            e.printStackTrace();
+        } finally {
+            if (workbook != null) {
+                workbook.dispose();
             }
         }
     }
 
-    //解析Excel文件并设置单元格格式为文本
-    private Workbook parseExcelFile(InputStream inputStream) throws IOException, InvalidFormatException {
-        Workbook workbook = WorkbookFactory.create(inputStream);
-        DataFormat dataFormat = workbook.createDataFormat();
-        //遍历所有工作表和单元格,设置单元格格式为文本
-        for (int sheetIndex = 0; sheetIndex < workbook.getNumberOfSheets(); sheetIndex++) {
-            Sheet sheet = workbook.getSheetAt(sheetIndex);
-            for (Row row : sheet) {
-                for (Cell cell : row) {
-                    CellStyle cellStyle = cell.getCellStyle();
-                    cellStyle.setDataFormat(dataFormat.getFormat("@")); //设置单元格格式为文本
-                    cell.setCellStyle(cellStyle);
-                }
+    //在CellModificationInfo类中,根据需要存储单元格内容和合并单元格信息
+    static class CellModificationInfo {
+        private final Cell cell;
+        private String stringContent;
+        private CellRangeAddress mergedRegion;
+
+        //构造函数,用于存储单元格内容
+        public CellModificationInfo(Cell cell, String stringContent) {
+            this.cell = cell;
+            this.stringContent = stringContent;
+        }
+
+        //构造函数,用于存储合并单元格信息
+        public CellModificationInfo(Cell cell, CellRangeAddress mergedRegion) {
+            this.cell = cell;
+            this.mergedRegion = mergedRegion;
+        }
+
+        public Cell getCell() {
+            return cell;
+        }
+
+        public String getStringContent() {
+            return stringContent;
+        }
+
+        public boolean hasStringContent() {
+            return stringContent != null;
+        }
+
+        public CellRangeAddress getMergedRegion() {
+            return mergedRegion;
+        }
+
+        public boolean hasMergedRegion() {
+            return mergedRegion != null;
+        }
+    }
+
+    //获取合并单元格
+    private static CellRangeAddress findMergedRegion(Sheet sheet, int rowNum, int colNum) {
+        for (CellRangeAddress mergedRegion : sheet.getMergedRegions()) {
+            if (mergedRegion.isInRange(rowNum, colNum)) {
+                return mergedRegion;
             }
         }
-        return workbook;
-    }*/
+        return null;
+    }
+
+    //设置边框线
+    private static void setBlackBorder(CellStyle cellStyle) {
+        cellStyle.setBorderTop(BorderStyle.THIN);
+        cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
+        cellStyle.setBorderBottom(BorderStyle.THIN);
+        cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
+        cellStyle.setBorderLeft(BorderStyle.THIN);
+        cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
+        cellStyle.setBorderRight(BorderStyle.THIN);
+        cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
+    }
 
     @PostMapping("/import-excel")
     @ApiOperationSupport(order = 14)
     @ApiOperation(value = "客户端-导入excel数据到对应元素表中", notes = "传入表的pKeyId、excel文件file")
     public R<Map<String, Object>> importExcel(@RequestParam String pKeyId, @RequestPart MultipartFile file) throws Exception {
         //获取当前表htmlString
-        String htmlString = wbsTreeContractServiceImpl.getHtmlString(pKeyId);
-        if (StringUtils.isEmpty(htmlString)) {
+        String htmlString_1 = wbsTreeContractServiceImpl.getHtmlString(pKeyId);
+        if (StringUtils.isEmpty(htmlString_1)) {
             throw new ServiceException("获取元素表html信息失败");
         }
 
-        //获取excel数据
-        Map<String, String> stringStringMap = ExcelParser.parseExcel(file);
-
-        //匹配定位
-        Map<String, Object> resultDataMap = new LinkedHashMap<>();
-        Document doc = Jsoup.parse(htmlString);
-        for (Map.Entry<String, String> stringStringEntry : stringStringMap.entrySet()) {
-            String value = stringStringEntry.getValue();
-            if (StringUtils.isNotEmpty(value)) {
-                String[] split = stringStringEntry.getKey().split("_");
-                int row = Integer.parseInt(split[0]) + 1;
-                int cell = Integer.parseInt(split[1]) + 1;
-                String selectorValue = "td:has(el-date-picker[x1=" + cell + "][y1=" + row + "])," +
-                        "td:has(el-input[x1=" + cell + "][y1=" + row + "])," +
-                        "td:has(hc-form-select-search[x1=" + cell + "][y1=" + row + "])," +
-                        "td:has(hc-table-form-upload[x1=" + cell + "][y1=" + row + "])," +
-                        "td:has(hc-form-checkbox-group[x1=" + cell + "][y1=" + row + "])," +
-                        "td:has(el-radio-group[x1=" + cell + "][y1=" + row + "])," +
-                        "td:has(el-select[x1=" + cell + "][y1=" + row + "])";
-                Elements tdElementsValues = doc.select(selectorValue);
-                if (!tdElementsValues.isEmpty()) {
-                    Elements childElements = tdElementsValues.select("el-input, el-date-picker, hc-form-select-search, hc-table-form-upload, hc-form-checkbox-group, el-radio-group, el-select");
-                    for (Element childElement : childElements) {
-                        String keyName = childElement.attr("keyname");
-                        if (StringUtils.isNotEmpty(keyName)) {
-                            String dateFormatPattern = "yyyy年MM月dd日-yyyy年MM月dd日";
-                            if (isValidDateFormat(value, dateFormatPattern)) {
-                                //解析日期格式是否为范围格式,范围日期返回数组
-                                String[] splitDate = value.split("-");
-                                List<String> strings = Arrays.asList(splitDate[0], splitDate[1]);
-                                resultDataMap.put(keyName, strings);
-                            } else if (value.contains("年") && value.contains("月") && value.contains("日")) {
-                                //解析日期格式是否为单日期格式,那么剔除空格返回
-                                String replace = value.replace(" ", "");
-                                if (!replace.equals("年月日")) {//如果为空那么不返回
-                                    resultDataMap.put(keyName, replace);
+        //结果集
+        Map<String, Object> stringStringMap = new HashMap<>();
+
+        //日期格式正则
+        String doubleSlashRegex_XG = ".*\\/[^\\/]*\\/.*"; //匹配包含两个斜杠且不相邻的字符串
+        String dateFormatRegex_yyyyMdd = "\\d{4}/\\d{1,2}/\\d{1,2}"; //yyyy/M/dd格式
+        String dateFormatRegex_yyyyMMdd = "\\d{4}/\\d{2}/\\d{2}";   //yyyy/MM/dd格式
+        SimpleDateFormat inputDateFormat = new SimpleDateFormat("yyyy/M/dd");
+        SimpleDateFormat outputDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
+
+        //把导入的excel转换为html
+        Long id = SnowFlakeUtil.getId();
+        String importExcelFilePath = FileUtils.getSysLocalFileUrl();
+        String importExcelTOHtmlPath = importExcelFilePath + "/pdf//" + id + ".html";
+
+        //解析匹配数据
+        String url_1 = "";
+        com.spire.xls.Workbook workbook = null;
+        try {
+            workbook = new com.spire.xls.Workbook();
+            workbook.loadFromHtml(file.getInputStream());
+            workbook.saveToFile(importExcelTOHtmlPath, FileFormat.HTML);
+            Worksheet sheet = workbook.getWorksheets().get(0); //始终只匹配第一张表
+            //获取转换成功后的html路径
+            url_1 = importExcelTOHtmlPath.split("pdf//")[0];
+            String excelToHtmlFileUrl = url_1 + "/pdf/" + id + "_files/" + sheet.getName() + ".html";
+            String htmlString_2 = IoUtil.readToString(new FileInputStream(ResourceUtil.getFile(excelToHtmlFileUrl)));
+            //循环遍历解析tr、td
+            Document doc_1 = Jsoup.parse(htmlString_1);
+            Document doc_2 = Jsoup.parse(htmlString_2);
+            Elements trElements1 = doc_1.select("table tbody tr");
+            Elements trElements2 = doc_2.select("table tbody tr");
+            for (int i = 0; i < trElements1.size(); i++) {
+                Element tr1 = trElements1.get(i);
+                Element tr2 = trElements2.get(i);
+                Elements tdElements1 = tr1.select("td");
+                Elements tdElements2 = tr2.select("td");
+                for (int j = 0; j < tdElements1.size(); j++) {
+                    Element td1 = tdElements1.get(j);
+                    Element td2 = tdElements2.get(j);
+                    //String x1 = getX1Attribute(td1);
+                    //String y1 = getY1Attribute(td1);
+                    String keyName = getKeyNameFromChildElement(td1);
+                    if (StringUtils.isNotEmpty(keyName)) {
+                        String divValue = td2.text(); //获取文本值
+                        if (StringUtils.isNotEmpty(divValue)) {
+                            //判断是否存在两个斜杠,且不在一起,那么视为日期格式
+                            Pattern pattern_XG = Pattern.compile(doubleSlashRegex_XG);
+                            Matcher matcher_XG = pattern_XG.matcher(divValue);
+                            if (matcher_XG.matches()) {
+                                //判断日期格式yyyy/M/dd、yyyy/MM/dd
+                                Pattern pattern_yyyyMdd = Pattern.compile(dateFormatRegex_yyyyMdd);
+                                Pattern pattern_yyyyMMdd = Pattern.compile(dateFormatRegex_yyyyMMdd);
+                                Matcher matcher_yyyyMdd = pattern_yyyyMdd.matcher(divValue);
+                                Matcher matcher_yyyyMMdd = pattern_yyyyMMdd.matcher(divValue);
+                                if (matcher_yyyyMdd.matches()) {
+                                    Date date = inputDateFormat.parse(divValue);
+                                    divValue = outputDateFormat.format(date);
+                                } else if (matcher_yyyyMMdd.matches()) {
+                                    Date date = inputDateFormat.parse(divValue);
+                                    divValue = outputDateFormat.format(date);
                                 }
-                            } else {
-                                resultDataMap.put(keyName, value);
                             }
+                            //String mapKey = keyName + "***" + x1 + "_" + y1;
+                            stringStringMap.put(keyName, divValue);
                         }
                     }
                 }
             }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (workbook != null) {
+                workbook.dispose();
+            }
         }
-        if (resultDataMap.size() > 0) {
-            List<Map.Entry<String, Object>> entryList = new ArrayList<>(resultDataMap.entrySet());
+        if (stringStringMap.size() > 0) {
+            List<Map.Entry<String, Object>> entryList = new ArrayList<>(stringStringMap.entrySet());
             entryList.sort(new KeyComparator());
             LinkedHashMap<String, Object> sortedMap = new LinkedHashMap<>();
             for (Map.Entry<String, Object> entry : entryList) {
                 sortedMap.put(entry.getKey(), entry.getValue());
             }
+            //删除临时文件信息
+            if (deleteFolder(Paths.get(importExcelTOHtmlPath))) {
+                logger.info("执行方法【importExcel】结束,删除临时文件成功!");
+            } else {
+                logger.info("执行方法【importExcel】结束,删除临时文件失败!");
+            }
+            if (StringUtils.isNotEmpty(url_1)) {
+                //删除临时文件夹
+                if (deleteFolderAndContents(Paths.get(url_1 + "/pdf/" + id + "_files"))) {
+                    logger.info("执行方法【importExcel】结束,删除临时文件夹成功!");
+                } else {
+                    logger.info("执行方法【importExcel】结束,删除临时文件夹失败!");
+                }
+            }
             return R.data(sortedMap);
         }
-        return R.fail("没有获取到填写的数据");
+        return R.data(null, "没有获取到excel中的数据");
     }
 
-    private static boolean isValidDateFormat(String dateString, String formatPattern) {
-        SimpleDateFormat sdf = new SimpleDateFormat(formatPattern);
-        sdf.setLenient(false);
-        try {
-            Date date = sdf.parse(dateString);
-            return date != null && sdf.format(date).equals(dateString);
-        } catch (ParseException e) {
-            return false;
+    private static boolean deleteFolder(Path folderPath) throws IOException {
+        if (Files.exists(folderPath)) {
+            Files.walk(folderPath)
+                    .sorted(Comparator.reverseOrder())
+                    .map(Path::toFile)
+                    .forEach(File::delete);
+            return true;
+        }
+        return false;
+    }
+
+    private static boolean deleteFolderAndContents(Path folderPath) throws IOException {
+        if (Files.exists(folderPath)) {
+            Files.walk(folderPath)
+                    .sorted(Comparator.reverseOrder())
+                    .map(Path::toFile)
+                    .forEach(File::delete);
+            return true;
+        }
+        return false;
+    }
+
+    private static String getX1Attribute(Element element) {
+        return element.select("[x1]").attr("x1");
+    }
+
+    private static String getY1Attribute(Element element) {
+        return element.select("[y1]").attr("y1");
+    }
+
+    private static String getKeyNameFromChildElement(Element element) {
+        //TODO Element UI的时间标签待补全
+        String[] tagNames = {"el-input", "el-date-picker", "el-time-picker", "hc-form-select-search", "hc-table-form-upload", "hc-form-checkbox-group", "el-radio-group", "el-select"};
+        for (String tagName : tagNames) {
+            Element childElement = element.select(tagName).first();
+            if (childElement != null) {
+                String keyName = childElement.attr("keyname");
+                if (StringUtils.isNotEmpty(keyName)) {
+                    return keyName;
+                } else {
+                    return childElement.attr("id");
+                }
+            }
         }
+        return "";
     }
 
     static class KeyComparator implements Comparator<Map.Entry<String, Object>> {

+ 9 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/AppVersionDetailMapper.java

@@ -0,0 +1,9 @@
+package org.springblade.manager.mapper;
+
+
+import org.springblade.manager.entity.AppVersionDetail;
+import org.springblade.manager.injector.EasyBaseMapper;
+
+public interface AppVersionDetailMapper extends EasyBaseMapper<AppVersionDetail> {
+
+}

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

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.manager.mapper.AppVersionDetailMapper">
+
+
+</mapper>

+ 17 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/AppVersionMapper.java

@@ -0,0 +1,17 @@
+package org.springblade.manager.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.manager.dto.WbsTreePrivateDTO2;
+import org.springblade.manager.entity.AppVersion;
+import org.springblade.manager.entity.TableInfo;
+import org.springblade.manager.entity.WbsTree;
+import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.injector.EasyBaseMapper;
+import org.springblade.manager.vo.*;
+
+import java.util.List;
+
+public interface AppVersionMapper extends EasyBaseMapper<AppVersion> {
+
+}

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

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.manager.mapper.AppVersionMapper">
+
+
+</mapper>

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

@@ -11,7 +11,7 @@
         <foreach collection="number" item="n" open="(" separator="," close=")">
             #{n}
         </foreach>
-        or
+        or design_strength in
         <foreach collection="strength" item="s" open="(" separator="," close=")">
             #{s}
         </foreach>

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -401,6 +401,7 @@
         set excel_id= #{aPrivate.excelId},
             node_name = #{aPrivate.nodeName},
             full_name = #{aPrivate.fullName},
+            init_table_name = #{aPrivate.initTableName},
             is_link_table = 2,
             html_url = #{aPrivate.htmlUrl}
         where type = 2

+ 32 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IAppVersionDetailService.java

@@ -0,0 +1,32 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.manager.service;
+
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.manager.entity.AppVersion;
+import org.springblade.manager.entity.AppVersionDetail;
+
+/**
+ * 服务类
+ *
+ * @author BladeX
+ * @since 2023-03-20
+ */
+public interface IAppVersionDetailService extends BaseService<AppVersionDetail> {
+
+
+}

+ 34 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IAppVersionService.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.manager.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.manager.entity.AppVersion;
+import org.springblade.manager.entity.ArchiveAutoRuleWbs;
+import org.springblade.manager.vo.ArchiveAutoRuleWbsVO;
+
+/**
+ * 服务类
+ *
+ * @author BladeX
+ * @since 2023-03-20
+ */
+public interface IAppVersionService extends BaseService<AppVersion> {
+
+
+}

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

@@ -174,5 +174,5 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
      */
     void gsColor(Long pKeyId, String nodeId, String projectId, Document doc);
 
-    List<WbsFormElement> getUnMatchField(Long pkeyId, Long tabId) throws FileNotFoundException;
+    List<WbsFormElement> getUnMatchField(Long pkeyId, Long tabId) throws Exception;
 }

+ 19 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/AppVersionDetailImpl.java

@@ -0,0 +1,19 @@
+package org.springblade.manager.service.impl;
+
+
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.manager.entity.AppVersion;
+import org.springblade.manager.entity.AppVersionDetail;
+import org.springblade.manager.mapper.AppVersionDetailMapper;
+import org.springblade.manager.mapper.AppVersionMapper;
+import org.springblade.manager.service.IAppVersionDetailService;
+import org.springblade.manager.service.IAppVersionService;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class AppVersionDetailImpl extends BaseServiceImpl<AppVersionDetailMapper, AppVersionDetail> implements IAppVersionDetailService {
+
+
+}

+ 24 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/AppVersionImpl.java

@@ -0,0 +1,24 @@
+package org.springblade.manager.service.impl;
+
+
+import lombok.AllArgsConstructor;
+import org.springblade.common.utils.ForestNodeMergerEx;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.manager.entity.AppVersion;
+import org.springblade.manager.entity.TableInfo;
+import org.springblade.manager.mapper.AppVersionMapper;
+import org.springblade.manager.mapper.TableInfoMapper;
+import org.springblade.manager.service.IAppVersionService;
+import org.springblade.manager.service.ITableInfoService;
+import org.springblade.manager.vo.ArchiveTreeContractVO2;
+import org.springblade.manager.vo.ArchiveTreeVO2;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Service
+@AllArgsConstructor
+public class AppVersionImpl extends BaseServiceImpl<AppVersionMapper, AppVersion> implements IAppVersionService {
+
+
+}

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

@@ -188,7 +188,7 @@ public class ArchiveTreeContractSyncImpl {
         List<ArchiveTreeContract> saveList = new ArrayList<>();
 
         ArchiveProjectConfig archiveProjectConfig = archiveAutoClient.getByProjectIdOrNew(projectId);
-        
+
         //测试阶段,必须打开项目配置才能同步wbs节点
         if (archiveProjectConfig!= null && archiveProjectConfig.getFactorType().contains("6")) {
             //todo 等测试OK再打开

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

@@ -727,13 +727,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
      * @return
      */
     @Override
-    public List<WbsFormElement> getUnMatchField(Long pkeyId, Long tabId) throws FileNotFoundException {
+    public List<WbsFormElement> getUnMatchField(Long pkeyId, Long tabId) throws Exception {
         // 获取 节点信息
         WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getOne(
                 new LambdaQueryWrapper<WbsTreePrivate>().eq(WbsTreePrivate::getPKeyId,pkeyId));
         // 读取html页面信息
-        File file1 = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
-        FileInputStream inputStream = new FileInputStream(file1);
+        InputStream  inputStream = FileUtils.getInputStreamByUrl(wbsTreePrivate.getHtmlUrl());
         String htmlString = IoUtil.readToString(inputStream);
         // 样式集合
         Document doc = Jsoup.parse(htmlString);

+ 68 - 28
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/MixProportionInfoServiceImpl.java

@@ -139,33 +139,55 @@ public class MixProportionInfoServiceImpl extends BaseServiceImpl<MixProportionI
         String url = baseMapper.getExcelUrlByPKeyId(dto.getKeyId());
         // 读取html页面信息
         File file1 = ResourceUtil.getFile(url);
-//        File file1 = ResourceUtil.getFile("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1694957051815395328.html");
+//        File file1 = ResourceUtil.getFile("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1696079664109322240.html");
         FileInputStream inputStream = new FileInputStream(file1);
         String htmlString = IoUtil.readToString(inputStream);
         Document doc = Jsoup.parse(htmlString);
         Element table = doc.select("table").first();
         Elements td = table.select("td");
-        Boolean isFiled = false;
-        String key = "";
+        String key1 = "";
+        String key2 = "";
+        String key3 = "";
+        String key4 = "";
+        String key5 = "";
+        String key6 = "";
+        String key7 = "";
+        String key8 = "";
+        String key9 = "";
         for (Element element : td) {
-            if (isFiled){
-                key = element.childNodes().get(1).attr("keyname");
-                break;
-            }
-            if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(element.text()) && element.text().equals("施工配合比")){
-                isFiled = true;
+            if (element.childNodes().size() >= 2) {
+                String str = element.childNodes().get(1).attr("placeholder");
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_水泥")) {
+                    key1 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_碎(卵)石1")) {
+                    key2 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_碎(卵)石2")) {
+                    key3 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_碎(卵)石3")) {
+                    key4 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_砂")) {
+                    key5 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_水")) {
+                    key6 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_外掺(料)剂1")) {
+                    key7 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_外掺(料)剂2")) {
+                    key8 = element.childNodes().get(1).attr("keyname");
+                }
+                if (StringUtils.isNotBlank(str) && str.equals("施工配合比_每立方米混凝土材料用量(kg)_外掺(料)剂3")) {
+                    key9 = element.childNodes().get(1).attr("keyname");
+                }
             }
+
         }
-        if (!isFiled){
-            inputStream.close();
-            return R.data(null);
-        }
-        //获取位置前缀后缀
-        String prefix= key.replaceAll("__[\\d_]+", "");
-        String suffix = key.replaceAll("key_\\d+__", "");
-        String[] split = suffix.split("_");
-        String s1 = split[0];
-        Integer s2 = Integer.parseInt(split[1]);
+
         //结果集
         Map<String,BigDecimal> map = new HashMap<>();
         //获取配合比信息
@@ -186,49 +208,67 @@ public class MixProportionInfoServiceImpl extends BaseServiceImpl<MixProportionI
             sand = dto.getSand().divide(new BigDecimal(100)).multiply(info.getSand());
             //黄砂
             BigDecimal sand2 = info.getSand().add(sand);
-            map.put(prefix + "__" + s1 + "_" + (s2 + 1), sand2);
+            if (StringUtils.isNotBlank(key5)) {
+                map.put(key5, sand2);
+            }
         }
         //碎石1
         if (dto.getMacadamOne() != null) {
             macadamOne = dto.getMacadamOne().divide(new BigDecimal(100)).multiply(info.getMacadamOne());
             //碎石1
             BigDecimal macadamOne2 = info.getMacadamOne().add(macadamOne);
-            map.put(prefix + "__" +s1 + "_" +(s2+2),macadamOne2);
+            if (StringUtils.isNotBlank(key2)) {
+                map.put(key2, macadamOne2);
+            }
         }
         //碎石2
         if (dto.getMacadamTwo() != null) {
             macadamTwo = dto.getMacadamTwo().divide(new BigDecimal(100)).multiply(info.getMacadamTwo());
             //碎石2
             BigDecimal macadamTwo2 = info.getMacadamTwo().add(macadamTwo);
-            map.put(prefix + "__" +s1 + "_" +(s2+3),macadamTwo2);
+            if (StringUtils.isNotBlank(key3)) {
+                map.put(key3, macadamTwo2);
+            }
         }
         //碎石3
         if (dto.getMacadamThree() != null) {
             macadamThree = dto.getMacadamThree().divide(new BigDecimal(100)).multiply(info.getMacadamThree());
             //碎石3
             BigDecimal macadamThree2 = info.getMacadamThree().add(macadamThree);
-            map.put(prefix + "__" +s1 + "_" +(s2+4),macadamThree2);
+            if (StringUtils.isNotBlank(key4)) {
+                map.put(key4, macadamThree2);
+            }
         }
 
         //施工配合比计算
         //水泥
         BigDecimal cement = info.getCement();
-        map.put(prefix + "__" +s1 + "_" +(s2),cement);
+        if (StringUtils.isNotBlank(key1)) {
+            map.put(key1, cement);
+        }
 
         //水
         if (dto.getSand() != null && dto.getMacadamOne() != null && dto.getMacadamTwo() != null && dto.getMacadamThree() != null) {
             BigDecimal water = info.getWater().subtract(sand).subtract(macadamOne).subtract(macadamTwo).subtract(macadamThree);
-            map.put(prefix + "__" + s1 + "_" + (s2 + 5), water);
+            if (StringUtils.isNotBlank(key6)) {
+                map.put(key6, water);
+            }
         }
         //掺加剂
         BigDecimal admixture = info.getAdmixture();
-        map.put(prefix + "__" +s1 + "_" +(s2+6),admixture);
+        if (StringUtils.isNotBlank(key7)) {
+            map.put(key7, admixture);
+        }
         //粉煤灰
         BigDecimal coalAsh = info.getCoalAsh();
-        map.put(prefix + "__" +s1 + "_" +(s2+7),coalAsh);
+        if (StringUtils.isNotBlank(key8)) {
+            map.put(key8, coalAsh);
+        }
         //矿渣粉
         BigDecimal slagPowder = info.getSlagPowder();
-        map.put(prefix + "__" +s1 + "_" +(s2+8),slagPowder);
+        if (StringUtils.isNotBlank(key9)) {
+            map.put(key9, slagPowder);
+        }
         inputStream.close();
         return R.data(map);
     }

+ 0 - 95
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelParser.java

@@ -1,95 +0,0 @@
-package org.springblade.manager.utils;
-
-import com.mixsmart.utils.StringUtils;
-import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
-import org.apache.poi.ss.usermodel.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.text.DecimalFormat;
-import java.text.NumberFormat;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-public class ExcelParser {
-
-    private static final NumberFormat numberFormat = NumberFormat.getNumberInstance();
-
-    static {
-        //格式化后不包含千位分隔符
-        numberFormat.setGroupingUsed(false);
-    }
-
-    public static Map<String, String> parseExcel(MultipartFile file) throws IOException {
-        Map<String, String> cellValueMap = new LinkedHashMap<>();
-        try (InputStream inputStream = file.getInputStream()) {
-            Workbook workbook = WorkbookFactory.create(inputStream);
-            Sheet sheet = workbook.getSheetAt(0); //获取第一个工作表
-            for (Row row : sheet) {
-                for (Cell cell : row) {
-                    String cellValue = getCellValue(cell);
-                    if (StringUtils.isNotEmpty(cellValue)) {
-                        String cellCoordinate = getCellCoordinate(cell);
-                        cellValueMap.put(cellCoordinate, cellValue);
-                    }
-                }
-            }
-        } catch (InvalidFormatException e) {
-            e.printStackTrace();
-        }
-        return cellValueMap;
-    }
-
-    private static String getCellValue(Cell cell) {
-        Object value;
-        if (cell == null) return "";
-        switch (cell.getCellTypeEnum()) {
-            case STRING:
-                return cell.getStringCellValue();
-            case BOOLEAN:
-                return String.valueOf(cell.getBooleanCellValue());
-            case FORMULA:
-                //公式单元格
-                return evaluateFormulaCell(cell);
-            case NUMERIC:
-                //浮点数单元格
-                double d = cell.getNumericCellValue();
-                if (d == 0.0) {
-                    return "";
-                }
-                value = numberFormat.format(d);
-                return value.toString();
-            default:
-                return "";
-        }
-    }
-
-    private static String evaluateFormulaCell(Cell cell) {
-        FormulaEvaluator evaluator = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator();
-        CellValue cellValue = evaluator.evaluate(cell);
-        Object value;
-        if (cellValue == null) return "";
-        switch (cellValue.getCellTypeEnum()) {
-            //解决公式内部是浮点数问题
-            case NUMERIC:
-                double d = cell.getNumericCellValue();
-                if (d == 0.0) {
-                    return "";
-                }
-                value = numberFormat.format(d);
-                return value.toString();
-            case STRING:
-                return cell.getStringCellValue();
-            default:
-                return "";
-        }
-    }
-
-    private static String getCellCoordinate(Cell cell) {
-        int row = cell.getRowIndex();
-        int col = cell.getColumnIndex();
-        return row + "_" + col;
-    }
-
-}

+ 14 - 12
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java

@@ -416,20 +416,21 @@ public class FileUtils {
 
 
     public static void main123(String[] args) throws Exception {
-       String excelUrl = "/Users/hongchuangyanfa/Downloads/C4.13路基压实度汇总表.xlsx";
+       String excelUrl = "/Users/hongchuangyanfa/Downloads/C10.28隧道注浆施工记录表.xlsx";
         String old_html = "/Users/hongchuangyanfa/Desktop/pdf/old_html.html";
         String old_xlsx = "/Users/hongchuangyanfa/Desktop/pdf/old_html.xlsx";
 
-      //  File data = new File(excelUrl);
-      //  InputStream inputStream = new FileInputStream(data);
-      //  excelInfo(inputStream,old_xlsx,old_html,"1");
+        File data = new File(excelUrl);
+        InputStream inputStream = new FileInputStream(data);
+        excelInfo(inputStream,old_xlsx,old_html,"1");
+
 
-        String new_html = "/Users/hongchuangyanfa/Desktop/pdf/new_html.html";
+/*        String new_html = "/Users/hongchuangyanfa/Desktop/pdf/new_html.html";
         String new_xlsx = "/Users/hongchuangyanfa/Desktop/pdf/new_html.xlsx";
 
         File data = new File(old_xlsx);
         InputStream inputStream = new FileInputStream(data);
-        excelInfo(inputStream,new_xlsx,new_html,"2");
+        excelInfo(inputStream,new_xlsx,new_html,"2");*/
     }
 
 
@@ -489,7 +490,6 @@ public class FileUtils {
                 CellRange oldcell = mergedCells[i];
                 CellRange mergedCell = sheet.getCellRange(oldcell.getRow(), oldcell.getColumn());
                 String data = mergedCell.getDataValidation().getErrorMessage();
-                System.out.println(mergedCell.getValue()+"---"+data);
                 if (StringUtils.isEmpty(data)) {
                     if(maxVal<=0){
                         j = j + 1;
@@ -507,7 +507,7 @@ public class FileUtils {
                 // 目标表添加备注信息
                 sheet2.getCellRange(oldcell.getRow(), oldcell.getColumn()).getDataValidation().setErrorMessage(j+"");
                 mergedCell.getDataValidation().setErrorMessage(j+"");
-                mergedCell.setValue(j + "");
+                mergedCell.setText(j + "");
                 dataMap.put("x1", mergedCell.getRow());
                 dataMap.put("x2", mergedCell.getLastRow());
                 dataMap.put("y1", mergedCell.getColumn());
@@ -537,7 +537,7 @@ public class FileUtils {
                 }
                 sheet2.getCellRange(oldcell.getRow(), oldcell.getColumn()).getDataValidation().setErrorMessage(j+"");
                 oldcell.getComment().getRichText().setText(j + "");
-                mergedCell.setValue(j + "");
+                mergedCell.setText(j + "");
                 dataMap.put("x1", mergedCell.getRow());
                 dataMap.put("x2", mergedCell.getLastRow());
                 dataMap.put("y1", mergedCell.getColumn());
@@ -569,9 +569,11 @@ public class FileUtils {
                 Elements td2 = trs2.get(i).select("td");
                 for (int x = 0; x < td1.size(); x++) {
                     Element cell1 = td1.get(x);
-                    if (cell1.children().size() >= 1) {
+                    /*if (cell1.children().size() >= 1) {
+                        String data = cell1.text();
                         cell1.empty();
-                    }
+                        cell1.text(data);
+                    }*/
                     Element cell2 = td2.get(x);
                     String html = cell2.text();
                     Map<String, Integer> xyMap = xyList.get(html);
@@ -588,7 +590,7 @@ public class FileUtils {
             File writeFile = new File(htmlUrl);
             FileUtil.writeToFile(writeFile, doc1.html(), Boolean.parseBoolean("UTF-8"));
             if (html2.exists()) {
-                html2.delete();
+               // html2.delete();
             }
             fileInputStream.close();
             wb2.dispose();