Bläddra i källkod

公式相关:私有引用项目节点公式查询优化

yangyj 2 år sedan
förälder
incheckning
2fbd02592f

+ 65 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/MileageController.java

@@ -31,6 +31,9 @@ import org.springblade.manager.dto.FormData;
 import org.springblade.manager.entity.Formula;
 import org.springblade.manager.feign.FormulaClient;
 import org.springframework.beans.BeanUtils;
+import org.springframework.messaging.handler.annotation.MessageMapping;
+import org.springframework.messaging.handler.annotation.Payload;
+import org.springframework.messaging.handler.annotation.SendTo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import springfox.documentation.annotations.ApiIgnore;
@@ -120,7 +123,7 @@ public class MileageController {
         if (StringUtil.isEmpty(b) || StringUtil.isEmpty(value) || StringUtil.isEmpty(jj) || StringUtil.isEmpty(projectId) || StringUtil.isEmpty(partId)) {
             return R.fail("参数不全");
         }
-        double[] aa = MileageUtill.azimuthZbXy(Double.parseDouble(value), Double.parseDouble(b), Double.parseDouble(jj), this.service.list(Wrappers.<Mileagexy>query().lambda().eq(Mileagexy::getPartId, partId).eq(Mileagexy::getProjectId, projectId)));
+        double[] aa = MileageUtill.azimuthZbXy(Double.parseDouble(value), Double.parseDouble(b), Double.parseDouble(jj), this.service.list(Wrappers.<Mileagexy>query().lambda().eq(Mileagexy::getPartId, partId)));
         if (aa == null) {
             return R.fail("线元信息不存在,请按照图纸录入系统");
         }
@@ -304,5 +307,66 @@ public class MileageController {
         return partNo + 'K' + xstr + sign + ystr;
     }
 
+/*
+    private static class CalculationRequest {
+        private int num1;
+        private int num2;
+        private char operator;
+
+        public int getNum1() {
+            return num1;
+        }
+
+        public void setNum1(int num1) {
+            this.num1 = num1;
+        }
+
+        public int getNum2() {
+            return num2;
+        }
+
+        public void setNum2(int num2) {
+            this.num2 = num2;
+        }
+
+        public char getOperator() {
+            return operator;
+        }
+
+        public void setOperator(char operator) {
+            this.operator = operator;
+        }
+    }
+
+
+    @MessageMapping("/websocket/calc")
+    @SendTo("/topic/result")
+    public int calculate(@Payload CalculationRequest request) {
+        int num1 = request.getNum1();
+        int num2 = request.getNum2();
+        char operator = request.getOperator();
+
+        int result = 0;
+        switch (operator) {
+            case '+':
+                result = num1 + num2;
+                break;
+            case '-':
+                result = num1 - num2;
+                break;
+            case '*':
+                result = num1 * num2;
+                break;
+            case '/':
+                result = num1 / num2;
+                break;
+            default:
+                // Handle invalid operator
+                break;
+        }
+
+        return result;
+    }*/
+
 
 }

+ 23 - 5
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -429,6 +429,8 @@ public class CustomFunction {
         }
         return "";
     }
+
+
     public static Object dateOffset(List<String> dateList,LinkedList<Integer> offSet){
             List<String> result = new ArrayList<>();
             if(ListUtils.isNotEmpty(dateList)&&ListUtils.isNotEmpty(offSet)){
@@ -2576,6 +2578,12 @@ public class CustomFunction {
         return dXd(design, data, xN, scale, mode);
     }
 
+//    public static void main(String[] args) {
+//        String a="100*100";
+//        List<Object>list  = new ArrayList<>(Arrays.asList("101*102","201*198"));
+//        list.forEach(d-> System.out.println(dXd(a,d)));
+//    }
+
     /**
      * @return java.lang.Object
      * @Description 求偏差公式  支持AXA-BXB=DXD或者A-B=D的格式
@@ -2591,16 +2599,26 @@ public class CustomFunction {
             if (StringUtils.isEmpty(scale)) {
                 scale = 0;
             }
-            String delimiter = handleNull(matcherFindGroup("[^0-9.]", design.toString(), 0, false));
+            String delimiter = handleNull(matcherFindGroup("[^0-9./]", design.toString(), 0, false));
             if (StringUtils.isEmpty(delimiter)) {
                 delimiter = CONCAT;
             }
+            String delimiter2 = handleNull(matcherFindGroup("[^0-9.]", design.toString(), 0, false));
+            if (StringUtils.isEmpty(delimiter2)) {
+                delimiter2 = CONCAT;
+            }
             String[] dArr = handleNull(design).split("[" + delimiter + "]");
-            String[] bArr = handleNull(data).split("[" + delimiter + "]");
+            String[] bArr = handleNull(data).split("[" + delimiter2 + "]");
             Object _dx = null;
             for (int n = 0; n < dArr.length; n++) {
-                BigDecimal a = new BigDecimal(dArr[n]);
-                BigDecimal b = new BigDecimal(bArr[n]);
+                String dsg=dArr[n];
+                String xd=bArr[n];
+                if(dsg.contains("/")){
+                    String[] dsgA= dsg.split("/");
+                    dsg= Arrays.stream(dsgA).filter(StringUtils::isNumber).min(Comparator.comparingDouble(e->Math.abs(StringUtils.obj2Double(calculate(xd,e,3,2))))).orElse(dsg);
+                }
+                BigDecimal a = new BigDecimal(dsg);
+                BigDecimal b = new BigDecimal(xd);
                 String _data;
                 if (StringUtils.isEquals(1, mode)) {
                     _data = b.multiply(a).multiply(new BigDecimal(xN.toString())).setScale(Integer.parseInt(scale.toString()), ROUND_HALF_UP).toString();
@@ -2608,7 +2626,7 @@ public class CustomFunction {
                     _data = b.subtract(a).multiply(new BigDecimal(xN.toString())).setScale(Integer.parseInt(scale.toString()), ROUND_HALF_UP).toString();
                 }
                 if (StringUtils.isNotEmpty(_dx)) {
-                    _dx = StringUtils.join(_dx, _data, delimiter);
+                    _dx = StringUtils.join(_dx, _data, delimiter2);
                 } else {
                     _dx = _data;
                 }

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

@@ -1219,7 +1219,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
     private List<KeyMapper> listForContract(List<Long> ids,String projectId,String nodeId){
         String pkIds=ids.stream().map(String::valueOf).collect(Collectors.joining(","));
         List<Map<String,Object>> listMap = listMap(ids,ExecuteType.INSPECTION);
-        Map<String,Object> wtpMap= this.jdbcTemplate.queryForMap("select b.parent_id parentId,b.wbs_id wbsId from m_wbs_tree_contract  a join m_wbs_tree_private b on (a.id=b.id or a.old_id=b.id ) where a.p_key_id ="+ids.get(0)+" and b.project_id="+projectId+" limit 1");
+        Map<String,Object> wtpMap= this.jdbcTemplate.queryForMap("select b.id parentId,b.wbs_id wbsId from m_wbs_tree_contract  a join m_wbs_tree_private b on (a.id=b.id or a.old_id=b.id ) where a.p_key_id ="+nodeId+" and b.project_id="+projectId+" limit 1");
         if(Func.isNotEmpty(listMap)){
             /*当前节点的某个元素存在多种作用域的公式,作用域范围越小优先级越高*/
             List<KeyMapper> list= listMap.stream().map(m->BeanUtil.toBean(m,KeyMapper.class)).collect(Collectors.toList());