From da0dd8f78f404b0e36d23aa3ae22355274f2b4e9 Mon Sep 17 00:00:00 2001 From: zt Date: Sat, 6 Sep 2025 19:20:40 +0800 Subject: [PATCH] bug --- .../domain/BusPlanDocAssociation.java | 6 + .../domain/bo/BusPlanDocAssociationBo.java | 7 +- .../domain/vo/BusPlanDocAssociationVo.java | 6 +- .../impl/BusPurchaseDocServiceImpl.java | 32 +++- .../common/utils/PdfBoxQrCodeGenerator.java | 137 +++++++++++++++--- .../vo/volumefile/DesVolumeFileCodeVo.java | 5 + .../dromara/job/attendance/AttendanceJob.java | 19 ++- .../controller/OutMonthPlanController.java | 8 +- .../out/service/IOutMonthPlanService.java | 2 +- .../service/impl/OutMonthPlanServiceImpl.java | 31 ++-- .../impl/BusAttendanceServiceImpl.java | 21 ++- .../service/impl/SysUserServiceImpl.java | 6 +- 12 files changed, 213 insertions(+), 67 deletions(-) diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/BusPlanDocAssociation.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/BusPlanDocAssociation.java index c30ef0eb..db17d664 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/BusPlanDocAssociation.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/BusPlanDocAssociation.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serial; +import java.math.BigDecimal; /** * 物资-批次需求计划与采购单关联对象 bus_plan_doc_association @@ -37,6 +38,11 @@ public class BusPlanDocAssociation extends BaseEntity { */ private Long planId; + /** + * 需求数量 + */ + private BigDecimal demandQuantity; + /** * 采购联系单id */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/bo/BusPlanDocAssociationBo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/bo/BusPlanDocAssociationBo.java index c6be7935..9a2f743e 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/bo/BusPlanDocAssociationBo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/bo/BusPlanDocAssociationBo.java @@ -9,6 +9,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; +import java.math.BigDecimal; + /** * 物资-批次需求计划与采购单关联业务对象 bus_plan_doc_association * @@ -41,5 +43,8 @@ public class BusPlanDocAssociationBo extends BaseEntity { */ private Long docId; - + /** + * 需求数量 + */ + private BigDecimal demandQuantity; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/vo/BusPlanDocAssociationVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/vo/BusPlanDocAssociationVo.java index 5d35e650..69ff6b00 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/vo/BusPlanDocAssociationVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/vo/BusPlanDocAssociationVo.java @@ -10,6 +10,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; @@ -52,5 +53,8 @@ public class BusPlanDocAssociationVo implements Serializable { @ExcelProperty(value = "采购联系单id") private Long docId; - + /** + * 需求数量 + */ + private BigDecimal demandQuantity; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusPurchaseDocServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusPurchaseDocServiceImpl.java index 7fb9ce1a..1ce49d18 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusPurchaseDocServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusPurchaseDocServiceImpl.java @@ -57,6 +57,7 @@ import org.springframework.transaction.annotation.Transactional; import java.io.*; import java.math.BigDecimal; +import java.math.RoundingMode; import java.net.FileNameMap; import java.net.URLConnection; import java.net.URLEncoder; @@ -69,6 +70,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.stream.Collectors; /** * 物资-采购联系单Service业务层处理 @@ -184,6 +186,7 @@ public class BusPurchaseDocServiceImpl extends ServiceImpl 0; if (flag) { bo.setId(add.getId()); @@ -199,6 +202,30 @@ public class BusPurchaseDocServiceImpl extends ServiceImpl associationList){ + + for (BusPlanDocAssociationBo association : associationList) { + + BusMaterialbatchdemandplan byId = materialbatchdemandplanService.getById(association.getPlanId()); + + List list = planDocAssociationService.list(Wrappers.lambdaQuery(BusPlanDocAssociation.class) + .eq(BusPlanDocAssociation::getPlanId, association.getPlanId())); + BigDecimal total = list.stream() + .map(BusPlanDocAssociation::getDemandQuantity) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + if(total.add(association.getDemandQuantity()).compareTo(byId.getDemandQuantity()) > 0){ + throw new ServiceException("材料:" + byId.getName() + "已超出计划单的物料批次需求计划数量"); + } + } + + } + + + + /** * 修改物资-采购联系单 * @@ -320,8 +347,9 @@ public class BusPurchaseDocServiceImpl extends ServiceImpl planIds = planDocAssociationList.stream().map(BusPlanDocAssociation::getPlanId).toList(); - items = materialbatchdemandplanService.listByIds(planIds); + Map map = planDocAssociationList.stream().collect(Collectors.toMap(BusPlanDocAssociation::getPlanId, BusPlanDocAssociation::getDemandQuantity)); + items = materialbatchdemandplanService.listByIds(map.keySet()); + items.forEach(item -> item.setDemandQuantity(map.get(item.getId()))); } BusPurchaseDocWordDto data = this.getReplacementDto(purchaseDoc, items); Path newTargetDir = Paths.get(System.getProperty("user.dir"), constant.getBusPurchaseDocFileUrl(purchaseDoc, now)); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/common/utils/PdfBoxQrCodeGenerator.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/common/utils/PdfBoxQrCodeGenerator.java index 8e63cbd7..123130d6 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/common/utils/PdfBoxQrCodeGenerator.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/common/utils/PdfBoxQrCodeGenerator.java @@ -260,39 +260,53 @@ public class PdfBoxQrCodeGenerator { int numberOfPages = pdfDoc.getNumberOfPages(); - // 默认放大倍数为10倍 - float scaleMultiplier = 10.0f; - float baseQrSize = 80f; - float qrSize = baseQrSize * scaleMultiplier; - for (int pageNum = 1; pageNum <= numberOfPages; pageNum++) { PdfPage page = pdfDoc.getPage(pageNum); - Rectangle pageSize = page.getPageSize(); - float pageWidth = pageSize.getWidth(); - float pageHeight = pageSize.getHeight(); + // 获取页面的实际可见区域(裁剪框) + Rectangle cropBox = page.getCropBox(); + if (cropBox == null) { + cropBox = page.getPageSize(); + } - // 确保二维码尺寸不会超过页面尺寸的80% - float maxQrSize = Math.min(pageWidth, pageHeight) * 0.8f; - float finalQrSize = Math.min(qrSize, maxQrSize); + float pageWidth = cropBox.getWidth(); + float pageHeight = cropBox.getHeight(); - // 将二维码放在页面中央 - float qrX = (pageWidth - finalQrSize) / 2; - float qrY = (pageHeight - finalQrSize) / 2; + // 输出页面尺寸信息 + System.out.println("页面 " + pageNum + " 宽度: " + pageWidth + ", 高度: " + pageHeight); + + // 根据页面大小动态计算二维码尺寸(页面宽度的15%) + float qrSize = pageWidth * 0.15f; + + // 设置边距(页面宽度的2%) + float margin = pageWidth * 0.02f; + + // 计算二维码位置 - 左上角 + // 注意:PDF坐标系的原点在左下角,所以Y坐标需要从页面高度减去二维码高度和边距 + float qrX = cropBox.getLeft() + margin; + float qrY = cropBox.getTop() - qrSize - margin; try { - PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), pdfDoc); - try (Canvas canvas = new Canvas(pdfCanvas, pageSize)) { - ImageData imageData = ImageDataFactory.create(qrCodeBytes); - com.itextpdf.layout.element.Image image = new com.itextpdf.layout.element.Image(imageData); - image.scaleAbsolute(finalQrSize, finalQrSize); - image.setFixedPosition(qrX, qrY); - canvas.add(image); - } + // 使用最简单的方法:直接添加图像 + addQRCodeSimple(pdfDoc, page, qrCodeBytes, qrX, qrY, qrSize); } catch (Exception e) { System.err.println("在页面 " + pageNum + " 添加二维码时出错: " + e.getMessage()); e.printStackTrace(); + + // 尝试使用Canvas方法作为备用 + try { + addQRCodeWithCanvas(pdfDoc, page, qrCodeBytes, qrX, qrY, qrSize, cropBox); + } catch (Exception ex) { + System.err.println("Canvas备用方法也失败: " + ex.getMessage()); + + // 最后尝试使用原始大小 + try { + addQRCodeSimple(pdfDoc, page, qrCodeBytes, qrX, qrY, 50); // 使用固定大小 + } catch (Exception ex2) { + System.err.println("最简单方法也失败: " + ex2.getMessage()); + } + } } } @@ -300,10 +314,85 @@ public class PdfBoxQrCodeGenerator { return pdfOut; } + // 使用Canvas的备用方法 + private static void addQRCodeWithCanvas(PdfDocument pdfDoc, PdfPage page, + byte[] qrCodeBytes, float x, float y, float size, Rectangle pageSize) throws IOException { - // 如果使用带放大倍数参数的方法,需要修改main方法: + PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), pdfDoc); + try (Canvas canvas = new Canvas(pdfCanvas, pageSize)) { + ImageData imageData = ImageDataFactory.create(qrCodeBytes); + com.itextpdf.layout.element.Image image = new com.itextpdf.layout.element.Image(imageData); + + // 设置二维码尺寸和位置 + image.scaleAbsolute(size, size); + image.setFixedPosition(x, y); + + // 设置透明度确保不会被背景遮挡 + image.setOpacity(0.9f); + + canvas.add(image); + } + } + + // 最简单的方法:使用原始图像大小 + private static void addQRCodeSimple(PdfDocument pdfDoc, PdfPage page, + byte[] qrCodeBytes, float x, float y, float size) throws IOException { + + PdfCanvas canvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), pdfDoc); + + // 创建图像对象 + ImageData imageData = ImageDataFactory.create(qrCodeBytes); + com.itextpdf.kernel.pdf.xobject.PdfImageXObject imageXObject = + new com.itextpdf.kernel.pdf.xobject.PdfImageXObject(imageData); + + // 添加图像到指定位置(使用原始大小) + canvas.addXObjectAt(imageXObject, x, y); + + canvas.release(); + } + + public static void simpleTest(String pdfPath, String outputPath, byte[] qrCodeBytes) { + try { + PdfDocument pdfDoc = new PdfDocument(new PdfReader(pdfPath), new PdfWriter(outputPath)); + + for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) { + PdfPage page = pdfDoc.getPage(i); + Rectangle rect = page.getPageSize(); + + // 简单地在左上角添加一个固定大小的二维码 + PdfCanvas canvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), pdfDoc); + + ImageData imageData = ImageDataFactory.create(qrCodeBytes); + com.itextpdf.kernel.pdf.xobject.PdfImageXObject imageXObject = + new com.itextpdf.kernel.pdf.xobject.PdfImageXObject(imageData); + + // 固定位置和大小 + float x = 20; // 固定X位置 + float y = rect.getHeight() - 70; // 固定Y位置 + + canvas.addXObjectAt(imageXObject, x, y); + canvas.release(); + } + + pdfDoc.close(); + System.out.println("简单测试完成"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +// public static void main(String[] args) { +// String path = "C:\\Users\\YuanJie\\Desktop\\test.pdf"; +// String outputPath = "C:\\Users\\YuanJie\\Desktop\\test1.pdf"; +// String params = "http://192.168.110.151:7788/codeDetail?id=" + "1957649652924448769"; +// byte[] bytes = PdfBoxQrCodeGenerator.generateQRCodeBytes(params); +// simpleTest(path, outputPath, bytes); +// } + +// 如果使用带放大倍数参数的方法,需要修改main方法: public static void main(String[] args) { - String path = "C:\\Users\\YuanJie\\Desktop\\test.pdf"; + //合规性手续业务流 test 测试101_101 + String path = "C:\\Users\\YuanJie\\Desktop\\合规性手续业务流.pdf"; String outputPath = "C:\\Users\\YuanJie\\Desktop\\test1.pdf"; String params = "http://192.168.110.151:7788/codeDetail?id=" + "1957649652924448769"; diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/vo/volumefile/DesVolumeFileCodeVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/vo/volumefile/DesVolumeFileCodeVo.java index 23f12bc4..72b110fa 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/vo/volumefile/DesVolumeFileCodeVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/vo/volumefile/DesVolumeFileCodeVo.java @@ -8,6 +8,8 @@ import org.dromara.design.domain.DesVolumeFile; import java.io.Serial; import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; /** @@ -80,4 +82,7 @@ public class DesVolumeFileCodeVo implements Serializable { * 是否最新 */ private Boolean isLatest; + + + private Date createTime; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/attendance/AttendanceJob.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/attendance/AttendanceJob.java index 80152702..b2a51bf3 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/attendance/AttendanceJob.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/attendance/AttendanceJob.java @@ -138,8 +138,13 @@ public class AttendanceJob { manageUserIds.add(relevancy.getUserId()); busAttendance.setProjectId(0L); } - SubConstructionUser constructionUser = constructionUserService.getBySysUserId(relevancy.getUserId()); - + SubConstructionUser constructionUser = constructionUserService.lambdaQuery() + .eq(SubConstructionUser::getSysUserId, relevancy.getUserId()) + .last("limit 1") + .one(); + if(constructionUser==null){ + continue; + } busAttendance.setUserId(relevancy.getUserId()); busAttendance.setUserName(constructionUser.getUserName()); @@ -251,7 +256,15 @@ public class AttendanceJob { busAttendance.setProjectId(0L); } - SubConstructionUser constructionUser = constructionUserService.getBySysUserId(relevancy.getUserId()); + SubConstructionUser constructionUser = constructionUserService.lambdaQuery() + .eq(SubConstructionUser::getSysUserId, relevancy.getUserId()) + .last("limit 1") + .one(); + if(constructionUser==null){ + continue; + } + + busAttendance.setUserId(relevancy.getUserId()); busAttendance.setUserName(constructionUser.getUserName()); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/controller/OutMonthPlanController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/controller/OutMonthPlanController.java index 7bb39d66..929de5c4 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/controller/OutMonthPlanController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/controller/OutMonthPlanController.java @@ -133,10 +133,10 @@ public class OutMonthPlanController extends BaseController { * 获取该月份3种类型计划产值 */ @SaCheckPermission("out:monthPlan:monthInfo") - @GetMapping("/monthInfo") - public R> infoByPlanMonth(@NotNull(message = "项目ID不能为空") Long projectId, - @NotNull(message = "计划月份不能为空") String planMonth) { - return R.ok(outMonthPlanService.infoByPlanMonth(projectId, planMonth)); + @GetMapping("/monthInfo/{id}") + public R> infoByPlanMonth(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(outMonthPlanService.infoByPlanMonth(id)); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/IOutMonthPlanService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/IOutMonthPlanService.java index 1f90d54c..fccbb4e9 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/IOutMonthPlanService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/IOutMonthPlanService.java @@ -98,7 +98,7 @@ public interface IOutMonthPlanService extends IService{ /** * 根据计划月份查询计划 */ - List infoByPlanMonth(Long projectId, String planMonth); + List infoByPlanMonth(Long id); /** * 采购完工产值对甲 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/impl/OutMonthPlanServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/impl/OutMonthPlanServiceImpl.java index 85d7fc2d..961f0fd0 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/impl/OutMonthPlanServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/impl/OutMonthPlanServiceImpl.java @@ -239,10 +239,9 @@ public class OutMonthPlanServiceImpl extends ServiceImpl infoByPlanMonth(Long projectId, String planMonth) { + public List infoByPlanMonth(Long id) { return baseMapper.selectVoList(Wrappers.lambdaQuery() - .eq(OutMonthPlan::getProjectId, projectId) - .eq(OutMonthPlan::getPlanMonth, planMonth) + .eq(OutMonthPlan::getId, id) ); } @@ -299,31 +298,21 @@ public class OutMonthPlanServiceImpl extends ServiceImpl outMonthPlans = baseMapper.selectList(Wrappers.lambdaQuery() - .eq(OutMonthPlan::getProjectId, split[0]) - .eq(OutMonthPlan::getPlanMonth, split[1]) - ); - log.info("月度计划产值审核任务,计划数量{}", outMonthPlans.size()); - outMonthPlans.forEach(outMonthPlan -> { - outMonthPlan.setPlanAuditStatus(processEvent.getStatus()); - if (processEvent.getSubmit()) { - outMonthPlan.setPlanAuditStatus(BusinessStatusEnum.WAITING.getStatus()); - } - log.info("月度计划产值审核任务状态改变后{}", outMonthPlan.toString()); - }); + OutMonthPlan outMonthPlan = baseMapper.selectById(Long.valueOf(split[0])); + outMonthPlan.setPlanAuditStatus(processEvent.getStatus()); + updateById(outMonthPlan); if(BusinessStatusEnum.FINISH.getStatus().equals(processEvent.getStatus())){ - OutMonthPlanAudit outMonthPlanAudit = getOutMonthPlanAudit(outMonthPlans); + OutMonthPlanAudit outMonthPlanAudit = getOutMonthPlanAudit(outMonthPlan); outMonthPlanAuditService.save(outMonthPlanAudit); } - updateBatchById(outMonthPlans); } - private static @NotNull OutMonthPlanAudit getOutMonthPlanAudit(List outMonthPlans) { + private static @NotNull OutMonthPlanAudit getOutMonthPlanAudit(OutMonthPlan outMonthPlan) { OutMonthPlanAudit outMonthPlanAudit = new OutMonthPlanAudit(); - for (OutMonthPlan outMonthPlan : outMonthPlans) { + outMonthPlanAudit.setProjectId(outMonthPlan.getProjectId()); outMonthPlanAudit.setPlanMonth(outMonthPlan.getPlanMonth()); if(outMonthPlan.getValueType().equals("1")){ @@ -335,7 +324,7 @@ public class OutMonthPlanServiceImpl extends ServiceImpl clockInSeconds && localTime < clockInResultSeconds; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 1ec1db21..c0336df4 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -425,9 +425,9 @@ public class SysUserServiceImpl implements ISysUserService, UserService { throw new ServiceException("修改用户" + user.getUserName() + "信息失败"); } // 没有修改部门则不需要修改用户与项目的关联 - if (oldUser.getDeptId().equals(user.getDeptId())) { - return flag; - } +// if (oldUser.getDeptId().equals(user.getDeptId())) { +// return flag; +// } /*Long deptId = user.getDeptId(); SysDeptVo deptVo = deptService.selectDeptById(deptId); String deptType = deptVo.getDeptType();