Browse Source

Merge branch 'exemptEvaluation' into dev

huoyi 1 month ago
parent
commit
a6c5361382

+ 73 - 0
src/api/ledgerManage/contractExpirationLedger.js

@@ -0,0 +1,73 @@
1
+import request from '@/utils/request'
2
+
3
+// 查询合同到期列表
4
+export function listContractExpirationLedger(query) {
5
+  return request({
6
+    url: '/ledger/contract/list',
7
+    method: 'get',
8
+    params: query
9
+  })
10
+}
11
+
12
+// 获取合同到期详细信息
13
+export function getContractExpirationLedger(id) {
14
+  return request({
15
+    url: `/ledger/contract/${id}`,
16
+    method: 'get'
17
+  })
18
+}
19
+
20
+// 新增合同到期
21
+export function addContractExpirationLedger(data) {
22
+  return request({
23
+    url: '/ledger/contract',
24
+    method: 'post',
25
+    data: data
26
+  })
27
+}
28
+
29
+// 修改合同到期
30
+export function updateContractExpirationLedger(data) {
31
+  return request({
32
+    url: '/ledger/contract',
33
+    method: 'put',
34
+    data: data
35
+  })
36
+}
37
+
38
+// 删除合同到期
39
+export function delContractExpirationLedger(ids) {
40
+  return request({
41
+    url: `/ledger/contract/${ids}`,
42
+    method: 'delete'
43
+  })
44
+}
45
+
46
+// 导出合同到期列表
47
+export function exportContractExpirationLedger(data) {
48
+  return request({
49
+    url: '/ledger/contract/export',
50
+    method: 'post',
51
+    data: data
52
+  })
53
+}
54
+
55
+// 导入数据列表
56
+export function importContractData(data) {
57
+  return request({
58
+    url: '/ledger/contract/importData',
59
+    method: 'post',
60
+    data: data,
61
+    headers: {
62
+      'Content-Type': 'multipart/form-data'
63
+    }
64
+  })
65
+}
66
+
67
+// 获取导入模板
68
+export function importContractTemplate() {
69
+  return request({
70
+    url: '/ledger/contract/importTemplate',
71
+    method: 'post'
72
+  })
73
+}

+ 73 - 0
src/api/ledgerManage/qualificationSummary.js

@@ -0,0 +1,73 @@
1
+import request from '@/utils/request'
2
+
3
+// 查询证书信息列表
4
+export function listQualificationSummary(query) {
5
+  return request({
6
+    url: '/ledger/certificate/list',
7
+    method: 'get',
8
+    params: query
9
+  })
10
+}
11
+
12
+// 查询证书信息详情
13
+export function getQualificationSummary(id) {
14
+  return request({
15
+    url: `/ledger/certificate/${id}`,
16
+    method: 'get'
17
+  })
18
+}
19
+
20
+// 新增证书信息
21
+export function addQualificationSummary(data) {
22
+  return request({
23
+    url: '/ledger/certificate',
24
+    method: 'post',
25
+    data: data
26
+  })
27
+}
28
+
29
+// 修改证书信息
30
+export function updateQualificationSummary(data) {
31
+  return request({
32
+    url: '/ledger/certificate',
33
+    method: 'put',
34
+    data: data
35
+  })
36
+}
37
+
38
+// 删除证书信息
39
+export function delQualificationSummary(ids) {
40
+  return request({
41
+    url: `/ledger/certificate/${ids}`,
42
+    method: 'delete'
43
+  })
44
+}
45
+
46
+// 导出证书信息列表
47
+export function exportQualificationSummary(data) {
48
+  return request({
49
+    url: '/ledger/certificate/export',
50
+    method: 'post',
51
+    data: data
52
+  })
53
+}
54
+
55
+// 导入证书数据(支持动态复审时间列)
56
+export function importData(data) {
57
+  return request({
58
+    url: '/ledger/certificate/importData',
59
+    method: 'post',
60
+    data: data,
61
+    headers: {
62
+      'Content-Type': 'multipart/form-data'
63
+    }
64
+  })
65
+}
66
+
67
+// 下载导入模板
68
+export function importTemplate() {
69
+  return request({
70
+    url: '/ledger/certificate/importTemplate',
71
+    method: 'post'
72
+  })
73
+}

+ 73 - 0
src/api/performance/exemptEvaluation.js

@@ -0,0 +1,73 @@
1
+import request from '@/utils/request'
2
+
3
+// 查询不参加绩效考核人员名单列表
4
+export function listExemptEvaluation(query) {
5
+  return request({
6
+    url: '/ledger/excluded/list',
7
+    method: 'get',
8
+    params: query
9
+  })
10
+}
11
+
12
+// 导出不参加绩效考核人员名单列表
13
+export function exportExemptEvaluation(data) {
14
+  return request({
15
+    url: '/ledger/excluded/export',
16
+    method: 'post',
17
+    data: data
18
+  })
19
+}
20
+
21
+// 获取不参加绩效考核人员名单详细信息
22
+export function getExemptEvaluation(id) {
23
+  return request({
24
+    url: `/ledger/excluded/${id}`,
25
+    method: 'get'
26
+  })
27
+}
28
+
29
+// 新增不参加绩效考核人员名单
30
+export function addExemptEvaluation(data) {
31
+  return request({
32
+    url: '/ledger/excluded',
33
+    method: 'post',
34
+    data: data
35
+  })
36
+}
37
+
38
+// 修改不参加绩效考核人员名单
39
+export function updateExemptEvaluation(data) {
40
+  return request({
41
+    url: '/ledger/excluded',
42
+    method: 'put',
43
+    data: data
44
+  })
45
+}
46
+
47
+// 删除不参加绩效考核人员名单
48
+export function delExemptEvaluation(ids) {
49
+  return request({
50
+    url: `/ledger/excluded/${ids}`,
51
+    method: 'delete'
52
+  })
53
+}
54
+
55
+// 导入数据列表
56
+export function importExemptEvaluation(data) {
57
+  return request({
58
+    url: '/ledger/excluded/importData',
59
+    method: 'post',
60
+    data: data,
61
+    headers: {
62
+      'Content-Type': 'multipart/form-data'
63
+    }
64
+  })
65
+}
66
+
67
+// 获取导入模板
68
+export function importExemptTemplate() {
69
+  return request({
70
+    url: '/ledger/excluded/importTemplate',
71
+    method: 'post'
72
+  })
73
+}

+ 468 - 0
src/views/ledgerManage/contractExpirationLedger/index.vue

