From 0d9b0dab20eae44c817944e98c967dfd8832f580 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期六, 25 四月 2026 17:13:16 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_天津_阳光彩印' into dev_天津_阳光彩印

---
 src/main/java/com/ruoyi/production/service/ProductionPrintOrderService.java             |    7 
 src/main/resources/mapper/production/ProductWorkOrderMapper.xml                         |    9 
 src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java            |    4 
 src/main/resources/static/printOrderTemp.xlsx                                           |    0 
 src/main/java/com/ruoyi/production/dto/ProductOrderDto.java                             |    2 
 src/main/java/com/ruoyi/basic/excel/ProductionPrintOrderExcel.java                      |  193 ++++++++++++++++++++++++
 src/main/java/com/ruoyi/basic/excel/ExcelUtils.java                                     |    9 +
 src/main/java/com/ruoyi/production/controller/ProductionPrintOrderController.java       |   23 ++
 src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java |    2 
 src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java                   |    2 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java           |    2 
 src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java        |   29 --
 src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java         |    2 
 src/main/resources/mapper/production/ProductOrderMapper.xml                             |    2 
 src/main/java/com/ruoyi/production/dto/ExportProductionPrintOrderDto.java               |   68 ++++++++
 src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java                 |    2 
 src/main/java/com/ruoyi/production/service/impl/ProductionPrintOrderServiceImpl.java    |   51 ++++++
 src/main/java/com/ruoyi/production/pojo/ProductionPrintOrder.java                       |   13 +
 src/main/java/com/ruoyi/common/utils/StringUtils.java                                   |   46 +++++
 src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java            |    2 
 20 files changed, 426 insertions(+), 42 deletions(-)

