cnas/server/apps/project/views.py

471 lines
20 KiB
Python

import re
from django.http import request
from rest_framework.views import APIView
from django.shortcuts import render
from rest_framework.serializers import ModelSerializer
from rest_framework.viewsets import ModelViewSet, GenericViewSet
from rest_framework.response import Response
from rest_framework import status
from .models import *
from .serializers import *
from apps.crm.models import Certunit
from apps.system.models import Dict
from apps.laboratory.models import TestOrg
from apps.system.permission_data import RbacFilterSet
from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin
import random
from rest_framework.decorators import action
from rest_framework.generics import ListAPIView
from .filters import *
from utils.pagination import PageOrNot
from rest_framework.exceptions import ParseError, NotAuthenticated
from django.utils import timezone
from rest_framework.mixins import ListModelMixin
# 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']
# 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(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 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):
# 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):
"""
申请受理
"""
perms_map = {'get': 'certapp_view', 'post':'certapp_create', 'put':'certapp_update','delete': 'certapp_delete'}
queryset = CertApp.objects.all()
serializer_class = CertappSerializer
ordering = ['-create_time']
filterset_fields = ['state', 'project', 'certappunit_certapp__teststate', 'cert_field']
# filterset_class = CertAppFilter
def filter_queryset(self, queryset):
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self).distinct()
return queryset
def perform_destroy(self, instance):
instance.delete(soft=False)
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
serializer = self.get_serializer(data=postdata)
serializer.is_valid(raise_exception=True)
# self.perform_create(serializer)
obj = serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept, state='受理')
CertAppFlow.objects.create(certapp = obj, handler=self.request.user, data=serializer.data, operation='创建申请', state='申请')
headers = self.get_success_headers(serializer.data)
if 'field_code' in postdata and postdata['field_code'] == 'QMS':
instance,_ = Certunit.objects.get_or_create(enterprise = Enterprise.objects.get(pk=request.data['enterprise']))
Certappunit.objects.create(certunit=instance, certapp=obj)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
@action(methods=['put'], detail=True, perms_map={'put':'certapp_complete'},
url_name='complete_certapp')
def complete(self, request, pk=None):
"""
完成受理
"""
obj = self.get_object()
if obj.state == '受理':
obj.state = '策划'
obj.save()
CertAppFlow.objects.create(certapp = obj, handler=self.request.user, operation='完成受理', state='受理')
return Response(status=status.HTTP_200_OK)
return Response('业务状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST)
@action(methods=['put'], detail=False, perms_map={'put':'certapp_review'},
url_name='review_certapp')
def review(self, request, pk=None):
"""
完成评审
"""
certapps = request.data['certapps']
rlist = request.data['rlist']
for i in rlist:
obj = EvaluationDetail.objects.create(item=Evaluations.objects.get(id=i['id']),item_v=i['content'], create_by=request.user, result=i['result'] if 'result' in i and i['result'] else None)
obj.cert_app.add(*certapps)
return Response(status=status.HTTP_200_OK)
@action(methods=['put'], detail=True, perms_map={'put':'certapp_access'}, url_name='certapp_access')
def access(self, request, pk=None):
"""
评定
"""
# obj, 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']})
# if not ok:
obj = self.get_object()
oldstate = obj.state
obj.conclusion = Dict.objects.get(pk=request.data['conclusion'])
obj.score = request.data['score']
obj.state = '出证'
obj.save()
obj.nonitems.clear()
obj.nonitems.add(*request.data['nonitems'])
CertAppFlow.objects.create(certapp = obj, handler=self.request.user, operation='提交评定结论', state=oldstate)
return Response({'state':obj.state}, status=status.HTTP_200_OK)
@action(methods=['put'], detail=True, perms_map={'put':'certapp_feedback'},
url_name='certapp_feedback')
def feedback(self, request, *args, **kwargs):
"""
业务反馈
"""
obj = self.get_object()
if obj.state in ['现场审核', '产品检测']:
oldstate = obj.state
if obj.cert_field.parent.code == 'PRO':
obj.state = '产品检测'
else:
obj.state = '评定'
obj.save()
CertAppFlow.objects.create(certapp = obj, handler=self.request.user, operation='提交现场审核反馈', state=oldstate)
return Response({'state':obj.state}, status=status.HTTP_200_OK)
return Response('业务状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST)
@action(methods=['get'], detail=True, perms_map={'get':'*'},
url_name='certapp_flow')
def flow(self, request, *args, **kwargs):
"""
业务流程进度
"""
objs = CertAppFlow.objects.filter(certapp__pk=kwargs['pk'])
serializer = CertappflowSerializer(objs, many=True)
return Response(serializer.data)
@action(methods=['put'], detail=False, perms_map={'put':'certapp_bind'},
url_name='certapp_bind')
def bind(self, request, *args, **kwargs):
"""
绑定至项目
"""
ids = request.data['ids']
project = Project.objects.get(pk=request.data['project'])
CertApp.objects.filter(pk__in=ids, is_deleted=False, project__isnull=True).update(project=project)
return Response(status=status.HTTP_200_OK)
@action(methods=['put'], detail=True, perms_map={'put':'certapp_unbind'},
url_name='certapp_unbind')
def unbind(self, request, *args, **kwargs):
"""
与项目解绑
"""
obj = self.get_object()
if obj.state == '策划':
obj.project = None
obj.save()
return Response(status=status.HTTP_200_OK)
return Response('业务状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST)
class EvaluationDetailViewset(CreateUpdateCustomMixin, PageOrNot, ModelViewSet):
"""
受理信息
"""
perms_map = {'get': '*', 'post': 'EvaluationDetail_create',
'put': 'EvaluationDetail_update', 'delete': 'EvaluationDetail_delete'}
queryset = EvaluationDetail.objects
serializer_class = EvaluationDetailSerializer
filterset_fields = ['cert_app']
ordering = ['-create_time']
def reviewupdate(self, request, pk=None):
"""
完成评审
"""
rlist = request.data['rlist']
for i in rlist:
obj = EvaluationDetail.objects.update(item=Evaluations.objects.get(id=i['id']),item_v=i['content'], update_by=request.user, result=i['result'] )
return Response(status=status.HTTP_200_OK)
class CertappunitViewset(PageOrNot, ModelViewSet):
perms_map={'get': '*', '*':'certapp_view'}
queryset = Certappunit.objects.all()
serializer_class = CertappunitSerializer
filterset_fields = ['certapp','teststate','id','inspectionstate']
ordering= ['-id']
@action(methods=['put'], detail=True, perms_map={'put':'certapp_access'}, url_name='certappunit_access')
def access(self, request, pk=None):
"""
单元评定
"""
obj = self.get_object()
if obj.teststate == '待评定':
if request.data['decision']:
obj.decision = Dict.objects.get(pk=request.data['decision'])
else:
obj.decision = None
obj.teststate = '已评定'
obj.save()
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_testtask'}, url_name='certappunit_testtask')
def testtask(self, request, pk=None):
"""
检测任务
"""
obj = self.get_object()
obj.testorg = TestOrg.objects.get(pk=request.data['testorg'])
obj.remark = request.data['remark']
obj.sampledec = request.data['sampledec']
obj.detnumber = request.data['detnumber']
obj.testitem = request.data['testitem']
obj.charge = request.data['charge']
obj.save()
return Response(status=status.HTTP_200_OK)
@action(methods=['put'], detail=True, perms_map={'put':'certapp_teststate'}, url_name='certappunit_teststate')
def teststate(self, request, pk=None):
"""
修改检测任务状态
"""
obj = self.get_object()
if obj.teststate == "待CTC下达":
obj.teststate = request.data['teststate']
obj.inspectionstate = "待检验"
obj.save()
return Response(status=status.HTTP_200_OK)
elif obj.teststate == "待提交CTC":
obj.teststate = request.data['teststate']
obj.save()
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.inspectionstate = "在检验"
obj.sampledate = request.data['sampledate']
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.inspectionstate = "已检验"
obj.conclusion = request.data['conclusion']
obj.completedate = request.data['completedate']
obj.issuancedate = request.data['issuancedate']
obj.resultremark = request.data['resultremark']
obj.remarks = request.data['remarks']
obj.save()
return Response(status=status.HTTP_200_OK)
class TaskList(ListAPIView):
"""
实验室任务
"""
perms_map = {'get': 'certapptasklist_view'}
serializer_class = CertappunitSerializerx
filterset_fields = ['certapp','teststate','id','inspectionstate']
ordering= ['-id']
def get_queryset(self):
queryset = Certappunit.objects.filter(teststate__in=['待实验室检验', '到样检测中'])
if hasattr(self.get_serializer_class(), 'setup_eager_loading'):
queryset = self.get_serializer_class().setup_eager_loading(queryset)
return queryset
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()
serializer_class = ProjectSerializer
ordering = ['pk']
filterset_class = ProjectFilter
search_fields = ['auditee__name', 'plan__name']
def get_serializer_class(self):
if self.action == 'update':
return ProjectUpdateSerializer
return ProjectSerializer
def perform_destroy(self, instance):
instance.delete(soft=False)
def create(self, request, *args, **kwargs):
postdata = request.data
postdata['number'] = random.randrange(8000,9000)
serializer = self.get_serializer(data=postdata)
serializer.is_valid(raise_exception=True)
obj = serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept)
obj.state = '创建中' #空项目
if 'certapps' in postdata and postdata['certapps']:
CertApp.objects.filter(pk__in = postdata['certapps']).update(project=obj)
obj.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_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)
return Response('项目状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST)
@action(methods=['put'], detail=True, perms_map={'put':'project_toplan'},
url_name='project_toplan')
def toplan(self, request, *args, **kwargs):
"""
转入策划
"""
obj = self.get_object()
if CertApp.objects.filter(project=obj, is_deleted=False).exists():
obj.state = '待策划'
obj.save()
return Response(status=status.HTTP_200_OK)
else:
return Response('该项目没有业务信息,操作失败', status=status.HTTP_400_BAD_REQUEST)
@action(methods=['put'], detail=False, perms_map={'put':'project_plan'},
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.objects.get(pk=plan)
if i.state == '待策划':
i.state = '策划中'
i.save()
return Response(status=status.HTTP_200_OK)
@action(methods=['put'], detail=True, perms_map={'put':'project_edate'},
url_name='project_edate')
def edate(self, request, *args, **kwargs):
"""
制定预期审核时间
"""
obj = self.get_object()
if obj.state == '审核任务已接受':
obj.edate0 = request.data['edate0']
obj.edate1 = request.data['edate1']
obj.state = '待现场审核'
obj.save()
for i in obj.certapp_project.all():
CertAppFlow.objects.create(certapp = i, handler=self.request.user, operation='已安排现场审核时间', state='现场审核')
return Response({'edate0':obj.edate0, 'edate1':obj.edate1, 'state':obj.state}, status=status.HTTP_200_OK)
else:
return Response('项目状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST)
@action(methods=['put'], detail=True, perms_map={'put':'project_start'},
url_name='project_start')
def start(self, request, *args, **kwargs):
"""
开始审核
"""
obj = self.get_object()
if obj.state == '待现场审核':
obj.start_date = request.data['start_date']
obj.state = '现场审核中'
obj.save()
for i in obj.certapp_project.all():
CertAppFlow.objects.create(certapp = i, handler=self.request.user, operation='现场审核中', state='现场审核')
return Response({'start_date':obj.start_date,'state':obj.state}, status=status.HTTP_200_OK)
else:
return Response('项目状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST)
@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)
@action(methods=['put'], detail=True, perms_map={'put':'project_feedback'},
url_name='project_feedback')
def feedback(self, request, *args, **kwargs):
"""
项目反馈
"""
obj = self.get_object()
if obj.state == '现场审核中':
obj.start_date = request.data['start_date']
obj.end_date = request.data['end_date']
obj.feedback_remark = request.data['feedback_remark']
obj.state = '任务已反馈'
obj.save()
return Response({'start_date':obj.start_date, 'end_date':obj.end_date,'state':obj.state}, status=status.HTTP_200_OK)
else:
return Response('项目状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST)