|
|
@@ -1,7 +1,9 @@
|
|
|
package org.springblade.manager.service.impl;
|
|
|
|
|
|
|
|
|
+import cn.hutool.core.date.DateField;
|
|
|
import cn.hutool.core.date.DateTime;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.date.StopWatch;
|
|
|
import cn.hutool.core.util.HashUtil;
|
|
|
import cn.hutool.log.StaticLog;
|
|
|
@@ -9,10 +11,12 @@ import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
|
|
|
+import com.alibaba.nacos.common.utils.NumberUtils;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
import com.jfireel.expression.Expression;
|
|
|
import com.mixsmart.utils.CustomFunction;
|
|
|
import com.mixsmart.utils.FormulaUtils;
|
|
|
@@ -1371,9 +1375,235 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
if (fd.getCoordsList().size() > 1 && f.split("[/+\\-*]").length > 1) {
|
|
|
LinkedHashMap<String, FormData> fdMap = step(ele);
|
|
|
if (fdMap != null) {
|
|
|
- List<LocalVariable> local = slice2Local(f, fdMap, tec);
|
|
|
+ List<LocalVariable> local = null;
|
|
|
+ //求和公式 判断是否按坐标分组求和
|
|
|
+ if(f.contains("sum") && (f.contains(",x") || f.contains(",y"))){
|
|
|
+ FormData formData = fdMap.get(relyList.get(0));
|
|
|
+
|
|
|
+ Map<Integer, List<ElementData>> collect = new HashMap<>();
|
|
|
+ if(f.contains(",y")){
|
|
|
+ fd.getValues().sort(Comparator.comparing(ElementData::getY));
|
|
|
+ collect = formData.getValues().stream().collect(Collectors.groupingBy(ElementData::getY,TreeMap::new, Collectors.toList()));
|
|
|
+ }else{
|
|
|
+ //需要解析html获取当前key的对应的excel 坐标 通过excel坐标 统计相同列的数据
|
|
|
+ Long pKeyId = op.get().getPKeyId();
|
|
|
+ WbsTreePrivate wbsTreePrivate1 = wbsTreePrivateMapper.selectById(pKeyId);
|
|
|
+
|
|
|
+ String[] split = fd.getCode().split(":");
|
|
|
+ if(wbsTreePrivate1.getInitTableName().equals(split[0])){
|
|
|
+ //公式key
|
|
|
+ String dataKey = split[1];
|
|
|
+ //目标key
|
|
|
+ String rely = fd.getFormula().getRely().split(":")[1];
|
|
|
+ //获取html 解析html
|
|
|
+ InputStream fileInputStream = FileUtils.getInputStreamByUrl(wbsTreePrivate1.getHtmlUrl());
|
|
|
+ String htmlString = IoUtil.readToString(fileInputStream);
|
|
|
+ Document doc = Jsoup.parse(htmlString);
|
|
|
+ Elements select = doc.select("[id*="+dataKey+"]");
|
|
|
+ //通过excel坐标来确认同一列的单元格有哪些
|
|
|
+ HashMap<String, List<String>> stringListHashMap = new HashMap<>();
|
|
|
+ for (Element element : select) {
|
|
|
+ String id = element.attr("id");
|
|
|
+ String x1 = element.attr("x1");
|
|
|
+ List<String> strings = new ArrayList<>();
|
|
|
+ Elements select1 = doc.select("[id*=" + rely + "][x1=" + x1 + "]");
|
|
|
+ for (Element element1 : select1) {
|
|
|
+ strings.add(element1.attr("id"));
|
|
|
+ }
|
|
|
+ stringListHashMap.put(id,strings);
|
|
|
+ }
|
|
|
+ //对原始key排序 确保顺序以方便赋值
|
|
|
+ fd.getValues().sort(Comparator.comparing(ElementData::getX));
|
|
|
+ for (ElementData key : fd.getValues()) {
|
|
|
+ String newKey = dataKey + "__" + key.getY() + "_" + key.getX();
|
|
|
+ List<String> strings = stringListHashMap.get(newKey);
|
|
|
+ List<ElementData> values = formData.getValues();
|
|
|
+
|
|
|
+ List<ElementData> objects = new ArrayList<>();
|
|
|
+ for (String string : strings) {
|
|
|
+ String[] split1 = string.split("__")[1].split("_");
|
|
|
+ List<ElementData> collect1 = values.stream()
|
|
|
+ .filter(y -> y.getX().equals(Integer.valueOf(split1[1])) && y.getY().equals(Integer.valueOf(split1[0])))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ objects.addAll(collect1);
|
|
|
+ }
|
|
|
+ collect.put(key.getX(),objects);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ f = f.replaceAll(",x","").replaceAll(",y","");
|
|
|
+ formula.setFormula(f);
|
|
|
+ local = slice3Local(f, tec, collect, relyList.get(0));
|
|
|
+ } else if (f.contains("dataChange")) {
|
|
|
+ //试验-数据自变公式处理
|
|
|
+ // 提取括号内的内容(去掉外层的ifelse())
|
|
|
+ String content = f.replaceFirst("^" + FC_REG + "dataChange\\(", "").replaceFirst("\\)$", "");
|
|
|
+ //按,分割参数
|
|
|
+ String[] split = content.split(",");
|
|
|
+ if (split.length == 9) {
|
|
|
+ if(split[1].isEmpty() || split[4].isEmpty() || split[5].isEmpty() || split[0].isEmpty() || split[6].isEmpty() || split[8].isEmpty()){
|
|
|
+ throw new ServiceException("公式参数异常");
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * split[0];//自变的数据源 时:分
|
|
|
+ * split[1];//自增还是自减
|
|
|
+ * split[2];//数据类型
|
|
|
+ * split[3];//协同元素 时间类型附带的 年月日
|
|
|
+ * split[4];//频率
|
|
|
+ * split[5];//类型 时间按频率变化还是分钟按频率变化
|
|
|
+ * split[6];//停止条件元素
|
|
|
+ * split[7];//停止条件判断
|
|
|
+ * split[8];//停止条件值
|
|
|
+ */
|
|
|
+ //需要变化的数据
|
|
|
+ FormData sourceData = fdMap.get(split[0].replace("E['", "").replace("']", ""));
|
|
|
+ //协同元素
|
|
|
+ FormData attachData = null;
|
|
|
+ if (!split[3].isEmpty()) {
|
|
|
+ attachData = fdMap.get(split[3].replace("E['", "").replace("']", ""));
|
|
|
+ }
|
|
|
+ //停止判断条件的数据源
|
|
|
+ FormData stopData = fdMap.get(split[6].replace("E['", "").replace("']", ""));
|
|
|
+ //按y分组
|
|
|
+ Map<Integer, List<ElementData>> collect = stopData.getValues().stream().collect(Collectors.groupingBy(ElementData::getY));
|
|
|
+
|
|
|
+ //初始数据
|
|
|
+ Boolean initStart = true;
|
|
|
+ Boolean stop = false;
|
|
|
+ //时间
|
|
|
+ String dateStr = "";
|
|
|
+ //时间格式
|
|
|
+ String jsonFormMat = "";
|
|
|
+ Integer var = 0;
|
|
|
+
|
|
|
+ if ("+".equals(split[1])) {
|
|
|
+ var += Integer.parseInt(split[4]);
|
|
|
+ } else {
|
|
|
+ var -= Integer.parseInt(split[4]);
|
|
|
+ }
|
|
|
+ //时间类型
|
|
|
+ DateField dateField = null;
|
|
|
+ switch (Integer.valueOf(split[5])) {
|
|
|
+ case 1:
|
|
|
+ dateField = DateField.YEAR;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ dateField = DateField.MONTH;
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ dateField = DateField.DAY_OF_YEAR;
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ dateField = DateField.HOUR_OF_DAY;
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ dateField = DateField.MINUTE;
|
|
|
+ break;
|
|
|
+ case 6:
|
|
|
+ dateField = DateField.SECOND;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (dateField == null) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //时间 计算处理
|
|
|
+ for (int i = 0; i < sourceData.getValues().size(); i++) {
|
|
|
+ ElementData value = sourceData.getValues().get(i);
|
|
|
+ if (!stop) {
|
|
|
+ if (initStart) {
|
|
|
+ if (value.getValue().toString().isEmpty()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String dateStartTime = "";
|
|
|
+ //协同数据
|
|
|
+ if (attachData != null) {
|
|
|
+ ElementData elementData1 = attachData.getValues().get(i);
|
|
|
+ if (elementData1.getValue().toString().isEmpty()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ dateStartTime = elementData1.getValue().toString();
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotEmpty(dateStartTime)) {
|
|
|
+ dateStr = dateStartTime + " " + value.getValue().toString();
|
|
|
+ jsonFormMat = "yyyy年MM月dd日 HH:mm";
|
|
|
+ } else {
|
|
|
+ dateStr = value.getValue().toString();
|
|
|
+ jsonFormMat = "HH:mm";
|
|
|
+ }
|
|
|
+ initStart = false;
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotEmpty(dateStr) && i != 0) {
|
|
|
+ //开始计算
|
|
|
+ DateTime offset = DateUtil.offset(DateUtil.parse(dateStr, jsonFormMat), dateField, var);
|
|
|
+ dateStr = offset.toString(jsonFormMat);
|
|
|
+ if (dateStr.contains(" ")) {
|
|
|
+ String[] split1 = dateStr.split(" ");
|
|
|
+ value.setValue(split1[1]);
|
|
|
+ if (attachData != null) {
|
|
|
+ ElementData elementData1 = attachData.getValues().get(i);
|
|
|
+ elementData1.setValue(split1[0]);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ value.setValue(dateStr);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //终止判断
|
|
|
+ List<ElementData> elementData = collect.get(value.getY());
|
|
|
+ long count = 0;
|
|
|
+ switch (split[7]) {
|
|
|
+ case "=":
|
|
|
+ count = elementData.stream().filter(e -> e.getValue().equals(split[8])).count();
|
|
|
+ break;
|
|
|
+ case ">":
|
|
|
+ count = elementData.stream().filter(e -> Integer.parseInt(e.getValue().toString()) > Integer.parseInt(split[8])).count();
|
|
|
+ break;
|
|
|
+ case "<":
|
|
|
+ count = elementData.stream().filter(e -> Integer.parseInt(e.getValue().toString()) < Integer.parseInt(split[8])).count();
|
|
|
+ break;
|
|
|
+ case ">=":
|
|
|
+ count = elementData.stream().filter(e -> Integer.parseInt(e.getValue().toString()) >= Integer.parseInt(split[8])).count();
|
|
|
+ break;
|
|
|
+ case "<=":
|
|
|
+ count = elementData.stream().filter(e -> Integer.parseInt(e.getValue().toString()) <= Integer.parseInt(split[8])).count();
|
|
|
+ break;
|
|
|
+ case "!=":
|
|
|
+ count = elementData.stream().filter(e -> !e.getValue().equals(split[8])).count();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (stop) {
|
|
|
+ value.setValue("");
|
|
|
+ if (attachData != null) {
|
|
|
+ ElementData elementData1 = attachData.getValues().get(i);
|
|
|
+ elementData1.setValue("");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (count > 0) {
|
|
|
+ //当前截至行不需要清空数据
|
|
|
+ stop = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (attachData != null) {
|
|
|
+ Map<String, FormData> formDataMap = tec.getFormDataMap();
|
|
|
+ FormData formData = formDataMap.get(split[3].replace("E['", "").replace("']", ""));
|
|
|
+ formData.setFinished(true);
|
|
|
+ formData.setUpdate(1);
|
|
|
+ formData.setValues(attachData.getValues());
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Object> values = sourceData.getValues().stream().map(ElementData::getValue).collect(Collectors.toList());
|
|
|
+ //处理完之后
|
|
|
+ FormulaUtils.write(fd, values, !fd.getTableName().equals(checkTable));
|
|
|
+ }
|
|
|
+ local = new ArrayList<>();
|
|
|
+ }else{
|
|
|
+ local = slice2Local(f, fdMap, tec);
|
|
|
+ }
|
|
|
if (local.size() > 0) {
|
|
|
List<Object> values = FormulaUtils.slice(local, f);
|
|
|
+ values = values.stream().map(s -> StringUtils.isEmpty(s) ? "/" : s).collect(Collectors.toList());
|
|
|
FormulaUtils.write(fd, values, !fd.getTableName().equals(checkTable));
|
|
|
}
|
|
|
} else {
|
|
|
@@ -1527,6 +1757,28 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
return local;
|
|
|
}
|
|
|
|
|
|
+ private List<LocalVariable> slice3Local(String f, TableElementConverter tec, Map<Integer, List<ElementData>> collect, String str) {
|
|
|
+ List<LocalVariable> local = new ArrayList<>();
|
|
|
+ collect.keySet().forEach(key -> {
|
|
|
+
|
|
|
+ Map<String, Object> variable = new HashMap<>(tec.constantMap);
|
|
|
+ Map<String, Object> em = (Map<String, Object>) variable.computeIfAbsent(E, k -> new HashMap<>());
|
|
|
+ List<ElementData> elementData = collect.get(key);
|
|
|
+ Integer index = elementData.get(0).getIndex();
|
|
|
+
|
|
|
+
|
|
|
+ List<Object> collect1 = elementData.stream().map(ElementData::getValue).collect(Collectors.toList());
|
|
|
+ List<Double> collect2 = collect1.stream()
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .filter(StringUtils::isNumber)
|
|
|
+ .map(obj -> NumberUtils.toDouble(obj.toString(), Double.NaN))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ em.put(str,collect2);
|
|
|
+ local.add(new LocalVariable(index, f, variable));
|
|
|
+ });
|
|
|
+ return local;
|
|
|
+ }
|
|
|
+
|
|
|
private void putEle(String f, List<FormData> ele, Map<String, Object> currentMap, FormData fd) {
|
|
|
@SuppressWarnings("unchecked")
|
|
|
Map<String, Object> em = (Map<String, Object>) currentMap.computeIfAbsent(E, (k) -> new HashMap<>());
|
|
|
@@ -1961,6 +2213,40 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
FormulaUtils.write(fd, data, !fd.getIsRemoveEmpty());
|
|
|
}
|
|
|
}
|
|
|
+ //处理
|
|
|
+ public void write(String key, String value, TableElementConverter tec) {
|
|
|
+ Map<String, FormData> formDataMap = tec.getFormDataMap();
|
|
|
+
|
|
|
+ key = key.replace("E[","").replace("'","").replace("]","");
|
|
|
+
|
|
|
+ FormData formData = formDataMap.get(key);
|
|
|
+ formData.setFinished(true);
|
|
|
+ formData.setUpdate(1);
|
|
|
+ List<ElementData> values = formData.getValues();
|
|
|
+ //取的值是从其他元素获取的
|
|
|
+ if(value.contains("E[")){
|
|
|
+ value = value.replace("E[","").replace("'","").replace("]","");
|
|
|
+ //获取value的值
|
|
|
+ FormData valueFormData = formDataMap.get(value);
|
|
|
+ List<ElementData> values1 = valueFormData.getValues();
|
|
|
+ //如果是一个元素多个单元格 便利每一个单元格赋值
|
|
|
+ if(CollectionUtil.isNotEmpty(values) && CollectionUtil.isNotEmpty(values1)){
|
|
|
+ int count = values.size();
|
|
|
+ if(values1.size() < count){
|
|
|
+ count = values1.size();
|
|
|
+ }
|
|
|
+ for (int i = 0; i < count; i++) {
|
|
|
+ ElementData elementData = values.get(i);
|
|
|
+ ElementData elementData1 = values1.get(i);
|
|
|
+ elementData.setValue(elementData1.getValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ if(CollectionUtil.isNotEmpty(values)){
|
|
|
+ values.get(0).setValue(value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* 加页增容
|
|
|
@@ -5607,6 +5893,151 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
} while (f.contains("ifelse") && max < 20);
|
|
|
}
|
|
|
}
|
|
|
+ //多条件判断
|
|
|
+ if (f.contains("ifelseMulti")){
|
|
|
+ try {
|
|
|
+ // 提取括号内的内容(去掉外层的ifelse())
|
|
|
+ String content = f.replaceFirst("^" + FC_REG + "ifelseMulti\\(", "").replaceFirst("\\)$", "");
|
|
|
+
|
|
|
+ // 解析参数,处理嵌套逗号(在括号内的逗号不应该作为分隔符)
|
|
|
+ List<String> pa = parseParameters(content);
|
|
|
+ String method = null;
|
|
|
+ if(pa.size() == 4){
|
|
|
+ method = pa.remove(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pa.size() == 3) {
|
|
|
+ Map<String, Object> currentMap = createCurrentMap(f, tec);
|
|
|
+ //判断 为
|
|
|
+ String falseStr = pa.get(2);;
|
|
|
+ if(pa.get(2).contains("(") && pa.get(2).contains(",") && pa.get(2).split(",").length == 3){
|
|
|
+ pa.set(2,"(-10086)");
|
|
|
+ }else{
|
|
|
+ if(pa.get(2).isEmpty()){
|
|
|
+ pa.set(2, "''");
|
|
|
+ }else{
|
|
|
+ if(!pa.get(2).contains("(")){
|
|
|
+ pa.set(2, "(" + pa.get(2) + ")");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String string = pa.get(0) + "?" + pa.get(1) + ":" + pa.get(2);
|
|
|
+ Expression parse = Expression.parse(string);
|
|
|
+
|
|
|
+ // 针对一个元素多个单元格的数据单独处理
|
|
|
+ Object o = currentMap.get("E");
|
|
|
+ if(o != null){
|
|
|
+ Map<String, List<String>> tableDataMap = (Map<String, List<String>>) o;
|
|
|
+
|
|
|
+ Set<Integer> set = tableDataMap.values().stream().map(List::size).filter(size -> size != 1).collect(Collectors.toSet());
|
|
|
+ List<Integer> collect = new ArrayList<>(set);
|
|
|
+ if(collect.size() > 1){
|
|
|
+ throw new com.alibaba.nacos.shaded.com.google.protobuf.ServiceException("计算单元格不一致 无法计算");
|
|
|
+ }
|
|
|
+ //一个元素存在多单元格
|
|
|
+ if(collect.size() == 1){
|
|
|
+ List<List<String>> collect1 = tableDataMap.values().stream().filter(x -> x.size() > 1).collect(Collectors.toList());
|
|
|
+ //复制一份
|
|
|
+ List<List<String>> lists = collect1.stream().map(ArrayList::new).collect(Collectors.toList());
|
|
|
+ List<Object> dataAll = new ArrayList<>();
|
|
|
+ //数据按 行单独计算
|
|
|
+ for (int i = 0; i < collect.get(0); i++) {
|
|
|
+ for (int j = 0; j < lists.size(); j++) {
|
|
|
+ List<String> strings = collect1.get(j);
|
|
|
+ strings.clear();
|
|
|
+ strings.add(lists.get(j).get(i).toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ Object data = parse.calculate(currentMap);
|
|
|
+ //递归计算
|
|
|
+ if(Objects.equals(String.valueOf(data),"-10086")){
|
|
|
+ //进入递归算法
|
|
|
+ data = multipleIfElse(falseStr,currentMap);
|
|
|
+ }
|
|
|
+ if("".equals(data)){
|
|
|
+ data = "/";
|
|
|
+ }
|
|
|
+ dataAll.add(data);
|
|
|
+ }
|
|
|
+ //赋值元素是否是多个单元格
|
|
|
+ if(fd.getValues().size() > 1){
|
|
|
+ f = f.replace(f, putDataWithKey(dataAll, tec));
|
|
|
+ } else {
|
|
|
+ if(StringUtil.isNotBlank(method) && "sum".equals(method)){
|
|
|
+ double sum = dataAll.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).sum();
|
|
|
+ f = f.replace(f, putDataWithKey(sum, tec));
|
|
|
+ } else{
|
|
|
+ //计算平均值
|
|
|
+ OptionalDouble op = dataAll.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).average();
|
|
|
+ if (op.isPresent()) {
|
|
|
+ f = f.replace(f, putDataWithKey(op.getAsDouble(), tec));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ Object data = parse.calculate(currentMap);
|
|
|
+ //递归计算
|
|
|
+ if(Objects.equals(String.valueOf(data),"-10086")){
|
|
|
+ //进入递归算法
|
|
|
+ data = multipleIfElse(falseStr,currentMap);
|
|
|
+ }
|
|
|
+ f = f.replace(f, putDataWithKey(data, tec));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ f = f.replace(f, "参数格式错误");
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ f = f.replace(f, "解析错误");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // switch-case 选择公式
|
|
|
+ if (f.contains("switchCase")){
|
|
|
+ try {
|
|
|
+ // 提取括号内的内容(去掉外层的ifelse())
|
|
|
+ String content = f.replaceFirst("^" + FC_REG + "switchCase\\(", "").replaceFirst("\\)$", "");
|
|
|
+
|
|
|
+ String key = null;
|
|
|
+ String value = null;
|
|
|
+
|
|
|
+ Map<String, Object> currentMap = createCurrentMap(f, tec);
|
|
|
+
|
|
|
+ //根据分号分组 数据样例:a=x -> b=0; a=y -> c=1; else -> d=2
|
|
|
+ String[] ruleArray = content.trim().split(",");
|
|
|
+ if(ruleArray.length % 2 != 0){
|
|
|
+ throw new ServiceException("数据格式错误");
|
|
|
+ }
|
|
|
+ List<String> list = Arrays.asList(ruleArray);
|
|
|
+ //2条数据为一组
|
|
|
+ List<List<String>> partition = Lists.partition(list, 2);
|
|
|
+ for (List<String> strings : partition) {
|
|
|
+ String s = strings.get(0);
|
|
|
+ String s1 = strings.get(1);
|
|
|
+ String[] action = s1.split("=");
|
|
|
+ if ("else".equals(s)) {
|
|
|
+ key = action[0];
|
|
|
+ value = action[1];
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ Expression parse = Expression.parse(s + "?1:0");
|
|
|
+ Object data = parse.calculate(currentMap);
|
|
|
+ if(Objects.equals("1",String.valueOf(data))){
|
|
|
+ key = action[0];
|
|
|
+ value = action[1];
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ f = "";
|
|
|
+ if(key != null && value != null){
|
|
|
+ /*数据回写*/
|
|
|
+ write(key,value.replaceAll("\\(","").replaceAll("\\)",""),tec);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ f = f.replace(f, "解析错误");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (f.contains("avg4segment")) {
|
|
|
Matcher m = RegexUtils.matcher(FC_REG + "(avg4segment)\\(([^)]+)\\)", f);
|
|
|
while (m.find()) {
|
|
|
@@ -5769,6 +6200,31 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
return params;
|
|
|
}
|
|
|
|
|
|
+ private Object multipleIfElse(String str,Map<String, Object> currentMap) {
|
|
|
+ str = str.replaceFirst("\\(","").replaceFirst("\\)$","");
|
|
|
+ // 解析参数,处理嵌套逗号(在括号内的逗号不应该作为分隔符)
|
|
|
+ List<String> pa = parseParameters(str);
|
|
|
+
|
|
|
+ if (pa.size() == 3) {
|
|
|
+ String s = pa.get(2);;
|
|
|
+ //
|
|
|
+ if(pa.get(2).contains("(") && pa.get(2).contains(",") && pa.get(2).split(",").length == 3){
|
|
|
+ pa.set(2,"-10086");
|
|
|
+ }
|
|
|
+ String string = pa.get(0) + "?" + pa.get(1) + ":(" + pa.get(2) + ")";
|
|
|
+ Expression parse = Expression.parse(string);
|
|
|
+ Object data = parse.calculate(currentMap);
|
|
|
+ //递归计算
|
|
|
+ if(Objects.equals(String.valueOf(data),"-10086")){
|
|
|
+ //进入递归算法
|
|
|
+ data = multipleIfElse(s,currentMap);
|
|
|
+ }
|
|
|
+ return data;
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 符号替换
|
|
|
* @param s1
|
|
|
@@ -5784,9 +6240,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
if(Objects.equals("≠",s1)){
|
|
|
s1 = "!=";
|
|
|
}
|
|
|
- if(Objects.equals("=",s1)){
|
|
|
- s1 = "==";
|
|
|
- }
|
|
|
if(Objects.equals("<",s1)){
|
|
|
s1 = "<";
|
|
|
}
|