diff --git a/src/main/java/com/ruoyi/basic/excel/ExcelUtils.java b/src/main/java/com/ruoyi/basic/excel/ExcelUtils.java
new file mode 100644
index 0000000..4b07986
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/excel/ExcelUtils.java
@@ -0,0 +1,9 @@
+package com.ruoyi.basic.excel;
+
+/**
+ * @author buhuazhen
+ * @date 2026/4/25
+ * @email 3038525872@qq.com
+ */
+public class ExcelUtils {
+}
diff --git a/src/main/java/com/ruoyi/basic/excel/ProductionPrintOrderExcel.java b/src/main/java/com/ruoyi/basic/excel/ProductionPrintOrderExcel.java
new file mode 100644
index 0000000..e8bdd25
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/excel/ProductionPrintOrderExcel.java
@@ -0,0 +1,193 @@
+package com.ruoyi.basic.excel;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.enums.WriteDirectionEnum;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.fill.FillConfig;
+import com.alibaba.excel.write.metadata.fill.FillWrapper;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.production.dto.ExportProductionPrintOrderDto;
+import lombok.SneakyThrows;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.springframework.stereotype.Component;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+
+/**
+ * @author buhuazhen
+ * @date 2026/4/25
+ * @email 3038525872@qq.com
+ */
+@Component
+public class ProductionPrintOrderExcel {
+
+
+    /**
+     * 鍚堝苟鍗曞厓鏍煎苟涓哄悎骞跺尯鍩熸坊鍔犲乏鍙宠竟妗�
+     *
+     * @param sheet    Sheet
+     * @param workbook Workbook
+     * @param range    瑕佸悎骞剁殑鍖哄煙
+     */
+    public static void mergeWithBorder(Sheet sheet, Workbook workbook, CellRangeAddress range, CellStyle s) {
+
+        // 1. 娣诲姞鍚堝苟鍖哄煙锛堟娴嬫槸鍚﹂噸鍙狅級
+        for (int i = sheet.getNumMergedRegions() - 1; i >= 0; i--) {
+            CellRangeAddress old = sheet.getMergedRegion(i);
+            // 鍒ゆ柇鏄惁閲嶅彔锛堢畝鍗曠煩褰㈤噸鍙犻�昏緫锛�
+            if (!(range.getLastRow() < old.getFirstRow()
+                    || range.getFirstRow() > old.getLastRow()
+                    || range.getLastColumn() < old.getFirstColumn()
+                    || range.getFirstColumn() > old.getLastColumn())) {
+
+                // 瀛樺湪閲嶅彔 鈫� 鍒犻櫎鏃х殑
+                sheet.removeMergedRegion(i);
+            }
+        }
+
+        sheet.addMergedRegion(range);
+
+        // 2. 涓哄悎骞跺尯鍩熷唴鐨勬墍鏈夊崟鍏冩牸娣诲姞宸﹀彸杈规
+        for (int rowIdx = range.getFirstRow(); rowIdx <= range.getLastRow(); rowIdx++) {
+            Row row = sheet.getRow(rowIdx);
+            if (row == null) {
+                row = sheet.createRow(rowIdx);
+            }
+
+            for (int colIdx = range.getFirstColumn(); colIdx <= range.getLastColumn(); colIdx++) {
+
+                Cell cell = row.getCell(colIdx);
+                if (cell == null) {
+                    cell = row.createCell(colIdx);
+                }
+
+                CellStyle style = workbook.createCellStyle();
+
+                // 鑻ヨ鍗曞厓鏍煎凡鏈夋牱寮忥紝澶嶅埗
+                if (cell.getCellStyle() != null) {
+                    style.cloneStyleFrom(cell.getCellStyle());
+                }
+
+                // 璁剧疆宸﹀彸杈规
+                style.setBorderLeft(s.getBorderLeft());
+                style.setBorderRight(s.getBorderRight());
+                style.setBorderTop(s.getBorderTop());
+                style.setBorderBottom(s.getBorderBottom());
+                style.setAlignment(s.getAlignment());
+                style.setVerticalAlignment(VerticalAlignment.CENTER);
+                cell.setCellStyle(style);
+            }
+        }
+    }
+    @SneakyThrows
+    public byte[] createPrintOrderTemplate(ExportProductionPrintOrderDto printOrderDto, InputStream templateInputStream) {
+
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+
+        try (ExcelWriter excelWriter = EasyExcel.write(byteArrayOutputStream)
+                .withTemplate(templateInputStream)
+                .build()) {
+
+            FillConfig fillConfig = FillConfig.builder()
+                    .forceNewRow(true)
+                    .autoStyle(true)
+                    .direction(WriteDirectionEnum.VERTICAL)
+                    .build();
+
+            WriteSheet writeSheet = EasyExcel.writerSheet().build();
+
+            excelWriter.fill(printOrderDto, writeSheet);
+
+            excelWriter.fill(new FillWrapper("materialInfo", printOrderDto.getMaterialInfo()), fillConfig, writeSheet);
+            excelWriter.fill(new FillWrapper("processContent", printOrderDto.getProcessContent()), fillConfig, writeSheet);
+            excelWriter.fill(new FillWrapper("plateMaking", printOrderDto.getPlateMaking()), fillConfig, writeSheet);
+
+            excelWriter.finish();
+
+        } catch (Exception e) {
+            throw new ServiceException("excel 鐢熸垚澶辫触! " + e.getMessage());
+        }
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        try {
+            Workbook workbook = WorkbookFactory.create(
+                    new ByteArrayInputStream(byteArrayOutputStream.toByteArray())
+            );
+
+            CellStyle cellStyleTblr = workbook.createCellStyle();
+            cellStyleTblr.setBorderBottom(BorderStyle.THIN);
+            cellStyleTblr.setBorderTop(BorderStyle.THIN);
+            cellStyleTblr.setBorderLeft(BorderStyle.THIN);
+            cellStyleTblr.setBorderRight(BorderStyle.THIN);
+            cellStyleTblr.setWrapText(true);
+            cellStyleTblr.setAlignment(HorizontalAlignment.CENTER);
+            cellStyleTblr.setVerticalAlignment(VerticalAlignment.CENTER);
+
+            Sheet sheet = workbook.getSheetAt(0);
+
+            // ===== 鎻掑叆鍥剧墖 =====
+            byte[] imageBytes = printOrderDto.getCuttingImage();
+
+            int pictureIdx = workbook.addPicture(imageBytes, Workbook.PICTURE_TYPE_JPEG);
+            CreationHelper helper = workbook.getCreationHelper();
+            Drawing<?> drawing = sheet.createDrawingPatriarch();
+
+            ClientAnchor anchor = helper.createClientAnchor();
+            anchor.setCol1(6);  // 绗�7鍒楋紙G鍒楋級
+            anchor.setRow1(7);
+            anchor.setDx1(142700); // 鍚戝彸绉诲姩锛堢害鍗婃牸锛�
+            anchor.setDy1(222700);
+
+            anchor.setCol2(8);  // 瀹藉害缁堢偣
+            anchor.setRow2(9);  // 楂樺害缁堢偣
+
+            Picture picture = drawing.createPicture(anchor, pictureIdx);
+//            picture.resize(0.5);
+
+
+
+            // 杩涜鍚堝苟鎿嶄綔 鍒囨枡绀烘剰鍥鹃儴鍒�
+            int startRow = 7;
+            int size = printOrderDto.getMaterialInfo().size();
+            int qlEndRow = startRow + size - 1 + 4;
+            mergeWithBorder(sheet, workbook, new CellRangeAddress(
+                    startRow,
+                    qlEndRow,
+                    6,
+                    7
+            ), cellStyleTblr);
+
+            // 浜у搧澶囨敞
+            mergeWithBorder(sheet, workbook, new CellRangeAddress(
+                    6+1+printOrderDto.getMaterialInfo().size() +0,
+                    6+1+printOrderDto.getMaterialInfo().size() +1,
+                    0,
+                    5
+            ), cellStyleTblr);
+
+            int zbRowStart = qlEndRow + 2 + CollUtil.size(printOrderDto.getPlateMaking()) +1;
+            int zbRowEnd = zbRowStart + CollUtil.size(printOrderDto.getProcessContent());
+            mergeWithBorder(sheet, workbook, new CellRangeAddress(
+                    zbRowStart,
+                    zbRowEnd,
+                    4,
+                    7
+            ), cellStyleTblr);
+
+
+            workbook.write(out);
+            workbook.close();
+        } catch (Exception e) {
+            throw new ServiceException("鍥剧墖澶勭悊澶辫触! " + e.getMessage());
+        }
+
+        return out.toByteArray();
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/common/utils/StringUtils.java b/src/main/java/com/ruoyi/common/utils/StringUtils.java
index 5e13807..cdba7bb 100644
--- a/src/main/java/com/ruoyi/common/utils/StringUtils.java
+++ b/src/main/java/com/ruoyi/common/utils/StringUtils.java
@@ -1,5 +1,6 @@
 package com.ruoyi.common.utils;
 
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
@@ -761,4 +762,49 @@
             return sb.toString();
         }
     }
