Z пре 1 година
родитељ
комит
a542a5c295

+ 1 - 1
.env

@@ -1,2 +1,2 @@
-VUE_APP_NAME=项目管理系统
+VUE_APP_NAME=文档管理系统
 VUE_APP_API_BASE_URL=/api

+ 151 - 0
src/api/doc-manage/index.js

@@ -0,0 +1,151 @@
+import request from '@/utils/request';
+
+/**
+ * 查询文件夹分类数据
+ * @data data
+ */
+export async function getDocTreeListAPI(data) {
+  const res = await request.post('/fm/directory/selectTreeList', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+/**
+ * 保存
+ * @data data
+ */
+export async function directorySaveAPI(data) {
+  const res = await request.post('/fm/directory/save', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+/**
+ * 修改
+ * @data data
+ */
+export async function directoryUpdateAPi(data) {
+  const res = await request.put('/fm/directory/update', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+/**
+ * 详情
+ * @id id
+ */
+export async function directoryGetByIdAPI(id) {
+  const res = await request.get(`/fm/directory/getById/{id}`);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+/**
+ * 删除
+ * @id id
+ */
+export async function directoryDeleteAPI(data) {
+  const res = await request.delete(`/fm/directory/delete`,{data});
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/**
+* 查询文件数据
+* @data data
+*/
+export async function filePageAPI(data) {
+  const res = await request.post('/fm/file/page', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+/**
+ * 保存
+ * @data data
+ */
+export async function fileSaveAPI(data) {
+  const res = await request.post('/fm/file/save', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+/**
+ * 修改
+ * @data data
+ */
+export async function fileUpdateAPI(data) {
+  const res = await request.put('/fm/file/update', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+/**
+ * 详情
+ * @id id
+ */
+export async function fileGetByIdAPI(id) {
+  const res = await request.get(`/fm/file/getById/{id}`);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+/**
+ * 删除
+ * @id id
+ */
+export async function fileDeleteAPI(data) {
+  const res = await request.delete(`/fm/file/delete`,{data});
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+

+ 0 - 118
src/api/project-manage/index.js

@@ -1,118 +0,0 @@
-import request from '@/utils/request';
-
-/**
- * 查询项目列表
- * @data data
- */
-export async function projectsPageAPI(data) {
-  const res = await request.post('/pro/projects/page', data);
-  if (res.data.code == 0) {
-    return res.data.data.list;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 项目保存
- * @data data
- */
-export async function projectsSaveAPI(data) {
-  const res = await request.post('/pro/projects/save', data);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 项目修改
- * @data data
- */
-export async function projectsUpdateAPI(data) {
-  const res = await request.put('/pro/projects/update', data);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 项目详情
- * @id id
- */
-export async function projectsGetByIdAPI(id) {
-  const res = await request.get(`/pro/projects/getById/${id}`);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 项目查询项目结构树
- * @id id
- */
-export async function projectsToTreeAPI(params){
-  const res = await request.get(`/pro/projects/selectProjectsToTree`,{params});
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 项目详情明细信息(含子集阶段、计划、任务)
- * @id id
- */
-export async function projectsGetByIdDetailsAPI(id){
-  const res = await request.get(`/pro/projects/getByIdDetails/${id}`,);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 逐级查询项目各层级列表数据
- * @id id
- */
-export async function projectsSelectTreeDataAPI(params){
-  const res = await request.get(`/pro/projects/selectTreeDatas`,{params});
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 根据类型获取项目编码
- * @id id
- */
-export async function getProjectCode(type){
-  const res = await request.get(`/pro/projects/getProjectCode/${type}`,);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-
-
-
-
-
-/**
- * 项目删除
- * @id id
- */
-export async function projectsDeleteAPI(data) {
-  const res = await request.delete(`/pro/projects/delete`,{data});
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-
-/**
- * 提交
- */
-export async function submit(data) {
-  const res = await request.post(`/bpm/pro/project/submit`, data);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-

+ 0 - 80
src/api/project-manage/plan.js

@@ -1,80 +0,0 @@
-import request from '@/utils/request';
-
-/**
- * 查询计划列表
- * @data data
- */
-export async function projectsPlanPageAPI(data) {
-  const res = await request.post('/pro/targetplan/page', data);
-  if (res.data.code == 0) {
-    return res.data.data.list;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-
-/**
- * 保存计划
- * @data data
- */
-export async function projectsPlanSaveAPI(data) {
-  const res = await request.post('/pro/targetplan/save', data);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 修改计划
- * @data data
- */
-export async function projectsPlanUpdateAPI(data) {
-  const res = await request.put('/pro/targetplan/update', data);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 计划详情
- * @id id
- */
-export async function projectsPlanGetByIdAPI(id) {
-  const res = await request.get(`/pro/targetplan/getById/${id}`);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 获取计划编码
- * @id id
- */
-export async function getTargetPlanCode() {
-  const res = await request.get(`/pro/targetplan/getTargetPlanCode`);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 计划删除
- * @id id
- */
-export async function projectsPlanDeleteAPI(data) {
-  const res = await request.delete(`/pro/targetplan/delete`,{data});
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-
-/**
- * 提交
- */
-export async function submit(data) {
-  const res = await request.post(`/bpm/pro/targetplan/submit`, data);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}

+ 0 - 126
src/api/project-manage/task.js

@@ -1,126 +0,0 @@
-import request from '@/utils/request';
-
-/**
- * 查询任务列表
- * @data data
- */
-export async function projectsTaskPageAPI(data) {
-  const res = await request.post('/pro/projectstask/page', data);
-  if (res.data.code == 0) {
-    return res.data.data.list;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-
-/**
- * 保存任务
- * @data data
- */
-export async function projectsTaskSaveAPI(data) {
-  const res = await request.post('/pro/projectstask/save', data);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 修改任务
- * @data data
- */
-export async function projectsTaskUpdateAPI(data) {
-  const res = await request.put('/pro/projectstask/update', data);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 转派
- * @data data
- */
-export async function updateTaskResponsibleUserAPI(data) {
-  const res = await request.put('/pro/projectstask/updateTaskResponsibleUser', data);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 任务详情
- * @id id
- */
-export async function projectsTaskGetByIdAPI(id) {
-  const res = await request.get(`/pro/projectstask/getById/${id}`);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 获取任务编码
- * @id id
- */
-export async function getTaskCodeAPI() {
-  const res = await request.get(`/pro/projectstask/getTaskCode`);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 任务删除
- * @id id
- */
-export async function projectsTaskDeleteAPI(data) {
-  const res = await request.delete(`/pro/projectstask/delete`,{data});
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 根据项目查询所有任务
- * @id id
- */
-export async function getBeforeTaskListAPI(id) {
-  const res = await request.get(`/pro/projects/getbeforeTaskList/${id}`,);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-
-/**
- * 修改任务状态 -报工
- */
-export async function projectsTaskOpRation(data) {
-  const res = await request.put(`/pro/projectstask/opration`, data);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 保存交付物
- */
-export async function projectsTaskFileListUpdateAPI(data) {
-  const res = await request.put(`/pro/projectstaskfiles/updateTaskFileList`, data);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-
-
-
-
-/**
- * 提交交付物
- */
-export async function taskFilesSubmit(data) {
-  const res = await request.post(`/bpm/pro/taskfiles/submit`, data);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}

+ 0 - 80
src/api/project-manage/team.js

@@ -1,80 +0,0 @@
-import request from '@/utils/request';
-
-/**
- * 团队列表
- * @data data
- */
-export async function projectsTeamPageAPI(data) {
-  const res = await request.post('/pro/projectteam/page', data);
-  if (res.data.code == 0) {
-    return res.data.data.list;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-
-/**
- * 保存团队
- * @data data
- */
-export async function projectsTeamSaveAPI(data) {
-  const res = await request.post('/pro/projectteam/save', data);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 修改团队
- * @data data
- */
-export async function projectsTeamUpdateAPI(data) {
-  const res = await request.put('/pro/projectteam/update', data);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 团队详情
- * @id id
- */
-export async function projectsTeamGetByIdAPI(id) {
-  const res = await request.get(`/pro/projectteam/getById/${id}`);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 获取团队编码
- * @id id
- */
-export async function getProjectTeamCodeAPI() {
-  const res = await request.get(`/pro/projectteam/getProjectTeamCode`);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-/**
- * 团队删除
- * @id id
- */
-export async function projectsTeamDeleteAPI(data) {
-  const res = await request.delete(`/pro/projectteam/delete`,{data});
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}
-
-/**
- * 提交
- */
-export async function submit(data) {
-  const res = await request.post(`/bpm/pro/team/submit`, data);
-  if (res.data.code == 0) {
-    return res.data.data;
-  }
-  return Promise.reject(new Error(res.data.message));
-}

+ 6 - 1
src/components/upload/fileUpload.vue

@@ -150,7 +150,7 @@
     computed: {
       fileList: {
         set (val) {
-          // console.log(val);
+           // console.log(val);
           this.$emit(
             'input',
             val.map((item) => ({
@@ -158,6 +158,7 @@
               url: getImagePath(item.url)
             }))
           );
+
         },
         get () {
           // console.log(this.value, 2);
@@ -218,6 +219,9 @@
       },
       handleRemove (file, fileList) {
         this.fileList = fileList;
+        this.$nextTick(() => {
+          this.$emit('fileChange',this.fileList);
+        });
       },
       beforeUpload (file) {
         if (file.size / 1024 / 1024 > this.size) {
@@ -238,6 +242,7 @@
               ...(this.value || []),
               { ...file, url: res.data.storePath, ...res.data }
             ]);
+            this.$emit('fileChange', res.data);
           }
           return res.data;
         });

+ 1 - 1
src/config/setting.js

@@ -15,7 +15,7 @@ export const HIDE_FOOTERS = [
 ];
 
 // 系统名称
-export const SYSTEM_NAME = 'pro';
+export const SYSTEM_NAME = 'fm';
 
 // 页签同路由不同参数可重复打开的路由
 export const REPEATABLE_TABS = [];

+ 3 - 3
src/layout/components/header-tools.vue

@@ -21,9 +21,9 @@
     <div class="ele-admin-header-tool-item">
       <el-dropdown @command="onUserDropClick">
         <div class="ele-admin-header-avatar">
-          <el-avatar
-            :src="loginUser && loginUser.avatar ? loginUser.avatar : ''"
-          />
+<!--          <el-avatar-->
+<!--            :src="loginUser && loginUser.avatar ? loginUser.avatar : ''"-->
+<!--          />-->
           <span class="hidden-xs-only">{{
             loginUser && loginUser.nickname ? loginUser.nickname : ''
           }}</span>

+ 9 - 9
src/layout/index.vue

@@ -243,15 +243,15 @@
 </script>
 
 <style lang="scss">
-  .ele-admin-layout {
-    .ele-admin-logo {
-      font-size: 18px !important;
-      img {
-        width: 50px !important;
-        height: auto !important;
-      }
-    }
-  }
+  //.ele-admin-layout {
+  //  .ele-admin-logo {
+  //    font-size: 18px !important;
+  //    img {
+  //      width: 50px !important;
+  //      height: auto !important;
+  //    }
+  //  }
+  //}
   // 侧栏菜单徽章样式,定位在右侧垂直居中并调小尺寸
   .ele-menu-badge {
     position: absolute;

+ 13 - 0
src/views/doc/doc_classify/components/addOrEditDialog.vue

@@ -0,0 +1,13 @@
+<script>
+export default {
+  name: "addOrEditDialog"
+}
+</script>
+
+<template>
+
+</template>
+
+<style scoped lang="scss">
+
+</style>

+ 168 - 0
src/views/doc/doc_classify/components/searchIndex.vue

@@ -0,0 +1,168 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="100px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="15">
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="需求类型:" prop="sourceCode">
+          <DictSelection
+            dictName="需求来源类型"
+            clearable
+            v-model="params.sourceType"
+            @itemChange="chaengSource"
+          >
+          </DictSelection>
+        </el-form-item>
+      </el-col>
+
+      <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="需求部门名称:" prop="requireDeptName">
+          <el-input
+            clearable
+            placeholder="请输入"
+            v-model.trim="params.requireDeptName"
+          ></el-input>
+        </el-form-item>
+      </el-col> -->
+
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="需求部门:" prop="requireDeptName">
+          <el-input
+            clearable
+            placeholder="请输入"
+            v-model.trim="params.requireDeptName"
+          ></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="需求名称:" prop="requirementName">
+          <el-input
+            clearable
+            placeholder="请输入"
+            v-model.trim="params.requirementName"
+          ></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="完成日期:" prop="finishDateStart">
+          <el-date-picker
+            v-model="finishDate"
+            @change="changeDate"
+            style="width: 100%"
+            type="daterange"
+            value-format="yyyy-MM-dd"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </el-col>
+    </el-row>
+    <el-row :gutter="15">
+
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="创建时间:" prop="createTimeStart">
+          <el-date-picker
+            style="width: 100%"
+            v-model="createTime"
+            @change="changeCreateTime"
+            type="datetimerange"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            start-placeholder="开始时间"
+            end-placeholder="结束时间"
+            :default-time="['00:00:00', '23:59:59']"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="组织机构:">
+          <auth-selection v-model="params.deptIds" style="width: 100%"></auth-selection>
+        </el-form-item>
+      </el-col>
+      <el-col style="display: flex;justify-content: end" v-bind="styleResponsive ? { lg: 12, md: 12 } : { span: 12 }">
+        <div class="ele-form-actions">
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+          >
+            查询
+          </el-button>
+          <el-button @click="reset">重置</el-button>
+        </div>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+<script>
+  export default {
+    data() {
+      // 默认表单数据
+      const defaultParams = {
+        finishDateStart: '',
+        finishDateEnd: '',
+        createTimeStart: '',
+        createTimeEnd: '',
+        sourceTypeName: '',
+        requirementName: '',
+        sourceType: ''
+      };
+      return {
+        finishDate: [],
+        createTime: [],
+        defaultParams,
+        // 表单数据
+        params: { ...defaultParams }
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      //选择需求来源类型
+      chaengSource(data) {
+        this.params.sourceTypeName = data?.dictValue;
+      },
+      //选择时间
+      changeDate(e) {
+        this.finishDate = e;
+      },
+      //选择时间
+      changeCreateTime(e) {
+        this.createTime = e;
+      },
+      /* 搜索 */
+      search() {
+        const [finishDateStart, finishDateEnd] = this.finishDate;
+        const [createTimeStart, createTimeEnd] = this.createTime;
+        this.params = Object.assign({}, this.params, {
+          finishDateStart,
+          finishDateEnd,
+          createTimeStart,
+          createTimeEnd
+        });
+        this.$emit('search', {
+          ...this.params
+        });
+      },
+      /*  重置 */
+      reset() {
+        this.finishDate = [];
+        this.createTime = [];
+        this.params = { ...this.defaultParams };
+        this.search();
+      }
+    }
+  };
+</script>
+<style scoped lang="scss">
+</style>

+ 315 - 0
src/views/doc/doc_classify/index.vue

@@ -0,0 +1,315 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+      <div class="ele-border-lighter form-content" v-loading="loading">
+        <search-index @search="reload"></search-index>
+        <div style="margin-bottom: 10px">
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="openEdit('add', {})"
+          >
+            新建
+          </el-button>
+        </div>
+        <el-table
+          :data="tableList"
+          style="width: 100%;margin-bottom: 20px;"
+          height="calc(100vh - 375px)"
+          row-key="id"
+          border
+          default-expand-all
+          :tree-props="{children: 'sonPurchasePlanList', hasChildren: 'hasChildren'}">
+          <el-table-column
+            prop=""
+            type="index"
+            label="序号"
+            :width="60"
+            :showOverflowTooltip="true"
+            align="center">
+          </el-table-column>
+          <el-table-column
+            prop="FLMC"
+            label="分类名称"
+            :minWidth="160"
+            :showOverflowTooltip="true"
+            align="center">
+
+          </el-table-column>
+
+          <el-table-column
+            prop="createTime"
+            label="创建时间"
+            :minWidth="160"
+            :showOverflowTooltip="true"
+            align="center">
+          </el-table-column>
+          <el-table-column
+            prop="status"
+            label="状态"
+            :minWidth="80"
+            :showOverflowTooltip="true"
+            align="center">
+            <template slot-scope="{ row }">
+              {{ getStatus(row.status) }}
+            </template>
+          </el-table-column>
+          <el-table-column
+            prop=""
+            label="操作"
+            :minWidth="200"
+            :resizable="false"
+
+            align="center">
+            <template slot-scope="{ row }">
+              <el-link
+                type="primary"
+                :underline="false"
+                icon="el-icon-edit"
+                v-if="[0, 3].includes(row.status)&&!row.isCut"
+                @click="openEdit('edit', row)"
+              >
+                修改
+              </el-link>
+              <el-link
+                type="primary"
+                :underline="false"
+                icon="el-icon-edit"
+                v-if="[2].includes(row.status)&&!row.isCut"
+                @click="handleSplit(row)"
+              >
+                拆分
+              </el-link>
+              <el-link
+                type="primary"
+                :underline="false"
+                v-if="[2].includes(row.status)&&(!row.isCut||(row.parentId&&row.parentId!=0))"
+                icon="el-icon-plus"
+                @click="addInquiry('add', row)"
+              >
+                生成核价单
+              </el-link>
+              <el-popconfirm
+                class="ele-action"
+                title="确定要删除此信息吗?"
+                v-if="[0, 3].includes(row.status)&&!row.isCut"
+                @confirm="remove([row.id])"
+              >
+                <template v-slot:reference>
+                  <el-link type="danger" :underline="false" icon="el-icon-delete">
+                    删除
+                  </el-link>
+                </template>
+              </el-popconfirm>
+            </template>
+          </el-table-column>
+
+
+        </el-table>
+        <el-pagination
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="pageNum"
+          :page-sizes="[10, 20, 30, 40,50,100]"
+          :page-size="pageSize"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total">
+        </el-pagination>
+      </div>
+    </el-card>
+    <!-- 多选删除弹窗 -->
+    <pop-modal
+      :visible.sync="delVisible"
+      content="是否确定删除?"
+      @done="commitBtn"
+    />
+
+  </div>
+</template>
+
+<script>
+import popModal from '@/components/pop-modal';
+
+import searchIndex from "./components/searchIndex.vue";
+
+export default {
+
+  components: {
+    searchIndex,
+    popModal,
+  },
+  data() {
+    return {
+      pageSize: 10,
+      pageNum: 1,
+      where: {},
+      total: 0,
+      selection: [], //单选中集合
+      tableList: [], //单选中集合
+      delVisible: false, //批量删除弹框状态
+      loading: false, // 加载状态
+      splitDialogFlag: false, // 加载状态
+
+    };
+  },
+  computed: {
+    columns() {
+      return [
+        {
+          width: 45,
+          type: 'selection',
+          columnKey: 'selection',
+          align: 'center'
+        },
+        {
+          columnKey: 'index',
+          label: '序号',
+          type: 'index',
+          width: 55,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'left'
+        },
+        {
+          prop: '',
+          slot: '',
+          label: '分类名称',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200
+        },
+        {
+          prop: 'createTime',
+          label: '创建时间',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 180
+        },
+        {
+          prop: 'status',
+          label: '状态',
+          align: 'center',
+          slot: 'status',
+          showOverflowTooltip: true,
+          minWidth: 120
+        },
+        // {
+        //   prop: 'remark',
+        //   label: '备注',
+        //   align: 'center',
+        //   showOverflowTooltip: true,
+        //   minWidth: 170
+        // },
+        {
+          columnKey: 'action',
+          label: '操作',
+          width: 230,
+          align: 'center',
+          resizable: false,
+          slot: 'action',
+          showOverflowTooltip: true,
+          fixed: 'right'
+        }
+      ]
+    },
+  },
+  created() {
+    //this.datasource();
+  },
+  methods: {
+    /* 表格数据源 */
+    async datasource(pageNum = this.pageNum, pageSize = this.pageSize, where=this.where) {
+      const row = await getTableList({
+        pageNum: pageNum,
+        size: pageSize,
+        ...where
+      });
+      this.tableList = row.list
+      this.total = row.count
+    },
+    handleSizeChange(val) {
+      this.pageSize = val
+      this.datasource()
+    },
+    handleCurrentChange(val) {
+      this.pageNum = val
+      this.datasource()
+    },
+    /* 刷新表格 */
+    reload(where) {
+      this.where = where
+      this.pageNum = 1
+      this.datasource(this.pageNum, this.pageSize, this.where)
+
+    },
+
+    //批量删除
+    allDelBtn() {
+      if (this.selection.length === 0) return;
+      let flag = this.selection.some(item => [1, 2].includes(item.status))
+      if (flag) return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查')
+      this.delVisible = true;
+    },
+
+    //删除接口
+    remove(delData) {
+      deleteInformation(delData).then((res) => {
+        this.$message.success('删除成功!');
+        this.reload();
+      });
+    },
+
+    //删除弹框确定
+    commitBtn() {
+      const dataId = this.selection.map((v) => v.id);
+      this.remove(dataId);
+    },
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+:deep(.el-link--inner) {
+  margin-left: 0px !important;
+}
+
+.sys-organization-list {
+  height: calc(100vh - 264px);
+  box-sizing: border-box;
+  border-width: 1px;
+  border-style: solid;
+  overflow: auto;
+}
+
+.sys-organization-list :deep(.el-tree-node__content) {
+  height: 40px;
+
+  & > .el-tree-node__expand-icon {
+    margin-left: 10px;
+  }
+}
+
+::v-deep .el-pager li.active {
+  color: #ffffff;
+  background: #1890ff;
+  border-radius: 50%;
+  cursor: default;
+}
+
+::v-deep .el-pager li {
+  padding: 0 4px;
+  background: var(--color-white);
+  vertical-align: top;
+  display: inline-block;
+  font-size: 13px;
+  min-width: 28px;
+  height: 28px;
+  line-height: 28px;
+  cursor: pointer;
+  box-sizing: border-box;
+  text-align: center;
+  margin: 0;
+}
+</style>

+ 108 - 0
src/views/doc/doc_template/components/doc-search.vue

@@ -0,0 +1,108 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="77px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="10">
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
+        <el-form-item label="文档名称">
+          <el-input clearable v-model.trim="where.name" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
+        <el-form-item label="模块名">
+          <el-input clearable v-model.trim="where.module" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
+        <el-form-item label="上传时间">
+          <el-date-picker
+            type="daterange"
+            class="ele-fluid"
+            end-placeholder="结束日期"
+            start-placeholder="开始日期"
+            v-model.trim="where.time"
+            range-separator="至"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            :default-time="['00:00:00', '23:59:59']"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 6 } : { span: 6 }">
+        <el-form-item label="组织机构:">
+          <auth-selection v-model.trim="where.deptIds" style="width: 100%"></auth-selection>
+        </el-form-item>
+      </el-col>
+
+    </el-row>
+    <el-row>
+      <el-col v-bind="styleResponsive ? { md: 24 } : { span: 24 }" style="display: flex;justify-content: flex-end">
+        <el-form-item>
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+          >
+            查询
+          </el-button>
+
+          <el-button
+            @click="reset"
+            icon="el-icon-refresh"
+            class="ele-btn-icon"
+            size="medium"
+          >重置</el-button
+          >
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script>
+  export default {
+    components: {},
+    data () {
+      // 默认表单数据
+      const defaultWhere = {
+        module: '',
+        name: '',
+        time: []
+      };
+      return {
+        defaultWhere,
+        // 表单数据
+        where: { ...defaultWhere }
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive () {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      /* 搜索 */
+      search () {
+        const where = { ...this.where };
+        if (where.time?.length) {
+          where.startTime = where.time[0];
+          where.endTime = where.time[1];
+        }
+
+        delete where.time;
+        this.$emit('search', where);
+      },
+      /*  重置 */
+      reset () {
+        this.where = { ...this.defaultWhere };
+        this.search();
+      }
+    }
+  };
+</script>

+ 117 - 0
src/views/doc/doc_template/components/upload-dialog.vue

@@ -0,0 +1,117 @@
+<template>
+  <!-- 上传 -->
+  <el-dialog title="文件上传" :visible.sync="dialogVisible" width="40%">
+    <el-form label-width="110px" class="zw-criterion">
+      <el-form-item label="选择文件">
+        <el-upload
+          class="avatar-uploader"
+          action="#"
+          :show-file-list="false"
+          :http-request="handlSuccess"
+          :before-upload="beforeUpload"
+        >
+          <el-button icon="el-icon-plus" size="small" type="primary"
+            >文件上传</el-button
+          >
+        </el-upload>
+      </el-form-item>
+<!--      <el-form-item label="模块名">-->
+<!--        <DictSelection v-model="module" dictName="文件模块"></DictSelection>-->
+<!--      </el-form-item>-->
+      <el-form-item label="">
+        <div class="imgs-box">
+          <p v-for="(item, index) in attaments" :key="index" class="imgs-p">
+            <span> {{ item.name }}</span>
+            <el-link @click="delFileList(index)" type="primary">删除</el-link>
+          </p>
+        </div>
+      </el-form-item>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button size="small" @click="dialogVisible = false">关 闭</el-button>
+      <el-button size="small" @click="upload" type="primary">上 传</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+  import { uploadBatch } from '@/api/system/file/index.js';
+
+  export default {
+    //注册组件
+    data () {
+      return {
+        showViewer: false, // 显示查看器
+        dialogVisible: false,
+        uploadShow: false,
+        attaments: [], //上传文件
+        module: '',
+        file: ''
+      };
+    },
+    created () {},
+    methods: {
+      open () {
+        this.attaments = [];
+        this.module = '';
+        this.dialogVisible = true;
+      },
+      //删除附件
+      delFileList (index) {
+        this.attaments.splice(index, 1);
+      },
+      //上传限制
+      beforeUpload (file) {
+        const isLt10M = file.size / 1024 / 1024 < 10;
+        if (!isLt10M) {
+          this.$message.error('上传文件大小不能超过 10MB!');
+        }
+        return isLt10M;
+      },
+      //图片上传
+      handlSuccess (param) {
+        this.file = param.file;
+        this.attaments.push(param.file);
+      },
+      // 文件上传
+      async upload () {
+        if (this.attaments.length == 0) {
+          return this.$message.warning('文件不能为空!');
+        }
+        if (!this.module) {
+          return this.$message.warning('模块名不能为空!');
+        }
+        await uploadBatch({
+          module: this.module,
+          multiPartFiles: this.attaments
+        });
+        this.$message.success('操作成功!');
+        this.dialogVisible = false;
+        this.$emit('success');
+      }
+    }
+  };
+</script>
+
+<style lang="scss">
+  .zw-table-header {
+    float: right;
+  }
+
+  .imgs-box .imgs-p {
+    height: 30px;
+    background: #f0f3f3;
+    line-height: 30px;
+    width: 372px;
+    margin-bottom: 5px;
+    padding: 0 10px;
+    display: flex;
+    justify-content: space-between;
+  }
+  .zw-criterion-normal {
+    padding: 20px 0 0 0;
+  }
+  .el-main {
+    overflow: hidden;
+  }
+</style>

+ 98 - 0
src/views/doc/doc_template/index.vue

@@ -0,0 +1,98 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never">
+      <doc-search @search="reload" />
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="datasource"
+        height="calc(100vh - 350px)"
+        class="dict-table"
+        tool-class="ele-toolbar-actions"
+      >
+        <!-- 工具栏 -->
+        <template v-slot:toolbar>
+          <el-button type="primary" @click="handleUpload">上传</el-button>
+        </template>
+        <template v-slot:action="{ row }">
+          <el-link type="primary" @click="handleDownload(row)">下载</el-link>
+        </template>
+      </ele-pro-table>
+    </el-card>
+    <uploadDialog ref="uploadDialogRef" @success="reload" />
+  </div>
+</template>
+
+<script>
+  import { getFile, getFileList } from '@/api/system/file/index.js';
+
+  import docSearch from './components/doc-search';
+  import uploadDialog from './components/upload-dialog.vue';
+  export default {
+    components: { docSearch, uploadDialog },
+    data () {
+      return {
+        columns: [
+          {
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            fixed: 'left'
+          },
+          {
+            label: '文档名称',
+            prop: 'name',
+            minWidth: '180',
+            showOverflowTooltip: true
+          },
+          {
+            label: '文档类型',
+            prop: 'type'
+          },
+          // {
+          //   label: '系统'
+          // },
+          {
+            label: '储存路径',
+            prop: 'storePath',
+            minWidth: '180',
+            showOverflowTooltip: true
+          },
+          {
+            label: '模块名',
+            prop: 'module'
+          },
+          {
+            label: '上传时间',
+            prop: 'createTime'
+          },
+          {
+            label: '操作',
+            prop: 'action',
+            slot: 'action',
+            action: 'action'
+          }
+        ]
+      };
+    },
+    methods: {
+      datasource ({ page, where, limit }) {
+        return getFileList({
+          ...where,
+          pageNum: page,
+          size: limit
+        });
+      },
+      reload (where = {}) {
+        this.$refs.table.reload({ where });
+      },
+      handleUpload () {
+        this.$refs.uploadDialogRef.open();
+      },
+      handleDownload (row) {
+        getFile({ objectName: row.storePath }, row.name);
+      }
+    }
+  };
+</script>

+ 193 - 0
src/views/doc/personal_doc/components/file-edit.vue

@@ -0,0 +1,193 @@
+<!-- 用户编辑弹窗 -->
+<template>
+  <ele-modal width="500px" :visible.sync="showEditFlag" :close-on-click-modal="false" custom-class="ele-dialog-form"
+             :title="title" :before-close="updateVisible">
+    <el-form ref="form" :model="form" :rules="rules" label-width="82px">
+      <el-row :gutter="15">
+        <el-col :span="24">
+          <el-form-item label="文件类型" prop="WJLX">
+            <el-select v-model="form.WJLX" style="width: 100%;">
+              <el-option v-for="item in WJLXList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="上传方式" prop="SCFS">
+            <el-radio-group v-model="form.SCFS">
+              <el-radio :label="1" >手动上传</el-radio>
+              <el-radio :label="2" >选择模板</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="文件名称" prop="WJMC">
+            <el-input v-model="form.WJMC" placeholder="请输入文件名称"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="文件" prop="files">
+            <fileUpload
+              class="aaa"
+              v-model="form.files"
+              module="main"
+              :showLib="false"
+              :limit="1"
+              @fileChange="fileChange"
+
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="文件位置" prop="parentId">
+            <el-cascader
+              style="width: 100%"
+              v-model="form.parentId"
+              :options="folderList"
+              :props="{value:'id',label:'name',children:'sonDirectoryList',emitPath:false,checkStrictly:true}"
+            ></el-cascader>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template v-slot:footer>
+      <el-button @click="updateVisible(false)">取消</el-button>
+      <el-button type="primary" :loading="loading" @click="save">
+        保存
+      </el-button>
+    </template>
+
+
+  </ele-modal>
+</template>
+
+<script>
+import {fileSaveAPI, fileUpdateAPI} from "@/api/doc-manage";
+import FileUpload from "@/components/upload/fileUpload.vue";
+
+export default {
+  components: {FileUpload},
+  props: {
+    // 弹窗是否打开
+    showEditFlag: Boolean,
+    // 修改回显的数据
+    data: Object,
+    // 上级id
+    parentId: [Number, String],
+    // 文件夹数据
+    folderList: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data() {
+    const defaultForm = {
+      WJLX: '',
+      SCFS: 1,
+      WJMC: '',
+      files: [],
+      parentId: ''
+    };
+    return {
+      defaultForm,
+      // 表单数据
+      form: {...defaultForm},
+      WJLXList: [],
+      // 表单验证规则
+      rules: {
+        groupId: [{required: true, message: '', trigger: 'blur'}],
+
+      },
+      // 提交状态
+      loading: false,
+      title: '',
+      dialogType: '',
+    };
+  },
+  computed: {
+    // 是否开启响应式布局
+    styleResponsive() {
+      return this.$store.state.theme.styleResponsive;
+    }
+  },
+  created() {
+
+  },
+  methods: {
+    init(type, row) {
+      this.title = type === 'update' ? '编辑' : type === 'add' ? '新增' : '详情';
+      this.dialogType = type;
+      if(type =='add'){
+        this.form.parentId = this.parentId;
+      }
+    },
+    fileChange(file) {
+      console.log(file);
+      this.form.WJMC = file.name;
+    },
+    /* 保存编辑 */
+    save() {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          return false;
+        }
+        this.loading = true;
+
+        const data = {
+          ...this.form
+        };
+        if (!this.isUpdate) {
+          delete data.id;
+        }
+        let API = this.isUpdate ? fileUpdateAPI : fileSaveAPI
+        saveOrUpdateUser(data)
+          .then((msg) => {
+            this.loading = false;
+            if (this.isUpdate) {
+              this.$message.success('');
+            } else {
+              this.$message.success('');
+            }
+            this.updateVisible(false);
+            this.$emit('done');
+          })
+          .catch((e) => {
+            this.loading = false;
+            // this.$message.error(e.message);
+          });
+      });
+    },
+    /* 更新visible */
+    updateVisible(value) {
+      this.$emit('update:showEditFlag', false);
+    },
+
+  },
+};
+</script>
+<style scoped lang="scss">
+.aaa {
+  width: 100%;
+
+  ::v-deep .upload-demo {
+    width: 100%;
+
+    .el-upload--text {
+      width: 100%;
+
+      button {
+        width: 100%;
+        background: #FFFFFF;
+        border: 1px solid #dbdbdb;
+        border-radius: 5px;
+      }
+    }
+
+    .el-upload-list {
+      transform: translate(10px, -39px);
+      position: absolute;
+    }
+  }
+
+
+}
+</style>

+ 72 - 0
src/views/doc/personal_doc/components/file-search.vue

@@ -0,0 +1,72 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    size="small"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="24">
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
+      <el-form-item label="文档名称" label-width="80px">
+          <el-input
+            clearable
+            size="small"
+            v-model.trim="where.name"
+            placeholder="请输入文档名称"
+          />
+        </el-form-item>
+        </el-col>
+
+
+      <el-col v-bind="styleResponsive ?  { md: 6 } : { span: 6 }">
+        <el-form-item>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+          >
+            查询
+          </el-button>
+          <slot></slot>
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script>
+  export default {
+    data() {
+      // 默认表单数据
+      const defaultWhere = {
+        jobNumber: '',
+        loginName: '',
+        name: ''
+      };
+      return {
+        // 表单数据
+        where: { ...defaultWhere }
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      /* 搜索 */
+      search() {
+        this.$emit('search', this.where);
+      },
+      /*  重置 */
+      reset() {
+        this.where = { ...this.defaultWhere };
+        this.search();
+      }
+    }
+  };
+</script>

+ 238 - 0
src/views/doc/personal_doc/components/file-table-list.vue

@@ -0,0 +1,238 @@
+<template>
+  <div>
+    <!-- 数据表格 -->
+    <ele-pro-table
+      ref="table"
+      :columns="columns"
+      :datasource="datasource"
+      height="calc(100vh - 265px)"
+      full-height="calc(100vh - 116px)"
+      tool-class="ele-toolbar-form"
+      cache-key="systemOrgUserTable"
+    >
+      <!-- 表头工具栏 -->
+      <template v-slot:toolbar>
+        <file-search @search="reload">
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="openEdit('','add')"
+          >
+            添加
+          </el-button>
+        </file-search>
+      </template>
+      <!-- 角色列 -->
+
+      <!-- 操作列 -->
+      <template v-slot:action="{ row }">
+        <el-link
+          type="primary"
+          :underline="false"
+          icon="el-icon-edit"
+          @click="openEdit(row,'update')"
+        >
+          修改
+        </el-link>
+        <el-popconfirm
+          class="ele-action"
+          title="确定要删除此用户吗?"
+          @confirm="remove(row)"
+        >
+          <template v-slot:reference>
+            <el-link type="danger" :underline="false" icon="el-icon-delete">
+              删除
+            </el-link>
+          </template>
+        </el-popconfirm>
+      </template>
+    </ele-pro-table>
+    <!-- 编辑弹窗 -->
+    <file-edit
+      v-if="showEditFlag"
+      ref="fileEditRef"
+      :data="current"
+      :showEditFlag.sync="showEditFlag"
+      :parentId="parentId"
+      :folderList="folderList"
+      @done="reload"
+    />
+  </div>
+</template>
+
+<script>
+import fileSearch from './file-search.vue';
+import fileEdit from './file-edit.vue';
+
+import {fileDeleteAPI, filePageAPI,} from "@/api/doc-manage";
+
+export default {
+  components: {fileSearch, fileEdit},
+  props: {
+    // 上级id
+    parentId: [Number, String],
+    // 文件夹数据
+    folderList: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      // 表格列配置
+      columns: [
+        // {
+        //   width: 45,
+        //   type: 'selection',
+        //   columnKey: 'selection',
+        //   align: 'center'
+        // },
+        {
+          columnKey: 'index',
+          label: '序号',
+          type: 'index',
+          width: 55,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'left'
+        },
+        {
+          prop: 'name',
+          label: '文档名称',
+          align: 'center',
+          slot: 'name',
+          showOverflowTooltip: true,
+          minWidth: 200
+        },
+
+        {
+          prop: 'createUsername',
+          label: '创建人',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100
+        },
+        {
+          prop: 'createTime',
+          label: '创建时间',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 160,
+          formatter: (_row, _column, cellValue) => {
+            return this.$util.toDateString(cellValue);
+          }
+        },
+        {
+          prop: '',
+          label: '修改人',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100
+        },
+        {
+          prop: '',
+          label: '修改人时间',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 160,
+          formatter: (_row, _column, cellValue) => {
+            return this.$util.toDateString(cellValue);
+          }
+        },
+        {
+          prop: '',
+          label: '文件大小',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100,
+          formatter: (_row, _column, cellValue) => {
+            return this.$util.toDateString(cellValue);
+          }
+        },
+        {
+          prop: '',
+          label: '状态',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100,
+          formatter: (_row, _column, cellValue) => {
+            return this.$util.toDateString(cellValue);
+          }
+        },
+        {
+          columnKey: 'action',
+          label: '操作',
+          width: 200,
+          align: 'center',
+          resizable: false,
+          slot: 'action',
+          showOverflowTooltip: true,
+          fixed: 'right',
+        }
+      ],
+      // 是否显示编辑弹窗
+      showEditFlag: false,
+      current: null,
+    };
+  },
+  methods: {
+    /* 表格数据源 */
+    datasource({page, limit, where, order}) {
+      return filePageAPI({
+        ...where,
+        ...order,
+        pageNum: page,
+        size: limit,
+        parentId: this.parentId
+      });
+    },
+    /* 刷新表格 */
+    reload(where) {
+      this.$refs.table.reload({pageNum: 1, where: where});
+    },
+    /* 显示编辑 */
+    openEdit(row = '',type) {
+      this.showEditFlag = true;
+      this.$nextTick(() => {
+        this.$refs.fileEditRef.init(type, row);
+      });
+    },
+    /* 删除 */
+    remove(row) {
+      const loading = this.$loading({lock: true});
+      fileDeleteAPI([row.id])
+        .then((msg) => {
+          loading.close();
+          this.$message.success('操作成功');
+          this.reload();
+        })
+        .catch((e) => {
+          loading.close();
+          // this.$message.error(e.message);
+        });
+    },
+    /* 更改状态 */
+    editStatus(row) {
+      const loading = this.$loading({lock: true});
+      updateUserStatus(row.userId, row.status)
+        .then((msg) => {
+          loading.close();
+          this.$message.success(msg);
+        })
+        .catch((e) => {
+          loading.close();
+          row.status = !row.status ? 1 : 0;
+          // this.$message.error(e.message);
+        });
+    }
+  },
+  watch: {
+    // 监听机构id变化
+    organizationId() {
+      this.reload();
+    }
+  }
+};
+</script>

+ 171 - 0
src/views/doc/personal_doc/components/folder-edit.vue

@@ -0,0 +1,171 @@
+<!-- 机构编辑弹窗 -->
+<template>
+  <ele-modal
+    width="420px"
+    :visible="showFolderEditFlag"
+    :close-on-click-modal="false"
+    custom-class="ele-dialog-form"
+    :title="isUpdate ? '修改' : '添加'"
+    @update:visible="updateVisible"
+  >
+    <el-form ref="form" :model="form" :rules="rules" label-width="110px">
+      <el-row :gutter="15">
+        <el-col :span="24">
+          <el-form-item label="文件夹名称:" prop="name">
+            <el-input
+              clearable
+              :maxlength="20"
+              v-model="form.name"
+              placeholder="文件夹名称"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="详细描述:" prop="remark">
+            <el-input
+              type="textarea"
+              clearable
+              :maxlength="20"
+              v-model="form.remark"
+              placeholder="详细描述"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="位置:">
+            <el-cascader
+              style="width: 100%"
+              v-model="form.parentId"
+              :options="folderList"
+              :props="{value:'id',label:'name',children:'sonDirectoryList',emitPath:false,checkStrictly:true}"
+              ></el-cascader>
+          </el-form-item>
+        </el-col>
+
+
+      </el-row>
+    </el-form>
+    <template v-slot:footer>
+      <el-button type="primary" :loading="loading" @click="save">
+        保存
+      </el-button>
+      <el-button @click="updateVisible(false)">取消</el-button>
+
+    </template>
+  </ele-modal>
+</template>
+
+<script>
+
+import {directorySaveAPI, directoryUpdateAPi} from "@/api/doc-manage";
+
+export default {
+  components: {},
+  props: {
+    // 弹窗是否打开
+    showFolderEditFlag: Boolean,
+    folderType: String,
+    // 修改回显的数据
+    data: Object,
+    // 上级id
+    parentId: [Number, String],
+    // 文件夹数据
+    folderList:{
+      type:Array,
+      default:()=>[]
+    }
+  },
+  data() {
+    const defaultForm = {
+      name: '',
+      type: '',
+      parentId: '',
+      remark: ''
+    };
+    return {
+      defaultForm,
+      responsibleName: '',
+      // 表单数据
+      form: {...defaultForm},
+      // 表单验证规则
+      rules: {
+        name: [
+          {required: true, message: '请输入', trigger: 'blur'}
+        ],
+      },
+      // 提交状态
+      loading: false,
+      // 是否是修改
+      isUpdate: false
+    };
+  },
+  computed: {
+    // 是否开启响应式布局
+    styleResponsive() {
+      return this.$store.state.theme.styleResponsive;
+    }
+  },
+  watch: {
+    showFolderEditFlag(visible) {
+      if (visible) {
+        if (this.data) {
+          for (const key in this.form) {
+            this.form[key] = this.data[key];
+          }
+          this.isUpdate = true;
+        } else {
+          this.form.parentId = this.parentId;
+          this.isUpdate = false;
+        }
+      } else {
+        this.$refs.form.clearValidate();
+        this.form = {...this.defaultForm};
+      }
+    }
+  },
+  methods: {
+    /* 保存编辑 */
+    async save() {
+      if (!(await this.formValidate())) return false;
+
+      let form = {
+        ...this.form
+      };
+      this.loading = true;
+      const data = {
+        ...form,
+        parentId: this.form.parentId || 0
+      };
+      if (!this.isUpdate) {
+        delete data.id;
+        data.type = this.folderType;
+      }
+      const saveOrUpdate = this.isUpdate ? directoryUpdateAPi : directorySaveAPI;
+      saveOrUpdate(data)
+        .then((msg) => {
+          this.loading = false;
+          this.$message.success(msg);
+          this.updateVisible(false);
+          this.$emit('done');
+        })
+        .catch((e) => {
+          this.loading = false;
+          // this.$message.error(e.message);
+        });
+    },
+    formValidate() {
+      return new Promise((resolve, reject) => {
+        this.$refs.form.validate((valid) => {
+          resolve(valid);
+        });
+      });
+    },
+
+    /* 更新visible */
+    updateVisible(value) {
+      this.$emit('update:showFolderEditFlag', value);
+    }
+  },
+
+};
+</script>

+ 332 - 0
src/views/doc/personal_doc/components/staffSelection.vue

@@ -0,0 +1,332 @@
+<template>
+  <div class="container">
+    <!-- 单据弹窗 -->
+    <el-dialog
+      title="员工"
+      :before-close="handleClose"
+      :visible.sync="dialogVisible"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      width="80%"
+    >
+      <el-row class="zw-page">
+        <el-col :span="6" class="zw-page-left">
+          <el-card>
+            <div class="zw-card-header" slot="header">
+              <span class="zw-header-title details-title">部门</span>
+            </div>
+            <div class="zw-page-left-tree">
+              <el-container class="zw-container">
+                <el-tree
+                  ref="tree"
+                  :data="treeList"
+                  highlight-current
+                  node-key="id"
+                  :props="{ label: 'name' }"
+                  :expand-on-click-node="false"
+                  :default-expand-all="true"
+                  @node-click="handleNodeClick"
+                >
+                </el-tree>
+              </el-container>
+            </div>
+          </el-card>
+        </el-col>
+        <el-col :span="9" class="zw-page-main">
+          <el-card>
+            <div class="zw-card-header" slot="header">
+              <span class="zw-header-title details-title">员工明细 </span>
+            </div>
+            <div class="zw-page-main-list">
+              <el-container class="zw-container">
+                <el-table
+                  :data="staffList"
+                  tooltip-effect="dark"
+                  style="width: 100%"
+                  max-height="500"
+                  :header-cell-style="{
+                    background: '#F0F3F3',
+                    border: 'none'
+                  }"
+                >
+                  <el-table-column prop="code" label="姓名">
+                    <template slot-scope="{ row }">
+                      <div>{{ row.name }}</div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="工号">
+                    <template slot-scope="{ row }">
+                      <div>{{ row.jobNumber }}</div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column width="80" label="操作">
+                    <template slot-scope="{ row }">
+                      <el-button
+                        size="mini"
+                        type="primary"
+                        @click="choiceAsset(row)"
+                        :disabled="row.disabled"
+                        icon="el-icon-arrow-right"
+                        circle
+                      >
+                      </el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+                <div
+                  v-if="staffList.length !== 0 && isMore"
+                  class="zw-page-list-more"
+                >
+                  <el-link @click="getMore()" type="primary"
+                    >更多<i class="el-icon-caret-bottom"></i>
+                  </el-link>
+                </div>
+              </el-container>
+            </div>
+          </el-card>
+        </el-col>
+        <el-col :span="9" class="zw-page-right">
+          <el-card>
+            <div class="zw-card-header" slot="header">
+              <span class="zw-header-title">已选员工</span>
+            </div>
+            <div class="zw-page-right-list">
+              <el-container class="zw-container">
+                <el-table
+                  :data="selectStafflist"
+                  tooltip-effect="dark"
+                  style="width: 100%"
+                  max-height="500"
+                  :header-cell-style="{
+                    background: '#F0F3F3',
+                    border: 'none'
+                  }"
+                >
+                  <el-table-column prop="code" label="姓名">
+                    <template slot-scope="{ row }">
+                      <div>{{ row.name }}</div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="工号">
+                    <template slot-scope="{ row }">
+                      <div>{{ row.jobNumber }}</div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column width="80" label="操作">
+                    <template slot-scope="scope">
+                      <el-button
+                        @click="deleteSelectStaff(scope.row, scope.$index)"
+                        size="mini"
+                        type="danger"
+                        >删除
+                      </el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </el-container>
+            </div>
+          </el-card>
+        </el-col>
+      </el-row>
+      <div slot="footer" class="dialog-footer">
+        <el-button size="small" @click="handleClose">关 闭</el-button>
+        <el-button size="small" @click="sumbit" type="primary">确 认</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+  import { listOrganizations, getUserPage } from '@/api/system/organization';
+  export default {
+    data() {
+      return {
+        form: {
+          groupId: null
+        },
+        treeList: [],
+        staffList: [],
+        selectStafflist: [], //已选员工
+        defaultProps: {
+          children: 'children',
+          label: 'name',
+          value: 'code'
+        },
+        pageNum: 1, //设备当前页数
+        size: 10,
+        isMore: false,
+        dialogVisible: false
+      };
+    },
+    created() {},
+    methods: {
+      open(selectedList) {
+        this.dialogVisible = true;
+        this.selectStafflist = selectedList;
+        this.getInfo();
+      },
+      //初始数据
+      async getInfo() {
+        let list = await listOrganizations();
+        this.treeList = this.$util.toTreeData({
+          data: list,
+          idField: 'id',
+          parentIdField: 'parentId'
+        });
+        //this.treeList = res.data;
+      },
+      //选择分类
+      handleNodeClick(data) {
+        this.staffList = [];
+
+        this.form.groupId = data.id;
+        let params = {
+          pageNum: 1,
+          size: this.size,
+          groupId: this.form.groupId
+        };
+        this.getStaffList(params);
+      },
+      //获取员工列表
+      async getStaffList(params) {
+        let res = await getUserPage(params);
+        let list = res.list;
+        if (list.length < res.count) {
+          this.isMore = true;
+        } else {
+          this.isMore = false;
+        }
+        list.forEach((el) => {
+          let _index = this.selectStafflist.findIndex((n) => n.id == el.id);
+          if (_index !== -1) {
+            el.disabled = true;
+          } else {
+            el.disabled = false;
+          }
+        });
+        this.staffList = [...this.staffList, ...list];
+        // this.pageNum = res.pageNum;
+      },
+      //查询更多员工
+      async getMore() {
+        this.pageNum = this.pageNum + 1;
+        let params = {
+          pageNum: this.pageNum,
+          size: this.size,
+          groupId: this.form.groupId
+        };
+        this.getStaffList(params);
+      },
+      //选择员工
+      choiceAsset(info) {
+        let data = JSON.parse(JSON.stringify(info));
+        this.selectStafflist.push(data);
+        info.disabled = true;
+      },
+      //删除已选员工
+      deleteSelectStaff(info, index) {
+        this.staffList.forEach((el) => {
+          if (el.id == info.id) {
+            el.disabled = false;
+          }
+        });
+        this.selectStafflist.splice(index, 1);
+      },
+      //保存
+      sumbit() {
+        if (this.selectStafflist.length === 0) {
+          this.$message.warning('请选择员工');
+        } else {
+          this.$emit(
+            'confirm',
+            JSON.parse(JSON.stringify(this.selectStafflist))
+          );
+          this.handleClose();
+        }
+      },
+      handleClose() {
+        this.staffList = [];
+        this.selectStafflist = [];
+        this.dialogVisible = false;
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .container {
+    padding: 10px 0;
+  }
+  .zw-container {
+    height: 500px;
+    overflow-y: auto;
+  }
+  .zw-header-title {
+    display: inline-block;
+    margin-right: 10px;
+    font-weight: 600;
+  }
+  .details-title {
+    line-height: 32px;
+    height: 32px;
+  }
+  .zw-page-list-p {
+    font-size: 14px;
+    margin-bottom: 18px;
+    display: flex;
+    justify-content: space-between;
+    // align-items: center;
+    .zw-page-list-right {
+      display: flex;
+    }
+  }
+  .zw-page {
+    background: #fff;
+    //padding: 20px 0;
+    height: 600px;
+    .zw-page-left {
+      padding: 0 10px;
+    }
+    .zw-page-main {
+      padding: 0 10px;
+      .zw-page-main-list {
+        span {
+          margin-right: 10px;
+        }
+        .zw-page-span-num {
+          font-size: 12px;
+          color: #157a2c;
+        }
+        .zw-page-p-operation {
+          text-align: right;
+          // width: 200px;
+        }
+        .zw-page-operation-num {
+          width: 100px;
+          margin: 0 10px;
+        }
+      }
+      .zw-page-list-more {
+        text-align: center;
+      }
+    }
+    .zw-page-right {
+      .zw-card-header {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        height: 32px;
+      }
+      span {
+        margin-right: 10px;
+      }
+      .zw-page-span-num {
+        font-size: 12px;
+        color: #157a2c;
+      }
+    }
+  }
+  .notes {
+    font-size: 12px;
+    color: #909090;
+  }
+</style>

+ 180 - 0
src/views/doc/personal_doc/index.vue

@@ -0,0 +1,180 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+      <ele-split-layout
+        width="266px"
+        allow-collapse
+        :right-style="{ overflow: 'hidden' }"
+      >
+        <div>
+          <!-- 操作按钮 -->
+          <ele-toolbar class="ele-toolbar-actions">
+            <div style="margin: 5px 0">
+              <el-button
+                size="small"
+                type="primary"
+                icon="el-icon-plus"
+                class="ele-btn-icon"
+                @click="openEdit()"
+              >
+                添加
+              </el-button>
+              <el-button
+                size="small"
+                type="warning"
+                icon="el-icon-edit"
+                class="ele-btn-icon"
+                :disabled="!current"
+                @click="openEdit(current)"
+              >
+                修改
+              </el-button>
+              <el-button
+                size="small"
+                type="danger"
+                icon="el-icon-delete"
+                class="ele-btn-icon"
+                :disabled="!current"
+                @click="remove"
+              >
+                删除
+              </el-button>
+            </div>
+          </ele-toolbar>
+          <div class="ele-border-lighter sys-organization-list">
+            <el-tree
+              ref="tree"
+              :data="data"
+              highlight-current
+              node-key="id"
+              :props="{ label: 'name',children:'sonDirectoryList' }"
+              :expand-on-click-node="false"
+              :default-expand-all="true"
+              @node-click="onNodeClick"
+            />
+          </div>
+        </div>
+        <template v-slot:content>
+                    <file-table-list
+                      v-if="current"
+                      :folder-list="data"
+                      :parent-id="parentId"
+                    />
+        </template>
+      </ele-split-layout>
+    </el-card>
+    <!-- 编辑弹窗 -->
+    <folder-edit
+      :showFolderEditFlag.sync="showFolderEditFlag"
+      :data="editData"
+      :parent-id="parentId"
+      :folder-list="data"
+      folder-type="1"
+      @done="query"
+    />
+  </div>
+</template>
+
+<script>
+import fileTableList from './components/file-table-list.vue';
+import folderEdit from './components/folder-edit.vue';
+import {directoryDeleteAPI, getDocTreeListAPI} from '@/api/doc-manage'
+import {mapGetters} from "vuex";
+
+export default {
+  name: 'SystemOrganization',
+  components: {fileTableList, folderEdit},
+  data() {
+    return {
+      // 加载状态
+      loading: true,
+      // 列表数据
+      data: [],
+      institutionList: [],
+      // 选中数据
+      current: null,
+      // 是否显示表单弹窗
+      showFolderEditFlag: false,
+      // 编辑回显数据
+      editData: null,
+      // 上级id
+      parentId: null
+    };
+  },
+  computed: {
+    ...mapGetters(['user'])
+  },
+  created() {
+    this.query();
+  },
+  methods: {
+    /* 查询 */
+    async query() {
+      this.loading = true;
+      let query = {
+        type: 1,
+        currentUserId: this.user.info.userId
+      }
+     this.data =  await getDocTreeListAPI(query)
+      this.$nextTick(() => {
+        this.onNodeClick(this.data[0]);
+      });
+      this.loading = false;
+    },
+    /* 选择数据 */
+    onNodeClick(row) {
+      if (row) {
+        this.current = row;
+        this.parentId = row.id;
+        this.$refs.tree.setCurrentKey(row.id);
+      } else {
+        this.current = null;
+        this.parentId = null;
+      }
+    },
+    /* 显示编辑 */
+    openEdit(item='') {
+      this.editData = item;
+      this.showFolderEditFlag = true;
+    },
+    /* 删除 */
+    remove() {
+      this.$confirm('确定要删除选中文件夹吗?', '提示', {
+        type: 'warning'
+      })
+        .then(() => {
+          const loading = this.$loading({lock: true});
+          directoryDeleteAPI([this.current.id])
+            .then((msg) => {
+              loading.close();
+              this.$message.success('操作成功');
+              this.query();
+            })
+            .catch((e) => {
+              loading.close();
+            });
+        })
+        .catch(() => {
+        });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.sys-organization-list {
+  height: calc(100vh - 264px);
+  box-sizing: border-box;
+  border-width: 1px;
+  border-style: solid;
+  overflow: auto;
+}
+
+.sys-organization-list :deep(.el-tree-node__content) {
+  height: 40px;
+
+  & > .el-tree-node__expand-icon {
+    margin-left: 10px;
+  }
+}
+</style>

+ 13 - 0
src/views/doc/public_doc/index.vue

@@ -0,0 +1,13 @@
+<script>
+export default {
+  name: "index"
+}
+</script>
+
+<template>
+
+</template>
+
+<style scoped lang="scss">
+
+</style>