Просмотр исходного кода

refactor(portraitManagement,score): 重构多个页面数据与交互逻辑

1. 替换runData.vue默认人员为李凯,清空ProfileRadar默认雷达数据
2. 重构score/dimension页面选择器回调,新增层级切换逻辑
3. 清空多个统计组件默认示例数据,新增接口请求逻辑
4. 重构SearchBar组件,新增选中搜索项回调处理
5. 重构teamProfile与deptProfile页面,适配统一的雷达图props与数据请求
6. 重构score/event页面搜索表单与列表,新增层级联动筛选,优化代码格式
huoyi недель назад: 3
Родитель
Сommit
d7a036da96

+ 10 - 10
src/views/portraitManagement/components/ProfileMembers.vue

@@ -14,21 +14,21 @@ const props = defineProps({
14
   columns: {
14
   columns: {
15
     type: Array,
15
     type: Array,
16
     default: () => [
16
     default: () => [
17
-      { label: '姓名', prop: 'name' },
18
-      { label: '岗位', prop: 'post' },
19
-      { label: '技能等级', prop: 'skillLevel' },
20
-      { label: '开机年限', prop: 'years' }
17
+      // { label: '姓名', prop: 'name' },
18
+      // { label: '岗位', prop: 'post' },
19
+      // { label: '技能等级', prop: 'skillLevel' },
20
+      // { label: '开机年限', prop: 'years' }
21
     ]
21
     ]
22
   },
22
   },
23
   data: {
23
   data: {
24
     type: Array,
24
     type: Array,
25
     default: () => [
25
     default: () => [
26
-      { name: '张三', post: '主值班员', skillLevel: '高级工', years: '8年' },
27
-      { name: '李四', post: '副值班员', skillLevel: '中级工', years: '5年' },
28
-      { name: '王五', post: '巡检员', skillLevel: '高级工', years: '6年' },
29
-      { name: '赵六', post: '维护员', skillLevel: '中级工', years: '3年' },
30
-      { name: '钱七', post: '安全员', skillLevel: '技师', years: '12年' },
31
-      { name: '孙八', post: '主值班员', skillLevel: '高级技师', years: '15年' }
26
+      // { name: '张三', post: '主值班员', skillLevel: '高级工', years: '8年' },
27
+      // { name: '李四', post: '副值班员', skillLevel: '中级工', years: '5年' },
28
+      // { name: '王五', post: '巡检员', skillLevel: '高级工', years: '6年' },
29
+      // { name: '赵六', post: '维护员', skillLevel: '中级工', years: '3年' },
30
+      // { name: '钱七', post: '安全员', skillLevel: '技师', years: '12年' },
31
+      // { name: '孙八', post: '主值班员', skillLevel: '高级技师', years: '15年' }
32
     ]
32
     ]
33
   }
33
   }
34
 })
34
 })

+ 6 - 6
src/views/portraitManagement/components/ProfilePositionDistribution.vue

@@ -38,20 +38,20 @@ const props = defineProps({
38
 })
38
 })
39
 
39
 
40
 const defaultSkillData = {
40
 const defaultSkillData = {
41
-  categories: ['初级工', '中级工', '高级工', '技师', '高级技师'],
42
-  values: [30, 45, 60, 35, 20],
41
+  categories: [],
42
+  values: [],
43
   colors: ['#4da6ff', '#0f46fa']
43
   colors: ['#4da6ff', '#0f46fa']
44
 }
44
 }
45
 
45
 
46
 const defaultOperateData = {
46
 const defaultOperateData = {
47
-  categories: ['1年以下', '1~3年', '3~5年', '5~10年', '10年以上'],
48
-  values: [15, 40, 55, 45, 30],
47
+  categories: [],
48
+  values: [],
49
   colors: ['#6bcb77', '#2ecc71']
49
   colors: ['#6bcb77', '#2ecc71']
50
 }
50
 }
51
 
51
 
52
 const defaultPostData = {
52
 const defaultPostData = {
53
-  categories: ['主值班员', '副值班员', '巡检员', '维护员', '安全员'],
54
-  values: [25, 50, 40, 30, 20],
53
+  categories: [],
54
+  values: [],
55
   colors: ['#ff6b6b', '#ee5a24']
55
   colors: ['#ff6b6b', '#ee5a24']
56
 }
56
 }
57
 
57
 

+ 1 - 7
src/views/portraitManagement/components/ProfileRadar.vue

@@ -32,13 +32,7 @@ const props = defineProps({
32
 })
32
 })
33
 
33
 
34
 const defaultRadarData = [
34
 const defaultRadarData = [
35
-  { name: '通道安全防控力', finalScore: 86, color: '#00e5ff' },
36
-  { name: '通道安全防控力', finalScore: 90, color: '#00e5ff' },
37
-  { name: '通道安全防控力', finalScore: 72, color: '#ff4757' },
38
-  { name: '通道安全防控力', finalScore: 68, color: '#ff4757' },
39
-  { name: '通道安全防控力', finalScore: 78, color: '#3742fa' },
40
-  { name: '通道安全防控力', finalScore: 80, color: '#3742fa' },
41
-  { name: '通道协同作战能力', finalScore: 72, color: '#ff4757' }
35
+
42
 ]
36
 ]
43
 
37
 
44
 const computedRadarData = computed(() => {
38
 const computedRadarData = computed(() => {

+ 23 - 2
src/views/portraitManagement/components/SearchBar.vue

@@ -21,7 +21,8 @@
21
       <div class="custom-el-style">
21
       <div class="custom-el-style">
22
         <div>
22
         <div>
23
           <el-autocomplete v-model="personName" :fetch-suggestions="props.deptType === 'user' ? queryUsers : queryDept"
23
           <el-autocomplete v-model="personName" :fetch-suggestions="props.deptType === 'user' ? queryUsers : queryDept"
24
-            :placeholder="props.deptType === 'user' ? '搜索员工/团队画像' : '搜索部门'" style="width:320px;" clearable>
24
+            :placeholder="props.deptType === 'user' ? '搜索员工/团队画像' : '搜索部门'" style="width:320px;" clearable
25
+            @select="handleSelect">
25
             <template #suffix><el-icon>
26
             <template #suffix><el-icon>
26
                 <Search />
27
                 <Search />
27
               </el-icon></template>
28
               </el-icon></template>
@@ -31,7 +32,7 @@
31
                 item.deptName }}</span>
32
                 item.deptName }}</span>
32
             </template>
33
             </template>
33
           </el-autocomplete>
34
           </el-autocomplete>
34
-          <div class="primary" style="border-radius: 6px;" @click="() => searchHandler()">模糊搜索</div>
35
+          <!-- <div class="primary" style="border-radius: 6px;" @click="() => searchHandler()">模糊搜索</div> -->
35
         </div>
36
         </div>
36
         <div style="margin-top: 20px;">
37
         <div style="margin-top: 20px;">
37
           <el-tree :data="departments" :default-expanded-keys="[100]" :props="{ value: 'id', showPrefix: false }"
38
           <el-tree :data="departments" :default-expanded-keys="[100]" :props="{ value: 'id', showPrefix: false }"
@@ -79,6 +80,26 @@ const queryDept = async (query, cb) => {
79
   } catch (_) { cb([]) }
80
   } catch (_) { cb([]) }
80
 }
81
 }
81
 
82
 