+
+    public static void fillStringNull(Object obj) {
+        if (obj == null) return;
+
+        Class<?> clazz = obj.getClass();
+
+        // 鍩烘湰绫诲瀷 / 鍖呰绫� / String 涓嶅鐞�
+        if (clazz.isPrimitive() ||
+                clazz == String.class ||
+                Number.class.isAssignableFrom(clazz) ||
+                clazz == Boolean.class ||
+                clazz == Character.class) {
+            return;
+        }
+
+        for (Field field : clazz.getDeclaredFields()) {
+            field.setAccessible(true);
+            try {
+                Object value = field.get(obj);
+
+                // 1锔忊儯 String 绫诲瀷锛歯ull 鈫� ""
+                if (field.getType() == String.class) {
+                    if (value == null) {
+                        field.set(obj, "");
+                    }
+                }
+                // 2锔忊儯 List 閫掑綊澶勭悊
+                else if (value instanceof List) {
+                    for (Object item : (List<?>) value) {
+                        fillStringNull(item);
+                    }
+                }
+                // 3锔忊儯 鍏朵粬瀵硅薄閫掑綊
+                else if (value != null && !isJdkClass(value.getClass())) {
+                    fillStringNull(value);
+                }
+
+            } catch (IllegalAccessException ignored) {}
+        }
+    }
+
+    private static boolean isJdkClass(Class<?> clazz) {
+        return clazz.getPackage() != null &&
+                clazz.getPackage().getName().startsWith("java.");
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionPrintOrderController.java b/src/main/java/com/ruoyi/production/controller/ProductionPrintOrderController.java
index 2e76b67..94a5cb7 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionPrintOrderController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionPrintOrderController.java
@@ -6,7 +6,12 @@
 import com.ruoyi.production.service.ProductionPrintOrderService;
 import io.swagger.annotations.Api;
 import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
 import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.net.URLEncoder;
 
 /**
  * @author buhuazhen
@@ -22,15 +27,29 @@
     private final ProductionPrintOrderService productionPrintOrderService;
 
     @PostMapping("/save")
-    public R save(@RequestBody SaveProductionPrintOrderDto dto){
+    public R save(@RequestBody SaveProductionPrintOrderDto dto) {
         productionPrintOrderService.save(dto);
         return R.ok();
     }
 
 
     @PostMapping("/getByProductWordId/{id}")
-    public ProductionPrintOrder getByProductWordId(@PathVariable Long id){
+    public ProductionPrintOrder getByProductWordId(@PathVariable Long id) {
         return productionPrintOrderService.getByProductWordId(id);
     }
 
+    @PostMapping("/export/{id}")
+    @SneakyThrows
+    public void export(@PathVariable Long id, HttpServletResponse response) {
+        byte[] bytes = productionPrintOrderService.exportPrintExcelByWordId(id);
+        String fileName = "鍗板埛瀹氬嵃鍗�.xlsx";
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setCharacterEncoding("utf-8");
+        // 瑙e喅涓枃鏂囦欢鍚嶄贡鐮�
+        response.setHeader("Content-Disposition",
+                "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
+        ServletOutputStream out = response.getOutputStream();
+        out.write(bytes);
+        out.flush();
+    }
 }
diff --git a/src/main/java/com/ruoyi/production/dto/ExportProductionPrintOrderDto.java b/src/main/java/com/ruoyi/production/dto/ExportProductionPrintOrderDto.java
new file mode 100644
index 0000000..b5b1205
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/ExportProductionPrintOrderDto.java
@@ -0,0 +1,68 @@
+package com.ruoyi.production.dto;
+
+import com.alibaba.excel.metadata.data.ImageData;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Collections;
+
+/**
+ * @author buhuazhen
+ * @date 2026/4/25
+ * @email 3038525872@qq.com
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ExportProductionPrintOrderDto extends ProductionPrintOrderDto implements Serializable {
+    private String numSuffix;
+
+    private String unitSuffix;
+
+    private String priceSuffix;
+
+    // 鍒跺崟鏃ユ湡
+    private String printOrderTimeStr;
+
+    // 瀹屾垚鏃ユ湡
+    private String finishTimeStr;
+
+    // 浠嬬粛淇�
+    private String introductionLetter1 = "拢";
+    // 鍟嗘爣娉ㄥ唽
+    private String introductionLetter2 = "拢";
+    // 濮斿嵃鍗�
+    private String introductionLetter3 = "拢";
+    // 涔﹀彿
+    private String introductionLetter4 = "拢";
+
+    // 骞冲紶
+    private String cuttingDiagramCheckout1 = "拢";
+    // 鍗风瓛
+    private String cuttingDiagramCheckout2 = "拢";
+
+    private byte[] cuttingImage;
+//
+//    public void setCuttingImage(byte[] bytes) {
+//
+//        WriteCellData<Void> cell = new WriteCellData<>();
+//
+//        ImageData imageData = new ImageData();
+//
+//        imageData.setImage(bytes);
+//
+//        imageData.setImageType(ImageData.ImageType.PICTURE_TYPE_PNG);
+//
+//        cell.setImageDataList(Collections.singletonList(imageData));
+//
+//        this.cuttingImage = cell;
+//
+//    }
+
+}
+
diff --git a/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java b/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
index 1d7d48b..754dbf5 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
@@ -94,4 +94,6 @@
     @Excel(name = "鑹叉暟",sort = 9)
     private String printColorCount;
 
+    private Long printId;
+
 }
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
index bf46540..4dbd6ed 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
@@ -19,5 +19,5 @@
 
     List<ProductWorkOrderDto> selectWorkOrderStartStats(@Param("startDate") String startDate, @Param("endDate") String endDate);
 
-    ProductWorkOrder selectMax(@Param("datePrefix") String datePrefix);
+    Integer selectMax(@Param("datePrefix") String datePrefix);
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionPrintOrder.java b/src/main/java/com/ruoyi/production/pojo/ProductionPrintOrder.java
index 58c7ce4..fdcb92f 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionPrintOrder.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionPrintOrder.java
@@ -6,6 +6,7 @@
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 
 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
@@ -119,19 +120,19 @@
      * 鍒剁増
      */
     @TableField(value = "plate_making",typeHandler = JacksonTypeHandler.class)
-    private List<PlateMakingDto> plateMaking;
+    private List<PlateMakingDto> plateMaking = new ArrayList<>();
 
     /**
      * 宸ュ簭鍔犲伐鍐呭
      */
     @TableField(value = "process_content",typeHandler = JacksonTypeHandler.class)
-    private List<ProcessContentDto> processContent;
+    private List<ProcessContentDto> processContent = new ArrayList<>();
 
     /**
      * 鏉愭枡淇℃伅
      */
     @TableField(value = "material_info",typeHandler = JacksonTypeHandler.class)
-    private List<MaterialInfoDto> materialInfo;
+    private List<MaterialInfoDto> materialInfo = new ArrayList<>();
 
     /**
      * 宸ヨ壓瑕佹眰
@@ -262,6 +263,12 @@
     @TableField(value = "client_name")
     private String clientName;
 
+    /**
+     * 鍒囨枡鍥剧ず閫夋嫨 鍗曢��
+     */
+    @TableField(value = "cutting_diagram_checkout")
+    private String cuttingDiagramCheckout;
+
 
     public ProductOrderDto convertProductOrderDto(@NotNull ProductOrderDto dto) {
         dto.setCutSize(this.getCutSize());
diff --git a/src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java b/src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java
index e8a2aed..85e26bb 100644
--- a/src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java
@@ -26,5 +26,5 @@
      * @param npsNo 鐢熶骇璁㈠崟鍙�
      * @return String
      */
-    String generateProductWorkOrder(String datePrefix, String processName,String npsNo);
+    String generateProductWorkOrder(String processName, String npsNo);
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductionPrintOrderService.java b/src/main/java/com/ruoyi/production/service/ProductionPrintOrderService.java
index aa51f0c..07686df 100644
--- a/src/main/java/com/ruoyi/production/service/ProductionPrintOrderService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductionPrintOrderService.java
@@ -30,4 +30,11 @@
 
 
     List<ProductionPrintOrder> getListByOrders(@Nullable List<Long> orderIds);
+
+    /**
+     * 鐢熸垚瀵煎嚭excel 鍗板埛鍗曟ā鐗�
+     * @param orderId 璁㈠崟id
+     */
+    byte[] exportPrintExcelByWordId(@Nullable Long orderId);
+
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
index f3237b8..ab8fae4 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -233,7 +233,7 @@
             productWorkOrder.setDeviceId(dto.getDeviceId());
             productWorkOrder.setUserIds(dto.getUserIds());
             productWorkOrder.setUserNames(dto.getUserNames());
-            productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder(null, productProcess.getName(), byId.getNpsNo()));
+            productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder( productProcess.getName(), byId.getNpsNo()));
             productWorkOrder.setStatus(1);
             productWorkOrderService.save(productWorkOrder);
         }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
