package com.ruoyi.system.controller; import cn.dev33.satoken.annotation.SaIgnore; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.vo.mes.MesDrawingListVo; import com.ruoyi.system.service.IMesDrawingService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; /** * MES 图纸开放接口:按生产令号查询路径与下载地址,并按图号下载 PDF / DWG。 *

* 鉴权:请求头 {@code X-App-Key} / {@code X-App-Secret},或 query 参数 {@code appKey} / {@code appSecret}。 */ @Slf4j @Validated @RequiredArgsConstructor @RestController @RequestMapping("/open/mes/drawing") public class MesDrawingController extends BaseController { private final IMesDrawingService mesDrawingService; /** * 按生产令号列出图纸。可选 materialCode 只返回该图号。 */ @SaIgnore @GetMapping("/list") public R list( @RequestHeader(value = "X-App-Key", required = false) String headerAppKey, @RequestHeader(value = "X-App-Secret", required = false) String headerAppSecret, @RequestParam(value = "appKey", required = false) String appKey, @RequestParam(value = "appSecret", required = false) String appSecret, @RequestParam("productionOrderNo") String productionOrderNo, @RequestParam(value = "materialCode", required = false) String materialCode) { mesDrawingService.assertAuth(firstNonBlank(headerAppKey, appKey), firstNonBlank(headerAppSecret, appSecret)); return R.ok(mesDrawingService.listDrawings(productionOrderNo, materialCode)); } /** * 按生产令号 + 物料编码下载图纸。fileType:pdf(默认)或 dwg。 */ @SaIgnore @GetMapping("/download") public void download( @RequestHeader(value = "X-App-Key", required = false) String headerAppKey, @RequestHeader(value = "X-App-Secret", required = false) String headerAppSecret, @RequestParam(value = "appKey", required = false) String appKey, @RequestParam(value = "appSecret", required = false) String appSecret, @RequestParam("productionOrderNo") String productionOrderNo, @RequestParam("materialCode") String materialCode, @RequestParam(value = "fileType", required = false) String fileType, HttpServletResponse response) { try { mesDrawingService.assertAuth(firstNonBlank(headerAppKey, appKey), firstNonBlank(headerAppSecret, appSecret)); File file = mesDrawingService.resolveDownloadFile(productionOrderNo, materialCode, fileType); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode(file.getName(), StandardCharsets.UTF_8.name()).replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName); response.setContentLengthLong(file.length()); try (FileInputStream fis = new FileInputStream(file); OutputStream os = response.getOutputStream()) { byte[] buffer = new byte[8192]; int length; while ((length = fis.read(buffer)) > 0) { os.write(buffer, 0, length); } os.flush(); } } catch (ServiceException e) { writeJsonFail(response, e.getMessage()); } catch (Exception e) { log.error("MES下载图纸失败 productionOrderNo={} materialCode={}", productionOrderNo, materialCode, e); writeJsonFail(response, "下载失败: " + e.getMessage()); } } private static String firstNonBlank(String a, String b) { return StringUtils.isNotBlank(a) ? a.trim() : StringUtils.trimToEmpty(b); } private void writeJsonFail(HttpServletResponse response, String msg) { try { if (!response.isCommitted()) { response.reset(); } response.setContentType("application/json;charset=utf-8"); response.getWriter().write(JSONObject.toJSONString(R.fail(msg))); } catch (IOException ex) { log.error("写入MES图纸错误响应失败", ex); } } }