doc/20261103_enable_process_maintenance_menu.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,56 @@ -- æ¢å¤âå·¥åºç»´æ¤âèåï¼MySQLï¼å¯é夿§è¡ï¼ã -- è¥ä¾çº¦å®ï¼visible='0' 表示æ¾ç¤ºï¼status='0' 表示æ£å¸¸ã -- 1. æ¢å¤èåæ¬èº«ï¼å¹¶ä¿®æ£å端ç»ä»¶å°åã UPDATE sys_menu SET visible = '0', status = '0', menu_type = 'C', component = 'productionManagement/productionProcess/index', update_by = 'admin', update_time = NOW() WHERE menu_name = 'å·¥åºç»´æ¤' OR component = 'productionManagement/productionProcess/index'; -- 2. ç¡®ä¿ç´æ¥ç¶èåå¤äºæ¾ç¤ºãæ£å¸¸ç¶æã UPDATE sys_menu parent INNER JOIN sys_menu child ON child.parent_id = parent.menu_id SET parent.visible = '0', parent.status = '0', parent.update_by = 'admin', parent.update_time = NOW() WHERE child.menu_name = 'å·¥åºç»´æ¤'; -- 3. ç»ç®¡çåè§è²è¡¥é½èåå ³ç³»ï¼å·²å卿¶ä¸éå¤æå ¥ï¼ã INSERT INTO sys_role_menu (role_id, menu_id) SELECT role.role_id, menu.menu_id FROM sys_role role INNER JOIN sys_menu menu ON menu.menu_name = 'å·¥åºç»´æ¤' WHERE role.role_key = 'admin' AND NOT EXISTS ( SELECT 1 FROM sys_role_menu relation WHERE relation.role_id = role.role_id AND relation.menu_id = menu.menu_id ); -- 4. æ§è¡åæ£æ¥èåãç¶èååè§è²ææç»æã SELECT menu.menu_id, menu.parent_id, menu.menu_name, menu.path, menu.component, menu.visible, menu.status, parent.menu_name AS parent_name, parent.visible AS parent_visible, parent.status AS parent_status FROM sys_menu menu LEFT JOIN sys_menu parent ON parent.menu_id = menu.parent_id WHERE menu.menu_name = 'å·¥åºç»´æ¤'; SELECT role.role_name, role.role_key, relation.menu_id FROM sys_role_menu relation INNER JOIN sys_role role ON role.role_id = relation.role_id INNER JOIN sys_menu menu ON menu.menu_id = relation.menu_id WHERE menu.menu_name = 'å·¥åºç»´æ¤'; doc/20261103_quality_inspect_user_assignment.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,5 @@ ALTER TABLE quality_inspect ADD COLUMN check_user_id BIGINT NULL COMMENT 'æ£éªåç³»ç»ç¨æ·ID' AFTER check_name; CREATE INDEX idx_quality_inspect_check_user_id ON quality_inspect (check_user_id); src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
@@ -27,6 +27,9 @@ */ public List<SysUser> selectUserList(SysUser sysUser); /** å½åç§æ·ä¸å¯ç¨äºä¸å¡åé çæ£å¸¸ç³»ç»ç¨æ·ã */ public List<SysUser> selectActiveUsers(@Param("tenantId") Long tenantId); /** * æ ¹æ®æ¡ä»¶å页æ¥è¯¢å·²é ç¨æ·è§è²å表 * src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -2,7 +2,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.project.system.service.ISysUserService; import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl; @@ -15,6 +19,7 @@ import com.ruoyi.quality.service.IQualityInspectParamService; import com.ruoyi.quality.service.IQualityInspectService; import com.ruoyi.quality.service.IQualityUnqualifiedService; import com.ruoyi.quality.util.QualityInspectionValueValidator; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -23,6 +28,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Objects; /** * åæææ£éª/è¿ç¨æ£éª/åºåæ£éª @@ -41,6 +47,12 @@ private IQualityInspectFileService qualityInspectFileService; @Autowired private ProcurementRecordService procurementRecordService; @Resource private ISysUserService sysUserService; @Resource private SysUserMapper sysUserMapper; /** @@ -108,6 +120,48 @@ return AjaxResult.error("å·²æäº¤çæ£éªè®°å½ä¸è½ä¿®æ¹"); } return AjaxResult.success(qualityInspectService.updateQualityInspect(qualityInspectDto)); } /** ä» åé æ£éªåï¼é¿å è§¦åæ´å¼ æ£éªåçå¿ å¡«æ ¡éªã */ @PostMapping("/assignInspector") public AjaxResult assignInspector(@RequestBody QualityInspect inspect) { if (inspect == null || inspect.getId() == null) { return AjaxResult.error("æ£éªè®°å½IDä¸è½ä¸ºç©º"); } if (inspect.getCheckUserId() == null) { return AjaxResult.error("è¯·éæ©æ£éªå"); } QualityInspect stored = qualityInspectService.getById(inspect.getId()); if (stored == null) { return AjaxResult.error("æ£éªè®°å½ä¸åå¨"); } if (Integer.valueOf(1).equals(stored.getInspectState())) { return AjaxResult.error("å·²æäº¤çæ£éªè®°å½ä¸è½éæ°åé æ£éªå"); } SysUser inspector = sysUserService.selectUserById(inspect.getCheckUserId()); if (inspector == null || "2".equals(inspector.getDelFlag())) { return AjaxResult.error("æéç¨æ·ä¸å卿已å é¤"); } if (!SecurityUtils.isAdmin(SecurityUtils.getUserId()) && !Objects.equals(SecurityUtils.getLoginUser().getTenantId(), inspector.getTenantId())) { return AjaxResult.error("åªè½åé ç»å½åå ¬å¸ç¨æ·"); } if (!"0".equals(inspector.getStatus())) { return AjaxResult.error("æéç¨æ·å·²åç¨"); } QualityInspect update = new QualityInspect(); update.setId(inspect.getId()); update.setCheckUserId(inspector.getUserId()); update.setCheckName(StringUtils.defaultIfBlank(inspector.getNickName(), inspector.getUserName())); return AjaxResult.success(qualityInspectService.updateById(update)); } /** ä» è¿åå½åç§æ·ä¸æ£å¸¸ãæªå é¤çç³»ç»ç¨æ·ï¼ä¾è´¨æ£ååé 使ç¨ã */ @GetMapping("/inspectorCandidates") public AjaxResult inspectorCandidates() { Long tenantId = SecurityUtils.isAdmin(SecurityUtils.getUserId()) ? null : SecurityUtils.getLoginUser().getTenantId(); return AjaxResult.success(sysUserMapper.selectActiveUsers(tenantId)); } /** @@ -187,6 +241,12 @@ return "请填åâ" + parameter.getParameterItem() + "âçæ£éªå¼"; } } if ("åæ ¼".equals(inspect.getCheckResult())) { String valueMessage = QualityInspectionValueValidator.validateQualified(inspect.getQualityInspectParams()); if (valueMessage != null) { return valueMessage; } } return null; } } src/main/java/com/ruoyi/quality/controller/QualityInspectParamController.java
@@ -9,6 +9,8 @@ import com.ruoyi.quality.service.IQualityInspectFileService; import com.ruoyi.quality.service.IQualityInspectParamService; import com.ruoyi.quality.service.IQualityInspectService; import com.ruoyi.quality.util.QualityInspectionValueValidator; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -25,6 +27,9 @@ @Resource private IQualityInspectParamService qualityInspectParamService; @Resource private IQualityInspectService qualityInspectService; /** * 详æ @@ -44,6 +49,31 @@ */ @PostMapping("/update") public AjaxResult update(@RequestBody List<QualityInspectParam> qualityInspectParams) { if (CollectionUtils.isEmpty(qualityInspectParams)) { return AjaxResult.error("æ£éªé¡¹ç®ä¸è½ä¸ºç©º"); } Long inspectId = qualityInspectParams.get(0).getInspectId(); if (inspectId == null) { return AjaxResult.error("æ£éªè®°å½IDä¸è½ä¸ºç©º"); } QualityInspect inspect = qualityInspectService.getById(inspectId); if (inspect == null) { return AjaxResult.error("æ£éªè®°å½ä¸åå¨"); } if (Integer.valueOf(1).equals(inspect.getInspectState())) { return AjaxResult.error("å·²æäº¤çæ£éªè®°å½ä¸è½ä¿®æ¹"); } for (QualityInspectParam parameter : qualityInspectParams) { if (StringUtils.isBlank(parameter.getTestValue())) { return AjaxResult.error("请填åâ" + parameter.getParameterItem() + "âçæ£éªå¼"); } } if ("åæ ¼".equals(inspect.getCheckResult())) { String valueMessage = QualityInspectionValueValidator.validateQualified(qualityInspectParams); if (valueMessage != null) { return AjaxResult.error(valueMessage); } } return AjaxResult.success(qualityInspectParamService.updateBatchById(qualityInspectParams)); } src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java
@@ -101,8 +101,8 @@ * @return */ @GetMapping("/getQualityTestStandardByProductId") public AjaxResult getQualityTestStandardByProductId(@Nonnull Long productId, @Nonnull Integer inspectType, String process) { return AjaxResult.success(qualityTestStandardService.getQualityTestStandardByProductId(productId,inspectType,process)); public AjaxResult getQualityTestStandardByProductId(@Nonnull Long productId, @Nonnull Integer inspectType, Long processId) { return AjaxResult.success(qualityTestStandardService.getQualityTestStandardByProductId(productId, inspectType, processId)); } /** src/main/java/com/ruoyi/quality/mapper/QualityTestStandardMapper.java
@@ -22,7 +22,7 @@ IPage<QualityTestStandard> qualityTestStandardListPage(Page page, @Param("c") QualityTestStandard qualityTestStandard); List<QualityTestStandard> getQualityTestStandardByProductId(@Param("productId") Long productId, @Param("inspectType") Integer inspectType, @Param("process") String process); List<QualityTestStandard> getQualityTestStandardByProductId(@Param("productId") Long productId, @Param("inspectType") Integer inspectType, @Param("processId") Long processId); } src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -70,6 +70,11 @@ private String checkName; /** * æ£éªå对åºçç³»ç»ç¨æ·ID */ private Long checkUserId; /** * å ³è产åid */ @NotBlank(message = "产åidä¸è½ä¸ºç©º") src/main/java/com/ruoyi/quality/service/IQualityTestStandardService.java
@@ -21,6 +21,6 @@ int copyParam(QualityTestStandard qualityTestStandard); List<QualityTestStandard> getQualityTestStandardByProductId(Long productId, Integer inspectType, String process); List<QualityTestStandard> getQualityTestStandardByProductId(Long productId, Integer inspectType, Long processId); } src/main/java/com/ruoyi/quality/service/impl/QualityTestStandardServiceImpl.java
@@ -60,8 +60,8 @@ } @Override public List<QualityTestStandard> getQualityTestStandardByProductId(Long productId, Integer inspectType, String process) { return qualityTestStandardMapper.getQualityTestStandardByProductId(productId, inspectType, process); public List<QualityTestStandard> getQualityTestStandardByProductId(Long productId, Integer inspectType, Long processId) { return qualityTestStandardMapper.getQualityTestStandardByProductId(productId, inspectType, processId); } src/main/java/com/ruoyi/quality/util/QualityInspectionValueValidator.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,135 @@ package com.ruoyi.quality.util; import com.ruoyi.quality.pojo.QualityInspectParam; import org.apache.commons.lang3.StringUtils; import java.math.BigDecimal; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * æ£éªå¼ä¸æ å/å æ§èå´æ ¡éªã * æ¯æåºé´ãæ£è´åå·®ã大尿¯è¾å精确æ°å¼ï¼ä¾å¦ï¼1.95~2.05ã2.00±0.10ãâ¤0.02ãâ¥100ã */ public final class QualityInspectionValueValidator { private static final String NUMBER = "(-?\\d+(?:\\.\\d+)?)"; private static final Pattern RANGE = Pattern.compile("^" + NUMBER + "(?:~|ï½|è³|â|-)" + NUMBER + "$"); private static final Pattern PLUS_MINUS = Pattern.compile("^" + NUMBER + "(?:±|\\+/-)" + NUMBER + "$"); private static final Pattern TOLERANCE_ONLY = Pattern.compile("^(?:±|\\+/-)" + NUMBER + "$"); private static final Pattern COMPARE = Pattern.compile("^(<=|>=|<|>|â¤|â¥)" + NUMBER + "$"); private static final Pattern EXACT = Pattern.compile("^" + NUMBER + "$"); private static final Pattern OBVIOUS_ABNORMAL_TEXT = Pattern.compile(".*(å¼å¸¸|ä¸åæ ¼|失败|ä¸éè¿|è¶ æ |缺é·).*", Pattern.CASE_INSENSITIVE); private QualityInspectionValueValidator() { } public static String validateQualified(List<QualityInspectParam> parameters) { if (parameters == null) { return null; } for (QualityInspectParam parameter : parameters) { String message = validateParameter(parameter); if (message != null) { return message; } } return null; } private static String validateParameter(QualityInspectParam parameter) { if (parameter == null || StringUtils.isBlank(parameter.getTestValue())) { return null; } String testText = normalize(parameter.getTestValue()); if (OBVIOUS_ABNORMAL_TEXT.matcher(testText).matches()) { return error(parameter, effectiveRule(parameter)); } BigDecimal testValue = decimal(testText); String rule = firstNumericRule(parameter.getControlValue(), parameter.getStandardValue()); if (rule == null) { return null; } if (testValue == null || !matches(testValue, rule)) { return error(parameter, rule); } return null; } private static String firstNumericRule(String controlValue, String standardValue) { String control = normalize(controlValue); if (isSupportedRule(control)) { return control; } String standard = normalize(standardValue); return isSupportedRule(standard) ? standard : null; } private static boolean isSupportedRule(String rule) { return rule != null && (RANGE.matcher(rule).matches() || PLUS_MINUS.matcher(rule).matches() || TOLERANCE_ONLY.matcher(rule).matches() || COMPARE.matcher(rule).matches() || EXACT.matcher(rule).matches()); } private static boolean matches(BigDecimal value, String rule) { Matcher matcher = RANGE.matcher(rule); if (matcher.matches()) { BigDecimal first = new BigDecimal(matcher.group(1)); BigDecimal second = new BigDecimal(matcher.group(2)); BigDecimal min = first.min(second); BigDecimal max = first.max(second); return value.compareTo(min) >= 0 && value.compareTo(max) <= 0; } matcher = PLUS_MINUS.matcher(rule); if (matcher.matches()) { BigDecimal center = new BigDecimal(matcher.group(1)); BigDecimal tolerance = new BigDecimal(matcher.group(2)).abs(); return value.compareTo(center.subtract(tolerance)) >= 0 && value.compareTo(center.add(tolerance)) <= 0; } Matcher toleranceOnly = TOLERANCE_ONLY.matcher(rule); if (toleranceOnly.matches()) { BigDecimal tolerance = new BigDecimal(toleranceOnly.group(1)).abs(); return value.abs().compareTo(tolerance) <= 0; } matcher = COMPARE.matcher(rule); if (matcher.matches()) { int compared = value.compareTo(new BigDecimal(matcher.group(2))); String operator = matcher.group(1); if ("<".equals(operator)) return compared < 0; if (">".equals(operator)) return compared > 0; if ("<=".equals(operator) || "â¤".equals(operator)) return compared <= 0; return compared >= 0; } matcher = EXACT.matcher(rule); return matcher.matches() && value.compareTo(new BigDecimal(matcher.group(1))) == 0; } private static BigDecimal decimal(String value) { try { return StringUtils.isBlank(value) ? null : new BigDecimal(value); } catch (NumberFormatException ignored) { return null; } } private static String normalize(String value) { return StringUtils.isBlank(value) ? null : value.trim().replaceAll("\\s+", "").replace(",", ""); } private static String effectiveRule(QualityInspectParam parameter) { return StringUtils.isNotBlank(parameter.getControlValue()) ? parameter.getControlValue() : parameter.getStandardValue(); } private static String error(QualityInspectParam parameter, String rule) { String item = StringUtils.defaultIfBlank(parameter.getParameterItem(), "æªå½åææ "); String standard = StringUtils.defaultIfBlank(rule, "å·²é ç½®æ å"); return "æ£éªé¡¹ç®â" + item + "âçæ£éªå¼â" + parameter.getTestValue() + "âä¸ç¬¦åæ åï¼" + standard + "ï¼ï¼ä¸è½æåæ ¼ä¿å"; } } src/main/resources/application-dev.yml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,223 @@ # è¯å¯¼-ä»å¨ç©æµç³»ç»é¡¹ç®ç¸å ³é ç½® inspur: appId: 1211004787244400640 appSecret: qZw3MjAwMTIwMjYxNTAxNDYyOTEy0U ruoyi: # åç§° name: RuoYi # çæ¬ version: 3.8.9 # çæå¹´ä»½ copyrightYear: 2025 # æä»¶è·¯å¾ 示ä¾ï¼ Windowsé ç½®D:/ruoyi/uploadPathï¼Linuxé ç½® /home/ruoyi/uploadPathï¼ profile: /center-lims/mis/file # è·åipå°åå¼å ³ addressEnabled: false # éªè¯ç ç±»å math æ°åè®¡ç® char å符éªè¯ captchaType: math # å¼åç¯å¢é ç½® server: # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 port: 8034 servlet: # åºç¨ç访é®è·¯å¾ context-path: / tomcat: # tomcatçURIç¼ç uri-encoding: UTF-8 # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 accept-count: 1000 threads: # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 max: 800 # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 min-spare: 100 # æ¥å¿é ç½® logging: level: com.ruoyi: warn org.springframework: warn minio: endpoint: http://114.132.189.42/ port: 7019 secure: false accessKey: admin secretKey: 12345678 preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ default-bucket: uploadPath # ç¨æ·é ç½® user: password: # å¯ç æå¤§éè¯¯æ¬¡æ° maxRetryCount: 5 # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ lockTime: 10 # Springé ç½® spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: # ä¸»åºæ°æ®æº master: url: jdbc:mysql://10.136.65.135:3306/zlglxt-ruoyi-xinlan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: zttZTT123! # ä»åºæ°æ®æº slave: # 仿°æ®æºå¼å ³/é»è®¤å ³é enabled: false url: username: password: # åå§è¿æ¥æ° initialSize: 5 # æå°è¿æ¥æ± æ°é minIdle: 10 # æå¤§è¿æ¥æ± æ°é maxActive: 20 # é ç½®è·åè¿æ¥çå¾ è¶ æ¶çæ¶é´ maxWait: 60000 # é ç½®è¿æ¥è¶ æ¶æ¶é´ connectTimeout: 30000 # é ç½®ç½ç»è¶ æ¶æ¶é´ socketTimeout: 60000 # é ç½®é´éå¤ä¹ æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å ³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ timeBetweenEvictionRunsMillis: 60000 # é ç½®ä¸ä¸ªè¿æ¥å¨æ± 䏿å°çåçæ¶é´ï¼å使¯æ¯«ç§ minEvictableIdleTimeMillis: 300000 # é ç½®ä¸ä¸ªè¿æ¥å¨æ± 䏿大çåçæ¶é´ï¼å使¯æ¯«ç§ maxEvictableIdleTimeMillis: 900000 # é ç½®æ£æµè¿æ¥æ¯å¦ææ validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter: enabled: true statViewServlet: enabled: true # 设置ç½ååï¼ä¸å¡«åå 许ææè®¿é® allow: url-pattern: /druid/* # æ§å¶å°ç®¡çç¨æ·ååå¯ç login-username: ruoyi login-password: 123456 filter: stat: enabled: true # æ ¢SQLè®°å½ log-slow-sql: true slow-sql-millis: 1000 merge-sql: true wall: config: multi-statement-allow: true # èµæºä¿¡æ¯ messages: # å½é åèµæºæä»¶è·¯å¾ basename: i18n/messages # æä»¶ä¸ä¼ servlet: multipart: # å个æä»¶å¤§å° max-file-size: 1GB # 设置æ»ä¸ä¼ çæä»¶å¤§å° max-request-size: 2GB # æå¡æ¨¡å devtools: restart: # çé¨ç½²å¼å ³ enabled: false # redis é ç½® redis: # å°å # host: 127.0.0.1 host: 10.136.65.135 # 端å£ï¼é»è®¤ä¸º6379 port: 6379 # æ°æ®åºç´¢å¼ database: 0 # å¯ç password: zttZTT123! # password: 123456 # è¿æ¥è¶ æ¶æ¶é´ timeout: 10s lettuce: pool: # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ min-idle: 0 # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ max-idle: 8 # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° max-active: 8 # #è¿æ¥æ± æå¤§é»å¡çå¾ æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ max-wait: -1ms # tokené ç½® token: # 令çèªå®ä¹æ è¯ header: Authorization # 令çå¯é¥ secret: abcdefghijklmnopqrstuvwxyz # ä»¤çæææï¼é»è®¤30åéï¼ expireTime: 450 # MyBatis Plusé ç½® mybatis-plus: # æç´¢æå®å å«å æ ¹æ®èªå·±çé¡¹ç®æ¥ typeAliasesPackage: com.ruoyi.**.pojo # é ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ mapperLocations: classpath*:mapper/**/*Mapper.xml # å è½½å ¨å±çé ç½®æä»¶ configLocation: classpath:mybatis/mybatis-config.xml global-config: enable-sql-runner: true db-config: id-type: auto # PageHelperå页æä»¶ pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swaggeré ç½® swagger: # æ¯å¦å¼å¯swagger enabled: false # 请æ±åç¼ pathMapping: /dev-api # 鲿¢XSSæ»å» xss: # è¿æ»¤å¼å ³ enabled: true # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ excludes: /system/notice # å¹é 龿¥ urlPatterns: /system/*,/monitor/*,/tool/* # 代ç çæ gen: # ä½è author: ruoyi # é»è®¤çæå è·¯å¾ system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool packageName: com.ruoyi.project.system # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true autoRemovePre: false # 表åç¼ï¼çæç±»åä¸ä¼å å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ tablePrefix: sys_ # æ¯å¦å è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å 许 allowOverwrite: false # æ¬å°å¼åæä»¶ç®å½ file: temp-dir: "L:/20260813xxinruan/äºçº§é¡¹ç®æµªæ½®å¼å/è´¨éç®¡çæ£æµç³»ç»/.tmp/uploads/temp" upload-dir: "L:/20260813xxinruan/äºçº§é¡¹ç®æµªæ½®å¼å/è´¨éç®¡çæ£æµç³»ç»/.tmp/uploads/files" src/main/resources/application-tide.yml
@@ -216,3 +216,8 @@ tablePrefix: sys_ # æ¯å¦å è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å 许 allowOverwrite: false # æ¬å°å¼åæä»¶ç®å½ file: temp-dir: "L:/20260813xxinruan/äºçº§é¡¹ç®æµªæ½®å¼å/è´¨éç®¡çæ£æµç³»ç»/.tmp/uploads/temp" upload-dir: "L:/20260813xxinruan/äºçº§é¡¹ç®æµªæ½®å¼å/è´¨éç®¡çæ£æµç³»ç»/.tmp/uploads/files" src/main/resources/mapper/quality/QualityTestStandardMapper.xml
@@ -24,11 +24,10 @@ SELECT qts.* FROM quality_test_standard qts left join quality_test_standard_binding qtsb on qtsb.test_standard_id = qts.id left join product_process pp on qts.process_id = pp.id WHERE qtsb.product_id = #{productId} AND qts.inspect_type = #{inspectType} <if test="process!='' and process!=null"> and pp.name = #{process} <if test="processId != null"> and qts.process_id = #{processId} </if> order by qts.id desc </select> src/main/resources/mapper/system/SysUserMapper.xml
@@ -98,6 +98,25 @@ ${params.dataScope} </select> <select id="selectActiveUsers" resultMap="SysUserResult"> SELECT u.user_id, u.user_name, COALESCE(NULLIF(u.nick_name, ''), u.user_name) AS nick_name, u.status, u.tenant_id, GROUP_CONCAT(DISTINCT d.dept_name ORDER BY d.dept_name SEPARATOR ', ') AS dept_names FROM sys_user u LEFT JOIN sys_user_dept ud ON ud.user_id = u.user_id LEFT JOIN sys_dept d ON d.dept_id = ud.dept_id WHERE u.status = '0' AND u.del_flag = '0' <if test="tenantId != null"> AND u.tenant_id = #{tenantId} </if> GROUP BY u.user_id, u.user_name, u.nick_name, u.status, u.tenant_id ORDER BY nick_name, u.user_name </select> <select id="selectAllocatedList" parameterType="com.ruoyi.project.system.domain.SysUser" resultMap="SysUserResult"> select distinct u.user_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time from sys_user u src/test/java/com/ruoyi/quality/controller/QualityInspectControllerTest.java
@@ -70,6 +70,35 @@ } @Test void addRejectsOutOfRangeValueWhenMarkedQualified() { QualityInspectDto dto = validInspection(0); dto.getQualityInspectParams().get(0).setTestValue("80"); AjaxResult result = controller.add(dto); assertTrue(result.isError()); assertTrue(String.valueOf(result.get(AjaxResult.MSG_TAG)).contains("ä¸è½æåæ ¼ä¿å")); verify(inspectService, never()).add(any()); } @Test void assignInspectorOnlyUpdatesInspectorField() { QualityInspect request = new QualityInspect(); request.setId(9L); request.setCheckName("å¼ æ£éª"); QualityInspect stored = new QualityInspect(); stored.setId(9L); stored.setInspectState(0); when(inspectService.getById(9L)).thenReturn(stored); when(inspectService.updateById(any(QualityInspect.class))).thenReturn(true); AjaxResult result = controller.assignInspector(request); assertTrue(result.isSuccess()); verify(inspectService).updateById(any(QualityInspect.class)); } @Test void processInspectionRequiresProcess() { QualityInspectDto dto = validInspection(1); dto.setProcess(null); src/test/java/com/ruoyi/quality/controller/QualityInspectParamControllerTest.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,49 @@ package com.ruoyi.quality.controller; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectParam; import com.ruoyi.quality.service.IQualityInspectParamService; import com.ruoyi.quality.service.IQualityInspectService; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class QualityInspectParamControllerTest { @Mock private IQualityInspectParamService paramService; @Mock private IQualityInspectService inspectService; @InjectMocks private QualityInspectParamController controller; @Test void updateRejectsOutOfRangeValueForQualifiedInspection() { QualityInspect inspect = new QualityInspect(); inspect.setId(3L); inspect.setInspectState(0); inspect.setCheckResult("åæ ¼"); when(inspectService.getById(3L)).thenReturn(inspect); QualityInspectParam parameter = new QualityInspectParam(); parameter.setId(5L); parameter.setInspectId(3L); parameter.setParameterItem("å度"); parameter.setControlValue("1.95~2.05"); parameter.setTestValue("99"); AjaxResult result = controller.update(Collections.singletonList(parameter)); assertTrue(result.isError()); verify(paramService, never()).updateBatchById(anyList()); } }