index 5eed99f..d622379 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -83,8 +83,6 @@
                     productionPrintOrder.convertProductOrderDto(record);
                 }
             });
-
-
         }
 
         return productOrderDtoIPage;
@@ -126,7 +124,7 @@
                 productWorkOrder.setProductOrderId(productOrder.getId());
                 ProductOrder order = productOrderMapper.selectById(productOrder.getId());
                 productWorkOrder.setPlanQuantity(order.getQuantity());
-                productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder(null, productProcessMap.getOrDefault(productProcessRouteItem.getProcessId(), new ProductProcess()).getName(), productOrder.getNpsNo()));
+                productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder( productProcessMap.getOrDefault(productProcessRouteItem.getProcessId(), new ProductProcess()).getName(), productOrder.getNpsNo()));
                 productWorkOrder.setStatus(1);
                 productWorkOrderMapper.insert(productWorkOrder);
             }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
index 081ff3b..2e97872 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
@@ -145,7 +145,7 @@
             productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
             productWorkOrder.setProductOrderId(productProcessRouteItem.getProductOrderId());
             productWorkOrder.setPlanQuantity(productOrder.getQuantity());
-            productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder(null,productProcess.getName(),productOrder.getNpsNo()));
+            productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder(productProcess.getName(),productOrder.getNpsNo()));
             productWorkOrder.setStatus(1);
             productWorkOrderMapper.insert(productWorkOrder);
         }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
