Selaa lähdekoodia

Merge branch 'dev_neo4j2'

allen 2 vuotta sitten
vanhempi
sitoutus
2f6639f02e

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 724 - 38
package-lock.json


+ 3 - 2
package.json

@@ -42,6 +42,7 @@
     "axios": "0.24.0",
     "clipboard": "2.0.8",
     "core-js": "3.25.3",
+    "d3": "^7.8.4",
     "echarts": "4.9.0",
     "element-ui": "2.15.10",
     "fetch-jsonp": "^1.2.1",
@@ -82,14 +83,14 @@
     "connect": "3.6.6",
     "eslint": "7.15.0",
     "eslint-plugin-vue": "7.2.0",
+    "less-loader": "^3.0.0",
     "lint-staged": "10.5.3",
     "runjs": "4.4.2",
     "sass": "1.32.13",
     "sass-loader": "10.1.1",
     "script-ext-html-webpack-plugin": "2.1.5",
     "svg-sprite-loader": "5.1.1",
-    "vue-template-compiler": "2.6.12",
-    "less-loader": "^3.0.0"
+    "vue-template-compiler": "2.6.12"
   },
   "engines": {
     "node": ">=8.9",

+ 44 - 0
src/api/extract/info.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询三元组信息列表
+export function listInfo(query) {
+  return request({
+    url: '/extract/info/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询三元组信息详细
+export function getInfo(id) {
+  return request({
+    url: '/extract/info/' + id,
+    method: 'get'
+  })
+}
+
+// 新增三元组信息
+export function addInfo(data) {
+  return request({
+    url: '/extract/info',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改三元组信息
+export function updateInfo(data) {
+  return request({
+    url: '/extract/info',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除三元组信息
+export function delInfo(id) {
+  return request({
+    url: '/extract/info/' + id,
+    method: 'delete'
+  })
+}

+ 51 - 0
src/api/extract/subTask.js

@@ -0,0 +1,51 @@
+import request from '@/utils/request'
+
+// 查询知识抽取子任务列表
+export function listSubTask(query) {
+  return request({
+    url: '/extract/subTask/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询知识抽取子任务详细
+export function getSubTask(id) {
+  return request({
+    url: '/extract/subTask/' + id,
+    method: 'get'
+  })
+}
+
+// 新增知识抽取子任务
+export function addSubTask(data) {
+  return request({
+    url: '/extract/subTask',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改知识抽取子任务
+export function updateSubTask(data) {
+  return request({
+    url: '/extract/subTask',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除知识抽取子任务
+export function delSubTask(id) {
+  return request({
+    url: '/extract/subTask/' + id,
+    method: 'delete'
+  })
+}
+
+export function approveSubTask(id, status) {
+  return request({
+    url: `/extract/subTask/approve/${id}/${status}`,
+    method: 'get'
+  })
+}

+ 44 - 0
src/api/extract/subTaskDetail.js.bak

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询知识抽取子任务明细列表
+export function listSubTaskDetail(query) {
+  return request({
+    url: '/extract/subTaskDetail/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询知识抽取子任务明细详细
+export function getSubTaskDetail(id) {
+  return request({
+    url: '/extract/subTaskDetail/' + id,
+    method: 'get'
+  })
+}
+
+// 新增知识抽取子任务明细
+export function addSubTaskDetail(data) {
+  return request({
+    url: '/extract/subTaskDetail',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改知识抽取子任务明细
+export function updateSubTaskDetail(data) {
+  return request({
+    url: '/extract/subTaskDetail',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除知识抽取子任务明细
+export function delSubTaskDetail(id) {
+  return request({
+    url: '/extract/subTaskDetail/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
src/api/extract/task.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询知识抽取任务列表
+export function listTask(query) {
+  return request({
+    url: '/extract/task/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询知识抽取任务详细
+export function getTask(id) {
+  return request({
+    url: '/extract/task/' + id,
+    method: 'get'
+  })
+}
+
+// 新增知识抽取任务
+export function addTask(data) {
+  return request({
+    url: '/extract/task',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改知识抽取任务
+export function updateTask(data) {
+  return request({
+    url: '/extract/task',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除知识抽取任务
+export function delTask(id) {
+  return request({
+    url: '/extract/task/' + id,
+    method: 'delete'
+  })
+}

+ 10 - 0
src/api/knowledge/search.js

@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+// 查询实体管理列表
+export function getGraphByEntiry(query) {
+  return request({
+    url: '/kg/getRelationByName',
+    method: 'get',
+    params: query
+  })
+}

+ 44 - 0
src/api/upload/dataManage.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询数据管理列表
+export function listDataManage(query) {
+  return request({
+    url: '/upload/dataManage/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询数据管理详细
+export function getDataManage(id) {
+  return request({
+    url: '/upload/dataManage/' + id,
+    method: 'get'
+  })
+}
+
+// 新增数据管理
+export function addDataManage(data) {
+  return request({
+    url: '/upload/dataManage',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改数据管理
+export function updateDataManage(data) {
+  return request({
+    url: '/upload/dataManage',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除数据管理
+export function delDataManage(id) {
+  return request({
+    url: '/upload/dataManage/' + id,
+    method: 'delete'
+  })
+}

+ 43 - 0
src/api/upload/detail.js

@@ -0,0 +1,43 @@
+import request from '@/utils/request'
+
+// 查询信息列表
+export function list(type, query) {
+  return request({
+    url: `/upload/dataDetail/${type}/list`,
+    method: `get`,
+    params: query
+  })
+}
+
+// 查询信息详细
+export function get(type, id) {
+  return request({
+    url: `/upload/dataDetail/${type}/${id}`,
+    method: 'get'
+  })
+}
+
+// 修改信息详细
+export function update(type, data) {
+  return request({
+    url: `/upload/dataDetail/${type}`,
+    method: `put`,
+    data: data
+  })
+}
+
+// 删除信息详细
+export function del(type, id) {
+  return request({
+    url: `/upload/dataDetail//${type}/${id}`,
+    method: `delete`
+  })
+}
+
+// 修改信息详细
+export function downloadTemplate(type) {
+  return request({
+    url: `/upload/dataDetail/downloadTemplate/${type}`,
+    method: `post`
+  })
+}

+ 60 - 0
src/api/upload/uploadManage.js

@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+import { download } from '@/utils/request'
+
+// 查询上传管理列表
+export function listUploadManage(query) {
+  return request({
+    url: '/upload/uploadManage/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询上传管理详细
+export function getUploadManage(id) {
+  return request({
+    url: '/upload/uploadManage/' + id,
+    method: 'get'
+  })
+}
+
+// 新增上传管理
+export function addUploadManage(data) {
+  return request({
+    url: '/upload/uploadManage',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改上传管理
+export function updateUploadManage(data) {
+  return request({
+    url: '/upload/uploadManage',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除上传管理
+export function delUploadManage(id) {
+  return request({
+    url: '/upload/uploadManage/' + id,
+    method: 'delete'
+  })
+}
+
+// 查询上传管理详细
+export function getOptionByName(name) {
+  return request({
+    url: '/upload/uploadManage/getOptionByName',
+    method: 'get',
+    params: {
+      name
+    }
+  })
+}
+
+export function fileDownload(filepath) {
+  return download(filepath)
+}

+ 44 - 0
src/api/uploadDetail/accident.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询事故信息列表
+export function listAccident(query) {
+  return request({
+    url: '/uploadDetail/accident/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询事故信息详细
+export function getAccident(id) {
+  return request({
+    url: '/uploadDetail/accident/' + id,
+    method: 'get'
+  })
+}
+
+// 新增事故信息
+export function addAccident(data) {
+  return request({
+    url: '/uploadDetail/accident',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改事故信息
+export function updateAccident(data) {
+  return request({
+    url: '/uploadDetail/accident',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除事故信息
+export function delAccident(id) {
+  return request({
+    url: '/uploadDetail/accident/' + id,
+    method: 'delete'
+  })
+}

+ 2 - 1
src/assets/knowledge/config/config.js

@@ -2,7 +2,8 @@ window.global = {
 	env: 'dev',
 	baseUrl: function() {
 		return {
-			dev: 'http://47.108.150.237:10083/prod-api',
+			dev: 'http://localhost:11082',
+			// dev: 'http://47.108.150.237:10083/prod-api',
 			test: 'http://10.10.12.85:2004/graph',
 			local: 'http://localhost:2004',
 			prod: 'http://unigraph.xian.algmarket.com',

+ 13 - 0
src/assets/styles/ruoyi.scss

@@ -295,3 +295,16 @@
    background: #303133;
    color: #ffffff;
  }
+
+ .el-range-editor--small .el-range-input {
+	background-color: #232B4C;
+	color: #bfcbd9;
+ }
+
+ .el-tabs__item {
+	color: #888a8e;
+ }
+
+ .el-message-box__title {
+	color: #bfcbd9;
+ }

+ 119 - 0
src/components/Echarts/chartByD3.vue

@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="UTF-8" />
+    <title>Knowledge Graph Example</title>
+    <script src="https://unpkg.com/vue@3.2.13/dist/vue.global.js"></script>
+    <script src="https://d3js.org/d3.v6.min.js"></script>
+    <style>
+      .node {
+        fill: #ccc;
+        stroke: #fff;
+        stroke-width: 2px;
+      }
+
+      .link {
+        stroke: #999;
+        stroke-opacity: 0.6;
+      }
+
+      .label {
+        font-family: sans-serif;
+        font-size: 12px;
+        fill: #000;
+      }
+    </style>
+  </head>
+  <body>
+    <div id="app">
+      <svg ref="svg" width="600" height="400"></svg>
+    </div>
+
+    <script>
+      const app = Vue.createApp({
+        data() {
+          return {
+            nodes: [
+              { id: "A", group: 1, name: "Node A" },
+              { id: "B", group: 2, name: "Node B" },
+              { id: "C", group: 3, name: "Node C" },
+              { id: "D", group: 2, name: "Node D" },
+              { id: "E", group: 1, name: "Node E" },
+            ],
+            links: [
+              { source: "A", target: "B", name: "Link AB" },
+              { source: "B", target: "C", name: "Link BC" },
+              { source: "C", target: "D", name: "Link CD" },
+              { source: "D", target: "E", name: "Link DE" },
+              { source: "E", target: "A", name: "Link EA" },
+            ],
+            width: 600,
+            height: 400,
+          };
+        },
+        mounted() {
+          const svg = d3.select(this.$refs.svg);
+
+          const node = svg
+            .selectAll(".node")
+            .data(this.nodes)
+            .enter()
+            .append("circle")
+            .attr("class", "node")
+            .attr("r", 20);
+
+          const link = svg
+            .selectAll(".link")
+            .data(this.links)
+            .enter()
+            .append("line")
+            .attr("class", "link")
+            .attr("stroke-width", 2);
+
+          const nodeLabel = svg
+            .selectAll(".node-label")
+            .data(this.nodes)
+            .enter()
+            .append("text")
+            .attr("class", "label")
+            .text((d) => d.name);
+
+          const linkLabel = svg
+            .selectAll(".link-label")
+            .data(this.links)
+            .enter()
+            .append("text")
+            .attr("class", "label")
+            .text((d) => d.name);
+
+          const simulation = d3
+            .forceSimulation(this.nodes)
+            .force(
+              "link",
+              d3
+                .forceLink(this.links)
+                .id((d) => d.id)
+                .distance(80)
+            )
+            .force("charge", d3.forceManyBody().strength(-200))
+            .force("center", d3.forceCenter(this.width / 2, this.height / 2));
+
+          node.append("title").text((d) => d.id);
+          simulation.on("tick", () => {
+            node.attr("cx", (d) => d.x).attr("cy", (d) => d.y);
+            link
+              .attr("x1", (d) => d.source.x)
+              .attr("y1", (d) => d.source.y)
+              .attr("x2", (d) => d.target.x)
+              .attr("y2", (d) => d.target.y);
+            nodeLabel.attr("x", (d) => d.x).attr("y", (d) => d.y + 30);
+            linkLabel
+              .attr("x", (d) => (d.source.x + d.target.x) / 2)
+              .attr("y", (d) => (d.source.y + d.target.y) / 2);
+          });
+        },
+      });
+      app.mount("#app");
+    </script>
+  </body>
+</html>

+ 0 - 7
src/components/Echarts/graph.vue

@@ -2,12 +2,7 @@
   <div id="chart" class="chart"></div>
 </template>
 <script>
-//codenong.com/jsf795393b5d9c/
-// var echarts = require("echarts/lib/echarts");
 import * as echarts from "echarts";
-// require("echarts/lib/chart/graph");
-// require("echarts/lib/component/tooltip");
-// require("echarts/lib/component/title");
 export default {
   name: "Charts",
   props: {
@@ -109,8 +104,6 @@ export default {
               normal: {
                 color: "#00FAE1",
                 cursor: "pointer",
-                //color:Math.floor(Math.random()*16777215).toString(16),
-                //color: ['#fc853e','#28cad8','#9564bf','#bd407e','#28cad8','#fc853e','#e5a214'],
                 label: {
                   show: true,
                   position: [-10, -15],

+ 7 - 1
src/components/FileUpload/index.vue

@@ -111,6 +111,12 @@ export default {
     },
   },
   methods: {
+    reset() {
+      this.number = 0
+      this.uploadList = []
+      this.fileList = []
+      this.$refs.fileUpload.clearFiles()
+    },
     // 上传前校检格式和大小
     handleBeforeUpload(file) {
       // 校检文件类型
@@ -147,7 +153,7 @@ export default {
     // 上传成功回调
     handleUploadSuccess(res, file) {
       if (res.code === 200) {
-        this.uploadList.push({ name: res.fileName, url: res.fileName });
+        this.uploadList.push({ name: res.fileName, url: res.fileName, originalFilename: res.originalFilename});
         this.uploadedSuccessfully();
       } else {
         this.number--;

+ 1 - 1
src/layout/components/Settings/index.vue

@@ -111,7 +111,7 @@ export default {
           value: val
         })
         if (!val) {
-          this.$store.dispatch('app/toggleSideBarHide', false);
+          this.$store.dispatch('app/toggleSideBarHide', true);
           this.$store.commit("SET_SIDEBAR_ROUTERS", this.$store.state.permission.defaultRoutes);
         }
       }

+ 253 - 0
src/views/extract/info/index.vue

@@ -0,0 +1,253 @@
+<template>
+  <div class="app-container">
+    <el-row v-show="subTask.status == 1" :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['extract:info:add']"
+        >新增</el-button>
+      </el-col>
+      <span style="float: right;">
+        <el-col :span="1.5">
+          <el-button type="primary" plain icon="el-icon-check" size="mini" @click="handleApprove('2')" >审批</el-button>
+        </el-col>
+        <el-col :span="1.5" >
+          <el-button type="primary" plain icon="el-icon-close" size="mini" @click="handleApprove('5')" >驳回</el-button>
+        </el-col>
+      </span>
+    </el-row>
+    <el-table
+      v-loading="loading"
+      :data="infoList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column label="起点实体" align="center" prop="start" />
+      <el-table-column label="终点实体" align="center" prop="end" />
+      <el-table-column label="关系" align="center" prop="relation" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['extract:info:edit']"
+            >修改</el-button
+          >
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['extract:info:remove']"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改三元组信息对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="起点实体" prop="start">
+          <el-input v-model="form.start" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="终点实体" prop="end">
+          <el-input v-model="form.end" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="关系" prop="relation">
+          <el-input v-model="form.relation" placeholder="请输入关系" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listInfo, getInfo, delInfo, addInfo, updateInfo } from "@/api/extract/info";
+import { approveSubTask } from "@/api/extract/subTask";
+
+export default {
+  name: "Info",
+  props: {
+    subTask: {
+      type: Object,
+    },
+    tripletInfoOpen: {
+      type: Boolean,
+    },
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 三元组信息表格数据
+      infoList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        subTaskId: this.subTask.id,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        subTaskId: [{ required: true, message: "子任务id不能为空", trigger: "blur" }],
+      },
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询三元组信息列表 */
+    getList() {
+      this.loading = true;
+      listInfo(this.queryParams).then((response) => {
+        this.infoList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        subTaskId: this.subTask.id,
+        start: null,
+        end: null,
+        relation: null,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加三元组信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getInfo(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改三元组信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateInfo(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addInfo(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal
+        .confirm('是否确认删除三元组信息编号为"' + ids + '"的数据项?')
+        .then(function () {
+          return delInfo(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "extract/info/export",
+        {
+          ...this.queryParams,
+        },
+        `info_${new Date().getTime()}.xlsx`
+      );
+    },
+    handleApprove(status) {
+      approveSubTask(this.subTask.id, status).then(resp => {
+        let message;
+        if (status == 2){
+          message = '审批成功'
+        } else {
+          message = '驳回成功'
+        }
+        this.$message({
+          message,
+          type: 'success'
+        });
+        this.$emit("closeInfo")
+      })
+      .catch(() => {});
+    }
+  },
+};
+</script>

+ 295 - 0
src/views/extract/subTask/index.vue

@@ -0,0 +1,295 @@
+<template>
+  <div class="app-container">
+    <el-container>
+      <el-header>
+        <el-steps :active="parseInt(task.status)" simple direction finish-status="wait" process-status="finish">
+          <el-step title="知识加工" icon="el-icon-cpu"></el-step>
+          <el-step title="人工审核" icon="el-icon-s-custom"></el-step>
+          <el-step title="数据入库" icon="el-icon-document-checked"></el-step>
+        </el-steps>
+      </el-header>
+      <el-main>
+        <el-table v-loading="loading" :data="subTaskList">
+          <el-table-column type="index" width="50"/>
+          <el-table-column label="子任务名称" align="center" prop="type">
+            <template slot-scope="scope">
+              <dict-tag :options="dict.type.extract_sub_task_list" :value="scope.row.type"/>
+            </template>
+          </el-table-column>
+          <el-table-column label="任务状态" align="center" prop="status">
+            <template slot-scope="scope">
+              <dict-tag :options="dict.type.extract_sub_task_status" :value="scope.row.status"/>
+            </template>
+          </el-table-column>
+          <el-table-column label="启动时间" align="center" prop="createTime" width="180">
+          </el-table-column>
+          <el-table-column label="花费时间(s)" align="center" prop="costTime" />
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <el-button
+                v-show="scope.row.status == 1"
+                size="mini"
+                type="text"
+                icon="el-icon-warning-outline"
+                @click="handleApprove(scope.row)"
+                v-hasPermi="['extract:subTask:edit']"
+              >审核</el-button>
+              <el-button
+                v-show="scope.row.status == 4"
+                size="mini"
+                type="text"
+                icon="el-icon-finished"
+                @click="handleViewLog(scope.row)"
+                v-hasPermi="['extract:subTask:edit']"
+              >查看日志</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+          v-show="total>0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getListByTaskId"
+        />
+      </el-main>
+    </el-container>
+    <!-- 添加或修改知识抽取子任务对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="抽取任务id" prop="taskId">
+          <el-input v-model="form.taskId" placeholder="请输入抽取任务id" />
+        </el-form-item>
+        <el-form-item label="子任务类型" prop="type">
+          <el-select v-model="form.type" placeholder="请选择子任务类型">
+            <el-option
+              v-for="dict in dict.type.extract_sub_task_list"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="任务状态">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.extract_sub_task_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="日志" prop="log">
+          <el-input v-model="form.log" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="完成时间" prop="completedDate">
+          <el-date-picker clearable
+            v-model="form.completedDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择完成时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="花费时间(s)" prop="costTime">
+          <el-input v-model="form.costTime" placeholder="请输入花费时间(s)" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :title="tripletInfoOpenTitle" v-if="tripletInfoOpen" :visible.sync="tripletInfoOpen" width="80%" append-to-body destroy-on-close :close-on-click-modal="false">
+      <TripletInfo :subTask="subTask" :subTaskOpen.sync="tripletInfoOpen" @closeInfo="closeInfo"></TripletInfo>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listSubTask, getSubTask, delSubTask, addSubTask, updateSubTask } from "@/api/extract/subTask";
+import TripletInfo from '@/views/extract/info';
+
+export default {
+  name: "SubTask",
+  dicts: ['extract_sub_task_status', 'extract_sub_task_list'],
+  components: { TripletInfo },
+  props: { 
+    task: {
+      type: Object,
+    },
+    subTaskOpen: {
+      type: Boolean,
+    },  
+  },
+    
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 知识抽取子任务表格数据
+      subTaskList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 步骤
+      setp: 1,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        taskId: this.task.id,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        taskId: [
+          { required: true, message: "抽取任务id不能为空", trigger: "blur" }
+        ],
+      },
+      tripletInfoOpenTitle: "",
+      tripletInfoOpen: false,
+      subTask: {}
+    };
+  },
+  created() {
+    this.getListByTaskId();
+  },
+  methods: {
+    /** 查询知识抽取子任务列表 */
+    // getList() {
+    //   this.loading = true;
+    //   listSubTask(this.queryParams).then(response => {
+    //     this.subTaskList = response.rows;
+    //     this.total = response.total;
+    //     this.loading = false;
+    //   });
+    // },
+        /** 查询知识抽取子任务列表 */
+    getListByTaskId() {
+      this.loading = true;
+      listSubTask(this.queryParams).then(response => {
+        this.subTaskList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        taskId: null,
+        type: null,
+        status: "0",
+        log: null,
+        completedDate: null,
+        costTime: null,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    // handleSelectionChange(selection) {
+    //   this.ids = selection.map(item => item.id)
+    //   this.single = selection.length!==1
+    //   this.multiple = !selection.length
+    // },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加知识抽取子任务";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getSubTask(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改知识抽取子任务";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateSubTask(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addSubTask(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除知识抽取子任务编号为"' + ids + '"的数据项?').then(function() {
+        return delSubTask(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('extract/subTask/export', {
+        ...this.queryParams
+      }, `subTask_${new Date().getTime()}.xlsx`)
+    },
+    closeSubTask() {
+      this.subTaskOpen = false;
+    },
+    handleApprove(row){
+      this.tripletInfoOpen = true
+      this.tripletInfoOpenTitle = this.dict.label.extract_sub_task_list[row.type]
+      this.subTask = row
+    },
+    handleViewLog(row){
+      this.$alert(row.log, '日志', {
+        confirmButtonText: '确定',
+      });
+    },
+    closeInfo(){
+      this.tripletInfoOpen = false
+      this.tripletInfoOpenTitle = ''
+      this.subTask = {}
+      this.getListByTaskId()
+    }
+  }
+};
+</script>

+ 278 - 0
src/views/extract/subTaskDetail/index.vue.bak

@@ -0,0 +1,278 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="子任务id" prop="subTaskId">
+        <el-input
+          v-model="queryParams.subTaskId"
+          placeholder="请输入子任务id"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="关系" prop="relation">
+        <el-input
+          v-model="queryParams.relation"
+          placeholder="请输入关系"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['extract:subTaskDetail:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['extract:subTaskDetail:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['extract:subTaskDetail:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['extract:subTaskDetail:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="subTaskDetailList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column label="子任务id" align="center" prop="subTaskId" />
+      <el-table-column label="起点实体" align="center" prop="start" />
+      <el-table-column label="关系" align="center" prop="relation" />
+      <el-table-column label="终点实体" align="center" prop="end" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['extract:subTaskDetail:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['extract:subTaskDetail:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改知识抽取子任务明细对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="子任务id" prop="subTaskId">
+          <el-input v-model="form.subTaskId" placeholder="请输入子任务id" />
+        </el-form-item>
+        <el-form-item label="起点实体" prop="start">
+          <el-input v-model="form.start" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="关系" prop="relation">
+          <el-input v-model="form.relation" placeholder="请输入关系" />
+        </el-form-item>
+        <el-form-item label="终点实体" prop="end">
+          <el-input v-model="form.end" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listSubTaskDetail, getSubTaskDetail, delSubTaskDetail, addSubTaskDetail, updateSubTaskDetail } from "@/api/extract/subTaskDetail";
+
+export default {
+  name: "SubTaskDetail",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 知识抽取子任务明细表格数据
+      subTaskDetailList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        subTaskId: null,
+        start: null,
+        relation: null,
+        end: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        subTaskId: [
+          { required: true, message: "子任务id不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询知识抽取子任务明细列表 */
+    getList() {
+      this.loading = true;
+      listSubTaskDetail(this.queryParams).then(response => {
+        this.subTaskDetailList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        subTaskId: null,
+        start: null,
+        relation: null,
+        end: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加知识抽取子任务明细";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getSubTaskDetail(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改知识抽取子任务明细";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateSubTaskDetail(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addSubTaskDetail(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除知识抽取子任务明细编号为"' + ids + '"的数据项?').then(function() {
+        return delSubTaskDetail(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('extract/subTaskDetail/export', {
+        ...this.queryParams
+      }, `subTaskDetail_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 349 - 0
src/views/extract/task/index.vue

@@ -0,0 +1,349 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <!-- <el-form-item label="上传管理id" prop="uploadId">
+        <el-input
+          v-model="queryParams.uploadId"
+          placeholder="请输入上传管理id"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item> -->
+      <el-form-item label="任务名称" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入任务名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="任务状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择任务状态" clearable>
+          <el-option
+            v-for="dict in dict.type.kg_extract_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['extract:task:add']"
+        >新增</el-button>
+      </el-col>
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['extract:task:edit']"
+        >修改</el-button>
+      </el-col> -->
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['extract:task:remove']"
+        >删除</el-button>
+      </el-col> -->
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['extract:task:export']"
+        >导出</el-button>
+      </el-col> -->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="taskList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column label="任务名称" align="center" prop="name" />
+      <el-table-column label="文件名称" align="center" prop="uploadName" />
+      <!-- <el-table-column label="选择需要执行的子任务" align="center" prop="selectSubTask">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.extract_sub_task_list" :value="scope.row.selectSubTask ? scope.row.selectSubTask.split(',') : []"/>
+        </template>
+      </el-table-column> -->
+      <el-table-column label="任务状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.kg_extract_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建人" align="center" prop="createBy" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180" />
+      <el-table-column label="完成时间" align="center" prop="completedDate" width="180" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <!-- <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['extract:task:edit']"
+          >修改</el-button> -->
+          <!-- <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['extract:task:remove']"
+          >删除</el-button> -->
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleView(scope.row)"
+            v-hasPermi="['extract:task:query']"
+          >详情</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改知识抽取任务对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body :close-on-click-modal="false">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="任务名称" prop="name">
+          <el-input v-model="form.name" placeholder="自动生成" />
+        </el-form-item>
+        <el-form-item label="上传任务" prop="uploadId">
+          <el-select v-model="form.uploadId" placeholder="请选择" @change="changeUpload" clearable>
+            <el-option
+              v-for="item in uploadOption"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="子任务" prop="selectSubTaskArray">
+          <el-checkbox-group v-model="form.selectSubTaskArray">
+            <el-checkbox
+              v-for="dict in dict.type.extract_sub_task_list"
+              :key="dict.value"
+              :label="dict.value">
+              {{dict.label}}
+            </el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :title="subTaskOpenTitle" v-if="subTaskOpen" :visible.sync="subTaskOpen" width="80%" append-to-body destroy-on-close :close-on-click-modal="false" @close="closedSubTaskDialog">
+      <SubTask :task="task" :subTaskOpen.sync="subTaskOpen"></SubTask>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listTask, getTask, delTask, addTask, updateTask } from "@/api/extract/task";
+import { getOptionByName } from "@/api/upload/uploadManage";
+import SubTask from "@/views/extract/subTask"
+
+export default {
+  name: "Task",
+  dicts: ['kg_extract_status', 'extract_sub_task_list'],
+  components: { SubTask },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 知识抽取任务表格数据
+      taskList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        uploadId: null,
+        name: null,
+        status: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        uploadId: [
+          {required: true, message: "请选择上传任务", trigger: 'blur'},
+        ],
+        selectSubTaskArray: [
+          {required: true, message: "请选择子任务", trigger: 'blur'},
+        ],
+      },
+      uploadOption: [],
+      subTaskOpenTitle: "",
+      subTaskOpen: false,
+      task: {},
+    };
+  },
+  created() {
+    this.getList();
+    this.getOption();
+  },
+  activated() {
+    this.getOption()
+  },
+  methods: {
+    /** 查询知识抽取任务列表 */
+    getList() {
+      this.loading = true;
+      listTask(this.queryParams).then(response => {
+        this.taskList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    getOption(){
+      getOptionByName(null).then(resp => {
+        this.uploadOption = resp.data
+      })
+    },
+    changeUpload(item){
+      console.info(item)
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        uploadId: null,
+        name: null,
+        selectSubTaskArray: ["1"],
+        status: "0",
+        createBy: null,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加知识抽取任务";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getTask(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改知识抽取任务";
+      });
+    },
+    handleView(row){
+      //todo view
+      this.subTaskOpen = true;
+      this.task = row;
+      this.subTaskOpenTitle = row.name;
+      // alert("开发ing")
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateTask(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addTask(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除知识抽取任务编号为"' + ids + '"的数据项?').then(function() {
+        return delTask(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('extract/task/export', {
+        ...this.queryParams
+      }, `task_${new Date().getTime()}.xlsx`)
+    },
+    closedSubTaskDialog(){
+      // 暂时不处理任何事件
+    },
+  }
+};
+</script>

+ 2 - 2
src/views/knowledge/graphEntity/relationClsAttrEditor.vue

@@ -147,7 +147,7 @@
         if (this.direction === 'START') {
           startEntId = this.entId
           endEntId = data
-          
+
         } else {
           startEntId = data
           endEntId = this.entId
@@ -255,4 +255,4 @@
 
 <style scoped>
 
-</style>
+</style>

+ 0 - 2
src/views/knowledge/modal/createRelationClassModal.vue

@@ -190,7 +190,6 @@ export default {
     },
     getRelationCls() {
       this.$open('getRelationClsListModal', {}, function (data) {
-        debugger;
         if (data) {
           this.relClsName = data
           this.selectedRelCls = data
@@ -212,7 +211,6 @@ export default {
       return result;
     },
     async handleOk(e) {
-      debugger;
       let result = await this.getFormData(); // this是当前组件的this,  'form'此表单的名称,一定要是字符串
       const endID = this.EntityClassNode && this.EntityClassNode.entClsID;
       const relClsID = this.selectRelationValue;

+ 101 - 0
src/views/knowledge/search/chartByD3.vue

@@ -0,0 +1,101 @@
+<template>
+  <div class="app-container" ref="svgContainer"></div>
+</template>
+
+<script>
+import * as d3 from 'd3';
+
+export default {
+  mounted() {
+    const svgContainer = this.$refs.svgContainer;
+    const width = svgContainer.clientWidth;
+    const height = svgContainer.clientHeight;
+
+    const links = [
+      { source: "A", target: "B", value: 1 },
+      { source: "A", target: "C", value: 2 },
+      { source: "B", target: "C", value: 3 },
+      { source: "B", target: "D", value: 4 },
+      { source: "C", target: "D", value: 5 },
+    ];
+
+    const nodes = [
+      { id: "A", x: 100, y: 100 },
+      { id: "B", x: 200, y: 100 },
+      { id: "C", x: 150, y: 200 },
+      { id: "D", x: 250, y: 200 },
+    ];
+
+    const svg = d3.select(svgContainer).append("svg")
+      .attr("width", width)
+      .attr("height", height);
+
+    const link = svg.selectAll("line")
+      .data(links)
+      .join("line")
+      .attr("stroke", "black")
+      .attr("stroke-width", d => d.value);
+
+    const node = svg.selectAll("circle")
+      .data(nodes)
+      .join("circle")
+      .attr("r", 20)
+      .attr("fill", "red")
+      .call(drag(simulation));
+
+    const label = svg.selectAll("text")
+      .data(nodes)
+      .join("text")
+      .text(d => d.id)
+      .attr("x", d => d.x)
+      .attr("y", d => d.y);
+
+    const simulation = d3.forceSimulation(nodes)
+      .force("link", d3.forceLink(links).id(d => d.id))
+      .force("charge", d3.forceManyBody())
+      .force("center", d3.forceCenter(width / 2, height / 2));
+
+    simulation.on("tick", () => {
+      link
+        .attr("x1", d => d.source.x)
+        .attr("y1", d => d.source.y)
+        .attr("x2", d => d.target.x)
+        .attr("y2", d => d.target.y);
+
+      node
+        .attr("cx", d => d.x)
+        .attr("cy", d => d.y);
+
+      label
+        .attr("x", d => d.x)
+        .attr("y", d => d.y - 25);
+    });
+
+    function drag(simulation) {
+
+      function dragstarted(event) {
+        if (!event.active) simulation.alphaTarget(0.3).restart();
+        event.subject.fx = event.subject.x;
+        event.subject.fy = event.subject.y;
+      }
+
+      function dragged(event) {
+        event.subject.fx = event.x;
+        event.subject.fy = event.y;
+      }
+
+      function dragended(event) {
+        if (!event.active) simulation.alphaTarget(0);
+        event.subject.fx = null;
+        event.subject.fy = null;
+      }
+
+      return d3.drag()
+        .on("start", dragstarted)
+        .on("drag",
+          dragged)
+        .on("end", dragended);
+    }
+  }
+}
+</script>

+ 107 - 0
src/views/knowledge/search/chartByD3v1.vue

@@ -0,0 +1,107 @@
+<template>
+  <div class="app-container" ref="svgContainer"></div>
+</template>
+
+<script>
+import * as d3 from 'd3';
+
+export default {
+  mounted() {
+    const svgContainer = this.$refs.svgContainer;
+    const width = svgContainer.clientWidth;
+    const height = svgContainer.clientHeight;
+
+    const links = [
+      { source: "A", target: "B", value: 1 },
+      { source: "A", target: "C", value: 2 },
+      { source: "B", target: "C", value: 3 },
+      { source: "B", target: "D", value: 4 },
+      { source: "C", target: "D", value: 5 },
+    ];
+
+    const nodes = [
+      { id: "A", x: 100, y: 100 },
+      { id: "B", x: 200, y: 100 },
+      { id: "C", x: 150, y: 200 },
+      { id: "D", x: 250, y: 200 },
+    ];
+
+    const svg = d3.select(svgContainer).append("svg")
+      .attr("width", width)
+      .attr("height", height);
+
+    const link = svg.selectAll("line")
+      .data(links)
+      .join("line")
+      .attr("stroke", "black")
+      .attr("stroke-width", d => d.value);
+
+    const node = svg.selectAll("circle")
+      .data(nodes)
+      .join("circle")
+      .attr("r", 20)
+      .attr("fill", "red")
+      .call(drag(simulation));
+
+    const label = svg.selectAll("text")
+      .data(nodes)
+      .join("text")
+      .text(d => d.id)
+      .attr("x", d => d.x)
+      .attr("y", d => d.y);
+
+    const simulation = d3.forceSimulation(nodes)
+      .force("link", d3.forceLink(links).id(d => d.id))
+      .force("charge", d3.forceManyBody())
+      .force("center", d3.forceCenter(width / 2, height / 2));
+
+    simulation.on("tick", () => {
+      link
+        .attr("x1", d => d.source.x)
+        .attr("y1", d => d.source.y)
+        .attr("x2", d => d.target.x)
+        .attr("y2", d => d.target.y);
+
+      node
+        .attr("cx", d => d.x)
+        .attr("cy", d => d.y);
+
+      label
+        .attr("x", d => d.x)
+        .attr("y", d => d.y - 25);
+    });
+
+    function drag(simulation) {
+
+      function dragstarted(event) {
+        if (!event.active) simulation.alphaTarget(0.3).restart();
+        event.subject.fx = event.subject.x;
+        event.subject.fy = event.subject.y;
+      }
+
+      function dragged(event) {
+        event.subject.fx = event.x;
+        event.subject.fy = event.y;
+      }
+
+      function dragended(event) {
+        if (!event.active) simulation.alphaTarget(0);
+        event.subject.fx = null;
+        event.subject.fy = null;
+      }
+
+      return d3.drag()
+        .on("start", dragstarted)
+        .on("drag",
+          dragged)
+        .on("end", dragended);
+    }
+  }
+}
+</script>
+
+<style>
+svg {
+  background-color: #eee;
+}
+</style>

+ 175 - 0
src/views/knowledge/search/index.vue

@@ -0,0 +1,175 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item prop="firstName">
+        <el-input
+          v-model="queryParams.firstName"
+          placeholder="请输入"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item prop="secondName">
+        <el-input
+          v-model="queryParams.secondName"
+          placeholder="请输入"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item prop="length">
+        <!-- <el-input
+          v-model="queryParams.length"
+          placeholder="请输入"
+          clearable
+          @keyup.enter.native="handleQuery"
+        /> -->
+        <el-select v-model="queryParams.length" placeholder="请选择任务状态">
+          <el-option
+            v-for="dict in dict.type.graph_search_length"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <Chart
+      ref="chart"
+      @changeRoot="redrawChart"
+      @c_click="getInfoTooltip"
+      :isShowChart="true"
+      :enable="true"
+      @reloadChart="reloadChart"
+      :showRelKey="true"
+      :nodes="nodes"
+      :links="links"
+      :isEntChart="true"
+      :contextMenu="['delete']"
+      :isShowContextMenu="true"
+      @delete="delNode"
+    />
+  </div>
+</template>
+
+<script>
+import Chart from "@/views/knowledge/common/chart";
+import { getGraphByEntiry } from "@/api/knowledge/search";
+
+// 获取路径参数
+function getQueryVariable(variable) {
+	let url = window.location.hash
+	let index = url.indexOf('?')
+	var query = url.substring(index + 1, url.length)
+	var vars = query.split('&')
+	for (var i = 0; i < vars.length; i++) {
+		var pair = vars[i].split('=')
+		if (pair[0] == variable) {
+			return pair[1]
+		}
+	}
+	return ''
+}
+
+export default {
+  name: "GranphSearch",
+  dicts: ["graph_search_length"],
+  components: { Chart },
+  data() {
+    return {
+      queryParams: {
+        firstName: "转向机",
+        secondName: "转向轴",
+        length: "0",
+      },
+      nodes: [],
+      links: [],
+      spinning : false,
+      tooltip: { entId: false, relID: false }, // 点击的实体或关系的悬浮层
+      chartType: true,
+    };
+  },
+  methods: {
+    handleQuery() {
+      this.redrawChart()
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      alert("clear");
+    },
+    /**
+     * 点击搜索重新绘图
+     * @params id 选中的实力的ID
+     * */
+    redrawChart() {
+      this.spinning = true;
+      getGraphByEntiry(this.queryParams).then((resp) => {
+        let respData = resp.data
+        this.rootId = 1;
+        this.tooltip.entId = false;
+        this.tooltip.relID = false;
+        this.nodes = respData.data;
+        this.links = respData.links;
+        this.$refs.chart.reDraw(1, respData.data, respData.links);
+        this.spinning = false;
+      });
+    },
+    /**
+     * 获取实体或关系的悬浮框
+     * @params event:zoomchart返回的event,args:zoomchart返回的变量,包含了当前点击的实体或关系的数据
+     * */
+    getInfoTooltip(event, args) {
+      const vm = this;
+      this.$set(this.tooltip, "x", event.pageX + "px");
+      this.$set(this.tooltip, "y", event.pageY + "px");
+      if (args.clickNode) {
+        vm.tooltip.entId = args.clickNode.data.entId;
+        vm.tooltip.relID = false;
+      } else if (args.clickLink) {
+        vm.tooltip.entId = false;
+        vm.tooltip.relID = args.clickLink.data.relID;
+      } else {
+        vm.tooltip.entId = false;
+        vm.tooltip.relID = false;
+      }
+    },
+    reloadChart(nodes, links) {
+      const id = getQueryVariable("entId");
+      this.$refs.chart.drawChart(id, nodes, links);
+    },
+    // 选中一个图谱节点后的回调,排除
+    delNode(item) {
+      if (item[0].id == this.rootId) {
+        this.$message.info("中心点不能删除");
+        return;
+      }
+      if (this.delEntIds.length > 0) {
+        this.delEntIds.forEach((v, i) => {
+          if (v.id !== item[0].id) {
+            this.delEntIds.push(item[0]);
+          }
+        });
+      } else {
+        this.delEntIds.push(item[0]);
+      }
+      getGraphByEntiry(this.queryParams).then((resp) => {
+        let respData = resp.data
+        this.$refs.chart.reDraw(1, respData.data, respData.links);
+      });
+    },
+  },
+};
+</script>

+ 0 - 1
src/views/search/pdf/view.vue

@@ -44,7 +44,6 @@ export default {
     methods:{
         //计算pdf页码总数
         getPDFnums(url) {
-            debugger
             this.loading = true
             //let loadURL = pdf.createLoadingTask(url)
             let loadURL = pdf.createLoadingTask({

+ 372 - 0
src/views/upload/dataManage/index.vue

@@ -0,0 +1,372 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="上传管理主键" prop="uploadId">
+        <el-input
+          v-model="queryParams.uploadId"
+          placeholder="请输入上传管理主键"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['upload:dataManage:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['upload:dataManage:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['upload:dataManage:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['upload:dataManage:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="dataManageList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column label="上传管理主键" align="center" prop="uploadId" />
+      <el-table-column label="额外存储1,具体内容跟由模板类型定义" align="center" prop="extra1" />
+      <el-table-column label="额外存储2,具体内容跟由模板类型定义" align="center" prop="extra2" />
+      <el-table-column label="额外存储3,具体内容跟由模板类型定义" align="center" prop="extra3" />
+      <el-table-column label="额外存储4,具体内容跟由模板类型定义" align="center" prop="extra4" />
+      <el-table-column label="额外存储5,具体内容跟由模板类型定义" align="center" prop="extra5" />
+      <el-table-column label="额外存储6,具体内容跟由模板类型定义" align="center" prop="extra6" />
+      <el-table-column label="额外存储7,具体内容跟由模板类型定义" align="center" prop="extra7" />
+      <el-table-column label="额外存储8,具体内容跟由模板类型定义" align="center" prop="extra8" />
+      <el-table-column label="额外存储9,具体内容跟由模板类型定义" align="center" prop="extra9" />
+      <el-table-column label="额外存储10,具体内容跟由模板类型定义" align="center" prop="extra10" />
+      <el-table-column label="额外存储11,具体内容跟由模板类型定义" align="center" prop="extra11" />
+      <el-table-column label="额外存储12,具体内容跟由模板类型定义" align="center" prop="extra12" />
+      <el-table-column label="额外存储13,具体内容跟由模板类型定义" align="center" prop="extra13" />
+      <el-table-column label="额外存储14,具体内容跟由模板类型定义" align="center" prop="extra14" />
+      <el-table-column label="额外存储15,具体内容跟由模板类型定义" align="center" prop="extra15" />
+      <el-table-column label="额外存储16,具体内容跟由模板类型定义" align="center" prop="extra16" />
+      <el-table-column label="额外存储17,具体内容跟由模板类型定义" align="center" prop="extra17" />
+      <el-table-column label="额外存储18,具体内容跟由模板类型定义" align="center" prop="extra18" />
+      <el-table-column label="额外存储19,具体内容跟由模板类型定义" align="center" prop="extra19" />
+      <el-table-column label="额外存储20,具体内容跟由模板类型定义" align="center" prop="extra20" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['upload:dataManage:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['upload:dataManage:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改数据管理对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="上传管理主键" prop="uploadId">
+          <el-input v-model="form.uploadId" placeholder="请输入上传管理主键" />
+        </el-form-item>
+        <el-form-item label="额外存储1,具体内容跟由模板类型定义" prop="extra1">
+          <el-input v-model="form.extra1" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储2,具体内容跟由模板类型定义" prop="extra2">
+          <el-input v-model="form.extra2" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储3,具体内容跟由模板类型定义" prop="extra3">
+          <el-input v-model="form.extra3" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储4,具体内容跟由模板类型定义" prop="extra4">
+          <el-input v-model="form.extra4" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储5,具体内容跟由模板类型定义" prop="extra5">
+          <el-input v-model="form.extra5" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储6,具体内容跟由模板类型定义" prop="extra6">
+          <el-input v-model="form.extra6" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储7,具体内容跟由模板类型定义" prop="extra7">
+          <el-input v-model="form.extra7" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储8,具体内容跟由模板类型定义" prop="extra8">
+          <el-input v-model="form.extra8" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储9,具体内容跟由模板类型定义" prop="extra9">
+          <el-input v-model="form.extra9" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储10,具体内容跟由模板类型定义" prop="extra10">
+          <el-input v-model="form.extra10" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储11,具体内容跟由模板类型定义" prop="extra11">
+          <el-input v-model="form.extra11" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储12,具体内容跟由模板类型定义" prop="extra12">
+          <el-input v-model="form.extra12" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储13,具体内容跟由模板类型定义" prop="extra13">
+          <el-input v-model="form.extra13" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储14,具体内容跟由模板类型定义" prop="extra14">
+          <el-input v-model="form.extra14" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储15,具体内容跟由模板类型定义" prop="extra15">
+          <el-input v-model="form.extra15" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储16,具体内容跟由模板类型定义" prop="extra16">
+          <el-input v-model="form.extra16" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储17,具体内容跟由模板类型定义" prop="extra17">
+          <el-input v-model="form.extra17" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储18,具体内容跟由模板类型定义" prop="extra18">
+          <el-input v-model="form.extra18" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储19,具体内容跟由模板类型定义" prop="extra19">
+          <el-input v-model="form.extra19" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储20,具体内容跟由模板类型定义" prop="extra20">
+          <el-input v-model="form.extra20" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listDataManage, getDataManage, delDataManage, addDataManage, updateDataManage } from "@/api/upload/dataManage";
+
+export default {
+  name: "DataManage",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 数据管理表格数据
+      dataManageList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        uploadId: null,
+        extra1: null,
+        extra2: null,
+        extra3: null,
+        extra4: null,
+        extra5: null,
+        extra6: null,
+        extra7: null,
+        extra8: null,
+        extra9: null,
+        extra10: null,
+        extra11: null,
+        extra12: null,
+        extra13: null,
+        extra14: null,
+        extra15: null,
+        extra16: null,
+        extra17: null,
+        extra18: null,
+        extra19: null,
+        extra20: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        uploadId: [
+          { required: true, message: "上传管理主键不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询数据管理列表 */
+    getList() {
+      this.loading = true;
+      listDataManage(this.queryParams).then(response => {
+        this.dataManageList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        uploadId: null,
+        extra1: null,
+        extra2: null,
+        extra3: null,
+        extra4: null,
+        extra5: null,
+        extra6: null,
+        extra7: null,
+        extra8: null,
+        extra9: null,
+        extra10: null,
+        extra11: null,
+        extra12: null,
+        extra13: null,
+        extra14: null,
+        extra15: null,
+        extra16: null,
+        extra17: null,
+        extra18: null,
+        extra19: null,
+        extra20: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加数据管理";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getDataManage(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改数据管理";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateDataManage(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addDataManage(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除数据管理编号为"' + ids + '"的数据项?').then(function() {
+        return delDataManage(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('upload/dataManage/export', {
+        ...this.queryParams
+      }, `dataManage_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 372 - 0
src/views/upload/detail/index.vue

@@ -0,0 +1,372 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="上传管理主键" prop="uploadId">
+        <el-input
+          v-model="queryParams.uploadId"
+          placeholder="请输入上传管理主键"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['uploadDetail:accident:add']"
+        >新增</el-button>
+      </el-col> -->
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['uploadDetail:accident:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['uploadDetail:accident:remove']"
+        >删除</el-button>
+      </el-col>
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['uploadDetail:accident:export']"
+        >导出</el-button>
+      </el-col> -->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="accidentList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column label="上传管理主键" align="center" prop="uploadId" />
+      <el-table-column label="事故来源文件名称" align="center" prop="extra1" />
+      <el-table-column label="事故来源文件期数" align="center" prop="extra2" />
+      <el-table-column label="事故名称,事故纯文本" align="center" prop="extra3" />
+      <el-table-column label="事故过程描述" align="center" prop="extra4" />
+      <el-table-column label="事故可能原因" align="center" prop="extra5" />
+      <el-table-column label="事故影响因素" align="center" prop="extra6" />
+      <el-table-column label="调查报告结论" align="center" prop="extra7" />
+      <el-table-column label="事故详细后果" align="center" prop="extra8" />
+      <el-table-column label="措施建议详情" align="center" prop="extra9" />
+      <el-table-column label="事故描表述" align="center" prop="extra10" />
+      <el-table-column label="事故详细过程与后果" align="center" prop="extra11" />
+      <el-table-column label="原因总结" align="center" prop="extra12" />
+      <el-table-column label="详细原因" align="center" prop="extra13" />
+      <el-table-column label="第一段文本" align="center" prop="extra14" />
+      <el-table-column label="事理图谱文本" align="center" prop="extra15" />
+      <!-- <el-table-column label="额外存储16,具体内容跟由模板类型定义" align="center" prop="extra16" />
+      <el-table-column label="额外存储17,具体内容跟由模板类型定义" align="center" prop="extra17" />
+      <el-table-column label="额外存储18,具体内容跟由模板类型定义" align="center" prop="extra18" />
+      <el-table-column label="额外存储19,具体内容跟由模板类型定义" align="center" prop="extra19" />
+      <el-table-column label="额外存储20,具体内容跟由模板类型定义" align="center" prop="extra20" /> -->
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['uploadDetail:accident:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['uploadDetail:accident:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改事故信息对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="上传管理主键" prop="uploadId">
+          <el-input v-model="form.uploadId" placeholder="请输入上传管理主键" />
+        </el-form-item>
+        <el-form-item label="事故来源文件名称" prop="extra1">
+          <el-input v-model="form.extra1" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故来源文件期数" prop="extra2">
+          <el-input v-model="form.extra2" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故名称,事故纯文本" prop="extra3">
+          <el-input v-model="form.extra3" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故过程描述" prop="extra4">
+          <el-input v-model="form.extra4" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故可能原因" prop="extra5">
+          <el-input v-model="form.extra5" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故影响因素" prop="extra6">
+          <el-input v-model="form.extra6" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="调查报告结论" prop="extra7">
+          <el-input v-model="form.extra7" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故详细后果" prop="extra8">
+          <el-input v-model="form.extra8" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="措施建议详情" prop="extra9">
+          <el-input v-model="form.extra9" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故描表述" prop="extra10">
+          <el-input v-model="form.extra10" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故详细过程与后果" prop="extra11">
+          <el-input v-model="form.extra11" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="原因总结" prop="extra12">
+          <el-input v-model="form.extra12" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="详细原因" prop="extra13">
+          <el-input v-model="form.extra13" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="第一段文本" prop="extra14">
+          <el-input v-model="form.extra14" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事理图谱文本" prop="extra15">
+          <el-input v-model="form.extra15" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <!-- <el-form-item label="额外存储16,具体内容跟由模板类型定义" prop="extra16">
+          <el-input v-model="form.extra16" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储17,具体内容跟由模板类型定义" prop="extra17">
+          <el-input v-model="form.extra17" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储18,具体内容跟由模板类型定义" prop="extra18">
+          <el-input v-model="form.extra18" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储19,具体内容跟由模板类型定义" prop="extra19">
+          <el-input v-model="form.extra19" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储20,具体内容跟由模板类型定义" prop="extra20">
+          <el-input v-model="form.extra20" type="textarea" placeholder="请输入内容" /> 
+        </el-form-item>-->
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { list, get, update, del } from "@/api/upload/detail";
+
+export default {
+  name: "Accident",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 事故信息表格数据
+      accidentList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        uploadId: null,
+        extra1: null,
+        extra2: null,
+        extra3: null,
+        extra4: null,
+        extra5: null,
+        extra6: null,
+        extra7: null,
+        extra8: null,
+        extra9: null,
+        extra10: null,
+        extra11: null,
+        extra12: null,
+        extra13: null,
+        extra14: null,
+        extra15: null,
+        extra16: null,
+        extra17: null,
+        extra18: null,
+        extra19: null,
+        extra20: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        uploadId: [
+          { required: true, message: "上传管理主键不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询事故信息列表 */
+    getList() {
+      this.loading = true;
+      list("3", this.queryParams).then(response => {
+        this.accidentList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        uploadId: null,
+        extra1: null,
+        extra2: null,
+        extra3: null,
+        extra4: null,
+        extra5: null,
+        extra6: null,
+        extra7: null,
+        extra8: null,
+        extra9: null,
+        extra10: null,
+        extra11: null,
+        extra12: null,
+        extra13: null,
+        extra14: null,
+        extra15: null,
+        extra16: null,
+        extra17: null,
+        extra18: null,
+        extra19: null,
+        extra20: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加事故信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      get("3" ,id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改事故信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            update('3', this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            // add(this.form).then(response => {
+            //   this.$modal.msgSuccess("新增成功");
+            //   this.open = false;
+            //   this.getList();
+            // });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除事故信息编号为"' + ids + '"的数据项?').then(function() {
+        return del("3", ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('uploadDetail/accident/export', {
+        ...this.queryParams
+      }, `accident_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 362 - 0
src/views/upload/uploadManage/index.vue

@@ -0,0 +1,362 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="文件名称" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入文件名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="模板类型" prop="templateType">
+        <el-select v-model="queryParams.templateType" placeholder="请选择模板类型" clearable>
+          <el-option
+            v-for="dict in dict.type.kg_upload_template"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="数据类型" prop="dataType">
+        <el-select v-model="queryParams.dataType" placeholder="请选择数据类型" clearable>
+          <el-option
+            v-for="dict in dict.type.kg_upload_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['upload:uploadManage:add']"
+        >新增</el-button>
+      </el-col>
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['upload:uploadManage:edit']"
+        >修改</el-button>
+      </el-col> -->
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['upload:uploadManage:remove']"
+        >删除</el-button>
+      </el-col>
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['upload:uploadManage:export']"
+        >导出</el-button>
+      </el-col> -->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="uploadManageList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <!-- <el-table-column label="编号" align="center" prop="id" /> -->
+      <el-table-column label="文件名称" align="center" prop="name" />
+      <!-- <el-table-column label="模板类型" align="center" prop="templateType">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.kg_upload_template" :value="scope.row.templateType"/>
+        </template>
+      </el-table-column> -->
+      <el-table-column label="数据类型" align="center" prop="dataType">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.kg_upload_type" :value="scope.row.dataType"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.file_upload_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="数量" align="center" prop="amount" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            v-show="scope.row.status==1"
+            size="mini"
+            type="text"
+            @click="handleViewDetail(scope.row)"
+          >查看详情</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-download"
+            @click="handleDownload(scope.row)"
+            v-hasPermi="['upload:uploadManage:edit']"
+          >文件下载</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['upload:uploadManage:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改上传管理对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body :close-on-click-modal="false">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <!-- <el-form-item label="文件名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入文件名称" />
+        </el-form-item> -->
+        <el-form-item label="模板类型">
+          <!-- <el-radio-group v-model="form.templateType">
+            <el-radio
+              v-for="dict in dict.type.kg_upload_template"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group> -->
+          <el-button 
+            size="mini" 
+            v-for="dict in dict.type.kg_upload_template" 
+            :key="dict.value" 
+            icon="el-icon-download" 
+            plain 
+            type="primary"
+            @click="downlaodTemplate(dict.value)">
+            {{dict.label}}
+          </el-button>
+        </el-form-item>
+        <el-form-item label="数据类型" prop="dataType">
+          <el-radio-group v-model="form.dataType">
+            <el-radio
+              v-for="dict in dict.type.kg_upload_type"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="文件地址" prop="filePath">
+          <!-- <el-input v-model="form.filePath" placeholder="请输入文件地址" /> -->
+          <FileUpload ref="upload" v-model="form.filePath" :value="form.filePath" :limit=1 :fileSize=100 :fileType="uploadFileType" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog title="详情" v-if="accidentOpen" :visible.sync="accidentOpen" width="80%" append-to-body destroy-on-close :close-on-click-modal="false" @close="closedAccidentDialog">
+      <Accident :upload="upload" :accidentOpen.sync="accidentOpen"></Accident>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listUploadManage, getUploadManage, delUploadManage, addUploadManage, updateUploadManage } from "@/api/upload/uploadManage";
+import FileUpload from '@/components/FileUpload'
+import Accident from '@/views/uploadDetail/accident'
+export default {
+  name: "UploadManage",
+  components: { FileUpload, Accident },
+  dicts: ['kg_upload_type', 'kg_upload_template', 'file_upload_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 上传管理表格数据
+      uploadManageList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      uploadFileType: ["pdf","xml","xls","xlsx"],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+        templateType: null,
+        dataType: null,
+        fileType: null,
+        status: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        dataType: [
+          {required: true, message: '数据类型不能为空', trigger: 'change'},
+        ],
+        filePath: [
+          {required: true, message: '文件不能为空', trigger: 'change'},
+        ],
+      },
+      accidentOpen: false,
+      upload: {},
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询上传管理列表 */
+    getList() {
+      this.loading = true;
+      listUploadManage(this.queryParams).then(response => {
+        this.uploadManageList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        name: null,
+        templateType: "0",
+        dataType: "1",
+        fileType: null,
+        filePath: null,
+        status: "0",
+        amount: 1,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null
+      };
+      if(this.$refs.upload){
+        this.$refs.upload.reset()
+      }
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加上传管理";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getUploadManage(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改上传管理";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateUploadManage(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUploadManage(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除上传管理编号为"' + ids + '"的数据项?').then(function() {
+        return delUploadManage(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('upload/uploadManage/export', {
+        ...this.queryParams
+      }, `uploadManage_${new Date().getTime()}.xlsx`)
+    },
+    handleDownload(row) {
+      this.$download.name(row.filePath, false).then((resp) => { console.info(resp) })
+    },
+    downlaodTemplate(typeValue){
+      this.download(`/upload/dataDetail/downloadTemplate/${typeValue}`, {
+      }, `accident_template.xlsx`)
+    },
+    handleViewDetail(row){
+      this.upload = row
+      this.accidentOpen = true
+    }
+  }
+};
+</script>

+ 362 - 0
src/views/uploadDetail/accident/index.vue

@@ -0,0 +1,362 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="10" class="mb8">
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['uploadDetail:accident:add']"
+        >新增</el-button>
+      </el-col> -->
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['uploadDetail:accident:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['uploadDetail:accident:remove']"
+        >删除</el-button>
+      </el-col>
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['uploadDetail:accident:export']"
+        >导出</el-button>
+      </el-col> -->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="accidentList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <!-- <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column label="上传管理主键" align="center" prop="uploadId" /> -->
+      <el-table-column label="事故来源文件名称" align="center" prop="extra1" />
+      <el-table-column label="事故来源文件期数" align="center" prop="extra2" />
+      <el-table-column label="事故名称,事故纯文本" align="center" prop="extra3" />
+      <el-table-column label="事故过程描述" align="center" prop="extra4" />
+      <el-table-column label="事故可能原因" align="center" prop="extra5" />
+      <el-table-column label="事故影响因素" align="center" prop="extra6" />
+      <el-table-column label="调查报告结论" align="center" prop="extra7" />
+      <el-table-column label="事故详细后果" align="center" prop="extra8" />
+      <el-table-column label="措施建议详情" align="center" prop="extra9" />
+      <el-table-column label="事故描表述" align="center" prop="extra10" />
+      <el-table-column label="事故详细过程与后果" align="center" prop="extra11" />
+      <el-table-column label="原因总结" align="center" prop="extra12" />
+      <el-table-column label="详细原因" align="center" prop="extra13" />
+      <el-table-column label="第一段文本" align="center" prop="extra14" />
+      <el-table-column label="事理图谱文本" align="center" prop="extra15" />
+      <!-- <el-table-column label="额外存储16,具体内容跟由模板类型定义" align="center" prop="extra16" />
+      <el-table-column label="额外存储17,具体内容跟由模板类型定义" align="center" prop="extra17" />
+      <el-table-column label="额外存储18,具体内容跟由模板类型定义" align="center" prop="extra18" />
+      <el-table-column label="额外存储19,具体内容跟由模板类型定义" align="center" prop="extra19" />
+      <el-table-column label="额外存储20,具体内容跟由模板类型定义" align="center" prop="extra20" /> -->
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['uploadDetail:accident:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['uploadDetail:accident:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改事故信息对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="80%" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="200px">
+        <!-- <el-form-item label="上传管理主键" prop="uploadId">
+          <el-input v-model="form.uploadId" placeholder="请输入上传管理主键" />
+        </el-form-item> -->
+        <el-form-item label="事故来源文件名称" prop="extra1">
+          <el-input v-model="form.extra1" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故来源文件期数" prop="extra2">
+          <el-input v-model="form.extra2" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故名称,事故纯文本" prop="extra3">
+          <el-input v-model="form.extra3" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故过程描述" prop="extra4">
+          <el-input v-model="form.extra4" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故可能原因" prop="extra5">
+          <el-input v-model="form.extra5" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故影响因素" prop="extra6">
+          <el-input v-model="form.extra6" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="调查报告结论" prop="extra7">
+          <el-input v-model="form.extra7" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故详细后果" prop="extra8">
+          <el-input v-model="form.extra8" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="措施建议详情" prop="extra9">
+          <el-input v-model="form.extra9" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故描表述" prop="extra10">
+          <el-input v-model="form.extra10" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事故详细过程与后果" prop="extra11">
+          <el-input v-model="form.extra11" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="原因总结" prop="extra12">
+          <el-input v-model="form.extra12" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="详细原因" prop="extra13">
+          <el-input v-model="form.extra13" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="第一段文本" prop="extra14">
+          <el-input v-model="form.extra14" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="事理图谱文本" prop="extra15">
+          <el-input v-model="form.extra15" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <!-- <el-form-item label="额外存储16,具体内容跟由模板类型定义" prop="extra16">
+          <el-input v-model="form.extra16" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储17,具体内容跟由模板类型定义" prop="extra17">
+          <el-input v-model="form.extra17" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储18,具体内容跟由模板类型定义" prop="extra18">
+          <el-input v-model="form.extra18" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储19,具体内容跟由模板类型定义" prop="extra19">
+          <el-input v-model="form.extra19" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="额外存储20,具体内容跟由模板类型定义" prop="extra20">
+          <el-input v-model="form.extra20" type="textarea" placeholder="请输入内容" /> 
+        </el-form-item>-->
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { list, get, update, del } from "@/api/upload/detail";
+
+export default {
+  name: "Accident",
+  props: {
+    upload: {
+      type: Object,
+    },
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 事故信息表格数据
+      accidentList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        uploadId: this.upload.id,
+        extra1: null,
+        extra2: null,
+        extra3: null,
+        extra4: null,
+        extra5: null,
+        extra6: null,
+        extra7: null,
+        extra8: null,
+        extra9: null,
+        extra10: null,
+        extra11: null,
+        extra12: null,
+        extra13: null,
+        extra14: null,
+        extra15: null,
+        extra16: null,
+        extra17: null,
+        extra18: null,
+        extra19: null,
+        extra20: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        uploadId: [
+          { required: true, message: "上传管理主键不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询事故信息列表 */
+    getList() {
+      this.loading = true;
+      list("4", this.queryParams).then(response => {
+        this.accidentList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        uploadId: null,
+        extra1: null,
+        extra2: null,
+        extra3: null,
+        extra4: null,
+        extra5: null,
+        extra6: null,
+        extra7: null,
+        extra8: null,
+        extra9: null,
+        extra10: null,
+        extra11: null,
+        extra12: null,
+        extra13: null,
+        extra14: null,
+        extra15: null,
+        extra16: null,
+        extra17: null,
+        extra18: null,
+        extra19: null,
+        extra20: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加事故信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      get("4", id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改事故信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            update('4', this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            // add(this.form).then(response => {
+            //   this.$modal.msgSuccess("新增成功");
+            //   this.open = false;
+            //   this.getList();
+            // });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除事故信息编号为"' + ids + '"的数据项?').then(function() {
+        return del("4", ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('uploadDetail/accident/export', {
+        ...this.queryParams
+      }, `accident_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 2 - 1
vue.config.js

@@ -35,7 +35,8 @@ module.exports = {
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        target: `http://47.108.150.237:11082`,
+        // target: `http://47.108.150.237:11082`,
+        target: `http://localhost:11082`,
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä