Jelajahi Sumber

试验-公式
1、数据自变公式开发

LHB 1 Minggu lalu
induk
melakukan
d6be253c48

+ 146 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -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);
                                     }