profile.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <template>
  2. <div class="main-content-wrapper">
  3. <div class="main-content">
  4. <div class="content-row">
  5. <ProfileRadar :chartData="radarData" />
  6. <ProfileMembers
  7. :columns="memberColumns"
  8. :data="teamMembers"
  9. />
  10. </div>
  11. <div class="content-row">
  12. <ProfileBasicDistribution
  13. :chartData1="genderData"
  14. :chartData2="nationData"
  15. :chartData3="politicalData"
  16. />
  17. <ProfilePositionDistribution
  18. :chartData1="skillData"
  19. :chartData2="operateData"
  20. :chartData3="postData"
  21. />
  22. </div>
  23. </div>
  24. </div>
  25. </template>
  26. <script setup>
  27. import { ref, watch } from 'vue'
  28. import ProfileRadar from '../../components/ProfileRadar.vue'
  29. import ProfileMembers from '../../components/ProfileMembers.vue'
  30. import ProfileBasicDistribution from '../../components/ProfileBasicDistribution.vue'
  31. import ProfilePositionDistribution from '../../components/ProfilePositionDistribution.vue'
  32. import { getDeptMembers, getDeptMemberDistribution, getDeptPositionDistribution, getDimensionScoreOverview } from '@/api/portraitManagement/portraitManagement'
  33. const props = defineProps({
  34. queryParams: {
  35. type: Object,
  36. default: () => ({})
  37. }
  38. })
  39. const radarData = ref([])
  40. const teamMembers = ref([
  41. { deptName: '安检一队', employeeCount: 32, partyMemberCount: 8, avgAge: 28.5, avgServiceYear: 4.2, avgXrayYear: 3.1, totalScore: 92.5 },
  42. { deptName: '安检二队', employeeCount: 28, partyMemberCount: 6, avgAge: 30.2, avgServiceYear: 5.8, avgXrayYear: 4.5, totalScore: 88.3 },
  43. { deptName: '安检三队', employeeCount: 35, partyMemberCount: 10, avgAge: 27.8, avgServiceYear: 3.5, avgXrayYear: 2.8, totalScore: 90.1 },
  44. { deptName: '安检四队', employeeCount: 30, partyMemberCount: 7, avgAge: 29.6, avgServiceYear: 4.8, avgXrayYear: 3.6, totalScore: 86.7 },
  45. { deptName: '安检五队', employeeCount: 26, partyMemberCount: 5, avgAge: 31.0, avgServiceYear: 6.2, avgXrayYear: 5.0, totalScore: 85.9 },
  46. { deptName: '安检六队', employeeCount: 33, partyMemberCount: 9, avgAge: 28.0, avgServiceYear: 3.8, avgXrayYear: 2.5, totalScore: 91.2 }
  47. ])
  48. const memberColumns = ref([
  49. { label: '部门', prop: 'deptName' },
  50. { label: '员工数量', prop: 'employeeCount' },
  51. { label: '党员数量', prop: 'partyMemberCount' },
  52. { label: '平均年龄', prop: 'avgAge' },
  53. { label: '平均司龄', prop: 'avgServiceYear' },
  54. { label: '平均开机年限', prop: 'avgXrayYear' },
  55. { label: '综合得分', prop: 'totalScore' }
  56. ])
  57. const genderData = ref([
  58. ])
  59. const nationData = ref([
  60. ])
  61. const politicalData = ref([
  62. ])
  63. const skillData = ref([])
  64. const operateData = ref([])
  65. const postData = ref({
  66. categories: ['前传', '人身', '验证', '开包', '开机'],
  67. values: [4, 5, 6, 7, 8],
  68. colors: ['#ff6b6b', '#ee5a24']
  69. })
  70. const fetchTeamMembers = async (params) => {
  71. try {
  72. const res = await getDeptMembers(params)
  73. if (res.code === 200 && res.data) {
  74. teamMembers.value = res.data
  75. }
  76. } catch (error) {
  77. console.error('获取部门成员列表失败', error)
  78. }
  79. }
  80. const fetchMemberDistribution = async (params) => {
  81. try {
  82. const res = await getDeptMemberDistribution(params)
  83. if (res.code === 200 && res.data) {
  84. genderData.value = res.data.sexDistribution.map(item => ({ value: item.count, name: item.name })) || []
  85. nationData.value = res.data.nationDistribution.map(item => ({ value: item.count, name: item.name })) || []
  86. politicalData.value = res.data.politicalDistribution.map(item => ({ value: item.count, name: item.name })) || []
  87. console.log('genderData', genderData.value)
  88. console.log('nationData', nationData.value)
  89. console.log('politicalData', politicalData.value)
  90. }
  91. } catch (error) {
  92. console.error('获取部门成员基本情况分布失败', error)
  93. }
  94. }
  95. const fetchPositionDistribution = async (params) => {
  96. try {
  97. const res = await getDeptPositionDistribution(params)
  98. if (res.code === 200 && res.data) {
  99. skillData.value = res.data.qualificationDistribution.map(item => ({ value: item.count, name: item.name })) || []
  100. operateData.value = res.data.xrayYearDistribution.map(item => ({ value: item.count, name: item.name })) || []
  101. postData.value = res.data.positionDistribution.map(item => ({ value: item.count, name: item.name })) || []
  102. }
  103. } catch (error) {
  104. console.error('获取部门成员职位情况分布失败', error)
  105. }
  106. }
  107. const fetchRadarData = async (params) => {
  108. try {
  109. const res = await getDimensionScoreOverview(params)
  110. if (res.code === 200 && res.data) {
  111. radarData.value = res.data.dimensions || [{ name: '', finalScore: 0, color: '#00e5ff' }]
  112. }
  113. } catch (error) {
  114. console.error('获取维度得分一览失败', error)
  115. }
  116. }
  117. const fetchData = (params) => {
  118. if (!params.deptId && !params.groupId && !params.teamId ) {
  119. return
  120. }
  121. // console.log('params', params)
  122. // debugger
  123. fetchTeamMembers(params)
  124. fetchMemberDistribution(params)
  125. fetchPositionDistribution(params)
  126. fetchRadarData(params)
  127. }
  128. watch(() => props.queryParams, (newParams) => {
  129. fetchData(newParams)
  130. }, { deep: true, immediate: true })
  131. </script>
  132. <style lang="scss" scoped>
  133. .main-content-wrapper {
  134. .main-content {
  135. display: flex;
  136. flex-direction: column;
  137. gap: 20px;
  138. padding: 0 20px 40px;
  139. }
  140. .content-row {
  141. display: flex;
  142. gap: 20px;
  143. > .info-card {
  144. flex: 1;
  145. min-width: 0;
  146. }
  147. }
  148. }
  149. </style>