wujingjing
2024-09-10 68994735dddb8d2be65149aa605ec0ac12e8775a
src/views/project/yw/lowCode/sqlAmis/edit/SqlAmisEdit.vue
@@ -33,7 +33,7 @@
            </el-table></Pane
         >
         <Pane :size="60">
            <Splitpanes class="default-theme h100" :horizontal="true" v-if="currentSql">
            <Splitpanes class="default-theme h100" :horizontal="true" >
               <Pane :size="35" class="flex-col flex">
                  <div class="flex-0 flex justify-between items-center mb-1 ml-1 h-[36px]">
                     <span class="font-bold">参数</span>
@@ -50,6 +50,11 @@
                           <el-input v-model="scope.row.prompt" @input="argsInput"></el-input>
                        </template>
                     </el-table-column>
                     <el-table-column prop="check" label="缺省值" show-overflow-tooltip>
                        <template #default="scope">
                           <el-input v-model="scope.row.check" @input="argsInput"></el-input>
                        </template>
                     </el-table-column>
                     <el-table-column label="" width="55" fixed="right" show-overflow-tooltip>
                        <template #default="scope">
                           <el-tooltip effect="dark" content="删除" placement="top">
@@ -59,28 +64,33 @@
                     </el-table-column>
                  </el-table>
               </Pane>
               <Pane :size="65" class="flex-column">
                  <template v-if="currentSql">
                     <div class="flex-0 flex justify-between items-center my-1 ml-1 h-[36px]">
                        <span class="font-bold">SQL</span>
               <Pane :size="65">
                  <div class=" h-full">
                     <template v-if="currentDockConfig">
                        <div class=" flex justify-between items-center my-1 ml-1 h-[36px]">
                           <el-select class="w-52 font-bold" v-model="currentDockConfig.type">
                              <el-option v-for="item in Object.keys(amisDockTypeMap)" :key="item" :value="(item)" :label="amisDockTypeMap[item]"></el-option>
                           </el-select>
                        <el-select class="w-40" v-model="currentSql.database" @change="databaseSelectChange">
                           <el-option v-for="item in databaseList" :key="item.id" :value="item.id" :label="item.title"></el-option>
                        </el-select>
                     </div>
                     <codemirror
                        class="flex-auto overflow-auto"
                        v-model="currentSql.sql"
                        :style="{ height: '100%' }"
                        :autofocus="true"
                        :indent-with-tab="true"
                        :tab-size="2"
                        :extensions="sqlEditorExtensions"
                        @change="sqlCodeChange"
                        @focus="log('focus', $event)"
                        @blur="log('blur', $event)"
                     />
                  </template>
                           <el-select class="w-40" v-model="currentDockConfig.database" @change="databaseSelectChange">
                              <el-option v-for="item in databaseList" :key="item.id" :value="item.id" :label="item.title"></el-option>
                           </el-select>
                        </div>
                        <codemirror
                           class="overflow-auto"
                           style="height: calc(100% - 36px);"
                           v-model="currentDockConfig.sql"
                           :autofocus="true"
                           :indent-with-tab="true"
                           :tab-size="2"
                           :extensions="sqlEditorExtensions"
                           @change="sqlCodeChange"
                           @focus="log('focus', $event)"
                           @blur="log('blur', $event)"
                        />
                     </template>
                  </div>
               </Pane>
            </Splitpanes>
         </Pane>