@@ -0,0 +1,468 @@
1
+<template>
2
+  <div class="app-container">
3
+    <div class="filter-container">
4
+      <el-form :model="queryParams" ref="queryFormRef" :inline="true" class="search-form">
5
+        <el-form-item label="姓名" prop="userId">
6
+          <UserSelect v-model="queryParams.userId" placeholder="请输入姓名搜索" style="width: 200px" />
7
+        </el-form-item>
8
+
9
+        <el-form-item label="用工形式" prop="employmentType">
10
+          <el-select v-model="queryParams.employmentType" placeholder="请选择用工形式" clearable style="width: 200px">
11
+            <el-option v-for="dict in employment_type" :key="dict.value" :label="dict.label" :value="dict.value" />
12
+          </el-select>
13
+        </el-form-item>
14
+
15
+        <el-form-item label="合同名称" prop="contractName">
16
+          <el-input v-model="queryParams.contractName" placeholder="请输入合同名称" clearable style="width: 200px" />
17
+        </el-form-item>
18
+
19
+        <el-form-item label="合同开始日期" prop="contractStartDateQueryStartDate">
20
+          <el-date-picker v-model="queryParams.contractStartDateQueryStartDate" type="date" value-format="YYYY-MM-DD"
21
+            placeholder="开始日期" style="width: 150px" />
22
+          <span style="padding: 0 8px">-</span>
23
+          <el-date-picker v-model="queryParams.contractStartDateQueryEndDate" type="date" value-format="YYYY-MM-DD"
24
+            placeholder="结束日期" style="width: 150px" />
25
+        </el-form-item>
26
+
27
+        <el-form-item label="合同结束日期" prop="contractEndDateQueryStartDate">
28
+          <el-date-picker v-model="queryParams.contractEndDateQueryStartDate" type="date" value-format="YYYY-MM-DD"
29
+            placeholder="开始日期" style="width: 150px" />
30
+          <span style="padding: 0 8px">-</span>
31
+          <el-date-picker v-model="queryParams.contractEndDateQueryEndDate" type="date" value-format="YYYY-MM-DD"
32
+            placeholder="结束日期" style="width: 150px" />
33
+        </el-form-item>
34
+
35
+        <el-form-item>
36
+          <el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
37
+          <el-button icon="Refresh" @click="resetQuery">重置</el-button>
38
+        </el-form-item>
39
+      </el-form>
40
+    </div>
41
+
42
+    <div class="operation-container">
43
+      <el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
44
+      <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate">修改</el-button>
45
+      <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete">删除</el-button>
46
+      <el-button type="info" plain icon="Upload" @click="handleImport">导入</el-button>
47
+      <el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
48
+    </div>
49
+
50
+    <el-table v-loading="loading" :data="list" border fit highlight-current-row style="width: 100%; margin-top: 20px;"
51
+      @selection-change="handleSelectionChange" @expand-change="handleExpandChange">
52
+      <el-table-column type="selection" width="55" align="center" />
53
+      <el-table-column type="expand">
54
+        <template #default="scope">
55
+          <div class="detail-container">
56
+            <div class="detail-title">合同明细</div>
57
+            <el-table :data="scope.row.ledgerContractExpirationDetailList || []" border fit 
58
+              style="width: 100%; margin-top: 10px;">
59
+              <el-table-column label="序号" type="index" width="60" align="center" />
60
+              <el-table-column label="合同名称" prop="contractName" align="center" min-width="200"
61
+                show-overflow-tooltip />
62
+              <el-table-column label="开始时间" prop="contractStartDate" align="center" min-width="130" />
63
+              <el-table-column label="结束时间" prop="contractEndDate" align="center" min-width="130" />
64
+            </el-table>
65
+          </div>
66
+        </template>
67
+      </el-table-column>
68
+      <el-table-column label="序号" type="index" width="60" align="center">
69
+        <template #default="scope">
70
+          {{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}
71
+        </template>
72
+      </el-table-column>
73
+      <el-table-column label="姓名" prop="userName" align="center" min-width="100" />
74
+      <el-table-column label="用工形式" prop="employmentType" align="center" min-width="100">
75
+        <template #default="scope">
76
+          <dict-tag :options="employment_type" :value="scope.row.employmentType" />
77
+        </template>
78
+      </el-table-column>
79
+      <el-table-column label="大队名称" prop="brigadeName" align="center" min-width="130" show-overflow-tooltip />
80
+      <el-table-column label="合同名称" prop="contractName" align="center" min-width="150" show-overflow-tooltip />
81
+      <el-table-column label="合同开始日期" prop="contractStartDate" align="center" min-width="130" />
82
+      <el-table-column label="合同结束日期" prop="contractEndDate" align="center" min-width="130" />
83
+    </el-table>
84
+
85
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
86
+      @pagination="getList" />
87
+
88
+    <!-- 添加或修改合同到期对话框 -->
89
+    <el-dialog :title="title" v-model="open" width="700px" append-to-body destroy-on-close>
90
+      <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
91
+        <el-form-item label="姓名" prop="userId">
92
+          <UserSelect v-model="form.userId" placeholder="请选择姓名" style="width: 100%" />
93
+        </el-form-item>
94
+        <el-form-item label="用工形式" prop="employmentType">
95
+          <el-select v-model="form.employmentType" placeholder="请选择用工形式" clearable style="width: 100%">
96
+            <el-option v-for="dict in employment_type" :key="dict.value" :label="dict.label" :value="dict.value" />
97
+          </el-select>
98
+        </el-form-item>
99
+        <el-form-item label="大队名称" prop="brigadeName">
100
+          <el-input v-model="form.brigadeName" placeholder="请输入大队名称" />
101
+        </el-form-item>
102
+        <el-form-item label="合同名称" prop="contractName">
103
+          <el-input v-model="form.contractName" placeholder="请输入合同名称" :disabled="!!form.id" />
104
+        </el-form-item>
105
+        <el-form-item label="合同开始日期" prop="contractStartDate">
106
+          <el-date-picker v-model="form.contractStartDate" value-format="YYYY-MM-DD" type="date" placeholder="请选择合同开始日期" style="width: 100%" :disabled="!!form.id" />
107
+        </el-form-item>
108
+        <el-form-item label="合同结束日期" prop="contractEndDate">
109
+          <el-date-picker v-model="form.contractEndDate" value-format="YYYY-MM-DD" type="date" placeholder="请选择合同结束日期" style="width: 100%" :disabled="!!form.id" />
110
+        </el-form-item>
111
+        <el-form-item label="备注" prop="remark">
112
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
113
+        </el-form-item>
114
+        <el-form-item label="合同明细">
115
+          <div style="width: 100%">
116
+            <el-button type="primary"  icon="Plus" @click="handleAddDetail" style="margin-bottom: 10px">
117
+              新增明细
118
+            </el-button>
119
+            <el-table :data="form.ledgerContractExpirationDetailList || []" border fit  style="width: 100%">
120
+              <el-table-column label="合同名称" min-width="180">
121
+                <template #default="scope">
122
+                  <el-input v-model="scope.row.contractName" placeholder="请输入合同名称"  />
123
+                </template>
124
+              </el-table-column>
125
+              <el-table-column label="开始日期" min-width="140">
126
+                <template #default="scope">
127
+                  <el-date-picker v-model="scope.row.contractStartDate" value-format="YYYY-MM-DD" type="date"
128
+                    placeholder="选择日期"  style="width: 100%" />
129
+                </template>
130
+              </el-table-column>
131
+              <el-table-column label="结束日期" min-width="140">
132
+                <template #default="scope">
133
+                  <el-date-picker v-model="scope.row.contractEndDate" value-format="YYYY-MM-DD" type="date"
134
+                    placeholder="选择日期"  style="width: 100%" />
135
+                </template>
136
+              </el-table-column>
137
+              <el-table-column label="操作" width="80" align="center">
138
+                <template #default="scope">
139
+                  <el-button type="danger"  link icon="Delete" @click="handleDeleteDetail(scope.$index)" />
140
+                </template>
141
+              </el-table-column>
142
+            </el-table>
143
+          </div>
144
+        </el-form-item>
145
+      </el-form>
146
+      <template #footer>
147
+        <div class="dialog-footer">
148
+          <el-button type="primary" @click="submitForm">确 定</el-button>
149
+          <el-button @click="cancel">取 消</el-button>
150
+        </div>
151
+      </template>
152
+    </el-dialog>
153
+
154
+    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
155
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url"
156
+        :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess"
157
+        :auto-upload="false" drag>
158
+        <el-icon class="el-icon--upload">
159
+          <upload-filled />
160
+        </el-icon>
161
+        <div class="el-upload__text">
162
+          将文件拖到此处,或<em>点击上传</em>
163
+        </div>
164
+        <template #tip>
165
+          <div class="el-upload__tip text-center">
166
+            <span>仅允许导入xls、xlsx格式文件。</span>
167
+            <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
168
+              @click="downloadTemplate">下载模板</el-link>
169
+          </div>
170
+        </template>
171
+      </el-upload>
172
+      <template #footer>
173
+        <div class="dialog-footer">
174
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
175
+          <el-button @click="upload.open = false">取 消</el-button>
176
+        </div>
177
+      </template>
178
+    </el-dialog>
179
+  </div>
180
+</template>
181
+
182
+<script setup name="ContractExpirationLedger">
183
+import { ref, reactive, getCurrentInstance, onMounted, watch } from 'vue'
184
+import { UploadFilled } from '@element-plus/icons-vue'
185
+import UserSelect from '@/components/UserSelect/index.vue'
186
+import {
187
+  listContractExpirationLedger,
188
+  getContractExpirationLedger,
189
+  addContractExpirationLedger,
190
+  updateContractExpirationLedger,
191
+  delContractExpirationLedger,
192
+  exportContractExpirationLedger
193
+} from '@/api/ledgerManage/contractExpirationLedger'
194
+import { getUser } from '@/api/system/user'
195
+import { getToken } from '@/utils/auth'
196
+
197
+const { proxy } = getCurrentInstance()
198
+
199
+const { employment_type } = proxy.useDict('employment_type')
200
+
201
+const loading = ref(false)
202
+const total = ref(0)
203
+const list = ref([])
204
+const queryFormRef = ref(null)
205
+const formRef = ref(null)
206
+const ids = ref([])
207
+const single = ref(true)
208
+const multiple = ref(true)
209
+const open = ref(false)
210
+const title = ref('')
211
+
212
+const queryParams = reactive({
213
+  pageNum: 1,
214
+  pageSize: 10,
215
+  userId: '',
216
+  employmentType: '',
217
+  contractName: '',
218
+  contractStartDateQueryStartDate: '',
219
+  contractStartDateQueryEndDate: '',
220
+  contractEndDateQueryStartDate: '',
221
+  contractEndDateQueryEndDate: ''
222
+})
223
+
224
+const upload = reactive({
225
+  open: false,
226
+  title: '',
227
+  isUploading: false,
228
+  url: '',
229
+  headers: {
230
+    Authorization: 'Bearer ' + getToken()
231
+  }
232
+})
233
+
234
+const form = ref({
235
+  id: undefined,
236
+  userId: '',
237
+  userName: '',
238
+  employmentType: '',
239
+  brigadeName: '',
240
+  contractName: '',
241
+  contractStartDate: '',
242
+  contractEndDate: '',
243
+  remark: '',
244
+  ledgerContractExpirationDetailList: []
245
+})
246
+
247
+watch(() => form.value.userId, async (newVal) => {
248
+  if (newVal) {
249
+    try {
250
+      const res = await getUser(newVal)
251
+      form.value.userName = res.data?.nickName || ''
252
+    } catch {
253
+      form.value.userName = ''
254
+    }
255
+  } else {
256
+    form.value.userName = ''
257
+  }
258
+})
259
+
260
+const rules = reactive({
261
+  userId: [{ required: true, message: '请选择姓名', trigger: 'change' }],
262
+  employmentType: [{ required: true, message: '请选择用工形式', trigger: 'change' }],
263
+  contractName: [{ required: true, message: '请输入合同名称', trigger: 'blur' }],
264
+  contractStartDate: [{ required: true, message: '请选择合同开始日期', trigger: 'change' }],
265
+  contractEndDate: [{ required: true, message: '请选择合同结束日期', trigger: 'change' }]
266
+})
267
+
268
+const getList = async () => {
269
+  loading.value = true
270
+  try {
271
+    const res = await listContractExpirationLedger(queryParams)
272
+    list.value = res.rows || []
273
+    total.value = res.total || 0
274
+  } finally {
275
+    loading.value = false
276
+  }
277
+}
278
+
279
+const handleQuery = () => {
280
+  queryParams.pageNum = 1
281
+  getList()
282
+}
283
+
284
+const resetQuery = () => {
285
+  queryFormRef.value.resetFields()
286
+  queryParams.userId = ''
287
+  queryParams.employmentType = ''
288
+  queryParams.contractName = ''
289
+  queryParams.contractStartDateQueryStartDate = ''
290
+  queryParams.contractStartDateQueryEndDate = ''
291
+  queryParams.contractEndDateQueryStartDate = ''
292
+  queryParams.contractEndDateQueryEndDate = ''
293
+  handleQuery()
294
+}
295
+
296
+const handleSelectionChange = (selection) => {
297
+  ids.value = selection.map(item => item.id)
298
+  single.value = selection.length !== 1
299
+  multiple.value = !selection.length
300
+}
301
+
302
+const handleExpandChange = async (row, expandedRows) => {
303
+  if (expandedRows.includes(row) && (!row.ledgerContractExpirationDetailList || row.ledgerContractExpirationDetailList.length === 0)) {
304
+    try {
305
+      const res = await getContractExpirationLedger(row.id)
306
+      row.ledgerContractExpirationDetailList = res.data?.ledgerContractExpirationDetailList || res.data || []
307
+    } catch (error) {
308
+      row.ledgerContractExpirationDetailList = []
309
+    }
310
+  }
311
+}
312
+
313
+const handleAdd = () => {
314
+  reset()
315
+  open.value = true
316
+  title.value = '添加合同到期信息'
317
+}
318
+
319
+const handleUpdate = async (row) => {
320
+  reset()
321
+  const id = row.id || ids.value[0]
322
+  const res = await getContractExpirationLedger(id)
323
+  form.value = res.data || {}
324
+  open.value = true
325
+  title.value = '修改合同到期信息'
326
+}
327
+
328
+const handleDelete = (row) => {
329
+  const deleteIds = row.id || ids.value
330
+  proxy.$modal.confirm('是否确认删除合同到期信息编号为"' + deleteIds + '"的数据项?').then(() => {
331
+    return delContractExpirationLedger(deleteIds)
332
+  }).then(() => {
333
+    getList()
334
+    proxy.$modal.msgSuccess('删除成功')
335
+  }).catch(() => { })
336
+}
337
+
338
+const handleAddDetail = () => {
339
+  if (!form.value.ledgerContractExpirationDetailList) {
340
+    form.value.ledgerContractExpirationDetailList = []
341
+  }
342
+  form.value.ledgerContractExpirationDetailList.push({
343
+    contractName: '',
344
+    contractStartDate: '',
345
+    contractEndDate: ''
346
+  })
347
+}
348
+
349
+const handleDeleteDetail = (index) => {
350
+  form.value.ledgerContractExpirationDetailList.splice(index, 1)
351
+}
352
+
353
+const submitForm = async () => {
354
+  const valid = await formRef.value.validate().catch(() => false)
355
+  if (!valid) return
356
+
357
+  loading.value = true
358
+  try {
359
+    if (form.value.id) {
360
+      await updateContractExpirationLedger(form.value)
361
+      proxy.$modal.msgSuccess('修改成功')
362
+    } else {
363
+      await addContractExpirationLedger(form.value)
364
+      proxy.$modal.msgSuccess('新增成功')
365
+    }
366
+    open.value = false
367
+    getList()
368
+  } finally {
369
+    loading.value = false
370
+  }
371
+}
372
+
373
+const cancel = () => {
374
+  open.value = false
375
+  reset()
376
+}
377
+
378
+const reset = () => {
379
+  form.value = {
380
+    id: undefined,
381
+    userId: '',
382
+    userName: '',
383
+    employmentType: '',
384
+    brigadeName: '',
385
+    contractName: '',
386
+    contractStartDate: '',
387
+    contractEndDate: '',
388
+    remark: '',
389
+    ledgerContractExpirationDetailList: []
390
+  }
391
+  formRef.value && formRef.value.resetFields()
392
+}
393
+
394
+const handleExport = () => {
395
+  proxy.download(
396
+    'ledger/contract/export',
397
+    queryParams,
398
+    `合同到期台账模板_${new Date().getTime()}.xlsx`,
399
+    'post'
400
+  )
401
+}
402
+
403
+const handleImport = () => {
404
+  upload.title = '合同到期导入'
405
+  upload.url = import.meta.env.VITE_APP_BASE_API + '/ledger/contract/importData'
406
+  upload.open = true
407
+}
408
+
409
+const downloadTemplate = () => {
410
+  proxy.download(
411
+    'ledger/contract/importTemplate',
412
+    {},
413
+    `合同到期台账模板_${new Date().getTime()}.xlsx`,
414
+    'post'
415
+  )
416
+}
417
+
418
+const handleFileUploadProgress = () => {
419
+  upload.isUploading = true
420
+}
421
+
422
+const handleFileSuccess = (response, file) => {
423
+  upload.open = false
424
+  upload.isUploading = false
425
+  proxy.$refs.uploadRef.handleRemove(file)
426
+  proxy.$alert(
427
+    "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
428
+      response.msg +
429
+      '</div>',
430
+    '导入结果',
431
+    { dangerouslyUseHTMLString: true }
432
+  )
433
+  getList()
434
+}
435
+
436
+const submitFileForm = () => {
437
+  proxy.$refs.uploadRef.submit()
438
+}
439
+
440
+onMounted(() => {
441
+  getList()
442
+})
443
+</script>
444
+
445
+<style scoped lang="less">
446
+.app-container {
447
+  padding: 20px;
448
+}
449
+
450
+.filter-container {
451
+  margin-bottom: 10px;
452
+}
453
+
454
+.operation-container {
455
+  margin-top: 10px;
456
+}
457
+
458
+.detail-container {
459
+  padding: 10px 30px;
460
+}
461
+
462
+.detail-title {
463
+  font-size: 14px;
464
+  font-weight: bold;
465
+  color: #303133;
466
+  margin-bottom: 5px;
467
+}
468
+</style>

+ 0 - 0
src/views/ledgerManage/contractExpirationLedger/合同到期台账


+ 410 - 0
src/views/ledgerManage/qualificationSummary/index.vue

@@ -0,0 +1,410 @@
1
+<template>
2
+  <div class="app-container">
3
+    <div class="filter-container">
4
+      <el-form :model="queryParams" ref="queryFormRef" :inline="true" class="search-form">
5
+        <el-form-item label="姓名" prop="userName">
6
+          <UserSelect v-model="queryParams.userId" placeholder="请输入姓名搜索" style="width: 200px" />
7
+        </el-form-item>
8
+
9
+        <el-form-item label="证书等级" prop="certLevel">
10
+          <el-select v-model="queryParams.certLevel" placeholder="请选择证书等级" clearable style="width: 200px">
11
+            <el-option v-for="dict in sys_user_qualification_level" :key="dict.value" :label="dict.label" :value="dict.label" />
12
+          </el-select>
13
+        </el-form-item>
14
+
15
+        <el-form-item label="发证时间" prop="issueDate" style="width: 300px">
16
+          <el-date-picker v-model="queryParams.issueDate" value-format="YYYY-MM-DD" type="date" placeholder="请选择发证时间" clearable />
17
+        </el-form-item>
18
+
19
+        <el-form-item label="到期日期" prop="expiryDate" style="width: 300px">
20
+          <el-date-picker v-model="queryParams.expiryDate" value-format="YYYY-MM-DD" type="date" placeholder="请选择到期日期" clearable />
21
+        </el-form-item>
22
+
23
+        <el-form-item label="状态" prop="status">
24
+          <el-input v-model="queryParams.status" placeholder="请输入状态" clearable style="width: 200px" />
25
+        </el-form-item>
26
+
27
+        <el-form-item>
28
+          <el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
29
+          <el-button icon="Refresh" @click="resetQuery">重置</el-button>
30
+        </el-form-item>
31
+      </el-form>
32
+    </div>
33
+
34
+    <div class="operation-container">
35
+      <el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
36
+      <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate">修改</el-button>
37
+      <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete">删除</el-button>
38
+      <el-button type="info" plain icon="Upload" @click="handleImport">导入</el-button>
39
+      <el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
40
+    </div>
41
+
42
+    <el-table v-loading="loading" :data="list" border fit highlight-current-row style="width: 100%; margin-top: 20px;"
43
+      @selection-change="handleSelectionChange">
44
+      <el-table-column type="selection" width="55" align="center" />
45
+      <el-table-column label="序号" type="index" width="60" align="center">
46
+        <template #default="scope">
47
+          {{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}
48
+        </template>
49
+      </el-table-column>
50
+      <el-table-column label="姓名" prop="personName" align="center" min-width="100" />
51
+      <el-table-column label="单位" prop="unitName" align="center" min-width="120" />
52
+      <el-table-column label="证书等级" prop="certLevel" align="center" min-width="100">
53
+        
54
+      </el-table-column>
55
+      <el-table-column label="发证时间" prop="issueDate" align="center" min-width="120" />
56
+      <el-table-column label="证书编号" prop="certNo" align="center" min-width="150" show-overflow-tooltip />
57
+      <el-table-column label="理论考核成绩" prop="theoryScore" align="center" min-width="120" />
58
+      <el-table-column label="实操考核成绩" prop="practiceScore" align="center" min-width="120" />
59
+      <el-table-column label="评定成绩" prop="evalScore" align="center" min-width="100" />
60
+      <el-table-column label="服务期(月)" prop="serviceMonths" align="center" min-width="110" />
61
+      <el-table-column label="到期日期" prop="expiryDate" align="center" min-width="120" />
62
+      <el-table-column label="状态" prop="status" align="center" min-width="90">
63
+      
64
+      </el-table-column>
65
+      <el-table-column label="到期天数" prop="expireDays" align="center" min-width="100">
66
+        <template #default="scope">
67
+          <span :style="{ color: scope.row.expireDays <= 30 ? '#f56c6c' : scope.row.expireDays <= 90 ? '#e6a23c' : '#67c23a' }">
68
+            {{ scope.row.expireDays }}天
69
+          </span>
70
+        </template>
71
+      </el-table-column>
72
+    </el-table>
73
+
74
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
75
+      @pagination="getList" />
76
+
77
+    <!-- 添加或修改证书信息对话框 -->
78
+    <el-dialog :title="title" v-model="open" width="600px" append-to-body destroy-on-close>
79
+      <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
80
+        <el-form-item label="姓名" prop="userId">
81
+          <UserSelect v-model="form.userId" placeholder="请选择姓名" style="width: 100%" />
82
+        </el-form-item>
83
+        <el-form-item label="单位" prop="unitName">
84
+          <el-input v-model="form.unitName" placeholder="请输入单位" />
85
+        </el-form-item>
86
+        <el-form-item label="性别" prop="gender">
87
+          <el-select v-model="form.gender" placeholder="请选择性别" clearable style="width: 100%">
88
+            <el-option label="男" value="0" />
89
+            <el-option label="女" value="1" />
90
+          </el-select>
91
+        </el-form-item>
92
+        <el-form-item label="出生日期" prop="birthDate">
93
+          <el-date-picker v-model="form.birthDate" value-format="YYYY-MM-DD" type="date" placeholder="请选择出生日期" style="width: 100%" />
94
+        </el-form-item>
95
+        <el-form-item label="身份证号" prop="idCard">
96
+          <el-input v-model="form.idCard" placeholder="请输入身份证号" />
97
+        </el-form-item>
98
+        <el-form-item label="证书等级" prop="certLevel">
99
+          <el-select v-model="form.certLevel" placeholder="请选择证书等级" clearable style="width: 100%">
100
+            <el-option v-for="dict in sys_user_qualification_level" :key="dict.value" :label="dict.label" :value="dict.value" />
101
+          </el-select>
102
+        </el-form-item>
103
+        <el-form-item label="发证时间" prop="issueDate">
104
+          <el-date-picker v-model="form.issueDate" value-format="YYYY-MM-DD" type="date" placeholder="请选择发证时间" style="width: 100%" />
105
+        </el-form-item>
106
+        <el-form-item label="证书编号" prop="certNo">
107
+          <el-input v-model="form.certNo" placeholder="请输入证书编号" />
108
+        </el-form-item>
109
+        <el-form-item label="理论考核成绩" prop="theoryScore">
110
+          <el-input v-model="form.theoryScore" placeholder="请输入理论考核成绩" />
111
+        </el-form-item>
112
+        <el-form-item label="实操考核成绩" prop="practiceScore">
113
+          <el-input v-model="form.practiceScore" placeholder="请输入实操考核成绩" />
114
+        </el-form-item>
115
+        <el-form-item label="评定成绩" prop="evalScore">
116
+          <el-input v-model="form.evalScore" placeholder="请输入评定成绩" />
117
+        </el-form-item>
118
+        <el-form-item label="用工形式" prop="employmentType">
119
+          <el-input v-model="form.employmentType" placeholder="请输入用工形式" />
120
+        </el-form-item>
121
+        <el-form-item label="服务期(月)" prop="serviceMonths">
122
+          <el-input-number v-model="form.serviceMonths" :min="0" placeholder="请输入服务期(月)" style="width: 100%" />
123
+        </el-form-item>
124
+        <el-form-item label="到期日期" prop="expiryDate">
125
+          <el-date-picker v-model="form.expiryDate" value-format="YYYY-MM-DD" type="date" placeholder="请选择到期日期" style="width: 100%" />
126
+        </el-form-item>
127
+        <el-form-item label="状态" prop="status">
128
+          <el-input v-model="form.status" placeholder="请输入状态" />
129
+        </el-form-item>
130
+        <el-form-item label="备注" prop="remark">
131
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
132
+        </el-form-item>
133
+      </el-form>
134
+      <template #footer>
135
+        <div class="dialog-footer">
136
+          <el-button type="primary" @click="submitForm">确 定</el-button>
137
+          <el-button @click="cancel">取 消</el-button>
138
+        </div>
139
+      </template>
140
+    </el-dialog>
141
+
142
+    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
143
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url"
144
+        :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess"
145
+        :auto-upload="false" drag>
146
+        <el-icon class="el-icon--upload">
147
+          <upload-filled />
148
+        </el-icon>
149
+        <div class="el-upload__text">
150
+          将文件拖到此处,或<em>点击上传</em>
151
+        </div>
152
+        <template #tip>
153
+          <div class="el-upload__tip text-center">
154
+            <span>仅允许导入xls、xlsx格式文件。</span>
155
+            <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
156
+              @click="downloadTemplate">下载模板</el-link>
157
+          </div>
158
+        </template>
159
+      </el-upload>
160
+      <template #footer>
161
+        <div class="dialog-footer">
162
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
163
+          <el-button @click="upload.open = false">取 消</el-button>
164
+        </div>
165
+      </template>
166
+    </el-dialog>
167
+  </div>
168
+</template>
169
+
170
+<script setup name="QualificationSummary">
171
+import { ref, reactive, getCurrentInstance, onMounted } from 'vue'
172
+import { UploadFilled } from '@element-plus/icons-vue'
173
+import UserSelect from '@/components/UserSelect/index.vue'
174
+import { listQualificationSummary, getQualificationSummary, addQualificationSummary, updateQualificationSummary, delQualificationSummary, exportQualificationSummary } from '@/api/ledgerManage/qualificationSummary'
175
+import { getToken } from '@/utils/auth'
176
+
177
+const { proxy } = getCurrentInstance()
178
+
179
+const { sys_user_qualification_level, certificate_status } = proxy.useDict('sys_user_qualification_level', 'certificate_status')
180
+
181
+const loading = ref(false)
182
+const total = ref(0)
183
+const list = ref([])
184
+const queryFormRef = ref(null)
185
+const formRef = ref(null)
186
+const ids = ref([])
187
+const single = ref(true)
188
+const multiple = ref(true)
189
+
190
+const queryParams = reactive({
191
+  pageNum: 1,
192
+  pageSize: 10,
193
+  userId: '',
194
+  certLevel: '',
195
+  issueDate: '',
196
+  expiryDate: '',
197
+  status: ''
198
+})
199
+
200
+const upload = reactive({
201
+  open: false,
202
+  title: '',
203
+  isUploading: false,
204
+  url: '',
205
+  headers: {
206
+    Authorization: 'Bearer ' + getToken()
207
+  }
208
+})
209
+
210
+const title = ref('')
211
+const open = ref(false)
212
+
213
+const form = ref({
214
+  id: undefined,
215
+  userId: '',
216
+  unitName: '',
217
+  gender: '',
218
+  birthDate: '',
219
+  idCard: '',
220
+  certLevel: '',
221
+  issueDate: '',
222
+  certNo: '',
223
+  theoryScore: '',
224
+  practiceScore: '',
225
+  evalScore: '',
226
+  employmentType: '',
227
+  serviceMonths: undefined,
228
+  expiryDate: '',
229
+  status: '',
230
+  remark: ''
231
+})
232
+
233
+const rules = reactive({
234
+  userId: [{ required: true, message: '请选择姓名', trigger: 'change' }],
235
+  certLevel: [{ required: true, message: '请选择证书等级', trigger: 'change' }],
236
+  certNo: [{ required: true, message: '请输入证书编号', trigger: 'blur' }],
237
+  issueDate: [{ required: true, message: '请选择发证时间', trigger: 'change' }],
238
+  expiryDate: [{ required: true, message: '请选择到期日期', trigger: 'change' }],
239
+  status: [{ required: true, message: '请选择状态', trigger: 'change' }]
240
+})
241
+
242
+const getList = async () => {
243
+  loading.value = true
244
+  try {
245
+    const res = await listQualificationSummary(queryParams)
246
+    list.value = res.rows || []
247
+    total.value = res.total || 0
248
+  } finally {
249
+    loading.value = false
250
+  }
251
+}
252
+
253
+const handleQuery = () => {
254
+  queryParams.pageNum = 1
255
+  getList()
256
+}
257
+
258
+const resetQuery = () => {
259
+  queryFormRef.value.resetFields()
260
+  queryParams.userId = ''
261
+  queryParams.certLevel = ''
262
+  queryParams.issueDate = ''
263
+  queryParams.expiryDate = ''
264
+  queryParams.status = ''
265
+  handleQuery()
266
+}
267
+
268
+const handleSelectionChange = (selection) => {
269
+  ids.value = selection.map(item => item.id)
270
+  single.value = selection.length !== 1
271
+  multiple.value = !selection.length
272
+}
273
+
274
+const handleAdd = () => {
275
+  reset()
276
+  open.value = true
277
+  title.value = '添加证书信息'
278
+}
279
+
280
+const handleUpdate = async (row) => {
281
+  reset()
282
+  const id = row.id || ids.value[0]
283
+  const res = await getQualificationSummary(id)
284
+  form.value = res.data || {}
285
+  open.value = true
286
+  title.value = '修改证书信息'
287
+}
288
+
289
+const handleDelete = (row) => {
290
+  const deleteIds = row.id || ids.value
291
+  proxy.$modal.confirm('是否确认删除证书信息编号为"' + deleteIds + '"的数据项?').then(() => {
292
+    return delQualificationSummary(deleteIds)
293
+  }).then(() => {
294
+    getList()
295
+    proxy.$modal.msgSuccess('删除成功')
296
+  }).catch(() => { })
297
+}
298
+
299
+const submitForm = async () => {
300
+  const valid = await formRef.value.validate().catch(() => false)
301
+  if (!valid) return
302
+
303
+  loading.value = true
304
+  try {
305
+    if (form.value.id) {
306
+      await updateQualificationSummary(form.value)
307
+      proxy.$modal.msgSuccess('修改成功')
308
+    } else {
309
+      await addQualificationSummary(form.value)
310
+      proxy.$modal.msgSuccess('新增成功')
311
+    }
312
+    open.value = false
313
+    getList()
314
+  } finally {
315
+    loading.value = false
316
+  }
317
+}
318
+
319
+const cancel = () => {
320
+  open.value = false
321
+  reset()
322
+}
323
+
324
+const reset = () => {
325
+  form.value = {
326
+    id: undefined,
327
+    userId: '',
328
+    unitName: '',
329
+    gender: '',
330
+    birthDate: '',
331
+    idCard: '',
332
+    certLevel: '',
333
+    issueDate: '',
334
+    certNo: '',
335
+    theoryScore: '',
336
+    practiceScore: '',
337
+    evalScore: '',
338
+    employmentType: '',
339
+    serviceMonths: undefined,
340
+    expiryDate: '',
341
+    status: '',
342
+    remark: ''
343
+  }
344
+  formRef.value && formRef.value.resetFields()
345
+}
346
+
347
+const handleExport = () => {
348
+  proxy.download(
349
+    'ledger/certificate/export',
350
+    queryParams,
351
+    `资质汇总表_${new Date().getTime()}.xlsx`,
352
+    'post'
353
+  )
354
+}
355
+
356
+const handleImport = () => {
357
+  upload.title = '证书信息导入'
358
+  upload.url = import.meta.env.VITE_APP_BASE_API + '/ledger/certificate/importData'
359
+  upload.open = true
360
+}
361
+
362
+const downloadTemplate = () => {
363
+  proxy.download(
364
+    'ledger/certificate/importTemplate',
365
+    {},
366
+    `资质汇总表模板_${new Date().getTime()}.xlsx`,
367
+    'post'
368
+  )
369
+}
370
+
371
+const handleFileUploadProgress = () => {
372
+  upload.isUploading = true
373
+}
374
+
375
+const handleFileSuccess = (response, file) => {
376
+  upload.open = false
377
+  upload.isUploading = false
378
+  proxy.$refs.uploadRef.handleRemove(file)
379
+  proxy.$alert(
380
+    "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
381
+      response.msg +
382
+      '</div>',
383
+    '导入结果',
384
+    { dangerouslyUseHTMLString: true }
385
+  )
386
+  getList()
387
+}
388
+
389
+const submitFileForm = () => {
390
+  proxy.$refs.uploadRef.submit()
391
+}
392
+
393
+onMounted(() => {
394
+  getList()
395
+})
396
+</script>
397
+
398
+<style scoped lang="less">
399
+.app-container {
400
+  padding: 20px;
401
+}
402
+
403
+.filter-container {
404
+  margin-bottom: 10px;
405
+}
406
+
407
+.operation-container {
408
+  margin-top: 10px;
409
+}
410
+</style>

+ 0 - 0
src/views/ledgerManage/qualificationSummary/资质汇总表


+ 324 - 0
src/views/performanceManage/exemptEvaluation/index.vue

@@ -0,0 +1,324 @@
1
+<template>
2
+  <div class="app-container">
3
+    <div class="filter-container">
4
+      <el-form :model="queryParams" ref="queryFormRef" :inline="true" class="search-form">
5
+        <el-form-item label="年度月份" prop="yearAndMonth">
6
+          <el-date-picker v-model="queryParams.yearAndMonth" type="month" placeholder="请选择年度月份"
7
+            value-format="YYYY-MM" style="width: 200px" />
8
+        </el-form-item>
9
+
10
+        <el-form-item label="姓名" prop="userId">
11
+          <UserSelect v-model="queryParams.userId" placeholder="请输入姓名搜索" style="width: 200px" />
12
+        </el-form-item>
13
+
14
+        <el-form-item label="不参加考核原因" prop="reason">
15
+          <el-input v-model="queryParams.reason" placeholder="请输入原因" clearable style="width: 200px" />
16
+        </el-form-item>
17
+
18
+        <el-form-item>
19
+          <el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
20
+          <el-button icon="Refresh" @click="resetQuery">重置</el-button>
21
+        </el-form-item>
22
+      </el-form>
23
+    </div>
24
+
25
+    <div class="operation-container">
26
+      <el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
27
+      <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate">修改</el-button>
28
+      <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete">删除</el-button>
29
+      <el-button type="info" plain icon="Upload" @click="handleImport">导入</el-button>
30
+      <el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
31
+    </div>
32
+
33
+    <el-table v-loading="loading" :data="list" border fit highlight-current-row style="width: 100%; margin-top: 20px;"
34
+      @selection-change="handleSelectionChange">
35
+      <el-table-column type="selection" width="55" align="center" />
36
+      <el-table-column label="序号" type="index" width="60" align="center">
37
+        <template #default="scope">
38
+          {{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}
39
+        </template>
40
+      </el-table-column>
41
+      <el-table-column label="年度月份" prop="yearAndMonth" align="center" min-width="150" />
42
+      <el-table-column label="姓名" prop="userName" align="center" min-width="120" />
43
+      <el-table-column label="不参加考核原因" prop="reason" align="center" min-width="200" show-overflow-tooltip />
44
+    </el-table>
45
+
46
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
47
+      @pagination="getList" />
48
+
49
+    <!-- 添加或修改不参加绩效考核人员对话框 -->
50
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body destroy-on-close>
51
+      <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
52
+        <el-form-item label="姓名" prop="userId">
53
+          <UserSelect v-model="form.userId" placeholder="请选择姓名" style="width: 100%" />
54
+        </el-form-item>
55
+        <el-form-item label="年度月份" prop="yearAndMonth">
56
+          <el-date-picker v-model="form.yearAndMonth" type="month" placeholder="请选择年度月份"
57
+            value-format="YYYY-MM" style="width: 100%" />
58
+        </el-form-item>
59
+        <el-form-item label="不参加考核原因" prop="reason">
60
+          <el-input v-model="form.reason" type="textarea" placeholder="请输入不参加考核原因" />
61
+        </el-form-item>
62
+        <el-form-item label="备注" prop="remark">
63
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
64
+        </el-form-item>
65
+      </el-form>
66
+      <template #footer>
67
+        <div class="dialog-footer">
68
+          <el-button type="primary" @click="submitForm">确 定</el-button>
69
+          <el-button @click="cancel">取 消</el-button>
70
+        </div>
71
+      </template>
72
+    </el-dialog>
73
+
74
+    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
75
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url"
76
+        :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess"
77
+        :auto-upload="false" drag>
78
+        <el-icon class="el-icon--upload">
79
+          <upload-filled />
80
+        </el-icon>
81
+        <div class="el-upload__text">
82
+          将文件拖到此处,或<em>点击上传</em>
83
+        </div>
84
+        <template #tip>
85
+          <div class="el-upload__tip text-center">
86
+            <span>仅允许导入xls、xlsx格式文件。</span>
87
+            <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
88
+              @click="downloadTemplate">下载模板</el-link>
89
+          </div>
90
+        </template>
91
+      </el-upload>
92
+      <template #footer>
93
+        <div class="dialog-footer">
94
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
95
+          <el-button @click="upload.open = false">取 消</el-button>
96
+        </div>
97
+      </template>
98
+    </el-dialog>
99
+  </div>
100
+</template>
101
+
102
+<script setup name="ExemptEvaluation">
103
+import { ref, reactive, getCurrentInstance, onMounted, watch } from 'vue'
104
+import { UploadFilled } from '@element-plus/icons-vue'
105
+import UserSelect from '@/components/UserSelect/index.vue'
106
+import { listExemptEvaluation, addExemptEvaluation, updateExemptEvaluation, delExemptEvaluation, getExemptEvaluation, exportExemptEvaluation } from '@/api/performance/exemptEvaluation'
107
+import { getUser } from '@/api/system/user'
108
+import { getToken } from '@/utils/auth'
109
+
110
+const { proxy } = getCurrentInstance()
111
+
112
+const loading = ref(false)
113
+const total = ref(0)
114
+const list = ref([])
115
+const queryFormRef = ref(null)
116
+const formRef = ref(null)
117
+const ids = ref([])
118
+const single = ref(true)
119
+const multiple = ref(true)
120
+const open = ref(false)
121
+const title = ref('')
122
+
123
+const queryParams = reactive({
124
+  pageNum: 1,
125
+  pageSize: 10,
126
+  yearAndMonth: '',
127
+  userId: '',
128
+  reason: ''
129
+})
130
+
131
+const upload = reactive({
132
+  open: false,
133
+  title: '',
134
+  isUploading: false,
135
+  url: '',
136
+  headers: {
137
+    Authorization: 'Bearer ' + getToken()
138
+  }
139
+})
140
+
141
+const form = ref({
142
+  id: undefined,
143
+  userId: '',
144
+  userName: '',
145
+  yearAndMonth: '',
146
+  reason: '',
147
+  remark: ''
148
+})
149
+
150
+watch(() => form.value.userId, async (newVal) => {
151
+  if (newVal) {
152
+    try {
153
+      const res = await getUser(newVal)
154
+      form.value.userName = res.data?.nickName || ''
155
+    } catch {
156
+      form.value.userName = ''
157
+    }
158
+  } else {
159
+    form.value.userName = ''
160
+  }
161
+})
162
+
163
+const rules = reactive({
164
+  userId: [{ required: true, message: '请选择姓名', trigger: 'change' }],
165
+  yearAndMonth: [{ required: true, message: '请选择年度月份', trigger: 'change' }],
166
+  reason: [{ required: true, message: '请输入不参加考核原因', trigger: 'blur' }]
167
+})
168
+
169
+const getList = async () => {
170
+  loading.value = true
171
+  try {
172
+    const res = await listExemptEvaluation(queryParams)
173
+    list.value = res.rows || []
174
+    total.value = res.total || 0
175
+  } finally {
176
+    loading.value = false
177
+  }
178
+}
179
+
180
+const handleQuery = () => {
181
+  queryParams.pageNum = 1
182
+  getList()
183
+}
184
+
185
+const resetQuery = () => {
186
+  queryFormRef.value.resetFields()
187
+  queryParams.yearAndMonth = ''
188
+  queryParams.userId = ''
189
+  queryParams.reason = ''
190
+  handleQuery()
191
+}
192
+
193
+const handleSelectionChange = (selection) => {
194
+  ids.value = selection.map(item => item.id)
195
+  single.value = selection.length !== 1
196
+  multiple.value = !selection.length
197
+}
198
+
199
+const handleAdd = () => {
200
+  reset()
201
+  open.value = true
202
+  title.value = '添加不参加绩效考核人员'
203
+}
204
+
205
+const handleUpdate = async (row) => {
206
+  reset()
207
+  const id = row.id || ids.value[0]
208
+  const res = await getExemptEvaluation(id)
209
+  form.value = res.data || {}
210
+  open.value = true
211
+  title.value = '修改不参加绩效考核人员'
212
+}
213
+
214
+const handleDelete = (row) => {
215
+  const deleteIds = row.id || ids.value
216
+  proxy.$modal.confirm('是否确认删除不参加绩效考核人员编号为"' + deleteIds + '"的数据项?').then(() => {
217
+    return delExemptEvaluation(deleteIds)
218
+  }).then(() => {
219
+    getList()
220
+    proxy.$modal.msgSuccess('删除成功')
221
+  }).catch(() => { })
222
+}
223
+
224
+const submitForm = async () => {
225
+  const valid = await formRef.value.validate().catch(() => false)
226
+  if (!valid) return
227
+
228
+  loading.value = true
229
+  try {
230
+    if (form.value.id) {
231
+      await updateExemptEvaluation(form.value)
232
+      proxy.$modal.msgSuccess('修改成功')
233
+    } else {
234
+      await addExemptEvaluation(form.value)
235
+      proxy.$modal.msgSuccess('新增成功')
236
+    }
237
+    open.value = false
238
+    getList()
239
+  } finally {
240
+    loading.value = false
241
+  }
242
+}
243
+
244
+const cancel = () => {
245
+  open.value = false
246
+  reset()
247
+}
248
+
249
+const reset = () => {
250
+  form.value = {
251
+    id: undefined,
252
+    userId: '',
253
+    userName: '',
254
+    yearAndMonth: '',
255
+    reason: '',
256
+    remark: ''
257
+  }
258
+  formRef.value && formRef.value.resetFields()
259
+}
260
+
261
+const handleImport = () => {
262
+  upload.title = '不参加绩效考核人员导入'
263
+  upload.url = import.meta.env.VITE_APP_BASE_API + '/ledger/excluded/importData'
264
+  upload.open = true
265
+}
266
+
267
+const downloadTemplate = () => {
268
+  proxy.download(
269
+    'ledger/excluded/importTemplate',
270
+    {},
271
+    `不参加绩效考核人员模板_${new Date().getTime()}.xlsx`,
272
+    'post'
273
+  )
274
+}
275
+
276
+const handleExport = () => {
277
+  proxy.download(
278
+    'ledger/excluded/export',
279
+    queryParams,
280
+    `不参加绩效考核人员_${new Date().getTime()}.xlsx`,
281
+    'post'
282
+  )
283
+}
284
+
285
+const handleFileUploadProgress = () => {
286
+  upload.isUploading = true
287
+}
288
+
289
+const handleFileSuccess = (response, file) => {
290
+  upload.open = false
291
+  upload.isUploading = false
292
+  proxy.$refs.uploadRef.handleRemove(file)
293
+  proxy.$alert(
294
+    "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
295
+      response.msg +
296
+      '</div>',
297
+    '导入结果',
298
+    { dangerouslyUseHTMLString: true }
299
+  )
300
+  getList()
301
+}
302
+
303
+const submitFileForm = () => {
304
+  proxy.$refs.uploadRef.submit()
305
+}
306
+
307
+onMounted(() => {
308
+  getList()
309
+})
310
+</script>
311
+
312
+<style scoped lang="less">
313
+.app-container {
314
+  padding: 20px;
315
+}
316
+
317
+.filter-container {
318
+  margin-bottom: 10px;
319
+}
320
+
321
+.operation-container {
322
+  margin-top: 10px;
323
+}
324
+</style>

+ 0 - 0
src/views/performanceManage/exemptEvaluation/月度免考核人员


+ 2 - 2
src/views/system/user/components/UserInfoEdit.vue

@@ -100,7 +100,7 @@
100
               </el-select>
100
               </el-select>
101
             </el-form-item>
101
             </el-form-item>
102
           </el-col>
102
           </el-col>
103
-          <el-col :span="12">
103
+          <!-- <el-col :span="12">
104
             <el-form-item label="是否参加考核" prop="takeAssessment">
104
             <el-form-item label="是否参加考核" prop="takeAssessment">
105
               <el-radio-group v-model="form.takeAssessment">
105
               <el-radio-group v-model="form.takeAssessment">
106
                 <el-radio :value="'Y'">是</el-radio>
106
                 <el-radio :value="'Y'">是</el-radio>
@@ -128,7 +128,7 @@
128
                 </el-form-item>
128
                 </el-form-item>
129
               </el-col>
129
               </el-col>
130
             </el-row>
130
             </el-row>
131
-          </el-col>
131
+          </el-col> -->
132
           <el-col :span="12">
132
           <el-col :span="12">
133
             <el-form-item label="岗位" prop="post">
133
             <el-form-item label="岗位" prop="post">
134
               <el-select v-model="form.post" placeholder="请选择岗位">
134
               <el-select v-model="form.post" placeholder="请选择岗位">