Bladeren bron

feat: 新增非干部月度考核及相关功能模块

新增非干部月度考核功能模块,包括考核指标分类、考核列表、分数汇总和考核汇总表等功能:
1. 添加考核指标分类管理页面
2. 实现非干部月度考核列表的增删改查功能
3. 开发考核分数汇总统计页面及图表展示
4. 创建考核汇总表页面
5. 添加相关API接口和前端页面交互逻辑
huoyi 1 maand geleden
bovenliggende
commit
ef8fcd2ce9

+ 70 - 0
src/api/performance/nonCadreMonthlyAssess.js

@@ -0,0 +1,70 @@
1
+import request from '@/utils/request'
2
+
3
+// 获取非干部月度考核列表
4
+export function getNonCadreMonthlyAssessList(query) {
5
+  return request({
6
+    url: '/performance/non-cadre-monthly-assess/list',
7
+    method: 'get',
8
+    params: query
9
+  })
10
+}
11
+
12
+// 新增非干部月度考核
13
+export function addNonCadreMonthlyAssess(data) {
14
+  return request({
15
+    url: '/performance/non-cadre-monthly-assess',
16
+    method: 'post',
17
+    data: data
18
+  })
19
+}
20
+
21
+// 更新非干部月度考核
22
+export function updateNonCadreMonthlyAssess(data) {
23
+  return request({
24
+    url: '/performance/non-cadre-monthly-assess',
25
+    method: 'put',
26
+    data: data
27
+  })
28
+}
29
+
30
+// 删除非干部月度考核
31
+export function deleteNonCadreMonthlyAssess(id) {
32
+  return request({
33
+    url: `/performance/non-cadre-monthly-assess/${id}`,
34
+    method: 'delete'
35
+  })
36
+}
37
+
38
+// 导出非干部月度考核数据
39
+export function exportNonCadreMonthlyAssess(query) {
40
+  return request({
41
+    url: '/performance/non-cadre-monthly-assess/export',
42
+    method: 'get',
43
+    params: query,
44
+    responseType: 'blob'
45
+  })
46
+}
47
+
48
+// 获取用工形式选项
49
+export function getEmploymentTypeOptions() {
50
+  return request({
51
+    url: '/performance/non-cadre-monthly-assess/employment-type-options',
52
+    method: 'get'
53
+  })
54
+}
55
+
56
+// 获取考核结果选项
57
+export function getAssessmentResultOptions() {
58
+  return request({
59
+    url: '/performance/non-cadre-monthly-assess/assessment-result-options',
60
+    method: 'get'
61
+  })
62
+}
63
+
64
+// 获取应用方式选项
65
+export function getApplicationMethodOptions() {
66
+  return request({
67
+    url: '/performance/non-cadre-monthly-assess/application-method-options',
68
+    method: 'get'
69
+  })
70
+}

+ 20 - 0
src/api/performance/nonCadreMonthlyAssessSummary.js

@@ -0,0 +1,20 @@
1
+import request from '@/utils/request'
2
+
3
+// 获取非干部月度考核汇总数据
4
+export function getNonCadreMonthlyAssessSummary(query) {
5
+  return request({
6
+    url: '/performance/non-cadre-monthly-assess-summary',
7
+    method: 'get',
8
+    params: query
9
+  })
10
+}
11
+
12
+// 导出非干部月度考核汇总数据
13
+export function exportNonCadreMonthlyAssessSummary(query) {
14
+  return request({
15
+    url: '/performance/non-cadre-monthly-assess-summary/export',
16
+    method: 'get',
17
+    params: query,
18
+    responseType: 'blob'
19
+  })
20
+}

+ 83 - 0
src/api/performance/nonCadreMonthlyScoreSum.js

@@ -0,0 +1,83 @@
1
+import request from '@/utils/request'
2
+
3
+// 获取非干部月度考核分数汇总数据
4
+export function getNonCadreMonthlyScoreSum(query) {
5
+  return request({
6
+    url: '/performance/non-cadre-monthly-score-sum',
7
+    method: 'get',
8
+    params: query
9
+  })
10
+}
11
+
12
+// 导出非干部月度考核分数汇总文档
13
+export function exportNonCadreMonthlyScoreSum(query) {
14
+  return request({
15
+    url: '/performance/non-cadre-monthly-score-sum/export',
16
+    method: 'get',
17
+    params: query,
18
+    responseType: 'blob'
19
+  })
20
+}
21
+
22
+// 获取整体分支分布数据
23
+export function getOverallScoreDistribution(query) {
24
+  return request({
25
+    url: '/performance/non-cadre-monthly-score-sum/overall-distribution',
26
+    method: 'get',
27
+    params: query
28
+  })
29
+}
30
+
31
+// 获取参与人数占比数据
32
+export function getParticipantRatio(query) {
33
+  return request({
34
+    url: '/performance/non-cadre-monthly-score-sum/participant-ratio',
35
+    method: 'get',
36
+    params: query
37
+  })
38
+}
39
+
40
+// 获取各部门分支分布对比数据
41
+export function getDepartmentComparison(query) {
42
+  return request({
43
+    url: '/performance/non-cadre-monthly-score-sum/department-comparison',
44
+    method: 'get',
45
+    params: query
46
+  })
47
+}
48
+
49
+// 获取汇总表数据
50
+export function getSummaryTableData(query) {
51
+  return request({
52
+    url: '/performance/non-cadre-monthly-score-sum/summary-table',
53
+    method: 'get',
54
+    params: query
55
+  })
56
+}
57
+
58
+// 获取分类结果汇总数据
59
+export function getClassificationSummary(query) {
60
+  return request({
61
+    url: '/performance/non-cadre-monthly-score-sum/classification-summary',
62
+    method: 'get',
63
+    params: query
64
+  })
65
+}
66
+
67
+// 获取大队分布统计数据
68
+export function getBrigadeDistribution(query) {
69
+  return request({
70
+    url: '/performance/non-cadre-monthly-score-sum/brigade-distribution',
71
+    method: 'get',
72
+    params: query
73
+  })
74
+}
75
+
76
+// 获取岗位分布统计数据
77
+export function getPositionDistribution(query) {
78
+  return request({
79
+    url: '/performance/non-cadre-monthly-score-sum/position-distribution',
80
+    method: 'get',
81
+    params: query
82
+  })
83
+}

+ 600 - 0
src/views/performanceManage/NonCadreMonthlyAssess/index.vue

