当前状态
- {{project.status}}
+ {{project.state}}
任务下达人
@@ -145,7 +145,7 @@
-->
- {{ scope.row.status}}
+ {{ scope.row.state}}
- {{ scope.row.status}}
+ {{ scope.row.state}}
{{ scope.row.create_by_.name}}
@@ -111,7 +111,7 @@
- {{ scope.row.status}}
+ {{ scope.row.state}}
{{ scope.row.create_by_.name}}
@@ -139,7 +139,7 @@ export default {
tableData: [],
listLoading: true,
listQuery: {
- status: "已受理",
+ state: "已受理",
},
deptOptions: [],
field_list: [],
@@ -166,7 +166,7 @@ export default {
},
resetFilter() {
this.listQuery = {
- status: "已受理",
+ state: "已受理",
};
this.getList();
},
diff --git a/client/src/views/project/project.vue b/client/src/views/project/project.vue
index 761c364..292441d 100644
--- a/client/src/views/project/project.vue
+++ b/client/src/views/project/project.vue
@@ -30,7 +30,7 @@
- {{ scope.row.status}}
+ {{ scope.row.state}}
{{ scope.row.create_by_.name}}
@@ -44,7 +44,7 @@
- {{ scope.row.status}}
+ {{ scope.row.state}}
{{ scope.row.create_by_.name}}
@@ -193,7 +193,7 @@ export default {
listQuery: {
page:1,
page_size:20,
- status: "已受理",
+ state: "已受理",
},
listQuery_project: {
page:1,
@@ -262,7 +262,7 @@ export default {
},
resetFilter() {
this.listQuery = {
- status: "已受理",
+ state: "已受理",
};
this.getCertappList_();
},
diff --git a/server/apps/certificate/migrations/0002_auto_20201009_1106.py b/server/apps/certificate/migrations/0002_auto_20201009_1106.py
new file mode 100644
index 0000000..2b0b203
--- /dev/null
+++ b/server/apps/certificate/migrations/0002_auto_20201009_1106.py
@@ -0,0 +1,35 @@
+# Generated by Django 3.0.7 on 2020-10-09 03:06
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('system', '0031_delete_bscodeset'),
+ ('certificate', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='certificate',
+ options={'verbose_name': '证书', 'verbose_name_plural': '证书'},
+ ),
+ migrations.RemoveField(
+ model_name='certificate',
+ name='enterprise',
+ ),
+ migrations.AddField(
+ model_name='certificate',
+ name='number',
+ field=models.CharField(default=1, max_length=100, verbose_name='证书编号'),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name='certificate',
+ name='state',
+ field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='system.Dict', verbose_name='证书状态'),
+ preserve_default=False,
+ ),
+ ]
diff --git a/server/apps/certificate/migrations/0003_auto_20201009_1142.py b/server/apps/certificate/migrations/0003_auto_20201009_1142.py
new file mode 100644
index 0000000..73fd223
--- /dev/null
+++ b/server/apps/certificate/migrations/0003_auto_20201009_1142.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.7 on 2020-10-09 03:42
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('certificate', '0002_auto_20201009_1106'),
+ ]
+
+ operations = [
+ migrations.RenameField(
+ model_name='certificate',
+ old_name='state',
+ new_name='status',
+ ),
+ ]
diff --git a/server/apps/certificate/migrations/0004_auto_20201009_1550.py b/server/apps/certificate/migrations/0004_auto_20201009_1550.py
new file mode 100644
index 0000000..6b80dff
--- /dev/null
+++ b/server/apps/certificate/migrations/0004_auto_20201009_1550.py
@@ -0,0 +1,20 @@
+# Generated by Django 3.0.7 on 2020-10-09 07:50
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('crm', '0015_certunit_testorgs'),
+ ('certificate', '0003_auto_20201009_1142'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='certificate',
+ name='certunit',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='certificate_certunit', to='crm.Certunit', verbose_name='关联单元'),
+ ),
+ ]
diff --git a/server/apps/certificate/models.py b/server/apps/certificate/models.py
index 94f6ddb..f869c0f 100644
--- a/server/apps/certificate/models.py
+++ b/server/apps/certificate/models.py
@@ -8,8 +8,16 @@ class Certificate(CommonAModel):
"""
证书表
"""
- certunit = models.ForeignKey('crm.Certunit', on_delete=models.CASCADE, null=True, blank=True, verbose_name='关联单元')
- enterprise = models.ForeignKey('crm.Enterprise', on_delete=models.CASCADE, verbose_name='所属公司')
+ number = models.CharField('证书编号', max_length=100)
+ certunit = models.ForeignKey('crm.Certunit', on_delete=models.CASCADE, null=True, blank=True, verbose_name='关联单元', related_name='certificate_certunit')
first_send = models.DateField('证书首发时间')
used_start = models.DateField('有效期开始')
used_end = models.DateField('有效期结束')
+ status = models.ForeignKey(Dict, verbose_name='证书状态', on_delete=models.CASCADE)
+
+ class Meta:
+ verbose_name = '证书'
+ verbose_name_plural = verbose_name
+
+ def __str__(self):
+ return self.number
diff --git a/server/apps/certificate/serializers.py b/server/apps/certificate/serializers.py
new file mode 100644
index 0000000..b8c21ea
--- /dev/null
+++ b/server/apps/certificate/serializers.py
@@ -0,0 +1,22 @@
+from rest_framework import serializers
+
+from .models import *
+from apps.system.serializers import DictSerializer
+
+
+class CertificateSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = Certificate
+ fields = '__all__'
+
+class CertificateCreateSerializer(serializers.ModelSerializer):
+ number = serializers.CharField(read_only = True)
+ status = serializers.CharField(read_only = True)
+ class Meta:
+ model = Certificate
+ fields = '__all__'
+
+class CertificateSimpleSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = Certificate
+ fields = ['id', 'number']
\ No newline at end of file
diff --git a/server/apps/certificate/urls.py b/server/apps/certificate/urls.py
new file mode 100644
index 0000000..fff16f4
--- /dev/null
+++ b/server/apps/certificate/urls.py
@@ -0,0 +1,10 @@
+from django.urls import path, include
+from .views import *
+from rest_framework import routers
+
+router = routers.DefaultRouter()
+router.register('certificate', CertificateViewSet, basename="certificate")
+
+urlpatterns = [
+ path('', include(router.urls))
+]
\ No newline at end of file
diff --git a/server/apps/certificate/views.py b/server/apps/certificate/views.py
index 91ea44a..e9b81a5 100644
--- a/server/apps/certificate/views.py
+++ b/server/apps/certificate/views.py
@@ -1,3 +1,38 @@
+from apps.certificate.serializers import CertificateSerializer
+import re
+from django.http import request
+from rest_framework.views import APIView
from django.shortcuts import render
-
+from rest_framework.serializers import ModelSerializer
+from rest_framework.viewsets import ModelViewSet, GenericViewSet
+from rest_framework.response import Response
+from rest_framework import status
+from .models import *
+from apps.system.models import Dict
+from apps.system.permission_data import RbacFilterSet
+from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin
+import random
+from rest_framework.decorators import action
+from utils.pagination import PageOrNot
+from .serializers import *
+from rest_framework.exceptions import ParseError, NotAuthenticated
+from django.utils import timezone
# Create your views here.
+
+class CertificateViewSet(PageOrNot, OptimizationMixin, ModelViewSet):
+ perms_map = {'get': 'certificate_view', 'post':'certificate_create', 'put':'certificate_update'}
+ queryset = Certificate.objects.all()
+ serializer_class = CertificateSerializer
+ ordering = ['-create_time']
+
+ def create(self, request, *args, **kwargs):
+ """
+ 证书颁发
+ """
+ serializer = CertificateCreateSerializer(data=request.data)
+ serializer.is_valid(raise_exception=True)
+ if Certificate.objects.filter(certunit__id=request.data['certunit']).exists():
+ return Response('该认证单元已存在证书', status = status.HTTP_400_BAD_REQUEST)
+ serializer.save(create_by = self.request.user, number = 'ZS' + str(random.randrange(2000,3000)), status = Dict.objects.get(code='validate_01'))
+ headers = self.get_success_headers(serializer.data)
+ return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
\ No newline at end of file
diff --git a/server/apps/crm/views.py b/server/apps/crm/views.py
index 607b76a..a36ca9a 100644
--- a/server/apps/crm/views.py
+++ b/server/apps/crm/views.py
@@ -9,6 +9,7 @@ from apps.system.permission_data import RbacFilterSet
from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin
from rest_framework.response import Response
from rest_framework import status
+from rest_framework.decorators import action
# Create your views here.
class EnterpriseViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
diff --git a/server/apps/laboratory/models.py b/server/apps/laboratory/models.py
index 291517d..32c49df 100644
--- a/server/apps/laboratory/models.py
+++ b/server/apps/laboratory/models.py
@@ -37,9 +37,6 @@ class TestOrgNotice(CommonBModel):
def __str__(self):
return self.name
-class DetectionTask(CommonBModel):
-
- testorg = models.ForeignKey(TestOrg,verbose_name='检测机构', related_name='detectionTask_testorg', on_delete=models.DO_NOTHING)
diff --git a/server/apps/project/filters.py b/server/apps/project/filters.py
index 0090c0c..b57195d 100644
--- a/server/apps/project/filters.py
+++ b/server/apps/project/filters.py
@@ -5,10 +5,10 @@ class CertAppFilter(filters.FilterSet):
noproject = filters.BooleanFilter(field_name='project', lookup_expr='isnull')
class Meta:
model = CertApp
- fields = ['status', 'noproject']
+ fields = ['state', 'noproject']
class ProjectFilter(filters.FilterSet):
planoff = filters.BooleanFilter(field_name='plan', lookup_expr='isnull')
class Meta:
model = Project
- fields = ['plan', 'planoff', 'status', 'certapp_project__member_certapp__user']
\ No newline at end of file
+ fields = ['plan', 'planoff', 'state', 'certapp_project__member_certapp__user']
\ No newline at end of file
diff --git a/server/apps/project/migrations/0040_merge_20201009_1104.py b/server/apps/project/migrations/0040_merge_20201009_1104.py
new file mode 100644
index 0000000..262227b
--- /dev/null
+++ b/server/apps/project/migrations/0040_merge_20201009_1104.py
@@ -0,0 +1,14 @@
+# Generated by Django 3.0.7 on 2020-10-09 03:04
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('project', '0034_evaluationdetail_result'),
+ ('project', '0039_auto_20200929_1605'),
+ ]
+
+ operations = [
+ ]
diff --git a/server/apps/project/migrations/0041_auto_20201009_1518.py b/server/apps/project/migrations/0041_auto_20201009_1518.py
new file mode 100644
index 0000000..44e7072
--- /dev/null
+++ b/server/apps/project/migrations/0041_auto_20201009_1518.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.0.7 on 2020-10-09 07:18
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('project', '0040_merge_20201009_1104'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='certapp',
+ name='status',
+ field=models.CharField(choices=[('申请', '申请'), ('受理', '受理'), ('策划', '策划'), ('现场审核', '现场审核'), ('产品检测', '产品检测'), ('评定', '评定'), ('出证', '出证'), ('归档', '归档')], default='申请', max_length=50, verbose_name='申请状态'),
+ ),
+ migrations.AlterField(
+ model_name='project',
+ name='status',
+ field=models.CharField(choices=[('创建中', '创建中'), ('待策划', '待策划'), ('策划中', '策划中'), ('审核任务已下达', '审核任务已下达'), ('审核任务已接受', '审核任务已接受'), ('待现场审核', '待现场审核'), ('现场审核中', '现场审核中'), ('任务已反馈', '任务已反馈'), ('归档', '归档')], default='创建中', max_length=50, verbose_name='项目状态'),
+ ),
+ ]
diff --git a/server/apps/project/migrations/0042_auto_20201009_1550.py b/server/apps/project/migrations/0042_auto_20201009_1550.py
new file mode 100644
index 0000000..0d945d3
--- /dev/null
+++ b/server/apps/project/migrations/0042_auto_20201009_1550.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.0.7 on 2020-10-09 07:50
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('project', '0041_auto_20201009_1518'),
+ ]
+
+ operations = [
+ migrations.RenameField(
+ model_name='certapp',
+ old_name='status',
+ new_name='state',
+ ),
+ migrations.RenameField(
+ model_name='project',
+ old_name='status',
+ new_name='state',
+ ),
+ ]
diff --git a/server/apps/project/models.py b/server/apps/project/models.py
index 9fb17f2..708545e 100644
--- a/server/apps/project/models.py
+++ b/server/apps/project/models.py
@@ -15,7 +15,7 @@ class Project(CommonBModel):
"""
认证项目
"""
- status_choices = (
+ state_choices = (
('创建中', '创建中'),
('待策划', '待策划'),
('策划中', '策划中'),
@@ -23,9 +23,10 @@ class Project(CommonBModel):
('审核任务已接受', '审核任务已接受'),
('待现场审核', '待现场审核'),
('现场审核中', '现场审核中'),
- ('任务已反馈', '任务已反馈')
+ ('任务已反馈', '任务已反馈'),
+ ('归档', '归档')
)
- status = models.CharField('项目状态', choices=status_choices, default='创建中', max_length=50)
+ state = models.CharField('项目状态', choices=state_choices, default='创建中', max_length=50)
number = models.CharField('项目编号', max_length = 100, null=True, blank=True)
auditee = models.ForeignKey(Enterprise, related_name='project_auditee', on_delete=models.DO_NOTHING, verbose_name='受审核方')
auditee_v = JSONField(verbose_name='受审核方', default=dict)
@@ -50,13 +51,15 @@ class CertApp(CommonBModel):
"""
认证受理
"""
- status_choices = (
- ('草稿', '草稿'),
- ('已申请', '已申请'),
- ('已受理', '已受理'),
- ('进行中', '进行中'),
- ('已中止', '已中止'),
- ('已完成', '已完成')
+ state_choices = (
+ ('申请', '申请'),
+ ('受理', '受理'),
+ ('策划', '策划'),
+ ('现场审核', '现场审核'),
+ ('产品检测', '产品检测'),
+ ('评定', '评定'),
+ ('出证', '出证'),
+ ('归档', '归档'),
)
result_choices = (
('未评审', '未评审'),
@@ -71,7 +74,7 @@ class CertApp(CommonBModel):
applicant_v = JSONField(verbose_name='申请方')
applicant = models.ForeignKey(Enterprise, related_name='certapp_applicant', on_delete=models.DO_NOTHING)
- status = models.CharField('申请状态', choices=status_choices, default='草稿', max_length=50)
+ state = models.CharField('申请状态', choices=state_choices, default='申请', max_length=50)
evresult = models.CharField('评审结论', choices = result_choices, default='未评审', max_length=50)
evremark = models.TextField('备注', blank=True)
level = models.ForeignKey(Dict, verbose_name='业务级别', related_name='certapp_level', on_delete=models.DO_NOTHING, default=Dict.objects.get(code='ybxm').id)
diff --git a/server/apps/project/serializers.py b/server/apps/project/serializers.py
index 95b9fd6..74058b3 100644
--- a/server/apps/project/serializers.py
+++ b/server/apps/project/serializers.py
@@ -1,3 +1,4 @@
+from apps.project.filters import CertAppFilter
from apps.plan.models import Plan
from rest_framework import serializers
@@ -56,10 +57,11 @@ class CertappSerializer(serializers.ModelSerializer):
return queryset
from apps.crm.serializers import CertunitSimpleSerializer
+from apps.certificate.models import Certificate
class CertappunitSerializer(serializers.ModelSerializer):
certunit_ = CertunitSimpleSerializer(source = 'certunit', read_only=True)
decision_ = DictSimpleSerializer(source = 'decision', read_only=True)
-
+ certificate_ = serializers.SerializerMethodField()
class Meta:
model = Certappunit
fields = '__all__'
@@ -69,6 +71,13 @@ class CertappunitSerializer(serializers.ModelSerializer):
""" Perform necessary eager loading of data. """
queryset = queryset.select_related('certunit','decision')
return queryset
+
+ def get_certificate_(self, obj):
+ certificates = Certificate.objects.filter(certunit = obj.certunit).order_by('-create_time')
+ if certificates.exists():
+ certificate = certificates[0]
+ return {'id':certificate.id,'number':certificate.number}
+ return None
class EvaluationDetailSerializer(serializers.ModelSerializer):
class Meta:
diff --git a/server/apps/project/views.py b/server/apps/project/views.py
index ea4b4a8..918e73b 100644
--- a/server/apps/project/views.py
+++ b/server/apps/project/views.py
@@ -77,7 +77,7 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
queryset = CertApp.objects.all()
serializer_class = CertappSerializer
ordering = ['-create_time']
- filterset_fields = ['status', 'project']
+ filterset_fields = ['state', 'project']
# filterset_class = CertAppFilter
@@ -99,7 +99,7 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
完成受理
"""
obj = self.get_object()
- obj.status = '已受理'
+ obj.state = '策划'
obj.save()
return Response(status=status.HTTP_200_OK)
@@ -127,6 +127,7 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
instance = self.get_object()
instance.conclusion = Dict.objects.get(pk=request.data['conclusion'])
instance.score = request.data['score']
+ instance.state = '出证'
instance.save()
instance.nonitems.clear()
instance.nonitems.add(*request.data['nonitems'])
@@ -196,7 +197,7 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet):
if self.request.user is not None:
instance = serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept)
if 'certapps' in postdata and postdata['certapps']:
- CertApp.objects.filter(pk__in = postdata['certapps']).update(project=instance, status='进行中')
+ CertApp.objects.filter(pk__in = postdata['certapps']).update(project=instance, state='进行中')
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
else:
@@ -209,12 +210,12 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet):
项目流转
"""
obj = self.get_object()
- if obj.status == '创建中':
- obj.status = '待策划'
+ if obj.state == '创建中':
+ obj.state = '待策划'
obj.save()
return Response(status=status.HTTP_200_OK)
- elif obj.status == '策划中' and obj.can_paichai:
- obj.status = '待现场审核'
+ elif obj.state == '策划中' and obj.can_paichai:
+ obj.state = '待现场审核'
obj.save()
return Response(status=status.HTTP_200_OK)
else:
@@ -233,8 +234,8 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet):
objs = Project.objects.filter(pk__in=projects)
for i in objs:
i.plan=plan
- if i.status == '待策划':
- i.status == '策划中'
+ if i.state == '待策划':
+ i.state == '策划中'
i.save()
return Response(status=status.HTTP_200_OK)
diff --git a/server/server/urls.py b/server/server/urls.py
index ea43c9f..a69767d 100644
--- a/server/server/urls.py
+++ b/server/server/urls.py
@@ -40,6 +40,7 @@ urlpatterns = [
path('plan/', include('apps.plan.urls')),
path('audit/', include('apps.audit.urls')),
path('laboratory/', include('apps.laboratory.urls')),
+ path('certificate/', include('apps.certificate.urls')),
# path('accessment/', include('apps.accessment.urls')),
path('docs/', include_docs_urls(title="接口文档",
authentication_classes=[], permission_classes=[])),