Преглед на файлове

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

huangtf преди 2 години
родител
ревизия
4bfc7cc151
променени са 19 файла, в които са добавени 329 реда и са изтрити 77 реда
  1. 28 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/BladeOssRule.java
  2. 7 3
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java
  3. 3 0
      blade-ops/blade-swagger/src/main/resources/application-dev.yml
  4. 30 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveOfflineVersionInfo.java
  5. 5 4
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialMaterialMobilization.java
  6. 2 2
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialSampleInfo.java
  7. 74 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveOfflineVersionInfoController.java
  8. 14 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.java
  9. 20 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.xml
  10. 12 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveOfflineVersionInfoService.java
  11. 16 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveOfflineVersionInfoServiceImpl.java
  12. 5 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java
  13. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialMaterialController.java
  14. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialMaterialMobilizationService.java
  15. 52 6
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDetectionDataServiceImpl.java
  16. 2 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialMaterialMobilizationServiceImpl.java
  17. 4 4
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSampleInfoServiceImpl.java
  18. 52 52
      blade-service/blade-business/src/main/java/org/springblade/business/utils/FileUtils.java
  19. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

+ 28 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/BladeOssRule.java

@@ -0,0 +1,28 @@
+package org.springblade.resource.builder.oss;
+
+import org.springblade.core.oss.rule.OssRule;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.FileUtil;
+
+/**
+ * @author liuYC
+ * @date 2023-03-31
+ * 修改fileName
+ */
+class BladeOssRuleRe implements OssRule {
+    private final Boolean tenantMode;
+
+    public String bucketName(String bucketName) {
+        String prefix = this.tenantMode ? AuthUtil.getTenantId().concat("-") : "";
+        return prefix + bucketName;
+    }
+
+    public String fileName(String originalFilename) {
+        return "upload/" + DateUtil.today() + "/" + FileUtil.getNameWithoutExtension(originalFilename) + "." + FileUtil.getFileExtension(originalFilename);
+    }
+
+    public BladeOssRuleRe(final Boolean tenantMode) {
+        this.tenantMode = tenantMode;
+    }
+}

+ 7 - 3
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/OssBuilder.java

@@ -25,7 +25,6 @@ import org.springblade.core.oss.OssTemplate;
 import org.springblade.core.oss.enums.OssEnum;
 import org.springblade.core.oss.enums.OssStatusEnum;
 import org.springblade.core.oss.props.OssProperties;
-import org.springblade.core.oss.rule.BladeOssRule;
 import org.springblade.core.oss.rule.OssRule;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.*;
