wangting
2024-09-06 e937d0111a52e2c13c50bbc3386d20a12d125899
Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/linkTypeQuery/formQueryDialog.vue
@@ -6,27 +6,116 @@
      <el-button  plain size="mini" type="primary" @click="delAll">删除全部条件</el-button>
    </div>
    <div v-if="radioForm==0" @drop="drop" @dragover.prevent style="height: 220px;text-align: center;">
      <div v-for="condition in conditionList" class="el-input--small" style="margin-bottom: 5px;">
        <span style="width: 150px;display: inline-block;text-align: right" :title="condition.clause">{{condition.clause}}</span>
        <avue-select v-model="condition.operator" type="tree" :dic="operatorDic" :clearable="false" style="width: 80px;margin: 0 5px;"></avue-select>
        <avue-input v-model="condition.ordinaryValue" placeholder="" style="width: 300px;margin-right: 5px;"></avue-input>
        <el-button  plain size="mini" type="primary" @click="delAll">选择查询模板</el-button>
      <div v-for="(condition,index) in conditionList" :key="index" class="el-input--small" style="margin-bottom: 5px; text-align:left">
        <span style="width: 200px;display: inline-block;text-align: right" :title="condition.clause">{{condition.clause}}</span>
        <avue-select v-model="condition.operator" type="tree" :dic="condition.operatorDic" :clearable="false" style="width: 80px;margin: 0 5px;"></avue-select>
        <el-date-picker v-if="condition.type=='VTDate'" v-model="condition.ordinaryValue" style="width:300px;margin-right: 5px;display: inline-block;" value-format="YYYY-MM-DD"
                        type="date">
        </el-date-picker>
        <el-date-picker v-else-if="condition.type=='VTDateTime'" v-model="condition.ordinaryValue" style="width:300px;margin-right: 5px;display: inline-block;"
                        type="datetime">
        </el-date-picker>
        <el-time-select v-else-if="condition.type=='VTTime'" v-model="condition.ordinaryValue" value-format="HH:mm:ss" style="width:300px;margin-right: 5px;display: inline-block;">
        </el-time-select>
        <avue-input-number v-else-if="condition.type=='VTInteger'" precision="0" v-model="condition.ordinaryValue" style="width:300px;margin-right: 5px;display: inline-block;"></avue-input-number>
        <avue-input-number v-else-if="condition.type=='VTLong' || condition.type=='VTDouble'" v-model="condition.ordinaryValue" style="width:300px;margin-right: 5px;display: inline-block;"></avue-input-number>
        <avue-input v-else v-model="condition.ordinaryValue" placeholder="" style="width: 300px;margin-right: 5px;"></avue-input>
        <el-button  plain size="mini" type="primary" @click="checkTemp(index)">选择查询模板</el-button>
        <el-button  size="mini" type="danger" icon="el-icon-delete" @click="delCondition(index)" style="padding: 7px 8px"></el-button>
      </div>
    </div>
    <div v-else style="height: 220px;text-align: left">
      <avue-tree style="height: 220px" :data="treeData" :option="treeOption"></avue-tree>
    <div v-else @drop="drop" @dragover.prevent style="height: 220px;text-align: left">
      <avue-tree ref="tree" @node-drop="handleDrop" style="height: 220px" :data="treeData" :option="treeOption"  @node-click="nodeClick" node-key="value"></avue-tree>
    </div>
    <div style="text-align: right;margin-top: 10px;">
      <el-button v-if="radioForm==1"  plain size="mini" type="primary" @click="addHandler">增加逻辑</el-button>
      <el-button v-if="radioForm==1"  plain size="mini" type="primary" @click="del">修改条件</el-button>
      <el-button v-if="radioForm==1"  plain size="mini" type="primary" @click="del">删除</el-button>
      <el-button  plain size="mini" type="primary" @click="del">查询</el-button>
      <el-button  plain size="mini" type="primary" @click="del">取消</el-button>
      <el-button v-if="radioForm==1"  plain size="mini" type="primary" @click="editHandler">修改条件</el-button>
      <el-button v-if="radioForm==1"  plain size="mini" type="primary" @click="delHandler">删除</el-button>
      <el-button  plain size="mini" type="primary" @click="queryHandler">查询</el-button>
      <el-button  plain size="mini" type="primary" @click="">取消</el-button>
    </div>
    <!--修改条件-->
    <el-dialog v-dialogDrag
               :title="dialog.title"
               :visible.sync="dialog.showDialog"
               width="550px"
               :append-to-body="true"
               class="avue-dialog"
               :destroy-on-close="true"
               :close-on-click-modal="false"
               @close="dialog.showDialog=false">
      <div style="height: 200px;">
        {{clickNode.showLabel}}
        <avue-select v-if="['VTInteger','VTDouble','VTLong'].includes(clickNode.type)" v-model="clickNode.operator" type="tree" :dic="operatorIntDic" :clearable="false" style="width: 80px;margin: 0 5px;"></avue-select>
        <avue-select v-else-if="['VTDateTime','VTDate','VTTime'].includes(clickNode.type)" v-model="clickNode.operator" type="tree" :dic="operatorDateDic" :clearable="false" style="width: 80px;margin: 0 5px;"></avue-select>
        <avue-select v-else v-model="clickNode.operator" type="tree" :dic="operatorDic" :clearable="false" style="width: 80px;margin: 0 5px;"></avue-select>
        <el-date-picker v-if="clickNode.type=='VTDate'" v-model="clickNode.inputValue" style="width:300px;display: inline-block;" value-format="YYYY-MM-DD"
          type="date">
        </el-date-picker>
        <el-date-picker v-else-if="clickNode.type=='VTDateTime'" v-model="clickNode.inputValue" style="width:350px;display: inline-block;"
          type="datetime">
        </el-date-picker>
        <el-time-select v-else-if="clickNode.type=='VTTime'" v-model="clickNode.inputValue" value-format="HH:mm:ss" style="width:300px;display: inline-block;">
        </el-time-select>
        <avue-input-number v-else-if="clickNode.type=='VTInteger'" precision="0" v-model="clickNode.inputValue" style="width:300px;display: inline-block;"></avue-input-number>
        <avue-input-number v-else-if="clickNode.type=='VTLong' || clickNode.type=='VTDouble'" v-model="clickNode.inputValue" style="width:300px;display: inline-block;"></avue-input-number>
        <avue-input v-else v-model="clickNode.inputValue" type="textarea" style="width: 300px;margin-right: 5px;vertical-align: top;"></avue-input>
      </div>
      <div class="dialog-footer avue-dialog__footer">
        <el-button size="small" @click="checkTemp" v-if="!['VTInteger','VTDouble','VTLong','VTDateTime','VTDate','VTTime'].includes(clickNode.type)">选择查询模板</el-button>
        <el-button type="primary" plain size="small" @click="submitDialog" >保 存</el-button>
        <el-button size="small" @click="dialog.showDialog=false">取 消</el-button>
      </div>
    </el-dialog>
    <el-dialog v-dialogDrag
               :title="queryDialog.title"
               :visible.sync="queryDialog.showDialog"
               width="800px"
               :append-to-body="true"
               class="avue-dialog"
               :destroy-on-close="true"
               :close-on-click-modal="false"
               @close="cancleQueryDialog">
      <div class="el-input--small">
        输入查询字段:<avue-input v-model="queryField" style="width: 500px;margin-bottom: 10px"></avue-input>
        <avue-crud  ref="crud" :data="crudData" :option="crudOption"
                    :page.sync="page"
                    :table-loading="tableLoading"
                    @selection-change="selectionChange"
                    @row-click="rowClick"
                    @size-change="sizeChange"
                    @current-change="currentChange">
        </avue-crud>
      </div>
      <div class="dialog-footer avue-dialog__footer">
        <el-button type="primary" plain size="small" @click="submitQueryDialog" >确 定</el-button>
        <el-button size="small" @click="cancleQueryDialog">取 消</el-button>
      </div>
    </el-dialog>
    <el-dialog v-dialogDrag
               :title="queryResultDialog.title"
               :visible.sync="queryResultDialog.showDialog"
               width="900px"
               :append-to-body="true"
               class="avue-dialog"
               :destroy-on-close="true"
               :close-on-click-modal="false"
               @close="queryResultDialog.showDialog='false'">
      <div class="el-input--small">
        <avue-crud  ref="crud" :data="resultData" :option="resultOption"
                    :table-loading="queryResultDialog.loading">
        </avue-crud>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import basicOption from "@/util/basic-option";
