From b053b0eea77e1d1258b28d17e74348a1eef1badc Mon Sep 17 00:00:00 2001 From: zty Date: Mon, 10 Mar 2025 16:09:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AF=81=E4=B9=A6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test_client/src/api/candidate.js | 8 ++++ test_client/src/views/exam/issue.vue | 46 ++++++++++++++++++++- test_server/crm/views.py | 61 ++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 1 deletion(-) diff --git a/test_client/src/api/candidate.js b/test_client/src/api/candidate.js index 7847e2d..d5fb260 100644 --- a/test_client/src/api/candidate.js +++ b/test_client/src/api/candidate.js @@ -17,6 +17,14 @@ export function createCandidate(data){ }) } +export function importCertificate(data){ + return request({ + url:'/crm/candidate/import/', + method: 'post', + data + }) +} + export function updateCandidate(id, data) { return request({ url: `/crm/candidate/${id}/`, diff --git a/test_client/src/views/exam/issue.vue b/test_client/src/views/exam/issue.vue index 978b455..014dff5 100644 --- a/test_client/src/views/exam/issue.vue +++ b/test_client/src/views/exam/issue.vue @@ -19,6 +19,23 @@ type="primary" @click="handleAdd" >手动创建 + +

导入题目前,请下载模板并按格式录入.

+
+ 下载模板 + + 上传导入 + +
+ 批量导入 +
@@ -267,6 +284,7 @@ import { getCandidateList, createCandidate, + importCertificate, updateCandidate } from '@/api/candidate' import { @@ -286,6 +304,7 @@ export default { components: { Pagination }, data() { return { + popovervisible: false, uploadUrl: process.env.VUE_APP_BASE_API, upHeaders: upHeaders(), upUrl: upUrl(), @@ -326,6 +345,31 @@ export default { handleAvatarSuccess(res, file) { this.candidate.photo = res.data.path }, + handleUploadSuccess(res, file) { + if (res.code == 200) { + const loading = this.$loading({ text: "正在导入中..." }) + importCertificate(res.data).then(response => { + loading.close() + if (response.code == 200) { + this.$message({ + message: '导入成功', + type: 'success' + }); + this.getList(listQuery) + } else if (response.code == 206) { + this.$message({ + message: '部分未成功' + response.data, + type: 'success' + }); + } else { + this.$message.error(response.msg); + } + + }); + } else { + this.$message.error("Excel上传失败!"); + } + }, getOpllevelName(value) { console.log(value, 'value') const numValue = Number(value) diff --git a/test_server/crm/views.py b/test_server/crm/views.py index b6b60d9..0e47e0d 100644 --- a/test_server/crm/views.py +++ b/test_server/crm/views.py @@ -795,7 +795,68 @@ class CandidateViewSet(RetrieveModelMixin, ListModelMixin, CreateModelMixin, Upd queryset = self.queryset.filter(consumer=request.user) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) + + @action(methods=['post'], detail=False, url_path='import', url_name='import_certificate') + def import_consumer(self, request): + """ + 导入证书 + """ + xlsxpath = request.data['path'] + fullpath = settings.BASE_DIR + xlsxpath + wb = load_workbook(fullpath) + sheet = wb.worksheets[0] + # 验证文件内容 + if sheet['a1'].value != '证书号': + return Response({"error":"证书号列错误!"}) + if sheet['b1'].value != '姓名': + return Response({"error":"姓名列错误!"}) + if sheet['c1'].value != '性别': + return Response({"error":"性别列错误!"}) + if sheet['d1'].value != '身份证号': + return Response({"error":"身份证号列错误!"}) + if sheet['e1'].value != '工作类别': + return Response({"error":"工作类别列错误!"}) + if sheet['f1'].value != '职业等级': + return Response({"error":"职业等级列错误!"}) + if sheet['g1'].value != '单位': + return Response({"error":"单位列错误!"}) + if sheet['h1'].value != '发证日期': + return Response({"error":"发证日期列错误!"}) + m = 2 + while sheet['B'+str(m)].value: + number = sheet['A'+str(m)].value + if number: + number = str(number).replace(' ', '') + consumer_name = sheet['B'+str(m)].value + if consumer_name: + consumer_name = str(consumer_name).replace(' ', '').replace("\n", "") + gender = sheet['C'+str(m)].value + if gender: + gender = str(gender).replace(' ', '').replace("\n", "") + ID_number = sheet['D'+str(m)].value + if ID_number: + ID_number = str(ID_number).replace(' ', '').replace("\n", "") + workscope_name = sheet['E'+str(m)].value + if workscope_name: + workscope_name = str(workscope_name).replace(' ', '').replace("\n", "") + opllevel = sheet['F'+str(m)].valueki + company_name = sheet['G'+str(m)].value + if company_name: + company_name = str(company_name).replace(' ', '').replace("\n", "") + issue_date = sheet['H'+str(m)].value + if issue_date: + # 检查时间格式是否为年月日 + try: + issue_date = datetime.strftime(issue_date, '%Y-%m-%d') + except ValueError: + return Response({"error":"发证日期格式错误!"}) + obj = Candidate(number=number, consumer_name=consumer_name, gender=gender,issue_date = issue_date, create_admin = self.request.user, + ID_number=ID_number, workscope_name=workscope_name, opllevel=opllevel, company_name=company_name) + obj.save() + m = m + 1 + return Response(status=status.HTTP_200_OK) + class MsgViewSet(CreateModelMixin, ListModelMixin, GenericViewSet): perms_map = [