scorpio hace 2 años
padre
commit
111dbf2049

+ 1 - 0
package.json

@@ -15,6 +15,7 @@
     "echarts": "^5.4.1",
     "element-plus": "^2.2.9",
     "js-base64": "^3.7.2",
+    "js-file-download": "^0.4.12",
     "js-md5": "^0.7.3",
     "npm": "^8.17.0",
     "nprogress": "^0.2.0",

+ 117 - 106
src/api/contract/index.js

@@ -1,110 +1,121 @@
 import fetch from '../fetch.js'
 
 export default {
-    /**
-     * 合同管理相关借口
-     * @returns {Promise<unknown>}
-     */
-    contractList(params) {
-        // 合同列表
-        return fetch(
-            '/blade-project-manage-v2/contracts-manage/v2/page',
-            params,
-            'post'
-        )
-    },
-    /**
-     * 详情
-     * @param params
-     */
-    detail(params) {
-        return fetch(
-            '/blade-project-manage-v2/contracts-manage/v2/detail',
-            params,
-            'post'
-        )
-    },
-    /**
-     * 台账列表
-     * @param params
-     */
-    ledgerList(params) {
-        return fetch(
-            '/blade-project-manage-v2/accountinformation/list',
-            params,
-            'get'
-        )
-    },
-    /**
-     * 新增台账
-     * @param params
-     */
-    ledgerAdd(params) {
-        return fetch(
-            '/blade-project-manage-v2/accountinformation/save',
-            params,
-            'post',
-            'json'
-        )
-    },
-    /**
-     * 修改台账
-     * @param params
-     * @returns {Promise<unknown>}
-     */
-    ledgerUpdate(params) {
-        return fetch(
-            '/blade-project-manage-v2/accountinformation/update',
-            params,
-            'post',
-            'json'
-        )
-    },
-    /**
-     * 删除凭证
-     * @param params
-     */
-    voucherDel(params) {
-        return fetch(
-            '/blade-project-manage-v2/accountinformationfile/remove',
-            params,
-            'post',
-        )
-    },
-    /**
-     * 删除合同
-     * @param params
-     * @returns {Promise<unknown>}
-     */
-    contractRemove(params) {
-        return fetch(
-            '/blade-project-manage-v2/contracts-manage/v2/delete-contracts',
-            params,
-            'post'
-        )
-    },
-    /**
-     * 删除台账
-     * @param params
-     * @returns {Promise<unknown>}
-     */
-    remove(params) {
-        return fetch(
-            '/blade-project-manage-v2/accountinformation/remove',
-            params,
-            'post'
-        )
-    },
-    /**
-     * 更新合同信息
-     * @returns {Promise | Promise<unknown>}
-     */
-    contractUpdate(params) {
-        return fetch(
-            '/blade-project-manage-v2/contracts-manage/v2/submit',
-            params,
-            'post',
-            'json'
-        )
-    }
+  /**
+   * 合同管理相关借口
+   * @returns {Promise<unknown>}
+   */
+  contractList(params) {
+    // 合同列表
+    return fetch(
+      '/blade-project-manage-v2/contracts-manage/v2/page',
+      params,
+      'post'
+    )
+  },
+  /**
+   * 详情
+   * @param params
+   */
+  detail(params) {
+    return fetch(
+      '/blade-project-manage-v2/contracts-manage/v2/detail',
+      params,
+      'post'
+    )
+  },
+  /**
+   * 台账列表
+   * @param params
+   */
+  ledgerList(params) {
+    return fetch(
+      '/blade-project-manage-v2/accountinformation/list',
+      params,
+      'get'
+    )
+  },
+  /**
+   * 新增台账
+   * @param params
+   */
+  ledgerAdd(params) {
+    return fetch(
+      '/blade-project-manage-v2/accountinformation/save',
+      params,
+      'post',
+      'json'
+    )
+  },
+  /**
+   * 修改台账
+   * @param params
+   * @returns {Promise<unknown>}
+   */
+  ledgerUpdate(params) {
+    return fetch(
+      '/blade-project-manage-v2/accountinformation/update',
+      params,
+      'post',
+      'json'
+    )
+  },
+  /**
+   * 删除凭证
+   * @param params
+   */
+  voucherDel(params) {
+    return fetch(
+      '/blade-project-manage-v2/accountinformationfile/remove',
+      params,
+      'post'
+    )
+  },
+  /**
+   * 删除合同
+   * @param params
+   * @returns {Promise<unknown>}
+   */
+  contractRemove(params) {
+    return fetch(
+      '/blade-project-manage-v2/contracts-manage/v2/delete-contracts',
+      params,
+      'post'
+    )
+  },
+  /**
+   * 删除台账
+   * @param params
+   * @returns {Promise<unknown>}
+   */
+  remove(params) {
+    return fetch(
+      '/blade-project-manage-v2/accountinformation/remove',
+      params,
+      'post'
+    )
+  },
+  /**
+   * 更新合同信息
+   * @returns {Promise | Promise<unknown>}
+   */
+  contractUpdate(params) {
+    return fetch(
+      '/blade-project-manage-v2/contracts-manage/v2/submit',
+      params,
+      'post',
+      'json'
+    )
+  },
+  /**
+   * 选择关联合同文件
+   */
+  linkContract(params) {
+    return fetch(
+      '/blade-project-manage-v2/contracts-manage/v2/contract-save-file',
+      params,
+      'post',
+      'json'
+    )
+  }
 }

