Forráskód Böngészése

半成品/产成品入库通知

zbing 2 éve
szülő
commit
4e9584c738

+ 6 - 0
build.gradle

@@ -32,6 +32,12 @@ dependencies {
     implementation 'cn.hutool:hutool-captcha:5.8.5'
     implementation 'org.springframework.boot:spring-boot-starter-aop'
     implementation 'org.springframework.boot:spring-boot-starter-data-redis:2.5.4'
+    implementation 'com.google.zxing:core:3.5.1'
+    implementation 'com.google.zxing:javase:3.5.1'
+    implementation 'org.iherus:qrext4j:1.3.1'
+    implementation 'cn.afterturn:easypoi-base:4.4.0'
+    implementation 'cn.afterturn:easypoi-web:4.4.0'
+    implementation 'cn.afterturn:easypoi-annotation:4.4.0'
     //excel导入导出
     implementation 'org.apache.poi:poi-ooxml:3.16'
     //接口调用

+ 12 - 0
src/main/java/com/tld/controller/GsAccessController.java

@@ -106,4 +106,16 @@ public class GsAccessController {
     public Map<String, Object> addAskGoodsNoProd(@RequestBody List<Map<String,Object>> mapList){
         return inviteService.addAskGoodsNoProd(mapList);
     }
+
+    /**
+     * 半成品/产成品入库通知
+     * @param mapList 参数
+     * @return 返回结果
+     */
+    @PostMapping("prodStockInNotice")
+    @PassToken
+    public Map<String, Object> prodStockInNotice(@RequestBody List<Map<String,Object>> mapList){
+        return inviteService.prodStockInNotice(mapList);
+    }
+
 }

+ 116 - 0
src/main/java/com/tld/controller/WebPrintController.java

@@ -0,0 +1,116 @@
+package com.tld.controller;
+
+
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.tld.util.MyQRUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 打印二维码
+ */
+@RestController
+@RequestMapping("/Printer")
+public class WebPrintController {
+    private static final Log logger = LogFactory.getLog(MyQRUtils.class);
+
+    /**
+     * 二维码预览页面
+     * @param model
+     * @return
+     */
+     @PostMapping("/showList")
+     public  String  showQRList(Model model){
+         //模拟获取数据库数据
+         List listData = new ArrayList();
+         StringBuffer ids = new StringBuffer();
+         String code = "print00";
+         for (int i = 0; i < 3; i++) {
+             Map<String,String> map = new HashMap<String,String>(); //模拟VO
+             map.put("id",code+""+i);
+             ids.append(code+""+i).append(",");
+             listData.add(map);
+         }
+         model.addAttribute("showListData", listData);
+         model.addAttribute("ids", ids);
+         return "showQR";
+     }
+
+    /**
+     * 二维码打印页面
+     * 隐藏在iframe中
+     * @param model
+     * @return
+     */
+    @PostMapping("/printEWM")
+    public  String  printQRFrame(Model model, HttpServletRequest request){
+         String ids = request.getParameter("ids");
+         model.addAttribute("ids", ids);
+         return "printFrameQR";
+    }
+
+    /**
+     * 显示二维码图片保存打印
+     * @param request
+     * @param response
+     * @throws Exception
+     */
+     @PostMapping("/showEWMImage")
+     public void showImageByType(HttpServletRequest request, HttpServletResponse response){
+                 String id = request.getParameter("showID"); //ID
+
+                 //此处可从数据库中获取内容
+                 String content ="打印二维码\n打印测试\nID:"+id;
+                 //content   二维码中的信息
+
+                 OutputStream outStream = null;
+                 try {
+                         outStream = response.getOutputStream();
+                         String format = "jpg";
+                         String type = "png" ;
+                         String bottomText = ""; //水印文字
+                         //生成二维码前的配置信息
+                         BitMatrix bitMatrix = MyQRUtils.setBitMatrix(content, 30 , 30);
+                         //暂时不使用LOGO图片
+                         //以流的形式展示
+                         MyQRUtils.megerToFile(bitMatrix, format, outStream, null,bottomText);
+                         //定义路径,用绝对路径
+                        Path file = new File("D:/workspace/code.png").toPath();
+                     System.out.println("---路径---"+file.toFile());
+                        //生成路径并且保存文件
+                        MatrixToImageWriter.writeToPath(bitMatrix,type,file);
+                        //开始打印
+                         MyQRUtils.getPrint(file.toFile());
+
+                 } catch (Exception e) {
+                         logger.error("二维码生成失败", e);
+                     }finally{
+                         try {
+                                if(outStream!=null){
+                                         outStream.flush();
+                                         outStream.close();
+                                     }
+                            } catch (IOException e) {
+                                logger.error("关闭数据流失败", e);
+                            }
+                     }
+     }
+
+
+}

+ 2 - 0
src/main/java/com/tld/mapper/InviteMapper.java

@@ -72,4 +72,6 @@ public interface InviteMapper {
     String getScanNum(AskGoods askGoods1);
 
     void updateOutNum(String num, String askGoodsId, String materialId);
+
+    void addNotice(List<Map<String, Object>> List);
 }

+ 2 - 0
src/main/java/com/tld/service/InviteService.java

@@ -18,4 +18,6 @@ public interface InviteService {
     Map<String, Object> addAskGoodsVitrual(AskGoods askGoods);
 
     Map<String, Object> OutOfLibrary(String uniqueCode, String type, String askGoodsId);
+
+    Map<String, Object> prodStockInNotice(List<Map<String, Object>> mapList);
 }

+ 17 - 0
src/main/java/com/tld/service/impl/InviteServiceImpl.java

@@ -3,6 +3,7 @@ package com.tld.service.impl;
 import com.tld.mapper.InviteMapper;
 import com.tld.model.AskGoods;
 import com.tld.model.Inventory;
+import com.tld.model.Notice;
 import com.tld.model.ReturRemoval;
 import com.tld.service.InviteService;
 import org.redisson.api.RLock;
@@ -176,6 +177,22 @@ public class InviteServiceImpl implements InviteService {
         }
         return map;
     }
