Explorar o código

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

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

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

@@ -14,21 +14,21 @@ const props = defineProps({
14 14
   columns: {
15 15
     type: Array,
16 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 23
   data: {
24 24
     type: Array,
25 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 40
 const defaultSkillData = {
41
-  categories: ['初级工', '中级工', '高级工', '技师', '高级技师'],
42
-  values: [30, 45, 60, 35, 20],
41
+  categories: [],
42
+  values: [],
43 43
   colors: ['#4da6ff', '#0f46fa']
44 44
 }
45 45
 
46 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 49
   colors: ['#6bcb77', '#2ecc71']
50 50
 }
51 51
 
52 52
 const defaultPostData = {
53
-  categories: ['主值班员', '副值班员', '巡检员', '维护员', '安全员'],
54
-  values: [25, 50, 40, 30, 20],
53
+  categories: [],
54
+  values: [],
55 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 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 38
 const computedRadarData = computed(() => {

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

@@ -21,7 +21,8 @@
21 21
       <div class="custom-el-style">
22 22
         <div>
23 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 26
             <template #suffix><el-icon>
26 27
                 <Search />
27 28
               </el-icon></template>
@@ -31,7 +32,7 @@
31 32
                 item.deptName }}</span>
32 33
             </template>
33 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 36
         </div>
36 37
         <div style="margin-top: 20px;">
37 38
           <el-tree :data="departments" :default-expanded-keys="[100]" :props="{ value: 'id', showPrefix: false }"
@@ -79,6 +80,26 @@ const queryDept = async (query, cb) => {
79 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 103
 const filterDeptTree = (data, targetType) => {
83 104
   const filterNode = (node) => {
84 105
     if (node.deptType === targetType) {

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

@@ -2,29 +2,13 @@
2 2
   <div class="main-content-wrapper">
3 3
     <div class="main-content">
4 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 7
       </div>
16 8
 
17 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 12
       </div>
29 13
     </div>
30 14
   </div>
@@ -36,7 +20,7 @@ import ProfileRadar from '../../components/ProfileRadar.vue'
36 20
 import ProfileMembers from '../../components/ProfileMembers.vue'
37 21
 import ProfileBasicDistribution from '../../components/ProfileBasicDistribution.vue'
38 22
 import ProfilePositionDistribution from '../../components/ProfilePositionDistribution.vue'
39
-
23
+import { getDeptMembers, getDeptMemberDistribution, getDeptPositionDistribution, getDimensionScoreOverview } from '@/api/portraitManagement/portraitManagement'
40 24
 const props = defineProps({
41 25
   queryParams: {
42 26
     type: Object,
@@ -45,100 +29,123 @@ const props = defineProps({
45 29
 })
46 30
 
47 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 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 45
 const memberColumns = ref([
79
-  { label: '姓名', prop: 'name' },
46
+  { label: '姓名', prop: 'personName' },
80 47
   { label: '年龄', prop: 'age' },
81
-  { label: '司龄', prop: 'seniority' },
82
-  { label: '性别', prop: 'gender' },
48
+  { label: '司龄', prop: 'workYears' },
49
+  { label: '性别', prop: 'sex' },
83 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 54
   { label: '职业技能等级', prop: 'skillLevel' },
88
-  { label: '开机年限', prop: 'operateYears' },
55
+  { label: '开机年限', prop: 'xrayOperatorYears' },
89 56
   { label: '平均年限', prop: 'avgYears' },
90 57
   { label: '综合得分', prop: 'totalScore' }
91 58
 ])
92 59
 
93 60
 const genderData = ref([
94
-  { value: 6, name: '女', itemStyle: { color: '#ff6b9d' } },
95
-  { value: 8, name: '男', itemStyle: { color: '#4da6ff' } }
61
+
96 62
 ])
97 63
 
98 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 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 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 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 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 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 149
 </script>
143 150
 
144 151
 <style lang="scss" scoped>
@@ -154,7 +161,7 @@ const fetchData = (params) => {
154 161
     display: flex;
155 162
     gap: 20px;
156 163
 
157
-    > .info-card {
164
+    >.info-card {
158 165
       flex: 1;
159 166
       min-width: 0;
160 167
     }

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

@@ -3,23 +3,12 @@
3 3
     <div class="main-content">
4 4
       <div class="content-row">
5 5
         <ProfileRadar :chartData="radarData" />
6
-        <ProfileMembers
7
-          :columns="memberColumns"
8
-          :data="teamMembers"
9
-        />
6
+        <ProfileMembers :columns="memberColumns" :data="teamMembers" />
10 7
       </div>
11 8
 
12 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 12
       </div>
24 13
     </div>
25 14
   </div>
@@ -43,34 +32,39 @@ const props = defineProps({
43 32
 const radarData = ref([])
44 33
 
45 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 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 55
   { label: '综合得分', prop: 'totalScore' }
62 56
 ])
63 57
 
64 58
 const genderData = ref([
65
-  
59
+
66 60
 ])
67 61
 
68 62
 const nationData = ref([
69
- 
63
+
70 64
 ])
71 65
 
72 66
 const politicalData = ref([
73
-  
67
+
74 68
 ])
75 69
 
76 70
 const skillData = ref([])
@@ -97,7 +91,7 @@ const fetchMemberDistribution = async (params) => {
97 91
   try {
98 92
     const res = await getDeptMemberDistribution(params)
99 93
     if (res.code === 200 && res.data) {
100
-      
94
+
101 95
       genderData.value = res.data.sexDistribution.map(item => ({ value: item.count, name: item.name })) || []
102 96
       nationData.value = res.data.nationDistribution.map(item => ({ value: item.count, name: item.name })) || []
103 97
       politicalData.value = res.data.politicalDistribution.map(item => ({ value: item.count, name: item.name })) || []
@@ -128,14 +122,14 @@ const fetchRadarData = async (params) => {
128 122
     const res = await getDimensionScoreOverview(params)
129 123
     if (res.code === 200 && res.data) {
130 124
       radarData.value = res.data.dimensions || [{ name: '', finalScore: 0, color: '#00e5ff' }]
131
-     
125
+
132 126
     }
133 127
   } catch (error) {
134 128
     console.error('获取维度得分一览失败', error)
135 129
   }
136 130
 }
137 131
 const fetchData = (params) => {
138
-  if (!params.deptId && !params.groupId && !params.teamId ) {
132
+  if (!params.deptId && !params.groupId && !params.teamId) {
139 133
     return
140 134
   }
141 135
   //  console.log('params', params)
@@ -167,7 +161,7 @@ watch(() => props.queryParams, (newParams) => {
167 161
     display: flex;
168 162
     gap: 20px;
169 163
 
170
-    > .info-card {
164
+    >.info-card {
171 165
       flex: 1;
172 166
       min-width: 0;
173 167
     }

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

@@ -44,18 +44,13 @@ const teamColumns = [
44 44
   { label: '党员数量', prop: 'partyCount' },
45 45
   { label: '平均年龄', prop: 'avgAge' },
46 46
   { label: '平均工龄', prop: 'avgWorkYears' },
47
-  { label: '职业资格证书等级', prop: 'certLevel' },
48
-  { label: '平均升级年龄', prop: 'avgUpgradeAge' },
47
+  { label: '职业资格等级证书数量', prop: 'certLevel' },
48
+  { label: '平均开机年龄', prop: 'avgUpgradeAge' },
49 49
   { label: '综合得分', prop: 'totalScore' }
50 50
 ]
51 51
 
52 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 56
 const genderData = ref([])

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

@@ -109,23 +109,23 @@ const props = defineProps({
109 109
   },
110 110
   dutyLeader: {
111 111
     type: String,
112
-    default: '张某某'
112
+    default: '李凯'
113 113
   },
114 114
   safetySection: {
115 115
     type: String,
116
-    default: '李某某'
116
+    default: '李'
117 117
   },
118 118
   serviceSection: {
119 119
     type: String,
120
-    default: '王某某'
120
+    default: '李凯'
121 121
   },
122 122
   operationSection: {
123 123
     type: String,
124
-    default: '赵某某'
124
+    default: '李凯'
125 125
   },
126 126
   standbyDuty: {
127 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 2
   <div class="main-content-wrapper">
3 3
     <div class="main-content">
4 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 7
       </div>
16 8
 
17 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 12
       </div>
29 13
     </div>
30 14
   </div>
@@ -36,7 +20,7 @@ import ProfileRadar from '../../components/ProfileRadar.vue'
36 20
 import ProfileMembers from '../../components/ProfileMembers.vue'
37 21
 import ProfileBasicDistribution from '../../components/ProfileBasicDistribution.vue'
38 22
 import ProfilePositionDistribution from '../../components/ProfilePositionDistribution.vue'
39
-
23
+import { getDeptMembers, getDeptMemberDistribution, getDeptPositionDistribution, getDimensionScoreOverview } from '@/api/portraitManagement/portraitManagement'
40 24
 const props = defineProps({
41 25
   queryParams: {
42 26
     type: Object,
@@ -45,100 +29,126 @@ const props = defineProps({
45 29
 })
46 30
 
47 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 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 45
 const memberColumns = ref([
79
-  { label: '姓名', prop: 'name' },
46
+  { label: '姓名', prop: 'personName' },
80 47
   { label: '年龄', prop: 'age' },
81
-  { label: '司龄', prop: 'seniority' },
82
-  { label: '性别', prop: 'gender' },
48
+  { label: '司龄', prop: 'workYears' },
49
+  { label: '性别', prop: 'sex' },
83 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 54
   { label: '职业技能等级', prop: 'skillLevel' },
88
-  { label: '开机年限', prop: 'operateYears' },
55
+  { label: '开机年限', prop: 'xrayOperatorYears' },
89 56
   { label: '平均年限', prop: 'avgYears' },
90 57
   { label: '综合得分', prop: 'totalScore' }
91 58
 ])
92 59
 
93 60
 const genderData = ref([
94
-  { value: 6, name: '女', itemStyle: { color: '#ff6b9d' } },
95
-  { value: 8, name: '男', itemStyle: { color: '#4da6ff' } }
61
+  
96 62
 ])
97 63
 
98 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 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 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 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 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 147
 watch(() => props.queryParams, (newParams) => {
136 148
   fetchData(newParams)
137 149
 }, { deep: true })
138 150
 
139
-const fetchData = (params) => {
140
-  console.log('查询参数:', params)
141
-}
151
+
142 152
 </script>
143 153
 
144 154
 <style lang="scss" scoped>
@@ -154,7 +164,7 @@ const fetchData = (params) => {
154 164
     display: flex;
155 165
     gap: 20px;
156 166
 
157
-    > .info-card {
167
+    >.info-card {
158 168
       flex: 1;
159 169
       min-width: 0;
160 170
     }

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

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

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

@@ -1,17 +1,35 @@
1 1
 <template>
2 2
   <div class="app-container">
3 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 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 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 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 33
       </el-form-item>
16 34
       <el-form-item label="维度" prop="dimensionId">
17 35
         <el-select v-model="queryParams.dimensionId" placeholder="全部维度" clearable style="width:150px">
@@ -60,6 +78,9 @@
60 78
 
61 79
     <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
62 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 84
       <el-table-column label="事件时间" align="center" prop="eventTime" width="120">
64 85
         <template #default="{ row }">{{ parseTime(row.eventTime, '{y}-{m}-{d}') }}</template>
65 86
       </el-table-column>
@@ -117,7 +138,7 @@
117 138
         <el-row :gutter="16">
118 139
           <el-col :span="12">
119 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 142
                 <el-option v-for="dict in score_level" :key="dict.value" :label="dict.label" :value="dict.value" />
122 143
               </el-select>
123 144
             </el-form-item>
@@ -147,7 +168,8 @@
147 168
           </el-col>
148 169
           <el-col :span="12">
149 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 173
                 <el-option v-for="n in level4Options" :key="n.id" :label="n.name" :value="n.id" />
152 174
               </el-select>
153 175
             </el-form-item>
@@ -233,7 +255,7 @@ import {
233 255
   listScoreEvent, addScoreEvent, updateScoreEvent, delScoreEvent,
234 256
   exportScoreEvent, importScoreEvent
235 257
 } from '@/api/score/index'
236
-import { allDimension, treeIndicator } from '@/api/score/index'
258
+import { allDimension, treeIndicator, getDimensionAll } from '@/api/score/index'
237 259
 import { listDept } from '@/api/system/dept'
238 260
 import { deptTreeSelect } from '@/api/system/user'
239 261
 import { parseTime } from '@/utils/ruoyi'
@@ -256,8 +278,12 @@ const deptOptions = ref([])
256 278
 const teamOptions = ref([])
257 279
 const groupOptions = ref([])
258 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 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 288
 const rules = {
263 289
   dimensionId: [{ required: true, message: '请选择维度', trigger: 'change' }],
@@ -273,6 +299,23 @@ async function loadDimensions() {
273 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 319
 async function loadDepts() {
277 320
   const r = await listDept()
278 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 405
 function getList() {
326 406
   loading.value = true
327 407
   const p = { ...queryParams }
@@ -330,7 +410,13 @@ function getList() {
330 410
 }
331 411
 
332 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 420
 function handleSelectionChange(sel) { ids.value = sel.map(s => s.id); single.value = sel.length !== 1; multiple.value = !sel.length }
335 421
 
336 422
 function resetForm() {
@@ -340,19 +426,19 @@ function resetForm() {
340 426
 }
341 427
 
342 428
 function handleAdd() { resetForm(); dialogTitle.value = '新增配分事项'; dialogVisible.value = true }
343
- function handleUpdate(row) {
429
+function handleUpdate(row) {
344 430
   resetForm()
345 431
   const record = row?.id ? row : list.value.find(r => r.id === ids.value[0])
346 432
   if (record) {
347 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 443
   dialogTitle.value = '修改配分事项'; dialogVisible.value = true
358 444
 }
@@ -360,9 +446,9 @@ function handleAdd() { resetForm(); dialogTitle.value = '新增配分事项'; di
360 446
 async function onDimensionChange(dimId, preserveSelection) {
361 447
   const dim = dimensionOptions.value.find(d => d.id === dimId)
362 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 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 452
   if (!preserveSelection) { form.level2Id = null; form.level2Name = ''; form.level3Id = null; form.level3Name = ''; form.level4Id = null; form.level4Name = ''; form.scoreValue = 0 }
367 453
   level3Options.value = []; level4Options.value = []
368 454
   if (preserveSelection && form.level2Id) onLevel2Change(form.level2Id, true)
@@ -374,7 +460,7 @@ function onLevel2Change(val, preserveSelection) {
374 460
     form.level2Name = node.name
375 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 464
   if (!preserveSelection) { form.level3Id = null; form.level3Name = ''; form.level4Id = null; form.level4Name = ''; if (node && node.scoreValue === undefined) form.scoreValue = 0 }
379 465
   level4Options.value = []
380 466
   if (preserveSelection && form.level3Id) onLevel3Change(form.level3Id, true)
@@ -387,7 +473,7 @@ function onLevel3Change(val, preserveSelection) {
387 473
     form.level3Name = node.name
388 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 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 543
 </script>