@@ -94,9 +93,14 @@ public class OssBuilder {
                     OssRule ossRule;
                     // 若采用默认设置则开启多租户模式, 若是用户自定义oss则不开启
                     if (oss.getEndpoint().equals(ossProperties.getEndpoint()) && oss.getAccessKey().equals(ossProperties.getAccessKey()) && ossProperties.getTenantMode()) {
-                        ossRule = new BladeOssRule(Boolean.TRUE);
+                        /**
+                         * @author liuYc
+                         * @create 2023-03-31
+                         * @deprecated 重写BladeOssRule-》BladeOssRuleRe 修改文件名UUID -》原始名
+                         */
+                        ossRule = new BladeOssRuleRe(Boolean.TRUE);
                     } else {
-                        ossRule = new BladeOssRule(Boolean.FALSE);
+                        ossRule = new BladeOssRuleRe(Boolean.FALSE);
                     }
                     if (oss.getCategory() == OssEnum.MINIO.getCategory()) {
                         template = MinioOssBuilder.template(oss, ossRule);

+ 3 - 0
blade-ops/blade-swagger/src/main/resources/application-dev.yml

@@ -19,3 +19,6 @@ knife4j:
       - name: 业务接口
         uri: 127.0.0.1:8090
         location: /blade-business/v2/api-docs
+      - name: 档案接口
+        uri: 127.0.0.1:8090
+        location: /blade-archive/v2/api-docs

+ 30 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveOfflineVersionInfo.java

@@ -0,0 +1,30 @@
+package org.springblade.archive.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.time.LocalDateTime;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/3/30 18:26
+ **/
+@Data
+@TableName("u_archive_offline_version_info")
+public class ArchiveOfflineVersionInfo extends BaseEntity {
+    private Long id;
+    private Long projectId;
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "发布时间")
+    private LocalDateTime uploadDate;
+    @ApiModelProperty(value = "文件路径")
+    private String fileUrl;
+    @ApiModelProperty(value = "文件名称")
+    private String fileName;
+    @ApiModelProperty(value = "文件大小")
+    private String fileSize;
+}

+ 5 - 4
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialMaterialMobilization.java

@@ -10,6 +10,7 @@ import org.springblade.core.mp.base.BaseEntity;
 
 import javax.validation.constraints.DecimalMax;
 import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -65,15 +66,15 @@ public class TrialMaterialMobilization extends BaseEntity {
      * 材料单价
      */
     @ApiModelProperty(value = "材料单价")
-    @DecimalMax(value = "10", message = "材料单价最大长度10个字符")
-    private BigDecimal materialPrice;
+    @Length(max = 100, message = "材料单价最大长度100个字符")
+    private String materialPrice;
 
     /**
      * 材料数量
      */
     @ApiModelProperty(value = "材料数量")
-    @Max(value = 10, message = "材料数量最长10个字符")
-    private Integer materialCount;
+    @Length(max = 100, message = "材料数量最大长度100个字符")
+    private String materialCount;
 
     /**
      * 计算单位

+ 2 - 2
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialSampleInfo.java

@@ -61,13 +61,13 @@ public class TrialSampleInfo extends BaseEntity {
      * 试样数量
      */
     @ApiModelProperty(value = "试样数量")
-    private Integer materialCount;
+    private String materialCount;
 
     /**
      * 代表数量
      */
     @ApiModelProperty(value = "代表数量")
-    private Integer representativeCount;
+    private String representativeCount;
 
     /**
      * 计算单位

+ 74 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveOfflineVersionInfoController.java

@@ -0,0 +1,74 @@
+package org.springblade.archive.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.archive.entity.ArchiveOfflineVersionInfo;
+import org.springblade.archive.mapper.ArchiveOfflineVersionInfoMapper;
+import org.springblade.archive.service.IArchiveOfflineVersionInfoService;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.tool.api.R;
+import org.springblade.resource.vo.NewBladeFile;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.text.DecimalFormat;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/3/30 18:28
+ **/
+@RestController
+@AllArgsConstructor
+@RequestMapping("/archiveOfflineVersionInfo")
+@Api(value = "档案离线版本信息", tags = "档案离线版本信息")
+public class ArchiveOfflineVersionInfoController {
+
+    private final ArchiveOfflineVersionInfoMapper mapper;
+
+    /**
+     * 打包数据
+     */
+    @ApiOperation(value = "打包数据")
+    @GetMapping("/packData")
+    public R<String> packData(Long projectId){
+        //异步调用自动打包上传,完成后修改数据库信息
+        return R.data("最新数据后台自动打包中,打包完成后会更新打包日期");
+    }
+    /**
+     * 脱机载体工具
+     */
+    @ApiOperation(value = "脱机载体工具")
+    @GetMapping("/getVersionInfo")
+    public R<ArchiveOfflineVersionInfo> getVersionInfo(Long projectId){
+        ArchiveOfflineVersionInfo versionInfo = mapper.selectVersionInfo(111L);
+        String size = this.formatSize(Long.parseLong(versionInfo.getFileSize()));
+        versionInfo.setFileSize(size);
+        return R.data(versionInfo);
+    }
+    /**
+     * 根据字节返回文件大小
+     */
+    private String formatSize(long fileS) {
+        DecimalFormat df = new DecimalFormat("#.00");
+        String fileSizeString = "";
+        String wrongSize = "0B";
+        if (fileS == 0) {
+            return wrongSize;
+        }
+        if (fileS < 1024) {
+            fileSizeString = df.format((double) fileS) + "B";
+        } else if (fileS < 1048576) {
+            fileSizeString = df.format((double) fileS / 1024) + "KB";
+        } else if (fileS < 1073741824) {
+            fileSizeString = df.format((double) fileS / 1048576) + "MB";
+        } else {
+            fileSizeString = df.format((double) fileS / 1073741824) + "GB";
+        }
+        return fileSizeString;
+    }
+}

+ 14 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.java

@@ -0,0 +1,14 @@
+package org.springblade.archive.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.archive.entity.ArchiveOfflineVersionInfo;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/3/31 10:09
+ **/
+public interface ArchiveOfflineVersionInfoMapper extends BaseMapper<ArchiveOfflineVersionInfo> {
+    ArchiveOfflineVersionInfo selectVersionInfo(@Param("projectId") Long projectId);
+}

+ 20 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveOfflineVersionInfoMapper.xml

@@ -0,0 +1,20 @@
+<?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.archive.mapper.ArchiveOfflineVersionInfoMapper">
+
+    <resultMap id="ResultMap" type="org.springblade.archive.entity.ArchiveOfflineVersionInfo">
+        <result column="id" property="id"/>
+        <result column="project_id" property="projectId"/>
+        <result column="upload_date" property="uploadDate"/>
+        <result column="file_url" property="fileUrl"/>
+        <result column="file_name" property="fileName"/>
+        <result column="file_size" property="fileSize"/>
+    </resultMap>
+    <select id="selectVersionInfo" resultMap="ResultMap">
+        SELECT id, project_id, upload_date, file_url, file_name, file_size
+        FROM bladex.u_archive_offline_version_info
+        where project_id = #{projectId}
+        order by upload_date desc
+        limit 1;
+    </select>
+</mapper>

+ 12 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveOfflineVersionInfoService.java

@@ -0,0 +1,12 @@
+package org.springblade.archive.service;
+
+import org.springblade.archive.entity.ArchiveOfflineVersionInfo;
+import org.springblade.core.mp.base.BaseService;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/3/31 10:09
+ **/
+public interface IArchiveOfflineVersionInfoService extends BaseService<ArchiveOfflineVersionInfo> {
+}

+ 16 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveOfflineVersionInfoServiceImpl.java

@@ -0,0 +1,16 @@
+package org.springblade.archive.service.impl;
+
+import org.springblade.archive.entity.ArchiveOfflineVersionInfo;
+import org.springblade.archive.mapper.ArchiveOfflineVersionInfoMapper;
+import org.springblade.archive.service.IArchiveOfflineVersionInfoService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/3/31 10:09
+ **/
+@Service
+public class ArchiveOfflineVersionInfoServiceImpl extends BaseServiceImpl<ArchiveOfflineVersionInfoMapper, ArchiveOfflineVersionInfo> implements IArchiveOfflineVersionInfoService {
+}

+ 5 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java

@@ -13,6 +13,8 @@ import lombok.AllArgsConstructor;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
+import org.apache.poi.openxml4j.opc.PackagePart;
+import org.apache.poi.openxml4j.opc.PackageRelationship;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.util.IOUtils;
 import org.springblade.business.entity.ImageClassificationShow;
@@ -57,6 +59,7 @@ import org.springblade.business.service.IImageClassificationFileService;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.awt.image.BufferedImage;
 import java.io.*;
 import java.net.URL;
 import java.net.URLConnection;
@@ -210,11 +213,11 @@ public class ImageClassificationFileController extends BladeController {
                                                 float reduceMultiple = 0.5f;
                                                 bytes = FileUtils.resizeImage(bytes, reduceMultiple);
                                             }
-                                            //byte[] bytesNew = FileUtils.resizeImage(bytes, 0f);
                                             byte[] bytesNew = bytes;
 
                                             //创建图片
-                                            drawing.createPicture(anchor, workbook.addPicture(bytesNew, Workbook.PICTURE_TYPE_JPEG));
+                                            drawing.createPicture(anchor, workbook.addPicture(bytesNew, Workbook.PICTURE_TYPE_PNG));
+
                                             //图片定位
                                             FileUtils.imageOrientation(sheet, anchor, i == 1 ? new DataVO(1, 28) : new DataVO(0, 0));
 

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialMaterialController.java

@@ -72,7 +72,7 @@ public class TrialMaterialController extends BladeController {
     @GetMapping("/mobilization/page")
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "进场材料分页条件查询", notes = "传入Query、TrialMaterialMobilizationVO")
-    public R<IPage<TrialMaterialMobilizationVO>> mobilizationPage(Query query, TrialMaterialMobilizationVO obj) {
+    public R<IPage<TrialMaterialMobilizationVO>> mobilizationPage(Query query, TrialMaterialMobilizationVO obj) throws Exception {
         return R.data(iTrialMaterialMobilizationService.selectPage(Condition.getPage(query), obj));
     }
 

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialMaterialMobilizationService.java

@@ -24,7 +24,7 @@ public interface ITrialMaterialMobilizationService extends BaseService<TrialMate
 
     boolean mobilizationCopy(List<TrialMaterialMobilizationDTO> dto);
 
-    IPage<TrialMaterialMobilizationVO> selectPage(IPage<TrialMaterialMobilization> page, TrialMaterialMobilizationVO obj);
+    IPage<TrialMaterialMobilizationVO> selectPage(IPage<TrialMaterialMobilization> page, TrialMaterialMobilizationVO obj) throws Exception;
 
     List<TrialMaterialMobilization> selectList();
 

+ 52 - 6
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDetectionDataServiceImpl.java

@@ -146,9 +146,29 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
             for (TrialDetectionData trialDetectionDatum : trialDetectionData) {
                 TrialDetectionData obj = BeanUtil.copyProperties(trialDetectionDatum, TrialDetectionData.class);
                 if (obj != null) {
-                    obj.setId(SnowFlakeUtil.getId());
+                    /*if (ObjectUtil.isNotEmpty(obj.getReportNo())) {
+                        Long row = baseMapper.selectCount(Wrappers.<TrialDetectionData>lambdaQuery()
+                                .eq(TrialDetectionData::getContractId, obj.getContractId())
+                                .eq(TrialDetectionData::getNodeId, obj.getNodeId())
+                                .eq(TrialDetectionData::getReportNo, obj.getReportNo()));
+                        if (row > 0) {
+                            throw new ServiceException("当前合同段该节点下已存在相同的报告编号,请重新填写");
+                        }
+                    }
+                    if (ObjectUtil.isNotEmpty(obj.getEntrustNo())) {
+                        Long row = baseMapper.selectCount(Wrappers.<TrialDetectionData>lambdaQuery()
+                                .eq(TrialDetectionData::getContractId, obj.getContractId())
+                                .eq(TrialDetectionData::getNodeId, obj.getNodeId())
+                                .eq(TrialDetectionData::getEntrustNo, obj.getEntrustNo()));
+                        if (row > 0) {
+                            throw new ServiceException("当前合同段该节点下已存在相同的委托编号,请重新填写");
+                        }
+                    }*/
+
+                    //批量复制不能前端不能重新填写编号,所以设null
                     obj.setEntrustNo(null);
                     obj.setReportNo(null);
+                    obj.setId(SnowFlakeUtil.getId());
                     insertData.add(obj);
                 }
             }
@@ -158,9 +178,25 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
             //单条复制编辑新增保存
             TrialDetectionData obj = BeanUtil.copyProperties(dto, TrialDetectionData.class);
             if (obj != null) {
+                if (ObjectUtil.isNotEmpty(obj.getReportNo())) {
+                    Long row = baseMapper.selectCount(Wrappers.<TrialDetectionData>lambdaQuery()
+                            .eq(TrialDetectionData::getContractId, obj.getContractId())
+                            .eq(TrialDetectionData::getNodeId, obj.getNodeId())
+                            .eq(TrialDetectionData::getReportNo, obj.getReportNo()));
+                    if (row > 0) {
+                        throw new ServiceException("当前合同段该节点下已存在相同的报告编号,请重新填写");
+                    }
+                }
+                if (ObjectUtil.isNotEmpty(obj.getEntrustNo())) {
+                    Long row = baseMapper.selectCount(Wrappers.<TrialDetectionData>lambdaQuery()
+                            .eq(TrialDetectionData::getContractId, obj.getContractId())
+                            .eq(TrialDetectionData::getNodeId, obj.getNodeId())
+                            .eq(TrialDetectionData::getEntrustNo, obj.getEntrustNo()));
+                    if (row > 0) {
+                        throw new ServiceException("当前合同段该节点下已存在相同的委托编号,请重新填写");
+                    }
+                }
                 obj.setId(SnowFlakeUtil.getId());
-                obj.setEntrustNo(null);
-                obj.setReportNo(null);
                 this.save(obj);
             }
         }
@@ -177,10 +213,10 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
         List<String> names = trialSampleInfoList.stream().map(TrialSampleInfo::getMaterialName).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
         List<String> numbers = trialSampleInfoList.stream().map(TrialSampleInfo::getSpecificationNumber).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
         List<String> descriptions = trialSampleInfoList.stream().map(TrialSampleInfo::getSampleDescription).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
-        List<Integer> counts = trialSampleInfoList.stream().map(TrialSampleInfo::getMaterialCount).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+        List<String> counts = trialSampleInfoList.stream().map(TrialSampleInfo::getMaterialCount).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+        List<Date> samplingDate = trialSampleInfoList.stream().map(TrialSampleInfo::getSamplingDate).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
 
         List<Map<String, String>> resultMapList = new ArrayList<>();
-
         //获取当前合同段下的试验节点下的表
         WbsTreePrivate trialNode = jdbcTemplate.query("select * from m_wbs_tree_private where p_key_id =" + nodePKeyId, new BeanPropertyRowMapper<>(WbsTreePrivate.class)).stream().findAny().orElse(null);
         if (trialNode != null) {
@@ -196,6 +232,7 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
                     Elements ypNumber = doc.select("el-input[placeholder~=样品编号.*]");
                     Elements ypCount = doc.select("el-input[placeholder~=样品数量.*]");
                     Elements ypMs = doc.select("el-input[placeholder~=样品描述.*]");
+                    Elements qyTime = doc.select("el-input[placeholder~=取样时间.*]");
 
                     //样品名称
                     if (ypName.size() >= 1) {
@@ -220,7 +257,7 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
                         for (Element element : ypCount) {
                             int trIndex = Integer.parseInt(element.attr("trindex"));
                             if (trIndex <= 6) {
-                                map.put(element.attr("keyName"), ObjectUtils.isNotEmpty(counts) ? counts.stream().reduce(Integer::sum).orElse(0).toString() : "");
+                                map.put(element.attr("keyName"), ObjectUtils.isNotEmpty(counts) ? counts.stream().map(Integer::valueOf).reduce(Integer::sum).orElse(0).toString() : "");
                             }
                         }
                     }
@@ -233,6 +270,15 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
                             }
                         }
                     }
