Просмотр исходного кода

质检-影像资料
1、添加codes 起止编号
2、给pdf上添加值
3、上传新pdf 删除旧pdf

LHB 1 месяц назад
Родитель
Сommit
cef7e572ef

+ 4 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/Album.java

@@ -61,6 +61,10 @@ public class Album extends BaseEntity {
 	*/
 		private String groupNumber;
 	/**
+	* 起止编号
+	*/
+		private String codes;
+	/**
 	* 开始日期
 	*/
 		private String startDate;

+ 2 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/AlbumController.java

@@ -419,13 +419,8 @@ public class AlbumController extends BladeController {
 	@ApiOperationSupport(order = 5)
 	@ApiOperation(value = "修改", notes = "传入album")
 	public R update(@Valid @RequestBody AlbumDTO albumDTO) {
-		Album album=new Album();
-		BeanUtil.copy(albumDTO,album);
-		String dateValue = albumDTO.getDateValue();
-		String[] strings = dateValue.split("~");
-		album.setStartDate(strings[0]);
-		album.setEndDate(strings[1]);
-		return R.status(albumService.updateById(album));
+
+		return R.status(albumService.update(albumDTO));
 	}
 
 //	/**

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IAlbumService.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.manager.service;
 
+import org.springblade.manager.dto.AlbumDTO;
 import org.springblade.manager.entity.Album;
 import org.springblade.manager.vo.AlbumVO;
 import org.springblade.core.mp.base.BaseService;
@@ -40,4 +41,6 @@ public interface IAlbumService extends BaseService<Album> {
 
 
 	IPage<AlbumVO> selectPage1(Long projectId, Long contractId, IPage<AlbumVO> page);
+
+	boolean update(AlbumDTO albumDTO);
 }

+ 84 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/AlbumServiceImpl.java

@@ -17,18 +17,32 @@
 package org.springblade.manager.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.ResourceUtil;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.manager.dto.AlbumDTO;
 import org.springblade.manager.entity.Album;
+import org.springblade.manager.utils.FileUtils;
+import org.springblade.manager.utils.PhotoAndNegativeNumberFiller;
 import org.springblade.manager.vo.AlbumVO;
 import org.springblade.manager.mapper.AlbumMapper;
 import org.springblade.manager.service.IAlbumService;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.resource.feign.NewIOSSClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.util.List;
 
 /**
- *  服务实现类
+ * 服务实现类
  *
  * @author BladeX
  * @since 2025-07-15
@@ -41,14 +55,75 @@ public class AlbumServiceImpl extends BaseServiceImpl<AlbumMapper, Album> implem
 //		return page.setRecords(baseMapper.selectAlbumPage(page, album));
 //	}
 
-	@Override
-	public IPage<AlbumVO> selectPage1(Long projectId, Long contractId, IPage<AlbumVO> page) {
-		Long count = baseMapper.selectCount(new LambdaQueryWrapper<>(Album.class).eq(Album::getProjectId, projectId).eq(Album::getContractId, contractId));
-		page.setTotal(count);
-		List<AlbumVO> albumVOS = baseMapper.selectAlbumPages(projectId, contractId, (page.getCurrent()-1)*page.getSize(),page.getSize());
-		page.setRecords(albumVOS);
-		return page;
-	}
+    @Autowired
+    private NewIOSSClient newIOSSClient;
 
+    @Override
+    public IPage<AlbumVO> selectPage1(Long projectId, Long contractId, IPage<AlbumVO> page) {
+        Long count = baseMapper.selectCount(new LambdaQueryWrapper<>(Album.class).eq(Album::getProjectId, projectId).eq(Album::getContractId, contractId));
+        page.setTotal(count);
+        List<AlbumVO> albumVOS = baseMapper.selectAlbumPages(projectId, contractId, (page.getCurrent() - 1) * page.getSize(), page.getSize());
+        page.setRecords(albumVOS);
+        return page;
+    }
 
+    @Override
+    public boolean update(AlbumDTO albumDTO) {
+        Album album = new Album();
+        BeanUtil.copy(albumDTO, album);
+        String dateValue = albumDTO.getDateValue();
+        String[] strings = dateValue.split("~");
+        album.setStartDate(strings[0]);
+        album.setEndDate(strings[1]);
+
+        //pdf文件
+        String imagesPdf = albumDTO.getImagesPdf();
+        String codes = albumDTO.getCodes();
+
+        //起止编号
+        Integer startInt = null , endInt = null;
+        if (StringUtil.isNotBlank(codes)) {
+            startInt = 1;
+        } else if (codes.contains("~")){
+            //存在起止值
+            String[] split = codes.split("~");
+            startInt = Integer.valueOf(split[0]);
+            endInt = Integer.valueOf(split[1]);
+        } else{
+            startInt = Integer.valueOf(codes);
+        }
+
+
+
+        try {
+            //写入临时文件 在上传到oss 再删除旧文件和临时文件
+            try {
+                String filePath = FileUtils.getSysLocalFileUrl();
+                Long id = SnowFlakeUtil.getId();
+                String trialPdf = filePath + "/pdf/" + id + ".pdf";
+                int endValue = PhotoAndNegativeNumberFiller.fillNumbers(imagesPdf, trialPdf, startInt, endInt, albumDTO.getGroupNumber());
+                File trialPdf2 = ResourceUtil.getFile(trialPdf);
+
+                if (trialPdf2.exists()) {
+                    trialPdf2.delete();
+                }
+                //合并日志pdf
+                BladeFile bladeFile = this.newIOSSClient.uploadFile(id + ".pdf", trialPdf);
+                if (bladeFile != null && ObjectUtils.isNotEmpty(bladeFile.getLink())) {
+                    album.setCodes(startInt + "~" + endValue);
+                    album.setImagesPdf(bladeFile.getLink());
+
+                    //删除旧pdf
+                    String pdfName = imagesPdf.split("upload")[1];
+                    this.newIOSSClient.removeFile("upload" + pdfName);
+                }
+
+                return updateById(album);
+            } catch (FileNotFoundException e) {
+                throw new RuntimeException(e);
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
 }

+ 178 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/PhotoAndNegativeNumberFiller.java

@@ -0,0 +1,178 @@
+package org.springblade.manager.utils;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.common.PDRectangle;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
+import org.apache.pdfbox.text.PDFTextStripper;
+import org.apache.pdfbox.text.TextPosition;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.manager.service.impl.AlbumServiceImpl;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+/**
+ * 识别pdf 照片号和底片号
+ * @author LHB
+ */
+public class PhotoAndNegativeNumberFiller {
+    // 内部类用于存储标记位置信息
+    private static class MarkerPosition {
+        int pageIndex;
+        float x;
+        float y;
+        float width;
+        float height;
+        boolean isPhotoMarker; // true表示照片号,false表示底片号
+
+        MarkerPosition(int pageIndex, float x, float y, float width, float height, boolean isPhotoMarker) {
+            this.pageIndex = pageIndex;
+            this.x = x;
+            this.y = y;
+            this.width = width;
+            this.height = height;
+            this.isPhotoMarker = isPhotoMarker;
+        }
+    }
+
+
+    /**
+     * @param inputPath 旧pdf地址
+     * @param outputPath 新pdf地址
+     * @param initialValue 开始值
+     * @param endValue 结束值
+     * @param negativeNumber 底片号
+     * @throws IOException
+     */
+    public static int fillNumbers(String inputPath, String outputPath,
+                            int initialValue, Integer endValue,
+                            String negativeNumber) throws IOException {
+
+        List<MarkerPosition> markers = new ArrayList<>();
+        int currentPhotoNumber = initialValue;
+
+        try (PDDocument document = PDDocument.load(CommonUtil.getOSSInputStream(inputPath))) {
+            // 第一步:查找所有【照片号:】和【底片号:】标记的位置
+            PDFTextStripper stripper = new PDFTextStripper() {
+                private int currentPage = 0;
+
+                @Override
+                protected void startPage(PDPage page) throws IOException {
+                    super.startPage(page);
+                }
+
+                @Override
+                protected void writeString(String string, List<TextPosition> textPositions) throws IOException {
+                    /// 检查是否包含目标文本
+                    if (string.contains("照片号:")) {
+                        // 找到目标文本的位置
+                        for (TextPosition text : textPositions) {
+                            String unicode = text.getUnicode();
+                            if (unicode.contains(":")) {
+                                // 记录冒号后的位置
+                                float x = text.getXDirAdj() + text.getWidthDirAdj();
+                                float y = text.getYDirAdj();
+                                float width = text.getWidthDirAdj();
+                                float height = text.getHeightDir();
+
+                                markers.add(new MarkerPosition(
+                                        currentPage,
+                                        x, y, width, height, true
+                                ));
+                            }
+                        }
+                    }
+
+                    /// 检查是否包含目标文本
+                    if (string.contains("底片号:")) {
+                        // 找到目标文本的位置
+                        for (TextPosition text : textPositions) {
+                            String unicode = text.getUnicode();
+                            if (unicode.contains(":")) {
+                                // 记录冒号后的位置
+                                float x = text.getXDirAdj() + text.getWidthDirAdj();
+                                float y = text.getYDirAdj();
+                                float width = text.getWidthDirAdj();
+                                float height = text.getHeightDir();
+
+                                markers.add(new MarkerPosition(
+                                        currentPage,
+                                        x, y, width, height, false
+                                ));
+                            }
+                        }
+                    }
+                }
+
+                @Override
+                protected void endPage(PDPage page) throws IOException {
+                    super.endPage(page);
+                    currentPage++;
+                }
+            };
+
+            // 处理所有页面以查找标记
+            stripper.getText(document);
+
+            // 第二步:在标记位置填充号码
+            for (int i = 0; i < document.getNumberOfPages(); i++) {
+                PDPage page = document.getPage(i);
+                PDRectangle pageSize = page.getMediaBox();
+
+                // 收集当前页的所有标记
+                List<MarkerPosition> pageMarkers = new ArrayList<>();
+                for (MarkerPosition marker : markers) {
+                    if (marker.pageIndex == i) {
+                        pageMarkers.add(marker);
+                    }
+                }
+
+                if (!pageMarkers.isEmpty()) {
+                    try (PDPageContentStream contentStream = new PDPageContentStream(
+                            document, page, PDPageContentStream.AppendMode.APPEND, true, true)) {
+
+                        contentStream.setFont(PDType1Font.HELVETICA, 10);
+                        contentStream.setNonStrokingColor(0, 0, 0); // 黑色
+
+                        // 计算并绘制号码
+                        for (MarkerPosition marker : pageMarkers) {
+
+                            if (endValue != null && currentPhotoNumber > endValue) {
+                                break;
+                            }
+
+                            // 调整坐标系统
+                            float x = marker.x + 2;
+                            float y = pageSize.getHeight() - marker.y - marker.height + 4;
+
+                            contentStream.beginText();
+                            contentStream.newLineAtOffset(x, y);
+
+                            if (marker.isPhotoMarker) {
+                                // 处理照片号
+                                if (endValue != null && currentPhotoNumber > endValue) {
+                                    continue; // 跳过超过结束值的照片号
+                                }
+
+                                contentStream.showText(String.valueOf(currentPhotoNumber));
+                                currentPhotoNumber++;
+                            } else {
+                                // 处理底片号
+                                contentStream.showText(negativeNumber);
+                            }
+
+                            contentStream.endText();
+                        }
+                    }
+                }
+            }
+
+            // 保存文档
+            document.save(outputPath);
+        }
+
+        return currentPhotoNumber - 1;
+    }
+}