ソースを参照

模板查询列表,Sql生成初步算法!

周壕 1 年間 前
コミット
fb0ee28fc6

+ 15 - 3
src/main/java/com/bowintek/practice/controller/TempController.java

@@ -22,6 +22,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 
 @RestController
@@ -58,9 +59,20 @@ public class TempController {
         return RespGenerstor.success(tempService.saveTemp(data, accountService.getLoginUserID()));
     }
 
-    @PostMapping("/genTest")
+    @PostMapping("/genQuery")
     public BaseResponse<TempObjectModel> genTest(@RequestBody TempObjectModel data) {
-        genSqlStringService.Generation(data, accountService.getLoginUserID());
-        return RespGenerstor.success(0);
+        HashMap<String, Object> rtnObject = new HashMap<>();
+        try {
+            String sqlString = genSqlStringService.Generation(data, accountService.getLoginUserID());
+            rtnObject.put("sqlString", sqlString);
+
+            List<Map<String,Object>> rows = genSqlStringService.getListBySqlString(sqlString);
+            rtnObject.put("rows", rows);
+        }
+        catch (Exception ex){
+            rtnObject.put("errString", "生成查询语句错误:" + ex.getMessage());
+            ex.printStackTrace();
+        }
+        return RespGenerstor.success(rtnObject);
     }
 }

+ 1 - 0
src/main/java/com/bowintek/practice/mapper/cquery/TempCQuery.java

