Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/1.2.2' into 1.2.2

yangfan 3 mēneši atpakaļ
vecāks
revīzija
2e079137e8

+ 58 - 32
src/components/Generator/components/InputTable/index.vue

@@ -279,8 +279,11 @@ export default {
         this.oldBatchEditJsonData = deepClone(jsonData)
         if (jsonData && jsonData.length) {
           this.tableFormData = []
-          jsonData.forEach((t) => this.addRow(t))
+          jsonData.forEach((t) => this.addRow(t,false,false,null,true))
           this.tableFormData = this.addRowList.concat(this.tableFormData)
+          for (let i = 0; i < this.tableFormData.length; i++) {
+            this.onChangeFormGetApi(i,null,false)
+          }
         } else {
           this.tableFormData = []
           this.addRow()
@@ -370,37 +373,20 @@ export default {
       const input = child && child.querySelector('input')
       input && input.focus()
     },
-    onFormDataChange:debounce(function(flag,rowIndex, colIndex, tag, scope,editVmodel) {
-      if (this.isAddRow) return
-      this.$emit('change')
-      const data = this.tableFormData[rowIndex][colIndex]
-      //当为下拉框change时
-      //查询当前change的组件是否为表单公共变量
-      if (data.allVar) {
-        sessionStorage.setItem(`FORM_${rowIndex + '_' + data.__vModel__}`, data.value)
-        //在当前行操作
-        this.tableFormData[rowIndex].forEach((i, k) => {
-          if (i.ApiParams && i.ApiParams.length) {
-            if (i.ApiParams.find((o) => o.varType[1] == data.__vModel__)) {
-              getTabelAPIData(i.options, i.propsUrl, i.ApiParams, this.tableFormData[rowIndex], '', i.apiProps).then((res) => {
-                this.$set(i, 'options', res)
-              })
+    // 处理比较复杂的 API事件 API变量等 传参赋值 存储sessionStorage 自定义表达式
+    onChangeFormGetApi(rowIndex,editVmodel,flag){
+      this.tableFormData[rowIndex].forEach((i, k) => {
+        //查询当前组件是否有api变量
+        if (i.tag === 'el-select' && i.ApiReturn && i.ApiReturn.length) {
+          // 获取选中的本条数据所有信息
+          let selectRow = i.options.find((o) => o[i.apiProps.value] === i.value)
+          if (selectRow) {
+            for (const cur of i.ApiReturn) {
+              // 储存全局变量
+              sessionStorage.setItem(`API_${rowIndex + '_' + cur.varName}`, selectRow[cur.keyName])
             }
           }
-        })
-      }
-      //当前组件值change时 查询当前组件是否有api变量
-      if (tag === 'el-select' && data.ApiReturn && data.ApiReturn.length) {
-        // 获取选中的本条数据所有信息
-        let selectRow = data.options.find((o) => o[data.apiProps.value] === data.value)
-        if (selectRow) {
-          for (const cur of data.ApiReturn) {
-            // 储存全局变量
-            sessionStorage.setItem(`API_${rowIndex + '_' + cur.varName}`, selectRow[cur.keyName])
-          }
         }
-      }
-      this.tableFormData[rowIndex].forEach((i, k) => {
         // 查询默认值是否绑定全局变量 并获取 新增时不需要更新  当前change的组件不需要更新
         if (i.defaultVarType && i.defaultVarType.length && editVmodel !== i.__vModel__) {
           const getSessionValue = (prefix) => {
@@ -431,6 +417,38 @@ export default {
           this.getDefaultValueExp.call(this,i,rowIndex)
         }
       })
+    },
+    onFormDataChange:debounce(function(flag,rowIndex, colIndex, tag, scope,editVmodel) {
+      if (this.isAddRow) return
+      this.$emit('change')
+      const data = this.tableFormData[rowIndex][colIndex]
+      //当为下拉框change时
+      //查询当前change的组件是否为表单公共变量
+      if (data.allVar) {
+        sessionStorage.setItem(`FORM_${rowIndex + '_' + data.__vModel__}`, data.value)
+        //在当前行操作
+        this.tableFormData[rowIndex].forEach((i, k) => {
+          if (i.ApiParams && i.ApiParams.length) {
+            if (i.ApiParams.find((o) => o.varType[1] == data.__vModel__)) {
+              getTabelAPIData(i.options, i.propsUrl, i.ApiParams, this.tableFormData[rowIndex], '', i.apiProps).then((res) => {
+                this.$set(i, 'options', res)
+              })
+            }
+          }
+        })
+      }
+      //当前组件值change时 查询当前组件是否有api变量
+      if (tag === 'el-select' && data.ApiReturn && data.ApiReturn.length) {
+        // 获取选中的本条数据所有信息
+        let selectRow = data.options.find((o) => o[data.apiProps.value] === data.value)
+        if (selectRow) {
+          for (const cur of data.ApiReturn) {
+            // 储存全局变量
+            sessionStorage.setItem(`API_${rowIndex + '_' + cur.varName}`, selectRow[cur.keyName])
+          }
+        }
+      }
+      this.onChangeFormGetApi(rowIndex,editVmodel,flag)
       this.$emit('change')
       data.required && (data.valid = this.checkData(data))
       if (this.config && this.config.dbLinkId && this.primaryRow && this.primaryRow[this.config.relationConf.primaryModel]) {
@@ -539,7 +557,7 @@ export default {
         let itemObj = this.tableData.find(o => o.__vModelName__ === itemArr[1])
         if (!itemObj) return []
         // 通过vmodel找到对应的子表单组件填写数据
-        const values = rowIndex ? this.tableFormData[rowIndex].find(o => o.__vModel__ === itemObj.__vModel__) : ''
+        const values = rowIndex || rowIndex == 0 ? this.tableFormData[rowIndex].find(o => o.__vModel__ === itemObj.__vModel__) : ''
         if (!values) return []
         return [values.value].filter(value => value) || []
       }else if (item && item.indexOf('$') > -1) {
@@ -731,13 +749,21 @@ export default {
       }
       this.$emit('change')
     },
-    addRow(val, flag,relationFlag,index) {
+    /**
+     * val添加的行数据
+     * flag relationFlag关联别的数据传来的
+     * index 子表数据行数
+     * createFlag 创建时是否调用修改change方法
+     */
+    addRow(val, flag,relationFlag,index,createFlag) {
       this.isAddRow = true
       if (!Array.isArray(this.tableFormData)) {
         this.tableFormData = []
       }
       this.tableFormData.unshift(this.getEmptyRow(val, flag,relationFlag))
-      this.clearAddRowFlag(index)
+      if (!createFlag){
+        this.clearAddRowFlag(index)
+      }
     },
     getCmpValOfRow(row, key) {
       // 获取数字相关组件的输入值

+ 8 - 6
src/components/Generator/components/Upload/UploadImg.vue

@@ -188,13 +188,15 @@ export default {
             list = res.data.data
           })
           this.fileImages = val.map((o) => {
-            return {
-              name: o.url,
-              fileName: list[o.url].fileName || '',
-              fileId: o.url,
-              url: 'api/file/getFileInputStreamById/' + o.url
+            if (list[o.url]){
+              return {
+                name: o.url,
+                fileName: list[o.url].fileName || '',
+                fileId: o.url,
+                url: 'api/file/getFileInputStreamById/' + o.url
+              }
             }
-          })
+          }).filter((l) => l !== undefined)
         }
       }
     },

+ 31 - 1
src/components/Generator/index/RightComponents/Table.vue

@@ -35,6 +35,12 @@
         </el-option>
       </el-select>
     </el-form-item>
+    <el-tooltip content="" placement="top">
+      <div slot="content">注:如表单物理表字段进行了增删改情况,可以通过刷新同步主表结构进行同步更新。<br/>同步新结构后,请调整表单设计,避免不必要的异常情况;</div>
+      <el-button :disabled="!activeData.dbLinkId" @click="fieldCompareChange" type="success" plain style="margin: 10px 0;">
+        刷新同步表结构<i class="el-icon-question" />
+      </el-button>
+    </el-tooltip>
     <el-divider>子表关联录入设置</el-divider>
     <el-form-item label="子表关联录入" label-width="100px">
       <el-switch v-model="activeData.relationConfFlag" />
@@ -127,7 +133,7 @@
 <script>
 import comMixin from './mixin'
 import { createCubeByTable, cubeFieldList, cubeFieldOption } from '@/api/workFlow/FlowEngine'
-import {getConfigData} from "@/api/onlineDev/visualDev";
+import {fieldCompare, getConfigData} from "@/api/onlineDev/visualDev";
 
 export default {
   props: ['activeData', 'dbtableList', 'dbSourceId', 'columnModelId','allTabelList'],
@@ -152,6 +158,30 @@ export default {
     }
   },
   methods: {
+    // 刷新同步主表结构
+    fieldCompareChange(){
+      fieldCompare(this.activeData.dbLinkId).then((res)=>{
+        let data  = res.data.data[0]
+        let creatData = data.fieldsCreat.map((i)=> {return i.columnName}).join(',');
+        let updateData = data.fieldsUpdate.map((i)=> {return i.columnName}).join(',')
+        let deletedData = data.fieldsDeleted.map((i)=> {return i.columnName}).join(',')
+        // 自定义模板
+        const notifyTemplate = `
+<!--            <div>-->
+                <p style="text-align: initial;"><span>新增字段:</span><span>${creatData || '暂无更新'}</span></p>
+                <p style="text-align: initial;"><span>修改字段:</span><span>${updateData || '暂无更新'}</span></p>
+                <p style="text-align: initial;"><span>删除字段:</span><span>${deletedData || '暂无更新'}</span></p>
+<!--            </div>-->
+        `;
+        const h = this.$createElement;
+        this.$notify({
+          title: '提示',
+          message: notifyTemplate,
+          dangerouslyUseHTMLString: true,
+          duration: 0
+        });
+      })
+    },
     onTableNameChange(tableName) {
       this.loading = true
       this.$set(this.activeData.__config__, 'tableName', tableName)

+ 17 - 4
src/views/form/webDesign/CustomEvent.vue

@@ -32,6 +32,7 @@
     <customEventExpression ref="customEventExpression" :dbLinkId="cubeId" :modelId="modeId" :dbSourceId="sourceId" @onChangeExp="eventChange" />
     <customCodeMode ref="customCodeMode" :dbLinkId="cubeId" :modelId="modeId" :dbSourceId="sourceId" :eventTypeRadio="eventTypeRadio" @onChangeExp="eventChange"  />
     <customApiEvent ref="customApiEvent" :dbLinkId="cubeId" :modelId="modeId" :dbSourceId="sourceId" @onChangeExp="eventChange"  />
+    <customFormEvent ref="customFormEvent" :dbLinkId="cubeId" :modelId="modeId" :dbSourceId="sourceId" :allTabelList="allTabelData" @onChangeExp="eventChange"  />
     <div>
       <el-table ref="multipleTable" :data="eventList" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" v-if="isCompont"></el-table-column>
@@ -81,12 +82,19 @@
           <el-table-column property="execLog" label="执行日志">
             <template slot-scope="scope">
               <span v-if="scope.row.execLog.length < 40"> {{ scope.row.execLog }} </span>
-              <el-popover v-else placement="top-start" title="执行日志" width="500" trigger="click" :content="scope.row.execLog">
+              <el-popover v-else placement="top-start" title="执行日志" width="600" trigger="click" :content="scope.row.execLog">
                 <div class="eventLog" slot="reference">{{ scope.row.execLog }}</div>
               </el-popover>
             </template>
           </el-table-column>
-          <el-table-column property="execSql" label="执行SQL"></el-table-column>
+          <el-table-column property="execSql" label="执行SQL">
+            <template slot-scope="scope">
+              <span v-if="scope.row.execSql.length < 40"> {{ scope.row.execSql }} </span>
+              <el-popover v-else placement="top-start" title="执行日志" width="600" trigger="click" :content="scope.row.execSql">
+                <div class="eventLog" slot="reference">{{ scope.row.execSql }}</div>
+              </el-popover>
+            </template>
+          </el-table-column>
         </el-table>
         <template>
           <pagination :total="logTotal" :page.sync="logCurrentPage" :limit.sync="logPageSize" @pagination="getLogList" />
@@ -99,10 +107,11 @@
 import { addCustomEvent, customEventList, deleteCustomEvent, getEventLog } from '@/api/onlineDev/visualDev'
 import customEventExpression from './customEventExpression.vue'
 import customApiEvent from "./customApiEvent.vue";
+import customFormEvent from "./customFormEvent.vue";
 import customCodeMode from './customCodeMode.vue'
 export default {
-  props: ['cubeId', 'modelId', 'dbSourceId', 'isCompont', 'multipleSelection', 'activeName', 'isEvent'],
-  components: { customEventExpression,customCodeMode,customApiEvent },
+  props: ['cubeId', 'modelId', 'dbSourceId', 'isCompont', 'multipleSelection', 'activeName', 'isEvent','allTabelData'],
+  components: { customEventExpression,customCodeMode,customApiEvent,customFormEvent },
   data() {
     return {
       isShow: false,
@@ -186,6 +195,8 @@ export default {
         this.$refs.customEventExpression.addFuncClick(row)
       }else if(row.eventType === 3) {
         this.$refs.customApiEvent.addFuncClick(row)
+      }else if(row.eventType === 4) {
+        this.$refs.customFormEvent.addFuncClick(row)
       }
     },
     onEventLogClick(row) {
@@ -231,6 +242,8 @@ export default {
         this.$refs.customEventExpression.addFuncClick()
       }else if(this.eventTypeRadio === 3) {
         this.$refs.customApiEvent.addFuncClick()
+      }else if(this.eventTypeRadio === 4) {
+        this.$refs.customFormEvent.addFuncClick()
       }
       this.eventTypeVisible = false
     },

+ 1 - 1
src/views/form/webDesign/Form.vue

@@ -180,7 +180,7 @@
               <custom-button v-if="activeName === 'customBtn'" :columnData="columnData" :dataForm="dataForm" :systemBtn="systemBtns" :actionBtn="actionBtns" :activeName="activeName"></custom-button>
             </el-tab-pane>
             <el-tab-pane label="自定义事件" name="customClick">
-              <CustomEvent v-if="activeName === 'customClick'" :modelId="columnData.modelId" :dbSourceId="dataForm.dbSourceId" :cubeId="dataForm.dbLinkId" :activeName="activeName" />
+              <CustomEvent v-if="activeName === 'customClick'" :modelId="columnData.modelId" :dbSourceId="dataForm.dbSourceId" :cubeId="dataForm.dbLinkId" :activeName="activeName" :allTabelData="allTabelList"/>
             </el-tab-pane>
             <el-tab-pane label="页签管理" name="tabManage">
               <tabManage

+ 58 - 26
src/views/form/webDesign/customApiEvent.vue

@@ -3,12 +3,14 @@
   <el-dialog
     :close-on-click-modal="false"
     :close-on-press-escape="false"
-    :title="'新增API模式自定义事件'"
     :visible.sync="showEditComputedField"
     append-to-body
     class="dataset-edit-computed-fields"
     width="700px"
   >
+    <p slot="title">
+      {{ id ? '编辑自定义事件' : '新增自定义事件' }}
+    </p>
     <div>事件名称:<el-input style="width:300px" v-model="eventName" placeholder="请输入事件名称"></el-input></div>
     <el-tabs v-model="activeName">
       <el-tab-pane label="请求设置" name="post">
@@ -38,7 +40,7 @@
                 </el-table-column>
                 <el-table-column label="参数值"  align="center">
                   <template slot-scope="scope">
-                    <el-popover :ref="`jarParamSelector-headers}`" key="headers" placement="bottom-start" trigger="click">
+                    <el-popover :ref="`jarParamSelector-headers`" key="headers" placement="bottom-start" trigger="click">
                       <div style="display: flex">
                         <div style="margin-right: 10px;max-height: 300px;overflow-y: auto">
                           <p>引用字段</p>
@@ -53,7 +55,7 @@
                             </div>
                           </template>
                         </div>
-                        <el-cascader-panel v-model="nowParam" :options="paramList" :props="{ expandTrigger: 'click', emitPath: false, value: 'paramKey' }" @change="setJarValueFun(scope.row,`\${${$event}}`)"></el-cascader-panel>
+                        <el-cascader-panel v-model="hedParam" :options="paramList" :props="{ expandTrigger: 'click', emitPath: false, value: 'paramKey' }" @change="setJarValueFun(scope.row,`\${${$event}}`)"></el-cascader-panel>
                       </div>
                       <el-button slot="reference" size="mini" type="success" plain>插入变量</el-button>
                     </el-popover>
@@ -78,7 +80,7 @@
                 </el-table-column>
                 <el-table-column label="参数值"  align="center">
                   <template slot-scope="scope">
-                    <el-popover :ref="`jarParamSelector-params}`" key="params" placement="bottom-start" trigger="click">
+                    <el-popover :ref="`jarParamSelector-params`" key="params" placement="bottom-start" trigger="click">
                       <div style="display: flex">
                         <div style="margin-right: 10px;max-height: 300px;overflow-y: auto">
                           <p>引用字段</p>
@@ -93,7 +95,7 @@
                             </div>
                           </template>
                         </div>
-                        <el-cascader-panel v-model="nowParam" :options="paramList" :props="{ expandTrigger: 'click', emitPath: false, value: 'paramKey' }" @change="setJarValueFun(scope.row,`\${${$event}}`)"></el-cascader-panel>
+                        <el-cascader-panel v-model="parParam" :options="paramList" :props="{ expandTrigger: 'click', emitPath: false, value: 'paramKey' }" @change="setJarValueFun(scope.row,`\${${$event}}`)"></el-cascader-panel>
                       </div>
                       <el-button slot="reference" size="mini" type="success" plain>插入变量</el-button>
                     </el-popover>
@@ -123,7 +125,26 @@
                   </el-table-column>
                   <el-table-column label="value"  align="center">
                     <template slot-scope="scope">
-                      <el-input v-model="scope.row.value" placeholder="value" ></el-input>
+                      <el-popover :ref="`jarParamSelector-body`" key="params" placement="bottom-start" trigger="click">
+                        <div style="display: flex">
+                          <div style="margin-right: 10px;max-height: 300px;overflow-y: auto">
+                            <p>引用字段</p>
+                            <template v-for="field of tobeChooseWeidu">
+                              <div :key="field.columnTitle" :title="field.columnName" class="weidu" @click="setJarValueFun(scope.row,`[${field.columnName}]`)">
+                                {{ field.columnTitle + '【' + field.columnName + '】' }}
+                              </div>
+                            </template>
+                            <template v-for="field of tobeChooseZhibiao">
+                              <div :key="field.columnTitle" :title="field.columnName" class="zhibiao" @click="setJarValueFun(scope.row,`[${field.columnName}]`)">
+                                {{ field.columnTitle + '【' + field.columnName + '】' }}
+                              </div>
+                            </template>
+                          </div>
+                          <el-cascader-panel v-model="bodParam" :options="paramList" :props="{ expandTrigger: 'click', emitPath: false, value: 'paramKey' }" @change="setJarValueFun(scope.row,`\${${$event}}`)"></el-cascader-panel>
+                        </div>
+                        <el-button slot="reference" size="mini" type="success" plain>插入变量</el-button>
+                      </el-popover>
+                      <el-input v-model="scope.row.value" placeholder="value" style="width:300px;margin-left:10px;"></el-input>
                     </template>
                   </el-table-column>
                 </el-table>
@@ -135,34 +156,39 @@
         </el-form>
       </el-tab-pane>
       <el-tab-pane label="响应设置" name="req">
-        <el-button size="mini" type="success" plain icon="el-icon-plus" @click="addForm.fields.push({name:'',type:'STRING',jsonpath:''})">添加响应字段</el-button>
+<!--        <el-button size="mini" type="success" plain icon="el-icon-plus" @click="addForm.fields.push({name:'',type:'STRING',jsonpath:''})">添加响应字段</el-button>-->
         <el-button size="mini"  plain icon="el-icon-refresh-left" @click="getReqData">响应数据结构预览</el-button>
         <el-button size="mini" type="text" icon="el-icon-paperclip" @click="openJson">jsonpath使用说明</el-button>
         <el-table size="mini" :data="addForm.fields"  border  style="width: 100%;margin:10px 0;">
-          <el-table-column width="50" align="center">
-            <template slot-scope="scope">
-              <i class="el-icon-delete" style="font-size:20px" @click="addForm.fields.splice(scope.$index,1)"></i>
-            </template>
-          </el-table-column>
+<!--          <el-table-column width="50" align="center">-->
+<!--            <template slot-scope="scope">-->
+<!--              <i class="el-icon-delete" style="font-size:20px" @click="addForm.fields.splice(scope.$index,1)"></i>-->
+<!--            </template>-->
+<!--          </el-table-column>-->
           <el-table-column label="字段" width="180"  align="center">
             <template slot-scope="scope">
               <el-input v-model="scope.row.name" placeholder="字段名称"></el-input>
             </template>
           </el-table-column>
-          <el-table-column label="字段类型" width="180"  align="center">
+          <el-table-column label="字段" width="180"  align="center">
             <template slot-scope="scope">
-              <el-select v-model="scope.row.type" placeholder="请选择字段类型">
-                <el-option label="字符串" value="STRING"></el-option>
-                <el-option label="整数" value="INT"></el-option>
-                <el-option label="长整数" value="BIGINT"></el-option>
-                <el-option label="浮点数" value="DOUBLE"></el-option>
-                <el-option label="精确浮点数" value="FLOAT"></el-option>
-                <el-option label="日期" value="DATE"></el-option>
-                <el-option label="时间" value="TIME"></el-option>
-                <el-option label="日期时间" value="TIMESTAMP"></el-option>
-              </el-select>
+              <el-input v-model="scope.row.value" placeholder="字段名称"></el-input>
             </template>
           </el-table-column>
+<!--          <el-table-column label="字段类型" width="180"  align="center">-->
+<!--            <template slot-scope="scope">-->
+<!--              <el-select v-model="scope.row.type" placeholder="请选择字段类型">-->
+<!--                <el-option label="字符串" value="STRING"></el-option>-->
+<!--                <el-option label="整数" value="INT"></el-option>-->
+<!--                <el-option label="长整数" value="BIGINT"></el-option>-->
+<!--                <el-option label="浮点数" value="DOUBLE"></el-option>-->
+<!--                <el-option label="精确浮点数" value="FLOAT"></el-option>-->
+<!--                <el-option label="日期" value="DATE"></el-option>-->
+<!--                <el-option label="时间" value="TIME"></el-option>-->
+<!--                <el-option label="日期时间" value="TIMESTAMP"></el-option>-->
+<!--              </el-select>-->
+<!--            </template>-->
+<!--          </el-table-column>-->
           <el-table-column label="json路径"  align="center">
             <template slot-scope="scope">
               <el-input v-model="scope.row.jsonpath" placeholder="json路径"></el-input>
@@ -209,11 +235,13 @@ export default {
         headers:[{name:'',value:''}],
         bodyType:'form-data',
         body:'',
-        fields:[{name:'',type:'STRING',jsonpath:''}],
+        fields:[{name:'',value:'',jsonpath:''}],
       },
       tobeChooseWeidu: [], // 计算字段编辑框里维度字段
       tobeChooseZhibiao: [], // 计算字段编辑框里指标字段
-      nowParam:[],
+      hedParam:[],
+      parParam:[],
+      bodParam:[],
       paramList: [],
       template:'',
       rules: {
@@ -262,7 +290,7 @@ export default {
             headers:[{name:'',value:''}],
             body:'',
             bodyType:'form-data',
-            fields:[{name:'',type:'STRING',jsonpath:''}],
+            fields:[{name:'',value:'',jsonpath:''}],
           }
           this.formDataList = [{key:'',value:''}]
         }
@@ -362,6 +390,10 @@ export default {
       if (this.addForm.method === 'POST' && this.addForm.bodyType === 'form-data') {
         this.addForm.body = JSON.stringify(this.formDataList)
       }
+      if (this.addForm.method !== 'POST') {
+        this.addForm.body = ''
+        this.formDataList = [{key:'',value:''}]
+      }
       let params = {
         id: this.id,
         eventName: this.eventName,

+ 208 - 0
src/views/form/webDesign/customFormEvent.vue

@@ -0,0 +1,208 @@
+<template>
+  <el-dialog
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    :visible.sync="showEditComputedField"
+    append-to-body
+    class="dataset-edit-computed-fields"
+    width="700px">
+    <p slot="title">
+      {{ id ? '编辑自定义赋值模式事件' : '新增自定义赋值模式事件' }}
+    </p>
+    <div >
+      <div style="margin-bottom:5px;">
+        事件名称:<el-input style="width:300px" v-model="eventName" placeholder="请输入事件名称"></el-input>
+        <el-button style="float:right;" type="success" plain size="mini" @click="list.length < 3 && list.push({formName:'',dataTable:'',FormColumnList:[{columnName:'',value:''}],columnList:[]});">+添加分组</el-button>
+      </div>
+      <div style="height: 500px;overflow-y:auto">
+        <el-card class="box-card" v-for="(value,key) in list" style="margin-bottom: 10px" :key="key">
+          <div slot="header">
+            表单名称:
+            <el-select v-model="value.formName" filterable placeholder="请选择" clearable @change="onRelationTableChange($event,value)">
+              <el-option v-for="(item, index) in allTabelList.filter(o=> (o.associationType && o.associationType == 1) && (o.visualdevTableType && o.visualdevTableType == 1))" :label="item.fullName" :value="item.id" :key="item.id"></el-option>
+            </el-select>
+            <span style="margin-left:10px">物理数据表:{{value.dataTable}}</span>
+            <i class="el-icon-delete" style="font-size:20px;color:#13ce66;float: right;cursor: pointer;" @click="list.splice(key,1)"></i>
+          </div>
+          <el-button type="success" plain size="mini" @click="value.FormColumnList.push({columnName:'',value:''});">+添加字段</el-button>
+          <el-table v-loading="loading" size="mini" :data="value.FormColumnList"  border  style="width: 100%;margin:10px 0;">
+            <el-table-column width="50" align="center">
+              <template slot-scope="scope">
+                <i class="el-icon-delete" style="font-size:20px" @click="value.FormColumnList.splice(scope.$index,1)"></i>
+              </template>
+            </el-table-column>
+            <el-table-column label="表单字段" width="180"  align="center">
+              <template slot-scope="scope">
+                <el-select v-model="scope.row.columnName" filterable placeholder="请选择表单字段" clearable >
+                  <el-option v-for="(item, index) in value.columnList" :label="item.label" :value="item.propId" :key="item.propId"></el-option>
+                </el-select>
+              </template>
+            </el-table-column>
+            <el-table-column label="赋值" align="center">
+              <template slot-scope="scope">
+                <el-popover :ref="`jarParamSelector-${key}`" :key="key" placement="bottom-start" trigger="click">
+                  <div style="display: flex">
+                    <div style="margin-right: 10px;max-height: 300px;overflow-y: auto">
+                      <p>引用字段</p>
+                      <template v-for="field of tobeChooseWeidu">
+                        <div :key="field.columnTitle" :title="field.columnName" class="weidu" @click="setJarValueFun(scope.row,`[${field.columnName}]`)">
+                          {{ field.columnTitle + '【' + field.columnName + '】' }}
+                        </div>
+                      </template>
+                      <template v-for="field of tobeChooseZhibiao">
+                        <div :key="field.columnTitle" :title="field.columnName" class="zhibiao" @click="setJarValueFun(scope.row,`[${field.columnName}]`)">
+                          {{ field.columnTitle + '【' + field.columnName + '】' }}
+                        </div>
+                      </template>
+                    </div>
+                    <el-cascader-panel v-model="nowParam" :options="paramList" :props="{ expandTrigger: 'click', emitPath: false, value: 'paramKey' }" @change="setJarValueFun(scope.row,`\${${$event}}`)"></el-cascader-panel>
+                  </div>
+                  <el-button slot="reference" type="success" plain size="mini">插入变量</el-button>
+                </el-popover>
+                <el-input v-model="scope.row.value" style="width:250px;margin-left:10px" placeholder="value"></el-input>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-card>
+      </div>
+      <div style="text-align:right" class="dialog-footer">
+          <el-button @click="showEditComputedField = false">取 消</el-button>
+          <el-button type="primary" @click="codeModeSubmit">确 定</el-button>
+    </div>
+    </div>
+  </el-dialog>
+</template>
+<script>
+import {cubeFieldList} from "@/api/workFlow/FlowEngine";
+import {categoryList, paramList} from "@/api/newbi/globalParams";
+import {addCustomEvent, getConfigData} from "@/api/onlineDev/visualDev";
+
+export default {
+  name: "customFormEvent",
+  props: ['modelId','dbLinkId','dbSourceId','allTabelList'],
+  data(){
+    return {
+      eventName:'',
+      executeTiming: 2,
+      datasourceId:'',
+      eventType: 4,
+      eventStatus: 0,
+      loading:false,
+      showEditComputedField:false,
+      tobeChooseWeidu: [], // 计算字段编辑框里维度字段
+      tobeChooseZhibiao: [], // 计算字段编辑框里指标字段
+      paramList: [],
+      id:'',
+      list:[
+        {formName:'',dataTable:'',FormColumnList:[{columnName:'',value:''}],columnList:[]}
+      ],
+      nowParam:[]
+    }
+  },
+  methods:{
+    setJarValueFun(value,field){
+      value.value = field;
+      document.body.click()
+    },
+    addFuncClick(row){
+      this.showEditComputedField = true
+      this.$nextTick(()=>{
+        if (row && row.id){
+          this.eventName = row.eventName
+          this.executeTiming = row.executeTiming
+          this.eventType = row.eventType
+          this.eventStatus = row.eventStatus
+          this.datasourceId = row.eventDatasourceId
+          this.id = row.id
+          this.list = JSON.parse(row.eventSql)
+        }else {
+          this.id = ''
+          this.eventName = ''
+          this.executeTiming = 2
+          this.eventType = 4
+          this.eventStatus = 0
+          this.datasourceId = this.dbSourceId
+          this.list =[
+            {formName:'',dataTable:'',FormColumnList:[{columnName:'',value:''}],columnList:[]}
+          ]
+        }
+      })
+      this.getGlobalData()
+    },
+    // 获取系统变量
+    getGlobalData() {
+      //获取数据集
+      cubeFieldList({ cubeDataId: this.dbLinkId }).then((res) => {
+        let tableFieldsWeidu = res.data.data.filter((i) => i.dimensionType === 'WEIDU').sort((a, b) => a.sortNum - b.sortNum)
+        let tableFieldsZhibiao = res.data.data.filter((i) => i.dimensionType === 'ZHIBIAO').sort((a, b) => a.sortNum - b.sortNum)
+        this.tobeChooseWeidu = tableFieldsWeidu.filter((i) => i.columnAttr == 'NORMAL')
+        this.tobeChooseZhibiao = tableFieldsZhibiao.filter((i) => i.columnAttr == 'NORMAL')
+      })
+      categoryList({ size: 10000, current: 1 }).then((res) => {
+        let list = res.data.data.records
+        let parents = list.filter((i) => !i.parentId)
+        let categoryList = []
+        list.forEach((i) => {
+          i.children = []
+          if (i.parentId) {
+            let parent = parents.find((j) => j.id == i.parentId)
+            parent.hasChild = true
+            i.label = parent.typeName + ' / ' + i.typeName
+            categoryList.push(i)
+          } else {
+            i.label = i.typeName
+          }
+        })
+        categoryList = categoryList.concat(parents.filter((i) => !i.hasChild))
+        paramList({ size: 10000, current: 1 }).then((res) => {
+          let params = res.data.data.records
+          params.forEach((i) => {
+            i.label = i.paramName
+            let parent = categoryList.find((j) => j.id == i.typeId)
+            parent.children.push(i)
+          })
+          this.paramList = categoryList
+        })
+      })
+    },
+    onRelationTableChange(v,value) {
+      this.loading = true
+      getConfigData(v).then((res) => {
+        let data = res.data.data
+        value.dataTable = data.primaryTableName
+        let columnData = JSON.parse(data.columnData)
+        value.columnList = columnData.columnList
+        this.loading = false
+      }).finally(()=>{
+        this.loading = false
+      })
+    },
+    codeModeSubmit(){
+      let params = {
+        id: this.id,
+        eventName: this.eventName,
+        executeTiming: this.executeTiming,
+        eventDatasourceId: this.dbSourceId,
+        eventType: this.eventType,
+        eventStatus: this.eventStatus,
+        eventSql:  JSON.stringify(this.list),
+      }
+      addCustomEvent(this.modelId, params).then((res) => {
+        this.$message({
+          message: res.data.msg,
+          type: 'success',
+          duration: 1500,
+          onClose: () => {
+            this.$emit('onChangeExp')
+            this.showEditComputedField = false
+          }
+        })
+      })
+    },
+  }
+}
+</script>
+
+<style scoped lang="scss">
+
+</style>