|  | @@ -5,7 +5,9 @@ import com.bstek.ureport.console.designer.ReportUtils;
 | 
	
		
			
				|  |  |  import com.jfirer.baseutil.encrypt.Md5Util;
 | 
	
		
			
				|  |  |  import com.mixsmart.constant.IMixConstant;
 | 
	
		
			
				|  |  |  import com.mixsmart.exception.NullArgumentException;
 | 
	
		
			
				|  |  | +import org.springblade.core.log.exception.ServiceException;
 | 
	
		
			
				|  |  |  import org.springblade.core.tool.utils.StringPool;
 | 
	
		
			
				|  |  | +import org.springblade.core.tool.utils.StringUtil;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import java.io.UnsupportedEncodingException;
 | 
	
		
			
				|  |  |  import java.lang.reflect.Field;
 | 
	
	
		
			
				|  | @@ -1428,5 +1430,114 @@ public class StringUtils {
 | 
	
		
			
				|  |  |          return f;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 解析偏差值字符串,返回上下限范围
 | 
	
		
			
				|  |  | +     * 支持格式:±10、+10,-20、10,-20、+10、-20 等
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public static Range parseDeviationRange(Object obj1, Object obj12) {
 | 
	
		
			
				|  |  | +        if(obj1 instanceof List){
 | 
	
		
			
				|  |  | +            obj1 = ((List)obj1).get(0);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        String deviationStr = String.valueOf(obj1).trim();
 | 
	
		
			
				|  |  | +        String biasTwo = String.valueOf(obj12).trim();
 | 
	
		
			
				|  |  | +        int target = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 处理 ± 格式
 | 
	
		
			
				|  |  | +        if (deviationStr.startsWith("±")) {
 | 
	
		
			
				|  |  | +            int value = Integer.parseInt(deviationStr.substring(1).trim());
 | 
	
		
			
				|  |  | +            return new Range(target - value, target + value);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 处理逗号分隔的格式
 | 
	
		
			
				|  |  | +        if (deviationStr.contains(",")) {
 | 
	
		
			
				|  |  | +            String[] parts = deviationStr.split(",");
 | 
	
		
			
				|  |  | +            if (parts.length == 2) {
 | 
	
		
			
				|  |  | +                int upperDev = parseSingleDeviation(parts[0].trim());
 | 
	
		
			
				|  |  | +                int lowerDev = parseSingleDeviation(parts[1].trim());
 | 
	
		
			
				|  |  | +                if(upperDev > lowerDev){
 | 
	
		
			
				|  |  | +                    return new Range(lowerDev, upperDev);
 | 
	
		
			
				|  |  | +                }else{
 | 
	
		
			
				|  |  | +                    return new Range(upperDev, lowerDev);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 处理多个数据的格式
 | 
	
		
			
				|  |  | +        if (StringUtil.isNotBlank(deviationStr) && StringUtil.isNotBlank(biasTwo)) {
 | 
	
		
			
				|  |  | +            if(deviationStr.contains("+") || biasTwo.contains("+")){
 | 
	
		
			
				|  |  | +                deviationStr = deviationStr.replaceAll("\\+", "");
 | 
	
		
			
				|  |  | +                biasTwo = biasTwo.replaceAll("\\+","");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if(!StringUtils.isNumber(deviationStr) || !StringUtils.isNumber(biasTwo)){
 | 
	
		
			
				|  |  | +                throw new ServiceException(deviationStr + "或" + biasTwo + "----不是数字");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            double v = Double.parseDouble(deviationStr);
 | 
	
		
			
				|  |  | +            double v1 = Double.parseDouble(biasTwo);
 | 
	
		
			
				|  |  | +            if(v > v1){
 | 
	
		
			
				|  |  | +                return new Range(v1, v);
 | 
	
		
			
				|  |  | +            }else{
 | 
	
		
			
				|  |  | +                return new Range(v, v1);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 处理单个值格式
 | 
	
		
			
				|  |  | +        int singleDev = parseSingleDeviation(deviationStr);
 | 
	
		
			
				|  |  | +        return new Range(target - singleDev, target + singleDev);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 解析单个偏差值(支持 +10、-20、10 等格式)
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private static int parseSingleDeviation(String devStr) {
 | 
	
		
			
				|  |  | +        if (devStr.startsWith("+") || devStr.startsWith("-")) {
 | 
	
		
			
				|  |  | +            return Integer.parseInt(devStr);
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            return Integer.parseInt(devStr);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 范围类,存储上下限
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public static class Range {
 | 
	
		
			
				|  |  | +        public final double lower;
 | 
	
		
			
				|  |  | +        public final double upper;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        public Range(double lower, double upper) {
 | 
	
		
			
				|  |  | +            this.lower = lower;
 | 
	
		
			
				|  |  | +            this.upper = upper;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        @Override
 | 
	
		
			
				|  |  | +        public String toString() {
 | 
	
		
			
				|  |  | +            return "[" + lower + ", " + upper + "]";
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 去重并保留索引(保持原始顺序)
 | 
	
		
			
				|  |  | +     * 实测值满足条件
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public static Map<String,List<Integer>> deduplicateWithIndices(Range range,List<Object> list,List<Object> list2) {
 | 
	
		
			
				|  |  | +        if (list == null || list.isEmpty()) {
 | 
	
		
			
				|  |  | +            return null;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // 使用LinkedHashMap保持插入顺序
 | 
	
		
			
				|  |  | +        Map<String, List<Integer>> indicesMap = new LinkedHashMap<>();
 | 
	
		
			
				|  |  | +        for (int i = 0; i < list.size(); i++) {
 | 
	
		
			
				|  |  | +            String element = (String) list.get(i);
 | 
	
		
			
				|  |  | +            //跳过空字符串和非数字字符串
 | 
	
		
			
				|  |  | +            if(StringUtils.isEmpty(element) || !StringUtils.isNumber(element)){
 | 
	
		
			
				|  |  | +                continue;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            double v = Double.parseDouble((String) list2.get(i));
 | 
	
		
			
				|  |  | +            //如果这个偏差值小于下限或者大于上限,则跳过
 | 
	
		
			
				|  |  | +            if(v < range.lower || v > range.upper){
 | 
	
		
			
				|  |  | +                continue;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            indicesMap.computeIfAbsent(element, k -> new ArrayList<>()).add(i);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return indicesMap;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 |