From d351fa25471f4e9b5d276895c39ec0fac5eb51b9 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期一, 24 二月 2025 15:32:30 +0800
Subject: [PATCH] 内审管理搬迁

---
 src/components/Table/lims-table.vue                                                        |    2 
 src/views/CNAS/systemManagement/internalAuditManagement/components/ViewTestRecord.vue      |  176 ++
 src/views/CNAS/systemManagement/internalAuditManagement/components/auditReportDia.vue      |  333 ++++
 src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSignDia.vue |  183 ++
 src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveActionDIa.vue |  409 ++++++
 src/views/CNAS/systemManagement/internalAuditManagement/components/implementationPlan.vue  |  292 ++++
 src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlanDia.vue         |  342 +++++
 src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlan.vue            |  314 ++++
 src/api/cnas/systemManagement/internalAuditManagement.js                                   |  398 +++++
 src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSign.vue    |  202 +++
 src/views/CNAS/systemManagement/customerSatisfaction/index.vue                             |    3 
 src/views/CNAS/systemManagement/internalAuditManagement/components/implementPlanDia.vue    |  307 ++++
 src/views/CNAS/systemManagement/internalAuditManagement/components/auditReport.vue         |  312 ++++
 src/views/CNAS/systemManagement/internalAuditManagement/index.vue                          |   57 
 src/views/CNAS/systemManagement/correctiveAction/index.vue                                 |    3 
 src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspection.vue     |  254 +++
 src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspectionDia.vue  |  231 +++
 src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveAction.vue    |  182 ++
 18 files changed, 3,997 insertions(+), 3 deletions(-)

