From cbbf3e6c58554bf11f817640520f7bed1247abd5 Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Wed, 15 Jul 2026 14:21:40 +0800 Subject: [PATCH] =?UTF-8?q?2026-07-15=20=E5=BC=82=E5=B8=B8=E8=A7=84?= =?UTF-8?q?=E5=88=99=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ScheduleController.java | 23 ++++ .../entity/ScheduleTodoMessageEntity.java | 5 + .../mapper/ScheduleTodoMessageMapper.java | 13 ++ .../schedule/service/ScheduleService.java | 15 +++ .../service/impl/ScheduleServiceImpl.java | 111 +++++++++++++++++- .../schedule/ScheduleTodoMessageMapper.xml | 50 +++++++- 6 files changed, 209 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gaotao/modules/schedule/controller/ScheduleController.java b/src/main/java/com/gaotao/modules/schedule/controller/ScheduleController.java index 3fc7ed2..878450b 100644 --- a/src/main/java/com/gaotao/modules/schedule/controller/ScheduleController.java +++ b/src/main/java/com/gaotao/modules/schedule/controller/ScheduleController.java @@ -1307,6 +1307,29 @@ public class ScheduleController extends AbstractController { .put("resultMap", resultMap); } + /** + * 查询创建分卷异常规则强制锁定状态 + */ + @PostMapping(value = "getSplitRuleLockStatus") + public R getSplitRuleLockStatus(@RequestBody SearchScheduleData inData) { + Map resultMap = scheduleService.getSplitRuleLockStatus(inData); + return R.ok() + .put("code", 200) + .put("msg", getLanguageMsg(SysMsgConstant.OBJECT_ID_200000)) + .put("resultMap", resultMap); + } + + /** + * 创建分卷放行后回写操作标识并清理缓存 + */ + @PostMapping(value = "completeSplitRuleTodoOperation") + public R completeSplitRuleTodoOperation(@RequestBody SearchScheduleData inData) { + scheduleService.completeSplitRuleTodoOperation(inData); + return R.ok() + .put("code", 200) + .put("msg", getLanguageMsg(SysMsgConstant.OBJECT_ID_200000)); + } + /** * @Author LR * @Description 执行创建分卷的业务逻辑 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 bbb044b..83cc990 100644 --- a/src/main/java/com/gaotao/modules/schedule/entity/ScheduleTodoMessageEntity.java +++ b/src/main/java/com/gaotao/modules/schedule/entity/ScheduleTodoMessageEntity.java @@ -63,4 +63,9 @@ public class ScheduleTodoMessageEntity implements Serializable { * 操作标识(Y/N) */ private String operateFlag; + + /** + * 是否强制锁定标识(Y/N) + */ + private String lockFlag; } diff --git a/src/main/java/com/gaotao/modules/schedule/mapper/ScheduleTodoMessageMapper.java b/src/main/java/com/gaotao/modules/schedule/mapper/ScheduleTodoMessageMapper.java index 2d65604..473eb52 100644 --- a/src/main/java/com/gaotao/modules/schedule/mapper/ScheduleTodoMessageMapper.java +++ b/src/main/java/com/gaotao/modules/schedule/mapper/ScheduleTodoMessageMapper.java @@ -2,9 +2,22 @@ package com.gaotao.modules.schedule.mapper; import com.gaotao.modules.schedule.entity.ScheduleTodoMessageEntity; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; @Mapper public interface ScheduleTodoMessageMapper { void insertTodoMessage(ScheduleTodoMessageEntity data); + + ScheduleTodoMessageEntity getLatestPendingLockTodo(@Param("site") String site, + @Param("buNo") String buNo, + @Param("orderNo") String orderNo, + @Param("seqNo") String seqNo, + @Param("messageSourceLike") String messageSourceLike); + + int markLatestAuditedLockTodoOperated(@Param("site") String site, + @Param("buNo") String buNo, + @Param("orderNo") String orderNo, + @Param("seqNo") String seqNo, + @Param("messageSourceLike") String messageSourceLike); } diff --git a/src/main/java/com/gaotao/modules/schedule/service/ScheduleService.java b/src/main/java/com/gaotao/modules/schedule/service/ScheduleService.java index 203ee47..a86de04 100644 --- a/src/main/java/com/gaotao/modules/schedule/service/ScheduleService.java +++ b/src/main/java/com/gaotao/modules/schedule/service/ScheduleService.java @@ -764,6 +764,21 @@ public interface ScheduleService { */ Map checkSplitRollExceptionRule(SearchScheduleData inData); + /** + * 查询创建分卷异常规则强制锁定状态 + * + * @param inData 站点/BU/工单/派工单 + * @return 锁定状态 + */ + Map getSplitRuleLockStatus(SearchScheduleData inData); + + /** + * 创建分卷放行后回写操作标识并清理缓存 + * + * @param inData 站点/BU/工单/派工单 + */ + void completeSplitRuleTodoOperation(SearchScheduleData inData); + /** * @return void * @Author LR 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 e641fab..bbf80e7 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 @@ -64,6 +64,8 @@ public class ScheduleServiceImpl implements ScheduleService { private static final String TODO_MSG_TRANS_TYPE = "ExM"; private static final String TODO_MSG_TRANS_TYPE_FALLBACK = "ExR"; private static final String TODO_MSG_SOURCE_PREFIX = "过站采集-创建分卷"; + private static final String FLAG_Y = "Y"; + private static final String FLAG_N = "N"; @Autowired private ScheduleMapper scheduleMapper; @@ -3579,6 +3581,27 @@ public class ScheduleServiceImpl implements ScheduleService { return resultMap; } + ScheduleTodoMessageEntity pendingLockTodo = getLatestPendingLockTodo(inData); + if (pendingLockTodo != null) { + resultMap.put("todoInfoCode", pendingLockTodo.getInfoCode()); + if (FLAG_N.equalsIgnoreCase(pendingLockTodo.getAuditFlag())) { + resultMap.put("matched", true); + resultMap.put("action", ACTION_LOCK_PAGE); + resultMap.put("lockPage", FLAG_Y); + resultMap.put("message", "当前异常代办尚未审核,已锁定创建分卷操作。"); + resultMap.put("pendingAudit", true); + return resultMap; + } + if (FLAG_Y.equalsIgnoreCase(pendingLockTodo.getAuditFlag())) { + resultMap.put("matched", false); + resultMap.put("lockPage", FLAG_N); + resultMap.put("action", ACTION_NONE); + resultMap.put("bypassByAudit", true); + resultMap.put("message", "异常代办已审核,允许继续执行本次创建分卷操作。"); + return resultMap; + } + } + List ruleList = sysSceneExceptionRuleMapper.getEnabledRuleListByApply( inData.getSite(), inData.getBuNo(), SPLIT_RULE_APPLY_PAGE, SPLIT_RULE_APPLY_BUTTON); if (CollectionUtils.isEmpty(ruleList)) { @@ -3623,7 +3646,7 @@ public class ScheduleServiceImpl implements ScheduleService { } fillSplitRuleMatchResult(resultMap, rule, child); resultMap.put("matchedRollIndex", metricContext.rollIndex); - saveSplitRuleMatchedData(inData); + saveSplitRuleMatchedData(inData, String.valueOf(resultMap.get("action"))); return resultMap; } } @@ -3633,6 +3656,63 @@ public class ScheduleServiceImpl implements ScheduleService { return resultMap; } + @Override + public Map getSplitRuleLockStatus(SearchScheduleData inData) { + Map resultMap = new HashMap<>(); + resultMap.put("locked", false); + resultMap.put("lockPage", FLAG_N); + resultMap.put("bypassByAudit", false); + + if (inData == null || !StringUtils.hasText(inData.getSite()) || !StringUtils.hasText(inData.getBuNo()) + || !StringUtils.hasText(inData.getOrderNo()) || !StringUtils.hasText(inData.getSeqNo())) { + return resultMap; + } + + ScheduleTodoMessageEntity pendingLockTodo = getLatestPendingLockTodo(inData); + if (pendingLockTodo == null) { + return resultMap; + } + + resultMap.put("todoInfoCode", pendingLockTodo.getInfoCode()); + if (FLAG_N.equalsIgnoreCase(pendingLockTodo.getAuditFlag())) { + resultMap.put("locked", true); + resultMap.put("lockPage", FLAG_Y); + resultMap.put("pendingAudit", true); + resultMap.put("message", "当前异常代办尚未审核,已锁定创建分卷操作。"); + return resultMap; + } + if (FLAG_Y.equalsIgnoreCase(pendingLockTodo.getAuditFlag())) { + resultMap.put("locked", false); + resultMap.put("lockPage", FLAG_N); + resultMap.put("bypassByAudit", true); + resultMap.put("message", "异常代办已审核,允许继续执行本次创建分卷操作。"); + return resultMap; + } + return resultMap; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void completeSplitRuleTodoOperation(SearchScheduleData inData) { + if (inData == null || !StringUtils.hasText(inData.getSite()) || !StringUtils.hasText(inData.getBuNo()) + || !StringUtils.hasText(inData.getOrderNo()) || !StringUtils.hasText(inData.getSeqNo())) { + return; + } + int updatedRows = scheduleTodoMessageMapper.markLatestAuditedLockTodoOperated( + inData.getSite(), + inData.getBuNo(), + inData.getOrderNo(), + inData.getSeqNo(), + TODO_MSG_SOURCE_PREFIX + "%"); + if (updatedRows <= 0) { + return; + } + Integer seqNo = parseSeqNo(inData.getSeqNo()); + if (seqNo != null) { + shiftChangeProductionReportMapper.deleteUnprocessedData(inData.getSite(), inData.getOrderNo(), seqNo); + } + } + private List buildSplitRollMetricContexts(SearchScheduleData inData) { List contextList = new ArrayList<>(); List> rollRows = inData.getRollRows(); @@ -3823,9 +3903,9 @@ public class ScheduleServiceImpl implements ScheduleService { resultMap.put("message", "触发异常规则,但触发事件未配置。"); } - private void saveSplitRuleMatchedData(SearchScheduleData inData) { + private void saveSplitRuleMatchedData(SearchScheduleData inData, String action) { saveSplitRuleCacheData(inData); - saveSplitRuleTodoMessage(inData); + saveSplitRuleTodoMessage(inData, ACTION_LOCK_PAGE.equals(action)); } private void saveSplitRuleCacheData(SearchScheduleData inData) { @@ -3875,7 +3955,7 @@ public class ScheduleServiceImpl implements ScheduleService { } } - private void saveSplitRuleTodoMessage(SearchScheduleData inData) { + private void saveSplitRuleTodoMessage(SearchScheduleData inData, boolean lockRequired) { if (inData == null || !StringUtils.hasText(inData.getSite()) || !StringUtils.hasText(inData.getBuNo()) || !StringUtils.hasText(inData.getOrderNo()) || !StringUtils.hasText(inData.getSeqNo())) { return; @@ -3901,11 +3981,25 @@ public class ScheduleServiceImpl implements ScheduleService { entity.setOrderNo(inData.getOrderNo()); entity.setCreatedBy(StringUtils.hasText(inData.getOperatorId()) ? inData.getOperatorId() : inData.getCreatedBy()); entity.setMessageSource(buildTodoMessageSource(inData.getFunctionName())); - entity.setAuditFlag("N"); - entity.setOperateFlag("N"); + entity.setAuditFlag(FLAG_N); + entity.setOperateFlag(FLAG_N); + entity.setLockFlag(lockRequired ? FLAG_Y : FLAG_N); scheduleTodoMessageMapper.insertTodoMessage(entity); } + private ScheduleTodoMessageEntity getLatestPendingLockTodo(SearchScheduleData inData) { + if (inData == null || !StringUtils.hasText(inData.getSite()) || !StringUtils.hasText(inData.getBuNo()) + || !StringUtils.hasText(inData.getOrderNo()) || !StringUtils.hasText(inData.getSeqNo())) { + return null; + } + return scheduleTodoMessageMapper.getLatestPendingLockTodo( + inData.getSite(), + inData.getBuNo(), + inData.getOrderNo(), + inData.getSeqNo(), + TODO_MSG_SOURCE_PREFIX + "%"); + } + private Integer parseSeqNo(String seqNo) { if (!StringUtils.hasText(seqNo)) { return null; @@ -4010,6 +4104,11 @@ public class ScheduleServiceImpl implements ScheduleService { @Override @Transactional public List> createSplitSfdcRoll(SearchScheduleData inData) { + ScheduleTodoMessageEntity pendingLockTodo = getLatestPendingLockTodo(inData); + if (pendingLockTodo != null && FLAG_N.equalsIgnoreCase(pendingLockTodo.getAuditFlag())) { + throw new XJException("当前异常代办尚未审核,创建分卷操作已锁定。"); + } + //公共参数 String site = inData.getSite(); String orderNo = inData.getOrderNo(); diff --git a/src/main/resources/mapper/schedule/ScheduleTodoMessageMapper.xml b/src/main/resources/mapper/schedule/ScheduleTodoMessageMapper.xml index cbcd1a0..fa9a8b1 100644 --- a/src/main/resources/mapper/schedule/ScheduleTodoMessageMapper.xml +++ b/src/main/resources/mapper/schedule/ScheduleTodoMessageMapper.xml @@ -13,7 +13,8 @@ created_time, message_source, audit_flag, - operate_flag + operate_flag, + lock_flag ) VALUES ( #{site}, #{buNo}, @@ -24,7 +25,52 @@ GETDATE(), #{messageSource}, #{auditFlag}, - #{operateFlag} + #{operateFlag}, + #{lockFlag} ) + + + + + UPDATE schedule_todo_message + SET operate_flag = 'Y' + WHERE site = #{site} + AND bu_no = #{buNo} + AND info_code = ( + SELECT TOP 1 info_code + FROM schedule_todo_message + WHERE site = #{site} + AND bu_no = #{buNo} + AND order_no = #{orderNo} + AND seq_no = #{seqNo} + AND lock_flag = 'Y' + AND audit_flag = 'Y' + AND operate_flag = 'N' + AND message_source LIKE #{messageSourceLike} + ORDER BY created_time DESC, info_code DESC + ) +