主流程测试完成1030

This commit is contained in:
caoqianming 2020-10-30 11:44:44 +08:00
parent fc070c6445
commit 5503fa1ee2
23 changed files with 261 additions and 49 deletions

View File

@ -82,9 +82,10 @@
<span v-else>暂无</span> <span v-else>暂无</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="认证决定"> <el-table-column label="认证决定" >
<template slot-scope="scope"> <template slot-scope="scope">
<el-select <el-select
v-if="$route.name=='Certappaccess'"
v-model="scope.row.decision" v-model="scope.row.decision"
clearable clearable
collapse-tags collapse-tags
@ -99,6 +100,9 @@
:disabled="item.disabled" :disabled="item.disabled"
></el-option> ></el-option>
</el-select> </el-select>
<span v-else>
<span v-if="scope.row.decision_">{{scope.row.decision_.name}}</span>
</span>
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column label="操作"> <!-- <el-table-column label="操作">

View File

@ -11,7 +11,7 @@
@input="handleFilter" @input="handleFilter"
style="width: 100%" clearable/> style="width: 100%" clearable/>
</el-col> </el-col>
<el-col :xs="24" :md="4"> <el-col :xs="24" :md="6">
<el-input <el-input
v-model="listQuery.search" v-model="listQuery.search"
placeholder="姓名/易记码/编号/注册领域" placeholder="姓名/易记码/编号/注册领域"
@ -20,7 +20,7 @@
@keyup.enter.native="handleFilter" @keyup.enter.native="handleFilter"
/> />
</el-col> </el-col>
<el-col :xs="24" :md="4"> <el-col :xs="24" :md="6">
<el-button <el-button
class="filter-item" class="filter-item"
type="primary" type="primary"
@ -32,7 +32,7 @@
type="primary" type="primary"
icon="el-icon-refresh-left" icon="el-icon-refresh-left"
@click="resetFilter" @click="resetFilter"
>刷新</el-button> >重置</el-button>
</el-col> </el-col>
</el-row> </el-row>
<el-card style="margin-top:6px"> <el-card style="margin-top:6px">

View File

@ -80,7 +80,7 @@
<el-table-column label="操作"> <el-table-column label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
v-if="scope.row.state=='申请'" v-if="scope.row.state=='申请'||scope.row.state=='受理'"
type="primary" type="primary"
size="small" size="small"
:disabled="!checkPermission(['certapp_update'])" :disabled="!checkPermission(['certapp_update'])"
@ -93,6 +93,13 @@
:disabled="!checkPermission(['certapp_delete'])" :disabled="!checkPermission(['certapp_delete'])"
@click="handleDelete(scope)" @click="handleDelete(scope)"
>删除</el-button> >删除</el-button>
<el-button
type="plain"
size="small"
:disabled="!checkPermission(['certapp_detail'])"
@click="handleDetail(scope)"
>详情</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -192,6 +199,12 @@ deleteCertapp(scope.row.id).then(res=>{
}) })
}, },
handleDetail(scope) {
this.$router.push({
name: "Certappdetail",
params: { id: scope.row.id },
});
},
} }
}; };
</script> </script>

View File

@ -149,10 +149,9 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row style="text-align:center" v-if="$route.name=='Certappupdate'">
<el-col font="right"> <el-button type="primary" @click="submitForm" >保存</el-button>
<el-button style="float: right;" type="primary" @click="submitForm">保存</el-button> <el-button type="plain" @click="handleComplete">完成受理</el-button>
</el-col>
</el-row> </el-row>
@ -166,7 +165,7 @@
</template> </template>
<script> <script>
import { getChargeitemList,getBillList,getBill,createChargeitem,createBill,updateChargeitem} from "@/api/finanacial"; import { getChargeitemList,getBillList,getBill,createChargeitem,createBill,updateChargeitem} from "@/api/finanacial";
import { completeCertapp } from "@/api/certapp"
import { getDictList } from "@/api/dict"; import { getDictList } from "@/api/dict";
import { genTree } from "@/utils"; import { genTree } from "@/utils";
import checkPermission from '@/utils/permission' import checkPermission from '@/utils/permission'
@ -233,6 +232,19 @@ import "@riophae/vue-treeselect/dist/vue-treeselect.css";
}, },
mounted() {}, mounted() {},
methods: { methods: {
handleComplete(){
this.$confirm('确认完成受理?', '警告', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
}).then(()=>{
completeCertapp(this.certapp).then(res=>{
this.$message.success('成功')
this.$router.go(-1)
})
})
},
checkPermission, checkPermission,
// 获取表格选中时的数据 // 获取表格选中时的数据
selectRow (val) { selectRow (val) {
@ -336,7 +348,8 @@ import "@riophae/vue-treeselect/dist/vue-treeselect.css";
}); });
}, },
} },
}; };
</script> </script>

