diff --git a/src/main/java/com/gaotao/modules/schedule/entity/ScheduleTodoMessageEntity.java b/src/main/java/com/gaotao/modules/schedule/entity/ScheduleTodoMessageEntity.java index 17b1ed6..2198c4d 100644 --- a/src/main/java/com/gaotao/modules/schedule/entity/ScheduleTodoMessageEntity.java +++ b/src/main/java/com/gaotao/modules/schedule/entity/ScheduleTodoMessageEntity.java @@ -114,4 +114,9 @@ public class ScheduleTodoMessageEntity implements Serializable { * 责任部门编码(roleId) */ private String responsibilityDept; + + /** + * 不良代码(异常代码规则确认时选择) + */ + private String defectCode; } diff --git a/src/main/java/com/gaotao/modules/schedule/service/impl/ScheduleServiceImpl.java b/src/main/java/com/gaotao/modules/schedule/service/impl/ScheduleServiceImpl.java index b53651c..ba8f273 100644 --- a/src/main/java/com/gaotao/modules/schedule/service/impl/ScheduleServiceImpl.java +++ b/src/main/java/com/gaotao/modules/schedule/service/impl/ScheduleServiceImpl.java @@ -4497,6 +4497,14 @@ public class ScheduleServiceImpl implements ScheduleService { } if (ACTION_OPEN_DEFECT.equals(action) || ACTION_OPEN_DOWNTIME.equals(action)) { String functionName = inData == null ? "" : StringUtils.trimWhitespace(inData.getFunctionName()); + if (ACTION_OPEN_DEFECT.equals(action) && !StringUtils.hasText(inData == null ? null : inData.getDefectCode())) { + // 异常代码规则需等前端确认对话框选择不良代码后再落库 + return; + } + if (ACTION_OPEN_DEFECT.equals(action)) { + String workCenterNo = inData == null ? "" : StringUtils.trimWhitespace(inData.getWorkCenterNo()); + this.validateDefectCodeWorkCenter(inData.getSite(), inData.getDefectCode(), workCenterNo); + } if (FUNCTION_NAME_ABNORMAL_ROLL_CUT.equals(functionName)) { // 异常截卷流程等同“产量报告 + 换班结转”,提示类规则也需要缓存当前数据 saveSplitRuleCacheData(inData); @@ -4606,6 +4614,8 @@ public class ScheduleServiceImpl implements ScheduleService { entity.setMatchedDefectRate(matchedDefectRate); entity.setMatchedTotalQty(matchedTotalQty); entity.setResponsibilityDept(StringUtils.hasText(responsibilityDept) ? responsibilityDept : null); + String defectCode = inData.getDefectCode(); + entity.setDefectCode(StringUtils.hasText(defectCode) ? truncate(defectCode.trim(), 50) : null); scheduleTodoMessageMapper.insertTodoMessage(entity); return entity; } diff --git a/src/main/java/com/gaotao/modules/sys/service/impl/SysFileServiceImpl.java b/src/main/java/com/gaotao/modules/sys/service/impl/SysFileServiceImpl.java index 96e05df..3c84156 100644 --- a/src/main/java/com/gaotao/modules/sys/service/impl/SysFileServiceImpl.java +++ b/src/main/java/com/gaotao/modules/sys/service/impl/SysFileServiceImpl.java @@ -20,6 +20,8 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.*; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -128,7 +130,7 @@ public class SysFileServiceImpl implements SysFileService { FileInputStream fis = null; BufferedInputStream bis = null; response.setContentType("application/force-download;charset=utf-8"); - response.setHeader("Content-disposition", "attachment; filename=" + new String(getFileData.get(0).getFileName().getBytes("gbk"), "iso8859-1")); + setDownloadContentDisposition(response, getFileData.get(0).getFileName()); try { //读取文件 fis = new FileInputStream(file); @@ -149,6 +151,18 @@ public class SysFileServiceImpl implements SysFileService { } } + /** + * 设置下载响应头。文件名必须加引号,否则文件名中的逗号会被 Chrome 解析成多个 Content-Disposition, + * 触发 net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION。 + */ + private void setDownloadContentDisposition(HttpServletResponse response, String fileName) throws UnsupportedEncodingException { + String safeName = fileName == null ? "download" : fileName.replaceAll("[\\r\\n\"]", "_"); + String asciiFallback = safeName.replaceAll("[^\\x20-\\x7E]", "_"); + String encodedUtf8 = URLEncoder.encode(safeName, StandardCharsets.UTF_8.name()).replace("+", "%20"); + response.setHeader("Content-Disposition", + "attachment; filename=\"" + asciiFallback + "\"; filename*=UTF-8''" + encodedUtf8); + } + @Override public List getInspectionFile(SysOssEntity inData) { List files1 = sysOssDao.getSysFileByOrderRef2(inData); diff --git a/src/main/resources/mapper/schedule/ScheduleTodoMessageMapper.xml b/src/main/resources/mapper/schedule/ScheduleTodoMessageMapper.xml index 0c2fd80..ccb82fe 100644 --- a/src/main/resources/mapper/schedule/ScheduleTodoMessageMapper.xml +++ b/src/main/resources/mapper/schedule/ScheduleTodoMessageMapper.xml @@ -23,7 +23,8 @@ matched_roll_index, matched_defect_rate, matched_total_qty, - responsibility_dept + responsibility_dept, + defect_code ) VALUES ( #{site}, #{buNo}, @@ -44,7 +45,8 @@ #{matchedRollIndex,jdbcType=INTEGER}, #{matchedDefectRate,jdbcType=DECIMAL}, #{matchedTotalQty,jdbcType=DECIMAL}, - #{responsibilityDept} + #{responsibilityDept}, + #{defectCode,jdbcType=VARCHAR} ) @@ -268,6 +270,8 @@ stm.matched_defect_rate AS matchedDefectRate, stm.matched_total_qty AS matchedTotalQty, stm.responsibility_dept AS responsibilityDept, + stm.defect_code AS defectCode, + ISNULL(idc.DefectDesc, '') AS defectDesc, ISNULL(( SELECT TOP 1 smd.process_exception_no FROM schedule_mrb_exception_detail smd @@ -281,6 +285,13 @@ FROM schedule_todo_message stm LEFT JOIN sys_role sr ON CAST(sr.role_id AS NVARCHAR(100)) = stm.responsibility_dept + OUTER APPLY ( + SELECT TOP 1 idcInner.DefectDesc + FROM InspectionDefectCode idcInner + WHERE idcInner.Site = stm.site + AND idcInner.DefectCode = stm.defect_code + ORDER BY CASE WHEN ISNULL(idcInner.Active, 'Y') = 'Y' THEN 0 ELSE 1 END + ) idc ORDER BY stm.created_time DESC, stm.info_code DESC OFFSET #{query.offset} ROWS FETCH NEXT #{query.limit} ROWS ONLY