@@ -0,0 +1,600 @@
1
+<template>
2
+  <div class="app-container">
3
+    <el-card>
4
+      <!-- 查询条件 -->
5
+      <div class="filter-container">
6
+        <el-form :model="queryParams" ref="queryFormRef" :inline="true" class="search-form">
7
+          <el-form-item label="员工姓名" prop="employeeName">
8
+            <el-input v-model="queryParams.employeeName" placeholder="请输入员工姓名" clearable style="width: 200px" />
9
+          </el-form-item>
10
+          
11
+          <el-form-item label="查询月份" prop="assessmentMonth">
12
+            <el-date-picker v-model="queryParams.assessmentMonth" type="month" placeholder="请选择查询月份" 
13
+              value-format="YYYY-MM" style="width: 200px" />
14
+          </el-form-item>
15
+          
16
+          <el-form-item>
17
+            <el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
18
+            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
19
+          </el-form-item>
20
+        </el-form>
21
+      </div>
22
+
23
+      <!-- 操作按钮 -->
24
+      <div class="operation-container">
25
+        <el-button type="primary" icon="Plus" @click="handleAdd">新增</el-button>
26
+        <el-button type="warning" icon="Download" @click="handleExport">导出</el-button>
27
+      </div>
28
+
29
+      <!-- 数据表格 -->
30
+      <el-table v-loading="loading" :data="assessmentList" border fit highlight-current-row style="width: 100%; margin-top: 20px;">
31
+        <el-table-column type="index" label="序号" align="center" width="60" />
32
+        
33
+        <el-table-column label="员工姓名" prop="employeeName" align="center" min-width="120" />
34
+        <el-table-column label="用工形式" prop="employmentType" align="center" min-width="120" />
35
+        <el-table-column label="岗位" prop="position" align="center" min-width="120" />
36
+        <el-table-column label="考核组" prop="assessmentGroup" align="center" min-width="120" />
37
+        <el-table-column label="考核月份" prop="assessmentMonth" align="center" min-width="120" />
38
+        <el-table-column label="总分" prop="totalScore" align="center" min-width="100" sortable />
39
+        <el-table-column label="考核结果" prop="assessmentResult" align="center" min-width="120" />
40
+        <el-table-column label="应用方式" prop="applicationMethod" align="center" min-width="120" />
41
+        <el-table-column label="是否豁免" prop="isExempted" align="center" min-width="100">
42
+          <template #default="scope">
43
+            <el-tag :type="scope.row.isExempted ? 'success' : 'info'">
44
+              {{ scope.row.isExempted ? '是' : '否' }}
45
+            </el-tag>
46
+          </template>
47
+        </el-table-column>
48
+
49
+        <el-table-column label="操作" align="center" width="200" fixed="right">
50
+          <template #default="scope">
51
+            <el-button size="small" type="primary" link icon="Edit" @click="handleEdit(scope.row)">编辑</el-button>
52
+            <el-button size="small" type="danger" link icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
53
+          </template>
54
+        </el-table-column>
55
+      </el-table>
56
+
57
+      <!-- 分页 -->
58
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" 
59
+        v-model:limit="queryParams.pageSize" @pagination="getList" />
60
+    </el-card>
61
+
62
+    <!-- 编辑/新增弹窗 -->
63
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="80%" :close-on-click-modal="false">
64
+      <el-form :model="formData" ref="formRef" :rules="rules" label-width="150px" class="form-container">
65
+        <el-row :gutter="20">
66
+          <!-- 基本信息 -->
67
+          <el-col :span="8">
68
+            <el-form-item label="员工姓名" prop="employeeName">
69
+              <el-input v-model="formData.employeeName" placeholder="请输入员工姓名" />
70
+            </el-form-item>
71
+          </el-col>
72
+          <el-col :span="8">
73
+            <el-form-item label="用工形式" prop="employmentType">
74
+              <el-select v-model="formData.employmentType" placeholder="请选择用工形式">
75
+                <el-option v-for="item in employmentTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
76
+              </el-select>
77
+            </el-form-item>
78
+          </el-col>
79
+          <el-col :span="8">
80
+            <el-form-item label="岗位" prop="position">
81
+              <el-input v-model="formData.position" placeholder="请输入岗位" />
82
+            </el-form-item>
83
+          </el-col>
84
+        </el-row>
85
+
86
+        <el-row :gutter="20">
87
+          <el-col :span="8">
88
+            <el-form-item label="考核组" prop="assessmentGroup">
89
+              <el-input v-model="formData.assessmentGroup" placeholder="请输入考核组" />
90
+            </el-form-item>
91
+          </el-col>
92
+          <el-col :span="8">
93
+            <el-form-item label="分管班组长" prop="teamLeader">
94
+              <el-input v-model="formData.teamLeader" placeholder="请输入分管班组长" />
95
+            </el-form-item>
96
+          </el-col>
97
+          <el-col :span="8">
98
+            <el-form-item label="分管主管" prop="supervisor">
99
+              <el-input v-model="formData.supervisor" placeholder="请输入分管主管" />
100
+            </el-form-item>
101
+          </el-col>
102
+        </el-row>
103
+
104
+        <el-row :gutter="20">
105
+          <el-col :span="8">
106
+            <el-form-item label="分管经理" prop="manager">
107
+              <el-input v-model="formData.manager" placeholder="请输入分管经理" />
108
+            </el-form-item>
109
+          </el-col>
110
+          <el-col :span="8">
111
+            <el-form-item label="考核月份" prop="assessmentMonth">
112
+              <el-date-picker v-model="formData.assessmentMonth" type="month" placeholder="请选择考核月份" 
113
+                value-format="YYYY-MM" style="width: 100%" />
114
+            </el-form-item>
115
+          </el-col>
116
+          <el-col :span="8">
117
+            <el-form-item label="分管员工数量" prop="managedEmployeeCount">
118
+              <el-input-number v-model="formData.managedEmployeeCount" :min="0" controls-position="right" style="width: 100%" />
119
+            </el-form-item>
120
+          </el-col>
121
+        </el-row>
122
+
123
+        <!-- 红线指标 -->
124
+        <el-divider content-position="left">红线指标</el-divider>
125
+        <el-row :gutter="20">
126
+          <el-col :span="12">
127
+            <el-form-item label="红线指标触发次数" prop="redLineTriggerCount">
128
+              <el-input-number v-model="formData.redLineTriggerCount" :min="0" controls-position="right" style="width: 100%" />
129
+            </el-form-item>
130
+          </el-col>
131
+          <el-col :span="12">
132
+            <el-form-item label="红线指标依据" prop="redLineBasis">
133
+              <el-input v-model="formData.redLineBasis" type="textarea" :rows="2" placeholder="请输入红线指标依据" />
134
+            </el-form-item>
135
+          </el-col>
136
+        </el-row>
137
+
138
+        <!-- 核心指标 -->
139
+        <el-divider content-position="left">核心指标</el-divider>
140
+        <el-row :gutter="20">
141
+          <el-col :span="12">
142
+            <el-form-item label="核心指标分值" prop="coreIndicatorScore">
143
+              <el-input-number v-model="formData.coreIndicatorScore" :min="0" :precision="2" controls-position="right" style="width: 100%" />
144
+            </el-form-item>
145
+          </el-col>
146
+          <el-col :span="12">
147
+            <el-form-item label="核心指标依据" prop="coreIndicatorBasis">
148
+              <el-input v-model="formData.coreIndicatorBasis" type="textarea" :rows="2" placeholder="请输入核心指标依据" />
149
+            </el-form-item>
150
+          </el-col>
151
+        </el-row>
152
+
153
+        <!-- 其他指标 -->
154
+        <el-divider content-position="left">其他指标</el-divider>
155
+        <el-row :gutter="20">
156
+          <el-col :span="12">
157
+            <el-form-item label="其他指标分值" prop="otherIndicatorScore">
158
+              <el-input-number v-model="formData.otherIndicatorScore" :min="0" :precision="2" controls-position="right" style="width: 100%" />
159
+            </el-form-item>
160
+          </el-col>
161
+          <el-col :span="12">
162
+            <el-form-item label="其他指标依据" prop="otherIndicatorBasis">
163
+              <el-input v-model="formData.otherIndicatorBasis" type="textarea" :rows="2" placeholder="请输入其他指标依据" />
164
+            </el-form-item>
165
+          </el-col>
166
+        </el-row>
167
+
168
+        <!-- 安全指标(含SOC/站品控检查扣分) -->
169
+        <el-divider content-position="left">安全指标(含SOC/站品控检查扣分)</el-divider>
170
+        <el-row :gutter="20">
171
+          <el-col :span="12">
172
+            <el-form-item label="安全指标分值(含SOC)" prop="safetyIndicatorScoreWithSOC">
173
+              <el-input-number v-model="formData.safetyIndicatorScoreWithSOC" :min="0" :precision="2" controls-position="right" style="width: 100%" />
174
+            </el-form-item>
175
+          </el-col>
176
+          <el-col :span="12">
177
+            <el-form-item label="安全指标依据(含SOC)" prop="safetyIndicatorBasisWithSOC">
178
+              <el-input v-model="formData.safetyIndicatorBasisWithSOC" type="textarea" :rows="2" placeholder="请输入安全指标依据" />
179
+            </el-form-item>
180
+          </el-col>
181
+        </el-row>
182
+
183
+        <!-- 安全指标(不含SOC/站品控检查扣分) -->
184
+        <el-divider content-position="left">安全指标(不含SOC/站品控检查扣分)</el-divider>
185
+        <el-row :gutter="20">
186
+          <el-col :span="12">
187
+            <el-form-item label="安全指标分值(不含SOC)" prop="safetyIndicatorScoreWithoutSOC">
188
+              <el-input-number v-model="formData.safetyIndicatorScoreWithoutSOC" :min="0" :precision="2" controls-position="right" style="width: 100%" />
189
+            </el-form-item>
190
+          </el-col>
191
+          <el-col :span="12">
192
+            <el-form-item label="安全指标依据(不含SOC)" prop="safetyIndicatorBasisWithoutSOC">
193
+              <el-input v-model="formData.safetyIndicatorBasisWithoutSOC" type="textarea" :rows="2" placeholder="请输入安全指标依据" />
194
+            </el-form-item>
195
+          </el-col>
196
+        </el-row>
197
+
198
+        <!-- 非安全指标 -->
199
+        <el-divider content-position="left">非安全指标</el-divider>
200
+        <el-row :gutter="20">
201
+          <el-col :span="12">
202
+            <el-form-item label="非安全指标扣分" prop="nonSafetyIndicatorDeduction">
203
+              <el-input-number v-model="formData.nonSafetyIndicatorDeduction" :min="0" :precision="2" controls-position="right" style="width: 100%" />
204
+            </el-form-item>
205
+          </el-col>
206
+          <el-col :span="12">
207
+            <el-form-item label="非安全指标扣分依据" prop="nonSafetyIndicatorBasis">
208
+              <el-input v-model="formData.nonSafetyIndicatorBasis" type="textarea" :rows="2" placeholder="请输入非安全指标扣分依据" />
209
+            </el-form-item>
210
+          </el-col>
211
+        </el-row>
212
+
213
+        <!-- 综合扣分 -->
214
+        <el-divider content-position="left">综合扣分</el-divider>
215
+        <el-row :gutter="20">
216
+          <el-col :span="12">
217
+            <el-form-item label="非核心安全+核心扣分" prop="nonCoreSafetyCoreDeduction">
218
+              <el-input-number v-model="formData.nonCoreSafetyCoreDeduction" :min="0" :precision="2" controls-position="right" style="width: 100%" />
219
+            </el-form-item>
220
+          </el-col>
221
+          <el-col :span="12">
222
+            <el-form-item label="SOC/站品控检查涉及扣分" prop="socInspectionDeduction">
223
+              <el-input-number v-model="formData.socInspectionDeduction" :min="0" :precision="2" controls-position="right" style="width: 100%" />
224
+            </el-form-item>
225
+          </el-col>
226
+        </el-row>
227
+
228
+        <el-row :gutter="20">
229
+          <el-col :span="24">
230
+            <el-form-item label="SOC/站品控检查扣分依据" prop="socInspectionBasis">
231
+              <el-input v-model="formData.socInspectionBasis" type="textarea" :rows="2" placeholder="请输入SOC/站品控检查扣分依据" />
232
+            </el-form-item>
233
+          </el-col>
234
+        </el-row>
235
+
236
+        <!-- 统计信息 -->
237
+        <el-divider content-position="left">统计信息</el-divider>
238
+        <el-row :gutter="20">
239
+          <el-col :span="8">
240
+            <el-form-item label="扣分平均值" prop="averageDeduction">
241
+              <el-input-number v-model="formData.averageDeduction" :min="0" :precision="2" controls-position="right" style="width: 100%" />
242
+            </el-form-item>
243
+          </el-col>
244
+          <el-col :span="8">
245
+            <el-form-item label="总分" prop="totalScore">
246
+              <el-input-number v-model="formData.totalScore" :min="0" :precision="2" controls-position="right" style="width: 100%" />
247
+            </el-form-item>
248
+          </el-col>
249
+          <el-col :span="8">
250
+            <el-form-item label="奖励(元)" prop="rewardAmount">
251
+              <el-input-number v-model="formData.rewardAmount" :min="0" :precision="2" controls-position="right" style="width: 100%" />
252
+            </el-form-item>
253
+          </el-col>
254
+        </el-row>
255
+
256
+        <el-row :gutter="20">
257
+          <el-col :span="8">
258
+            <el-form-item label="扣罚(元)" prop="penaltyAmount">
259
+              <el-input-number v-model="formData.penaltyAmount" :min="0" :precision="2" controls-position="right" style="width: 100%" />
260
+            </el-form-item>
261
+          </el-col>
262
+          <el-col :span="8">
263
+            <el-form-item label="考核结果" prop="assessmentResult">
264
+              <el-select v-model="formData.assessmentResult" placeholder="请选择考核结果">
265
+                <el-option v-for="item in assessmentResultOptions" :key="item.value" :label="item.label" :value="item.value" />
266
+              </el-select>
267
+            </el-form-item>
268
+          </el-col>
269
+          <el-col :span="8">
270
+            <el-form-item label="应用方式" prop="applicationMethod">
271
+              <el-select v-model="formData.applicationMethod" placeholder="请选择应用方式">
272
+                <el-option v-for="item in applicationMethodOptions" :key="item.value" :label="item.label" :value="item.value" />
273
+              </el-select>
274
+            </el-form-item>
275
+          </el-col>
276
+        </el-row>
277
+
278
+        <!-- 备注信息 -->
279
+        <el-divider content-position="left">备注信息</el-divider>
280
+        <el-row :gutter="20">
281
+          <el-col :span="12">
282
+            <el-form-item label="奖励明细" prop="rewardDetails">
283
+              <el-input v-model="formData.rewardDetails" type="textarea" :rows="3" placeholder="请输入奖励明细" />
284
+            </el-form-item>
285
+          </el-col>
286
+          <el-col :span="12">
287
+            <el-form-item label="惩罚明细" prop="penaltyDetails">
288
+              <el-input v-model="formData.penaltyDetails" type="textarea" :rows="3" placeholder="请输入惩罚明细" />
289
+            </el-form-item>
290
+          </el-col>
291
+        </el-row>
292
+
293
+        <el-row :gutter="20">
294
+          <el-col :span="12">
295
+            <el-form-item label="考核结果备注" prop="assessmentResultRemark">
296
+              <el-input v-model="formData.assessmentResultRemark" type="textarea" :rows="2" placeholder="请输入考核结果备注" />
297
+            </el-form-item>
298
+          </el-col>
299
+          <el-col :span="12">
300
+            <el-form-item label="应用方式备注" prop="applicationMethodRemark">
301
+              <el-input v-model="formData.applicationMethodRemark" type="textarea" :rows="2" placeholder="请输入应用方式备注" />
302
+            </el-form-item>
303
+          </el-col>
304
+        </el-row>
305
+
306
+        <!-- 豁免信息 -->
307
+        <el-divider content-position="left">豁免信息</el-divider>
308
+        <el-row :gutter="20">
309
+          <el-col :span="12">
310
+            <el-form-item label="是否豁免" prop="isExempted">
311
+              <el-switch v-model="formData.isExempted" active-text="是" inactive-text="否" />
312
+            </el-form-item>
313
+          </el-col>
314
+          <el-col :span="12">
315
+            <el-form-item label="是否豁免备注" prop="exemptionRemark">
316
+              <el-input v-model="formData.exemptionRemark" type="textarea" :rows="2" placeholder="请输入豁免备注" />
317
+            </el-form-item>
318
+          </el-col>
319
+        </el-row>
320
+      </el-form>
321
+
322
+      <template #footer>
323
+        <div class="dialog-footer">
324
+          <el-button @click="dialog.visible = false">取消</el-button>
325
+          <el-button type="primary" @click="submitForm">确定</el-button>
326
+        </div>
327
+      </template>
328
+    </el-dialog>
329
+  </div>
330
+</template>
331
+
332
+<script setup>
333
+import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
334
+import { ElMessage, ElMessageBox } from 'element-plus'
335
+
336
+// API导入(需要根据实际API路径调整)
337
+import { getNonCadreMonthlyAssessList, addNonCadreMonthlyAssess, updateNonCadreMonthlyAssess, deleteNonCadreMonthlyAssess } from '@/api/performance/nonCadreMonthlyAssess.js'
338
+
339
+const { proxy } = getCurrentInstance()
340
+
341
+// 响应式数据
342
+const loading = ref(false)
343
+const total = ref(0)
344
+const queryFormRef = ref()
345
+const formRef = ref()
346
+
347
+// 查询参数
348
+const queryParams = reactive({
349
+  pageNum: 1,
350
+  pageSize: 10,
351
+  employeeName: '',
352
+  assessmentMonth: ''
353
+})
354
+
355
+// 表单数据
356
+const formData = reactive({
357
+  // 基本信息
358
+  employeeName: '',
359
+  employmentType: '',
360
+  position: '',
361
+  assessmentGroup: '',
362
+  teamLeader: '',
363
+  supervisor: '',
364
+  manager: '',
365
+  assessmentMonth: '',
366
+  managedEmployeeCount: 0,
367
+  
368
+  // 红线指标
369
+  redLineTriggerCount: 0,
370
+  redLineBasis: '',
371
+  
372
+  // 核心指标
373
+  coreIndicatorScore: 0,
374
+  coreIndicatorBasis: '',
375
+  
376
+  // 其他指标
377
+  otherIndicatorScore: 0,
378
+  otherIndicatorBasis: '',
379
+  
380
+  // 安全指标(含SOC)
381
+  safetyIndicatorScoreWithSOC: 0,
382
+  safetyIndicatorBasisWithSOC: '',
383
+  
384
+  // 安全指标(不含SOC)
385
+  safetyIndicatorScoreWithoutSOC: 0,
386
+  safetyIndicatorBasisWithoutSOC: '',
387
+  
388
+  // 非安全指标
389
+  nonSafetyIndicatorDeduction: 0,
390
+  nonSafetyIndicatorBasis: '',
391
+  
392
+  // 综合扣分
393
+  nonCoreSafetyCoreDeduction: 0,
394
+  socInspectionDeduction: 0,
395
+  socInspectionBasis: '',
396
+  
397
+  // 统计信息
398
+  averageDeduction: 0,
399
+  totalScore: 0,
400
+  rewardAmount: 0,
401
+  penaltyAmount: 0,
402
+  assessmentResult: '',
403
+  applicationMethod: '',
404
+  
405
+  // 备注信息
406
+  rewardDetails: '',
407
+  penaltyDetails: '',
408
+  assessmentResultRemark: '',
409
+  applicationMethodRemark: '',
410
+  
411
+  // 豁免信息
412
+  isExempted: false,
413
+  exemptionRemark: ''
414
+})
415
+
416
+// 弹窗配置
417
+const dialog = reactive({
418
+  visible: false,
419
+  title: ''
420
+})
421
+
422
+// 数据列表
423
+const assessmentList = ref([])
424
+
425
+// 选项配置
426
+const employmentTypeOptions = [
427
+  { label: '正式员工', value: 'formal' },
428
+  { label: '合同工', value: 'contract' },
429
+  { label: '临时工', value: 'temporary' },
430
+  { label: '实习生', value: 'intern' }
431
+]
432
+
433
+const assessmentResultOptions = [
434
+  { label: '优秀', value: 'excellent' },
435
+  { label: '良好', value: 'good' },
436
+  { label: '合格', value: 'qualified' },
437
+  { label: '不合格', value: 'unqualified' }
438
+]
439
+
440
+const applicationMethodOptions = [
441
+  { label: '直接应用', value: 'direct' },
442
+  { label: '加权计算', value: 'weighted' },
443
+  { label: '特殊处理', value: 'special' }
444
+]
445
+
446
+// 表单验证规则
447
+const rules = {
448
+  employeeName: [{ required: true, message: '员工姓名不能为空', trigger: 'blur' }],
449
+  employmentType: [{ required: true, message: '用工形式不能为空', trigger: 'change' }],
450
+  position: [{ required: true, message: '岗位不能为空', trigger: 'blur' }],
451
+  assessmentGroup: [{ required: true, message: '考核组不能为空', trigger: 'blur' }],
452
+  assessmentMonth: [{ required: true, message: '考核月份不能为空', trigger: 'change' }]
453
+}
454
+
455
+// 获取数据列表
456
+const getList = async () => {
457
+  loading.value = true
458
+  try {
459
+    const res = await getNonCadreMonthlyAssessList(queryParams)
460
+    assessmentList.value = res.rows || []
461
+    total.value = res.total || 0
462
+  } catch (error) {
463
+    console.error('获取数据失败:', error)
464
+    ElMessage.error('获取数据失败')
465
+  } finally {
466
+    loading.value = false
467
+  }
468
+}
469
+
470
+// 查询
471
+const handleQuery = () => {
472
+  queryParams.pageNum = 1
473
+  getList()
474
+}
475
+
476
+// 重置查询
477
+const resetQuery = () => {
478
+  queryFormRef.value?.resetFields()
479
+  queryParams.pageNum = 1
480
+  getList()
481
+}
482
+
483
+// 新增
484
+const handleAdd = () => {
485
+  dialog.visible = true
486
+  dialog.title = '新增非干部月度考核'
487
+  
488
+  // 重置表单数据
489
+  Object.keys(formData).forEach(key => {
490
+    if (typeof formData[key] === 'number') {
491
+      formData[key] = 0
492
+    } else if (typeof formData[key] === 'boolean') {
493
+      formData[key] = false
494
+    } else {
495
+      formData[key] = ''
496
+    }
497
+  })
498
+}
499
+
500
+// 编辑
501
+const handleEdit = (row) => {
502
+  dialog.visible = true
503
+  dialog.title = '编辑非干部月度考核'
504
+  
505
+  // 填充表单数据
506
+  Object.keys(formData).forEach(key => {
507
+    if (row[key] !== undefined) {
508
+      formData[key] = row[key]
509
+    }
510
+  })
511
+}
512
+
513
+// 删除
514
+const handleDelete = async (row) => {
515
+  try {
516
+    await ElMessageBox.confirm('确认删除该考核记录吗?', '提示', {
517
+      confirmButtonText: '确定',
518
+      cancelButtonText: '取消',
519
+      type: 'warning'
520
+    })
521
+    
522
+    await deleteNonCadreMonthlyAssess(row.id)
523
+    ElMessage.success('删除成功')
524
+    getList()
525
+  } catch (error) {
526
+    if (error !== 'cancel') {
527
+      ElMessage.error('删除失败')
528
+    }
529
+  }
530
+}
531
+
532
+// 提交表单
533
+const submitForm = async () => {
534
+  const valid = await formRef.value?.validate()
535
+  if (!valid) return
536
+  
537
+  try {
538
+    if (dialog.title === '新增非干部月度考核') {
539
+      await addNonCadreMonthlyAssess(formData)
540
+      ElMessage.success('新增成功')
541
+    } else {
542
+      await updateNonCadreMonthlyAssess(formData)
543
+      ElMessage.success('更新成功')
544
+    }
545
+    
546
+    dialog.visible = false
547
+    getList()
548
+  } catch (error) {
549
+    ElMessage.error('操作失败')
550
+  }
551
+}
552
+
553
+// 导出
554
+const handleExport = async () => {
555
+  try {
556
+    // 导出逻辑(需要根据实际API实现)
557
+    ElMessage.success('导出功能开发中')
558
+  } catch (error) {
559
+    ElMessage.error('导出失败')
560
+  }
561
+}
562
+
563
+onMounted(() => {
564
+  getList()
565
+})
566
+</script>
567
+
568
+<style lang="less" scoped>
569
+.app-container {
570
+  padding: 20px;
571
+}
572
+
573
+.filter-container {
574
+  margin-bottom: 20px;
575
+}
576
+
577
+.search-form {
578
+  display: flex;
579
+  flex-wrap: wrap;
580
+  gap: 10px;
581
+}
582
+
583
+.operation-container {
584
+  margin-bottom: 20px;
585
+}
586
+
587
+.form-container {
588
+  max-height: 70vh;
589
+  overflow-y: auto;
590
+  padding-right: 10px;
591
+}
592
+
593
+.el-divider {
594
+  margin: 20px 0;
595
+}
596
+
597
+:deep(.el-form-item__label) {
598
+  font-weight: 500;
599
+}
600
+</style>