diff --git a/src/api/cnas/systemManagement/internalAuditManagement.js b/src/api/cnas/systemManagement/internalAuditManagement.js
new file mode 100644
index 0000000..e7ae621
--- /dev/null
+++ b/src/api/cnas/systemManagement/internalAuditManagement.js
@@ -0,0 +1,398 @@
+// 鍐呭绠$悊鐩稿叧鎺ュ彛
+import request from "@/utils/request";
+
+//骞村害璁″垝-鍒嗛〉
+export function pageInternalPlan(query) {
+  return request({
+    url: "/internalPlan/pageInternalPlan",
+    method: "get",
+    params: query,
+  });
+}
+
+//骞村害璁″垝-鍒犻櫎
+export function delInternalPlan(query) {
+  return request({
+    url: "/internalPlan/delInternalPlan",
+    method: "delete",
+    params: query,
+  });
+}
+
+//骞村害璁″垝-瀵煎嚭
+export function exportInternalPlan(query) {
+  return request({
+    url: "/internalPlan/exportInternalPlan",
+    method: "get",
+    headers: {
+      responseType: "blob",
+    },
+    params: query,
+  });
+}
+
+//骞村害璁″垝璇︽儏
+export function getInternalPlanOne(query) {
+  return request({
+    url: "/internalPlan/getInternalPlanOne",
+    method: "get",
+    params: query,
+  });
+}
+
+// 骞村害璁″垝-鏂板
+export function addInternalPlan(data) {
+  return request({
+    url: "/internalPlan/addInternalPlan",
+    method: "post",
+    data: data,
+  });
+}
+
+// 骞村害璁″垝-淇敼
+export function updateInternalPlan(data) {
+  return request({
+    url: "/internalPlan/updateInternalPlan",
+    method: "post",
+    data: data,
+  });
+}
+
+// 骞村害璁″垝-瀹℃牳
+export function examineInternalPlan(data) {
+  return request({
+    url: "/internalPlan/examineInternalPlan",
+    method: "post",
+    data: data,
+  });
+}
+
+// 骞村害璁″垝-鎵瑰噯
+export function ratifyInternalPlan(data) {
+  return request({
+    url: "/internalPlan/ratifyInternalPlan",
+    method: "post",
+    data: data,
+  });
+}
+
+//鍐呭瀹炴柦璁″垝鍒嗛〉鏌ヨ
+export function pageInternalImplement(query) {
+  return request({
+    url: "/internalImplement/pageInternalImplement",
+    method: "get",
+    params: query,
+  });
+}
+
+//鍐呭瀹炴柦璁″垝鍒犻櫎
+export function delInternalImplement(query) {
+  return request({
+    url: "/internalImplement/delInternalImplement",
+    method: "delete",
+    params: query,
+  });
+}
+
+//瀵煎嚭鍐呭瀹炴柦璁″垝
+export function exportInternalImplement(query) {
+  return request({
+    url: "/internalImplement/exportInternalImplement",
+    method: "get",
+    headers: {
+      responseType: "blob",
+    },
+    params: query,
+  });
+}
+
+//鍐呭瀹炴柦璁″垝璇︽儏
+export function getInternalImplementOne(query) {
+  return request({
+    url: "/internalImplement/getInternalImplementOne",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鍐呭瀹炴柦璁″垝鏂板
+export function addInternalImplement(data) {
+  return request({
+    url: "/internalImplement/addInternalImplement",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鍐呭瀹炴柦璁″垝淇敼
+export function updateInternalImplement(data) {
+  return request({
+    url: "/internalImplement/updateInternalImplement",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鍐呭瀹炴柦璁″垝淇敼
+export function ratifyInternalImplement(data) {
+  return request({
+    url: "/internalImplement/ratifyInternalImplement",
+    method: "post",
+    data: data,
+  });
+}
+
+//浼氳绛惧埌鏌ヨ
+export function pageInternalMeeting(query) {
+  return request({
+    url: "/internalMeeting/pageInternalMeeting",
+    method: "get",
+    params: query,
+  });
+}
+
+// 浼氳绛惧埌鍒犻櫎
+export function delInternalMeeting(query) {
+  return request({
+    url: "/internalMeeting/delInternalMeeting",
+    method: "delete",
+    params: query,
+  });
+}
+
+//瀵煎嚭鍐呭浼氳
+export function exportInternalMeeting(query) {
+  return request({
+    url: "/internalMeeting/exportInternalMeeting",
+    method: "get",
+    headers: {
+      responseType: "blob",
+    },
+    params: query,
+  });
+}
+
+//浼氳绛惧埌鏌ヨ璇︽儏
+export function getInternalMeetingOne(query) {
+  return request({
+    url: "/internalMeeting/getInternalMeetingOne",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鏂板浼氳绛惧埌
+export function addInternalMeeting(data) {
+  return request({
+    url: "/internalMeeting/addInternalMeeting",
+    method: "post",
+    data: data,
+  });
+}
+
+// 浼氳绛惧埌淇敼
+export function updateInternalMeeting(data) {
+  return request({
+    url: "/internalMeeting/updateInternalMeeting",
+    method: "post",
+    data: data,
+  });
+}
+
+//鍐呭妫�鏌ュ垎椤垫煡璇�
+export function pageInternalCheck(query) {
+  return request({
+    url: "/internalCheck/pageInternalCheck",
+    method: "get",
+    params: query,
+  });
+}
+
+//鍐呭妫�鏌ュ垹闄�
+export function delInternalCheck(query) {
+  return request({
+    url: "/internalCheck/delInternalCheck",
+    method: "delete",
+    params: query,
+  });
+}
+
+//瀵煎嚭鍐呭妫�鏌�
+export function exportInternalCheck(query) {
+  return request({
+    url: "/internalCheck/exportInternalCheck",
+    method: "get",
+    headers: {
+      responseType: "blob",
+    },
+    params: query,
+  });
+}
+
+//鍐呭妫�鏌ヨ鎯�
+export function getInternalCheckOne(query) {
+  return request({
+    url: "/internalCheck/getInternalCheckOne",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鍐呭妫�鏌ユ柊澧�
+export function addInternalCheck(data) {
+  return request({
+    url: "/internalCheck/addInternalCheck",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鍐呭妫�鏌ヤ慨鏀�
+export function updateInternalCheck(data) {
+  return request({
+    url: "/internalCheck/updateInternalCheck",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鍐呭妫�鏌ユ壒鍑�
+export function ratifyInternalCheck(data) {
+  return request({
+    url: "/internalCheck/ratifyInternalCheck",
+    method: "post",
+    data: data,
+  });
+}
+
+//鏌ヨ鍐呭绠$悊绾犳鎺柦鍒楄〃
+export function pageInternalCorrect(query) {
+  return request({
+    url: "/internalCorrect/pageInternalCorrect",
+    method: "get",
+    params: query,
+  });
+}
+
+//瀵煎嚭鍐呭绠$悊绾犳鎺柦闄勪欢
+export function exportInternalCorrect(query) {
+  return request({
+    url: "/internalCorrect/exportInternalCorrect",
+    method: "get",
+    headers: {
+      responseType: "blob",
+    },
+    params: query,
+  });
+}
+
+//鏌ヨ鍐呭绠$悊绾犳澶勭悊璇︽儏
+export function getInternalCorrect(query) {
+  return request({
+    url: "/internalCorrect/getInternalCorrect",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鎻愪氦鍐呭绠$悊绾犳鎺柦鍒楄〃
+export function addInternalCorrect(data) {
+  return request({
+    url: "/internalCorrect/addInternalCorrect",
+    method: "post",
+    data: data,
+  });
+}
+
+//鍐呭鎶ュ憡鍒犻櫎
+export function delInternalReport(query) {
+  return request({
+    url: "/internalReport/delInternalReport",
+    method: "delete",
+    params: query,
+  });
+}
+
+//鍐呭鎶ュ憡鍒嗛〉鏌ヨ
+export function pageInternalReport(query) {
+  return request({
+    url: "/internalReport/pageInternalReport",
+    method: "get",
+    params: query,
+  });
+}
+
+//瀵煎嚭鍐呭鎶ュ憡
+export function exportInternalReport(query) {
+  return request({
+    url: "/internalReport/exportInternalReport",
+    method: "get",
+    headers: {
+      responseType: "blob",
+    },
+    params: query,
+  });
+}
+
+//鍐呭鎶ュ憡璇︽儏
+export function getInternalReportOne(query) {
+  return request({
+    url: "/internalReport/getInternalReportOne",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鍐呭鎶ュ憡鏂板
+export function addInternalReport(data) {
+  return request({
+    url: "/internalReport/addInternalReport",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鍐呭鎶ュ憡淇敼
+export function updateInternalReport(data) {
+  return request({
+    url: "/internalReport/updateInternalReport",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鍐呭鎶ュ憡瀹℃牳
+export function examineInternalReport(data) {
+  return request({
+    url: "/internalReport/examineInternalReport",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鍐呭鎶ュ憡璐熻矗浜哄~鍐�
+export function qualityInternalReport(data) {
+  return request({
+    url: "/internalReport/qualityInternalReport",
+    method: "post",
+    data: data,
+  });
+}
+
+//鏌ヨ鍐呭绠$悊绾犳鎺柦闄勪欢
+export function getInternalCorrectFileList(query) {
+  return request({
+    url: "/internalCorrect/getInternalCorrectFileList",
+    method: "get",
+    params: query,
+  });
+}
+
+//鍒犻櫎鍐呭绠$悊绾犳鎺柦闄勪欢
+export function delInternalCorrectFile(query) {
+  return request({
+    url: "/internalCorrect/delInternalCorrectFile",
+    method: "delete",
+    params: query,
+  });
+}
diff --git a/src/components/Table/lims-table.vue b/src/components/Table/lims-table.vue
index fb86ea4..339a50f 100644
--- a/src/components/Table/lims-table.vue
+++ b/src/components/Table/lims-table.vue
@@ -268,7 +268,7 @@
       row.forEach((a) => {
         count += a.name.length;
       });
-      return count * 15 + 60 + "px";
+      return count * 15 + 70 + "px";
     },
     iconFn(row) {
       if (row.name === "缂栬緫" || row.name === "淇敼") {
diff --git a/src/views/CNAS/systemManagement/correctiveAction/index.vue b/src/views/CNAS/systemManagement/correctiveAction/index.vue
index 85c46e0..6e92fbd 100644
--- a/src/views/CNAS/systemManagement/correctiveAction/index.vue
+++ b/src/views/CNAS/systemManagement/correctiveAction/index.vue
@@ -15,7 +15,8 @@
         <TableCard :showForm="false" :showTitle="false">
           <template v-slot:table>
             <limsTable :column="tableColumn" :height="'calc(100vh - 17em)'" :table-data="tableData"
-              :table-loading="tableLoading" style="padding: 0 15px;margin-bottom: 16px" @pagination="pagination">
+              :table-loading="tableLoading" style="padding: 0 15px;margin-bottom: 16px" @pagination="pagination"
+              :page="page">
             </limsTable>
           </template>
         </TableCard>
diff --git a/src/views/CNAS/systemManagement/customerSatisfaction/index.vue b/src/views/CNAS/systemManagement/customerSatisfaction/index.vue
index 7b76b7c..414a023 100644
--- a/src/views/CNAS/systemManagement/customerSatisfaction/index.vue
+++ b/src/views/CNAS/systemManagement/customerSatisfaction/index.vue
@@ -34,7 +34,8 @@
           <TableCard :showForm="false" :showTitle="false">
             <template v-slot:table>
               <limsTable :column="tableColumn" :height="'calc(100vh - 22em)'" :table-data="tableData"
-                :table-loading="tableLoading" style="padding: 0 15px;margin-bottom: 16px" @pagination="pagination">
+                :table-loading="tableLoading" style="padding: 0 15px;margin-bottom: 16px" @pagination="pagination"
+                :page="page">
               </limsTable>
             </template>
           </TableCard>
diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/ViewTestRecord.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/ViewTestRecord.vue
new file mode 100644
index 0000000..fac2da1
--- /dev/null
+++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/ViewTestRecord.vue
@@ -0,0 +1,176 @@
+<template>
+  <div>
+    <el-dialog :visible.sync="filesDialogVisible" title="闄勪欢" width="80%" @closed="closeFilesLook">
+      <div style="display: flex;justify-content: space-between;">
+        <el-upload ref='upload' :action="fileAction" :auto-upload="true" :before-upload="fileBeforeUpload"
+          :data="{ correctId: info.correctId }" :headers="uploadHeader" :on-error="onError"
+          :on-success="handleSuccessUp" :show-file-list="false"
+          accept='.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar' style="width: 80px !important;">
+          <el-button size="small" style="height: 38px" type="primary">闄勪欢涓婁紶</el-button>
+        </el-upload>
+      </div>
+      <div>
+        <limsTable ref="yearTable" :column="columnData" :height="'calc(100vh - 30em)'" :highlightCurrentRow="true"
+          :table-data="tableData" :table-loading="tableLoading" style="margin-top: 0.5em;" :page="page">
+        </limsTable>
+      </div>
+    </el-dialog>
+    <el-dialog :visible.sync="lookDialogVisible" fullscreen title="鏌ョ湅闄勪欢" top="5vh" width="800px">
+      <filePreview v-if="lookDialogVisible" :currentFile="{}" :fileUrl="javaApi + '/word/' + currentInfo.fileUrl"
+        style="height: 90vh;overflow-y: auto;" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import filePreview from '@/components/Preview/filePreview.vue'
+import {
+  getInternalCorrectFileList,
+  delInternalCorrectFile,
+} from '@/api/cnas/systemManagement/internalAuditManagement.js'
+export default {
+  name: 'ViewTestRecord',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { filePreview, limsTable },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      filesDialogVisible: false,
+      tableLoading: false,
+      filesLookInfo: {},
+      columnData: [
+        {
+          label: '鏂囦欢鍚嶇О',
+          prop: 'fileName',
+          minWidth: '150px'
+        },
+        {
+          dataType: 'action',
+          minWidth: '100',
+          label: '鎿嶄綔',
+          fixed: 'right',
+          operation: [
+            {
+              name: '棰勮',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleLook(row)
+              }
+            },
+            {
+              name: '涓嬭浇',
+              type: 'text',
+              clickFun: (row) => {
+                this.upload(row)
+              }
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delete(row)
+              }
+            }
+          ]
+        }
+      ],
+      tableData: [],
+      info: {},
+      currentInfo: {},
+      lookDialogVisible: false,
+      page: {
+        total: 0,
+        size: -1,
+        current: -1,
+      },
+    };
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    openDia(row) {
+      this.filesDialogVisible = true
+      this.info = row
+      this.searchTableList()
+    },
+    // 鏌ヨ闄勪欢鍒楄〃
+    searchTableList() {
+      this.tableLoading = true
+      getInternalCorrectFileList({ correctId: this.info.correctId }).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.tableData = res.data
+      }).catch(err => {
+        this.tableLoading = false
+        console.log('err---', err);
+      })
+    },
+    closeFilesLook() {
+      this.filesDialogVisible = false
+    },
+    // 鏌ョ湅鏂囦欢
+    handleLook(row) {
+      this.currentInfo = row
+      this.lookDialogVisible = true
+    },
+    // 涓嬭浇
+    upload(row) {
+      let url = '';
+      if (row.type == 1) {
+        url = this.javaApi + '/img/' + row.fileUrl
+        this.$download.saveAs(url, row.fileName)
+      } else {
+        url = this.javaApi + '/word/' + row.fileUrl
+        this.$download.saveAs(url, row.fileName)
+      }
+    },
+    // 鍒犻櫎
+    delete(row) {
+      this.tableLoading = true
+      delInternalCorrectFile({ correctFileId: row.correctFileId }).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.$message.success('鍒犻櫎鎴愬姛')
+        this.searchTableList()
+      }).catch(err => {
+        this.tableLoading = false
+        console.log('err---', err);
+      })
+    },
+    // 涓婁紶楠岃瘉
+    fileBeforeUpload(file) {
+      let flag = true
+      if (file.size > 1024 * 1024 * 10) {
+        this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M');
+        this.$refs.upload.clearFiles()
+        flag = false
+      }
+      if (!flag) {
+        return Promise.reject(flag); //姝g‘鐨勭粓姝�
+      }
+    },
+    onError(err, file, fileList, type) {
+      this.$message.error('涓婁紶澶辫触')
+      this.$refs.upload.clearFiles()
+    },
+    handleSuccessUp(response,) {
+      this.upLoading = false;
+      if (response.code == 200) {
+        this.$message.success('涓婁紶鎴愬姛');
+        this.searchTableList()
+      } else {
+        this.$message.error(response.message);
+      }
+    },
+  },
+  computed: {
+    fileAction() {
+      return this.javaApi + '/internalCorrect/uploadInternalCorrectFile'
+
+    }
+  },
+};
+</script>
+
+<style scoped></style>
diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspection.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspection.vue
new file mode 100644
index 0000000..ecbc0cf
--- /dev/null
+++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspection.vue
@@ -0,0 +1,254 @@
+<template>
+  <div>
+    <div class="search-background">
+      <span class="search-group">
+        <span style="width: 160px">鍙楀閮ㄩ棬锛�</span>
+        <el-input v-model="searchForm.department" clearable size="small"></el-input>
+        <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button>
+        <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button>
+      </span>
+      <span class="search-group">
+        <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
+      </span>
+    </div>
+    <div class="table">
+      <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData"
+        :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination">
+      </limsTable>
+    </div>
+    <audit-inspection-dia v-if="auditInspectionDia" ref="auditInspectionDia"
+      @closeImplementDia="closeImplementDia"></audit-inspection-dia>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import AuditInspectionDia from './auditInspectionDia.vue';
+import {
+  pageInternalCheck,
+  delInternalCheck,
+  exportInternalCheck
+} from '@/api/cnas/systemManagement/internalAuditManagement.js'
+
+export default {
+  name: 'auditInspection',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { AuditInspectionDia, limsTable },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        department: '',
+      },
+      tableColumn: [
+        {
+          label: '鍙楀閮ㄩ棬',
+          prop: 'department',
+        },
+        {
+          label: '閮ㄩ棬璐熻矗浜�',
+          prop: 'departmentHead',
+        },
+        {
+          label: '瀹℃牳鍛�',
+          prop: 'auditor',
+        },
+        {
+          label: '瀹℃牳鏃ユ湡',
+          prop: 'reviewDate',
+        }, {
+          dataType: 'tag',
+          label: '鎵瑰噯鐘舵��',
+          prop: 'ratifyStatus',
+          minWidth: '100',
+          formatData: (params) => {
+            if (params === 0) {
+              return '涓嶆壒鍑�';
+            } else if (params === 1) {
+              return '鎵瑰噯';
+            } else {
+              return null;
+            }
+          },
+          formatType: (params) => {
+            if (params === 0) {
+              return 'danger';
+            } else if (params === 1) {
+              return 'success';
+            } else {
+              return null;
+            }
+          }
+        }, {
+          label: '鎵瑰噯鍐呭',
+          prop: 'ratifyRemark',
+          minWidth: '140'
+        },
+        {
+          dataType: 'action',
+          minWidth: '220',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row)
+              },
+              disabled: (row) => {
+                if (row.ratifyStatus === 1) {
+                  return false
+                } else {
+                  return true
+                }
+              },
+            },
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('edit', row);
+              },
+              disabled: (row) => {
+                if (row.ratifyStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            },
+            {
+              name: '鎵瑰噯',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('ratify', row);
+              },
+              disabled: (row) => {
+                if (row.ratifyStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delPlan(row)
+              },
+              disabled: (row) => {
+                if (row.ratifyStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            }
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        size: 20,
+        current: 1,
+        total: 0,
+      },
+      auditInspectionDia: false
+    };
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList() {
+      const entity = this.searchForm
+      const page = this.page
+      this.tableLoading = true
+      pageInternalCheck({ ...entity, ...page }).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.tableData = res.data.records
+        this.page.total = res.data.total
+      }).catch(err => {
+        console.log('err---', err);
+        this.tableLoading = false
+      })
+    },
+    // 鏂板锛岀紪杈戯紝鎵瑰噯寮规
+    openFormDia(type, row) {
+      this.auditInspectionDia = true
+      this.$nextTick(() => {
+        this.$refs.auditInspectionDia.openDia(type, row)
+      })
+    },
+    closeImplementDia() {
+      this.auditInspectionDia = false
+      this.searchList()
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm() {
+      this.searchForm.department = '';
+      this.searchList()
+    },
+    // 鍒犻櫎
+    delPlan(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        delInternalCheck({ checkId: row.checkId }).then(res => {
+          this.tableLoading = false
+          if (res.code === 201) return
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.searchList()
+        }).catch(err => {
+          this.tableLoading = false
+          console.log('err---', err);
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 瀵煎嚭
+    handleDown(row) {
+      exportInternalCheck({ checkId: row.checkId }).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res], { type: 'application/msword' });
+        this.$download.saveAs(blob, '鍐呭妫�鏌�' + '.docx');
+      })
+    },
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.searchList();
+    },
+  }
+};
+</script>
+
+<style scoped>
+.search-background {
+  width: 100%;
+  height: 60px;
+  line-height: 60px;
+  display: flex;
+  justify-content: space-between;
+}
+
+.search-group {
+  display: flex;
+  align-items: center;
+  margin: 0 20px;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspectionDia.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspectionDia.vue
new file mode 100644
index 0000000..a1f1e58
--- /dev/null
+++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspectionDia.vue
@@ -0,0 +1,231 @@
+<template>
+  <div>
+    <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false"
+      :visible.sync="formDia" title="鍐呴儴瀹℃牳瀹炴柦璁″垝" width="80%" @close="closeImplementDia">
+      <el-form ref="form" :model="form" :rules="rules" label-width="auto">
+        <el-col :span="12">
+          <el-form-item label="鍙楀閮ㄩ棬" prop="department">
+            <el-input v-model="form.department" :disabled="operationType === 'ratify'" clearable
+              size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="閮ㄩ棬璐熻矗浜�" prop="departmentHead">
+            <el-input v-model="form.departmentHead" :disabled="operationType === 'ratify'" clearable
+              size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="瀹℃牳鍛�" prop="auditor">
+            <el-input v-model="form.auditor" :disabled="operationType === 'ratify'" clearable size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="瀹℃牳鏃ユ湡" prop="reviewDate">
+            <el-date-picker v-model="form.reviewDate" :disabled="operationType === 'ratify'" clearable
+              format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small" style="width: 100%" type="date"
+              value-format="yyyy-MM-dd">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+      </el-form>
+      <div v-if="operationType !== 'ratify'" style="text-align: right;margin-bottom: 10px">
+        <el-button size="small" type="primary" @click="addRow">娣诲姞</el-button>
+        <el-button size="small" type="danger" @click="clearTable">娓呯┖</el-button>
+      </div>
+      <el-table :data="checkDetailList" border height="300" style="width: 100%">
+        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+        <el-table-column header-align="center" label="娑夊強瑕佺礌鍜岃川閲忎綋绯绘枃浠舵潯娆�" prop="element">
+          <template slot-scope="{row}">
+            <el-input v-model="row.element" :disabled="operationType === 'ratify'" size="small" />
+          </template>
+        </el-table-column>
+        <el-table-column header-align="center" label="瀹℃牳鍐呭" prop="content">
+          <template slot-scope="{row}">
+            <el-input v-model="row.content" :disabled="operationType === 'ratify'" size="small" />
+          </template>
+        </el-table-column>
+        <el-table-column header-align="center" label="瀹℃牳鏂瑰紡" prop="method">
+          <template slot-scope="{row}">
+            <el-input v-model="row.method" :disabled="operationType === 'ratify'" size="small" />
+          </template>
+        </el-table-column>
+        <el-table-column header-align="center" label="瀹℃牳缁撴灉璁板綍" prop="resultRecords" width="180">
+          <template slot-scope="{row}">
+            <el-input v-model="row.resultRecords" :disabled="operationType === 'ratify'" size="small" />
+          </template>
+        </el-table-column>
+        <el-table-column header-align="center" label="涓嶇鍚堟�ц川" prop="nonNature" width="180">
+          <template slot-scope="{row}">
+            <el-input v-model="row.nonNature" :disabled="operationType === 'ratify'" size="small" />
+          </template>
+        </el-table-column>
+      </el-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button v-if="operationType === 'ratify'" :loading="loading" @click="ratify(0)">涓嶆壒鍑�</el-button>
+        <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="ratify(1)">鎵�
+          鍑�</el-button>
+        <el-button v-if="operationType !== 'ratify'" @click="closeImplementDia">鍙� 娑�</el-button>
+        <el-button v-if="operationType !== 'ratify'" :loading="loading" type="primary" @click="handleEdit">鎻�
+          浜�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="approvalDialog" title="鎵瑰噯" width="30%" @close="approvalDialog = false">
+      <span>
+        鎵瑰噯澶囨敞锛�
+        <el-input v-model="ratifyRemark" type="textarea"></el-input>
+      </span>
+      <span slot="footer" class="dialog-footer">
+        <el-button :loading="approvalLoading" @click="approvalDialog = false">鍙� 娑�</el-button>
+        <el-button :loading="approvalLoading" type="primary" @click="handleApproval(0)">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getInternalCheckOne,
+  addInternalCheck,
+  updateInternalCheck,
+  ratifyInternalCheck,
+} from '@/api/cnas/systemManagement/internalAuditManagement.js'
+export default {
+  name: 'auditInspectionDia',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      diaLoading: false,
+      loading: false,
+      form: {
+        department: '',
+        departmentHead: '',
+        auditor: '',
+        reviewDate: '',
+      },
+      rules: {
+        department: [{ required: true, message: '璇峰~鍐欏彈瀹¢儴闂�', trigger: 'blur' }],
+        departmentHead: [{ required: true, message: '璇峰~鍐欓儴闂ㄨ礋璐d汉', trigger: 'blur' }],
+        auditor: [{ required: true, message: '璇峰~鍐欏鏍稿憳', trigger: 'blur' }],
+        reviewDate: [{ required: true, message: '璇峰~鍐欏鏍告棩鏈�', trigger: 'blur' }],
+      },
+      checkDetailList: [],
+      operationType: '',
+      approvalDialog: false,
+      approvalLoading: false,
+      ratifyRemark: '',
+    };
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鎵撳紑寮规
+    openDia(type, row) {
+      this.formDia = true
+      this.operationType = type
+      if (type !== 'add') {
+        this.searchInfo(row)
+      }
+    },
+    // 鏌ヨ璇︽儏
+    searchInfo(row) {
+      this.diaLoading = true
+      getInternalCheckOne({ checkId: row.checkId }).then(res => {
+        this.diaLoading = false
+        if (res.code === 201) return
+        this.form = res.data
+        this.checkDetailList = this.form.checkDetailList
+      }).catch(err => {
+        console.log(err)
+        this.diaLoading = false
+      })
+    },
+    // 鎻愪氦寮规鏁版嵁
+    handleEdit() {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          if (this.checkDetailList.length === 0) {
+            this.$message.warning('璇锋坊鍔犺〃鏍兼暟鎹�')
+            return
+          }
+          this.loading = true
+          const internalCheckDto = this.HaveJson(this.form)
+          internalCheckDto.checkDetailList = this.HaveJson(this.checkDetailList)
+          if (this.operationType === 'add') {
+            addInternalCheck(internalCheckDto).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeImplementDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          } else if (this.operationType === 'edit') {
+            updateInternalCheck(internalCheckDto).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeImplementDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    ratify(ratifyStatus) {
+      // 涓嶆壒鍑嗛渶瑕佸~鍐欐壒鍑嗗唴瀹�
+      if (ratifyStatus === 0) {
+        this.approvalDialog = true
+      } else {
+        this.handleApproval(ratifyStatus)
+      }
+    },
+    // 鎻愪氦鎵瑰噯淇℃伅
+    handleApproval(ratifyStatus) {
+      this.approvalLoading = true
+      const internalCheckDto = this.HaveJson(this.form)
+      internalCheckDto.ratifyStatus = ratifyStatus
+      internalCheckDto.ratifyRemark = ratifyStatus === 0 ? this.ratifyRemark : ''
+      ratifyInternalCheck(internalCheckDto).then(res => {
+        if (res.code === 200) {
+          this.$message.success('鎻愪氦鎴愬姛锛�');
+          this.approvalDialog = false
+          this.closeImplementDia(this.departId);
+        }
+        this.approvalLoading = false
+      }).catch(() => {
+        this.approvalLoading = false
+      })
+    },
+    // 澧炲姞琛ㄦ牸琛屾暟鎹�
+    addRow() {
+      this.checkDetailList.push({
+        element: '',
+        content: '',
+        method: '',
+        resultRecords: '',
+        nonNature: '',
+      })
+    },
+    // 娓呯┖琛ㄦ牸鏁版嵁
+    clearTable() {
+      this.checkDetailList = []
+    },
+    closeImplementDia() {
+      this.$refs.form.resetFields();
+      this.formDia = false
+      this.$emit('closeImplementDia')
+    },
+  }
+};
+</script>
+
+<style scoped></style>
diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSign.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSign.vue
new file mode 100644
index 0000000..1ea5e3a
--- /dev/null
+++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSign.vue
@@ -0,0 +1,202 @@
+<template>
+  <div>
+    <div class="search-background">
+      <span class="search-group">
+        <span style="width: 160px">鏃堕棿锛�</span>
+        <el-input v-model="searchForm.meetingDate" clearable size="small"></el-input>
+        <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button>
+        <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button>
+      </span>
+      <span class="search-group">
+        <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
+      </span>
+    </div>
+    <div class="table">
+      <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData"
+        :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination">
+      </limsTable>
+    </div>
+    <audit-meeting-sign-dia v-if="auditMeetingSignDia" ref="auditMeetingSignDia"
+      @closeYearDia="closeYearDia"></audit-meeting-sign-dia>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import AuditMeetingSignDia from './auditMeetingSignDia.vue';
+import {
+  pageInternalMeeting,
+  delInternalMeeting,
+  exportInternalMeeting,
+} from '@/api/cnas/systemManagement/internalAuditManagement.js'
+
+export default {
+  name: 'auditMeetingSign',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { AuditMeetingSignDia, limsTable },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        meetingDate: '',
+      },
+      tableColumn: [
+        {
+          label: '鏃堕棿',
+          prop: 'meetingDate',
+          minWidth: '100'
+        },
+        {
+          label: '涓绘寔浜�',
+          prop: 'compere',
+          minWidth: '100'
+        },
+        {
+          label: '鍦扮偣',
+          prop: 'place',
+          minWidth: '100'
+        },
+        {
+          label: '浼氳涓婚',
+          prop: 'subject',
+          minWidth: '100'
+        },
+        {
+          label: '鍙備細浜哄憳',
+          prop: 'participantName',
+          minWidth: '120'
+        },
+        {
+          dataType: 'action',
+          fixed: 'right',
+          minWidth: '220',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row)
+              }
+            },
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('edit', row);
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delPlan(row)
+              }
+            }
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        size: 20,
+        current: 1,
+        total: 0,
+      },
+      auditMeetingSignDia: false,
+    };
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList() {
+      const entity = this.searchForm
+      const page = this.page
+      this.tableLoading = true
+      pageInternalMeeting({ ...entity, ...page }).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.tableData = res.data.records
+        this.page.total = res.data.total
+      }).catch(err => {
+        console.log('err---', err);
+        this.tableLoading = false
+      })
+    },
+    // 鏂板锛岀紪杈戝脊妗�
+    openFormDia(type, row) {
+      this.auditMeetingSignDia = true
+      this.$nextTick(() => {
+        this.$refs.auditMeetingSignDia.openDia(type, row)
+      })
+    },
+    closeYearDia() {
+      this.auditMeetingSignDia = false
+      this.searchList()
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm() {
+      this.searchForm.meetingDate = '';
+      this.searchList()
+    },
+    // 鍒犻櫎
+    delPlan(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        delInternalMeeting({ meetingId: row.meetingId }).then(res => {
+          this.tableLoading = false
+          if (res.code === 201) return
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.searchList()
+        }).catch(err => {
+          this.tableLoading = false
+          console.log('err---', err);
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 瀵煎嚭
+    handleDown(row) {
+      exportInternalMeeting({ meetingId: row.meetingId }).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res], { type: 'application/msword' });
+        this.$download.saveAs(blob, '鍐呭浼氳绛惧埌' + '.docx');
+      })
+    },
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.searchList();
+    },
+  }
+};
+</script>
+
+<style scoped>
+.search-background {
+  width: 100%;
+  height: 60px;
+  line-height: 60px;
+  display: flex;
+  justify-content: space-between;
+}
+
+.search-group {
+  display: flex;
+  align-items: center;
+  margin: 0 20px;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSignDia.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSignDia.vue
new file mode 100644
index 0000000..e648ee2
--- /dev/null
+++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSignDia.vue
@@ -0,0 +1,183 @@
+<template>
+  <div>
+    <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false"
+      :visible.sync="formDia" title="鍐呭浼氳绛惧埌琛�" width="1000px" @close="closeYearDia">
+      <el-form ref="form" :model="form" :rules="rules" label-position="top" label-width="auto">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鏃堕棿" prop="meetingDate">
+              <el-date-picker v-model="form.meetingDate" clearable format="yyyy-MM-dd HH:mm:ss" placeholder="璇烽�夋嫨"
+                size="small" style="width: 100%" type="datetime" value-format="yyyy-MM-dd HH:mm:ss">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="涓绘寔浜�" prop="compere">
+              <el-input v-model="form.compere" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍦扮偣" prop="place">
+              <el-input v-model="form.place" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="浼氳涓婚" prop="subject">
+              <el-input v-model="form.subject" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鍙備細浜哄憳" prop="participant">
+              <el-select v-model="form.participant" clearable filterable multiple placeholder="璇烽�夋嫨" size="small"
+                style="width: 100%;">
+                <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeYearDia">鍙� 娑�</el-button>
+        <el-button :loading="loading" type="primary" @click="handleEdit">鎻� 浜�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  selectUserCondition,
+} from "@/api/business/inspectionTask.js";
+import {
+  getInternalMeetingOne,
+  addInternalMeeting,
+  updateInternalMeeting,
+} from '@/api/cnas/systemManagement/internalAuditManagement.js'
+export default {
+  name: 'auditMeetingSignDia',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      diaLoading: false,
+      loading: false,
+      form: {
+        meetingDate: '',
+        compere: '',
+        place: '',
+        subject: '',
+        participant: [],
+      },
+      rules: {
+        meetingDate: [{ required: true, message: '璇峰~鍐欎細璁椂闂�', trigger: 'blur' }],
+        compere: [{ required: true, message: '璇峰~鍐欎富鎸佷汉', trigger: 'blur' }],
+        place: [{ required: true, message: '璇峰~鍐欏湴鐐�', trigger: 'blur' }],
+        subject: [{ required: true, message: '璇峰~鍐欎細璁富棰�', trigger: 'blur' }],
+        participant: [{ required: true, message: '璇烽�夋嫨鍙傚姞浜哄憳', trigger: 'change' }],
+      },
+      operationType: '',
+      personList: []
+    };
+  },
+  mounted() {
+
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鎵撳紑寮规
+    openDia(type, row) {
+      this.formDia = true
+      this.operationType = type
+      this.getAuthorizedPerson()
+      if (type !== 'add') {
+        this.searchInfo(row)
+      }
+    },
+    // 鏌ヨ璇︽儏
+    searchInfo(row) {
+      this.diaLoading = true
+      getInternalMeetingOne({ meetingId: row.meetingId }).then(res => {
+        this.diaLoading = false
+        if (res.code === 201) return
+        this.form = res.data
+        this.form.participant = this.form.participant.split(',').map(Number)
+      }).catch(err => {
+        console.log(err)
+        this.diaLoading = false
+      })
+    },
+    // 鎻愪氦寮规鏁版嵁
+    handleEdit() {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.loading = true
+          const internalMeeting = this.HaveJson(this.form)
+          internalMeeting.participant = internalMeeting.participant.join(',')
+          if (this.operationType === 'add') {
+            addInternalMeeting(internalMeeting).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeYearDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          } else if (this.operationType === 'edit') {
+            updateInternalMeeting(internalMeeting).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeYearDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    closeYearDia() {
+      this.$refs.form.resetFields();
+      this.formDia = false
+      this.$emit('closeYearDia')
+    },
+    getAuthorizedPerson() {
+      selectUserCondition().then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.personList = data
+      })
+    },
+  }
+};
+</script>
+
+<style scoped>
+.table {
+  table-layout: fixed;
+  width: 100%;
+  margin-top: 10px;
+}
+
+.table td {
+  height: 34px;
+  width: 100px;
+  text-align: center;
+  font-size: 14px;
+  word-wrap: break-word;
+  white-space: normal;
+  padding: 4px;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/auditReport.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditReport.vue
new file mode 100644
index 0000000..1eb6332
--- /dev/null
+++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditReport.vue
@@ -0,0 +1,312 @@
+<template>
+  <div>
+    <div class="search-background">
+      <span class="search-group">
+        <span style="width: 160px">瀹℃牳鐩殑锛�</span>
+        <el-input v-model="searchForm.purposes" clearable size="small"></el-input>
+        <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button>
+        <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button>
+      </span>
+      <span class="search-group">
+        <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
+      </span>
+    </div>
+    <div class="table">
+      <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData"
+        :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination">
+      </limsTable>
+    </div>
+    <audit-report-dia v-if="auditReportDia" ref="auditReportDia"
+      @closeImplementDia="closeImplementDia"></audit-report-dia>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import AuditReportDia from './auditReportDia.vue';
+import {
+  delInternalReport,
+  pageInternalReport,
+  exportInternalReport,
+} from '@/api/cnas/systemManagement/internalAuditManagement.js'
+export default {
+  name: 'auditReport',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { AuditReportDia, limsTable },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        purposes: '',
+      },
+      tableColumn: [
+        {
+          label: '瀹℃牳鐩殑',
+          prop: 'purposes',
+        },
+        {
+          label: '瀹℃牳渚濇嵁',
+          prop: 'basis',
+        },
+        {
+          label: '瀹℃牳鏃ユ湡',
+          prop: 'reviewDate',
+        },
+        {
+          label: '瀹℃牳鏂规硶',
+          prop: 'method',
+        },
+        {
+          label: '瀹℃牳鑼冨洿',
+          prop: 'scope',
+        },
+        {
+          label: '瀹℃牳璐d换鑰�',
+          prop: 'responsible',
+        },
+        {
+          label: '瀹℃牳缁勯暱',
+          prop: 'leader',
+        },
+        {
+          label: '瀹℃牳鍛�',
+          prop: 'auditor',
+        },
+        {
+          label: '瀹℃牳缁勫垎宸ユ儏鍐�',
+          prop: 'division',
+        },
+        {
+          dataType: 'tag',
+          label: '瀹℃牳鐘舵��',
+          prop: 'examineStatus',
+          minWidth: '100',
+          formatData: (params) => {
+            if (params === 0) {
+              return '涓嶉�氳繃';
+            } else if (params === 1) {
+              return '閫氳繃';
+            } else {
+              return null;
+            }
+          },
+          formatType: (params) => {
+            if (params === 0) {
+              return 'danger';
+            } else if (params === 1) {
+              return 'success';
+            } else {
+              return null;
+            }
+          }
+        },
+        {
+          label: '瀹℃牳鍐呭',
+          prop: 'examineRemark',
+          minWidth: '140'
+        },
+        {
+          dataType: 'tag',
+          label: '璐ㄩ噺璐熻矗浜虹姸鎬�',
+          prop: 'qualityStatus',
+          minWidth: '100',
+          formatData: (params) => {
+            if (params === 0) {
+              return '涓嶉�氳繃';
+            } else if (params === 1) {
+              return '閫氳繃';
+            } else {
+              return null;
+            }
+          },
+          formatType: (params) => {
+            if (params === 0) {
+              return 'danger';
+            } else if (params === 1) {
+              return 'success';
+            } else {
+              return null;
+            }
+          }
+        },
+        {
+          label: '璐ㄩ噺璐熻矗浜烘剰瑙�',
+          prop: 'qualityRemark',
+          minWidth: '140'
+        },
+        {
+          dataType: 'action',
+          minWidth: '220',
+          fixed: 'right',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row)
+              }
+            },
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('edit', row);
+              },
+              disabled: (row) => {
+                if (row.examineStatus === 1 || row.examineStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            },
+            {
+              name: '瀹℃牳',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('examine', row);
+              },
+              disabled: (row) => {
+                if (row.examineStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            },
+            {
+              name: '鎰忚',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('ratify', row);
+              },
+              disabled: (row) => {
+                if (row.qualityStatus === 1 || row.examineStatus === 0 || row.examineStatus === null) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delPlan(row)
+              },
+              disabled: (row) => {
+                if (row.qualityStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            }
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        size: 20,
+        current: 1,
+        total: 0,
+      },
+      auditReportDia: false
+    };
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList() {
+      const entity = this.searchForm
+      const page = this.page
+      this.tableLoading = true
+      pageInternalReport({ ...entity, ...page }).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.tableData = res.data.records
+        this.page.total = res.data.total
+      }).catch(err => {
+        console.log('err---', err);
+        this.tableLoading = false
+      })
+    },
+    // 鏂板锛岀紪杈戯紝鎵瑰噯寮规
+    openFormDia(type, row) {
+      this.auditReportDia = true
+      this.$nextTick(() => {
+        this.$refs.auditReportDia.openDia(type, row)
+      })
+    },
+    closeImplementDia() {
+      this.auditReportDia = false
+      this.searchList()
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm() {
+      this.searchForm.purposes = '';
+      this.searchList()
+    },
+    // 鍒犻櫎
+    delPlan(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        delInternalReport({ reportId: row.reportId }).then(res => {
+          this.tableLoading = false
+          if (res.code === 201) return
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.searchList()
+        }).catch(err => {
+          this.tableLoading = false
+          console.log('err---', err);
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 瀵煎嚭
+    handleDown(row) {
+      exportInternalReport({ reportId: row.reportId }).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res], { type: 'application/msword' });
+        this.$download.saveAs(blob, '鍐呭鎶ュ憡' + '.docx');
+      })
+    },
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.searchList();
+    },
+  }
+};
+</script>
+
+<style scoped>
+.search-background {
+  width: 100%;
+  height: 60px;
+  line-height: 60px;
+  display: flex;
+  justify-content: space-between;
+}
+
+.search-group {
+  display: flex;
+  align-items: center;
+  margin: 0 20px;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/auditReportDia.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditReportDia.vue
new file mode 100644
index 0000000..b2dd1fa
--- /dev/null
+++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditReportDia.vue
@@ -0,0 +1,333 @@
+<template>
+  <div>
+    <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false"
+      :visible.sync="formDia" title="鍐呴儴瀹℃牳鎶ュ憡" width="80%" @close="closeImplementDia">
+      <el-form ref="form" :model="form" :rules="rules" label-position="top" label-width="auto">
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="瀹℃牳鐩殑" prop="purposes">
+              <el-input v-model="form.purposes" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="瀹℃牳渚濇嵁" prop="basis">
+              <el-input v-model="form.basis" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="瀹℃牳鏃ユ湡" prop="reviewDate">
+              <el-date-picker v-model="form.reviewDate"
+                :disabled="operationType === 'examine' || operationType === 'ratify'" clearable format="yyyy-MM-dd"
+                placeholder="閫夋嫨鏃ユ湡" size="small" style="width: 100%" type="date" value-format="yyyy-MM-dd">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="瀹℃牳鏂规硶" prop="method">
+              <el-input v-model="form.method" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="瀹℃牳鑼冨洿" prop="scope">
+              <el-input v-model="form.scope" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="瀹℃牳璐d换鑰�" prop="responsible">
+              <el-input v-model="form.responsible" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="瀹℃牳缁勯暱" prop="leader">
+              <el-input v-model="form.leader" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="瀹℃牳鍛�" prop="auditor">
+              <el-input v-model="form.auditor" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="瀹℃牳缁勫垎宸ユ儏鍐�" prop="division">
+              <el-input v-model="form.division" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="瀹℃牳姒傚喌" prop="overview">
+              <el-input v-model="form.overview" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                :rows="3" clearable size="small" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鍐呭缁勫涓績绠$悊浣撶郴鐨勭粨璁烘�ц瘎浠�" prop="conclusion">
+              <el-input v-model="form.conclusion" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                :rows="3" clearable size="small" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鏀硅繘鎰忚" prop="suggest">
+              <el-input v-model="form.suggest" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                :rows="3" clearable size="small" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="棰勮鍙楀鏍搁儴闂ㄥ畬鎴愮籂姝f帾鏂芥墍闇�鏃堕棿" prop="actionDate">
+              <el-input v-model="form.actionDate" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                :rows="3" clearable size="small" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="涓嶇鍚堟儏鍐垫暣鏀规�讳綋璺熻繘纭浜�" prop="followUser">
+              <el-input v-model="form.followUser" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                :rows="3" clearable size="small" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="涓嶇鍚堟儏鍐垫暣鏀规�讳綋璺熻繘纭璁板綍" prop="followRecord">
+              <el-input v-model="form.followRecord"
+                :disabled="operationType === 'examine' || operationType === 'ratify'" :rows="3" clearable size="small"
+                type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鏈姤鍛婂彂鏀捐寖鍥�" prop="reportScope">
+              <el-input v-model="form.reportScope" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                :rows="3" clearable size="small" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col v-if="operationType === 'ratify'" :span="24">
+            <el-form-item label="璐ㄩ噺璐熻矗浜烘剰瑙�" prop="qualityRemark">
+              <el-input v-model="form.qualityRemark" :rows="3" clearable size="small" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button v-if="operationType === 'examine'" :loading="loading" @click="examine(0)">涓嶉�氳繃</el-button>
+        <el-button v-if="operationType === 'examine'" :loading="loading" type="primary" @click="examine(1)">閫�
+          杩�</el-button>
+        <el-button v-if="operationType === 'ratify'" :loading="loading" @click="handleApproval(0)">涓嶆壒鍑�</el-button>
+        <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="handleApproval(1)">鎵�
+          鍑�</el-button>
+        <el-button v-if="operationType !== 'ratify' && operationType !== 'examine'" @click="closeImplementDia">鍙�
+          娑�</el-button>
+        <el-button v-if="operationType !== 'ratify' && operationType !== 'examine'" :loading="loading" type="primary"
+          @click="handleEdit">鎻� 浜�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="examineDialog" title="瀹℃牳" width="30%" @close="examineDialog = false">
+      <span>
+        瀹℃牳澶囨敞锛�
+        <el-input v-model="examineRemark" type="textarea"></el-input>
+      </span>
+      <span slot="footer" class="dialog-footer">
+        <el-button :loading="examineLoading" @click="examineDialog = false">鍙� 娑�</el-button>
+        <el-button :loading="examineLoading" type="primary" @click="handleExamine(0)">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="approvalDialog" title="鎵瑰噯" width="30%" @close="approvalDialog = false">
+      <span>
+        鎵瑰噯澶囨敞锛�
+        <el-input v-model="qualityRemark" type="textarea"></el-input>
+      </span>
+      <span slot="footer" class="dialog-footer">
+        <el-button :loading="approvalLoading" @click="approvalDialog = false">鍙� 娑�</el-button>
+        <el-button :loading="approvalLoading" type="primary" @click="handleApproval(0)">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getInternalReportOne,
+  addInternalReport,
+  updateInternalReport,
+  examineInternalReport,
+  qualityInternalReport,
+} from '@/api/cnas/systemManagement/internalAuditManagement.js'
+export default {
+  name: 'auditReportDia',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      diaLoading: false,
+      loading: false,
+      form: {
+        purposes: '',
+        basis: '',
+        reviewDate: '',
+        method: '',
+        scope: '',
+        responsible: '',
+        leader: '',
+        auditor: '',
+        division: '',
+        overview: '',
+        conclusion: '',
+        suggest: '',
+        actionDate: '',
+        followUser: '',
+        followRecord: '',
+        reportScope: '',
+        qualityRemark: '',
+      },
+      rules: {
+        purposes: [{ required: true, message: '璇峰~鍐欏鏍哥洰鐨�', trigger: 'blur' }],
+        basis: [{ required: true, message: '璇峰~鍐欏鏍镐緷鎹�', trigger: 'blur' }],
+        reviewDate: [{ required: true, message: '璇峰~鍐欏鏍告棩鏈�', trigger: 'change' }],
+        method: [{ required: true, message: '璇峰~鍐欏鏍告柟娉�', trigger: 'blur' }],
+        scope: [{ required: true, message: '璇峰~鍐欏鏍歌寖鍥�', trigger: 'blur' }],
+        responsible: [{ required: true, message: '璇峰~鍐欏鏍歌矗浠昏��', trigger: 'blur' }],
+        leader: [{ required: true, message: '璇峰~鍐欏鏍哥粍闀�', trigger: 'blur' }],
+        auditor: [{ required: true, message: '璇峰~鍐欏鏍稿憳', trigger: 'blur' }],
+        division: [{ required: true, message: '璇峰~鍐欏鏍哥粍鍒嗗伐鎯呭喌', trigger: 'blur' }],
+        overview: [{ required: true, message: '璇峰~鍐欏鏍告鍐�', trigger: 'blur' }],
+        conclusion: [{ required: true, message: '璇峰~鍐�', trigger: 'blur' }],
+        suggest: [{ required: true, message: '璇峰~鍐�', trigger: 'blur' }],
+        actionDate: [{ required: true, message: '璇峰~鍐�', trigger: 'blur' }],
+        followUser: [{ required: true, message: '璇峰~鍐�', trigger: 'blur' }],
+        followRecord: [{ required: true, message: '璇峰~鍐�', trigger: 'blur' }],
+        reportScope: [{ required: true, message: '璇峰~鍐�', trigger: 'blur' }],
+        qualityRemark: [{ required: true, message: '璇峰~鍐�', trigger: 'blur' }],
+      },
+      operationType: '',
+      approvalDialog: false,
+      approvalLoading: false,
+      examineDialog: false,
+      examineLoading: false,
+      qualityRemark: '',
+      examineRemark: '',
+    };
+  },
+  mounted() {
+
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鎵撳紑寮规
+    openDia(type, row) {
+      this.formDia = true
+      this.operationType = type
+      if (type !== 'add') {
+        this.searchInfo(row)
+      }
+    },
+    // 鏌ヨ璇︽儏
+    searchInfo(row) {
+      this.diaLoading = true
+      getInternalReportOne({ reportId: row.reportId }).then(res => {
+        this.diaLoading = false
+        if (res.code === 201) return
+        this.form = res.data
+      }).catch(err => {
+        console.log(err)
+        this.diaLoading = false
+      })
+    },
+    // 鎻愪氦寮规鏁版嵁
+    handleEdit() {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.loading = true
+          const internalReport = this.HaveJson(this.form)
+          if (this.operationType === 'add') {
+            addInternalReport(internalReport).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeImplementDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          } else if (this.operationType === 'edit') {
+            updateInternalReport(internalReport).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeImplementDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    // 瀹℃牳娴佺▼
+    examine(examineStatus) {
+      if (examineStatus === 0) {
+        this.examineDialog = true
+      } else {
+        this.handleExamine(examineStatus)
+      }
+    },
+    handleExamine(examineStatus) {
+      this.examineLoading = true
+      const internalReport = this.HaveJson(this.form)
+      internalReport.examineStatus = examineStatus
+      examineInternalReport(internalReport).then(res => {
+        if (res.code === 200) {
+          this.$message.success('鎻愪氦鎴愬姛锛�');
+          this.approvalDialog = false
+          this.closeImplementDia(this.departId);
+        }
+        this.examineLoading = false
+      }).catch(() => {
+        this.examineLoading = false
+      })
+    },
+    // 鎻愪氦瀹℃牳淇℃伅
+    handleApproval(qualityStatus) {
+      this.approvalLoading = true
+      const internalReport = this.HaveJson(this.form)
+      internalReport.qualityStatus = qualityStatus
+      qualityInternalReport(internalReport).then(res => {
+        if (res.code === 200) {
+          this.$message.success('鎻愪氦鎴愬姛锛�');
+          this.approvalDialog = false
+          this.closeImplementDia(this.departId);
+        }
+        this.approvalLoading = false
+      }).catch(() => {
+        this.approvalLoading = false
+      })
+    },
+    closeImplementDia() {
+      this.$refs.form.resetFields();
+      this.formDia = false
+      this.$emit('closeImplementDia')
+    },
+  }
+};
+</script>
+
+<style scoped>
+>>>.el-dialog {
+  margin: 6vh auto 50px !important;
+}
+
+>>>.el-dialog__body {
+  max-height: 42em;
+  overflow-y: auto;
+}
+
+>>>.is-required {
+  margin-bottom: 6px;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveAction.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveAction.vue
new file mode 100644
index 0000000..86acfd3
--- /dev/null
+++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveAction.vue
@@ -0,0 +1,182 @@
+<template>
+  <div>
+    <div class="search-background">
+      <span class="search-group">
+        <span style="width: 200px">涓嶅悎鏍兼弿杩帮細</span>
+        <el-input v-model="searchForm.raiseResult" clearable size="small"></el-input>
+        <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button>
+        <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button>
+      </span>
+      <span class="search-group">
+        <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
+      </span>
+    </div>
+    <div class="table">
+      <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData"
+        :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination">
+      </limsTable>
+    </div>
+    <corrective-action-d-ia v-if="correctiveActionDIa" ref="correctiveActionDIa"
+      @closeRectifyDia="closeRectifyDia"></corrective-action-d-ia>
+    <view-test-record v-if="viewTestRecordDialog" ref="viewTestRecordDialog"></view-test-record>
+  </div>
+</template>
+
+<script>
+import TableCard from '@/components/TableCard/index.vue';
+import limsTable from "@/components/Table/lims-table.vue";
+import CorrectiveActionDIa from './correctiveActionDIa.vue';
+import ViewTestRecord from './ViewTestRecord.vue';
+import {
+  pageInternalCorrect,
+  exportInternalCorrect,
+} from '@/api/cnas/systemManagement/internalAuditManagement.js'
+
+export default {
+  name: 'correctiveAction',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { CorrectiveActionDIa, limsTable, TableCard, ViewTestRecord },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        raiseResult: '',
+      },
+      tableColumn: [
+        {
+          label: '涓嶅悎鏍兼垨鍋忕浜嬪疄鐨勬弿杩�',
+          prop: 'raiseResult',
+          minWidth: '100'
+        },
+        {
+          label: '鍘熷洜鍒嗘瀽',
+          prop: 'causeResult',
+          minWidth: '100'
+        },
+        {
+          label: '绾犳鎺柦',
+          prop: 'correctResult',
+          minWidth: '100'
+        },
+        {
+          label: '瀹炴柦楠岃瘉缁撴灉',
+          prop: 'validationResult',
+          minWidth: '100'
+        },
+        {
+          dataType: 'action',
+          minWidth: '220',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row)
+              }
+            },
+            {
+              name: '绾犳',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('rectify', row);
+              },
+            },
+            {
+              name: '鏌ョ湅闄勪欢',
+              type: 'text',
+              clickFun: (row) => {
+                this.viewFiles(row);
+              },
+            },
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        size: 20,
+        current: 1,
+        total: 0,
+      },
+      correctiveActionDIa: false,
+      viewTestRecordDialog: false,
+    };
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList() {
+      const entity = {
+        raiseResult: this.searchForm.raiseResult,
+      }
+      const page = this.page
+      this.tableLoading = true
+      pageInternalCorrect({ ...entity, ...page }).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.tableData = res.data.records
+        this.page.total = res.data.total
+      }).catch(err => {
+        console.log('err---', err);
+        this.tableLoading = false
+      })
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm() {
+      this.searchForm.raiseResult = '';
+      this.searchList()
+    },
+    // 鏌ョ湅闄勪欢
+    viewFiles(row) {
+      this.viewTestRecordDialog = true
+      this.$nextTick(() => {
+        this.$refs.viewTestRecordDialog.openDia(row)
+      })
+    },
+    openFormDia(type, row) {
+      this.correctiveActionDIa = true
+      this.$nextTick(() => {
+        this.$refs.correctiveActionDIa.openDia(type, row)
+      })
+    },
+    // 瀵煎嚭
+    handleDown(row) {
+      exportInternalCorrect({ correctId: row.correctId }).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res], { type: 'application/msword' });
+        this.$download.saveAs(blob, '鍐呭绾犳鎺柦' + '.docx');
+      })
+    },
+    closeRectifyDia() {
+      this.correctiveActionDIa = false
+      this.searchList()
+    },
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.searchList();
+    },
+  }
+};
+</script>
+
+<style scoped>
+.search-background {
+  width: 100%;
+  height: 60px;
+  line-height: 60px;
+  display: flex;
+  justify-content: space-between;
+}
+
+.search-group {
+  display: flex;
+  align-items: center;
+  margin: 0 20px;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveActionDIa.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveActionDIa.vue
new file mode 100644
index 0000000..267fa52
--- /dev/null
+++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveActionDIa.vue
@@ -0,0 +1,409 @@
+<template>
+  <div>
+    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="formDia" title="绾犳鎺柦澶勭悊鍗�"
+      width="60%" @close="closeRectifyDia">
+      <el-steps :active="currentStep" align-center finish-status="success">
+        <el-step title="涓嶅悎鏍兼垨鍋忕浜嬪疄鐨勬弿杩�" @click.native="setStep(0)"></el-step>
+        <el-step title="鍘熷洜鍒嗘瀽" @click.native="setStep(1)"></el-step>
+        <el-step title="绾犳鎺柦" @click.native="setStep(2)"></el-step>
+        <el-step title="瀹炴柦楠岃瘉缁撴灉" @click.native="setStep(3)"></el-step>
+      </el-steps>
+      <div>
+        <table border="1" cellspacing="10" class="tables">
+          <tr v-if="showStep === 0">
+            <td class="td-title">
+              <p><span class="required-span">* </span>涓嶅悎鏍兼垨鍋忕浜嬪疄鐨勬弿杩帮細</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <el-input v-if="showStep === 0 && currentStep === 0" v-model="form.raiseResult" :rows="4"
+                placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea">
+              </el-input>
+              <span v-if="showStep === 0 && currentStep !== 0" class="td-info1"> {{ form.raiseResult }}</span>
+            </td>
+          </tr>
+          <tr v-if="showStep === 0">
+            <td v-if="currentStep === 0" class="td-title">
+              <p><span class="required-span">* </span>璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉锛�</p>
+            </td>
+            <td v-if="currentStep === 0" class="td-info" colspan="3">
+              <el-select v-model="form.causeUserId" clearable filterable placeholder="璇烽�夋嫨" size="small">
+                <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </td>
+          </tr>
+          <tr v-if="showStep === 0 && currentStep !== 0">
+            <td class="td-title">
+              <p>鎻愬嚭浜猴細</p>
+            </td>
+            <td class="td-info">
+              {{ form.raiseUserName }}
+            </td>
+            <td class="td-title">
+              <p>鎻愬嚭閮ㄩ棬锛�</p>
+            </td>
+            <td class="td-info">
+              {{ form.raiseDepartment }}
+            </td>
+          </tr>
+          <tr v-if="showStep === 0 && currentStep !== 0">
+            <td class="td-title">
+              <p>鏃ユ湡锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              {{ form.raiseTime }}
+            </td>
+          </tr>
+          <tr v-if="showStep === 1">
+            <td class="td-title">
+              <p><span class="required-span">* </span>鍘熷洜鍒嗘瀽锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <el-input v-if="showStep === 1 && currentStep === 1" v-model="form.causeResult" :rows="5"
+                placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea">
+              </el-input>
+              <span v-if="showStep === 1 && currentStep !== 1" class="td-info1"> {{ form.causeResult }}</span>
+            </td>
+          </tr>
+          <tr v-if="showStep === 1 && currentStep !== 1">
+            <td class="td-title">
+              <p>鍘熷洜鍒嗘瀽浜猴細</p>
+            </td>
+            <td class="td-info">
+              {{ form.causeUserName }}
+            </td>
+            <td class="td-title">
+              <p>璐d换閮ㄩ棬锛�</p>
+            </td>
+            <td class="td-info">
+              {{ form.causeDepartment }}
+            </td>
+          </tr>
+          <tr v-if="showStep === 1 && currentStep !== 1">
+            <td class="td-title">
+              <p>鍘熷洜鍒嗘瀽鏃ユ湡锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              {{ form.causeTime }}
+            </td>
+          </tr>
+          <tr v-if="showStep === 1">
+            <td v-if="currentStep === 1" class="td-title">
+              <p><span class="required-span">* </span>璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉锛�</p>
+            </td>
+            <td v-if="currentStep === 1" class="td-info" colspan="3">
+              <el-select v-model="form.correctUserId" clearable filterable placeholder="璇烽�夋嫨" size="small">
+                <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </td>
+          </tr>
+          <tr v-if="showStep === 2">
+            <td class="td-title">
+              <p><span class="required-span">* </span>绾犳鎺柦锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <el-input v-if="showStep === 2 && currentStep === 2" v-model="form.correctResult" :rows="5"
+                placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea">
+              </el-input>
+              <span v-if="showStep === 2 && currentStep !== 2" class="td-info1"> {{ form.correctResult }}</span>
+            </td>
+          </tr>
+          <tr v-if="showStep === 2">
+            <td class="td-title">
+              <p>鎻愬嚭瑕佹眰閮ㄩ棬纭锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <el-input v-if="showStep === 2 && currentStep === 2" v-model="form.raiseDepartmentAffirm" :rows="5"
+                placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea">
+              </el-input>
+              <span v-if="showStep === 2 && currentStep !== 2" class="td-info1"> {{ form.raiseDepartmentAffirm }}</span>
+            </td>
+          </tr>
+          <tr v-if="showStep === 2 && currentStep !== 2">
+            <td class="td-title">
+              <p>绾犳浜猴細</p>
+            </td>
+            <td class="td-info">
+              {{ form.correctUserName }}
+            </td>
+            <td class="td-title">
+              <p>璐d换閮ㄩ棬锛�</p>
+            </td>
+            <td class="td-info">
+              {{ form.correctDepartment }}
+            </td>
+          </tr>
+          <tr v-if="showStep === 2 && currentStep !== 2">
+            <td class="td-title">
+              <p>绾犳鏃ユ湡锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              {{ form.correctTime }}
+            </td>
+          </tr>
+          <tr v-if="showStep === 2">
+            <td v-if="currentStep === 2" class="td-title">
+              <p><span class="required-span">* </span>璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉锛�</p>
+            </td>
+            <td v-if="currentStep === 2" class="td-info" colspan="3">
+              <el-select v-model="form.validationUserId" clearable filterable placeholder="璇烽�夋嫨" size="small">
+                <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </td>
+          </tr>
+          <tr v-if="showStep === 3">
+            <td class="td-title">
+              <p><span class="required-span">* </span>瀹炴柦楠岃瘉缁撴灉锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <el-input v-if="showStep === 3 && currentStep === 3" v-model="form.validationResult" :rows="5"
+                placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea">
+              </el-input>
+              <span v-if="showStep === 3 && currentStep !== 3" class="td-info1"> {{ form.validationResult }}</span>
+            </td>
+          </tr>
+          <tr v-if="showStep === 3 && currentStep !== 3">
+            <td class="td-title">
+              <p>楠岃瘉浜猴細</p>
+            </td>
+            <td class="td-info">
+              {{ form.validationUserName }}
+            </td>
+            <td class="td-title">
+              <p>璐d换閮ㄩ棬锛�</p>
+            </td>
+            <td class="td-info">
+              {{ form.validationDepartment }}
+            </td>
+          </tr>
+          <tr v-if="showStep === 3 && currentStep !== 3">
+            <td class="td-title">
+              <p>楠岃瘉鏃ユ湡锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              {{ form.validationTime }}
+            </td>
+          </tr>
+        </table>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeRectifyDia">鍙� 娑�</el-button>
+        <el-button v-if="currentStep !== 4" :loading="editLoad" type="primary" @click="handleEdit">鎻� 浜�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getInternalCorrect,
+  addInternalCorrect,
+} from '@/api/cnas/systemManagement/internalAuditManagement.js'
+import {
+  selectUserCondition,
+} from "@/api/business/inspectionTask.js";
+export default {
+  name: 'correctiveActionDIa',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      currentStep: 0,
+      showStep: 0,
+      form: {
+        superviseDetailsId: '',
+        raiseResult: '',
+        vdeRaiseResult: '',
+        causeUserId: '',
+        raiseUserName: '',
+        raiseDepartment: '',
+        raiseTime: '',
+        causeResult: '',
+        causeUserName: '',
+        causeDepartment: '',
+        causeTime: '',
+        correctUserId: '',
+        correctResult: '',
+        raiseDepartmentAffirm: '',
+        correctUserName: '',
+        correctDepartment: '',
+        correctTime: '',
+        validationUserId: '',
+        validationResult: '',
+        validationUserName: '',
+        validationDepartment: '',
+        validationTime: '',
+      },
+      editLoad: false,
+      personList: [],
+      supervisedUserList: [],
+    };
+  },
+  mounted() {
+
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    openDia(type, row) {
+      this.formDia = true
+      if (type !== 'add') {
+        this.searchInfo(row)
+        this.form.superviseDetailsId = row.superviseDetailsId
+      }
+      this.getAuthorizedPerson() // 鑾峰彇浜哄憳鍒楄〃
+      this.getSupervisedUserList() // 鑾峰彇褰撳墠閮ㄩ棬浜哄憳
+    },
+    // 鏌ヨ鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
+    searchInfo(row) {
+      this.form.qualityMonitorDetailsId = row.qualityMonitorDetailsId
+      getInternalCorrect({ correctId: row.correctId }).then(res => {
+        if (res.code === 201) return
+        if (res.data.superviseDetailsCorrectId === null) {
+          this.showStep = 0
+          this.currentStep = 0
+        } else {
+          this.form = res.data
+          if (res.data.isFinish === 0) {
+            if (res.data.causeUserId) {
+              this.showStep = 1
+              this.currentStep = 1
+            }
+            if (res.data.correctUserId) {
+              this.showStep = 2
+              this.currentStep = 2
+            }
+            if (res.data.validationUserId) {
+              this.showStep = 3
+              this.currentStep = 3
+            }
+          } else {
+            this.currentStep = 4
+            this.showStep = 3
+          }
+        }
+      }).catch(err => {
+        console.log('err---', err);
+      })
+    },
+    // 鎻愪氦
+    handleEdit() {
+      if (this.currentStep === 0) {
+        if (!this.form.raiseResult) {
+          this.$message.warning('璇峰~鍐欎笉鍚堟牸鎻忚堪')
+          return
+        }
+        if (!this.form.causeUserId) {
+          this.$message.warning('璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉')
+          return
+        }
+      } else if (this.currentStep === 1) {
+        if (!this.form.causeResult) {
+          this.$message.warning('璇峰~鍐欏師鍥犲垎鏋�')
+          return
+        }
+        if (!this.form.correctUserId) {
+          this.$message.warning('璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉')
+          return
+        }
+      } else if (this.currentStep === 2) {
+        if (!this.form.correctResult) {
+          this.$message.warning('璇峰~鍐欑籂姝f帾鏂�')
+          return
+        }
+        if (!this.form.validationUserId) {
+          this.$message.warning('璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉')
+          return
+        }
+      } else if (this.currentStep === 3) {
+        if (!this.form.validationResult) {
+          this.$message.warning('璇峰~鍐欏疄鏂介獙璇佺粨鏋�')
+          return
+        }
+      }
+      this.editLoad = true
+      this.form.supervisedTime = ''
+      this.form.flowType = this.currentStep
+      addInternalCorrect(this.form).then(res => {
+        this.editLoad = false
+        if (res.code === 201) return
+        this.$message.success('鎻愪氦鎴愬姛')
+        this.closeRectifyDia()
+      }).catch(err => {
+        console.log('err---', err);
+        this.editLoad = false
+      })
+    },
+    // 鍏抽棴寮规
+    closeRectifyDia() {
+      this.formDia = false
+      this.$emit('closeRectifyDia')
+    },
+    setStep(step) {
+      this.showStep = step
+    },
+    getAuthorizedPerson() {
+      selectUserCondition().then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.personList = data
+      })
+    },
+    getSupervisedUserList() {
+      selectUserCondition({ type: 2 }).then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.supervisedUserList = data
+      })
+    },
+  }
+};
+</script>
+
+<style scoped>
+>>>.el-dialog {
+  margin: 10vh auto 50px !important;
+}
+
+.tables {
+  table-layout: fixed;
+  width: 100%;
+  margin-top: 10px;
+}
+
+.td-title {
+  height: 40px;
+  width: 170px;
+  text-align: center;
+  font-size: 14px;
+  word-wrap: break-word;
+  white-space: normal;
+  padding: 6px;
+}
+
+.td-info {
+  padding: 6px;
+}
+
+.td-info1 {
+  display: inline-block;
+  width: 100%;
+  text-align: left;
+  font-size: 14px;
+  word-wrap: break-word;
+  white-space: normal;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/implementPlanDia.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/implementPlanDia.vue
new file mode 100644
index 0000000..5a94ebe
--- /dev/null
+++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/implementPlanDia.vue
@@ -0,0 +1,307 @@
+<template>
+  <div>
+    <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false"
+      :visible.sync="formDia" title="鍐呴儴瀹℃牳瀹炴柦璁″垝" width="80%" @close="closeImplementDia">
+      <el-form ref="form" :model="form" :rules="rules" label-width="auto">
+        <el-col :span="24">
+          <el-form-item label="瀹℃牳鐩殑" prop="purposes">
+            <el-input v-model="form.purposes" :disabled="operationType === 'ratify'" clearable size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="瀹℃牳鎬ц川" prop="nature">
+            <el-input v-model="form.nature" :disabled="operationType === 'ratify'" clearable size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="瀹℃牳鑼冨洿" prop="scope">
+            <el-input v-model="form.scope" :disabled="operationType === 'ratify'" clearable size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="瀹℃牳渚濇嵁" prop="basis">
+            <el-input v-model="form.basis" :disabled="operationType === 'ratify'" clearable size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="瀹℃牳缁勯暱" prop="teamLeader">
+            <el-input v-model="form.teamLeader" :disabled="operationType === 'ratify'" clearable
+              size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鍐呭鍛�" prop="internalAuditor">
+            <el-input v-model="form.internalAuditor" :disabled="operationType === 'ratify'" clearable
+              size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="瀹℃牳鏃ユ湡" prop="reviewDate">
+            <el-date-picker v-model="form.reviewDate" :disabled="operationType === 'ratify'" clearable
+              format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small" style="width: 100%" type="date"
+              value-format="yyyy-MM-dd">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="瀹℃牳鏂规硶" prop="auditMethod">
+            <el-input v-model="form.auditMethod" :disabled="operationType === 'ratify'" clearable
+              size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="棣栨浼氳鏃堕棿" prop="firstMeetingTime">
+            <el-date-picker v-model="form.firstMeetingTime" :disabled="operationType === 'ratify'" clearable
+              format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small" style="width: 100%" type="date"
+              value-format="yyyy-MM-dd">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鏈浼氳鏃堕棿" prop="lastMeetingTime">
+            <el-date-picker v-model="form.lastMeetingTime" :disabled="operationType === 'ratify'" clearable
+              format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small" style="width: 100%" type="date"
+              value-format="yyyy-MM-dd">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="瀹℃牳鎶ュ憡鎻愪氦鏃ユ湡" prop="submitTime">
+            <el-date-picker v-model="form.submitTime" :disabled="operationType === 'ratify'" clearable
+              format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small" style="width: 100%" type="date"
+              value-format="yyyy-MM-dd">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="瀹℃牳鎶ュ憡鍙戞斁鑼冨洿" prop="submitScope">
+            <el-input v-model="form.submitScope" :disabled="operationType === 'ratify'" clearable
+              size="small"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-form>
+      <div v-if="operationType !== 'ratify'" style="text-align: right;margin-bottom: 10px">
+        <el-button size="small" type="primary" @click="addRow">娣诲姞</el-button>
+        <el-button size="small" type="danger" @click="clearTable">娓呯┖</el-button>
+      </div>
+      <el-table :data="implementDetailList" border height="300" style="width: 100%">
+        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+        <el-table-column header-align="center" label="鏃堕棿" prop="implement">
+          <template slot-scope="{row}">
+            <el-input v-model="row.implement" :disabled="operationType === 'ratify'" size="small" />
+          </template>
+        </el-table-column>
+        <el-table-column header-align="center" label="鍙楀鏍搁儴闂�" prop="department">
+          <template slot-scope="{row}">
+            <el-input v-model="row.department" :disabled="operationType === 'ratify'" size="small" />
+          </template>
+        </el-table-column>
+        <el-table-column header-align="center" label="璐d换浜�" prop="responsible">
+          <template slot-scope="{row}">
+            <el-input v-model="row.responsible" :disabled="operationType === 'ratify'" size="small" />
+          </template>
+        </el-table-column>
+        <el-table-column header-align="center" label="瀹℃牳鍛�" prop="auditor" width="180">
+          <template slot-scope="{row}">
+            <el-input v-model="row.auditor" :disabled="operationType === 'ratify'" size="small" />
+          </template>
+        </el-table-column>
+        <el-table-column header-align="center" label="瀹℃牳鍐呭" prop="reviewContent" width="180">
+          <template slot-scope="{row}">
+            <el-input v-model="row.reviewContent" :disabled="operationType === 'ratify'" size="small" />
+          </template>
+        </el-table-column>
+      </el-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button v-if="operationType === 'ratify'" :loading="loading" @click="ratify(0)">涓嶆壒鍑�</el-button>
+        <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="ratify(1)">鎵�
+          鍑�</el-button>
+        <el-button v-if="operationType !== 'ratify'" @click="closeImplementDia">鍙� 娑�</el-button>
+        <el-button v-if="operationType !== 'ratify'" :loading="loading" type="primary" @click="handleEdit">鎻�
+          浜�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="approvalDialog" title="鎵瑰噯" width="30%" @close="approvalDialog = false">
+      <span>
+        鎵瑰噯澶囨敞锛�
+        <el-input v-model="ratifyRemark" type="textarea"></el-input>
+      </span>
+      <span slot="footer" class="dialog-footer">
+        <el-button :loading="approvalLoading" @click="approvalDialog = false">鍙� 娑�</el-button>
+        <el-button :loading="approvalLoading" type="primary" @click="handleApproval(0)">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getInternalImplementOne,
+  addInternalImplement,
+  updateInternalImplement,
+  ratifyInternalImplement,
+} from '@/api/cnas/systemManagement/internalAuditManagement.js'
+export default {
+  name: 'implementPlanDia',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      diaLoading: false,
+      loading: false,
+      form: {
+        purposes: '',
+        nature: '',
+        scope: '',
+        basis: '',
+        teamLeader: '',
+        internalAuditor: '',
+        reviewDate: '',
+        auditMethod: '',
+        firstMeetingTime: '',
+        lastMeetingTime: '',
+        submitTime: '',
+        submitScope: '',
+      },
+      rules: {
+        purposes: [{ required: true, message: '璇峰~鍐欏鏍哥洰鐨�', trigger: 'blur' }],
+        nature: [{ required: true, message: '璇峰~鍐欏鏍告�ц川', trigger: 'blur' }],
+        scope: [{ required: true, message: '璇峰~鍐欏鏍歌寖鍥�', trigger: 'blur' }],
+        basis: [{ required: true, message: '璇峰~鍐欏鏍镐緷鎹�', trigger: 'blur' }],
+        teamLeader: [{ required: true, message: '璇峰~鍐欏鏍哥粍闀�', trigger: 'blur' }],
+        internalAuditor: [{ required: true, message: '璇峰~鍐欏唴瀹″憳', trigger: 'blur' }],
+        reviewDate: [{ required: true, message: '璇峰~鍐欏鏍告椂闂�', trigger: 'blur' }],
+        auditMethod: [{ required: true, message: '璇峰~鍐欏鏍告柟娉�', trigger: 'blur' }],
+        firstMeetingTime: [{ required: true, message: '璇峰~鍐欓娆′細璁椂闂�', trigger: 'blur' }],
+        lastMeetingTime: [{ required: true, message: '璇峰~鍐欐湯娆′細璁椂闂�', trigger: 'blur' }],
+        submitTime: [{ required: true, message: '璇峰~鍐欏鏍告姤鍛婃彁浜ゆ棩鏈�', trigger: 'blur' }],
+        submitScope: [{ required: true, message: '璇峰~鍐欏鏍告姤鍛婂彂鏀捐寖鍥�', trigger: 'blur' }],
+      },
+      implementDetailList: [],
+      operationType: '',
+      approvalDialog: false,
+      approvalLoading: false,
+      ratifyRemark: '',
+    };
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鎵撳紑寮规
+    openDia(type, row) {
+      this.formDia = true
+      this.operationType = type
+      if (type !== 'add') {
+        this.searchInfo(row)
+      }
+    },
+    // 鏌ヨ璇︽儏
+    searchInfo(row) {
+      this.diaLoading = true
+      getInternalImplementOne({ implementId: row.implementId }).then(res => {
+        this.diaLoading = false
+        if (res.code === 201) return
+        this.form = res.data
+        this.implementDetailList = this.form.implementDetailList
+      }).catch(err => {
+        console.log(err)
+        this.diaLoading = false
+      })
+    },
+    // 鎻愪氦寮规鏁版嵁
+    handleEdit() {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          if (this.implementDetailList.length === 0) {
+            this.$message.warning('璇锋坊鍔犺〃鏍兼暟鎹�')
+            return
+          }
+          this.loading = true
+          const internalImplementDto = this.HaveJson(this.form)
+          internalImplementDto.implementDetailList = this.HaveJson(this.implementDetailList)
+          if (this.operationType === 'add') {
+            addInternalImplement(internalImplementDto).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeImplementDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          } else if (this.operationType === 'edit') {
+            updateInternalImplement(internalImplementDto).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeImplementDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    ratify(ratifyStatus) {
+      // 涓嶆壒鍑嗛渶瑕佸~鍐欐壒鍑嗗唴瀹�
+      if (ratifyStatus === 0) {
+        this.approvalDialog = true
+      } else {
+        this.handleApproval(ratifyStatus)
+      }
+    },
+    // 鎻愪氦鎵瑰噯淇℃伅
+    handleApproval(ratifyStatus) {
+      this.approvalLoading = true
+      const internalImplementDto = this.HaveJson(this.form)
+      internalImplementDto.ratifyStatus = ratifyStatus
+      internalImplementDto.ratifyRemark = ratifyStatus === 0 ? this.ratifyRemark : ''
+      ratifyInternalImplement(internalImplementDto).then(res => {
+        if (res.code === 200) {
+          this.$message.success('鎻愪氦鎴愬姛锛�');
+          this.approvalDialog = false
+          this.closeImplementDia(this.departId);
+        }
+        this.approvalLoading = false
+      }).catch(() => {
+        this.approvalLoading = false
+      })
+    },
+    // 澧炲姞琛ㄦ牸琛屾暟鎹�
+    addRow() {
+      this.implementDetailList.push({
+        implement: '',
+        department: '',
+        responsible: '',
+        auditor: '',
+        reviewContent: '',
+      })
+    },
+    // 娓呯┖琛ㄦ牸鏁版嵁
+    clearTable() {
+      this.implementDetailList = []
+    },
+    closeImplementDia() {
+      this.$refs.form.resetFields();
+      this.formDia = false
+      this.$emit('closeImplementDia')
+    },
+  }
+};
+</script>
+
+<style scoped>
+>>>.el-dialog {
+  margin: 10vh auto 50px !important;
+}
+
+>>>.el-dialog__body {
+  max-height: 38em;
+  overflow-y: auto;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/implementationPlan.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/implementationPlan.vue
new file mode 100644
index 0000000..92f721f
--- /dev/null
+++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/implementationPlan.vue
@@ -0,0 +1,292 @@
+<template>
+  <div>
+    <div class="search-background">
+      <span class="search-group">
+        <span style="width: 160px">瀹℃牳鐩殑锛�</span>
+        <el-input v-model="searchForm.purposes" clearable size="small"></el-input>
+        <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button>
+        <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button>
+      </span>
+      <span class="search-group">
+        <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
+      </span>
+    </div>
+    <div class="table">
+      <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData"
+        :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" @pagination="pagination" :page="page">
+      </limsTable>
+    </div>
+    <implement-plan-dia v-if="implementPlanDia" ref="implementPlanDia"
+      @closeImplementDia="closeImplementDia"></implement-plan-dia>
+  </div>
+</template>
+
+<script>
+import {
+  pageInternalImplement,
+  delInternalImplement,
+  exportInternalImplement,
+} from '@/api/cnas/systemManagement/internalAuditManagement.js'
+import limsTable from "@/components/Table/lims-table.vue";
+import ImplementPlanDia from './implementPlanDia.vue';
+
+export default {
+  name: 'implementationPlan',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { ImplementPlanDia, limsTable },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        purposes: '',
+      },
+      tableColumn: [
+        {
+          label: '瀹℃牳鐩殑',
+          prop: 'purposes',
+          minWidth: '100'
+        },
+        {
+          label: '瀹℃牳鎬ц川',
+          prop: 'nature',
+          minWidth: '100'
+        },
+        {
+          label: '瀹℃牳鑼冨洿',
+          prop: 'scope',
+          minWidth: '100'
+        },
+        {
+          label: '瀹℃牳渚濇嵁',
+          prop: 'basis',
+          minWidth: '100'
+        },
+        {
+          label: '瀹℃牳缁勯暱',
+          prop: 'teamLeader',
+          minWidth: '100'
+        },
+        {
+          label: '鍐呭鍛�',
+          prop: 'internalAuditor',
+          minWidth: '100',
+        },
+        {
+          label: '瀹℃牳鏃ユ湡',
+          prop: 'reviewDate',
+          minWidth: '100',
+        },
+        {
+          label: '瀹℃牳鏂规硶',
+          prop: 'auditMethod',
+          minWidth: '100',
+        },
+        {
+          label: '棣栨浼氳鏃堕棿',
+          prop: 'firstMeetingTime',
+          minWidth: '100',
+        },
+        {
+          label: '鏈浼氳鏃堕棿',
+          prop: 'lastMeetingTime',
+          minWidth: '100',
+        },
+        {
+          label: '瀹℃牳鎶ュ憡鎻愪氦鏃ユ湡',
+          prop: 'submitTime',
+          minWidth: '100',
+        },
+        {
+          label: '瀹℃牳鎶ュ憡鍙戞斁鑼冨洿',
+          prop: 'submitScope',
+          minWidth: '100',
+        }, {
+          dataType: 'tag',
+          label: '鎵瑰噯鐘舵��',
+          prop: 'ratifyStatus',
+          minWidth: '100',
+          formatData: (params) => {
+            if (params === 0) {
+              return '涓嶆壒鍑�';
+            } else if (params === 1) {
+              return '鎵瑰噯';
+            } else {
+              return null;
+            }
+          },
+          formatType: (params) => {
+            if (params === 0) {
+              return 'danger';
+            } else if (params === 1) {
+              return 'success';
+            } else {
+              return null;
+            }
+          }
+        }, {
+          label: '鎵瑰噯鍐呭',
+          prop: 'ratifyRemark',
+          minWidth: '100'
+        },
+        {
+          dataType: 'action',
+          minWidth: '220',
+          fixed: 'right',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row)
+              }
+            },
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('edit', row);
+              },
+              disabled: (row) => {
+                if (row.ratifyStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            },
+            {
+              name: '鎵瑰噯',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('ratify', row);
+              },
+              disabled: (row) => {
+                if (row.ratifyStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delPlan(row)
+              },
+              disabled: (row) => {
+                if (row.ratifyStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            }
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        size: 20,
+        current: 1,
+        total: 0,
+      },
+      implementPlanDia: false,
+    };
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList() {
+      const entity = this.searchForm
+      const page = this.page
+      this.tableLoading = true
+      pageInternalImplement({ ...entity, ...page }).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.tableData = res.data.records
+        this.page.total = res.data.total
+      }).catch(err => {
+        console.log('err---', err);
+        this.tableLoading = false
+      })
+    },
+    // 鏂板锛岀紪杈戯紝鎵瑰噯寮规
+    openFormDia(type, row) {
+      this.implementPlanDia = true
+      this.$nextTick(() => {
+        this.$refs.implementPlanDia.openDia(type, row)
+      })
+    },
+    closeImplementDia() {
+      this.implementPlanDia = false
+      this.searchList()
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm() {
+      this.searchForm.purposes = '';
+      this.searchList()
+    },
+    // 鍒犻櫎
+    delPlan(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        delInternalImplement({ implementId: row.implementId }).then(res => {
+          this.tableLoading = false
+          if (res.code === 201) return
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.searchList()
+        }).catch(err => {
+          this.tableLoading = false
+          console.log('err---', err);
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 瀵煎嚭
+    handleDown(row) {
+      exportInternalImplement({ implementId: row.implementId }).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res], { type: 'application/msword' });
+        this.$download.saveAs(blob, '鍐呭瀹炴柦璁″垝' + '.docx');
+      })
+    },
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.searchList();
+    },
+  }
+};
+</script>
+
+<style scoped>
+.search-background {
+  width: 100%;
+  height: 60px;
+  line-height: 60px;
+  display: flex;
+  justify-content: space-between;
+}
+
+.search-group {
+  display: flex;
+  align-items: center;
+  margin: 0 20px;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlan.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlan.vue
new file mode 100644
index 0000000..77b898f
--- /dev/null
+++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlan.vue
@@ -0,0 +1,314 @@
+<template>
+  <div>
+    <div class="search-background">
+      <span class="search-group">
+        <span style="width: 160px">鍐呭鐩殑锛�</span>
+        <el-input v-model="searchForm.purpose" clearable size="small"></el-input>
+        <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button>
+        <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button>
+      </span>
+      <span class="search-group">
+        <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
+      </span>
+    </div>
+    <div class="table">
+      <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData"
+        :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" @pagination="pagination" :page="page">
+      </limsTable>
+    </div>
+    <year-plan-dia v-if="yearPlanDia" ref="yearPlanDia" @closeYearDia="closeYearDia"></year-plan-dia>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import YearPlanDia from './yearPlanDia.vue';
+import {
+  pageInternalPlan,
+  delInternalPlan,
+  exportInternalPlan,
+} from '@/api/cnas/systemManagement/internalAuditManagement.js'
+
+export default {
+  name: 'yearPlan',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { YearPlanDia, limsTable },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        purpose: '',
+      },
+      tableColumn: [
+        {
+          label: '鍐呭鐩殑',
+          prop: 'purpose',
+          minWidth: '100'
+        },
+        {
+          label: '鍐呭鑼冨洿',
+          prop: 'scope',
+          minWidth: '100'
+        },
+        {
+          label: '鍐呭渚濇嵁',
+          prop: 'basis',
+          minWidth: '100'
+        },
+        {
+          label: '缁勯暱',
+          prop: 'leader',
+          minWidth: '100'
+        },
+        {
+          label: '缁勫憳',
+          prop: 'crew',
+          minWidth: '100'
+        },
+        {
+          dataType: 'tag',
+          label: '瀹℃牳鐘舵��',
+          prop: 'examineStatus',
+          minWidth: '100',
+          formatData: (params) => {
+            if (params === 0) {
+              return '涓嶉�氳繃';
+            } else if (params === 1) {
+              return '閫氳繃';
+            } else {
+              return null;
+            }
+          },
+          formatType: (params) => {
+            if (params === 0) {
+              return 'danger';
+            } else if (params === 1) {
+              return 'success';
+            } else {
+              return null;
+            }
+          }
+        }, {
+          label: '瀹℃牳鍐呭',
+          prop: 'examineRemark',
+          minWidth: '100'
+        }, {
+          label: '瀹℃牳浜�',
+          prop: 'examineUserName',
+          minWidth: '100'
+        }, {
+          label: '瀹℃牳鏃ユ湡',
+          prop: 'examineTime',
+          minWidth: '160'
+        }, {
+          dataType: 'tag',
+          label: '鎵瑰噯鐘舵��',
+          prop: 'ratifyStatus',
+          minWidth: '100',
+          formatData: (params) => {
+            if (params === 0) {
+              return '涓嶆壒鍑�';
+            } else if (params === 1) {
+              return '鎵瑰噯';
+            } else {
+              return null;
+            }
+          },
+          formatType: (params) => {
+            if (params === 0) {
+              return 'danger';
+            } else if (params === 1) {
+              return 'success';
+            } else {
+              return null;
+            }
+          }
+        }, {
+          label: '鎵瑰噯鍐呭',
+          prop: 'ratifyRemark',
+          minWidth: '100'
+        }, {
+          label: '鎵瑰噯浜�',
+          prop: 'ratifyUserName',
+          minWidth: '100'
+        }, {
+          label: '鎵瑰噯鏃ユ湡',
+          prop: 'ratifyTime',
+          minWidth: '160'
+        },
+        {
+          dataType: 'action',
+          fixed: 'right',
+          minWidth: '220',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row)
+              }
+            },
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('edit', row);
+              },
+              disabled: (row) => {
+                if (row.ratifyStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            },
+            {
+              name: '瀹℃牳',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('examine', row);
+              },
+              disabled: (row) => {
+                if (row.examineStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            },
+            {
+              name: '鎵瑰噯',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('ratify', row);
+              },
+              disabled: (row) => {
+                if (row.ratifyStatus === 1 || row.examineStatus === 0 || row.examineStatus === null) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delPlan(row)
+              },
+              disabled: (row) => {
+                if (row.ratifyStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            }
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        size: 20,
+        current: 1,
+        total: 0,
+      },
+      yearPlanDia: false,
+    };
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList() {
+      const entity = this.searchForm
+      const page = this.page
+      this.tableLoading = true
+      pageInternalPlan({ ...entity, ...page }).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.tableData = res.data.records
+        this.page.total = res.data.total
+      }).catch(err => {
+        console.log('err---', err);
+        this.tableLoading = false
+      })
+    },
+    // 鍒犻櫎
+    delPlan(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        delInternalPlan({ planId: row.planId }).then(res => {
+          this.tableLoading = false
+          if (res.code === 201) return
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.searchList()
+        }).catch(err => {
+          this.tableLoading = false
+          console.log('err---', err);
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 鏂板锛岀紪杈戯紝鎵瑰噯寮规
+    openFormDia(type, row) {
+      this.yearPlanDia = true
+      this.$nextTick(() => {
+        this.$refs.yearPlanDia.openDia(type, row)
+      })
+    },
+    // 瀵煎嚭
+    handleDown(row) {
+      exportInternalPlan({ planId: row.planId }).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res], { type: 'application/msword' });
+        this.$download.saveAs(blob, '鍐呭骞村害璁″垝' + '.docx');
+      })
+    },
+    closeYearDia() {
+      this.yearPlanDia = false
+      this.searchList()
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm() {
+      this.searchForm.purpose = '';
+      this.searchList()
+    },
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.searchList();
+    },
+  }
+};
+</script>
+
+<style scoped>
+.search-background {
+  width: 100%;
+  height: 60px;
+  line-height: 60px;
+  display: flex;
+  justify-content: space-between;
+}
+
+.search-group {
+  display: flex;
+  align-items: center;
+  margin: 0 20px;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlanDia.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlanDia.vue
new file mode 100644
index 0000000..0c1eba1
--- /dev/null
+++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlanDia.vue
@@ -0,0 +1,342 @@
+<template>
+  <div>
+    <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false"
+      :visible.sync="formDia" title="鍐呴儴瀹℃牳骞村害璁″垝" width="1000px" @close="closeYearDia">
+      <el-form ref="form" :model="form" :rules="rules" label-position="top" label-width="auto">
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="鍐呭鐩殑" prop="purpose">
+              <el-input v-model="form.purpose" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                :rows="3" clearable size="small" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鍐呭鑼冨洿" prop="scope">
+              <el-input v-model="form.scope" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                :rows="3" clearable size="small" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鍐呭渚濇嵁" prop="basis">
+              <el-input v-model="form.basis" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="缁勯暱" prop="leader">
+              <el-input v-model="form.leader" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="缁勫憳" prop="crew">
+              <el-input v-model="form.crew" :disabled="operationType === 'examine' || operationType === 'ratify'"
+                clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <table border="1" cellspacing="10" class="table">
+        <tr>
+          <td class="div-with-line">
+            <span style="float: left;">閮ㄩ棬</span>
+            <span style="float: right;">鏈堜唤</span>
+          </td>
+          <th v-for="(item, index) in dic1" :key="index">{{ item }}</th>
+        </tr>
+        <tr v-for="(item, index) in planDetailList" :key="index">
+          <td>{{ item.department }}</td>
+          <th>
+            <el-input v-model="item.january" :disabled="operationType === 'examine' || operationType === 'ratify'"
+              clearable size="small"></el-input>
+          </th>
+          <th>
+            <el-input v-model="item.february" :disabled="operationType === 'examine' || operationType === 'ratify'"
+              clearable size="small"></el-input>
+          </th>
+          <th>
+            <el-input v-model="item.march" :disabled="operationType === 'examine' || operationType === 'ratify'"
+              clearable size="small"></el-input>
+          </th>
+          <th>
+            <el-input v-model="item.april" :disabled="operationType === 'examine' || operationType === 'ratify'"
+              clearable size="small"></el-input>
+          </th>
+          <th>
+            <el-input v-model="item.may" :disabled="operationType === 'examine' || operationType === 'ratify'" clearable
+              size="small"></el-input>
+          </th>
+          <th>
+            <el-input v-model="item.june" :disabled="operationType === 'examine' || operationType === 'ratify'"
+              clearable size="small"></el-input>
+          </th>
+          <th>
+            <el-input v-model="item.july" :disabled="operationType === 'examine' || operationType === 'ratify'"
+              clearable size="small"></el-input>
+          </th>
+          <th>
+            <el-input v-model="item.august" :disabled="operationType === 'examine' || operationType === 'ratify'"
+              clearable size="small"></el-input>
+          </th>
+          <th>
+            <el-input v-model="item.september" :disabled="operationType === 'examine' || operationType === 'ratify'"
+              clearable size="small"></el-input>
+          </th>
+          <th>
+            <el-input v-model="item.october" :disabled="operationType === 'examine' || operationType === 'ratify'"
+              clearable size="small"></el-input>
+          </th>
+          <th>
+            <el-input v-model="item.november" :disabled="operationType === 'examine' || operationType === 'ratify'"
+              clearable size="small"></el-input>
+          </th>
+          <th>
+            <el-input v-model="item.december" :disabled="operationType === 'examine' || operationType === 'ratify'"
+              clearable size="small"></el-input>
+          </th>
+        </tr>
+      </table>
+      <span slot="footer" class="dialog-footer">
+        <el-button v-if="operationType === 'examine'" :loading="loading" @click="examine(0)">涓嶉�氳繃</el-button>
+        <el-button v-if="operationType === 'examine'" :loading="loading" type="primary" @click="examine(1)">閫�
+          杩�</el-button>
+        <el-button v-if="operationType === 'ratify'" :loading="loading" @click="approval(0)">涓嶆壒鍑�</el-button>
+        <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="handleApproval(1)">鎵�
+          鍑�</el-button>
+        <el-button v-if="operationType !== 'ratify' && operationType !== 'examine'" @click="closeYearDia">鍙�
+          娑�</el-button>
+        <el-button v-if="operationType !== 'ratify' && operationType !== 'examine'" :loading="loading" type="primary"
+          @click="handleEdit">鎻� 浜�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="examineDialog" title="瀹℃牳" width="30%" @close="examineDialog = false">
+      <span>
+        瀹℃牳澶囨敞锛�
+        <el-input v-model="examineRemark" type="textarea"></el-input>
+      </span>
+      <span slot="footer" class="dialog-footer">
+        <el-button :loading="examineLoading" @click="examineDialog = false">鍙� 娑�</el-button>
+        <el-button :loading="examineLoading" type="primary" @click="handleExamine(0)">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="approvalDialog" title="鎵瑰噯" width="30%" @close="approvalDialog = false">
+      <span>
+        鎵瑰噯澶囨敞锛�
+        <el-input v-model="ratifyRemark" type="textarea"></el-input>
+      </span>
+      <span slot="footer" class="dialog-footer">
+        <el-button :loading="approvalLoading" @click="approvalDialog = false">鍙� 娑�</el-button>
+        <el-button :loading="approvalLoading" type="primary" @click="handleApproval(0)">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getInternalPlanOne,
+  addInternalPlan,
+  updateInternalPlan,
+  examineInternalPlan,
+  ratifyInternalPlan,
+} from '@/api/cnas/systemManagement/internalAuditManagement.js'
+export default {
+  name: 'yearPlanDia',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      diaLoading: false,
+      loading: false,
+      form: {
+        purpose: '',
+        scope: '',
+        basis: '',
+        leader: '',
+        crew: '',
+      },
+      rules: {
+        purpose: [{ required: true, message: '璇峰~鍐欏唴瀹$洰鐨�', trigger: 'blur' }],
+        scope: [{ required: true, message: '璇峰~鍐欏唴瀹¤寖鍥�', trigger: 'blur' }],
+        basis: [{ required: true, message: '璇峰~鍐欏唴瀹′緷鎹�', trigger: 'blur' }],
+        leader: [{ required: true, message: '璇峰~鍐欑粍闀�', trigger: 'blur' }],
+        crew: [{ required: true, message: '璇峰~鍐欑粍鍛�', trigger: 'blur' }],
+      },
+      operationType: '',
+      approvalDialog: false,
+      approvalLoading: false,
+      examineDialog: false,
+      examineLoading: false,
+      ratifyRemark: '',
+      examineRemark: '',
+      dic1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
+      planDetailList: [{ department: '瑁呭鐢电紗瀹為獙瀹�' }, { department: '閫氫俊浜у搧瀹為獙瀹�' }, { department: '鐢靛姏浜у搧瀹為獙瀹�' }, { department: '鍌ㄨ兘浜у搧瀹為獙瀹�' }, { department: '灏勯绾跨紗瀹為獙瀹�' }],
+    };
+  },
+  mounted() {
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鎵撳紑寮规
+    openDia(type, row) {
+      this.formDia = true
+      this.operationType = type
+      if (type !== 'add') {
+        this.searchInfo(row)
+      }
+    },
+    // 鏌ヨ璇︽儏
+    searchInfo(row) {
+      this.diaLoading = true
+      getInternalPlanOne({ planId: row.planId }).then(res => {
+        this.diaLoading = false
+        if (res.code === 201) return
+        this.form = res.data
+        this.planDetailList = this.form.planDetailList
+      }).catch(err => {
+        console.log(err)
+        this.diaLoading = false
+      })
+    },
+    // 鎻愪氦寮规鏁版嵁
+    handleEdit() {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.loading = true
+          const internalPlan = this.HaveJson(this.form)
+          internalPlan.planDetailList = this.HaveJson(this.planDetailList)
+          if (this.operationType === 'add') {
+            addInternalPlan(internalPlan).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeYearDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          } else if (this.operationType === 'edit') {
+            updateInternalPlan(internalPlan).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeYearDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    // 瀹℃牳娴佺▼
+    examine(examineStatus) {
+      if (examineStatus === 0) {
+        this.examineDialog = true
+      } else {
+        this.handleExamine(examineStatus)
+      }
+    },
+    handleExamine(examineStatus) {
+      this.examineLoading = true
+      const internalReport = this.HaveJson(this.form)
+      internalReport.examineStatus = examineStatus
+      internalReport.examineRemark = this.examineRemark
+      examineInternalPlan(internalReport).then(res => {
+        if (res.code === 200) {
+          this.$message.success('鎻愪氦鎴愬姛锛�');
+          this.approvalDialog = false
+          this.closeYearDia(this.departId);
+        }
+        this.examineLoading = false
+      }).catch(() => {
+        this.examineLoading = false
+      })
+    },
+    // 鎻愪氦鎵瑰噯淇℃伅
+    approval(ratifyStatus) {
+      if (ratifyStatus === 0) {
+        this.approvalDialog = true
+      } else {
+        this.handleApproval(ratifyStatus)
+      }
+    },
+    handleApproval(ratifyStatus) {
+      this.approvalLoading = true
+      const internalReport = this.HaveJson(this.form)
+      internalReport.ratifyStatus = ratifyStatus
+      internalReport.ratifyRemark = this.ratifyRemark
+      ratifyInternalPlan(internalReport).then(res => {
+        if (res.code === 200) {
+          this.$message.success('鎻愪氦鎴愬姛锛�');
+          this.approvalDialog = false
+          this.closeYearDia(this.departId);
+        }
+        this.approvalLoading = false
+      }).catch(() => {
+        this.approvalLoading = false
+      })
+    },
+    closeYearDia() {
+      this.$refs.form.resetFields();
+      this.formDia = false
+      this.$emit('closeYearDia')
+    },
+  }
+};
+</script>
+
+<style scoped>
+>>>.el-dialog {
+  margin: 6vh auto 50px !important;
+}
+
+>>>.el-dialog__body {
+  max-height: 42em;
+  overflow-y: auto;
+}
+
+>>>.is-required {
+  margin-bottom: 6px;
+}
+
+.table {
+  width: 100%;
+  margin-top: 20px;
+}
+
+.table th {
+  width: 70px;
+}
+
+.table td {
+  width: 70px;
+  height: 70px;
+  text-align: center;
+}
+
+.div-with-line {
+  width: 70px;
+  height: 70px;
+  position: relative;
+  /*overflow: hidden; /* 闅愯棌婧㈠嚭鍐呭 */
+}
+
+.div-with-line::after {
+  content: '';
+  position: absolute;
+  bottom: 0;
+  height: 1px;
+  background-color: #000000;
+  left: 50%;
+  transform: translateX(-50%) rotate(45deg);
+  transform-origin: center 50%;
+  top: 50%;
+  width: 100px;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/index.vue b/src/views/CNAS/systemManagement/internalAuditManagement/index.vue
new file mode 100644
index 0000000..4b61b39
--- /dev/null
+++ b/src/views/CNAS/systemManagement/internalAuditManagement/index.vue
@@ -0,0 +1,57 @@
+<template>
+  <div class="main">
+    <el-tabs v-model="activeName" class="tab-panel" type="border-card">
+      <el-tab-pane label="骞村害璁″垝" name="yearPlan">
+        <year-plan></year-plan>
+      </el-tab-pane>
+      <el-tab-pane label="鍐呴儴瀹炴柦璁″垝" name="implementationPlan">
+        <implementation-plan></implementation-plan>
+      </el-tab-pane>
+      <el-tab-pane label="鍐呭浼氳绛惧埌" name="meetingSignIn">
+        <audit-meeting-sign></audit-meeting-sign>
+      </el-tab-pane>
+      <el-tab-pane label="鍐呭妫�鏌�" name="auditInspection">
+        <audit-inspection></audit-inspection>
+      </el-tab-pane>
+      <el-tab-pane label="绾犳鎺柦" name="correctiveAction">
+        <corrective-action></corrective-action>
+      </el-tab-pane>
+      <el-tab-pane label="鍐呭鎶ュ憡" name="auditReport">
+        <audit-report></audit-report>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+import YearPlan from './components/yearPlan.vue';
+import implementationPlan from './components/implementationPlan.vue';
+import AuditInspection from './components/auditInspection.vue';
+import AuditReport from './components/auditReport.vue';
+import AuditMeetingSign from './components/auditMeetingSign.vue';
+import CorrectiveAction from './components/correctiveAction.vue';
+
+export default {
+  name: 'InternalAuditManagement',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { CorrectiveAction, AuditMeetingSign, AuditReport, AuditInspection, YearPlan, implementationPlan },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      activeName: 'yearPlan',
+    };
+  },
+  // 鏂规硶闆嗗悎
+  methods: {}
+};
+</script>
+
+<style scoped>
+.main {
+  padding: 15px 0;
+}
+
+.tab-panel {
+  background: #fff;
+}
+</style>

--
Gitblit v1.9.3