From 66e3ce9eb27b853bb8875834459447eb44168596 Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Thu, 5 Nov 2026 09:42:57 +0800 Subject: [PATCH] =?UTF-8?q?2026-11-05=20=E7=8E=B0=E5=9C=BA=E5=8A=A8?= =?UTF-8?q?=E6=8E=A7=E6=A8=A1=E5=9E=8BTID=EF=BC=8C=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E5=BA=A6=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../schedule/mapper/ScheduleMapper.java | 5 ++ .../service/impl/ScheduleServiceImpl.java | 50 ++++++++++++-- .../SysSceneDynamicControlModelService.java | 7 ++ ...ysSceneDynamicControlModelServiceImpl.java | 65 +++++++++++++++++++ .../mapper/schedule/ScheduleMapper.xml | 13 ++++ 5 files changed, 134 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gaotao/modules/schedule/mapper/ScheduleMapper.java b/src/main/java/com/gaotao/modules/schedule/mapper/ScheduleMapper.java index 09e45ec..71d8d28 100644 --- a/src/main/java/com/gaotao/modules/schedule/mapper/ScheduleMapper.java +++ b/src/main/java/com/gaotao/modules/schedule/mapper/ScheduleMapper.java @@ -832,6 +832,11 @@ public interface ScheduleMapper { */ List listTidPendingNormalRolls(@Param("site") String site, @Param("seqNo") String seqNo); + /** + * 动控校验用:取工单物料和当前工序名称 + */ + Map getTidControlOrderContext(@Param("site") String site, @Param("orderNo") String orderNo, @Param("itemNo") Integer itemNo); + /** * 将已通过校验的 TID 正常卷标记为通过 */ 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 1d8ac9d..32e0ba7 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 @@ -30,6 +30,7 @@ import com.gaotao.modules.schedule.mapper.SchedulingMapper; import com.gaotao.modules.schedule.service.ScheduleService; import com.gaotao.modules.schedule.service.SchedulingService; import com.gaotao.modules.shopOrder.entity.OperatorData; +import com.gaotao.modules.sys.entity.SysUserEntity; import com.gaotao.modules.sys.entity.SysSceneExceptionRuleConditionEntity; import com.gaotao.modules.sys.entity.SysSceneExceptionRuleEntity; import com.gaotao.modules.sys.mapper.SysSceneExceptionRuleMapper; @@ -38,6 +39,7 @@ import com.gaotao.modules.sys.service.SysSceneDynamicControlModelService; import com.gaotao.modules.sys.service.SysUserRoleService; import com.gaotao.modules.trans.dao.TransNoControlMapper; import com.gaotao.modules.trans.entity.TransNoControl; +import org.apache.shiro.SecurityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -5063,9 +5065,7 @@ public class ScheduleServiceImpl implements ScheduleService { private void checkTidSplitControl(SearchScheduleData inData) { String workCenterNo = inData.getWorkCenterNo() == null ? "" : inData.getWorkCenterNo().trim(); - Map context = new HashMap<>(); - context.put("WORK_CENTER", workCenterNo); - if (!sysSceneDynamicControlModelService.isControlEnabled(inData.getSite(), TID_SPLIT_CONTROL_NO, context)) { + if (!sysSceneDynamicControlModelService.isAnyCheckedDimensionEnabled(inData.getSite(), TID_SPLIT_CONTROL_NO, buildTidControlContext(inData))) { return; } List rollNos = scheduleMapper.listTidPendingNormalRolls(inData.getSite(), inData.getSeqNo()); @@ -5088,11 +5088,49 @@ public class ScheduleServiceImpl implements ScheduleService { scheduleMapper.updateTidPassFlag(inData.getSite(), inData.getSeqNo(), rollNos); } + private Map buildTidControlContext(SearchScheduleData inData) { + Map context = new HashMap<>(); + String partNo = inData.getPartNo() == null ? "" : inData.getPartNo().trim(); + String operationDesc = ""; + if (StringUtils.hasText(inData.getSite()) && StringUtils.hasText(inData.getOrderNo())) { + Map orderContext = scheduleMapper.getTidControlOrderContext(inData.getSite(), inData.getOrderNo(), inData.getItemNo()); + if (orderContext != null) { + if (!StringUtils.hasText(partNo) && orderContext.get("partNo") != null) { + partNo = String.valueOf(orderContext.get("partNo")).trim(); + } + if (orderContext.get("operationDesc") != null) { + operationDesc = String.valueOf(orderContext.get("operationDesc")).trim(); + } + } + } + context.put("PART", partNo); + context.put("WORK_CENTER", inData.getWorkCenterNo() == null ? "" : inData.getWorkCenterNo().trim()); + context.put("RESOURCE", inData.getResourceId() == null ? "" : inData.getResourceId().trim()); + context.put("OPERATION", operationDesc); + context.put("PERSON", currentLoginUsername(inData)); + return context; + } + + private String currentLoginUsername(SearchScheduleData inData) { + try { + Object principal = SecurityUtils.getSubject().getPrincipal(); + if (principal instanceof SysUserEntity && StringUtils.hasText(((SysUserEntity) principal).getUsername())) { + return ((SysUserEntity) principal).getUsername().trim(); + } + } catch (Exception ignored) { + } + if (StringUtils.hasText(inData.getUsername())) { + return inData.getUsername().trim(); + } + if (StringUtils.hasText(inData.getUserName())) { + return inData.getUserName().trim(); + } + return ""; + } + private void checkTidFinishControl(SearchScheduleData inData) { String workCenterNo = inData.getWorkCenterNo() == null ? "" : inData.getWorkCenterNo().trim(); - Map context = new HashMap<>(); - context.put("WORK_CENTER", workCenterNo); - if (!sysSceneDynamicControlModelService.isControlEnabled(inData.getSite(), TID_FINISH_CONTROL_NO, context)) { + if (!sysSceneDynamicControlModelService.isAnyCheckedDimensionEnabled(inData.getSite(), TID_FINISH_CONTROL_NO, buildTidControlContext(inData))) { return; } String resourceId = inData.getResourceId() == null ? "" : inData.getResourceId().trim(); diff --git a/src/main/java/com/gaotao/modules/sys/service/SysSceneDynamicControlModelService.java b/src/main/java/com/gaotao/modules/sys/service/SysSceneDynamicControlModelService.java index d7c615a..d9b6187 100644 --- a/src/main/java/com/gaotao/modules/sys/service/SysSceneDynamicControlModelService.java +++ b/src/main/java/com/gaotao/modules/sys/service/SysSceneDynamicControlModelService.java @@ -22,6 +22,13 @@ public interface SysSceneDynamicControlModelService { /** * 未控制或没有这条控制时返回 false。 * 已控制且没有生效范围时返回 true,与原来只看开关一致。 + * 多个维度同时配置时,必须全部符合。 */ boolean isControlEnabled(String site, String controlNo, Map context); + + /** + * 已控制时,勾选的可用维度里只要有一项符合就生效。检验类型不参与判断。 + * 没有可判断的维度范围时,开关打开即生效。 + */ + boolean isAnyCheckedDimensionEnabled(String site, String controlNo, Map context); } diff --git a/src/main/java/com/gaotao/modules/sys/service/impl/SysSceneDynamicControlModelServiceImpl.java b/src/main/java/com/gaotao/modules/sys/service/impl/SysSceneDynamicControlModelServiceImpl.java index e41a90e..f74da7b 100644 --- a/src/main/java/com/gaotao/modules/sys/service/impl/SysSceneDynamicControlModelServiceImpl.java +++ b/src/main/java/com/gaotao/modules/sys/service/impl/SysSceneDynamicControlModelServiceImpl.java @@ -254,6 +254,71 @@ public class SysSceneDynamicControlModelServiceImpl implements SysSceneDynamicCo return true; } + @Override + public boolean isAnyCheckedDimensionEnabled(String site, String controlNo, Map context) { + String baseData = sysSceneDynamicControlModelMapper.queryBaseData(site, controlNo); + if (!"控制".equals(baseData)) { + return false; + } + List dimensions = sysSceneDynamicControlModelMapper.listDimension(site, controlNo); + Set checked = new HashSet<>(); + if (dimensions != null) { + for (SysSceneDynamicControlDimensionEntity dimension : dimensions) { + if (dimension == null || StringUtils.isBlank(dimension.getDimensionCode())) { + continue; + } + String code = dimension.getDimensionCode().trim(); + if (!"INSPECTION_TYPE".equals(code)) { + checked.add(code); + } + } + } + List scopes = sysSceneDynamicControlModelMapper.listScope(site, controlNo); + Map> groups = new LinkedHashMap<>(); + if (scopes != null) { + for (SysSceneDynamicControlScopeEntity scope : scopes) { + if (scope == null || StringUtils.isBlank(scope.getDimensionCode())) { + continue; + } + String code = scope.getDimensionCode().trim(); + if (!checked.contains(code)) { + continue; + } + groups.computeIfAbsent(code, key -> new ArrayList<>()).add(scope); + } + } + if (groups.isEmpty()) { + return true; + } + for (Map.Entry> entry : groups.entrySet()) { + if (dimensionMatched(entry.getKey(), entry.getValue(), context)) { + return true; + } + } + return false; + } + + private boolean dimensionMatched(String dimensionCode, List rows, Map context) { + String current = ""; + if (context != null && context.get(dimensionCode) != null) { + current = context.get(dimensionCode).trim(); + } + boolean hit = false; + if (StringUtils.isNotBlank(current)) { + for (SysSceneDynamicControlScopeEntity row : rows) { + String valueCode = row.getValueCode() == null ? "" : row.getValueCode().trim(); + if (current.equals(valueCode)) { + hit = true; + break; + } + } + } + if ("不包含".equals(rows.get(0).getMatchType())) { + return StringUtils.isNotBlank(current) && !hit; + } + return hit; + } + private void saveDimensions(SysSceneDynamicControlModelEntity data) { if (data.getDimensionList() == null) { return; diff --git a/src/main/resources/mapper/schedule/ScheduleMapper.xml b/src/main/resources/mapper/schedule/ScheduleMapper.xml index db7cce5..0ad1ce0 100644 --- a/src/main/resources/mapper/schedule/ScheduleMapper.xml +++ b/src/main/resources/mapper/schedule/ScheduleMapper.xml @@ -2186,6 +2186,19 @@ ORDER BY RollNo + + UPDATE SFDC_Rolls SET tid_pass_flag = 'Y'