Эх сурвалжийг харах

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

huangtf 2 жил өмнө
parent
commit
9a7d5f309f
49 өөрчлөгдсөн 1604 нэмэгдсэн , 292 устгасан
  1. 0 9
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveVo.java
  2. 19 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO2.java
  3. 25 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/CheckoutVO.java
  4. 6 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ImageClassificationFileVO.java
  5. 0 18
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ExcelTabBatchUploadDTO.java
  6. 0 18
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ExcelTabFileDTO.java
  7. 36 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/MoistureContentDTO.java
  8. 73 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/MixProportionInfo.java
  9. 44 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/RawMaterialsInfo.java
  10. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractLazyVO.java
  11. 16 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  12. 6 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java
  13. 13 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  14. 2 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  15. 48 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  16. 21 3
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java
  17. 2 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml
  18. 10 0
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  19. 355 25
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  20. 128 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/MixProportionInfoController.java
  21. 117 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/RawMaterialsInfoController.java
  22. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  23. 37 13
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  24. 67 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/excel/MixProportionInfoExcel.java
  25. 40 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/excel/RawMaterialsInfoExcel.java
  26. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/FormulaStrategy.java
  27. 3 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/FormulaStrategyFactory.java
  28. 0 31
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaA.java
  29. 0 32
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaB.java
  30. 0 34
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaC.java
  31. 12 18
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaMileage.java
  32. 13 14
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaTurnPoint.java
  33. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/SubTable.java
  34. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  35. 44 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/MixProportionInfoMapper.java
  36. 24 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/MixProportionInfoMapper.xml
  37. 30 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/RawMaterialsInfoMapper.java
  38. 6 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/RawMaterialsInfoMapper.xml
  39. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  40. 23 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IMixProportionInfoService.java
  41. 16 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IRawMaterialsInfoService.java
  42. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  43. 4 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  44. 16 18
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  45. 198 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/MixProportionInfoServiceImpl.java
  46. 18 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/RawMaterialsInfoServiceImpl.java
  47. 18 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  48. 52 40
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  49. 50 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelParser.java

+ 0 - 9
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveVo.java

@@ -1,9 +0,0 @@
-package org.springblade.archive.vo;
-
-/**
- * @author yangyj
- * @Date 2023/2/17 10:40
- * @description TODO
- */
-public class ArchiveVo {
-}

+ 19 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO2.java

@@ -0,0 +1,19 @@
+package org.springblade.archive.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.archive.entity.ArchivesAuto;
+
+/**
+ * @author yangyj
+ * @Date 2023/2/17 10:40
+ * @description TODO
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ArchivesAutoVO2 extends ArchivesAuto {
+
+    @ApiModelProperty("主节点")
+    private String masterNode;
+}

+ 25 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/CheckoutVO.java

@@ -0,0 +1,25 @@
+package org.springblade.archive.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.archive.entity.ArchivesAuto;
+
+import java.util.List;
+
+/**
+ * @Param    在线验收首页VO
+ * @Author wangwl
+ * @Date 2023/8/23 14:52
+ **/
+@Data
+public class CheckoutVO {
+
+    @ApiModelProperty("节点名称")
+    private String nodeName;
+
+    @ApiModelProperty("档案总数")
+    private Integer total;
+
+    @ApiModelProperty("档案集合")
+    private List<ArchivesAutoVO2> list;
+}

+ 6 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ImageClassificationFileVO.java

@@ -79,4 +79,10 @@ public class ImageClassificationFileVO extends ImageClassificationFile {
     @ApiModelProperty("搜索-开始结束")
     private String endDate;
 
+    /**
+     * 是否是App
+     */
+    @ApiModelProperty("是否是App")
+    private Integer isApp;
+
 }

+ 0 - 18
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ExcelTabBatchUploadDTO.java

@@ -1,18 +0,0 @@
-package org.springblade.manager.dto;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.List;
-
-@Data
-public class ExcelTabBatchUploadDTO implements Serializable {
-
-    @ApiModelProperty("选择上传的当前节点id")
-    private Long id;
-
-    @ApiModelProperty("上传的文件对象集合")
-    private List<ExcelTabFileDTO> fileList;
-
-}

+ 0 - 18
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ExcelTabFileDTO.java

@@ -1,18 +0,0 @@
-package org.springblade.manager.dto;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.Serializable;
-
-@Data
-public class ExcelTabFileDTO implements Serializable {
-
-    @ApiModelProperty("清表文件名")
-    private String fileName;
-
-    @ApiModelProperty("清表excel文件")
-    private MultipartFile file;
-
-}

+ 36 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/MoistureContentDTO.java

@@ -0,0 +1,36 @@
+package org.springblade.manager.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param  含水率
+ * @Author wangwl
+ * @Date 2023/8/22 16:00
+ **/
+@Data
+public class MoistureContentDTO {
+
+    @ApiModelProperty(value = "当前位置")
+    private String key ;
+
+    @ApiModelProperty(value = "合同段id")
+    private String contractId ;
+
+    @ApiModelProperty(value = "设计强度")
+    private String designStrength;
+
+    @ApiModelProperty(value = "黄砂含水率")
+    private BigDecimal sand ;
+
+    @ApiModelProperty(value = "碎石1含水率")
+    private BigDecimal macadamOne ;
+
+    @ApiModelProperty(value = "碎石2含水率")
+    private BigDecimal macadamTwo ;
+
+    @ApiModelProperty(value = "碎石3含水率")
+    private BigDecimal macadamThree ;
+}

+ 73 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/MixProportionInfo.java

@@ -0,0 +1,73 @@
+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.math.BigDecimal;
+
+/**
+ * @Param   配合比信息表
+ * @Author wangwl
+ * @Date 2023/8/21 16:21
+ **/
+@Data
+@TableName("m_mix_proportion_info")
+@EqualsAndHashCode(callSuper = true)
+public class MixProportionInfo extends BaseEntity {
+
+
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+
+    @ApiModelProperty(value = "合同id")
+    private Long contractId;
+
+    @ApiModelProperty(value = "配合比报告编号")
+    private String reportNumber;
+
+    @ApiModelProperty(value = "设计强度")
+    private String designStrength;
+
+    @ApiModelProperty(value = "水胶比")
+    private String waterBinderRatio;
+
+    @ApiModelProperty(value = "水泥")
+    private BigDecimal cement ;
+
+    @ApiModelProperty(value = "砂")
+    private BigDecimal sand;
+
+    @ApiModelProperty(value = "碎石1")
+    private BigDecimal macadamOne ;
+
+    @ApiModelProperty(value = "碎石2")
+    private BigDecimal macadamTwo;
+
+    @ApiModelProperty(value = "碎石3")
+    private BigDecimal macadamThree;
+
+    @ApiModelProperty(value = "水")
+    private BigDecimal water;
+
+    @ApiModelProperty(value = "掺加剂")
+    private BigDecimal admixture ;
+
+    @ApiModelProperty(value = "粉煤灰")
+    private BigDecimal coalAsh;
+
+    @ApiModelProperty(value = "矿渣粉")
+    private BigDecimal slagPowder;
+
+    @ApiModelProperty(value = "坍落度")
+    private BigDecimal slumps;
+
+    @ApiModelProperty(value = "单位体积重")
+    private String bulkDensity;
+
+    @ApiModelProperty(value = "抗压强度")
+    private BigDecimal compressiveStrength;
+
+}

+ 44 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/RawMaterialsInfo.java

@@ -0,0 +1,44 @@
+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;
+
+/**
+ * @Param   原材料信息表
+ * @Author wangwl
+ * @Date 2023/8/21 16:21
+ **/
+@Data
+@TableName("m_raw_materials_info")
+@EqualsAndHashCode(callSuper = true)
+public class RawMaterialsInfo extends BaseEntity {
+
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+
+    @ApiModelProperty(value = "合同id")
+    private Long contractId;
+
+    @ApiModelProperty(value = "材料名称")
+    private String name;
+
+    @ApiModelProperty(value = "规格型号")
+    private String specification;
+
+    @ApiModelProperty(value = "生产厂商")
+    private String manufacturers;
+
+    @ApiModelProperty(value = "存放地点或料厂号")
+    private String storageSite;
+
+    @ApiModelProperty(value = "批准文号")
+    private String batchNumber;
+
+    @ApiModelProperty(value = "准备数量")
+    private Integer total;
+
+
+}

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractLazyVO.java

@@ -70,4 +70,7 @@ public class WbsTreeContractLazyVO implements Serializable {
     @ApiModelProperty(value = "工程图纸id")
     private Long drawingsId;
 
+    @ApiModelProperty("是否又混泥土,0否1是")
+    private Integer isConcrete;
+
 }

+ 16 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -32,6 +32,7 @@ import org.apache.http.message.BasicNameValuePair;
 import org.springblade.archive.service.IArchiveAutoPdfService;
 import org.springblade.archive.utils.CallBgrsjk;
 import org.springblade.archive.utils.FileUtils;
+import org.springblade.archive.vo.CheckoutVO;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
@@ -628,4 +629,19 @@ public class ArchivesAutoController extends BladeController {
         ArchivesAuto archivesAuto = archivesAutoService.getById(id);
         return R.data(archivesAuto);
     }
+
+	/**
+	 * 在线验收-根据单位显示档案
+	 */
+	@GetMapping("/getUnitArchivesAutoView")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "在线验收-根据单位显示档案", notes = "传入项目id,和单位类型")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "unitType", value = "单位类型,1建设2监理3施工4科研", required = true),
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+	})
+	public R<List<CheckoutVO>> getArchivesAutoViewByUnit(@RequestParam Integer unitType, Long projectId) {
+		List<CheckoutVO> list = archivesAutoService.getArchivesAutoViewByUnit(unitType,projectId);
+		return R.data(list);
+	}
 }

+ 6 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java

@@ -23,6 +23,8 @@ import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.vo.ArchivesAutoVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.archive.vo.ArchivesAutoVO2;
+import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.user.entity.User;
 
@@ -151,4 +153,8 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
 	List<ArchivesAutoVO> getArchivesCabinet22(@Param("vo") ArchivesAutoVO archivesAuto);
 
 	List<ArchivesAutoVO> pageByArchivesAuto5(@Param("vo") ArchivesAutoVO vo);
+
+    List<ArchiveTreeContract> getUnitNodeByProjectId(@Param("projectId") Long projectId);
+
+	List<ArchivesAutoVO2> getUnitAllArchive(@Param("node") String node);
 }

+ 13 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -929,6 +929,19 @@
         select *
         from u_archives_auto uaa WHERE uaa.id = #{id} and is_deleted = 0
     </select>
+    <select id="getUnitNodeByProjectId" resultType="org.springblade.manager.entity.ArchiveTreeContract">
+        SELECT matc1.*
+        FROM m_archive_tree_contract matc1
+        WHERE  matc1.parent_id in (select id from m_archive_tree_contract
+                                   WHERE parent_id = (select id from m_archive_tree_contract WHERE parent_id = 0 and project_id = #{projectId} and is_deleted = 0)
+                                     and is_deleted = 0 and tree_code is NULL)
+          and matc1.is_deleted = 0
+    </select>
+    <select id="getUnitAllArchive" resultType="org.springblade.archive.vo.ArchivesAutoVO2">
+        select SUBSTRING_INDEX(SUBSTRING_INDEX(atc.ancestors,",",4),",",-1) as masterNode,uaa.*
+        from (select * from m_archive_tree_contract WHERE is_deleted = 0 and ancestors like concat('%',#{node},'%')) atc
+                 join u_archives_auto uaa on atc.id = uaa.node_id  and uaa.is_deleted = 0
+    </select>
 
 
     <update id="splitFiles">

+ 2 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java

@@ -18,6 +18,7 @@ package org.springblade.archive.service;
 
 import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.vo.ArchivesAutoVO;
+import org.springblade.archive.vo.CheckoutVO;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -102,4 +103,5 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	// 语音搜索
 	R searchInfo(MultipartFile file) throws IOException;
 
+    List<CheckoutVO> getArchivesAutoViewByUnit(Integer unitType, Long projectId);
 }

+ 48 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -39,6 +39,8 @@ import org.springblade.archive.utils.FileUtils;
 import org.springblade.archive.vo.ArchivesAutoVO;
 import org.springblade.archive.mapper.ArchivesAutoMapper;
 import org.springblade.archive.service.IArchivesAutoService;
+import org.springblade.archive.vo.ArchivesAutoVO2;
+import org.springblade.archive.vo.CheckoutVO;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.business.feign.MetadataClassificationClient;
@@ -2270,4 +2272,50 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		}
 		return R.data(jsonObject);
 	}
