From 36a30a262c16b6c37be7d1817c46d6693a324cc4 Mon Sep 17 00:00:00 2001
From: licp <lichunping@guanfang.com.cn>
Date: 星期四, 19 十二月 2024 13:15:57 +0800
Subject: [PATCH] 完成管理评审搬迁

---
 src/components/do/a9-management-review/managementReviewPlan.vue |  325 ++++++++++++
 src/components/view/a9-management-review.vue                    |   47 +
 src/components/do/a9-management-review/meetingRecordsDia.vue    |  173 ++++++
 src/components/do/a9-management-review/managementFormDIa.vue    |  263 +++++++++
 src/components/do/a9-management-review/reviewReportDia.vue      |  280 ++++++++++
 src/components/do/a9-management-review/meetingRecords.vue       |  207 +++++++
 src/components/do/a9-management-review/reviewReport.vue         |  279 ++++++++++
 7 files changed, 1,574 insertions(+), 0 deletions(-)

diff --git a/src/components/do/a9-management-review/managementFormDIa.vue b/src/components/do/a9-management-review/managementFormDIa.vue
new file mode 100644
index 0000000..7607018
--- /dev/null
+++ b/src/components/do/a9-management-review/managementFormDIa.vue
@@ -0,0 +1,263 @@
+<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="right" label-width="auto" style="height: 75vh;overflow-y: auto;overflow-x: hidden;">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="璇勫鏃堕棿" prop="reviewTime">
+              <el-date-picker
+                v-model="form.reviewTime"
+                :disabled="operationType === 'ratify'"
+                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="judgingLocation">
+              <el-input v-model="form.judgingLocation" :disabled="operationType === 'ratify'" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璇勫鐩殑" prop="judgingPurpose">
+              <el-input v-model="form.judgingPurpose" :disabled="operationType === 'ratify'" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璇勫鏂瑰紡" prop="judgingMethod">
+              <el-input v-model="form.judgingMethod" :disabled="operationType === 'ratify'" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鍙傚姞浜哄憳" prop="participants">
+              <!-- <el-input v-model="form.participants" :disabled="operationType === 'ratify'" clearable size="small"></el-input> -->
+              <el-select v-model="form.participants" size="small" style="width: 100%;" filterable :disabled="operationType === 'ratify'" clearable multiple >
+                <el-option
+                  v-for="item in personList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璇勫鑼冨洿" prop="judgingScope">
+              <el-input v-model="form.judgingScope" :disabled="operationType === 'ratify'" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璇勫渚濇嵁" prop="judgingBasis">
+              <el-input v-model="form.judgingBasis"
+                        :disabled="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="mainContext">
+              <el-input v-model="form.mainContext"
+                        :disabled="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="preparationRequirements">
+              <el-input v-model="form.preparationRequirements"
+                        :disabled="operationType === 'ratify'"
+                        :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 @click="closeImplementDia">鍙� 娑�</el-button>
+        <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="handleApproval(1)">鎵� 鍑�</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="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 { dateFormat } from '../../../util/date'
+export default {
+  name: 'managementFormDIa',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      diaLoading: false,
+      loading: false,
+      form: {
+        id: '',
+        reviewTime: '',
+        judgingLocation: '',
+        judgingPurpose: '',
+        judgingMethod: '',
+        participants: [],
+        judgingScope: '',
+        judgingBasis: '',
+        mainContext: '',
+        preparationRequirements: '',
+      },
+      rules: {
+        reviewTime: [{required: true, message: '璇烽�夋嫨璇勫鏃堕棿',trigger: 'blur'}],
+        judgingLocation: [{required: true, message: '璇峰~鍐欒瘎瀹″湴鐐�',trigger: 'blur'}],
+        judgingPurpose: [{required: true, message: '璇峰~鍐欒瘎瀹$洰鐨�',trigger: 'blur'}],
+        judgingMethod: [{required: true, message: '璇峰~鍐欒瘎瀹℃柟寮�',trigger: 'blur'}],
+        participants: [{required: true, message: '璇峰~鍐欏弬鍔犱汉鍛�',trigger: 'change'}],
+        judgingScope: [{required: true, message: '璇峰~鍐欒瘎瀹¤寖鍥�',trigger: 'blur'}],
+        judgingBasis: [{required: true, message: '璇峰~鍐欒瘎瀹′緷鎹�',trigger: 'blur'}],
+        mainContext: [{required: true, message: '璇峰~鍐欒瘎瀹′富瑕佸唴瀹�',trigger: 'blur'}],
+        preparationRequirements: [{required: true, message: '璇峰~鍐欏噯澶囧伐浣滆姹�',trigger: 'blur'}],
+      },
+      operationType: '',
+      approvalDialog: false,
+      approvalLoading: false,
+      qualityRemark: '',
+      personList:[],
+    };
+  },
+  mounted() {
+    this.getAuthorizedPerson()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鎵撳紑寮规
+    openDia (type, row) {
+      this.formDia = true
+      this.operationType = type
+      if (type !== 'add') {
+        this.form = row
+        this.form.participants = row.participants ? row.participants.split(',').map(m=>Number(m)) : []
+      }
+    },
+    // 鏌ヨ璇︽儏
+    // searchInfo (row) {
+    //   this.diaLoading = true
+    //   this.$axios(this.$api.internalReport.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)
+          internalReport.participants = internalReport.participants.join(',')
+          if (this.operationType === 'add') {
+            this.$axios.post(this.$api.manageReviewProgram.addReviewProgram, internalReport, {
+              headers: {
+                "Content-Type": "application/json"
+              },
+              noQs: true
+            }).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') {
+            this.$axios.put(this.$api.manageReviewProgram.modifyReviewProgram, internalReport, {
+              headers: {
+                "Content-Type": "application/json"
+              },
+              noQs: true
+            }).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;
+        }
+      });
+    },
+    // 鎻愪氦鎵瑰噯淇℃伅
+    handleApproval (qualityStatus) {
+      this.approvalLoading = true
+      const internalReport = this.HaveJson(this.form)
+      internalReport.approve = JSON.parse(localStorage.getItem("user")).name
+      internalReport.approveDate = dateFormat(new Date())
+      internalReport.participants = internalReport.participants.join(',')
+      this.$axios.put(this.$api.manageReviewProgram.modifyReviewProgram, internalReport, {
+        headers: {
+          'Content-Type': 'application/json'
+        },
+        noQs: true
+      }).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')
+    },
+    getAuthorizedPerson() {
+      this.$axios.get(this.$api.user.getUserMenu).then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.personList = data
+      })
+    },
+  }
+};
+</script>
+
+<style scoped>
+>>>.el-dialog {
+  margin: 6vh auto 50px !important;
+}
+</style>
diff --git a/src/components/do/a9-management-review/managementReviewPlan.vue b/src/components/do/a9-management-review/managementReviewPlan.vue
new file mode 100644
index 0000000..e30d32b
--- /dev/null
+++ b/src/components/do/a9-management-review/managementReviewPlan.vue
@@ -0,0 +1,325 @@
+<template>
+  <div>
+    <div class="search-background">
+      <span class="search-group">
+        <span style="width: 160px">璇勫鍦扮偣锛�</span>
+        <el-input v-model="searchForm.judgingLocation" 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">
+      <ZTTable
+        :column="tableColumn"
+        :height="'calc(100vh - 20em)'"
+        :table-data="tableData"
+        :table-loading="tableLoading"
+        style="padding: 0 10px;margin-bottom: 16px">
+      </ZTTable>
+      <el-pagination :current-page="1" :page-size="page.size" :page-sizes="[10, 20, 30, 50, 100]"
+                     :total="total" layout="->,total, sizes, prev, pager, next, jumper"
+                     @size-change="handleSizeChange"
+                     @current-change="handleCurrentChange">
+      </el-pagination>
+    </div>
+    <management-form-d-ia v-if="managementFormDIa" ref="managementFormDIa" @closeImplementDia="closeImplementDia"></management-form-d-ia>
+    <el-dialog :visible.sync="listDialogVisible" top="15vh"
+    title="鏂囦欢鏌ョ湅"
+    width="400px">
+    <div style="max-height:60vh;overflow-y: auto;">
+      <p v-for="(item,index) in fileList" :key="index">
+        <span>{{ item.fileName }}</span>
+        <el-button size="small" type="text" icon="el-icon-view" @click="lookFile(item.url,item.fileName)" style="margin-left: 20px;">棰勮</el-button>
+        <el-button size="small" type="text" icon="el-icon-bottom" @click="handleDown0(item.url,item.fileName)" style="margin-left: 20px;">涓嬭浇</el-button>
+      </p>
+    </div>
+    </el-dialog>
+    <el-dialog
+      title="鏌ョ湅闄勪欢"
+      :visible.sync="lookDialogVisible"
+      width="800px" top="5vh" fullscreen>
+      <filePreview v-if="lookDialogVisible" :fileUrl="javaApi+'/word/'+currentInfo.url"
+      :currentFile="{}" style="height: 90vh;overflow-y: auto;"/>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import ZTTable from '../../caorui/ZTTable/index.vue';
+import ManagementFormDIa from './managementFormDIa.vue';
+import filePreview from '../../tool/file-preview.vue'
+
+export default {
+  name: 'managementReviewPlan',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { ManagementFormDIa, ZTTable,filePreview },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+         judgingLocation: '',
+      },
+      listDialogVisible:false,
+      lookDialogVisible:false,
+      fileList:[],
+      currentInfo:{},
+      tableColumn: [
+        {
+          label: '璇勫鏃堕棿',
+          prop: 'reviewTime',
+        },
+        {
+          label: '璇勫鍦扮偣',
+          prop: 'judgingLocation',
+        },
+        {
+          label: '璇勫鐩殑',
+          prop: 'judgingPurpose',
+        },
+        {
+          label: '璇勫鏂瑰紡',
+          prop: 'judgingMethod',
+        },
+        {
+          label: '璇勫鑼冨洿',
+          prop: 'judgingScope',
+        },
+        // {
+        //   dataType: 'tag',
+        //   label: '鎵瑰噯鐘舵��',
+        //   prop: 'approve',
+        //   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;
+        //     }
+        //   }
+        // },
+        {
+          dataType: 'action',
+          minWidth: '110',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('edit', row);
+              },
+              disabled: (row) => {
+                return !!row.approve
+              },
+            },
+            {
+              name: '涓婁紶',
+              type: 'upload',
+              multiple:true,
+              limit:20,
+              accept:'.doc,.docx,.xls,.xlsx,.jpg,.jpeg,.png,.pdf',
+              clickFun: async (row,file, fileList) => {
+                const formData = new FormData();
+                formData.append('file',file.raw); // 鏂囦欢瀛楁
+                formData.append('id', row.id); // 鏂囦欢鍚嶅瓧娈�
+                let res = await this.$axios.post(this.$api.manageReviewProgram.addReviewProgramFile, formData,{
+                  headers: {
+                      'Content-Type': 'multipart/form-data;'
+                  },
+                  noQs: true
+                })
+                if(res.code==200){
+                  this.$message({ message: '涓婁紶鎴愬姛', type: 'success' });
+                  // this.searchList()
+                  return
+                }else{
+                  this.$message({ message: '涓婁紶澶辫触', type: 'error' });
+                  return
+                }
+              },
+              disabled: (row) => {
+                return !!row.approve
+              },
+            },
+            {
+              name: '鏌ョ湅闄勪欢',
+              type: 'text',
+              clickFun: (row) => {
+                this.$axios.get(this.$api.manageReviewProgram.selectReviewProgramFile + '?id='+row.id).then(res => {
+                  this.listDialogVisible = true;
+                  this.fileList = res.data.fileList
+                });
+              },
+            },
+            {
+              name: '鎵瑰噯',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('ratify', row);
+              },
+              disabled: (row) => {
+                return !!row.approve
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delPlan(row)
+              },
+              disabled: (row) => {
+                if (row.qualityStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            },
+            {
+              name: '涓嬭浇',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row)
+              }
+            },
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        size: 20,
+        current: 1,
+      },
+      total: 0,
+      managementFormDIa: false,
+    };
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList () {
+      this.tableLoading = true
+      this.$axios.get(this.$api.manageReviewProgram.getPageReviewProgram + '?judgingLocation=' + this.searchForm.judgingLocation + '&pages=' + this.page.current + '&size=' + this.page.size).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.tableData = res.data.records
+        this.total = res.data.total
+      }).catch(err => {
+        console.log('err---', err);
+        this.tableLoading = false
+      })
+    },
+    // 鏂板锛岀紪杈戯紝鎵瑰噯寮规
+    openFormDia (type, row) {
+      this. managementFormDIa = true
+      this.$nextTick(() => {
+        this.$refs. managementFormDIa.openDia(type, row)
+      })
+    },
+    closeImplementDia () {
+      this. managementFormDIa = false
+      this.searchList()
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm () {
+      this.searchForm.judgingLocation = '';
+      this.searchList()
+    },
+    // 鍒犻櫎
+    delPlan (row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        this.$axios.delete(this.$api.manageReviewProgram.deleteReviewProgram + '?id=' + row.id).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: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 鍒嗛〉
+    handleSizeChange(val) {
+      this.page.size = val;
+      this.searchList();
+    },
+    handleCurrentChange(val) {
+      this.page.current = val;
+      this.searchList();
+    },
+    handleDown(row){
+      this.$axios.post(this.$api.manageReviewProgram.exportReviewProgram,{id:row.id},{responseType: "blob"}).then(res => {
+        if(res.code == 201){
+          this.$message.error(res.message)
+          return
+        }
+        this.$message.success('涓嬭浇鎴愬姛')
+        const blob = new Blob([res],{ type: 'application/octet-stream' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = '璇勫璁″垝.docx';
+        link.click();
+      })
+    },
+    lookFile(url,name){
+      this.currentInfo.url = url
+      this.currentInfo.name = name
+      this.lookDialogVisible = true
+    },
+    handleDown0(url,name){
+      if(!url) return this.$message.warning('鏂囦欢鏈笂浼�')
+      let url0 = this.javaApi+'/word/'+url
+      const link = document.createElement('a');
+      link.href = url0;
+      link.target = '_blank';
+      link.click();
+    }
+  }
+};
+</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/components/do/a9-management-review/meetingRecords.vue b/src/components/do/a9-management-review/meetingRecords.vue
new file mode 100644
index 0000000..66594c6
--- /dev/null
+++ b/src/components/do/a9-management-review/meetingRecords.vue
@@ -0,0 +1,207 @@
+<template>
+  <div>
+    <div class="search-background">
+      <span class="search-group">
+        <span style="width: 160px">浼氳鍦扮偣锛�</span>
+        <el-input v-model="searchForm.place" 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">
+      <ZTTable
+        :column="tableColumn"
+        :height="'calc(100vh - 20em)'"
+        :table-data="tableData"
+        :table-loading="tableLoading"
+        style="padding: 0 10px;margin-bottom: 16px">
+      </ZTTable>
+      <el-pagination :current-page="1" :page-size="page.size" :page-sizes="[10, 20, 30, 50, 100]"
+                     :total="total" layout="->,total, sizes, prev, pager, next, jumper"
+                     @size-change="handleSizeChange"
+                     @current-change="handleCurrentChange">
+      </el-pagination>
+    </div>
+    <meeting-records-dia v-if="meetingRecordsDia" ref="meetingRecordsDia" @closeYearDia="closeYearDia"></meeting-records-dia>
+  </div>
+</template>
+
+<script>
+import ZTTable from '../../caorui/ZTTable/index.vue';
+import MeetingRecordsDia from './meetingRecordsDia.vue';
+import ManagementFormDIa from './managementFormDIa.vue';
+
+export default {
+  name: 'meetingRecords',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { ManagementFormDIa, MeetingRecordsDia, ZTTable },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        place: '',
+      },
+      tableColumn: [
+        {
+          label: '鏃堕棿',
+          prop: 'meetingTime',
+          minWidth: '100'
+        },
+        {
+          label: '涓绘寔浜�',
+          prop: 'compere',
+          minWidth: '100'
+        },
+        {
+          label: '浼氳鍦扮偣',
+          prop: 'place',
+          minWidth: '100'
+        },
+        {
+          label: '浼氳鍐呭鎽樿',
+          prop: 'content',
+          minWidth: '100'
+        },
+        {
+          dataType: 'action',
+          minWidth: '120',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('edit', row);
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delPlan(row)
+              }
+            },
+            {
+              name: '涓嬭浇',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row)
+              }
+            },
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        size: 20,
+        current: 1,
+      },
+      total: 0,
+      meetingRecordsDia: false
+    };
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList () {
+      this.tableLoading = true
+      this.$axios.get(this.$api.manageMeeting.getPageMeeting + '?place=' + this.searchForm.place + '&pages=' + this.page.current + '&size=' + this.page.size).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.tableData = res.data.records
+        this.total = res.data.total
+      }).catch(err => {
+        console.log('err---', err);
+        this.tableLoading = false
+      })
+    },
+    // 鏂板锛岀紪杈戝脊妗�
+    openFormDia (type, row) {
+      this. meetingRecordsDia = true
+      this.$nextTick(() => {
+        this.$refs. meetingRecordsDia.openDia(type, row)
+      })
+    },
+    closeYearDia () {
+      this. meetingRecordsDia = false
+      this.searchList()
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm () {
+      this.searchForm.place = '';
+      this.searchList()
+    },
+    // 鍒犻櫎
+    delPlan (row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        this.$axios.delete(this.$api.manageMeeting.deleteMeeting + '?id=' + row.id).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: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 鍒嗛〉
+    handleSizeChange(val) {
+      this.page.size = val;
+      this.searchList();
+    },
+    handleCurrentChange(val) {
+      this.page.current = val;
+      this.searchList();
+    },
+    handleDown(row){
+      this.$axios.post(this.$api.manageMeeting.exportMeeting,{id:row.id},{responseType: "blob"}).then(res => {
+        if(res.code == 201){
+          this.$message.error(res.message)
+          return
+        }
+        this.$message.success('涓嬭浇鎴愬姛')
+        const blob = new Blob([res],{ type: 'application/octet-stream' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = '浼氳璁板綍.docx';
+        link.click();
+      })
+    },
+  }
+};
+</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/components/do/a9-management-review/meetingRecordsDia.vue b/src/components/do/a9-management-review/meetingRecordsDia.vue
new file mode 100644
index 0000000..a5f73c8
--- /dev/null
+++ b/src/components/do/a9-management-review/meetingRecordsDia.vue
@@ -0,0 +1,173 @@
+<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="meetingTime">
+              <el-date-picker
+                v-model="form.meetingTime"
+                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="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="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="content">
+              <el-input v-model="form.content" 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>
+export default {
+  name: 'meetingRecordsDia',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      diaLoading: false,
+      loading: false,
+      form: {
+        id: '',
+        meetingTime: '',
+        compere: '',
+        place: '',
+        content: '',
+        participant: [],
+      },
+      rules: {
+        meetingTime: [{required: true, message: '璇峰~鍐欎細璁椂闂�',trigger: 'blur'}],
+        compere: [{required: true, message: '璇峰~鍐欎富鎸佷汉',trigger: 'blur'}],
+        place: [{required: true, message: '璇峰~鍐欏湴鐐�',trigger: 'blur'}],
+        content: [{required: true, message: '璇峰~鍐欎細璁唴瀹规憳瑕�',trigger: 'blur'}],
+        participant: [{required: true, message: '璇烽�夋嫨鍙傚姞浜哄憳',trigger: 'change'}],
+      },
+      operationType: '',
+      personList: []
+    };
+  },
+  mounted() {
+
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鎵撳紑寮规
+    openDia (type, row) {
+      this.operationType = type
+      this.getAuthorizedPerson()
+      if (type !== 'add') {
+        this.form = row
+        this.form.participant = row.participant.split(',').map(a => {
+          a = Number(a)
+          return a
+        })
+      }
+      this.formDia = true
+    },
+    // 鎻愪氦寮规鏁版嵁
+    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') {
+            this.$axios.post(this.$api.manageMeeting.addMeeting, internalMeeting, {
+              headers: {
+                "Content-Type": "application/json"
+              },
+              noQs: true
+            }).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') {
+            this.$axios.put(this.$api.manageMeeting.modifyMeeting, internalMeeting, {
+              headers: {
+                "Content-Type": "application/json"
+              },
+              noQs: true
+            }).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() {
+      this.$axios.get(this.$api.user.getUserMenu).then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.personList = data
+      })
+    },
+  }
+};
+</script>
+
+<style scoped>
+</style>
diff --git a/src/components/do/a9-management-review/reviewReport.vue b/src/components/do/a9-management-review/reviewReport.vue
new file mode 100644
index 0000000..902c104
--- /dev/null
+++ b/src/components/do/a9-management-review/reviewReport.vue
@@ -0,0 +1,279 @@
+<template>
+  <div>
+    <div class="search-background">
+      <span class="search-group">
+        <span style="width: 160px">鍦扮偣锛�</span>
+        <el-input v-model="searchForm.place" 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">
+      <ZTTable
+        :column="tableColumn"
+        :height="'calc(100vh - 20em)'"
+        :table-data="tableData"
+        :table-loading="tableLoading"
+        style="padding: 0 10px;margin-bottom: 16px">
+      </ZTTable>
+      <el-pagination :current-page="1" :page-size="page.size" :page-sizes="[10, 20, 30, 50, 100]"
+                     :total="total" layout="->,total, sizes, prev, pager, next, jumper"
+                     @size-change="handleSizeChange"
+                     @current-change="handleCurrentChange">
+      </el-pagination>
+    </div>
+    <review-report-dia  v-if="reviewReportDia" ref="reviewReportDia" @closeYearDia="closeYearDia"></review-report-dia>
+  </div>
+</template>
+
+<script>
+import ZTTable from '../../caorui/ZTTable/index.vue';
+import ReviewReportDia from './reviewReportDia.vue';
+
+export default {
+  name: 'reviewReport',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { ReviewReportDia, ZTTable },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        place: '',
+      },
+      tableColumn: [
+        {
+          label: '鐩殑',
+          prop: 'objective',
+          minWidth: '100'
+        },
+        {
+          label: '鍦扮偣',
+          prop: 'place',
+          minWidth: '100'
+        },
+        {
+          label: '涓绘寔浜�',
+          prop: 'compere',
+          minWidth: '100'
+        },
+        {
+          label: '璁板綍浜�',
+          prop: 'recordPeople',
+          minWidth: '100'
+        },
+        {
+          label: '鏃ユ湡',
+          prop: 'date',
+          minWidth: '100'
+        },
+        {
+          label: '椤垫',
+          prop: 'page',
+          minWidth: '100'
+        },
+        {
+          label: '璇勫鏂瑰紡',
+          prop: 'judgingMethod',
+          minWidth: '100'
+        },
+        {
+          label: '璇勫渚濇嵁',
+          prop: 'reviewBasis',
+          minWidth: '100'
+        },
+        {
+          dataType: 'action',
+          minWidth: '160',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('edit', row);
+              },
+              disabled:(row)=>{
+                return !!row.audit||!!row.approval
+              }
+            },
+            {
+              name: '瀹℃牳',
+              type: 'text',
+              clickFun: (row) => {
+                this.$confirm('纭畾瀹℃牳閫氳繃?', '鎻愮ず', {
+                    confirmButtonText: '纭畾',
+                    cancelButtonText: '鍙栨秷',
+                    type: 'warning'
+                }).then(() => {
+                    this.submit('audit',row)
+                }).catch(() => {
+                });
+              },
+              disabled:(row)=>{
+                return !!row.audit
+              }
+            },
+            {
+              name: '鎵瑰噯',
+              type: 'text',
+              clickFun: (row) => {
+                this.$confirm('纭畾鎵瑰噯閫氳繃?', '鎻愮ず', {
+                    confirmButtonText: '纭畾',
+                    cancelButtonText: '鍙栨秷',
+                    type: 'warning'
+                }).then(() => {
+                    this.submit('approval',row)
+                }).catch(() => {
+                });
+              },
+              disabled:(row)=>{
+                return !row.audit||!!row.approval
+              }
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delPlan(row)
+              }
+            },
+            {
+              name: '涓嬭浇',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row)
+              }
+            },
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        size: 20,
+        current: 1,
+      },
+      total: 0,
+      reviewReportDia: false,
+    };
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList () {
+      this.tableLoading = true
+      this.$axios.get(this.$api.manageReviewReport.getPageReviewReport + '?place=' + this.searchForm.place + '&pages=' + this.page.current + '&size=' + this.page.size).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.tableData = res.data.records
+        this.total = res.data.total
+      }).catch(err => {
+        console.log('err---', err);
+        this.tableLoading = false
+      })
+    },
+    // 鏂板锛岀紪杈戝脊妗�
+    openFormDia (type, row) {
+      this. reviewReportDia = true
+      this.$nextTick(() => {
+        this.$refs. reviewReportDia.openDia(type, row)
+      })
+    },
+    closeYearDia () {
+      this. reviewReportDia = false
+      this.searchList()
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm () {
+      this.searchForm.place = '';
+      this.searchList()
+    },
+    // 鍒犻櫎
+    delPlan (row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        this.$axios.delete(this.$api.manageReviewReport.deleteReviewReport + '?id=' + row.id).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: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 鍒嗛〉
+    handleSizeChange(val) {
+      this.page.size = val;
+      this.searchList();
+    },
+    handleCurrentChange(val) {
+      this.page.current = val;
+      this.searchList();
+    },
+    handleDown(row){
+      this.$axios.post(this.$api.manageReviewReport.exportReviewReport,{id:row.id},{responseType: "blob"}).then(res => {
+        if(res.code == 201){
+          this.$message.error(res.message)
+          return
+        }
+        this.$message.success('涓嬭浇鎴愬姛')
+        const blob = new Blob([res],{ type: 'application/octet-stream' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = '璇勫鎶ュ憡.docx';
+        link.click();
+      })
+    },
+    submit(type,row){
+      let obj = row
+      obj[type] = JSON.parse(localStorage.getItem("user")).name;
+      this.$axios.put(this.$api.manageReviewReport.modifyReviewReport, obj, {
+        headers: {
+          "Content-Type": "application/json"
+        },
+        noQs: true
+      }).then(res => {
+        if (res.code === 201) return
+        this.$message.success('鎿嶄綔鎴愬姛')
+        this.searchList()
+      }).catch(err => {
+        console.log('err---', err);
+      })
+    }
+  }
+};
+</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/components/do/a9-management-review/reviewReportDia.vue b/src/components/do/a9-management-review/reviewReportDia.vue
new file mode 100644
index 0000000..a990b12
--- /dev/null
+++ b/src/components/do/a9-management-review/reviewReportDia.vue
@@ -0,0 +1,280 @@
+<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" style="height: 75vh;overflow-y: auto;overflow-x: hidden;">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鐩殑" prop="objective">
+              <el-input v-model="form.objective" 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="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="recordPeople">
+              <el-input v-model="form.recordPeople" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏃ユ湡" prop="date">
+              <el-date-picker
+                v-model="form.date"
+                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="page">
+              <el-input v-model="form.page" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璇勫鏂瑰紡" prop="judgingMethod">
+              <el-input v-model="form.judgingMethod" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璇勫渚濇嵁" prop="reviewBasis">
+              <el-input v-model="form.reviewBasis" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鍑哄腑浜哄憳" prop="attendess">
+              <!-- <el-input v-model="form.attendess	" clearable size="small"></el-input> -->
+              <el-select v-model="form.attendess" size="small" style="width: 100%;" filterable clearable multiple >
+                <el-option
+                  v-for="item in personList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璇勫杈撳叆鎯呭喌" prop="reviewInputs">
+              <el-input v-model="form.reviewInputs" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璇勫杩囩▼姒傚喌" prop="reviewProcess">
+              <el-input v-model="form.reviewProcess" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="涓昏璁姒傝堪" prop="mainTopic">
+              <el-input v-model="form.mainTopic"
+                        :rows="5"
+                        clearable
+                        placeholder="璇疯緭鍏ュ唴瀹癸紝鍙緭鍏ュ嚑鍗冨瓧"
+                        size="small"
+                        type="textarea">
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="浜嬮」" prop="matters">
+              <el-input v-model="form.matters" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璐熻矗浜�" prop="head">
+              <el-input v-model="form.head" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="瀹屾垚鏃ユ湡" prop="completionDate">
+              <el-date-picker
+                v-model="form.completionDate"
+                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="24">
+            <el-form-item label="璺熻釜纭浜�" prop="trackingConfirmed">
+              <el-input v-model="form.trackingConfirmed" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璺熻釜鎯呭喌纭璁板綍" prop="follerUp">
+              <el-input v-model="form.follerUp" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="浣撶郴璇勪环" prop="overallEvaluation">
+              <el-input v-model="form.overallEvaluation" clearable size="small"></el-input>
+            </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>
+export default {
+  name: 'reviewReportDia',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      diaLoading: false,
+      loading: false,
+      form: {
+        id: '',
+        objective: '',
+        place: '',
+        compere: '',
+        recordPeople: '',
+        date: '',
+        page: '',
+        judgingMethod: '',
+        reviewBasis: '',
+        attendess	: [],
+        reviewInputs	: '',
+        reviewProcess	: '',
+        mainTopic	: '',
+        matters	: '',
+        head	: '',
+        completionDate	: '',
+        trackingConfirmed	: '',
+        follerUp	: '',
+        overallEvaluation	: '',
+      },
+      rules: {
+        objective: [{required: true, message: '璇峰~鍐欑洰鐨�',trigger: 'blur'}],
+        place: [{required: true, message: '璇峰~鍐欏湴鐐�',trigger: 'blur'}],
+        compere: [{required: true, message: '璇峰~鍐欎富鎸佷汉',trigger: 'blur'}],
+        recordPeople: [{required: true, message: '璇峰~鍐欒褰曚汉',trigger: 'blur'}],
+        date: [{required: true, message: '璇烽�夋嫨鏃ユ湡',trigger: 'change'}],
+        completionDate: [{required: true, message: '璇烽�夋嫨瀹屾垚鏃ユ湡',trigger: 'change'}],
+        page: [{required: true, message: '璇峰~鍐欓〉娆�',trigger: 'blur'}],
+        judgingMethod: [{required: true, message: '璇峰~鍐欒瘎瀹℃柟寮�',trigger: 'blur'}],
+        reviewBasis: [{required: true, message: '璇峰~鍐欒瘎瀹′緷鎹�',trigger: 'blur'}],
+        attendess	: [{required: true, message: '璇峰~鍐欏嚭甯汉鍛�',trigger: 'change'}],
+        reviewInputs	: [{required: true, message: '璇峰~鍐欒瘎瀹¤緭鍏ユ儏鍐�',trigger: 'blur'}],
+        reviewProcess	: [{required: true, message: '璇峰~鍐欒瘎瀹¤緭鍏ユ儏鍐�',trigger: 'blur'}],
+        mainTopic	: [{required: true, message: '璇峰~鍐欎富瑕佽棰樻杩�',trigger: 'blur'}],
+        matters	: [{required: true, message: '璇峰~鍐欎富瑕佽棰樻杩�',trigger: 'blur'}],
+        head	: [{required: true, message: '璇峰~鍐欒礋璐d汉',trigger: 'blur'}],
+        trackingConfirmed	: [{required: true, message: '璇峰~鍐欒窡韪‘璁や汉',trigger: 'blur'}],
+        follerUp	: [{required: true, message: '璇峰~鍐欒窡韪‘璁や汉',trigger: 'blur'}],
+        overallEvaluation	: [{required: true, message: '璇峰~鍐欎綋绯昏瘎浠�',trigger: 'blur'}],
+      },
+      operationType: '',
+      personList: []
+    };
+  },
+  mounted() {
+
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鎵撳紑寮规
+    openDia (type, row) {
+      this.formDia = true
+      this.operationType = type
+      this.getAuthorizedPerson()
+      if (type !== 'add') {
+        this.form = row
+        this.form.attendess = this.form.attendess?this.form.attendess.split(',').map(m=>Number(m)):[]
+      }
+    },
+    // 鎻愪氦寮规鏁版嵁
+    handleEdit () {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.loading = true
+          const internalMeeting = this.HaveJson(this.form)
+          internalMeeting.attendess = internalMeeting.attendess?internalMeeting.attendess.join(','):''
+          if (this.operationType === 'add') {
+            this.$axios.post(this.$api.manageReviewReport.addReviewReport, internalMeeting, {
+              headers: {
+                "Content-Type": "application/json"
+              },
+              noQs: true
+            }).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') {
+            this.$axios.put(this.$api.manageReviewReport.modifyReviewReport, internalMeeting, {
+              headers: {
+                "Content-Type": "application/json"
+              },
+              noQs: true
+            }).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() {
+      this.$axios.get(this.$api.user.getUserMenu).then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.personList = data
+      })
+    },
+  }
+};
+</script>
+
+<style scoped>
+>>>.el-dialog {
+  margin: 4vh auto 50px !important;
+}
+>>>.el-dialog__body {
+  max-height: 600px;
+  overflow-y: auto;
+}
+</style>
diff --git a/src/components/view/a9-management-review.vue b/src/components/view/a9-management-review.vue
new file mode 100644
index 0000000..f89cf25
--- /dev/null
+++ b/src/components/view/a9-management-review.vue
@@ -0,0 +1,47 @@
+<template>
+  <div class="main">
+    <el-tabs v-model="activeName" class="tab-panel" type="border-card">
+      <el-tab-pane label="绠$悊璇勫璁″垝" name="yearPlan">
+        <management-review-plan></management-review-plan>
+      </el-tab-pane>
+      <el-tab-pane label="浼氳璁板綍" name="implementationPlan">
+        <meeting-records></meeting-records>
+      </el-tab-pane>
+      <el-tab-pane label="璇勫鎶ュ憡" name="meetingSignIn">
+        <review-report></review-report>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+import ManagementReviewPlan from '../do/a9-management-review/managementReviewPlan.vue';
+import MeetingRecords from '../do/a9-management-review/meetingRecords.vue';
+import ReviewReport from '../do/a9-management-review/reviewReport.vue';
+
+export default {
+  name: 'a9-management-review',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { ReviewReport, MeetingRecords, ManagementReviewPlan},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      activeName: 'yearPlan',
+    };
+  },
+  mounted() {
+
+  },
+  // 鏂规硶闆嗗悎
+  methods: {}
+};
+</script>
+
+<style scoped>
+.main {
+  padding: 15px 0;
+}
+.tab-panel {
+  background: #fff;
+}
+</style>

--
Gitblit v1.9.3