@@ -93,20 +103,21 @@
import { sql } from '@codemirror/lang-sql';
import { xml } from '@codemirror/lang-xml';
import { vscodeDark } from '@uiw/codemirror-theme-vscode';
import _, { debounce } from 'lodash';
import { onMounted, ref } from 'vue';
import { Codemirror } from 'vue-codemirror';
import * as codeExample from './testData';
import titleBox from '/@/components/titleBox.vue';
import { Pane, Splitpanes } from 'splitpanes';
import 'splitpanes/dist/splitpanes.css';
import type { TableInstance } from 'element-plus';
import { ElMessage } from 'element-plus';
import _, { debounce } from 'lodash';
import { Pane, Splitpanes } from 'splitpanes';
import 'splitpanes/dist/splitpanes.css';
import { v4 as uuid } from 'uuid';
import { onMounted, ref } from 'vue';
import { Codemirror } from 'vue-codemirror';
import { SupervisorPublished } from '../types';
import * as codeExample from './testData';
import * as supervisorApi from '/@/api/supervisorAdmin';
import { updateSqlApi } from '/@/api/supervisorAdmin';
import titleBox from '/@/components/titleBox.vue';
import { useCompRef } from '/@/utils/types';
import { SupervisorPublished } from '../types';
import { amisDockTypeMap } from './types';
const props = defineProps(['supervisor']);
const emit = defineEmits(['backLastPage', 'updatePublished']);
@@ -127,6 +138,10 @@
let defaultSelectDatabase = null;
const databaseSelectChange = (val) => {
   defaultSelectDatabase = val;
   if(currentDockConfig.value){
      currentDockConfig.value.database = val;
   }
   updateSqlAndRs(currentDockConfig.value.id,currentDockConfig.value)
};
const backLastPage = () => {
   // setTimeout(() => {
@@ -137,13 +152,14 @@
const currentRs = ref<AmisDockConfig>(null);
const dockRowChange = (row) => {
   currentRs.value = row;
   currentSql.value = sqlList.value.find((item) => item.id === currentRs.value.recordId) ?? {
   currentDockConfig.value = dockConfigList.value.find((item) => item.id === currentRs.value.recordId) ?? {
      id: row.recordId,
      type: AmisDockType.Sql,
      sql: '',
      database: defaultSelectDatabase ?? databaseList.value[0]?.id ?? null,
   };
};
const currentSql = ref(null);
const currentDockConfig = ref(null);
/** @description 路径分隔符 */
const PATH_SEPARATOR = '/';
/** @description 1 退出所有循环 -1退出当次循环 0或其他值继续 */
@@ -221,14 +237,14 @@
};
const checkValid = (showTip: boolean, tip?: string) => {
   const foundWithNoDatabase = sqlList.value?.find((item) => !item.database);
   const foundWithNoDatabase = dockConfigList.value?.find((item) => !item.database);
   if (foundWithNoDatabase && showTip) {
      ElMessage.warning(tip ?? `【${foundWithNoDatabase.id}】未选择数据库`);
   }
   return !foundWithNoDatabase;
};
const updateSqlAndRs = (id?, sqlValue?: string) => {
const updateSqlAndRs = (id?, sqlValue?: { database?: string; sql?: string; type?: AmisDockType }) => {
   const apiConfig = configList.value.filter((item) => item.type === AmisDockType.Sql);
   if (apiConfig.length === 0) return;
   if (!checkValid(true)) {
@@ -240,36 +256,36 @@
      rec_id: item.recordId,
   }));
   if (id) {
      const found = sqlList.value?.find((item) => item.id === id);
      if (found) {
         found.sql = sqlValue;
   if (id && sqlValue) {
      const foundIndex = dockConfigList.value?.findIndex((item) => item.id === id);
      if (foundIndex > -1) {
         dockConfigList.value[foundIndex] = {
            ...dockConfigList.value[foundIndex],
            ...sqlValue,
         };
      } else {
         if (!sqlList.value || sqlList.value.length === 0) {
            sqlList.value = [
               {
                  id: id,
                  sql: sqlValue,
               },
            ];
         if (!sqlValue.database) {
            ElMessage.warning('请先选择数据库');
            return;
         }
         const newSqlValue = {
            id: id,
            database: sqlValue.database ?? null,
            sql: sqlValue.sql ?? null,
            type: sqlValue.type ?? AmisDockType.Sql,
         };
         if (!dockConfigList.value || dockConfigList.value.length === 0) {
            dockConfigList.value = [newSqlValue];
         } else {
            sqlList.value.push({
               id: id,
               sql: sqlValue,
            });
            dockConfigList.value.push(newSqlValue);
         }
      }
   }
   const dockList = sqlList.value.map((item) => ({
      type: AmisDockType.Sql,
      ...item,
   }));
   updateSqlApi(
      {
         id: props.supervisor.id,
         def_rs_json: dockList.length === 0 ? null : JSON.stringify(dockList),
         def_rs_json: dockConfigList.value.length === 0 ? null : JSON.stringify(dockConfigList.value),
         async_rs_json: asyncRsList.length === 0 ? null : JSON.stringify(asyncRsList),
         args: args.value.length === 0 ? null : JSON.stringify(args.value),
      },
@@ -283,15 +299,15 @@
const sqlCodeChange = debounce((val) => {
   if (!currentRs.value.recordId) return;
   if (currentSql.value) {
      if (!currentSql.value.database) {
   if (currentDockConfig.value) {
      if (!currentDockConfig.value.database) {
         ElMessage.warning('请先选择数据库');
         return;
      }
   }
   updateSqlAndRs(currentRs.value.recordId, val);
   updateSqlAndRs(currentDockConfig.value.id, currentDockConfig.value);
}, 1000);
const sqlList = ref([]);
const dockConfigList = ref([]);
const rsTableRef = ref<TableInstance>(null);
let xmlJson = null;
@@ -337,6 +353,7 @@
   const initData = {
      name: '',
      prompt: '',
      check: '',
   };
   if (!args.value || args.value.length === 0) {
      args.value = [initData];
@@ -373,15 +390,14 @@
               path: item.amis_path,
            } as AmisDockConfig)
      ) ?? [];
   sqlList.value = xmlJson.sql ?? null;
   // args.value = xmlJson
   dockConfigList.value = xmlJson.def_rs_json ?? null;
   args.value = xmlJson.args ?? [];
   configList.value = parseJSONData(xmlJson.amis_json, originConfig);
   const res = await supervisorApi.getAmisDatabaseList();
   databaseList.value = res.values ?? [];
   if (configList.value.length > 0) {
      rsTableRef.value.setCurrentRow(configList.value[0]);
      // dockRowChange(configList.value[0]);
   }
   if (checkRsUpdate(originConfig, configList.value)) {