@@ -9,6 +9,7 @@ import java.util.List;
 
 public interface TempCQuery {
     List<SrSaerchtemp> getList(String tempNo, String tempName, String tempIdsString);
+    List<HashMap<String,Object>> getListBySqlString(String sqlString);
     List<HashMap<String,Object>> getListToHashMap(String tempName);
     Integer batchInsertDimension(@Param("dataList") List<SrTempdimension> dataList);
     Integer batchInsertField(@Param("dataList") List<SrTempfield> dataList);

+ 39 - 13
src/main/java/com/bowintek/practice/services/impl/GenSqlStringServiceImpl.java

@@ -8,13 +8,18 @@ import com.bowintek.practice.mapper.cquery.TempCQuery;
 import com.bowintek.practice.model.*;
 import com.bowintek.practice.services.service.GenSqlStringService;
 import com.bowintek.practice.services.service.TempService;
+import com.bowintek.practice.util.multipdb.DBTypeEnum;
+import com.bowintek.practice.util.multipdb.SwitchDataSource;
 import com.bowintek.practice.vo.temp.SqlColumnModel;
 import com.bowintek.practice.vo.temp.SqlFieldModel;
 import com.bowintek.practice.vo.temp.TempObjectModel;
 import com.bowintek.practice.vo.temp.TempSaveResult;
+import org.apache.ibatis.jdbc.SqlRunner;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.sql.Connection;
+import java.sql.DriverManager;
 import java.text.MessageFormat;
 import java.util.*;
 import java.util.concurrent.RecursiveTask;
@@ -26,6 +31,25 @@ public class GenSqlStringServiceImpl implements GenSqlStringService {
     SrSubjectMapper srSubjectMapper;
     @Autowired
     SrSubjectfieldMapper srSubjectfieldMapper;
+    @Autowired
+    TempCQuery tempCQuery;
+
+    @Override
+    @SwitchDataSource(DBTypeEnum.POSTGRE)
+    public List<Map<String,Object>> getListBySqlString(String sqlString){
+        //return tempCQuery.getListBySqlString(sqlString);
+        try {
+            Connection connection = DriverManager.getConnection(
+                    "jdbc:mysql://office.bowintek.com:3306/practicedb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai",
+                    "root", "bowin123");
+            SqlRunner sqlRunner = new SqlRunner(connection);
+            return sqlRunner.selectAll(sqlString);
+        }
+        catch (Exception ex){
+            ex.printStackTrace();
+            return null;
+        }
+    }
 
     //查询语句生成,要素点:查询主表、关联子表、查询字段、查询条件
     //查询主表:FROM (sr_subject.execSql) AS T
@@ -35,7 +59,7 @@ public class GenSqlStringServiceImpl implements GenSqlStringService {
     //输出字段 AS:ReFieldName0,1,2...;依据维度度量排序来
     //表名 AS:T 主表,T0,1,2...;子表,依据维度度量子表排序来
     @Override
-    public void Generation(TempObjectModel data, String userID){
+    public String Generation(TempObjectModel data, String userID){
         //取得字段原本定义
         data.sub = srSubjectMapper.selectByPrimaryKey(data.temp.getSubId());
         List<SrSubjectfield> fileds = getSubjectfieldsBySubId(data.temp.getSubId());
@@ -101,14 +125,15 @@ public class GenSqlStringServiceImpl implements GenSqlStringService {
         System.out.println("data.orderBy:"+data.orderBy);
 
         if(aliasMap.containsKey(data.orderBy)){
-            if(IsNullEmpty(data.orderByString)) data.orderByString = "aes";
+            if(IsNullEmpty(data.orderByString)) data.orderByString = "asc";
             SqlColumnModel cmOrder = aliasMap.get(data.orderBy);
             orderByString = MessageFormat.format("ORDER BY {0} {1}", cmOrder.getDisplayColumn(), data.orderByString);
         }
 
-        String mainSqlStrimg = MessageFormat.format("SELECT {0} \nFROM ({1}) AS T {2} \nGROUP BY {3} \nWHERE 1=1 {4} \n\n{5}",
-                colString, data.sub.getExecSql(), leftTableString, groupString, whereString, orderByString);
+        String mainSqlStrimg = MessageFormat.format("SELECT {0} \nFROM {1} AS T {2} \nWHERE 1=1 {3} \nGROUP BY {4} \n\n{5}",
+                colString, data.sub.getExecSql(), leftTableString, whereString, groupString, orderByString);
         System.out.println(mainSqlStrimg);
+        return mainSqlStrimg;
     }
 
 
@@ -127,7 +152,7 @@ public class GenSqlStringServiceImpl implements GenSqlStringService {
         return value == null || value.isEmpty();
     }
     public String genWhereString(SrTempfield stf){
-        if(stf.getOperation().isEmpty() || stf.getValue1().isEmpty())
+        if(IsNullEmpty(stf.getOperation()) || IsNullEmpty(stf.getValue1()))
             return genRemark("genWhereString", stf.getTempFeildId());
 
         if(stf.getOperation().equals("="))
@@ -141,8 +166,8 @@ public class GenSqlStringServiceImpl implements GenSqlStringService {
     }
 
     public String genWhereNumber(SrTempfield stf){
-        if(stf.getOperation().isEmpty() || stf.getValue1().isEmpty() ||
-                (stf.getOperation().equals("limit") && stf.getValue2().isEmpty()))
+        if(IsNullEmpty(stf.getOperation()) || IsNullEmpty(stf.getValue1()) ||
+                (stf.getOperation().equals("limit") && IsNullEmpty(stf.getValue2())))
             return genRemark("genWhereNumber", stf.getTempFeildId());
 
         if(stf.getOperation().equals("limit"))
@@ -153,21 +178,22 @@ public class GenSqlStringServiceImpl implements GenSqlStringService {
     }
 
     public String genWhereDate(SrTempfield stf){
-        if(stf.getOperation().isEmpty()) return genRemark("genWhereDate", stf.getTempFeildId());
+        if(IsNullEmpty(stf.getOperation())) return genRemark("genWhereDate", stf.getTempFeildId());
 
         String where = "";
-        if(!stf.getValue1().isEmpty())
+        if(!IsNullEmpty(stf.getValue1()))
             where += MessageFormat.format("\n\tAND T.{0} >= {1}", stf.getFieldAlias(),
                     "'"+stf.getValue1()+"'");
-        if(!stf.getValue2().isEmpty())
+        if(!IsNullEmpty(stf.getValue2()))
             where += MessageFormat.format("\n\tAND T.{0} <= {1}", stf.getFieldAlias(),
                     "'"+stf.getValue2()+"'");
 
-        return where.isEmpty()?genRemark("genWhereDate", stf.getTempFeildId()) : where;
+        return IsNullEmpty(where)?genRemark("genWhereDate", stf.getTempFeildId()) : where;
     }
 
     public String genRemark(String fun,String key) {
-        return "\n/*" + fun + " " + key + " is gen err*/";
+        //return "\n/*" + fun + " " + key + " is gen err*/";
+        return "";
     }
 
     public SrSubjectfield findFieldByFieldId(List<SrSubjectfield> fields, String fieldId){
@@ -186,7 +212,7 @@ public class GenSqlStringServiceImpl implements GenSqlStringService {
     public SqlColumnModel getSqlColumn(int isForeignKey, String filedAlias, String leftFieldId, String rightFieldId,
                                        String referencesTab, String displayColumn, int index){
         SqlColumnModel model = new SqlColumnModel();
-        if(isForeignKey==0 || leftFieldId.isEmpty() || rightFieldId.isEmpty() || referencesTab.isEmpty() || displayColumn.isEmpty()){
+        if(isForeignKey==0 || IsNullEmpty(leftFieldId) || IsNullEmpty(rightFieldId) || IsNullEmpty(referencesTab) || IsNullEmpty(displayColumn)){
             model.setIsForeignKey(false);
             model.setTableAlias("T");
             model.setDisplayColumn(MessageFormat.format("{0}.{1}","T", filedAlias));

+ 3 - 1
src/main/java/com/bowintek/practice/services/service/GenSqlStringService.java

@@ -5,7 +5,9 @@ import com.bowintek.practice.vo.temp.TempSaveResult;
 
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 public interface GenSqlStringService {
-    void Generation(TempObjectModel data, String userID);
+    String Generation(TempObjectModel data, String userID);
+    List<Map<String,Object>> getListBySqlString(String sqlString);
 }

+ 4 - 0
src/main/resources/mapping/cquery/TempCQuery.xml

@@ -14,6 +14,10 @@
         order by tmp.createTime desc
     </select>
 
+    <select id="getListBySqlString" resultType="java.util.HashMap">
+        #{sqlString}
+    </select>
+
     <select id="getListToHashMap" resultType="java.util.HashMap">
         select *
         from sr_saerchtemp st

BIN
target/classes/com/bowintek/practice/util/StringUtils.class


+ 39 - 6
vue/src/views/query/index.vue

@@ -30,16 +30,25 @@
                 :label-col="labelCol"
                 :model="formState.temp">
           <a-row :gutter="24" class="query-index-row">
-            <a-col :span="9">
+            <a-col :span="6">
               <a-form-item name="tempName"
                            :rules="[{ required: true, message: '请输入模板名称!' }]">
                 <template #label>
                   <span>模板名称</span>
                 </template>
-                <a-input v-model:value="formState.temp.tempName" placeholder="请输入模板名称,用以保存..." />
+                <a-input v-model:value="formState.temp.tempName" placeholder="..." />
               </a-form-item>
             </a-col>
-            <a-col :span="9">
+            <a-col :span="6">
+              <a-form-item name="tempNo"
+                           :rules="[{ required: true, message: '请输入模板编号!' }]">
+                <template #label>
+                  <span>模板编号</span>
+                </template>
+                <a-input v-model:value="formState.temp.tempNo" placeholder="..." />
+              </a-form-item>
+            </a-col>
+            <a-col :span="6">
               <a-form-item name="tempName"
                            :rules="[{ required: true, message: '至少选择一个主题字段!' }]">
                 <template #label>
@@ -52,6 +61,14 @@
               <a-button type="primary" html-type="submit" @click="onSelect">查询预览</a-button>
               <a-button html-type="submit" @click="onFinish" style="margin-left: 10px;">保存模板</a-button>
             </a-col>
+            <a-col :span="18">
+              <a-form-item name="remark">
+                <template #label>
+                  <span>备注</span>
+                </template>
+                <a-input v-model:value="formState.temp.remark" placeholder="..." />
+              </a-form-item>
+            </a-col>
 
             <a-col :span="24">
               <a-form-item>
@@ -92,6 +109,12 @@
       </div>
     </div>
   </div>
+
+  <a-modal v-model:visible="modal.open" title="生成Sql语句成功,调试窗口" width="60%">
+    <a-textarea v-model:value="modal.sqlString" placeholder="Basic usage" :rows="20" />
+    <template #footer> </template>
+  </a-modal>
+
 </template>
 
 <script lang="ts">
@@ -138,6 +161,11 @@ export default defineComponent({
       bases : []
     });
 
+    const modal = ref({
+      open : false,
+      sqlString : null
+    });
+
     const onFinish = () => {
       if(formRef.value == undefined){
         return;
@@ -160,8 +188,12 @@ export default defineComponent({
     };
 
     const onSelect= () =>{
-      save('temp/genTest', formStateGet()).then(result => {
-        console.log(result)
+      save('temp/genQuery', formStateGet()).then(result => {
+        console.log(result);
+        if(result["sqlString"]){
+          modal.value.open = true;
+          modal.value.sqlString = result["sqlString"];
+        }
       });
     }
 
@@ -273,7 +305,8 @@ export default defineComponent({
       dataList,
       columns,
       subjectTrees,
-      getSubjectTree
+      getSubjectTree,
+      modal
     };
   },
   created() {