Przeglądaj źródła

Merge branch 'feature-bieao' of lift-manager/lift-server into develop

bieao 5 lat temu
rodzic
commit
25295a44c2

+ 14 - 0
lift-business-service/pom.xml

@@ -24,6 +24,20 @@
             <artifactId>lift-common</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>com.ning</groupId>
+            <artifactId>async-http-client</artifactId>
+            <version>1.9.32</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+        </dependency>
         <!--<dependency>
             <groupId>cn.com.xwy</groupId>
             <artifactId>xwy-cloud-dependencies</artifactId>

+ 243 - 0
lift-business-service/src/main/java/cn/com/ty/lift/business/ImageUtil.java

@@ -0,0 +1,243 @@
+package cn.com.ty.lift.business;
+
+import com.sun.image.codec.jpeg.JPEGCodec;
+import com.sun.image.codec.jpeg.JPEGImageEncoder;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.net.URL;
+import java.net.URLConnection;
+
+/**
+ * @author 张凡
+ * @create 2020-05-20 22:06
+ **/
+public class ImageUtil {
+    /**
+     * 给图片+图片水印
+     *
+     * @param sourceUrl --sourceUrl 源图片网络地址
+     * @param sourceFile   --sourceFile 源图片文件
+     * @param pressImg  -- 水印图片地址
+     * @param targetImg -- 目标图片地址
+     * @param location  水印位置:left-top:左上角,right-top:右上角,left-bottom:左下角,right-bottom:右下角
+     * @param degree    水印旋转角度
+     */
+
+    public static void pressImage(String sourceUrl, MultipartFile sourceFile, String pressImg, String targetImg, String location, Integer degree) {
+        try {
+            // 目标文件
+            File _file = toFile(sourceUrl, null, sourceFile, new File(targetImg));
+            Image src = ImageIO.read(_file);
+            int width = src.getWidth(null);
+            int height = src.getHeight(null);
+            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+            Graphics2D g = image.createGraphics();
+            g.drawImage(src, 0, 0, width, height, null);
+            // 水印文件
+            File _filebiao = new File(pressImg);
+            Image src_biao = ImageIO.read(_filebiao);
+            int width_biao = src_biao.getWidth(null);
+            int height_biao = src_biao.getHeight(null);
+            // 水印坐标
+            int x = 0, y = 0;
+            if (StringUtils.equals(location, "left-top")) {
+                x += 30;
+                y += 30;
+            } else if (StringUtils.equals(location, "right-top")) {
+                x = width - width_biao - 30;
+                y += 30;
+            } else if (StringUtils.equals(location, "left-bottom")) {
+                y = height - height_biao - 30;
+                x += 30;
+            } else if (StringUtils.equals(location, "right-bottom")) {
+                x = width - width_biao - 30;
+                y = height - height_biao - 30;
+            } else {
+                x = (width - width_biao) / 2;
+                y = (height - height_biao) / 2;
+            }
+            if (null != degree) {
+                // 设置水印旋转
+                g.rotate(Math.toRadians(degree), x, y);
+            }
+            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+            g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+            g.drawImage(src_biao, x, y, width_biao, height_biao, null);
+            // 水印文件结束
+            g.dispose();
+            //直接修改源文件
+            FileOutputStream out = new FileOutputStream(targetImg);
+            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
+            encoder.encode(image);
+            out.flush();
+            out.close();
+            //生成新的文件
+            //File sf = new File("D:/imgout/" + "test" + "." + "jpg");
+            //ImageIO.write(image, "jpg", sf); // 保存图片
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 给图片加文字水印
+     *
+     * @param sourceUrl 图片的网络地址
+     * @param pressText s水印文字
+     * @param targetImg 目标文件
+     * @param fontName  字体名称
+     * @param fontStyle 字体风格
+     * @param fontSize  字体大小
+     * @param location  字体位置:left-top:左上角,right-top:右上角,left-bottom:左下角,right-bottom:右下角
+     */
+    public static void pressText(String sourceUrl, String pressText, String targetImg, String fontName, int fontStyle,
+                                 int fontSize, String location, Color color) {
+        try {
+
+            int textWidth = getFontWidth(fontName, fontStyle, fontSize, pressText);
+            File _file = toFile(null, sourceUrl, null, new File(targetImg));
+            Image src = ImageIO.read(_file);
+            int width = src.getWidth(null);
+            int height = src.getHeight(null);
+            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+            Graphics2D g = image.createGraphics();
+            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+            g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+            g.drawImage(src.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
+            g.setColor(color);
+            g.setFont(new Font(fontName, fontStyle, fontSize));
+            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
+                    0.45f));
+            int x = 0, y = 0;
+            if (StringUtils.equals(location, "left-top")) {
+                x = 30;
+                y = 30;
+            } else if (StringUtils.equals(location, "right-top")) {
+                x = width - textWidth - 30;
+                y = 30;
+            } else if (StringUtils.equals(location, "left-bottom")) {
+                x += 30;
+                y = height - 30;
+            } else if (StringUtils.equals(location, "right-bottom")) {
+                x = width - textWidth - 30;
+                y = height - 30;
+            } else {
+                x = (width - textWidth) / 2;
+                y = (height) / 2;
+            }
+            g.drawString(pressText, x, y);
+            g.dispose();
+            FileOutputStream out = new FileOutputStream(targetImg);
+            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
+            encoder.encode(image);
+            out.flush();
+            out.close();
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+
+    }
+
+
+    /**
+     * 文件保存
+     *
+     * @param link 图片链接
+     * @param img  图片临时地址
+     * @param file 存入的文件地址
+     * @return 下载的文件
+     */
+    public static File toFile(String link, String img, MultipartFile imgFile, File file) {
+        try {
+            InputStream ins = null;
+            if (StringUtils.isNotEmpty(link)) {
+                URL url = new URL(link);
+                URLConnection uri = url.openConnection();
+                ins = uri.getInputStream();
+            }
+            if (StringUtils.isNotEmpty(img)) {
+                File nl = new File(img);
+                ins = new FileInputStream(nl);
+            }
+            if (img != null) {
+                ins = imgFile.getInputStream();
+            }
+            //获取数据流
+            OutputStream os = new FileOutputStream(file);
+            int bytesRead = 0;
+            byte[] buffer = new byte[8192];
+            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
+                os.write(buffer, 0, bytesRead);
+            }
+            os.close();
+            ins.close();
+            return file;
+        } catch (Exception e) {
+            return null;
+        }
+
+    }
+
+    /**
+     * 计算文本占用的width
+     *
+     * @param fontName  字体名称
+     * @param fontStyle 字体风格
+     * @param fontSize  字体大小
+     * @param pressText 输入文本
+     * @return 文字所占用的宽带
+     */
+    public static int getFontWidth(String fontName, int fontStyle, int fontSize, String pressText) {
+        Font f = new Font(fontName, fontStyle, fontSize);
+        FontMetrics fm = sun.font.FontDesignMetrics.getMetrics(f);
+        return fm.stringWidth(pressText);
+    }
+
+    /*
+        创建FileItem
+         */
+    public static FileItem createFileItem(File file, String fieldName) {
+        FileItemFactory factory = new DiskFileItemFactory(16, null);
+        FileItem item = factory.createItem(fieldName, "text/plain", true, file.getName());
+        int bytesRead = 0;
+        byte[] buffer = new byte[8192];
+        try {
+            FileInputStream fis = new FileInputStream(file);
+            OutputStream os = item.getOutputStream();
+            while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
+                os.write(buffer, 0, bytesRead);
+            }
+            os.close();
+            fis.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return item;
+    }
+
+
+    public static void main(String[] args) {
+        pressImage("https://ty-oss-file.oss-cn-hangzhou.aliyuncs.com/banner/banner3.png",null, "D:/项目中心/电梯/水印.png", "D:/项目中心/电梯/微信图片_20200520211441.png", "right-bottom", null);//
+        //pressImage("D:/imgin/20181017110944.png", "D:/imgout/1.png", "right-top", null);
+        //        //pressImage("D:/imgin/20181017110944.png", "D:/imgout/1.png", "center", null);
+        //        //pressImage("D:/imgin/20181017110944.png", "D:/imgout/1.png", "left-bottom", null);
+        //        //pressImage("D:/imgin/20181017110944.png", "D:/imgout/1.png", "right-bottom", null);
+        pressText("D:/项目中心/电梯/微信图片_20200520211441.png", "2020-05-20", "D:/项目中心/电梯/微信图片_20200520211442.png", "黑体", Font.BOLD + Font.ITALIC, 30, "left-bottom", Color.GRAY);
+        //        //getFontWidth("黑体", Font.BOLD + Font.ITALIC, 30, "miraclesgrocery");
+        //        //System.out.println(Color.RED);
+        //        //System.out.println(Color.WHITE);
+        //        //System.out.println(Color.GRAY);
+    }
+
+
+}

+ 25 - 2
lift-business-service/src/main/java/cn/com/ty/lift/business/common/CommonController.java

@@ -1,5 +1,6 @@
 package cn.com.ty.lift.business.common;
 
+import cn.com.ty.lift.business.ImageUtil;
 import cn.com.ty.lift.business.annualinspection.service.AnnualInspectionService;
 import cn.com.ty.lift.business.capital.service.CapitalRepairLiftRelevanceService;
 import cn.com.ty.lift.business.emergency.service.EmergencyRepairService;
@@ -15,19 +16,25 @@ import cn.com.ty.lift.common.verify.Validate;
 import cn.com.ty.lift.common.verify.Validation;
 import cn.com.ty.lift.common.verify.Val;
 import cn.com.xwy.boot.web.dto.RestResponse;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.fileupload.FileItem;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
+import java.awt.*;
+import java.io.File;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.List;
 
 /**
  * @author bieao
@@ -89,7 +96,15 @@ public class CommonController {
         Map<String, MultipartFile> fileMap = new LinkedHashMap<>();
         //1 先解析文件格式
         for (MultipartFile file : files) {
-            String fileName = handleFile(file);
+            String currentTime = DateUtil.formatDateTime(new Date());
+            //上传图片加图片水印
+            ImageUtil.pressImage(null, file, "/home/ying/server/lift-business/tmp/watermark.png", "/home/ying/server/lift-business/tmp/imgBack.png", "right-bottom", null);
+            //上传图片加文字水印
+            ImageUtil.pressText("/home/ying/server/lift-business/tmp/imgBack.png", currentTime, "/home/ying/server/lift-business/tmp/imgBack.png", "黑体", Font.BOLD + Font.ITALIC, 30, "left-bottom", Color.GRAY);
+            File downloadFile = new File("/home/ying/server/lift-business/tmp/imgBack.png");
+            FileItem fileItem = ImageUtil.createFileItem(downloadFile, downloadFile.getName());
+            MultipartFile mfile = new CommonsMultipartFile(fileItem);
+            String fileName = handleFile(mfile);
             fileMap.put(fileName, file);
         }
         //2 批量上传
@@ -117,7 +132,15 @@ public class CommonController {
     @PostMapping("upload")
     public RestResponse upload(@RequestParam("file") MultipartFile file) {
         Validate.notTrue(Objects.isNull(file) || file.isEmpty(), ValuePool.UPLOAD_DATA_MISSING);
-        String fileName = handleFile(file);
+        String currentTime = DateUtil.formatDateTime(new Date());
+        //上传图片加图片水印
+        ImageUtil.pressImage(null, file, "/home/ying/server/lift-business/tmp/watermark.png", "/home/ying/server/lift-business/tmp/imgBack.png", "right-bottom", null);
+        //上传图片加文字水印
+        ImageUtil.pressText("/home/ying/server/lift-business/tmp/imgBack.png", currentTime, "/home/ying/server/lift-business/tmp/imgBack.png", "黑体", Font.BOLD + Font.ITALIC, 30, "left-bottom", Color.GRAY);
+        File downloadFile = new File("/home/ying/server/lift-business/tmp/imgBack.png");
+        FileItem fileItem = ImageUtil.createFileItem(downloadFile, downloadFile.getName());
+        MultipartFile mfile = new CommonsMultipartFile(fileItem);
+        String fileName = handleFile(mfile);
         try {
             String url = systemConfiguration.build().putObject(fileName, file.getBytes());
             log.info("upload file complete, file URL: {}", url);

+ 2 - 2
lift-business-service/src/main/resources/mapper/contract/PaymentHistoryMapper.xml

@@ -19,7 +19,7 @@
     <select id="queryPaymentHistory" parameterType="java.lang.Long"
             resultType="cn.com.ty.lift.business.contract.dao.entity.model.response.PaymentHistoryResponse">
         SELECT ph.id,
-               ph.contract_id,
+               ph.contracts_id,
                ph.description,
                ph.before_content,
                ph.after_content,
@@ -28,7 +28,7 @@
                ui.name AS operatorName
         FROM payment_history ph
                  LEFT JOIN user_info ui ON ph.operator_id = ui.user_id
-        WHERE contract_id = #{contractId}
+        WHERE contracts_id = #{contractId}
     </select>
 
 </mapper>