From 3f1a347346eb274c1b8e1e25de4efdc93c1fc8df Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 7 Aug 2020 10:42:01 +0800 Subject: [PATCH 1/2] dict update --- client/src/api/application.js | 56 ++++ client/src/router/index.js | 21 +- client/src/views/ability/ability.vue | 4 +- client/src/views/ability/abilityform.vue | 2 +- client/src/views/application/application.vue | 185 +++++++++++ .../src/views/application/applicationform.vue | 312 ++++++++++++++++++ client/src/views/application/cccform.vue | 297 +++++++++++++++++ .../src/views/enterprise/enterprisechoose.vue | 189 +++++++++++ .../src/views/implementrule/implementrule.vue | 8 +- .../implementrule/implementrulecreate.vue | 4 +- .../implementrule/implementruleupdate.vue | 4 +- .../src/views/qualification/qualification.vue | 2 +- .../views/qualification/qualification_.vue | 2 +- server/apps/certset/admin.py | 5 +- server/apps/employee/admin.py | 7 +- server/apps/employee/models.py | 4 +- server/apps/project/admin.py | 4 +- .../migrations/0002_auto_20200805_1035.py | 47 +++ .../migrations/0003_auto_20200805_1037.py | 18 + .../migrations/0004_auto_20200805_1154.py | 18 + .../migrations/0005_application_stage.py | 18 + .../migrations/0006_application_level.py | 21 ++ .../migrations/0007_auto_20200806_1625.py | 23 ++ .../migrations/0008_auto_20200806_1722.py | 45 +++ .../migrations/0009_auto_20200806_1740.py | 30 ++ .../migrations/0010_auto_20200806_1740.py | 19 ++ server/apps/project/models.py | 32 +- server/apps/project/serializers.py | 35 ++ server/apps/project/urls.py | 10 + server/apps/project/views.py | 59 ++++ .../migrations/0025_auto_20200806_1457.py | 29 ++ .../migrations/0026_auto_20200806_1508.py | 23 ++ .../migrations/0027_auto_20200806_1623.py | 27 ++ .../migrations/0028_auto_20200807_1018.py | 37 +++ server/apps/system/models.py | 14 +- server/server/asgi.py | 2 +- server/server/urls.py | 1 + 37 files changed, 1566 insertions(+), 48 deletions(-) create mode 100644 client/src/api/application.js create mode 100644 client/src/views/application/application.vue create mode 100644 client/src/views/application/applicationform.vue create mode 100644 client/src/views/application/cccform.vue create mode 100644 client/src/views/enterprise/enterprisechoose.vue create mode 100644 server/apps/project/migrations/0002_auto_20200805_1035.py create mode 100644 server/apps/project/migrations/0003_auto_20200805_1037.py create mode 100644 server/apps/project/migrations/0004_auto_20200805_1154.py create mode 100644 server/apps/project/migrations/0005_application_stage.py create mode 100644 server/apps/project/migrations/0006_application_level.py create mode 100644 server/apps/project/migrations/0007_auto_20200806_1625.py create mode 100644 server/apps/project/migrations/0008_auto_20200806_1722.py create mode 100644 server/apps/project/migrations/0009_auto_20200806_1740.py create mode 100644 server/apps/project/migrations/0010_auto_20200806_1740.py create mode 100644 server/apps/project/serializers.py create mode 100644 server/apps/project/urls.py create mode 100644 server/apps/system/migrations/0025_auto_20200806_1457.py create mode 100644 server/apps/system/migrations/0026_auto_20200806_1508.py create mode 100644 server/apps/system/migrations/0027_auto_20200806_1623.py create mode 100644 server/apps/system/migrations/0028_auto_20200807_1018.py diff --git a/client/src/api/application.js b/client/src/api/application.js new file mode 100644 index 0000000..2dd239c --- /dev/null +++ b/client/src/api/application.js @@ -0,0 +1,56 @@ +import request from '@/utils/request' + +export function getApplicationList(query) { + return request({ + url: '/project/application/', + method: 'get', + params: query + }) +} + +export function createApplication(data) { + return request({ + url: '/project/application/', + method: 'post', + data + }) +} + +export function deleteApplication(id) { + return request({ + url: `/project/application/${id}/`, + method: 'delete' + }) +} + + +export function updateApplication(id, data) { + return request({ + url: `/project/application/${id}/`, + method: 'put', + data + }) +} + +export function getApplication(id) { + return request({ + url: `/project/application/${id}/`, + method: 'get', + }) +} + +export function createSubApplication(data) { + return request({ + url: '/project/subapplication/', + method: 'post', + data + }) +} + +export function getSubApplicationList(query) { + return request({ + url: '/project/subapplication/', + method: 'get', + params: query + }) +} \ No newline at end of file diff --git a/client/src/router/index.js b/client/src/router/index.js index b150116..d617d74 100644 --- a/client/src/router/index.js +++ b/client/src/router/index.js @@ -62,17 +62,17 @@ export const constantRoutes = [ */ export const asyncRoutes = [ { - path: '/application', + path: '/project', component: Layout, - redirect: '/application/', - name: 'ApplicationManage', - meta: { title: '认证申请', icon: 'example'}, + redirect: '/project/application', + name: 'ProjectManage', + meta: { title: '认证项目', icon: 'example'}, children: [ { path: 'application', name: 'Applicaion', - component: () => import('@/views/employee/employee'), - meta: { title: '申请受理', icon: 'example', perms: ['application_view'] } + component: () => import('@/views/application/application'), + meta: { title: '认证申请', icon: 'example', perms: ['application_view'] } }, { path: 'application2', @@ -80,12 +80,19 @@ export const asyncRoutes = [ component: () => import('@/views/employee/train'), meta: { title: '客户申请受理', icon: 'example', perms: ['application_accept'] } }, + { + path: 'application/applicationform/', + name: 'ApplicationForm', + component: () => import('@/views/application/applicationform'), + meta: { title: '认证申请', icon: 'example', perms: ['application_create', 'application_update'] }, + hidden: true + }, ] }, { path: '/employee', component: Layout, - redirect: '/employee/', + redirect: '/employee/employee', name: 'EmployeeManage', meta: { title: '人员管理', icon: 'example'}, children: [ diff --git a/client/src/views/ability/ability.vue b/client/src/views/ability/ability.vue index 01384ed..dd03cde 100644 --- a/client/src/views/ability/ability.vue +++ b/client/src/views/ability/ability.vue @@ -54,12 +54,12 @@ > - + diff --git a/client/src/views/ability/abilityform.vue b/client/src/views/ability/abilityform.vue index cd1bac8..77e14ef 100644 --- a/client/src/views/ability/abilityform.vue +++ b/client/src/views/ability/abilityform.vue @@ -260,7 +260,7 @@ getImplementRuleList({cert_field__code:'CCC'}).then(res=>{ } return { id: node.id, - label: node.fullname?node.fullname:node.name, + label: node.name, children: node.children }; } diff --git a/client/src/views/application/application.vue b/client/src/views/application/application.vue new file mode 100644 index 0000000..4480a80 --- /dev/null +++ b/client/src/views/application/application.vue @@ -0,0 +1,185 @@ + + diff --git a/client/src/views/application/applicationform.vue b/client/src/views/application/applicationform.vue new file mode 100644 index 0000000..fb46484 --- /dev/null +++ b/client/src/views/application/applicationform.vue @@ -0,0 +1,312 @@ + + + \ No newline at end of file diff --git a/client/src/views/application/cccform.vue b/client/src/views/application/cccform.vue new file mode 100644 index 0000000..f3d82a9 --- /dev/null +++ b/client/src/views/application/cccform.vue @@ -0,0 +1,297 @@ + + + diff --git a/client/src/views/enterprise/enterprisechoose.vue b/client/src/views/enterprise/enterprisechoose.vue new file mode 100644 index 0000000..2c5366a --- /dev/null +++ b/client/src/views/enterprise/enterprisechoose.vue @@ -0,0 +1,189 @@ + + diff --git a/client/src/views/implementrule/implementrule.vue b/client/src/views/implementrule/implementrule.vue index a7367ee..a661bd1 100644 --- a/client/src/views/implementrule/implementrule.vue +++ b/client/src/views/implementrule/implementrule.vue @@ -59,18 +59,18 @@ - + - + diff --git a/client/src/views/implementrule/implementrulecreate.vue b/client/src/views/implementrule/implementrulecreate.vue index f70ea1d..a22cbb4 100644 --- a/client/src/views/implementrule/implementrulecreate.vue +++ b/client/src/views/implementrule/implementrulecreate.vue @@ -45,7 +45,7 @@ @@ -63,7 +63,7 @@ diff --git a/client/src/views/implementrule/implementruleupdate.vue b/client/src/views/implementrule/implementruleupdate.vue index 9eccee1..e6dafc5 100644 --- a/client/src/views/implementrule/implementruleupdate.vue +++ b/client/src/views/implementrule/implementruleupdate.vue @@ -48,7 +48,7 @@ @@ -66,7 +66,7 @@ diff --git a/client/src/views/qualification/qualification.vue b/client/src/views/qualification/qualification.vue index e2104d4..9d97b4c 100644 --- a/client/src/views/qualification/qualification.vue +++ b/client/src/views/qualification/qualification.vue @@ -69,7 +69,7 @@ > - + diff --git a/client/src/views/qualification/qualification_.vue b/client/src/views/qualification/qualification_.vue index aa0218c..3c486a7 100644 --- a/client/src/views/qualification/qualification_.vue +++ b/client/src/views/qualification/qualification_.vue @@ -66,7 +66,7 @@ > - + diff --git a/server/apps/certset/admin.py b/server/apps/certset/admin.py index 5fdb7c4..f6dea83 100644 --- a/server/apps/certset/admin.py +++ b/server/apps/certset/admin.py @@ -1,4 +1,5 @@ from django.contrib import admin -from .models import Standard +from .models import ImplementRule, Standard # Register your models here. -admin.site.register(Standard) \ No newline at end of file +admin.site.register(Standard) +admin.site.register(ImplementRule) \ No newline at end of file diff --git a/server/apps/employee/admin.py b/server/apps/employee/admin.py index 8c38f3f..e787ef8 100644 --- a/server/apps/employee/admin.py +++ b/server/apps/employee/admin.py @@ -1,3 +1,8 @@ from django.contrib import admin - +from .models import * # Register your models here. +admin.site.register(Employee) +admin.site.register(Qualification) +admin.site.register(Ability) +admin.site.register(Education) +admin.site.register(Train) \ No newline at end of file diff --git a/server/apps/employee/models.py b/server/apps/employee/models.py index 6d6e5a5..6ac411b 100644 --- a/server/apps/employee/models.py +++ b/server/apps/employee/models.py @@ -85,10 +85,10 @@ class Qualification(CommonAModel): else: if not self.is_enabled: for i in Ability.objects.filter(employee=self.employee, cert_field=self.cert_field): - i.auditor_abilitys.remove(Dict.objects.get(code='checker_auditor')) + i.auditor_abilitys.remove(Dict.objects.get(code='jcyshy')) else: for i in Ability.objects.filter(employee=self.employee, cert_field=self.cert_field): - i.auditor_abilitys.add(Dict.objects.get(code='checker_auditor')) + i.auditor_abilitys.add(Dict.objects.get(code='jcyshy')) super().save(*args, **kwargs) fields = Qualification.objects.filter(is_enabled=True, is_deleted=False).values_list('cert_field__code', flat=True) if self.employee.fields != ','.join(fields): diff --git a/server/apps/project/admin.py b/server/apps/project/admin.py index 8c38f3f..90a4296 100644 --- a/server/apps/project/admin.py +++ b/server/apps/project/admin.py @@ -1,3 +1,5 @@ +from apps.project.views import ApplicationViewSet from django.contrib import admin - +from .models import * # Register your models here. +admin.site.register(Application) \ No newline at end of file diff --git a/server/apps/project/migrations/0002_auto_20200805_1035.py b/server/apps/project/migrations/0002_auto_20200805_1035.py new file mode 100644 index 0000000..10b4cfd --- /dev/null +++ b/server/apps/project/migrations/0002_auto_20200805_1035.py @@ -0,0 +1,47 @@ +# Generated by Django 3.0.7 on 2020-08-05 02:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('project', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='application', + name='cert_field', + ), + migrations.RemoveField( + model_name='application', + name='evdetail', + ), + migrations.RemoveField( + model_name='application', + name='factory', + ), + migrations.RemoveField( + model_name='application', + name='factory_v', + ), + migrations.RemoveField( + model_name='application', + name='manufacturer', + ), + migrations.RemoveField( + model_name='application', + name='manufacturer_v', + ), + migrations.AddField( + model_name='application', + name='fields', + field=models.TextField(default=True, verbose_name='认证领域'), + ), + migrations.AlterField( + model_name='application', + name='evresult', + field=models.CharField(choices=[('合格', '合格'), ('不合格', '不合格'), ('有条件放行', '有条件放行')], default='未评审', max_length=50, verbose_name='评审结论'), + ), + ] diff --git a/server/apps/project/migrations/0003_auto_20200805_1037.py b/server/apps/project/migrations/0003_auto_20200805_1037.py new file mode 100644 index 0000000..758ac4d --- /dev/null +++ b/server/apps/project/migrations/0003_auto_20200805_1037.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.7 on 2020-08-05 02:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('project', '0002_auto_20200805_1035'), + ] + + operations = [ + migrations.AlterField( + model_name='application', + name='evresult', + field=models.CharField(choices=[('未评审', '未评审'), ('合格', '合格'), ('不合格', '不合格'), ('有条件放行', '有条件放行')], default='未评审', max_length=50, verbose_name='评审结论'), + ), + ] diff --git a/server/apps/project/migrations/0004_auto_20200805_1154.py b/server/apps/project/migrations/0004_auto_20200805_1154.py new file mode 100644 index 0000000..d1152a4 --- /dev/null +++ b/server/apps/project/migrations/0004_auto_20200805_1154.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.7 on 2020-08-05 03:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('project', '0003_auto_20200805_1037'), + ] + + operations = [ + migrations.AlterField( + model_name='application', + name='fields', + field=models.TextField(blank=True, verbose_name='认证领域'), + ), + ] diff --git a/server/apps/project/migrations/0005_application_stage.py b/server/apps/project/migrations/0005_application_stage.py new file mode 100644 index 0000000..afc600c --- /dev/null +++ b/server/apps/project/migrations/0005_application_stage.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.7 on 2020-08-05 06:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('project', '0004_auto_20200805_1154'), + ] + + operations = [ + migrations.AddField( + model_name='application', + name='stage', + field=models.IntegerField(choices=[(0, '基本信息'), (1, '申请内容')], default=0, verbose_name='步骤状态'), + ), + ] diff --git a/server/apps/project/migrations/0006_application_level.py b/server/apps/project/migrations/0006_application_level.py new file mode 100644 index 0000000..72e85fb --- /dev/null +++ b/server/apps/project/migrations/0006_application_level.py @@ -0,0 +1,21 @@ +# Generated by Django 3.0.7 on 2020-08-06 06:57 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0025_auto_20200806_1457'), + ('project', '0005_application_stage'), + ] + + operations = [ + migrations.AddField( + model_name='application', + name='level', + field=models.ForeignKey(default=111, on_delete=django.db.models.deletion.DO_NOTHING, related_name='application_level', to='system.Dict'), + preserve_default=False, + ), + ] diff --git a/server/apps/project/migrations/0007_auto_20200806_1625.py b/server/apps/project/migrations/0007_auto_20200806_1625.py new file mode 100644 index 0000000..b1b5388 --- /dev/null +++ b/server/apps/project/migrations/0007_auto_20200806_1625.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0.7 on 2020-08-06 08:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('project', '0006_application_level'), + ] + + operations = [ + migrations.AddField( + model_name='subapplication', + name='is_approve', + field=models.BooleanField(default=True, verbose_name='是否认可'), + ), + migrations.AddField( + model_name='subapplication', + name='pattern', + field=models.CharField(choices=[('正常', '正常'), ('ODM', 'ODM'), ('OEM', 'OEM')], default='正常', max_length=50, verbose_name='申请模式'), + ), + ] diff --git a/server/apps/project/migrations/0008_auto_20200806_1722.py b/server/apps/project/migrations/0008_auto_20200806_1722.py new file mode 100644 index 0000000..75e041f --- /dev/null +++ b/server/apps/project/migrations/0008_auto_20200806_1722.py @@ -0,0 +1,45 @@ +# Generated by Django 3.0.7 on 2020-08-06 09:22 + +import django.contrib.postgres.fields.jsonb +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('crm', '0011_enterprise_parent'), + ('project', '0007_auto_20200806_1625'), + ] + + operations = [ + migrations.AddField( + model_name='subapplication', + name='cert_field_code', + field=models.CharField(default='CCC', max_length=50, verbose_name='认证领域代号'), + ), + migrations.AddField( + model_name='subapplication', + name='factory', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='subapplication_factory', to='crm.Enterprise'), + preserve_default=False, + ), + migrations.AddField( + model_name='subapplication', + name='factory_v', + field=django.contrib.postgres.fields.jsonb.JSONField(default={}, verbose_name='生产厂'), + preserve_default=False, + ), + migrations.AddField( + model_name='subapplication', + name='manufacture', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='subapplication_manufacture', to='crm.Enterprise'), + preserve_default=False, + ), + migrations.AddField( + model_name='subapplication', + name='manufacture_v', + field=django.contrib.postgres.fields.jsonb.JSONField(default={}, verbose_name='制造商'), + preserve_default=False, + ), + ] diff --git a/server/apps/project/migrations/0009_auto_20200806_1740.py b/server/apps/project/migrations/0009_auto_20200806_1740.py new file mode 100644 index 0000000..a61f4dc --- /dev/null +++ b/server/apps/project/migrations/0009_auto_20200806_1740.py @@ -0,0 +1,30 @@ +# Generated by Django 3.0.7 on 2020-08-06 09:40 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0027_auto_20200806_1623'), + ('project', '0008_auto_20200806_1722'), + ] + + operations = [ + migrations.AlterField( + model_name='subapplication', + name='cccpv_class', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='subapplication_cccpv_class', to='system.Dict', verbose_name='涉及CCC/PV分类'), + ), + migrations.AlterField( + model_name='subapplication', + name='cert_field_code', + field=models.CharField(max_length=50, null=True, verbose_name='认证领域代号'), + ), + migrations.AlterField( + model_name='subapplication', + name='cnas_scopes', + field=models.ManyToManyField(blank=True, null=True, related_name='subapplication_cnas_sopes', to='system.Dict', verbose_name='涉及cnas分类'), + ), + ] diff --git a/server/apps/project/migrations/0010_auto_20200806_1740.py b/server/apps/project/migrations/0010_auto_20200806_1740.py new file mode 100644 index 0000000..178ed42 --- /dev/null +++ b/server/apps/project/migrations/0010_auto_20200806_1740.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0.7 on 2020-08-06 09:40 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0027_auto_20200806_1623'), + ('project', '0009_auto_20200806_1740'), + ] + + operations = [ + migrations.AlterField( + model_name='subapplication', + name='cnas_scopes', + field=models.ManyToManyField(blank=True, related_name='subapplication_cnas_sopes', to='system.Dict', verbose_name='涉及cnas分类'), + ), + ] diff --git a/server/apps/project/models.py b/server/apps/project/models.py index ebba3c2..3fd0031 100644 --- a/server/apps/project/models.py +++ b/server/apps/project/models.py @@ -29,25 +29,27 @@ class Application(CommonBModel): ('已完成', '已完成') ) result_choices = ( + ('未评审', '未评审'), ('合格', '合格'), ('不合格', '不合格'), ('有条件放行', '有条件放行') ) + stage_choices = ( + (0, '基本信息'), + (1, '申请内容') + ) number = models.CharField('申请编号', max_length = 100) 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='application_applicant', on_delete=models.DO_NOTHING) - manufacturer_v = JSONField(verbose_name='制造商', blank=True) - manufacturer = models.ForeignKey(Enterprise, related_name='application_manufacturer', on_delete=models.SET_NULL, null=True, blank=True) - factory_v = JSONField(verbose_name='生产厂', blank=True) - factory = models.ForeignKey(Enterprise, related_name='application_factory', on_delete=models.SET_NULL, null=True, blank=True) - cert_field = models.ForeignKey(Dict, verbose_name='认证领域', related_name='application_cert_field', on_delete=models.SET_NULL, null=True) + fields = models.TextField('认证领域', blank=True) status = models.CharField('申请状态', choices=status_choices, default='草稿', max_length=50) - evdetail = models.ManyToManyField(EvaluationItem, verbose_name='评审详细记录', through='EvaluationDetail') - evresult = models.CharField('评审结论', choices = result_choices, default='合格', max_length=50) + stage = models.IntegerField('步骤状态', choices=stage_choices, default=0) + evresult = models.CharField('评审结论', choices = result_choices, default='未评审', max_length=50) evremark = models.TextField('备注', blank=True) + level = models.ForeignKey(Dict, related_name='application_level', on_delete = models.DO_NOTHING) class Meta: verbose_name = '认证主申请' @@ -60,12 +62,24 @@ class SubApplication(CommonBModel): """ 子申请 """ + pattern_choices = ( + ('正常', '正常'), + ('ODM', 'ODM'), + ('OEM', 'OEM') + ) number = models.CharField('子申请编号', max_length = 100) application = models.ForeignKey(Application, on_delete=models.CASCADE, related_name='subapplication_application') + cert_field_code = models.CharField('认证领域代号', max_length=50, null=True) cert_field = models.ForeignKey(Dict, verbose_name='认证领域', related_name='subapplication_cert_field', on_delete=models.DO_NOTHING) - cccpv_class = models.ForeignKey(Dict, verbose_name='涉及CCC/PV分类', related_name='subapplication_cccpv_class', on_delete=models.DO_NOTHING) - cnas_scopes = models.ManyToManyField(Dict, verbose_name='涉及cnas分类', related_name='subapplication_cnas_sopes') + cccpv_class = models.ForeignKey(Dict, verbose_name='涉及CCC/PV分类', related_name='subapplication_cccpv_class', on_delete=models.DO_NOTHING, null=True, blank=True) + cnas_scopes = models.ManyToManyField(Dict, verbose_name='涉及cnas分类', related_name='subapplication_cnas_sopes', blank=True) project = models.ForeignKey(Project, related_name='subapplication_project', on_delete=models.SET_NULL, null=True) + is_approve = models.BooleanField('是否认可', default=True) + pattern = models.CharField('申请模式', default='正常', choices=pattern_choices, max_length=50) + manufacture = models.ForeignKey(Enterprise, on_delete=models.CASCADE, related_name='subapplication_manufacture') + manufacture_v = JSONField(verbose_name='制造商') + factory = models.ForeignKey(Enterprise, on_delete=models.CASCADE, related_name='subapplication_factory') + factory_v = JSONField(verbose_name='生产厂') class Meta: verbose_name = '认证子申请' diff --git a/server/apps/project/serializers.py b/server/apps/project/serializers.py new file mode 100644 index 0000000..81caacf --- /dev/null +++ b/server/apps/project/serializers.py @@ -0,0 +1,35 @@ +from rest_framework import serializers + +from .models import * + +# from apps.system.serializers import DictSerializer, UserListSerializer +# from apps.certset.serializers import ImplementRuleSerializer + +class ApplicationCreateSerializer(serializers.ModelSerializer): + number = serializers.CharField(required=False) + class Meta: + model = Application + fields = '__all__' + +class ApplicationUpdateSerializer(serializers.ModelSerializer): + number = serializers.CharField(read_only=True) + stage_ = serializers.SerializerMethodField(source='stage', read_only=True) + class Meta: + model = Application + fields = '__all__' + + def get_stage_(self, obj): + return obj.get_stage_display() + +class SubApplicationCreateSerializer(serializers.ModelSerializer): + number = serializers.CharField(required=False) + class Meta: + model = SubApplication + fields = '__all__' + +class SubApplicationUpdateSerializer(serializers.ModelSerializer): + number = serializers.CharField(read_only=True) + cert_field_code = serializers.CharField(read_only=True) + class Meta: + model = SubApplication + fields = '__all__' \ No newline at end of file diff --git a/server/apps/project/urls.py b/server/apps/project/urls.py new file mode 100644 index 0000000..e792d33 --- /dev/null +++ b/server/apps/project/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('application', ApplicationViewSet, basename="application") +router.register('subapplication', SubApplicationViewSet, basename="subapplication") +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 91ea44a..e167b03 100644 --- a/server/apps/project/views.py +++ b/server/apps/project/views.py @@ -1,3 +1,62 @@ from django.shortcuts import render +import rest_framework +from rest_framework.viewsets import ModelViewSet, GenericViewSet +from rest_framework.response import Response +from rest_framework import status +from .models import * +from .serializers import * +from apps.system.models import Dict +from apps.system.permission_data import RbacFilterSet +from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin +import random # Create your views here. +class ApplicationViewSet(CreateUpdateCustomMixin, ModelViewSet): + """ + 认证申请 + """ + perms_map = {'get': 'application_view', 'post':'application_create', 'put':'application_update','delete': 'application_delete'} + queryset = Application.objects.all() + serializer_class = ApplicationCreateSerializer + ordering = ['-create_time'] + + def get_serializer_class(self): + if self.action == 'create': + return ApplicationCreateSerializer + else: + return ApplicationUpdateSerializer + + def perform_create(self, serializer): + serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept, number=random.randrange(1000,2000)) + +class SubApplicationViewSet(CreateUpdateCustomMixin, ModelViewSet): + """ + 子认证申请 + """ + perms_map = {'get': 'application_view', 'post':'application_create', 'put':'application_update','delete': 'application_delete'} + queryset = SubApplication.objects.all() + serializer_class = SubApplicationCreateSerializer + filterset_fields = ['application'] + ordering = ['-create_time'] + + def get_serializer_class(self): + if self.action == 'create': + return SubApplicationCreateSerializer + else: + return SubApplicationUpdateSerializer + + def create(self, request, *args, **kwargs): + postdata = request.data + postdata['number'] = random.randrange(1000,2000) + postdata['cert_field'] = Dict.objects.get(code=postdata['cert_field_code'], type__code='cert_field').pk + 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) + + def paginate_queryset(self, queryset): + + 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 diff --git a/server/apps/system/migrations/0025_auto_20200806_1457.py b/server/apps/system/migrations/0025_auto_20200806_1457.py new file mode 100644 index 0000000..d6d3249 --- /dev/null +++ b/server/apps/system/migrations/0025_auto_20200806_1457.py @@ -0,0 +1,29 @@ +# Generated by Django 3.0.7 on 2020-08-06 06:57 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0024_auto_20200716_0927'), + ] + + operations = [ + migrations.AddField( + model_name='dict', + name='typecode', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dict_dicttype', to='system.DictType', to_field='code'), + ), + migrations.AddField( + model_name='historicaldict', + name='typecode', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='system.DictType', to_field='code'), + ), + migrations.AlterField( + model_name='dict', + name='type', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='dict_dicttype0', to='system.DictType', verbose_name='类型'), + ), + ] diff --git a/server/apps/system/migrations/0026_auto_20200806_1508.py b/server/apps/system/migrations/0026_auto_20200806_1508.py new file mode 100644 index 0000000..b1c05cd --- /dev/null +++ b/server/apps/system/migrations/0026_auto_20200806_1508.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0.7 on 2020-08-06 07:08 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0025_auto_20200806_1457'), + ] + + operations = [ + migrations.AlterField( + model_name='dict', + name='type', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='system.DictType', verbose_name='类型'), + ), + migrations.AlterUniqueTogether( + name='dict', + unique_together={('code', 'type')}, + ), + ] diff --git a/server/apps/system/migrations/0027_auto_20200806_1623.py b/server/apps/system/migrations/0027_auto_20200806_1623.py new file mode 100644 index 0000000..d2a6ebd --- /dev/null +++ b/server/apps/system/migrations/0027_auto_20200806_1623.py @@ -0,0 +1,27 @@ +# Generated by Django 3.0.7 on 2020-08-06 08:23 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0026_auto_20200806_1508'), + ] + + operations = [ + migrations.RemoveField( + model_name='dict', + name='typecode', + ), + migrations.RemoveField( + model_name='historicaldict', + name='typecode', + ), + migrations.AlterField( + model_name='dict', + name='type', + field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='system.DictType', verbose_name='类型'), + ), + ] diff --git a/server/apps/system/migrations/0028_auto_20200807_1018.py b/server/apps/system/migrations/0028_auto_20200807_1018.py new file mode 100644 index 0000000..8b48cb0 --- /dev/null +++ b/server/apps/system/migrations/0028_auto_20200807_1018.py @@ -0,0 +1,37 @@ +# Generated by Django 3.0.7 on 2020-08-07 02:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0027_auto_20200806_1623'), + ] + + operations = [ + migrations.RemoveField( + model_name='historicaldict', + name='fullname', + ), + migrations.AlterField( + model_name='dict', + name='code', + field=models.CharField(default=1, max_length=30, unique=True, verbose_name='编号'), + preserve_default=False, + ), + migrations.AlterField( + model_name='historicaldict', + name='code', + field=models.CharField(db_index=True, default=1, max_length=30, verbose_name='编号'), + preserve_default=False, + ), + migrations.AlterUniqueTogether( + name='dict', + unique_together=set(), + ), + migrations.RemoveField( + model_name='dict', + name='fullname', + ), + ] diff --git a/server/apps/system/models.py b/server/apps/system/models.py index 58594e4..7c45ee0 100644 --- a/server/apps/system/models.py +++ b/server/apps/system/models.py @@ -148,12 +148,11 @@ class Dict(SoftModel): 数据字典 """ name = models.CharField('名称', max_length=1000) - code = models.CharField('编号', max_length=30, null=True, blank=True) - fullname = models.CharField('全名', max_length=1000, null=True, blank=True) + code = models.CharField('编号', max_length=30, unique=True) description = models.TextField('描述', blank=True, null=True) other = JSONField('其它信息', blank=True, null=True) type = models.ForeignKey( - DictType, on_delete=models.CASCADE, verbose_name='类型') + DictType, on_delete=models.DO_NOTHING, verbose_name='类型') sort = models.IntegerField('排序', default=1) parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='父') @@ -163,18 +162,9 @@ class Dict(SoftModel): class Meta: verbose_name = '字典' verbose_name_plural = verbose_name - unique_together = ('name', 'is_used', 'type') def __str__(self): return self.name - - def save(self, *args, **kwargs): - """ - 冗余一个字段,方便调用 - """ - if self.code and self.code not in self.name: - self.fullname = self.code + '-' + self.name - super().save(*args, **kwargs) class CommonAModel(SoftModel): """ diff --git a/server/server/asgi.py b/server/server/asgi.py index 2526a47..874ffe1 100644 --- a/server/server/asgi.py +++ b/server/server/asgi.py @@ -11,6 +11,6 @@ import os from django.core.asgi import get_asgi_application -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings') +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings_dev') application = get_asgi_application() diff --git a/server/server/urls.py b/server/server/urls.py index 40fe389..0f91123 100644 --- a/server/server/urls.py +++ b/server/server/urls.py @@ -35,6 +35,7 @@ urlpatterns = [ path('certset/', include('apps.certset.urls')), path('crm/', include('apps.crm.urls')), path('employee/', include('apps.employee.urls')), + path('project/', include('apps.project.urls')), path('docs/', include_docs_urls(title="接口文档", authentication_classes=[], permission_classes=[])), path('signature/', GenSignature.as_view(), name='gen_signature'), From 9c8ce37b46030118fee994202dad8a1ddd87b285 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 10 Aug 2020 14:16:27 +0800 Subject: [PATCH 2/2] application update --- .../src/views/application/applicationform.vue | 95 ++++-- client/src/views/application/cccform.vue | 16 +- client/src/views/application/pvform.vue | 286 ++++++++++++++++++ client/src/views/application/qmsform.vue | 90 ++++++ ...1_remove_subapplication_cert_field_code.py | 17 ++ .../migrations/0012_auto_20200807_1743.py | 36 +++ .../migrations/0013_auto_20200807_1745.py | 24 ++ .../migrations/0014_auto_20200807_1747.py | 24 ++ .../migrations/0015_auto_20200807_1753.py | 18 ++ server/apps/project/models.py | 11 +- server/apps/project/serializers.py | 6 +- server/apps/project/views.py | 1 - 12 files changed, 577 insertions(+), 47 deletions(-) create mode 100644 client/src/views/application/pvform.vue create mode 100644 client/src/views/application/qmsform.vue create mode 100644 server/apps/project/migrations/0011_remove_subapplication_cert_field_code.py create mode 100644 server/apps/project/migrations/0012_auto_20200807_1743.py create mode 100644 server/apps/project/migrations/0013_auto_20200807_1745.py create mode 100644 server/apps/project/migrations/0014_auto_20200807_1747.py create mode 100644 server/apps/project/migrations/0015_auto_20200807_1753.py diff --git a/client/src/views/application/applicationform.vue b/client/src/views/application/applicationform.vue index fb46484..a75983c 100644 --- a/client/src/views/application/applicationform.vue +++ b/client/src/views/application/applicationform.vue @@ -93,17 +93,44 @@ -
-
- {{item}} -
- +
+ {{item.name}}
- - - - - + + + +
+ {{item.cert_field_.name}} + + + +
+ 操作按钮 +
+ {{item.cert_field_.name}} +
+
+ {{item.cccpv_class_.name}} +
+
+ {{item.name}} +
+
+ {{formData.applicant_v.name}} +
+
+ {{item.manufacture_v.name}} +
+
+ {{item.factory_v.name}} +
+
+ {{item.pattern}} +
+ +
+
+
上一步 保存并进行下一步 @@ -114,8 +141,10 @@ - - + + + +
@@ -123,16 +152,19 @@ \ No newline at end of file diff --git a/client/src/views/application/cccform.vue b/client/src/views/application/cccform.vue index f3d82a9..314ca51 100644 --- a/client/src/views/application/cccform.vue +++ b/client/src/views/application/cccform.vue @@ -110,7 +110,6 @@ diff --git a/client/src/views/application/pvform.vue b/client/src/views/application/pvform.vue new file mode 100644 index 0000000..427b26c --- /dev/null +++ b/client/src/views/application/pvform.vue @@ -0,0 +1,286 @@ + + + diff --git a/client/src/views/application/qmsform.vue b/client/src/views/application/qmsform.vue new file mode 100644 index 0000000..e29d463 --- /dev/null +++ b/client/src/views/application/qmsform.vue @@ -0,0 +1,90 @@ + + + diff --git a/server/apps/project/migrations/0011_remove_subapplication_cert_field_code.py b/server/apps/project/migrations/0011_remove_subapplication_cert_field_code.py new file mode 100644 index 0000000..bac5d5f --- /dev/null +++ b/server/apps/project/migrations/0011_remove_subapplication_cert_field_code.py @@ -0,0 +1,17 @@ +# Generated by Django 3.0.7 on 2020-08-07 03:37 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('project', '0010_auto_20200806_1740'), + ] + + operations = [ + migrations.RemoveField( + model_name='subapplication', + name='cert_field_code', + ), + ] diff --git a/server/apps/project/migrations/0012_auto_20200807_1743.py b/server/apps/project/migrations/0012_auto_20200807_1743.py new file mode 100644 index 0000000..42052bd --- /dev/null +++ b/server/apps/project/migrations/0012_auto_20200807_1743.py @@ -0,0 +1,36 @@ +# Generated by Django 3.0.7 on 2020-08-07 09:43 + +import django.contrib.postgres.fields.jsonb +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('crm', '0011_enterprise_parent'), + ('project', '0011_remove_subapplication_cert_field_code'), + ] + + operations = [ + migrations.AlterField( + model_name='subapplication', + name='factory', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='subapplication_factory', to='crm.Enterprise'), + ), + migrations.AlterField( + model_name='subapplication', + name='factory_v', + field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, verbose_name='生产厂'), + ), + migrations.AlterField( + model_name='subapplication', + name='manufacture', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='subapplication_manufacture', to='crm.Enterprise'), + ), + migrations.AlterField( + model_name='subapplication', + name='manufacture_v', + field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, verbose_name='制造商'), + ), + ] diff --git a/server/apps/project/migrations/0013_auto_20200807_1745.py b/server/apps/project/migrations/0013_auto_20200807_1745.py new file mode 100644 index 0000000..5a4254b --- /dev/null +++ b/server/apps/project/migrations/0013_auto_20200807_1745.py @@ -0,0 +1,24 @@ +# Generated by Django 3.0.7 on 2020-08-07 09:45 + +import django.contrib.postgres.fields.jsonb +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('project', '0012_auto_20200807_1743'), + ] + + operations = [ + migrations.AlterField( + model_name='subapplication', + name='factory_v', + field=django.contrib.postgres.fields.jsonb.JSONField(default=dict, verbose_name='生产厂'), + ), + migrations.AlterField( + model_name='subapplication', + name='manufacture_v', + field=django.contrib.postgres.fields.jsonb.JSONField(default=dict, verbose_name='制造商'), + ), + ] diff --git a/server/apps/project/migrations/0014_auto_20200807_1747.py b/server/apps/project/migrations/0014_auto_20200807_1747.py new file mode 100644 index 0000000..62fa76d --- /dev/null +++ b/server/apps/project/migrations/0014_auto_20200807_1747.py @@ -0,0 +1,24 @@ +# Generated by Django 3.0.7 on 2020-08-07 09:47 + +import django.contrib.postgres.fields.jsonb +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('project', '0013_auto_20200807_1745'), + ] + + operations = [ + migrations.AlterField( + model_name='subapplication', + name='factory_v', + field=django.contrib.postgres.fields.jsonb.JSONField(null=True, verbose_name='生产厂'), + ), + migrations.AlterField( + model_name='subapplication', + name='manufacture_v', + field=django.contrib.postgres.fields.jsonb.JSONField(null=True, verbose_name='制造商'), + ), + ] diff --git a/server/apps/project/migrations/0015_auto_20200807_1753.py b/server/apps/project/migrations/0015_auto_20200807_1753.py new file mode 100644 index 0000000..9f87593 --- /dev/null +++ b/server/apps/project/migrations/0015_auto_20200807_1753.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.7 on 2020-08-07 09:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('project', '0014_auto_20200807_1747'), + ] + + operations = [ + migrations.AlterField( + model_name='subapplication', + name='pattern', + field=models.CharField(blank=True, choices=[('正常', '正常'), ('ODM', 'ODM'), ('OEM', 'OEM')], max_length=50, null=True, verbose_name='申请模式'), + ), + ] diff --git a/server/apps/project/models.py b/server/apps/project/models.py index 3fd0031..dfcd8a3 100644 --- a/server/apps/project/models.py +++ b/server/apps/project/models.py @@ -69,17 +69,16 @@ class SubApplication(CommonBModel): ) number = models.CharField('子申请编号', max_length = 100) application = models.ForeignKey(Application, on_delete=models.CASCADE, related_name='subapplication_application') - cert_field_code = models.CharField('认证领域代号', max_length=50, null=True) cert_field = models.ForeignKey(Dict, verbose_name='认证领域', related_name='subapplication_cert_field', on_delete=models.DO_NOTHING) cccpv_class = models.ForeignKey(Dict, verbose_name='涉及CCC/PV分类', related_name='subapplication_cccpv_class', on_delete=models.DO_NOTHING, null=True, blank=True) cnas_scopes = models.ManyToManyField(Dict, verbose_name='涉及cnas分类', related_name='subapplication_cnas_sopes', blank=True) project = models.ForeignKey(Project, related_name='subapplication_project', on_delete=models.SET_NULL, null=True) is_approve = models.BooleanField('是否认可', default=True) - pattern = models.CharField('申请模式', default='正常', choices=pattern_choices, max_length=50) - manufacture = models.ForeignKey(Enterprise, on_delete=models.CASCADE, related_name='subapplication_manufacture') - manufacture_v = JSONField(verbose_name='制造商') - factory = models.ForeignKey(Enterprise, on_delete=models.CASCADE, related_name='subapplication_factory') - factory_v = JSONField(verbose_name='生产厂') + pattern = models.CharField('申请模式', choices=pattern_choices, max_length=50, null=True, blank=True) + manufacture = models.ForeignKey(Enterprise, on_delete=models.CASCADE, related_name='subapplication_manufacture', null=True, blank=True) + manufacture_v = JSONField(verbose_name='制造商', null=True) + factory = models.ForeignKey(Enterprise, on_delete=models.CASCADE, related_name='subapplication_factory', null=True, blank=True) + factory_v = JSONField(verbose_name='生产厂', null=True) class Meta: verbose_name = '认证子申请' diff --git a/server/apps/project/serializers.py b/server/apps/project/serializers.py index 81caacf..54f1c37 100644 --- a/server/apps/project/serializers.py +++ b/server/apps/project/serializers.py @@ -2,7 +2,7 @@ from rest_framework import serializers from .models import * -# from apps.system.serializers import DictSerializer, UserListSerializer +from apps.system.serializers import DictSerializer, UserListSerializer # from apps.certset.serializers import ImplementRuleSerializer class ApplicationCreateSerializer(serializers.ModelSerializer): @@ -29,7 +29,9 @@ class SubApplicationCreateSerializer(serializers.ModelSerializer): class SubApplicationUpdateSerializer(serializers.ModelSerializer): number = serializers.CharField(read_only=True) - cert_field_code = serializers.CharField(read_only=True) + cert_field_ = DictSerializer(source='cert_field') + cccpv_class_ = DictSerializer(source='cccpv_class') + cnas_scopes_ = DictSerializer(source='cnas_scopes', many=True) class Meta: model = SubApplication fields = '__all__' \ No newline at end of file diff --git a/server/apps/project/views.py b/server/apps/project/views.py index e167b03..240d159 100644 --- a/server/apps/project/views.py +++ b/server/apps/project/views.py @@ -48,7 +48,6 @@ class SubApplicationViewSet(CreateUpdateCustomMixin, ModelViewSet): def create(self, request, *args, **kwargs): postdata = request.data postdata['number'] = random.randrange(1000,2000) - postdata['cert_field'] = Dict.objects.get(code=postdata['cert_field_code'], type__code='cert_field').pk serializer = self.get_serializer(data=postdata) serializer.is_valid(raise_exception=True) self.perform_create(serializer)