xialaneirong

This commit is contained in:
shilixia 2020-10-09 15:58:36 +08:00
commit 2e4834afab
26 changed files with 546 additions and 247 deletions

View File

@ -54,3 +54,11 @@ export function getCertapp(id) {
method: 'get',
})
}
export function accessCertapp(id, data) {
return request({
url: `/project/certapp/${id}/access/`,
method: 'put',
data
})
}

View File

@ -0,0 +1,32 @@
import request from '@/utils/request'
export function getCertappunitList(query) {
return request({
url: '/project/certappunit/',
method: 'get',
params: query
})
}
// export function createAccess(data) {
// return request({
// url: '/accessment/certass/',
// method: 'post',
// data
// })
// }
// export function updateAccess(id, data) {
// return request({
// url: `/accessment/certass/${id}/`,
// method: 'put',
// data
// })
// }
// export function deleteAccess(id) {
// return request({
// url: `/accessment/certass/${id}/`,
// method: 'delete'
// })
// }

View File

@ -73,38 +73,4 @@ export function deleteTestOrgNotice(id) {
}
export function getDetectionTaskList(query) {
return request({
url: '/laboratory/detectiontask/',
method: 'get',
params: query
})
}
export function getDetectionTask(id) {
return request({
url: `/laboratory/detectiontask/${id}/`,
method: 'get'
})
}
export function createDetectionTask(data) {
return request({
url: '/laboratory/detectiontask/',
method: 'post',
data
})
}
export function updateDetectionTask(id, data) {
return request({
url: `/laboratory/detectiontask/${id}/`,
method: 'put',
data
})
}
export function deleteDetectionTask(id) {
return request({
url: `/laboratory/detectiontask/${id}/`,
method: 'delete'
})
}

View File

