|
@@ -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;
|
|
@@ -1360,6 +1362,150 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
|
|
|
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 = elementData.stream().filter(e -> e.getValue().equals(split[8])).count();
|
|
|
+ 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);
|
|
|
}
|