View File

@ -32,7 +32,7 @@
type="primary" type="primary"
icon="el-icon-refresh-left" icon="el-icon-refresh-left"
@click="resetFilter" @click="resetFilter"
>刷新</el-button> >重置</el-button>
</el-col> </el-col>
</el-row> </el-row>
<el-table <el-table

View File

@ -30,12 +30,14 @@
<el-table-column label="操作"> <el-table-column label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
v-if="$route.name=='Certappissue'"
type="primary" type="primary"
size="small" size="small"
:disabled="!checkPermission(['certificate_issue'])" :disabled="!checkPermission(['certificate_issue'])"
@click="handleIssue(scope)" @click="handleIssue(scope)"
>发证</el-button> >发证</el-button>
<el-button <el-button
v-if="$route.name=='Certappissue'"
size="small" size="small"
:disabled="!checkPermission(['certificate_issue'])" :disabled="!checkPermission(['certificate_issue'])"
@click="handleIssue(scope)" @click="handleIssue(scope)"
@ -134,7 +136,7 @@ getDictList({type__code:'cert_decision', pageoff:true}).then(res=>{
}, },
handleIssue(scope){ handleIssue(scope){
// this.drawerVisible = true // this.drawerVisible = true
createCertificate({certunit:scope.row.certunit, first_send:'2020-06-19', used_start:'2020-06-19', used_end:'2021-11-11'}).then(res=>{ createCertificate({id:scope.row.id, certunit:scope.row.certunit, first_send:'2020-06-19', used_start:'2020-06-19', used_end:'2021-11-11'}).then(res=>{
this.$message.success('成功') this.$message.success('成功')
this.getUnitList() this.getUnitList()
}) })

View File

@ -332,7 +332,9 @@ export default {
this.$confirm("确定删除该计划?", "警告", { type: "warning" }) this.$confirm("确定删除该计划?", "警告", { type: "warning" })
.then(() => { .then(() => {
deletePlan(scope.row.id).then((res) => { deletePlan(scope.row.id).then((res) => {
this.getPlanList_()
this.$message.success("成功"); this.$message.success("成功");
}); });
}) })
.catch((res) => {}); .catch((res) => {});

View File

@ -163,7 +163,7 @@
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span>业务信息</span> <span>业务信息</span>
</div> </div>
<el-button type="primary" @click="appendCertapp" size="mini" v-if="$route.name == 'PlanProject'" <el-button type="primary" @click="appendCertapp" size="mini" v-if="['Projectupdate'].indexOf($route.name)!=-1"
:disabled="!checkPermission(['certapp_bind'])">添加申请</el-button> :disabled="!checkPermission(['certapp_bind'])">添加申请</el-button>
<el-table <el-table
ref="projectTable" ref="projectTable"

View File

@ -56,8 +56,9 @@
:disabled="!checkPermission(['project_update'])" :disabled="!checkPermission(['project_update'])"
@click="handleUpdate(scope)" @click="handleUpdate(scope)"
>编辑</el-button> >编辑</el-button>
<!-- v-if="['创建中', '待策划'].indexOf(scope.row.state)!=-1" -->
<el-button <el-button
v-if="['创建中', '待策划'].indexOf(scope.row.state)!=-1"
type="danger" type="danger"
size="small" size="small"
:disabled="!checkPermission(['project_delete'])" :disabled="!checkPermission(['project_delete'])"
@ -176,7 +177,7 @@
<script> <script>
import Enterprisechose from "@/views/enterprise/enterprisechoose"; import Enterprisechose from "@/views/enterprise/enterprisechoose";
import { getCertappList } from "@/api/certapp"; import { getCertappList } from "@/api/certapp";
import { getProjectList, createProject, toplanProject } from "@/api/project" import { getProjectList, createProject, toplanProject, deleteProject } from "@/api/project"
import Pagination from "@/components/Pagination"; import Pagination from "@/components/Pagination";
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
import Treeselect from "@riophae/vue-treeselect"; import Treeselect from "@riophae/vue-treeselect";
@ -329,6 +330,16 @@ export default {
params: { id: scope.row.id }, params: { id: scope.row.id },
}); });
}, },
handleDelete(scope) {
this.$confirm("确定删除吗?", "警告", {
type: "error",
}).then(res=>{
deleteProject(scope.row.id).then(res=>{
this.getProjectList_()
this.$message.success('成功')
})
}).catch(e=>{})
},
chooseE(){ chooseE(){
this.chooseVisiable = true this.chooseVisiable = true
}, },

