Эх сурвалжийг харах

公式相关:用时计算优化

yangyj 2 жил өмнө
parent
commit
a05d221d94

+ 72 - 29
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -22,6 +22,7 @@ import java.io.FileInputStream;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.regex.Matcher;
 import java.util.regex.Matcher;
@@ -967,40 +968,82 @@ public class CustomFunction {
      * @Date 2021.07.01 09:57
      * @Date 2021.07.01 09:57
      **/
      **/
     public static Object timePassed(Object t1, Object t2, Object mode, Object scale, Object format) {
     public static Object timePassed(Object t1, Object t2, Object mode, Object scale, Object format) {
+        List<Object> result=new ArrayList<>();
         if (t1 != null && t2 != null && StringUtils.isNotEmpty(mode) && StringUtils.isNotEmpty(scale) && StringUtils.isNotEmpty(format)) {
         if (t1 != null && t2 != null && StringUtils.isNotEmpty(mode) && StringUtils.isNotEmpty(scale) && StringUtils.isNotEmpty(format)) {
-//			Date d1 = parseDate(t1,handleNull(format));
-//			Date d2 = parseDate(t2,handleNull(format));
-            DateTime d1 = new DateTime(t1.toString());
-            DateTime d2 = new DateTime(t2.toString());
-//			if(d1.after(d2)&&StringUtils.isEquals("H",mode)){
-//				/*假如是计算相差单位是小时,当开始时间大于结束时间,需要考虑跨年的情况*/
-//                   Calendar c =Calendar.getInstance();
-//                   c.setTime(d1);
-//				   c.add(Calendar.YEAR, -1);
-//				   d1=new DateTime(c.getTime());
-//			}
-            long range = d2.getTime() - d1.getTime();
-            long r = 0;
-            if (StringUtils.isEquals("Y", mode.toString())) {
-                r = range / (1000L * 3600 * 24 * 365);
-            } else if (StringUtils.isEquals("M", mode.toString())) {
-                r = range / (1000L * 3600 * 24 * 30);
-            } else if (StringUtils.isEquals("D", mode.toString())) {
-                r = range / (1000L * 3600 * 24);
-            } else if (StringUtils.isEquals("H", mode.toString())) {
-                r = range / (1000L * 3600);
-            } else if (StringUtils.isEquals("m", mode.toString())) {
-                r = range / (1000L * 60);
-            }
-            BigDecimal b = new BigDecimal(r);
-            if (!StringUtils.isNumber(scale)) {
-                scale = 0;
+            LinkedList<Object> list1,list2;
+            if(t1 instanceof  List){
+                 list1 = new LinkedList<Object>((List) t1);
+            }else{
+                 list1= new LinkedList<>();
+                 list1.add(t1);
             }
             }
-            return b.setScale(Integer.parseInt(scale.toString()), ROUND_HALF_UP);
+            if(t2 instanceof  List){
+                list2 = new LinkedList<Object>((List) t2);
+            }else{
+                list2= new LinkedList<>();
+                list2.add(t2);
+            }
+            int n =Math.max(list1.size(),list2.size());
+            for(int i=0;i<n;i++){
+                Object o1=list1.size()>i?list1.get(i):list1.getLast();
+                Object o2=list2.size()>i?list2.get(i):list2.getLast();
+                long range=timeStamp(o1,o2);
+                long r = 0;
+                if (StringUtils.isEquals("Y", mode.toString())) {
+                    r = range / (1000L * 3600 * 24 * 365);
+                } else if (StringUtils.isEquals("M", mode.toString())) {
+                    r = range / (1000L * 3600 * 24 * 30);
+                } else if (StringUtils.isEquals("D", mode.toString())) {
+                    r = range / (1000L * 3600 * 24);
+                } else if (StringUtils.isEquals("H", mode.toString())) {
+                    r = range / (1000L * 3600);
+                } else if (StringUtils.isEquals("m", mode.toString())) {
+                    r = range / (1000L * 60);
+                }
+                BigDecimal b = new BigDecimal(r);
+                if (!StringUtils.isNumber(scale)) {
+                    scale = 0;
+                }
+                if(BigDecimal.ZERO.equals(b)){
+                    result.add("");
+                }else {
+                    result.add(b.setScale(Integer.parseInt(scale.toString()), ROUND_HALF_UP));
+                }
+            }
+
         }
         }
-        return "";
+        return result;
+    }
+    public static long timeStamp(Object t1,Object t2){
+        if(StringUtils.isNotEmpty(t1,t2)) {
+            String s1 = t1.toString();
+            String s2 = t2.toString();
+            List<Integer> lsa1= Arrays.stream(s1.replaceAll("[\\s]+","").replaceAll("[\\D]+$","").split("[\\D]+")).map(Integer::parseInt).collect(Collectors.toList());
+            List<Integer> lsa2= Arrays.stream(s2.replaceAll( "[\\s]+","").replaceAll("[\\D]+$", "").split("[\\D]+")).map(Integer::parseInt).collect(Collectors.toList());
+            return list2Stamp(lsa2)-list2Stamp(lsa1);
+        }
+         return 0;
+    }
+    public static long list2Stamp(List<Integer>list){
+        LocalDateTime localDateTime;
+        if(list.size()==6||list.size()==5){
+             localDateTime=LocalDateTime.of(list.get(0),list.get(1),list.get(2),list.get(3),list.get(4),0,0);
+        }else if(list.size()==2){
+            localDateTime=LocalDateTime.now().withHour(list.get(0)).withMinute(list.get(1)).withSecond(0).withNano(0);
+        }else{
+            localDateTime= LocalDateTime.now();
+        }
+      return localDateTime.atZone(java.time.ZoneOffset.UTC)
+              .toInstant()
+              .toEpochMilli();
     }
     }
 
 
+    public static void main(String[] args) {
+             List<Object> l1 = Arrays.asList("16:00","2023年6月29日 16:10:31","2023年6月29日 16:09");
+             List<Object> l2 = Arrays.asList("2023年6月29日16:50");
+        System.out.println(minutesPassed(l1,l2));
+
+    }
 
 
     public static Object k2d(Object k) {
     public static Object k2d(Object k) {
         Matcher mt = RegexUtils.matcher("[A-Z]*(\\d*)\\+([\\d|\\.]*)", k.toString());
         Matcher mt = RegexUtils.matcher("[A-Z]*(\\d*)\\+([\\d|\\.]*)", k.toString());

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

@@ -751,7 +751,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                     for(Map.Entry<String,ElementData> se:tip.entrySet()){
                                     for(Map.Entry<String,ElementData> se:tip.entrySet()){
                                         Object value=se.getValue().getValue();
                                         Object value=se.getValue().getValue();
                                         if(CustomFunction.isNumber(value)){
                                         if(CustomFunction.isNumber(value)){
-                                            if(StringUtils.isDouble(value)){
+                                            if(StringUtils.isDouble(value)||f.contains("/")){
                                                 em.put(se.getKey(), new BigDecimal(value.toString()));
                                                 em.put(se.getKey(), new BigDecimal(value.toString()));
                                             }else{
                                             }else{
                                                 em.put(se.getKey(),StringUtils.handleObj2Integer(value));
                                                 em.put(se.getKey(),StringUtils.handleObj2Integer(value));
@@ -1183,7 +1183,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
         for(FormData fd:tec.formDataList){
         for(FormData fd:tec.formDataList){
             if(fd.verify()){
             if(fd.verify()){
                 /*保留小数位*/
                 /*保留小数位*/
-                if(fd.getFormula()!=null&&!fd.empty()&&fd.getValues().stream().map(ElementData::getValue).anyMatch(StringUtils::isDouble)){
+                if(fd.getFormula()!=null&&!fd.empty()&&fd.getValues().stream().map(ElementData::getValue).anyMatch(StringUtils::isNumber)){
                     Formula f = fd.getFormula();
                     Formula f = fd.getFormula();
                     fd.setValues(setScale(f.getScale(),fd.getValues()));
                     fd.setValues(setScale(f.getScale(),fd.getValues()));
                 }
                 }