From 4e0052fc899fcdf47c9e6e57cbb77b12e309a9b3 Mon Sep 17 00:00:00 2001
From: licp <lichunping@guanfang.com.cn>
Date: 星期五, 20 十二月 2024 10:56:18 +0800
Subject: [PATCH] cnas8.5搬迁

---
 src/components/do/a8-measures_deal_risks_opportunities/list_risk_analysis_control_plans.vue      |  318 ++++++++++++++++++++++++
 src/components/view/a8-measures_deal_risks_opportunities.vue                                     |   40 +++
 src/components/do/a8-measures_deal_risks_opportunities/hazard_identification_risk_assessment.vue |  350 ++++++++++++++++++++++++++
 src/assets/api/controller.js                                                                     |   19 +
 4 files changed, 727 insertions(+), 0 deletions(-)

diff --git a/src/assets/api/controller.js b/src/assets/api/controller.js
index 858e9a0..61502f1 100644
--- a/src/assets/api/controller.js
+++ b/src/assets/api/controller.js
@@ -60,6 +60,7 @@
     processTotaldeal,
     processEvaluate,
     qualityMonitor,
+    measuresAddressRisksOpportunities,
   }
 }
 
@@ -785,3 +786,21 @@
   importQualityMonitor:'/qualityMonitor/importQualityMonitor', // 瀵煎叆鐩戞帶璁″垝
   exportQualityMonitorDetail:'/qualityMonitor/exportQualityMonitorDetail', // 瀵煎嚭鐩戞帶璁″垝
 }