+ 0 - 0
src/views/performanceManage/NonCadreMonthlyAssess/非干部月度考核


+ 172 - 0
src/views/performanceManage/NonCadreMonthlyAssessSum/index.vue

@@ -0,0 +1,172 @@
1
+<template>
2
+  <div class="app-container">
3
+    <el-card>
4
+      <!-- 查询条件 -->
5
+      <div class="filter-container">
6
+        <el-form :model="queryParams" ref="queryFormRef" :inline="true" class="search-form">
7
+          <el-form-item label="查询月份" prop="assessmentMonth">
8
+            <el-date-picker v-model="queryParams.assessmentMonth" type="month" placeholder="请选择查询月份" 
9
+              value-format="YYYY-MM" style="width: 200px" />
10
+          </el-form-item>
11
+          
12
+          <el-form-item>
13
+            <el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
14
+            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
15
+          </el-form-item>
16
+        </el-form>
17
+      </div>
18
+
19
+      <!-- 操作按钮 -->
20
+      <div class="operation-container">
21
+        <el-button type="warning" icon="Download" @click="handleExport">导出</el-button>
22
+      </div>
23
+
24
+      <!-- 汇总表格 -->
25
+      <el-table v-loading="loading" :data="summaryData" border fit highlight-current-row style="width: 100%; margin-top: 20px;">
26
+        <!-- 区间列 -->
27
+        <el-table-column prop="rangeName" label="区间" align="center" min-width="150" fixed />
28
+
29
+        <!-- 一队 -->
30
+        <el-table-column label="一队" align="center" min-width="120">
31
+          <template #default="scope">
32
+            {{ scope.row.team1 || '-' }}
33
+          </template>
34
+        </el-table-column>
35
+
36
+        <!-- 二队 -->
37
+        <el-table-column label="二队" align="center" min-width="120">
38
+          <template #default="scope">
39
+            {{ scope.row.team2 || '-' }}
40
+          </template>
41
+        </el-table-column>
42
+
43
+        <!-- 三队 -->
44
+        <el-table-column label="三队" align="center" min-width="120">
45
+          <template #default="scope">
46
+            {{ scope.row.team3 || '-' }}
47
+          </template>
48
+        </el-table-column>
49
+
50
+        <!-- 综合大队 -->
51
+        <el-table-column label="综合大队" align="center" min-width="120">
52
+          <template #default="scope">
53
+            {{ scope.row.comprehensiveBrigade || '-' }}
54
+          </template>
55
+        </el-table-column>
56
+
57
+        <!-- 品控 -->
58
+        <el-table-column label="品控" align="center" min-width="120">
59
+          <template #default="scope">
60
+            {{ scope.row.qualityControl || '-' }}
61
+          </template>
62
+        </el-table-column>
63
+
64
+        <!-- 培训 -->
65
+        <el-table-column label="培训" align="center" min-width="120">
66
+          <template #default="scope">
67
+            {{ scope.row.training || '-' }}
68
+          </template>
69
+        </el-table-column>
70
+
71
+        <!-- 设备 -->
72
+        <el-table-column label="设备" align="center" min-width="120">
73
+          <template #default="scope">
74
+            {{ scope.row.equipment || '-' }}
75
+          </template>
76
+        </el-table-column>
77
+
78
+        <!-- 综管 -->
79
+        <el-table-column label="综管" align="center" min-width="120">
80
+          <template #default="scope">
81
+            {{ scope.row.comprehensiveManagement || '-' }}
82
+          </template>
83
+        </el-table-column>
84
+      </el-table>
85
+    </el-card>
86
+  </div>
87
+</template>
88
+
89
+<script setup>
90
+import { ref, reactive, onMounted } from 'vue'
91
+import { ElMessage } from 'element-plus'
92
+
93
+// API导入
94
+import { getNonCadreMonthlyAssessSummary } from '@/api/performance/nonCadreMonthlyAssessSummary.js'
95
+
96
+// 响应式数据
97
+const loading = ref(false)
98
+const queryFormRef = ref()
99
+
100
+// 查询参数
101
+const queryParams = reactive({
102
+  assessmentMonth: ''
103
+})
104
+
105
+// 汇总数据
106
+const summaryData = ref([])
107
+
108
+// 获取汇总数据
109
+const getList = async () => {
110
+  loading.value = true
111
+  try {
112
+    const res = await getNonCadreMonthlyAssessSummary(queryParams)
113
+    summaryData.value = res.data || []
114
+  } catch (error) {
115
+    console.error('获取汇总数据失败:', error)
116
+    ElMessage.error('获取汇总数据失败')
117
+  } finally {
118
+    loading.value = false
119
+  }
120
+}
121
+
122
+// 查询
123
+const handleQuery = () => {
124
+  getList()
125
+}
126
+
127
+// 重置查询
128
+const resetQuery = () => {
129
+  queryFormRef.value?.resetFields()
130
+  getList()
131
+}
132
+
133
+// 导出
134
+const handleExport = async () => {
135
+  try {
136
+    ElMessage.success('导出功能开发中')
137
+  } catch (error) {
138
+    ElMessage.error('导出失败')
139
+  }
140
+}
141
+
142
+onMounted(() => {
143
+  getList()
144
+})
145
+</script>
146
+
147
+<style lang="less" scoped>
148
+.app-container {
149
+  padding: 20px;
150
+}
151
+
152
+.filter-container {
153
+  margin-bottom: 20px;
154
+}
155
+
156
+.search-form {
157
+  display: flex;
158
+  flex-wrap: wrap;
159
+  gap: 10px;
160
+}
161
+
162
+.operation-container {
163
+  margin-bottom: 20px;
164
+}
165
+
166
+:deep(.el-table) {
167
+  .el-table__header th {
168
+    background-color: #f5f7fa;
169
+    font-weight: 600;
170
+  }
171
+}
172
+</style>

