diff --git a/client/src/api/certapp.js b/client/src/api/certapp.js
new file mode 100644
index 0000000..2934cd9
--- /dev/null
+++ b/client/src/api/certapp.js
@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+export function getCertappList(query) {
+ return request({
+ url: '/project/certapp/',
+ method: 'get',
+ params: query
+ })
+}
+
+export function createCertapp(data) {
+ return request({
+ url: '/project/certapp/',
+ method: 'post',
+ data
+ })
+}
+
+export function deleteCertapp(id) {
+ return request({
+ url: `/project/certapp/${id}/`,
+ method: 'delete'
+ })
+}
+
+
+export function updateCertapp(id, data) {
+ return request({
+ url: `/project/certapp/${id}/`,
+ method: 'put',
+ data
+ })
+}
+
+export function getCertapp(id) {
+ return request({
+ url: `/project/certapp/${id}/`,
+ method: 'get',
+ })
+}
diff --git a/client/src/router/index.js b/client/src/router/index.js
index d617d74..1e70e48 100644
--- a/client/src/router/index.js
+++ b/client/src/router/index.js
@@ -64,7 +64,7 @@ export const asyncRoutes = [
{
path: '/project',
component: Layout,
- redirect: '/project/application',
+ redirect: '/project/case',
name: 'ProjectManage',
meta: { title: '认证项目', icon: 'example'},
children: [
@@ -72,7 +72,13 @@ export const asyncRoutes = [
path: 'application',
name: 'Applicaion',
component: () => import('@/views/application/application'),
- meta: { title: '认证申请', icon: 'example', perms: ['application_view'] }
+ meta: { title: '认证受理', icon: 'example', perms: ['application_view'] }
+ },
+ {
+ path: 'certapp',
+ name: 'Certapp',
+ component: () => import('@/views/certapp/certapp'),
+ meta: { title: '认证受理', icon: 'example', perms: ['certapp_view'] }
},
{
path: 'application2',
@@ -87,6 +93,13 @@ export const asyncRoutes = [
meta: { title: '认证申请', icon: 'example', perms: ['application_create', 'application_update'] },
hidden: true
},
+ {
+ path: 'certapp/:action/:kind/',
+ name: 'CertappForm',
+ component: () => import('@/views/certapp/certappform'),
+ meta: { title: '认证受理单', icon: 'example', perms: ['certapp_create', 'certapp_update'] },
+ hidden: true
+ },
]
},
{
diff --git a/client/src/views/application/applicationform.vue b/client/src/views/application/applicationform.vue
index a75983c..1e92dc7 100644
--- a/client/src/views/application/applicationform.vue
+++ b/client/src/views/application/applicationform.vue
@@ -107,25 +107,25 @@
操作按钮
- {{item.cert_field_.name}}
+ 申请领域: {{item.cert_field_.name}}
- {{item.cccpv_class_.name}}
+ 产品分类: {{item.cccpv_class_.name}}
- {{item.name}}
+ CNAS分类: {{item.name}}
- {{formData.applicant_v.name}}
+ 申请方: {{formData.applicant_v.name}}
- {{item.manufacture_v.name}}
+ 制造商: {{item.manufacture_v.name}}
- {{item.factory_v.name}}
+ 生产厂: {{item.factory_v.name}}
- {{item.pattern}}
+ 申请模式: {{item.pattern}}
@@ -148,7 +148,11 @@
-
+
+
diff --git a/client/src/views/certapp/certapp.vue b/client/src/views/certapp/certapp.vue
new file mode 100644
index 0000000..3beec8c
--- /dev/null
+++ b/client/src/views/certapp/certapp.vue
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 刷新重置
+
+
+ {{item.name}}
+ +批量多体系
+
+
+
+
+ {{ scope.row.number }}
+
+
+
+ {{scope.row.cert_field_.name}}
+ {{scope.row.cccpv_class_.name}}
+
+
+
+
+ 申请方:{{ scope.row.applicant_v.name }}
+ 制造商:{{ scope.row.manufacture_v.name }}
+ 生产厂:{{ scope.row.factory_v.name }}
+
+
+
+ {{ scope.row.status}}
+
+
+ {{ scope.row.create_by_.name}}
+
+
+
+ {{ scope.row.create_time }}
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
diff --git a/client/src/views/certapp/certappform.vue b/client/src/views/certapp/certappform.vue
new file mode 100644
index 0000000..3b06059
--- /dev/null
+++ b/client/src/views/certapp/certappform.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/server/apps/project/migrations/0016_case.py b/server/apps/project/migrations/0016_case.py
new file mode 100644
index 0000000..d0e9028
--- /dev/null
+++ b/server/apps/project/migrations/0016_case.py
@@ -0,0 +1,54 @@
+# Generated by Django 3.0.7 on 2020-08-12 06:54
+
+from django.conf import settings
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('crm', '0011_enterprise_parent'),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('system', '0028_auto_20200807_1018'),
+ ('project', '0015_auto_20200807_1753'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Case',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
+ ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
+ ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
+ ('number', models.CharField(blank=True, max_length=100, null=True, verbose_name='受理编号')),
+ ('apply_date', models.DateField(blank=True, null=True, verbose_name='申请日期')),
+ ('accept_date', models.DateField(blank=True, null=True, verbose_name='受理日期')),
+ ('applicant_v', django.contrib.postgres.fields.jsonb.JSONField(verbose_name='申请方')),
+ ('status', models.CharField(choices=[('草稿', '草稿'), ('已申请', '已申请'), ('已受理', '已受理'), ('进行中', '进行中'), ('已中止', '已中止'), ('已完成', '已完成')], default='草稿', max_length=50, verbose_name='申请状态')),
+ ('evresult', models.CharField(choices=[('未评审', '未评审'), ('合格', '合格'), ('不合格', '不合格'), ('有条件放行', '有条件放行')], default='未评审', max_length=50, verbose_name='评审结论')),
+ ('evremark', models.TextField(blank=True, verbose_name='备注')),
+ ('is_approve', models.BooleanField(default=True, verbose_name='是否认可')),
+ ('pattern', models.CharField(blank=True, choices=[('正常', '正常'), ('ODM', 'ODM'), ('OEM', 'OEM')], max_length=50, null=True, verbose_name='申请模式')),
+ ('manufacture_v', django.contrib.postgres.fields.jsonb.JSONField(null=True, verbose_name='制造商')),
+ ('factory_v', django.contrib.postgres.fields.jsonb.JSONField(null=True, verbose_name='生产厂')),
+ ('applicant', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='case_applicant', to='crm.Enterprise')),
+ ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='case_belong_dept', to='system.Organization', verbose_name='所属部门')),
+ ('cccpv_class', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='case_cccpv_class', to='system.Dict', verbose_name='涉及CCC/PV分类')),
+ ('cert_field', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='case_cert_field', to='system.Dict', verbose_name='认证领域')),
+ ('cnas_scopes', models.ManyToManyField(blank=True, related_name='case_cnas_sopes', to='system.Dict', verbose_name='涉及cnas分类')),
+ ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='case_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
+ ('factory', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='case_factory', to='crm.Enterprise')),
+ ('manufacture', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='case_manufacture', to='crm.Enterprise')),
+ ('project', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='case_project', to='project.Project')),
+ ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='case_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
+ ],
+ options={
+ 'verbose_name': '认证受理',
+ 'verbose_name_plural': '认证受理',
+ },
+ ),
+ ]
diff --git a/server/apps/project/migrations/0017_auto_20200812_1654.py b/server/apps/project/migrations/0017_auto_20200812_1654.py
new file mode 100644
index 0000000..867a0df
--- /dev/null
+++ b/server/apps/project/migrations/0017_auto_20200812_1654.py
@@ -0,0 +1,57 @@
+# Generated by Django 3.0.7 on 2020-08-12 08:54
+
+from django.conf import settings
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('system', '0028_auto_20200807_1018'),
+ ('crm', '0011_enterprise_parent'),
+ ('project', '0016_case'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='CertApp',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
+ ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
+ ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
+ ('number', models.CharField(blank=True, max_length=100, null=True, verbose_name='受理编号')),
+ ('apply_date', models.DateField(blank=True, null=True, verbose_name='申请日期')),
+ ('accept_date', models.DateField(blank=True, null=True, verbose_name='受理日期')),
+ ('applicant_v', django.contrib.postgres.fields.jsonb.JSONField(verbose_name='申请方')),
+ ('status', models.CharField(choices=[('草稿', '草稿'), ('已申请', '已申请'), ('已受理', '已受理'), ('进行中', '进行中'), ('已中止', '已中止'), ('已完成', '已完成')], default='草稿', max_length=50, verbose_name='申请状态')),
+ ('evresult', models.CharField(choices=[('未评审', '未评审'), ('合格', '合格'), ('不合格', '不合格'), ('有条件放行', '有条件放行')], default='未评审', max_length=50, verbose_name='评审结论')),
+ ('evremark', models.TextField(blank=True, verbose_name='备注')),
+ ('is_approve', models.BooleanField(default=True, verbose_name='是否认可')),
+ ('pattern', models.CharField(blank=True, choices=[('正常', '正常'), ('ODM', 'ODM'), ('OEM', 'OEM')], max_length=50, null=True, verbose_name='申请模式')),
+ ('manufacture_v', django.contrib.postgres.fields.jsonb.JSONField(null=True, verbose_name='制造商')),
+ ('factory_v', django.contrib.postgres.fields.jsonb.JSONField(null=True, verbose_name='生产厂')),
+ ('applicant', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='certapp_applicant', to='crm.Enterprise')),
+ ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certapp_belong_dept', to='system.Organization', verbose_name='所属部门')),
+ ('cccpv_class', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='certapp_cccpv_class', to='system.Dict', verbose_name='涉及CCC/PV分类')),
+ ('cert_field', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='certapp_cert_field', to='system.Dict', verbose_name='认证领域')),
+ ('cnas_scopes', models.ManyToManyField(blank=True, related_name='certapp_cnas_sopes', to='system.Dict', verbose_name='涉及cnas分类')),
+ ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certapp_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
+ ('factory', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='certapp_factory', to='crm.Enterprise')),
+ ('manufacture', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='certapp_manufacture', to='crm.Enterprise')),
+ ('project', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certapp_project', to='project.Project')),
+ ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certapp_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
+ ],
+ options={
+ 'verbose_name': '认证受理',
+ 'verbose_name_plural': '认证受理',
+ },
+ ),
+ migrations.DeleteModel(
+ name='Case',
+ ),
+ ]
diff --git a/server/apps/project/migrations/0018_certapp_level.py b/server/apps/project/migrations/0018_certapp_level.py
new file mode 100644
index 0000000..0a1c0a0
--- /dev/null
+++ b/server/apps/project/migrations/0018_certapp_level.py
@@ -0,0 +1,20 @@
+# Generated by Django 3.0.7 on 2020-08-13 06:39
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('system', '0028_auto_20200807_1018'),
+ ('project', '0017_auto_20200812_1654'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='certapp',
+ name='level',
+ field=models.ForeignKey(default=111, on_delete=django.db.models.deletion.DO_NOTHING, related_name='certapp_level', to='system.Dict', verbose_name='业务级别'),
+ ),
+ ]
diff --git a/server/apps/project/models.py b/server/apps/project/models.py
index dfcd8a3..888ec8d 100644
--- a/server/apps/project/models.py
+++ b/server/apps/project/models.py
@@ -15,7 +15,56 @@ class Project(CommonBModel):
认证项目
"""
pass
+
+class CertApp(CommonBModel):
+ """
+ 认证受理
+ """
+ status_choices = (
+ ('草稿', '草稿'),
+ ('已申请', '已申请'),
+ ('已受理', '已受理'),
+ ('进行中', '进行中'),
+ ('已中止', '已中止'),
+ ('已完成', '已完成')
+ )
+ result_choices = (
+ ('未评审', '未评审'),
+ ('合格', '合格'),
+ ('不合格', '不合格'),
+ ('有条件放行', '有条件放行')
+ )
+ number = models.CharField('受理编号', max_length = 100, null=True, blank=True)
+ apply_date = models.DateField('申请日期', null=True, blank=True)
+ accept_date = models.DateField('受理日期', null=True, blank=True)
+
+ 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)
+ 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)
+ pattern_choices = (
+ ('正常', '正常'),
+ ('ODM', 'ODM'),
+ ('OEM', 'OEM')
+ )
+ cert_field = models.ForeignKey(Dict, verbose_name='认证领域', related_name='certapp_cert_field', on_delete=models.DO_NOTHING)
+ cccpv_class = models.ForeignKey(Dict, verbose_name='涉及CCC/PV分类', related_name='certapp_cccpv_class', on_delete=models.DO_NOTHING, null=True, blank=True)
+ cnas_scopes = models.ManyToManyField(Dict, verbose_name='涉及cnas分类', related_name='certapp_cnas_sopes', blank=True)
+ project = models.ForeignKey(Project, related_name='certapp_project', on_delete=models.SET_NULL, null=True)
+ is_approve = models.BooleanField('是否认可', default=True)
+ pattern = models.CharField('申请模式', choices=pattern_choices, max_length=50, null=True, blank=True)
+ manufacture = models.ForeignKey(Enterprise, on_delete=models.CASCADE, related_name='certapp_manufacture', null=True, blank=True)
+ manufacture_v = JSONField(verbose_name='制造商', null=True)
+ factory = models.ForeignKey(Enterprise, on_delete=models.CASCADE, related_name='certapp_factory', null=True, blank=True)
+ factory_v = JSONField(verbose_name='生产厂', null=True)
+
+ class Meta:
+ verbose_name = '认证受理'
+ verbose_name_plural = verbose_name
+
class Application(CommonBModel):
"""
主申请
diff --git a/server/apps/project/serializers.py b/server/apps/project/serializers.py
index 54f1c37..a87a020 100644
--- a/server/apps/project/serializers.py
+++ b/server/apps/project/serializers.py
@@ -34,4 +34,13 @@ class SubApplicationUpdateSerializer(serializers.ModelSerializer):
cnas_scopes_ = DictSerializer(source='cnas_scopes', many=True)
class Meta:
model = SubApplication
+ fields = '__all__'
+
+class CertappSerializer(serializers.ModelSerializer):
+ cert_field_ = DictSerializer(source='cert_field', read_only=True)
+ cccpv_class_ = DictSerializer(source='cccpv_class' , read_only=True)
+ cnas_scopes_ = DictSerializer(source='cnas_scopes', many=True , read_only=True)
+ create_by_ = UserListSerializer(source='create_by', read_only=True)
+ class Meta:
+ model = CertApp
fields = '__all__'
\ No newline at end of file
diff --git a/server/apps/project/urls.py b/server/apps/project/urls.py
index e792d33..bdd946f 100644
--- a/server/apps/project/urls.py
+++ b/server/apps/project/urls.py
@@ -5,6 +5,7 @@ from rest_framework import routers
router = routers.DefaultRouter()
router.register('application', ApplicationViewSet, basename="application")
router.register('subapplication', SubApplicationViewSet, basename="subapplication")
+router.register('certapp', CertappViewset, basename="certapp")
urlpatterns = [
path('', include(router.urls))
]
\ No newline at end of file
diff --git a/server/apps/project/views.py b/server/apps/project/views.py
index 240d159..26c2ac6 100644
--- a/server/apps/project/views.py
+++ b/server/apps/project/views.py
@@ -58,4 +58,25 @@ class SubApplicationViewSet(CreateUpdateCustomMixin, ModelViewSet):
if ((not self.request.query_params.get('page', None)) and (self.request.query_params.get('application', None))) or (self.paginator is None):
return None
- return self.paginator.paginate_queryset(queryset, self.request, view=self)
\ No newline at end of file
+ return self.paginator.paginate_queryset(queryset, self.request, view=self)
+
+class CertappViewset(CreateUpdateCustomMixin, ModelViewSet):
+ """
+ 申请受理
+ """
+ perms_map = {'get': 'certapp_view', 'post':'certapp_create', 'put':'certapp_update','delete': 'certapp_delete'}
+ queryset = CertApp.objects.all()
+ serializer_class = CertappSerializer
+ ordering = ['-create_time']
+
+ def create(self, request, *args, **kwargs):
+ postdata = request.data
+ postdata['number'] = random.randrange(1000,2000)
+ if postdata.get('field_code', None):
+ postdata['cert_field'] = Dict.objects.get(code=postdata['field_code']).id
+ print(postdata)
+ serializer = self.get_serializer(data=postdata)
+ serializer.is_valid(raise_exception=True)
+ self.perform_create(serializer)
+ headers = self.get_success_headers(serializer.data)
+ return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
\ No newline at end of file