Browse Source

2026-11-05

现场动控模型TID,改为多维度控制
master
fengyuan_yang 2 weeks ago
parent
commit
66e3ce9eb2
  1. 5
      src/main/java/com/gaotao/modules/schedule/mapper/ScheduleMapper.java
  2. 50
      src/main/java/com/gaotao/modules/schedule/service/impl/ScheduleServiceImpl.java
  3. 7
      src/main/java/com/gaotao/modules/sys/service/SysSceneDynamicControlModelService.java
  4. 65
      src/main/java/com/gaotao/modules/sys/service/impl/SysSceneDynamicControlModelServiceImpl.java
  5. 13
      src/main/resources/mapper/schedule/ScheduleMapper.xml

5
src/main/java/com/gaotao/modules/schedule/mapper/ScheduleMapper.java

@ -832,6 +832,11 @@ public interface ScheduleMapper {
*/
List<String> listTidPendingNormalRolls(@Param("site") String site, @Param("seqNo") String seqNo);
/**
* 动控校验用:取工单物料和当前工序名称
*/
Map<String, Object> getTidControlOrderContext(@Param("site") String site, @Param("orderNo") String orderNo, @Param("itemNo") Integer itemNo);
/**
* 将已通过校验的 TID 正常卷标记为通过
*/

50
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<String, String> 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<String> 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<String, String> buildTidControlContext(SearchScheduleData inData) {
Map<String, String> context = new HashMap<>();
String partNo = inData.getPartNo() == null ? "" : inData.getPartNo().trim();
String operationDesc = "";
if (StringUtils.hasText(inData.getSite()) && StringUtils.hasText(inData.getOrderNo())) {
Map<String, Object> 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<String, String> 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();

7
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<String, String> context);
/**
* 已控制时,勾选的可用维度里只要有一项符合就生效。检验类型不参与判断。
* 没有可判断的维度范围时,开关打开即生效。
*/
boolean isAnyCheckedDimensionEnabled(String site, String controlNo, Map<String, String> context);
}

65
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<String, String> context) {
String baseData = sysSceneDynamicControlModelMapper.queryBaseData(site, controlNo);
if (!"控制".equals(baseData)) {
return false;
}
List<SysSceneDynamicControlDimensionEntity> dimensions = sysSceneDynamicControlModelMapper.listDimension(site, controlNo);
Set<String> 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<SysSceneDynamicControlScopeEntity> scopes = sysSceneDynamicControlModelMapper.listScope(site, controlNo);
Map<String, List<SysSceneDynamicControlScopeEntity>> 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<String, List<SysSceneDynamicControlScopeEntity>> entry : groups.entrySet()) {
if (dimensionMatched(entry.getKey(), entry.getValue(), context)) {
return true;
}
}
return false;
}
private boolean dimensionMatched(String dimensionCode, List<SysSceneDynamicControlScopeEntity> rows, Map<String, String> 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;

13
src/main/resources/mapper/schedule/ScheduleMapper.xml

@ -2186,6 +2186,19 @@
ORDER BY RollNo
</select>
<select id="getTidControlOrderContext" resultType="map">
SELECT TOP 1
D.PartNo AS partNo,
R.OperationDesc AS operationDesc
FROM ShopOrder D
LEFT JOIN SORouting R ON D.Site = R.Site AND D.OrderNo = R.OrderNo
<if test="itemNo != null">
AND R.ItemNo = #{itemNo}
</if>
WHERE D.Site = #{site}
AND D.OrderNo = #{orderNo}
</select>
<update id="updateTidPassFlag">
UPDATE SFDC_Rolls
SET tid_pass_flag = 'Y'

Loading…
Cancel
Save