+ 0 - 0
src/views/performanceManage/NonCadreMonthlyAssessSum/非干部月度考核汇总表


+ 453 - 0
src/views/performanceManage/NonCadreMonthlyScoreSum/index.vue

@@ -0,0 +1,453 @@
1
+<template>
2
+  <div class="app-container">
3
+    <!-- 查询条件 -->
4
+    <div class="filter-section">
5
+      <el-card>
6
+        <div class="filter-container">
7
+          <el-form :model="queryParams" ref="queryFormRef" :inline="true" class="search-form">
8
+            <el-form-item label="考核月份" prop="assessmentMonth">
9
+              <el-date-picker v-model="queryParams.assessmentMonth" type="month" placeholder="请选择考核月份" 
10
+                value-format="YYYY-MM" style="width: 200px" />
11
+            </el-form-item>
12
+            
13
+            <el-form-item>
14
+              <el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
15
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
16
+            </el-form-item>
17
+          </el-form>
18
+          
19
+          <div class="export-button">
20
+            <el-button type="warning" icon="Document" @click="handleExport">导出文档</el-button>
21
+          </div>
22
+        </div>
23
+      </el-card>
24
+    </div>
25
+
26
+    <!-- 非干部月度考核分数汇总 -->
27
+    <div class="main-section">
28
+      <h2 class="section-title">非干部月度考核分数汇总</h2>
29
+      
30
+      <!-- 第一行:两个区块 -->
31
+      <div class="chart-row">
32
+        <!-- 整体分支分布柱状图 -->
33
+        <el-card class="chart-card">
34
+          <div class="chart-header">整体分支分布柱状图</div>
35
+          <div ref="overallBarChart" class="chart-container"></div>
36
+        </el-card>
37
+        
38
+        <!-- 参与人数占比饼图 -->
39
+        <el-card class="chart-card">
40
+          <div class="chart-header">参与人数占比饼图</div>
41
+          <div ref="participantPieChart" class="chart-container"></div>
42
+        </el-card>
43
+      </div>
44
+
45
+      <!-- 第二行:两个区块 -->
46
+      <div class="chart-row">
47
+        <!-- 各部门分支分布对比图 -->
48
+        <el-card class="chart-card">
49
+          <div class="chart-header">各部门分支分布对比图</div>
50
+          <div ref="departmentComparisonChart" class="chart-container"></div>
51
+        </el-card>
52
+        
53
+        <!-- 汇总表 -->
54
+        <el-card class="chart-card">
55
+          <div class="chart-header">汇总表</div>
56
+          <el-table :data="summaryTableData" border style="width: 100%; margin-top: 10px;">
57
+            <el-table-column prop="range" label="区间" align="center" min-width="100" />
58
+            <el-table-column prop="simulationScore" label="2026年1月模拟分数汇总" align="center" min-width="150" />
59
+            <el-table-column prop="team1" label="一队" align="center" min-width="100" />
60
+            <el-table-column prop="team2" label="二队" align="center" min-width="100" />
61
+            <el-table-column prop="team3" label="三队" align="center" min-width="100" />
62
+          </el-table>
63
+        </el-card>
64
+      </div>
65
+    </div>
66
+
67
+    <!-- 分干部月度考核分类结果汇总 -->
68
+    <div class="main-section">
69
+      <h2 class="section-title">分干部月度考核分类结果汇总</h2>
70
+      
71
+      <!-- 汇总统计表格 -->
72
+      <el-card class="summary-table-card">
73
+        <div class="chart-header">汇总统计</div>
74
+        <el-table :data="classificationTableData" border style="width: 100%; margin-top: 10px;">
75
+          <el-table-column prop="assessmentGroup" label="考核组人数" align="center" min-width="120" />
76
+          <el-table-column prop="calculatedImprovement" label="测算待改进人数" align="center" min-width="140" />
77
+          <el-table-column prop="totalImprovement" label="待改进总人数" align="center" min-width="120" />
78
+          <el-table-column prop="exemption1" label="豁免" align="center" min-width="80" />
79
+          <el-table-column prop="actualImprovement" label="实际待改进总人数" align="center" min-width="140" />
80
+          <el-table-column prop="totalUnqualified" label="不称职总人数" align="center" min-width="120" />
81
+          <el-table-column prop="exemption2" label="豁免" align="center" min-width="80" />
82
+          <el-table-column prop="actualUnqualified" label="实际不称职人数" align="center" min-width="140" />
83
+        </el-table>
84
+      </el-card>
85
+
86
+      <!-- 第四行:两个区块 -->
87
+      <div class="chart-row">
88
+        <!-- 大队分布统计图 -->
89
+        <el-card class="chart-card">
90
+          <div class="chart-header">大队分布统计图</div>
91
+          <div class="pie-charts-container">
92
+            <div ref="brigadePieChart1" class="pie-chart"></div>
93
+            <div ref="brigadePieChart2" class="pie-chart"></div>
94
+          </div>
95
+        </el-card>
96
+        
97
+        <!-- 岗位分布统计图 -->
98
+        <el-card class="chart-card">
99
+          <div class="chart-header">岗位分布统计图</div>
100
+          <div class="pie-charts-container">
101
+            <div ref="positionPieChart1" class="pie-chart"></div>
102
+            <div ref="positionPieChart2" class="pie-chart"></div>
103
+          </div>
104
+        </el-card>
105
+      </div>
106
+    </div>
107
+  </div>
108
+</template>
109
+
110
+<script setup>
111
+import { ref, reactive, onMounted, nextTick } from 'vue'
112
+import { ElMessage } from 'element-plus'
113
+import * as echarts from 'echarts'
114
+
115
+// API导入
116
+import { getNonCadreMonthlyScoreSum } from '@/api/performance/nonCadreMonthlyScoreSum.js'
117
+
118
+// 响应式数据
119
+const loading = ref(false)
120
+const queryFormRef = ref()
121
+
122
+// 查询参数
123
+const queryParams = reactive({
124
+  assessmentMonth: ''
125
+})
126
+
127
+// 图表引用
128
+const overallBarChart = ref(null)
129
+const participantPieChart = ref(null)
130
+const departmentComparisonChart = ref(null)
131
+const brigadePieChart1 = ref(null)
132
+const brigadePieChart2 = ref(null)
133
+const positionPieChart1 = ref(null)
134
+const positionPieChart2 = ref(null)
135
+
136
+// 表格数据
137
+const summaryTableData = ref([
138
+  { range: '90-100分', simulationScore: '85', team1: '15', team2: '20', team3: '25' },
139
+  { range: '80-89分', simulationScore: '120', team1: '30', team2: '35', team3: '40' },
140
+  { range: '70-79分', simulationScore: '95', team1: '25', team2: '30', team3: '35' },
141
+  { range: '60-69分', simulationScore: '60', team1: '15', team2: '20', team3: '25' },
142
+  { range: '60分以下', simulationScore: '20', team1: '5', team2: '8', team3: '7' }
143
+])
144
+
145
+const classificationTableData = ref([
146
+  { 
147
+    assessmentGroup: '100', 
148
+    calculatedImprovement: '15', 
149
+    totalImprovement: '12', 
150
+    exemption1: '2', 
151
+    actualImprovement: '10', 
152
+    totalUnqualified: '5', 
153
+    exemption2: '1', 
154
+    actualUnqualified: '4'
155
+  }
156
+])
157
+
158
+// 图表实例
159
+let overallBarChartInstance = null
160
+let participantPieChartInstance = null
161
+let departmentComparisonChartInstance = null
162
+let brigadePieChart1Instance = null
163
+let brigadePieChart2Instance = null
164
+let positionPieChart1Instance = null
165
+let positionPieChart2Instance = null
166
+
167
+// 初始化图表
168
+const initCharts = () => {
169
+  nextTick(() => {
170
+    // 整体分支分布柱状图
171
+    if (overallBarChart.value) {
172
+      overallBarChartInstance = echarts.init(overallBarChart.value)
173
+      overallBarChartInstance.setOption({
174
+        tooltip: { trigger: 'axis' },
175
+        xAxis: { type: 'category', data: ['90-100分', '80-89分', '70-79分', '60-69分', '60分以下'] },
176
+        yAxis: { type: 'value' },
177
+        series: [{ type: 'bar', data: [85, 120, 95, 60, 20], itemStyle: { color: '#3b82f6' } }]
178
+      })
179
+    }
180
+
181
+    // 参与人数占比饼图
182
+    if (participantPieChart.value) {
183
+      participantPieChartInstance = echarts.init(participantPieChart.value)
184
+      participantPieChartInstance.setOption({
185
+        tooltip: { trigger: 'item' },
186
+        series: [{
187
+          type: 'pie',
188
+          radius: '70%',
189
+          data: [
190
+            { value: 380, name: '参与考核' },
191
+            { value: 20, name: '未参与考核' }
192
+          ]
193
+        }]
194
+      })
195
+    }
196
+
197
+    // 各部门分支分布对比图
198
+    if (departmentComparisonChart.value) {
199
+      departmentComparisonChartInstance = echarts.init(departmentComparisonChart.value)
200
+      departmentComparisonChartInstance.setOption({
201
+        tooltip: { trigger: 'axis' },
202
+        legend: { data: ['一队', '二队', '三队'] },
203
+        xAxis: { type: 'category', data: ['90-100分', '80-89分', '70-79分', '60-69分', '60分以下'] },
204
+        yAxis: { type: 'value' },
205
+        series: [
206
+          { name: '一队', type: 'bar', data: [15, 30, 25, 15, 5] },
207
+          { name: '二队', type: 'bar', data: [20, 35, 30, 20, 8] },
208
+          { name: '三队', type: 'bar', data: [25, 40, 35, 25, 7] }
209
+        ]
210
+      })
211
+    }
212
+
213
+    // 大队分布饼图1
214
+    if (brigadePieChart1.value) {
215
+      brigadePieChart1Instance = echarts.init(brigadePieChart1.value)
216
+      brigadePieChart1Instance.setOption({
217
+        tooltip: { trigger: 'item' },
218
+        series: [{
219
+          type: 'pie',
220
+          radius: '70%',
221
+          data: [
222
+            { value: 120, name: '一队' },
223
+            { value: 150, name: '二队' },
224
+            { value: 130, name: '三队' }
225
+          ]
226
+        }]
227
+      })
228
+    }
229
+
230
+    // 大队分布饼图2
231
+    if (brigadePieChart2.value) {
232
+      brigadePieChart2Instance = echarts.init(brigadePieChart2.value)
233
+      brigadePieChart2Instance.setOption({
234
+        tooltip: { trigger: 'item' },
235
+        series: [{
236
+          type: 'pie',
237
+          radius: '70%',
238
+          data: [
239
+            { value: 45, name: '优秀' },
240
+            { value: 280, name: '合格' },
241
+            { value: 75, name: '待改进' }
242
+          ]
243
+        }]
244
+      })
245
+    }
246
+
247
+    // 岗位分布饼图1
248
+    if (positionPieChart1.value) {
249
+      positionPieChart1Instance = echarts.init(positionPieChart1.value)
250
+      positionPieChart1Instance.setOption({
251
+        tooltip: { trigger: 'item' },
252
+        series: [{
253
+          type: 'pie',
254
+          radius: '70%',
255
+          data: [
256
+            { value: 150, name: '安检员' },
257
+            { value: 120, name: '设备操作员' },
258
+            { value: 80, name: '管理人员' },
259
+            { value: 50, name: '其他' }
260
+          ]
261
+        }]
262
+      })
263
+    }
264
+
265
+    // 岗位分布饼图2
266
+    if (positionPieChart2.value) {
267
+      positionPieChart2Instance = echarts.init(positionPieChart2.value)
268
+      positionPieChart2Instance.setOption({
269
+        tooltip: { trigger: 'item' },
270
+        series: [{
271
+          type: 'pie',
272
+          radius: '70%',
273
+          data: [
274
+            { value: 35, name: '优秀' },
275
+            { value: 320, name: '合格' },
276
+            { value: 45, name: '待改进' }
277
+          ]
278
+        }]
279
+      })
280
+    }
281
+  })
282
+}
283
+
284
+// 窗口大小变化时重绘图表
285
+const handleResize = () => {
286
+  const charts = [
287
+    overallBarChartInstance,
288
+    participantPieChartInstance,
289
+    departmentComparisonChartInstance,
290
+    brigadePieChart1Instance,
291
+    brigadePieChart2Instance,
292
+    positionPieChart1Instance,
293
+    positionPieChart2Instance
294
+  ]
295
+  charts.forEach(chart => {
296
+    if (chart) chart.resize()
297
+  })
298
+}
299
+
300
+// 获取数据
301
+const getList = async () => {
302
+  loading.value = true
303
+  try {
304
+    const res = await getNonCadreMonthlyScoreSum(queryParams)
305
+    // 这里可以根据实际API返回的数据更新图表和表格数据
306
+    console.log('获取汇总数据:', res)
307
+  } catch (error) {
308
+    console.error('获取汇总数据失败:', error)
309
+    ElMessage.error('获取汇总数据失败')
310
+  } finally {
311
+    loading.value = false
312
+  }
313
+}
314
+
315
+// 查询
316
+const handleQuery = () => {
317
+  getList()
318
+}
319
+
320
+// 重置查询
321
+const resetQuery = () => {
322
+  queryFormRef.value?.resetFields()
323
+  getList()
324
+}
325
+
326
+// 导出
327
+const handleExport = async () => {
328
+  try {
329
+    ElMessage.success('导出功能开发中')
330
+  } catch (error) {
331
+    ElMessage.error('导出失败')
332
+  }
333
+}
334
+
335
+onMounted(() => {
336
+  initCharts()
337
+  window.addEventListener('resize', handleResize)
338
+  getList()
339
+})
340
+
341
+// 组件卸载时移除事件监听器
342
+onUnmounted(() => {
343
+  window.removeEventListener('resize', handleResize)
344
+  // 销毁图表实例
345
+  const charts = [
346
+    overallBarChartInstance,
347
+    participantPieChartInstance,
348
+    departmentComparisonChartInstance,
349
+    brigadePieChart1Instance,
350
+    brigadePieChart2Instance,
351
+    positionPieChart1Instance,
352
+    positionPieChart2Instance
353
+  ]
354
+  charts.forEach(chart => {
355
+    if (chart) chart.dispose()
356
+  })
357
+})
358
+</script>
359
+
360
+<style lang="less" scoped>
361
+.app-container {
362
+  padding: 20px;
363
+}
364
+
365
+.filter-section {
366
+  margin-bottom: 20px;
367
+}
368
+
369
+.filter-container {
370
+  display: flex;
371
+  justify-content: space-between;
372
+  align-items: center;
373
+}
374
+
375
+.search-form {
376
+  display: flex;
377
+  align-items: center;
378
+  gap: 10px;
379
+}
380
+
381
+.export-button {
382
+  margin-left: auto;
383
+}
384
+
385
+.main-section {
386
+  margin-bottom: 30px;
387
+}
388
+
389
+.section-title {
390
+  font-size: 20px;
391
+  font-weight: bold;
392
+  color: #333;
393
+  margin-bottom: 20px;
394
+  text-align: center;
395
+}
396
+
397
+.chart-row {
398
+  display: grid;
399
+  grid-template-columns: 1fr 1fr;
400
+  gap: 20px;
401
+  margin-bottom: 20px;
402
+}
403
+
404
+.chart-card {
405
+  height: 400px;
406
+}
407
+
408
+.summary-table-card {
409
+  margin-bottom: 20px;
410
+}
411
+
412
+.chart-header {
413
+  font-size: 16px;
414
+  font-weight: 600;
415
+  color: #333;
416
+  margin-bottom: 10px;
417
+  text-align: center;
418
+}
419
+
420
+.chart-container {
421
+  width: 100%;
422
+  height: 350px;
423
+}
424
+
425
+.pie-charts-container {
426
+  display: grid;
427
+  grid-template-columns: 1fr 1fr;
428
+  gap: 10px;
429
+  height: 350px;
430
+}
431
+
432
+.pie-chart {
433
+  width: 100%;
434
+  height: 100%;
435
+}
436
+
437
+:deep(.el-table) {
438
+  .el-table__header th {
439
+    background-color: #f5f7fa;
440
+    font-weight: 600;
441
+  }
442
+}
443
+
444
+@media (max-width: 1200px) {
445
+  .chart-row {
446
+    grid-template-columns: 1fr;
447
+  }
448
+  
449
+  .pie-charts-container {
450
+    grid-template-columns: 1fr;
451
+  }
452
+}
453
+</style>