+ 4 - 3
src/api/index.js

@@ -13,8 +13,9 @@ import search from './search/index.js'
 import dispatch from './dispatch/index.js'
 import store from './store/index.js'
 import msg from './msg/index.js'
-import contract from "@/api/contract/index.js";
-import role from "@/api/role/index.js";
+import contract from '@/api/contract/index.js'
+import role from '@/api/role/index.js'
+import resource from '@/api/resource/index.js'
 
 export default {
   offices: ['pdf', 'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx', 'PDF'],
@@ -36,5 +37,5 @@ export default {
   msg,
   contract,
   role,
-    resource
+  resource
 }

+ 8 - 0
src/api/resource/index.js

@@ -106,5 +106,13 @@ export default {
       'post',
       'json'
     )
+  },
+  /**
+   * 详情
+   * @param id
+   * @returns {Promise<unknown>}
+   */
+  fileDetail(id) {
+    return fetch('/wutong-library/library/detail/file/' + id)
   }
 }

+ 9 - 4
src/components/file-way/index.vue

@@ -12,12 +12,17 @@
         <el-icon>
           <ArrowRight />
         </el-icon>
-        <el-button v-if="refreshBtn" text type="primary" size="mini">{{
-          data.title
-        }}</el-button>
+        <el-button text type="primary" size="mini">{{ data.title }}</el-button>
       </div>
     </div>
-    <el-button icon="Refresh" circle />
+    <el-tooltip content="刷新">
+      <el-button
+        icon="Refresh"
+        circle
+        v-if="refreshBtn"
+        @click="this.$emit('refresh')"
+      />
+    </el-tooltip>
   </div>
 </template>
 

+ 6 - 1
src/components/filepicker/index.vue

@@ -105,7 +105,7 @@
             <el-button type="primary" plain @click="show = false"
               >取 消
             </el-button>
-            <el-button type="primary">确 定</el-button>
+            <el-button type="primary" @click="submit">确 定</el-button>
           </div>
         </div>
       </div>
@@ -176,6 +176,7 @@ export default {
       option: {
         showMenu: false,
         showCheckBox: true,
+        folderChecked: false,
         height: 500,
         column: [
           {
@@ -343,6 +344,10 @@ export default {
       } else {
         console.log('top')
       }
+    },
+    submit() {
+      this.show = false
+      this.$emit('submit', this.selectedList)
     }
   }
 }

+ 28 - 0
src/components/upload-file/index.vue

@@ -104,8 +104,33 @@ export default {
       }
       if (this.resultList.length === this.fileList.length) {
         this.saveFile()
+        this.saveLibrary()
       }
     },