View File

@ -20,7 +20,10 @@ class ProjectSerializerX(serializers.ModelSerializer):
def get_certapps(self, obj): def get_certapps(self, obj):
certapps = [] certapps = []
for i in obj.certapp_project.filter(is_deleted=False): for i in obj.certapp_project.filter(is_deleted=False):
certapps.append(i.cert_field.code +'(' + i.cccpv_class.name +')') if i.cccpv_class:
certapps.append(i.cert_field.code +'(' + i.cccpv_class.name +')')
else:
certapps.append(i.cert_field.code)
return certapps return certapps
def get_members(self, obj): def get_members(self, obj):

View File

@ -28,7 +28,7 @@ class MyAuditTaskList(ListAPIView):
ordering=['-pk'] ordering=['-pk']
def get_queryset(self): def get_queryset(self):
queryset = Project.objects.filter(certapp_project__member_certapp__user=self.request.user) queryset = Project.objects.filter(certapp_project__member_certapp__user=self.request.user).distinct()
if hasattr(self.get_serializer_class(), 'setup_eager_loading'): if hasattr(self.get_serializer_class(), 'setup_eager_loading'):
queryset = self.get_serializer_class().setup_eager_loading(queryset) queryset = self.get_serializer_class().setup_eager_loading(queryset)
return queryset return queryset

View File

@ -17,6 +17,7 @@ from utils.pagination import PageOrNot
from .serializers import * from .serializers import *
from rest_framework.exceptions import ParseError, NotAuthenticated from rest_framework.exceptions import ParseError, NotAuthenticated
from django.utils import timezone from django.utils import timezone
from apps.project.models import Certappunit
# Create your views here. # Create your views here.
class CertificateViewSet(PageOrNot, OptimizationMixin, ModelViewSet): class CertificateViewSet(PageOrNot, OptimizationMixin, ModelViewSet):
@ -33,8 +34,11 @@ class CertificateViewSet(PageOrNot, OptimizationMixin, ModelViewSet):
""" """
serializer = CertificateCreateSerializer(data=request.data) serializer = CertificateCreateSerializer(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
print(request.data)
if Certificate.objects.filter(certunit__id=request.data['certunit']).exists(): if Certificate.objects.filter(certunit__id=request.data['certunit']).exists():
return Response('该认证单元已存在证书', status = status.HTTP_400_BAD_REQUEST) return Response('该认证单元已存在证书', status = status.HTTP_400_BAD_REQUEST)
if Certappunit.objects.get(pk=request.data['id']).decision is None:
return Response('该认证单元未认证决定', status = status.HTTP_400_BAD_REQUEST)
serializer.save(create_by = self.request.user, number = 'ZS' + str(random.randrange(2000,3000)), status = Dict.objects.get(code='validate_01')) serializer.save(create_by = self.request.user, number = 'ZS' + str(random.randrange(2000,3000)), status = Dict.objects.get(code='validate_01'))
headers = self.get_success_headers(serializer.data) headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

View File

@ -0,0 +1,20 @@
# Generated by Django 3.0.7 on 2020-10-29 07:55
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('system', '0032_auto_20201022_1504'),
('certset', '0021_remove_evaluations_conform'),
]
operations = [
migrations.AlterField(
model_name='evaluationitem',
name='cert_field',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='Evaluations_cert_field', to='system.Dict', verbose_name='认证领域'),
),
]

View File

@ -62,7 +62,7 @@ class UnitType(CommonAModel):
class EvaluationItem(CommonAModel): class EvaluationItem(CommonAModel):
name = models.CharField('评审表名称',null=True, blank=True, max_length=1000) name = models.CharField('评审表名称',null=True, blank=True, max_length=1000)
cert_field = models.ForeignKey(Dict, verbose_name='认证领域', related_name='Evaluations_cert_field', on_delete=models.DO_NOTHING) cert_field = models.ForeignKey(Dict, verbose_name='认证领域', related_name='Evaluations_cert_field', on_delete=models.CASCADE)
ccc_list = models.ForeignKey(Dict,on_delete=models.SET_NULL, blank=True,null=True, verbose_name='CCC产品分类', related_name= 'EvaluationItem_ccc_list') ccc_list = models.ForeignKey(Dict,on_delete=models.SET_NULL, blank=True,null=True, verbose_name='CCC产品分类', related_name= 'EvaluationItem_ccc_list')
pv_class = models.ForeignKey(Dict, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='自愿性产品认证产品分类', related_name= 'EvaluationItem_pv_class') pv_class = models.ForeignKey(Dict, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='自愿性产品认证产品分类', related_name= 'EvaluationItem_pv_class')
class Meta: class Meta:

