diff --git a/pom.xml b/pom.xml index 43f4223..a1eb8f0 100644 --- a/pom.xml +++ b/pom.xml @@ -282,6 +282,17 @@ org.springframework.boot spring-boot-starter-websocket + + + com.google.zxing + core + 3.4.1 + + + com.google.zxing + javase + 3.4.1 + diff --git a/src/main/java/com/dsic/gj_erp/Test.java b/src/main/java/com/dsic/gj_erp/Test.java index 6da244f..cebc834 100644 --- a/src/main/java/com/dsic/gj_erp/Test.java +++ b/src/main/java/com/dsic/gj_erp/Test.java @@ -1,32 +1,143 @@ package com.dsic.gj_erp; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.StrUtil; +import cn.hutool.core.date.TimeInterval; +import cn.hutool.extra.qrcode.QrCodeUtil; +import cn.hutool.extra.qrcode.QrConfig; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.WriterException; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.PDPageTree; +import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory; +import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; +import org.apache.pdfbox.text.PDFTextStripper; +import org.apache.pdfbox.text.PDFTextStripperByArea; +import java.awt.*; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; public class Test { public static void main(String[] args) throws IOException { - System.out.println(DateUtil.thisYear()); +// System.out.println(DateUtil.thisYear()); // System.out.println(StrUtil.padPre("1",3,"0")); //String aaa="gagagag"; //System.out.println(aaa.split("@")[0]); //System.out.println("aaa = " + String.format("%03d",1)); +// MatrixToImageWriter. -// String pdfFilePath = "E:/B046HC103HN第046批量数控套料图2023-05-11.pdf"; // PDF文件路径 -// PDDocument document = PDDocument.load(new File(pdfFilePath)); + TimeInterval timer = DateUtil.timer(); + String pdfFilePath = "E:\\T300K-130_1_20250106\\PDF\\B001HC103HN数控套料图.pdf"; // PDF文件路径 + PDDocument document = PDDocument.load(new File(pdfFilePath)); // PDFTextStripper stripper = new PDFTextStripper(); // String text = stripper.getText(document); -// document.close(); +// String[] split = text.split("\\n"); + +// List list = new ArrayList<>(); + QrConfig config = new QrConfig(300, 300);//二维码宽/高 + // 设置边距,既二维码和背景之间的边距(即白边大小) + config.setMargin(0); + // 设置前景色,既二维码颜色(青色) + //config.setForeColor(Color.CYAN.getRGB()); + // 设置背景色(灰色) + //config.setBackColor(Color.GRAY.getRGB()); + +// for (int i = 0; i < split.length; i++) { +// String str = split[i]; + +// if (str.contains("船名 批量 图纸比例 套料图号 图号 页码")) { +// str = split[i - 4]; +// QrCodeDto qrCodeDto = new QrCodeDto(); +// try { +// qrCodeDto.page = Integer.parseInt(str.split(" ")[0]); +// }catch (Exception e){ +// str = split[i - 3]; +// qrCodeDto.page = Integer.parseInt(str.split(" ")[0]); +// } // -// // 输出提取的文本到控制台 +// list.add(qrCodeDto); +// } +// if (str.contains("序号 零件属性零件编号 零件属性 零件属性 零件属性序号 序号 序号零件编号 零件编号 零件编号")) { +// str = split[i + 1]; +// if (!list.isEmpty()) { +// String[] split1 = str.split(" "); +// String dcch = split1[0]; +// String dcpl = split1[1]; +// String tzbh = split1[3]; +// QrCodeDto qrCodeDto = list.get(list.size() - 1); +//// BitMatrix qrcode = createQrcode(String.format("%s_%s_%s", dcch, dcpl, tzbh)); +//// assert qrcode != null; +// //qrCodeDto.bufferedImage = MatrixToImageWriter.toBufferedImage(qrcode); +// qrCodeDto.bufferedImage = QrCodeUtil.generate(String.format("%s_%s_%s", dcch, dcpl, tzbh), config); +//// +// } +// } +// } + + for (int pageNumber = 1; pageNumber < document.getNumberOfPages(); ++pageNumber) { + PDPage page = document.getPage(pageNumber); + String textByRegion = getTextByRegion(page, 80, 50, 1100, 40); +// System.out.println(textByRegion); + String[] split = textByRegion.split(" "); + String dcch = split[1]; + String dcpl = split[3]; + String tzbh = split[7]; + String pageIndex = split[12]; + BufferedImage bufferedImage = QrCodeUtil.generate(String.format("%s_%s_%s", dcch, dcpl, tzbh), config); + PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true); + PDImageXObject qrCodeImage = JPEGFactory.createFromImage(document, bufferedImage); + contentStream.drawImage(qrCodeImage, 10, 10, 75, 75); // 在PDF中的坐标位置添加二维码 + contentStream.close(); + } + + document.save("E:/updated_document.pdf"); + document.close(); + System.out.println(timer.interval()); + // 输出提取的文本到控制台 // System.out.println(text); -// -// // 可以选择将文本写入文件 -// String outputPath = "E:/B046HC103HN第046批量数控套料图2023-05-11.txt"; // 输出文本文件路径 -// Files.write(Paths.get(outputPath), text.getBytes()); + + // 可以选择将文本写入文件 + //String outputPath = "E:/B001HC103HN数控套料图.txt"; // 输出文本文件路径 + //Files.write(Paths.get(outputPath), text.getBytes()); } + + private static BitMatrix createQrcode(String dataToEncode) { + QRCodeWriter qrCodeWriter = new QRCodeWriter(); + int width = 200; + int height = 200; + BitMatrix bitMatrix = null; + try { + return qrCodeWriter.encode(dataToEncode, BarcodeFormat.QR_CODE, width, height); + } catch (WriterException e) { + e.printStackTrace(); + } + return null; + } + + private static String getTextByRegion(PDPage page,double x,double y,double width,double height) throws IOException { + PDFTextStripperByArea stripper = new PDFTextStripperByArea(); + stripper.setSortByPosition(true); + stripper.addRegion("textRegion", new Rectangle2D.Double(x, y, width, height)); // 假设二维码区域是100x100,从(100,100)开始 + stripper.extractRegions(page); + return stripper.getTextForRegion("textRegion"); // 获取二维码区域的文本 + } + + + static class QrCodeDto { + public int page; + public BufferedImage bufferedImage; + } + } diff --git a/src/main/java/com/dsic/gj_erp/mapper/KbanMapper.java b/src/main/java/com/dsic/gj_erp/mapper/KbanMapper.java index 047eef3..cdf5761 100644 --- a/src/main/java/com/dsic/gj_erp/mapper/KbanMapper.java +++ b/src/main/java/com/dsic/gj_erp/mapper/KbanMapper.java @@ -14,7 +14,7 @@ public interface KbanMapper { List> getProjects(); //线表重量 - List getEveryMonXbzlByNf(String nf); + List getEveryMonXbzlByNf(String nf,Integer version); //作业计划完成重量 List> getEveryCompZlByNf(String from, String to); @@ -48,7 +48,7 @@ public interface KbanMapper { Map todayZyjhzx(String from, String to); - List> xbgtt(String nf); + List> xbgtt(String nf,Integer version); List> zrcpcsl(String from, String to); diff --git a/src/main/java/com/dsic/gj_erp/service/KbanService.java b/src/main/java/com/dsic/gj_erp/service/KbanService.java index e961a08..0ab7476 100644 --- a/src/main/java/com/dsic/gj_erp/service/KbanService.java +++ b/src/main/java/com/dsic/gj_erp/service/KbanService.java @@ -1,14 +1,15 @@ package com.dsic.gj_erp.service; +import java.io.File; import java.math.BigDecimal; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; +import cn.hutool.core.io.FileUtil; import com.dsic.gj_erp.bean.xiaochi.Device; import com.dsic.gj_erp.mapper.xiaochi.DeviceMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.dsic.gj_erp.bean.jhgk.DmYdjh; @@ -19,12 +20,15 @@ import cn.hutool.core.date.DateUtil; import lombok.AllArgsConstructor; @Service -@AllArgsConstructor +@RequiredArgsConstructor public class KbanService { private final KbanMapper kbanMapper; private final DeviceMapper deviceMapper; + @Value("${xbjh-path}") + String xbjhPath; + public List getDeviceStatus(){ return deviceMapper.getDeviceStatus(); } @@ -57,7 +61,8 @@ public class KbanService { } public List> xbgtt(String nf){ - return kbanMapper.xbgtt(nf); + + return kbanMapper.xbgtt(nf,this.getMaxVersion()); } public Map todayZyjhzx() { @@ -227,7 +232,8 @@ public class KbanService { } public List getEveryMonXbzlByNf(String nf) { - return kbanMapper.getEveryMonXbzlByNf(nf); + + return kbanMapper.getEveryMonXbzlByNf(nf,this.getMaxVersion()); } public List> getEveryCompZlByNf(String nf) { @@ -236,4 +242,26 @@ public class KbanService { return kbanMapper.getEveryCompZlByNf(from.toString("yyyy/MM/dd"), to.toString("yyyy/MM/dd")); } + private Integer getMaxVersion(){ + File[] files = FileUtil.ls(xbjhPath); + AtomicInteger maxVersion = new AtomicInteger(0); + if (files.length > 0) { + HashSet names = new HashSet<>(); + for (File file1 : files) { + String name = FileUtil.getPrefix(file1.getName()); + if (name.contains(DateUtil.thisYear()+"")){ + String[] s = name.split("_"); + names.add(s[s.length - 1]); + } + } + + names.stream() + .max(String::compareTo) + .ifPresent(item -> { + String v = item.replace("v", ""); + maxVersion.set(Integer.parseInt(v)); + }); + } + return maxVersion.get(); + } } diff --git a/src/main/resources/mappers/kban/KbanMapper.xml b/src/main/resources/mappers/kban/KbanMapper.xml index c1c2785..50e8c16 100644 --- a/src/main/resources/mappers/kban/KbanMapper.xml +++ b/src/main/resources/mappers/kban/KbanMapper.xml @@ -3,7 +3,7 @@ @@ -20,7 +22,7 @@ @@ -59,7 +66,7 @@ from dm_ydjh WHERE - jssj BETWEEN #{from} and #{to} + jssj BETWEEN #{from} and #{to} and lx='b' group by dc_ch ,dc_pl ,qgfkrq order by dc_ch ,dc_pl @@ -70,19 +77,19 @@ DISTINCT dc_ch ,dc_pl , sum(case when zt>=2 then 1 else 0 end ) OVER(PARTITION by dc_ch,dc_pl) jhsl, sum(case when zt>11 then 1 else 0 end ) OVER(PARTITION by dc_ch,dc_pl) 一区, - sum(case when zt>=62 and (SUBSTRING(tzbh,6,1)=1 or SUBSTRING(tzbh,6,1)=3) then 1 else 0 end ) OVER(PARTITION by dc_ch,dc_pl) 二区, - sum(case when zt>=62 and SUBSTRING(tzbh,6,1)=2 then 1 else 0 end ) OVER(PARTITION by dc_ch,dc_pl) 三区, - sum(case when zt>=62 and SUBSTRING(tzbh,6,1)=4 then 1 else 0 end ) OVER(PARTITION by dc_ch,dc_pl) 四区 + sum(case when zt>=62 and zyq1='二区' then 1 else 0 end ) OVER(PARTITION by dc_ch,dc_pl) 二区, + sum(case when zt>=62 and zyq1='三区' then 1 else 0 end ) OVER(PARTITION by dc_ch,dc_pl) 三区, + sum(case when zt>=62 and zyq1='四区' then 1 else 0 end ) OVER(PARTITION by dc_ch,dc_pl) 四区 from dm_ydjh WHERE - zt>=2 and jssj BETWEEN #{from} and #{to} + zt>=2 and jssj BETWEEN #{from} and #{to} and lx='b' and (SUBSTRING(tzbh,6,1)=1 or SUBSTRING(tzbh,6,1)=3) - - + + @@ -107,7 +114,7 @@ from dm_ydjh WHERE - slfkrq = #{today} or hxfkrq = #{today} or qgfkrq = #{today} + lx='b' and (slfkrq = #{today} or hxfkrq = #{today} or qgfkrq = #{today}) SELECT DISTINCT - SUM(isnull(b.bclqzl,0)/10000) over(PARTITION by dcch) zl,dcch dcCh - from dm_sygdxq a left join - (SELECT DISTINCT dcch,pl,tzbh,bclqzl from dm_bom ) b - on a.DC_CH =b.dcch and a.DC_PL =b.pl - where a.xzglxq BETWEEN #{from} and #{to} and isnull(dcch,'')!='' + SUM(isnull(bclqzl,0)/1000) over(PARTITION by dc_ch) as zl,dc_ch dcCh + from dm_sygd_mx + where jssj BETWEEN #{from} and #{to} and isnull(dc_ch,'')!='' - + SELECT sum(t) total from (SELECT DC_CH , DC_PL ,sum(1) t from dm_zrcjh where jssj_xz BETWEEN - #{from} and #{to} group by DC_CH,DC_PL ) a + #{from} and #{to} group by DC_CH,DC_PL ) a @@ -241,11 +244,9 @@