package com.emergencyrepair.business.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.emergencyrepair.business.dto.Requests; 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; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; 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 @RequestMapping("/api/faults") @RequiredArgsConstructor public class FaultController { private final BusinessService businessService; private final EngineeringOrderPrintService engineeringOrderPrintService; @GetMapping("/page") public Result> page(@RequestParam(defaultValue = "1") long current, @RequestParam(defaultValue = "20") long size, @RequestParam(required = false) String status, @RequestParam(required = false) String keyword, @RequestParam(required = false) String xNo, @RequestParam(required = false) String teamMajor, @RequestParam(required = false) String engineeringMajor, @RequestParam(required = false) String reportUnit, @RequestParam(required = false) String owner, @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate reportDateStart, @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate reportDateEnd, @RequestParam(required = false) String contractorName, @RequestParam(required = false) String faultNature) { return Result.ok(businessService.pageFaults(status, keyword, xNo, teamMajor, engineeringMajor, reportUnit, owner, reportDateStart, reportDateEnd, contractorName, faultNature, current, size)); } @GetMapping public Result> list(@RequestParam(required = false) String status, @RequestParam(required = false) String keyword, @RequestParam(required = false) String xNo, @RequestParam(required = false) String teamMajor, @RequestParam(required = false) String engineeringMajor, @RequestParam(required = false) String reportUnit, @RequestParam(required = false) String owner, @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate reportDateStart, @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate reportDateEnd, @RequestParam(required = false) String contractorName, @RequestParam(required = false) String faultNature) { return Result.ok(businessService.listFaults(status, keyword, xNo, teamMajor, engineeringMajor, reportUnit, owner, reportDateStart, reportDateEnd, contractorName, faultNature)); } @PostMapping public Result create(@RequestBody Fault fault) { fault.setId(null); return Result.ok(businessService.saveFault(fault)); } @PutMapping("/{id}") public Result update(@PathVariable Long id, @RequestBody Fault fault) { fault.setId(id); return Result.ok(businessService.saveFault(fault)); } @DeleteMapping("/{id}") public Result delete(@PathVariable Long id) { businessService.deleteFault(id); return Result.ok(); } @PostMapping("/cancel") public Result cancel(@RequestBody Requests.CancelRequest request) { businessService.cancelFaults(request); return Result.ok(); } @PostMapping("/report") public Result report(@RequestBody Requests.IdList request) { businessService.reportFaults(request.getIds()); return Result.ok(); } @PostMapping("/review") public Result review(@RequestBody Requests.ReviewRequest request) { businessService.xcbReview(request); return Result.ok(); } @PostMapping("/approve") public Result approve(@RequestBody Requests.ApprovalRequest request) { businessService.approve(request); return Result.ok(); } @GetMapping("/dispatchable") public Result> dispatchable(@RequestParam(required = false) String keyword) { return Result.ok(businessService.listFaults("JCC_DIRECTOR_APPROVED", keyword)); } @PostMapping("/dispatch") public Result> dispatch(@RequestBody Requests.DispatchRequest request) { return Result.ok(businessService.dispatch(request)); } /** * 工程单打印:把选中的故障记录套用 Word 模板生成四联工程单。 */ @PostMapping("/engineering-print") public ResponseEntity engineeringPrint(@RequestBody Requests.IdList request) { return documentResponse(engineeringOrderPrintService.render(request.getIds()), "工程单.docx", "engineering-order.docx"); } /** * 打印工程单2:第1联全部明细后换页,再输出第2联,以此类推。 */ @PostMapping("/engineering-print-v2") public ResponseEntity engineeringPrintV2(@RequestBody Requests.IdList request) { return documentResponse(engineeringOrderPrintService.renderVersion2(request.getIds()), "工程单2.docx", "engineering-order-2.docx"); } private ResponseEntity 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; } } }