View File

@ -0,0 +1,35 @@
# Generated by Django 3.0.7 on 2020-10-29 07:55
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('certset', '0022_auto_20201029_1555'),
('crm', '0016_remove_certunit_testorgs'),
]
operations = [
migrations.AlterField(
model_name='certunit',
name='enterprise',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='certunit_enterprise', to='crm.Enterprise', verbose_name='所属公司'),
),
migrations.AlterField(
model_name='certunit',
name='implementrule',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='certunit_implementrule', to='certset.ImplementRule', verbose_name='采用规则'),
),
migrations.AlterField(
model_name='certunit',
name='standard',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='certunit_standard', to='certset.Standard', verbose_name='采用标准'),
),
migrations.AlterField(
model_name='certunit',
name='unittype',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='certunit_unittype', to='certset.UnitType', verbose_name='单元类型'),
),
]

View File

@ -87,8 +87,8 @@ class Certunit(CommonAModel):
""" """
name = models.CharField('名称', max_length=200) name = models.CharField('名称', max_length=200)
description = models.TextField('产品描述', null=True, blank=True) description = models.TextField('产品描述', null=True, blank=True)
implementrule = models.ForeignKey(ImplementRule, verbose_name='采用规则', on_delete=models.DO_NOTHING, related_name='certunit_implementrule') implementrule = models.ForeignKey(ImplementRule, verbose_name='采用规则', on_delete=models.CASCADE, related_name='certunit_implementrule')
unittype = models.ForeignKey(UnitType, verbose_name='单元类型', on_delete = models.DO_NOTHING, related_name='certunit_unittype') unittype = models.ForeignKey(UnitType, verbose_name='单元类型', on_delete = models.CASCADE, related_name='certunit_unittype')
standard = models.ForeignKey(Standard, verbose_name='采用标准', on_delete = models.DO_NOTHING, related_name='certunit_standard') standard = models.ForeignKey(Standard, verbose_name='采用标准', on_delete = models.CASCADE, related_name='certunit_standard')
enterprise = models.ForeignKey(Enterprise, verbose_name='所属公司', on_delete = models.DO_NOTHING, related_name='certunit_enterprise') enterprise = models.ForeignKey(Enterprise, verbose_name='所属公司', on_delete = models.CASCADE, related_name='certunit_enterprise')
# testorgs = models.ManyToManyField(TestOrg, verbose_name='检测机构') # testorgs = models.ManyToManyField(TestOrg, verbose_name='检测机构')

View File

@ -0,0 +1,31 @@
# Generated by Django 3.0.7 on 2020-10-29 07:55
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('project', '0055_auto_20201029_0956'),
('system', '0032_auto_20201022_1504'),
('financial', '0007_auto_20200908_1146'),
]
operations = [
migrations.AlterField(
model_name='bill',
name='feecharacter',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bill_feecharacter', to='system.Dict', verbose_name='费用性质'),
),
migrations.AlterField(
model_name='bill',
name='number',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bill_number', to='project.CertApp'),
),
migrations.AlterField(
model_name='chargeitem',
name='bills',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='chargeitem_bill', to='financial.Bill', to_field='feecode'),
),
]

View File

@ -11,8 +11,8 @@ class Bill(CommonBModel):
收费单表 收费单表
""" """
feecode = models.CharField('收费单号',unique=True, max_length=300) feecode = models.CharField('收费单号',unique=True, max_length=300)
number = models.ForeignKey(CertApp, related_name='bill_number', on_delete=models.DO_NOTHING) number = models.ForeignKey(CertApp, related_name='bill_number', on_delete=models.CASCADE)
feecharacter = models.ForeignKey(Dict, verbose_name='费用性质', related_name='bill_feecharacter', on_delete=models.DO_NOTHING) feecharacter = models.ForeignKey(Dict, verbose_name='费用性质', related_name='bill_feecharacter', on_delete=models.CASCADE)
totalfee = models.FloatField('总金额',null=True, blank=True, default=0) totalfee = models.FloatField('总金额',null=True, blank=True, default=0)
deductions = models.FloatField('扣减额',null=True, blank=True, default=0) deductions = models.FloatField('扣减额',null=True, blank=True, default=0)
exchangetype = models.CharField('外汇类型', max_length=300) exchangetype = models.CharField('外汇类型', max_length=300)
@ -30,7 +30,7 @@ class Chargeitem(CommonBModel):
""" """
收费项目 收费项目
""" """
bills = models.ForeignKey(Bill, related_name='chargeitem_bill',to_field='feecode',null=True, blank=True, on_delete=models.DO_NOTHING) bills = models.ForeignKey(Bill, related_name='chargeitem_bill',to_field='feecode',null=True, blank=True, on_delete=models.SET_NULL)
itemkind = models.CharField('收费项目',null=True, blank=True, max_length=300) itemkind = models.CharField('收费项目',null=True, blank=True, max_length=300)
unitcount = models.FloatField('单元数量',null=True, blank=True, default=0) unitcount = models.FloatField('单元数量',null=True, blank=True, default=0)
perfee = models.FloatField('单价',null=True, blank=True, default=0) perfee = models.FloatField('单价',null=True, blank=True, default=0)

