Browse Source

风险模块新增风险矩阵算法

luoaoxuan 1 year ago
parent
commit
85dcf63f00
2 changed files with 56 additions and 50 deletions
  1. 48 43
      src/views/platform/risk/riskDetail.vue
  2. 8 7
      src/views/platform/risk/riskV2.vue

+ 48 - 43
src/views/platform/risk/riskDetail.vue

@@ -301,28 +301,19 @@ export default {
             form: {
                 xuan_ze_feng_xian: ''
             },
-            activeName: '严重程度分级描述',
+            activeName: '风险等级及应对措施说明',
             content: [
-                { label: '严重程度分级描述', value: `1级:轻微,不会对检验科人员、设备、环境、形象造成损害;不会对检验质量造成影响;造成轻微的财产损失;无检验科信息泄露。
-2级:一般,对检验科人员、设备、环境、形象造成轻微损害,对检验质量和TAT造成影响,能通过现场及时处置解决或缓解出现的损害和影响;造成一定的财产损失;未造成投诉;无检验科信息泄露。
-3级:较严重,对检验科人员、设备、环境、形象造成损害,对检验质量和TAT造成影响,无法通过现场及时处置解决或缓解出现的损害和影响;被投诉至检验科管理层;造成较大的财产的损失;有检验科信息泄露。
-4级:严重,对检验科人员造成较大伤害;对仪器设备造成损坏;对周边较少的人员或环境产生损害;对检验质量、TAT、临床诊疗造成严重影响;造成重大的的经济损失;被投诉至上级主管部门;造成不良的社会影响。
-5级:非常严重,对检验科人员造成重大伤害甚至死亡;对仪器设备造成损毁;极度影响检验质量和TAT,对临床造成极大误诊致使病人死亡;对周边人员或环境产生重大损害;造成恶劣的社会影响;导致检验科停工停业。 ` },
-                { label: '发生概率分级表说明', value: `1级:基本不可能发生,评估范围内未发生过,类似区域/行业也极少发生。
-2级:较不可能发生,评估范围内未发生过,类似区域/行业偶有发生。
-3级:可能发生,评估范围内发生过,类似区域/行业也偶有发生; 评估范围内未发生过,但类似区域/行业发生频率较高。
-4级:很有可能发生,评估范围内发生频率较高。
-5级:必定会发生,评估范围内发生频率很高。` },
-                { label: '事件可检测度描述', value: `1级:确定,当某项风险发生时,根据现有的控制手段及检测方法,能准确识别出。
-2级:大,当某项风险发生时,根据现有的控制手段及检测方法,识别出的概率较大。
-3级:中等,当某项风险发生时,根据现有的控制手段及检测方法,识别出的概率中等。
-4级:小,当某项风险发生时,根据现有的控制手段及检测方法,识别出的概率较小。
-5级:不可测,当某项风险发生时,根据现有的控制手段及检测方法,不可识别。` },
-                { label: '风险等级及应对措施说明', value: `低风险:1-4,风险较低,当采取措施消除风险引起的成本比风险本身引起的损失较大时,接受风险。
-中风险:5-11,可采取措施降低风险。
-高风险:12-25,应采取措施规避或降低风险。` }
+                { label: '严重程度分级描述', value: '/' },
+                { label: '发生概率分级表说明', value: '/' },
+                { label: '事件可检测度描述', value: '/' },
+                { label: '风险等级及应对措施说明', value: `未找到配置数据,使用默认配置:
+低:[[1,1],[1,2],[1,3],[2,1],[2,2],[3,1]],可保持已有的安全措施。
+中:[[1,4],[1,5],[2,3],[2,4],[3,2],[3,3],[4,1],[4,2],[5,1]],需采取有效措施对风险进行控制。
+高:[[2,5],[3,4],[3,5],[4,3],[4,4],[5,2],[5,3]],需采取有效措施对风险进行控制。
+极高:[[4,5],[5,4],[5,5]],需采取有效措施对风险进行控制。` }
             ],
-            fengXianDengJi2: { label: '风险等级及应对措施说明', value: `可忽略的:1-8,稍有危险,可以接受。
+            fengXianDengJi2: { label: '风险等级及应对措施说明', value: `未找到配置数据,使用默认配置:
+可忽略的:1-8,稍有危险,可以接受。
 可接受的:9-27,一般危险,需要注意。
 中度的:28-63,显著危险,需要整改。
 重大的:64-99,高度危险,需立即整改。
@@ -347,13 +338,14 @@ export default {
             tableList: [],
             Ids: [],
             fengXianJiSuan: [],
-            muban: '1'
+            muban: '1',
+            leixing: '安全'
         }
     },
     computed: {
         descriptionContent () {
-            const msg1 = '1.当前风险系数计算公式为模板一。2.风险系数 RPN = Severity(严重度) × Occurrence(发生度)。'
-            const msg2 = '1.当前风险系数计算公式为模板二。2.风险系数 RPN = Severity(严重度) × Occurrence(发生度)× Likelihood of Detection(检测度)。'
+            const msg1 = '1.当前风险系数计算公式为模板一:风险矩阵法。2.风险等级由严重程度和发生频度组成的坐标值映射成为矩阵坐标。'
+            const msg2 = '1.当前风险系数计算公式为模板二:FMEA法。2.风险系数 RPN = Severity(严重度) × Occurrence(发生度)× Likelihood of Detection(检测度)。'
             switch (this.muban) {
                 case '1':
                     return msg1
@@ -472,12 +464,15 @@ export default {
                 this.Ids = []
             }
             this.muban = this.params.ji_suan_fang_shi_
-            console.log('模板类型:', this.muban)
+            this.leixing = this.params.feng_xian_lei_xin
+            if (this.muban === '2') {
+                this.content[3] = this.fengXianDengJi2
+            }
             // 获取风险等级相关
-            const degreeSql = `select yan_zhong_cheng_d, fen_ji_, miao_shu_ FROM t_yzcdfjbzb WHERE zi_fen_lei_ ='严重程度' and di_dian_ = '${this.level}' and mo_ban_fen_lei_='${this.muban}' ORDER BY fen_ji_ ASC`
-            const gailvSql = `select yan_zhong_cheng_d, fen_ji_, miao_shu_ FROM t_yzcdfjbzb WHERE zi_fen_lei_ ='发生概率' and di_dian_ = '${this.level}' and mo_ban_fen_lei_='${this.muban}' ORDER BY fen_ji_ ASC`
-            const dengjiSql = `select yan_zhong_cheng_d, fen_ji_, miao_shu_ FROM t_yzcdfjbzb WHERE zi_fen_lei_ ='风险等级' and di_dian_ = '${this.level}' and mo_ban_fen_lei_='${this.muban}'`
-            const jianCeSql = `select yan_zhong_cheng_d, fen_ji_, miao_shu_ FROM t_yzcdfjbzb WHERE zi_fen_lei_ ='可检测度' and di_dian_ = '${this.level}' and mo_ban_fen_lei_='${this.muban}' ORDER BY fen_ji_ ASC`
+            const degreeSql = `select feng_xian_lei_xin,yan_zhong_cheng_d, fen_ji_, miao_shu_ FROM t_yzcdfjbzb WHERE zi_fen_lei_ ='严重程度' and di_dian_ = '${this.level}' and mo_ban_fen_lei_='${this.muban}' and feng_xian_lei_xin='${this.leixing}' ORDER BY fen_ji_ ASC`
+            const gailvSql = `select feng_xian_lei_xin,yan_zhong_cheng_d, fen_ji_, miao_shu_ FROM t_yzcdfjbzb WHERE zi_fen_lei_ ='发生概率' and di_dian_ = '${this.level}' and mo_ban_fen_lei_='${this.muban}' and feng_xian_lei_xin='${this.leixing}' ORDER BY fen_ji_ ASC`
+            const dengjiSql = `select feng_xian_lei_xin,yan_zhong_cheng_d, fen_ji_, miao_shu_ FROM t_yzcdfjbzb WHERE zi_fen_lei_ ='风险等级' and di_dian_ = '${this.level}' and mo_ban_fen_lei_='${this.muban}' and feng_xian_lei_xin='${this.leixing}'`
+            const jianCeSql = `select feng_xian_lei_xin,yan_zhong_cheng_d, fen_ji_, miao_shu_ FROM t_yzcdfjbzb WHERE zi_fen_lei_ ='可检测度' and di_dian_ = '${this.level}' and mo_ban_fen_lei_='${this.muban}' and feng_xian_lei_xin='${this.leixing}' ORDER BY fen_ji_ ASC`
             Promise.all([
                 this.$common.request('sql', degreeSql),
                 this.$common.request('sql', gailvSql),
@@ -501,6 +496,9 @@ export default {
                 if (responses[3].variables != null && responses[3].variables.data != null && responses[3].variables.data.length > 0) {
                     jianCeData = responses[3].variables.data
                 }
+                if (degreeData.length === 0 || gailvData.length === 0 || dengjiData.length === 0 || (this.muban === '2' && jianCeData.length === 0)) {
+                    throw new Error(`检测到风险类型为${this.leixing}且计算方式为${this.muban === '1' ? '风险矩阵法' : 'FMEA法'}的配置数据不完整,请配置完成后再使用!`)
+                }
                 let degreeWord = ''
                 let gailvWord = ''
                 let dengjiWord = ''
@@ -518,29 +516,25 @@ export default {
                     jianCeWord += `${el.fen_ji_}级:${el.yan_zhong_cheng_d},${el.miao_shu_}\n`
                 }
                 if (degreeData.length > 0) {
-                    console.log('严重程度使用配置值')
                     this.content[0].value = degreeWord
                     this.yan_zhong_cheng_d_List = degreeData.map(item => item.fen_ji_)
                 }
                 if (gailvData.length > 0) {
-                    console.log('发生概率使用配置值')
                     this.content[1].value = gailvWord
                     this.fa_sheng_pin_du_List = gailvData.map(item => item.fen_ji_)
                 }
                 if (jianCeData.length > 0) {
-                    console.log('可检测度使用配置值')
                     this.content[2].value = jianCeWord
                     this.ke_jian_ce_du_List = jianCeData.map(item => item.fen_ji_)
                 }
                 if (dengjiData.length > 0) {
-                    console.log('风险等级使用配置值')
                     this.content[3].value = dengjiWord
                 }
                 this.fengXianJiSuan = dengjiData
                 this.loading = false
             }).catch(error => {
                 // 处理错误
-                console.error('Error fetching data:', error)
+                this.$message.warning(error.message)
                 this.loading = false
             })
         },
@@ -590,22 +584,33 @@ export default {
                         let rate = ''
                         rate = +row.yan_zhong_cheng_d * +row.fa_sheng_pin_du_
                         if (this.fengXianJiSuan.length === 0) {
-                            if (rate >= 1 && rate <= 4) {
-                                degree = '低风险'
+                            if (rate >= 1 && rate < 4) {
+                                degree = '低'
                             }
-                            if (rate >= 5 && rate <= 11) {
-                                degree = '中风险'
+                            if (rate > 4 && rate <= 9) {
+                                degree = '中'
                             }
-                            if (rate >= 12 && rate <= 25) {
-                                degree = '高风险'
+                            if (rate >= 10 && rate <= 16) {
+                                degree = '高'
+                            }
+                            if (rate >= 20 && rate <= 25) {
+                                degree = '极高'
+                            }
+                            if (rate === 4) {
+                                if (+row.yan_zhong_cheng_d === 2 && +row.fa_sheng_pin_du_ === 2) {
+                                    degree = '低'
+                                } else {
+                                    degree = '中'
+                                }
                             }
                         } else {
                             for (let i = 0; i < this.fengXianJiSuan.length; i++) {
                                 const item = this.fengXianJiSuan[i]
                                 if (item.yan_zhong_cheng_d) {
-                                    const [a, b] = item.yan_zhong_cheng_d.split('-')
-                                    if (a && b) {
-                                        if (rate >= +a.trim() && rate <= +b.trim()) {
+                                    const arr = JSON.parse(item.yan_zhong_cheng_d) || []
+                                    for (let j = 0; j < arr.length; j++) {
+                                        const [a, b] = arr[j]
+                                        if (+a === +row.yan_zhong_cheng_d && +b === +row.fa_sheng_pin_du_) {
                                             degree = item.fen_ji_
                                             break
                                         }
@@ -614,7 +619,7 @@ export default {
                             }
                         }
 
-                        this.$set(row, 'feng_xian_ying_du', (!row.feng_xian_ying_du && degree === '低风险') ? '风险接受' : '风险降低')
+                        this.$set(row, 'feng_xian_ying_du', (!row.feng_xian_ying_du && degree === '低') ? '风险接受' : '风险降低')
                         row.feng_xian_zhi_shu = rate + ''
                         row.feng_xian_deng_ji = degree
                     }

+ 8 - 7
src/views/platform/risk/riskV2.vue

@@ -120,8 +120,8 @@
                     </el-descriptions-item>
                     <el-descriptions-item label="风险类型">
                         <div>
-                            <el-radio v-model="infoFxssbData.feng_xian_lei_xin" label="质量" size="mini" :disabled="readonly">质量</el-radio>
-                            <el-radio v-model="infoFxssbData.feng_xian_lei_xin" label="安全" size="mini" :disabled="readonly">安全</el-radio>
+                            <el-radio v-model="infoFxssbData.feng_xian_lei_xin" label="质量" size="mini" :disabled="isEdit">质量</el-radio>
+                            <el-radio v-model="infoFxssbData.feng_xian_lei_xin" label="安全" size="mini" :disabled="isEdit">安全</el-radio>
                         </div>
                     </el-descriptions-item>
                     <el-descriptions-item label="时机" :span="1">
@@ -136,16 +136,17 @@
 
                     </el-descriptions-item>
 
-                    <el-descriptions-item label="范围" :span="1">
+                    <el-descriptions-item label="范围" :span="2">
                         <el-input v-model="infoFxssbData.fan_wei_" :disabled="readonly" size="mini" />
                     </el-descriptions-item>
                     <el-descriptions-item label="方法" :span="1">
                         <el-input v-model="infoFxssbData.fang_fa_" :disabled="readonly" size="mini" />
                     </el-descriptions-item>
-                    <el-descriptions-item label="风险系数计算方式" :span="2">
+                    <el-descriptions-item label="风险系数计算方式" :span="1">
                         <span class="required-star">*</span>
-                        <el-radio v-model="infoFxssbData.ji_suan_fang_shi_" label="1" size="mini" :disabled="isEdit">S * O(严重度*发生率)</el-radio>
-                        <el-radio v-model="infoFxssbData.ji_suan_fang_shi_" label="2" size="mini" :disabled="isEdit">S * O * D(严重度*发生率*可检测度)</el-radio>
+                        <el-radio v-model="infoFxssbData.ji_suan_fang_shi_" label="1" size="mini" :disabled="isEdit">风险矩阵法</el-radio>
+                        <el-radio v-model="infoFxssbData.ji_suan_fang_shi_" label="2" size="mini" :disabled="isEdit">FMEA法
+                        </el-radio>
                     </el-descriptions-item>
 
                     <el-descriptions-item label="目的" :span="5">
@@ -777,7 +778,7 @@ export default {
                 if (this.isEdit) {
                     await this.goEdit(flag)
                 } else {
-                    this.$confirm('风险系数计算公式保存后不可再修改,是否继续?', '提示', {
+                    this.$confirm('风险类型和风险系数计算公式保存后不可再修改,是否继续?', '提示', {
                         confirmButtonText: '继续',
                         cancelButtonText: '取消',
                         type: 'warning'