+
+	/**
+	 * 在线验收-根据单位显示档案
+	 * @param unitType
+	 * @param projectId
+	 * @return
+	 */
+	@Override
+	public List<CheckoutVO> getArchivesAutoViewByUnit(Integer unitType, Long projectId) {
+		//判断单位
+		if (unitType == 1){
+			//获取所有主节点,如果没有档案不显示可以取消
+			List<ArchiveTreeContract> nodes = baseMapper.getUnitNodeByProjectId(projectId);
+			if (nodes == null || nodes.size() <= 0){
+				return null;
+			}
+			String node = nodes.get(0).getAncestors().split(",")[2];
+			//获取建设单位的所有档案
+			List<ArchivesAutoVO2> vo2s = baseMapper.getUnitAllArchive(node);
+			if (vo2s == null || vo2s.size() <= 0){
+				return null;
+			}
+			List<CheckoutVO> list = new ArrayList<>();
+			CheckoutVO vo = new CheckoutVO();
+			vo.setNodeName("建设单位归档资料");
+			vo.setTotal(vo2s.size());
+			list.add(vo);
+			//根据主节点分组
+			Map<String, List<ArchivesAutoVO2>> map = vo2s.parallelStream().collect(Collectors.groupingBy(ArchivesAutoVO2::getMasterNode));
+			//循环主节点并且存入数据
+			for (ArchiveTreeContract contract : nodes) {
+				CheckoutVO v = new CheckoutVO();
+				v.setNodeName(contract.getFullName());
+				List<ArchivesAutoVO2> vo2List = map.get(contract.getId()+"");
+				if (vo2List != null && vo2List.size() > 0){
+					v.setTotal(vo2List.size());
+					v.setList(vo2List);
+				}else {
+					v.setTotal(0);
+				}
+				list.add(v);
+			}
+			return list;
+		}
+		return null;
+	}
 }

+ 21 - 3
blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java

@@ -38,6 +38,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.IoUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.ExcelTab;
 import org.springblade.manager.entity.ImageClassificationConfig;
 import org.springblade.manager.entity.WbsTreeContract;
@@ -537,11 +538,28 @@ public class ImageClassificationFileController extends BladeController {
             @ApiImplicitParam(name = "staDate", value = "开始时间"),
             @ApiImplicitParam(name = "endDate", value = "结束时间")
     })