index 72320be..35a22b6 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -3,7 +3,6 @@
 
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.StrUtil;
-import cn.hutool.extra.pinyin.PinyinUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -29,8 +28,6 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.URLEncoder;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -73,7 +70,7 @@
         if (CollectionUtils.isNotEmpty(productWorkOrderFiles)) {
             productWorkOrderFiles.forEach(productWorkOrderFile -> {
                 Map<String, Object> image = new HashMap<>();
-                PictureRenderData pictureRenderData = Pictures.ofLocal( productWorkOrderFile.getUrl()).sizeInCm(17, 20).create();
+                PictureRenderData pictureRenderData = Pictures.ofLocal(productWorkOrderFile.getUrl()).sizeInCm(17, 20).create();
                 image.put("url", pictureRenderData);
                 images.add(image);
             });
@@ -95,7 +92,7 @@
                     put("actualEndTime", productWorkOrderDto.getActualEndTime());
                     put("twoCode", Pictures.ofLocal(codePath).create());
                     put("deviceName", productWorkOrderDto.getDeviceName());
-                    put("images", images.isEmpty()?null:images);
+                    put("images", images.isEmpty() ? null : images);
                 }});
 
         try {
@@ -122,25 +119,13 @@
     }
 
     @Override
-    public String generateProductWorkOrder(String datePrefix,String processName, String npsNo) {
-        datePrefix = StrUtil.isBlank(datePrefix) ? LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) : datePrefix;
+    public String generateProductWorkOrder(String processName, String npsNo) {
         processName = StrUtil.isBlank(processName) ? "鏈煡" : processName;
         Assert.notNull(npsNo, "鐢熶骇璁㈠崟鍙风紪鍙蜂笉鑳戒负绌�");
-        ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
-        int sequenceNumber = 1; // 榛樿搴忓彿
-        if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
-            String lastNo = lastWorkOrder.getWorkOrderNo().toString();
-            if (lastNo.startsWith(datePrefix)) {
-                String seqStr = lastNo.substring(datePrefix.length());
-                try {
-                    sequenceNumber = Integer.parseInt(seqStr) + 1;
-                } catch (NumberFormatException e) {
-                    sequenceNumber = 1;
-                }
-            }
-        }
-            String processPinyin = StringUtils.getProcessNo(processName);
-            return StrUtil.format("{}{}",processPinyin,npsNo,String.format("%03d", sequenceNumber));
+        Integer maxNo = productWorkOrderMapper.selectMax(npsNo);
+        int sequenceNumber = maxNo + 1; // 榛樿搴忓彿
+        String processPinyin = StringUtils.getProcessNo(processName);
+        return StrUtil.format("{}{}", processPinyin, npsNo, String.format("%03d", sequenceNumber));
     }
 
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionPrintOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionPrintOrderServiceImpl.java
index 1720e59..3716dec 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionPrintOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionPrintOrderServiceImpl.java
@@ -2,11 +2,18 @@
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.excel.ProductionPrintOrderExcel;
 import com.ruoyi.basic.service.CustomerFollowUpFileService;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.dto.SimplePersonDto;
 import com.ruoyi.production.dto.*;
 import com.ruoyi.production.mapper.ProductOrderMapper;
