index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. <template>
  2. <div class="personView">
  3. <dv-full-screen-container>
  4. <div class="topView" style="width: 100%; height: 11%">
  5. <div class="jbd-title">
  6. <dv-decoration-8
  7. style="
  8. width: 20%;
  9. height: 50px;
  10. position: absolute;
  11. left: 0px;
  12. top: 0px;
  13. "
  14. />
  15. <div style="width: 100%">
  16. <div
  17. style="
  18. height: 40%;
  19. font-size: 22px;
  20. margin-top: 10px;
  21. "
  22. >
  23. 质控看板
  24. </div>
  25. <dv-decoration-5
  26. style="width: 30%; height: 50%; margin: 0 auto"
  27. />
  28. </div>
  29. <dv-decoration-8
  30. :reverse="true"
  31. style="
  32. width: 20%;
  33. height: 50px;
  34. position: absolute;
  35. right: 0px;
  36. top: 0px;
  37. "
  38. />
  39. </div>
  40. <div class="contain">
  41. <div style="display: flex; text-align: center; height:38px; line-height: 38px;width: 25%;position: absolute; left: 3%;top:6%;">
  42. <div style="margin-right:10px;">选择年份</div>
  43. <yearrange st :year-values="yearValues" :size="size" :value-format="valueFormat" />
  44. </div>
  45. <div
  46. style="width:12%; height:2.825rem; line-height:2.825rem; text-align:center;position: absolute; right: 3%; top:6%;color:white;"
  47. @click.prevent="goBack()"
  48. >
  49. <dv-border-box-8>返回</dv-border-box-8>
  50. </div>
  51. </div>
  52. </div>
  53. <dv-border-box-1
  54. style="
  55. width: 100%;
  56. height: 90%;
  57. box-sizing: border-box;
  58. overflow: hidden;
  59. "
  60. >
  61. <div style="height: 3%" />
  62. <div class="botView">
  63. <div class="viewBot">
  64. <div class="botleft">
  65. <chartA :info="chartAData" />
  66. </div>
  67. <dv-decoration-2
  68. :reverse="true"
  69. style="width: 2%; height: 100%"
  70. />
  71. <div class="botmidd">
  72. <chartB :info="chartBData" />
  73. </div>
  74. <dv-decoration-2
  75. :reverse="true"
  76. style="width: 2%; height: 100%"
  77. />
  78. <div class="botright">
  79. <chartE :info="chartEData" />
  80. </div>
  81. </div>
  82. <dv-decoration-10
  83. style="height: 2%; width: 100%; margin: 0 auto"
  84. />
  85. <div class="viewTop">
  86. <div class="topleft">
  87. <chartC :info="chartCData" />
  88. </div>
  89. <dv-decoration-2
  90. :reverse="true"
  91. style="width: 2%; height: 100%"
  92. />
  93. <div class="topright">
  94. <chartD :info="chartDData" />
  95. </div>
  96. </div>
  97. </div></dv-border-box-1>
  98. </dv-full-screen-container>
  99. </div>
  100. </template>
  101. <script>
  102. import screenfull from 'screenfull'
  103. export default {
  104. components: {
  105. yearrange: () => import('../yearrange.vue'),
  106. chartA: () => import('./chartA.vue'),
  107. chartB: () => import('./chartB.vue'),
  108. chartC: () => import('./chartC.vue'),
  109. chartD: () => import('./chartD.vue'),
  110. chartE: () => import('./chartE.vue')
  111. },
  112. data () {
  113. return {
  114. yearArr: [],
  115. yearStr: '',
  116. numArr: [],
  117. result: [],
  118. result1: [],
  119. result2: [],
  120. result3: [],
  121. result4: [],
  122. result5: [],
  123. result6: [],
  124. list1: [],
  125. list2: [],
  126. list3: [],
  127. list4: [],
  128. list5: [],
  129. list6: [],
  130. list7: [],
  131. data1: [],
  132. data2: [],
  133. data3: [],
  134. arr1: [],
  135. arr2: [],
  136. arr3: [],
  137. yearValues: [new Date().getFullYear() - 4 + '', new Date().getFullYear() + ''],
  138. size: 'mini',
  139. valueFormat: 'yyyy',
  140. activityList: [],
  141. chartAData: {
  142. id: 'chartA',
  143. title: '项目验证类型统计'
  144. },
  145. chartBData: {
  146. id: 'chartB',
  147. title: '实验室间比对率'
  148. },
  149. chartCData: {
  150. id: 'chartC',
  151. title: '检验项目不合格率'
  152. },
  153. chartDData: {
  154. id: 'chartD',
  155. title: '检验项目参加率'
  156. },
  157. chartEData: {
  158. id: 'chartE',
  159. title: '室内质控项目开展率'
  160. }
  161. }
  162. },
  163. watch: {
  164. yearValues: {
  165. handler (newVal, oldVal) {
  166. this.getData()
  167. },
  168. deep: true
  169. // immediate: true
  170. }
  171. },
  172. created () {
  173. if (screenfull.isEnabled && !screenfull.isFullscreen) {
  174. screenfull.request()
  175. }
  176. this.getData()
  177. this.getactivityList()
  178. },
  179. mounted () {
  180. },
  181. beforeDestroy () {
  182. if (screenfull.isFullscreen) {
  183. screenfull.toggle()
  184. }
  185. },
  186. methods: {
  187. // 返回
  188. goBack () {
  189. this.$router.back(-1)
  190. },
  191. getNumArr (min, max) { return Array.from(Array(max - min + 1), (v, k) => k + min) },
  192. // 所有活动
  193. async getactivityList () {
  194. // const sql = `select huo_dong_ming_che as value from t_sjzphdjhylxqb GROUP BY huo_dong_ming_che`
  195. const { variables: { data }} = await this.$common.request('query', {
  196. key: 'interlabQualityBoard1',
  197. params: [null]
  198. })
  199. this.activityList = data
  200. },
  201. getData () {
  202. this.chartAData = {
  203. id: 'chartA',
  204. title: '项目验证类型统计'
  205. }
  206. this.chartBData = {
  207. id: 'chartB',
  208. title: '实验室间比对率'
  209. }
  210. this.chartCData = {
  211. id: 'chartC',
  212. title: '检验项目不合格率'
  213. }
  214. this.chartDData = {
  215. id: 'chartD',
  216. title: '检验项目参加率'
  217. }
  218. this.chartEData = {
  219. id: 'chartE',
  220. title: '室内质控项目开展率'
  221. }
  222. this.yearArr = this.getNumArr(Number(this.yearValues[0]), Number(this.yearValues[1]))
  223. this.yearStr = this.yearArr.join(',')
  224. this.getListA()
  225. this.chartAData.yearArr = this.yearArr
  226. this.chartAData.numArr = this.result
  227. this.getListB()
  228. this.chartBData.yearArr = this.yearArr
  229. this.chartBData.data1 = this.data1
  230. this.chartBData.data2 = this.data2
  231. this.chartBData.data3 = this.data3
  232. this.getListC()
  233. this.chartCData.yearArr = this.yearArr
  234. this.chartCData.result1 = this.result1
  235. this.chartCData.result2 = this.result2
  236. this.chartCData.result3 = this.result3
  237. this.chartCData.result4 = this.result4
  238. this.chartCData.result5 = this.result5
  239. this.chartCData.result6 = this.result6
  240. this.getListD()
  241. this.chartDData.yearArr = this.yearArr
  242. this.chartDData.list1 = this.list1
  243. this.chartDData.list2 = this.list2
  244. this.chartDData.list3 = this.list3
  245. this.chartDData.list4 = this.list4
  246. this.chartDData.list5 = this.list5
  247. this.chartDData.list6 = this.list6
  248. this.chartDData.list7 = this.list7
  249. this.getListE()
  250. this.chartEData.yearArr = this.yearArr
  251. this.chartEData.arr1 = this.arr1
  252. this.chartEData.arr2 = this.arr2
  253. this.chartEData.arr3 = this.arr3
  254. console.log(this.chartEData)
  255. },
  256. async getListA () {
  257. this.result = []
  258. let data1 = []
  259. const data2 = []
  260. const sql1 = `select LEFT(b.nian_du_, 4) as niandu, LEFT(a.bi_dui_lei_xing_, 4) as leixing ,COUNT(*) AS count from t_sjzphdjhylxqb a left join t_sjzphdjhylb b on a.parent_id_ = b.id_ WHERE find_in_set(LEFT(b.nian_du_, 4), '${this.yearStr}') GROUP BY LEFT(b.nian_du_, 4), LEFT(a.bi_dui_lei_xing_, 2)`
  261. // const sql2 = `select LEFT(bian_zhi_shi_jian, 4) as niandu,'实验室' as leixing, COALESCE(COUNT(*), 0) AS count from t_sysbdjlb bian_zhi_shi_jian where shi_fou_guo_shen_ = '已完成' and find_in_set(LEFT(bian_zhi_shi_jian, 4), '${this.yearStr}')`
  262. await this.$common.request('sql', sql1).then((res) => {
  263. data1 = res.variables.data
  264. })
  265. // await this.$common.request('sql', sql2).then((res) => {
  266. // data2 = res.variables.data
  267. // })
  268. this.result.push(['product', '能力验证', '室间质评', '其它'])
  269. for (var item of this.yearArr) {
  270. const m = data1.find((v) => { return v.niandu === item + '' && v.leixing === '能力验证' })
  271. const n = data1.find((v) => { return v.niandu === item + '' && v.leixing === '室间质评' })
  272. // const f = data2.find((v) => { return v.niandu === item + '' && v.leixing === '实验室' })
  273. const g = data1.find((v) => { return v.niandu === item + '' && v.leixing !== '室间质评' && v.leixing !== '能力验证' })
  274. const arr = []
  275. arr[0] = item
  276. arr[1] = m ? m.count : 0
  277. arr[2] = n ? n.count : 0
  278. // arr[3] = f ? f.count : 0
  279. arr[3] = g ? g.count : 0
  280. this.result.push(arr)
  281. console.log(this.result)
  282. }
  283. },
  284. async getListB () {
  285. this.data1 = []
  286. this.data2 = []
  287. this.data3 = []
  288. let data1 = []
  289. let data2 = []
  290. let data3 = []
  291. const sql1 = `select LEFT(suo_shu_nian_fen_,4) as niandu, COUNT(*) AS count from t_zkxxtjbzb WHERE find_in_set(LEFT(suo_shu_nian_fen_,4), '${this.yearStr}') and shi_yan_shi_ = '✓' GROUP BY LEFT(suo_shu_nian_fen_,4)`
  292. const sql2 = `select LEFT(suo_shu_nian_fen_,4) as niandu, COUNT(*) AS count from t_zkxxtjbzb WHERE find_in_set(LEFT(suo_shu_nian_fen_,4), '${this.yearStr}') and guo_can_jia_ = '✓' or sheng_can_jia_ ='✓' GROUP BY LEFT(suo_shu_nian_fen_,4)`
  293. const sql3 = `select LEFT(bian_zhi_shi_jian, 4) as niandu,'实验室' as leixing, COALESCE(COUNT(*), 0) AS count from t_sysbdjlb bian_zhi_shi_jian where shi_fou_guo_shen_ = '已完成' and find_in_set(LEFT(bian_zhi_shi_jian, 4), '${this.yearStr}')`
  294. await this.$common.request('sql', sql1).then((res) => {
  295. data1 = res.variables.data
  296. })
  297. await this.$common.request('sql', sql2).then((res) => {
  298. data2 = res.variables.data
  299. })
  300. await this.$common.request('sql', sql3).then((res) => {
  301. data3 = res.variables.data
  302. })
  303. for (var item of this.yearArr) {
  304. const m = data1.find((v) => { return v.niandu === item + '' })
  305. const n = data2.find((v) => { return v.niandu === item + '' })
  306. const f = data3.find((v) => { return v.niandu === item + '' })
  307. // 无室间质评计划项目数
  308. this.data1.push((m ? m.count : 0) - (n ? n.count : 0))
  309. // 实验室比对项目数
  310. this.data2.push(f ? f.count : 0)
  311. // 比对率
  312. this.data3.push(((m ? m.count : 0) - (n ? n.count : 0) === 0 ? 0 : (f ? f.count : 0) / ((m ? m.count : 0) - (n ? n.count : 0)) * 100).toFixed(2))
  313. }
  314. },
  315. async getListC () {
  316. this.result1 = []
  317. this.result2 = []
  318. this.result3 = []
  319. this.result4 = []
  320. this.result5 = []
  321. this.result6 = []
  322. let data1 = []
  323. let data2 = []
  324. const sql1 = `select suo_shu_nian_fen_ as niandu, can_jia_dan_wei_ as danwei, COUNT(*) AS count from v_zkjgtjb where find_in_set(suo_shu_nian_fen_, '${this.yearStr}') GROUP BY suo_shu_nian_fen_, can_jia_dan_wei_`
  325. const sql2 = `select suo_shu_nian_fen_ as niandu, can_jia_dan_wei_ as danwei, COALESCE(NULLIF(ke_shi_xiu_zheng_, ''), nian_du_he_ge_) AS jieguo, COUNT(*) AS count from v_zkjgtjb where find_in_set(suo_shu_nian_fen_, '${this.yearStr}') GROUP BY suo_shu_nian_fen_, can_jia_dan_wei_, COALESCE(NULLIF(ke_shi_xiu_zheng_, ''), nian_du_he_ge_)`
  326. await this.$common.request('sql', sql1).then((res) => {
  327. data1 = res.variables.data
  328. })
  329. await this.$common.request('sql', sql2).then((res) => {
  330. data2 = res.variables.data
  331. })
  332. for (var item of this.yearArr) {
  333. const gc = data1.find((v) => { return v.niandu === item + '' && v.danwei === '国家' })
  334. const sc = data1.find((v) => { return v.niandu === item + '' && v.danwei === '省级' })
  335. const gb = data2.find((v) => { return v.niandu === item + '' && v.danwei === '国家' && v.jieguo === '不合格' })
  336. const sb = data2.find((v) => { return v.niandu === item + '' && v.danwei === '省级' && v.jieguo === '不合格' })
  337. // console.log(gc, sc, gb, sb)
  338. // 项目总数
  339. this.result1.push((gc ? gc.count : 0) + (sc ? sc.count : 0))
  340. // 国不合格数
  341. this.result2.push(gb ? gb.count : 0)
  342. // 省不合格数
  343. this.result3.push(sb ? sb.count : 0)
  344. // 国不合格率
  345. this.result4.push((gc ? gc.count : 0) === 0 ? 0 : ((gb ? gb.count : 0) / (gc ? gc.count : 0) * 100).toFixed(2))
  346. // 省不合格率
  347. this.result5.push((sc ? sc.count : 0) === 0 ? 0 : ((sb ? sb.count : 0) / (sc ? sc.count : 0) * 100).toFixed(2) || 0)
  348. // 总不合格率
  349. this.result6.push(((gc ? gc.count : 0) + (sc ? sc.count : 0)) === 0 ? 0 : (((gb ? gb.count : 0) + (sb ? sb.count : 0)) / ((gc ? gc.count : 0) + (sc ? sc.count : 0)) * 100).toFixed(2) || 0)
  350. }
  351. },
  352. async getListD () {
  353. this.list1 = []
  354. this.list2 = []
  355. this.list3 = []
  356. this.list4 = []
  357. this.list5 = []
  358. this.list6 = []
  359. this.list7 = []
  360. let data1 = []
  361. let data2 = []
  362. let data3 = []
  363. let data4 = []
  364. let data5 = []
  365. let data6 = []
  366. const sql1 = `select LEFT(suo_shu_nian_fen_,4) as niandu, COUNT(*) AS count from t_zkxxtjbzb WHERE find_in_set(LEFT(suo_shu_nian_fen_,4), '${this.yearStr}') and guo_kai_zhan_ = '✓' GROUP BY LEFT(suo_shu_nian_fen_,4)`
  367. const sql2 = `select LEFT(suo_shu_nian_fen_,4) as niandu, COUNT(*) AS count from t_zkxxtjbzb WHERE find_in_set(LEFT(suo_shu_nian_fen_,4), '${this.yearStr}') and guo_can_jia_ = '✓' GROUP BY LEFT(suo_shu_nian_fen_,4)`
  368. const sql3 = `select LEFT(suo_shu_nian_fen_,4) as niandu, COUNT(*) AS count from t_zkxxtjbzb WHERE find_in_set(LEFT(suo_shu_nian_fen_,4), '${this.yearStr}') and sheng_kai_zhan_ = '✓' GROUP BY LEFT(suo_shu_nian_fen_,4)`
  369. const sql4 = `select LEFT(suo_shu_nian_fen_,4) as niandu, COUNT(*) AS count from t_zkxxtjbzb WHERE find_in_set(LEFT(suo_shu_nian_fen_,4), '${this.yearStr}') and sheng_can_jia_ = '✓' GROUP BY LEFT(suo_shu_nian_fen_,4)`
  370. const sql5 = `select LEFT(suo_shu_nian_fen_,4) as niandu, COUNT(*) AS count from t_zkxxtjbzb WHERE find_in_set(LEFT(suo_shu_nian_fen_,4), '${this.yearStr}') and (guo_kai_zhan_ = '✓' or sheng_kai_zhan_ = '✓') GROUP BY LEFT(suo_shu_nian_fen_,4)`
  371. const sql6 = `select LEFT(suo_shu_nian_fen_,4) as niandu, COUNT(*) AS count from t_zkxxtjbzb WHERE find_in_set(LEFT(suo_shu_nian_fen_,4), '${this.yearStr}') and (guo_can_jia_ = '✓' or sheng_can_jia_ = '✓') GROUP BY LEFT(suo_shu_nian_fen_,4)`
  372. await this.$common.request('sql', sql1).then((res) => {
  373. data1 = res.variables.data
  374. })
  375. await this.$common.request('sql', sql2).then((res) => {
  376. data2 = res.variables.data
  377. })
  378. await this.$common.request('sql', sql3).then((res) => {
  379. data3 = res.variables.data
  380. })
  381. await this.$common.request('sql', sql4).then((res) => {
  382. data4 = res.variables.data
  383. })
  384. await this.$common.request('sql', sql5).then((res) => {
  385. data5 = res.variables.data
  386. })
  387. await this.$common.request('sql', sql6).then((res) => {
  388. data6 = res.variables.data
  389. })
  390. for (var item of this.yearArr) {
  391. const gk = data1.find((v) => { return v.niandu === item + '' })
  392. const gc = data2.find((v) => { return v.niandu === item + '' })
  393. const sk = data3.find((v) => { return v.niandu === item + '' })
  394. const sc = data4.find((v) => { return v.niandu === item + '' })
  395. const zk = data5.find((v) => { return v.niandu === item + '' })
  396. const zc = data6.find((v) => { return v.niandu === item + '' })
  397. const gclv = (gk ? gk.count : 0) === 0 ? 0 : (((gc ? gc.count : 0) / (gk ? gk.count : 0)) * 100).toFixed(2)
  398. const sclv = (sk ? sk.count : 0) === 0 ? 0 : (((sc ? sc.count : 0) / (sk ? sk.count : 0)) * 100).toFixed(2)
  399. const zclv = (zk ? zk.count : 0) === 0 ? 0 : (((zc ? zc.count : 0) / (zk ? zk.count : 0)) * 100).toFixed(2)
  400. // 国开展
  401. this.list1.push(gk ? gk.count : 0)
  402. // 国参加
  403. this.list2.push(gc ? gc.count : 0)
  404. // 省开展
  405. this.list3.push(sk ? sk.count : 0)
  406. // 省参加
  407. this.list4.push(sc ? sc.count : 0)
  408. // 国参加率
  409. this.list5.push(gclv)
  410. // 省参加率
  411. this.list6.push(sclv)
  412. // 总参加率
  413. this.list7.push(zclv)
  414. }
  415. },
  416. async getListE () {
  417. this.arr1 = []
  418. this.arr2 = []
  419. this.arr3 = []
  420. let data1 = []
  421. let data2 = []
  422. const sql1 = `select LEFT(suo_shu_nian_fen_,4) as niandu, COUNT(*) AS count from t_zkxxtjbzb WHERE find_in_set(LEFT(suo_shu_nian_fen_,4), '${this.yearStr}') and shi_yan_shi_ = '✓' GROUP BY LEFT(suo_shu_nian_fen_,4)`
  423. const sql2 = `select LEFT(suo_shu_nian_fen_,4) as niandu, COUNT(*) AS count from t_zkxxtjbzb WHERE find_in_set(LEFT(suo_shu_nian_fen_,4), '${this.yearStr}') and shi_nei_zhi_kong_ = '✓' GROUP BY LEFT(suo_shu_nian_fen_,4)`
  424. await this.$common.request('sql', sql1).then((res) => {
  425. data1 = res.variables.data
  426. })
  427. await this.$common.request('sql', sql2).then((res) => {
  428. data2 = res.variables.data
  429. })
  430. for (var item of this.yearArr) {
  431. const m = data1.find((v) => { return v.niandu === item + '' })
  432. const n = data2.find((v) => { return v.niandu === item + '' })
  433. // 开展率
  434. this.arr1.push(((m ? m.count : 0) === 0 ? 0 : ((n ? n.count : 0) / (m ? m.count : 0)) * 100).toFixed(2))
  435. // 实验室开展项目数
  436. this.arr2.push((m ? m.count : 0))
  437. // 开展室内质控项目数
  438. this.arr3.push(n ? n.count : 0)
  439. }
  440. }
  441. }
  442. }
  443. </script>
  444. <style lang="less" scoped>
  445. .personView {
  446. width: 100%;
  447. // height: calc(100vh - 100px);
  448. height: 100%;
  449. // background-image: url("~@/assets/images/screen/bg.png");
  450. z-index: 999;
  451. #dv-full-screen-container {
  452. background-image: url("~@/assets/images/screen/bg.png");
  453. background-size: 100% 100%;
  454. box-shadow: 0 0 3px blue;
  455. display: flex;
  456. flex-direction: column;
  457. color: white;
  458. }
  459. }
  460. .topView {
  461. overflow: hidden;
  462. box-sizing: border-box;
  463. .jbd-title {
  464. text-align: center;
  465. font-weight: bold;
  466. width: 100%;
  467. color: white;
  468. font-size: 18px;
  469. height: 50%;
  470. }
  471. }
  472. .botView {
  473. height: 98%;
  474. width: 98%;
  475. margin: 0 auto;
  476. overflow: hidden;
  477. box-sizing: border-box;
  478. }
  479. .viewTop{
  480. display: flex;
  481. overflow: hidden;
  482. box-sizing: border-box;
  483. height: 45%;
  484. width: 100%;
  485. .topleft{
  486. height: 100%;
  487. width: 50%;
  488. overflow: hidden;
  489. box-sizing: border-box;
  490. }
  491. .topright{
  492. height: 100%;
  493. width: 50%;
  494. overflow: hidden;
  495. box-sizing: border-box;
  496. }
  497. }
  498. .viewBot{
  499. display: flex;
  500. overflow: hidden;
  501. box-sizing: border-box;
  502. height: 47%;
  503. width: 100%;
  504. .botleft{
  505. height: 100%;
  506. width: 33%;
  507. overflow: hidden;
  508. box-sizing: border-box;
  509. }
  510. .botmidd{
  511. height: 100%;
  512. width: 33%;
  513. overflow: hidden;
  514. box-sizing: border-box;
  515. }
  516. .botright{
  517. height: 100%;
  518. width: 33%;
  519. overflow: hidden;
  520. box-sizing: border-box;
  521. }
  522. }
  523. </style>