83
+const handleSelect = (item) => {
84
+  if (props.deptType === 'user') {
85
+    personName.value = item.nickName
86
+    searchHandler({ personName: item.nickName })
87
+  } else {
88
+    personName.value = item.deptName
89
+    let obj = {}
90
+    if (props.deptType === 'BRIGADE' || props.deptType === 'STATION') {
91
+      obj = { deptId: item.deptId || item.id }
92
+    }
93
+    if (props.deptType === 'MANAGER') {
94
+      obj = { teamId: item.deptId || item.id, deptId: item.deptId || item.id }
95
+    }
96
+    if (props.deptType === 'TEAMS') {
97
+      obj = { groupId: item.deptId || item.id, deptId: item.deptId || item.id }
98
+    }
99
+    searchHandler(obj)
100
+  }
101
+}
102
+
82
 const filterDeptTree = (data, targetType) => {
103
 const filterDeptTree = (data, targetType) => {
83
   const filterNode = (node) => {
104
   const filterNode = (node) => {
84
     if (node.deptType === targetType) {
105
     if (node.deptType === targetType) {

+ 87 - 80
src/views/portraitManagement/deptProfile/component/profile.vue

@@ -2,29 +2,13 @@
2
   <div class="main-content-wrapper">
2
   <div class="main-content-wrapper">
3
     <div class="main-content">
3
     <div class="main-content">
4
       <div class="content-row">
4
       <div class="content-row">
5
-        <ProfileRadar
6
-          :chartData1="radarData"
7
-          :chartData2="radarIndicators"
8
-          :chartData3="radarSeries1"
9
-          :chartData4="radarSeries2"
10
-        />
11
-        <ProfileMembers
12
-          :columns="memberColumns"
13
-          :data="teamMembers"
14
-        />
5
+        <ProfileRadar :chartData="radarData" />
6
+        <ProfileMembers :columns="memberColumns" :data="teamMembers" />
15
       </div>
7
       </div>
16
 
8
 
17
       <div class="content-row">
9
       <div class="content-row">
18
-        <ProfileBasicDistribution
19
-          :chartData1="genderData"
20
-          :chartData2="nationData"
21
-          :chartData3="politicalData"
22
-        />
23
-        <ProfilePositionDistribution
24
-          :chartData1="skillData"
25
-          :chartData2="operateData"
26
-          :chartData3="postData"
27
-        />
10
+        <ProfileBasicDistribution :chartData1="genderData" :chartData2="nationData" :chartData3="politicalData" />
11
+        <ProfilePositionDistribution :chartData1="skillData" :chartData2="operateData" :chartData3="postData" />
28
       </div>
12
       </div>
29
     </div>
13
     </div>
30
   </div>
14
   </div>
@@ -36,7 +20,7 @@ import ProfileRadar from '../../components/ProfileRadar.vue'
36
 import ProfileMembers from '../../components/ProfileMembers.vue'
20
 import ProfileMembers from '../../components/ProfileMembers.vue'
37
 import ProfileBasicDistribution from '../../components/ProfileBasicDistribution.vue'
21
 import ProfileBasicDistribution from '../../components/ProfileBasicDistribution.vue'
38
 import ProfilePositionDistribution from '../../components/ProfilePositionDistribution.vue'
22
 import ProfilePositionDistribution from '../../components/ProfilePositionDistribution.vue'
39
-
23
+import { getDeptMembers, getDeptMemberDistribution, getDeptPositionDistribution, getDimensionScoreOverview } from '@/api/portraitManagement/portraitManagement'
40
 const props = defineProps({
24
 const props = defineProps({
41
   queryParams: {
25
   queryParams: {
42
     type: Object,
26
     type: Object,
@@ -45,100 +29,123 @@ const props = defineProps({
45
 })
29
 })
46
 
30
 
47
 const radarData = ref([
31
 const radarData = ref([
48
-  { name: '通道安全防控力', value: 86, color: '#00e5ff' },
49
-  { name: '通道安全防控力', value: 90, color: '#00e5ff' },
50
-  { name: '通道安全防控力', value: 72, color: '#ff4757' },
51
-  { name: '通道安全防控力', value: 68, color: '#ff4757' },
52
-  { name: '通道安全防控力', value: 78, color: '#3742fa' },
53
-  { name: '通道安全防控力', value: 80, color: '#3742fa' },
54
-  { name: '通道协同作战能力', value: 72, color: '#ff4757' }
55
-])
56
 
32
 
57
-const radarIndicators = ref([
58
-  { name: '通道安全防控力', max: 100 },
59
-  { name: '通道安全防控力', max: 100 },
60
-  { name: '通道安全防控力', max: 100 },
61
-  { name: '通道安全防控力', max: 100 },
62
-  { name: '通道安全防控力', max: 100 },
63
-  { name: '通道安全防控力', max: 100 },
64
-  { name: '通道协同作战能力', max: 100 }
65
 ])
33
 ])
66
 
34
 
67
-const radarSeries1 = ref([86, 90, 72, 68, 78, 80, 72])
68
-const radarSeries2 = ref([80, 85, 65, 60, 72, 75, 68])
35
+
69
 
36
 
70
 const teamMembers = ref([
37
 const teamMembers = ref([
71
-  { name: '孙晓波', age: 25, seniority: 3, gender: '男', nation: '汉', political: '群众', position: '安检员', qualification: '前传、特检、人身', skillLevel: '三级', operateYears: 5, avgYears: 6, totalScore: 88 },
72
-  { name: '孙晓波', age: 28, seniority: 6, gender: '男', nation: '汉', political: '群众', position: '组长', qualification: '前传、特检、人身', skillLevel: '三级', operateYears: 5, avgYears: 5, totalScore: 85 },
73
-  { name: '孙晓波', age: 31, seniority: 2, gender: '女', nation: '汉', political: '党员', position: '组长', qualification: '前传、特检、人身', skillLevel: '四级', operateYears: 5, avgYears: 76, totalScore: 76 },
74
-  { name: '马力', age: 26, seniority: 3, gender: '男', nation: '汉', political: '群众', position: '组长', qualification: '前传、特检、人身', skillLevel: '五级', operateYears: 5, avgYears: 81, totalScore: 81 },
75
-  { name: '马建国', age: 24, seniority: 5, gender: '男', nation: '汉', political: '党员', position: '安检员', qualification: '前传、特检、人身', skillLevel: '三级', operateYears: 6, avgYears: 78, totalScore: 78 }
38
+  // { name: '孙晓波', age: 25, seniority: 3, gender: '男', nation: '汉', political: '群众', position: '安检员', qualification: '前传、特检、人身', skillLevel: '三级', operateYears: 5, avgYears: 6, totalScore: 88 },
39
+  // { name: '孙晓波', age: 28, seniority: 6, gender: '男', nation: '汉', political: '群众', position: '组长', qualification: '前传、特检、人身', skillLevel: '三级', operateYears: 5, avgYears: 5, totalScore: 85 },
40
+  // { name: '孙晓波', age: 31, seniority: 2, gender: '女', nation: '汉', political: '党员', position: '组长', qualification: '前传、特检、人身', skillLevel: '四级', operateYears: 5, avgYears: 76, totalScore: 76 },
41
+  // { name: '马力', age: 26, seniority: 3, gender: '男', nation: '汉', political: '群众', position: '组长', qualification: '前传、特检、人身', skillLevel: '五级', operateYears: 5, avgYears: 81, totalScore: 81 },
42
+  // { name: '马建国', age: 24, seniority: 5, gender: '男', nation: '汉', political: '党员', position: '安检员', qualification: '前传、特检、人身', skillLevel: '三级', operateYears: 6, avgYears: 78, totalScore: 78 }
76
 ])
43
 ])
77
 
44
 
78
 const memberColumns = ref([
45
 const memberColumns = ref([
79
-  { label: '姓名', prop: 'name' },
46
+  { label: '姓名', prop: 'personName' },
80
   { label: '年龄', prop: 'age' },
47
   { label: '年龄', prop: 'age' },
81
-  { label: '司龄', prop: 'seniority' },
82
-  { label: '性别', prop: 'gender' },
48
+  { label: '司龄', prop: 'workYears' },
49
+  { label: '性别', prop: 'sex' },
83
   { label: '民族', prop: 'nation' },
50
   { label: '民族', prop: 'nation' },
84
-  { label: '政治面貌', prop: 'political' },
85
-  { label: '职务', prop: 'position' },
86
-  { label: '岗位资质', prop: 'qualification' },
51
+  { label: '政治面貌', prop: 'politicalStatus' },
52
+  { label: '职务', prop: 'roleNames' },
53
+  { label: '岗位资质', prop: 'qualificationLevel' },
87
   { label: '职业技能等级', prop: 'skillLevel' },
54
   { label: '职业技能等级', prop: 'skillLevel' },
88
-  { label: '开机年限', prop: 'operateYears' },
55
+  { label: '开机年限', prop: 'xrayOperatorYears' },
89
   { label: '平均年限', prop: 'avgYears' },
56
   { label: '平均年限', prop: 'avgYears' },
90
   { label: '综合得分', prop: 'totalScore' }
57
   { label: '综合得分', prop: 'totalScore' }
91
 ])
58
 ])
92
 
59
 
93
 const genderData = ref([
60
 const genderData = ref([
94
-  { value: 6, name: '女', itemStyle: { color: '#ff6b9d' } },
95
-  { value: 8, name: '男', itemStyle: { color: '#4da6ff' } }
61
+
96
 ])
62
 ])
97
 
63
 
98
 const nationData = ref([
64
 const nationData = ref([
99
-  { value: 1, name: '回族', itemStyle: { color: '#ff9f43' } },
100
-  { value: 8, name: '汉族', itemStyle: { color: '#4da6ff' } },
101
-  { value: 5, name: '其他', itemStyle: { color: '#a55eea' } }
65
+
102
 ])
66
 ])
103
 
67
 
104
 const politicalData = ref([
68
 const politicalData = ref([
105
-  { value: 1, name: '党员', itemStyle: { color: '#ff6b6b' } },
106
-  { value: 2, name: '共青团员', itemStyle: { color: '#ffd93d' } },
107
-  { value: 5, name: '群众', itemStyle: { color: '#6bcb77' } },
108
-  { value: 6, name: '其他', itemStyle: { color: '#4d96ff' } }
69
+
109
 ])
70
 ])
110
 
71
 
111
 const skillData = ref([
72
 const skillData = ref([
112
-  { name: '等级1', value: 3 },
113
-  { name: '等级2', value: 5 },
114
-  { name: '等级3', value: 7 },
115
-  { name: '等级4', value: 8 },
116
-  { name: '等级5', value: 4 }
73
+
117
 ])
74
 ])
118
 
75
 
119
 const operateData = ref([
76
 const operateData = ref([
120
-  { name: '0-3年', value: 4 },
121
-  { name: '4-7年', value: 2 },
122
-  { name: '8-11年', value: 3 },
123
-  { name: '12-15年', value: 5 },
124
-  { name: '15年以上', value: 8 }
77
+
125
 ])
78
 ])
126
 
79
 
127
 const postData = ref([
80
 const postData = ref([
128
-  { name: '前传', value: 4 },
129
-  { name: '人身', value: 5 },
130
-  { name: '验证', value: 6 },
131
-  { name: '开包', value: 7 },
132
-  { name: '开机', value: 8 }
81
+
133
 ])
82
 ])
83
+const fetchTeamMembers = async (params) => {
84
+  try {
85
+    const res = await getDeptMembers(params)
86
+    if (res.code === 200 && res.data) {
87
+      teamMembers.value = res.data
88
+    }
89
+  } catch (error) {
90
+    console.error('获取部门成员列表失败', error)
91
+  }
92
+}
134
 
93
 
135
-watch(() => props.queryParams, (newParams) => {
136
-  fetchData(newParams)
137
-}, { deep: true })
94
+const fetchMemberDistribution = async (params) => {
95
+  try {
96
+    const res = await getDeptMemberDistribution(params)
97
+    if (res.code === 200 && res.data) {
98
+
99
+      genderData.value = res.data.sexDistribution.map(item => ({ value: item.count, name: item.name })) || []
100
+      nationData.value = res.data.nationDistribution.map(item => ({ value: item.count, name: item.name })) || []
101
+      politicalData.value = res.data.politicalDistribution.map(item => ({ value: item.count, name: item.name })) || []
102
+      console.log('genderData', genderData.value)
103
+      console.log('nationData', nationData.value)
104
+      console.log('politicalData', politicalData.value)
105
+    }
106
+  } catch (error) {
107
+    console.error('获取部门成员基本情况分布失败', error)
108
+  }
109
+}
110
+
111
+const fetchPositionDistribution = async (params) => {
112
+  try {
113
+    const res = await getDeptPositionDistribution(params)
114
+    if (res.code === 200 && res.data) {
115
+      skillData.value = res.data.qualificationDistribution.map(item => ({ value: item.count, name: item.name })) || []
116
+      operateData.value = res.data.xrayYearDistribution.map(item => ({ value: item.count, name: item.name })) || []
117
+      postData.value = res.data.positionDistribution.map(item => ({ value: item.count, name: item.name })) || []
118
+    }
119
+  } catch (error) {
120
+    console.error('获取部门成员职位情况分布失败', error)
121
+  }
122
+}
138
 
123
 
124
+const fetchRadarData = async (params) => {
125
+  try {
126
+    const res = await getDimensionScoreOverview(params)
127
+    if (res.code === 200 && res.data) {
128
+      radarData.value = res.data.dimensions || [{ name: '', finalScore: 0, color: '#00e5ff' }]
129
+
130
+    }
131
+  } catch (error) {
132
+    console.error('获取维度得分一览失败', error)
133
+  }
134
+}
139
 const fetchData = (params) => {
135
 const fetchData = (params) => {
140
-  console.log('查询参数:', params)
136
+  if (!params.deptId && !params.groupId && !params.teamId) {
137
+    return
138
+  }
139
+  //  console.log('params', params)
140
+  // debugger
141
+  fetchTeamMembers(params)
142
+  fetchMemberDistribution(params)
143
+  fetchPositionDistribution(params)
144
+  fetchRadarData(params)
141
 }
145
 }
146
+watch(() => props.queryParams, (newParams) => {
147
+  fetchData(newParams)
148
+}, { deep: true, immediate: true })
142
 </script>
149
 </script>
143
 
150
 
144
 <style lang="scss" scoped>
151
 <style lang="scss" scoped>
@@ -154,7 +161,7 @@ const fetchData = (params) => {
154
     display: flex;
161
     display: flex;
155
     gap: 20px;
162
     gap: 20px;
156
 
163
 
157
-    > .info-card {
164
+    >.info-card {
158
       flex: 1;
165
       flex: 1;
159
       min-width: 0;
166
       min-width: 0;
160
     }
167
     }

+ 27 - 33
src/views/portraitManagement/groupProfile/component/profile.vue

@@ -3,23 +3,12 @@
3
     <div class="main-content">
3
     <div class="main-content">
4
       <div class="content-row">
4
       <div class="content-row">
5
         <ProfileRadar :chartData="radarData" />
5
         <ProfileRadar :chartData="radarData" />
6
-        <ProfileMembers
7
-          :columns="memberColumns"
8
-          :data="teamMembers"
9
-        />
6
+        <ProfileMembers :columns="memberColumns" :data="teamMembers" />
10
       </div>
7
       </div>
11
 
8
 
12
       <div class="content-row">
9
       <div class="content-row">
13
-        <ProfileBasicDistribution
14
-          :chartData1="genderData"
15
-          :chartData2="nationData"
16
-          :chartData3="politicalData"
17
-        />
18
-        <ProfilePositionDistribution
19
-          :chartData1="skillData"
20
-          :chartData2="operateData"
21
-          :chartData3="postData"
22
-        />
10
+        <ProfileBasicDistribution :chartData1="genderData" :chartData2="nationData" :chartData3="politicalData" />
11
+        <ProfilePositionDistribution :chartData1="skillData" :chartData2="operateData" :chartData3="postData" />
23
       </div>
12
       </div>
24
     </div>
13
     </div>
25
   </div>
14
   </div>
@@ -43,34 +32,39 @@ const props = defineProps({
43
 const radarData = ref([])
32
 const radarData = ref([])
44
 
33
 
45
 const teamMembers = ref([
34
 const teamMembers = ref([
46
-  { deptName: '安检一队', employeeCount: 32, partyMemberCount: 8, avgAge: 28.5, avgServiceYear: 4.2, avgXrayYear: 3.1, totalScore: 92.5 },
47
-  { deptName: '安检二队', employeeCount: 28, partyMemberCount: 6, avgAge: 30.2, avgServiceYear: 5.8, avgXrayYear: 4.5, totalScore: 88.3 },
48
-  { deptName: '安检三队', employeeCount: 35, partyMemberCount: 10, avgAge: 27.8, avgServiceYear: 3.5, avgXrayYear: 2.8, totalScore: 90.1 },
49
-  { deptName: '安检四队', employeeCount: 30, partyMemberCount: 7, avgAge: 29.6, avgServiceYear: 4.8, avgXrayYear: 3.6, totalScore: 86.7 },
50
-  { deptName: '安检五队', employeeCount: 26, partyMemberCount: 5, avgAge: 31.0, avgServiceYear: 6.2, avgXrayYear: 5.0, totalScore: 85.9 },
51
-  { deptName: '安检六队', employeeCount: 33, partyMemberCount: 9, avgAge: 28.0, avgServiceYear: 3.8, avgXrayYear: 2.5, totalScore: 91.2 }
35
+  // { deptName: '安检一队', employeeCount: 32, partyMemberCount: 8, avgAge: 28.5, avgServiceYear: 4.2, avgXrayYear: 3.1, totalScore: 92.5 },
36
+  // { deptName: '安检二队', employeeCount: 28, partyMemberCount: 6, avgAge: 30.2, avgServiceYear: 5.8, avgXrayYear: 4.5, totalScore: 88.3 },
37
+  // { deptName: '安检三队', employeeCount: 35, partyMemberCount: 10, avgAge: 27.8, avgServiceYear: 3.5, avgXrayYear: 2.8, totalScore: 90.1 },
38
+  // { deptName: '安检四队', employeeCount: 30, partyMemberCount: 7, avgAge: 29.6, avgServiceYear: 4.8, avgXrayYear: 3.6, totalScore: 86.7 },
39
+  // { deptName: '安检五队', employeeCount: 26, partyMemberCount: 5, avgAge: 31.0, avgServiceYear: 6.2, avgXrayYear: 5.0, totalScore: 85.9 },
40
+  // { deptName: '安检六队', employeeCount: 33, partyMemberCount: 9, avgAge: 28.0, avgServiceYear: 3.8, avgXrayYear: 2.5, totalScore: 91.2 }
52
 ])
41
 ])
53
 
42
 
54
 const memberColumns = ref([
43
 const memberColumns = ref([
55
-  { label: '部门', prop: 'deptName' },
56
-  { label: '员工数量', prop: 'employeeCount' },
57
-  { label: '党员数量', prop: 'partyMemberCount' },
58
-  { label: '平均年龄', prop: 'avgAge' },
59
-  { label: '平均司龄', prop: 'avgServiceYear' },
60
-  { label: '平均开机年限', prop: 'avgXrayYear' },
44
+  { label: '姓名', prop: 'personName' },
45
+  { label: '年龄', prop: 'age' },
46
+  { label: '司龄', prop: 'workYears' },
47
+  { label: '性别', prop: 'sex' },
48
+  { label: '民族', prop: 'nation' },
49
+  { label: '政治面貌', prop: 'politicalStatus' },
50
+  { label: '职务', prop: 'roleNames' },
51
+  { label: '岗位资质', prop: 'qualificationLevel' },
52
+  { label: '职业技能等级', prop: 'skillLevel' },
53
+  { label: '开机年限', prop: 'xrayOperatorYears' },
54
+  { label: '平均年限', prop: 'avgYears' },
61
   { label: '综合得分', prop: 'totalScore' }
55
   { label: '综合得分', prop: 'totalScore' }
62
 ])
56
 ])
63
 
57
 
64
 const genderData = ref([
58
 const genderData = ref([
65
-  
59
+
66
 ])
60
 ])
67
 
61
 
68
 const nationData = ref([
62
 const nationData = ref([
69
- 
63
+
70
 ])
64
 ])
71
 
65
 
72
 const politicalData = ref([
66
 const politicalData = ref([
73
-  
67
+
74
 ])
68
 ])
75
 
69
 
76
 const skillData = ref([])
70
 const skillData = ref([])
@@ -97,7 +91,7 @@ const fetchMemberDistribution = async (params) => {
97
   try {
91
   try {
98
     const res = await getDeptMemberDistribution(params)
92
     const res = await getDeptMemberDistribution(params)
99
     if (res.code === 200 && res.data) {
93
     if (res.code === 200 && res.data) {
100
-      
94
+
101
       genderData.value = res.data.sexDistribution.map(item => ({ value: item.count, name: item.name })) || []
95
       genderData.value = res.data.sexDistribution.map(item => ({ value: item.count, name: item.name })) || []
102
       nationData.value = res.data.nationDistribution.map(item => ({ value: item.count, name: item.name })) || []
96
       nationData.value = res.data.nationDistribution.map(item => ({ value: item.count, name: item.name })) || []
103
       politicalData.value = res.data.politicalDistribution.map(item => ({ value: item.count, name: item.name })) || []
97
       politicalData.value = res.data.politicalDistribution.map(item => ({ value: item.count, name: item.name })) || []
@@ -128,14 +122,14 @@ const fetchRadarData = async (params) => {
128
     const res = await getDimensionScoreOverview(params)
122
     const res = await getDimensionScoreOverview(params)
129
     if (res.code === 200 && res.data) {
123
     if (res.code === 200 && res.data) {
130
       radarData.value = res.data.dimensions || [{ name: '', finalScore: 0, color: '#00e5ff' }]
124
       radarData.value = res.data.dimensions || [{ name: '', finalScore: 0, color: '#00e5ff' }]
131
-     
125
+
132
     }
126
     }
133
   } catch (error) {
127
   } catch (error) {
134
     console.error('获取维度得分一览失败', error)
128
     console.error('获取维度得分一览失败', error)
135
   }
129
   }
136
 }
130
 }
137
 const fetchData = (params) => {
131
 const fetchData = (params) => {
138
-  if (!params.deptId && !params.groupId && !params.teamId ) {
132
+  if (!params.deptId && !params.groupId && !params.teamId) {
139
     return
133
     return
140
   }
134
   }
141
   //  console.log('params', params)
135
   //  console.log('params', params)
@@ -167,7 +161,7 @@ watch(() => props.queryParams, (newParams) => {
167
     display: flex;
161
     display: flex;
168
     gap: 20px;
162
     gap: 20px;
169
 
163
 
170
-    > .info-card {
164
+    >.info-card {
171
       flex: 1;
165
       flex: 1;
172
       min-width: 0;
166
       min-width: 0;
173
     }
167
     }

+ 3 - 8
src/views/portraitManagement/stationProfile/component/profile.vue

@@ -44,18 +44,13 @@ const teamColumns = [
44
   { label: '党员数量', prop: 'partyCount' },
44
   { label: '党员数量', prop: 'partyCount' },
45
   { label: '平均年龄', prop: 'avgAge' },
45
   { label: '平均年龄', prop: 'avgAge' },
46
   { label: '平均工龄', prop: 'avgWorkYears' },
46
   { label: '平均工龄', prop: 'avgWorkYears' },
47
-  { label: '职业资格证书等级', prop: 'certLevel' },
48
-  { label: '平均升级年龄', prop: 'avgUpgradeAge' },
47
+  { label: '职业资格等级证书数量', prop: 'certLevel' },
48
+  { label: '平均开机年龄', prop: 'avgUpgradeAge' },
49
   { label: '综合得分', prop: 'totalScore' }
49
   { label: '综合得分', prop: 'totalScore' }
50
 ]
50
 ]
51
 
51
 
52
 const teamData = ref([
52
 const teamData = ref([
53
-  { dept: '安检一科', empCount: 58, partyCount: 15, avgAge: 29.2, avgWorkYears: 5.1, certLevel: '高级工', avgUpgradeAge: 32.5, totalScore: 91.8 },
54
-  { dept: '安检二科', empCount: 52, partyCount: 12, avgAge: 30.5, avgWorkYears: 6.3, certLevel: '技师', avgUpgradeAge: 34.0, totalScore: 88.6 },
55
-  { dept: '安检三科', empCount: 61, partyCount: 18, avgAge: 28.0, avgWorkYears: 4.0, certLevel: '中级工', avgUpgradeAge: 31.2, totalScore: 93.2 },
56
-  { dept: '安检四科', empCount: 55, partyCount: 14, avgAge: 29.8, avgWorkYears: 5.5, certLevel: '高级工', avgUpgradeAge: 33.1, totalScore: 87.4 },
57
-  { dept: '安检五科', empCount: 48, partyCount: 10, avgAge: 31.2, avgWorkYears: 6.8, certLevel: '技师', avgUpgradeAge: 35.0, totalScore: 85.9 },
58
-  { dept: '安检六科', empCount: 60, partyCount: 16, avgAge: 27.5, avgWorkYears: 3.8, certLevel: '中级工', avgUpgradeAge: 30.8, totalScore: 90.5 }
53
+  
59
 ])
54
 ])
60
 
55
 
61
 const genderData = ref([])
56
 const genderData = ref([])

+ 5 - 5
src/views/portraitManagement/stationProfile/component/runData.vue

@@ -109,23 +109,23 @@ const props = defineProps({
109
   },
109
   },
110
   dutyLeader: {
110
   dutyLeader: {
111
     type: String,
111
     type: String,
112
-    default: '张某某'
112
+    default: '李凯'
113
   },
113
   },
114
   safetySection: {
114
   safetySection: {
115
     type: String,
115
     type: String,
116
-    default: '李某某'
116
+    default: '李'
117
   },
117
   },
118
   serviceSection: {
118
   serviceSection: {
119
     type: String,
119
     type: String,
120
-    default: '王某某'
120
+    default: '李凯'
121
   },
121
   },
122
   operationSection: {
122
   operationSection: {
123
     type: String,
123
     type: String,
124
-    default: '赵某某'
124
+    default: '李凯'
125
   },
125
   },
126
   standbyDuty: {
126
   standbyDuty: {
127
     type: String,
127
     type: String,
128
-    default: '刘某某'
128
+    default: '李凯'
129
   }
129
   }
130
 })
130
 })
131
 
131
 

+ 89 - 79
src/views/portraitManagement/teamProfile/component/profile.vue

@@ -2,29 +2,13 @@
2
   <div class="main-content-wrapper">
2
   <div class="main-content-wrapper">
3
     <div class="main-content">
3
     <div class="main-content">
4
       <div class="content-row">
4
       <div class="content-row">
5
-        <ProfileRadar
6
-          :chartData1="radarData"
7
-          :chartData2="radarIndicators"
8
-          :chartData3="radarSeries1"
9
-          :chartData4="radarSeries2"
10
-        />
11
-        <ProfileMembers
12
-          :columns="memberColumns"
13
-          :data="teamMembers"
14
-        />
5
+        <ProfileRadar :chartData="radarData" />
6
+        <ProfileMembers :columns="memberColumns" :data="teamMembers" />
15
       </div>
7
       </div>
16
 
8
 
17
       <div class="content-row">
9
       <div class="content-row">
18
-        <ProfileBasicDistribution
19
-          :chartData1="genderData"
20
-          :chartData2="nationData"
21
-          :chartData3="politicalData"
22
-        />
23
-        <ProfilePositionDistribution
24
-          :chartData1="skillData"
25
-          :chartData2="operateData"
26
-          :chartData3="postData"
27
-        />
10
+        <ProfileBasicDistribution :chartData1="genderData" :chartData2="nationData" :chartData3="politicalData" />
11
+        <ProfilePositionDistribution :chartData1="skillData" :chartData2="operateData" :chartData3="postData" />
28
       </div>
12
       </div>
29
     </div>
13
     </div>
30
   </div>
14
   </div>
@@ -36,7 +20,7 @@ import ProfileRadar from '../../components/ProfileRadar.vue'
36
 import ProfileMembers from '../../components/ProfileMembers.vue'
20
 import ProfileMembers from '../../components/ProfileMembers.vue'
37
 import ProfileBasicDistribution from '../../components/ProfileBasicDistribution.vue'
21
 import ProfileBasicDistribution from '../../components/ProfileBasicDistribution.vue'
38
 import ProfilePositionDistribution from '../../components/ProfilePositionDistribution.vue'
22
 import ProfilePositionDistribution from '../../components/ProfilePositionDistribution.vue'
39
-
23
+import { getDeptMembers, getDeptMemberDistribution, getDeptPositionDistribution, getDimensionScoreOverview } from '@/api/portraitManagement/portraitManagement'
40
 const props = defineProps({
24
 const props = defineProps({
41
   queryParams: {
25
   queryParams: {
42
     type: Object,
26
     type: Object,
@@ -45,100 +29,126 @@ const props = defineProps({
45
 })
29
 })
46
 
30
 
47
 const radarData = ref([
31
 const radarData = ref([
48
-  { name: '通道安全防控力', value: 86, color: '#00e5ff' },
49
-  { name: '通道安全防控力', value: 90, color: '#00e5ff' },
50
-  { name: '通道安全防控力', value: 72, color: '#ff4757' },
51
-  { name: '通道安全防控力', value: 68, color: '#ff4757' },
52
-  { name: '通道安全防控力', value: 78, color: '#3742fa' },
53
-  { name: '通道安全防控力', value: 80, color: '#3742fa' },
54
-  { name: '通道协同作战能力', value: 72, color: '#ff4757' }
32
+ 
55
 ])
33
 ])
56
 
34
 
57
-const radarIndicators = ref([
58
-  { name: '通道安全防控力', max: 100 },
59
-  { name: '通道安全防控力', max: 100 },
60
-  { name: '通道安全防控力', max: 100 },
61
-  { name: '通道安全防控力', max: 100 },
62
-  { name: '通道安全防控力', max: 100 },
63
-  { name: '通道安全防控力', max: 100 },
64
-  { name: '通道协同作战能力', max: 100 }
65
-])
66
 
35
 
67
-const radarSeries1 = ref([86, 90, 72, 68, 78, 80, 72])
68
-const radarSeries2 = ref([80, 85, 65, 60, 72, 75, 68])
69
 
36
 
70
 const teamMembers = ref([
37
 const teamMembers = ref([
71
-  { name: '孙晓波', age: 25, seniority: 3, gender: '男', nation: '汉', political: '群众', position: '安检员', qualification: '前传、特检、人身', skillLevel: '三级', operateYears: 5, avgYears: 6, totalScore: 88 },
72
-  { name: '孙晓波', age: 28, seniority: 6, gender: '男', nation: '汉', political: '群众', position: '组长', qualification: '前传、特检、人身', skillLevel: '三级', operateYears: 5, avgYears: 5, totalScore: 85 },
73
-  { name: '孙晓波', age: 31, seniority: 2, gender: '女', nation: '汉', political: '党员', position: '组长', qualification: '前传、特检、人身', skillLevel: '四级', operateYears: 5, avgYears: 76, totalScore: 76 },
74
-  { name: '马力', age: 26, seniority: 3, gender: '男', nation: '汉', political: '群众', position: '组长', qualification: '前传、特检、人身', skillLevel: '五级', operateYears: 5, avgYears: 81, totalScore: 81 },
75
-  { name: '马建国', age: 24, seniority: 5, gender: '男', nation: '汉', political: '党员', position: '安检员', qualification: '前传、特检、人身', skillLevel: '三级', operateYears: 6, avgYears: 78, totalScore: 78 }
38
+  // { name: '孙晓波', age: 25, seniority: 3, gender: '男', nation: '汉', political: '群众', position: '安检员', qualification: '前传、特检、人身', skillLevel: '三级', operateYears: 5, avgYears: 6, totalScore: 88 },
39
+  // { name: '孙晓波', age: 28, seniority: 6, gender: '男', nation: '汉', political: '群众', position: '组长', qualification: '前传、特检、人身', skillLevel: '三级', operateYears: 5, avgYears: 5, totalScore: 85 },
40
+  // { name: '孙晓波', age: 31, seniority: 2, gender: '女', nation: '汉', political: '党员', position: '组长', qualification: '前传、特检、人身', skillLevel: '四级', operateYears: 5, avgYears: 76, totalScore: 76 },
41
+  // { name: '马力', age: 26, seniority: 3, gender: '男', nation: '汉', political: '群众', position: '组长', qualification: '前传、特检、人身', skillLevel: '五级', operateYears: 5, avgYears: 81, totalScore: 81 },
42
+  // { name: '马建国', age: 24, seniority: 5, gender: '男', nation: '汉', political: '党员', position: '安检员', qualification: '前传、特检、人身', skillLevel: '三级', operateYears: 6, avgYears: 78, totalScore: 78 }
76
 ])
43
 ])
77
 
44
 
78
 const memberColumns = ref([
45
 const memberColumns = ref([
79
-  { label: '姓名', prop: 'name' },
46
+  { label: '姓名', prop: 'personName' },
80
   { label: '年龄', prop: 'age' },
47
   { label: '年龄', prop: 'age' },
81
-  { label: '司龄', prop: 'seniority' },
82
-  { label: '性别', prop: 'gender' },
48
+  { label: '司龄', prop: 'workYears' },
49
+  { label: '性别', prop: 'sex' },
83
   { label: '民族', prop: 'nation' },
50
   { label: '民族', prop: 'nation' },
84
-  { label: '政治面貌', prop: 'political' },
85
-  { label: '职务', prop: 'position' },
86
-  { label: '岗位资质', prop: 'qualification' },
51
+  { label: '政治面貌', prop: 'politicalStatus' },
52
+  { label: '职务', prop: 'roleNames' },
53
+  { label: '岗位资质', prop: 'qualificationLevel' },
87
   { label: '职业技能等级', prop: 'skillLevel' },
54
   { label: '职业技能等级', prop: 'skillLevel' },
88
-  { label: '开机年限', prop: 'operateYears' },
55
+  { label: '开机年限', prop: 'xrayOperatorYears' },
89
   { label: '平均年限', prop: 'avgYears' },
56
   { label: '平均年限', prop: 'avgYears' },
90
   { label: '综合得分', prop: 'totalScore' }
57
   { label: '综合得分', prop: 'totalScore' }
91
 ])
58
 ])
92
 
59
 
93
 const genderData = ref([
60
 const genderData = ref([
94
-  { value: 6, name: '女', itemStyle: { color: '#ff6b9d' } },
95
-  { value: 8, name: '男', itemStyle: { color: '#4da6ff' } }
61
+  
96
 ])
62
 ])
97
 
63
 
98
 const nationData = ref([
64
 const nationData = ref([
99
-  { value: 1, name: '回族', itemStyle: { color: '#ff9f43' } },
100
-  { value: 8, name: '汉族', itemStyle: { color: '#4da6ff' } },
101
-  { value: 5, name: '其他', itemStyle: { color: '#a55eea' } }
65
+ 
102
 ])
66
 ])
103
 
67
 
104
 const politicalData = ref([
68
 const politicalData = ref([
105
-  { value: 1, name: '党员', itemStyle: { color: '#ff6b6b' } },
106
-  { value: 2, name: '共青团员', itemStyle: { color: '#ffd93d' } },
107
-  { value: 5, name: '群众', itemStyle: { color: '#6bcb77' } },
108
-  { value: 6, name: '其他', itemStyle: { color: '#4d96ff' } }
69
+  
109
 ])
70
 ])
110
 
71
 
111
 const skillData = ref([
72
 const skillData = ref([
112
-  { name: '等级1', value: 3 },
113
-  { name: '等级2', value: 5 },
114
-  { name: '等级3', value: 7 },
115
-  { name: '等级4', value: 8 },
116
-  { name: '等级5', value: 4 }
73
+  
117
 ])
74
 ])
118
 
75
 
119
 const operateData = ref([
76
 const operateData = ref([
120
-  { name: '0-3年', value: 4 },
121
-  { name: '4-7年', value: 2 },
122
-  { name: '8-11年', value: 3 },
123
-  { name: '12-15年', value: 5 },
124
-  { name: '15年以上', value: 8 }
77
+  
125
 ])
78
 ])
126
 
79
 
127
 const postData = ref([
80
 const postData = ref([
128
-  { name: '前传', value: 4 },
129
-  { name: '人身', value: 5 },
130
-  { name: '验证', value: 6 },
131
-  { name: '开包', value: 7 },
132
-  { name: '开机', value: 8 }
81
+  
133
 ])
82
 ])
83
+const fetchTeamMembers = async (params) => {
84
+  try {
85
+    const res = await getDeptMembers(params)
86
+    if (res.code === 200 && res.data) {
87
+      teamMembers.value = res.data
88
+    }
89
+  } catch (error) {
90
+    console.error('获取部门成员列表失败', error)
91
+  }
92
+}
93
+
94
+const fetchMemberDistribution = async (params) => {
95
+  try {
96
+    const res = await getDeptMemberDistribution(params)
97
+    if (res.code === 200 && res.data) {
98
+
99
+      genderData.value = res.data.sexDistribution.map(item => ({ value: item.count, name: item.name })) || []
100
+      nationData.value = res.data.nationDistribution.map(item => ({ value: item.count, name: item.name })) || []
101
+      politicalData.value = res.data.politicalDistribution.map(item => ({ value: item.count, name: item.name })) || []
102
+      console.log('genderData', genderData.value)
103
+      console.log('nationData', nationData.value)
104
+      console.log('politicalData', politicalData.value)
105
+    }
106
+  } catch (error) {
107
+    console.error('获取部门成员基本情况分布失败', error)
108
+  }
109
+}
110
+
111
+const fetchPositionDistribution = async (params) => {
112
+  try {
113
+    const res = await getDeptPositionDistribution(params)
114
+    if (res.code === 200 && res.data) {
115
+      skillData.value = res.data.qualificationDistribution.map(item => ({ value: item.count, name: item.name })) || []
116
+      operateData.value = res.data.xrayYearDistribution.map(item => ({ value: item.count, name: item.name })) || []
117
+      postData.value = res.data.positionDistribution.map(item => ({ value: item.count, name: item.name })) || []
118
+    }
119
+  } catch (error) {
120
+    console.error('获取部门成员职位情况分布失败', error)
121
+  }
122
+}
123
+
124
+const fetchRadarData = async (params) => {
125
+  try {
126
+    const res = await getDimensionScoreOverview(params)
127
+    if (res.code === 200 && res.data) {
128
+      radarData.value = res.data.dimensions || [{ name: '', finalScore: 0, color: '#00e5ff' }]
129
+
130
+    }
131
+  } catch (error) {
132
+    console.error('获取维度得分一览失败', error)
133
+  }
134
+}
135
+const fetchData = (params) => {
136
+  if (!params.deptId && !params.groupId && !params.teamId) {
137
+    return
138
+  }
139
+  //  console.log('params', params)
140
+  // debugger
141
+  fetchTeamMembers(params)
142
+  fetchMemberDistribution(params)
143
+  fetchPositionDistribution(params)
144
+  fetchRadarData(params)
145
+}
134
 
146
 
135
 watch(() => props.queryParams, (newParams) => {
147
 watch(() => props.queryParams, (newParams) => {
136
   fetchData(newParams)
148
   fetchData(newParams)
137
 }, { deep: true })
149
 }, { deep: true })
138
 
150
 
139
-const fetchData = (params) => {
140
-  console.log('查询参数:', params)
141
-}
151
+
142
 </script>
152
 </script>
143
 
153
 
144
 <style lang="scss" scoped>
154
 <style lang="scss" scoped>
@@ -154,7 +164,7 @@ const fetchData = (params) => {
154
     display: flex;
164
     display: flex;
155
     gap: 20px;
165
     gap: 20px;
156
 
166
 
157
-    > .info-card {
167
+    >.info-card {
158
       flex: 1;
168
       flex: 1;
159
       min-width: 0;
169
       min-width: 0;
160
     }
170
     }

+ 6 - 1
src/views/score/dimension/index.vue

@@ -8,7 +8,7 @@
8
             <span>配分层级</span>
8
             <span>配分层级</span>
9
           </template>
9
           </template>
10
           <div>
10
           <div>
11
-            <el-select v-model="scoreLevel" placeholder="请选择层级" clearable style="width:100%" @change="loadTree">
11
+            <el-select v-model="scoreLevel" placeholder="请选择层级" clearable style="width:100%" @change="handleLevelChange">
12
               <el-option v-for="dict in score_level" :key="dict.value" :label="dict.label" :value="dict.value" />
12
               <el-option v-for="dict in score_level" :key="dict.value" :label="dict.label" :value="dict.value" />
13
             </el-select>
13
             </el-select>
14
           </div>
14
           </div>
@@ -207,6 +207,11 @@ const { score_level } = proxy.useDict('score_level')
207
 
207
 
208
 const scoreLevel = ref('4')
208
 const scoreLevel = ref('4')
209
 
209
 
210
+const handleLevelChange = async () => {
211
+  selectedDim.value = null
212
+  await loadDimensions()
213
+}
214
+
210
 // ===== 维度 =====
215
 // ===== 维度 =====
211
 const dimLoading = ref(false)
216
 const dimLoading = ref(false)
212
 const dimList = ref([])
217
 const dimList = ref([])

+ 113 - 27
src/views/score/event/index.vue

@@ -1,17 +1,35 @@
1
 <template>
1
 <template>
2
   <div class="app-container">
2
   <div class="app-container">
3
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="80px">
3
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="80px">
4
-      <el-form-item label="责任人" prop="personName">
5
-        <el-input v-model="queryParams.personName" placeholder="请输入责任人" clearable @keyup.enter="handleQuery" />
4
+      <el-form-item label="配分层级" prop="org">
5
+        <el-select v-model="queryParams.org" placeholder="请选择层级" style="width:200px" clearable
6
+          @change="handleLevelChange">
7
+          <el-option v-for="dict in score_level" :key="dict.value" :label="dict.label" :value="dict.value" />
8
+        </el-select>
6
       </el-form-item>
9
       </el-form-item>
7
-      <el-form-item label="部门名称" prop="deptName">
8
-        <el-input v-model="queryParams.deptName" placeholder="请输入部门名称" clearable @keyup.enter="handleQuery" />
10
+      <el-form-item label="部门名称" prop="deptId">
11
+        <el-select v-model="queryParams.deptId" placeholder="请选择部门" style="width:150px" clearable filterable
12
+          @change="handleQueryDeptChange">
13
+          <el-option v-for="d in queryDeptOptions" :key="d.deptId" :label="d.deptName" :value="d.deptId" />
14
+        </el-select>
9
       </el-form-item>
15
       </el-form-item>
10
-      <el-form-item label="队室/班组" prop="teamName">
11
-        <el-input v-model="queryParams.teamName" placeholder="请输入队室/班组" clearable @keyup.enter="handleQuery" />
16
+      <el-form-item label="队室/班组" prop="teamId">
17
+        <el-select v-model="queryParams.teamId" placeholder="请选择队室/班组" style="width:150px" clearable filterable
18
+          :disabled="queryParams.org < 2" @change="handleQueryTeamChange">
19
+          <el-option v-for="t in queryTeamOptions" :key="t.id" :label="t.label" :value="t.id" />
20
+        </el-select>
12
       </el-form-item>
21
       </el-form-item>
13
-      <el-form-item label="通道/小组" prop="groupName">
14
-        <el-input v-model="queryParams.groupName" placeholder="请输入通道/小组" clearable @keyup.enter="handleQuery" />
22
+      <el-form-item label="通道/小组" prop="groupId">
23
+        <el-select v-model="queryParams.groupId" placeholder="请选择通道/小组" style="width:150px" clearable filterable
24
+          :disabled="queryParams.org < 3" @change="handleQueryGroupChange">
25
+          <el-option v-for="g in queryGroupOptions" :key="g.id" :label="g.label" :value="g.id" />
26
+        </el-select>
27
+      </el-form-item>
28
+      <el-form-item label="责任人" prop="personId">
29
+        <el-select v-model="queryParams.personId" placeholder="请选择责任人" style="width:150px" clearable filterable
30
+          :disabled="queryParams.org < 4">
31
+          <el-option v-for="p in queryPersonOptions" :key="p.userId" :label="p.nickName" :value="p.userId" />
32
+        </el-select>
15
       </el-form-item>
33
       </el-form-item>
16
       <el-form-item label="维度" prop="dimensionId">
34
       <el-form-item label="维度" prop="dimensionId">
17
         <el-select v-model="queryParams.dimensionId" placeholder="全部维度" clearable style="width:150px">
35
         <el-select v-model="queryParams.dimensionId" placeholder="全部维度" clearable style="width:150px">
@@ -60,6 +78,9 @@
60
 
78
 
61
     <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
79
     <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
62
       <el-table-column type="selection" width="55" align="center" />
80
       <el-table-column type="selection" width="55" align="center" />
81
+      <el-table-column label="配分层级" align="center" prop="org" width="110">
82
+        <template #default="{ row }"><dict-tag :options="score_level" :value="row.org" /></template>
83
+      </el-table-column>
63
       <el-table-column label="事件时间" align="center" prop="eventTime" width="120">
84
       <el-table-column label="事件时间" align="center" prop="eventTime" width="120">
64
         <template #default="{ row }">{{ parseTime(row.eventTime, '{y}-{m}-{d}') }}</template>
85
         <template #default="{ row }">{{ parseTime(row.eventTime, '{y}-{m}-{d}') }}</template>
65
       </el-table-column>
86
       </el-table-column>
@@ -117,7 +138,7 @@
117
         <el-row :gutter="16">
138
         <el-row :gutter="16">
118
           <el-col :span="12">
139
           <el-col :span="12">
119
             <el-form-item label="配分层级" prop="org">
140
             <el-form-item label="配分层级" prop="org">
120
-              <el-select v-model="form.org" placeholder="请选择层级" style="width:100%">
141
+              <el-select v-model="form.org" placeholder="请选择层级" style="width:100%" @change="handleFormLevelChange">
121
                 <el-option v-for="dict in score_level" :key="dict.value" :label="dict.label" :value="dict.value" />
142
                 <el-option v-for="dict in score_level" :key="dict.value" :label="dict.label" :value="dict.value" />
122
               </el-select>
143
               </el-select>
123
             </el-form-item>
144
             </el-form-item>
@@ -147,7 +168,8 @@
147
           </el-col>
168
           </el-col>
148
           <el-col :span="12">
169
           <el-col :span="12">
149
             <el-form-item label="四级指标">
170
             <el-form-item label="四级指标">
150
-              <el-select v-model="form.level4Id" placeholder="请选择" style="width:100%" clearable @change="onLevel4Change">
171
+              <el-select v-model="form.level4Id" placeholder="请选择" style="width:100%" clearable
172
+                @change="onLevel4Change">
151
                 <el-option v-for="n in level4Options" :key="n.id" :label="n.name" :value="n.id" />
173
                 <el-option v-for="n in level4Options" :key="n.id" :label="n.name" :value="n.id" />
152
               </el-select>
174
               </el-select>
153
             </el-form-item>
175
             </el-form-item>
@@ -233,7 +255,7 @@ import {
233
   listScoreEvent, addScoreEvent, updateScoreEvent, delScoreEvent,
255
   listScoreEvent, addScoreEvent, updateScoreEvent, delScoreEvent,
234
   exportScoreEvent, importScoreEvent
256
   exportScoreEvent, importScoreEvent
235
 } from '@/api/score/index'
257
 } from '@/api/score/index'
236
-import { allDimension, treeIndicator } from '@/api/score/index'
258
+import { allDimension, treeIndicator, getDimensionAll } from '@/api/score/index'
237
 import { listDept } from '@/api/system/dept'
259
 import { listDept } from '@/api/system/dept'
238
 import { deptTreeSelect } from '@/api/system/user'
260
 import { deptTreeSelect } from '@/api/system/user'
239
 import { parseTime } from '@/utils/ruoyi'
261
 import { parseTime } from '@/utils/ruoyi'
@@ -256,8 +278,12 @@ const deptOptions = ref([])
256
 const teamOptions = ref([])
278
 const teamOptions = ref([])
257
 const groupOptions = ref([])
279
 const groupOptions = ref([])
258
 const personOptions = ref([])
280
 const personOptions = ref([])
281
+const queryDeptOptions = ref([])
282
+const queryTeamOptions = ref([])
283
+const queryGroupOptions = ref([])
284
+const queryPersonOptions = ref([])
259
 
285
 
260
-const queryParams = reactive({ pageNum: 1, pageSize: 10, personName: '', deptName: '', teamName: '', dimensionId: null, sourceType: '', org: '' })
286
+const queryParams = reactive({ pageNum: 1, pageSize: 10, personId: null, personName: '', deptId: null, deptName: '', teamId: null, teamName: '', groupId: null, groupName: '', dimensionId: null, sourceType: '', org: '' })
261
 const form = reactive({ id: null, dimensionId: null, dimensionName: '', indicatorId: null, level2Id: null, level2Name: '', level3Id: null, level3Name: '', level4Id: null, level4Name: '', eventTime: '', location: '', personId: null, deptName: '', deptId: null, teamId: null, groupId: null, scoreValue: 0, cascadeScore: 0, eventDesc: '', remark: '', org: '' })
287
 const form = reactive({ id: null, dimensionId: null, dimensionName: '', indicatorId: null, level2Id: null, level2Name: '', level3Id: null, level3Name: '', level4Id: null, level4Name: '', eventTime: '', location: '', personId: null, deptName: '', deptId: null, teamId: null, groupId: null, scoreValue: 0, cascadeScore: 0, eventDesc: '', remark: '', org: '' })
262
 const rules = {
288
 const rules = {
263
   dimensionId: [{ required: true, message: '请选择维度', trigger: 'change' }],
289
   dimensionId: [{ required: true, message: '请选择维度', trigger: 'change' }],
@@ -273,6 +299,23 @@ async function loadDimensions() {
273
   dimensionOptions.value = r.data || []
299
   dimensionOptions.value = r.data || []
274
 }
300
 }
275
 
301
 
302
+async function handleLevelChange() {
303
+  queryParams.dimensionId = null
304
+  queryParams.deptId = null; queryParams.teamId = null; queryParams.groupId = null; queryParams.personId = null
305
+  queryTeamOptions.value = []; queryGroupOptions.value = []; queryPersonOptions.value = []
306
+  const r = await getDimensionAll({ pageNum: 1, pageSize: 100, org: queryParams.org })
307
+  dimensionOptions.value = r.data || []
308
+}
309
+
310
+async function handleFormLevelChange() {
311
+  form.dimensionId = null
312
+  form.level2Id = null; form.level2Name = ''; form.level3Id = null; form.level3Name = ''; form.level4Id = null; form.level4Name = ''
313
+  indicatorTree.value = []
314
+  level2Options.value = []; level3Options.value = []; level4Options.value = []
315
+  const r = await getDimensionAll({ pageNum: 1, pageSize: 100, org: form.org })
316
+  dimensionOptions.value = r.data || []
317
+}
318
+
276
 async function loadDepts() {
319
 async function loadDepts() {
277
   const r = await listDept()
320
   const r = await listDept()
278
   deptOptions.value = (r.data || []).filter(d => d.deptType === 'BRIGADE')
321
   deptOptions.value = (r.data || []).filter(d => d.deptType === 'BRIGADE')
@@ -322,6 +365,43 @@ async function handleGroupChange(val, preserve) {
322
   }
365
   }
323
 }
366
 }
324
 
367
 
368
+async function loadQueryDepts() {
369
+  const r = await listDept()
370
+  queryDeptOptions.value = (r.data || []).filter(d => d.deptType === 'BRIGADE')
371
+}
372
+
373
+async function handleQueryDeptChange(deptId) {
374
+  queryParams.teamId = null; queryParams.groupId = null; queryParams.personId = null
375
+  queryTeamOptions.value = []; queryGroupOptions.value = []; queryPersonOptions.value = []
376
+  if (deptId) {
377
+    const r = await deptTreeSelect({ parentId: deptId })
378
+    queryTeamOptions.value = r.data || []
379
+  }
380
+}
381
+
382
+async function handleQueryTeamChange(val) {
383
+  queryParams.groupId = null; queryParams.personId = null
384
+  queryPersonOptions.value = []
385
+  const team = queryTeamOptions.value.find(t => t.id === val)
386
+  if (team) {
387
+    const r = await deptTreeSelect({ parentId: team.id })
388
+    queryGroupOptions.value = r.data || []
389
+  } else {
390
+    queryGroupOptions.value = []
391
+  }
392
+}
393
+
394
+async function handleQueryGroupChange(val) {
395
+  queryParams.personId = null
396
+  const group = queryGroupOptions.value.find(g => g.id === val)
397
+  if (group) {
398
+    const r = await listUser({ deptId: group.id })
399
+    queryPersonOptions.value = r.rows || []
400
+  } else {
401
+    queryPersonOptions.value = []
402
+  }
403
+}
404
+
325
 function getList() {
405
 function getList() {
326
   loading.value = true
406
   loading.value = true
327
   const p = { ...queryParams }
407
   const p = { ...queryParams }
@@ -330,7 +410,13 @@ function getList() {
330
 }
410
 }
331
 
411
 
332
 function handleQuery() { queryParams.pageNum = 1; getList() }
412
 function handleQuery() { queryParams.pageNum = 1; getList() }
333
-function resetQuery() { dateRange.value = []; queryRef.value?.resetFields(); handleQuery() }
413
+function resetQuery() {
414
+  dateRange.value = []
415
+  queryParams.deptId = null; queryParams.teamId = null; queryParams.groupId = null; queryParams.personId = null
416
+  queryTeamOptions.value = []; queryGroupOptions.value = []; queryPersonOptions.value = []
417
+  queryRef.value?.resetFields()
418
+  handleQuery()
419
+}
334
 function handleSelectionChange(sel) { ids.value = sel.map(s => s.id); single.value = sel.length !== 1; multiple.value = !sel.length }
420
 function handleSelectionChange(sel) { ids.value = sel.map(s => s.id); single.value = sel.length !== 1; multiple.value = !sel.length }
335
 
421
 
336
 function resetForm() {
422
 function resetForm() {
@@ -340,19 +426,19 @@ function resetForm() {
340
 }
426
 }
341
 
427
 
342
 function handleAdd() { resetForm(); dialogTitle.value = '新增配分事项'; dialogVisible.value = true }
428
 function handleAdd() { resetForm(); dialogTitle.value = '新增配分事项'; dialogVisible.value = true }
343
- function handleUpdate(row) {
429
+function handleUpdate(row) {
344
   resetForm()
430
   resetForm()
345
   const record = row?.id ? row : list.value.find(r => r.id === ids.value[0])
431
   const record = row?.id ? row : list.value.find(r => r.id === ids.value[0])
346
   if (record) {
432
   if (record) {
347
     Object.assign(form, record)
433
     Object.assign(form, record)
348
-    if (record.dimensionId)  onDimensionChange(record.dimensionId, true)
349
-    if (record.level2Id)  onLevel2Change(record.level2Id, true)
350
-    if (record.level3Id)  onLevel3Change(record.level3Id, true)
351
-    if (record.level4Id)  onLevel4Change(record.level4Id, true)
352
-    if (record.deptId)  handleDeptChange(record.deptId, true)
353
-    if (record.teamId)  handleTeamChange(record.teamId, true)
354
-    if (record.groupId)  handleGroupChange(record.groupId, true)
355
-   
434
+    if (record.dimensionId) onDimensionChange(record.dimensionId, true)
435
+    if (record.level2Id) onLevel2Change(record.level2Id, true)
436
+    if (record.level3Id) onLevel3Change(record.level3Id, true)
437
+    if (record.level4Id) onLevel4Change(record.level4Id, true)
438
+    if (record.deptId) handleDeptChange(record.deptId, true)
439
+    if (record.teamId) handleTeamChange(record.teamId, true)
440
+    if (record.groupId) handleGroupChange(record.groupId, true)
441
+
356
   }
442
   }
357
   dialogTitle.value = '修改配分事项'; dialogVisible.value = true
443
   dialogTitle.value = '修改配分事项'; dialogVisible.value = true
358
 }
444
 }
@@ -360,9 +446,9 @@ function handleAdd() { resetForm(); dialogTitle.value = '新增配分事项'; di
360
 async function onDimensionChange(dimId, preserveSelection) {
446
 async function onDimensionChange(dimId, preserveSelection) {
361
   const dim = dimensionOptions.value.find(d => d.id === dimId)
447
   const dim = dimensionOptions.value.find(d => d.id === dimId)
362
   if (dim) form.dimensionName = dim.name
448
   if (dim) form.dimensionName = dim.name
363
-  const r = await treeIndicator({ dimensionId: dimId })
449
+  const r = await treeIndicator({ dimensionId: dimId, org: form.org })
364
   indicatorTree.value = r.data || []
450
   indicatorTree.value = r.data || []
365
-  level2Options.value = indicatorTree.value.map(n => ({name: n.name,id: n.id, scoreValue: n.scoreValue}))
451
+  level2Options.value = indicatorTree.value.map(n => ({ name: n.name, id: n.id, scoreValue: n.scoreValue }))
366
   if (!preserveSelection) { form.level2Id = null; form.level2Name = ''; form.level3Id = null; form.level3Name = ''; form.level4Id = null; form.level4Name = ''; form.scoreValue = 0 }
452
   if (!preserveSelection) { form.level2Id = null; form.level2Name = ''; form.level3Id = null; form.level3Name = ''; form.level4Id = null; form.level4Name = ''; form.scoreValue = 0 }
367
   level3Options.value = []; level4Options.value = []
453
   level3Options.value = []; level4Options.value = []
368
   if (preserveSelection && form.level2Id) onLevel2Change(form.level2Id, true)
454
   if (preserveSelection && form.level2Id) onLevel2Change(form.level2Id, true)
@@ -374,7 +460,7 @@ function onLevel2Change(val, preserveSelection) {
374
     form.level2Name = node.name
460
     form.level2Name = node.name
375
     if (node.scoreValue !== undefined) form.scoreValue = node.scoreValue
461
     if (node.scoreValue !== undefined) form.scoreValue = node.scoreValue
376
   }
462
   }
377
-  level3Options.value = node ? (node.children || []).map(n => ({name: n.name,id: n.id, scoreValue: n.scoreValue})) : []
463
+  level3Options.value = node ? (node.children || []).map(n => ({ name: n.name, id: n.id, scoreValue: n.scoreValue })) : []
378
   if (!preserveSelection) { form.level3Id = null; form.level3Name = ''; form.level4Id = null; form.level4Name = ''; if (node && node.scoreValue === undefined) form.scoreValue = 0 }
464
   if (!preserveSelection) { form.level3Id = null; form.level3Name = ''; form.level4Id = null; form.level4Name = ''; if (node && node.scoreValue === undefined) form.scoreValue = 0 }
379
   level4Options.value = []
465
   level4Options.value = []
380
   if (preserveSelection && form.level3Id) onLevel3Change(form.level3Id, true)
466
   if (preserveSelection && form.level3Id) onLevel3Change(form.level3Id, true)
@@ -387,7 +473,7 @@ function onLevel3Change(val, preserveSelection) {
387
     form.level3Name = node.name
473
     form.level3Name = node.name
388
     if (node.scoreValue !== undefined) form.scoreValue = node.scoreValue
474
     if (node.scoreValue !== undefined) form.scoreValue = node.scoreValue
389
   }
475
   }
390
-  level4Options.value = node ? (node.children || []).map(n => ({name: n.name,id: n.id, scoreValue: n.scoreValue})) : []
476
+  level4Options.value = node ? (node.children || []).map(n => ({ name: n.name, id: n.id, scoreValue: n.scoreValue })) : []
391
   if (!preserveSelection) { form.level4Id = null; form.level4Name = ''; if (node && node.scoreValue === undefined) form.scoreValue = 0 }
477
   if (!preserveSelection) { form.level4Id = null; form.level4Name = ''; if (node && node.scoreValue === undefined) form.scoreValue = 0 }
392
 }
478
 }
393
 
479
 
@@ -453,5 +539,5 @@ async function handleImportFile(file) {
453
   }
539
   }
454
 }
540
 }
455
 
541
 
456
-onMounted(() => { loadDimensions(); loadDepts(); getList() })
542
+onMounted(() => { loadDimensions(); loadDepts(); loadQueryDepts(); getList() })
457
 </script>
543
 </script>