diff --git a/test_client/src/api/candidate.js b/test_client/src/api/candidate.js
index 4374232..7847e2d 100644
--- a/test_client/src/api/candidate.js
+++ b/test_client/src/api/candidate.js
@@ -6,4 +6,21 @@ export function getCandidateList(query) {
method: 'get',
params:query
})
+}
+
+export function createCandidate(data){
+
+ return request({
+ url:'/crm/candidate/',
+ method: 'post',
+ data
+ })
+}
+
+export function updateCandidate(id, data) {
+ return request({
+ url: `/crm/candidate/${id}/`,
+ method: 'put',
+ data
+ })
}
\ No newline at end of file
diff --git a/test_client/src/views/exam/issue.vue b/test_client/src/views/exam/issue.vue
index d1a8618..ddf07db 100644
--- a/test_client/src/views/exam/issue.vue
+++ b/test_client/src/views/exam/issue.vue
@@ -1,96 +1,235 @@
-
-
-
+
+ 刷新重置
-
-
-
刷新重置
+ 手动创建
+
+
+
+
+ {{ scope.row.number }}
+
+
+ {{ scope.row.consumer_name }}
+
+
+ {{ scope.row.ID_number }}
+
+
+ {{ scope.row.workscope_name }}
+
+
+ {{ scope.row.company_name }}
+
+
+ {{ scope.row.start_date }}
+
+
+ {{ scope.row.end_date }}
+
+
+
+ 是
+ 否
-
- {{ scope.row.number }}
-
-
- {{ scope.row.consumer_name }}
-
-
- {{ scope.row.ID_number }}
-
-
- {{ scope.row.workscope_name }}
-
-
- {{ scope.row.company_name }}
-
-
- {{ scope.row.start_date }}
-
-
- {{ scope.row.end_date }}
-
-
-
- {{ scope.row.create_admin_username }}
-
-
-
-
- 查看证书
-
-
-
+
+
+
+ {{ scope.row.create_admin_username }}
+
+
+
+
+ 查看证书
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确认
+
+
-
+
diff --git a/test_server/crm/migrations/0036_auto_20220209_0912.py b/test_server/crm/migrations/0036_auto_20220209_0912.py
new file mode 100644
index 0000000..3fb6712
--- /dev/null
+++ b/test_server/crm/migrations/0036_auto_20220209_0912.py
@@ -0,0 +1,35 @@
+# Generated by Django 3.0.4 on 2022-02-09 01:12
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('examtest', '0032_auto_20210613_2234'),
+ ('crm', '0035_auto_20210622_1420'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='candidate',
+ name='examtest_date',
+ field=models.DateField(blank=True, null=True, verbose_name='考试时间'),
+ ),
+ migrations.AddField(
+ model_name='candidate',
+ name='is_manual',
+ field=models.BooleanField(default=False, verbose_name='是否手动创建'),
+ ),
+ migrations.AlterField(
+ model_name='candidate',
+ name='consumer',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='candidate_consumer', to='crm.Consumer'),
+ ),
+ migrations.AlterField(
+ model_name='candidate',
+ name='workscope',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='candidate_workscope', to='examtest.WorkScope'),
+ ),
+ ]
diff --git a/test_server/crm/migrations/0037_candidate_photo.py b/test_server/crm/migrations/0037_candidate_photo.py
new file mode 100644
index 0000000..0dbe28f
--- /dev/null
+++ b/test_server/crm/migrations/0037_candidate_photo.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.4 on 2022-02-09 02:15
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('crm', '0036_auto_20220209_0912'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='candidate',
+ name='photo',
+ field=models.CharField(blank=True, max_length=200, null=True, verbose_name='照片'),
+ ),
+ ]
diff --git a/test_server/crm/migrations/0038_candidate_gender.py b/test_server/crm/migrations/0038_candidate_gender.py
new file mode 100644
index 0000000..6272c27
--- /dev/null
+++ b/test_server/crm/migrations/0038_candidate_gender.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.4 on 2022-02-09 03:00
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('crm', '0037_candidate_photo'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='candidate',
+ name='gender',
+ field=models.CharField(default='男', max_length=6, verbose_name='性别'),
+ ),
+ ]
diff --git a/test_server/crm/migrations/0039_remove_candidate_gender.py b/test_server/crm/migrations/0039_remove_candidate_gender.py
new file mode 100644
index 0000000..0515da4
--- /dev/null
+++ b/test_server/crm/migrations/0039_remove_candidate_gender.py
@@ -0,0 +1,17 @@
+# Generated by Django 3.0.4 on 2022-02-09 03:09
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('crm', '0038_candidate_gender'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='candidate',
+ name='gender',
+ ),
+ ]
diff --git a/test_server/crm/models.py b/test_server/crm/models.py
index 48290f4..357c193 100644
--- a/test_server/crm/models.py
+++ b/test_server/crm/models.py
@@ -105,9 +105,10 @@ class SendCode(CommonModel):
code = models.CharField(max_length=6, verbose_name= '验证码')
class Candidate(CommonModel):
- consumer = models.ForeignKey(Consumer, on_delete=models.DO_NOTHING, related_name='candidate_consumer')
- workscope = models.ForeignKey(WorkScope, on_delete=models.DO_NOTHING, related_name='candidate_workscope')
-
+ consumer = models.ForeignKey(Consumer, on_delete=models.DO_NOTHING, related_name='candidate_consumer', null=True, blank=True)
+ workscope = models.ForeignKey(WorkScope, on_delete=models.DO_NOTHING, related_name='candidate_workscope', null=True, blank=True)
+ examtest = models.OneToOneField(to='examtest.examtest', verbose_name='关联考试', null=True, blank=True, on_delete=models.DO_NOTHING)
+ is_manual = models.BooleanField('是否手动创建', default=False)
# 下面是证书信息
number = models.CharField('报告单号', max_length=60, null=True, blank=True)
@@ -119,8 +120,10 @@ class Candidate(CommonModel):
issue_date = models.DateField('发证日期', null=True, blank=True)
start_date = models.DateField('有效期始', null=True, blank=True)
end_date = models.DateField('有效期止', null=True, blank=True)
- examtest = models.OneToOneField(to='examtest.examtest', verbose_name='关联考试', null=True, blank=True, on_delete=models.DO_NOTHING)
+ examtest_date = models.DateField('考试时间', null=True, blank=True)
+ photo = models.CharField('照片', max_length=200, null=True, blank=True)
create_admin = models.ForeignKey(UserProfile, verbose_name="创建管理员", null=True, blank=True, on_delete=models.SET_NULL)
+
class Meta:
verbose_name = '证书'
verbose_name_plural = verbose_name
diff --git a/test_server/crm/serializers.py b/test_server/crm/serializers.py
index f2f55cb..aef0459 100644
--- a/test_server/crm/serializers.py
+++ b/test_server/crm/serializers.py
@@ -1,3 +1,4 @@
+from operator import truediv
from rest_framework import serializers
from .models import Candidate, Company, Consumer, PaySubject, ConsumerPerm, ConsumerRole, SendCode
from question.models import Question, Questioncat
@@ -80,6 +81,16 @@ class CandidateSerializer(serializers.ModelSerializer):
class Meta:
model = Candidate
fields = '__all__'
+
+class CandidateCreateSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = Candidate
+ exclude = ['consumer', 'examtest', 'workscope', 'is_manual', 'create_admin']
+
+ def create(self, validated_data):
+ validated_data['is_manual'] = True
+ validated_data['create_admin'] = self.context['request'].user
+ return super().create(validated_data)
class MsgSerializer(serializers.ModelSerializer):
class Meta:
diff --git a/test_server/crm/templates/index.html b/test_server/crm/templates/index.html
index 7de1619..f87cf10 100644
--- a/test_server/crm/templates/index.html
+++ b/test_server/crm/templates/index.html
@@ -103,7 +103,12 @@
-
Ⅲ类射线装置辐射工作人员
+
+ {% if candidate.is_manual %}
+ 核技术利用辐射安全与防护考核
+ {% else %}
+ Ⅲ类射线装置辐射工作人员
+ {% endif %}
-
+ draggable="true">
+ {% endif %}
+
{{candidate.consumer_name}},
-
+ {{candidate.msg.sex}},
+ {{candidate.msg.year}}年{{candidate.msg.month}}月{{candidate.msg.day}}日生,
身份证:{{candidate.ID_number}},于
- {{candidate.examtest.start_time|date}}参加
+ {{candidate.examtest_date|date}}参加
{{candidate.workscope_name}} 辐射安全与防护考核,成绩合格。
diff --git a/test_server/crm/views.py b/test_server/crm/views.py
index 70f4dc3..e183f31 100644
--- a/test_server/crm/views.py
+++ b/test_server/crm/views.py
@@ -11,7 +11,7 @@ from openpyxl import Workbook, load_workbook
from rest_framework import status
from rest_framework.decorators import action, authentication_classes, permission_classes
from rest_framework.filters import OrderingFilter, SearchFilter
-from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin
+from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
@@ -29,7 +29,7 @@ from utils.custom import CommonPagination
from .filters import ConsumerFilter
from .exports import export_consumer
from .models import Candidate, Company, Consumer, PaySubject, SendCode, ConsumerPerm, ConsumerRole
-from .serializers import CandidateSerializer, CompanySerializer, ConsumerSerializer, ConsumerPermSerializer, ConsumerRoleSerializer, ConsumerDetailSerializer, MsgSerializer
+from .serializers import CandidateCreateSerializer, CandidateSerializer, CompanySerializer, ConsumerSerializer, ConsumerPermSerializer, ConsumerRoleSerializer, ConsumerDetailSerializer, MsgSerializer
from lxml import etree
from rbac.models import UserProfile
from django.http import Http404
@@ -660,18 +660,31 @@ def candidate(request):
if request.GET.get('id', None):
try:
candidate = Candidate.objects.get(id=request.GET.get('id'), number__isnull=False)
+ candidate.msg = get_msg_from_id(candidate.ID_number)
return render(request, 'index.html', {"candidate":candidate})
except:
raise Http404
raise Http404
+def get_msg_from_id(id_number):
+ year=id_number[6:10]
+ month=id_number[10:12]
+ day=id_number[12:14]
+ sex=id_number[16:17]
+ sex=int(sex)
+ if sex%2:
+ sex="男"
+ else:
+ sex="女"
+ return {'year':year, 'month':month, 'day':day, 'sex':sex}
+
from examtest.exports import exportw_test
-class CandidateViewSet(RetrieveModelMixin, ListModelMixin, GenericViewSet):
+class CandidateViewSet(RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, GenericViewSet):
"""
出征记录:列表
"""
perms_map = [
- {'get': '*'}, {'post': 'candidate_issue'},
+ {'get': '*'}, {'post': 'candidate_create'},
{'put': 'candidate_update'}, {'delete': 'candidate_delete'}]
queryset = Candidate.objects.filter(number__isnull=False)
serializer_class = CandidateSerializer
@@ -682,11 +695,17 @@ class CandidateViewSet(RetrieveModelMixin, ListModelMixin, GenericViewSet):
ordering_fields = ('-id', 'update_time')
ordering = ['-update_time']
+ def get_serializer_class(self):
+ if self.action in ['create', 'update']:
+ return CandidateCreateSerializer
+ return super().get_serializer_class()
+
def get_authenticators(self):
- if self.detail:
+ if self.detail and self.request.method == 'GET':
return []
return super().get_authenticators()
+
def get_permissions(self):
if self.action == 'retrieve':
return []
diff --git a/test_server/develop/__init__.py b/test_server/develop/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/test_server/develop/admin.py b/test_server/develop/admin.py
new file mode 100644
index 0000000..8c38f3f
--- /dev/null
+++ b/test_server/develop/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/test_server/develop/apps.py b/test_server/develop/apps.py
new file mode 100644
index 0000000..444741b
--- /dev/null
+++ b/test_server/develop/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class DevelopConfig(AppConfig):
+ name = 'develop'
diff --git a/test_server/develop/models.py b/test_server/develop/models.py
new file mode 100644
index 0000000..71a8362
--- /dev/null
+++ b/test_server/develop/models.py
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/test_server/develop/tests.py b/test_server/develop/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/test_server/develop/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/test_server/develop/urls.py b/test_server/develop/urls.py
new file mode 100644
index 0000000..3bc7496
--- /dev/null
+++ b/test_server/develop/urls.py
@@ -0,0 +1,9 @@
+from django.urls import path,include
+from .views import *
+
+
+
+
+urlpatterns = [
+ # path('correct_candidate/', CorrectCandidate.as_view()),
+]
diff --git a/test_server/develop/views.py b/test_server/develop/views.py
new file mode 100644
index 0000000..1082697
--- /dev/null
+++ b/test_server/develop/views.py
@@ -0,0 +1,17 @@
+from django.shortcuts import render
+from requests.api import request
+from rest_framework.views import APIView
+from rest_framework.response import Response
+
+from crm.models import Candidate
+
+class CorrectCandidate(APIView):
+ authentication_classes = []
+ permission_classes = []
+ def get(self, request, *args, **kwargs):
+ for i in Candidate.objects.all():
+ if i.examtest:
+ i.examtest_date = i.examtest.start_time.date()
+ i.save()
+
+ return Response()
\ No newline at end of file
diff --git a/test_server/examtest/views.py b/test_server/examtest/views.py
index d3237b5..cd563c2 100644
--- a/test_server/examtest/views.py
+++ b/test_server/examtest/views.py
@@ -533,6 +533,7 @@ class ExamTestViewSet(PageOrNot, ModelViewSet):
candidate.issue_date = now
candidate.start_date = now
candidate.end_date = now + timedelta(days=5*365) # 5年有效期
+ candidate.examtest_date = obj.start_time.date()
candidate.workscope_name = obj.workscope.name
candidate.consumer_name = obj.consumer_detail['name']
candidate.ID_number = obj.consumer_detail['ID_number']
diff --git a/test_server/server/settings.py b/test_server/server/settings.py
index e1d3c49..85d948e 100644
--- a/test_server/server/settings.py
+++ b/test_server/server/settings.py
@@ -48,7 +48,8 @@ INSTALLED_APPS = [
'examtest',
'analyse',
'cms',
- 'qtest'
+ 'qtest',
+ 'develop'
]
MIDDLEWARE = [
diff --git a/test_server/server/urls.py b/test_server/server/urls.py
index 9ecf85c..c6cc82f 100644
--- a/test_server/server/urls.py
+++ b/test_server/server/urls.py
@@ -25,6 +25,7 @@ from utils.view import redirect
urlpatterns = [
path('rbac/', include('rbac.urls')),
+ path('develop/', include('develop.urls')),
path('crm/', include('crm.urls')),
path('question/', include('question.urls')),
path('examtest/', include('examtest.urls')),