+
+    @Override
+    public Map<String, Object> prodStockInNotice(List<Map<String, Object>> mapList) {
+        Map<String, Object> map = new HashMap<>();
+        try {
+            inviteMapper.addNotice(mapList);
+            map.put("status", "0000");
+            map.put("msg","成功");
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("status", "0009");
+            map.put("msg", "服务器请求异常,请稍后再试");
+        }
+        return map;
+    }
+
     /**
      * 出库单生成
      * @return

+ 239 - 0
src/main/java/com/tld/util/MyQRUtils.java

@@ -0,0 +1,239 @@
+package com.tld.util;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.WriterException;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.poi.hssf.usermodel.HSSFCellStyle;
+import org.apache.poi.hssf.usermodel.HSSFFont;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+
+import javax.imageio.ImageIO;
+import javax.print.*;
+import javax.print.attribute.*;
+import javax.print.attribute.standard.JobName;
+import javax.print.attribute.standard.MediaPrintableArea;
+import javax.print.attribute.standard.MediaSizeName;
+import javax.print.attribute.standard.OrientationRequested;
+import javax.print.event.PrintJobEvent;
+import javax.print.event.PrintJobListener;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.awt.print.PrinterJob;
+import java.io.*;
+import java.util.Hashtable;
+import java.util.Locale;
+
+
+/**
+ * 二维码图片打印机工具类
+ */
+public class MyQRUtils {
+
+    private static final Log logger = LogFactory.getLog(MyQRUtils.class);
+
+    private static final int BLACK = 0xFF000000;
+    private static final int WHITE = 0xFFFFFFFF;
+    private static final int LogoPart = 4;
+
+    /**
+      * 生成二维码前的配置信息
+      * @param content 生成二维码图片内容
+      * @param width   二维码图片的宽度
+      * @param height  二维码图片的高度
+      * @return
+      */
+    public static BitMatrix setBitMatrix(String content, int width, int height){
+        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
+        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
+        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);  //指定纠错等级
+        BitMatrix bitMatrix=null;
+        try {
+            //生成二维码
+            bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
+        } catch (WriterException e) {
+            logger.error("生成二维码错误",e);
+         }
+         return bitMatrix;
+    }
+
+    /**
+     * 将LOGO图片放在二维码中间(水印效果)
+     * 将生成的图片以流的形式输出到页面展示
+     * @param matrix          BitMatrix
+     * @param format          图片格式
+     * @param outStream       输出流
+     * @param logoPath        LOGO地址
+     * @param showBottomText  二维码图片底部需要显示的问题
+     * @throws IOException
+     */
+    public static void megerToFile(BitMatrix matrix,String format,OutputStream outStream,String logoPath,String showBottomText) throws IOException {
+                 BufferedImage image = toBufferedImage(matrix);
+                Graphics2D gs = image.createGraphics();
+
+                 //1.加入LOGO水印效果
+                 if(null != logoPath && !"".equals(logoPath)){
+                         //1.1 载入LOGO图片
+                         BufferedImage logoImg = ImageIO.read(new File(logoPath));
+                         //1.2 考虑到LOGO图片贴到二维码中,建议大小不要超过二维码的1/5;
+                         int width = image.getWidth() / LogoPart;
+                         int height = image.getHeight() / LogoPart;
+                         //1.3 LOGO居中显示
+                         int x = (image.getWidth() - width) / 2;
+                         int y = (image.getHeight() - height) / 2;
+                         gs.drawImage(logoImg, x, y, logoImg.getWidth(), logoImg.getHeight(), null);
+                         logoImg.flush();
+                     }
+                 //2.二维码图片底部插入文字
+                 if(null != showBottomText && !"".equals(showBottomText)){
+                         //2.1 设置字体样式
+                         Font font = new Font("微软雅黑", Font.PLAIN, 14);
+                         gs.setColor(Color.BLACK);
+                         gs.setFont(font);
+                         //2.2 字体显示位置
+                         int x = (image.getWidth() - getWatermarkLength(showBottomText, gs))/2;
+                         int y = image.getHeight()-2;
+                         gs.drawString(showBottomText, x, y);
+                     }
+                 gs.dispose();
+                 ImageIO.write(image, format, outStream);
+    }
+
+    /**
+     * 将LOGO图片放在二维码中间(水印效果)
+     * 将生成的图片生成到本地硬盘路径下
+     * @param matrix          BitMatrix
+     * @param format          图片格式
+     * @param imagePath       图片存放路径
+      * @param logoPath        LOGO地址
+      * @param showBottomText  二维码图片底部需要显示的问题
+      * @throws IOException
+      */
+     public static void megerToFile2(BitMatrix matrix,String format,String imagePath,String logoPath,String showBottomText) throws IOException {
+                 BufferedImage image = toBufferedImage(matrix);
+                 Graphics2D gs = image.createGraphics();
+
+                 //1.加入LOGO水印效果
+                 if(null != logoPath && !"".equals(logoPath)){
+                         BufferedImage logoImg = ImageIO.read(new File(logoPath));
+                         int width = image.getWidth() / LogoPart;
+                         int height = image.getHeight() / LogoPart;
+                         int x = (image.getWidth() - width) / 2;
+                         int y = (image.getHeight() - height) / 2;
+                         gs.drawImage(logoImg, x, y, logoImg.getWidth(), logoImg.getHeight(), null);
+                         logoImg.flush();
+                     }
+
+                 //2.二维码图片底部插入文字
+                 if(null != showBottomText && !"".equals(showBottomText)){
+                         //2.1 设置字体样式
+                         Font font = new Font("微软雅黑", Font.PLAIN, 14);
+                         gs.setColor(Color.BLACK);
+                         gs.setFont(font);
+                         //2.2 字体显示位置
+                         int x = (image.getWidth() - getWatermarkLength(showBottomText, gs))/2;
+                         int y = image.getHeight()-2;
+                         gs.drawString(showBottomText, x, y);
+                     }
+                 gs.dispose();
+                 ImageIO.write(image, format, new File(imagePath));
+     }
+
+    /**
+     * 获取水印字体的长度
+     * @param fontString
+     * @param gs
+     * @return
+     */
+     public static int getWatermarkLength(String fontString,Graphics2D gs){
+         return gs.getFontMetrics(gs.getFont()).charsWidth(fontString.toCharArray(),0,fontString.length());
+     }
+
+    public static BufferedImage toBufferedImage(BitMatrix matrix){
+         int width = matrix.getWidth();
+        int height = matrix.getHeight();
+         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
+
+       for(int x=0;x<width;x++){
+            for(int y=0;y<height;y++){
+                 image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
+             }
+         }
+        return image;
+     }
+
+
+    /**
+     * 打印保存的图片/二维码
+     * @param file
+     * @return
+     */
+    public static void getPrint(File file ){
+        // 构建打印请求属性集
+        DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
+        // 设置打印格式
+        PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
+        // 查找所有的打印服务
+        PrintService[] printServices = PrintServiceLookup.lookupPrintServices(flavor, pras);
+        //循环打印机名称
+        for (int i = 0; i < printServices.length; i++) {
+            String name = printServices[i].getName();
+            System.out.println("打印机名称:"+name);
+        }
+        // 测试,直接用第一个了
+        PrintService printService = printServices[0];
+        String printName = printService.getName();
+        File picFile = new File(file.toURI());
+        if (!picFile.exists() || !picFile.isFile()) {
+            return;
+        }
+        String fileName = picFile.getName();
+        // 获取图片后缀名,设置打印文件格式
+        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
+        switch (suffix) {
+            case "jpg":
+            case "jpeg":
+                flavor = DocFlavor.INPUT_STREAM.JPEG;
+                break;
+            case "png":
+                flavor = DocFlavor.INPUT_STREAM.PNG;
+                break;
+            case "pdf":
+                flavor = DocFlavor.INPUT_STREAM.PDF;
+                break;
+            case "gif":
+                flavor = DocFlavor.INPUT_STREAM.GIF;
+            default:
+                break;
+        }
+        // 设置打印文件名
+        pras.add(new JobName(fileName, Locale.CHINA));
+        // 设置打印方向
+        pras.add(OrientationRequested.LANDSCAPE);
+        // 设置打印区域
+        MediaPrintableArea mp = new MediaPrintableArea(0, 0, 100, 100, Size2DSyntax.MM);
+        pras.add(mp);
+        try {
+            FileInputStream fis = new FileInputStream(picFile);
+            HashDocAttributeSet das = new HashDocAttributeSet();
+            // 使用打印服务生成打印任务
+            DocPrintJob job = printService.createPrintJob();
+            // 获取需要打印的文档类doc
+            SimpleDoc doc = new SimpleDoc(fis, flavor, das);
+            job.print(doc, pras);
+        } catch (PrintException e) {
+            e.printStackTrace();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+}

+ 25 - 0
src/main/resources/mapper/InviteMapper.xml

@@ -239,6 +239,31 @@
         insert into tld_return_gs_removal(document_id,removal_code,source_type,move_type,scrq,delivery_type)
         values(#{documentId},#{removalCode},#{sourceType},#{moveType},now(),#{deliveryType})
     </insert>
+    <!-- 半成品/产成品入库通知 -->
+    <insert id="addNotice">
+        insert into tld_notice_f (notice_id, notice_code, company_number, notice_time, source_type, move_type)
+        values
+        <foreach collection="list" index="index" item="item" separator=",">
+            (#{item.stockInNoticeId},#{item.stockInNoticeNo},#{item.companyNo},#{item.noticeDate},#{item.sourceType},#{item.moveType})
+        </foreach>
+        ;
+        insert into tld_notice ( notice_id, entry_number, production_code, material_id, wbs, measurement_id, num, type, warehousing_num )
+        values
+        <foreach collection="list" index="index" item="item" separator=",">
+            <foreach collection="item.datalist" index="index" item="items" separator=",">
+                (#{item.stockInNoticeId},#{items.entryNumber},#{items.prodOrderNo},#{items.materialId},#{items.WBS},#{items.measUnitId},#{items.orderCount},0,0)
+            </foreach>
+        </foreach>
+        ;
+        insert into tld_notice_log (notice_id, notice_code, company_number, notice_time, source_type, move_type,entry_number, production_code, material_id, wbs, measurement_id, num, type, warehousing_num)
+        values
+        <foreach collection="list" index="index" item="item" separator=",">
+            <foreach collection="item.datalist" index="index" item="items" separator=",">
+                (#{item.stockInNoticeId},#{item.stockInNoticeNo},#{item.companyNo},#{item.noticeDate},#{item.sourceType},#{item.moveType},#{items.entryNumber},#{items.prodOrderNo},#{items.materialId},#{items.WBS},#{items.measUnitId},#{items.orderCount},0,0)
+            </foreach>
+        </foreach>
+        ;
+    </insert>
     <!-- 查询当天出库数量 -->
     <select id="getReturnRemovalCount" resultType="int">
         select count(*) from tld_return_gs_removal where scrq BETWEEN CONCAT(CURDATE(),' 00:00:00') AND CONCAT(CURDATE(),' 23:59:59');