-    public R<IPage<ImageClassificationFileVO>> page(ImageClassificationFileVO fileVO, Query query) {
+    public R<Object> page(ImageClassificationFileVO fileVO, Query query) {
         IPage<ImageClassificationFileVO> page = this.imageClassificationFileService.selectImageClassificationFilePage(Condition.getPage(query), fileVO);
-        page.getRecords().forEach(vos -> vos.setShootingTimeStr(DateUtil.format(vos.getShootingTime(), "yyyy-MM-dd")));
-
+        List<ImageClassificationFileVO> sortedRecords = page.getRecords().stream()
+                .filter(vos -> vos.getCreateTime() != null)//过滤掉创建时间为null的记录
+                .sorted(Comparator.comparing(ImageClassificationFileVO::getCreateTime).reversed())
+                .peek(vos -> {
+                    if (vos.getShootingTime() != null) {
+                        vos.setShootingTimeStr(DateUtil.format(vos.getShootingTime(), "yyyy-MM-dd"));
+                    }
+                })
+                .collect(Collectors.toList());
+        if (ObjectUtil.isNotEmpty(fileVO.getIsApp()) && fileVO.getIsApp() == 1) {
+            //App按照创建时间分组
+            Map<String, List<ImageClassificationFileVO>> groupedRecords = sortedRecords.stream()
+                    .collect(Collectors.groupingBy(vos -> DateUtil.format(vos.getCreateTime(), "yyyy-MM-dd"),
+                            LinkedHashMap::new,
+                            Collectors.toList()));
+            return R.data(groupedRecords);
+        }
+        page.setRecords(sortedRecords);
         return R.data(page);
+
     }
 
     /**

+ 2 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml

@@ -71,7 +71,8 @@
         files.image_url,
         files.pdf_url,
         files.type,
-        files.marge_pdf_url
+        files.marge_pdf_url,
+        files.create_time
         from
         (
         select

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

@@ -629,6 +629,16 @@ public class FormulaUtils {
         }
     }
 
+
+
+    public static List<ElementData> setScale(Integer scale, List<ElementData> data){
+        if(scale==null){
+            scale=StringUtils.getScale(data.stream().map(ElementData::getValue).filter(StringUtils::isDouble).collect(Collectors.toList()));
+        }
+        Integer finalScale = scale;
+        return data.stream().peek(e->{if(StringUtils.isDouble(e.getValue())){e.setValue(StringUtils.number2StringZero(e.getValue(),finalScale));}}).collect(Collectors.toList());
+    }
+
 /*    public static void main(String[] args) {
         Map<String,String> map=getElementCell("/www/wwwroot/Users/hongchuangyanfa/Desktop/privateUrl/1688447882195107840.html","key_31");
         System.out.println(map);

+ 355 - 25
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -43,8 +43,6 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.bean.TableInfo;
-import org.springblade.manager.dto.ExcelTabBatchUploadDTO;
-import org.springblade.manager.dto.ExcelTabFileDTO;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.enums.ExecuteType;
 import org.springblade.manager.mapper.ExcelTabMapper;
@@ -292,16 +290,21 @@ public class ExcelTabController extends BladeController {
     public R putFileAttach(@RequestParam("file") MultipartFile file, Long nodeId) {
         String file_path = FileUtils.getSysLocalFileUrl();
         ExcelTab detail = excelTabService.getById(nodeId);
-        // 上传excel文件
-        R<BladeFile> bladeFile = iossClient.addFileInfo(file);
-        BladeFile bladeFile1 = bladeFile.getData();
+
         String filecode = SnowFlakeUtil.getId() + "";
         String thmlUrl = file_path + filecode + ".html";
         String thmlUrl2 = file_path + filecode + "123.html";
-        // 解析excel
+        String exceUrl = file_path + filecode + "123.xlsx";
+
+        // 解析原始excel
         Workbook wb = new Workbook();
         wb.loadFromMHtml(file.getInputStream());
-        //
+
+        // 操作
+        Workbook wb2 = new Workbook();
+        wb2.loadFromMHtml(file.getInputStream());
+        Worksheet sheet2 = wb2.getWorksheets().get(0);
+
         HTMLOptions options = new HTMLOptions();
         options.setImageEmbedded(true);
         //获取工作表
@@ -309,13 +312,14 @@ public class ExcelTabController extends BladeController {
         sheet.saveToHtml(thmlUrl, options);
 
         CellRange[] mergedCells = sheet.getMergedCells();
+        CellRange[] mergedCells3 = sheet2.getMergedCells();
         Map<String, Map<String, Integer>> xyList = new HashMap<>();
         int j = 0;
         for (int i = 0; i < mergedCells.length; i++) {
             Map<String, Integer> dataMap = new HashMap<>();
             CellRange mergedCell = mergedCells[i];
             j = j + 1;
-            mergedCell.getComment().getRichText().setText(j + "");
+            mergedCells3[i].getComment().getRichText().setText(j + "");
             mergedCell.setValue(j + "");
             dataMap.put("x1", mergedCell.getRow());
             dataMap.put("x2", mergedCell.getLastRow());
@@ -325,12 +329,13 @@ public class ExcelTabController extends BladeController {
         }
 
         CellRange[] mergedCells2 = sheet.getCells();
+        CellRange[] mergedCells4 = sheet2.getCells();
         for (int i = 0; i < mergedCells2.length; i++) {
             CellRange mergedCell = mergedCells2[i];
             String data = mergedCell.getComment().getRichText().getText();
             if (StringUtils.isEmpty(data)) {
                 j = j + 1;
-                mergedCell.getComment().getRichText().setText(j + "");
+                mergedCells4[i].getComment().getRichText().setText(j + "");
                 mergedCell.setValue(j + "");
                 Map<String, Integer> dataMap = new HashMap<>();
                 dataMap.put("x1", mergedCell.getRow());
@@ -377,11 +382,16 @@ public class ExcelTabController extends BladeController {
             }
         }
 
+        // 上传excel文件
+        wb2.saveToFile(exceUrl,FileFormat.Version2013);
+
+        BladeFile bladeFile = newIOSSClient.uploadFile(file.getOriginalFilename(),exceUrl);
+
         File writeFile = new File(thmlUrl);
         FileUtil.writeToFile(writeFile, doc1.html(), Boolean.parseBoolean("UTF-8"));
 
         detail.setExtension(file.getOriginalFilename());
-        detail.setFileUrl(bladeFile1.getLink());
+        detail.setFileUrl(bladeFile.getLink());
         detail.setFileType(3); // 表示为清表信息  1 表示祖节点  2 表示为节点信息 3 表示清表
         detail.setHtmlUrl(thmlUrl);
         excelTabService.saveOrUpdate(detail);
@@ -725,6 +735,16 @@ public class ExcelTabController extends BladeController {
             }
         }
 
+        // 远程搜索配置2-设计强度搜索
+        Elements hc2 = doc.select("hc-form-select-search2");
+        if (hc2.size() >= 1) {
+            for (int i = 0; i < hc2.size(); i++) {
+                Element datax = hc2.get(i);
+                datax.removeAttr("contractId");
+                datax.attr("contractId", wbsTreeContract.getContractId());
+            }
+        }
+
         // 标题解决
         ProjectInfo projectInfo = projectInfoService.getById(wbsTreeContract.getProjectId());
         //判断是否是水利水电表,水利水电项目名14,表名12 。   其他表都是18
@@ -919,6 +939,316 @@ public class ExcelTabController extends BladeController {
         File file1 = ResourceUtil.getFile(thmlUrl);
         String htmlString = IoUtil.readToString(new FileInputStream(file1));
 
+        /*
+           解析
+           1 解析样式
+           2 计算坐标
+           3 计算区域位置
+         */
+        // 样式集合
+        Document doc = Jsoup.parse(htmlString);
+        // 解析 style
+        Map<String, String> styleMap = getHtmlStyle(doc);
+        //解析
+        Element table = doc.select("table").first();
+        Elements trs = table.select("tr");
+        // 获取图片信息
+        Elements imgs = doc.select("img");
+        // 获取总行列数
+        int maxCol = doc.select("Col").size();
+        String[] rowData = new String[trs.size() + 5]; //本来加一的 害怕出现特殊情况 故意 加 5
+
+        // 行的状态
+        boolean index_state = false;
+        // 区域划分表示
+        int xy_type = 1;
+
+        // 解析 excel元素集合
+        List<ExctabCell> colTitle = new ArrayList<>();
+
+//      标题集合信息
+        List<Map<String, String>> zikey = new ArrayList<>();
+        for (int i = 0; i <= trs.size() - 1; i++) {
+            Element tr = trs.get(i);
+            Elements tds = tr.select("td");
+            String xyInof = getTrInfo(tds, styleMap, index_state, xy_type, maxCol, i, zikey);
+            xy_type = Integer.parseInt(xyInof.split(",")[0]);
+            tr.attr("xy_type", xyInof);
+            index_state = Boolean.parseBoolean(xyInof.split(",")[1]);
+
+            boolean istrue = Boolean.parseBoolean(xyInof.split(",")[3]);
+
+            // 计算单元格坐标
+            for (int j = 0; j < tds.size(); j++) {
+                {
+                    Element data = tds.get(j);
+                    int colspan = data.attr("COLSPAN").equals("") ? 0 : Integer.parseInt(data.attr("COLSPAN"));
+                    int rowspan = data.attr("ROWSPAN").equals("") ? 0 : Integer.parseInt(data.attr("ROWSPAN"));
+                    String keyId = data.attr("class");
+                    if (StringUtils.isNotEmpty(keyId)) {
+                        data.removeAttr("class");
+                    }
+
+                    // 计算
+                    int x1 = Integer.parseInt(data.attr("x1"));
+                    int x2 = Integer.parseInt(data.attr("x2"));;
+                    int y1 = Integer.parseInt(data.attr("y1"));;
+                    int y2 = Integer.parseInt(data.attr("y2"));;
+
+                    String textInfo = data.text().trim().replaceAll(" ", "");
+                    System.out.println("-------=="+textInfo);
+
+                    data.text(textInfo.replaceAll(" ", ""));
+                    if (textInfo.indexOf("□") < 0 && !textInfo.isEmpty() && !(textInfo.equals("/") && textInfo.length() < 2) && !(textInfo.indexOf("年") >= 0 && textInfo.indexOf("月") >= 0 && textInfo.indexOf("日") >= 0) && !textInfo.equals("—") && !textInfo.equals("-")) {  // 标题区域
+                        Map<String, String> dataInfo = new HashMap<String, String>();
+                        dataInfo.put("name", textInfo);
+                        dataInfo.put("x1", x1 + "");
+                        dataInfo.put("x2", x2 + "");
+                        dataInfo.put("y1", y1 + "");
+                        dataInfo.put("y2", y2 + "");
+                        dataInfo.put("xytype", xy_type + "");
+                        if (textInfo.indexOf("/") < 0 || (textInfo.indexOf("/") >= 0 && textInfo.length() > 1)) { // 带/为分割数据
+                            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++) {
+                            String name = zikey.get(k).get("name");
+                            int xx1 = Integer.parseInt(zikey.get(k).get("x1"));
+                            int xx2 = Integer.parseInt(zikey.get(k).get("x2"));
+                            int yy1 = Integer.parseInt(zikey.get(k).get("y1"));
+                            int yy2 = Integer.parseInt(zikey.get(k).get("y2"));
+                            int xytype2 = Integer.parseInt(zikey.get(k).get("xytype"));
+
+                            // 左匹配
+                            if (yy1 <= y1 && yy2 >= y2 && xx2 < x1 && xytype2 == xy_type) {
+                                left.add(zikey.get(k));
+                            }
+
+                            //向 上 匹配
+                            if (index_state) {
+                                if (xx1 <= x1 && xx2 >= x2 && yy2 < y1 && xytype2 == xy_type) {
+                                    top.add(zikey.get(k));
+                                }
+                            }
+                        }
+
+                        String inputText = "";
+                        // 特征值赛选 规则
+                        for (int k = 0; k < left.size(); k++) { // 左计算
+                            String name = left.get(k).get("name");
+                            int xx2 = Integer.parseInt(left.get(k).get("x2"));
+                            int yy2 = Integer.parseInt(left.get(k).get("y2"));
+
+                            if (!StringUtil.isNumeric(name) && name.length() <= 20) { // 数字不匹配
+                                if (index_state) { // 正向规则匹配
+                                    if (istrue) { // 是否空格等于值
+                                        if (x1 - xx2 <= 1 && y1 == yy2) {
+                                            inputText = name;
+                                        } else {
+                                            inputText += name + "_";
+                                        }
+                                    } else {
+                                        inputText += name + "_";
+                                    }
+                                } else {
+                                    if (x1 - xx2 <= 1 && y1 == yy2) {
+                                        inputText = name;
+                                    }
+                                }
+                            }
+                        }
+
+                        // 特征值赛选 规则
+                        if (top != null && top.size() >= 1) {
+                            for (int k = 0; k < top.size(); k++) { // 向上计算
+                                String name = top.get(k).get("name");
+                                if (!StringUtil.isNumeric(name) && name.length() <= 20) {
+                                    inputText += name + "_";
+                                }
+                            }
+                        }
+
+                        if (inputText != null && inputText != "" && inputText.indexOf("_") >= 0) {
+                            inputText = inputText.substring(0, inputText.lastIndexOf("_"));
+                        }
+
+                        // 质检表特殊处理匹配
+                        String parm = i + "," + j + "," + x1 + "," + x2 + "," + y1 + "," + y2 + ",$event";
+                        // 设置文本信息
+                        ExctabCell exctabCell = new ExctabCell();
+                        if ((textInfo.indexOf("年") >= 0 && textInfo.indexOf("月") >= 0 && textInfo.indexOf("日") >= 0) || inputText.indexOf("日期") >= 0) {
+                            if (inputText.indexOf("日期") >= 0) {
+                                data.empty().append("<el-date-picker type='date' @keyDowns='dateKeydown()' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder='" + inputText + "'> </el-date-picker>");
+                            } else if (textInfo.indexOf("年") >= 0 && textInfo.indexOf("月") >= 0 && textInfo.indexOf("日") >= 0) {
+                                if (inputText.indexOf("专业监理工程师") >= 0) {
+                                    inputText = "专业监理工程师_年月日";
+                                } else if (inputText.indexOf("质检工程师") >= 0) {
+                                    inputText = "质检工程师_年月日";
+                                } else {
+                                    inputText = "年月日";
+                                }
+                            }
+                            data.empty().append("<el-date-picker @keyDowns='dateKeydown()'  type='date' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder='年月日'> </el-date-picker>");
+                            exctabCell.setTextInfo(inputText);
+                            exctabCell.setExctabId(excelId);
+                            exctabCell.setIsDeleted(0);
+                            exctabCell.setXys(i + "_" + j);
+                            colTitle.add(exctabCell);
+                            data.attr("title", inputText);
+
+                        } else if (textInfo.indexOf("□") >= 0) { //多选框
+                            exctabCell.setTextInfo(inputText);
+                            exctabCell.setExctabId(excelId);
+                            exctabCell.setIsDeleted(0);
+                            exctabCell.setXys(i + "_" + j);
+                            colTitle.add(exctabCell);
+                            data.attr("title", inputText);
+                            // 添加多选框
+
+                            String[] cheText = textInfo.split("□");
+                            JSONArray objs = new JSONArray();
+                            if (cheText != null && cheText.length >= 1) {
+                                int key = 1;
+                                for (String keyval : cheText) {
+                                    JSONObject jsonObject = new JSONObject();
+                                    if (StringUtils.isNotEmpty(keyval)) {
+                                        jsonObject.put("key", key);
+                                        jsonObject.put("name", keyval);
+                                        objs.add(jsonObject);
+                                        keyId += 1;
+                                    }
+                                }
+                            } else {
+                                JSONObject jsonObject = new JSONObject();
+                                jsonObject.put("key", "1");
+                                jsonObject.put("name", "");
+                                objs.add(jsonObject);
+                            }
+
+                            String checkbox = "<hc-form-checkbox-group @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' :objs='" + objs + "'  @change='checkboxGroupChange' @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " placeholder=''> </hc-form-checkbox-group>";
+                            data.empty().append(checkbox);
+                        } else {
+                            if (index_state) { // 区域内
+                                if (rowspan >= 1) {
+                                    data.empty().append("<el-input type='textarea' @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft'  @keydown.shift.right='keyupShiftRight'  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;'   :rows=" + rowspan * 2 + " placeholder=''> </el-input>");
+                                } else {
+                                    data.empty().append("<el-input type='text' @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft'  @keydown.shift.right='keyupShiftRight'  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder=''> </el-input>");
+                                }
+                            } else { // 区域外
+                                if (j == 0) {
+                                    if (colspan == maxCol && i >= 1) {
+                                        if (rowspan >= 1) {
+                                            data.empty().append("<el-input @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' type='textarea'  @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;'   :rows=" + rowspan * 2 + " placeholder=''> </el-input>");
+                                        } else {
+                                            data.empty().append("<el-input @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' type='text' @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder=''> </el-input>");
+                                        }
+                                    }
+                                } else {
+                                    Element bforData = tds.get(j - 1);
+                                    if (!bforData.text().isEmpty() || bforData.html().indexOf("hc-form-checkbox-group") >= 0) {
+                                        if (rowspan >= 1) {
+                                            data.empty().append("<el-input @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' type='textarea' @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;'   :rows=" + rowspan * 2 + " placeholder=''> </el-input>");
+                                        } else {
+                                            data.empty().append("<el-input @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft'  @keydown.shift.right='keyupShiftRight' type='text' @contextmenu.prevent.native='contextmenuClick(" + parm + ")'  @mouseup.right='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder=''> </el-input>");
+                                        }
+                                    }
+                                }
+                            }
+
+                            if (!inputText.equals("")) {
+                                exctabCell.setExctabId(excelId);
+                                exctabCell.setTextInfo(inputText);
+                                if (inputText.contains("日期") || inputText.contains("年") || inputText.contains("月") || inputText.contains("日")) {
+                                    //日期
+                                    exctabCell.setTextElementType(4);
+                                } else if (inputText.indexOf("签字") >= 0) {
+                                    exctabCell.setTextElementType(6);
+                                } else {
+                                    //字符串
+                                    exctabCell.setTextElementType(1);
+                                }
+                                exctabCell.setIsDeleted(0);
+                                exctabCell.setXys(i + "_" + j);
+                                colTitle.add(exctabCell);
+                            }
+                            data.attr("title", inputText);
+                        }
+                    }
+                }
+            }
+        }
+
+        // 去掉重复的数
+        Map<String, String> groupMap2 = colTitle.stream()
+                .collect(Collectors.groupingBy(ExctabCell::getTextInfo, Collectors.mapping(ExctabCell::getXys, Collectors.joining(","))));
+        exctabCellService.DeletExcelByTableId(excelId + "");
+
+        List<ExctabCell> colTitle2 = new ArrayList<>();
+        for (String title : groupMap2.keySet()) {
+            ExctabCell exctabCell = new ExctabCell();
+            exctabCell.setExctabId(excelId);
+            exctabCell.setIsDeleted(0);
+            exctabCell.setTextInfo(title);
+            exctabCell.setCreateTime(new Date());
+
+            if (title.contains("日期") || title.contains("年") || title.contains("月") || title.contains("日")) {
+                //日期
+                exctabCell.setTextElementType(4);
+            } else {
+                //字符串
+                exctabCell.setTextElementType(1);
+            }
+            exctabCell.setXys(groupMap2.get(title));
+            colTitle2.add(exctabCell);
+        }
+        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 + "]");
+
+                    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"));
+    }
+
+    // 上传解析 html
+    public void expailHtmlInfo1111111(String thmlUrl, Long excelId) throws Exception {
+
+        // 读取
+        File file1 = ResourceUtil.getFile(thmlUrl);
+        String htmlString = IoUtil.readToString(new FileInputStream(file1));
+
         /*
            解析
            1 解析样式
@@ -3152,7 +3482,7 @@ public class ExcelTabController extends BladeController {
     @ApiOperation(value = "onlyOffice保存回调", notes = "onlyOffice保存回调")
     @ApiOperationSupport(order = 35)
     @ResponseBody
-    public ExcelEditCallback saveWord(@RequestBody ExcelEditCallback callback) {
+    public ExcelEditCallback callbackSave(@RequestBody ExcelEditCallback callback) {
         return excelTabService.callbackSave(callback);
     }
 
@@ -3265,43 +3595,43 @@ public class ExcelTabController extends BladeController {
 
     @PostMapping("/batchUploadExcelTab")
     @ApiOperationSupport(order = 39)
-    @ApiOperation(value = "批量上传清表", notes = "传入ExcelTabBatchUploadDTO")
-    public R<Object> batchUploadExcelTab(@RequestBody ExcelTabBatchUploadDTO dto) throws IOException {
-        if (ObjectUtil.isEmpty(dto.getId())) {
+    @ApiOperation(value = "批量上传清表", notes = "传入id、fileList")
+    public R<Object> batchUploadExcelTab(@RequestParam Long id, @RequestPart("file") MultipartFile[] file) throws IOException {
+        if (ObjectUtil.isEmpty(id)) {
             throw new ServiceException("获取节点信息失败");
         }
-        if (ObjectUtil.isEmpty(dto.getFileList()) || dto.getFileList().size() <= 0) {
+        if (file.length <= 0) {
             throw new ServiceException("未获取到需要上传的文件信息");
         }
-        ExcelTab excelTabParentNode = excelTabService.getBaseMapper().selectById(dto.getId());
+        ExcelTab excelTabParentNode = excelTabService.getBaseMapper().selectById(id);
         List<ExcelTab> excelTabs = excelTabService.getBaseMapper().selectList(Wrappers.<ExcelTab>lambdaQuery().select(ExcelTab::getSort).eq(ExcelTab::getParentId, excelTabParentNode.getId()));
         Optional<Integer> maxSort = excelTabs.stream().map(ExcelTab::getSort).max(Integer::compare);
         int maxValue = 1;
         if (maxSort.isPresent()) {
             maxValue = maxSort.get();
         }
-        for (ExcelTabFileDTO fileDTO : dto.getFileList()) {
-            if (ObjectUtil.isEmpty(fileDTO.getFileName())) {
+        for (MultipartFile fileDTO : file) {
+            if (ObjectUtil.isEmpty(fileDTO.getOriginalFilename())) {
                 throw new ServiceException("文件名不能为空");
             }
-            if (!this.isExcelFormat(fileDTO.getFileName())) {
+            if (!this.isExcelFormat(fileDTO.getOriginalFilename())) {
                 throw new ServiceException("文件名后缀不是.xlsx或者.xls格式,请重新填写");
             }
-            if (!this.isExcelFile(fileDTO.getFile())) {
-                throw new ServiceException("【" + fileDTO.getFileName() + "】文件不是excel格式文件,上传终止");
+            if (!this.isExcelFile(fileDTO)) {
+                throw new ServiceException("【" + fileDTO.getOriginalFilename() + "】文件不是excel格式文件,上传终止");
             }
             try {
-                R<BladeFile> bladeFile = iossClient.addFileInfo(fileDTO.getFile());
+                R<BladeFile> bladeFile = iossClient.addFileInfo(fileDTO);
                 if (ObjectUtil.isNotEmpty(bladeFile.getData())) {
                     //创建节点,并上传excel文件到节点上
                     ExcelTab excelTabNode = new ExcelTab();
                     excelTabNode.setId(SnowFlakeUtil.getId());
                     excelTabNode.setParentId(excelTabParentNode.getId());
                     excelTabNode.setFileType(excelTabParentNode.getFileType());
-                    excelTabNode.setName(fileDTO.getFileName().split(".xls")[0]);
+                    excelTabNode.setName(fileDTO.getOriginalFilename().split(".xls")[0]);
                     excelTabNode.setAlias(excelTabParentNode.getAlias() + "," + excelTabParentNode.getId());
                     excelTabNode.setFileUrl(bladeFile.getData().getLink());
-                    excelTabNode.setExtension(fileDTO.getFileName());
+                    excelTabNode.setExtension(fileDTO.getOriginalFilename());
                     excelTabNode.setCreateTime(new Date());
                     excelTabNode.setUpdateTime(new Date());
                     excelTabNode.setCreateUser(SecureUtil.getUserId());
@@ -3315,7 +3645,7 @@ public class ExcelTabController extends BladeController {
                     excelTabService.save(excelTabNode);
                 }
             } catch (Exception e) {
-                throw new ServiceException("【" + fileDTO.getFileName() + "】文件上传失败,上传终止" + e.getMessage());
+                throw new ServiceException("【" + fileDTO.getOriginalFilename() + "】文件上传失败,上传终止" + e.getMessage());
             }
         }
         return R.success("操作成功");

+ 128 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/MixProportionInfoController.java

@@ -0,0 +1,128 @@
+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.*;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.dto.MoistureContentDTO;
+import org.springblade.manager.entity.MixProportionInfo;
+import org.springblade.manager.service.IMixProportionInfoService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/mixProportion")
+@Api(value = "试验数据-配合比", tags = "试验数据-配合比")
+public class MixProportionInfoController extends BladeController {
+
+    private final IMixProportionInfoService mixProportionInfoService;
+
+
+    /**
+     * 计算含水率
+     */
+    @PostMapping("/calculateWater")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "计算含水率", notes = "计算含水率")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "key", value = "当前输入框位置", required = true),
+            @ApiImplicitParam(name = "contractId", value = "合同段id", required = true),
+            @ApiImplicitParam(name = "designStrength", value = "设计强度", required = true),
+            @ApiImplicitParam(name = "sand", value = "黄砂含水率", required = false),
+            @ApiImplicitParam(name = "macadamOne", value = "碎石1含水率", required = false),
+            @ApiImplicitParam(name = "macadamTwo", value = "碎石2含水率", required = false),
+            @ApiImplicitParam(name = "macadamThree", value = "碎石3含水率", required = false),
+    })
+    public R calculateWater(@Valid @RequestBody MoistureContentDTO dto) {
+        return mixProportionInfoService.calculateWater(dto);
+    }
+
+
+    /**
+     * 设计强度列表
+     */
+    @GetMapping("/designStrengthList")
+    @ApiOperationSupport(order = 7)
+    @ApiOperation(value = "设计强度列表", notes = "获取合同段下所有设计强度")
+    public R<Map<String,Map<String,String>>> designStrengthList(@RequestParam Long contractId,@RequestParam String key) {
+        Map<String,Map<String,String>> list = mixProportionInfoService.designStrengthList(contractId,key);
+        return R.data(list);
+    }
+
+    /**
+     * 删除 配合比
+     */
+    @GetMapping("/remove")
+    @ApiOperationSupport(order = 7)
+    @ApiOperation(value = "逻辑删除", notes = "传入ids")
+    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+        return R.status(mixProportionInfoService.deleteLogic(Func.toLongList(ids)));
+    }
+
+    /**
+     * 修改 配合比
+     */
+    @PostMapping("/update")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "修改-配合比", notes = "传入mixProportionInfo")
+    public R update(@Valid @RequestBody MixProportionInfo info) {
+        return R.status(mixProportionInfoService.updateById(info));
+    }
+
+    /**
+     * 新增 配合比
+     */
+    @PostMapping("/save")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "新增-配合比", notes = "传入mixProportionInfo")
+    public R save(@Valid @RequestBody MixProportionInfo info) {
+        return R.status(mixProportionInfoService.save(info));
+    }
+
+
+    /**
+     * 自定义分页 原材
+     */
+    @GetMapping("/page")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "分页-配合比", notes = "搜索传入报告编号")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "searchValue", value = "搜索值"),
+            @ApiImplicitParam(name = "projectId", value = "项目id"),
+            @ApiImplicitParam(name = "contractId", value = "合同id", required = true),
+    })
+    public R<IPage<MixProportionInfo>> page(String searchValue, Query query,Long contractId) {
+        IPage<MixProportionInfo> page = new Page<>(query.getCurrent(),query.getSize());
+        IPage<MixProportionInfo> iPage = mixProportionInfoService.page(page, new LambdaQueryWrapper<MixProportionInfo>()
+                .eq(MixProportionInfo::getContractId,contractId)
+                .like(StringUtils.isNotBlank(searchValue),MixProportionInfo::getReportNumber, searchValue));
+        return R.data(iPage);
+    }
+
+    /**
+     * 导入配合比
+     */
+    @PostMapping("importMixProportionInfo")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "导入-配合比", notes = "传入excel")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "file", value = "文件源", required = true),
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+            @ApiImplicitParam(name = "contractId", value = "合同id", required = true),
+    })
+    public R importMixProportionInfo(@RequestParam("file") MultipartFile file,Long projectId,Long contractId) {
+         return mixProportionInfoService.importMixProportionInfo(file,projectId,contractId);
+
+    }
+}

