Browse Source

fix:
1.加上了tryCatch
2.指标查询图标报错BUG,指标为空

WanRuixiang 9 months ago
parent
commit
afb79b915d

+ 2 - 2
src/app/components/ChartsGraph/index.jsx

@@ -15,7 +15,7 @@ export const ChartsGraph = memo(({
   const queryColumns = formatColumns(columns);   // 表头
   const dimensions = formatDimensions(dimensionColumns); // 维度
   const metrics = formatMetrics(metricColumns); // 指标
-
+  console.log(dataSource)
   // 显示方式判断
   // 若维度数大于1,取[0],[1]
   const data = formatData(
@@ -37,8 +37,8 @@ export const ChartsGraph = memo(({
     let config = {
       data,
       xField: 'dimension',
-      stack:true,
       yField: 'metric',
+      stack:true,
       colorField: 'category',
       axis: {y: { labelFormatter: '~s' }},
       containerStyle:{height:'50vh'},

+ 23 - 19
src/app/components/ChartsGraph/utils.js

@@ -5,16 +5,18 @@ import Decimal from 'decimal.js';
  * */
 export const formatColumns=(props)=>{
   let columns = [];
-  if (props && props.length>0){
-    columns = props.map(item=> (
-      {
-        title: item.name||item.nameEn,
-        dataIndex: item.nameEn,
-        key: item.nameEn,
-        width: 100,
-      }
-    ))
-  }
+  try {
+    if (props && props.length>0){
+      columns = props.map(item=> (
+        {
+          title: item.name||item.nameEn,
+          dataIndex: item.nameEn,
+          key: item.nameEn,
+          width: 100,
+        }
+      ))
+    }
+  }catch(e){}
   return columns
 }
 
@@ -23,14 +25,16 @@ export const formatColumns=(props)=>{
  * */
 export const formatDimensions=(props)=>{
   let dimensions = [];
-  if (props && props.length>0){
-    dimensions = props.map(item=> (
-      {
-        title: item.name,
-        value: item.nameEn,
-      }
-    ))
-  }
+  try {
+    if (props && props.length>0){
+      dimensions = props.map(item=> (
+        {
+          title: item.name,
+          value: item.nameEn,
+        }
+      ))
+    }
+  }catch (e) {}
   return dimensions
 }
 
@@ -62,7 +66,7 @@ export const formatIndex=(props)=> ( props && props.length>0 && props.map(item=>
  * 数据格式化
  * */
 export const formatData=(data, dim, mtc, cat)=>(
-  data && data.length>0 &&
+  data && data.length>0 && mtc &&
   data.map(item=> {
     const mtcType = mtc.dataType;
     const mtcData = item[mtc?.value]

+ 115 - 100
src/app/hooks/useModelConfig.js

@@ -7,25 +7,27 @@ export function useModelConfig() {
    * */
   function checkSelectAll(sql) {
     let flag = false;
-    const parts = sql.split(/from/i);
-    if (parts.length > 1) {
-      const selectPart = parts[0];
-      const fields = selectPart.split(",");
-      if (fields.length > 1){
-        fields.forEach(field=>{
-          if (!flag){
-            if (field.includes('*')){
-              const regex = /[\w\W]*\([\w\W]*\*[\w\W]*\)[\w\W]*/
-              if (!regex.test(field)){
-                flag = true
+    try {
+      const parts = sql.split(/from/i);
+      if (parts.length > 1) {
+        const selectPart = parts[0];
+        const fields = selectPart.split(",");
+        if (fields.length > 1){
+          fields.forEach(field=>{
+            if (!flag){
+              if (field.includes('*')){
+                const regex = /[\w\W]*\([\w\W]*\*[\w\W]*\)[\w\W]*/
+                if (!regex.test(field)){
+                  flag = true
+                }
               }
             }
-          }
-        })
-      }else {
-        return sql.includes('*')
+          })
+        }else {
+          return sql.includes('*')
+        }
       }
-    }
+    }catch(e){}
     return flag;
   }
 
@@ -38,66 +40,70 @@ export function useModelConfig() {
    * }
    * */
   const toFields = (sql) => {
-    const regexf = /from/i;                         // 匹配FROM的规则
-    const regexas = /\s+AS\s+/i;                    // 匹配AS的规则
-    const regexs = /select/gi;                      // 匹配SELECT的规则
-    const regext = /FROM\s+([\w]+)/i;               // 匹配表名的规则
-    const regexc =  /[^,]*\([^)]*\) AS [^,]*/gi;    // 匹配复合字段规则 如 CONVERT(admDate,datetime) as admDate,  CAST(admDate AS DATE) as admDate2,
-    const regexcs = /\)\s+as\s+([\w]+)/i;           // 取admDate/admDate2
-    const regexjoin = /\b(LEFT\s+JOIN|RIGHT\s+JOIN|INNER\s+JOIN)\b/i; // 匹配JOIN的规则
-
-    // 取SELECT-FROM之间的字符串,并分割出所有字段
-    const matchf = sql.match(regexf);
-    const fromIndex = matchf?.index || 0;
-    let matchcStr = sql.slice(0, fromIndex).replace(regexs,'');
-
-    // 匹配COUNT()类型的字段,摘取出来单独处理
-    const matchc = matchcStr.match(regexc);
-    let fieldc = [];
-    if (matchc){
-      matchcStr = matchcStr.replace(regexc, '');
-      fieldc = matchc.map(c=>c.match(regexcs)[1]);
-    }
+    try {
+      const regexf = /from/i;                         // 匹配FROM的规则
+      const regexas = /\s+AS\s+/i;                    // 匹配AS的规则
+      const regexs = /select/gi;                      // 匹配SELECT的规则
+      const regext = /FROM\s+([\w]+)/i;               // 匹配表名的规则
+      const regexc =  /[^,]*\([^)]*\) AS [^,]*/gi;    // 匹配复合字段规则 如 CONVERT(admDate,datetime) as admDate,  CAST(admDate AS DATE) as admDate2,
+      const regexcs = /\)\s+as\s+([\w]+)/i;           // 取admDate/admDate2
+      const regexjoin = /\b(LEFT\s+JOIN|RIGHT\s+JOIN|INNER\s+JOIN)\b/i; // 匹配JOIN的规则
 
-    // 按逗号分割字段
-    const fieldArr = matchcStr.split(',');
-    // 截取form之后的字符串
-    const sqlRelation = sql.slice(fromIndex);
-    // 判断是否有JOIN
-    const isJoin = regexjoin.test(sqlRelation.toUpperCase());
-    // 单表查询直接取表名
-    const matchStr = sqlRelation.match(regext);
-    const singleTable = ( matchStr && matchStr[1] ) || "";
+      // 取SELECT-FROM之间的字符串,并分割出所有字段
+      const matchf = sql.match(regexf);
+      const fromIndex = matchf?.index || 0;
+      let matchcStr = sql.slice(0, fromIndex).replace(regexs,'');
 
-    // 按顺序处理SQL字符串
-    return fieldArr.concat(fieldc).map(item=> {
-      let str=item,table=singleTable,field,aliasStr;
-      // 判断字符串是否包含AS,有则去除AS
-      const hasAs = regexas.test(item);
-      if (hasAs){
-        const asStr = item.match(regexas)[0];
-        str = item.split(asStr)[0];
-        aliasStr = item.split(asStr)[1].trim();
+      // 匹配COUNT()类型的字段,摘取出来单独处理
+      const matchc = matchcStr.match(regexc);
+      let fieldc = [];
+      if (matchc){
+        matchcStr = matchcStr.replace(regexc, '');
+        fieldc = matchc.map(c=>c.match(regexcs)[1]);
       }
-      // 去除AS之后去除所有符号,但不包含'.'
-      str = str.replaceAll(/^\s+|\s+$/g, '').replaceAll(/\s+/g, '');
 
-      // 若是以.的形式取则分割出表和字段
-      if (str.includes('.')){
-        const split = str.split('.');
-        table = split[0]
-        field = split[1]
-      }
+      // 按逗号分割字段
+      const fieldArr = matchcStr.split(',');
+      // 截取form之后的字符串
+      const sqlRelation = sql.slice(fromIndex);
+      // 判断是否有JOIN
+      const isJoin = regexjoin.test(sqlRelation.toUpperCase());
+      // 单表查询直接取表名
+      const matchStr = sqlRelation.match(regext);
+      const singleTable = ( matchStr && matchStr[1] ) || "";
+
+      // 按顺序处理SQL字符串
+      return fieldArr.concat(fieldc).map(item=> {
+        let str=item,table=singleTable,field,aliasStr;
+        // 判断字符串是否包含AS,有则去除AS
+        const hasAs = regexas.test(item);
+        if (hasAs){
+          const asStr = item.match(regexas)[0];
+          str = item.split(asStr)[0];
+          aliasStr = item.split(asStr)[1].trim();
+        }
+        // 去除AS之后去除所有符号,但不包含'.'
+        str = str.replaceAll(/^\s+|\s+$/g, '').replaceAll(/\s+/g, '');
 
-      // 有join则按表分类字段,否则直接取FROM后面的表
-      return isJoin
-        ? {table,field,alias:aliasStr}
-        : {
-          table:table?table:singleTable,
-          field:field?field:str,
-          alias:aliasStr
+        // 若是以.的形式取则分割出表和字段
+        if (str.includes('.')){
+          const split = str.split('.');
+          table = split[0]
+          field = split[1]
         }
-    });
+
+        // 有join则按表分类字段,否则直接取FROM后面的表
+        return isJoin
+          ? {table,field,alias:aliasStr}
+          : {
+            table:table?table:singleTable,
+            field:field?field:str,
+            alias:aliasStr
+          }
+      });
+    }catch(e){
+      return []
+    }
   }
 
   /**
@@ -111,32 +117,39 @@ export function useModelConfig() {
    * */
   const initSqlModel=(model,sql,fields,bizs)=>{
     let tableData = [];
-    const regex1 = /from/i;
-    const match = sql.match(regex1);
-    const fromIndex = match?.index || 0;
-    const sqlRelation = sql.slice(fromIndex);
-    let SQLFields = "SELECT \r\n"
-    fields.forEach(({bizName,tableName,fieldName,dataType,comment},index) => {
-      // 是否最后一个
-      const isLast = index===fields.length-1
-      SQLFields += `\t${tableName}.${fieldName}${!isLast&&","}\r\n`
-      const initObj = bizs.find(item=>item.name===fieldName);
-      tableData.push({
-        id:Math.random(),
-        comment:comment,
-        bizName: bizName.replace(model+"_",""),
-        dataType: dataType,
-        fieldName: fieldName,
-        tableName: tableName,
-        isKey:DIM_TYPE_ENUM.IDENTIFY===initObj?.type,
-        common:DIM_TYPE_ENUM.CATEGORICAL===initObj?.type,
-        datetime:DIM_TYPE_ENUM.DATETIME===initObj?.type,
-        measure:!initObj?.type,
+    try {
+      const regex1 = /from/i;
+      const match = sql.match(regex1);
+      const fromIndex = match?.index || 0;
+      const sqlRelation = sql.slice(fromIndex);
+      let SQLFields = "SELECT \r\n"
+      fields.forEach(({bizName,tableName,fieldName,dataType,comment},index) => {
+        // 是否最后一个
+        const isLast = index===fields.length-1
+        SQLFields += `\t${tableName}.${fieldName}${!isLast&&","}\r\n`
+        const initObj = bizs.find(item=>item.name===fieldName);
+        tableData.push({
+          id:Math.random(),
+          comment:comment,
+          bizName: bizName.replace(model+"_",""),
+          dataType: dataType,
+          fieldName: fieldName,
+          tableName: tableName,
+          isKey:DIM_TYPE_ENUM.IDENTIFY===initObj?.type,
+          common:DIM_TYPE_ENUM.CATEGORICAL===initObj?.type,
+          datetime:DIM_TYPE_ENUM.DATETIME===initObj?.type,
+          measure:!initObj?.type,
+        })
       })
-    })
-    return {
-      tableData,
-      sql:SQLFields+sqlRelation,
+      return {
+        tableData,
+        sql:SQLFields+sqlRelation,
+      }
+    }catch (e) {
+      return {
+        tableData:[],
+        sql:"",
+      }
     }
   }
 
@@ -214,9 +227,9 @@ export function useModelConfig() {
    * @param table 表名
    * @param fields 字段数组
    * */
-  const fieldsToTable=(table,fields)=>(fields||[])
-    .map(field=>{
-      return {
+  const fieldsToTable=(table,fields)=>{
+    try {
+      return fields.map(field=>({
         id:Math.random(),
         bizName: field?.nameEn,
         comment: field?.comment,
@@ -227,9 +240,11 @@ export function useModelConfig() {
         common:false,
         datetime:false,
         measure:false,
-      }
+      }))
+    }catch (e) {
+      return []
     }
-  )
+  }
 
 
   /**

+ 0 - 1
src/app/hooks/useWorkFlow.js

@@ -162,7 +162,6 @@ export function useWorkFlow() {
       },
       position: {x: (len-1)*600, y: 50},
     }
-    console.log([tableInfo,...fieldInfo])
     return [tableInfo,...fieldInfo]
   }
 

+ 1 - 1
src/app/pages/IndexDefine/components/IndexDetail.jsx

@@ -475,7 +475,7 @@ export const IndexDetail = memo(({
                     <Descriptions.Item label={t("formItem.invokeType")}>{t("title.auto")}</Descriptions.Item>
                     <Descriptions.Item label={t("formItem.errorRetry")}>{t("title.null")}</Descriptions.Item>
                     <Descriptions.Item label={t("formItem.period")}>
-                      {persistence?.runCycleCode ? t("time."+persistence?.runCycleCode) :isNULL}
+                      {persistence?.runCycleCode ? t("time."+persistence?.runCycleCode.toLowerCase()) :isNULL}
                     </Descriptions.Item>
                     <Descriptions.Item label={t("formItem.createDate")}>{isNULL}</Descriptions.Item>
                     {

+ 1 - 1
src/app/pages/ModalManage/components/ModalDesign.jsx

@@ -15,7 +15,7 @@ import useI18NPrefix from "../../../hooks/useI18NPrefix";
 import {selectDimensions} from "../../MainPage/slice/selectors";
 import {useModelConfig} from "../../../hooks/useModelConfig";
 
-// TODO SQL执行解析优化
+// TODO 字段取消选择时,高度渲染优化
 
 export const ModalDesign = memo(({
   open=false,