View File

@ -4,17 +4,20 @@ from django.db import models
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
from simple_history.models import HistoricalRecords from simple_history.models import HistoricalRecords
from apps.system.models import CommonAModel, CommonBModel, Dict, User, BaseBModel, BaseModel from apps.system.models import CommonAModel, CommonBModel, Dict, User, BaseModel
from apps.project.models import Project, CertApp from apps.project.models import Project, CertApp
# Create your models here. # Create your models here.
class Plan(BaseBModel): class Plan(CommonBModel):
""" """
计划(项目组) 计划(项目组)
""" """
name = models.CharField('计划名称', max_length = 1000, unique=True) name = models.CharField('计划名称', max_length = 1000, unique=True)
month = models.DateField('计划审核月份', null=True, blank=True) month = models.DateField('计划审核月份', null=True, blank=True)
def perform_destroy(self, instance):
instance.delete(soft=False)
class Meta: class Meta:
verbose_name = '审核计划' verbose_name = '审核计划'
verbose_name_plural = verbose_name verbose_name_plural = verbose_name

View File

@ -0,0 +1,58 @@
# Generated by Django 3.0.7 on 2020-10-29 07:55
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('laboratory', '0009_delete_detectiontask'),
('certset', '0022_auto_20201029_1555'),
('crm', '0017_auto_20201029_1555'),
('system', '0032_auto_20201022_1504'),
('project', '0055_auto_20201029_0956'),
]
operations = [
migrations.AlterField(
model_name='certapp',
name='applicant',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='certapp_applicant', to='crm.Enterprise'),
),
migrations.AlterField(
model_name='certapp',
name='cccpv_class',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certapp_cccpv_class', to='system.Dict', verbose_name='涉及CCC/PV分类'),
),
migrations.AlterField(
model_name='certapp',
name='cert_field',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='certapp_cert_field', to='system.Dict', verbose_name='认证领域'),
),
migrations.AlterField(
model_name='certapp',
name='level',
field=models.ForeignKey(default=111, on_delete=django.db.models.deletion.CASCADE, related_name='certapp_level', to='system.Dict', verbose_name='业务级别'),
),
migrations.AlterField(
model_name='certapp',
name='system_standard',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certapp_system_standard', to='system.Dict', verbose_name='依据的体系标准'),
),
migrations.AlterField(
model_name='certappunit',
name='testorg',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certappunit_testorg', to='laboratory.TestOrg', verbose_name='检测机构'),
),
migrations.AlterField(
model_name='evaluationdetail',
name='item',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='evaluationdetail_item', to='certset.Evaluations', verbose_name='评审项'),
),
migrations.AlterField(
model_name='project',
name='auditee',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='project_auditee', to='crm.Enterprise', verbose_name='受审核方'),
),
]

View File

