diff --git a/client/src/api/certappunit.js b/client/src/api/certappunit.js index 41b5b10..4b71a16 100644 --- a/client/src/api/certappunit.js +++ b/client/src/api/certappunit.js @@ -41,6 +41,13 @@ export function createsamplesCertappunit(id,data) { data }) } +export function createcompleteCertappunit(id,data) { + return request({ + url: `/project/certappunit/${id}/createcomplete/`, + method: 'put', + data + }) +} // export function createAccess(data) { // return request({ // url: '/accessment/certass/', diff --git a/client/src/api/project.js b/client/src/api/project.js index 9fe4131..2b781d4 100644 --- a/client/src/api/project.js +++ b/client/src/api/project.js @@ -39,9 +39,9 @@ export function getProject(id) { }) } -export function nextProject(id) { +export function assginProject(id) { return request({ - url: `/project/project/${id}/next/`, + url: `/project/project/${id}/assgin/`, method: 'put' }) } @@ -60,4 +60,11 @@ export function planProject(data) { method: 'put', data }) +} + +export function acceptAudit(id) { + return request({ + url: `/project/project/${id}/accept/`, + method: 'put', + }) } \ No newline at end of file diff --git a/client/src/router/index.js b/client/src/router/index.js index d0d6598..94c841e 100644 --- a/client/src/router/index.js +++ b/client/src/router/index.js @@ -68,17 +68,17 @@ export const asyncRoutes = [ name: 'ProjectManage', meta: { title: '认证项目', icon: 'example'}, children: [ - { - path: 'application', - name: 'Applicaion', - component: () => import('@/views/application/application'), - meta: { title: '业务受理2', icon: 'example', perms: ['application_view'] } - }, + // { + // path: 'application', + // name: 'Applicaion', + // component: () => import('@/views/application/application'), + // meta: { title: '业务受理2', icon: 'example', perms: ['application_view'] } + // }, { path: 'certapp', name: 'Certapp', component: () => import('@/views/certapp/certapp'), - meta: { title: '业务受理1', icon: 'example', perms: ['certapp_view'] } + meta: { title: '业务受理', icon: 'example', perms: ['certapp_view'] } }, // { // path: 'application2', @@ -225,6 +225,13 @@ export const asyncRoutes = [ meta: { title: '任务反馈', noCache: true, icon: '', perms: ['feedback_create']}, hidden: true }, + { + path: 'feedbacks/create', + name: 'FeedbacksCreate', + component: () => import('@/views/testorg/feedbacks.vue'), + meta: { title: '任务反馈', noCache: true, icon: '', perms: ['feedbacks_create']}, + hidden: true + }, ] }, diff --git a/client/src/styles/index.scss b/client/src/styles/index.scss index b47aaea..687eb0a 100644 --- a/client/src/styles/index.scss +++ b/client/src/styles/index.scss @@ -100,4 +100,7 @@ div:focus { } // .el-button { // border-radius: 0px; -// } \ No newline at end of file +// } +.el-tabs__header { + margin: 0 0 6px; +} \ No newline at end of file diff --git a/client/src/views/accessment/access.vue b/client/src/views/accessment/access.vue index 779a3c3..7e97828 100644 --- a/client/src/views/accessment/access.vue +++ b/client/src/views/accessment/access.vue @@ -71,14 +71,9 @@ {{ scope.row.certunit_.name }} - - - + + + {{ scope.row.certificate_.number }} diff --git a/client/src/views/audit/member.vue b/client/src/views/audit/member.vue index f3f92ce..7d493a1 100644 --- a/client/src/views/audit/member.vue +++ b/client/src/views/audit/member.vue @@ -42,7 +42,7 @@ - + 成员配置 @@ -99,7 +99,7 @@ - + 审核员参与天数/人日数 @@ -136,7 +136,8 @@ - 保存 + 保存 diff --git a/client/src/views/audit/task.vue b/client/src/views/audit/task.vue index 033b96f..8201bf2 100644 --- a/client/src/views/audit/task.vue +++ b/client/src/views/audit/task.vue @@ -1,198 +1,245 @@ - - - - 我的项目 - - - + + + + + + + + + - - - - 搜索 - 重置 - - - - - - - {{ scope.row.number }} - - - {{ scope.row.plan_.name }} - - - {{ scope.row.auditee_v.name }} - - - - {{item}} - - - - {{ scope.row.state}} - - - - - - {{item.user_.name}} - + + + 搜索 + 重置 + + + + + + {{ + scope.row.number + }} + + + {{ + scope.row.plan_.name + }} + + + {{ scope.row.auditee_v.name }} + + + + {{ item }} + + + + {{ scope.row.state }} + + + + + + {{ item.user_.name }} - - - - - {{ scope.row.create_time }} - - - - - - 处理 - 详情 - - - - - - - - - 项目下我的业务 - - - - - {{ 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.state}} - - - - - - - {{item.user_.name}} - - + + + + + {{ scope.row.create_time }} + + + + + 接受任务 + 详情 + + + + + + + + 项目下我的业务 + + + + + {{ + 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.state }} + + + + + + + {{ item.user_.name }} + - - - - - {{ scope.row.create_time }} - - - - - - 反馈 - 详情 - - - - - + + + + + {{ scope.row.create_time }} + + + + + 反馈 + 详情 + + + + diff --git a/client/src/views/certificate/issue.vue b/client/src/views/certificate/issue.vue index 59431cf..5dc150b 100644 --- a/client/src/views/certificate/issue.vue +++ b/client/src/views/certificate/issue.vue @@ -14,16 +14,16 @@ {{ scope.row.certunit_.name }} - - - {{scope.row.certificate_.number}} - - {{ scope.row.decision_.name }} + + + {{scope.row.certificate_.number}} + + 发证 + 发通知书 diff --git a/client/src/views/plan/plan.vue b/client/src/views/plan/plan.vue index 9f1271e..7c7197e 100644 --- a/client/src/views/plan/plan.vue +++ b/client/src/views/plan/plan.vue @@ -189,20 +189,20 @@ 计划 任务下达 diff --git a/client/src/views/testorg/taskmanagement.vue b/client/src/views/testorg/taskmanagement.vue index 19aecca..d12d57e 100644 --- a/client/src/views/testorg/taskmanagement.vue +++ b/client/src/views/testorg/taskmanagement.vue @@ -57,10 +57,18 @@ 任务反馈 + 任务反馈 diff --git a/server/apps/audit/serializers.py b/server/apps/audit/serializers.py index 273486a..d82c2fa 100644 --- a/server/apps/audit/serializers.py +++ b/server/apps/audit/serializers.py @@ -3,7 +3,7 @@ from rest_framework import serializers from .models import * -from apps.system.serializers import DictSerializer, UserListSerializer +from apps.system.serializers import DictSimpleSerializer, UserListSerializer from apps.project.models import Project from apps.plan.models import Member from apps.project.serializers import PlanSerializer @@ -25,7 +25,7 @@ class ProjectSerializerX(serializers.ModelSerializer): def get_members(self, obj): queryset = obj.certapp_project.all() - members = Member.objects.filter(certapp__in=queryset, is_accepted=True, is_deleted=False).distinct('is_leader','user').order_by('-is_leader') + members = Member.objects.filter(certapp__in=queryset, is_deleted=False).distinct('is_leader','user').order_by('-is_leader') serializer = MemberSerializer(members, many=True) return serializer.data @@ -38,9 +38,9 @@ class ProjectSerializerX(serializers.ModelSerializer): return queryset class CertappSerializerX(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) + cert_field_ = DictSimpleSerializer(source='cert_field', read_only=True) + cccpv_class_ = DictSimpleSerializer(source='cccpv_class' , read_only=True) + cnas_scopes_ = DictSimpleSerializer(source='cnas_scopes', many=True , read_only=True) create_by_ = UserListSerializer(source='create_by', read_only=True) accept_by_ = UserListSerializer(source='accept_by', read_only=True) members = serializers.SerializerMethodField() @@ -56,6 +56,6 @@ class CertappSerializerX(serializers.ModelSerializer): return queryset def get_members(self, obj): - members = Member.objects.filter(certapp=obj, is_accepted=True, is_deleted=False).order_by('-is_leader') + members = Member.objects.filter(certapp=obj, is_deleted=False).order_by('-is_leader') serializer = MemberSerializer(members, many=True) return serializer.data \ No newline at end of file diff --git a/server/apps/certificate/models.py b/server/apps/certificate/models.py index f869c0f..2920949 100644 --- a/server/apps/certificate/models.py +++ b/server/apps/certificate/models.py @@ -20,4 +20,4 @@ class Certificate(CommonAModel): verbose_name_plural = verbose_name def __str__(self): - return self.number + return self.number \ No newline at end of file diff --git a/server/apps/certificate/serializers.py b/server/apps/certificate/serializers.py index b8c21ea..57d6570 100644 --- a/server/apps/certificate/serializers.py +++ b/server/apps/certificate/serializers.py @@ -1,14 +1,24 @@ +from apps.crm.models import Certunit, Enterprise from rest_framework import serializers from .models import * -from apps.system.serializers import DictSerializer - - +from apps.system.serializers import DictSimpleSerializer +from apps.crm.serializers import EnterpriseSimpleSerializer +from apps.crm.serializers import CertunitSimpleSerializer class CertificateSerializer(serializers.ModelSerializer): + status_ = DictSimpleSerializer(source='status', read_only=True) + enterprise_ = EnterpriseSimpleSerializer(source='certunit.enterprise', read_only=True) + certunit_ = CertunitSimpleSerializer(source='certunit', read_only=True) class Meta: model = Certificate fields = '__all__' - + + @staticmethod + def setup_eager_loading(queryset): + """ Perform necessary eager loading of data. """ + queryset = queryset.select_related('certunit','certunit__enterprise') + return queryset + class CertificateCreateSerializer(serializers.ModelSerializer): number = serializers.CharField(read_only = True) status = serializers.CharField(read_only = True) @@ -19,4 +29,10 @@ class CertificateCreateSerializer(serializers.ModelSerializer): class CertificateSimpleSerializer(serializers.ModelSerializer): class Meta: model = Certificate - fields = ['id', 'number'] \ No newline at end of file + fields = ['id', 'number'] + +# class CertificateListSerializer(serializers.ModelSerializer): +# status_ = DictSerializer(source='status', read_only=True) +# class Meta: +# model = Certificate +# fields = '__all__' \ No newline at end of file diff --git a/server/apps/certificate/views.py b/server/apps/certificate/views.py index e9b81a5..a4c261f 100644 --- a/server/apps/certificate/views.py +++ b/server/apps/certificate/views.py @@ -24,6 +24,8 @@ class CertificateViewSet(PageOrNot, OptimizationMixin, ModelViewSet): queryset = Certificate.objects.all() serializer_class = CertificateSerializer ordering = ['-create_time'] + filterset_fields = ['number', 'certunit__unittype'] + search_fields = ['number', 'certunit__name', 'certunit__enterprise__name'] def create(self, request, *args, **kwargs): """ diff --git a/server/apps/crm/serializers.py b/server/apps/crm/serializers.py index 03b41f7..9a412b6 100644 --- a/server/apps/crm/serializers.py +++ b/server/apps/crm/serializers.py @@ -44,4 +44,10 @@ class CertunitSimpleSerializer(serializers.ModelSerializer): enterprise_ = SimpEnterpriseSerializer(source='enterprise',read_only=True) class Meta: model = Certunit - fields = ['id', 'name','description','enterprise','enterprise_'] \ No newline at end of file + fields = ['id', 'name','description','enterprise','enterprise_'] + + +class EnterpriseSimpleSerializer(serializers.ModelSerializer): + class Meta: + model = Enterprise + fields = ['id', 'name'] diff --git a/server/apps/plan/views.py b/server/apps/plan/views.py index b37c57a..3ed15b5 100644 --- a/server/apps/plan/views.py +++ b/server/apps/plan/views.py @@ -43,11 +43,13 @@ class MemberViewSet(CreateUpdateCustomMixin, PageOrNot, ModelViewSet): queryset = Member.objects.all() serializer_class = MemberSerializer ordering = ['-is_leader', 'pk'] - filterset_fields = ['certapp'] + filterset_fields = ['certapp', 'certapp__project'] def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) + if CertApp.object.get(pk=request.data['certapp'])!='策划': + return Response('业务状态异常,操作失败', status = status.HTTP_400_BAD_REQUEST) if Member.objects.filter(user = request.data['user'], certapp=request.data['certapp'], is_deleted=False).exists(): return Response('已存在该成员', status= status.HTTP_400_BAD_REQUEST) self.perform_create(serializer) diff --git a/server/apps/project/admin.py b/server/apps/project/admin.py index 90a4296..8e47b4a 100644 --- a/server/apps/project/admin.py +++ b/server/apps/project/admin.py @@ -1,5 +1,4 @@ -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/0043_auto_20201014_1215.py b/server/apps/project/migrations/0043_auto_20201014_1215.py new file mode 100644 index 0000000..7e9a84d --- /dev/null +++ b/server/apps/project/migrations/0043_auto_20201014_1215.py @@ -0,0 +1,82 @@ +# Generated by Django 3.0.7 on 2020-10-14 04:15 + +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), + ('project', '0042_auto_20201009_1550'), + ] + + operations = [ + migrations.CreateModel( + name='CertAppFlow', + 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='删除标记')), + ('operation', models.TextField(verbose_name='操作描述')), + ('remark', models.TextField(blank=True, default='', verbose_name='操作备注')), + ('state', models.CharField(max_length=200, verbose_name='业务状态')), + ('data', django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True, verbose_name='certapp数据json')), + ('certapp', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='project.CertApp', verbose_name='业务')), + ('hander', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='处理人')), + ], + options={ + 'abstract': False, + }, + ), + migrations.RemoveField( + model_name='subapplication', + name='application', + ), + migrations.RemoveField( + model_name='subapplication', + name='belong_dept', + ), + migrations.RemoveField( + model_name='subapplication', + name='cccpv_class', + ), + migrations.RemoveField( + model_name='subapplication', + name='cert_field', + ), + migrations.RemoveField( + model_name='subapplication', + name='cnas_scopes', + ), + migrations.RemoveField( + model_name='subapplication', + name='create_by', + ), + migrations.RemoveField( + model_name='subapplication', + name='factory', + ), + migrations.RemoveField( + model_name='subapplication', + name='manufacture', + ), + migrations.RemoveField( + model_name='subapplication', + name='project', + ), + migrations.RemoveField( + model_name='subapplication', + name='update_by', + ), + migrations.DeleteModel( + name='Application', + ), + migrations.DeleteModel( + name='SubApplication', + ), + ] diff --git a/server/apps/project/migrations/0044_auto_20201014_1412.py b/server/apps/project/migrations/0044_auto_20201014_1412.py new file mode 100644 index 0000000..1759ae3 --- /dev/null +++ b/server/apps/project/migrations/0044_auto_20201014_1412.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.7 on 2020-10-14 06:12 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('project', '0043_auto_20201014_1215'), + ] + + operations = [ + migrations.RenameField( + model_name='certappflow', + old_name='hander', + new_name='handler', + ), + ] diff --git a/server/apps/project/models.py b/server/apps/project/models.py index 0a79e23..c6a2cf6 100644 --- a/server/apps/project/models.py +++ b/server/apps/project/models.py @@ -1,3 +1,4 @@ +from django.contrib.postgres.fields.jsonb import JsonAdapter from utils import model from django.contrib.postgres.fields import JSONField from django.db import models @@ -10,6 +11,76 @@ from apps.system.models import CommonAModel, CommonBModel, Dict, User # Create your models here. +# class Application(CommonBModel): +# """ +# 主申请 +# """ +# status_choices = ( +# ('草稿', '草稿'), +# ('已申请', '已申请'), +# ('已受理', '已受理'), +# ('进行中', '进行中'), +# ('已中止', '已中止'), +# ('已完成', '已完成') +# ) +# 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) +# fields = models.TextField('认证领域', blank=True) +# status = models.CharField('申请状态', choices=status_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 = '认证主申请' +# verbose_name_plural = verbose_name + +# def __str__(self): +# return self.number + +# 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 = 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('申请模式', 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 = '认证子申请' +# verbose_name_plural = verbose_name + +# def __str__(self): +# return self.number class Project(CommonBModel): """ 认证项目 @@ -117,76 +188,16 @@ class CertApp(CommonBModel): verbose_name = '认证受理' verbose_name_plural = verbose_name -class Application(CommonBModel): +class CertAppFlow(model.BaseModel): """ - 主申请 + certapp流转记录 """ - status_choices = ( - ('草稿', '草稿'), - ('已申请', '已申请'), - ('已受理', '已受理'), - ('进行中', '进行中'), - ('已中止', '已中止'), - ('已完成', '已完成') - ) - 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) - fields = models.TextField('认证领域', blank=True) - status = models.CharField('申请状态', choices=status_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 = '认证主申请' - verbose_name_plural = verbose_name - - def __str__(self): - return self.number - -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 = 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('申请模式', 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 = '认证子申请' - verbose_name_plural = verbose_name - - def __str__(self): - return self.number + certapp = models.ForeignKey(CertApp, on_delete=models.CASCADE, verbose_name='业务') + handler = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='处理人') + operation = models.TextField('操作描述') + remark = models.TextField('操作备注', default='', blank=True) + state = models.CharField('业务状态', max_length=200) + data = JSONField('certapp数据json', null=True, blank=True) class EvaluationDetail(CommonBModel): @@ -206,6 +217,7 @@ class Certappunit(CommonBModel): """ 认证单元,一个单元一张证书 """ + certunit = models.ForeignKey('crm.Certunit', verbose_name='单元', on_delete=models.CASCADE, related_name='certappunit_certunit') certapp = models.ForeignKey(CertApp, verbose_name='所属业务', on_delete = models.CASCADE, related_name='certappunit_certapp') decision = models.ForeignKey(Dict,verbose_name='认证决定', on_delete = models.CASCADE, related_name='unitaccess_decision', null=True, blank=True) @@ -256,6 +268,7 @@ class Certappunit(CommonBModel): remarks = models.TextField('检验反馈备注', null=True, blank=True) path = models.CharField('文件地址', max_length=1000, null=True, blank=True) inspectionstate = models.CharField('实验室检验状态', choices=charge_choices,null=True, blank=True, max_length=50) + class Meta: verbose_name = '认证单元' verbose_name_plural = verbose_name diff --git a/server/apps/project/serializers.py b/server/apps/project/serializers.py index f8d641d..73c28d3 100644 --- a/server/apps/project/serializers.py +++ b/server/apps/project/serializers.py @@ -9,36 +9,36 @@ from apps.certset.serializers import StandardSerializer from apps.plan.serializers import PlanSerializer from apps.laboratory.serializers import TestOrgSerializer -class ApplicationCreateSerializer(serializers.ModelSerializer): - number = serializers.CharField(required=False) - class Meta: - model = Application - fields = '__all__' +# 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__' +# 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() +# 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 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_ = DictSerializer(source='cert_field') - cccpv_class_ = DictSerializer(source='cccpv_class') - cnas_scopes_ = DictSerializer(source='cnas_scopes', many=True) - class Meta: - model = SubApplication - fields = '__all__' +# class SubApplicationUpdateSerializer(serializers.ModelSerializer): +# number = 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__' class CertappSerializer(serializers.ModelSerializer): cert_field_ = DictSerializer(source='cert_field', read_only=True) @@ -62,7 +62,9 @@ from apps.certificate.models import Certificate class CertappunitSerializer(serializers.ModelSerializer): certunit_ = CertunitSimpleSerializer(source = 'certunit', read_only=True) decision_ = DictSimpleSerializer(source = 'decision', read_only=True) + testorg_ = TestOrgSerializer(source = 'testorg', read_only=True) + certificate_ = serializers.SerializerMethodField() class Meta: model = Certappunit diff --git a/server/apps/project/urls.py b/server/apps/project/urls.py index 60d8ce5..bcee0a0 100644 --- a/server/apps/project/urls.py +++ b/server/apps/project/urls.py @@ -3,8 +3,8 @@ from .views import * from rest_framework import routers router = routers.DefaultRouter() -router.register('application', ApplicationViewSet, basename="application") -router.register('subapplication', SubApplicationViewSet, basename="subapplication") +# router.register('application', ApplicationViewSet, basename="application") +# router.register('subapplication', SubApplicationViewSet, basename="subapplication") router.register('certapp', CertappViewset, basename="certapp") router.register('certappunit', CertappunitViewset, basename="certappunit") router.register('evaluationdetail', EvaluationDetailViewset, basename="evaluationdetail") diff --git a/server/apps/project/views.py b/server/apps/project/views.py index 5943720..15ae568 100644 --- a/server/apps/project/views.py +++ b/server/apps/project/views.py @@ -21,54 +21,54 @@ from rest_framework.exceptions import ParseError, NotAuthenticated from django.utils import timezone # Create your views here. -class ApplicationViewSet(RbacFilterSet, 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'] +# class ApplicationViewSet(RbacFilterSet, 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 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)) +# 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(RbacFilterSet, 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'] +# class SubApplicationViewSet(RbacFilterSet, 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 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) - 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 create(self, request, *args, **kwargs): +# postdata = request.data +# postdata['number'] = random.randrange(1000,2000) +# 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): +# 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) +# 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) class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet): """ @@ -89,7 +89,9 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet): postdata['cert_field'] = Dict.objects.get(code=postdata['field_code']).id serializer = self.get_serializer(data=postdata) serializer.is_valid(raise_exception=True) - self.perform_create(serializer) + # self.perform_create(serializer) + instance = serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept, state='受理') + CertAppFlow.objects.create(certapp = instance, handler=self.request.user, data=serializer.data, operation='创建申请', state='申请') headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) @@ -102,6 +104,7 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet): obj = self.get_object() obj.state = '策划' obj.save() + CertAppFlow.objects.create(certapp = obj, handler=self.request.user, data=self.get_serializer(obj), operation='完成受理', state='受理') return Response(status=status.HTTP_200_OK) @action(methods=['put'], detail=False, perms_map={'put':'certapp_review'}, @@ -120,7 +123,7 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet): @action(methods=['put'], detail=True, perms_map={'put':'certapp_access'}, url_name='certapp_access') def access(self, request, pk=None): """ - 认证评定 + 评定 """ # instance, ok = Certaccess.objects.get_or_create(certapp=self.get_object(), defaults={'certapp':self.get_object() # , 'conclusion':Dict.objects.get(pk=request.data['conclusion']), 'score':request.data['score']}) @@ -204,20 +207,23 @@ class CertappunitViewset(PageOrNot, ModelViewSet): return Response(status=status.HTTP_200_OK) else: return Response('检测任务异常,操作失败', status=status.HTTP_400_BAD_REQUEST) - @action(methods=['put'], detail=True, perms_map={'put':'certapp_createsamples'}, url_name='certappunit_createsamples') def createsamples(self, request, pk=None): """ 实验室任务反馈 """ obj = self.get_object() + obj.teststate = '到样检测中' obj.sampledate = request.data['sampledate'] - obj.inspectionstate = request.data['inspectionstate'] - if request.data['inspectionstate']=="已检测": - obj.teststate = '待评定' - else: - obj.teststate = '到样检测中' - + obj.save() + return Response(status=status.HTTP_200_OK) + @action(methods=['put'], detail=True, perms_map={'put':'certapp_createcomplete'}, url_name='certappunit_createcomplete') + def createcomplete(self, request, pk=None): + """ + 实验室任务反馈 + """ + obj = self.get_object() + obj.teststate = '待提取报告' obj.path = request.data['path'] obj.conclusion = request.data['conclusion'] obj.completedate = request.data['completedate'] @@ -230,6 +236,7 @@ class CertappunitViewset(PageOrNot, ModelViewSet): +from apps.plan.models import Member class ProjectViewSet(RbacFilterSet, ModelViewSet): perms_map = {'get': 'project_view', 'post':'project_create', 'put':'project_update','delete': 'project_delete'} queryset = Project.objects.all() @@ -248,28 +255,23 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet): postdata['number'] = random.randrange(8000,9000) serializer = self.get_serializer(data=postdata) serializer.is_valid(raise_exception=True) - 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, state='进行中') - headers = self.get_success_headers(serializer.data) - return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) - else: - return NotAuthenticated() + 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) + instance.state = '待策划' + instance.save() + headers = self.get_success_headers(serializer.data) + return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) - @action(methods=['put'], detail=True, perms_map={'put':'project_next'}, - url_name='project_next') - def next(self, request, pk=None): + @action(methods=['put'], detail=True, perms_map={'put':'project_assgin'}, + url_name='project_assgin') + def assgin(self, request, pk=None): """ - 项目流转 + 审核任务下达 """ obj = self.get_object() - if obj.state == '创建中': - obj.state = '待策划' - obj.save() - return Response(status=status.HTTP_200_OK) - elif obj.state == '策划中' and obj.can_paichai: - obj.state = '待现场审核' + if obj.state == '策划中': + obj.state = '审核任务已下达' obj.save() return Response(status=status.HTTP_200_OK) else: @@ -280,16 +282,16 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet): url_name='project_plan') def plan(self, request, *args, **kwargs): """ - 项目计划 + 加入计划 """ projects = request.data['projects'] plan = request.data['plan'] if projects: objs = Project.objects.filter(pk__in=projects) for i in objs: - i.plan=plan + i.plan=Plan.objects.get(pk=plan) if i.state == '待策划': - i.state == '策划中' + i.state = '策划中' i.save() return Response(status=status.HTTP_200_OK) @@ -304,3 +306,20 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet): obj.edate1 = request.data['edate1'] obj.save() return Response(status=status.HTTP_200_OK) + + @action(methods=['put'], detail=True, perms_map={'put':'audit_accept'},url_name='audit_accept') + def accept(self, request, *args, **kwargs): + """ + 接受项目审核任务 + """ + obj = self.get_object() + if obj.state == '审核任务已下达': + obj.state = '审核任务已接受' + obj.save() + Member.objects.filter(certapp__project=obj).update(is_accepted=True) + obj.certapp_project.all().update(state='审核') + for i in obj.certapp_project.all(): + CertAppFlow.objects.create(certapp = i, handler=self.request.user, operation='审核任务已接受', state='策划') + return Response(status=status.HTTP_200_OK) + return Response('项目状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST) + \ No newline at end of file diff --git a/server/apps/system/serializers.py b/server/apps/system/serializers.py index 694ec68..9480d9a 100644 --- a/server/apps/system/serializers.py +++ b/server/apps/system/serializers.py @@ -42,7 +42,7 @@ class DictSerializer(serializers.ModelSerializer): class DictSimpleSerializer(serializers.ModelSerializer): class Meta: model = Dict - fields = ['pk', 'name', 'code'] + fields = ['id', 'name', 'code'] class PositionSerializer(serializers.ModelSerializer): """