+ 0 - 0
src/views/performanceManage/NonCadreMonthlyScoreSum/非干部月度考核分数汇总


+ 321 - 0
src/views/system/classificationAssess/index.vue

@@ -0,0 +1,321 @@
1
+<template>
2
+  <div class="app-container">
3
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px">
4
+      <el-form-item label="编码" prop="code">
5
+        <el-input v-model="queryParams.code" placeholder="请输入编码" clearable @keyup.enter="handleQuery" />
6
+      </el-form-item>
7
+      <el-form-item label="检查项目名称" prop="name">
8
+        <el-input v-model="queryParams.name" placeholder="请输入检查项目名称" clearable @keyup.enter="handleQuery" />
9
+      </el-form-item>
10
+
11
+      <!-- <el-form-item label="重要程度" prop="categoryName"> -->
12
+        <!-- <el-select v-model="queryParams.importance" placeholder="请选择重要程度" clearable style="width: 180px;">
13
+          <el-option v-for="dict in base_check_importance" :key="dict.value" :label="dict.label" :value="dict.value" />
14
+        </el-select> -->
15
+        <!-- <el-input v-model="queryParams.categoryName" placeholder="请输入所属分类名称" clearable @keyup.enter="handleQuery" />
16
+      </el-form-item> -->
17
+      <el-form-item>
18
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
19
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
20
+      </el-form-item>
21
+    </el-form>
22
+
23
+    <el-row :gutter="10" class="mb8">
24
+      <el-col :span="1.5">
25
+        <el-button type="primary" plain icon="Plus" @click="handleAdd"
26
+          v-hasPermi="['system:project:add']">新增</el-button>
27
+      </el-col>
28
+      <el-col :span="1.5">
29
+        <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
30
+          v-hasPermi="['system:project:edit']">修改</el-button>
31
+      </el-col>
32
+      <el-col :span="1.5">
33
+        <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
34
+          v-hasPermi="['system:project:remove']">删除</el-button>
35
+      </el-col>
36
+      <el-col :span="1.5">
37
+        <el-button type="warning" plain icon="Download" @click="handleExport"
38
+          v-hasPermi="['system:project:export']">导出</el-button>
39
+      </el-col>
40
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
41
+    </el-row>
42
+
43
+    <el-table v-loading="loading" :data="projectList" @selection-change="handleSelectionChange">
44
+      <el-table-column type="selection" width="55" align="center" />
45
+      <el-table-column label="编码" align="center" prop="code" />
46
+      <el-table-column label="检查项目名称" align="center" prop="name" />
47
+      <el-table-column label="所属分类" align="center" prop="categoryName" />
48
+      <!-- <el-table-column label="检查标准" align="center" prop="checkStandard" />
49
+      <el-table-column label="检查方法" align="center" prop="checkMethod" /> -->
50
+      <!-- <el-table-column label="重要程度" align="center" prop="importance">
51
+        <template #default="scope">
52
+          <dict-tag :options="base_check_importance" :value="scope.row.importance" />
53
+        </template>
54
+      </el-table-column> -->
55
+      <!-- <el-table-column label="状态" align="center" prop="status" >
56
+        <template #default="scope">
57
+          <dict-tag :options="base_check_status" :value="scope.row.status"/>
58
+        </template>
59
+      </el-table-column> -->
60
+      <!-- <el-table-column label="备注" align="center" prop="remark" /> -->
61
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
62
+        <template #default="scope">
63
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
64
+            v-hasPermi="['system:project:edit']">修改</el-button>
65
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
66
+            v-hasPermi="['system:project:remove']">删除</el-button>
67
+        </template>
68
+      </el-table-column>
69
+    </el-table>
70
+
71
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
72
+      v-model:limit="queryParams.pageSize" @pagination="getList" />
73
+
74
+    <!-- 添加或修改检查项目对话框 -->
75
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
76
+      <el-form ref="projectRef" :model="form" :rules="rules" label-width="120px">
77
+        <el-form-item label="编码" prop="code" v-if="form.id">
78
+          <el-input v-model="form.code" placeholder="请输入编码" disabled />
79
+        </el-form-item>
80
+        <el-form-item label="检查项目名称" prop="name">
81
+          <el-input v-model="form.name" placeholder="请输入检查项目名称" />
82
+        </el-form-item>
83
+        <el-form-item label="所属分类" prop="categoryCode">
84
+          <el-tree-select v-model="form.categoryCode" :data="enableCategoryOptions"
85
+            :props="{ value: 'code', label: 'label', children: 'children' }" value-key="id" placeholder="请选择所属分类"
86
+            @node-click="handleNodeClick" />
87
+        </el-form-item>
88
+        <el-form-item label="检查级别" prop="checkLevel">
89
+          <el-select v-model="form.checkLevel" placeholder="请选择检查级别" multiple>
90
+            <el-option v-for="dict in check_level" :key="dict.value" :label="dict.label" :value="dict.value" />
91
+          </el-select>
92
+        </el-form-item>
93
+        <el-form-item label="检查标准" prop="checkStandard">
94
+          <el-input v-model="form.checkStandard" type="textarea" placeholder="请输入内容" />
95
+        </el-form-item>
96
+        <el-form-item label="检查方法" prop="checkMethod">
97
+          <el-input v-model="form.checkMethod" type="textarea" placeholder="请输入内容" />
98
+        </el-form-item>
99
+        <!-- <el-form-item label="重要程度" prop="importance">
100
+          <el-select v-model="form.importance" placeholder="请选择重要程度">
101
+            <el-option v-for="dict in base_check_importance" :key="dict.value" :label="dict.label"
102
+              :value="dict.value"></el-option>
103
+          </el-select>
104
+        </el-form-item> -->
105
+
106
+        <el-form-item label="备注" prop="remark">
107
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
108
+        </el-form-item>
109
+      </el-form>
110
+      <template #footer>
111
+        <div class="dialog-footer">
112
+          <el-button type="primary" @click="submitForm">确 定</el-button>
113
+          <el-button @click="cancel">取 消</el-button>
114
+        </div>
115
+      </template>
116
+    </el-dialog>
117
+  </div>
118
+</template>
119
+
120
+<script setup name="Project">
121
+import { listProject, getProject, delProject, addProject, updateProject } from "@/api/system/project"
122
+import { treeSelectByType } from "@/api/system/common"
123
+
124
+const { proxy } = getCurrentInstance()
125
+const { base_check_importance, check_level, check_checked_level } = proxy.useDict('base_check_importance', 'check_level', 'check_checked_level')
126
+
127
+const projectList = ref([])
128
+const open = ref(false)
129
+const loading = ref(true)
130
+const showSearch = ref(true)
131
+const ids = ref([])
132
+const single = ref(true)
133
+const multiple = ref(true)
134
+const total = ref(0)
135
+const title = ref("")
136
+const base_check_status = ref([{ "value": "0", "label": "启用" }, { "value": "1", "label": "停用" }])
137
+const enableCategoryOptions = ref(undefined)
138
+
139
+const data = reactive({
140
+  form: {},
141
+  queryParams: {
142
+    pageNum: 1,
143
+    pageSize: 10,
144
+    name: null,
145
+    categoryCode: null,
146
+    checkStandard: null,
147
+    checkMethod: null,
148
+    importance: null,
149
+    status: null,
150
+    categoryName: null,
151
+    code: null,
152
+    importanceDesc: null
153
+  },
154
+  rules: {
155
+    name: [
156
+      { required: true, message: "检查项目名称不能为空", trigger: "blur" }
157
+    ],
158
+    categoryCode: [
159
+      { required: true, message: "分类编码不能为空", trigger: "blur" }
160
+    ],
161
+    // importance: [
162
+    //   { required: true, message: "重要程度不能为空", trigger: "change" }
163
+    // ],
164
+    status: [
165
+      { required: true, message: "状态不能为空", trigger: "change" }
166
+    ],
167
+    categoryName: [
168
+      { required: true, message: "分类名称不能为空", trigger: "blur" }
169
+    ],
170
+    code: [
171
+      { required: true, message: "编码不能为空", trigger: "blur" }
172
+    ],
173
+    // importanceDesc: [
174
+    //   { required: true, message: "重要程度名称不能为空", trigger: "blur" }
175
+    // ]
176
+  }
177
+})
178
+
179
+const { queryParams, form, rules } = toRefs(data)
180
+
181
+/** 查询检查项目列表 */
182
+function getList() {
183
+  loading.value = true
184
+  listProject(queryParams.value).then(response => {
185
+    projectList.value = response.rows
186
+    total.value = response.total
187
+    loading.value = false
188
+  })
189
+}
190
+
191
+// 取消按钮
192
+function cancel() {
193
+  open.value = false
194
+  reset()
195
+}
196
+
197
+// 表单重置
198
+function reset() {
199
+  form.value = {
200
+    tenantId: null,
201
+    revision: null,
202
+    createBy: null,
203
+    createTime: null,
204
+    updateBy: null,
205
+    updateTime: null,
206
+    id: null,
207
+    name: null,
208
+    categoryCode: null,
209
+    checkStandard: null,
210
+    checkMethod: null,
211
+    importance: null,
212
+    status: null,
213
+    categoryName: null,
214
+    remark: null,
215
+    code: null,
216
+    importanceDesc: null
217
+  }
218
+  proxy.resetForm("projectRef")
219
+}
220
+
221
+/** 搜索按钮操作 */
222
+function handleQuery() {
223
+  queryParams.value.pageNum = 1
224
+  getList()
225
+}
226
+
227
+/** 重置按钮操作 */
228
+function resetQuery() {
229
+  proxy.resetForm("queryRef")
230
+  handleQuery()
231
+}
232
+
233
+// 多选框选中数据
234
+function handleSelectionChange(selection) {
235
+  ids.value = selection.map(item => item.id)
236
+  single.value = selection.length != 1
237
+  multiple.value = !selection.length
238
+}
239
+
240
+/** 新增按钮操作 */
241
+function handleAdd() {
242
+  reset()
243
+  open.value = true
244
+  title.value = "添加检查项目"
245
+}
246
+
247
+/** 修改按钮操作 */
248
+function handleUpdate(row) {
249
+  reset()
250
+  const _id = row.id || ids.value
251
+  getProject(_id).then(response => {
252
+    form.value = {
253
+      ...response.data,
254
+      checkLevel: response.data?.checkLevel?.split(","),
255
+    }
256
+    open.value = true
257
+    title.value = "修改检查项目"
258
+  })
259
+}
260
+
261
+/** 提交按钮 */
262
+function submitForm() {
263
+  proxy.$refs["projectRef"].validate(valid => {
264
+    if (valid) {
265
+      // 名称转换
266
+      if (form.value.importance) {
267
+        form.value.importanceDesc = base_check_importance.value.find(item => item.value === form.value.importance).label;
268
+      }
269
+      // form.value.checkLevelDesc = check_level.value.find(item => item.value === form.value.checkLevel).label;
270
+      let res = {
271
+        ...form.value,
272
+        checkLevel: form.value.checkLevel && form.value.checkLevel.join(","),
273
+      }
274
+      if (form.value.id != null) {
275
+        updateProject(res).then(response => {
276
+          proxy.$modal.msgSuccess("修改成功")
277
+          open.value = false
278
+          getList()
279
+        })
280
+      } else {
281
+        addProject(res).then(response => {
282
+          proxy.$modal.msgSuccess("新增成功")
283
+          open.value = false
284
+          getList()
285
+        })
286
+      }
287
+    }
288
+  })
289
+}
290
+
291
+/** 删除按钮操作 */
292
+function handleDelete(row) {
293
+  const _ids = row.id || ids.value
294
+  proxy.$modal.confirm('是否确认删除数据项?').then(function () {
295
+    return delProject(_ids)
296
+  }).then(() => {
297
+    getList()
298
+    proxy.$modal.msgSuccess("删除成功")
299
+  }).catch(() => { })
300
+}
301
+
302
+/** 导出按钮操作 */
303
+function handleExport() {
304
+  proxy.download('system/project/export', {
305
+    ...queryParams.value
306
+  }, `project_${new Date().getTime()}.xlsx`)
307
+}
308
+/** 查询分类下拉树结构 */
309
+function getCategoryTree() {
310
+  treeSelectByType("CHECK_CATEGORY", 2).then(response => {
311
+    enableCategoryOptions.value = response.data
312
+  })
313
+}
314
+
315
+function handleNodeClick(data) {
316
+  form.value.categoryName = data.label;
317
+}
318
+
319
+getCategoryTree()
320
+getList()
321
+</script>

