Browse Source

2026-07-15

异常规则配置
master
fengyuan_yang 2 months ago
parent
commit
cbbf3e6c58
  1. 23
      src/main/java/com/gaotao/modules/schedule/controller/ScheduleController.java
  2. 5
      src/main/java/com/gaotao/modules/schedule/entity/ScheduleTodoMessageEntity.java
  3. 13
      src/main/java/com/gaotao/modules/schedule/mapper/ScheduleTodoMessageMapper.java
  4. 15
      src/main/java/com/gaotao/modules/schedule/service/ScheduleService.java
  5. 111
      src/main/java/com/gaotao/modules/schedule/service/impl/ScheduleServiceImpl.java
  6. 50
      src/main/resources/mapper/schedule/ScheduleTodoMessageMapper.xml

23
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<String, Object> 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 执行创建分卷的业务逻辑

5
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;
}

13
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);
}

15
src/main/java/com/gaotao/modules/schedule/service/ScheduleService.java

@ -764,6 +764,21 @@ public interface ScheduleService {
*/
Map<String, Object> checkSplitRollExceptionRule(SearchScheduleData inData);
/**
* 查询创建分卷异常规则强制锁定状态
*
* @param inData 站点/BU/工单/派工单
* @return 锁定状态
*/
Map<String, Object> getSplitRuleLockStatus(SearchScheduleData inData);
/**
* 创建分卷放行后回写操作标识并清理缓存
*
* @param inData 站点/BU/工单/派工单
*/
void completeSplitRuleTodoOperation(SearchScheduleData inData);
/**
* @return void
* @Author LR

111
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<SysSceneExceptionRuleEntity> 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<String, Object> getSplitRuleLockStatus(SearchScheduleData inData) {
Map<String, Object> 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<SplitRollMetricContext> buildSplitRollMetricContexts(SearchScheduleData inData) {
List<SplitRollMetricContext> contextList = new ArrayList<>();
List<Map<String, Object>> 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<Map<String, Object>> 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();

50
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}
)
</insert>
<select id="getLatestPendingLockTodo" resultType="com.gaotao.modules.schedule.entity.ScheduleTodoMessageEntity">
SELECT TOP 1
site,
bu_no AS buNo,
info_code AS infoCode,
seq_no AS seqNo,
order_no AS orderNo,
created_by AS createdBy,
created_time AS createdTime,
message_source AS messageSource,
audit_flag AS auditFlag,
operate_flag AS operateFlag,
lock_flag AS lockFlag
FROM schedule_todo_message
WHERE site = #{site}
AND bu_no = #{buNo}
AND order_no = #{orderNo}
AND seq_no = #{seqNo}
AND lock_flag = 'Y'
AND operate_flag = 'N'
AND message_source LIKE #{messageSourceLike}
ORDER BY created_time DESC, info_code DESC
</select>
<update id="markLatestAuditedLockTodoOperated">
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
)
</update>
</mapper>
Loading…
Cancel
Save