+ 117 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/RawMaterialsInfoController.java

@@ -0,0 +1,117 @@
+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.*;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.excel.util.ExcelUtil;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.entity.RawMaterialsInfo;
+import org.springblade.manager.excel.RawMaterialsInfoExcel;
+import org.springblade.manager.service.IRawMaterialsInfoService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.Valid;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/rawMaterials")
+@Api(value = "试验数据-原材", tags = "试验数据-原材")
+public class RawMaterialsInfoController extends BladeController {
+
+    private final IRawMaterialsInfoService rawMaterialsInfoService;
+
+
+    /**
+     * 删除 原材
+     */
+    @GetMapping("/remove")
+    @ApiOperationSupport(order = 7)
+    @ApiOperation(value = "逻辑删除", notes = "传入ids")
+    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+        return R.status(rawMaterialsInfoService.deleteLogic(Func.toLongList(ids)));
+    }
+
+
+    /**
+     * 修改 原材
+     */
+    @PostMapping("/update")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "修改-原材", notes = "传入rawMaterialsInfo")
+    public R update(@Valid @RequestBody RawMaterialsInfo info) {
+        return R.status(rawMaterialsInfoService.updateById(info));
+    }
+
+
+    /**
+     * 新增 原材
+     */
+    @PostMapping("/save")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "新增-原材", notes = "传入rawMaterialsInfo")
+    public R save(@Valid @RequestBody RawMaterialsInfo info) {
+        return R.status(rawMaterialsInfoService.save(info));
+    }
+
+    /**
+     * 自定义分页 原材
+     */
+    @GetMapping("/page")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "分页-原材", notes = "搜索传入批准文号")
+    public R<IPage<RawMaterialsInfo>> page(String searchValue, Query query,Long contractId) {
+        IPage<RawMaterialsInfo> page = new Page<>(query.getCurrent(),query.getSize());
+        IPage<RawMaterialsInfo> iPage = rawMaterialsInfoService.page(page, new LambdaQueryWrapper<RawMaterialsInfo>()
+                .eq(RawMaterialsInfo::getContractId,contractId)
+                .like(StringUtils.isNotBlank(searchValue),RawMaterialsInfo::getBatchNumber, searchValue));
+        return R.data(iPage);
+    }
+
+
+    /**
+     * 导入原材信息
+     */
+    @PostMapping("/importRawMaterialsInfo")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "导入-原材信息", notes = "传入excel")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "file", value = "文件源", required = true),
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+            @ApiImplicitParam(name = "contractId", value = "合同id", required = true),
+    })
+    public R importRawMaterialsInfo(@RequestParam("file") MultipartFile file,Long projectId,Long contractId) {
+        List<RawMaterialsInfoExcel> list = ExcelUtil.read(file, RawMaterialsInfoExcel.class);
+        if(list!=null && list.size()>=1){
+            List<RawMaterialsInfo> vos = list.stream().map(f -> {
+                RawMaterialsInfo tag = new RawMaterialsInfo();
+                BeanUtil.copy(f,tag);
+                tag.setProjectId(projectId);
+                tag.setContractId(contractId);
+                return tag;
+            }).collect(Collectors.toList());
+            rawMaterialsInfoService.saveBatch(vos);
+            return R.success("导入成功");
+        }else {
+            return R.fail("没有一条数据");
+        }
+    }
+}

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

