package com.zy.asrs.task.support;
|
|
import com.alibaba.fastjson.JSON;
|
import com.core.common.Cools;
|
import com.zy.system.entity.Config;
|
import com.zy.system.service.ConfigService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import java.util.ArrayList;
|
import java.util.LinkedHashSet;
|
import java.util.List;
|
|
@Slf4j
|
@Service
|
public class AutoFrontLocMoveConfigResolver {
|
|
public static final String CONFIG_CODE = "AutoFrontLocMove";
|
|
private static final int DEFAULT_INTERVAL_SECONDS = 60;
|
private static final long DEFAULT_USER_ID = 9527L;
|
|
@Autowired
|
private ConfigService configService;
|
|
/**
|
* 从 sys_config 读取 JSON 配置。
|
* 配置缺失、停用或解析失败时,回退成“关闭状态”的默认配置。
|
*/
|
public AutoFrontLocMoveSettings resolve() {
|
AutoFrontLocMoveSettings settings = defaults();
|
Config config = configService.selectConfigByCode(CONFIG_CODE);
|
if (!isConfigEnabled(config)) {
|
return settings;
|
}
|
try {
|
AutoFrontLocMoveSettings parsed = JSON.parseObject(config.getValue(), AutoFrontLocMoveSettings.class);
|
if (parsed == null) {
|
return settings;
|
}
|
normalize(parsed);
|
return parsed;
|
} catch (Exception e) {
|
log.error("前排补货移库配置解析失败,code={}, value={}", CONFIG_CODE, config.getValue(), e);
|
return settings;
|
}
|
}
|
|
AutoFrontLocMoveSettings defaults() {
|
AutoFrontLocMoveSettings settings = new AutoFrontLocMoveSettings();
|
settings.setEnabled(false);
|
settings.setIntervalSeconds(DEFAULT_INTERVAL_SECONDS);
|
settings.setUserId(DEFAULT_USER_ID);
|
settings.setRules(new ArrayList<>());
|
return settings;
|
}
|
|
void normalize(AutoFrontLocMoveSettings settings) {
|
if (settings.getIntervalSeconds() == null || settings.getIntervalSeconds() <= 0) {
|
settings.setIntervalSeconds(DEFAULT_INTERVAL_SECONDS);
|
}
|
if (settings.getUserId() == null || settings.getUserId() <= 0L) {
|
settings.setUserId(DEFAULT_USER_ID);
|
}
|
List<AutoFrontLocMoveSettings.Rule> normalizedRules = new ArrayList<>();
|
if (!Cools.isEmpty(settings.getRules())) {
|
for (AutoFrontLocMoveSettings.Rule rule : settings.getRules()) {
|
if (rule == null || rule.getCrnNo() == null) {
|
continue;
|
}
|
List<Integer> frontRows = parseRows(rule.getFrontRows());
|
if (frontRows.isEmpty()) {
|
continue;
|
}
|
// 解析结果预先挂在 rule 上,调度执行时直接使用,避免每次扫描重复拆字符串。
|
rule.setFrontRowList(frontRows);
|
rule.setSourceRowList(parseRows(rule.getSourceRows()));
|
normalizedRules.add(rule);
|
}
|
}
|
settings.setRules(normalizedRules);
|
if (normalizedRules.isEmpty()) {
|
settings.setEnabled(false);
|
}
|
}
|
|
List<Integer> parseRows(String rawRows) {
|
LinkedHashSet<Integer> rows = new LinkedHashSet<>();
|
if (Cools.isEmpty(rawRows)) {
|
return new ArrayList<>();
|
}
|
String[] parts = rawRows.split(",");
|
for (String part : parts) {
|
String token = part == null ? null : part.trim();
|
if (Cools.isEmpty(token)) {
|
continue;
|
}
|
if (token.contains("-")) {
|
String[] range = token.split("-");
|
if (range.length != 2) {
|
continue;
|
}
|
Integer start = safeParseInt(range[0]);
|
Integer end = safeParseInt(range[1]);
|
if (start == null || end == null || start <= 0 || end <= 0) {
|
continue;
|
}
|
// 支持正序/倒序区间,例如 1-3 或 20-18。
|
int step = start <= end ? 1 : -1;
|
for (int row = start; ; row += step) {
|
rows.add(row);
|
if (row == end) {
|
break;
|
}
|
}
|
continue;
|
}
|
Integer row = safeParseInt(token);
|
if (row != null && row > 0) {
|
rows.add(row);
|
}
|
}
|
return new ArrayList<>(rows);
|
}
|
|
private boolean isConfigEnabled(Config config) {
|
return config != null
|
&& config.getStatus() != null
|
&& config.getStatus() == 1
|
&& !Cools.isEmpty(config.getValue());
|
}
|
|
private Integer safeParseInt(String raw) {
|
try {
|
return Integer.parseInt(raw.trim());
|
} catch (Exception ignore) {
|
return null;
|
}
|
}
|
}
|