rui.jiang 6 mesiacov pred
rodič
commit
ed7d20ac3c

+ 389 - 153
src/views/etl/compile.vue

@@ -17,9 +17,22 @@
           :key="groupIndex"
           @click="changeCurrentGroup(groupIndex)"
         >
+          <p style="margin-top: 10px" v-if="param1 == 2 && groupIndex > 0">
+            数据操作:
+            <el-select v-model="valueYW" size="small" placeholder="请选择">
+              <el-option
+                v-for="item in optionsYW"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </p>
+
           <p class="SP1">
             <span>
-              执行器{{ groupIndex + 1 }}
+              执行器{{ groupIndex + 1 }}:
               <el-input
                 style="margin: 0 10px"
                 size="small"
@@ -28,6 +41,21 @@
               <el-button size="small" type="text" @click="dialogVisible = true"
                 >上传附件</el-button
               >
+              <!-- 删除执行器组按钮 -->
+              <el-button
+                size="small"
+                type="text"
+                @click="removeGroup(groupIndex)"
+                >删除执行器组</el-button
+              >
+              <span v-if="param1 == 2" style="margin-left: 10px;">
+                <el-switch
+                  v-model="group.choiceVal"
+                  active-text="合并"
+                  inactive-text="拼接"
+                >
+                </el-switch>
+              </span>
             </span>
           </p>
 
@@ -53,28 +81,32 @@
               "
             >
               <el-table-column type="selection" width="55"> </el-table-column>
-              <el-table-column
-                v-for="(key, colIndex) in table.columnKeys"
-                :key="colIndex"
-                :label="'Item ' + (parseInt(key) + 1)"
-                :prop="key.toString()"
-              ></el-table-column>
+              <template v-for="(rowKeys, rowIndex) in table.columnKeys">
+                <el-table-column
+                  v-for="(key, colIndex) in rowKeys"
+                  :key="`row-${rowIndex}-col-${colIndex}`"
+                  :label="'Item ' + (key + 1)"
+                  :prop="key.toString()"
+                ></el-table-column>
+              </template>
             </el-table>
           </div>
         </div>
       </div>
 
       <div class="database">
-        <el-tabs type="border-card">
+        {{ activeName }}
+        <el-tabs type="border-card" v-model="activeName">
           <!-- 动态生成标签页 -->
           <el-tab-pane
             v-for="(group, groupIndex) in groups"
             :key="groupIndex"
+            :name="String(groupIndex + 1)"
             :label="'执行器组 ' + (groupIndex + 1)"
           >
             <div class="pair">
               <p v-for="(item, index) in modelList" :key="index">
-                <span>{{ item.name }}</span>
+                <span>{{ item.standardizedName }}</span>
                 <el-select
                   size="small"
                   v-model="item.val"
@@ -97,18 +129,18 @@
               <p>添加数据字段</p>
               <div class="search">
                 <el-input size="small" v-model="field"></el-input>
-                <el-button size="small" type="text" @click="newVisible = true"
+                <!-- <el-button size="small" type="text" @click="newVisible = true"
                   >自定义</el-button
-                >
+                > -->
               </div>
-
+              <!-- {{ dynamicCheckOptions }}{{ activeName }} -->
               <el-checkbox-group
                 v-model="checkList"
                 @change="duoxuan"
                 class="repetition"
               >
                 <el-checkbox
-                  v-for="(item, index) in checkOptions"
+                  v-for="(item, index) in currentCheckOptions"
                   :key="index"
                   :label="item"
                 >
@@ -118,7 +150,9 @@
             </div>
           </el-tab-pane>
         </el-tabs>
-        <el-button class="fixed-button" type="primary" @click="submitData"> 保存 </el-button>
+        <el-button class="fixed-button" type="primary" @click="submitData">
+          保存
+        </el-button>
       </div>
 
       <!-- 弹窗 -->
@@ -129,37 +163,59 @@
         :before-close="handleClose"
       >
         <el-form ref="form" :model="form" label-width="100px">
+          <!-- 上传附件 -->
           <el-form-item label="上传附件:">
             <el-upload
               class="upload-demo"
-              action="https://jsonplaceholder.typicode.com/posts/"
-              :on-preview="handlePreview"
-              :on-remove="handleRemove"
-              :before-remove="beforeRemove"
-              multiple
-              :limit="3"
-              :on-exceed="handleExceed"
               :file-list="fileList"
+              action
+              :multiple="false"
+              :before-upload="beforeUpload"
+              :limit="1"
+              :auto-upload="false"
+              :on-change="handleOnChange"
+              :http-request="handleUpload"
             >
               <el-button @click="onUpload" size="small">上传</el-button>
             </el-upload>
           </el-form-item>
+
+          <!-- 是否有列名 -->
           <el-form-item label="是否有列名:">
-            <el-radio-group v-model="form.resource">
-              <el-radio label="是"></el-radio>
-              <el-radio label="否"></el-radio>
+            <el-radio-group
+              v-model="form.hasColName"
+              @change="onHasColNameChange"
+            >
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
             </el-radio-group>
           </el-form-item>
+
+          <!-- 列名所在行 -->
           <el-form-item label="列名所在行:">
-            <el-input v-model="form.name"></el-input>
+            <el-input
+              v-model="form.readRowNum"
+              :disabled="form.hasColName !== 1"
+            ></el-input>
           </el-form-item>
 
+          <!-- 范围最小值 -->
           <el-form-item label="范围最小值:">
-            <el-input v-model="form.name"></el-input>
+            <el-input
+              v-model="form.minRowNum"
+              :disabled="form.hasColName !== 0"
+            ></el-input>
           </el-form-item>
+
+          <!-- 范围最大值 -->
           <el-form-item label="范围最大值:">
-            <el-input v-model="form.name"></el-input>
+            <el-input
+              v-model="form.maxRowNum"
+              :disabled="form.hasColName !== 0"
+            ></el-input>
           </el-form-item>
+
+          <!-- 提交按钮 -->
           <el-form-item>
             <el-button type="primary" @click="onSubmit()">立即创建</el-button>
           </el-form-item>
@@ -205,48 +261,52 @@
 </template>
 
 <script>