@ -98,6 +98,6 @@ div:focus {
.el-button+.el-button {
margin-left: 1px;
}
.el-button {
border-radius: 0px;
}
// .el-button {
// border-radius: 0px;
// }

View File

@ -3,64 +3,197 @@
<el-card>
<div slot="header" class="clearfix">
<span>评定结论</span>
</div>
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="120px" style="margin-top:10px">
<el-col :xs="24" :md="12">
<el-form-item label="工厂检查结论" prop="conclusion">
<el-select
v-model="formData.conclusion"
placeholder="请选择工厂检查结论"
clearable
:style="{width: '100%'}"
>
<el-option
v-for="(item, index) in conclusionOptions"
:key="index"
:label="item.name"
:value="item.id"
:disabled="item.disabled"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :md="12">
<el-form-item label="不符合项" prop="nonitems" >
<el-select
v-model="formData.nonitems"
placeholder="请选择不符合项"
clearable
multiple
collapse-tags
:style="{width: '100%'}"
>
<el-option
v-for="(item, index) in nonOptions"
:key="index"
:label="item.name"
:value="item.id"
:disabled="item.disabled"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :md="12">
<el-form-item label="审核质量评分" prop="score" >
<el-input-number v-model="formData.score" :min="1" :max="100" style="width:100%"></el-input-number>
</el-form-item>
</el-col>
<div style="text-align:center">
<el-button type="primary" @click="save">保存</el-button>
</div>
</el-form>
</el-card>
<el-card style="margin-top:6px">
<div slot="header" class="clearfix">
<span>业务涉及的认证单元</span>
</div>
<el-table
ref="elTable"
v-loading="listLoading"
:data="tableData"
:data="tableUnitData"
style="width: 100%;"
border
fit
stripe
highlight-current-row
height="380"
>
<el-table-column label="评定表编号">
<template slot-scope="scope">{{ scope.row.number }}</template>
<el-table-column type="index" width="50" />
<el-table-column label="单元名称">
<template slot-scope="scope" >{{ scope.row.name }}</template>
</el-table-column>
<el-table-column label="工厂检查结论">
<template slot-scope="scope">{{ scope.row.conclusion }}</template>
<el-table-column label="证书信息">
<template slot-scope="scope">
<!-- <el-button
type="danger"
size="small"
:disabled="!checkPermission(['certapps_update'])"
@click="handleDelete(scope)"
>删除</el-button> -->
</template>
</el-table-column>
<el-table-column label="不符合项分类">
<template slot-scope="scope">{{ scope.row.create_time }}</template>
<el-table-column label="认证决定">
<template slot-scope="scope">
<!-- <el-button
type="danger"
size="small"
:disabled="!checkPermission(['certapps_update'])"
@click="handleDelete(scope)"
>删除</el-button> -->
</template>
</el-table-column>
<el-table-column label="创建时间">
<template slot-scope="scope">{{ scope.row.create_time }}</template>
<el-table-column label="操作">
<template slot-scope="scope">
<!-- <el-button
type="danger"
size="small"
:disabled="!checkPermission(['certapps_update'])"
@click="handleDelete(scope)"
>删除</el-button> -->
</template>
</el-table-column>
</el-table>
<!-- <el-table
ref="elTable"
v-loading="listLoading"
:data="tableData"
style="width: 100%;"
border
fit
stripe
highlight-current-row
>
<el-table-column label="评定表编号">
<template slot-scope="scope">{{ scope.row.number }}</template>
</el-table-column>
<el-table-column label="工厂检查结论">
<template slot-scope="scope">{{ scope.row.conclusion }}</template>
</el-table-column>
<el-table-column label="不符合项分类">
<template slot-scope="scope">{{ scope.row.create_time }}</template>
</el-table-column>
<el-table-column label="创建时间">
<template slot-scope="scope">{{ scope.row.create_time }}</template>
</el-table-column>
</el-table> -->
</el-card>
</div>
</template>
<script>
import { getDictList } from "@/api/dict"
import { accessCertapp, getCertapp } from "@/api/certapp"
import { getCertappunitList } from "@/api/certappunit"
import { getCertunitList } from "@/api/certunit";
export default {
name: "access",
props:['certapp'],
data() {
return {
listLoading: false,
tableData: [],
formData:{},
rules:{
conclusion: [
{
required: true,
message: "请选择",
trigger: "blur",
},
],
nonitems: [
{
required: true,
message: "请选择",
trigger: "blur",
},
],
score: [
{
required: true,
message: "请输入",
trigger: "blur",
},
],
},
conclusionOptions:[],
nonOptions:[],
tableUnitData: [],
listQuery:{
pageoff:true,
certapp:this.certapp
}
};
},
created() {
this.getConclusion()
this.getOptions1()
this.getOptions2()
this.getUnitList();
},
methods:{
getConclusion() {
getCertapp(this.certapp).then(res=>{
if(res.data){
this.formData = res.data
}
})
},
getOptions1() {
getDictList({type__code:'factory_check_conclusion', pageoff:true}).then(res=>{
this.conclusionOptions = res.data
})
},
getOptions2() {
getDictList({type__code:'factory_check_noitem', pageoff:true}).then(res=>{
this.nonOptions = res.data
})
},
getUnitList() {
this.listLoading = true;
getCertappunitList(this.listQuery).then((response) => {
if (response.data) {
this.tableUnitData = response.data;
}
this.listLoading = false;
});
},
save() {
this.$refs["elForm"].validate((valid) => {
if (!valid) return;
accessCertapp(this.certapp, this.formData).then((res) => {
this.$message.success('成功')
});
});
}
}
};
</script>

View File

@ -1,6 +1,7 @@
<template>
<div class="app-container">
<div style="display:flex">
<el-row :gutter="6">
<el-col :xs="24" :md="4">
<treeselect
v-model="listQuery.user__dept"
:multiple="false"
@ -8,15 +9,18 @@
placeholder="所属组织"
:disable-branch-nodes="true"
@input="handleFilter"
style="width: 280px" clearable/>
style="width: 100%" clearable/>
</el-col>
<el-col :xs="24" :md="4">
<el-input
v-model="listQuery.search"
placeholder="姓名/易记码/编号/注册领域"
style="width: 300px;margin-left:10px"
style="width: 100%"
class="filter-item"
@keyup.enter.native="handleFilter"
/>
</el-col>
<el-col :xs="24" :md="4">
<el-button
class="filter-item"
type="primary"
@ -28,8 +32,9 @@
type="primary"
icon="el-icon-refresh-left"
@click="resetFilter"
>刷新重置</el-button>
</div>
>刷新</el-button>
</el-col>
</el-row>
<el-table
v-loading="listLoading"
:data="tableData.results"

View File

@ -2,7 +2,7 @@
<div>
<el-table
v-loading="listLoading"
:data="tableData.results"
:data="tableData"
style="width: 100%;"
border
fit
@ -37,14 +37,6 @@
</template>
</el-table-column>
</el-table>
<pagination
v-show="tableData.count>0"
:total="tableData.count"
:page.sync="listQuery.page"
:limit.sync="listQuery.page_size"
@pagination="getList"
/>
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="80px" style="margin-top:10px">
<el-col :xs="24" :md="12">
<el-form-item label="实施规则" prop="implementrule">
@ -154,11 +146,10 @@ export default {
props:['certapp'],
data() {
return {
tableData: { count: 0 },
tableData: [],
listLoading: true,
listQuery: {
page: 1,
page_size: 20,
pageoff:true,
certappunit_certunit__certapp:this.certapp
},
formData: {

View File

@ -2,7 +2,7 @@
<div>
<el-table
v-loading="listLoading"
:data="tableData.results"
:data="tableData"
style="width: 100%;"
border
fit
@ -11,6 +11,7 @@
height="380"
@row-click="rowClick"
>
<el-table-column type="index" width="50" />
<el-table-column label="检测任务号">
<template slot-scope="scope" >{{ scope.row.detnumber }}</template>
@ -35,13 +36,7 @@
</el-table-column>
</el-table>
<pagination
v-show="tableData.count>0"
:total="tableData.count"
:page.sync="listQuery.page"
:limit.sync="listQuery.page_size"
@pagination="getList"
/>
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="150px" style="margin-top:10px">
<el-col :xs="24" :md="12">
<el-form-item label="被委托检测机构" prop="testorg">
@ -109,10 +104,10 @@
</el-form-item>
</el-col>
<el-col :xs="24" :md="12">
<el-form-item label="检测单元" prop="testorg">
<el-select v-model="formData.testorg" placeholder="请选择检测单元" clearable :style="{width: '100%'}">
<el-form-item label="检测单元" prop="testunity">
<el-select v-model="formData.testunity" placeholder="请选择检测单元" clearable :style="{width: '100%'}">
<el-option
v-for="(item, index) in TestOptions"
v-for="(item, index) in unitOptions"
:key="index"
:label="item.label"
:value="item.value"
@ -136,13 +131,19 @@
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item size="large">
<el-button type="primary" @click="createNew">保存</el-button>
</el-form-item>
</el-col>
</el-form>
</div>
</template>
<script>
import { getDetectionTaskList} from "@/api/laboratory"
import { getTestOrgList} from "@/api/laboratory"
import { getDictList } from "@/api/dict";
import { getCertunitList } from "@/api/certunit";
import {getCertappunitList} from "@/api/certappunit";
import Pagination from "@/components/Pagination";
import checkPermission from "@/utils/permission";
import Treeselect from "@riophae/vue-treeselect";
@ -154,8 +155,13 @@ export default {
props:['certapp'],
data() {
return {
tableData: { count: 0 },
tableData: [],
listLoading: true,
listQuery1:{
pageoff:true,
certappunit_certunit__certapp:this.certapp
},
listQuery: {
page: 1,
page_size: 20
@ -164,9 +170,11 @@ export default {
testorg: undefined,
testitem:undefined,
detnumber:undefined,
remark:undefined
remark:undefined,
testunity:undefined
},
TestOptions:[],
unitOptions:[],
patternOptions: [
{
label: "规则规定的项目",
@ -196,14 +204,17 @@ export default {
},
created() {
this.getList();
this.getTestOptions()
this.getTestOptions();
this.gettunitList()
},
methods: {
checkPermission,
getList() {
this.listLoading = true;
getDetectionTaskList(this.listQuery).then((response) => {
getCertappunitList({ pageoff:true,
certappunit_certunit__certapp:this.certapp}).then((response) => {
if (response.data) {
@ -213,6 +224,16 @@ export default {
this.listLoading = false;
});
},
gettunitList() {
this.listLoading = true;
getCertunitList(this.listQuery1).then(res=>{
this.unitOptions = genTree(res.data);
});
},
getTestOptions(){
getTestOrgList().then(res=>{
this.TestOptions = genTree(res.data.results)

View File

@ -309,6 +309,9 @@ export default {
})
},
async confirm1(form) {
if(this.dicttype.parent==undefined){
this.dicttype.parent = null
}
this.$refs[form].validate(valid => {
if (valid) {
const isEdit = this.dgT1 === 'edit'
@ -363,7 +366,7 @@ export default {
return false
}
})
}
},
}
}
</script>

View File

@ -0,0 +1,44 @@
# Generated by Django 3.0.7 on 2020-09-29 07:44
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('system', '0031_delete_bscodeset'),
('project', '0038_certappunit_testorg'),
('accessment', '0002_auto_20200921_1444'),
]
operations = [
migrations.RemoveField(
model_name='unitaccess',
name='certaccess',
),
migrations.RemoveField(
model_name='unitaccess',
name='certificate',
),
migrations.RemoveField(
model_name='unitaccess',
name='certunit',
),
migrations.AddField(
model_name='unitaccess',
name='certappunit',
field=models.OneToOneField(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='unitaccess_certappunit', to='project.Certappunit'),
preserve_default=False,
),
migrations.AlterField(
model_name='certaccess',
name='certapp',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='certaccess_certapp', to='project.CertApp'),
),
migrations.AlterField(
model_name='unitaccess',
name='decision',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='unitaccess_decision', to='system.Dict', verbose_name='认证决定'),
),
]

View File

@ -0,0 +1,35 @@
# Generated by Django 3.0.7 on 2020-09-29 08:05
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('accessment', '0003_auto_20200929_1544'),
]
operations = [
migrations.RemoveField(
model_name='unitaccess',
name='certappunit',
),
migrations.RemoveField(
model_name='unitaccess',
name='create_by',
),
migrations.RemoveField(
model_name='unitaccess',
name='decision',
),
migrations.RemoveField(
model_name='unitaccess',
name='update_by',
),
migrations.DeleteModel(
name='Certaccess',
),
migrations.DeleteModel(
name='Unitaccess',
),
]

View File

@ -5,38 +5,36 @@ from rest_framework.exceptions import ParseError
from simple_history.models import HistoricalRecords
from apps.certset.models import ImplementRule, UnitType, EvaluationItem, Standard
from apps.crm.models import Enterprise
from apps.project.models import CertApp
from apps.system.models import CommonAModel, CommonBModel, Dict, User
# from apps.crm.models import Enterprise
# from apps.project.models import CertApp
# from apps.system.models import CommonAModel, CommonBModel, Dict, User
class Certaccess(CommonAModel):
"""
业务评定
"""
certapp = models.ForeignKey('project.certapp', on_delete=models.CASCADE, related_name='unitaccess_certapp')
conclusion = models.ForeignKey(Dict, verbose_name='工厂检查结论', on_delete=models.CASCADE, related_name='certaccess_conclusion')
nonitems = models.ManyToManyField(Dict, verbose_name='不符合项目', related_name='certaccess_nonitems')
score = models.IntegerField('审核质量评分', default=0)
# class Certaccess(CommonAModel):
# """
# 业务评定
# """
# certapp = models.ForeignKey('project.certapp', on_delete=models.CASCADE, related_name='certaccess_certapp')
# conclusion = models.ForeignKey(Dict, verbose_name='工厂检查结论', on_delete=models.CASCADE, related_name='certaccess_conclusion')
# nonitems = models.ManyToManyField(Dict, verbose_name='不符合项目', related_name='certaccess_nonitems')
# score = models.IntegerField('审核质量评分', default=0)
class Meta:
verbose_name = '业务评定'
verbose_name_plural = verbose_name
# class Meta:
# verbose_name = '业务评定'
# verbose_name_plural = verbose_name
def __str__(self):
return self.certapp.number
# def __str__(self):
# return self.certapp.number
class Unitaccess(CommonAModel):
"""
单元评定
"""
certunit = models.ForeignKey('crm.Certunit', on_delete=models.CASCADE, related_name='unitaccess_certunit')
certificate = models.ForeignKey('certificate.Certificate', on_delete=models.CASCADE, null=True, blank=True, related_name='unitaccess_certificate')
decision = models.ForeignKey(Dict,verbose_name='认证决定', on_delete=models.CASCADE)
certaccess = models.ForeignKey('accessment.Certaccess', on_delete=models.CASCADE, related_name='unitaccess_certaccess')
# class Unitaccess(CommonAModel):
# """
# 单元评定
# """
# certappunit = models.OneToOneField('project.Certappunit', on_delete=models.CASCADE, related_name='unitaccess_certappunit')
# decision = models.ForeignKey(Dict,verbose_name='认证决定', on_delete=models.CASCADE, related_name='unitaccess_decision')
class Meta:
verbose_name = '认证单元评定'
verbose_name_plural = verbose_name
# class Meta:
# verbose_name = '认证单元评定'
# verbose_name_plural = verbose_name
def __str__(self):
return self.decision
# def __str__(self):
# return self.decision

View File

@ -1,26 +1,26 @@
from apps.system.models import Dict
from rest_framework import serializers
# from apps.system.models import Dict
# from rest_framework import serializers
from .models import Certaccess, Unitaccess
# from .models import Certaccess, Unitaccess
from apps.system.serializers import DictSerializer
# from apps.system.serializers import DictSerializer
class CertaccessSerializer(serializers.ModelSerializer):
conclusion_ = DictSerializer(source='conclusion', read_only=True)
nonitems = DictSerializer(source='nonitems', read_only=True)
# class CertaccessSerializer(serializers.ModelSerializer):
# conclusion_ = DictSerializer(source='conclusion', read_only=True)
# nonitems_ = DictSerializer(source='nonitems', read_only=True, many=True)
class Meta:
model = Certaccess
fields = '__all__'
# class Meta:
# model = Certaccess
# fields = '__all__'
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.select_related('conclusion',)
queryset = queryset.prefetch_related('nonitems',)
return queryset
# @staticmethod
# def setup_eager_loading(queryset):
# """ Perform necessary eager loading of data. """
# queryset = queryset.select_related('conclusion',)
# queryset = queryset.prefetch_related('nonitems',)
# return queryset
class UnitaccessSerializer(serializers.ModelSerializer):
class Meta:
model = Unitaccess
fields = '__all__'
# class UnitaccessSerializer(serializers.ModelSerializer):
# class Meta:
# model = Unitaccess
# fields = '__all__'

View File

@ -1,10 +1,10 @@
from django.urls import path, include
from .views import CertaccessViewSet
from rest_framework import routers
# from django.urls import path, include
# from .views import CertaccessViewSet
# from rest_framework import routers
router = routers.DefaultRouter()
router.register('certaccess', CertaccessViewSet, basename="certaccess")
# router = routers.DefaultRouter()
# router.register('certaccess', CertaccessViewSet, basename="certaccess")
urlpatterns = [
path('', include(router.urls))
]
# urlpatterns = [
# path('', include(router.urls))
# ]

View File

@ -1,29 +1,30 @@
import random
# import random
from django.shortcuts import render
from django.utils import timezone
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.exceptions import NotAuthenticated, ParseError
from rest_framework.response import Response
from rest_framework.serializers import ModelSerializer
from rest_framework.views import APIView
from rest_framework.viewsets import GenericViewSet, ModelViewSet
# from django.shortcuts import render
# from django.utils import timezone
# from rest_framework import status
# from rest_framework.decorators import action
# from rest_framework.exceptions import NotAuthenticated, ParseError
# from rest_framework.response import Response
# from rest_framework.serializers import ModelSerializer
# from rest_framework.views import APIView
# from rest_framework.viewsets import GenericViewSet, ModelViewSet
from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin
from apps.system.models import Dict
from apps.system.permission_data import RbacFilterSet
from utils.pagination import PageOrNot
# from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin
# from apps.system.models import Dict
# from apps.system.permission_data import RbacFilterSet
# from utils.pagination import PageOrNot
from .models import *
from .serializers import *
# from .models import *
# from .serializers import *
# Create your views here.
class CertaccessViewSet(CreateUpdateCustomMixin, ModelViewSet):
"""
业务评定
"""
perms_map = {'get': 'certapp_view', 'post':'certaccess_create', 'put':'certaccess_update','delete': 'certaccess_delete'}
queryset = Certaccess.objects.all()
serializer_class = CertaccessSerializer
ordering = ['-create_time']
# # Create your views here.
# class CertaccessViewSet(PageOrNot, CreateUpdateCustomMixin, ModelViewSet):
# """
# 业务评定
# """
# perms_map = {'get': 'certapp_view', 'post':'certaccess_create', 'put':'certaccess_update','delete': 'certaccess_delete'}
# queryset = Certaccess.objects.all()
# serializer_class = CertaccessSerializer
# filterset_fields = ['certapp']
# ordering = ['-create_time']

View File

@ -42,26 +42,4 @@ class TestOrgNotice(CommonBModel):
def __str__(self):
return self.name
class DetectionTask(CommonBModel):
"""
检测任务
"""
item_choices = (
('规则规定的项目', '规则规定的项目'),
('特定的项目见备注', '特定的项目见备注'),
)
charge_choices = (
('CTC代收', 'CTC代收'),
('自收', '自收'),
)
testorg = models.ForeignKey(TestOrg,verbose_name='检测机构', related_name='detectionTask_testorg', on_delete=models.DO_NOTHING)
certappunit = models.ForeignKey(Certappunit,verbose_name='认证单元', related_name='detectionTask_certappunit', on_delete=models.DO_NOTHING)
remark = models.TextField('备注', null=True, blank=True)
detnumber = models.CharField('检测任务号', max_length = 100, null=True, blank=True)
testitem = models.CharField('检测项目', choices=item_choices, default='规则规定的项目', max_length=50)
charge = models.CharField('收费方式', choices=charge_choices, default='CTC代收', max_length=50)

View File

@ -1,6 +1,6 @@
from rest_framework import serializers
from .models import TestOrg,TestOrgNotice,DetectionTask
from .models import TestOrg,TestOrgNotice
from apps.system.serializers import DictSerializer
@ -17,7 +17,4 @@ class TestOrgNoticListSerializer(serializers.ModelSerializer):
class Meta:
model = TestOrgNotice
fields = ['id','name','publishdate','ismportant','note','dettonotice','path']
class DetectionTaskSerializer(serializers.ModelSerializer):
class Meta:
model = DetectionTask
fields = '__all__'

View File

@ -1,11 +1,10 @@
from django.urls import path, include
from .views import TestOrgViewSet,TestOrgNoticeViewSet,DetectionTaskViewSet
from .views import TestOrgViewSet,TestOrgNoticeViewSet
from rest_framework import routers
router = routers.DefaultRouter()
router.register('testorg', TestOrgViewSet, basename="TestOrg")
router.register('testnotice', TestOrgNoticeViewSet, basename="TestOrgnotice")
router.register('detectiontask', DetectionTaskViewSet, basename="DetectionTask")
urlpatterns = [
path('', include(router.urls))
]

View File

@ -1,9 +1,9 @@
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from .models import TestOrg,TestOrgNotice,DetectionTask
from .models import TestOrg,TestOrgNotice
from utils.queryset import get_child_queryset2
from .serializers import TestOrgSerializer,TestOrgNoticeSerializer,TestOrgNoticListSerializer,DetectionTaskSerializer
from .serializers import TestOrgSerializer,TestOrgNoticeSerializer,TestOrgNoticListSerializer
from apps.system.permission_data import RbacFilterSet
from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin
# Create your views here.
@ -27,10 +27,5 @@ class TestOrgNoticeViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelView
if self.action == 'list':
return TestOrgNoticListSerializer
return TestOrgNoticeSerializer
class DetectionTaskViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
perms_map = {'get': '*', 'post': 'DetectionTask_create',
'put': 'DetectionTask_update', 'delete': 'DetectionTask_delete'}
queryset = DetectionTask.objects
serializer_class = DetectionTaskSerializer
ordering = ['-create_time']

View File

@ -0,0 +1,35 @@
# Generated by Django 3.0.7 on 2020-09-29 08:05
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('system', '0031_delete_bscodeset'),
('project', '0038_certappunit_testorg'),
]
operations = [
migrations.AddField(
model_name='certapp',
name='conclusion',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='certaccess_conclusion', to='system.Dict', verbose_name='工厂检查结论'),
),
migrations.AddField(
model_name='certapp',
name='nonitems',
field=models.ManyToManyField(related_name='certaccess_nonitems', to='system.Dict', verbose_name='不符合项目'),
),
migrations.AddField(
model_name='certapp',
name='score',
field=models.IntegerField(default=0, verbose_name='审核质量评分'),
),
migrations.AddField(
model_name='certappunit',
name='decision',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='unitaccess_decision', to='system.Dict', verbose_name='认证决定'),
),
]

View File

@ -104,6 +104,12 @@ class CertApp(CommonBModel):
review_amount = models.FloatField('复评金额',null=True, blank=True, default=0)
system_standard = models.ForeignKey(Dict, verbose_name='依据的体系标准',null=True, blank=True, related_name='certapp_system_standard', on_delete=models.DO_NOTHING)
risk = models.CharField('风险系数', choices=risk_choices, max_length=50, null=True, blank=True)
# 认证评定字段
conclusion = models.ForeignKey(Dict, verbose_name='工厂检查结论', on_delete=models.CASCADE, related_name='certaccess_conclusion', null=True, blank=True)
nonitems = models.ManyToManyField(Dict, verbose_name='不符合项目', related_name='certaccess_nonitems')
score = models.IntegerField('审核质量评分', default=0)
class Meta:
verbose_name = '认证受理'
verbose_name_plural = verbose_name

View File

@ -3,7 +3,7 @@ from rest_framework import serializers
from .models import *
from apps.system.serializers import DictSerializer, UserListSerializer
from apps.system.serializers import DictSerializer, UserSimpleSerializer
from apps.certset.serializers import StandardSerializer
from apps.plan.serializers import PlanSerializer
@ -42,12 +42,24 @@ class CertappSerializer(serializers.ModelSerializer):
cert_field_ = DictSerializer(source='cert_field', read_only=True)
cccpv_class_ = DictSerializer(source='cccpv_class' , read_only=True)
cnas_scopes_ = DictSerializer(source='cnas_scopes', many=True , read_only=True)
create_by_ = UserListSerializer(source='create_by', read_only=True)
accept_by_ = UserListSerializer(source='accept_by', read_only=True)
create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
accept_by_ = UserSimpleSerializer(source='accept_by', read_only=True)
class Meta:
model = CertApp
fields = '__all__'
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.select_related('cert_field','cccpv_class', 'create_by', 'accept_by')
queryset = queryset.prefetch_related('cnas_scopes',)
return queryset
class CertappunitSerializer(serializers.ModelSerializer):
class Meta:
model = Certappunit
fields = '__all__'
class EvaluationDetailSerializer(serializers.ModelSerializer):
class Meta:
model = EvaluationDetail
@ -65,8 +77,8 @@ class EvaluationDetailSerializer(serializers.ModelSerializer):
class ProjectSerializer(serializers.ModelSerializer):
create_by_ = UserListSerializer(source='create_by', read_only=True)
assign_by_ = UserListSerializer(source='assign_by', read_only=True)
create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
assign_by_ = UserSimpleSerializer(source='assign_by', read_only=True)
certapps = serializers.SerializerMethodField()
plan_ = PlanSerializer(source='plan', read_only=True)

View File

@ -6,6 +6,7 @@ router = routers.DefaultRouter()
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")
router.register('project', ProjectViewSet, basename="project")
urlpatterns = [

View File

@ -1,3 +1,5 @@
import re
from django.http import request
from rest_framework.views import APIView
from apps import project
from django.shortcuts import render
@ -16,6 +18,7 @@ from .filters import *
from utils.pagination import PageOrNot
from rest_framework.exceptions import ParseError, NotAuthenticated
from django.utils import timezone
# Create your views here.
class ApplicationViewSet(RbacFilterSet, ModelViewSet):
"""
@ -89,7 +92,7 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
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':'complete_certapp'},
@action(methods=['put'], detail=True, perms_map={'put':'certapp_complete'},
url_name='complete_certapp')
def complete(self, request, pk=None):
"""
@ -100,7 +103,7 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
obj.save()
return Response(status=status.HTTP_200_OK)
@action(methods=['put'], detail=False, perms_map={'put':'review_certapp'},
@action(methods=['put'], detail=False, perms_map={'put':'certapp_review'},
url_name='review_certapp')
def review(self, request, pk=None):
"""
@ -113,6 +116,23 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
instance.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):
"""
认证评定
"""
# 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']})
# if not ok:
instance = self.get_object()
instance.conclusion = Dict.objects.get(pk=request.data['conclusion'])
instance.score = request.data['score']
instance.save()
instance.nonitems.clear()
instance.nonitems.add(*request.data['nonitems'])
return Response(status=status.HTTP_200_OK)
class EvaluationDetailViewset(CreateUpdateCustomMixin, PageOrNot,ModelViewSet):
"""
受理信息
@ -135,7 +155,22 @@ class EvaluationDetailViewset(CreateUpdateCustomMixin, PageOrNot,ModelViewSet):
return Response(status=status.HTTP_200_OK)
from rest_framework.mixins import ListModelMixin
class CertappunitViewset(PageOrNot, ListModelMixin, GenericViewSet):
perms_map={'*':'certapp_view'}
queryset = Certappunit.objects.all()
serializer_class = CertappunitSerializer
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()
obj.decision = Dict.objects.get(pk=request.data['decision'])
obj.save()
return Response(status=status.HTTP_200_OK)
class ProjectViewSet(RbacFilterSet, ModelViewSet):
perms_map = {'get': 'project_view', 'post':'project_create', 'put':'project_update','delete': 'project_delete'}

View File

@ -78,6 +78,10 @@ class OrganizationSerializer(serializers.ModelSerializer):
fields = '__all__'
class UserSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'name', 'username']
class UserListSerializer(serializers.ModelSerializer):
"""
用户列表序列化

View File

@ -40,7 +40,7 @@ urlpatterns = [
path('plan/', include('apps.plan.urls')),
path('audit/', include('apps.audit.urls')),
path('laboratory/', include('apps.laboratory.urls')),
path('accessment/', include('apps.accessment.urls')),
# path('accessment/', include('apps.accessment.urls')),
path('docs/', include_docs_urls(title="接口文档",
authentication_classes=[], permission_classes=[])),
path('signature/', GenSignature.as_view(), name='gen_signature'),