From 7858c25faa53dd2f4c0faae58618565ac5bb50ae Mon Sep 17 00:00:00 2001
From: zzw <228544128@qq.com>
Date: 星期三, 14 十月 2026 13:07:22 +0800
Subject: [PATCH] feat: add engineering order print and externalize app config

---
 emergency-repair-server/src/main/java/com/emergencyrepair/business/controller/FaultController.java |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 46 insertions(+), 0 deletions(-)

diff --git a/emergency-repair-server/src/main/java/com/emergencyrepair/business/controller/FaultController.java b/emergency-repair-server/src/main/java/com/emergencyrepair/business/controller/FaultController.java
index c836b87..dc5ced1 100644
--- a/emergency-repair-server/src/main/java/com/emergencyrepair/business/controller/FaultController.java
+++ b/emergency-repair-server/src/main/java/com/emergencyrepair/business/controller/FaultController.java
@@ -5,8 +5,13 @@
 import com.emergencyrepair.business.entity.Fault;
 import com.emergencyrepair.business.entity.WorkOrder;
 import com.emergencyrepair.business.service.BusinessService;
+import com.emergencyrepair.business.service.EngineeringOrderPrintService;
 import com.emergencyrepair.common.Result;
 import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -19,6 +24,9 @@
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.time.LocalDate;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 
 @RestController
@@ -26,6 +34,7 @@
 @RequiredArgsConstructor
 public class FaultController {
     private final BusinessService businessService;
+    private final EngineeringOrderPrintService engineeringOrderPrintService;
 
     @GetMapping("/page")
     public Result<Page<Fault>> page(@RequestParam(defaultValue = "1") long current,
@@ -112,4 +121,41 @@
     public Result<List<WorkOrder>> dispatch(@RequestBody Requests.DispatchRequest request) {
         return Result.ok(businessService.dispatch(request));
     }
+
+    /**
+     * 宸ョ▼鍗曟墦鍗帮細鎶婇�変腑鐨勬晠闅滆褰曞鐢� Word 妯℃澘鐢熸垚鍥涜仈宸ョ▼鍗曘��
+     */
+    @PostMapping("/engineering-print")
+    public ResponseEntity<byte[]> engineeringPrint(@RequestBody Requests.IdList request) {
+        return documentResponse(engineeringOrderPrintService.render(request.getIds()),
+                "宸ョ▼鍗�.docx", "engineering-order.docx");
+    }
+
+    /**
+     * 鎵撳嵃宸ョ▼鍗�2锛氱1鑱斿叏閮ㄦ槑缁嗗悗鎹㈤〉锛屽啀杈撳嚭绗�2鑱旓紝浠ユ绫绘帹銆�
+     */
+    @PostMapping("/engineering-print-v2")
+    public ResponseEntity<byte[]> engineeringPrintV2(@RequestBody Requests.IdList request) {
+        return documentResponse(engineeringOrderPrintService.renderVersion2(request.getIds()),
+                "宸ョ▼鍗�2.docx", "engineering-order-2.docx");
+    }
+
+    private ResponseEntity<byte[]> documentResponse(byte[] document, String displayName, String fallbackName) {
+        String filename = encodeFilename(displayName, fallbackName);
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.parseMediaType(
+                "application/vnd.openxmlformats-officedocument.wordprocessingml.document"));
+        headers.set(HttpHeaders.CONTENT_DISPOSITION,
+                "attachment; filename=\"" + fallbackName + "\"; filename*=UTF-8''" + filename);
+        headers.setContentLength(document.length);
+        return new ResponseEntity<>(document, headers, HttpStatus.OK);
+    }
+
+    private String encodeFilename(String name, String fallbackName) {
+        try {
+            return URLEncoder.encode(name, StandardCharsets.UTF_8.name()).replace("+", "%20");
+        } catch (UnsupportedEncodingException exception) {
+            return fallbackName;
+        }
+    }
 }

--
Gitblit v1.9.1