+
+// 8.5 搴斿椋庨櫓鍜屾満閬囩殑鎺柦
+const measuresAddressRisksOpportunities = {
+  getPageList: '/manageControlPlanList/getPageList', // 閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗� 鍒嗛〉
+  approvalOfControlPlanChecklist: "/manageControlPlanList/approvalOfControlPlanChecklist", // 閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗� 鎵瑰噯
+  riskAnalysisApprovalOfControlPlanChecklist: "/manageControlPlanList/riskAnalysisApprovalOfControlPlanChecklist", // 閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗� 瀹℃牳
+  importControlPlanList: "/manageControlPlanList/importControlPlanList", // 閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗� 瀵煎叆
+  analysisOfMajorRiskFactorsAdded: "/manageControlPlanList/analysisOfMajorRiskFactorsAdded", // 閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗� 鏂板
+  deleteSignificantRiskFactorAnalysis: "/manageControlPlanList/deleteSignificantRiskFactorAnalysis", // 閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗� 鍒犻櫎
+  getPageResults: "/manageRiskAssessmentResults/getPageResults", // 鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙� 鍒嗛〉
+  hazardIdentificationAndRiskApproval: "/manageRiskAssessmentResults/hazardIdentificationAndRiskApproval", // 鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙� 鎵瑰噯
+  dangerousRiskApproval: "/manageRiskAssessmentResults/dangerousRiskApproval", // 鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙� 瀹℃壒
+  riskAssessmentImport: "manageRiskAssessmentResults/riskAssessmentImport", // 鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙� 瀵煎叆
+  addNewRiskFactors: "/manageRiskAssessmentResults/addNewRiskFactors", // 鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙� 鏂板
+  removeRiskFactors: "/manageRiskAssessmentResults/removeRiskFactors", // 鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙� 鍒犻櫎
+  exportHazardFactorIdentification: "/manageRiskAssessmentResults/exportHazardFactorIdentification", // 鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙� 瀵煎嚭
+  exportSignificantRiskFactors: "/manageControlPlanList/exportSignificantRiskFactors", // 閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗� 瀵煎嚭
+}
\ No newline at end of file
diff --git a/src/components/do/a8-measures_deal_risks_opportunities/hazard_identification_risk_assessment.vue b/src/components/do/a8-measures_deal_risks_opportunities/hazard_identification_risk_assessment.vue
new file mode 100644
index 0000000..bd5bf4b
--- /dev/null
+++ b/src/components/do/a8-measures_deal_risks_opportunities/hazard_identification_risk_assessment.vue
@@ -0,0 +1,350 @@
+<template>
+  <div style="padding: 10px">
+    <div class="header">
+      <div>鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙�</div>
+      <div style="min-width: 200px">
+        <el-button type="primary" size="small" @click="addFun">鏂� 澧�</el-button>
+        <el-button type="primary" size="small" @click="approvalFun">瀹� 鎵�</el-button>
+        <el-button type="primary" size="small" @click="approveFun">鎵� 鍑�</el-button>
+        <el-upload
+          style="display: inline-block; padding: 0 6px"
+          :headers="headers"
+          :action="action"
+          :on-error="onError"
+          :show-file-list="false"
+          :on-success="onSuccess">
+          <el-button size="small" type="primary">瀵� 鍏�</el-button>
+        </el-upload>
+        <el-button size="small" @click="openDownloadDia">瀵煎嚭</el-button>
+      </div>
+    </div>
+    <el-table
+      :data="tableData"
+      style="width: 100%"
+      height="calc(100vh - 18em)">
+      <el-table-column type="index" label="搴忓彿" width="120">
+        <template v-slot="scope">
+          <span>{{ (search.current - 1) * search.size + scope.$index + 1 }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="venue" label="鍦扮偣/娲诲姩" min-width="180"></el-table-column>
+      <el-table-column prop="hazard" label="鍗遍櫓鍥犵礌" width="testDate" min-width="180"></el-table-column>
+      <el-table-column prop="accidents" label="鍙兘瀵艰嚧鐨勪簨鏁�" min-width="180"></el-table-column>
+      <el-table-column prop="injury" label="瀵逛汉鍙兘閫犳垚鐨勫嵄瀹�" min-width="180"></el-table-column>
+      <el-table-column label="椋庨櫓璇勪环" align="center" min-width="180">
+        <template>
+          <el-table-column prop="riskL" label="L" min-width="80"></el-table-column>
+          <el-table-column prop="riskE" label="E" min-width="80"></el-table-column>
+          <el-table-column prop="riskC" label="C" min-width="80"></el-table-column>
+          <el-table-column prop="riskD" label="D" min-width="80"></el-table-column>
+        </template>
+      </el-table-column>
+      <el-table-column prop="level" label="椋庨櫓绛夌骇" min-width="180"></el-table-column>
+      <el-table-column prop="measures" label="鎺у埗鎺柦" min-width="180"></el-table-column>
+      <el-table-column prop="editorName" label="缂栧埗浜哄鍚�" min-width="180"></el-table-column>
+      <el-table-column prop="editorDate" label="缂栧埗鏃ユ湡" min-width="180"></el-table-column>
+      <el-table-column prop="approvalName" label="瀹℃壒浜哄鍚�" min-width="180"></el-table-column>
+      <el-table-column prop="approvalDate" label="瀹℃壒鏃ユ湡" min-width="180"></el-table-column>
+      <el-table-column prop="approvalStatus" label="瀹℃壒鐘舵��" min-width="180">
+        <template #default="{ row }">
+          {{ row.approvalStatus === 1 ? '閫氳繃' : row.approvalStatus === 2 ? '涓嶉�氳繃' : '' }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="approveName" label="鎵瑰噯浜哄鍚�" min-width="180"></el-table-column>
+      <el-table-column prop="approveStatus" label="鎵瑰噯鐘舵��" min-width="180">
+        <template #default="{ row }">
+          {{ row.approveStatus === 1 ? '閫氳繃' : row.approveStatus === 2 ? '涓嶉�氳繃' : '' }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="approveDate" label="鎵瑰噯鏃ユ湡" min-width="180"></el-table-column>
+      <el-table-column
+        fixed="right"
+        label="鎿嶄綔"
+        width="100">
+        <template v-slot="scope">
+          <el-button @click="deleteClick(scope.row)" type="text" size="small">鍒犻櫎</el-button>
+          <el-button type="text" size="small" @click="editClick(scope.row)">缂栬緫</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination :current-page="1" :page-size="search.size" :page-sizes="[10, 20, 30, 50, 100]"
+                   :total="search.total" layout="->,total, sizes, prev, pager, next, jumper"
+                   @size-change="handleSizeChange"
+                   @current-change="handleCurrentChange">
+    </el-pagination>
+    <el-dialog
+      title="鎻愮ず"
+      :visible.sync="dialogVisible"
+      width="50%">
+      <el-form ref="form" :model="form" label-width="120px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鍦扮偣/娲诲姩">
+              <el-input v-model="form.venue" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍗遍櫓鍥犵礌">
+              <el-input v-model="form.hazard" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍙兘瀵艰嚧鐨勪簨鏁�">
+              <el-input v-model="form.accidents" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="瀵逛汉鍙兘閫犳垚鐨勫嵄瀹�" label-width="140px">
+              <el-input v-model="form.injury" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="椋庨櫓璇勪环/L">
+              <el-input v-model="form.riskL" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="椋庨櫓璇勪环/E">
+              <el-input v-model="form.riskE" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="椋庨櫓璇勪环/C">
+              <el-input v-model="form.riskC" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="椋庨櫓璇勪环/D">
+              <el-input v-model="form.riskD" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="椋庨櫓绛夌骇">
+              <el-input v-model="form.level" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎺у埗鎺柦">
+              <el-input v-model="form.measures" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="addApi" :loading="loading">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      dialogVisible: false,
+      form: {},
+      search: {
+        size: 20,
+        current: 1,
+        total: 0
+      },
+      tableData: [],
+      loading: false
+    }
+  },
+  computed: {
+    headers() {
+      return {
+        'token': sessionStorage.getItem('token')
+      }
+    },
+    action() {
+      return this.javaApi + this.$api.measuresAddressRisksOpportunities.riskAssessmentImport
+    }
+  },
+  methods: {
+    handleSizeChange(val) {
+      this.search.size = val;
+      this.initData();
+    },
+    handleCurrentChange(val) {
+      this.search.current = val;
+      this.initData();
+    },
+    // 鍒嗛〉琛ㄦ牸鍒濆鍖�
+    initData() {
+      this.tableData = []
+      this.$axios.get(this.$api.measuresAddressRisksOpportunities.getPageResults + '?size=' + this.search.size + '&current=' + this.search.current).then(res => {
+        if (res.code === 201) return;
+        this.tableData = res.data.records;
+        this.search.total = res.data.total;
+      });
+    },
+    // 瀹℃壒
+    approvalFun() {
+      let user = JSON.parse(localStorage.getItem('user'))
+      this.$confirm('鏄惁瀹℃壒閫氳繃?', '鎻愮ず', {
+        confirmButtonText: '閫氳繃',
+        cancelButtonText: '涓嶉�氳繃',
+        type: 'warning',
+        closeOnClickModal: false, // 绂佹鐐瑰嚮閬僵灞傚叧闂�
+        distinguishCancelAndClose: true,
+        beforeClose: (action, instance, done) => {
+          if (action === 'confirm') {
+            this.approvalApi(user.userId, 1)
+            done();
+          } else if (action === 'cancel') {
+            this.approvalApi(user.userId, 2)
+            done();
+          } else if (action === 'close') {
+            // 鐐瑰嚮鈥溍椻�濇寜閽紝涓嶅厑璁稿叧闂�
+            done();
+          }
+        }
+      })
+    },
+    // 瀹℃壒鎺ュ彛
+    approvalApi(userId, status) {
+      this.$axios.get(this.$api.measuresAddressRisksOpportunities.dangerousRiskApproval + '?approval=' + userId + '&status=' + status).then(res => {
+        if (res.code === 201) return;
+        this.initData()
+        this.$message({
+          type: 'success',
+          message: '鎿嶄綔鎴愬姛!'
+        });
+      });
+    },
+    // 鎵瑰噯
+    approveFun() {
+      let user = JSON.parse(localStorage.getItem('user'))
+      this.$confirm('鏄惁鎵瑰噯閫氳繃?', '鎻愮ず', {
+        confirmButtonText: '閫氳繃',
+        cancelButtonText: '涓嶉�氳繃',
+        type: 'warning',
+        closeOnClickModal: false, // 绂佹鐐瑰嚮閬僵灞傚叧闂�
+        distinguishCancelAndClose: true,
+        beforeClose: (action, instance, done) => {
+          if (action === 'confirm') {
+            this.approveApi(user.userId, 1)
+            done();
+          } else if (action === 'cancel') {
+            this.approveApi(user.userId, 2)
+            done();
+          } else if (action === 'close') {
+            // 鐐瑰嚮鈥溍椻�濇寜閽紝涓嶅厑璁稿叧闂�
+            done();
+          }
+        }
+      })
+    },
+    // 鎵瑰噯鎺ュ彛
+    approveApi(userId, status) {
+      this.$axios.get(this.$api.measuresAddressRisksOpportunities.hazardIdentificationAndRiskApproval + '?approve=' + userId + '&status=' + status).then(res => {
+        if (res.code === 201) return;
+        this.initData()
+        this.$message({
+          type: 'success',
+          message: '鎿嶄綔鎴愬姛!'
+        });
+      });
+    },
+    // 鏂囦欢涓婁紶澶辫触
+    onError() {
+      this.$message({
+        type: 'error',
+        message: '鎿嶄綔澶辫触!'
+      });
+    },
+    // 鏂囦欢涓婁紶鎴愬姛
+    onSuccess(response) {
+      if (response.code == 201) {
+        this.$message({
+          type: 'error',
+          message: response.message,
+        });
+        return
+      }
+      this.initData()
+      this.$message({
+        type: 'success',
+        message: '鎿嶄綔鎴愬姛!'
+      });
+    },
+    addFun() {
+      this.dialogVisible = true
+    },
+    // 鍒犻櫎
+    deleteClick(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.$axios.get(this.$api.measuresAddressRisksOpportunities.removeRiskFactors + "?id=" + row.id).then(res => {
+          if (res.code === 201) return;
+          this.initData()
+          this.$message({
+            type: 'success',
+            message: '鎿嶄綔鎴愬姛!'
+          });
+        });
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    addApi() {
+      this.loading = true
+      this.$axios.post(this.$api.measuresAddressRisksOpportunities.addNewRiskFactors, this.form, {
+        headers: {
+          'Content-Type': 'application/json'
+        }
+      }).then(res => {
+        if (res.code === 201) return;
+        this.dialogVisible = false
+        this.loading = false
+        this.initData()
+        this.$message({
+          type: 'success',
+          message: '鎿嶄綔鎴愬姛!'
+        });
+      }).catch(err => {
+        this.loading = false
+      });
+    },
+    // 缂栬緫
+    editClick(row) {
+      this.form = {...row}
+      this.dialogVisible = true
+    },
+    // 瀵煎嚭
+    openDownloadDia () {
+      this.$axios.get( this.$api.measuresAddressRisksOpportunities.exportHazardFactorIdentification,{responseType: "blob"}).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res],{ type: 'application/msword' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = '鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙�' + '.docx';
+        link.click();
+      })
+    },
+  },
+  mounted() {
+    this.initData()
+  },
+}
+</script>
+
+<style scoped>
+.header {
+  height: 3em;
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+}
+</style>
diff --git a/src/components/do/a8-measures_deal_risks_opportunities/list_risk_analysis_control_plans.vue b/src/components/do/a8-measures_deal_risks_opportunities/list_risk_analysis_control_plans.vue
new file mode 100644
index 0000000..dfd1d35
--- /dev/null
+++ b/src/components/do/a8-measures_deal_risks_opportunities/list_risk_analysis_control_plans.vue
@@ -0,0 +1,318 @@
+<template>
+  <div style="padding: 10px">
+    <div class="header">
+      <div>閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗�</div>
+      <div style="min-width: 200px">
+        <el-button type="primary" size="small" @click="addFun">鏂� 澧�</el-button>
+        <el-button type="primary" size="small" @click="approvalFun">瀹� 鎵�</el-button>
+        <el-button type="primary" size="small" @click="approveFun">鎵� 鍑�</el-button>
+        <el-upload
+          style="display: inline-block; padding: 0 6px"
+          :action="action"
+          :headers="headers"
+          :on-error="onError"
+          :show-file-list="false"
+          :on-success="onSuccess">
+          <el-button size="small" type="primary">瀵� 鍏�</el-button>
+        </el-upload>
+        <el-button size="small" @click="openDownloadDia">瀵煎嚭</el-button>
+      </div>
+    </div>
+    <el-table
+      :data="tableData"
+      style="width: 100%"
+      height="calc(100vh - 18em)">
+      <el-table-column type="index" label="搴忓彿" width="120">
+        <template v-slot="scope">
+          <span>{{ (search.current - 1) * search.size + scope.$index + 1 }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="jobActivity" label="浣滀笟娲诲姩" min-width="180"></el-table-column>
+      <el-table-column prop="category" label="椋庨櫓鍥犵礌绫诲埆" width="testDate" min-width="180"></el-table-column>
+      <el-table-column prop="description" label="椋庨櫓鍥犵礌鎻忚堪" min-width="180"></el-table-column>
+      <el-table-column prop="result" label="鍙鑷寸殑浜嬫晠" min-width="180"></el-table-column>
+      <el-table-column prop="intolerable" label="鏄惁涓嶅彲鎵垮彈椋庨櫓" min-width="180"></el-table-column>
+      <el-table-column prop="plan" label="鎺у埗璁″垝" min-width="180"></el-table-column>
+      <el-table-column prop="editorName" label="缂栧埗浜哄鍚�" min-width="180"></el-table-column>
+      <el-table-column prop="editorDate" label="缂栧埗鏃ユ湡" min-width="180"></el-table-column>
+      <el-table-column prop="approvalName" label="瀹℃壒濮撳悕" min-width="180"></el-table-column>
+      <el-table-column prop="approvalDate" label="瀹℃壒鏃ユ湡" min-width="180"></el-table-column>
+      <el-table-column prop="approvalStatus" label="瀹℃壒鐘舵��" min-width="180">
+        <template #default="{ row }">
+          {{ row.approvalStatus ===  1 ? '閫氳繃' : row.approvalStatus ===  2 ? '涓嶉�氳繃' : '' }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="approveName" label="鎵瑰噯濮撳悕" min-width="180"></el-table-column>
+      <el-table-column prop="approveStatus" label="鎵瑰噯鐘舵��" min-width="180">
+        <template #default="{ row }">
+          {{ row.approveStatus ===  1 ? '閫氳繃' : row.approveStatus ===  2 ? '涓嶉�氳繃' : '' }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="approveDate" label="鎵瑰噯浜烘棩鏈�" min-width="180"></el-table-column>
+      <el-table-column
+        fixed="right"
+        label="鎿嶄綔"
+        width="100">
+        <template v-slot="scope">
+          <el-button @click="deleteClick(scope.row)" type="text" size="small">鍒犻櫎</el-button>
+          <el-button type="text" size="small" @click="editClick(scope.row)">缂栬緫</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination :current-page="1" :page-size="search.size" :page-sizes="[10, 20, 30, 50, 100]"
+                   :total="search.total" layout="->,total, sizes, prev, pager, next, jumper"
+                   @size-change="handleSizeChange"
+                   @current-change="handleCurrentChange">
+    </el-pagination>
+    <el-dialog
+      title="鎻愮ず"
+      :visible.sync="dialogVisible"
+      width="50%">
+      <el-form ref="form" :model="form" label-width="120px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="浣滀笟娲诲姩">
+              <el-input v-model="form.jobActivity" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="椋庨櫓鍥犵礌绫诲埆">
+              <el-input v-model="form.category" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="椋庨櫓鍥犵礌鎻忚堪">
+              <el-input v-model="form.description" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍙鑷寸殑浜嬫晠">
+              <el-input v-model="form.result" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏄惁涓嶅彲鎵垮彈椋庨櫓" label-width="130px">
+              <el-input v-model="form.intolerable" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎺у埗璁″垝">
+              <el-input v-model="form.plan" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="addApi" :loading="loading">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      dialogVisible: false,
+      form: {},
+      loading: false,
+      search: {
+        size: 20,
+        current: 1,
+        total: 0
+      },
+      tableData: [],
+    }
+  },
+  computed: {
+    headers() {
+      return {
+        'token': sessionStorage.getItem('token')
+      }
+    },
+    action() {
+      return this.javaApi + this.$api.measuresAddressRisksOpportunities.importControlPlanList
+    }
+  },
+  methods: {
+    handleSizeChange(val) {
+      this.search.size = val;
+      this.initData();
+    },
+    handleCurrentChange(val) {
+      this.search.current = val;
+      this.initData();
+    },
+    initData() {
+      this.$axios.get(this.$api.measuresAddressRisksOpportunities.getPageList + '?size=' + this.search.size + '&current=' + this.search.current).then(res => {
+        if (res.code === 201) return;
+        this.tableData = res.data.records;
+        this.search.total = res.data.total;
+      });
+    },
+    // 瀹℃壒
+    approvalFun() {
+      let user = JSON.parse(localStorage.getItem('user'))
+      this.$confirm('鏄惁瀹℃壒閫氳繃?', '鎻愮ず', {
+        confirmButtonText: '閫氳繃',
+        cancelButtonText: '涓嶉�氳繃',
+        type: 'warning',
+        closeOnClickModal: false, // 绂佹鐐瑰嚮閬僵灞傚叧闂�
+        distinguishCancelAndClose: true,
+        beforeClose: (action, instance, done) => {
+          if (action === 'confirm') {
+            this.approvalApi(user.userId, 1)
+            done();
+          } else if (action === 'cancel') {
+            this.approvalApi(user.userId, 2)
+            done();
+          } else if (action === 'close') {
+            // 鐐瑰嚮鈥溍椻�濇寜閽紝涓嶅厑璁稿叧闂�
+            done();
+          }
+        }
+      })
+    },
+    // 瀹℃壒鎺ュ彛
+    approvalApi(userId, status) {
+      this.$axios.get(this.$api.measuresAddressRisksOpportunities.riskAnalysisApprovalOfControlPlanChecklist + '?approval=' + userId + '&status=' + status).then(res => {
+        if (res.code === 201) return;
+        this.initData()
+        this.$message({
+          type: 'success',
+          message: '鎿嶄綔鎴愬姛!'
+        });
+      });
+    },
+    // 鎵瑰噯
+    approveFun() {
+      let user = JSON.parse(localStorage.getItem('user'))
+      this.$confirm('鏄惁鎵瑰噯閫氳繃?', '鎻愮ず', {
+        confirmButtonText: '閫氳繃',
+        cancelButtonText: '涓嶉�氳繃',
+        type: 'warning',
+        closeOnClickModal: false, // 绂佹鐐瑰嚮閬僵灞傚叧闂�
+        distinguishCancelAndClose: true,
+        beforeClose: (action, instance, done) => {
+          if (action === 'confirm') {
+            this.approveApi(user.userId, 1)
+            done();
+          } else if (action === 'cancel') {
+            this.approveApi(user.userId, 2)
+            done();
+          } else if (action === 'close') {
+            // 鐐瑰嚮鈥溍椻�濇寜閽紝涓嶅厑璁稿叧闂�
+            done();
+          }
+        }
+      })
+    },
+    // 鎵瑰噯鎺ュ彛
+    approveApi(userId, status) {
+      this.$axios.get(this.$api.measuresAddressRisksOpportunities.approvalOfControlPlanChecklist + '?approve=' + userId + '&status=' + status).then(res => {
+        if (res.code === 201) return;
+        this.initData()
+        this.$message({
+          type: 'success',
+          message: '鎿嶄綔鎴愬姛!'
+        });
+      });
+    },
+    onError() {
+      this.$message({
+        type: 'error',
+        message: '鎿嶄綔澶辫触!'
+      });
+    },
+    onSuccess(response) {
+      if (response.code == 201) {
+        this.$message({
+          type: 'error',
+          message: response.message,
+        });
+        return
+      }
+      this.initData()
+      this.$message({
+        type: 'success',
+        message: '鎿嶄綔鎴愬姛!'
+      });
+    },
+    addFun() {
+      this.dialogVisible = true
+    },
+    // 鍒犻櫎
+    deleteClick(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.$axios.get(this.$api.measuresAddressRisksOpportunities.deleteSignificantRiskFactorAnalysis + "?id=" +  row.id).then(res => {
+          if (res.code === 201) return;
+          this.initData()
+          this.$message({
+            type: 'success',
+            message: '鎿嶄綔鎴愬姛!'
+          });
+        });
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    addApi() {
+      this.loading = true
+      this.$axios.post(this.$api.measuresAddressRisksOpportunities.analysisOfMajorRiskFactorsAdded, this.form, {
+        headers: {
+          'Content-Type': 'application/json'
+        }
+      }).then(res => {
+        if (res.code === 201) return;
+        this.dialogVisible = false
+        this.loading = false
+        this.initData()
+        this.$message({
+          type: 'success',
+          message: '鎿嶄綔鎴愬姛!'
+        });
+      }).catch(err => {
+        this.loading = false
+      });
+    },
+    // 缂栬緫
+    editClick(row) {
+      this.form = {...row}
+      this.dialogVisible = true
+    },
+    // 瀵煎嚭
+    openDownloadDia () {
+      this.$axios.get( this.$api.measuresAddressRisksOpportunities.exportSignificantRiskFactors,{responseType: "blob"}).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res],{ type: 'application/msword' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = '閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗�' + '.docx';
+        link.click();
+      })
+    },
+  },
+  mounted() {
+    this.initData()
+  },
+}
+</script>
+
+<style scoped>
+.header {
+  height: 3em;
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+}
+</style>
diff --git a/src/components/view/a8-measures_deal_risks_opportunities.vue b/src/components/view/a8-measures_deal_risks_opportunities.vue
new file mode 100644
index 0000000..cf80f44
--- /dev/null
+++ b/src/components/view/a8-measures_deal_risks_opportunities.vue
@@ -0,0 +1,40 @@
+<template>
+  <div class="main">
+    <el-tabs v-model="activeName" type="border-card" :lazy="true">
+      <el-tab-pane label="鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙�" name="鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙�">
+        <HazardIdentificationRiskAssessment v-if="activeName === '鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙�'"/>
+      </el-tab-pane>
+      <el-tab-pane label="閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗�" name="閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗�">
+        <listRiskAnalysisControlPlans v-if="activeName === '閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗�'"/>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+
+import HazardIdentificationRiskAssessment
+  from "../do/a8-measures_deal_risks_opportunities/hazard_identification_risk_assessment.vue";
+import listRiskAnalysisControlPlans
+  from "../do/a8-measures_deal_risks_opportunities/list_risk_analysis_control_plans.vue";
+export default {
+  components: {HazardIdentificationRiskAssessment, listRiskAnalysisControlPlans},
+  data() {
+    return {
+      activeName: '鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙�',
+    }
+  }
+}
+</script>
+
+<style scoped>
+.main {
+  padding: 15px 0;
+  width: 100%;
+  border-radius: 15px;
+}
+/deep/ .el-tabs--border-card>.el-tabs__content {
+  height: calc(100vh - 9em);
+  padding: 0;
+}
+</style>

--
Gitblit v1.9.3