@@ -15,9 +22,11 @@
 import com.ruoyi.production.pojo.ProductionPrintOrder;
 import com.ruoyi.production.service.ProductionPrintOrderService;
 import lombok.RequiredArgsConstructor;
+import org.jetbrains.annotations.Nullable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -36,6 +45,7 @@
 
     private final ProductOrderMapper productOrderMapper;
     private final ProcessRouteServiceImpl processRouteService;
+    private final ProductionPrintOrderExcel productionPrintOrderExcel;
 
     private final CustomerFollowUpFileService customerFollowUpFileService;
     @Override
@@ -111,6 +121,47 @@
             map -> new ArrayList<>(map.values())
         ));
     }
+
+    @Override
+    public byte[] exportPrintExcelByWordId(@Nullable Long orderId) {
+        ProductionPrintOrderDto printOrderDto = this.getByProductWordId(orderId);
+        List<MaterialInfoDto> materialInfo = printOrderDto.getMaterialInfo();
+        Assert.isTrue(CollUtil.isNotEmpty(materialInfo),"鏈湁鏉愭枡淇℃伅锛岃娣诲姞鏀逛俊鎭�!");
+        MaterialInfoDto materialInfoDto = materialInfo.get(0);
+        ExportProductionPrintOrderDto exportProductionPrintOrderDto = BeanUtil.copyProperties(printOrderDto, ExportProductionPrintOrderDto.class);
+        exportProductionPrintOrderDto.setNumSuffix(materialInfoDto.getNumSuffix());
+        exportProductionPrintOrderDto.setUnitSuffix(materialInfoDto.getUnitSuffix());
+        exportProductionPrintOrderDto.setPriceSuffix(materialInfoDto.getPriceSuffix());
+        StringUtils.fillStringNull(exportProductionPrintOrderDto);
+        // 鏃ユ湡淇涓� yyyy骞� MM 鏈� mm 鏃�
+        exportProductionPrintOrderDto.setPrintOrderTimeStr(DateUtil.format(exportProductionPrintOrderDto.getPrintOrderTime(),"yyyy骞� MM 鏈� mm 鏃�"));
+        exportProductionPrintOrderDto.setFinishTimeStr(DateUtil.format(exportProductionPrintOrderDto.getFinishTime(),"yyyy骞� MM 鏈� mm 鏃�"));
+
+        // 浠嬬粛淇� 鍕鹃�夋
+        String introductionLetter = exportProductionPrintOrderDto.getIntroductionLetter();
+        List<String> introductionLetterItem = StrUtil.split(introductionLetter, ",");
+        exportProductionPrintOrderDto.setIntroductionLetter1(introductionLetterItem.contains("浠嬬粛淇�")?"R" : "拢");
+        exportProductionPrintOrderDto.setIntroductionLetter2(introductionLetterItem.contains("鍟嗘爣娉ㄥ唽")?"R" : "拢");
+        exportProductionPrintOrderDto.setIntroductionLetter3(introductionLetterItem.contains("濮斿嵃鍗�")?"R" : "拢");
+        exportProductionPrintOrderDto.setIntroductionLetter4(introductionLetterItem.contains("涔﹀彿")?"R" : "拢");
+
+        // 鍒囨枡鍥剧ず
+        exportProductionPrintOrderDto.setCuttingDiagramCheckout1("骞冲紶".equals(exportProductionPrintOrderDto.getCuttingDiagramCheckout())?"R" : "拢");
+        exportProductionPrintOrderDto.setCuttingDiagramCheckout2("鍗风瓛".equals(exportProductionPrintOrderDto.getCuttingDiagramCheckout())?"R" : "拢");
+
+        // 璇诲彇鍥剧墖淇℃伅
+        if(exportProductionPrintOrderDto.getCuttingFileVo() != null){
+            byte[] bytes = FileUtil.readBytes(exportProductionPrintOrderDto.getCuttingFileVo().getFileUrl());
+            exportProductionPrintOrderDto.setCuttingImage(bytes);
+        }
+        // cutNum 涓哄皬鐩掓暟閲�+涓洅鏁伴噺
+        exportProductionPrintOrderDto.setCutNum(String.valueOf(NumberUtil.add(exportProductionPrintOrderDto.getSmallBoxQty(),exportProductionPrintOrderDto.getMediumBoxQty())));
+
+        byte[] printOrderTemplate = productionPrintOrderExcel.createPrintOrderTemplate(exportProductionPrintOrderDto, this.getClass().getResourceAsStream("/static/printOrderTemp.xlsx"));
+        return printOrderTemplate;
+    }
+
+
 }
 
 
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
index 05d9d7d..687bf1c 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -118,7 +118,7 @@
                                 productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                                 productWorkOrder.setProductOrderId(order.getId());
                                 productWorkOrder.setPlanQuantity(order.getQuantity());