@ -6,7 +6,7 @@ from rest_framework.exceptions import ParseError
from simple_history.models import HistoricalRecords from simple_history.models import HistoricalRecords
from apps.certset.models import ImplementRule, UnitType, Evaluations, Standard from apps.certset.models import ImplementRule, UnitType, Evaluations, Standard
from apps.crm.models import Enterprise from apps.crm.models import Enterprise
from apps.system.models import CommonAModel, CommonBModel, Dict, User, BaseBModel from apps.system.models import CommonAModel, CommonBModel, Dict, User
# from apps.plan.models import Plan # from apps.plan.models import Plan
# Create your models here. # Create your models here.
@ -38,13 +38,13 @@ from apps.system.models import CommonAModel, CommonBModel, Dict, User, BaseBMode
# accept_date = models.DateField('受理日期', null=True, blank=True) # accept_date = models.DateField('受理日期', null=True, blank=True)
# applicant_v = JSONField(verbose_name='申请方') # applicant_v = JSONField(verbose_name='申请方')
# applicant = models.ForeignKey(Enterprise, related_name='application_applicant', on_delete=models.DO_NOTHING) # applicant = models.ForeignKey(Enterprise, related_name='application_applicant', on_delete=models.CASCADE)
# fields = models.TextField('认证领域', blank=True) # fields = models.TextField('认证领域', blank=True)
# status = models.CharField('申请状态', choices=status_choices, default='草稿', max_length=50) # status = models.CharField('申请状态', choices=status_choices, default='草稿', max_length=50)
# stage = models.IntegerField('步骤状态', choices=stage_choices, default=0) # stage = models.IntegerField('步骤状态', choices=stage_choices, default=0)
# evresult = models.CharField('评审结论', choices = result_choices, default='未评审', max_length=50) # evresult = models.CharField('评审结论', choices = result_choices, default='未评审', max_length=50)
# evremark = models.TextField('备注', blank=True) # evremark = models.TextField('备注', blank=True)
# level = models.ForeignKey(Dict, related_name='application_level', on_delete = models.DO_NOTHING) # level = models.ForeignKey(Dict, related_name='application_level', on_delete = models.CASCADE)
# class Meta: # class Meta:
# verbose_name = '认证主申请' # verbose_name = '认证主申请'
@ -64,8 +64,8 @@ from apps.system.models import CommonAModel, CommonBModel, Dict, User, BaseBMode
# ) # )
# number = models.CharField('子申请编号', max_length = 100) # number = models.CharField('子申请编号', max_length = 100)
# application = models.ForeignKey(Application, on_delete=models.CASCADE, related_name='subapplication_application') # 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) # cert_field = models.ForeignKey(Dict, verbose_name='认证领域', related_name='subapplication_cert_field', on_delete=models.CASCADE)
# cccpv_class = models.ForeignKey(Dict, verbose_name='涉及CCC/PV分类', related_name='subapplication_cccpv_class', on_delete=models.DO_NOTHING, null=True, blank=True) # cccpv_class = models.ForeignKey(Dict, verbose_name='涉及CCC/PV分类', related_name='subapplication_cccpv_class', on_delete=models.CASCADE, null=True, blank=True)
# cnas_scopes = models.ManyToManyField(Dict, verbose_name='涉及cnas分类', related_name='subapplication_cnas_sopes', 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) # project = models.ForeignKey(Project, related_name='subapplication_project', on_delete=models.SET_NULL, null=True)
# is_approve = models.BooleanField('是否认可', default=True) # is_approve = models.BooleanField('是否认可', default=True)
@ -81,7 +81,7 @@ from apps.system.models import CommonAModel, CommonBModel, Dict, User, BaseBMode
# def __str__(self): # def __str__(self):
# return self.number # return self.number
class Project(BaseBModel): class Project(CommonBModel):
""" """
认证项目 认证项目
""" """
@ -99,7 +99,7 @@ class Project(BaseBModel):
) )
state = models.CharField('项目状态', choices=state_choices, default='创建中', max_length=50) state = models.CharField('项目状态', choices=state_choices, default='创建中', max_length=50)
number = models.CharField('项目编号', max_length = 100, null=True, blank=True) number = models.CharField('项目编号', max_length = 100, null=True, blank=True)
auditee = models.ForeignKey(Enterprise, related_name='project_auditee', on_delete=models.DO_NOTHING, verbose_name='受审核方') auditee = models.ForeignKey(Enterprise, related_name='project_auditee', on_delete=models.CASCADE, verbose_name='受审核方')
auditee_v = JSONField(verbose_name='受审核方', default=dict) auditee_v = JSONField(verbose_name='受审核方', default=dict)
remark = models.TextField('备注', null=True, blank=True) remark = models.TextField('备注', null=True, blank=True)
can_paichai = models.BooleanField('是否可派差', default = False) can_paichai = models.BooleanField('是否可派差', default = False)
@ -148,12 +148,12 @@ class CertApp(CommonBModel):
accept_date = models.DateField('受理日期', null=True, blank=True) accept_date = models.DateField('受理日期', null=True, blank=True)
accept_by = models.ForeignKey(User, verbose_name='受理人', on_delete=models.SET_NULL, null=True, blank=True) accept_by = models.ForeignKey(User, verbose_name='受理人', on_delete=models.SET_NULL, null=True, blank=True)
applicant_v = JSONField(verbose_name='申请方') applicant_v = JSONField(verbose_name='申请方')
applicant = models.ForeignKey(Enterprise, related_name='certapp_applicant', on_delete=models.DO_NOTHING) applicant = models.ForeignKey(Enterprise, related_name='certapp_applicant', on_delete=models.CASCADE)
state = models.CharField('申请状态', choices=state_choices, default='申请', max_length=50) state = models.CharField('申请状态', choices=state_choices, default='申请', max_length=50)
evresult = models.CharField('评审结论', choices = result_choices, default='未评审', max_length=50) evresult = models.CharField('评审结论', choices = result_choices, default='未评审', max_length=50)
evremark = models.TextField('备注', blank=True) evremark = models.TextField('备注', blank=True)
level = models.ForeignKey(Dict, verbose_name='业务级别', related_name='certapp_level', on_delete=models.DO_NOTHING, default=Dict.objects.get(code='ybxm').id) level = models.ForeignKey(Dict, verbose_name='业务级别', related_name='certapp_level', on_delete=models.CASCADE, default=Dict.objects.get(code='ybxm').id)
pattern_choices = ( pattern_choices = (
('正常', '正常'), ('正常', '正常'),
('ODM', 'ODM'), ('ODM', 'ODM'),
@ -164,8 +164,8 @@ class CertApp(CommonBModel):
('', ''), ('', ''),
('', '') ('', '')
) )
cert_field = models.ForeignKey(Dict, verbose_name='认证领域', related_name='certapp_cert_field', on_delete=models.DO_NOTHING) cert_field = models.ForeignKey(Dict, verbose_name='认证领域', related_name='certapp_cert_field', on_delete=models.CASCADE)
cccpv_class = models.ForeignKey(Dict, verbose_name='涉及CCC/PV分类', related_name='certapp_cccpv_class', on_delete=models.DO_NOTHING, null=True, blank=True) cccpv_class = models.ForeignKey(Dict, verbose_name='涉及CCC/PV分类', related_name='certapp_cccpv_class', on_delete=models.SET_NULL, null=True, blank=True)
cnas_scopes = models.ManyToManyField(Dict, verbose_name='涉及cnas分类', related_name='certapp_cnas_sopes', blank=True) cnas_scopes = models.ManyToManyField(Dict, verbose_name='涉及cnas分类', related_name='certapp_cnas_sopes', blank=True)
project = models.ForeignKey(Project, related_name='certapp_project', on_delete=models.SET_NULL, null=True) project = models.ForeignKey(Project, related_name='certapp_project', on_delete=models.SET_NULL, null=True)
is_approve = models.BooleanField('是否认可', default=True) is_approve = models.BooleanField('是否认可', default=True)
@ -182,7 +182,7 @@ class CertApp(CommonBModel):
annuity = models.FloatField('年金',null=True, blank=True, default=0) annuity = models.FloatField('年金',null=True, blank=True, default=0)
supervise_amount = models.FloatField('监督金额',null=True, blank=True, default=0) supervise_amount = models.FloatField('监督金额',null=True, blank=True, default=0)
review_amount = models.FloatField('复评金额',null=True, blank=True, default=0) 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) system_standard = models.ForeignKey(Dict, verbose_name='依据的体系标准',null=True, blank=True, related_name='certapp_system_standard', on_delete=models.SET_NULL)
risk = models.CharField('风险系数', choices=risk_choices, max_length=50, null=True, blank=True) risk = models.CharField('风险系数', choices=risk_choices, max_length=50, null=True, blank=True)
# 认证评定字段 # 认证评定字段
@ -211,7 +211,7 @@ class CertAppFlow(model.BaseModel):
class EvaluationDetail(CommonBModel): class EvaluationDetail(CommonBModel):
cert_app = models.ManyToManyField(CertApp, verbose_name='关联受理', related_name='evaluationdetail_cert_app') cert_app = models.ManyToManyField(CertApp, verbose_name='关联受理', related_name='evaluationdetail_cert_app')
item = models.ForeignKey(Evaluations,on_delete=models.DO_NOTHING,verbose_name='评审项',null=True, blank=True, related_name='evaluationdetail_item') item = models.ForeignKey(Evaluations,on_delete=models.SET_NULL,verbose_name='评审项',null=True, blank=True, related_name='evaluationdetail_item')
item_v = JSONField(verbose_name='评审项目',null=True, blank=True) item_v = JSONField(verbose_name='评审项目',null=True, blank=True)
result = models.TextField('符合结果',null=True, blank=True) result = models.TextField('符合结果',null=True, blank=True)
remark = models.TextField('备注', null=True, blank=True) remark = models.TextField('备注', null=True, blank=True)
@ -261,7 +261,7 @@ class Certappunit(CommonBModel):
('不合格', '不合格'), ('不合格', '不合格'),
) )
testorg = models.ForeignKey('laboratory.TestOrg',verbose_name='检测机构',null=True, blank=True, related_name='certappunit_testorg', on_delete=models.DO_NOTHING) testorg = models.ForeignKey('laboratory.TestOrg',verbose_name='检测机构',null=True, blank=True, related_name='certappunit_testorg', on_delete=models.SET_NULL)
remark = models.TextField('备注', null=True, blank=True) remark = models.TextField('备注', null=True, blank=True)
sampledec = models.TextField('样品描述', null=True, blank=True) sampledec = models.TextField('样品描述', null=True, blank=True)
detnumber = models.CharField('检测任务号', max_length = 100,null=True, blank=True) detnumber = models.CharField('检测任务号', max_length = 100,null=True, blank=True)