+                    //样品描述
+                    if (qyTime.size() >= 1) {
+                        for (Element element : qyTime) {
+                            int trIndex = Integer.parseInt(element.attr("trindex"));
+                            if (trIndex <= 6) {
+                                map.put(element.attr("keyName"), ObjectUtils.isNotEmpty(samplingDate) ? StringUtils.join(samplingDate, "、") : "");
+                            }
+                        }
+                    }
 
                     map.put("tabPKeyId", trialNodeTab.getPKeyId().toString());
                     if (map.size() > 1) {

+ 2 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialMaterialMobilizationServiceImpl.java

@@ -118,7 +118,7 @@ public class TrialMaterialMobilizationServiceImpl extends BaseServiceImpl<TrialM
     }
 
     @Override
-    public IPage<TrialMaterialMobilizationVO> selectPage(IPage<TrialMaterialMobilization> page, TrialMaterialMobilizationVO obj) {
+    public IPage<TrialMaterialMobilizationVO> selectPage(IPage<TrialMaterialMobilization> page, TrialMaterialMobilizationVO obj) throws Exception {
         List<User> userList = iUserClient.selectUserAll();
         QueryWrapper<TrialMaterialMobilization> queryWrapper = Condition.getQueryWrapper(obj);
         if (ObjectUtil.isNotEmpty(obj.getMaterialType())) {
@@ -142,6 +142,7 @@ public class TrialMaterialMobilizationServiceImpl extends BaseServiceImpl<TrialM
             for (User user : userList) {
                 if (user.getId().equals(record.getUserId())) {
                     record.setUserName(user.getName());
+                    break;
                 }
             }
         }

+ 4 - 4
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSampleInfoServiceImpl.java

@@ -145,10 +145,10 @@ public class TrialSampleInfoServiceImpl extends BaseServiceImpl<TrialSampleInfoM
         List<User> userList = iUserClient.selectUserAll();
         for (TrialSampleInfoVO record : records) {
             if (ObjectUtils.isEmpty(record.getMaterialCount())) {
-                record.setMaterialCount(0);
+                record.setMaterialCount("0");
             }
             if (ObjectUtils.isEmpty(record.getRepresentativeCount())) {
-                record.setRepresentativeCount(0);
+                record.setRepresentativeCount("0");
             }
 
             for (User user : userList) {
@@ -177,10 +177,10 @@ public class TrialSampleInfoServiceImpl extends BaseServiceImpl<TrialSampleInfoM
         TrialSampleInfo trialSampleInfo = BeanUtil.copyProperties(obj, TrialSampleInfo.class);
         if (trialSampleInfo != null) {
             if (ObjectUtils.isEmpty(trialSampleInfo.getMaterialCount())) {
-                trialSampleInfo.setMaterialCount(0);
+                trialSampleInfo.setMaterialCount("0");
             }
             if (ObjectUtils.isEmpty(trialSampleInfo.getRepresentativeCount())) {
-                trialSampleInfo.setRepresentativeCount(0);
+                trialSampleInfo.setRepresentativeCount("0");
             }
             this.saveOrUpdate(trialSampleInfo);
 

+ 52 - 52
blade-service/blade-business/src/main/java/org/springblade/business/utils/FileUtils.java

@@ -5,9 +5,11 @@ import com.itextpdf.text.pdf.PdfCopy;
 import com.itextpdf.text.pdf.PdfReader;
 import org.apache.commons.lang.StringUtils;
 import org.apache.poi.ss.usermodel.ClientAnchor;
+import org.apache.poi.ss.usermodel.Picture;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.util.Units;
+import org.apache.poi.xssf.usermodel.XSSFPicture;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.vo.DataVO;
 import org.springblade.core.tool.utils.IoUtil;
@@ -26,12 +28,12 @@ import java.util.zip.ZipOutputStream;
 
 public class FileUtils {
 
-    public static void batchDownloadFileToZip(List<String> urls, HttpServletResponse response){
+    public static void batchDownloadFileToZip(List<String> urls, HttpServletResponse response) {
         // 设置压缩流:直接写入response,实现边压缩边下载
         ZipOutputStream zipos = null;
         // 循环将文件写入压缩流
         DataOutputStream os = null;
-        try{
+        try {
 
             // 响应头的设置
             response.reset();
@@ -51,17 +53,17 @@ public class FileUtils {
                 e.printStackTrace();
             }
 
-            if(zipos == null){
+            if (zipos == null) {
                 return;
             }
 
             InputStream inputStream = null;
 
-            for(String url : urls){
-                if(StringUtils.isNotEmpty(url)){
-                    try{
+            for (String url : urls) {
+                if (StringUtils.isNotEmpty(url)) {
+                    try {
                         String fileName = null, symbol = "";
-                        if(url.contains("@@@")){
+                        if (url.contains("@@@")) {
                             String[] array = url.split("@@@");
                             url = array[0];
                             fileName = array[1];
@@ -73,7 +75,7 @@ public class FileUtils {
                         //转换
                         byte[] bytes = CommonUtil.InputStreamToBytes(inputStream);
 
-                        if(StringUtils.isEmpty(fileName)){
+                        if (StringUtils.isEmpty(fileName)) {
                             fileName = url.substring(url.lastIndexOf("/") + 1);
                             symbol = "";
                         }
@@ -83,7 +85,7 @@ public class FileUtils {
                         os.write(bytes);
                         zipos.closeEntry();
 
-                    }catch (Exception e){
+                    } catch (Exception e) {
                         e.printStackTrace();
                     } finally {
                         IoUtil.closeQuietly(inputStream);
@@ -91,7 +93,7 @@ public class FileUtils {
                 }
             }
 
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
         } finally {
             IoUtil.closeQuietly(os);
@@ -103,26 +105,6 @@ public class FileUtils {
      * 压缩图片
      */
     public static byte[] resizeImage(byte[] srcImgData, float reduceMultiple) throws IOException {
-        BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData));
-        /*int width = (int) (bi.getWidth() * reduceMultiple);
-        int height = (int) (bi.getHeight() * reduceMultiple);*/
-        int width = 600;
-        int height = 800;
-        Image image = bi.getScaledInstance(width, height, Image.SCALE_SMOOTH);
-        BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
-        Graphics g = tag.getGraphics();
-        g.setColor(Color.RED);
-        g.drawImage(image, 0, 0, null);
-        g.dispose();
-        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
-        ImageIO.write(tag, "JPEG", bOut);
-        return bOut.toByteArray();
-    }
-
-    /**
-     * 压缩图片2
-     */
-    public static byte[] resizeImage2(byte[] srcImgData, float reduceMultiple) throws IOException {
         BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData));
         int width = (int) (bi.getWidth() * reduceMultiple);
         int height = (int) (bi.getHeight() * reduceMultiple);
@@ -138,90 +120,108 @@ public class FileUtils {
     }
 
     /**
-     * 图片定位
+     * 设置图片的定位、大小和合并单元格处理
+     *
+     * @param sheet  工作表对象
+     * @param anchor 锚点对象,表示图片的位置和大小
+     * @param dataVO 数据值对象,包含插入图片的单元格坐标
      */
     public static void imageOrientation(Sheet sheet, ClientAnchor anchor, DataVO dataVO) {
+        // 设置图片距左边和上边的偏移量
         anchor.setDx1(Units.pixelToEMU(5));
         anchor.setDy1(Units.pixelToEMU(5));
+        // 设置图片右下角所在单元格的行列号与左上角一致
         anchor.setCol2(anchor.getCol1());
         anchor.setRow2(anchor.getRow1());
-        int k = getMergedRegionIndex(sheet, CommonUtil.join(dataVO.getX(), dataVO.getY(), dataVO.getX(), dataVO.getY(),","));
-        if(k>-1){
-            /*如果是合并单元格,则锚点第二坐标设置为合并区右下角单元格坐标*/
+        // 判断当前单元格是否属于一个合并单元格
+        int k = getMergedRegionIndex(sheet, CommonUtil.join(dataVO.getX(), dataVO.getY(), dataVO.getX(), dataVO.getY(), ","));
+        if (k > -1) {
+            // 如果是合并单元格,则锚点第一坐标设置为合并区左上角单元格坐标,第二坐标设置为合并区右下角单元格坐标
             CellRangeAddress ca = sheet.getMergedRegion(k);
             anchor.setCol1(ca.getFirstColumn());
             anchor.setRow1(ca.getFirstRow());
             anchor.setCol2(ca.getLastColumn());
             anchor.setRow2(ca.getLastRow());
         }
-        int dx=(int)(sheet.getColumnWidthInPixels(anchor.getCol2())+3);
-        int dy=Units.pointsToPixel(sheet.getRow(anchor.getRow2()).getHeightInPoints())-5;
+        // 计算图片宽度和高度的像素值,并将像素值转换成EMUs(English Metric Units)
+        int dx = (int) (sheet.getColumnWidthInPixels(anchor.getCol2()) + 3);
+        int dy = Units.pointsToPixel(sheet.getRow(anchor.getRow2()).getHeightInPoints()) - 5;
         anchor.setDx2(Units.pixelToEMU(dx));
         anchor.setDy2(Units.pixelToEMU(dy));
     }
 
+    /**
+     * 获取指定单元格所在的合并单元格的下标
+     *
+     * @param sheet  工作表对象
+     * @param coords 单元格坐标字符串,格式为"左上角行号,左上角列号,右下角行号,右下角列号"
+     * @return 返回指定单元格所在的合并单元格下标,如果不存在则返回-1
+     */
     public static int getMergedRegionIndex(Sheet sheet, String coords) {
+        // 遍历所有合并单元格
         for (int i = 0; i < sheet.getNumMergedRegions(); i++) {
             CellRangeAddress ca = sheet.getMergedRegion(i);
             int firstColumn = ca.getFirstColumn();
             int lastColumn = ca.getLastColumn();
             int firstRow = ca.getFirstRow();
             int lastRow = ca.getLastRow();
-            Matcher mu = CommonUtil.matcher("(\\d{1,3}),(\\d{1,3}),(\\d{1,3}),(\\d{1,3})",coords);
-            /*合并单元格四个角坐标,只要任意一个在落在将要合并的区域里面意味着两者重合,就必须拆分前者*/
-            List<Integer[]> corners = Arrays.asList(new Integer[]{firstColumn,firstRow},new Integer[]{lastColumn,firstRow},new Integer[]{firstColumn,lastRow},new Integer[]{lastColumn,lastRow});
-            if(mu.find()){
+            // 解析指定单元格坐标字符串
+            Matcher mu = CommonUtil.matcher("(\\d{1,3}),(\\d{1,3}),(\\d{1,3}),(\\d{1,3})", coords);
+            // 判断是否有重叠部分,如果有则返回对应的合并单元格下标
+            List<Integer[]> corners = Arrays.asList(new Integer[]{firstColumn, firstRow}, new Integer[]{lastColumn, firstRow}, new Integer[]{firstColumn, lastRow}, new Integer[]{lastColumn, lastRow});
+            if (mu.find()) {
                 int firstColumn2 = mu.group(1) == null ? 0 : Integer.parseInt(mu.group(1));
                 int lastColumn2 = mu.group(3) == null ? 0 : Integer.parseInt(mu.group(3));
                 int firstRow2 = mu.group(2) == null ? 0 : Integer.parseInt(mu.group(2));
                 int lastRow2 = mu.group(4) == null ? 0 : Integer.parseInt(mu.group(4));
-                for(Integer[] corner:corners){
-                    if(firstColumn2<=corner[0]&&corner[0]<=lastColumn2&&firstRow2<=corner[1]&&corner[1]<=lastRow2){
+                for (Integer[] corner : corners) {
+                    if (firstColumn2 <= corner[0] && corner[0] <= lastColumn2 && firstRow2 <= corner[1] && corner[1] <= lastRow2) {
                         return i;
                     }
                 }
             }
         }
+        // 如果没有重叠部分,则返回-1
         return -1;
     }
 
     /**
      * 合并方法
      */
-    public static void mergePdfPublicMethods(List<String> urlList, String localImgUrl){
+    public static void mergePdfPublicMethods(List<String> urlList, String localImgUrl) {
         PdfReader reader = null;
 
         Document doc = new Document();
         PdfCopy pdfCopy = null;
-        try{
+        try {
             pdfCopy = new PdfCopy(doc, new FileOutputStream(localImgUrl));
             int pageCount;
             doc.open();
 
-            for(String urlStr : urlList){
-                try{
+            for (String urlStr : urlList) {
+                try {
                     //获取OSS文件输入流
                     reader = new PdfReader(CommonUtil.getOSSInputStream(urlStr));
 
                     pageCount = reader.getNumberOfPages();
 
-                    for(int i = 0; i < pageCount; ++i){
+                    for (int i = 0; i < pageCount; ++i) {
                         int is = i + 1;
-                        pdfCopy.addPage(pdfCopy.getImportedPage(reader,is));
+                        pdfCopy.addPage(pdfCopy.getImportedPage(reader, is));
                     }
-                }catch (Exception e){
+                } catch (Exception e) {
                     e.printStackTrace();
                 } finally {
-                    if(reader != null){
+                    if (reader != null) {
                         reader.close();
                     }
                 }
             }
 
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
         } finally {
-            if(pdfCopy != null){
+            if (pdfCopy != null) {
                 pdfCopy.flush();
                 pdfCopy.close();
             }

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

@@ -848,7 +848,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
     //新增独立表单库数据
     @Async
-    private void insertDLTabAsync(WbsTreeContractDTO pawDTO) {
+    void insertDLTabAsync(WbsTreeContractDTO pawDTO) {
         //获取当前引用项目的独立表
         List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
                 //.select(WbsTreePrivate::getId, WbsTreePrivate::getHtmlUrl, WbsTreePrivate::getNodeName, WbsTreePrivate::getTableType)