riskDetail.vue 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943
  1. <template>
  2. <div>
  3. <el-dialog
  4. :title="title"
  5. center
  6. :visible.sync="dialogVisible"
  7. width="90%"
  8. append-to-body
  9. top
  10. style="margin-top:5vh"
  11. :close-on-click-modal="false"
  12. :show-close="false"
  13. :close-on-press-escape="false"
  14. >
  15. <div v-loading="loading" class="contain">
  16. <div class="info">
  17. <div class="item">
  18. <span>部门:</span>
  19. <ibps-user-selector
  20. v-model="position"
  21. style="width:60%"
  22. type="position"
  23. readonly-text="text"
  24. :disabled="readonly"
  25. :multiple="false"
  26. size="mini"
  27. :filter="filter"
  28. filtrate
  29. />
  30. </div>
  31. <div class="item">
  32. <span>评估人:</span>
  33. <ibps-user-selector
  34. style="width:60%"
  35. type="user"
  36. :value="userId"
  37. readonly-text="text"
  38. :disabled="true"
  39. :multiple="false"
  40. size="mini"
  41. />
  42. </div>
  43. <div class="item">
  44. <span>编制时间:</span>
  45. <el-date-picker
  46. v-model="time"
  47. type="datetime"
  48. placeholder="未编制"
  49. :disabled="readonly"
  50. value-format="yyyy-MM-dd HH:mm:ss"
  51. size="mini"
  52. />
  53. </div>
  54. </div>
  55. <el-alert
  56. title="说明"
  57. type="success"
  58. :closable="false"
  59. :description="descriptionContent"
  60. />
  61. <div class="tab">
  62. <el-tabs v-model="activeName">
  63. <el-tab-pane v-for="(item) in content.filter(i=>!!!i.hide)" :key="item.label" :label="item.label" :name="item.label">
  64. <div class="content">
  65. <div class="left">
  66. <pre>{{ item.value }}</pre>
  67. </div>
  68. <div v-if="activeName==='风险等级及应对措施说明' && muban==='1'" class="right">
  69. <el-image
  70. style="width: 100%; height: 100%"
  71. :src="photo"
  72. fit="contain"
  73. :preview-src-list="[photo]"
  74. alt="风险矩阵参照图"
  75. />
  76. </div>
  77. </div>
  78. </el-tab-pane>
  79. </el-tabs>
  80. </div>
  81. <el-alert
  82. title=""
  83. type="success"
  84. :closable="false"
  85. description="风险应对选择风险降低后,需要填写对应的措施制定人,以便开启后续部门风险改进记录流程"
  86. />
  87. <div class="choose">
  88. <span>选择风险项:</span>
  89. <!-- 模版弹窗 -->
  90. <ibps-custom-dialog
  91. v-model="form.xuan_ze_feng_xian"
  92. size="mini"
  93. template-key="fxkdhk"
  94. multiple
  95. type="dialog"
  96. class="custom-dialog"
  97. placeholder="请选择风险项"
  98. style="width:80%"
  99. icon="el-icon-search"
  100. :disabled="readonly===0?true:readonly"
  101. />
  102. </div>
  103. <div class="table">
  104. <el-table :data="tableList" border>
  105. <el-table-column
  106. prop=""
  107. label="序号"
  108. type="index"
  109. width="50"
  110. :index="showIndex"
  111. />
  112. <el-table-column
  113. prop="yao_su_tiao_kuan_"
  114. label="要素条款"
  115. width="120"
  116. />
  117. <el-table-column
  118. prop="gong_zuo_huan_jie"
  119. label="工作环节"
  120. width="150"
  121. >
  122. <template slot-scope="{row}">
  123. <el-input v-model="row.gong_zuo_huan_jie" type="textarea" :rows="2" size="mini" :disabled="readonly" />
  124. </template>
  125. </el-table-column>
  126. <!-- <el-table-column
  127. prop="gong_zuo_miao_shu"
  128. label="工作描述"
  129. width="150"
  130. >
  131. <template slot-scope="{row}">
  132. <el-input v-model="row.gong_zuo_miao_shu" type="textarea" :rows="2" size="mini" :readonly="readonly" />
  133. </template>
  134. </el-table-column> -->
  135. <el-table-column
  136. prop="feng_xian_miao_sh"
  137. label="风险描述"
  138. width="150"
  139. >
  140. <template slot-scope="{row}">
  141. <el-input v-model="row.feng_xian_miao_sh" type="textarea" :rows="2" size="mini" :disabled="readonly" />
  142. </template>
  143. </el-table-column>
  144. <el-table-column
  145. prop="xian_xing_kong_zh"
  146. label="现行控制方法"
  147. width="150"
  148. >
  149. <template slot-scope="{row}">
  150. <el-input v-model="row.xian_xing_kong_zh" type="textarea" :rows="2" size="mini" :disabled="readonly" />
  151. </template>
  152. </el-table-column>
  153. <el-table-column
  154. prop="yan_zhong_cheng_d"
  155. label="严重程度"
  156. width="100"
  157. >
  158. <template slot-scope="{row}">
  159. <el-select v-model="row.yan_zhong_cheng_d" placeholder="请选择" :disabled="readonly" size="mini" @change="culRate(row)">
  160. <el-option
  161. v-for="item in yan_zhong_cheng_d_List"
  162. :key="item"
  163. :label="item"
  164. :value="item"
  165. />
  166. </el-select>
  167. </template>
  168. </el-table-column>
  169. <el-table-column
  170. prop="fa_sheng_pin_du_"
  171. label="发生频度"
  172. width="100"
  173. >
  174. <template slot-scope="{row}">
  175. <el-select v-model="row.fa_sheng_pin_du_" placeholder="请选择" :disabled="readonly" size="mini" @change="culRate(row)">
  176. <el-option
  177. v-for="item in fa_sheng_pin_du_List"
  178. :key="item"
  179. :label="item"
  180. :value="item"
  181. />
  182. </el-select>
  183. </template>
  184. </el-table-column>
  185. <el-table-column
  186. v-if="muban==='2'"
  187. prop="ke_jian_ce_du_"
  188. label="可检测度"
  189. width="100"
  190. >
  191. <template slot-scope="{row}">
  192. <el-select v-model="row.ke_jian_ce_du_" placeholder="请选择" :disabled="readonly" size="mini" @change="culRate(row)">
  193. <el-option
  194. v-for="item in ke_jian_ce_du_List"
  195. :key="item"
  196. :label="item"
  197. :value="item"
  198. />
  199. </el-select>
  200. </template>
  201. </el-table-column>
  202. <el-table-column
  203. prop="feng_xian_zhi_shu"
  204. label="风险系数"
  205. width="70"
  206. />
  207. <el-table-column
  208. prop="feng_xian_deng_ji"
  209. label="风险等级"
  210. width="100"
  211. />
  212. <el-table-column
  213. prop="feng_xian_ying_du"
  214. label="风险应对"
  215. width="120"
  216. >
  217. <template slot-scope="{row}">
  218. <el-select v-model="row.feng_xian_ying_du" placeholder="请选择" :disabled="readonly" size="mini">
  219. <el-option
  220. v-for="item in ['风险降低','风险接受','风险回避']"
  221. :key="item"
  222. :label="item"
  223. :value="item"
  224. />
  225. </el-select>
  226. </template>
  227. </el-table-column>
  228. <el-table-column
  229. prop="qian_zai_yuan_yin"
  230. label="潜在原因分析"
  231. width="150"
  232. >
  233. <template slot-scope="{row}">
  234. <el-input v-model="row.qian_zai_yuan_yin" type="textarea" :rows="2" size="mini" :disabled="readonly" />
  235. </template>
  236. </el-table-column>
  237. <el-table-column
  238. prop="ni_cai_qu_cuo_shi"
  239. label="拟采取控制措施"
  240. width="150"
  241. >
  242. <template slot-scope="{row}">
  243. <el-input v-model="row.ni_cai_qu_cuo_shi" type="textarea" :rows="2" size="mini" :disabled="readonly" />
  244. </template>
  245. </el-table-column>
  246. <el-table-column
  247. prop="zhi_ding_ren_"
  248. label="措施制定人"
  249. width="100"
  250. >
  251. <template slot-scope="{row}">
  252. <ibps-user-selector
  253. v-model="row.zhi_ding_ren_"
  254. type="user"
  255. readonly-text="text"
  256. :disabled="readonly"
  257. :multiple="true"
  258. size="mini"
  259. :filter="filter"
  260. filtrate
  261. />
  262. </template>
  263. </el-table-column>
  264. </el-table>
  265. </div>
  266. <!-- <el-pagination
  267. style="margin-top: 5px; padding-bottom: 10px"
  268. :current-page="pagination.currentPage"
  269. :page-sizes="[10, 20,30, 50]"
  270. :page-size="pagination.pageSize"
  271. layout="prev,pager,next,jumper,sizes,->,total"
  272. :total="categoryList.length"
  273. @size-change="handleSizeChange"
  274. @current-change="handleCurrentChange"
  275. /> -->
  276. </div>
  277. <span slot="footer" class="dialog-footer">
  278. <el-button v-if="!readonly" type="primary" size="mini" icon="el-icon-takeaway-box" @click="save">保 存</el-button>
  279. <el-button v-if="!readonly" type="primary" size="mini" icon="el-icon-finished" @click="submit">提 交</el-button>
  280. <el-button size="mini" icon="ibps-icon-close" type="danger" @click="close">退 出</el-button>
  281. </span>
  282. </el-dialog>
  283. </div>
  284. </template>
  285. <script>
  286. import dayjs from 'dayjs'
  287. import ibpsUserSelector from '@/business/platform/org/selector'
  288. import { getImage } from '@/api/platform/file/attachment'
  289. export default {
  290. components: {
  291. ibpsUserSelector,
  292. IbpsCustomDialog: () => import('@/business/platform/data/templaterender/custom-dialog')
  293. },
  294. props: {
  295. culWays: {
  296. type: Object,
  297. default: () => ({})
  298. }
  299. },
  300. data () {
  301. const { userId, position, level } = this.$store.getters
  302. return {
  303. filter: [{
  304. descVal: '1',
  305. includeSub: true,
  306. old: 'position',
  307. partyId: this.$store.getters.userInfo.employee.positions,
  308. partyName: '',
  309. scriptContent: '',
  310. type: 'user',
  311. userType: 'position'
  312. }],
  313. form: {
  314. xuan_ze_feng_xian: ''
  315. },
  316. activeName: '风险等级及应对措施说明',
  317. content: [
  318. { label: '严重程度分级描述', value: '/' },
  319. { label: '发生概率分级表说明', value: '/' },
  320. { label: '事件可检测度描述', value: '/' },
  321. { label: '风险等级及应对措施说明', value: `未找到配置数据,使用默认配置:
  322. 低:可保持已有的安全措施。
  323. 中:需采取有效措施对风险进行控制。
  324. 高:需采取有效措施对风险进行控制。
  325. 极高:需采取有效措施对风险进行控制。` }
  326. ],
  327. fengXianDengJi2: { label: '风险等级及应对措施说明', value: `未找到配置数据,使用默认配置:
  328. 可忽略的:1-8,稍有危险,可以接受。
  329. 可接受的:9-27,一般危险,需要注意。
  330. 中度的:28-63,显著危险,需要整改。
  331. 重大的:64-99,高度危险,需立即整改。
  332. 不可接受的:100-125,极其危险,不能继续作业。` },
  333. fengXianDengJi3: { label: '风险等级及应对措施说明', value: `未找到配置数据,使用默认配置:
  334. 低风险:1-4,风险较低,当采取措施消除风险引起的成本比风险本身引起的损失较大时,接受风险。
  335. 中风险:5-11,可采取措施降低风险或风险规避。
  336. 高风险:12-25,应采取措施规避或降低风险。` },
  337. yan_zhong_cheng_d_List: ['1', '2', '3', '4', '5'],
  338. fa_sheng_pin_du_List: ['1', '2', '3', '4', '5'],
  339. ke_jian_ce_du_List: ['1', '2', '3', '4', '5'],
  340. userId: userId,
  341. position: position,
  342. level: level.second || level.first,
  343. time: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  344. params: {},
  345. rowParams: {},
  346. refresh: true,
  347. loading: false,
  348. title: '',
  349. pagination: {
  350. pageSize: 10,
  351. currentPage: 1
  352. },
  353. dialogVisible: false,
  354. tableList: [],
  355. Ids: [],
  356. fengXianJiSuan: [],
  357. muban: '2',
  358. leixing: '安全'
  359. }
  360. },
  361. computed: {
  362. photo () {
  363. return getImage('risk_fxjz') // 风险矩阵参照图
  364. },
  365. descriptionContent () {
  366. const msg1 = `1.当前风险系数计算公式为模板一:'${this.culWays[this.muban]}'。2.风险等级由严重程度和发生频度组成的坐标值映射成为矩阵坐标。`
  367. const msg2 = `1.当前风险系数计算公式为模板二:'${this.culWays[this.muban]}'。2.风险系数 RPN = Severity(严重度) × Occurrence(发生度)× Likelihood of Detection(检测度)。`
  368. const msg3 = `1.当前风险系数计算公式为模板三:'${this.culWays[this.muban]}'。2.风险系数 RPN = Severity(严重程度) × Possibility(发生的可能性)。`
  369. switch (this.muban) {
  370. case '1':
  371. return msg1
  372. case '2':
  373. return msg2
  374. case '3':
  375. return msg3
  376. default:
  377. break
  378. }
  379. return msg1
  380. },
  381. showPaperList () {
  382. const start = (this.pagination.currentPage - 1) * this.pagination.pageSize
  383. const end = start + this.pagination.pageSize
  384. return this.categoryList.slice(start, end)
  385. },
  386. readonly () {
  387. if (this.rowParams.bian_zhi_ren_) {
  388. return true
  389. } else {
  390. if (this.tableList.length) {
  391. return this.tableList.every(item => item.shi_fou_guo_shen_ === '已完成')
  392. } else {
  393. return false
  394. }
  395. }
  396. }
  397. },
  398. watch: {
  399. params: {
  400. handler (val) {
  401. this.getTableData()
  402. }
  403. },
  404. rowParams: {
  405. handler (val) {
  406. this.getTableData()
  407. }
  408. },
  409. 'form.xuan_ze_feng_xian': {
  410. handler (data) {
  411. this.loading = true
  412. data = data.split(',')
  413. data = "'" + data.join("','") + "'"
  414. const sql = `select * from t_fxkzb where id_ in (${data}) ORDER BY FIELD(id_, ${data})`
  415. this.$common.request('sql', sql).then(response => {
  416. let data1 = []
  417. if (response.variables != null && response.variables.data != null && response.variables.data.length > 0) {
  418. data1 = response.variables.data
  419. // console.log(data1)
  420. for (const item of data1) {
  421. const chongfu = this.tableList.find(i => i.shi_bie_xiang_ === item.id_)
  422. if (!chongfu) {
  423. this.tableList.push({
  424. di_dian_: this.level,
  425. bian_zhi_ren_: this.userId,
  426. bian_zhi_bu_men_: this.position,
  427. bian_zhi_shi_jian: this.time,
  428. parent_id_: this.params.id_,
  429. shi_bie_xiang_: item.id_,
  430. yao_su_tiao_kuan_: item.tiao_kuan_,
  431. gong_zuo_huan_jie: item.huan_jie_,
  432. // gong_zuo_miao_shu: item.gong_zuo_miao_shu,
  433. feng_xian_miao_sh: item.feng_xian_miao_sh,
  434. xian_xing_kong_zh: item.gong_zuo_miao_shu,
  435. ni_cai_qu_cuo_shi: '',
  436. zhi_ding_ren_: '',
  437. qian_zai_yuan_yin: ''
  438. })
  439. }
  440. }
  441. }
  442. this.tableList.forEach(item => {
  443. const cunZai = data1.find(i => i.id_ === item.shi_bie_xiang_)
  444. if (!cunZai) {
  445. this.tableList = this.tableList.filter(ii => ii.shi_bie_xiang_ !== item.shi_bie_xiang_)
  446. }
  447. })
  448. this.loading = false
  449. })
  450. }
  451. }
  452. },
  453. methods: {
  454. async getTableData () {
  455. this.loading = true
  456. // console.log(this.params)
  457. if (!this.params.id_) return
  458. let sql = ''
  459. if (this.readonly) {
  460. sql = `select * from t_fxsbpgb2 where parent_id_='${this.params.id_}' and bian_zhi_ren_='${this.rowParams.bian_zhi_ren_}'`
  461. } else {
  462. sql = `select * from t_fxsbpgb2 where parent_id_='${this.params.id_}' and bian_zhi_ren_='${this.userId}'`
  463. }
  464. const { variables: { data }} = await this.$common.request('sql', sql)
  465. if (data.length > 0) {
  466. // console.log('data', data)
  467. this.position = data[0].bian_zhi_bu_men_
  468. this.userId = data[0].bian_zhi_ren_
  469. this.time = data[0].bian_zhi_shi_jian
  470. this.form.xuan_ze_feng_xian = data[0].xuan_ze_feng_xian
  471. this.tableList = data
  472. this.tableList.forEach(i => {
  473. if (!Object.hasOwn(i, 'qian_zai_yuan_yin')) i.qian_zai_yuan_yin = ''
  474. })
  475. // 存储原始数据的 id 数组
  476. this.Ids = this.tableList.map(item => item.shi_bie_xiang_)
  477. } else {
  478. if (this.rowParams.bian_zhi_ren_) {
  479. this.position = this.rowParams.bian_zhi_bu_men_
  480. this.userId = this.rowParams.bian_zhi_ren_
  481. this.time = ''
  482. }
  483. this.tableList = []
  484. this.Ids = []
  485. }
  486. this.muban = this.params.ji_suan_fang_shi_
  487. this.leixing = this.params.feng_xian_lei_xin
  488. if (this.muban === '2') {
  489. this.content[3] = this.fengXianDengJi2
  490. } else if (this.muban === '3') {
  491. this.content[3] = this.fengXianDengJi3
  492. }
  493. // 获取风险等级相关
  494. 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`
  495. 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`
  496. 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}'`
  497. 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`
  498. Promise.all([
  499. this.$common.request('sql', degreeSql),
  500. this.$common.request('sql', gailvSql),
  501. this.$common.request('sql', dengjiSql),
  502. this.$common.request('sql', jianCeSql)
  503. ]).then(responses => {
  504. let degreeData = []
  505. let gailvData = []
  506. let dengjiData = []
  507. let jianCeData = []
  508. if (responses[0].variables != null && responses[0].variables.data != null && responses[0].variables.data.length > 0) {
  509. degreeData = responses[0].variables.data
  510. }
  511. if (responses[1].variables != null && responses[1].variables.data != null && responses[1].variables.data.length > 0) {
  512. gailvData = responses[1].variables.data
  513. }
  514. if (responses[2].variables != null && responses[2].variables.data != null && responses[2].variables.data.length > 0) {
  515. dengjiData = responses[2].variables.data
  516. }
  517. if (responses[3].variables != null && responses[3].variables.data != null && responses[3].variables.data.length > 0) {
  518. jianCeData = responses[3].variables.data
  519. }
  520. (this.muban === '1' || this.muban === '3') && (this.content[2].hide = true)
  521. if (degreeData.length === 0 || gailvData.length === 0 || dengjiData.length === 0 || (this.muban === '2' && jianCeData.length === 0)) {
  522. throw new Error(`检测到风险类型为${this.leixing}且计算方式为'${this.culWays[this.muban] || this.muban}'的配置数据不完整,建议配置完成后再使用!`)
  523. }
  524. let degreeWord = ''
  525. let gailvWord = ''
  526. let dengjiWord = ''
  527. let jianCeWord = ''
  528. for (const el of degreeData) {
  529. degreeWord += `${el.fen_ji_}级:${el.yan_zhong_cheng_d},${el.miao_shu_}\n`
  530. }
  531. for (const el of gailvData) {
  532. gailvWord += `${el.fen_ji_}级:${el.yan_zhong_cheng_d},${el.miao_shu_}\n`
  533. }
  534. for (const el of dengjiData) {
  535. if (this.muban === '1') {
  536. dengjiWord += `${el.fen_ji_}:${el.miao_shu_}\n`
  537. } else {
  538. dengjiWord += `${el.fen_ji_}:${el.yan_zhong_cheng_d},${el.miao_shu_}\n`
  539. }
  540. }
  541. for (const el of jianCeData) {
  542. jianCeWord += `${el.fen_ji_}级:${el.yan_zhong_cheng_d},${el.miao_shu_}\n`
  543. }
  544. if (degreeData.length > 0) {
  545. this.content[0].value = degreeWord
  546. this.yan_zhong_cheng_d_List = degreeData.map(item => item.fen_ji_)
  547. }
  548. if (gailvData.length > 0) {
  549. this.content[1].value = gailvWord
  550. this.fa_sheng_pin_du_List = gailvData.map(item => item.fen_ji_)
  551. }
  552. if (jianCeData.length > 0) {
  553. this.content[2].value = jianCeWord
  554. this.ke_jian_ce_du_List = jianCeData.map(item => item.fen_ji_)
  555. }
  556. if (dengjiData.length > 0) {
  557. this.content[3].value = dengjiWord
  558. }
  559. this.fengXianJiSuan = dengjiData
  560. this.loading = false
  561. }).catch(error => {
  562. // 处理错误
  563. this.$message.warning(error.message)
  564. this.loading = false
  565. })
  566. },
  567. // 选择器切换
  568. onSelectorChange () {
  569. this.pagination = {
  570. pageSize: 10,
  571. currentPage: 1
  572. }
  573. },
  574. // 当前页码改变
  575. handleCurrentChange (val) {
  576. this.pagination.currentPage = val
  577. },
  578. // 页码选择器改变
  579. handleSizeChange (val) {
  580. this.pagination.pageSize = val
  581. this.pagination.currentPage = 1
  582. },
  583. // 分页连续序号
  584. showIndex (index) {
  585. return index + 1 + (this.pagination.currentPage - 1) * this.pagination.pageSize
  586. },
  587. close () {
  588. this.dialogVisible = false
  589. this.$emit('close')
  590. setTimeout(() => {
  591. this.rowParams = {}
  592. this.params = {}
  593. this.form.xuan_ze_feng_xian = ''
  594. }, 500)
  595. },
  596. open (val, row) {
  597. this.params = val
  598. if (row) {
  599. this.rowParams = row
  600. }
  601. this.dialogVisible = true
  602. },
  603. // 计算风险指数
  604. culRate (row) {
  605. try {
  606. if (this.muban === '1') {
  607. if (row.yan_zhong_cheng_d && row.fa_sheng_pin_du_) {
  608. let degree = ''
  609. let rate = ''
  610. rate = +row.yan_zhong_cheng_d * +row.fa_sheng_pin_du_
  611. if (this.fengXianJiSuan.length === 0) {
  612. if (rate >= 1 && rate < 4) {
  613. degree = '低'
  614. }
  615. if (rate > 4 && rate <= 9) {
  616. degree = '中'
  617. }
  618. if (rate >= 10 && rate <= 16) {
  619. degree = '高'
  620. }
  621. if (rate >= 20 && rate <= 25) {
  622. degree = '极高'
  623. }
  624. if (rate === 4) {
  625. if (+row.yan_zhong_cheng_d === 2 && +row.fa_sheng_pin_du_ === 2) {
  626. degree = '低'
  627. } else {
  628. degree = '中'
  629. }
  630. }
  631. } else {
  632. for (let i = 0; i < this.fengXianJiSuan.length; i++) {
  633. const item = this.fengXianJiSuan[i]
  634. if (item.yan_zhong_cheng_d) {
  635. const arr = JSON.parse(item.yan_zhong_cheng_d) || []
  636. for (let j = 0; j < arr.length; j++) {
  637. const [a, b] = arr[j]
  638. if (+a === +row.yan_zhong_cheng_d && +b === +row.fa_sheng_pin_du_) {
  639. degree = item.fen_ji_
  640. break
  641. }
  642. }
  643. }
  644. }
  645. }
  646. this.$set(row, 'feng_xian_ying_du', (!row.feng_xian_ying_du && degree === '低') ? '风险接受' : '风险降低')
  647. row.feng_xian_zhi_shu = rate + ''
  648. row.feng_xian_deng_ji = degree
  649. }
  650. } else if (this.muban === '2') {
  651. if (row.yan_zhong_cheng_d && row.fa_sheng_pin_du_ && row.ke_jian_ce_du_) {
  652. let degree = ''
  653. let rate = ''
  654. rate = +row.yan_zhong_cheng_d * +row.fa_sheng_pin_du_ * +row.ke_jian_ce_du_
  655. if (this.fengXianJiSuan.length === 0) {
  656. if (rate >= 1 && rate <= 8) {
  657. degree = '可忽略的'
  658. }
  659. if (rate >= 9 && rate <= 27) {
  660. degree = '可接受的'
  661. }
  662. if (rate >= 28 && rate <= 63) {
  663. degree = '中度的'
  664. }
  665. if (rate >= 64 && rate <= 99) {
  666. degree = '重大的'
  667. }
  668. if (rate >= 100 && rate <= 125) {
  669. degree = '不可接受的'
  670. }
  671. } else {
  672. for (let i = 0; i < this.fengXianJiSuan.length; i++) {
  673. const item = this.fengXianJiSuan[i]
  674. if (item.yan_zhong_cheng_d) {
  675. const [a, b] = item.yan_zhong_cheng_d.split('-')
  676. if (a && b) {
  677. if (rate >= +a.trim() && rate <= +b.trim()) {
  678. degree = item.fen_ji_
  679. break
  680. }
  681. }
  682. }
  683. }
  684. }
  685. this.$set(row, 'feng_xian_ying_du', (!row.feng_xian_ying_du && (degree === '可忽略的' || degree === '可接受的')) ? '风险接受' : '风险降低')
  686. row.feng_xian_zhi_shu = rate + ''
  687. row.feng_xian_deng_ji = degree
  688. }
  689. } else if (this.muban === '3') {
  690. if (row.yan_zhong_cheng_d && row.fa_sheng_pin_du_) {
  691. let degree = ''
  692. let rate = ''
  693. rate = +row.yan_zhong_cheng_d * +row.fa_sheng_pin_du_
  694. if (this.fengXianJiSuan.length === 0) {
  695. if (rate >= 1 && rate <= 4) {
  696. degree = '低风险'
  697. }
  698. if (rate >= 5 && rate <= 11) {
  699. degree = '中风险'
  700. }
  701. if (rate >= 12 && rate <= 25) {
  702. degree = '高风险'
  703. }
  704. } else {
  705. for (let i = 0; i < this.fengXianJiSuan.length; i++) {
  706. const item = this.fengXianJiSuan[i]
  707. if (item.yan_zhong_cheng_d) {
  708. const [a, b] = item.yan_zhong_cheng_d.split('-')
  709. if (a && b) {
  710. if (rate >= +a.trim() && rate <= +b.trim()) {
  711. degree = item.fen_ji_
  712. break
  713. }
  714. }
  715. }
  716. }
  717. }
  718. this.$set(row, 'feng_xian_ying_du', (!row.feng_xian_ying_du && (degree === '低风险')) ? '风险接受' : '风险降低')
  719. row.feng_xian_zhi_shu = rate + ''
  720. row.feng_xian_deng_ji = degree
  721. }
  722. }
  723. } catch (error) {
  724. this.$message.warning('风险系数计算错误,请检查风险模板配置数据是否正确!')
  725. }
  726. },
  727. check () {
  728. if (this.tableList.length === 0) {
  729. throw new Error('请选择风险项!')
  730. }
  731. for (let i = 0; i < this.tableList.length; i++) {
  732. const item = this.tableList[i]
  733. if (!item.feng_xian_zhi_shu) {
  734. throw new Error(`第${i + 1}未计算风险指数,请填写相关数据!`)
  735. }
  736. if (item.feng_xian_ying_du !== '风险接受' && !item.zhi_ding_ren_) {
  737. throw new Error(`第${i + 1}行缺少措施制定人!`)
  738. }
  739. // 格式化成需要的数据
  740. item.xuan_ze_feng_xian = this.form.xuan_ze_feng_xian
  741. delete item.create_by_
  742. delete item.create_time_
  743. }
  744. },
  745. submit () {
  746. // console.log(this.Ids)
  747. this.$confirm('提交后不可再修改,是否确认保存并提交?', '提示', {
  748. confirmButtonText: '继续',
  749. cancelButtonText: '取消',
  750. type: 'warning'
  751. }).then(async () => {
  752. // 提交时自动保存
  753. await this.save()
  754. const params = {
  755. tableName: 't_fxsbpgb2',
  756. updList: this.Ids.map(item => ({
  757. where: {
  758. shi_bie_xiang_: item,
  759. bian_zhi_ren_: this.userId,
  760. parent_id_: this.params.id_
  761. },
  762. param: {
  763. shi_fou_guo_shen_: '已完成'
  764. }
  765. }))
  766. }
  767. console.log(params)
  768. await this.$common.request('update', params)
  769. // 判断是否是最后一个提交的评估人
  770. const pinGuRenNum = this.params.ping_gu_ren_yuan_.split(',').length
  771. const sql = `select * from t_fxsbpgb2 where parent_id_='${this.params.id_}'`
  772. const { variables: { data }} = await this.$common.request('sql', sql)
  773. const submitNum = new Set(data.map(item => item.bian_zhi_ren_)).size
  774. if (submitNum === pinGuRenNum && data.every(item => item.shi_fou_guo_shen_ === '已完成')) {
  775. // 提醒组长
  776. await this.$common.sendMsg({
  777. subject: '风险评估与措施表单待提交',
  778. content: `您有一份评估与措施表单待提交,请前往-风险控制-风险评估与措施页面提交,计划编号:${this.params.ji_hua_bian_hao_}。`,
  779. receiverId: this.params.zu_chang_id_,
  780. canreplay: '0',
  781. skipTypeMsg: JSON.stringify({
  782. skipType: 3,
  783. pathInfo: '/tygl/fxkzV2/fxpgycslb' // 路由
  784. })
  785. })
  786. console.log('通知组长成功')
  787. }
  788. console.log('提交成功')
  789. this.$message({
  790. type: 'success',
  791. message: '提交成功!'
  792. })
  793. this.close()
  794. }).catch(() => {
  795. })
  796. },
  797. // 判断状态是否已完成
  798. async getIsFinish () {
  799. let sql = ''
  800. if (this.readonly) {
  801. sql = `select * from t_fxsbpgb2 where parent_id_='${this.params.id_}' and bian_zhi_ren_='${this.rowParams.bian_zhi_ren_}'`
  802. } else {
  803. sql = `select * from t_fxsbpgb2 where parent_id_='${this.params.id_}' and bian_zhi_ren_='${this.userId}'`
  804. }
  805. const { variables: { data }} = await this.$common.request('sql', sql)
  806. if (data.length > 0 && data.every(item => item.shi_fou_guo_shen_ === '已完成')) {
  807. throw new Error('已提交,不可再次提交!')
  808. }
  809. const sql2 = `select * from t_fxpgjlb2 where id_='${this.params.id_}'`
  810. const { variables: { data: data2 }} = await this.$common.request('sql', sql2)
  811. if (data2.length > 0 && data2[0].shi_fou_guo_shen_ === '已完成') {
  812. throw new Error('已结束,不可再次提交!')
  813. }
  814. },
  815. async save () {
  816. try {
  817. this.check()
  818. await this.getIsFinish()
  819. const curIds = this.tableList.map(item => item.shi_bie_xiang_)
  820. // 计算需要增加项
  821. const addedIds = this.tableList.filter(item => !this.Ids.includes(item.shi_bie_xiang_))
  822. // 计算需要更新项
  823. const updatedIds = this.tableList.filter(item => this.Ids.includes(item.shi_bie_xiang_))
  824. // 计算需要删除项
  825. const deletedIds = this.Ids.filter(id => !curIds.includes(id))
  826. console.log(addedIds, updatedIds, deletedIds)
  827. // 新增
  828. if (addedIds.length > 0) {
  829. const params = {
  830. tableName: 't_fxsbpgb2',
  831. paramWhere: addedIds
  832. }
  833. console.log(params)
  834. await this.$common.request('add', params)
  835. console.log('添加成功')
  836. }
  837. // 更新
  838. if (updatedIds.length > 0) {
  839. const params = {
  840. tableName: 't_fxsbpgb2',
  841. updList: updatedIds.map(item => ({
  842. where: {
  843. id_: item.id_
  844. },
  845. param: {
  846. ...item,
  847. xuan_ze_feng_xian: this.form.xuan_ze_feng_xian
  848. }
  849. }))
  850. }
  851. console.log(params)
  852. await this.$common.request('update', params)
  853. console.log('更新成功')
  854. }
  855. // 删除
  856. if (deletedIds.length > 0) {
  857. const sql3 = `select * from t_fxsbpgb2 where bian_zhi_ren_='${this.userId}' and parent_id_='${this.params.id_}' and shi_bie_xiang_ in (${deletedIds.map(id => `'${id}'`).join(', ')})`
  858. const { variables: { data: data3 }} = await this.$common.request('sql', sql3)
  859. if (data3.length > 0) {
  860. // console.log('data3', data3)
  861. const params = {
  862. tableName: 't_fxsbpgb2',
  863. paramWhere: {
  864. id_: data3.map(item => item.id_).join(',')
  865. }
  866. }
  867. console.log(params)
  868. await this.$common.request('delete', params)
  869. console.log('删除成功')
  870. }
  871. }
  872. await this.getTableData()
  873. this.$message.success('保存成功')
  874. // this.close()
  875. } catch (error) {
  876. this.$message.warning(error.message)
  877. throw new Error(error.message)
  878. }
  879. }
  880. }
  881. }
  882. </script>
  883. <style lang="scss" scoped>
  884. .contain{
  885. padding: 20px;
  886. .info{
  887. padding: 0;
  888. display: flex;
  889. justify-content: space-around;
  890. align-items: center;
  891. width: 80%;
  892. margin: 0 auto;
  893. .item{
  894. display: flex;
  895. align-items: center;
  896. width: 30%;
  897. }
  898. }
  899. .tab{
  900. pre{
  901. overflow: auto;
  902. margin: 0;
  903. }
  904. .content{
  905. display: flex;
  906. justify-content: space-between;
  907. align-items: center;
  908. .right{
  909. width: 300px;
  910. }
  911. }
  912. }
  913. .choose{
  914. display: flex;
  915. align-items: center;
  916. margin: 10px 0;
  917. }
  918. .table{
  919. height:300px;
  920. overflow: auto;
  921. margin-top: 20px;
  922. }
  923. }
  924. </style>