import {getAllQTs} from "@/api/queryTemplate/queryDefine";
import {getCriteria} from "@/api/queryTemplate/linkTypeQuery";
import {dateFormat} from "@/util/date"
export default {
name: "formQueryDialog",
  props: {
@@ -38,10 +127,28 @@
      type: Object,
      default: {}
    },
    levelFlag:{
      type: Number,
      default: 0
    }
  },
  data() {
    return {
      radioForm: 0,
      dialog: {
        showDialog: false,
        title: "查询条件设置框",
        loading: false
      },
      queryDialog: {
        showDialog: false,
        title: "选择查询模板",
        loading: false
      },
      queryResultDialog: {
        showDialog: false,
        title: "查询结果",
        loading: false
      },
      radioDic: [{
        label: '普通',
        value: 0
@@ -49,94 +156,525 @@
        label: '高级',
        value: 1
      }],
      conditionList:this.queryCondition,
      conditionList:[],
      treeData:[],
      treeOption:{
        defaultExpandAll:true,
        menu: false,
        addBtn: false,
        filter:false,
        draggable: true,
        allowDrop: (draggingNode, dropNode, type) => {
          debugger;
          if (dropNode.data.label === '并且' || dropNode.data.label === '或者') {
            return true;
          } else {
            this.$message.error('请选中逻辑条件添加查询项');
            return false;
          }
        },
        allowDrag: (draggingNode) => {
          return false;
        },
      },
      treeData:this.queryTree,
      //VTInteger、VTDouble、VTLong
      page: {
        currentPage: 1,
        pageSize: 10,
        total: 0,
        pageSizes: [10, 30, 50, 100],
      },
      crudData:[],
      crudOption: {
        ...basicOption,
        addBtn: false,
        editBtn: false,
        delBtn: false,
        tip: false,
        header: false,
        height: window.innerHeight-220,
        menu: false,
        column: [{
          label: '查询模板名称',
          prop: 'qtName',
          sortable: true,
        }, {
          label: '链接类型或业务类型',
          prop: 'btmName',
          sortable: true,
        }]
      },
      tableLoading: false,
      selectionRow:[],
      queryField:'',
      resultData:[],
      resultOption: {
        ...basicOption,
        addBtn: false,
        editBtn: false,
        delBtn: false,
        tip: false,
        header: false,
        height: window.innerHeight-220,
        menu: false,
        column: [{
          label: 'OID',
          prop: 'OID',
        }, {
          label: 'CREATOR',
          prop: 'CREATOR'
        }, {
          label: 'CREATETIME',
          prop: 'CREATETIME'
        }]
      },
      clickNode:{},
      operatorIntDic:[{
        label:'=',
        value:'='
      },{
        label:'!=',
        value:'!='
      },{
        label:'包含',
        value:'包含'
      },{
        label:'in',
        value:'in'
      },{
        label:'not in',
        value:'not in'
      },{
        label:'>=',
        value:'>='
      },{
        label:'>',
        value:'>'
      },{
        label:'<=',
        value:'<='
      },{
        label:'<',
        value:'<'
        label: '=',
        value: '='
      }, {
        label: '!=',
        value: '!='
      }, {
        label: '包含',
        value: '包含'
      }, {
        label: 'in',
        value: 'in'
      }, {
        label: 'not in',
        value: 'not in'
      }, {
        label: '>=',
        value: '>='
      }, {
        label: '>',
        value: '>'
      }, {
        label: '<=',
        value: '<='
      }, {
        label: '<',
        value: '<'
      }],
      //VTDateTime、VTDate、VTTime
      operatorTimeDic:[{
        label:'=',
        value:'='
      },{
        label:'!=',
        value:'!='
      },{
        label:'in',
        value:'in'
      },{
        label:'not in',
        value:'not in'
      },{
        label:'>=',
        value:'>='
      },{
        label:'<=',
        value:'<='
      operatorDateDic : [{
        label: '=',
        value: '='
      }, {
        label: '!=',
        value: '!='
      }, {
        label: 'in',
        value: 'in'
      }, {
        label: 'not in',
        value: 'not in'
      }, {
        label: '>=',
        value: '>='
      }, {
        label: '<=',
        value: '<='
      }],
      //其它
      operatorDic:[{
        label:'=',
        value:'='
      },{
        label:'!=',
        value:'!='
      },{
        label:'包含',
        value:'包含'
      },{
        label:'in',
        value:'in'
      },{
        label:'not in',
        value:'not in'
      operatorDic : [{
        label: '=',
        value: '='
      }, {
        label: '!=',
        value: '!='
      }, {
        label: '包含',
        value: '包含'
      }, {
        label: 'in',
        value: 'in'
      }, {
        label: 'not in',
        value: 'not in'
      }]
    }
  },
  methods:{
  computed: {
    radioForm:{
      get() {
        return this.levelFlag;
      },
      set(value) {
        this.$emit('update:levelFlag', value);
      }
    }
  },
  watch: {
    queryCondition:{
      handler(val) {
        if(val && val.cIMap){
          let list=[];
          let that=this;
          let getValue =function(queryTemplate,item) {
            for (let key in queryTemplate.condition.cIMap) {
              if (queryTemplate.condition.cIMap[key].leaf) {
                item.clause += '.' + queryTemplate.condition.cIMap[key].leafInfo.clause;
                if (queryTemplate.condition.cIMap[key].leafInfo.value.queryTemplate) {
                  getValue(queryTemplate.condition.cIMap[key].leafInfo.value.queryTemplate, item)
                } else {
                  item.ordinaryValue = queryTemplate.condition.cIMap[key].leafInfo.value.ordinaryValue;
                  item.type=queryTemplate.condition.cIMap[key].leafInfo.type;
                  if(['VTInteger','VTDouble','VTLong'].includes(item.type)){
                    item.operatorDic=that.operatorIntDic;
                  }else if(['VTDateTime','VTDate','VTTime'].includes(item.type)){
                    item.operatorDic=that.operatorDateDic;
                  }else{
                    item.operatorDic=that.operatorDic;
                  }
                }
              }
            }
          }
          for (let key in val.cIMap) {
            if (this.queryCondition.cIMap[key].leaf) {
              let clause=this.queryCondition.cIMap[key].leafInfo.clause;
              let operator= this.queryCondition.cIMap[key].leafInfo.operator;
              let item={
                clause: clause,
                operator: operator,
                ordinaryValue: '',
                operatorDic :[]
              }
              if(this.queryCondition.cIMap[key].leafInfo.value.queryTemplate) {
                getValue(this.queryCondition.cIMap[key].leafInfo.value.queryTemplate, item)
              }else {
                item.ordinaryValue=this.queryCondition.cIMap[key].leafInfo.value.ordinaryValue;
                item.type=this.queryCondition.cIMap[key].leafInfo.type;
                if(['VTInteger','VTDouble','VTLong'].includes(item.type)){
                  item.operatorDic=that.operatorIntDic;
                }else if(['VTDateTime','VTDate','VTTime'].includes(item.type)){
                  item.operatorDic=that.operatorDateDic;
                }else{
                  item.operatorDic=that.operatorDic;
                }
              }
              list.push(item)
            }
          }
          this.conditionList= list;
        }else{
          this.conditionList=[]
        }
      },
      immediate: true,
      deep:true
    },
    queryTree:{
      handler(val) {
        this.treeIndex=0;
        if(val && Object.keys(val).length>0){
          let treeData = [];
          let that=this;
          function initValue(nodeChild) {
            let children=[];
            if(nodeChild){
              nodeChild.forEach((item,index)=>{
                that.treeIndex++;
                if(item.column !=null && item.column != undefined){
                  const values= item.column.split(' ');
                  let inputValue='';
                  let operator='';
                  let showLabel=''
                  if(values.length>1){
                    operator=values[1];
                    if(values.length>2){
                      inputValue=values[2];
                    }
                  }
                  if(values[0].indexOf('.')!=-1){
                    const labels=values[0].split('.')
                    showLabel=labels[labels.length-1];
                  }else {
                    showLabel=values[0];
                  }
                  children.push({
                    label:item.column,
                    value:item.column+that.treeIndex,
                    type:item.type,
                    valueIndex:'v'+that.treeIndex,
                    inputValue:inputValue,
                    operator:operator,
                    showLabel:showLabel
                  })
                }else {
                  children.push({
                    label:item.connector,
                    value:item.connector+that.treeIndex,
                    valueIndex:'v'+that.treeIndex,
                    children:initValue(item.child)
                  })
                }
              })
            }
            return children;
          }
          const node={
            label:val.connector,
            value:val.connector+this.treeIndex,
            valueIndex:'v'+this.treeIndex,
            children:initValue(val.child)
          }
          treeData.push(node)
          this.treeData = treeData;
        }else {
          this.treeData=[{
            label: '并且',
            value: '并且' + this.treeIndex,
            valueIndex: 'v' + this.treeIndex,
            connector: '并且',
            children: []
          }]
        }
      },
      immediate: true,
      deep:true
    }
  },
  created() {
    this.getTemp();
  },
  methods: {
    // 拖拽到时
    drop(event) {
      // 使用 getData 方法获取数据
      const data = JSON.parse(event.dataTransfer.getData('item'));
      const params = {
        clause: data.value,
        operator: '=',
        ordinaryValue: ''
      if (this.radioForm == 0) {
        const params = {
          clause: data.value,
          operator: '=',
          ordinaryValue: ''
        }
        if (data.atttributes.vtDataType == 'VTInteger' || data.atttributes.vtDataType == 'VTDouble' || data.atttributes.vtDataType == 'VTLong') {
          params.operatorDic =JSON.parse(JSON.stringify(this.operatorIntDic)) ;
        } else if (data.atttributes.vtDataType == 'VTDateTime' || data.atttributes.vtDataType == 'VTDate' || data.atttributes.vtDataType == 'VTTime') {
          params.operatorDic = JSON.parse(JSON.stringify(this.operatorDateDic))
        } else {
          params.operatorDic = JSON.parse(JSON.stringify(this.operatorDic))
        }
        params.type=data.atttributes.vtDataType;
        this.conditionList.push(params)
      }else {
        if (this.clickNode.label != '并且' && this.clickNode.label != '或者') {
          this.$message.error('请选中逻辑条件添加查询项');
          return;
        }
        this.treeIndex++;
        this.$refs.tree.append({
          label: data.value,
          value: data.value + this.treeIndex,
          valueIndex: 'v' + this.treeIndex,
          children: []
        }, this.clickNode);
      }
      this.conditionList.push(params)
    }
    },
    handleDrop(draggingNode, dropNode, dropType, ev) {
      debugger;
      console.log('tree drop: ', dropNode.label, dropType);
    },
    //删除普通查询条件
    delCondition(index) {
      this.conditionList.splice(index, 1);
    },
    //清空值
    clearValue() {
      if (this.radioForm == 0) {
        this.conditionList.map(item => {
          item.ordinaryValue = '';
          return item;
        })
        this.conditionList = this.conditionList
      } else {
        if(this.treeData[0] && this.treeData[0].children) {
          this.clearTreeValue(this.treeData[0].children)
        }
      }
    },
    clearTreeValue(nodes){
      nodes.forEach((node,index)=>{
        if(node.children){
          this.clearTreeValue(node.children)
        }else {
          let values=node.label.split(' ');
          if(values.length>2){
            node.label=values[0]+' '+values[1];
          }
        }
      })
    },
    //删除全部条件
    delAll() {
      if (this.radioForm == 0) {
        this.conditionList = [];
      } else {
        this.treeIndex = 0;
        this.treeData = [];
        this.clickNode={};
      }
    },
    nodeClick(data) {
      this.clickNode = data
    },
    //树 增加逻辑条件
    addHandler() {
      if (Object.keys(this.clickNode).length>0) {
        if (this.clickNode.label == '并且' || this.clickNode.label == '或者') {
          this.treeIndex++;
          this.$refs.tree.append({
            label: '并且',
            value: '并且' + this.treeIndex,
            valueIndex: 'v' + this.treeIndex,
            children: []
          }, this.$refs.tree.getCurrentNode());
        } else {
          this.$message.error("只能对逻辑条件增加逻辑条件");
        }
      } else {
        if(this.treeData.length==0){
          this.treeIndex = 0;
          this.treeData = [{
            label: '并且',
            value: '并且' + this.treeIndex,
            valueIndex: 'v' + this.treeIndex,
            connector: '并且',
            children: []
          }]
        }else {
          this.$message.warning("请选择查询条件");
        }
      }
    },
    //树 修改条件
    editHandler() {
      if (Object.keys(this.clickNode).length>0) {
        if (this.clickNode.label == '并且') {
          this.clickNode.label = '或者'
        } else if (this.clickNode.label == '或者') {
          this.clickNode.label = '并且'
        } else {
          this.dialog.showDialog = true;
        }
      } else {
        this.$message.warning("请选择查询条件");
      }
    },
    //树 删除条件
    delHandler() {
      if (Object.keys(this.clickNode).length>0) {
        this.$confirm('您确定要删除所选择的条件吗?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          this.$refs.tree.remove(this.clickNode);
          this.clickNode = {};
        })
      } else {
        this.$message.warning("请选择查询条件");
      }
    },
    //查询
    queryHandler(){
      this.$parent.$parent.$parent.$parent.$refs.form.validate((valid) => {
        if (valid) {
          this.queryResultDialog.loading=true;
          const formData=this.$parent.$parent.$parent.$parent.initFormData();
          getCriteria(formData).then(res => {
            if (res.data.success) {
              this.resultData=res.data.data;
              this.queryResultDialog.showDialog=true;
              this.queryResultDialog.loading=false;
            }
          });
        } else {
          return false;
        }
      });
    },
    //选择查询模板
    checkTemp(index) {
      if(index>=0){
        if(['VTInteger','VTDouble','VTLong','VTDateTime','VTDate','VTTime'].includes(this.conditionList[index].type)){
          return false;
        }
      }
      this.queryIndex=index;
      this.queryDialog.showDialog=true;
      this.$nextTick(()=>{
        this.$refs.crud.doLayout();
      });
    },
    //查询条件保存
    submitDialog() {
      const values= this.clickNode.label.split(' ');
      if(['VTDateTime'].includes(this.clickNode.type)){
        this.clickNode.label = values[0]+' '+this.clickNode.operator+' '+dateFormat(this.clickNode.inputValue);
      }else  if(['VTDate'].includes(this.clickNode.type)){
        this.clickNode.label = values[0]+' '+this.clickNode.operator+' '+dateFormat(this.clickNode.inputValue ,'yyyy-MM-dd');
      }else  if(['VTTime'].includes(this.clickNode.type)){
        this.clickNode.label = values[0]+' '+this.clickNode.operator+' '+dateFormat(this.clickNode.inputValue ,'hh:mm:ss');
      }else {
        this.clickNode.label = values[0]+' '+this.clickNode.operator+' '+this.clickNode.inputValue;
      }
      this.dialog.showDialog = false;
    },
    //获取查询模板列表
    getTemp() {
      getAllQTs(this.page.currentPage, this.page.pageSize).then(res => {
        this.crudData = res.data.data;
        this.tableLoading = false;
      })
    },
    rowClick(row) {
      this.$refs.crud.toggleSelection();
      this.$refs.crud.toggleRowSelection(row); //选中当前行
      this.selectionRow = [row];
    },
    selectionChange(list) {
      this.selectionRow = list;
    },
    selectionClear() {
      this.selectionRow = [];
      this.$refs.crud.toggleSelection();
    },
    //选择查询模板
    submitQueryDialog() {
      if (this.selectionRow.length == 0) {
        this.$message.error('请选择查询模板再进行操作');
        return;
      }
      if (this.queryField == '') {
        this.$message.error('请填写输入查询字段');
        return;
      }
      const value = this.selectionRow[0].qtName + ';' + this.queryField
      if (this.radioForm == 0) {
        //普通
        this.conditionList[this.queryIndex].ordinaryValue = value;
      } else {
        this.clickNode.inputValue = value;
      }
      this.cancleQueryDialog();
    },
    cancleQueryDialog(){
      this.queryDialog.showDialog = false;
      this.selectionClear();
      this.queryField='';
      this.queryIndex=null;
    },
    sizeChange(val) {
      this.page.pageSize = val;
      this.getTemp();
    },
    // 页码
    currentChange(val) {
      this.page.currentPage = val;
      this.getTemp();
    },
  }
}
</script>