-                                productWorkOrder.setWorkOrderNo("FG"+productWorkOrderService.generateProductWorkOrder(null, productProcessMap.getOrDefault(productProcessRouteItem.getProcessId(), new ProductProcess()).getName(), productOrder.getNpsNo()));
+                                productWorkOrder.setWorkOrderNo("FG"+productWorkOrderService.generateProductWorkOrder( productProcessMap.getOrDefault(productProcessRouteItem.getProcessId(), new ProductProcess()).getName(), productOrder.getNpsNo()));
                                 productWorkOrder.setStatus(1);
                                 productWorkOrderMapper.insert(productWorkOrder);
                             }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
index e597a9e..b830a96 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -322,7 +322,7 @@
                     productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                     productWorkOrder.setProductOrderId(productOrder.getId());
                     productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
-                    productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder(null, productProcessMap.getOrDefault(productProcessRouteItem.getProcessId(),new ProductProcess()).getName(), productOrder.getNpsNo()));
+                    productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder( productProcessMap.getOrDefault(productProcessRouteItem.getProcessId(),new ProductProcess()).getName(), productOrder.getNpsNo()));
                     productWorkOrder.setStatus(1);
 
                     productWorkOrderMapper.insert(productWorkOrder);
diff --git a/src/main/resources/mapper/production/ProductOrderMapper.xml b/src/main/resources/mapper/production/ProductOrderMapper.xml
index 59942bf..c6030f7 100644
--- a/src/main/resources/mapper/production/ProductOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -28,6 +28,7 @@
         sl.delivery_date,
         sl.actually_delivery_date,
         sl.execution_date,
