From 5d5382d1770819c5546f2130e3d88fa11a75d1fa Mon Sep 17 00:00:00 2001
From: licp <lichunping@guanfang.com.cn>
Date: 星期三, 18 十二月 2024 10:52:09 +0800
Subject: [PATCH] 完成cnas8.3迁移

---
 src/components/do/a8-file-handling/FileObsoletionRequest.vue        |  490 ++++++++
 static/img/stamps/技术负责人.png                                         |    0 
 static/img/stamps/通信.png                                            |    0 
 static/img/stamps/储能.png                                            |    0 
 src/components/do/a8-file-handling/DistributionCollectionRecord.vue |  614 ++++++++++
 static/img/stamps/射频.png                                            |    0 
 static/js/menu.js                                                   |  692 ++++------
 static/img/stamps/电力.png                                            |    0 
 static/img/stamps/装备.png                                            |    0 
 src/components/do/a8-file-handling/ControlledFileApplication.vue    |  552 +++++++++
 src/components/view/a8-file-handling.vue                            |   63 +
 src/assets/api/controller.js                                        |   39 
 static/img/stamps/综合室.png                                           |    0 
 src/components/do/a8-file-handling/FileList.vue                     |  321 +++++
 src/components/tool/file-preview.vue                                |    2 
 static/img/stamps/主任.png                                            |    0 
 src/components/tool/upPdfStamp.vue                                  |  164 ++
 static/img/stamps/质量负责人.png                                         |    0 
 index.html                                                          |    9 
 src/components/do/a8-file-handling/FileChangeRequest.vue            |  701 +++++++++++
 20 files changed, 3,220 insertions(+), 427 deletions(-)