+import axios from "axios";
 export default {
   data() {
     return {
+      optionsYW: [
+        {
+          value: "1",
+          label: "合并",
+        },
+        {
+          value: "2",
+          label: "拼接",
+        },
+      ],
+      valueYW: "",
+      form: {
+        file: [],
+        hasColName: "",
+        readRowNum: "",
+        minRowNum: "",
+        maxRowNum: "",
+      },
+      activeName: "1",
+      dynamicCheckOptions: {}, // 用于存储动态的 checkOptions,例如 checkOptions1, checkOptions2 等
+
       dialogVisible: false,
       newVisible: false,
       zxqName: "",
-      tableData: [
-        { 0: "2023-12-01", 1: "2023-12-02", 2: "2023-12-03", 3: "2023-12-04" },
-        { 0: "2023-12-01", 1: "2023-12-02", 2: "2023-12-03", 3: "2023-12-04" },
-        { 0: "2023-12-01", 1: "2023-12-02", 2: "2023-12-03", 3: "2023-12-04" },
-      ],
+      // tableData: [
+      //   { 0: "2023-12-01", 1: "2023-12-02", 2: "2023-12-03", 3: "2023-12-04" },
+      //   { 0: "2023-12-01", 1: "2023-12-02", 2: "2023-12-03", 3: "2023-12-04" },
+      //   { 0: "2023-12-01", 1: "2023-12-02", 2: "2023-12-03", 3: "2023-12-04" },
+      // ],
       columnKeys: [],
-      form: {},
+
       fileList: [],
       tables: [],
       groups: [
         {
+          choiceVal: "",
           inputValue: "", // 输入框默认值
           tables: [
-            {
-              columnKeys: ["0", "1", "2", "3"], // 默认的列
-              data: [
-                {
-                  0: "2023-12-01",
-                  1: "2023-12-02",
-                  2: "2023-12-03",
-                  3: "2023-12-04",
-                },
-                {
-                  0: "2023-12-05",
-                  1: "2023-12-06",
-                  2: "2023-12-07",
-                  3: "2023-12-08",
-                },
-                {
-                  0: "2023-12-09",
-                  1: "2023-12-10",
-                  2: "2023-12-11",
-                  3: "2023-12-12",
-                },
-              ],
-            },
+            // {
+            //   columnKeys: [], // 默认的列
+            //   data: [],
+            // },
           ],
         },
       ],
@@ -257,90 +317,150 @@ export default {
       checkList: [],
       multipleSelection: [],
       checkOptions: [], // 循环的选项
-      modelList: [
-        { name: "模板1", val: [] },
-        { name: "模板2", val: [] },
-      ],
+      modelList: [],
       inputList: [
         { value: "" }, // 默认有一个输入框
       ],
+      param1: null,
+      param2: null,
+      choiceVal: "",
     };
   },
-
+  computed: {
+    currentCheckOptions() {
+      const checkOptionsKey = `checkOptions${Number(this.activeName)}`;
+      if (!this.dynamicCheckOptions[checkOptionsKey]) {
+        this.$set(this.dynamicCheckOptions, checkOptionsKey, []); // 初始化
+      }
+      return this.dynamicCheckOptions[checkOptionsKey];
+    },
+  },
   mounted() {
-    if (this.tableData.length > 0) {
-      this.columnKeys = Object.keys(this.tableData[0]); // 动态提取列名
-    }
+    // if (this.tableData.length > 0) {
+    //   this.columnKeys = Object.keys(this.tableData[0]); // 动态提取列名
+    // }
+  },
+  created() {
+    this.param1 = this.$route.query.param1;
+    this.param2 = this.$route.query.param2;
+    this.GETinquire();
   },
-  methods: {
-
-    submitData(){
-console.log(this.groups,'groups');
 
-    },
-    // 获取默认表格模板
-    getDefaultTable() {
-      return {
-        columnKeys: ["0", "1", "2", "3"],
-        data: [
-          {
-            0: "2023-12-01",
-            1: "2023-12-02",
-            2: "2023-12-03",
-            3: "2023-12-04",
-          },
-          {
-            0: "2023-12-05",
-            1: "2023-12-06",
-            2: "2023-12-07",
-            3: "2023-12-08",
-          },
-          {
-            0: "2023-12-09",
-            1: "2023-12-10",
-            2: "2023-12-11",
-            3: "2023-12-12",
-          },
-        ],
-      };
+  methods: {
+    // 清空与选择无关的字段
+    onHasColNameChange() {
+      if (this.form.hasColName === 1) {
+        this.form.minRowNum = "";
+        this.form.maxRowNum = "";
+      }
+      if (this.form.hasColName === 0) {
+        this.form.readRowNum = "";
+      }
     },
 
-    // 上传操作
-    onUpload() {
-      this.dialogVisible = true;
+    GETinquire() {
+      const url = `/ETLapi/baseTemplateField/template/${this.param2}`; //
+      axios
+        .get(url)
+        .then((res) => {
+          this.modelList = res.data.datas;
+        })
+        .catch((error) => {});
     },
 
     // 仅在当前 group 下新增表格
     onSubmit() {
-      const newTable = {
-        columnKeys: ["0", "1", "2", "3"], // 默认列
-        data: [
-          {
-            0: "2023-12-01",
-            1: "2023-12-02",
-            2: "2023-12-03",
-            3: "2023-12-04",
-          },
-          {
-            0: "2023-12-01",
-            1: "2023-12-02",
-            2: "2023-12-03",
-            3: "2023-12-04",
-          },
-          {
-            0: "2023-12-01",
-            1: "2023-12-02",
-            2: "2023-12-03",
-            3: "2023-12-04",
+      if (!this.form.file || !(this.form.file.raw instanceof File)) {
+        this.$message.error("请上传文件后再提交");
+        return;
+      }
+      const formData = new FormData();
+      if (this.form.file && this.form.file.raw instanceof File) {
+        const file = this.form.file.raw; // 获取原始文件数据
+        console.log(file, "file");
+        formData.append("file", file, file.name); // 使用原始文件名作为文件名
+      } else {
+        console.error("文件未正确传递");
+        return;
+      }
+      // 将表单数据添加到 FormData 中
+      // formData.append("file", this.form.file); // 假设你要上传一个文件,字段名为 'file'
+      // 检查是否有值,如果有值才添加到 formData 中
+      if (this.form.hasColName !== undefined) {
+        formData.append("hasColName", this.form.hasColName);
+      }
+
+      if (this.form.maxRowNum !== "" && this.form.maxRowNum !== null) {
+        formData.append("maxRowNum", this.form.maxRowNum);
+      }
+
+      if (this.form.minRowNum !== "" && this.form.minRowNum !== null) {
+        formData.append("minRowNum", this.form.minRowNum);
+      }
+
+      if (this.form.readRowNum !== "" && this.form.readRowNum !== null) {
+        formData.append("readRowNum", this.form.readRowNum);
+      }
+
+      axios
+        .post("/ETLapi/processExecutor/readExcelData", formData, {
+          headers: {
+            "Content-Type": "multipart/form-data", // 确保 Content-Type 设置为 multipart/form-data
           },
-        ],
-      };
+        })
+        .then((res) => {
+          const newTable = {
+            columnKeys: res.data.datas.cols,
+            data: res.data.datas.data,
+          };
+
+          this.groups[this.currentGroupIndex].tables.push(newTable);
+          this.$message.success("文件上传成功");
+          this.dialogVisible = false;
+          this.resetForm();
+        })
+        .catch((error) => {
+          this.$message.error("上传失败,请重试");
+          console.error("上传失败:", error);
+        });
+    },
 
-      // 只在当前 group 的 tables 数组中新增表格
-      this.groups[this.currentGroupIndex].tables.push(newTable);
+    // 上传的
+    beforeUpload(file) {
+      this.form.file = file;
+      console.log("文件上传前:", this.form.file);
+      // 你可以在这里进行一些处理,如检查文件类型、大小等
+      return true; // 返回 true 继续上传,返回 false 则阻止上传
+    },
+    handleOnChange(file, fileList) {
+      this.form.file = file; // 更新选中文件
+      this.fileList = fileList; // 更新文件列表
+    },
 
-      console.log("新增后的 groups 数据:", this.groups);
-      this.dialogVisible = false;
+    submitData() {
+      const url = "/ETLapi/processGroup/addProcessGroup";
+      const payload = {
+        joinType: this.param1,
+        name: this.zxqName,
+        processExecutorInDataList: this.groups.map((group) => ({
+          knownFieldsList: this.selectoptions,
+          mappingFieldList: this.modelList.map((item) => ({
+            dataNameList: item.val,
+            standardizedName: item.standardizedName, // 获取每个 item 的 standardizedName
+            templateFiledId: item.id, //
+          })),
+          name: group.inputValue, //
+        })),
+        templateId: this.param2,
+      }; //
+
+      // return;
+      axios
+        .post(url, payload)
+        .then((res) => {})
+        .catch((error) => {
+          console.error("请求失败:", error);
+        });
     },
 
     // 切换当前 group
@@ -353,47 +473,114 @@ console.log(this.groups,'groups');
       this.groups[groupIndex].tables.splice(tableIndex, 1);
     },
 
+    // 删除整个执行器组
+    removeGroup(groupIndex) {
+      this.groups.splice(groupIndex, 1); // 删除执行器组
+    },
+
     // 新增执行器组
     addGroup() {
       this.groups.push({
         inputValue: "",
-        tables: [this.getDefaultTable()],
+        tables: [],
       });
+      console.log(this.groups);
+      this.activeName = String(this.groups.length);
     },
-
     handleSelectionChange(val, groupIndex, tableIndex) {
+      this.activeName = String(groupIndex + 1);
+      console.log(val, groupIndex, tableIndex);
       const currentTable = this.groups[groupIndex].tables[tableIndex]; // 获取当前表格
       // 提取每行所有字段的值(不管字段名是什么)
       currentTable.selectedValues = val.flatMap((item) => Object.values(item)); // 获取每一行的所有值
 
+      // 动态生成对应 groupIndex 的 checkOptions 键名
+      const groupCheckOptionsKey = `checkOptions${groupIndex + 1}`;
+
+      // 如果该 checkOptions 还没有定义,则初始化为空数组
+      if (!this.dynamicCheckOptions[groupCheckOptionsKey]) {
+        this.dynamicCheckOptions[groupCheckOptionsKey] = [];
+      }
+
+      const groupCheckOptions = this.dynamicCheckOptions[groupCheckOptionsKey];
+
       // 计算新增和移除的选项
       const added = currentTable.selectedValues.filter(
         (item) =>
-          !this.checkOptions.includes(item) &&
+          !groupCheckOptions.includes(item) &&
           !this.inputList.some((input) => input.value === item) // 排除掉 confirm 添加的值
       );
 
-      const removed = this.checkOptions.filter(
+      const removed = groupCheckOptions.filter(
         (item) =>
           !currentTable.selectedValues.includes(item) &&
           !this.inputList.some((input) => input.value === item) // 排除掉 confirm 添加的值
       );
 
-      // 更新 checkOptions
+      // 更新 groupCheckOptions
       if (added.length) {
-        this.checkOptions.push(...added);
+        groupCheckOptions.push(...added);
       }
       if (removed.length) {
-        this.checkOptions = this.checkOptions.filter(
-          (item) => !removed.includes(item)
-        );
+        this.dynamicCheckOptions[groupCheckOptionsKey] =
+          groupCheckOptions.filter((item) => !removed.includes(item));
       }
 
-      // 重新计算 checkOptions,包含所有选中行的所有字段值
-      this.checkOptions = this.groups
-        .flatMap((group) => group.tables) // 遍历所有组的所有表格
-        .flatMap((table) => table.selectedValues || []); // 合并所有表格的选中行的字段值
+      // 重新计算该组内所有选中行的所有字段值
+      this.dynamicCheckOptions[groupCheckOptionsKey] = this.groups[
+        groupIndex
+      ].tables.flatMap((table) => table.selectedValues || []); // 合并该组内所有表格的选中行的字段值
+      console.log(this.dynamicCheckOptions, [groupCheckOptionsKey]);
     },
+    // handleSelectionChange(val, groupIndex, tableIndex) {
+    //   this.activeName = String(groupIndex + 1); // 设置当前活动的 group 名称
+    //   console.log(val, groupIndex, tableIndex);
+
+    //   const currentTable = this.groups[groupIndex].tables[tableIndex]; // 获取当前表格
+    //   // 提取每行所有字段的值(不管字段名是什么)
+    //   currentTable.selectedValues = val.flatMap((item) => Object.values(item)); // 获取每一行的所有值
+
+    //   // 动态生成对应 groupIndex 的 checkOptions 键名
+    //   const groupCheckOptionsKey = `checkOptions${groupIndex + 1}`;
+
+    //   // 如果该 checkOptions 还没有定义,则初始化为空数组
+    //   if (!this.dynamicCheckOptions[groupCheckOptionsKey]) {
+    //     this.dynamicCheckOptions[groupCheckOptionsKey] = [];
+    //   }
+
+    //   const groupCheckOptions = this.dynamicCheckOptions[groupCheckOptionsKey];
+
+    //   // 获取 val 中的所有选中的值
+    //   const selectedValues = currentTable.selectedValues;
+
+    //   // 计算新增的选项(仅处理 val 中存在的值)
+    //   const added = selectedValues.filter(
+    //     (item) =>
+    //       !groupCheckOptions.includes(item) &&
+    //       !this.inputList.some((input) => input.value === item) // 排除掉 confirm 添加的值
+    //   );
+
+    //   // 计算移除的选项(从 checkOptions 中移除不在 val 中的项)
+    //   const removed = groupCheckOptions.filter(
+    //     (item) =>
+    //       !selectedValues.includes(item) &&
+    //       !this.inputList.some((input) => input.value === item) // 排除掉 confirm 添加的值
+    //   );
+
+    //   // 只处理 val 中传参的值,更新 groupCheckOptions
+    //   if (added.length) {
+    //     groupCheckOptions.push(...added); // 添加新选项
+    //   }
+
+    //   if (removed.length) {
+    //     // 移除不在 val 中的项
+    //     this.dynamicCheckOptions[groupCheckOptionsKey] =
+    //       groupCheckOptions.filter((item) => !removed.includes(item));
+    //   }
+
+    //   // 输出动态 checkOptions 的状态
+    //   console.log(this.dynamicCheckOptions, [groupCheckOptionsKey]);
+    // },
     duoxuan(val) {
       console.log(val);
 
@@ -414,7 +601,8 @@ console.log(this.groups,'groups');
       this.inputList.forEach((item) => {
         if (item.value) {
           // 如果有值才添加
-          this.checkOptions.push(item.value);
+          const checkOptionsKey = `checkOptions${Number(this.activeName)}`;
+          this.dynamicCheckOptions[checkOptionsKey].push(item.value);
         }
       });
       console.log(this.selectoptions);
@@ -424,24 +612,69 @@ console.log(this.groups,'groups');
       done();
     },
 
-    handleRemove(file, fileList) {
-      console.log(file, fileList);
+    handleUpload({ file, onSuccess, onError, formData }) {
+      // 使用 fetch 上传文件
+      fetch("YOUR_UPLOAD_URL", {
+        method: "POST",
+        body: formData, // 将 FormData 作为请求体
+      })
+        .then((response) => {
+          if (!response.ok) {
+            throw new Error(`上传失败,状态码:${response.status}`);
+          }
+          return response.json(); // 假设返回 JSON 数据
+        })
+        .then((data) => {
+          console.log("上传成功", data);
+          // 调用 onSuccess,通知 el-upload 上传成功
+          onSuccess(data);
+        })
+        .catch((error) => {
+          console.error("上传失败", error);
+          onError(error); // 调用 onError,通知 el-upload 上传失败
+        });
     },
-
-    handlePreview(file) {
-      console.log(file);
+    // 清空上传
+    resetForm() {
+      this.form = {
+        file: null,
+        hasColName: null,
+        readRowNum: "",
+        minRowNum: "",
+        maxRowNum: "",
+      };
+      this.fileList = [];
     },
-
-    handleExceed(files, fileList) {
-      this.$message.warning(
-        `当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
-          files.length + fileList.length
-        } 个文件`
-      );
+    // 上传操作
+    onUpload() {
+      this.dialogVisible = true;
     },
 
-    beforeRemove(file, fileList) {
-      return this.$confirm(`确定移除 ${file.name}?`);
+    // 获取默认表格模板
+    getDefaultTable() {
+      return {
+        columnKeys: ["0", "1", "2", "3"],
+        data: [
+          {
+            0: "2023-12-01",
+            1: "2023-12-02",
+            2: "2023-12-03",
+            3: "2023-12-04",
+          },
+          {
+            0: "2023-12-05",
+            1: "2023-12-06",
+            2: "2023-12-07",
+            3: "2023-12-08",
+          },
+          {
+            0: "2023-12-09",
+            1: "2023-12-10",
+            2: "2023-12-11",
+            3: "2023-12-12",
+          },
+        ],
+      };
     },
   },
 };
@@ -495,11 +728,14 @@ console.log(this.groups,'groups');
 
     span {
       display: inline-block;
-      width: 150px;
+      width: 140px;
     }
 
     .el-select {
-      width: 180px;
+      width: 190px;
+      .el-tag {
+        width: 70%;
+      }
     }
   }
 }

+ 125 - 137
src/views/etl/index.vue

@@ -1,7 +1,9 @@
 <template>
   <div class="global-variable">
     <div class="button-container">
-      <el-button type="primary" plain size="small" @click="drawer = true">数据模板</el-button>
+      <el-button type="primary" plain size="small" @click="drawer = true"
+        >数据模板</el-button
+      >
     </div>
     <el-table :data="tableData" border style="width: 100%">
       <el-table-column type="index" label="排序" width="60"> </el-table-column>
@@ -13,77 +15,39 @@
       </el-table-column>
       <el-table-column label="操作" width="180" align="center">
         <template slot-scope="scope">
-          <el-button size="small" type="text" @click="Newprocess(scope.$index, scope.row)">新增流程</el-button>
+          <el-button
+            size="small"
+            type="text"
+            @click="Newprocess(scope.$index, scope.row)"
+            >新增流程</el-button
+          >
         </template>
       </el-table-column>
     </el-table>
-    <H2>流程统计</H2>
-    <div class="process">
-      <p>
-        流程名称:
-        <el-select v-model="valueLC" placeholder="请选择" size="small">
-          <el-option v-for="item in optionsLC" :key="item.value" :label="item.label" :value="item.value">
-          </el-option>
-        </el-select>
-      </p>
-      <p>执行器名称:<el-input v-model="valueZXC" size="small"></el-input></p>
-      <p>
-        业务类型:
-        <el-select v-model="valueYW" placeholder="请选择" size="small">
-          <el-option v-for="item in optionsYW" :key="item.value" :label="item.label" :value="item.value">
-          </el-option>
-        </el-select>
-      </p>
-      <p>
-        状态:
-        <el-select v-model="valueZT" placeholder="请选择" size="small">
-          <el-option v-for="item in optionsZT" :key="item.value" :label="item.label" :value="item.value">
-          </el-option>
-        </el-select>
-      </p>
-      <div>
-        <el-button size="small"> 查询</el-button>
-        <el-button size="small"> 重置</el-button>
-      </div>
-    </div>
-
-    <el-table :data="tableflow" border style="width: 100%">
-      <el-table-column type="index" label="排序" width="60"> </el-table-column>
-      <el-table-column prop="name" label="流程名称" align="center">
-      </el-table-column>
-      <el-table-column prop="name" label="模板名称" align="center">
-      </el-table-column>
-      <el-table-column prop="name" label="执行器名称" align="center">
-      </el-table-column>
-      <el-table-column prop="type" label="业务类型" align="center">
-      </el-table-column>
+    <el-tabs v-model="activeName" @tab-click="handleClick">
+      <el-tab-pane label="流程统计" name="flow">
+        <workflow v-if="activeName === 'flow'"></workflow>
+      </el-tab-pane>
 
-      <el-table-column prop="name" label="进度" align="center">
-      </el-table-column>
-      <el-table-column prop="descr" label="状态" align="center">
-      </el-table-column>
-      <el-table-column prop="descr" label="开始时间" align="center">
-      </el-table-column>
-      <el-table-column prop="descr" label="结束时间" align="center">
-      </el-table-column>
-
-      <el-table-column label="操作" width="180" align="center">
-        <template slot-scope="scope">
-          <el-button size="small" type="text" @click="handleEdit(scope.$index, scope.row)">设计流程</el-button>
-          <el-button size="small" type="text" @click="handleEdit(scope.$index, scope.row)">复制流程</el-button>
-          <el-button size="small" type="text" @click="handleEdit(scope.$index, scope.row)">删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <el-pagination class="fenye" @size-change="handleSizeChange" @current-change="handleCurrentChange" :page-size="5"
-      layout="total, prev, pager, next" :total="20">
-    </el-pagination>
+      <el-tab-pane label="执行记录" name="record">
+        <logsheet v-if="activeName === 'record'"></logsheet>
+      </el-tab-pane>
+    </el-tabs>
 
     <!-- 抽屉 -->
     <el-drawer title="标准数据模板" :visible.sync="drawer">
       <div class="titleText">
-        <el-input v-model="designation" @input="GETinquire" size="small"></el-input>
-        <el-button style="margin-left: 10px" size="small" @click="newdrawer = true">新建</el-button>
+        <el-input
+          v-model="designation"
+          @input="GETinquire"
+          size="small"
+        ></el-input>
+        <el-button
+          style="margin-left: 10px"
+          size="small"
+          @click="newdrawer = true"
+          >新建</el-button
+        >
       </div>
       <el-table :data="templateData" border style="width: 100%">
         <el-table-column prop="name" label="流程名称" align="center">
@@ -91,8 +55,18 @@
 
         <el-table-column label="操作" width="120" align="center">
           <template slot-scope="scope">
-            <el-button size="small" type="text" @click="compile(scope.$index, scope.row)">编辑</el-button>
-            <el-button size="small" type="text" @click="Deletion(scope.$index, scope.row)">删除</el-button>
+            <el-button
+              size="small"
+              type="text"
+              @click="compile(scope.$index, scope.row)"
+              >编辑</el-button
+            >
+            <el-button
+              size="small"
+              type="text"
+              @click="Deletion(scope.$index, scope.row)"
+              >删除</el-button
+            >
           </template>
         </el-table-column>
       </el-table>
@@ -101,7 +75,11 @@
     <el-drawer :with-header="false" :visible.sync="newdrawer">
       <div class="drawer-content">
         <div class="tou">
-          <el-input v-model="templateName" placeholder="请输入模板名称" size="small"></el-input>
+          <el-input
+            v-model="templateName"
+            placeholder="请输入模板名称"
+            size="small"
+          ></el-input>
           <div>
             <i class="el-icon-plus" @click="addCirculation"></i>
             <i class="el-icon-minus" @click="removeCirculation"></i>
@@ -109,105 +87,95 @@
         </div>
 
         <div class="templatedata">
-          <div class="circulation" v-for="(item, index) in circulations" :key="index">
-            <el-input v-model="item.priceName" placeholder="请输入字段名" size="small"></el-input>
+          <div
+            class="circulation"
+            v-for="(item, index) in circulations"
+            :key="index"
+          >
+            <el-input
+              v-model="item.priceName"
+              placeholder="请输入字段名"
+              size="small"
+            ></el-input>
             <el-checkbox v-model="item.isCutCol">索引</el-checkbox>
             <el-checkbox v-model="item.isIndex">切割</el-checkbox>
           </div>
         </div>
-        <el-button class="fixed-button" type="primary" @click="saveData">保存</el-button>
+        <el-button class="fixed-button" type="primary" @click="saveData"
+          >保存</el-button
+        >
       </div>
 
       <!-- Fixed button at the bottom of the drawer -->
     </el-drawer>
 
     <!-- 弹窗 -->
-    <el-dialog title="新增" :visible.sync="dialogVisible" width="25%" :before-close="handleClose">
-      选择:
+    <el-dialog
+      title="新增"
+      :visible.sync="dialogVisible"
+      width="25%"
+      :before-close="handleClose"
+    >
+      选择模板:
       <el-select v-model="newvalue" size="small" placeholder="请选择">
-        <el-option v-for="item in newoptions" :key="item.id" :label="item.name" :value="item.id">
+        <el-option
+          v-for="item in newoptions"
+          :key="item.id"
+          :label="item.name"
+          :value="item.id"
+        >
         </el-option>
       </el-select>
-      <el-button type="primary" style="margin-left: 20px" @click="skip" size="small">确 定</el-button>
+      <el-button
+        type="primary"
+        style="margin-left: 20px"
+        @click="handleSubmit"
+        size="small"
+        >确 定</el-button
+      >
     </el-dialog>
   </div>
 </template>
 
 <script>
 import axios from "axios";
+import workflow from "./workflow.vue";
+import Logsheet from "./logsheet.vue";
 export default {
+  components: { workflow, Logsheet },
   data() {
     return {
+      activeName: "flow",
       drawer: false,
       newdrawer: false,
       dialogVisible: false,
+      rowID: "",
       templateData: [],
-      tableflow: [{}, {}, {}, {}, {}],
+
       tableData: [
         {
           name: "ETL横向清洗执行器",
           descr: "ETL 横向清洗执行器用于将多个数据源在“列”维度上进行合并。",
           type: "合并",
+          joinTypeList: 0,
         },
         {
           name: "ETL纵向清洗执行器",
           descr: "ETL 纵向清洗执行器用于将多个数据源在“行”维度上进行拼接。",
           type: "拼接",
+          joinTypeList: 1,
         },
         {
           name: "ETL清洗执行器",
           descr:
             " ETL 清洗执行器的自定义模式允许用户根据自己的需求进行灵活的数据清洗操作。用户可以定义自己的清洗规则。",
           type: "自定义",
+          joinTypeList: 2,
         },
       ],
-      optionsLC: [
-        {
-          value: "1",
-          label: "ETL横向清洗执行器",
-        },
-        {
-          value: "2",
-          label: "ETL纵向清洗执行器",
-        },
-        {
-          value: "3",
-          label: "ETL清洗执行器",
-        },
-      ],
-      optionsYW: [
-        {
-          value: "1",
-          label: "合并",
-        },
-        {
-          value: "2",
-          label: "拼接",
-        },
-        {
-          value: "3",
-          label: "自定义",
-        },
-      ],
-      optionsZT: [
-        {
-          value: "1",
-          label: "已完成",
-        },
-        {
-          value: "2",
-          label: "进行中",
-        },
-        {
-          value: "3",
-          label: "失败",
-        },
-      ],
+
       designation: "",
-      valueLC: "",
-      valueZXC: "",
-      valueYW: "",
-      valueZT: "",
+
       templateName: "",
       priceName: "",
       isCutCol: false,
@@ -229,20 +197,20 @@ export default {
   },
   methods: {
     // 查询模板
-    
+
     GETinquire() {
-  const name = this.designation; // 假设你有一个变量 name,可以根据实际情况赋值
-  axios
-    .get(`/ETLapi/baseTemplate/getAllEnabled`, { params: { name } }) // 使用 params 传递查询参数
-    .then((res) => {
-      this.templateData = res.data.datas;
-      this.newoptions = res.data.datas;
-      console.log(this.optionsLC);
-    })
-    .catch((error) => {
-      console.error(error); // 可加入错误处理
-    });
-},
+      const name = this.designation; // 假设你有一个变量 name,可以根据实际情况赋值
+      axios
+        .get(`/ETLapi/baseTemplate/getAllEnabled`, { params: { name } }) // 使用 params 传递查询参数
+        .then((res) => {
+          this.templateData = res.data.datas;
+          this.newoptions = res.data.datas;
+          console.log(this.optionsLC);
+        })
+        .catch((error) => {
+          console.error(error); // 可加入错误处理
+        });
+    },
 
     // 新增编辑
     saveData() {
@@ -373,6 +341,10 @@ export default {
       }
     },
 
+    handleClick(tab, event) {
+      console.log(tab, event);
+    },
+
     handleSizeChange(val) {
       console.log(`每页 ${val} 条`);
     },
@@ -383,11 +355,27 @@ export default {
       done();
     },
 
-    Newprocess(row) {
+    Newprocess(index, row) {
       this.dialogVisible = true;
+      this.rowID = row.joinTypeList;
+      console.log(row);
     },
-    skip() {
-      this.$router.push({ path: "/home/etl/compile" });
+
+    handleSubmit() {
+      if (this.newvalue != "") {
+        this.$router.push({
+          path: "/home/etl/compile",
+          query: {
+            param1: this.rowID,
+            param2: this.newvalue, // 使用选中的 id
+          },
+        });
+      }else{
+        this.$message({
+          message: '请选择数据模板',
+          type: 'warning'
+        });
+      }
     },
   },
 };

+ 218 - 0
src/views/etl/logsheet.vue

@@ -0,0 +1,218 @@
+<template>
+  <div>
+    <div class="process">
+      <p>
+        流程名称:
+        <el-select v-model="valueLC" placeholder="请选择" size="small">
+          <el-option
+            v-for="item in optionsLC"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </p>
+      <p>执行器记录:<el-input v-model="valueZXC" size="small"></el-input></p>
+
+      <p>
+        状态:
+        <el-select v-model="valueZT" placeholder="请选择" size="small">
+          <el-option
+            v-for="item in optionsZT"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </p>
+      <div>
+        <el-button size="small" @click="handleQuery">查询</el-button>
+        <el-button size="small" @click="handleReset">重置</el-button>
+      </div>
+    </div>
+
+    <el-table :data="tableflow" border style="width: 100%">
+      <el-table-column type="index" label="排序" width="60"> </el-table-column>
+      <el-table-column prop="joinType" label="流程名称" align="center">
+        <template slot-scope="scope">
+          <span v-if="scope.row.joinType === 0">ETL横向清洗执行器</span>
+          <span v-if="scope.row.joinType === 1">ETL纵向清洗执行器</span>
+          <span v-if="scope.row.joinType === 2">ETL自定义清洗执行器</span>
+          <span
+            v-if="
+              scope.row.joinType !== 0 &&
+              scope.row.joinType !== 1 &&
+              scope.row.joinType !== 2
+            "
+          >
+            未知流程
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="templateName" label="模板名称" align="center">
+      </el-table-column>
+      <el-table-column prop="name" label="执行记录名称" align="center">
+      </el-table-column>
+
+      <el-table-column prop="transferProgress" label="进度" align="center">
+      </el-table-column>
+      <el-table-column prop="execStatus" label="状态" align="center">
+        <template slot-scope="scope">
+          <span>
+            <template v-if="scope.row.execStatus === -1">等待中</template>
+            <template v-else-if="scope.row.execStatus === 0">转化中</template>
+            <template v-else-if="scope.row.execStatus === 1">转化成功</template>
+            <template v-else-if="scope.row.execStatus === 2">转化失败</template>
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="beginTime" label="开始时间" align="center">
+      </el-table-column>
+      <el-table-column prop="endTime" label="结束时间" align="center">
+      </el-table-column>
+
+   
+    </el-table>
+    <el-pagination
+      class="fenye"
+      @size-change="handleSizeChange"
+      @current-change="handleCurrentChange"
+      :page-size="pageSize"
+      layout="total, prev, pager, next"
+      :total="total"
+    >
+    </el-pagination>
+  </div>
+</template>
+
+<script>
+import axios from "axios";
+export default {
+  data() {
+    return {
+      tableflow: [],
+
+      optionsLC: [
+        {
+          value: "0",
+          label: "ETL横向清洗执行器",
+        },
+        {
+          value: "1",
+          label: "ETL纵向清洗执行器",
+        },
+        {
+          value: "2",
+          label: "ETL清洗执行器",
+        },
+      ],
+
+      optionsZT: [
+      {
+          value: "-1",
+          label: "等待中",
+        },
+        {
+          value: "0",
+          label: "转化中",
+        },
+        {
+          value: "1",
+          label: "转化成功",
+        },
+        {
+          value: "2",
+          label: "转化失败",
+        },
+      ],
+      valueLC: "",
+      valueZXC: "",
+      valueZT: "",
+      pageNo: 1,
+      pageSize: 5,
+      total: 0,
+    };
+  },
+  created() {
+    this.GETall();
+  },
+  methods: {
+    GETall() {
+      const url = "/ETLapi/executorHistory/listByQuery";
+      const param = {
+        execStatus: this.valueZT,
+        historyName:  this.valueZXC,
+        isAsc: true,
+        joinType: this.valueLC,
+        orderBy: "",
+        pageNo: this.pageNo,
+        pageSize: this.pageSize,
+        processGroupId: "",
+      };
+      axios
+        .post(url, param)
+        .then((res) => {
+          this.tableflow = res.data.datas;
+          this.total = res.data.totalCount;
+        })
+        .catch((error) => {
+          console.error("请求失败:", error);
+        });
+    },
+
+    // 分页
+    handleSizeChange(size) {
+      this.pageSize = size;
+      this.GETall(); // 获取数据,根据每页条数更新表格数据
+    },
+    handleCurrentChange(page) {
+      this.pageNo = page;
+      this.GETall(); // 获取数据,根据当前页更新表格数据
+    },
+
+    handleQuery() {
+      this.GETall();
+    },
+
+    handleReset() {
+      this.valueLC = "";
+      this.valueZXC = "";
+      this.valueZT = "";
+      this.GETall();
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.fenye {
+  display: flex;
+  justify-content: center;
+  margin-top: 20px;
+}
+
+.process {
+  display: flex;
+  margin-bottom: 10px;
+
+  p {
+    margin-right: 20px;
+  }
+}
+
+.el-select {
+  width: 200px;
+}
+
+.el-input {
+  width: 200px;
+}
+
+h2 {
+  font-size: 30px;
+  font-weight: 600;
+  margin: 10px 0;
+}
+</style>

+ 355 - 0
src/views/etl/workflow.vue

@@ -0,0 +1,355 @@
+<template>
+  <div>
+    <div class="process">
+      <p>
+        流程名称:
+        <el-select v-model="valueLC" placeholder="请选择" size="small">
+          <el-option
+            v-for="item in optionsLC"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </p>
+      <p>执行器组名称:<el-input v-model="valueZXC" size="small"></el-input></p>
+
+      <div>
+        <el-button size="small" @click="handleQuery">查询</el-button>
+        <el-button size="small" @click="handleReset">重置</el-button>
+      </div>
+    </div>
+
+    <el-table :data="tableflow" border style="width: 100%">
+      <el-table-column type="index" label="排序" width="60"> </el-table-column>
+      <el-table-column prop="joinType" label="流程名称" align="center">
+        <template slot-scope="scope">
+          <span v-if="scope.row.joinType === 0">ETL横向清洗执行器</span>
+          <span v-if="scope.row.joinType === 1">ETL纵向清洗执行器</span>
+          <span v-if="scope.row.joinType === 2">ETL自定义清洗执行器</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="name" label="模板名称" align="center">
+      </el-table-column>
+      <el-table-column prop="name" label="执行器组名称" align="center">
+      </el-table-column>
+
+      <el-table-column label="操作" width="240" align="center">
+        <template slot-scope="scope">
+          <el-button size="small" type="text" @click="handlebegin(scope.row)"
+            >执行</el-button
+          >
+          <el-button
+            size="small"
+            type="text"
+            @click="handleEdit(scope.$index, scope.row)"
+            >设计流程</el-button
+          >
+          <el-button size="small" type="text" @click="handlecopy(scope.row)"
+            >复制流程</el-button
+          >
+          <el-button size="small" type="text" @click="handleDel(scope.row)"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination
+      class="fenye"
+      @size-change="handleSizeChange"
+      @current-change="handleCurrentChange"
+      :page-size="pageSize"
+      layout="total, prev, pager, next"
+      :total="total"
+    >
+    </el-pagination>
+
+    <el-dialog
+      title="执行"
+      :visible.sync="dialogVisible"
+      width="20%"
+      :before-close="handleClose"
+    >
+      <div>
+        <p>执行名称:<el-input size="small" v-model="ZXJLval"></el-input></p>
+        <div
+          class="circulation"
+          v-for="(item, index) in circulationList"
+          :key="index"
+        >
+          <p>{{ item.name }}</p>
+          <p>
+            执行路径:
+            <el-input size="small" v-model="item.executionPath"></el-input>
+          </p>
+        </div>
+        <p style="margin-top: 10px">
+          保存路径:
+          <el-input size="small" v-model="savePath"></el-input>
+        </p>
+        <div class="Btn">
+          <el-button size="small" @click="handlestart"> 开始执行 </el-button>
+        </div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import axios from "axios";
+import { log } from "plotly.js-dist";
+export default {
+  data() {
+    return {
+      valueLC: "",
+      dialogVisible: false,
+      tableflow: [],
+      tableData: [
+        {
+          name: "ETL横向清洗执行器",
+          descr: "ETL 横向清洗执行器用于将多个数据源在“列”维度上进行合并。",
+          type: "合并",
+          joinTypeList: 0,
+        },
+        {
+          name: "ETL纵向清洗执行器",
+          descr: "ETL 纵向清洗执行器用于将多个数据源在“行”维度上进行拼接。",
+          type: "拼接",
+          joinTypeList: 1,
+        },
+        {
+          name: "ETL清洗执行器",
+          descr:
+            " ETL 清洗执行器的自定义模式允许用户根据自己的需求进行灵活的数据清洗操作。用户可以定义自己的清洗规则。",
+          type: "自定义",
+          joinTypeList: 2,
+        },
+      ],
+      optionsLC: [
+        {
+          value: "0",
+          label: "ETL横向清洗执行器",
+        },
+        {
+          value: "1",
+          label: "ETL纵向清洗执行器",
+        },
+        {
+          value: "2",
+          label: "ETL清洗执行器",
+        },
+      ],
+      optionsYW: [
+        {
+          value: "1",
+          label: "合并",
+        },
+        {
+          value: "2",
+          label: "拼接",
+        },
+        {
+          value: "3",
+          label: "自定义",
+        },
+      ],
+      optionsZT: [
+        {
+          value: "1",
+          label: "已完成",
+        },
+        {
+          value: "2",
+          label: "进行中",
+        },
+        {
+          value: "3",
+          label: "失败",
+        },
+      ],
+      circulationList: [],
+      rowList: [],
+      valueLC: "",
+      valueZXC: "",
+      valueZT: "",
+      processGroupId: "",
+      pageNo: 1,
+      pageSize: 5,
+      total: 0,
+      savePath: "",
+      ZXJLval:"",
+    };
+  },
+  created() {
+    this.GETall();
+  },
+  methods: {
+    GETall() {
+      const url = "/ETLapi/processGroup/listByQuery";
+      const param = {
+        executorProcessName: this.valueZXC,
+        isAsc: true,
+        joinType: this.valueLC,
+        orderBy: "",
+        pageNo: this.pageNo,
+        pageSize: this.pageSize,
+        processGroupId: "",
+      };
+      axios
+        .post(url, param)
+        .then((res) => {
+          this.tableflow = res.data.datas;
+          this.total = res.data.totalCount;
+        })
+        .catch((error) => {
+          console.error("请求失败:", error);
+        });
+    },
+    // 查询模板
+    // 删除
+    handleDel(row) {
+      this.processGroupId = row.id;
+      const url = `/ETLapi/processGroup/deleteProcessGroup/${this.processGroupId}`;
+      axios
+        .get(url)
+        .then((res) => {
+          // 删除成功后,移除 tableflow 中的对应行
+          const index = this.tableflow.findIndex(
+            (item) => item.id === this.processGroupId
+          );
+          if (index !== -1) {
+            this.tableflow.splice(index, 1); // 从 tableflow 数组中删除对应的项
+          }
+          this.$message.success("删除成功");
+        })
+        .catch((error) => {
+          console.error("请求失败:", error);
+          this.$message.error("删除失败");
+        });
+    },
+    // 复制
+    handlecopy(row) {
+      this.processGroupId = row.id;
+      const url = `/ETLapi/processGroup/copyProcessGroup/${this.processGroupId}`;
+      axios
+        .get(url)
+        .then((res) => {
+          this.GETall();
+          this.$message.success("复制成功");
+        })
+        .catch((error) => {});
+    },
+    // 分页
+    handleSizeChange(size) {
+      this.pageSize = size;
+      this.GETall(); // 获取数据,根据每页条数更新表格数据
+    },
+    handleCurrentChange(page) {
+      this.pageNo = page;
+      this.GETall(); // 获取数据,根据当前页更新表格数据
+    },
+    // 开始
+    handlebegin(row) {
+      this.rowList = row;
+
+      this.processGroupId = row.id;
+      const url = `/ETLapi/processExecutor/getByProcessGroupId/${this.processGroupId}`;
+      axios
+        .get(url)
+        .then((res) => {
+          console.log(res);
+
+          this.circulationList = res.data.datas;
+        })
+        .catch((error) => {});
+      this.dialogVisible = true;
+    },
+    // 开始执行
+    handlestart() {
+      const params = {
+        executorHistoryProcessInDataList: this.circulationList.map((item) => ({
+          id: item.id,
+          joinType: item.joinType,
+          name: item.name,
+          readPath: item.executionPath, // 注意这里使用的是 item.executionPath
+        })),
+        name: this.ZXJLval,
+        outputDir: this.savePath,
+        processGroupId: this.rowList.id,
+      };
+      const url = "/ETLapi/executorHistory/submitProcessGroup";
+      axios
+        .post(url, params)
+        .then((res) => {
+          this.dialogVisible = false;
+          this.$message({
+            message: "执行成功",
+            type: "success",
+          });
+        })
+        .catch((error) => {
+          console.error("请求失败:", error);
+        });
+    },
+
+    handleQuery() {
+      this.GETall();
+    },
+
+    handleReset() {
+      this.valueLC = "";
+      this.valueZXC = "";
+      this.GETall();
+    },
+
+    handleClose(done) {
+      done();
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.fenye {
+  display: flex;
+  justify-content: center;
+  margin-top: 20px;
+}
+
+.process {
+  display: flex;
+  margin-bottom: 10px;
+
+  p {
+    margin-right: 20px;
+  }
+}
+
+.el-select {
+  width: 200px;
+}
+
+.el-input {
+  width: 200px;
+}
+
+h2 {
+  font-size: 30px;
+  font-weight: 600;
+  margin: 10px 0;
+}
+.circulation {
+  // display: flex;
+  margin-top: 10px;
+  p {
+    margin-right: 10px;
+    margin-top: 10px;
+    line-height: 32px;
+  }
+}
+.Btn {
+  text-align: center;
+  margin-top: 20px;
+}
+</style>

+ 2 - 0
src/views/ledger/component/windsiteup.vue

@@ -199,6 +199,8 @@ export default {
     },
     handleOnChange(fileList) {
       this.globalFileList = fileList.raw;
+      console.log(fileList);
+      
     },
 
     // 附件提交

+ 14 - 14
vue.config.js

@@ -64,9 +64,9 @@ module.exports = {
     proxy: {
       "/api": {
         // target: "http://192.168.5.4:16200", // 石月
-        target: "http://192.168.50.235:16200", // 内网
+        // target: "http://192.168.50.235:16200", // 内网
         // target: "http://192.168.5.15:16200",
-        // target: "http://106.120.102.238:16700", // 外网  16600   16700
+        target: "http://106.120.102.238:16700", // 外网  16600   16700
         // target: "http://10.96.137.5",
         changeOrigin: true,
         pathRewrite: {
@@ -84,24 +84,24 @@ module.exports = {
       },
       "/ETLapi": {
         // target: "http://192.168.50.241:9001", // WZLapi 目标地址
+        // target: "http://192.168.5.11:8001", // WZLapi 目标地址
         target: "http://106.120.102.238:18080/ImportDataDev", //WTL外网目标地址
         changeOrigin: true,
         pathRewrite: {
           "^/ETLapi": "", // 去掉 /WZLapi 前缀
         },
       },
-         // 文佳
-         "/WJapi": {
-          // target: "http://192.168.50.235:8888", // WZLapi 内网 目标地址
-          target: "http://106.120.102.238:18888", // WZLapi 内网 目标地址
-          changeOrigin: true,
-          pathRewrite: {
-            "^/WJapi": "", // 去掉 /WZLapi 前缀
-          },
-          onProxyReq(proxyReq, req, res) {
-            console.log("Proxying /sAlgorithm request to:", proxyReq.path); // 打印代理请求路径
-          },
-        
+      // 文佳
+      "/WJapi": {
+        // target: "http://192.168.50.235:8888", // WZLapi 内网 目标地址
+        target: "http://106.120.102.238:18888", // WZLapi 内网 目标地址
+        changeOrigin: true,
+        pathRewrite: {
+          "^/WJapi": "", // 去掉 /WZLapi 前缀
+        },
+        onProxyReq(proxyReq, req, res) {
+          console.log("Proxying /sAlgorithm request to:", proxyReq.path); // 打印代理请求路径
+        },
       },
       // 数据转换亮亮
       "/transDataWeb": {