+        t6.id as print_id,
         CASE
         WHEN shipping_status_counts.total_count = 0 THEN false
         WHEN shipping_status_counts.unshipped_count = 0 THEN true
@@ -47,6 +48,7 @@
         left join sales_ledger_product slp on po.sale_ledger_product_id = slp.id and slp.type = 1
         left join product_process_route ppr on po.id = ppr.product_order_id
         left join product_bom pb on pb.id = ppr.bom_id
+        left join production_print_order as t6 on t6.product_order_id = po.id
         <where>
             <if test="c.npsNo != null and c.npsNo != ''">
                 and po.nps_no like concat('%',#{c.npsNo},'%')
diff --git a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
index 5849d88..6bb7fc6 100644
--- a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -92,12 +92,9 @@
             actual_start_time &gt;= #{startDate}
             AND actual_start_time &lt;= #{endDate}
     </select>
-    <select id="selectMax" resultType="com.ruoyi.production.pojo.ProductWorkOrder">
-        SELECT SUBSTRING(work_order_no, 3) as work_order_no
+    <select id="selectMax" resultType="java.lang.Integer">
+        SELECT count(1)
         FROM product_work_order
-        WHERE SUBSTRING(work_order_no, 3) like concat(#{datePrefix},'%')
-        order by work_order_no  desc
-        limit 1
-        ;
+        WHERE SUBSTRING(work_order_no, 3) like concat('%',#{datePrefix},'%')
     </select>
 </mapper>
diff --git a/src/main/resources/static/printOrderTemp.xlsx b/src/main/resources/static/printOrderTemp.xlsx
new file mode 100644
index 0000000..c66967c
--- /dev/null
+++ b/src/main/resources/static/printOrderTemp.xlsx
Binary files differ

--
Gitblit v1.9.3