View File

@ -52,6 +52,7 @@ class CertappSerializer(serializers.ModelSerializer):
cnas_scopes_ = DictSerializer(source='cnas_scopes', many=True , read_only=True) cnas_scopes_ = DictSerializer(source='cnas_scopes', many=True , read_only=True)
create_by_ = UserSimpleSerializer(source='create_by', read_only=True) create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
accept_by_ = UserSimpleSerializer(source='accept_by', read_only=True) accept_by_ = UserSimpleSerializer(source='accept_by', read_only=True)
nonitems = serializers.SlugRelatedField(many=True, required=False, slug_field="id", queryset=Dict.objects.filter(is_deleted=1, type__code='factory_check_noitem'))
class Meta: class Meta:
model = CertApp model = CertApp
fields = '__all__' fields = '__all__'
@ -118,7 +119,10 @@ class ProjectSerializer(serializers.ModelSerializer):
def get_certapps(self, obj): def get_certapps(self, obj):
certapps = [] certapps = []
for i in obj.certapp_project.filter(is_deleted=False): for i in obj.certapp_project.filter(is_deleted=False):
certapps.append(i.cert_field.code +'(' + i.cccpv_class.name +')') if i.cccpv_class:
certapps.append(i.cert_field.code +'(' + i.cccpv_class.name +')')
else:
certapps.append(i.cert_field.code)
return certapps return certapps
@staticmethod @staticmethod