diff --git a/index.html b/index.html
index c2bd28a..dd35a9b 100644
--- a/index.html
+++ b/index.html
@@ -1,3 +1,11 @@
+<!--
+ * @Author: licp lichunping@guanfang.com.cn
+ * @Date: 2024-10-28 15:06:45
+ * @LastEditors: licp lichunping@guanfang.com.cn
+ * @LastEditTime: 2024-12-18 10:21:33
+ * @FilePath: \tx-lims-before\index.html
+ * @Description: 杩欐槸榛樿璁剧疆,璇疯缃甡customMade`, 鎵撳紑koroFileHeader鏌ョ湅閰嶇疆 杩涜璁剧疆: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+-->
 <!DOCTYPE html>
 <html>
 <head>
@@ -33,4 +41,5 @@
 </body>
 <script src="<%= htmlWebpackPlugin.options.url %>/static/luckysheet/plugins/js/plugin.js"></script>
 <script src="<%= htmlWebpackPlugin.options.url %>/static/luckysheet/luckysheet.umd.js"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.16.105/pdf.min.js"></script>
 </html>
diff --git a/src/assets/api/controller.js b/src/assets/api/controller.js
index 57fe9f9..527cd79 100644
--- a/src/assets/api/controller.js
+++ b/src/assets/api/controller.js
@@ -34,6 +34,7 @@
     evaluate,
     role,
     insProductTemplate,
+    manageDocumentList,
   }
 }
 
@@ -428,3 +429,41 @@
   getInsProductTemplate:'/insProductTemplate/getInsProductTemplate',//閫夋嫨涔嬪悗鏌ョ湅璇︽儏  浼犲弬id
   delInsProductTemplate:'/insProductTemplate/delInsProductTemplate',//鍒犻櫎妯$増  浼犲弬id
 }
+
+// 8.3 绠$悊浣撶郴鏂囦欢鐨勬帶鍒�
+const manageDocumentList = {
+  pageManageDocumentList:'/manageDocumentList/pageManageDocumentList', // 鏂囦欢娓呭崟-鍒楄〃
+  doManageDocumentList:'/manageDocumentList/doManageDocumentList', // 鏂囦欢娓呭崟-缂栬緫
+  uploadFileManageDocumentList:'/manageDocumentList/uploadFileManageDocumentList', // 鏂囦欢娓呭崟-闄勪欢涓婁紶
+  exportManageDocumentList:'/manageDocumentList/exportManageDocumentList', // 鏂囦欢娓呭崟-闄勪欢涓婁紶
+  delManageDocumentList:'/manageDocumentList/delManageDocumentList', // 鏂囦欢娓呭崟-瀵煎嚭
+  pageManageDocumentControlled:'/manageDocumentControlled/pageManageDocumentControlled', // 鏂囦欢鍙楁帶-鍒楄〃
+  addManageDocumentControlled:'/manageDocumentControlled/addManageDocumentControlled', // 鏂囦欢鍙楁帶-鏂板
+  getManageDocumentControlled:'/manageDocumentControlled/getManageDocumentControlled', // 鏂囦欢鍙楁帶-鏌ョ湅
+  doManageDocumentControlled:'/manageDocumentControlled/doManageDocumentControlled', // 鏂囦欢鍙楁帶-淇敼
+  delManageDocumentControlled:'/manageDocumentControlled/delManageDocumentControlled', // 鏂囦欢鍙楁帶-鍒犻櫎
+  checkManageDocumentControlled:'/manageDocumentControlled/checkManageDocumentControlled', // 鏂囦欢鍙楁帶-瀹℃牳
+  checkManageDocumentControlledPdf:'/manageDocumentControlled/checkManageDocumentControlledPdf', // 鏂囦欢鍙楁帶-鑾峰彇pdf鏂囦欢娴�
+  pageManageDocumentCancel:'/manageDocumentCancel/pageManageDocumentCancel', // 鏂囦欢浣滃簾-鍒楄〃
+  addManageDocumentCancel:'/manageDocumentCancel/addManageDocumentCancel', // 鏂囦欢浣滃簾-鏂板
+  checkManageDocumentCancel:'/manageDocumentCancel/checkManageDocumentCancel', // 鏂囦欢浣滃簾-瀹℃牳
+  delManageDocumentCancel:'/manageDocumentCancel/delManageDocumentCancel', // 鏂囦欢浣滃簾-鍒犻櫎
+  getManageDocumentCancel:'/manageDocumentCancel/getManageDocumentCancel', // 鏂囦欢浣滃簾-鏌ョ湅
+  doManageDocumentCancel:'/manageDocumentCancel/doManageDocumentCancel', // 鏂囦欢浣滃簾-缂栬緫
+  exportManageDocumentCancel:'/manageDocumentCancel/exportManageDocumentCancel', // 鏂囦欢浣滃簾-瀵煎嚭
+  pageManageDocumentIssueRecycle:'/manageDocumentIssueRecycle/pageManageDocumentIssueRecycle', // 鏂囦欢鍙戞斁鍥炴敹-鍒楄〃
+  addManageDocumentIssueRecycle:'/manageDocumentIssueRecycle/addManageDocumentIssueRecycle', // 鏂囦欢鍙戞斁鍥炴敹-鏂板
+  delManageDocumentIssueRecycle:'/manageDocumentIssueRecycle/delManageDocumentIssueRecycle', // 鏂囦欢鍙戞斁鍥炴敹-鍒犻櫎
+  getManageDocumentIssueRecycle:'/manageDocumentIssueRecycle/getManageDocumentIssueRecycle', // 鏂囦欢鍙戞斁鍥炴敹-鏌ョ湅
+  doManageDocumentIssueRecycle:'/manageDocumentIssueRecycle/doManageDocumentIssueRecycle', // 鏂囦欢鍙戞斁鍥炴敹-缂栬緫
+  checkManageDocumentIssueRecycle:'/manageDocumentIssueRecycle/checkManageDocumentIssueRecycle', // 鏂囦欢鍙戞斁鍥炴敹-瀹℃牳
+  exportManageDocumentIssueRecycle:'/manageDocumentIssueRecycle/exportManageDocumentIssueRecycle', // 鏂囦欢鍙戞斁鍥炴敹-瀵煎嚭
+  pageManageDocumentAlter:'/manageDocumentAlter/pageManageDocumentAlter', // 鏂囦欢鍙樻洿-鍒楄〃
+  delManageDocumentAlter:'/manageDocumentAlter/delManageDocumentAlter', // 鏂囦欢鍙樻洿-鍒犻櫎
+  getManageDocumentAlter:'/manageDocumentAlter/getManageDocumentAlter', // 鏂囦欢鍙樻洿-鏌ョ湅
+  addManageDocumentAlter:'/manageDocumentAlter/addManageDocumentAlter', // 鏂囦欢鍙樻洿-鏂板
+  doManageDocumentAlter:'/manageDocumentAlter/doManageDocumentAlter', // 鏂囦欢鍙樻洿-缂栬緫
+  checkManageDocumentAlter:'/manageDocumentAlter/checkManageDocumentAlter', // 鏂囦欢鍙樻洿-瀹℃牳
+  checkManageDocumentAlterPdf:'/manageDocumentAlter/checkManageDocumentAlterPdf', // 鏂囦欢鍙樻洿-杞崲娴�
+  exportManageDocumentAlter:'/manageDocumentAlter/exportManageDocumentAlter', // 鏂囦欢鍙樻洿-瀵煎嚭
+}
diff --git a/src/components/do/a8-file-handling/ControlledFileApplication.vue b/src/components/do/a8-file-handling/ControlledFileApplication.vue
new file mode 100644
index 0000000..8968abd
--- /dev/null
+++ b/src/components/do/a8-file-handling/ControlledFileApplication.vue
@@ -0,0 +1,552 @@
+<template>
+  <!-- 鏂囦欢鍙楁帶璁板綍 -->
+  <div class="controlled-file-application" style="height: 100%;">
+    <div class="search">
+      <div class="search_thing">
+        <div class="search_label">鐢宠鏂囦欢缂栧彿锛�</div>
+        <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.documentCode"
+            @keyup.enter.native="refreshTable()"></el-input></div>
+      </div>
+      <div class="search_thing">
+        <div class="search_label">鐢宠浜猴細</div>
+        <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.createUserName"
+          @keyup.enter.native="refreshTable()"></el-input></div>
+      </div>
+      <div class="search_thing" style="padding-left: 30px;">
+        <el-button size="small" @click="refresh()">閲� 缃�</el-button>
+        <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button>
+      </div>
+      <div class="btns" style="padding-left: 30px;" v-if="addPower">
+        <el-button size="small" type="primary" @click="addDialogVisible=true,addInfo={},file=null">鏂囦欢鍙楁帶鐢宠</el-button>
+      </div>
+    </div>
+    <div class="table">
+      <ValueTable ref="ValueTable" :url="$api.manageDocumentList.pageManageDocumentControlled"
+        :componentData="componentData" :delUrl="$api.manageDocumentList.delManageDocumentControlled" :key="upIndex"/>
+    </div>
+    <el-dialog
+      title="鏂囦欢鍙楁帶鐢宠"
+      :visible.sync="addDialogVisible"
+      width="800px" top="10vh">
+      <el-row>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label"><span style="color:red;margin-right: 4px;">*</span>鐢宠缂栧彿锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.documentCode"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">璐d换浜猴細</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.dutyUser" size="small" style="width: 100%;" filterable>
+                <el-option
+                  v-for="item in personList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏂囦欢绫诲埆锛�</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.type" size="small" style="width: 100%;">
+                <el-option
+                  v-for="item in fileType"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏂囦欢鍚嶇О锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.name"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏂囦欢鐗堟湰锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.version"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">涓婁紶闄勪欢锛�</div>
+            <div class="search_input"><el-upload
+            style="margin: 8px 0 0px 50px;"
+              action="#"
+              :auto-upload="false"
+              :multiple="false"
+              accept='.pdf' :on-change="handleChangeUpload" v-if="addDialogVisible">
+              <el-button size="small" type="primary">涓婁紶闄勪欢</el-button>
+            </el-upload></div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">浣滆�咃細</div>
+            <div class="search_input">
+              <!-- <el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.writer"></el-input> -->
+              <el-select v-model="addInfo.writer" size="small" style="width: 100%;" filterable>
+                <el-option
+                  v-for="item in personList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.label">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鎻愪氦鏃ユ湡锛�</div>
+            <div class="search_input">
+              <el-date-picker
+                v-model="addInfo.submitDate"
+                type="date"
+                size="small"
+                placeholder="閫夋嫨鏃ユ湡"
+                format="yyyy-MM-dd"
+                value-format="yyyy-MM-dd" style="width: 100%;">
+              </el-date-picker>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">璇存槑锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.instructions" type="textarea"
+              :rows="2"></el-input></div>
+          </div>
+        </el-col>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="addDialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="handleAdd" :loading="addLoading">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      title="鏌ョ湅闄勪欢"
+      :visible.sync="lookDialogVisible"
+      width="800px" top="5vh" fullscreen>
+      <filePreview v-if="lookDialogVisible" :fileUrl="javaApi+'/word/'+currentInfo.url"
+      :currentFile="{}" style="height: 90vh;overflow-y: auto;"/>
+    </el-dialog>
+    <el-dialog
+      title="瀹℃牳"
+      :visible.sync="checkDialogVisible"
+      width="1000px" top="5vh">
+      <UpPdfStamp ref="UpPdfStamp" v-if="checkDialogVisible" @uploadPDF="uploadPDF" :isUpFile="false" style="max-height: 80vh;overflow-y: auto;"></UpPdfStamp>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleCheckSub('涓嶉�氳繃')" :loading="noCheckLoading">涓嶉�氳繃</el-button>
+        <el-button type="primary" @click="handleCheckSub('閫氳繃')" :loading="checkLoading">閫� 杩�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      title="閫夋嫨鍙楁帶绔�"
+      :visible.sync="checkStampDialogVisible"
+      width="600px" top="5vh">
+      <div class="stamp-list">
+        <img :src="'../../../../static/img/stamps/'+item+'.png'" alt="" v-for="(item,index) in stampsList" :key="index" style="width: 120px;height: 80px;margin: 6px;" class="stamp" :class="{active:currentStamp==item}" @click="currentStamp=item">
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="checkStampDialogVisible=false" >鍙� 娑�</el-button>
+        <el-button type="primary" @click="handleCheck0(currentInfo)">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import ValueTable from '../../tool/value-table.vue'
+import filePreview from '../../tool/file-preview.vue'
+import UpPdfStamp from '../../tool/upPdfStamp.vue'
+export default {
+  components: {
+    ValueTable,
+    filePreview,
+    UpPdfStamp
+  },
+  data() {
+    return {
+      upLoading: false,
+      addPower:false,
+      addDialogVisible:false,
+      addLoading:false,
+      lookDialogVisible:false,
+      checkDialogVisible:false,
+      checkStampDialogVisible:false,
+      componentData: {
+        entity: {
+          documentCode: null,
+          createUserName: null,
+          orderBy: {
+            field: 'createTime',
+            order: 'desc'
+          }
+        },
+        isIndex: true,
+        showSelect: false,
+        select: false,
+        do: [{
+          id: 'handleUpdate',
+          font: '缂栬緫',
+          type: 'text',
+          method: 'handleUpdate',
+          field:[],
+          disabFun: (row, index) => {
+            return row.state=='閫氳繃'
+          }
+        },
+        {
+          id: 'delete',
+          font: '鍒犻櫎',
+          type: 'text',
+          method: 'doDiy',
+          disabFun: (row, index) => {
+            return row.state=='閫氳繃'
+          }
+        },
+        {
+          id: 'handleCheck',
+          font: '瀹℃牳',
+          type: 'text',
+          method: 'handleCheck',
+          disabFun: (row, index) => {
+            return (row.dutyUserName&&!row.dutyUserName.includes(JSON.parse(localStorage.getItem("user")).name))||row.state=='閫氳繃'
+          }
+        },
+        {
+          id: 'handleLook',
+          font: '鏌ョ湅闄勪欢',
+          type: 'text',
+          method: 'handleLook'
+        },
+        {
+          id: 'handleDown',
+          font: '涓嬭浇闄勪欢',
+          type: 'text',
+          method: 'handleDown'
+        }],
+        tagField: {
+          state:{
+            select: [
+              {
+                value: '閫氳繃',
+                label: '閫氳繃'
+              },
+              {
+                value: '涓嶉�氳繃',
+                label: '涓嶉�氳繃'
+              },
+            ]
+          },
+        },
+        selectField: {
+          state:{
+            select: []
+          },
+          signatory:{
+            select: []
+          },
+        },
+        datePicker:['effectiveDate'],
+        addUpload:['signatoryUrl'],
+        requiredAdd: [],
+        requiredUp: [],
+        needSort: [],
+        inputType:聽''
+      },
+      entityCopy: {},
+      upIndex: 0,
+      addInfo:{},
+      personList:[],
+      fileType:[],
+      file:null,
+      currentInfo:{},
+      checkLoading:false,
+      noCheckLoading:false,
+      type:'',
+      stampsList:['涓讳换','璐ㄩ噺璐熻矗浜�','鎶�鏈礋璐d汉','缁煎悎瀹�','閫氫俊','鐢靛姏','瑁呭','鍌ㄨ兘','灏勯'],
+      currentStamp:'涓讳换'
+    }
+  },
+  mounted() {
+    this.entityCopy = this.HaveJson(this.componentData.entity);
+    this.getPower()
+    this.getAuthorizedPerson()
+    this.selectEnumByCategory()
+  },
+  methods: {
+    getPower(){
+      let power = JSON.parse(sessionStorage.getItem('power'))
+      let up = false
+      let del = false
+      let add = false
+      // let check = false
+      for (var i = 0; i < power.length; i++) {
+        if (power[i].menuMethod == 'addManageDocumentControlled') {
+          up = true
+        }
+        if (power[i].menuMethod == 'addManageDocumentControlled') {
+          add = true
+        }
+        if (power[i].menuMethod == 'delManageDocumentControlled') {
+          del = true
+        }
+        // if (power[i].menuMethod == 'checkManageDocumentControlled') {
+        //   check = true
+        // }
+      }
+      // if (!check) {
+      //   this.componentData.do.splice(2, 1)
+      // }
+      if (!del) {
+        this.componentData.do.splice(1, 1)
+      }
+      if (!up) {
+        this.componentData.do.splice(0, 1)
+      }
+      this.addPower = add
+    },
+    refreshTable() {
+      this.$refs['ValueTable'].selectList()
+    },
+    refresh() {
+      this.componentData.entity = this.HaveJson(this.entityCopy)
+      this.upIndex++
+      this.refreshTable()
+    },
+    getAuthorizedPerson() {
+      this.$axios.get(this.$api.user.getUserMenu).then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.personList = data
+      })
+    },
+    selectEnumByCategory() {
+      this.$axios.post(this.$api.enums.selectEnumByCategory, {
+        category: "鏂囦欢绫诲埆"
+      }).then(res => {
+        this.fileType = res.data
+      })
+    },
+    // 鎻愪氦
+    handleAdd(){
+      if(!this.addInfo.documentCode) return this.$message({type:'error',message:"璇疯緭鍏ョ紪鍙�"})
+      if(!this.addInfo.id){
+        // 鏂板
+        let fd = new FormData();
+        //鏂囦欢淇℃伅涓璻aw鎵嶆槸鐪熺殑鏂囦欢
+        if(this.file){
+          fd.append("file",this.file.raw);
+        }
+        for (let m in this.addInfo){
+          fd.append(m,this.addInfo[m])
+        }
+        this.addLoading = true
+        this.$axios.post(this.$api.manageDocumentList.addManageDocumentControlled, fd,{
+            headers: {
+              'Content-Type': 'multipart/form-data'
+            },
+            noQs:true
+          }).then(res => {
+            this.addLoading = false
+          if (res.code == 200) {
+            this.$message({
+              type: 'success',
+              message: '娣诲姞鎴愬姛'
+            })
+            this.refreshTable()
+            this.addDialogVisible = false
+          } else {
+            this.$message({
+              type: 'error',
+              message: '娣诲姞澶辫触'
+            })
+          }
+        })
+      }else{
+        // 淇敼
+        let {id,documentCode,dutyUser,type,name,version,writer,submitDate,instructions} = this.addInfo
+        let fd = new FormData();
+        //鏂囦欢淇℃伅涓璻aw鎵嶆槸鐪熺殑鏂囦欢
+        if(this.file){
+          fd.append("file",this.file.raw);
+        }
+        fd.append("id",id);
+        fd.append("documentCode",documentCode);
+        fd.append("dutyUser",dutyUser);
+        fd.append("type",type);
+        fd.append("name",name);
+        fd.append("version",version);
+        fd.append("writer",writer);
+        fd.append("submitDate",submitDate);
+        fd.append("instructions",instructions);
+        this.addLoading = true
+        this.$axios.post(this.$api.manageDocumentList.doManageDocumentControlled, fd,{
+            headers: {
+              'Content-Type': 'multipart/form-data'
+            },
+            noQs:true
+          }).then(res => {
+            this.addLoading = false
+          if (res.code == 200) {
+            this.refreshTable()
+            this.addDialogVisible = false
+          } else {
+            this.$message({
+              type: 'error',
+              message: '娣诲姞澶辫触'
+            })
+          }
+        })
+      }
+    },
+    handleChangeUpload(file, fileLists){
+      this.file = file
+      this.$set(this.addInfo,'name',file.name)
+    },
+    // 缂栬緫
+    handleUpdate(row){
+      this.title='鏂囦欢鍙樻洿鐢宠'
+      this.addInfo = this.HaveJson(row)
+      this.addDialogVisible = true
+    },
+    // 鏌ョ湅闄勪欢
+    handleLook(row){
+      this.currentInfo = row
+      this.lookDialogVisible = true
+    },
+    // 瀹℃牳
+    handleCheck(row){
+      this.title='瀹℃牳'
+      this.currentInfo = row
+      if(!row.url) return this.$message.warning('鏂囦欢鏈笂浼�')
+      this.checkStampDialogVisible=true
+    },
+    handleCheck0(row){
+      this.checkStampDialogVisible=false
+      this.checkDialogVisible = true
+      this.$axios.post(this.$api.manageDocumentList.checkManageDocumentControlledPdf,{id:row.id},{responseType: "blob"}).then(res=>{
+        //
+        const blob = new Blob([res]);
+        const file = new File([blob], row.name, { type: 'application/pdf' })
+        this.$refs.UpPdfStamp.lookFile(file,this.currentStamp)
+      }).catch(err=>{
+        console.log(err)
+      })
+    },
+    handleDown(row){
+      if(!row.url) return this.$message.warning('鏂囦欢鏈笂浼�')
+      let url = this.javaApi+'/word/'+row.url
+      const link = document.createElement('a');
+      link.href = url;
+      link.click();
+    },
+    async uploadPDF(pdfBlob){
+      const formData = new FormData();
+      formData.append('file', pdfBlob, this.fileName+'.pdf'); // 鏂囦欢瀛楁
+      formData.append('id', this.currentInfo.id); // 鏂囦欢鍚嶅瓧娈�
+      formData.append('state', this.type); // 鏂囦欢鍚嶅瓧娈�
+      formData.append('writer', this.currentInfo.writer); // 鏂囦欢鍚嶅瓧娈�
+
+      let res = await this.$axios.post(this.$api.manageDocumentList.checkManageDocumentControlled, formData,{
+        headers: {
+            'Content-Type': 'multipart/form-data;'
+        },
+        noQs: true
+      })
+      this.checkLoading = false
+      this.noCheckLoading = false
+      if(res.code==200){
+        this.$message({ message: '鎿嶄綔鎴愬姛', type: 'success' });
+        this.checkDialogVisible = false;
+        this.refreshTable()
+        return true
+      }else{
+        this.$message({ message: '鎿嶄綔澶辫触', type: 'error' });
+        return false
+      }
+    },
+    handleCheckSub(type){
+      this.type = type
+      if(type == '閫氳繃') {
+        this.checkLoading = true
+      }else{
+        this.noCheckLoading = true
+      }
+      this.addLoading = true
+      this.$refs['UpPdfStamp'].generatePDF()
+    }
+  }
+}
+</script>
+
+<style scoped>
+.title {
+    height: 60px;
+    line-height: 60px;
+  }
+  .search {
+    background-color: #fff;
+    height: 40px;
+    display: flex;
+    align-items: center;
+    position: relative;
+  }
+
+  .search_thing {
+    width: 350px;
+    display: flex;
+    align-items: center;
+  }
+
+  .search_label {
+    width: 110px;
+    font-size: 14px;
+    text-align: right;
+  }
+
+  .search_input {
+    width: calc(100% - 110px);
+  }
+
+  .table {
+    background-color: #fff;
+    width: calc(100% - 40px);
+    height: calc(100% - 60px - 80px);
+    padding: 20px;
+  }
+  .btns{
+    position: absolute;
+    right: 20px;
+    top: 5px;
+  }
+  .stamp{
+    cursor: pointer;
+    border: #fff 1px solid;
+  }
+  .stamp:hover{
+    border: #3A7BFA 1px solid;
+    box-shadow: inset 0px 0px 15px #3A7BFA;
+  }
+  .stamp.active{
+    border: #3A7BFA 1px solid;
+    box-shadow: inset 0px 0px 15px #3A7BFA;
+  }
+</style>
diff --git a/src/components/do/a8-file-handling/DistributionCollectionRecord.vue b/src/components/do/a8-file-handling/DistributionCollectionRecord.vue
new file mode 100644
index 0000000..14e26fb
--- /dev/null
+++ b/src/components/do/a8-file-handling/DistributionCollectionRecord.vue
@@ -0,0 +1,614 @@
+<template>
+  <!-- 鍙戞斁鍥炴敹璁板綍 -->
+  <div class="distribution-collection-record" style="height: 100%;">
+    <div class="search">
+      <div class="search_thing">
+        <div class="search_label">鏂囦欢缂栧彿锛�</div>
+        <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.documentCode"
+            @keyup.enter.native="refreshTable()"></el-input></div>
+      </div>
+      <div class="search_thing">
+        <div class="search_label">鏂囦欢鍚嶇О锛�</div>
+        <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.name"
+            @keyup.enter.native="refreshTable()"></el-input></div>
+      </div>
+      <div class="search_thing" style="padding-left: 30px;">
+        <el-button size="small" @click="refresh()">閲� 缃�</el-button>
+        <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button>
+      </div>
+      <div class="btns" style="padding-left: 30px;">
+        <el-button size="small" type="primary" @click="addDialogVisible=true,addInfo={},radio='鍙戞斁'" v-if="addPower">娣诲姞鍙戞斁璁板綍</el-button>
+        <el-button size="small" type="primary" v-if="outPower" @click="handleOut" :loading="outLoading">瀵煎嚭</el-button>
+      </div>
+    </div>
+    <div class="table">
+      <ValueTable ref="ValueTable" :url="$api.manageDocumentList.pageManageDocumentIssueRecycle"
+        :componentData="componentData" :delUrl="$api.manageDocumentList.delManageDocumentIssueRecycle" :key="upIndex"/>
+    </div>
+    <el-dialog
+      :title="'娣诲姞'+radio+'璁板綍'"
+      :visible.sync="addDialogVisible"
+      width="800px" top="10vh">
+      <el-row>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label"><span style="color:red;margin-right: 4px;">*</span>鐢宠缂栧彿锛�</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.documentCode" size="small" style="width: 100%;" @change="changeFileList" :disabled="radio=='鍥炴敹'" filterable allow-create clearable>
+                <el-option
+                  v-for="item in fileList"
+                  :key="item.documentCode"
+                  :label="item.documentCode"
+                  :value="item.documentCode">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;" v-if="radio=='鍙戞斁'">
+          <div class="search_thing">
+            <div class="search_label"><span style="color:red;margin-right: 4px;">*</span>鍙戞斁浜猴細</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.issueUser" size="small" style="width: 100%;" filterable>
+                <el-option
+                  v-for="item in personList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;" v-else>
+          <div class="search_thing">
+            <div class="search_label"><span style="color:red;margin-right: 4px;">*</span>鍥炴敹浜猴細</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.recycleUser" size="small" style="width: 100%;" filterable>
+                <el-option
+                  v-for="item in personList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label"><span style="color:red;margin-right: 4px;">*</span>瀹℃壒浜猴細</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.receiveUser" size="small" style="width: 100%;" :disabled="radio!='鍙戞斁'" filterable>
+                <el-option
+                  v-for="item in personList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏂囦欢鍚嶇О锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.name" :disabled="radio=='鍥炴敹'"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏂囦欢鐗堟湰锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.version" :disabled="radio=='鍥炴敹'"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏂囦欢鐘舵�侊細</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.state" size="small" style="width: 100%;" :disabled="radio=='鍥炴敹'">
+                <el-option :label="item.label" :value="item.value" v-for="(item,index) in fileState" :key="index"></el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;" v-if="radio=='鍙戞斁'">
+          <div class="search_thing">
+            <div class="search_label">鍙戞斁缂栧彿锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.issueCode"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;" v-else>
+          <div class="search_thing">
+            <div class="search_label">鍥炴敹缂栧彿锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.recycleCode"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;" v-if="radio=='鍙戞斁'">
+          <div class="search_thing">
+            <div class="search_label">鍙戞斁鏃堕棿锛�</div>
+            <div class="search_input">
+              <el-date-picker
+                v-model="addInfo.issueDate"
+                type="date"
+                size="small"
+                placeholder="閫夋嫨鏃ユ湡"
+                format="yyyy-MM-dd"
+                value-format="yyyy-MM-dd" style="width: 100%;">
+              </el-date-picker>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;" v-else>
+          <div class="search_thing">
+            <div class="search_label">鍥炴敹鏃堕棿锛�</div>
+            <div class="search_input">
+              <el-date-picker
+                v-model="addInfo.recycleDate"
+                type="date"
+                size="small"
+                placeholder="閫夋嫨鏃ユ湡"
+                format="yyyy-MM-dd"
+                value-format="yyyy-MM-dd" style="width: 100%;">
+              </el-date-picker>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;" v-if="radio=='鍙戞斁'">
+          <div class="search_thing">
+            <div class="search_label">鍙戞斁璇存槑锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.issueNote" type="textarea"
+              :rows="2"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;" v-else>
+          <div class="search_thing">
+            <div class="search_label">鍥炴敹璇存槑锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.recycleNote" type="textarea"
+              :rows="2"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;" v-if="radio=='鍙戞斁'">
+          <div class="search_thing">
+            <div class="search_label">涓婁紶闄勪欢锛�</div>
+            <div class="search_input"><el-upload
+            style="margin: 8px 0 0px 50px;"
+              action="#"
+              :auto-upload="false"
+              :multiple="false"
+              accept='.pdf,.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx' :on-change="handleChangeUpload">
+              <el-button size="small" type="primary">涓婁紶闄勪欢</el-button>
+            </el-upload></div>
+          </div>
+        </el-col>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="addDialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="handleAdd" :loading="addLoading">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      title="鏌ョ湅闄勪欢"
+      :visible.sync="lookDialogVisible"
+      width="800px" top="5vh" fullscreen>
+      <filePreview v-if="lookDialogVisible" :fileUrl="javaApi+'/word/'+currentInfo.url"
+      :currentFile="{}" style="height: 90vh;overflow-y: auto;"/>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import ValueTable from '../../tool/value-table.vue'
+import filePreview from '../../tool/file-preview.vue'
+export default {
+  components: {
+    ValueTable,
+    filePreview
+  },
+  data() {
+    return {
+      ddPower: false,
+      outPower:true,
+      addInfo: {},
+      addPower:true,
+      addLoading:false,
+      addDialogVisible: false,
+      outLoading:false,
+      componentData: {
+        entity: {
+          documentCode: null,
+          name: null,
+          orderBy: {
+            field: 'createTime',
+            order: 'desc'
+          }
+        },
+        isIndex: true,
+        showSelect: false,
+        select: false,
+        do: [{
+          id: 'handleUpdate',
+          font: '鍥炴敹璁板綍',
+          type: 'text',
+          method: 'handleUpdate',
+          field:[],
+          // disabFun: (row, index) => {
+          //   return row.documentState=='閫氳繃'
+          // }
+        },
+        {
+          id: 'delete',
+          font: '鍒犻櫎',
+          type: 'text',
+          method: 'doDiy',
+          disabFun: (row, index) => {
+            return row.documentState=='閫氳繃'
+          }
+        },
+        {
+          id: 'handleLook',
+          font: '鏌ョ湅闄勪欢',
+          type: 'text',
+          method: 'handleLook',
+          disabFun: (row, index) => {
+            return !row.url
+          }
+        },
+        {
+          id: 'handleCheck',
+          font: '瀹℃牳',
+          type: 'text',
+          method: 'handleCheck',
+          disabFun: (row, index) => {
+            return row.receiveUser!=JSON.parse(localStorage.getItem("user")).userId||row.documentState=='閫氳繃'
+          }
+        },],
+        tagField: {
+          state:{
+            select: [
+            {
+                value: '閫氳繃',
+                label: '閫氳繃'
+              },
+              {
+                value: '涓嶉�氳繃',
+                label: '涓嶉�氳繃'
+              },
+            ]
+          },
+        },
+        selectField: {
+          state:{
+            select: [
+              {
+                value: '閫氳繃',
+                label: '閫氳繃'
+              },
+              {
+                value: '涓嶉�氳繃',
+                label: '涓嶉�氳繃'
+              },
+            ]
+          },
+          signatory:{
+            select: []
+          },
+        },
+        datePicker:['effectiveDate'],
+        addUpload:['signatoryUrl'],
+        requiredAdd: [],
+        requiredUp: [],
+        needSort: [],
+        inputType:聽''
+      },
+      entityCopy: {},
+      upIndex: 0,
+      personList:[],
+      fileList:[],
+      fileList0:[],
+      radio:'鍙戞斁',
+      fileState:[],
+      file:null,
+      currentInfo:{},
+      lookDialogVisible:false
+    }
+  },
+  mounted() {
+    this.entityCopy = this.HaveJson(this.componentData.entity);
+    this.getPower()
+    this.getAuthorizedPerson()
+    this.getFileList()
+    this.getFileList0()
+    this.selectEnumByCategory()
+  },
+  methods:{
+    getPower(){
+      let power = JSON.parse(sessionStorage.getItem('power'))
+      let out = false
+      let del = false
+      let add = false
+      // let check = false
+      for (var i = 0; i < power.length; i++) {
+        if (power[i].menuMethod == 'exportManageDocumentIssueRecycle') {
+          out = true
+        }
+        if (power[i].menuMethod == 'addManageDocumentIssueRecycle') {
+          add = true
+        }
+        if (power[i].menuMethod == 'delManageDocumentIssueRecycle') {
+          del = true
+        }
+        // if (power[i].menuMethod == 'checkManageDocumentControlled') {
+        //   check = true
+        // }
+      }
+      // if (!check) {
+      //   this.componentData.do.splice(2, 1)
+      // }
+      if (!del) {
+        this.componentData.do.splice(1, 1)
+      }
+      if (!add) {
+        this.componentData.do.splice(0, 1)
+      }
+      this.addPower = add
+      this.outPower = out
+    },
+    refreshTable() {
+      this.$refs['ValueTable'].selectList()
+    },
+    refresh() {
+      this.componentData.entity = this.HaveJson(this.entityCopy)
+      this.upIndex++
+      this.refreshTable()
+    },
+    selectEnumByCategory() {
+      this.$axios.post(this.$api.enums.selectEnumByCategory, {
+        category: "鏂囦欢鐘舵��"
+      }).then(res => {
+        this.fileState = res.data
+        // this.componentData.tagField.state.select = res.data
+        // this.componentData.selectField.state.select = res.data
+      })
+    },
+    // 鑾峰彇浜哄憳鍒楄〃
+    getAuthorizedPerson() {
+      this.$axios.get(this.$api.user.getUserMenu).then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.personList = data
+      })
+    },
+    // 鑾峰彇鏂囦欢鍒楄〃--鏂囦欢娓呭崟
+    getFileList(){
+      this.$axios.post(this.$api.manageDocumentList.pageManageDocumentList,{
+        entity: {
+          orderBy: {
+            field: 'createTime',
+            order: 'desc'
+          }
+        },
+        page:{
+          current:-1,
+          size:-1
+        }
+      },{headers: {
+            'Content-Type': 'application/json'
+          }}).then(res=>{
+        this.fileList = res.data.body.records
+      }).catch(err=>{})
+    },
+    // 鑾峰彇鏂囦欢鍒楄〃--浣滃簾鏂囦欢
+    getFileList0(){
+      this.$axios.post(this.$api.manageDocumentList.pageManageDocumentCancel,{
+        entity: {
+          orderBy: {
+            field: 'createTime',
+            order: 'desc'
+          }
+        },
+        page:{
+          current:-1,
+          size:-1
+        }
+      },{headers: {
+            'Content-Type': 'application/json'
+          }}).then(res=>{
+        this.fileList0 = res.data.body.records
+      }).catch(err=>{})
+    },
+    // 瀵煎嚭
+    handleOut(){
+      this.outLoading = true
+      this.$axios.post(this.$api.manageDocumentList.exportManageDocumentIssueRecycle, {entity:this.componentData.entity},{headers: {
+          'Content-Type': 'application/json'
+        },responseType: "blob"},).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res],{ type: 'application/octet-stream' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = '鍙戞斁鍥炴敹璁板綍.xlsx';
+        link.click();
+      })
+    },
+    changeFileList(e){
+      if(e){
+        let obj = this.fileList.find(a=>a.documentCode == e)
+        this.addInfo.name = obj.name
+        this.addInfo.version = obj.version
+        this.addInfo.state = obj.state
+      }
+    },
+    // 鎻愪氦
+    handleAdd(){
+      if(!this.addInfo.documentCode){
+        this.$message.error('璇烽�夋嫨鏂囦欢')
+        return
+      }
+      if(!this.addInfo.receiveUser){
+        this.$message.error('璇烽�夋嫨瀹℃壒浜�')
+        return
+      }
+      if(this.radio=='鍙戞斁'){
+        if(!this.addInfo.issueUser){
+          this.$message.error('璇烽�夋嫨鍙戞斁浜�')
+          return
+        }
+      }else{
+        if(!this.addInfo.recycleUser){
+          this.$message.error('璇烽�夋嫨鍥炴敹浜�')
+          return
+        }
+      }
+      this.addLoading = true;
+      if(!this.addInfo.id){
+        // 鏂板鍙戞斁璁板綍
+        let fd = new FormData();
+        //鏂囦欢淇℃伅涓璻aw鎵嶆槸鐪熺殑鏂囦欢
+        if(this.file){
+          fd.append("file",this.file.raw);
+        }
+        for(let key in this.addInfo){
+          fd.append(key,this.addInfo[key])
+        }
+        this.$axios.post(this.$api.manageDocumentList.addManageDocumentIssueRecycle,fd,{
+            headers: {
+              'Content-Type': 'multipart/form-data'
+            },
+            noQs:true
+          }).then(res=>{
+            this.addLoading = false;
+          if(res.code==200){
+            this.$message.success('鍙戞斁鎴愬姛')
+            this.addDialogVisible = false
+            this.refreshTable()
+          }
+        })
+      }else{
+        let {documentCode,id,issueUser,recycleUser,receiveUser,name,version,documentState,issueCode,recycleCode,issueDate,recycleDate,issueNote,recycleNote} = this.addInfo
+        // 娣诲姞鍥炴敹璁板綍
+        this.$axios.post(this.$api.manageDocumentList.doManageDocumentIssueRecycle,{
+          documentCode,id,issueUser,recycleUser,receiveUser,name,version,documentState,issueCode,recycleCode,issueDate,recycleDate,issueNote,recycleNote
+        },{headers: {
+            'Content-Type': 'application/json'
+          },noQS:true}).then(res=>{
+            this.addLoading = false;
+          if(res.code==200){
+            this.$message.success('鎻愪氦鎴愬姛')
+            this.addDialogVisible = false
+            this.refreshTable()
+          }
+        })
+      }
+    },
+    // 娣诲姞鍥炴敹
+    handleUpdate(row){
+      this.addInfo = this.HaveJson(row)
+      this.radio = '鍥炴敹'
+      this.addDialogVisible = true
+    },
+    // 瀹℃牳
+    handleCheck(row){
+      this.$confirm('鏄惁瀹℃牳閫氳繃?', '鎻愮ず', {
+        confirmButtonText: '閫氳繃',
+        cancelButtonText: '涓嶉�氳繃',
+        type: 'warning',
+        closeOnClickModal: false, // 绂佹鐐瑰嚮閬僵灞傚叧闂�
+        distinguishCancelAndClose: true,
+        beforeClose: (action, instance, done) => {
+          if (action === 'confirm') {
+            // 鐐瑰嚮鈥滅‘瀹氣�濇寜閽紝鍏佽鍏抽棴
+            this.$axios.post(this.$api.manageDocumentList.checkManageDocumentIssueRecycle, {id:row.id,documentState:'閫氳繃'}).then(res => {
+              this.refreshTable()
+              done();
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              })
+            })
+            .catch(err => {
+
+            })
+          } else if (action === 'cancel') {
+            // 鐐瑰嚮鈥滃彇娑堚�濇寜閽紝涓嶅厑璁稿叧闂�
+            this.$axios.post(this.$api.manageDocumentList.checkManageDocumentIssueRecycle, {id:row.id,documentState:'涓嶉�氳繃'}).then(res => {
+              this.refreshTable()
+              done();
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              })
+            })
+            .catch(err => {
+
+            })
+            console.log("鍙栨秷鎸夐挳鐐瑰嚮浜嬩欢锛屼笉鍏抽棴寮规");
+          } else if (action === 'close') {
+            // 鐐瑰嚮鈥溍椻�濇寜閽紝涓嶅厑璁稿叧闂�
+            done();
+            console.log("脳鎸夐挳鐐瑰嚮浜嬩欢锛屼笉鍏抽棴寮规");
+          }
+          }
+      })
+    },
+    handleChangeUpload(file, fileLists){
+      this.file = file
+      this.$set(this.addInfo,'name',file.name)
+    },
+    // 鏌ョ湅闄勪欢
+    handleLook(row){
+      this.currentInfo = this.HaveJson(row)
+      this.lookDialogVisible = true
+    }
+  }
+}
+</script>
+
+<style scoped>
+.title {
+    height: 60px;
+    line-height: 60px;
+  }
+  .search {
+    background-color: #fff;
+    height: 40px;
+    display: flex;
+    align-items: center;
+    position: relative;
+  }
+
+  .search_thing {
+    width: 350px;
+    display: flex;
+    align-items: center;
+  }
+
+  .search_label {
+    width: 110px;
+    font-size: 14px;
+    text-align: right;
+  }
+
+  .search_input {
+    width: calc(100% - 110px);
+  }
+
+  .table {
+    background-color: #fff;
+    width: calc(100% - 40px);
+    height: calc(100% - 60px - 80px);
+    padding: 20px;
+  }
+  .btns{
+    position: absolute;
+    right: 20px;
+    top: 5px;
+  }
+</style>
diff --git a/src/components/do/a8-file-handling/FileChangeRequest.vue b/src/components/do/a8-file-handling/FileChangeRequest.vue
new file mode 100644
index 0000000..00f24ac
--- /dev/null
+++ b/src/components/do/a8-file-handling/FileChangeRequest.vue
@@ -0,0 +1,701 @@
+<template>
+  <!-- 鏂囦欢鍙樻洿鐢宠 -->
+  <div class="file-change-request" style="height: 100%;">
+    <div class="search">
+      <div class="search_thing">
+        <div class="search_label">鐢宠鏂囦欢缂栧彿锛�</div>
+        <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.code"
+            @keyup.enter.native="refreshTable()"></el-input></div>
+      </div>
+      <div class="search_thing" style="padding-left: 30px;">
+        <el-button size="small" @click="refresh()">閲� 缃�</el-button>
+        <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button>
+      </div>
+      <div class="btns" v-if="addPower">
+        <el-button size="small" type="primary" @click="addDialogVisible=true,addInfo={},currentFile={},title='鏂囦欢鍙樻洿鐢宠'">鏂囦欢鍙樻洿鐢宠</el-button>
+        <el-button size="small" type="primary" v-if="outPower" @click="handleOut" :loading="outLoading">瀵煎嚭</el-button>
+      </div>
+    </div>
+    <div class="table">
+      <ValueTable ref="ValueTable" :url="$api.manageDocumentList.pageManageDocumentAlter"
+        :componentData="componentData" :delUrl="$api.manageDocumentList.delManageDocumentAlter" :key="upIndex"/>
+    </div>
+    <el-dialog
+      :title="title"
+      :visible.sync="addDialogVisible"
+      width="950px" top="0vh">
+      <el-row style="max-height: 80vh;overflow-y: auto;">
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label"><span style="color:red;margin-right: 4px;">*</span>鐢宠缂栧彿锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.code" :disabled="title=='瀹℃牳'"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">瀹℃壒浜猴細</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.checkUser" size="small" style="width: 100%;" filterable :disabled="title=='瀹℃牳'">
+                <el-option
+                  v-for="item in personList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏈熸湜鍙樻洿鏃堕棿锛�</div>
+            <div class="search_input">
+              <el-date-picker
+                v-model="addInfo.expectAlterDate"
+                type="date"
+                size="small"
+                placeholder="閫夋嫨鏃ユ湡"
+                format="yyyy-MM-dd"
+                value-format="yyyy-MM-dd" style="width: 100%;" :disabled="title=='瀹℃牳'">
+              </el-date-picker>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">瀹為檯鍙樻洿鏃堕棿锛�</div>
+            <div class="search_input">
+              <el-date-picker
+                v-model="addInfo.actuallyAlterDate"
+                type="date"
+                size="small"
+                placeholder="閫夋嫨鏃ユ湡"
+                format="yyyy-MM-dd"
+                value-format="yyyy-MM-dd" style="width: 100%;"
+                :disabled="title=='瀹℃牳'">
+              </el-date-picker>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">閫夋嫨鏂囦欢锛�</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.alterBeforeCode" size="small" style="width: 100%;" @change="getCurrentFile" :disabled="title=='瀹℃牳'" filterable allow-create clearable>
+                <el-option
+                  v-for="item in fileList"
+                  :key="item.documentCode"
+                  :label="item.title"
+                  :value="item.documentCode">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="24">
+          <h4 class="title">褰撳墠鏂囦欢淇℃伅</h4>
+        </el-col>
+        <el-col :span="8" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">鏂囦欢缂栧彿锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="currentFile.documentCode" :disabled="title=='瀹℃牳'"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="8" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">鏂囦欢鍚嶇О锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="currentFile.name" :disabled="title=='瀹℃牳'"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="8" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">鏂囦欢鐗堟湰锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="currentFile.version" :disabled="title=='瀹℃牳'"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="8" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">鎻愪氦浜猴細</div>
+            <div class="search_input"><el-select v-model="currentFile.createUser" size="small" style="width: 100%;" disabled filterable>
+                <el-option
+                  v-for="item in personList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select></div>
+          </div>
+        </el-col>
+        <!-- <el-col :span="8" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">瀹℃牳浜猴細</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.version" disabled></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="8" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">浣滃簾浜猴細</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.version" disabled></el-input></div>
+          </div>
+        </el-col> -->
+        <el-col :span="8" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">鎻愪氦鏃堕棿锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="currentFile.createTime" disabled></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="8" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">瀹℃牳鏃堕棿锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="currentFile.effectiveDate" disabled></el-input></div>
+          </div>
+        </el-col>
+        <!-- <el-col :span="8" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">浣滃簾鏃堕棿锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.version" disabled></el-input></div>
+          </div>
+        </el-col> -->
+        <el-col :span="8" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">鏂囦欢鐘舵�侊細</div>
+            <div class="search_input">
+              <el-select v-model="currentFile.state" size="small" style="width: 100%;" disabled>
+                <el-option
+                  v-for="item in fileState"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <!-- <el-col :span="8" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">鏂囦欢璇存槑锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.instructions" type="textarea"
+              :rows="2" disabled></el-input></div>
+          </div>
+        </el-col> -->
+        <el-col :span="24">
+          <h4 class="title">鏂囦欢鍙樻洿鐢宠</h4>
+        </el-col>
+        <el-col :span="8" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">鍙樻洿鍚庣紪鍙凤細</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.alterAfterCode" :disabled="title=='瀹℃牳'"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="8" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">鍙樻洿鍚庡悕绉帮細</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.alterAfterName" :disabled="title=='瀹℃牳'"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="8" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">鍓嶄竴鐗堟湰澶勭悊锛�</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.method" size="small" style="width: 100%;" :disabled="title=='瀹℃牳'">
+                <el-option label="浣滃簾" value="浣滃簾"></el-option>
+                <el-option label="瀛樻。涓嶅彲鐢�" value="瀛樻。涓嶅彲鐢�">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="8" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">鍙樻洿鍚庣増鏈細</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.alterAfterVersion" :disabled="title=='瀹℃牳'"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="16" style="margin-bottom: 16px;">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">鍙樻洿璇存槑锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.alterNote" type="textarea"
+              :rows="2" :disabled="title=='瀹℃牳'"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;" v-if="title!='瀹℃牳'">
+          <div class="search_thing" style="width: 100%;">
+            <div class="search_label">鐩稿叧闄勪欢锛�</div>
+            <div class="search_input"><el-upload
+            style="margin: 8px 0 0px 50px;"
+              action="#"
+              :auto-upload="false"
+              :multiple="false"
+              accept='.pdf' :on-change="handleChangeUpload" v-if="addDialogVisible">
+              <el-button size="small" type="primary">涓婁紶闄勪欢</el-button>
+            </el-upload></div>
+          </div>
+        </el-col>
+        <UpPdfStamp ref="UpPdfStamp" v-if="title=='瀹℃牳'&&addDialogVisible" @uploadPDF="uploadPDF" :isUpFile="false"></UpPdfStamp>
+      </el-row>
+      <span slot="footer" class="dialog-footer" v-if="title!='瀹℃牳'">
+        <el-button @click="addDialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="handleAdd" :loading="addLoading">纭� 瀹�</el-button>
+      </span>
+      <span slot="footer" class="dialog-footer" v-else>
+        <el-button @click="handleCheckSub('涓嶉�氳繃')" :loading="noCheckLoading">涓嶉�氳繃</el-button>
+        <el-button type="primary" @click="handleCheckSub('閫氳繃')" :loading="checkLoading">閫� 杩�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      title="鏌ョ湅闄勪欢"
+      :visible.sync="lookDialogVisible"
+      width="800px" top="5vh" fullscreen>
+      <filePreview v-if="lookDialogVisible" :fileUrl="javaApi+'/word/'+currentInfo.alterAfterUrl"
+      :currentFile="{}" style="height: 90vh;overflow-y: auto;"/>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import ValueTable from '../../tool/value-table.vue'
+import filePreview from '../../tool/file-preview.vue'
+import UpPdfStamp from '../../tool/upPdfStamp.vue'
+export default {
+  components: {
+    ValueTable,
+    filePreview,
+    UpPdfStamp,
+  },
+  data() {
+    return {
+      title:'鏂囦欢鍙樻洿鐢宠',
+      noCheckLoading:false,
+      checkLoading:false,
+      addDialogVisible: false,
+      addInfo:{},
+      componentData: {
+        entity: {
+          code: null,
+          orderBy: {
+            field: 'createTime',
+            order: 'desc'
+          }
+        },
+        isIndex: true,
+        showSelect: false,
+        select: false,
+        do: [{
+          id: 'handleUpdate',
+          font: '缂栬緫',
+          type: 'text',
+          method: 'handleUpdate',
+          field:[],
+          disabFun: (row, index) => {
+            return row.state=='閫氳繃'
+          }
+        },
+        {
+          id: 'delete',
+          font: '鍒犻櫎',
+          type: 'text',
+          method: 'doDiy',
+          disabFun: (row, index) => {
+            return row.state=='閫氳繃'
+          }
+        },
+        {
+          id: 'handleCheck',
+          font: '瀹℃牳',
+          type: 'text',
+          method: 'handleCheck',
+          disabFun: (row, index) => {
+            return row.checkUser!=JSON.parse(localStorage.getItem("user")).userId||row.state=='閫氳繃'
+          }
+        },
+        {
+          id: 'handleLook',
+          font: '鏌ョ湅闄勪欢',
+          type: 'text',
+          method: 'handleLook'
+        },
+        {
+          id: 'handleDown',
+          font: '涓嬭浇闄勪欢',
+          type: 'text',
+          method: 'handleDown'
+        }],
+        tagField: {
+          state:{
+            select: [
+              {
+                value: '閫氳繃',
+                label: '閫氳繃'
+              },
+              {
+                value: '涓嶉�氳繃',
+                label: '涓嶉�氳繃'
+              },
+            ]
+          },
+        },
+        selectField: {
+          state:{
+            select: []
+          },
+          signatory:{
+            select: []
+          },
+        },
+        datePicker:['effectiveDate'],
+        addUpload:['signatoryUrl'],
+        requiredAdd: [],
+        requiredUp: [],
+        needSort: [],
+        inputType:聽''
+      },
+      entityCopy: {},
+      upIndex: 0,
+      addPower:false,
+      outPower:false,
+      outLoading:false,
+      personList:[],
+      fileList:[],
+      currentFile:{},
+      fileState:[],
+      file:null,
+      addLoading:false,
+      lookDialogVisible:false,
+      currentInfo:{
+      },
+      type:null,
+      fileName:null,
+    }
+  },
+  mounted() {
+    this.entityCopy = this.HaveJson(this.componentData.entity);
+    this.getPower()
+    this.getAuthorizedPerson()
+    this.getFileList()
+    this.selectEnumByCategory()
+  },
+  methods: {
+    getPower(){
+      let power = JSON.parse(sessionStorage.getItem('power'))
+      let up = false
+      let del = false
+      let add = false
+      let out = false
+      for (var i = 0; i < power.length; i++) {
+        if (power[i].menuMethod == 'addManageDocumentAlter') {
+          up = true
+        }
+        if (power[i].menuMethod == 'addManageDocumentAlter') {
+          add = true
+        }
+        if (power[i].menuMethod == 'delManageDocumentAlter') {
+          del = true
+        }
+        if (power[i].menuMethod == 'exportManageDocumentAlter') {
+          out = true
+        }
+      }
+      if (!del) {
+        this.componentData.do.splice(1, 1)
+      }
+      if (!up) {
+        this.componentData.do.splice(0, 1)
+      }
+      this.addPower = add
+      this.outPower = out
+    },
+    refreshTable() {
+      this.$refs['ValueTable'].selectList()
+    },
+    refresh() {
+      this.componentData.entity = this.HaveJson(this.entityCopy)
+      this.upIndex++
+      this.refreshTable()
+    },
+    // 瀵煎嚭
+    handleOut(){
+      this.outLoading = true
+      this.$axios.post(this.$api.manageDocumentList.exportManageDocumentAlter, {entity:this.componentData.entity},{headers: {
+          'Content-Type': 'application/json'
+        },responseType: "blob"},).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res],{ type: 'application/octet-stream' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = '鏂囦欢鍙樻洿璁板綍.xlsx';
+        link.click();
+      })
+    },
+    getAuthorizedPerson() {
+      this.$axios.get(this.$api.user.getUserMenu).then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.personList = data
+      })
+    },
+    // 鑾峰彇鏂囦欢鍒楄〃--鏂囦欢娓呭崟
+    getFileList(){
+      this.$axios.post(this.$api.manageDocumentList.pageManageDocumentList,{
+        entity: {
+          orderBy: {
+            field: 'createTime',
+            order: 'desc'
+          }
+        },
+        page:{
+          current:-1,
+          size:-1
+        }
+      },{headers: {
+        'Content-Type': 'application/json'
+      }}).then(res=>{
+        this.fileList = res.data.body.records.map(m=>{
+          m.title = m.documentCode +':'+m.name
+          return m
+        })
+      }).catch(err=>{})
+    },
+    // 褰撳墠鏂囦欢
+    getCurrentFile(e){
+      this.currentFile = this.fileList.find(m=>m.documentCode==e)
+    },
+    selectEnumByCategory() {
+      this.$axios.post(this.$api.enums.selectEnumByCategory, {
+        category: "鏂囦欢鐘舵��"
+      }).then(res => {
+        this.fileState = res.data
+      })
+    },
+    handleChangeUpload(file, fileLists){
+      this.file = file
+      this.$set(this.addInfo,'alterAfterName',file.name)
+    },
+    handleAdd(){
+      if(!this.addInfo.code) return this.$message({type:'error',message:"璇疯緭鍏ョ敵璇风紪鍙�"})
+      if(!this.addInfo.id){
+        // 鏂板
+        let fd = new FormData();
+        //鏂囦欢淇℃伅涓璻aw鎵嶆槸鐪熺殑鏂囦欢
+        if(this.file){
+          fd.append("file",this.file.raw);
+        }
+        for (let m in this.addInfo){
+          fd.append(m,this.addInfo[m])
+        }
+        let {name,version,documentCode} = this.currentFile;
+        fd.append("alterBeforeName",name);
+        fd.append("alterBeforeVersion",version);
+        // fd.append("alterBeforeCode",documentCode);
+        this.addLoading = true
+        this.$axios.post(this.$api.manageDocumentList.addManageDocumentAlter, fd,{
+            headers: {
+              'Content-Type': 'multipart/form-data'
+            },
+            noQs:true
+          }).then(res => {
+            this.addLoading = false
+          if (res.code == 200) {
+            this.$message({
+              type: 'success',
+              message: '娣诲姞鎴愬姛'
+            })
+            this.refreshTable()
+            this.addDialogVisible = false
+          } else {
+            this.$message({
+              type: 'error',
+              message: '娣诲姞澶辫触'
+            })
+          }
+        })
+      }else{
+        // 淇敼
+        let fd = new FormData();
+        //鏂囦欢淇℃伅涓璻aw鎵嶆槸鐪熺殑鏂囦欢
+        if(this.file){
+          fd.append("file",this.file.raw);
+        }
+        let {name,version} = this.currentFile;
+        fd.append("alterBeforeName",name);
+        fd.append("alterBeforeVersion",version);
+        let {code,checkUser,expectAlterDate,actuallyAlterDate,alterAfterCode,method,alterAfterVersion,alterNote,alterAfterName,id} = this.addInfo
+        fd.append("code",code);
+        fd.append("checkUser",checkUser);
+        fd.append("expectAlterDate",expectAlterDate);
+        fd.append("actuallyAlterDate",actuallyAlterDate);
+        fd.append("alterAfterCode",alterAfterCode);
+        fd.append("method",method);
+        fd.append("alterAfterVersion",alterAfterVersion);
+        fd.append("alterNote",alterNote);
+        fd.append("alterAfterName",alterAfterName);
+        fd.append("id",id);
+        this.addLoading = true
+        this.$axios.post(this.$api.manageDocumentList.doManageDocumentAlter, fd,{
+            headers: {
+              'Content-Type': 'multipart/form-data'
+            },
+            noQs:true
+          }).then(res => {
+            this.addLoading = false
+          if (res.code == 200) {
+            this.$message({
+              type: 'success',
+              message: '淇敼鎴愬姛'
+            })
+            this.refreshTable()
+            this.addDialogVisible = false
+          } else {
+            this.$message({
+              type: 'error',
+              message: '淇敼澶辫触'
+            })
+          }
+        })
+      }
+    },
+    // 缂栬緫
+    handleUpdate(row){
+      this.title = '鏂囦欢鍙樻洿鐢宠'
+      this.addInfo = this.HaveJson(row)
+      let alterBeforeCode = this.addInfo.alterBeforeCode
+      this.getCurrentFile(alterBeforeCode)
+      this.addDialogVisible = true
+    },
+    // 棰勮
+    handleLook(row){
+      this.currentInfo = this.HaveJson(row)
+      this.lookDialogVisible = true
+    },
+    // 涓嬭浇闄勪欢
+    handleDown(row){
+      if(!row.alterAfterUrl) return this.$message.warning('鏂囦欢鏈笂浼�')
+      let url = this.javaApi+'/word/'+row.alterAfterUrl
+      const link = document.createElement('a');
+      link.href = url;
+      link.click();
+    },
+    // 鎵撳紑瀹℃牳寮规
+    handleCheck(row){
+      this.title = '瀹℃牳'
+      this.fileName = row.alterAfterName
+      if(!row.alterAfterUrl) return this.$message.warning('鏂囦欢鏈笂浼�')
+      this.addInfo = this.HaveJson(row)
+      let alterBeforeCode = this.addInfo.alterBeforeCode
+      this.getCurrentFile(alterBeforeCode)
+      this.addDialogVisible = true
+      this.$axios.post(this.$api.manageDocumentList.checkManageDocumentAlterPdf,{id:row.id},{responseType: "blob"}).then(res=>{
+        //
+        const blob = new Blob([res]);
+        const file = new File([blob], row.name, { type: 'application/pdf' })
+        this.$refs.UpPdfStamp.lookFile(file)
+        this.currentInfo = row
+      }).catch(err=>{
+        console.log(err)
+      })
+    },
+    // 瀹℃牳淇濆瓨
+    async uploadPDF(pdfBlob){
+      const formData = new FormData();
+      formData.append('file', pdfBlob, this.fileName+'.pdf'); // 鏂囦欢瀛楁
+      formData.append('id', this.currentInfo.id); // 鏂囦欢鍚嶅瓧娈�
+      formData.append('state', this.type); // 鏂囦欢鍚嶅瓧娈�
+
+      let res = await this.$axios.post(this.$api.manageDocumentList.checkManageDocumentAlter, formData,{
+        headers: {
+            'Content-Type': 'multipart/form-data;'
+        },
+        noQs: true
+      })
+      this.checkLoading = false
+      this.noCheckLoading = false
+      if(res.code==200){
+        this.$message({ message: '鎿嶄綔鎴愬姛', type: 'success' });
+        this.addDialogVisible = false;
+        this.refreshTable()
+        return true
+      }else{
+        this.$message({ message: '鎿嶄綔澶辫触', type: 'error' });
+        return false
+      }
+    },
+    // 鎻愪氦瀹℃牳
+    handleCheckSub(type){
+      this.type = type
+      if(type == '閫氳繃') {
+        this.checkLoading = true
+      }else{
+        this.noCheckLoading = true
+      }
+      this.addLoading = true
+      this.$refs['UpPdfStamp'].generatePDF()
+    }
+  }
+}
+</script>
+
+<style scoped>
+.title {
+    height: 60px;
+    line-height: 60px;
+  }
+  .search {
+    background-color: #fff;
+    height: 40px;
+    display: flex;
+    align-items: center;
+    position: relative;
+  }
+
+  .search_thing {
+    width: 350px;
+    display: flex;
+    align-items: center;
+  }
+
+  .search_label {
+    width: 110px;
+    font-size: 14px;
+    text-align: right;
+  }
+
+  .search_input {
+    width: calc(100% - 110px);
+  }
+
+  .table {
+    background-color: #fff;
+    width: calc(100% - 40px);
+    height: calc(100% - 60px - 80px);
+    padding: 20px;
+  }
+  .btns{
+    position: absolute;
+    right: 20px;
+    top: 5px;
+  }
+  h4.title{
+    position: relative;
+    height: 30px;
+    line-height: 30px;
+    box-sizing: border-box;
+    padding-left: 16px;
+    margin-left: 10px;
+    margin-bottom: 10px;
+  }
+  h4.title::after{
+    content: '';
+    width: 4px;
+    height: 20px;
+    background: #3A7BFA;
+    position: absolute;
+    top: 5px;
+    left: 0;
+  }
+</style>
diff --git a/src/components/do/a8-file-handling/FileList.vue b/src/components/do/a8-file-handling/FileList.vue
new file mode 100644
index 0000000..36bd484
--- /dev/null
+++ b/src/components/do/a8-file-handling/FileList.vue
@@ -0,0 +1,321 @@
+<template>
+  <!-- 鏂囦欢娓呭崟 -->
+  <div class="file-list" style="height: 100%;">
+    <div class="search">
+      <div class="search_thing">
+        <div class="search_label">鏂囦欢鍚嶇О锛�</div>
+        <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.name"
+            @keyup.enter.native="refreshTable()"></el-input></div>
+      </div>
+      <div class="search_thing">
+        <div class="search_label">鏂囦欢鐘舵�侊細</div>
+        <div class="search_input">
+          <el-select v-model="componentData.entity.state" size="small" @change="refreshTable()">
+            <el-option :label="item.label" :value="item.value" v-for="(item,index) in fileState" :key="index"></el-option>
+          </el-select>
+        </div>
+      </div>
+      <div class="search_thing" style="padding-left: 30px;">
+        <el-button size="small" @click="refresh()">閲� 缃�</el-button>
+        <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button>
+      </div>
+      <div class="btns" style="padding-left: 30px;">
+        <el-upload :action="action" :multiple="false"
+        accept='.xls,.xlsx' :headers="headers" :on-change="beforeUpload"
+        :on-error="onError" ref='upload' v-if="addPower" :on-success="handleSuccessUp" :show-file-list="false">
+        <el-button size="small" type="primary" :loading="upLoading">瀵煎叆</el-button></el-upload>
+      </div>
+    </div>
+    <div class="table">
+      <ValueTable ref="ValueTable" :url="$api.manageDocumentList.pageManageDocumentList"
+        :componentData="componentData" :upUrl="$api.manageDocumentList.doManageDocumentList" :delUrl="$api.manageDocumentList.delManageDocumentList" :key="upIndex"/>
+    </div>
+    <el-dialog
+      title="涓婁紶"
+      :visible.sync="addDialogVisible"
+      width="1000px" top="3vh">
+      <UpPdfStamp ref="UpPdfStamp" v-if="addDialogVisible" @uploadPDF="uploadPDF" :isUpFile="true" @uploadPDFErr="uploadPDFErr" style="max-height: 85vh;overflow-y: auto;"></UpPdfStamp>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="addDialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="handleAdd" v-loading="addLoading">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      title="鏌ョ湅闄勪欢"
+      :visible.sync="lookDialogVisible"
+      width="800px" top="5vh" fullscreen>
+      <filePreview v-if="lookDialogVisible" :fileUrl="javaApi+'/word/'+currentInfo.url"
+      :currentFile="{}" style="height: 90vh;overflow-y: auto;"/>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import ValueTable from '../../tool/value-table.vue'
+import UpPdfStamp from '../../tool/upPdfStamp.vue'
+import filePreview from '../../tool/file-preview.vue'
+export default {
+  components: {
+    ValueTable,
+    UpPdfStamp,
+    filePreview,
+  },
+  data() {
+    return {
+      addDialogVisible:false,
+      lookDialogVisible:false,
+      addPower:false,
+      upLoading:false,
+      addLoading:false,
+      componentData: {
+        entity: {
+          name: null,
+          state: null,
+          orderBy: {
+            field: 'createTime',
+            order: 'desc'
+          }
+        },
+        isIndex: true,
+        showSelect: false,
+        select: false,
+        do: [{
+          id: 'update',
+          font: '缂栬緫',
+          type: 'text',
+          method: 'doDiy',
+          field:[]
+        },
+        {
+          id: 'handleUp',
+          font: '涓婁紶',
+          type: 'text',
+          method: 'handleUp'
+        },
+        {
+          id: 'handleDown',
+          font: '涓嬭浇',
+          type: 'text',
+          method: 'handleDown'
+        },
+        {
+          id: 'handleLook',
+          font: '鏌ョ湅闄勪欢',
+          type: 'text',
+          method: 'handleLook'
+        }, {
+          id: 'delete',
+          font: '鍒犻櫎',
+          type: 'text',
+          method: 'doDiy'
+        },],
+        tagField: {
+          state:{
+            select: []
+          },
+          type:{
+            select: []
+          },
+        },
+        selectField: {
+          state:{
+            select: []
+          },
+          type:{
+            select: []
+          },
+        },
+        datePicker:['effectiveDate'],
+        addUpload:['signatoryUrl'],
+        requiredAdd: ['documentCode'],
+        requiredUp: ['documentCode'],
+        needSort: [],
+        inputType:聽''
+      },
+      entityCopy: {},
+      upIndex: 0,
+      currentInfo:{},
+      fileType:[],
+      fileState:[],
+    }
+  },
+  // 鐢ㄤ簬涓婁紶鏂囦欢鐨勪俊鎭�
+  computed: {
+    headers() {
+      return {
+        'token': sessionStorage.getItem('token')
+      }
+    },
+    action() {
+      return this.javaApi +this.$api.manageDocumentList.exportManageDocumentList
+    }
+  },
+  mounted() {
+    this.entityCopy = this.HaveJson(this.componentData.entity);
+    this.getPower()
+    this.selectEnumByCategory()
+  },
+  methods: {
+    // 涓嬭浇鏂囦欢
+    handleDown(row) {
+      if(!row.url) return this.$message.warning('鏂囦欢鏈笂浼�')
+      let url = this.javaApi+'/word/'+row.url
+      const link = document.createElement('a');
+      link.href = url;
+      link.click();
+    },
+    // 鏌ョ湅鏂囦欢
+    handleLook(row){
+      if(!row.url) return this.$message.warning('鏂囦欢鏈笂浼�')
+      this.currentInfo = row
+      this.lookDialogVisible = true
+    },
+    getPower(){
+      let power = JSON.parse(sessionStorage.getItem('power'))
+      let up = false
+      let upFile = false
+      let add = false
+      for (var i = 0; i < power.length; i++) {
+        if (power[i].menuMethod == 'doManageDocumentList') {
+          up = true
+        }
+        if (power[i].menuMethod == 'exportManageDocumentList') {
+          add = true
+        }
+        if (power[i].menuMethod == 'uploadFileManageDocumentList') {
+          upFile = true
+        }
+      }
+      if (!upFile) {
+        this.componentData.do.splice(1, 1)
+      }
+      if (!up) {
+        this.componentData.do.splice(0, 1)
+      }
+      this.addPower = add
+    },
+    refreshTable() {
+      this.$refs['ValueTable'].selectList()
+    },
+    refresh() {
+      this.componentData.entity = this.HaveJson(this.entityCopy)
+      this.upIndex++
+      this.refreshTable()
+    },
+    // 涓婁紶鏂囦欢
+    handleUp(row) {
+      this.currentInfo = row
+      this.addDialogVisible = true;
+    },
+    // 鎻愪氦涓婁紶
+    handleAdd(){
+      this.addLoading = true
+      this.$refs['UpPdfStamp'].generatePDF()
+    },
+    uploadPDFErr(){
+      this.addLoading = false
+    },
+    beforeUpload(file) {
+      if (file.size > 1024 * 1024 * 10) {
+        this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M');
+        this.$refs.upload.clearFiles()
+        return false;
+      } else {
+        // this.upLoading = true;
+        return true;
+      }
+    },
+    onError(err, file, fileList) {
+      this.$message.error('涓婁紶澶辫触')
+      this.$refs.upload.clearFiles()
+    },
+    handleSuccessUp(response) {
+      this.upLoading = false;
+      if (response.code == 200) {
+        this.$message.success('涓婁紶鎴愬姛');
+        this.refreshTable()
+      }
+    },
+    selectEnumByCategory() {
+      this.$axios.post(this.$api.enums.selectEnumByCategory, {
+        category: "鏂囦欢绫诲埆"
+      }).then(res => {
+        this.fileType = res.data
+        this.componentData.tagField.type.select = this.fileType
+        this.componentData.selectField.type.select = this.fileType
+      })
+      this.$axios.post(this.$api.enums.selectEnumByCategory, {
+        category: "鏂囦欢鐘舵��"
+      }).then(res => {
+        this.fileState = res.data
+        this.componentData.tagField.state.select = res.data
+        this.componentData.selectField.state.select = res.data
+      })
+    },
+    async uploadPDF(pdfBlob) {
+      const formData = new FormData();
+      formData.append('file', pdfBlob, this.fileName+'.pdf'); // 鏂囦欢瀛楁
+      formData.append('id', this.currentInfo.id); // 鏂囦欢鍚嶅瓧娈�
+
+      let res = await this.$axios.post(this.$api.manageDocumentList.uploadFileManageDocumentList, formData,{
+        headers: {
+            'Content-Type': 'multipart/form-data;'
+        },
+        noQs: true
+      })
+      this.addLoading = false
+      if(res.code==200){
+        this.$message({ message: '涓婁紶鎴愬姛', type: 'success' });
+        this.addDialogVisible = false;
+        this.refreshTable()
+        return true
+      }else{
+        this.$message({ message: '涓婁紶澶辫触', type: 'error' });
+        return false
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.title {
+    height: 60px;
+    line-height: 60px;
+  }
+  .search {
+    background-color: #fff;
+    height: 40px;
+    display: flex;
+    align-items: center;
+    position: relative;
+  }
+
+  .search_thing {
+    width: 350px;
+    display: flex;
+    align-items: center;
+  }
+
+  .search_label {
+    width: 110px;
+    font-size: 14px;
+    text-align: right;
+  }
+
+  .search_input {
+    width: calc(100% - 110px);
+  }
+
+  .table {
+    background-color: #fff;
+    width: calc(100% - 40px);
+    height: calc(100% - 60px - 80px);
+    padding: 20px;
+  }
+  .btns{
+    position: absolute;
+    right: 20px;
+    top: 5px;
+  }
+</style>
diff --git a/src/components/do/a8-file-handling/FileObsoletionRequest.vue b/src/components/do/a8-file-handling/FileObsoletionRequest.vue
new file mode 100644
index 0000000..0af73dc
--- /dev/null
+++ b/src/components/do/a8-file-handling/FileObsoletionRequest.vue
@@ -0,0 +1,490 @@
+<template>
+  <!-- 鏂囦欢浣滃簾鐢宠 -->
+  <div class="file-obsoletion-request" style="height: 100%;">
+    <div class="search">
+      <div class="search_thing">
+        <div class="search_label">鏂囦欢缂栧彿锛�</div>
+        <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="componentData.entity.documentCode"
+            @keyup.enter.native="refreshTable()"></el-input></div>
+      </div>
+      <div class="search_thing" style="padding-left: 30px;">
+        <el-button size="small" @click="refresh()">閲� 缃�</el-button>
+        <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button>
+      </div>
+      <div class="btns" style="padding-left: 30px;">
+        <el-button size="small" type="primary" @click="addDialogVisible=true,addInfo={}" v-if="addPower">鏂囦欢浣滃簾鐢宠</el-button>
+        <el-button size="small" type="primary" v-if="outPower" @click="handleOut" :loading="outLoading">瀵煎嚭</el-button>
+      </div>
+    </div>
+    <div class="table">
+      <ValueTable ref="ValueTable" :url="$api.manageDocumentList.pageManageDocumentCancel"
+        :componentData="componentData" :delUrl="$api.manageDocumentList.delManageDocumentCancel" :key="upIndex"/>
+    </div>
+    <el-dialog
+      title="鏂囦欢浣滃簾鐢宠"
+      :visible.sync="addDialogVisible"
+      width="800px" top="10vh">
+      <el-row>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label"><span style="color:red;margin-right: 4px;">*</span>鐢宠缂栧彿锛�</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.documentCode" size="small" style="width: 100%;" @change="changeFileList" filterable allow-create clearable>
+                <el-option
+                  v-for="item in fileList"
+                  :key="item.documentCode"
+                  :label="item.documentCode"
+                  :value="item.documentCode">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">瀹℃壒浜猴細</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.checkUser" size="small" style="width: 100%;" filterable>
+                <el-option
+                  v-for="item in personList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏂囦欢鍚嶇О锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.name"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏂囦欢鐗堟湰锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.version"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏂囦欢鐘舵�侊細</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.state" size="small" style="width: 100%;" >
+                <el-option :label="item.label" :value="item.value" v-for="(item,index) in fileState" :key="index"></el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <!-- <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">浣滃簾鏂瑰紡锛�</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.method" size="small" style="width: 100%;">
+                <el-option label="浣滃簾" value="浣滃簾"></el-option>
+                <el-option label="鏃犳晥" value="鏃犳晥"></el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col> -->
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏈熸湜浣滃簾鏃堕棿锛�</div>
+            <div class="search_input">
+              <el-date-picker
+                v-model="addInfo.expectCancelDate"
+                type="date"
+                size="small"
+                placeholder="閫夋嫨鏃ユ湡"
+                format="yyyy-MM-dd"
+                value-format="yyyy-MM-dd" style="width: 100%;">
+              </el-date-picker>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">瀹為檯浣滃簾鏃堕棿锛�</div>
+            <div class="search_input">
+              <el-date-picker
+                v-model="addInfo.actuallyCancelDate"
+                type="date"
+                size="small"
+                placeholder="閫夋嫨鏃ユ湡"
+                format="yyyy-MM-dd"
+                value-format="yyyy-MM-dd" style="width: 100%;">
+              </el-date-picker>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="12" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">浣滃簾璇存槑锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.cancelNote" type="textarea"
+              :rows="2"></el-input></div>
+          </div>
+        </el-col>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="addDialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="handleAdd" :loading="addLoading">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import ValueTable from '../../tool/value-table.vue'
+export default {
+  components: {
+    ValueTable
+  },
+  data() {
+    return {
+      addPower: false,
+      outPower:false,
+      addInfo: {},
+      addLoading:false,
+      addDialogVisible: false,
+      componentData: {
+        entity: {
+          documentCode: null,
+          state: null,
+          orderBy: {
+            field: 'createTime',
+            order: 'desc'
+          }
+        },
+        isIndex: true,
+        showSelect: false,
+        select: false,
+        do: [{
+          id: 'handleUpdate',
+          font: '缂栬緫',
+          type: 'text',
+          method: 'handleUpdate',
+          field:[],
+          disabFun: (row, index) => {
+            return row.state=='閫氳繃'
+          }
+        },
+        {
+          id: 'delete',
+          font: '鍒犻櫎',
+          type: 'text',
+          method: 'doDiy',
+          disabFun: (row, index) => {
+            return row.state=='閫氳繃'
+          }
+        },
+        {
+          id: 'handleCheck',
+          font: '瀹℃牳',
+          type: 'text',
+          method: 'handleCheck',
+          disabFun: (row, index) => {
+            return row.checkUser!=JSON.parse(localStorage.getItem("user")).userId||row.state=='閫氳繃'
+          }
+        },],
+        tagField: {
+          state:{
+            select: [
+            {
+                value: '閫氳繃',
+                label: '閫氳繃'
+              },
+              {
+                value: '涓嶉�氳繃',
+                label: '涓嶉�氳繃'
+              },
+            ]
+          },
+        },
+        selectField: {
+          state:{
+            select: [
+              {
+                value: '閫氳繃',
+                label: '閫氳繃'
+              },
+              {
+                value: '涓嶉�氳繃',
+                label: '涓嶉�氳繃'
+              },
+            ]
+          },
+          signatory:{
+            select: []
+          },
+        },
+        datePicker:['effectiveDate'],
+        addUpload:['signatoryUrl'],
+        requiredAdd: [],
+        requiredUp: [],
+        needSort: [],
+        inputType:聽''
+      },
+      entityCopy: {},
+      upIndex: 0,
+      personList:[],
+      fileList:[],
+      outLoading:false,
+      fileState:[]
+    }
+  },
+  mounted() {
+    this.entityCopy = this.HaveJson(this.componentData.entity);
+    this.getPower()
+    this.getAuthorizedPerson()
+    this.getFileList()
+    this.selectEnumByCategory()
+  },
+  methods: {
+    getPower(){
+      let power = JSON.parse(sessionStorage.getItem('power'))
+      let out = false
+      let del = false
+      let add = false
+      // let check = false
+      for (var i = 0; i < power.length; i++) {
+        if (power[i].menuMethod == 'exportManageDocumentCancel') {
+          out = true
+        }
+        if (power[i].menuMethod == 'addManageDocumentCancel') {
+          add = true
+        }
+        if (power[i].menuMethod == 'delManageDocumentCancel') {
+          del = true
+        }
+        // if (power[i].menuMethod == 'checkManageDocumentControlled') {
+        //   check = true
+        // }
+      }
+      // if (!check) {
+      //   this.componentData.do.splice(2, 1)
+      // }
+      if (!del) {
+        this.componentData.do.splice(1, 1)
+      }
+      if (!add) {
+        this.componentData.do.splice(0, 1)
+      }
+      this.addPower = add
+      this.outPower = out
+    },
+    refreshTable() {
+      this.$refs['ValueTable'].selectList()
+    },
+    refresh() {
+      this.componentData.entity = this.HaveJson(this.entityCopy)
+      this.upIndex++
+      this.refreshTable()
+    },
+    selectEnumByCategory() {
+      this.$axios.post(this.$api.enums.selectEnumByCategory, {
+        category: "鏂囦欢鐘舵��"
+      }).then(res => {
+        this.fileState = res.data
+        // this.componentData.tagField.state.select = res.data
+        // this.componentData.selectField.state.select = res.data
+      })
+    },
+    // 鑾峰彇浜哄憳鍒楄〃
+    getAuthorizedPerson() {
+      this.$axios.get(this.$api.user.getUserMenu).then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.personList = data
+      })
+    },
+    // 鑾峰彇鏂囦欢鍒楄〃
+    getFileList(){
+      this.$axios.post(this.$api.manageDocumentList.pageManageDocumentList,{
+        entity: {
+          orderBy: {
+            field: 'createTime',
+            order: 'desc'
+          }
+        },
+        page:{
+          current:-1,
+          size:-1
+        }
+      },{headers: {
+            'Content-Type': 'application/json'
+          }}).then(res=>{
+        this.fileList = res.data.body.records
+      }).catch(err=>{})
+    },
+    // 鎻愪氦
+    handleAdd(){
+      if(!this.addInfo.documentCode){
+        this.$message.error('璇疯緭鍏ョ敵璇风紪鍙�')
+        return false
+      }
+      this.addInfo.method = '浣滃簾'
+      this.addLoading = true
+      if(!this.addInfo.id){
+        // 鏂板
+        this.axios.post(this.$api.manageDocumentList.addManageDocumentCancel, this.addInfo,{headers: {
+            'Content-Type': 'application/json'
+          }}).then(res => {
+          this.addLoading = false
+          this.refreshTable()
+          this.$message({
+            type: 'success',
+            message: '鎻愪氦鎴愬姛'
+          })
+          this.addDialogVisible = false
+        }).catch(err => {})
+      }else{
+        // 缂栬緫
+        this.axios.post(this.$api.manageDocumentList.doManageDocumentCancel, {
+          id: this.addInfo.id,
+          method: '浣滃簾',
+          documentCode: this.addInfo.documentCode,
+          checkUser: this.addInfo.checkUser,
+          name: this.addInfo.name,
+          version: this.addInfo.version,
+          documentState: this.addInfo.documentState,
+          expectCancelDate: this.addInfo.expectCancelDate,
+          actuallyCancelDate: this.addInfo.actuallyCancelDate,
+          cancelNote: this.addInfo.cancelNote,
+        },{headers: {
+            'Content-Type': 'application/json'
+          }}).then(res => {
+          this.addLoading = false
+          this.refreshTable()
+          this.$message({
+            type: 'success',
+            message: '鎻愪氦鎴愬姛'
+          })
+          this.addDialogVisible = false
+        }).catch(err => {})
+      }
+
+    },
+    // 閫変腑鏂囦欢
+    changeFileList(e){
+      if(e){
+        let obj = this.fileList.find(a=>a.documentCode == e)
+        this.addInfo.name = obj.name
+        this.addInfo.version = obj.version
+        this.addInfo.documentState = obj.state
+      }
+    },
+    handleUpdate(row){
+      this.addInfo = this.HaveJson(row)
+      this.addDialogVisible = true
+    },
+    // 瀹℃牳
+    handleCheck(row){
+      this.$confirm('鏄惁瀹℃牳閫氳繃?', '鎻愮ず', {
+        confirmButtonText: '閫氳繃',
+        cancelButtonText: '涓嶉�氳繃',
+        type: 'warning',
+        closeOnClickModal: false, // 绂佹鐐瑰嚮閬僵灞傚叧闂�
+        distinguishCancelAndClose: true,
+        beforeClose: (action, instance, done) => {
+          if (action === 'confirm') {
+            // 鐐瑰嚮鈥滅‘瀹氣�濇寜閽紝鍏佽鍏抽棴
+            this.$axios.post(this.$api.manageDocumentList.checkManageDocumentCancel, {id:row.id,state:'閫氳繃'}).then(res => {
+              this.refreshTable()
+              done();
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              })
+            })
+            .catch(err => {
+
+            })
+          } else if (action === 'cancel') {
+            // 鐐瑰嚮鈥滃彇娑堚�濇寜閽紝涓嶅厑璁稿叧闂�
+            this.$axios.post(this.$api.manageDocumentList.checkManageDocumentCancel, {id:row.id,state:'涓嶉�氳繃'}).then(res => {
+              this.refreshTable()
+              done();
+              this.$message({
+                type: 'success',
+                message: '鎻愪氦鎴愬姛'
+              })
+            })
+            .catch(err => {
+
+            })
+            console.log("鍙栨秷鎸夐挳鐐瑰嚮浜嬩欢锛屼笉鍏抽棴寮规");
+          } else if (action === 'close') {
+            // 鐐瑰嚮鈥溍椻�濇寜閽紝涓嶅厑璁稿叧闂�
+            done();
+            console.log("脳鎸夐挳鐐瑰嚮浜嬩欢锛屼笉鍏抽棴寮规");
+          }
+          }
+      })
+    },
+    // 瀵煎嚭
+    handleOut(){
+      this.outLoading = true
+      this.$axios.post(this.$api.manageDocumentList.exportManageDocumentCancel, {entity:this.componentData.entity},{headers: {
+          'Content-Type': 'application/json'
+        },responseType: "blob"},).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res],{ type: 'application/octet-stream' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = '鏂囦欢浣滃簾琛�.xlsx';
+        link.click();
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.title {
+    height: 60px;
+    line-height: 60px;
+  }
+  .search {
+    background-color: #fff;
+    height: 40px;
+    display: flex;
+    align-items: center;
+    position: relative;
+  }
+
+  .search_thing {
+    width: 350px;
+    display: flex;
+    align-items: center;
+  }
+
+  .search_label {
+    width: 110px;
+    font-size: 14px;
+    text-align: right;
+  }
+
+  .search_input {
+    width: calc(100% - 110px);
+  }
+
+  .table {
+    background-color: #fff;
+    width: calc(100% - 40px);
+    height: calc(100% - 60px - 80px);
+    padding: 20px;
+  }
+  .btns{
+    position: absolute;
+    right: 20px;
+    top: 5px;
+  }
+</style>
diff --git a/src/components/tool/file-preview.vue b/src/components/tool/file-preview.vue
index 84c00c0..a0123c0 100644
--- a/src/components/tool/file-preview.vue
+++ b/src/components/tool/file-preview.vue
@@ -4,7 +4,7 @@
       <img :src="fileUrl" alt="Image Preview" />
     </div>
     <div v-if="isPdf">
-      <object :data="fileUrl" type="application/pdf" width="100%" height="600px">
+      <object :data="fileUrl" type="application/pdf" width="100%" height="750px">
         <p>鎮ㄧ殑娴忚鍣ㄤ笉鏀寔 PDF 棰勮銆�<a :href="fileUrl">涓嬭浇 PDF 鏂囦欢</a></p>
       </object>
     </div>
diff --git a/src/components/tool/upPdfStamp.vue b/src/components/tool/upPdfStamp.vue
new file mode 100644
index 0000000..2982ede
--- /dev/null
+++ b/src/components/tool/upPdfStamp.vue
@@ -0,0 +1,164 @@
+<template>
+  <div class="up-pdf-stamp">
+    <div class="work" style="display: flex;justify-content: space-between;align-items: center;margin-bottom: 10px;" v-if="isUpFile">
+      <input type="file" @change="handleFileUpload" accept="application/pdf" ref="fileInput" />
+    </div>
+    <p style="color: red;font-size: 12px;margin: 16px 0;" v-if="canvasNumPages>0">鎻愮ず锛氬湪鏂囦欢鑼冨洿鍐咃紝鍗曞嚮榧犳爣鐩栫珷锛屽弻鍑婚紶鏍囧凡鐩栧ソ绔犲鍙垹闄ゅ綋鍓嶇珷</p>
+    <canvas ref="pdfCanvas" @click="e=>handleCanvasClick(e,index)" style="border: 1px solid #000;" @dblclick="e=>removeStamp(e,index)" v-for="(item,index) in canvasNumPages" :key="index"></canvas>
+  </div>
+</template>
+
+<script>
+import jsPDF from "jspdf";
+export default {
+  props:['isUpFile'],
+  data() {
+    return {
+      pdfDoc: null, // 瀛樺偍涓婁紶鐨� PDF 鏁版嵁
+      stamps: [], // 璁板綍鐩栫珷鐨勪綅缃�
+      contextList:[],//canvas鍒楄〃
+      canvasNumPages:0,// 瀛樺偍 PDF 鎬婚〉鏁�
+      stampWidth: 120, // 鐩栫珷瀹藉害
+      stampHeight: 80, // 鐩栫珷楂樺害
+      stampsName:'',
+      stampsList:['涓讳换','璐ㄩ噺璐熻矗浜�','鎶�鏈礋璐d汉','缁煎悎瀹�','閫氫俊','鐢靛姏','瑁呭','鍌ㄨ兘','灏勯'],
+      fileName:'鏂囦欢鍚�'
+    };
+  },
+  methods:{
+    handleFileUpload(event){
+      const file = event.target.files[0];
+      if(file.size>20*1024*1024){
+        this.$refs.fileInput.value = ""; // 娓呯┖鏂囦欢杈撳叆妗嗗唴瀹�
+        return this.$message.error('鏂囦欢澶у皬涓嶈兘瓒呰繃20M')
+      }
+      this.lookFile(file)
+    },
+    lookFile(file,currentStamp){
+      this.fileName = file.name
+      if(currentStamp){
+        this.stampsName = currentStamp
+      }else{
+        const index = this.stampsList.indexOf(m=>file.name.includes(m))
+        if(index>-1){
+          this.stampsName = this.stampsList[index]
+        }else{
+          this.stampsName = '缁煎悎瀹�'
+        }
+      }
+      if (file && file.type === 'application/pdf') {
+        const reader = new FileReader();
+        reader.onload = (e) => {
+          const typedArray = new Uint8Array(e.target.result);
+          this.loadPDF(typedArray);
+        };
+        reader.readAsArrayBuffer(file);
+      } else {
+        this.$message.error('璇烽�夋嫨 PDF 鏂囦欢');
+      }
+    },
+    loadPDF(typedArray) {
+      pdfjsLib.getDocument(typedArray).promise.then(pdfDoc_ => {
+        this.pdfDoc = pdfDoc_;
+        this.canvasNumPages = this.pdfDoc._pdfInfo.numPages
+        this.stamps = []
+        this.contextList = []
+        for (let i = 1; i <= this.canvasNumPages; i++) {
+          this.$nextTick(() => {
+            this.renderPage(i); // 娓叉煋椤甸潰
+          });
+          this.stamps.push([])
+        }
+      });
+    },
+    // 娓叉煋鎸囧畾椤甸潰
+    renderPage(pageNum) {
+      this.pdfDoc.getPage(pageNum).then(page => {
+        const canvas = this.$refs.pdfCanvas[pageNum-1];
+        this.contextList.push(canvas.getContext("2d"))
+        const viewport = page.getViewport({ scale: 1.5 });
+
+        canvas.width = viewport.width;
+        canvas.height = viewport.height;
+
+        page.render({
+          canvasContext: this.contextList[pageNum-1],
+          viewport: viewport
+        }).promise.then(() => {
+          this.stamps[pageNum-1].forEach(m=>{
+            this.drawStamps( m.x, m.y,pageNum-1)
+          })
+        });
+      });
+    },
+    // 鍗曞嚮--娣诲姞绔�
+    handleCanvasClick(event,i) {
+      const x = event.offsetX;
+      const y = event.offsetY;
+      const index = this.stamps[i].findIndex(stamp => {
+        let x0 = x - stamp.x;
+        let y0 =  y - stamp.y;
+        return x0>0 && x0 < this.stampWidth && y0>0&& y0 < this.stampHeight;
+      });
+      if (index > -1) return;
+      this.drawStamps( x, y,i)
+      this.stamps[i].push({ x, y});
+    },
+    // 鍙屽嚮--鍒犻櫎鐩栫珷
+    removeStamp(event,i) {
+      const x = event.offsetX;
+      const y = event.offsetY;
+      // 鏌ユ壘琚弻鍑荤殑鐩栫珷
+      const index = this.stamps[i].findIndex(stamp => {
+        let x0 = x - stamp.x;
+        let y0 =  y - stamp.y;
+        return x0>0 && x0 < this.stampWidth  && y0>0&& y0 < this.stampHeight;
+      });
+      if (index === -1) return;
+      this.stamps[i].splice(index, 1); // 鍒犻櫎鎸囧畾鐨勭洊绔�
+      this.contextList[i].clearRect(0, 0, this.contextList[i].width, this.contextList[i].height);
+      this.renderPage(i+1)
+    },
+    // 娓叉煋绔�
+    drawStamps(x,y,index){
+      var img = new Image();
+      console.log(this.stampsName)
+      // 璁剧疆鍥剧墖婧�
+      img.src = "/static/img/stamps/"+this.stampsName+".png"; // 鏇挎崲涓轰綘鐨勫浘鐗囬摼鎺�
+      let that = this
+      img.onload = function() {
+        // 鍥剧墖鍔犺浇瀹屾垚鍚庯紝灏嗗浘鐗囩粯鍒跺埌canvas涓�
+        that.contextList[index].drawImage(img, x, y, that.stampWidth , that.stampHeight);
+      };
+    },
+    // 鐢熸垚 PDF 鐨勫嚱鏁�
+    async generatePDF() {
+      if(this.contextList.length===0){
+        this.$message({ message: '璇峰厛涓婁紶PDF鏂囦欢', type: 'error' });
+        this.$emit('uploadPDFErr')
+        return false
+      }
+      const pdf = new jsPDF("p", "mm", "a4");
+      for (let i = 0; i < this.contextList.length; i++) {
+        const imgData = this.$refs.pdfCanvas[i].toDataURL('image/jpeg', 1.0);
+        const pdfWidth = pdf.internal.pageSize.getWidth();
+        const pdfHeight = (this.$refs.pdfCanvas[i].height * pdfWidth) / this.$refs.pdfCanvas[i].width;
+        pdf.addImage(imgData, "JPEG", 0, 0, pdfWidth, pdfHeight); // 灏嗗浘鐗囨坊鍔犲埌 PDF
+        if(i!==this.contextList.length-1){
+          pdf.addPage(); // 娣诲姞鏂扮殑涓�椤�
+        }
+      }
+
+      // 灏� PDF 鏂囦欢淇濆瓨鎴栦笂浼�
+      const pdfOutput = pdf.output('blob'); // 鑾峰彇 PDF 鏂囦欢鐨� Blob 瀵硅薄
+
+      // 涓婁紶鍒板悗绔�
+      return this.$emit('uploadPDF',pdfOutput)
+    },
+  }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/src/components/view/a8-file-handling.vue b/src/components/view/a8-file-handling.vue
new file mode 100644
index 0000000..e1e85ec
--- /dev/null
+++ b/src/components/view/a8-file-handling.vue
@@ -0,0 +1,63 @@
+<template>
+  <div class="file-handling">
+    <el-tabs type="border-card" v-model="activeName" style="height: 100%;">
+      <el-tab-pane :label="item.name" :name="item.component" v-for="(item,index) in tabList" :key="index" style="height: 100%;">
+        <component :is="item.component" :key="item.component"></component>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+import FileList from '../do/a8-file-handling/FileList.vue'
+import ControlledFileApplication from '../do/a8-file-handling/ControlledFileApplication.vue'
+import DistributionCollectionRecord from '../do/a8-file-handling/DistributionCollectionRecord.vue'
+import FileChangeRequest from '../do/a8-file-handling/FileChangeRequest.vue'
+import FileObsoletionRequest from '../do/a8-file-handling/FileObsoletionRequest.vue'
+export default {
+  components: {
+    FileList,
+    ControlledFileApplication,
+    DistributionCollectionRecord,
+    FileChangeRequest,
+    FileObsoletionRequest
+  },
+  data() {
+    return {
+      tabList:[
+        {
+          name:'鏂囦欢娓呭崟',
+          component:'FileList'
+        },
+        {
+          name:'鏂囦欢鍙楁帶鐢宠',
+          component:'ControlledFileApplication'
+        },
+        {
+          name:'鍙戞斁鍥炴敹璁板綍',
+          component:'DistributionCollectionRecord'
+        },
+        {
+          name:'鏂囦欢鍙樻洿鐢宠',
+          component:'FileChangeRequest'
+        },
+        {
+          name:'鏂囦欢浣滃簾鐢宠',
+          component:'FileObsoletionRequest'
+        },
+      ],
+      activeName:'FileList'
+    };
+  },
+}
+</script>
+
+<style scoped>
+.file-handling {
+  margin-top: 10px;
+  height: calc(100% - 20px);
+}
+>>>.el-tabs__content{
+  height: 100%;
+}
+</style>
diff --git "a/static/img/stamps/\344\270\273\344\273\273.png" "b/static/img/stamps/\344\270\273\344\273\273.png"
new file mode 100644
index 0000000..f3312ee
--- /dev/null
+++ "b/static/img/stamps/\344\270\273\344\273\273.png"
Binary files differ
diff --git "a/static/img/stamps/\345\202\250\350\203\275.png" "b/static/img/stamps/\345\202\250\350\203\275.png"
new file mode 100644
index 0000000..6260cad
--- /dev/null
+++ "b/static/img/stamps/\345\202\250\350\203\275.png"
Binary files differ
diff --git "a/static/img/stamps/\345\260\204\351\242\221.png" "b/static/img/stamps/\345\260\204\351\242\221.png"
new file mode 100644
index 0000000..b243bd8
--- /dev/null
+++ "b/static/img/stamps/\345\260\204\351\242\221.png"
Binary files differ
diff --git "a/static/img/stamps/\346\212\200\346\234\257\350\264\237\350\264\243\344\272\272.png" "b/static/img/stamps/\346\212\200\346\234\257\350\264\237\350\264\243\344\272\272.png"
new file mode 100644
index 0000000..630ede1
--- /dev/null
+++ "b/static/img/stamps/\346\212\200\346\234\257\350\264\237\350\264\243\344\272\272.png"
Binary files differ
diff --git "a/static/img/stamps/\347\224\265\345\212\233.png" "b/static/img/stamps/\347\224\265\345\212\233.png"
new file mode 100644
index 0000000..cb873aa
--- /dev/null
+++ "b/static/img/stamps/\347\224\265\345\212\233.png"
Binary files differ
diff --git "a/static/img/stamps/\347\273\274\345\220\210\345\256\244.png" "b/static/img/stamps/\347\273\274\345\220\210\345\256\244.png"
new file mode 100644
index 0000000..97fce30
--- /dev/null
+++ "b/static/img/stamps/\347\273\274\345\220\210\345\256\244.png"
Binary files differ
diff --git "a/static/img/stamps/\350\243\205\345\244\207.png" "b/static/img/stamps/\350\243\205\345\244\207.png"
new file mode 100644
index 0000000..894f70d
--- /dev/null
+++ "b/static/img/stamps/\350\243\205\345\244\207.png"
Binary files differ
diff --git "a/static/img/stamps/\350\264\250\351\207\217\350\264\237\350\264\243\344\272\272.png" "b/static/img/stamps/\350\264\250\351\207\217\350\264\237\350\264\243\344\272\272.png"
new file mode 100644
index 0000000..dde64e9
--- /dev/null
+++ "b/static/img/stamps/\350\264\250\351\207\217\350\264\237\350\264\243\344\272\272.png"
Binary files differ
diff --git "a/static/img/stamps/\351\200\232\344\277\241.png" "b/static/img/stamps/\351\200\232\344\277\241.png"
new file mode 100644
index 0000000..232e283
--- /dev/null
+++ "b/static/img/stamps/\351\200\232\344\277\241.png"
Binary files differ
diff --git a/static/js/menu.js b/static/js/menu.js
index 1a26e90..3885883 100644
--- a/static/js/menu.js
+++ b/static/js/menu.js
@@ -307,127 +307,69 @@
 		// 	p: ""
 		// },
     {
-			v: "浜哄憳鎬昏",
+			v: "浜哄憳",
 			i: "font icon-erjidaohang",
-			u: "a6-personnel-overview",
+			u: "a6-personnel",
 			g: "6.2 浜哄憳",
-			p: "selectPersonnelOverview"
-		}, {
-			v: "浜哄憳鏄庣粏",
-			i: "font icon-erjidaohang",
-			u: "a6-personnel-detail",
-			g: "6.2 浜哄憳",
-			p: "selectDepartmentLim"
+			p: ""
 		},
-    // {
-		// 	v: "浜哄憳鍩硅",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.2 浜哄憳",
-		// 	p: ""
-		// }, {
-		// 	v: "浜哄憳鐩戠潱",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.2 浜哄憳",
-		// 	p: ""
-		// }, {
-		// 	v: "宀椾綅鑱岃矗",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.2 浜哄憳",
-		// 	p: ""
-		// }, {
-		// 	v: "浜哄憳鍩烘湰淇℃伅",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.2 浜哄憳",
-		// 	p: ""
-		// }, {
-		// 	v: "宸ヤ綔灞ュ巻",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.2 浜哄憳",
-		// 	p: ""
-		// }, {
-		// 	v: "濂栨儵璁板綍",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.2 浜哄憳",
-		// 	p: ""
-		// }, {
-		// 	v: "鍩硅璁板綍",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.2 浜哄憳",
-		// 	p: ""
-		// }, {
-		// 	v: "鐩戠潱璁板綍",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.2 浜哄憳",
-		// 	p: ""
-		// }, {
-		// 	v: "浠昏亴鎺堟潈璁板綍",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.2 浜哄憳",
-		// 	p: ""
-		// }, {
-		// 	v: "浜哄憳鑳藉姏鐩戞帶璁板綍",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.2 浜哄憳",
-		// 	p: ""
-		// }, {
-		// 	v: "娌熼�氳褰�",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.2 浜哄憳",
-		// 	p: ""
-		// }, {
-		// 	v: "澶栨潵浜哄憳绠$悊",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "a6-external-personnel-management",
-		// 	g: "6.3 璁炬柦鍜岀幆澧冩潯浠�",
-		// 	p: ""
-		// }, {
-		// 	v: "瀹為獙瀹よ鏂藉満鎵�淇℃伅",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.3 璁炬柦鍜岀幆澧冩潯浠�",
-		// 	p: ""
-		// }, {
-		// 	v: "璁炬柦鍜岀幆澧冩潯浠惰姹�",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.3 璁炬柦鍜岀幆澧冩潯浠�",
-		// 	p: ""
-		// }, {
-		// 	v: "鐜鏉′欢寮曠敤",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.3 璁炬柦鍜岀幆澧冩潯浠�",
-		// 	p: ""
-		// }, {
-		// 	v: "瀹夊叏鍖轰唬琛ㄦ鏌�",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.3 璁炬柦鍜岀幆澧冩潯浠�",
-		// 	p: ""
-		// }, {
-		// 	v: "瀹夊叏鍐呭姟",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.3 璁炬柦鍜岀幆澧冩潯浠�",
-		// 	p: ""
-		// }, {
-		// 	v: "搴熺墿澶勭悊浜ゆ帴璁板綍",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "a6-waste-handover",
-		// 	g: "6.3 璁炬柦鍜岀幆澧冩潯浠�",
-		// 	p: ""
-		// },
+      {
+			v: "璁炬柦鍜岀幆澧冩潯浠�",
+			i: "font icon-erjidaohang",
+			u: "a6-facilities-environment",
+			g: "6.3 璁炬柦鍜岀幆澧冩潯浠�",
+			p: ""
+		},
+		 {
+			v: "璁惧",
+			i: "font icon-erjidaohang",
+			u: "a6-device",
+			g: "6.4 璁惧",
+			p: ""
+		},
+		 {
+			v: "閲忓�兼函婧愯鍒�",
+			i: "font icon-erjidaohang",
+			u: "a6-quantity-value-traceability-plan",
+			g: "6.5 璁¢噺婧簮鎬�",
+			p: ""
+		}, {
+			v: "鏍囧噯鐗╄川娓呭崟",
+			i: "font icon-erjidaohang",
+			u: "a6-standard-material-list",
+			g: "6.5 璁¢噺婧簮鎬�",
+			p: ""
+		}, {
+			v: "鏍囧噯鐗╄川楠屾敹",
+			i: "font icon-erjidaohang",
+			u: "a6-standard-material-accep",
+			g: "6.5 璁¢噺婧簮鎬�",
+			p: ""
+		}, {
+			v: "鏍囧噯鐗╄川棰嗙敤",
+			i: "font icon-erjidaohang",
+			u: "a6-standard-material-requisition",
+			g: "6.5 璁¢噺婧簮鎬�",
+			p: ""
+		}, {
+			v: "杩囨湡鏍囨牱澶勭疆",
+			i: "font icon-erjidaohang",
+			u: "",
+			g: "6.5 璁¢噺婧簮鎬�",
+			p: ""
+		}, {
+			v: "鏈嶅姟鍜屼緵搴斿搧閲囪喘",
+			i: "font icon-erjidaohang",
+			u: "a6.service-and-supply-purchase",
+			g: "6.6 澶栭儴鎻愪緵鐨勪骇鍝佸拰鏈嶅姟",
+			p: ""
+		},{
+			v: "渚涘簲鍟嗙鐞�",
+			i: "font icon-erjidaohang",
+			u: "a6-supplier-manage",
+			g: "6.6 澶栭儴鎻愪緵鐨勪骇鍝佸拰鏈嶅姟",
+			p: ""
+		},
     {
 			v: "璁惧鎬昏",
 			i: "font icon-erjidaohang",
@@ -441,125 +383,13 @@
 			g: "6.4 璁惧",
 			p: "selectDeviceParameter"
 		},
-    //  {
-		// 	v: "璧勬簮棰勫畾",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.4 璁惧",
-		// 	p: ""
-		// }, {
-		// 	v: "浣滀笟鎸囧涔�",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.4 璁惧",
-		// 	p: ""
-		// }, {
-		// 	v: "璁惧杩愯鎬昏",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.4 璁惧",
-		// 	p: ""
-		// }, {
-		// 	v: "璁惧妗f",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "a6-device",
-		// 	g: "6.4 璁惧",
-		// 	p: ""
-		// }, {
-		// 	v: "璁惧楠屾敹",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.4 璁惧",
-		// 	p: ""
-		// }, {
-		// 	v: "璁惧鏍″噯",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.4 璁惧",
-		// 	p: ""
-		// }, {
-		// 	v: "璁惧鏍告煡",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.4 璁惧",
-		// 	p: ""
-		// }, {
-		// 	v: "璁惧缁存姢",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.4 璁惧",
-		// 	p: ""
-		// }, {
-		// 	v: "璁惧鍊熺敤",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.4 璁惧",
-		// 	p: ""
-		// }, {
-		// 	v: "璁惧鏁呴殰",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.4 璁惧",
-		// 	p: ""
-		// }, {
-		// 	v: "浣跨敤璁板綍",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.4 璁惧",
-		// 	p: ""
-		// }, {
-		// 	v: "璁惧鍋滅敤/鍚敤",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.4 璁惧",
-		// 	p: ""
-		// }, {
-		// 	v: "閲忓�兼函婧愯鍒�",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.5 璁¢噺婧簮鎬�",
-		// 	p: ""
-		// },
     {
 			v: "鏍囧噯鐗╄川娓呭崟",
 			i: "font icon-erjidaohang",
 			u: "a6-standard-material-list",
 			g: "6.5 璁¢噺婧簮鎬�",
 			p: ""
-		},
-    //  {
-		// 	v: "鏍囧噯鐗╄川楠屾敹",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.5 璁¢噺婧簮鎬�",
-		// 	p: ""
-		// },
-     {
-			v: "鏍囧噯鐗╄川棰嗙敤",
-			i: "font icon-erjidaohang",
-			u: "a6-standard-material-requisition",
-			g: "6.5 璁¢噺婧簮鎬�",
-			p: ""
-		},
-    // {
-		// 	v: "杩囨湡鏍囨牱澶勭疆",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.5 璁¢噺婧簮鎬�",
-		// 	p: ""
-		// }, {
-		// 	v: "鏈嶅姟鍜屼緵搴斿搧閲囪喘",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.6 澶栭儴鎻愪緵鐨勪骇鍝佸拰鏈嶅姟",
-		// 	p: ""
-		// },{
-		// 	v: "渚涘簲鍟嗙鐞�",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "6.6 澶栭儴鎻愪緵鐨勪骇鍝佸拰鏈嶅姟",
-		// 	p: ""
-		// }
+		}
   ]
 	},
 	{
@@ -567,203 +397,213 @@
 		i: "font icon-guochengyaoqiu",
 		p: "",
 		c: [
-    //   {
-		// 	v: "妫�楠屽鎵樺崟",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.1 瑕佹眰銆佹爣涔﹀拰鍚堝悓璇勫",
-		// 	p: ""
-		// }, {
-		// 	v: "鍚堝悓璇勫",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.1 瑕佹眰銆佹爣涔﹀拰鍚堝悓璇勫",
-		// 	p: ""
-		// },
-    {
-			v: "瀹為獙瀹ょ殑妫�娴嬭兘鍔涙。妗�",
-			i: "font icon-erjidaohang",
-			u: "a7-standard-method",
-			g: "7.2 鏂规硶鐨勯�夋嫨銆侀獙璇佸拰纭",
-			p: "selectStandardMethodList"
-		}
-    // , {
-		// 	v: "鏍囧噯鏌ユ柊",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.2 鏂规硶鐨勯�夋嫨銆侀獙璇佸拰纭",
-		// 	p: ""
-		// }, {
-		// 	v: "鏍囧噯鏂规硶鐨勫彉鏇�",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.2 鏂规硶鐨勯�夋嫨銆侀獙璇佸拰纭",
-		// 	p: ""
-		// }, {
-		// 	v: "鏂规硶楠岃瘉",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.2 鏂规硶鐨勯�夋嫨銆侀獙璇佸拰纭",
-		// 	p: ""
-		// }, {
-		// 	v: "鎶芥牱",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.3 鎶芥牱",
-		// 	p: ""
-		// }, {
-		// 	v: "妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.4 妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�",
-		// 	p: ""
-		// }, {
-		// 	v: "鎶�鏈褰�",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.5 鎶�鏈褰�",
-		// 	p: ""
-		// }, {
-		// 	v: "娴嬮噺涓嶇‘瀹氬害鐨勮瘎瀹�",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.6 娴嬮噺涓嶇‘瀹氬害鐨勮瘎瀹�",
-		// 	p: ""
-		// }, {
-		// 	v: "纭繚缁撴灉鏈夋晥鎬�",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.7 纭繚缁撴灉鏈夋晥鎬�",
-		// 	p: ""
-		// }, {
-		// 	v: "鎶ュ憡缁撴灉",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.8 鎶ュ憡缁撴灉",
-		// 	p: ""
-		// }, {
-		// 	v: "鎶曡瘔璇︽儏",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.9 鎶曡瘔",
-		// 	p: ""
-		// }, {
-		// 	v: "鎶曡瘔鎯呭喌姹囨�昏〃",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.9 鎶曡瘔",
-		// 	p: ""
-		// }, {
-		// 	v: "涓嶇鍚堥」",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.10 涓嶇鍚堝伐浣�",
-		// 	p: ""
-		// }, {
-		// 	v: "涓嶇鍚堥」鐨勫垎甯�",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.10 涓嶇鍚堝伐浣�",
-		// 	p: ""
-		// }, {
-		// 	v: "鏁版嵁鎺у埗鍜屼俊鎭鐞�",
-		// 	i: "font icon-erjidaohang",
-		// 	u: "",
-		// 	g: "7.11 鏁版嵁鎺у埗鍜屼俊鎭鐞�",
-		// 	p: ""
-		// }
+      {
+        v: "妫�楠屽鎵樺崟",
+        i: "font icon-erjidaohang",
+        u: "a7-contract-review",
+        g: "7.1 瑕佹眰銆佹爣涔﹀拰鍚堝悓璇勫",
+        p: "pageProcessOrder"
+      }, {
+        v: "鍚堝悓璇勫",
+        i: "font icon-erjidaohang",
+        u: "a7-contract-review",
+        g: "7.1 瑕佹眰銆佹爣涔﹀拰鍚堝悓璇勫",
+        p: "pageProcessOrder"
+      }, {
+        v: "瀹為獙瀹ょ殑妫�娴嬭兘鍔涙。妗�",
+        i: "font icon-erjidaohang",
+        u: "a7-standard-method",
+        g: "7.2 鏂规硶鐨勯�夋嫨銆侀獙璇佸拰纭",
+        p: "selectStandardMethodList"
+      }, {
+        v: "鏍囧噯鏌ユ柊",
+        i: "font icon-erjidaohang",
+        u: "a7-standard-novelty-retrieval",
+        g: "7.2 鏂规硶鐨勯�夋嫨銆侀獙璇佸拰纭",
+        p: ""
+      }, {
+        v: "鏍囧噯鏂规硶鐨勫彉鏇�",
+        i: "font icon-erjidaohang",
+        u: "a7-changes-standard-methods",
+        g: "7.2 鏂规硶鐨勯�夋嫨銆侀獙璇佸拰纭",
+        p: ""
+      }, {
+        v: "鏂规硶楠岃瘉",
+        i: "font icon-erjidaohang",
+        u: "a7-method-verification",
+        g: "7.2 鏂规硶鐨勯�夋嫨銆侀獙璇佸拰纭",
+        p: ""
+      }, {
+        v: "鎶芥牱",
+        i: "font icon-erjidaohang",
+        u: "",
+        g: "7.3 鎶芥牱",
+        p: ""
+      }, {
+        v: "鏍峰搧鎺ユ敹",
+        i: "font icon-erjidaohang",
+        u: "a7-sample-registration",
+        g: "7.4 妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�",
+        p: "pageProcessTotaldeal"
+      },{
+        v: "妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�",
+        i: "font icon-erjidaohang",
+        u: "a7-sample-disposal",
+        g: "7.4 妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�",
+        p: "pageProcessTotaldeal"
+      }, {
+        v: "鎶�鏈褰�",
+        i: "font icon-erjidaohang",
+        u: "",
+        g: "7.5 鎶�鏈褰�",
+        p: ""
+      }, {
+        v: "娴嬮噺涓嶇‘瀹氬害鐨勮瘎瀹�",
+        i: "font icon-erjidaohang",
+        u: "a7-uncertainty-evaluation",
+        g: "7.6 娴嬮噺涓嶇‘瀹氬害鐨勮瘎瀹�",
+        p: "pageProcessEvaluate"
+      }, {
+        v: "璐ㄩ噺鐩戞帶璁″垝",
+        i: "font icon-erjidaohang",
+        u: "a7-Ensure-results-validity",
+        g: "7.7 纭繚缁撴灉鏈夋晥鎬�",
+        p: ""
+      }, {
+        v: "璐ㄩ噺鐩戠潱璁″垝",
+        i: "font icon-erjidaohang",
+        u: "a7-quality-control-plan",
+        g: "7.7 纭繚缁撴灉鏈夋晥鎬�",
+        p: ""
+      }, {
+        v: "鎶ュ憡缁撴灉",
+        i: "font icon-erjidaohang",
+        u: "a7-report-results",
+        g: "7.8 鎶ュ憡缁撴灉",
+        p: "pageProcessReport"
+      },{
+        v: "鎶曡瘔鎯呭喌姹囨�昏〃",
+        i: "font icon-erjidaohang",
+        u: "a7-complaint",
+        g: "7.9 鎶曡瘔",
+        p: "pageProcessComplain"
+      }, {
+        v: "涓嶇鍚堥」",
+        i: "font icon-erjidaohang",
+        u: "a7-nonconforming-item",
+        g: "7.10 涓嶇鍚堝伐浣�",
+        p: ""
+      }, {
+        v: "涓嶇鍚堥」鐨勫垎甯�",
+        i: "font icon-erjidaohang",
+        u: "a7-distribution-of-nonconforming",
+        g: "7.10 涓嶇鍚堝伐浣�",
+        p: ""
+      }, {
+        v: "鏁版嵁鎺у埗鍜屼俊鎭鐞�",
+        i: "font icon-erjidaohang",
+        u: "",
+        g: "7.11 鏁版嵁鎺у埗鍜屼俊鎭鐞�",
+        p: ""
+      }
   ]
 	},
-	// {
-	// 	v: "8 浣撶郴绠$悊瑕佹眰",
-	// 	i: "font icon-guanlitixiyaoqiu",
-	// 	p: "",
-	// 	c: [{
-	// 		v: "鏂瑰紡",
-	// 		i: "font icon-erjidaohang",
-	// 		u: "",
-	// 		g: "8.1 鏂瑰紡",
-	// 		p: ""
-	// 	}, {
-	// 		v: "绠$悊浣撶郴鏂囦欢",
-	// 		i: "font icon-erjidaohang",
-	// 		u: "",
-	// 		g: "8.2 绠$悊浣撶郴鏂囦欢",
-	// 		p: ""
-	// 	}, {
-	// 		v: "鏂囦欢娓呭崟",
-	// 		i: "font icon-erjidaohang",
-	// 		u: "",
-	// 		g: "8.3 绠$悊浣撶郴鏂囦欢鐨勬帶鍒�",
-	// 		p: ""
-	// 	}, {
-	// 		v: "鏂囦欢鍙楁帶",
-	// 		i: "font icon-erjidaohang",
-	// 		u: "",
-	// 		g: "8.3 绠$悊浣撶郴鏂囦欢鐨勬帶鍒�",
-	// 		p: ""
-	// 	}, {
-	// 		v: "鏂囦欢鍙戞斁鍥炴敹",
-	// 		i: "font icon-erjidaohang",
-	// 		u: "",
-	// 		g: "8.3 绠$悊浣撶郴鏂囦欢鐨勬帶鍒�",
-	// 		p: ""
-	// 	}, {
-	// 		v: "鏂囦欢鍙樻洿",
-	// 		i: "font icon-erjidaohang",
-	// 		u: "",
-	// 		g: "8.3 绠$悊浣撶郴鏂囦欢鐨勬帶鍒�",
-	// 		p: ""
-	// 	}, {
-	// 		v: "鏂囦欢浣滃簾",
-	// 		i: "font icon-erjidaohang",
-	// 		u: "",
-	// 		g: "8.3 绠$悊浣撶郴鏂囦欢鐨勬帶鍒�",
-	// 		p: ""
-	// 	}, {
-	// 		v: "璁板綍鐨勬帶鍒�",
-	// 		i: "font icon-erjidaohang",
-	// 		u: "",
-	// 		g: "8.4 璁板綍鐨勬帶鍒�",
-	// 		p: ""
-	// 	}, {
-	// 		v: "搴斿椋庨櫓鍜屾満閬囩殑鎺柦",
-	// 		i: "font icon-erjidaohang",
-	// 		u: "",
-	// 		g: "8.5 搴斿椋庨櫓鍜屾満閬囩殑鎺柦",
-	// 		p: ""
-	// 	}, {
-	// 		v: "瀹㈡埛鍩烘湰淇℃伅绠$悊",
-	// 		i: "font icon-erjidaohang",
-	// 		u: "",
-	// 		g: "8.6 鏀硅繘",
-	// 		p: ""
-	// 	}, {
-	// 		v: "瀹㈡埛婊℃剰搴�",
-	// 		i: "font icon-erjidaohang",
-	// 		u: "",
-	// 		g: "8.6 鏀硅繘",
-	// 		p: ""
-	// 	}, {
-	// 		v: "绾犳鎺柦",
-	// 		i: "font icon-erjidaohang",
-	// 		u: "",
-	// 		g: "8.7 绾犳鎺柦",
-	// 		p: ""
-	// 	}, {
-	// 		v: "鍐呭绠$悊",
-	// 		i: "font icon-erjidaohang",
-	// 		u: "",
-	// 		g: "8.8 鍐呭绠$悊",
-	// 		p: ""
-	// 	}, {
-	// 		v: "绠$悊璇勫",
-	// 		i: "font icon-erjidaohang",
-	// 		u: "",
-	// 		g: "8.9 绠$悊璇勫",
-	// 		p: ""
-	// 	}]
-	// }
+	{
+		v: "8 浣撶郴绠$悊瑕佹眰",
+		i: "font icon-guanlitixiyaoqiu",
+		p: "",
+		c: [{
+			v: "鏂瑰紡",
+			i: "font icon-erjidaohang",
+			u: "",
+			g: "8.1 鏂瑰紡",
+			p: ""
+		}, {
+			v: "绠$悊浣撶郴鏂囦欢",
+			i: "font icon-erjidaohang",
+			u: "",
+			g: "8.2 绠$悊浣撶郴鏂囦欢",
+			p: ""
+		}, {
+			v: "绠$悊浣撶郴鏂囦欢鐨勬帶鍒�",
+			i: "font icon-erjidaohang",
+			u: "a8-file-handling",
+			g: "8.3 绠$悊浣撶郴鏂囦欢鐨勬帶鍒�",
+			p: "doManageDocumentList pageManageDocumentControlled"
+		},{
+			v: "鏂囦欢瀹℃壒璁板綍",
+			i: "font icon-erjidaohang",
+			u: "a8-document-approval-records",
+			g: "8.4 璁板綍鐨勬帶鍒�",
+			p: "pageManageRecordCheck"
+		},{
+			v: "澶栨潵鏂囦欢纭璁板綍",
+			i: "font icon-erjidaohang",
+			u: "a8-external-document-confirmation-records",
+			g: "8.4 璁板綍鐨勬帶鍒�",
+			p: "pageManageRecordTotal"
+		},{
+			v: "鎵�鏈夋枃浠讹紙鍐呫�佸閮ㄦ枃浠讹級鐨勫彂鏀句笌鍥炴敹璁板綍",
+			i: "font icon-erjidaohang",
+			u: "a8-distribution-retrieval-records-all-documents",
+			g: "8.4 璁板綍鐨勬帶鍒�",
+			p: "pageManageRecordIssueRecycle"
+		},{
+			v: "鏂囦欢淇鐢宠瀹℃壒璁板綍",
+			i: "font icon-erjidaohang",
+			u: "a8-document-revision-request-approval-records",
+			g: "8.4 璁板綍鐨勬帶鍒�",
+			p: "pageManageRecordAudit"
+		},{
+			v: "鏂囦欢瀹氭湡瀹℃煡璁板綍",
+			i: "font icon-erjidaohang",
+			u: "a8-periodic-document-review-records",
+			g: "8.4 璁板綍鐨勬帶鍒�",
+			p: "pageManageRecordIntervals"
+		},{
+			v: "浣滃簾鏂囦欢閿�姣佽褰�",
+			i: "font icon-erjidaohang",
+			u: "a8-obsolete-document-destruction-records",
+			g: "8.4 璁板綍鐨勬帶鍒�",
+			p: "pageManageRecordCancel"
+		}, {
+			v: "搴斿椋庨櫓鍜屾満閬囩殑鎺柦",
+			i: "font icon-erjidaohang",
+			u: "a8-measures_deal_risks_opportunities",
+			g: "8.5 搴斿椋庨櫓鍜屾満閬囩殑鎺柦",
+			p: ""
+		}, {
+			v: "瀹㈡埛鍩烘湰淇℃伅绠$悊",
+			i: "font icon-erjidaohang",
+			u: "",
+			g: "8.6 鏀硅繘",
+			p: ""
+		}, {
+			v: "瀹㈡埛婊℃剰搴�",
+			i: "font icon-erjidaohang",
+			u: "a8-customer-satisfaction",
+			g: "8.6 鏀硅繘",
+			p: ""
+		}, {
+			v: "绾犳鎺柦",
+			i: "font icon-erjidaohang",
+			u: "a8-corrective-action",
+			g: "8.7 绾犳鎺柦",
+			p: ""
+		}, {
+			v: "鍐呭绠$悊",
+			i: "font icon-erjidaohang",
+			u: "a8-internal-audit-management",
+			g: "8.8 鍐呭绠$悊",
+			p: ""
+		}, {
+			v: "绠$悊璇勫",
+			i: "font icon-erjidaohang",
+			u: "a9-management-review",
+			g: "8.9 绠$悊璇勫",
+			p: ""
+		}]
+	}
 ]
 
 function computeK() {

--
Gitblit v1.9.3