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 @@ + + 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