浏览代码

Merge remote-tracking branch 'origin/master'

qianxb 2 年之前
父节点
当前提交
f7781745a4

+ 6 - 0
blade-common/pom.xml

@@ -42,6 +42,12 @@
             <groupId>com.aliyun.oss</groupId>
             <artifactId>aliyun-sdk-oss</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.drewnoakes</groupId>
+            <artifactId>metadata-extractor</artifactId>
+            <version>2.16.0</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
 

+ 102 - 0
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java

@@ -1,21 +1,35 @@
 package org.springblade.common.utils;
 
 import cn.hutool.core.io.FileUtil;
+import com.drew.imaging.ImageMetadataReader;
+import com.drew.imaging.ImageProcessingException;
+import com.drew.metadata.Metadata;
+import com.drew.metadata.exif.ExifIFD0Directory;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.util.CollectionUtils;
 
+import javax.imageio.IIOImage;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import java.awt.*;
+import java.awt.geom.AffineTransform;
+import java.awt.image.AffineTransformOp;
+import java.awt.image.BufferedImage;
 import java.io.*;
 import java.math.BigDecimal;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLConnection;
 import java.util.*;
+import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
+import com.drew.metadata.MetadataException;
 
 /**
  * 通用工具类
@@ -322,4 +336,92 @@ public class CommonUtil {
     }
 
 
+
+
+    /**
+     * 图片缩放、压缩、旋转处理
+     * @param imageData
+     * @return
+     * @throws IOException
+     * @throws ImageProcessingException
+     * @throws MetadataException
+     */
+    public static byte[] compressImage(byte[] imageData) throws IOException, ImageProcessingException, MetadataException {
+        // 读取原始图像(处理旋转问题)
+        Metadata metadata = ImageMetadataReader.readMetadata(new ByteArrayInputStream(imageData));
+        if (metadata.containsDirectoryOfType(ExifIFD0Directory.class)) {
+            ExifIFD0Directory exifIFD0Directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
+            if (exifIFD0Directory.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
+                // 获取 Orientation 标签的值
+                int orientation = exifIFD0Directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
+                // 需要旋转图片
+                BufferedImage originalImage = ImageIO.read(new ByteArrayInputStream(imageData));
+                AffineTransform transform = new AffineTransform();
+                if (orientation == 6) {
+                    transform.rotate(Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
+                } else if (orientation == 8) {
+                    transform.rotate(-Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
+                }
+                AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
+                originalImage = op.filter(originalImage, null);
+                ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                ImageIO.write(originalImage, "jpg", baos);
+                imageData = baos.toByteArray();
+            }
+        }
+
+        // 缩放图像
+        String formatName = "JPEG";
+        ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
+        BufferedImage originalImage = ImageIO.read(bais);
+        long sizeLimit = 366912; //358KB
+        int width = 768;
+        int height = 1024;
+        Image scaledImage = originalImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
+        BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+        resizedImage.getGraphics().drawImage(scaledImage, 0, 0, null);
+
+        // 压缩图像
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ImageIO.write(resizedImage, formatName, baos);
+
+        if (baos.size() <= sizeLimit) {
+            // 图片大小已经小于等于目标大小,直接返回原始数据
+            return baos.toByteArray();
+        }
+
+        float quality = 0.9f; // 初始化压缩质量
+        int retries = 10; // 最多尝试 10 次
+
+        while (baos.size() > sizeLimit && retries > 0) {
+            // 压缩图像并重新计算压缩质量
+            byte[] data = baos.toByteArray();
+            bais = new ByteArrayInputStream(data);
+            BufferedImage compressedImage = ImageIO.read(bais);
+            baos.reset();
+
+            ImageWriter writer = null;
+            Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(formatName);
+            if (writers.hasNext()) {
+                writer = writers.next();
+            } else {
+                throw new IllegalArgumentException("Unsupported image format: " + formatName);
+            }
+
+            ImageWriteParam writeParam = writer.getDefaultWriteParam();
+            writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+            writeParam.setCompressionQuality(quality);
+
+            writer.setOutput(ImageIO.createImageOutputStream(baos));
+            writer.write(null, new IIOImage(compressedImage, null, null), writeParam);
+            writer.dispose();
+
+            float ratio = sizeLimit * 1.0f / baos.size();
+            quality *= Math.sqrt(ratio);
+            retries--;
+        }
+
+        return baos.toByteArray();
+    }
+
 }

+ 6 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/ossre/AliossTemplateRe.java

@@ -174,6 +174,12 @@ public class AliossTemplateRe implements OssTemplateRe {
             this.makeBucket(bucketName);
             String originalName = key;
             key = this.getFileName(key);
+            if(key.indexOf("/")>=0){
+                originalName = key.substring(key.lastIndexOf("/")+1 , key.length());
+            }else{
+                key = this.getFileName(key);
+            }
+
             if (cover) {
                 this.ossClient.putObject(this.getBucketName(bucketName), key, stream);
             } else {

+ 13 - 7
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -349,7 +349,7 @@ public class FormulaUtils {
 
 
     private static boolean isContainKeywords(String s) {
-        List<String> keywords = Arrays.asList("或", "每", "个","附录","抽查","测","");
+        List<String> keywords = Arrays.asList("或", "每", "个","附录","抽查","测","");
         return keywords.stream().anyMatch(s::contains);
     }
 
@@ -383,9 +383,9 @@ public class FormulaUtils {
 
 
 
-//    public static void main(String[] args) {
-//        List<String> list =Arrays.asList(
-//                ""
+    public static void mainK(String[] args) {
+        List<String> list =Arrays.asList(
+                ""
 //                ,"压 实 度 (%)下路床 特重、极重交通荷载等级 设计值"
 //                ,"1△_压 实 度 (%)_下路床_轻、中及重交通 荷载等级_0.3m~0.8m_≧96_≧95_≧94_实测值或实测偏差值"
 //                ,"1△_压 实 度 (%)_下路提_轻、中及重交通 荷载等级_&gt;1.5m_≧93_≧92_≧90_实测值或实测偏差值"
@@ -406,9 +406,15 @@ public class FormulaUtils {
 //                ,"实测项目_桩位 (mm)_排架桩_质量评定_合格判定"
 //                ,"实测项目_桩位 (mm)_群桩_≤100_质量评定_合格率(%)"
 //                ,"实测项目_桩位 (mm)_排架桩_质量评定_合格率(%)"
-//        );
-//        list.stream().map(FormulaUtils::parseItemName).forEach(System.out::println);
-//    }
+                ,"3△_支座高程(mm)_满足设计要求;设 计未要求时±5_水准仪:测每支座中心线_实测值或实测偏差值"
+        );
+        list= Arrays.asList(("实 测 项 目_2△_草坪、草本地被覆盖率(%)_取弃土场绿 地_≥90_实测值或实测偏差值@" +
+                "实 测 项 目_花卉数量_满足设计要求_实测值或实测偏差值@" +
+                "实 测 项 目_4△_花卉成活率(%)_≥95_实测值或实测偏差值@" +
+                "实 测 项 目_草坪、草本地被面积_满足设计要求_实测值或实测偏差值@" +
+                "实 测 项 目_2△_草坪、草本地被覆盖率(%)_其他绿地_≥95_实测值或实测偏差值").split("@"));
+        list.stream().map(FormulaUtils::parseItemName).forEach(System.out::println);
+    }
 
 
 }

+ 7 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -1636,7 +1636,6 @@ public class ExcelTabController extends BladeController {
     @ApiOperation(value = "填报页面数据保存", notes = "填报页面数据保存")
     public R<String> saveBussData(@Valid @RequestBody JSONObject dataInfo, BladeUser bladeUser) throws Exception {
         JSONArray dataArray = new JSONArray();
-        System.out.println("1=" + DateUtil.formatDateTime(DateUtil.now()));
         if (dataInfo.containsKey("dataInfo")) { // 节点保存
             JSONObject jsonObject = dataInfo.getJSONObject("dataInfo");
             dataArray = jsonObject.getJSONArray("orderList");
@@ -1662,7 +1661,6 @@ public class ExcelTabController extends BladeController {
             groupIds += "," + jsonObject.getString("tabGroupId");
             ;
         }
-        System.out.println("2=" + DateUtil.formatDateTime(DateUtil.now()));
         /*全加载,或者可以优化成依赖加载*/
         List<TableInfo> tableInfoList = this.excelTabService.getTableInfoList(dataArray);
         if (tableInfoList != null) {
@@ -1698,28 +1696,21 @@ public class ExcelTabController extends BladeController {
 
         try {
             this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeid));
-            // 保存数据到数据库
         } catch (Exception e) {
             e.printStackTrace();
         }
-
+        // 保存数据到数据库
         R info = this.excelTabService.saveOrUpdateInfo(tableInfoList);
         if (!info.isSuccess()) {
             return info;
         }
         try {
-            System.out.println("3=" + DateUtil.formatDateTime(DateUtil.now()));
             //单个 pdf加载
             for (TableInfo tableInfo : tableInfoList) {
-                //if(!tableInfo.isToBeUpdated()){
                 excelTabService.getBussPdfInfo(Long.parseLong(tableInfo.getPkeyId()));
-                //  }
-
             }
-            System.out.println("4=" + DateUtil.formatDateTime(DateUtil.now()));
             // 合并pdf加载
             excelTabService.getBussPdfs(nodeid, classify, contractId, projectId);
-            System.out.println("5=" + DateUtil.formatDateTime(DateUtil.now()));
         }catch (Exception e){
             e.printStackTrace();
         }
@@ -2851,7 +2842,7 @@ public class ExcelTabController extends BladeController {
     @ApiOperationSupport(order = 32)
     @ApiOperation(value = "表单填写图片上传", notes = "表单填写图片上传")
     public R addBussFile(@RequestParam MultipartFile file) {
-        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        /*String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
         //String file_path = "/Users/hongchuangyanfa/Desktop/";//ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
         BladeFile bladeFile = new BladeFile();
         if (file.getSize() >= 1024) {
@@ -2861,9 +2852,11 @@ public class ExcelTabController extends BladeController {
             bladeFile = this.newIOSSClient.uploadFile(file.getOriginalFilename(), imgUrl);
             File imgFile = ResourceUtil.getFile(imgUrl);
             imgFile.delete();
-        } else {
-            bladeFile = this.newIOSSClient.uploadFileByInputStream(file);
-        }
+        } else {*/
+         //   bladeFile = this.newIOSSClient.uploadFileByInputStream(file);
+       // }
+        BladeFile bladeFile = new BladeFile();
+        bladeFile = this.newIOSSClient.uploadFileByInputStream(file);
         return R.data(bladeFile);
     }
 

+ 1 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/Measurement.java

@@ -1,8 +1,6 @@
 package org.springblade.manager.formula.impl;
 
-import com.mixsmart.utils.FormulaUtils;
 import lombok.Data;
-import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.FormData;
 
 import java.util.List;
@@ -38,6 +36,7 @@ public class Measurement {
            return value!=null&&pass!=null&&judge!=null;
     }
     public void flush(){
+        /*匹配成功后就不执行后续公式*/
         this.value.setFinished(true);
         this.value.setUpdate(1);
         this.value.setFormula(null);

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

@@ -927,6 +927,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             return dataMap;
         }
         File file1 = ResourceUtil.getFile(wbsTreeContract.getHtmlUrl());
+        if(file1.exists()){
+
 
         FileInputStream fileInputStream = new FileInputStream(file1);
         String htmlString = IoUtil.readToString(fileInputStream);
@@ -950,6 +952,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 }
             }
         }
+        }
         return dataMap;
     }
 
@@ -982,6 +985,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         // 匹配关联
         try {
             File file1 = ResourceUtil.getFile(wbsTreeContract.getHtmlUrl());
+            if(file1.exists()){
+
             String htmlString = IoUtil.readToString(new FileInputStream(file1));
             Document doc = Jsoup.parse(htmlString);
 
@@ -1075,6 +1080,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     }
                 }
             }
+            }
         } catch (FileNotFoundException e) {
             e.printStackTrace();
         }
@@ -1327,10 +1333,14 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                                 }
 
                                                 //https:bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20220819/b53cb6700db369381e3b03d7737bcdec.jpg__16_1
-                                                if (myData.indexOf("https") >= 0 && myData.indexOf("aliyuncs") >= 0) {
+                                                if ((myData.indexOf("https") >= 0 ||myData.indexOf("http") >= 0) && myData.indexOf("aliyuncs") >= 0) {
 
                                                     InputStream imageIn = CommonUtil.getOSSInputStream(myData);
-                                                    byte[] bytes = IOUtils.toByteArray(imageIn);
+
+                                                    byte[] byteNew = IOUtils.toByteArray(imageIn);
+
+                                                    byte[] bytes = CommonUtil.compressImage(byteNew);
+
                                                     // 这里根据实际需求选择图片类型
                                                     int pictureIdx = workbook.addPicture(bytes, 6);
 

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

@@ -231,9 +231,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 if (!StringUtils.isEquals("[]", fdb.getVal())) {
                     List<ElementBlock> elementBlockList = JSON.parseArray(fdb.getVal(), ElementBlock.class);
                     Map<String, Measurement> itemsMap = new HashMap<>();
-                    this.formDataMap.values().forEach(e -> {
+                    this.formDataMap.values().stream().filter(FormData::getIsCurrentNodeElement).forEach(e -> {
                         String eName = e.getEName();
-                        if (eName.contains("实测") && !eName.contains("平均") && !eName.contains("率") && !eName.contains("判")) {
+                        if (eName.contains("实测") && !eName.contains("平均") && !eName.contains("合格率") && !eName.contains("判")) {
                             String point = FormulaUtils.parseItemName(eName);
                             /*评定匹配检验单的元素用相似匹配*/
                             Measurement measurement = itemsMap.computeIfAbsent(point, k -> new Measurement(point));
@@ -242,11 +242,11 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     });
                     if (itemsMap.size() > 0) {
                         /*表内用同行匹配*/
-                        List<FormData> primary = tec.getFormDataMap().values().stream().filter(v -> v.getEName().contains("率") || v.getEName().contains("判")).collect(Collectors.toList());
+                       List<FormData> primary = tec.getFormDataMap().values().stream().filter(FormData::getIsCurrentNodeElement).filter(v -> v.getEName().contains("率") || v.getEName().contains("判")).collect(Collectors.toList());
                         itemsMap.values().forEach(i -> {
                             FormData vf = i.getValue();
                             primary.stream().filter(p -> vf.getMaxRow().equals(p.getMaxRow()) && vf.getTableName().equals(p.getTableName())).forEach(t -> {
-                                if (t.getEName().contains("率")) {
+                                if (t.getEName().contains("合格率")) {
                                     i.setPass(t);
                                 } else if (t.getEName().contains("判")) {
                                     i.setJudge(t);
@@ -275,8 +275,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             if (g != null) {
                                 List<ItemBlock> itemBlockList = g.getList();
                                 int originSize = itemBlockList.size();
-                                List<Long> ids = this.jdbcTemplate.queryForList("select b.p_key_id from m_wbs_tree_contract a join m_wbs_tree_contract b on (a.parent_id=b.parent_id and a.contract_id=b.contract_id) where a.p_key_id=" + tec.getCurrentNode().getPkId() + " and b.is_deleted=0 and b.node_type=6", Long.class);
-                                itemBlockList.removeIf(ik -> !ids.contains(ik.getPkeyId()));
+                                /*过滤方法有问题*/
+//                                List<Long> ids = this.jdbcTemplate.queryForList("select b.p_key_id from m_wbs_tree_contract a join m_wbs_tree_contract b on (a.parent_id=b.parent_id and a.contract_id=b.contract_id) where a.p_key_id=" + tec.getCurrentNode().getPkId() + " and b.is_deleted=0 and b.node_type=6", Long.class);
+//                                itemBlockList.removeIf(ik -> !ids.contains(ik.getPkeyId()));
                                 if (itemBlockList.size() > 0) {
                                     int total = itemBlockList.stream().mapToInt(ItemBlock::getSubTotal).sum();
                                     int passNum = itemBlockList.stream().mapToInt(ItemBlock::getSubPass).sum();
@@ -285,7 +286,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                     if (passRate >= 60) {
                                         FormulaUtils.write(t.getJudge(), "合格", false);
                                     }
-                                    itemBlockList.sort(Comparator.comparingInt(a -> ids.indexOf(a.getPkeyId())));
+//                                    itemBlockList.sort(Comparator.comparingInt(a -> ids.indexOf(a.getPkeyId())));
                                     List<String> values = itemBlockList.stream().map(ItemBlock::getData).flatMap(v -> v.stream().flatMap(Collection::stream)).map(Object::toString).collect(Collectors.toList());
                                     int scale = StringUtils.getScale(values);
                                     FormulaUtils.write(t.getValue(), values.stream().map(u -> StringUtils.number2String(u, scale)).collect(Collectors.toList()), true);
@@ -1212,7 +1213,11 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
         if(Func.isNotEmpty(listMap)){
             /*当前节点的某个元素存在多种作用域的公式,作用域范围越小优先级越高*/
             List<KeyMapper> list= listMap.stream().map(m->BeanUtil.toBean(m,KeyMapper.class)).collect(Collectors.toList());
-            String nodeIdStr=nodeIds.stream().map(Object::toString).collect(Collectors.joining(StringPool.COMMA));
+            String nodeIdStr=nodeIds.stream().map(Object::toString).distinct().collect(Collectors.joining(StringPool.COMMA));
+            if(Func.isBlank(nodeIdStr)){
+                /*暂时这么处理,严格上说要查找到项目级对应的节点*/
+                nodeIdStr="1";
+            }
             List<Map<String,Object>> efMap= this.jdbcTemplate.queryForList("select element_id elementId,formula_id formulaId,scope " +
                     "from m_element_formula_mapping " +
                     "where element_id in(" + list.stream().map(KeyMapper::getFieldId).map(Func::toStr).collect(Collectors.joining(",")) + ") " +

+ 1 - 0
pom.xml

@@ -8,6 +8,7 @@
     <version>2.9.1.RELEASE</version>
     <packaging>pom</packaging>
 
+
     <properties>
         <bladex.project.version>2.9.1.RELEASE</bladex.project.version>