+ 0 - 0
src/views/system/classificationAssess/考核指标


+ 276 - 0
src/views/system/classificationAssessIndicator/index.vue

@@ -0,0 +1,276 @@
1
+<template>
2
+  <div class="app-container">
3
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
4
+      <el-form-item label="编码" prop="code">
5
+        <el-input
6
+          v-model="queryParams.code"
7
+          placeholder="请输入编码"
8
+          clearable
9
+          @keyup.enter="handleQuery"
10
+        />
11
+      </el-form-item>
12
+      <el-form-item label="分类名称" prop="name">
13
+        <el-input
14
+          v-model="queryParams.name"
15
+          placeholder="请输入分类名称"
16
+          clearable
17
+          @keyup.enter="handleQuery"
18
+        />
19
+      </el-form-item>
20
+      <el-form-item>
21
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
22
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
23
+      </el-form-item>
24
+    </el-form>
25
+
26
+    <el-row :gutter="10" class="mb8">
27
+      <el-col :span="1.5">
28
+        <el-button
29
+          type="primary"
30
+          plain
31
+          icon="Plus"
32
+          @click="handleAdd"
33
+          v-hasPermi="['system:checkCategory:add']"
34
+        >新增</el-button>
35
+      </el-col>
36
+      <el-col :span="1.5">
37
+        <el-button
38
+          type="info"
39
+          plain
40
+          icon="Sort"
41
+          @click="toggleExpandAll"
42
+        >展开/折叠</el-button>
43
+      </el-col>
44
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
45
+    </el-row>
46
+
47
+    <el-table
48
+      v-if="refreshTable"
49
+      v-loading="loading"
50
+      :data="checkCategoryList"
51
+      row-key="id"
52
+      :default-expand-all="isExpandAll"
53
+      :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
54
+    >
55
+      <el-table-column label="编码" align="center" prop="code" />
56
+      <el-table-column label="分类名称" align="center" prop="name" />
57
+      <el-table-column label="显示顺序" align="center" prop="orderNum" />
58
+      <el-table-column label="备注" align="center" prop="remark" />
59
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
60
+        <template #default="scope">
61
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:checkCategory:edit']">修改</el-button>
62
+          <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:checkCategory:add']">新增</el-button>
63
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:checkCategory:remove']">删除</el-button>
64
+        </template>
65
+      </el-table-column>
66
+    </el-table>
67
+
68
+    <!-- 添加或修改检查项分类对话框 -->
69
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
70
+      <el-form ref="checkCategoryRef" :model="form" :rules="rules" label-width="80px">
71
+        <el-form-item label="编码" prop="code" v-if="form.id">
72
+          <el-input v-model="form.code" placeholder="请输入编码" disabled/>
73
+        </el-form-item>
74
+        <el-form-item label="分类名称" prop="name">
75
+          <el-input v-model="form.name" placeholder="请输入分类名称" />
76
+        </el-form-item>
77
+        <el-form-item label="上级分类" prop="parentId">
78
+          <el-tree-select
79
+            v-model="form.parentId"
80
+            :data="checkCategoryOptions"
81
+            :props="{ value: 'id', label: 'name', children: 'children' }"
82
+            value-key="id"
83
+            placeholder="请选择上级分类"
84
+            check-strictly
85
+          />
86
+        </el-form-item>
87
+        <el-form-item label="显示顺序" prop="orderNum">
88
+          <el-input v-model="form.orderNum" placeholder="请输入显示顺序" />
89
+        </el-form-item>
90
+
91
+        <el-form-item label="备注" prop="remark">
92
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
93
+        </el-form-item>
94
+      </el-form>
95
+      <template #footer>
96
+        <div class="dialog-footer">
97
+          <el-button type="primary" @click="submitForm">确 定</el-button>
98
+          <el-button @click="cancel">取 消</el-button>
99
+        </div>
100
+      </template>
101
+    </el-dialog>
102
+  </div>
103
+</template>
104
+
105
+<script setup name="CheckCategory">
106
+import { listCheckCategory, getCheckCategory, delCheckCategory, addCheckCategory, updateCheckCategory } from "@/api/system/checkCategory"
107
+
108
+const { proxy } = getCurrentInstance()
109
+
110
+const checkCategoryList = ref([])
111
+const checkCategoryOptions = ref([])
112
+const open = ref(false)
113
+const loading = ref(true)
114
+const showSearch = ref(true)
115
+const title = ref("")
116
+const isExpandAll = ref(true)
117
+const refreshTable = ref(true)
118
+
119
+const data = reactive({
120
+  form: {},
121
+  queryParams: {
122
+    name: null,
123
+    parentId: null,
124
+    orderNum: null,
125
+    code: null,
126
+  },
127
+  rules: {
128
+    name: [
129
+      { required: true, message: "分类名称不能为空", trigger: "blur" }
130
+    ],
131
+    parentId: [
132
+      { required: true, message: "上级分类不能为空", trigger: "blur" }
133
+    ],
134
+    ancestors: [
135
+      { required: true, message: "祖级列表不能为空", trigger: "blur" }
136
+    ],
137
+    level: [
138
+      { required: true, message: "层级不能为空", trigger: "blur" }
139
+    ],
140
+    orderNum: [
141
+      { required: true, message: "显示顺序不能为空", trigger: "blur" }
142
+    ],
143
+    code: [
144
+      { required: true, message: "编码不能为空", trigger: "blur" }
145
+    ],
146
+  }
147
+})
148
+
149
+const { queryParams, form, rules } = toRefs(data)
150
+
151
+/** 查询检查项分类列表 */
152
+function getList() {
153
+  loading.value = true
154
+  listCheckCategory(queryParams.value).then(response => {
155
+    checkCategoryList.value = proxy.handleTree(response.data, "id", "parentId")
156
+    loading.value = false
157
+  })
158
+}
159
+
160
+/** 查询检查项分类下拉树结构 */
161
+function getTreeselect() {
162
+  listCheckCategory().then(response => {
163
+    checkCategoryOptions.value = []
164
+    const data = { id: 0, name: '顶级节点', children: [] }
165
+    data.children = proxy.handleTree(response.data, "id", "parentId")
166
+    checkCategoryOptions.value.push(data)
167
+  })
168
+}
169
+	
170
+// 取消按钮
171
+function cancel() {
172
+  open.value = false
173
+  reset()
174
+}
175
+
176
+// 表单重置
177
+function reset() {
178
+  form.value = {
179
+    tenantId: null,
180
+    revision: null,
181
+    createBy: null,
182
+    createTime: null,
183
+    updateBy: null,
184
+    updateTime: null,
185
+    id: null,
186
+    name: null,
187
+    parentId: null,
188
+    ancestors: null,
189
+    level: null,
190
+    orderNum: null,
191
+    code: null,
192
+    remark: null
193
+  }
194
+  proxy.resetForm("checkCategoryRef")
195
+}
196
+
197
+/** 搜索按钮操作 */
198
+function handleQuery() {
199
+  getList()
200
+}
201
+
202
+/** 重置按钮操作 */
203
+function resetQuery() {
204
+  proxy.resetForm("queryRef")
205
+  handleQuery()
206
+}
207
+
208
+/** 新增按钮操作 */
209
+function handleAdd(row) {
210
+  reset()
211
+  getTreeselect()
212
+  if (row != null && row.id) {
213
+    form.value.parentId = row.id
214
+  } else {
215
+    form.value.parentId = 0
216
+  }
217
+  open.value = true
218
+  title.value = "添加检查项分类"
219
+}
220
+
221
+/** 展开/折叠操作 */
222
+function toggleExpandAll() {
223
+  refreshTable.value = false
224
+  isExpandAll.value = !isExpandAll.value
225
+  nextTick(() => {
226
+    refreshTable.value = true
227
+  })
228
+}
229
+
230
+/** 修改按钮操作 */
231
+async function handleUpdate(row) {
232
+  reset()
233
+  await getTreeselect()
234
+  if (row != null) {
235
+    form.value.parentId = row.parentId
236
+  }
237
+  getCheckCategory(row.id).then(response => {
238
+    form.value = response.data
239
+    open.value = true
240
+    title.value = "修改检查项分类"
241
+  })
242
+}
243
+
244
+/** 提交按钮 */
245
+function submitForm() {
246
+  proxy.$refs["checkCategoryRef"].validate(valid => {
247
+    if (valid) {
248
+      if (form.value.id != null) {
249
+        updateCheckCategory(form.value).then(response => {
250
+          proxy.$modal.msgSuccess("修改成功")
251
+          open.value = false
252
+          getList()
253
+        })
254
+      } else {
255
+        addCheckCategory(form.value).then(response => {
256
+          proxy.$modal.msgSuccess("新增成功")
257
+          open.value = false
258
+          getList()
259
+        })
260
+      }
261
+    }
262
+  })
263
+}
264
+
265
+/** 删除按钮操作 */
266
+function handleDelete(row) {
267
+  proxy.$modal.confirm('是否确认删除数据项?').then(function() {
268
+    return delCheckCategory(row.id)
269
+  }).then(() => {
270
+    getList()
271
+    proxy.$modal.msgSuccess("删除成功")
272
+  }).catch(() => {})
273
+}
274
+
275
+getList()
276
+</script>

+ 0 - 0
src/views/system/classificationAssessIndicator/考核指标分类