ModuleBrigadeTwo.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. <template>
  2. <module-container title="模块二 查堵人员分析">
  3. <div class="module-brigade-content">
  4. <div class="chart-row">
  5. <div class="chart-item">
  6. <div class="chart-title">查堵-主管排行榜</div>
  7. <rank-list :rank-data="rankData1" title="查堵-主管排行榜" />
  8. </div>
  9. <div class="chart-item">
  10. <div class="chart-title">查堵-班组长排行榜</div>
  11. <rank-list :rank-data="rankData2" title="查堵-班组长排行榜" />
  12. </div>
  13. <div class="chart-item">
  14. <div class="chart-title">查堵-员工排行榜</div>
  15. <rank-list :rank-data="rankData3" title="查堵-员工排行榜" />
  16. </div>
  17. </div>
  18. <div class="chart-row">
  19. <div class="chart-item">
  20. <div class="chart-title">查堵男女比例</div>
  21. <div ref="chart4" class="echarts"></div>
  22. </div>
  23. <div class="chart-item">
  24. <div class="chart-title">查堵人员证书级别分布</div>
  25. <div ref="chart5" class="echarts"></div>
  26. </div>
  27. <div class="chart-item">
  28. <div class="chart-title">证书级别人员基数</div>
  29. <div ref="chart6" class="echarts"></div>
  30. </div>
  31. </div>
  32. <div class="chart-row">
  33. <div class="chart-item">
  34. <div class="chart-title">查堵物品位置</div>
  35. <div ref="chart7" class="echarts"></div>
  36. </div>
  37. <div class="chart-item">
  38. <div class="chart-title">查堵-困难图像数</div>
  39. <div class="number-display">
  40. <div class="number-value">819</div>
  41. <div class="number-unit">幅</div>
  42. </div>
  43. </div>
  44. <div class="chart-item">
  45. <div class="chart-title">查堵-简单图像数</div>
  46. <div class="number-display">
  47. <div class="number-value">819</div>
  48. <div class="number-unit">幅</div>
  49. </div>
  50. </div>
  51. </div>
  52. <div class="chart-row">
  53. <div class="chart-item">
  54. <div class="chart-title">查堵-主管分管次数</div>
  55. <div ref="chart10" class="echarts"></div>
  56. </div>
  57. <div class="chart-item">
  58. <div class="chart-title">查堵原因分类</div>
  59. <div ref="chart11" class="echarts"></div>
  60. </div>
  61. </div>
  62. <div class="chart-row">
  63. <div class="chart-item">
  64. <div class="chart-title">查堵人员开机年限分布</div>
  65. <div ref="chart12" class="echarts"></div>
  66. </div>
  67. <div class="chart-item">
  68. <div class="chart-title">大队开机年限人员分布</div>
  69. <div ref="chart13" class="echarts"></div>
  70. </div>
  71. </div>
  72. </div>
  73. </module-container>
  74. </template>
  75. <script setup>
  76. import { ref, onMounted, reactive } from 'vue'
  77. import * as echarts from 'echarts'
  78. import ModuleContainer from './ModuleContainer.vue'
  79. import RankList from './RankList.vue'
  80. import { useEcharts } from '@/hooks/chart.js'
  81. const chart4 = ref(null)
  82. const chart5 = ref(null)
  83. const chart6 = ref(null)
  84. const chart7 = ref(null)
  85. const chart10 = ref(null)
  86. const chart11 = ref(null)
  87. const chart12 = ref(null)
  88. const chart13 = ref(null)
  89. const { setOption: setOption4 } = useEcharts(chart4)
  90. const { setOption: setOption5 } = useEcharts(chart5)
  91. const { setOption: setOption6 } = useEcharts(chart6)
  92. const { setOption: setOption7 } = useEcharts(chart7)
  93. const { setOption: setOption10 } = useEcharts(chart10)
  94. const { setOption: setOption11 } = useEcharts(chart11)
  95. const { setOption: setOption12 } = useEcharts(chart12)
  96. const { setOption: setOption13 } = useEcharts(chart13)
  97. const rankData1 = reactive([
  98. { name: '李鑫锋', value: 102 },
  99. { name: '李学玲', value: 94 },
  100. { name: '郑杰', value: 80 },
  101. { name: '郭仁吉', value: 69 },
  102. { name: '计沐', value: 67 },
  103. { name: '方园', value: 62 },
  104. { name: '符鑫日', value: 59 }
  105. ])
  106. const rankData2 = reactive([
  107. { name: '李雪琦', value: 44 },
  108. { name: '林瑞玉', value: 42 },
  109. { name: '吴明文', value: 40 },
  110. { name: '吕吕俊', value: 36 },
  111. { name: '潘任', value: 31 },
  112. { name: '吴亚琪', value: 30 }
  113. ])
  114. const rankData3 = reactive([
  115. { name: '梁其松', value: 18 },
  116. { name: '王名顺', value: 18 },
  117. { name: '陈艳丽', value: 16 },
  118. { name: '刘振华', value: 16 },
  119. { name: '黄建成', value: 15 },
  120. { name: '简句学', value: 15 },
  121. { name: '郭可奇', value: 14 }
  122. ])
  123. const pieChartOption = (data, colors) => ({
  124. color: colors,
  125. series: [{
  126. type: 'pie',
  127. radius: ['40%', '65%'],
  128. center: ['50%', '55%'],
  129. data: data,
  130. label: { show: true, formatter: '{b}\n{c}%', fontSize: 10 }
  131. }]
  132. })
  133. const donutChartOption = (data, colors) => ({
  134. color: colors,
  135. series: [{
  136. type: 'pie',
  137. radius: ['30%', '55%'],
  138. center: ['50%', '55%'],
  139. data: data,
  140. label: { show: true, formatter: '{b}', fontSize: 10, position: 'outside' }
  141. }]
  142. })
  143. const multiBarChartOption = (data, color) => ({
  144. grid: { left: '15%', top: '15%', right: '5%', bottom: '15%', containLabel: true },
  145. xAxis: { type: 'category', data: data.map(d => d.name), axisLine: { lineStyle: { color: '#999' } }, axisLabel: { fontSize: 10, color: '#666' } },
  146. yAxis: { type: 'value', axisLine: { lineStyle: { color: '#999' } }, axisLabel: { fontSize: 10, color: '#666' }, splitLine: { lineStyle: { color: '#eee' } } },
  147. series: [{ type: 'bar', data: data.map(d => d.value), itemStyle: { color: color }, barWidth: 20 }]
  148. })
  149. onMounted(() => {
  150. setOption4(pieChartOption([
  151. { name: '女', value: 52.26 },
  152. { name: '男', value: 47.74 }
  153. ], ['#ec4899', '#3b82f6']))
  154. setOption5(pieChartOption([
  155. { name: '高级', value: 49.81 },
  156. { name: '中级', value: 50.19 }
  157. ], ['#22c55e', '#3b82f6']))
  158. setOption6(pieChartOption([
  159. { name: '高级证书', value: 1.59 },
  160. { name: '中级证书', value: 98.41 }
  161. ], ['#22c55e', '#3b82f6']))
  162. setOption7(donutChartOption([
  163. { name: '中下', value: 6.35 },
  164. { name: '中间', value: 11.85 },
  165. { name: '右下', value: 7.74 },
  166. { name: '右上', value: 7.56 },
  167. { name: '左中', value: 7.26 },
  168. { name: '左上', value: 6.61 },
  169. { name: '左上', value: 11.16 },
  170. { name: '右下', value: 6.45 },
  171. { name: '右上', value: 12.42 },
  172. { name: '中下', value: 7.41 },
  173. { name: '右上', value: 6.11 },
  174. { name: '左上', value: 10.24 }
  175. ], ['#8b5cf6', '#ec4899', '#f97316', '#22c55e', '#3b82f6', '#14b8a6', '#ef4444', '#fbbf24', '#6366f1', '#06b6d4', '#84cc16', '#e11d48']))
  176. setOption10(donutChartOption([
  177. { name: '赵德峰', value: 12.46 },
  178. { name: '刘佳', value: 7.94 },
  179. { name: '郑晓华', value: 7.94 },
  180. { name: '谢金艳', value: 7.82 },
  181. { name: '潘仁芳', value: 7.33 },
  182. { name: '张庆林', value: 7.2 },
  183. { name: '陈颖', value: 7.2 },
  184. { name: '李学芬', value: 7.2 },
  185. { name: '李俊峰', value: 7.08 },
  186. { name: '周雪梅', value: 7.08 },
  187. { name: '刘旭', value: 6.46 },
  188. { name: '李丽', value: 6.46 },
  189. { name: '任静', value: 6.46 },
  190. { name: '张静', value: 6.46 }
  191. ], ['#3b82f6', '#22c55e', '#f97316', '#ec4899', '#8b5cf6', '#14b8a6', '#ef4444', '#fbbf24', '#6366f1', '#06b6d4', '#84cc16', '#e11d48', '#a855f7', '#f59e0b']))
  192. setOption11(pieChartOption([
  193. { name: '问题判断不清,未按规范检查导致漏检', value: 23.20 },
  194. { name: '未按规范检查导致漏检', value: 7.04 },
  195. { name: '判断不清,漏检', value: 6.48 },
  196. { name: '未能辨别危险品', value: 5.92 },
  197. { name: '未能辨别危险品', value: 5.92 },
  198. { name: '未能辨别危险品', value: 2.88 },
  199. { name: '简单漏检未能认真判断', value: 21.23 },
  200. { name: '未能辨别危险品', value: 27.34 }
  201. ], ['#3b82f6', '#22c55e', '#f97316', '#ec4899', '#8b5cf6', '#14b8a6', '#ef4444', '#fbbf24']))
  202. setOption12(pieChartOption([
  203. { name: '5年及5年以上', value: 30.71 },
  204. { name: '4年人员数', value: 18.68 },
  205. { name: '3年人员数', value: 22.47 },
  206. { name: '2年人员数', value: 14.75 },
  207. { name: '1年人员数', value: 6.76 },
  208. { name: '不足1年人员数', value: 6.63 }
  209. ], ['#3b82f6', '#22c55e', '#f97316', '#ec4899', '#8b5cf6', '#14b8a6']))
  210. setOption13(multiBarChartOption([
  211. { name: '安检一大队', value: 104 },
  212. { name: '安检二大队', value: 39 },
  213. { name: '安检三大队', value: 14 },
  214. { name: '安检四大队', value: 13 },
  215. { name: '安检五大队', value: 12 }
  216. ], '#3b82f6'))
  217. })
  218. </script>
  219. <style lang="less" scoped>
  220. .module-brigade-content {
  221. height: 100%;
  222. display: flex;
  223. flex-direction: column;
  224. gap: 10px;
  225. overflow-y: auto;
  226. }
  227. .chart-row {
  228. display: flex;
  229. gap: 10px;
  230. flex-shrink: 0;
  231. }
  232. .chart-item {
  233. flex: 1;
  234. background: #fff;
  235. border-radius: 6px;
  236. padding: 10px;
  237. border: 1px solid #eee;
  238. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
  239. display: flex;
  240. flex-direction: column;
  241. min-height: 200px;
  242. }
  243. .chart-title {
  244. font-size: 14px;
  245. color: #333;
  246. margin-bottom: 5px;
  247. text-align: left;
  248. font-weight: 500;
  249. }
  250. .echarts {
  251. flex: 1;
  252. width: 100%;
  253. min-height: 0;
  254. }
  255. .number-display {
  256. flex: 1;
  257. display: flex;
  258. flex-direction: column;
  259. align-items: center;
  260. justify-content: center;
  261. }
  262. .number-value {
  263. font-size: 48px;
  264. font-weight: bold;
  265. color: #3b82f6;
  266. }
  267. .number-unit {
  268. font-size: 14px;
  269. color: #666;
  270. margin-top: 5px;
  271. }
  272. </style>