Browse Source

模板生成页面,主题树生成

周壕 1 year ago
parent
commit
8b48f4e500

+ 10 - 0
src/main/java/com/bowintek/practice/controller/TempController.java

@@ -5,6 +5,7 @@ import com.bowintek.practice.filter.exception.BaseException;
 import com.bowintek.practice.filter.exception.BaseResponse;
 import com.bowintek.practice.filter.exception.RespGenerstor;
 import com.bowintek.practice.services.service.AccountService;
+import com.bowintek.practice.services.service.TempService;
 import com.bowintek.practice.services.service.system.RoleService;
 import com.bowintek.practice.vo.system.FunctionCodeModel;
 import com.bowintek.practice.vo.system.RoleFunctionCodeModel;
@@ -16,6 +17,7 @@ import lombok.Data;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.UUID;
 
@@ -24,12 +26,20 @@ import java.util.UUID;
 public class TempController {
     @Autowired
     private RoleService roleService;
+    @Autowired
+    private TempService tempService;
 
     @GetMapping("/getList")
     public BaseResponse<PageInfo<RoleModel>> getList(@RequestParam("page") int page, @RequestParam("rows") int rows, @RequestParam(required = false) String name, @RequestParam(required = false) Integer userTypeID) {
         return RespGenerstor.success(roleService.getList(page, rows, name, userTypeID));
     }
 
+    @ResponseBody
+    @GetMapping("/getSubjectTree")
+    public BaseResponse<List<HashMap<String, Object>>> getSubjectTree(@RequestParam(required = false) String tabName) {
+        return RespGenerstor.success(tempService.getSubjectTree(tabName));
+    }
+
     @GetMapping("get")
     public BaseResponse<RoleModel> get(@RequestParam(required = false) String id) {
         RoleModel data = roleService.get(id);

+ 9 - 0
src/main/java/com/bowintek/practice/mapper/cquery/SubjectCQuery.java

@@ -0,0 +1,9 @@
+package com.bowintek.practice.mapper.cquery;
+
+import java.util.HashMap;
+import java.util.List;
+
+public interface SubjectCQuery {
+    List<HashMap<String,Object>> getListToHashMap(String tabName);
+    List<HashMap<String,Object>> getSubjectFieldToHashMapList(List<String> subIdList);
+}

+ 10 - 0
src/main/java/com/bowintek/practice/model/SrTempdimension.java

@@ -17,6 +17,8 @@ public class SrTempdimension {
 
     private String dataType;
 
+    private String displayName;
+
     public String getTempFeildId() {
         return tempFeildId;
     }
@@ -80,4 +82,12 @@ public class SrTempdimension {
     public void setDataType(String dataType) {
         this.dataType = dataType == null ? null : dataType.trim();
     }
+
+    public String getDisplayName() {
+        return displayName;
+    }
+
+    public void setDisplayName(String displayName) {
+        this.displayName = displayName == null ? null : displayName.trim();
+    }
 }

+ 70 - 0
src/main/java/com/bowintek/practice/model/SrTempdimensionExample.java

@@ -653,6 +653,76 @@ public class SrTempdimensionExample {
             addCriterion("dataType not between", value1, value2, "dataType");
             return (Criteria) this;
         }
+
+        public Criteria andDisplayNameIsNull() {
+            addCriterion("displayName is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisplayNameIsNotNull() {
+            addCriterion("displayName is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisplayNameEqualTo(String value) {
+            addCriterion("displayName =", value, "displayName");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisplayNameNotEqualTo(String value) {
+            addCriterion("displayName <>", value, "displayName");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisplayNameGreaterThan(String value) {
+            addCriterion("displayName >", value, "displayName");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisplayNameGreaterThanOrEqualTo(String value) {
+            addCriterion("displayName >=", value, "displayName");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisplayNameLessThan(String value) {
+            addCriterion("displayName <", value, "displayName");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisplayNameLessThanOrEqualTo(String value) {
+            addCriterion("displayName <=", value, "displayName");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisplayNameLike(String value) {
+            addCriterion("displayName like", value, "displayName");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisplayNameNotLike(String value) {
+            addCriterion("displayName not like", value, "displayName");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisplayNameIn(List<String> values) {
+            addCriterion("displayName in", values, "displayName");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisplayNameNotIn(List<String> values) {
+            addCriterion("displayName not in", values, "displayName");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisplayNameBetween(String value1, String value2) {
+            addCriterion("displayName between", value1, value2, "displayName");
+            return (Criteria) this;
+        }
+
+        public Criteria andDisplayNameNotBetween(String value1, String value2) {
+            addCriterion("displayName not between", value1, value2, "displayName");
+            return (Criteria) this;
+        }
     }
 
     public static class Criteria extends GeneratedCriteria {

+ 80 - 0
src/main/java/com/bowintek/practice/services/impl/TempServiceImpl.java

@@ -0,0 +1,80 @@
+package com.bowintek.practice.services.impl;
+
+import com.bowintek.practice.enums.DataRangeEnum;
+import com.bowintek.practice.mapper.*;
+import com.bowintek.practice.mapper.cquery.SubjectCQuery;
+import com.bowintek.practice.model.*;
+import com.bowintek.practice.services.service.TempService;
+import com.bowintek.practice.services.service.UserService;
+import com.bowintek.practice.util.DateUtils;
+import com.bowintek.practice.vo.user.DataRange;
+import com.bowintek.practice.vo.user.UserInfoModel;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Component
+public class TempServiceImpl implements TempService {
+    @Autowired
+    SubjectCQuery subjectCQuery;
+
+    @Override
+    public List<HashMap<String, Object>> getSubjectTree(String likeName) {
+        List<HashMap<String, Object>> subjectTrees = subjectCQuery.getListToHashMap(likeName);
+        List<String> subIdList = subjectTrees.stream()
+                .map(m->m.get("subId").toString())
+                .collect(Collectors.toList());
+        List<HashMap<String, Object>> subFields = subjectCQuery.getSubjectFieldToHashMapList(subIdList);
+
+        //生成树标题,key
+        subjectTrees.stream().forEach(sub -> {
+            String subId = sub.get("subId").toString();
+            String subjectName = sub.get("subjectName").toString();
+            sub.put("title", sub.get("tabName").toString());
+            sub.put("key", subId);
+
+            List<HashMap<String, Object>> groups = new ArrayList<>();
+            //生成维度
+            HashMap<String, Object> dimension = new HashMap<>();
+            dimension.put("title", "维度");
+            dimension.put("key", sub.get("subId").toString() + "-维度");
+            dimension.put("children", findSubjectFields(subFields, subId, Arrays.asList(new Integer[]{1}),subjectName, "维度"));
+            groups.add(dimension);
+
+            //生成度量
+            HashMap<String, Object> measure = new HashMap<>();
+            measure.put("title", "度量");
+            measure.put("key", sub.get("subId").toString() + "-度量");
+            measure.put("children", findSubjectFields(subFields, subId, Arrays.asList(new Integer[]{2}),subjectName, "度量"));
+            groups.add(measure);
+
+            sub.put("children", groups);
+        });
+
+        return subjectTrees;
+    }
+    public List<HashMap<String, Object>> findSubjectFields(List<HashMap<String, Object>> subFields,
+                                                           String subId,
+                                                           List<Integer> queryTypeIds,
+                                                           String subjectName,
+                                                           String groupName){
+        List<HashMap<String, Object>> fields = subFields.stream()
+                .filter(x -> subId.equals((String) x.get("subId"))
+                        && queryTypeIds.indexOf(x.get("settingTypeId"))>=0)
+                .collect(Collectors.toList());
+
+        //生成树标题,key
+        fields.stream().forEach(field -> {
+            field.put("title", field.get("fieldName").toString());
+            field.put("key", field.get("fieldId").toString());
+            field.put("subjectName", subjectName);
+
+            field.put("subId", subId+"-"+groupName);
+        });
+        return fields;
+    }
+}

+ 10 - 0
src/main/java/com/bowintek/practice/services/service/TempService.java

@@ -0,0 +1,10 @@
+package com.bowintek.practice.services.service;
+
+import com.bowintek.practice.model.SysMenu;
+
+import java.util.HashMap;
+import java.util.List;
+
+public interface TempService {
+    List<HashMap<String,Object>> getSubjectTree(String likeName);
+}

+ 3 - 1
src/main/java/com/bowintek/practice/vo/temp/TempDimensionModel.java

@@ -14,11 +14,13 @@ public class TempDimensionModel {
 
     private Short disOrder;
 
+    private String fieldCode;
+
     private String fieldName;
 
     private String fieldAlias;
 
     private String dataType;
 
-    private String operation;
+    private String displayName;
 }

+ 5 - 1
src/main/java/com/bowintek/practice/vo/temp/TempMeasureModel.java

@@ -10,15 +10,19 @@ public class TempMeasureModel {
 
     private String fieldId;
 
-    private String functionId;
+    private String functionName;
 
     private Short disOrder;
 
+    private String fieldCode;
+
     private String fieldName;
 
     private String fieldAlias;
 
     private String dataType;
 
+    private String displayName;
+
     private String operation;
 }

+ 6 - 4
src/main/java/com/bowintek/practice/vo/temp/TempObjectModel.java

@@ -1,13 +1,15 @@
 package com.bowintek.practice.vo.temp;
 
+import com.bowintek.practice.model.*;
 import lombok.Data;
 
 import java.util.Date;
 import java.util.List;
 
 @Data
-public class TempObjectModel extends TempModel {
-    public List<TempDimensionModel> bases;
-    public List<TempWhereModel> wheres;
-    public List<TempMeasureModel> measures;
+public class TempObjectModel {
+    public SrSaerchtemp temp;
+    public List<SrTempdimension> bases;
+    public List<SrTempfield> wheres;
+    public List<SrTempmeasure> measures;
 }

+ 2 - 0
src/main/java/com/bowintek/practice/vo/temp/TempWhereModel.java

@@ -16,6 +16,8 @@ public class TempWhereModel {
 
     private Integer disOrder;
 
+    private String fieldCode;
+
     private String fieldName;
 
     private String fieldAlias;

+ 0 - 258
src/main/resources/mapping/SrTempdimensionMapper.xml

@@ -1,258 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.bowintek.practice.mapper.SrTempdimensionMapper">
-  <resultMap id="BaseResultMap" type="com.bowintek.practice.model.SrTempdimension">
-    <id column="tempFeildId" jdbcType="VARCHAR" property="tempFeildId" />
-    <result column="tempId" jdbcType="VARCHAR" property="tempId" />
-    <result column="fieldId" jdbcType="VARCHAR" property="fieldId" />
-    <result column="disOrder" jdbcType="DECIMAL" property="disOrder" />
-    <result column="fieldCode" jdbcType="VARCHAR" property="fieldCode" />
-    <result column="fieldName" jdbcType="VARCHAR" property="fieldName" />
-    <result column="fieldAlias" jdbcType="VARCHAR" property="fieldAlias" />
-    <result column="dataType" jdbcType="VARCHAR" property="dataType" />
-  </resultMap>
-  <sql id="Example_Where_Clause">
-    <where>
-      <foreach collection="oredCriteria" item="criteria" separator="or">
-        <if test="criteria.valid">
-          <trim prefix="(" prefixOverrides="and" suffix=")">
-            <foreach collection="criteria.criteria" item="criterion">
-              <choose>
-                <when test="criterion.noValue">
-                  and ${criterion.condition}
-                </when>
-                <when test="criterion.singleValue">
-                  and ${criterion.condition} #{criterion.value}
-                </when>
-                <when test="criterion.betweenValue">
-                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
-                </when>
-                <when test="criterion.listValue">
-                  and ${criterion.condition}
-                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
-                    #{listItem}
-                  </foreach>
-                </when>
-              </choose>
-            </foreach>
-          </trim>
-        </if>
-      </foreach>
-    </where>
-  </sql>
-  <sql id="Update_By_Example_Where_Clause">
-    <where>
-      <foreach collection="example.oredCriteria" item="criteria" separator="or">
-        <if test="criteria.valid">
-          <trim prefix="(" prefixOverrides="and" suffix=")">
-            <foreach collection="criteria.criteria" item="criterion">
-              <choose>
-                <when test="criterion.noValue">
-                  and ${criterion.condition}
-                </when>
-                <when test="criterion.singleValue">
-                  and ${criterion.condition} #{criterion.value}
-                </when>
-                <when test="criterion.betweenValue">
-                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
-                </when>
-                <when test="criterion.listValue">
-                  and ${criterion.condition}
-                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
-                    #{listItem}
-                  </foreach>
-                </when>
-              </choose>
-            </foreach>
-          </trim>
-        </if>
-      </foreach>
-    </where>
-  </sql>
-  <sql id="Base_Column_List">
-    tempFeildId, tempId, fieldId, disOrder, fieldCode, fieldName, fieldAlias, dataType
-  </sql>
-  <select id="selectByExample" parameterType="com.bowintek.practice.model.SrTempdimensionExample" resultMap="BaseResultMap">
-    select
-    <if test="distinct">
-      distinct
-    </if>
-    <include refid="Base_Column_List" />
-    from sr_tempdimension
-    <if test="_parameter != null">
-      <include refid="Example_Where_Clause" />
-    </if>
-    <if test="orderByClause != null">
-      order by ${orderByClause}
-    </if>
-  </select>
-  <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
-    select 
-    <include refid="Base_Column_List" />
-    from sr_tempdimension
-    where tempFeildId = #{tempFeildId,jdbcType=VARCHAR}
-  </select>
-  <delete id="deleteByPrimaryKey" parameterType="java.lang.String">
-    delete from sr_tempdimension
-    where tempFeildId = #{tempFeildId,jdbcType=VARCHAR}
-  </delete>
-  <delete id="deleteByExample" parameterType="com.bowintek.practice.model.SrTempdimensionExample">
-    delete from sr_tempdimension
-    <if test="_parameter != null">
-      <include refid="Example_Where_Clause" />
-    </if>
-  </delete>
-  <insert id="insert" parameterType="com.bowintek.practice.model.SrTempdimension">
-    insert into sr_tempdimension (tempFeildId, tempId, fieldId, 
-      disOrder, fieldCode, fieldName, 
-      fieldAlias, dataType)
-    values (#{tempFeildId,jdbcType=VARCHAR}, #{tempId,jdbcType=VARCHAR}, #{fieldId,jdbcType=VARCHAR}, 
-      #{disOrder,jdbcType=DECIMAL}, #{fieldCode,jdbcType=VARCHAR}, #{fieldName,jdbcType=VARCHAR}, 
-      #{fieldAlias,jdbcType=VARCHAR}, #{dataType,jdbcType=VARCHAR})
-  </insert>
-  <insert id="insertSelective" parameterType="com.bowintek.practice.model.SrTempdimension">
-    insert into sr_tempdimension
-    <trim prefix="(" suffix=")" suffixOverrides=",">
-      <if test="tempFeildId != null">
-        tempFeildId,
-      </if>
-      <if test="tempId != null">
-        tempId,
-      </if>
-      <if test="fieldId != null">
-        fieldId,
-      </if>
-      <if test="disOrder != null">
-        disOrder,
-      </if>
-      <if test="fieldCode != null">
-        fieldCode,
-      </if>
-      <if test="fieldName != null">
-        fieldName,
-      </if>
-      <if test="fieldAlias != null">
-        fieldAlias,
-      </if>
-      <if test="dataType != null">
-        dataType,
-      </if>
-    </trim>
-    <trim prefix="values (" suffix=")" suffixOverrides=",">
-      <if test="tempFeildId != null">
-        #{tempFeildId,jdbcType=VARCHAR},
-      </if>
-      <if test="tempId != null">
-        #{tempId,jdbcType=VARCHAR},
-      </if>
-      <if test="fieldId != null">
-        #{fieldId,jdbcType=VARCHAR},
-      </if>
-      <if test="disOrder != null">
-        #{disOrder,jdbcType=DECIMAL},
-      </if>
-      <if test="fieldCode != null">
-        #{fieldCode,jdbcType=VARCHAR},
-      </if>
-      <if test="fieldName != null">
-        #{fieldName,jdbcType=VARCHAR},
-      </if>
-      <if test="fieldAlias != null">
-        #{fieldAlias,jdbcType=VARCHAR},
-      </if>
-      <if test="dataType != null">
-        #{dataType,jdbcType=VARCHAR},
-      </if>
-    </trim>
-  </insert>
-  <select id="countByExample" parameterType="com.bowintek.practice.model.SrTempdimensionExample" resultType="java.lang.Long">
-    select count(*) from sr_tempdimension
-    <if test="_parameter != null">
-      <include refid="Example_Where_Clause" />
-    </if>
-  </select>
-  <update id="updateByExampleSelective" parameterType="map">
-    update sr_tempdimension
-    <set>
-      <if test="row.tempFeildId != null">
-        tempFeildId = #{row.tempFeildId,jdbcType=VARCHAR},
-      </if>
-      <if test="row.tempId != null">
-        tempId = #{row.tempId,jdbcType=VARCHAR},
-      </if>
-      <if test="row.fieldId != null">
-        fieldId = #{row.fieldId,jdbcType=VARCHAR},
-      </if>
-      <if test="row.disOrder != null">
-        disOrder = #{row.disOrder,jdbcType=DECIMAL},
-      </if>
-      <if test="row.fieldCode != null">
-        fieldCode = #{row.fieldCode,jdbcType=VARCHAR},
-      </if>
-      <if test="row.fieldName != null">
-        fieldName = #{row.fieldName,jdbcType=VARCHAR},
-      </if>
-      <if test="row.fieldAlias != null">
-        fieldAlias = #{row.fieldAlias,jdbcType=VARCHAR},
-      </if>
-      <if test="row.dataType != null">
-        dataType = #{row.dataType,jdbcType=VARCHAR},
-      </if>
-    </set>
-    <if test="example != null">
-      <include refid="Update_By_Example_Where_Clause" />
-    </if>
-  </update>
-  <update id="updateByExample" parameterType="map">
-    update sr_tempdimension
-    set tempFeildId = #{row.tempFeildId,jdbcType=VARCHAR},
-      tempId = #{row.tempId,jdbcType=VARCHAR},
-      fieldId = #{row.fieldId,jdbcType=VARCHAR},
-      disOrder = #{row.disOrder,jdbcType=DECIMAL},
-      fieldCode = #{row.fieldCode,jdbcType=VARCHAR},
-      fieldName = #{row.fieldName,jdbcType=VARCHAR},
-      fieldAlias = #{row.fieldAlias,jdbcType=VARCHAR},
-      dataType = #{row.dataType,jdbcType=VARCHAR}
-    <if test="example != null">
-      <include refid="Update_By_Example_Where_Clause" />
-    </if>
-  </update>
-  <update id="updateByPrimaryKeySelective" parameterType="com.bowintek.practice.model.SrTempdimension">
-    update sr_tempdimension
-    <set>
-      <if test="tempId != null">
-        tempId = #{tempId,jdbcType=VARCHAR},
-      </if>
-      <if test="fieldId != null">
-        fieldId = #{fieldId,jdbcType=VARCHAR},
-      </if>
-      <if test="disOrder != null">
-        disOrder = #{disOrder,jdbcType=DECIMAL},
-      </if>
-      <if test="fieldCode != null">
-        fieldCode = #{fieldCode,jdbcType=VARCHAR},
-      </if>
-      <if test="fieldName != null">
-        fieldName = #{fieldName,jdbcType=VARCHAR},
-      </if>
-      <if test="fieldAlias != null">
-        fieldAlias = #{fieldAlias,jdbcType=VARCHAR},
-      </if>
-      <if test="dataType != null">
-        dataType = #{dataType,jdbcType=VARCHAR},
-      </if>
-    </set>
-    where tempFeildId = #{tempFeildId,jdbcType=VARCHAR}
-  </update>
-  <update id="updateByPrimaryKey" parameterType="com.bowintek.practice.model.SrTempdimension">
-    update sr_tempdimension
-    set tempId = #{tempId,jdbcType=VARCHAR},
-      fieldId = #{fieldId,jdbcType=VARCHAR},
-      disOrder = #{disOrder,jdbcType=DECIMAL},
-      fieldCode = #{fieldCode,jdbcType=VARCHAR},
-      fieldName = #{fieldName,jdbcType=VARCHAR},
-      fieldAlias = #{fieldAlias,jdbcType=VARCHAR},
-      dataType = #{dataType,jdbcType=VARCHAR}
-    where tempFeildId = #{tempFeildId,jdbcType=VARCHAR}
-  </update>
-</mapper>

+ 23 - 0
src/main/resources/mapping/cquery/SubjectCQuery.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.bowintek.practice.mapper.cquery.SubjectCQuery">
+    <select id="getListToHashMap" resultType="java.util.HashMap">
+        select *
+        from sr_subject sub
+        where 1=1
+        <if test="tabName!='' and tabName!=null">
+            and sub.tabName like Concat('%',#{tabName},'%')
+        </if>
+        order by sub.tabName
+    </select>
+    <select id="getSubjectFieldToHashMapList" resultType="java.util.HashMap">
+        select *
+        from sr_subjectfield sf
+        where 1=1
+        and subId in
+        <foreach collection="subIdList" item="subId" index="index" open="(" close=")" separator=",">
+            #{subId}
+        </foreach>
+        order by sf.disOrder
+    </select>
+</mapper>

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

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.bowintek.practice.mapper.cquery.TempCQuery">
+    <select id="getListToHashMap" resultType="java.util.HashMap">
+        select *
+        from sr_subject sub
+        where 1=1
+        <if test="tabName!='' and tabName!=null">
+            and sub.tabName like Concat('%',#{tabName},'%')
+        </if>
+        order by sub.tabName
+    </select>
+</mapper>

+ 37 - 15
vue/src/components/basic/query/drag-base.vue

@@ -29,11 +29,14 @@
   </a-modal>
 </template>
 <script lang="ts">
-  import {defineComponent} from "vue";
+  import {defineComponent, computed} from "vue";
+  //import {message} from "ant-design-vue";
+
   export  default defineComponent ({
     props:{
       queryType : String,
-      keyName : String
+      keyName : String,
+      subjectId : String
     },
     emits: ['change'],
     name : 'DragBase',
@@ -54,14 +57,18 @@
     setup(props, context){
       console.log("base setup" , props);
 
-      const dataChange = (obj) => {
-        context.emit('change', obj)
+      const dataChange = (list, obj) => {
+        context.emit('change', list, obj)
       }
+      const subjectId = computed(() => {
+        return props.subjectId? props.subjectId : null
+      });
 
       return{
         queryType: props.queryType ? props.queryType : 'dimen',
         keyName : props.keyName == null || props.keyName == undefined ? 'tempFeildId' : props.keyName,
-        dataChange
+        dataChange,
+        subjectId
       }
     },
     mounted(){
@@ -80,7 +87,10 @@
           fieldName: data.fieldName,
           isDrag: 1,
           displayName: data.displayName ? data.displayName : null,
-          operation: data.operation ? data.operation : 'sum'
+          operation: data.operation ? data.operation : 'sum',
+
+          subId : data.subId? data.subId : null,
+          subjectName : data.subjectName? data.subjectName : null
         };
       },
       handleDragOver : function (ev) {
@@ -88,13 +98,21 @@
         this.counter++;
         const data = window["dragData"];
         console.log("keyName", this.keyName, data[this.keyName])
-        const tag = this.findTag(data[this.keyName]);
 
-        if(tag!=null) return;
+        const tag = this.findTag(data[this.keyName]);
+        if(tag != null) return;
         this.index = this.tagList.length;
 
-        this.tagList.push(this.getObject(data));
-        console.log("handleDragOver", data, tag, this.tagList);
+        const obj = this.getObject(data);
+        //检查主题是否合法
+        console.log("handleDragOver", data, obj, this.tagList);
+        if(obj.subId==null || obj.subjectName==null) return; //主题不合法
+        if(this.subjectId && this.subjectId != obj.subId) {
+          //message.error("无法放置,同一模板只能放置统一主题的维度、度量!");
+          return;//有主题,但是和当前模板中的主题不同
+        }
+
+        this.tagList.push(obj);
       },
       handleDrop : function (ev) {
         ev.preventDefault();
@@ -106,7 +124,7 @@
         this.tagList[tag.index]['isDrag'] = 0;
         this.index = -1;
         this.counter = 0;
-        this.dataChange(this.getTagList());
+        this.dataChange(this.getTagList(), this.tagList[tag.index]);
       },
       handleDragleave : function(ev) {
         console.log(ev);
@@ -119,7 +137,7 @@
         if(this.counter==0) {
           this.tagList.splice(tag.index,1);
           this.index = -1;
-          this.dataChange(this.getTagList());
+          this.dataChange(this.getTagList(), null);
         }
       },
       childDragEnter : function (ev, index) {
@@ -129,13 +147,17 @@
         if(index == this.index || this.index==-1) return;
 
         const data = window["dragData"];
+        //检查主题是否合法
+        if(data.subId==null || data.subjectName==null) return; //主题不合法
+        if(this.subjectId && this.subjectId != data.subId) return;//有主题,但是和当前模板中的主题不同
+
         this.tagList.splice(this.index,1)
         this.index = index;
 
         this.tagList.splice(index, 0, this.getObject(data));
         console.log("childDragEnter","位置切换");
 
-        this.dataChange(this.getTagList());
+        this.dataChange(this.getTagList(), this.getObject(data));
       },
       childDragleave : function (ev) {
         ev.preventDefault();
@@ -148,13 +170,13 @@
         setTimeout(()=>{
           this.tagList.splice(index,1);
           console.log("childDragstart", window["dragData"], index, this.tagList);
-          this.dataChange(this.getTagList());
+          this.dataChange(this.getTagList(), null);
         },20);
       },
       childDelete : function (index){
         this.index = -1;
         this.tagList.splice(index,1);
-        this.dataChange(this.getTagList());
+        this.dataChange(this.getTagList(), null);
       },
       findTag : function (key) {
         for (let i = 0; i < this.tagList.length; i++) {

+ 8 - 4
vue/src/components/basic/query/drag-measure.vue

@@ -1,4 +1,5 @@
 <script lang="ts">
+  import {computed} from "vue";
   import DragBase from './drag-base.vue'
   import type {SelectProps} from 'ant-design-vue';
 
@@ -18,15 +19,18 @@
     },
     setup(props, context){
       console.log("measure setup" , props);
-      const dataChange = (obj) => {
-        console.log("dataChange==",obj);
-        context.emit('change', obj)
+      const dataChange = (list, obj) => {
+        context.emit('change', list, obj)
       }
+      const subjectId = computed(() => {
+        return props.subjectId? props.subjectId : null
+      });
 
       return{
         queryType: props.queryType ? props.queryType : 'dimen',
         keyName : props.keyName == null || props.keyName == undefined ? 'tempFeildId' : props.keyName,
-        dataChange
+        dataChange,
+        subjectId
       }
     },
     methods:{

+ 16 - 7
vue/src/components/basic/query/drag-where.vue

@@ -86,7 +86,7 @@
   </a-modal>
 </template>
 <script lang="ts">
-  import {defineComponent} from "vue";
+  import {defineComponent, computed} from "vue";
   import DragBase from './drag-base.vue'
   import type {SelectProps} from 'ant-design-vue';
   import type { Dayjs } from 'dayjs';
@@ -118,14 +118,19 @@
     },
     setup(props, context){
       console.log("measure setup" , props);
-      const dataChange = (obj) => {
-        context.emit('change', obj)
+
+      const dataChange = (list, obj) => {
+        context.emit('change', list, obj)
       }
+      const subjectId = computed(() => {
+        return props.subjectId? props.subjectId : null
+      });
 
       return{
         queryType: props.queryType ? props.queryType : 'dimen',
         keyName : props.keyName == null || props.keyName == undefined ? 'tempFeildId' : props.keyName,
-        dataChange
+        dataChange,
+        subjectId
       }
     },
     methods:{
@@ -142,7 +147,10 @@
           isDrag : 1,
           displayName: data.displayName ? data.displayName : null,
           values : data.values ? data.values :
-            [{ operation : (this.convertDataType(data.dataType)==2?'date':'='), val :'', val2 : '' }]
+            [{ operation : (this.convertDataType(data.dataType)==2?'date':'='), val :'', val2 : '' }],
+
+          subId : data.subId? data.subId : null,
+          subjectName : data.subjectName? data.subjectName : null
         };
       },
       operationInsert(index){
@@ -151,10 +159,11 @@
       operationDelete(index, idx){
         this.tagList[index].values.splice(idx, 1);
       },
-      convertDataType(typeStr){
+      convertDataType(typeStr:string){
+        typeStr = typeStr.toLowerCase();
         if(["char","varchar","text"].indexOf(typeStr)>=0) return 0;
         if(["int","bigint","decimal"].indexOf(typeStr)>=0) return 1;
-        if(["dtime"].indexOf(typeStr)>=0) return 2;
+        if(["date"].indexOf(typeStr)>=0) return 2;
       },
       onRangeChange(value: [Dayjs, Dayjs], dateString: [string, string]) {
         console.log('Selected Time: ', value);

+ 0 - 12
vue/src/main.ts

@@ -38,18 +38,6 @@ async function setupApp() {
   await setupRouter(app);
 
   app.mount('#app');
-
-  //增加拖放指令,用于维度、度量拖放
-  app.directive('dragtheme', (el, data) =>{
-    el.draggable = true;
-    el.ondragstart = function (event){
-      event.dataTransfer.setData("dragData", data.value);
-      data.value.tempFeildId = new Date().getTime()+'';
-
-      window["dragData"] = data.value;
-      console.log("binding",data.value, event, event.dataTransfer.getData("dragData"));
-    }
-  });
 }
 
 setupPlugins();

+ 121 - 22
vue/src/views/query/index.vue

@@ -1,20 +1,51 @@
 <template>
   <div class="query-index">
-    <div class="query-index-tree"></div>
+    <div class="query-index-tree">
+      <div class="query-index-tree-search">
+        <a-input-search
+          v-model:value="value"
+          placeholder="主题名称关键字..."
+          @search="onSearch"
+        />
+      </div>
+      <div class="query-index-tree-box">
+        <a-tree
+          :show-line="true"
+          v-model:expandedKeys="subjectTrees.expandedKeys"
+          :tree-data="subjectTrees.data">
+          <template #title="{ title, key, subId, fieldCode, fieldId, fieldName, fieldAlias, dataType, subjectName }">
+            <div v-if="(fieldAlias)" class="query-index-tree-item"
+                 draggable="true"
+                 @dragstart="onDragStart($event,{subId,fieldCode, fieldId, fieldName, fieldAlias, dataType, subjectName})"
+            >{{ title }}</div>
+            <div v-else class="query-index-tree-item">{{ title }}</div>
+          </template>
+        </a-tree>
+      </div>
+    </div>
     <div class="query-index-content">
       <div class="query-index-form">
         <a-form ref="formRef" name="fromQuery"
                 class="ant-advanced-search-form"
                 :label-col="labelCol"
-                :model="formState">
+                :model="formState.temp">
           <a-row :gutter="24">
-            <a-col :span="18">
+            <a-col :span="9">
               <a-form-item name="tempName"
                            :rules="[{ required: true, message: '请输入模板名称!' }]">
                 <template #label>
                   <span>模板名称</span>
                 </template>
-                <a-input v-model:value="formState.tempName" placeholder="请输入模板名称,用以保存..." />
+                <a-input v-model:value="formState.temp.tempName" placeholder="请输入模板名称,用以保存..." />
+              </a-form-item>
+            </a-col>
+            <a-col :span="9">
+              <a-form-item name="tempName"
+                           :rules="[{ required: true, message: '至少选择一个主题字段!' }]">
+                <template #label>
+                  <span>主题</span>
+                </template>
+                <a-input v-model:value="formState.sub.subjectName" placeholder="..." disabled="true" />
               </a-form-item>
             </a-col>
             <a-col :span="6" style="text-align: left">
@@ -28,7 +59,7 @@
                   <SearchOutlined style="color: #8DC6F9;"/>
                   <span>筛选</span>
                 </template>
-                <DragWhere ref="where" @change="onChangeWhere" query-type="where"></DragWhere>
+                <DragWhere ref="where" @change="onChangeWhere" query-type="where" :subjectId="formState.temp.subId"></DragWhere>
               </a-form-item>
             </a-col>
 
@@ -38,7 +69,7 @@
                   <ColumnHeightOutlined style="color: #8DC6F9;"/>
                   <span>维度</span>
                 </template>
-                <DragBase ref="base" @change="onChangeBase"></DragBase>
+                <DragBase ref="base" @change="onChangeBase" :subjectId="formState.temp.subId"></DragBase>
               </a-form-item>
             </a-col>
 
@@ -48,7 +79,7 @@
                   <ColumnWidthOutlined style="color: #8DC6F9;"/>
                   <span>度量</span>
                 </template>
-                <DragMeasure ref="measure" @change="onChangeMeasure" query-type="measure"></DragMeasure>
+                <DragMeasure ref="measure" @change="onChangeMeasure" query-type="measure" :subjectId="formState.temp.subId"></DragMeasure>
               </a-form-item>
             </a-col>
           </a-row>
@@ -70,8 +101,9 @@ import {useRoute} from 'vue-router';
 import DragWhere from '@/components/basic/query/drag-where.vue'
 import DragBase from '@/components/basic/query/drag-base.vue'
 import DragMeasure from '@/components/basic/query/drag-measure.vue'
-import {save} from "@/api/common";
+import {save, get} from "@/api/common";
 import type {TableColumnsType} from 'ant-design-vue';
+import type { TreeProps } from 'ant-design-vue';
 
 export default defineComponent({
   name: 'queryindex',
@@ -83,12 +115,22 @@ export default defineComponent({
     const measure = ref<typeof DragMeasure>();
     const base = ref<typeof DragBase>();
     const where = ref<typeof DragWhere>();
+    const subjectTrees = ref({
+      data :[] as TreeProps['treeData'],
+      expandedKeys : ['']
+    });
     const formState = ref({
-      tempId: '',
-      tempName: '',
-      tempNo: '',
-      subId: null,
-      remark: '',
+      temp : {
+        tempId: '',
+        tempName: '',
+        tempNo: '',
+        subId: null,
+        remark: '',
+      },
+      sub : {
+        subId: null,
+        subjectName: '',
+      },
       measures : [],
       wheres : [],
       bases : []
@@ -104,25 +146,65 @@ export default defineComponent({
         formState.value.bases = (base.value as any).getTagList();
         console.log("formState", formState);
 
+
         save('temp/save', formState.value).then(result => {
           console.log(result);
         });
       });
     }
 
-    const onChangeMeasure = (list) => {
-      console.log("onChangeMeasure", arguments, list);
+    const onDragStart = (event, obj) =>{
+      event.dataTransfer.setData("dragData", "-");
+      obj.tempFeildId = new Date().getTime()+'';
+      window["dragData"] = obj;
+      console.log("onDragStart", obj);
+    }
+    const getSubjectTree = async function (tabName : string) {
+      //loading.value = true;
+      subjectTrees.value.data = await get('temp/getSubjectTree', {tabName : tabName});
+      //计算第一个展开节点
+      subjectTrees.value.expandedKeys = [];
+      if(subjectTrees.value.data && subjectTrees.value.data.length>0){
+        subjectTrees.value.expandedKeys.push(subjectTrees.value.data[0].key+"");
+        subjectTrees.value.data[0].children?.forEach((it)=>{
+          subjectTrees.value.expandedKeys.push(it.key+"");
+        });
+      }
+      console.log("getSubjectTree",subjectTrees.value,subjectTrees.value.expandedKeys);
+    }
+    getSubjectTree('');
+
+    const onChangeMeasure = (list, obj) => {
+      console.log("onChangeMeasure", arguments, list, obj);
       formState.value.measures = list;
       readerTable();
+      checkSubjectId(obj);
     }
-    const onChangeWhere = (list) => {
-      console.log("onChangeWhere", arguments, list);
+    const onChangeWhere = (list, obj) => {
+      console.log("onChangeWhere", arguments, list, obj);
       formState.value.wheres = list;
+      readerTable();
+      checkSubjectId(obj);
     }
-    const onChangeBase = (list) => {
-      console.log("onChangeBase", arguments, list);
+    const onChangeBase = (list, obj) => {
+      console.log("onChangeBase", arguments, list, obj);
       formState.value.bases = list;
       readerTable();
+      checkSubjectId(obj);
+    }
+
+    const checkSubjectId = (obj)=>{
+      if(formState.value.temp.subId==null && obj!=null) {
+        formState.value.temp.subId = obj.subId;
+        formState.value.sub.subId = obj.subId;
+        formState.value.sub.subjectName = obj.subjectName;
+      }
+      if(formState.value.bases.length + formState.value.measures.length + formState.value.wheres.length <= 0) {
+        formState.value.temp.subId = null;
+        formState.value.sub.subId = null;
+        formState.value.sub.subjectName = '';
+      }
+      console.log("formState.value.temp.subId", formState.value.temp.subId)
     }
 
     const dataList = ref([]);
@@ -134,7 +216,7 @@ export default defineComponent({
       let rtns: TableColumnsType = [];
       bases.concat(measures).forEach((it)=>{
         rtns.push({
-          title: it.fieldAlias?it.fieldAlias:it.fieldName,
+          title: it.displayName?it.displayName:it.fieldName,
           dataIndex: it.fieldId + it.disOrder,
           key: it.fieldId + it.disOrder,
           align:"center"});
@@ -156,9 +238,12 @@ export default defineComponent({
       onChangeMeasure,
       onChangeWhere,
       onChangeBase,
+      onDragStart,
+      checkSubjectId,
 
       dataList,
-      columns
+      columns,
+      subjectTrees
     };
   },
   created() {
@@ -186,7 +271,7 @@ export default defineComponent({
     background-color: white;
   }
   .query-index-tree{
-    min-width: 200px;
+    min-width: 260px;
     border-right: 2px solid #f2f2f2;
     margin-right: 5px;
   }
@@ -205,4 +290,18 @@ export default defineComponent({
   .tabs-view-content{
     padding: 0px;
   }
+  .query-index-tree-item{
+    white-space: nowrap;  /*强制span不换行*/
+    display: inline-block;  /*将span当做块级元素对待*/
+    text-overflow: ellipsis;  /*超出部分以点号代替*/
+  }
+  .query-index-tree-search{
+    padding: 5px;
+    border-bottom: 2px solid #f2f2f2;
+  }
+  .query-index-tree-box{
+    padding: 5px;
+    padding-top: 10px;
+    overflow:auto;
+  }
 </style>