View File

@ -80,6 +80,11 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
filterset_fields = ['state', 'project', 'certappunit_certapp__teststate', 'cert_field'] filterset_fields = ['state', 'project', 'certappunit_certapp__teststate', 'cert_field']
# filterset_class = CertAppFilter # 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): def perform_destroy(self, instance):
instance.delete(soft=False) instance.delete(soft=False)
@ -103,10 +108,12 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
完成受理 完成受理
""" """
obj = self.get_object() obj = self.get_object()
obj.state = '策划' if obj.state == '受理':
obj.save() obj.state = '策划'
CertAppFlow.objects.create(certapp = obj, handler=self.request.user, operation='完成受理', state='受理') obj.save()
return Response(status=status.HTTP_200_OK) 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'}, @action(methods=['put'], detail=False, perms_map={'put':'certapp_review'},
url_name='review_certapp') url_name='review_certapp')
@ -237,7 +244,7 @@ class CertappunitViewset(PageOrNot, ModelViewSet):
obj.save() obj.save()
return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)
else: else:
return Response('项目状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST) return Response('认证单元状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST)
@action(methods=['put'], detail=True, perms_map={'put':'certapp_testtask'}, url_name='certappunit_testtask') @action(methods=['put'], detail=True, perms_map={'put':'certapp_testtask'}, url_name='certappunit_testtask')
def testtask(self, request, pk=None): def testtask(self, request, pk=None):
""" """
@ -308,6 +315,9 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet):
return ProjectUpdateSerializer return ProjectUpdateSerializer
return ProjectSerializer return ProjectSerializer
def perform_destroy(self, instance):
instance.delete(soft=False)
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
postdata = request.data postdata = request.data
postdata['number'] = random.randrange(8000,9000) postdata['number'] = random.randrange(8000,9000)
@ -317,7 +327,6 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet):
obj.state = '创建中' #空项目 obj.state = '创建中' #空项目
if 'certapps' in postdata and postdata['certapps']: if 'certapps' in postdata and postdata['certapps']:
CertApp.objects.filter(pk__in = postdata['certapps']).update(project=obj) CertApp.objects.filter(pk__in = postdata['certapps']).update(project=obj)
obj.state = '待策划'
obj.save() obj.save()
headers = self.get_success_headers(serializer.data) headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)