+    /**
+     * 保存到library
+     */
+    async saveLibrary() {
+      this.resultList
+        .filter(ele => api.offices.includes(ele.suffix))
+        .forEach(ele => {
+          const item = {
+            category: 4,
+            fileId: ele.id,
+            parentId: this.parentId,
+            projectId: this.projectId,
+            stageId: this.stageId,
+            type: 1,
+            title: ele.originalFileName,
+            content: ''
+          }
+          this.$api.common.submit(item).then(res => {
+            if (res.code === 200) {
+              console.log(res)
+            }
+          })
+        })
+    },
     /**
      * 保存文件
      */
@@ -123,6 +148,9 @@ export default {
         if (res.code === 200) {
           this.$message.success('文件上传完成')
           this.$emit('on-success', this.resultList)
+          setTimeout(() => {
+            this.drawer = false
+          }, 3000)
         }
       })
     }

+ 1 - 1
src/layout/index.vue

@@ -151,7 +151,7 @@ export default {
   .mp {
     top: 200px;
     right: 0;
-    z-index: 999;
+    z-index: 99;
     border-radius: 4px;
     position: fixed;
     background-color: white;

+ 25 - 18
src/views/contract/index.vue

@@ -1,7 +1,7 @@
 <template>
   <el-card shadow="hover">
     <el-form v-model="params" class="full-width" label-width="120px">
-      <div class="flex">
+      <div class="flex flex-center">
         <div class="flex flex-center mt-15 mr-10">
           <el-form-item label="关键字" class="full-width">
             <el-input
@@ -19,16 +19,6 @@
               clearable
             />
           </el-form-item>
-          <el-form-item class="full-width" label="合同类别">
-            <el-select v-model="params.type" clearable>
-              <el-option
-                v-for="item in typelist"
-                :key="item.dictKey"
-                :label="item.dictValue"
-                :value="item.dictKey"
-              />
-            </el-select>
-          </el-form-item>
           <el-form-item class="full-width" label="合同状态">
             <el-select v-model="params.status" clearable>
               <el-option
@@ -40,12 +30,12 @@
             </el-select>
           </el-form-item>
         </div>
+        <div class="flex flex-justify-end ml-20">
+          <base-button type="0" title="重置" icon="Refresh" @click="clearUp" />
+          <base-button class="ml-20" @click="onLoad" />
+        </div>
       </div>
     </el-form>
-    <div class="flex flex-justify-end ml-20">
-      <base-button type="0" title="重置" icon="Refresh" @click="clearUp" />
-      <base-button class="ml-20" @click="onLoad" />
-    </div>
     <avue-crud
       :option="option"
       :data="data"
@@ -62,7 +52,10 @@
         <div>{{ row.fileFolder.title }}</div>
       </template>
       <template #menu-left>
-        <div class="main-color ml-10 bold font-15">金额单位:万元</div>
+        <div class="flex flex-center">
+          <div class="main-color ml-10 mr-20 bold font-15">金额单位:万元</div>
+          <filepicker :project-id="projectId" @submit="selection" />
+        </div>
       </template>
     </avue-crud>
   </el-card>
@@ -76,9 +69,10 @@ meta: { layout: 'empty','path':'/home/details','title':'资料管理','showMsg'
 </route>
 <script>
 import BaseButton from '@/components/base-button.vue'
+import filepicker from '@/components/filepicker/index.vue'
 
 export default {
-  components: { BaseButton },
+  components: { BaseButton, filepicker },
   data() {
     return {
       projectId: '',
@@ -93,7 +87,6 @@ export default {
         editBtn: false,
         viewBtn: true,
         delBtn: true,
-        refreshBtn: false,
         columnBtn: false,
         labelWidth: 140,
         border: true,
@@ -243,6 +236,20 @@ export default {
     },
     refreshChange() {
       this.onLoad()
+    },
+    selection(list) {
+      const tmps = list.map(ele => {
+        return {
+          fileId: ele.id,
+          projectId: ele.projectId,
+          title: ele.title
+        }
+      })
+      this.$api.contract.linkContract(tmps).then(res => {
+        if (res.code === 200) {
+          this.refreshChange()
+        }
+      })
     }
   }
 }

+ 112 - 0
src/views/resource/component/preview.vue

@@ -0,0 +1,112 @@
+<template>
+  <div>
+    <el-button type="primary" text @click="openFile">查看</el-button>
+    <el-image-viewer
+      v-if="showImage"
+      :url-list="preList"
+      @close="showImage = false"
+    />
+    <el-drawer v-model="show" :size="1200">
+      <template #title>
+        <h4
+          class="ml-20 black flex flex-center flex-justify-start full-width font-16 bold"
+        >
+          {{ data ? data.title : '' }}
+        </h4>
+      </template>
+      <div>
+        <div v-if="data">
+          <el-empty
+            v-if="data.imgs.length === 0"
+            style="height: 90vh"
+            description="暂时无法预览,您可以点击 下载 按钮,下载原文件 "
+            class="full-height flex flex-center"
+          />
+          <div v-else v-for="item in data.imgs" :key="item.id">
+            <img :src="item.filePath" />
+          </div>
+        </div>
+        <div class="bottom flex flex-center flex-justify-center">
+          <el-button type="primary" icon="Download" @click="downloadClick"
+            >下 载</el-button
+          >
+          <el-button type="primary" icon="Share">分享</el-button>
+        </div>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import api from '@/api/index.js'
+
+export default {
+  props: {
+    info: {
+      type: Object,
+      default: null
+    }
+  },
+  watch: {
+    show: {
+      handler(val) {
+        if (val) {
+          this.detail()
+        }
+      },
+      immediate: true
+    }
+  },
+  data() {
+    return {
+      show: false,
+      data: null,
+      preList: [],
+      showImage: false
+    }
+  },
+  methods: {
+    openFile() {
+      if (api.offices.includes(this.info.suffix)) {
+        this.show = true
+      } else {
+        this.preList.length = 0
+        this.preList.push(this.info.url)
+        this.showImage = true
+      }
+    },
+    detail() {
+      this.$api.resource.fileDetail(this.info.fileId).then(res => {
+        if (res.code === 200) {
+          this.data = res.data
+          console.log(this.data)
+        } else {
+          console.log(res)
+        }
+      })
+    },
+    async downloadClick() {
+      const link = document.createElement('a')
+      link.href = this.info.url
+      link.download = this.info.title
+      link.click()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.bottom {
+  position: fixed;
+  bottom: 0;
+  box-shadow: -2px 0px 2px rgba(0, 0, 0, 0.1);
+  background-color: white;
+  height: 30px;
+  padding: 10px;
+  width: 1200px;
+  border: #e6e8ed solid 1px;
+}
+:deep(.el-drawer__body) {
+  padding: 0;
+}
+</style>

+ 1 - 1
src/views/resource/component/row1.vue

@@ -7,7 +7,7 @@
       <el-checkbox
         v-if="showCheckBox"
         v-model="info.checked"
-        :disabled="folderChecked"
+        :disabled="folderChecked === false && row.type === 2"
         class="padding-right"
         @change="rowChecked(row)"
       />

+ 19 - 12
src/views/resource/component/search.vue

@@ -25,7 +25,7 @@
         <div
           v-loading="loading"
           class="full-width mt-20 flex flex-align-start flex-col hide-scrollbar"
-          style="height: 30vh; overflow-y: auto"
+          style="min-height: 30vh; overflow-y: auto"
         >
           <div class="full-width" v-if="resultList && resultList.length === 0">
             <el-empty></el-empty>
@@ -79,20 +79,27 @@ import baseButton from '@/components/base-button.vue'
 export default {
   components: { baseButton },
   props: {
-    search: {
-      type: Object
+    stageId: {
+      type: String,
+      required: true,
+      default: ''
+    },
+    folderId: {
+      type: String,
+      required: true,
+      default: ''
     }
   },
   watch: {
-    search: {
+    stageId: {
+      handler(val) {
+        this.searchForm.stageId = val
+      },
+      immediate: true
+    },
+    folderId: {
       handler(val) {
-        console.log(val.stageId)
-        if (val.id) {
-          this.searchForm.fileFolderId = val.id
-        } else {
-          this.searchForm.fileFolderId = ''
-        }
-        this.searchForm.stageId = val.stageId
+        this.searchForm.fileFolderId = val
       },
       immediate: true
     }
@@ -130,7 +137,7 @@ export default {
       this.total = 0
     },
     goFoleDetail(item) {
-      this.$router.push('/home/file_detail?fileId=' + item.id)
+      this.$router.push('/home/file_detail?id=' + item.id)
     },
     closeDialog() {
       this.searchForm.keyword = ''

+ 14 - 5
src/views/resource/component/xtable.vue

@@ -47,8 +47,11 @@
               class="nowrap menu flex flex-center"
               style="width: 280px"
             >
-              <el-button type="primary" text>查看</el-button>
-              <archives v-if="row.type === 2" :folder-id="row.id" />
+              <preview :info="row" v-if="row.type === 1" />
+              <archives
+                v-if="row.type === 2 && row.parentId === '0'"
+                :folder-id="row.id"
+              />
               <move
                 v-if="row.type === 1"
                 :project-id="row.projectId"
@@ -97,12 +100,13 @@
 import row1 from '@/views/resource/component/row1.vue'
 import move from '@/views/resource/component/move.vue'
 import archives from '@/views/resource/component/archives.vue'
-
+import preview from '@/views/resource/component/preview.vue'
 export default {
   components: {
     row1,
     move,
-    archives
+    archives,
+    preview
   },
   props: {
     page: {
@@ -113,6 +117,10 @@ export default {
         total: 0
       }
     },
+    topFolder: {
+      type: Boolean,
+      default: true
+    },
     data: {
       type: Array,
       default: null
@@ -159,7 +167,8 @@ export default {
     selectedList: {
       handler(val) {
         this.$emit('selected', this.selectedList)
-      }
+      },
+      immediate: true
     }
   },
   data() {

+ 9 - 2
src/views/resource/index.vue

@@ -33,6 +33,7 @@
             <upload-file
               v-if="!top"
               @on-success="uploadSuccess"
+              :data="{ type: 1 }"
               :project-id="folderInfo.projectId"
               :stage-id="folderInfo.stageId"
               :parent-id="currentFolder !== null ? currentFolder.id : ''"
@@ -53,13 +54,18 @@
             />
           </div>
           <div class="flex flex-center main-color mr-10">
-            <search :search="folderInfo" />
+            <search
+              :stage-id="folderInfo.stageId"
+              :folder-id="currentFolder ? currentFolder.id : ''"
+            />
           </div>
         </div>
         <file-way
           :next="currentFolder"
+          :refresh-btn="true"
           @before="goBefore"
           @goHome="getFolderList"
+          @refresh="refreshData"
           class="mt-20"
         />
         <xtable
@@ -67,6 +73,7 @@
           :option="option"
           :loading="loading"
           :page="page"
+          :top-folder="top"
           @selected="selected"
           @row-click="getFileList"
           @current-change="currentChange"
@@ -145,7 +152,7 @@ export default {
       data: [],
       option: {
         showCheckBox: false,
-        folderChecked: false,
+        folderChecked: true,
         column: [
           {
             label: '名称',

+ 5 - 0
yarn.lock

@@ -2384,6 +2384,11 @@ js-cookie@^3.0.1:
   resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc"
   integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==
 
+js-file-download@^0.4.12:
+  version "0.4.12"
+  resolved "https://registry.yarnpkg.com/js-file-download/-/js-file-download-0.4.12.tgz#10c70ef362559a5b23cdbdc3bd6f399c3d91d821"
+  integrity sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==
+
 js-md5@^0.7.3:
   version "0.7.3"
   resolved "https://registry.yarnpkg.com/js-md5/-/js-md5-0.7.3.tgz#b4f2fbb0b327455f598d6727e38ec272cd09c3f2"