@@ -341,6 +341,8 @@ public class TextdictInfoController extends BladeController {
             element.removeAttr("style");
         } else if (textdictInfo.getTextId().equals("searchSelect")) { //搜索框
             element.empty().append("<hc-form-select-search id=" + keyname + " @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' type='dap_site_data' :val=" + vmode + " contractId=''  pkeyId='' @change='formRemoteChange' v-model=" + vmode + " 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%' > </hc-form-select-search>");
+        } else if (textdictInfo.getTextId().equals("strengthSearch")){ //强度搜索框
+            element.empty().append("<hc-form-select-search2 id=" + keyname + " @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' type='strength_search' :val=" + vmode + " contractId=''  pkeyId='' @change='formRemoteChange' v-model=" + vmode + " 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%' > </hc-form-select-search2>");
         }
         element.attr("@click", "getInformation(" + oncklickText + ")");
 

+ 37 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -22,7 +22,6 @@ 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.CssSelectorEscaper;
 import org.springblade.manager.utils.ExcelParser;
 import org.springblade.manager.vo.*;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -248,15 +247,40 @@ public class WbsTreeContractController extends BladeController {
             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());
-                try (Workbook workbook = parseExcelFile(inputStream)) {
+                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();
-                    workbook.write(servletOutputStream);
+                    byte[] buffer = new byte[4096];
+                    int bytesRead;
+                    while ((bytesRead = inputStream.read(buffer)) != -1) {
+                        servletOutputStream.write(buffer, 0, bytesRead);
+                    }
                     servletOutputStream.flush();
-                } catch (Exception e) {
-                    e.printStackTrace();
+                    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();
+                    }
                 }
             }
         }
@@ -278,7 +302,7 @@ public class WbsTreeContractController extends BladeController {
             }
         }
         return workbook;
-    }
+    }*/
 
     @PostMapping("/import-excel")
     @ApiOperationSupport(order = 14)
@@ -299,13 +323,6 @@ public class WbsTreeContractController extends BladeController {
         for (Map.Entry<String, String> stringStringEntry : stringStringMap.entrySet()) {
             String value = stringStringEntry.getValue();
             if (StringUtils.isNotEmpty(value)) {
-                /*String escape = CssSelectorEscaper.escape(value);
-                String selectorTitle = "td:containsOwn(" + escape + ")";
-                Elements tdElementsTitle = doc.select(selectorTitle);
-                //如果找到了匹配的<td>元素,说明是固定的标题,跳过当前循环,只保留填写的excel数据
-                if (!tdElementsTitle.isEmpty()) {
-                    continue;
-                }*/
                 String[] split = stringStringEntry.getKey().split("_");
                 int row = Integer.parseInt(split[0]) + 1;
                 int cell = Integer.parseInt(split[1]) + 1;
@@ -374,5 +391,12 @@ public class WbsTreeContractController extends BladeController {
         }
     }
 
+    @PostMapping("/getConcealedWorksNodeTree")
+    @ApiOperationSupport(order = 15)
+    @ApiOperation(value = "获取合同段隐蔽工程节点树", notes = "传入合同段id")
+    public R<List<WbsTreeContractLazyVO>> getConcealedWorksNodeTree(@RequestParam String contractId) {
+        List<WbsTreeContractLazyVO> result = iWbsTreeContractService.getConcealedWorksNodeTree(contractId);
+        return R.data(result);
+    }
 
 }

+ 67 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/excel/MixProportionInfoExcel.java

@@ -0,0 +1,67 @@
+package org.springblade.manager.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *
+ */
+@Data
+@ColumnWidth(16)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class MixProportionInfoExcel implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ExcelProperty(value = "配合比报告编号")
+    private String reportNumber;
+
+    @ExcelProperty(value = "设计强度")
+    private String designStrength;
+
+    @ExcelProperty(value = "水胶比")
+    private String waterBinderRatio;
+
+    @ExcelProperty(value = "水泥")
+    private Double cement ;
+
+    @ExcelProperty(value = "砂")
+    private Double sand;
+
+    @ExcelProperty(value = "碎石1")
+    private Double macadamOne ;
+
+    @ExcelProperty(value = "碎石2")
+    private Double macadamTwo;
+
+    @ExcelProperty(value = "碎石3")
+    private Double macadamThree;
+
+    @ExcelProperty(value = "水")
+    private Double water;
+
+    @ExcelProperty(value = "掺加剂")
+    private Double admixture;
+
+    @ExcelProperty(value = "粉煤灰")
+    private Double coalAsh;
+
+    @ExcelProperty(value = "矿渣粉")
+    private Double slagPowder;
+
+    @ExcelProperty(value = "坍落度")
+    private Double slumps;
+
+    @ExcelProperty(value = "单位体积重")
+    private String bulkDensity;
+
+    @ExcelProperty(value = "28天抗压强度")
+    private Double compressiveStrength;
+
+
+}

+ 40 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/excel/RawMaterialsInfoExcel.java

@@ -0,0 +1,40 @@
+package org.springblade.manager.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *
+ */
+@Data
+@ColumnWidth(16)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class RawMaterialsInfoExcel implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ExcelProperty(value = "材料名称")
+    private String name;
+
+    @ExcelProperty(value = "规格型号")
+    private String specification;
+
+    @ExcelProperty(value = "生产厂商")
+    private String manufacturers;
+
+    @ExcelProperty(value = "存放地点或料厂号")
+    private String storageSite;
+
+    @ExcelProperty(value = "试验批准文号")
+    private String batchNumber;
+
+    @ExcelProperty(value = "准备数量")
+    private Integer total;
+
+
+}

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

@@ -10,5 +10,5 @@ import java.util.Map;
  * @author yangyj
  */
 public interface FormulaStrategy extends IStrategy {
-    void execute(TableElementConverter tec);
+    void execute(FormData cur,TableElementConverter tec);
 }

+ 3 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/FormulaStrategyFactory.java

@@ -2,6 +2,7 @@ package org.springblade.manager.formula;
 
 import lombok.Data;
 import org.springblade.manager.dto.FormData;
