package com.glxp.api.util; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.glxp.api.entity.basic.UdiEntity; import com.glxp.api.res.inout.VailCodeResultResponse; import com.glxp.api.util.udi.FilterUdiUtils; import java.util.*; import java.util.stream.Collectors; public class VailBatchCodeUtils { public static List batchVailCode(String codes) { List codeList = List.of(codes.split(";")); if (CollUtil.isEmpty(codeList)) return null; codeList = codeList.stream().distinct().collect(Collectors.toList()); List vailCodeResultResponses = new ArrayList<>(); List prefixes = Arrays.asList("01", "11", "17", "10", "21"); if (hasMoreThanTwoPrefixes(codeList, prefixes.toArray(new String[0]))) { //判断是否多段扫码 String mutiCode = filterAndConcatenate(codeList, prefixes); UdiEntity temp = FilterUdiUtils.getUdi(mutiCode); if (temp != null) { codeList.clear(); codeList.add(mutiCode); } } for (String code : codeList) { VailCodeResultResponse vailCodeResultResponse = new VailCodeResultResponse(); UdiEntity udiEntity = FilterUdiUtils.getUdi(code); vailCodeResultResponse.setCode(code); if (udiEntity != null) { vailCodeResultResponse.setStatus(1); vailCodeResultResponse.setErrMsg("解析正确"); } else { vailCodeResultResponse.setStatus(2); vailCodeResultResponse.setErrMsg("追溯码格式错误"); } vailCodeResultResponses.add(vailCodeResultResponse); } return vailCodeResultResponses; } public static boolean hasMoreThanTwoPrefixes(List codes, String[] prefixes) { int uniquePrefixCount = 0; boolean[] prefixFound = new boolean[prefixes.length]; for (String code : codes) { for (int i = 0; i < prefixes.length; i++) { if (code.startsWith(prefixes[i]) && !prefixFound[i]) { prefixFound[i] = true; uniquePrefixCount++; break; } } } return uniquePrefixCount > 1; } public static void main(String[] args) { String code = "MA.156.M0.100442.0WET6505.S1394.M230624.L230601.DS22306241.E250624.V250623.C5"; // String code = "0116922943800657112406011724063010JY999\u001D210003;0118822943800657112406011724063010JY999\u001D210003"; // String code = "0116922943800657;1124060117240630;10JY999\u001D210003;www.baidu.com;32329382;0118822943800657112406011724063010JY999\u001D210003"; List vailCodeResultResponses = batchVailCode(code); for (VailCodeResultResponse vailCodeResultResponse : vailCodeResultResponses) { System.out.println(vailCodeResultResponse.getCode() + ":" + vailCodeResultResponse.getStatus() + ":" + vailCodeResultResponse.getErrMsg()); } } public static String filterAndConcatenate(List codeList, List prefixes) { Set matchedPrefixes = new HashSet<>(); StringBuilder concatenatedResult = new StringBuilder(); for (String prefix : prefixes) { for (String code : codeList) { if (code.length() >= 2 && code.startsWith(prefix)) { if (!matchedPrefixes.contains(prefix)) { matchedPrefixes.add(prefix); concatenatedResult.append(code); break; } } } UdiEntity udiEntity = FilterUdiUtils.getUdi(concatenatedResult.toString()); if (udiEntity != null && StrUtil.isNotEmpty(udiEntity.getBatchNo())) { if (concatenatedResult.toString().endsWith("10" + udiEntity.getBatchNo())) { concatenatedResult.append("\u001D"); } } } return concatenatedResult.toString(); } }