+import org.springblade.manager.formula.impl.TableElementConverter;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
@@ -18,8 +19,8 @@ public class FormulaStrategyFactory {
 
     private final List<FormulaStrategy> testStrategyList;
 
-    public List<FormulaStrategy> get(FormData fd) {
-        return testStrategyList.stream().filter(t -> t.accept(fd)).collect(Collectors.toList());
+    public void execute(FormData fd, TableElementConverter tec) {
+         testStrategyList.stream().filter(t -> t.accept(fd)).forEach(t->t.execute(fd,tec));
     }
 
 }

+ 0 - 31
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaA.java

@@ -1,31 +0,0 @@
-package org.springblade.manager.formula.impl;
-
-import com.alibaba.cloud.commons.lang.StringUtils;
-import org.springblade.manager.dto.ElementData;
-import org.springblade.manager.dto.FormData;
-import org.springblade.manager.formula.FormulaStrategy;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author yangyj
- * @Date 2022/7/15 16:13
- * @description TODO
- */
-@Component
-public class FormulaA implements FormulaStrategy {
-    private FormData cur;
-
-    @Override
-    public void execute(TableElementConverter tec) {
-        cur.getValues().add(new ElementData(1, 1, "result_ta"));
-    }
-
-    @Override
-    public boolean accept(FormData fd) {
-        this.cur = fd;
-        return StringUtils.equals("ta", fd.getCode());
-    }
-}

+ 0 - 32
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaB.java

@@ -1,32 +0,0 @@
-package org.springblade.manager.formula.impl;
-
-import com.alibaba.cloud.commons.lang.StringUtils;
-import org.springblade.manager.dto.ElementData;
-import org.springblade.manager.dto.FormData;
-import org.springblade.manager.formula.FormulaStrategy;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author yangyj
- * @Date 2022/7/15 16:13
- * @description TODO
- */
-@Component
-public class FormulaB implements FormulaStrategy {
-    private FormData cur;
-
-    @Override
-    public void execute(TableElementConverter tec) {
-        System.out.println(this.cur.getFormula().getFormula());
-        cur.getValues().add(new ElementData(1, 1, "result_tb"));
-    }
-
-    @Override
-    public boolean accept(FormData fd) {
-        this.cur = fd;
-        return StringUtils.equals("ta", fd.getCode());
-    }
-}

+ 0 - 34
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaC.java

@@ -1,34 +0,0 @@
-package org.springblade.manager.formula.impl;
-
-import cn.hutool.core.bean.BeanUtil;
-import com.alibaba.cloud.commons.lang.StringUtils;
-import org.springblade.manager.dto.ElementData;
-import org.springblade.manager.dto.FormData;
-import org.springblade.manager.formula.FormulaStrategy;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author yangyj
- * @Date 2022/7/15 16:13
- * @description TODO
- */
-@Component
-public class FormulaC implements FormulaStrategy {
-    private FormData cur;
-
-    @Override
-    public void execute(TableElementConverter tec) {
-        System.out.println(this.cur.getFormula().getFormula());
-        cur.getValues().add(new ElementData(1, 1, "result_tc"));
-    }
-
-    @Override
-    public boolean accept(FormData fd) {
-        this.cur = fd;
-        return StringUtils.equals("ta", fd.getCode());
-    }
-
-}

+ 12 - 18
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaMileage.java

@@ -10,14 +10,10 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
 import org.springblade.manager.entity.Formula;
-import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.formula.FormulaStrategy;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.formula.Mileage;
-import org.springframework.context.annotation.Scope;
-import org.springframework.context.annotation.ScopedProxyMode;
 import org.springframework.stereotype.Component;
-import org.springframework.web.context.WebApplicationContext;
 
 import java.util.*;
 import java.util.regex.Pattern;
@@ -30,9 +26,7 @@ import java.util.stream.Collectors;
  */
 @Component
 @Data
-@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
 public class FormulaMileage implements FormulaStrategy {
-    private FormData cur;
     private final MileageClient mileageClient;
     public static final Pattern MILE_ARGS = Pattern.compile("(?<=T\\(com.mixsmart.utils.CustomFunction\\)\\.MILE\\()[^)]+(?=\\))");
     public static final String ZH = "桩号";
@@ -44,12 +38,12 @@ public class FormulaMileage implements FormulaStrategy {
     public static final String DX = "dx";
     public static final String DY = "dy";
     public static final String DS = "ds";
+    public static final String F_DEV="WP['G10pcfw']";
     public static final List<String> KEYS = new ArrayList<>(Arrays.asList(ZH, PW, SJX, SJY, SCX, SCY, DX, DY, DS));
-    private List<String> relyList;
 
 
     @Override
-    public void execute(TableElementConverter tec) {
+    public void execute(FormData cur,TableElementConverter tec) {
         List<String> relyList = cur.getFormula().getRelyList();
         if (relyList.size() < KEYS.size()) {
             tec.getLog().append(cur.getEName()).append("不满足依赖");
@@ -97,17 +91,18 @@ public class FormulaMileage implements FormulaStrategy {
             Map<String, String[]> coordinateMap = mileageClient.mileage2Coordinate(zhpw, Func.toLong(tec.getContractId()));
             /*G10缓存对象*/
             if (coordinateMap.size() > 0) {
+                String dev= Optional.ofNullable(Expression.parse(F_DEV).calculate(tec.getConstantMap())).map(Object::toString).orElse(cur.getFormula().getDev());
+                if (StringUtils.isEmpty(dev)) {
+                    dev = Mileage.DEV;
+                }
+                String finalDev = dev;
                 mileageList.forEach(m -> {
                     String[] coordinate = coordinateMap.get(m.getZhPw());
                     if (coordinate != null) {
                         m.setSjx(coordinate[0]);
                         m.setSjy(coordinate[1]);
                         if (m.isEmptyDev()) {
-                            String dev = cur.getFormula().getDev();
-                            if (StringUtils.isEmpty(dev)) {
-                                dev = Mileage.DEV;
-                            }
-                            Map<String, Object> xyz = FormulaUtils.triangleSquare(dev);
+                            Map<String, Object> xyz = FormulaUtils.triangleSquare(finalDev);
                             m.setDx(xyz.get("X").toString());
                             m.setDy(xyz.get("Y").toString());
                             m.setDs(xyz.get("Z").toString());
@@ -137,10 +132,10 @@ public class FormulaMileage implements FormulaStrategy {
         }
     }
 
-    public void write(LinkedHashMap<String, ElementData> row, List<Object> data, List<String> keys, List<String> scale3) {
+    public void write(LinkedHashMap<String, ElementData> row, List<Object> data, List<String> keys, List<String> scale3,List<String> relyList) {
         if (ListUtils.isNotEmpty(data)) {
             keys.forEach(k -> {
-                ElementData elt = row.get(c(k));
+                ElementData elt = row.get(c(k,relyList));
                 /*这里只单纯写人内容,插入的其他属性在获取的时候已经准备好*/
                 if (elt.isEmpty()) {
                     if (scale3.contains(k)) {
@@ -154,11 +149,11 @@ public class FormulaMileage implements FormulaStrategy {
     }
 
 
-    private String c(String name) {
+    private String c(String name,List<String> relyList) {
         if (Func.isNotEmpty(name) && Func.isNotEmpty(KEYS)) {
             int index = KEYS.indexOf(name);
             if (index >= 0) {
-                return this.relyList.get(index);
+                return relyList.get(index);
             }
         }
         return null;
@@ -180,7 +175,6 @@ public class FormulaMileage implements FormulaStrategy {
         if (!fd.verify()) {
             return false;
         }
-        this.cur = fd;
         Formula f = fd.getFormula();
         return "MILE".equals(f.getNumber());
     }

+ 13 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaTurnPoint.java

@@ -31,12 +31,11 @@ import static org.springblade.manager.formula.TurnPoint.*;
  */
 @Component
 @Data
-@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
 public class FormulaTurnPoint implements FormulaStrategy {
     public static final String TURN_REG = "(?<=T\\(com.mixsmart.utils.CustomFunction\\).TURNPOINT\\()([^)]+)(?=\\))";
-    private FormData cur;
+//    private FormData cur;
     static final List<String> KEYS;
-    private List<String> args;
+//    private List<String> args;
     /**从节点参数获取G8偏差范围的公式脚本*/
     static final String F_DEV="WP['g8pcfw']";
 
@@ -45,12 +44,13 @@ public class FormulaTurnPoint implements FormulaStrategy {
     }
 
     @Override
-    public void execute(TableElementConverter tec) {
+    public void execute(FormData cur,TableElementConverter tec) {
         cur.setFinished(Boolean.TRUE);
         LinkedHashMap<String, FormData> dataSourceMap = new LinkedHashMap<>();
         String funArgs = ReUtil.getGroup1(TURN_REG, cur.getFormula().getFormula());
+        List<String> args=new ArrayList<>();
         if (StringUtils.isNotEmpty(funArgs)) {
-            this.args = new ArrayList<>(Arrays.asList(funArgs.split(",")));
+            args = new ArrayList<>(Arrays.asList(funArgs.split(",")));
             args = args.stream().map(k -> k.replaceAll("[(E\\[)'\\]]", "")).collect(Collectors.toList());
         }
         if (Func.isNotEmpty(args)) {
@@ -67,10 +67,10 @@ public class FormulaTurnPoint implements FormulaStrategy {
             /*用来映射元素*/
             LinkedHashMap<String, String> configMap = new LinkedHashMap<>(KEYS.size() * 2);
             for (int i = 0; i < KEYS.size(); i++) {
-                configMap.put(KEYS.get(i), this.args.get(i));
+                configMap.put(KEYS.get(i), args.get(i));
             }
             /*原始数据转ListMap*/
-            List<Map<String, Object>>  tableData=listMaps( tec, dataSourceMap,configMap);
+            List<Map<String, Object>>  tableData=listMaps( cur,tec, dataSourceMap,configMap,args);
             /*数据分组*/
             List<List<Map<String, Object>>> total = group(tableData);
            /* 分组计算*/
@@ -78,7 +78,7 @@ public class FormulaTurnPoint implements FormulaStrategy {
             /*附加属性如:顶面和底面高程判断*/
             forG8(result.stream().flatMap(Collection::stream).collect(Collectors.toList()), (Map<String, Object>)tec.getConstantMap().computeIfAbsent("G8", k -> new HashMap<>()),tec);
            /*插值分页*/
-            List<Object> data = paginate(result,configMap);
+            List<Object> data = paginate(cur,result,configMap);
             /*数据回写*/
             write(data,dataSourceMap,configMap.size());
 
@@ -86,7 +86,7 @@ public class FormulaTurnPoint implements FormulaStrategy {
     }
 
 
-    public List<Object> paginate( List<List<TurnPoint>> result,LinkedHashMap<String, String> configMap){
+    public List<Object> paginate( FormData cur,List<List<TurnPoint>> result,LinkedHashMap<String, String> configMap){
         int rowSize= cur.getCoordsList().size();
         List<Object> data = new ArrayList<>();
         for(List<TurnPoint> turnPoints:result){
@@ -99,7 +99,7 @@ public class FormulaTurnPoint implements FormulaStrategy {
         return data;
     }
 
-    private List<Map<String, Object>> listMaps(TableElementConverter tec,LinkedHashMap<String, FormData> dataSourceMap,LinkedHashMap<String, String> configMap){
+    private List<Map<String, Object>> listMaps(FormData cur,TableElementConverter tec,LinkedHashMap<String, FormData> dataSourceMap,LinkedHashMap<String, String> configMap,List<String> args){
         CompositeDataAccess cda = new CompositeDataAccess(dataSourceMap);
         List<Map<String, Object>> tableData = new ArrayList<>();
         List<Long> tableInfoIds = tec.getKeyMappers().stream().filter(k -> k.getTableName().equals(cur.getTableName())).map(KeyMapper::getPkId).distinct().collect(Collectors.toList());
@@ -107,7 +107,7 @@ public class FormulaTurnPoint implements FormulaStrategy {
             LinkedHashMap<String, ElementData> map = cda.next();
                 Map<String, Object> tmp = new HashMap<>(16);
                 KEYS.forEach(k -> {
-                    ElementData ed = map.get(c(k));
+                    ElementData ed = map.get(c(k,args));
                     tmp.put(configMap.get(k), ed.stringValue());
                     /*V判断*/
                     if (CD.equals(k)) {
@@ -228,8 +228,8 @@ public class FormulaTurnPoint implements FormulaStrategy {
         });
     }
 
-    private String c(String name) {
-        if (Func.isNotEmpty(name) && Func.isNotEmpty(this.args)) {
+    private String c(String name,List<String> args) {
+        if (Func.isNotEmpty(name) && Func.isNotEmpty(args)) {
             int index = KEYS.indexOf(name);
             if (index < args.size()) {
                 return args.get(index);
@@ -240,7 +240,6 @@ public class FormulaTurnPoint implements FormulaStrategy {
 
     @Override
     public boolean accept(FormData fd) {
-        this.cur = fd;
         Formula f = fd.getFormula();
         return StringUtils.isEquals(f.getNumber(), "TURN_POINT");
     }

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/SubTable.java

@@ -93,6 +93,7 @@ public class SubTable {
                 FormulaUtils.write(design, designList, true);
                 design.setUpdate(1);
             }
+
             FormulaUtils.write(data, dataList, true);
             itemName.setUpdate(1);
             data.setUpdate(1);

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

@@ -396,7 +396,7 @@
         FROM m_archive_tree_contract matc1
         WHERE  matc1.parent_id in (select id from m_archive_tree_contract
                             WHERE parent_id = (select id from m_archive_tree_contract WHERE parent_id = 0 and project_id = #{projectId} and is_deleted = 0)
-                              and tree_code is NULL)
+                              and is_deleted = 0 and tree_code is NULL)
           and matc1.is_deleted = 0
     </select>
 

+ 44 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/MixProportionInfoMapper.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.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.MapKey;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.business.entity.ArchiveFile;
+import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.entity.MixProportionInfo;
+import org.springblade.manager.vo.ArchiveTreeContractVO;
+import org.springblade.manager.vo.ArchiveTreeContractVO2;
+import org.springblade.manager.vo.ArchiveTreeContractVO3;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author 00
+ * @since 2023-02-18
+ */
+public interface MixProportionInfoMapper extends BaseMapper<MixProportionInfo> {
+
+    List<String> designStrengthList(@Param("contractId") Long contractId);
+
+    Integer compareInfo(@Param("number") Set<String> number,@Param("strength") Set<String> strength,@Param("contractId") Long contractId);
+}

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

@@ -0,0 +1,24 @@
+<?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.MixProportionInfoMapper">
+
+
+
+    <select id="compareInfo" resultType="java.lang.Integer">
+        select count(1)
+        from m_mix_proportion_info
+        WHERE is_deleted = 0 and report_number in
+        <foreach collection="number" item="n" open="(" separator="," close=")">
+            #{n}
+        </foreach>
+        or
+        <foreach collection="strength" item="s" open="(" separator="," close=")">
+            #{s}
+        </foreach>
+    </select>
+    <select id="designStrengthList" resultType="java.lang.String">
+        select design_strength
+        from m_mix_proportion_info
+        WHERE is_deleted = 0 and contract_id = #{contractId}
+    </select>
+</mapper>

+ 30 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/RawMaterialsInfoMapper.java

@@ -0,0 +1,30 @@
+/*
+ *      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.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.manager.entity.MixProportionInfo;
+import org.springblade.manager.entity.RawMaterialsInfo;
+
+/**
+ * @author 00
+ * @since 2023-02-18
+ */
+public interface RawMaterialsInfoMapper extends BaseMapper<RawMaterialsInfo> {
+
+}

+ 6 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/RawMaterialsInfoMapper.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.RawMaterialsInfoMapper">
+
+
+</mapper>

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

@@ -198,6 +198,7 @@
             update_user        = #{wbsTP.updateUser},
             update_time        = #{wbsTP.updateTime},
             mix_ratio_test_ids = #{wbsTP.mixRatioTestIds},
+            is_concrete        = #{wbsTP.isConcrete},
             status             = 1,
             is_deleted         = 0
         where p_key_id = #{pKeyId}

+ 23 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IMixProportionInfoService.java

@@ -0,0 +1,23 @@
+package org.springblade.manager.service;
+
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.core.tool.api.R;
+import org.springblade.manager.dto.MoistureContentDTO;
+import org.springblade.manager.entity.MixProportionInfo;
+import org.springblade.manager.entity.RawMaterialsInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public interface IMixProportionInfoService extends BaseService<MixProportionInfo> {
+
+    Map<String, Map<String,String>> designStrengthList(Long contractId,String key);
+
+    Integer compareInfo(Set<String> number, Set<String> strength, Long contractId);
+
+    R importMixProportionInfo(MultipartFile file, Long projectId, Long contractId);
+
+    R calculateWater(MoistureContentDTO dto);
+}

+ 16 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IRawMaterialsInfoService.java

@@ -0,0 +1,16 @@
+package org.springblade.manager.service;
+
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.manager.dto.ArchiveTreeContractAutoRuleMapDTO;
+import org.springblade.manager.dto.ArchiveTreeDTO;
+import org.springblade.manager.dto.ArchiveTreeSortDTO;
+import org.springblade.manager.entity.ArchiveTree;
+import org.springblade.manager.entity.RawMaterialsInfo;
+import org.springblade.manager.vo.ArchiveTreeVO2;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IRawMaterialsInfoService extends BaseService<RawMaterialsInfo> {
+
+}

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

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

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

@@ -595,9 +595,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             try {
                 //获取onlyOffice缓存中的文件流
                 URL url = new URL(downloadUri);
-                String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+                String file_path = FileUtils.getSysLocalFileUrl();
                 String filecode = SnowFlakeUtil.getId() + "";
-                String dataUrl = file_path + "/excel/" + filecode + ".pdf";
+                String dataUrl = file_path + "/excel/" + filecode + ".xlsx";
                 java.net.HttpURLConnection connection = (java.net.HttpURLConnection) url.openConnection();
                 connection.setRequestMethod("GET");
                 connection.setConnectTimeout(5 * 1000);
@@ -627,9 +627,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 excelTab.setFileUrl(bladeFile.getLink());
                 baseMapper.updateById(excelTab);
                 File file = new File(dataUrl);
-                if (file.exists()) {
+               /* if (file.exists()) {
                     file.delete();
-                }
+                }*/
                 System.out.println("123456");
             } catch (Exception e) {
                 editCallback.setError(1);

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

@@ -152,14 +152,10 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         CurrentNode one=this.tec.getCurrentNode();
         tec.formDataList=list;
         keyWord(tec.constantMap);
-     /*   ContractInfo info =this.contractInfoService.getById(tec.getContractId());
-        ProjectInfo pji=this.projectInfoService.getById(tec.getProjectId());*/
+
         /*wbs节点链*/
         if(ExecuteType.INSPECTION.equals(tec.getExecuteType())) {
-          /*  List<WbsTreeContract> nodes = wpService.chain(tec.getContractId(), one.getId(), one.getPkId(), null);
-            if (Func.isEmpty(nodes)) {
-                nodes = wpService.chain(tec.getContractId(), one.getRelateId(), one.getPkId(), null);
-            }*/
+
             List<WbsTreeContract> nodes = wpService.tracing(one.getPkId());
             if (Func.isEmpty(nodes)) {
                 this.tec.getLog().append("【WBS信息缺失】");
@@ -171,7 +167,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             List<AppWbsTreeContractVO> tableList =wbsTreeContractService.searchNodeAllTable(one.getPkId().toString(), "1", tec.getContractId().toString(),tec.getProjectId().toString());
             tec.constantMap.put(TABLE_LIST,tableList);
             /*监表质量附件,过滤掉隐藏表格*/
-            tec.constantMap.put("tableNames",tableList.stream().filter(e->StringUtils.isEquals(e.getIsBussShow(),1)).map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
+            tec.constantMap.put("tableNames",tableList.stream().filter(e->StringUtils.isEquals(e.getIsBussShow(),1)&&StringUtils.isNotEquals(e.getTableType(),4)).map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
 /*
             tec.constantMap.put("tableNames",tableList.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
 */
@@ -668,7 +664,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         for(FormData fd:tec.formDataList) {
             try {
                 if(Func.isNotEmpty(fd.getFormula())) {
-                    formulaStrategyFactory.get(fd).forEach(e -> e.execute(tec));
+                    formulaStrategyFactory.execute(fd,tec);
                 }
             }catch (Exception e){
                 tec.getLog().append("【特殊公式:").append(fd.getEName()).append(fd.getFormula().getNumber()).append("执行异常】");
@@ -950,13 +946,13 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     if(designFdOp.isPresent()){
                         key+="@"+designFdOp.get().getValues().stream().map(ElementData::getValue).filter(StringUtils::isNotEmpty).findAny().orElse("");
                     }
-                    sta.put(key,setScale(2,overList));
+                    sta.put(key,FormulaUtils.setScale(null,overList));
                 });
                 if(sta.checked()){
                     /*把附表数据刷入对应的附表元素对象*/
                     sta.flush();
                 }
-                String mainTableName = this.tec.getTableAll().stream().filter(e -> e.getNodeName().contains("检验单") || e.getTableType().equals(5)).map(NodeTable::getInitTableName).findFirst().orElse("");
+                String mainTableName = this.tec.getTableAll().stream().filter(e -> e.getTableType().equals(1) || e.getTableType().equals(5)).map(NodeTable::getInitTableName).findFirst().orElse("");
                 if(Func.isNotBlank(mainTableName)){
                     List<FormData> sourceFds=tec.getFormDataMap().values().stream().filter(s->!s.empty()).filter(s->StringUtils.isEquals(s.getTableName(),mainTableName)).collect(Collectors.toList());
                     Map<String,Object> copyMap= new HashMap<>();
@@ -1207,13 +1203,13 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
    }
 
 
-public  List<ElementData> setScale(Integer scale,List<ElementData> data){
+/*public  List<ElementData> setScale(Integer scale,List<ElementData> data){
     if(scale==null){
         scale=StringUtils.getScale(data.stream().map(ElementData::getValue).filter(StringUtils::isDouble).collect(Collectors.toList()));
     }
     Integer finalScale = scale;
     return data.stream().peek(e->{if(StringUtils.isDouble(e.getValue())){e.setValue(StringUtils.number2StringZero(e.getValue(),finalScale));}}).collect(Collectors.toList());
-}
+}*/
 
     @Override
     public void format() {
@@ -1223,7 +1219,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                 /*保留小数位*/
                 if(fd.getFormula()!=null&&!fd.empty()&&fd.getValues().stream().map(ElementData::getValue).anyMatch(StringUtils::isNumber)){
                     Formula f = fd.getFormula();
-                    fd.setValues(setScale(f.getScale(),fd.getValues()));
+                    fd.setValues(FormulaUtils.setScale(f.getScale(),fd.getValues()));
                 }
             }
         }
@@ -1511,10 +1507,10 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                  }
                  if(f.contains(".option")){
                      /*FC.optionC?是无法嵌套的函数*/
-                     Matcher m = RegexUtils.matcher(FC_REG+"(optionC?)\\(([^)]+)\\)",f);
+                     Matcher m = RegexUtils.matcher(FC_REG+"optionC?\\(([^)(]+),",f);
                      while (m.find()){
-                       String[] args= m.group(2).split(",");
-                       String flag=args[0];
+                     /*  String[] args= m.group(2).split(",");*/
+                       String flag=m.group(1);
                        /*radio控件,结果只有两个0,1 ,结果作为标识位,且为1才会执第二个参数的回调方法*/
                        if("OPTION".equals(flag)){
                            Optional<KeyMapper> kOp=tec.getKeyMappers().stream().filter(e->StringUtils.isEquals(e.getCode(),fd.getCode())).findFirst();
@@ -1533,10 +1529,12 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                            /*默认0*/
                            flag="0";
                        }
+                         String methodName = new Object(){}.getClass().getEnclosingMethod().getName();
                        if(StringUtils.isEquals(flag,1)){
-                           f=f.replace(m.group(),args[1]);
+                           f=f.replace(m.group(),"").replaceAll("\\)$","");
                        }else{
-                           f=f.replace(m.group(),"''");
+                           fd.setFinished(Boolean.TRUE);
+                           f="''";
                        }
                      }
                  }

+ 198 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/MixProportionInfoServiceImpl.java

@@ -0,0 +1,198 @@
+package org.springblade.manager.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import javassist.runtime.DotClass;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.common.utils.ForestNodeMergerEx;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.excel.util.ExcelUtil;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.constant.BladeConstant;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.dto.ArchiveTreeContractAutoRuleMapDTO;
+import org.springblade.manager.dto.ArchiveTreeDTO;
+import org.springblade.manager.dto.ArchiveTreeSortDTO;
+import org.springblade.manager.dto.MoistureContentDTO;
+import org.springblade.manager.entity.ArchiveAutoRuleWbs;
+import org.springblade.manager.entity.ArchiveTree;
+import org.springblade.manager.entity.MixProportionInfo;
+import org.springblade.manager.entity.ProjectInfo;
+import org.springblade.manager.excel.MixProportionInfoExcel;
+import org.springblade.manager.mapper.ArchiveAutoRuleWbsMapper;
+import org.springblade.manager.mapper.ArchiveTreeMapper;
+import org.springblade.manager.mapper.MixProportionInfoMapper;
+import org.springblade.manager.service.*;
+import org.springblade.manager.utils.DiffListUtil;
+import org.springblade.manager.utils.ForestNodeMerger;
+import org.springblade.manager.vo.ArchiveTreeAutoRuleVO;
+import org.springblade.manager.vo.ArchiveTreeVO2;
+import org.springblade.manager.vo.WbsTreeVO2;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+public class MixProportionInfoServiceImpl extends BaseServiceImpl<MixProportionInfoMapper, MixProportionInfo> implements IMixProportionInfoService {
+
+
+    @Override
+    public Map<String,Map<String,String>> designStrengthList(Long contractId,String key) {
+        //查询当前合同段所有的设计强度
+        List<String> list = baseMapper.designStrengthList(contractId);
+        if (list == null || list.size() <= 0){
+            return null;
+        }
+        Map<String,Map<String,String>> map = new HashMap<>();
+        //包装返回值
+        for (String l : list) {
+            Map<String,String> m = new HashMap<>();
+            m.put(key,l);
+            map.put(l,m);
+        }
+        return map;
+    }
+
+    @Override
+    public Integer compareInfo(Set<String> number, Set<String> strength, Long contractId) {
+        return baseMapper.compareInfo(number,strength,contractId);
+    }
+
+    @Override
+    public R importMixProportionInfo(MultipartFile file, Long projectId, Long contractId) {
+        List<MixProportionInfoExcel> list = ExcelUtil.read(file, MixProportionInfoExcel.class);
+        if(list!=null && list.size()>=1){
+            Set<String> number = new HashSet<>();
+            Set<String> strength = new HashSet<>();
+            //校验数据
+            for (MixProportionInfoExcel excel : list) {
+                if (org.apache.commons.lang.StringUtils.isNotBlank(excel.getReportNumber())){
+                    number.add(excel.getReportNumber());
+                }else {
+                    throw new ServiceException("文件中缺少配合比报告编号,请修改后重新导入");
+                }
+
+                if (StringUtils.isNotBlank(excel.getDesignStrength())){
+                    strength.add(excel.getDesignStrength());
+                }else {
+                    throw new ServiceException("文件中缺少设计强度,请修改后重新导入");
+                }
+            }
+            if (number.size() != list.size()){
+                throw new ServiceException("文件中配合比报告编号重复,请修改后重新导入");
+            }
+            if (strength.size() != list.size()){
+                throw new ServiceException("文件中设计强度重复,请修改后重新导入");
+            }
+            //判断是否存在相同的配合比编号,和设计强度
+            Integer infos = this.compareInfo(number,strength,contractId);
+            if (infos != 0){
+                throw new ServiceException("文件数据与现有数据重复,请修改后重新导入");
+            }
+
+            List<MixProportionInfo> vos = list.stream().map(f -> {
+                MixProportionInfo tag = new MixProportionInfo();
+                BeanUtil.copy(f,tag);
+                tag.setProjectId(projectId);
+                tag.setContractId(contractId);
+                return tag;
+            }).collect(Collectors.toList());
+            this.saveBatch(vos);
+            return R.success("导入成功");
+        }else {
+            return R.fail("没有一条数据");
+        }
+    }
+
+    /**
+     * 计算含水率
+     * @param dto
+     * @return
+     */
+    @Override
+    public R calculateWater(MoistureContentDTO dto) {
+        if (StringUtils.isBlank(dto.getDesignStrength())){
+            throw new ServiceException("请先选择设计强度");
+        }
+        //获取位置前缀后缀
+        String prefix= dto.getKey().replaceAll("__[\\d_]+", "");
+        String suffix = dto.getKey().replaceAll("key_\\d+__", "");
+        String[] split = suffix.split("_");
+        String s1 = split[0];
+        Integer s2 = Integer.parseInt(split[1]);
+        //结果集
+        Map<String,BigDecimal> map = new HashMap<>();
+        //获取配合比信息
+        MixProportionInfo info = this.getOne(new LambdaQueryWrapper<MixProportionInfo>()
+                .eq(MixProportionInfo::getContractId,dto.getContractId())
+                .eq(MixProportionInfo::getDesignStrength,dto.getDesignStrength()));
+        if (info == null){
+            throw new ServiceException("获取配合比信息失败");
+        }
+        //含水量计算
+        BigDecimal sand = new BigDecimal(0);
+        BigDecimal macadamOne = new BigDecimal(0);
+        BigDecimal macadamTwo = new BigDecimal(0);
+        BigDecimal macadamThree = new BigDecimal(0);
+        //黄砂
+        if (dto.getSand() != null) {
+            sand = dto.getSand().divide(new BigDecimal(100)).multiply(info.getSand());
+            //黄砂
+            BigDecimal sand2 = info.getSand().add(sand);
+            map.put(prefix + "__" + s1 + "_" + (s2 + 1), 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);
+        }
+        //碎石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);
+        }
+        //碎石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);
+        }
+
+        //施工配合比计算
+        //水泥
+        BigDecimal cement = info.getCement();
+        map.put(prefix + "__" +s1 + "_" +(s2),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);
+        }
+        //掺加剂
+        BigDecimal admixture = info.getAdmixture();
+        map.put(prefix + "__" +s1 + "_" +(s2+6),admixture);
+        //粉煤灰
+        BigDecimal coalAsh = info.getCoalAsh();
+        map.put(prefix + "__" +s1 + "_" +(s2+7),coalAsh);
+        //矿渣粉
+        BigDecimal slagPowder = info.getSlagPowder();
+        map.put(prefix + "__" +s1 + "_" +(s2+8),slagPowder);
+        return R.data(map);
+    }
+}

+ 18 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/RawMaterialsInfoServiceImpl.java

@@ -0,0 +1,18 @@
+package org.springblade.manager.service.impl;
+
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.manager.entity.MixProportionInfo;
+import org.springblade.manager.entity.RawMaterialsInfo;
+import org.springblade.manager.mapper.MixProportionInfoMapper;
+import org.springblade.manager.mapper.RawMaterialsInfoMapper;
+import org.springblade.manager.service.IMixProportionInfoService;
+import org.springblade.manager.service.IRawMaterialsInfoService;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class RawMaterialsInfoServiceImpl extends BaseServiceImpl<RawMaterialsInfoMapper, RawMaterialsInfo> implements IRawMaterialsInfoService {
+
+
+}

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

@@ -667,7 +667,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         }
                     }
                     //获取当前层懒加载节点
-                    List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query("select p_key_id,(SELECT id FROM u_contract_tree_drawings where process_id = p_key_id) AS drawingsId,id,parent_id,node_type,type,wbs_type,major_data_type,partition_code,old_id,contract_id_relation,is_concealed_works_node,CASE (SELECT count(1) FROM u_tree_contract_first AS tcf WHERE tcf.is_deleted = 0 AND tcf.wbs_node_id = a.p_key_id) WHEN 0 THEN 'false' ELSE 'true' END AS isFirst,IFNULL(if(length(trim(full_name))>0,full_name,node_name),node_name) AS title,(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.type = 1 and b.status = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 ) AS hasChildren from m_wbs_tree_contract a where a.node_type != 111 and a.type = 1 and a.status = 1 and a.is_deleted = 0 and parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " and contract_id = " + contractId + " ORDER BY a.sort,title,a.create_time", new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
+                    List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query("select p_key_id,(SELECT id FROM u_contract_tree_drawings where process_id = p_key_id) AS drawingsId,id,parent_id,node_type,type,wbs_type,is_concrete,major_data_type,partition_code,old_id,contract_id_relation,is_concealed_works_node,CASE (SELECT count(1) FROM u_tree_contract_first AS tcf WHERE tcf.is_deleted = 0 AND tcf.wbs_node_id = a.p_key_id) WHEN 0 THEN 'false' ELSE 'true' END AS isFirst,IFNULL(if(length(trim(full_name))>0,full_name,node_name),node_name) AS title,(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.type = 1 and b.status = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 ) AS hasChildren from m_wbs_tree_contract a where a.node_type != 111 and a.type = 1 and a.status = 1 and a.is_deleted = 0 and parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " and contract_id = " + contractId + " ORDER BY a.sort,title,a.create_time", new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
                     if (lazyNodes.size() > 0 && nodesAll.size() > 0) {
                         //所有节点
                         List<WbsTreeContractLazyVO> distinctNodesAll = nodesAll.stream()
@@ -950,6 +950,23 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return null;
     }
 
+    @Override
+    public List<WbsTreeContractLazyVO> getConcealedWorksNodeTree(String contractId) {
+        List<WbsTreeContract> wbsTreeContracts = this.getBaseMapper().selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                .select(WbsTreeContract::getId,WbsTreeContract::getPKeyId,WbsTreeContract::getParentId,WbsTreeContract::getNodeType,
+                        WbsTreeContract::getType,WbsTreeContract::getWbsType,WbsTreeContract::getMajorDataType,WbsTreeContract::getPartitionCode,
+                        WbsTreeContract::getOldId,WbsTreeContract::getContractIdRelation,WbsTreeContract::getIsConcealedWorksNode,WbsTreeContract::getIsConcrete
+                )
+                .eq(WbsTreeContract::getContractId, contractId).eq(WbsTreeContract::getIsConcealedWorksNode, 1));
+        List<WbsTreeContract> distinctWbsTreeContracts = wbsTreeContracts.stream()
+                .distinct()
+                .collect(Collectors.toList());
+
+        //TODO
+
+        return null;
+    }
+
     /**
      * 批量修改合同段表单sort
      *

+ 52 - 40
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -1382,16 +1382,19 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
                     //构造
-                    List<WbsTree> resultDataList = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, addPublicTables.stream().map(WbsTree::getId).collect(Collectors.toList())));
-                    for (WbsTree tree : resultDataList) {
-                        WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
-                        if (dataPrivate != null) {
-                            dataPrivate.setPKeyId(SnowFlakeUtil.getId());
-                            dataPrivate.setWbsType(wbsTreePrivate.getWbsType());
-                            dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
-                            dataPrivate.setFullName(dataPrivate.getNodeName());
-                            dataPrivate.setInitTableId(tree.getInitTableId().toString());
-                            insertDataPrivateList.add(dataPrivate);//新增
+                    List<Long> ids = addPublicTables.stream().map(WbsTree::getId).collect(Collectors.toList());
+                    if (ids.size() > 0) {
+                        List<WbsTree> resultDataList = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, ids));
+                        for (WbsTree tree : resultDataList) {
+                            WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                            if (dataPrivate != null) {
+                                dataPrivate.setPKeyId(SnowFlakeUtil.getId());
+                                dataPrivate.setWbsType(wbsTreePrivate.getWbsType());
+                                dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
+                                dataPrivate.setFullName(dataPrivate.getNodeName());
+                                dataPrivate.setInitTableId(tree.getInitTableId().toString());
+                                insertDataPrivateList.add(dataPrivate);//新增
+                            }
                         }
                     }
 
@@ -1443,16 +1446,19 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
                     //构造
-                    List<WbsTreePrivate> resultDataList = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getPKeyId, addPrivateTables.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList())));
-                    for (WbsTreePrivate tree : resultDataList) {
-                        WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
-                        if (dataPrivate != null) {
-                            dataPrivate.setPKeyId(SnowFlakeUtil.getId());
-                            dataPrivate.setWbsId(wbsTreePrivate.getWbsId());
-                            dataPrivate.setWbsType(tree.getWbsType());
-                            dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
-                            dataPrivate.setInitTableId(tree.getInitTableId());
-                            insertDataPrivateList.add(dataPrivate);
+                    List<Long> ids = addPrivateTables.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+                    if (ids.size() > 0) {
+                        List<WbsTreePrivate> resultDataList = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getPKeyId, ids));
+                        for (WbsTreePrivate tree : resultDataList) {
+                            WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                            if (dataPrivate != null) {
+                                dataPrivate.setPKeyId(SnowFlakeUtil.getId());
+                                dataPrivate.setWbsId(wbsTreePrivate.getWbsId());
+                                dataPrivate.setWbsType(tree.getWbsType());
+                                dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
+                                dataPrivate.setInitTableId(tree.getInitTableId());
+                                insertDataPrivateList.add(dataPrivate);
+                            }
                         }
                     }
                 }
@@ -1504,16 +1510,19 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
                     //构造
-                    List<WbsTree> resultDataList = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, addPublicTables.stream().map(WbsTree::getId).collect(Collectors.toList())));
-                    for (WbsTree tree : resultDataList) {
-                        WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
-                        if (dataPrivate != null) {
-                            dataPrivate.setPKeyId(SnowFlakeUtil.getId());
-                            dataPrivate.setWbsType(wbsTreePrivate.getWbsType());
-                            dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
-                            dataPrivate.setFullName(dataPrivate.getNodeName());
-                            dataPrivate.setInitTableId(ObjectUtils.isNotEmpty(tree.getInitTableId()) ? tree.getInitTableId().toString() : null);
-                            insertDataPrivateList.add(dataPrivate);//新增
+                    List<Long> ids = addPublicTables.stream().map(WbsTree::getId).collect(Collectors.toList());
+                    if (ids.size() > 0) {
+                        List<WbsTree> resultDataList = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, ids));
+                        for (WbsTree tree : resultDataList) {
+                            WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                            if (dataPrivate != null) {
+                                dataPrivate.setPKeyId(SnowFlakeUtil.getId());
+                                dataPrivate.setWbsType(wbsTreePrivate.getWbsType());
+                                dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
+                                dataPrivate.setFullName(dataPrivate.getNodeName());
+                                dataPrivate.setInitTableId(ObjectUtils.isNotEmpty(tree.getInitTableId()) ? tree.getInitTableId().toString() : null);
+                                insertDataPrivateList.add(dataPrivate);//新增
+                            }
                         }
                     }
 
@@ -1563,16 +1572,19 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
                     //构造
-                    List<WbsTreePrivate> resultDataList = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getPKeyId, addPrivateTables.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList())));
-                    for (WbsTreePrivate tree : resultDataList) {
-                        WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
-                        if (dataPrivate != null) {
-                            dataPrivate.setPKeyId(SnowFlakeUtil.getId());
-                            dataPrivate.setWbsId(wbsTreePrivate.getWbsId());
-                            dataPrivate.setWbsType(tree.getWbsType());
-                            dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
-                            dataPrivate.setInitTableId(ObjectUtils.isNotEmpty(tree.getInitTableId()) ? tree.getInitTableId() : null);
-                            insertDataPrivateList.add(dataPrivate);
+                    List<Long> ids = addPrivateTables.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+                    if (ids.size() > 0) {
+                        List<WbsTreePrivate> resultDataList = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getPKeyId, ids));
+                        for (WbsTreePrivate tree : resultDataList) {
+                            WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                            if (dataPrivate != null) {
+                                dataPrivate.setPKeyId(SnowFlakeUtil.getId());
+                                dataPrivate.setWbsId(wbsTreePrivate.getWbsId());
+                                dataPrivate.setWbsType(tree.getWbsType());
+                                dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
+                                dataPrivate.setInitTableId(ObjectUtils.isNotEmpty(tree.getInitTableId()) ? tree.getInitTableId() : null);
+                                insertDataPrivateList.add(dataPrivate);
+                            }
                         }
                     }
                 }

+ 50 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelParser.java

@@ -7,10 +7,20 @@ 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()) {
@@ -32,17 +42,48 @@ public class ExcelParser {
     }
 
     private static String getCellValue(Cell cell) {
+        Object value;
         if (cell == null) return "";
-        if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
-            return cell.getStringCellValue();
-        } else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
-            return String.valueOf(cell.getBooleanCellValue());
-        } else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
-            return cell.getCellFormula();
-        } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
-            return String.valueOf(cell.getNumericCellValue());
+        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 "";
         }
-        return "";
     }
 
     private static String getCellCoordinate(Cell cell) {