This commit is contained in:
shilixia 2020-09-21 15:33:11 +08:00
commit 2a3c087ab7
31 changed files with 508 additions and 168 deletions

View File

@ -0,0 +1,40 @@
import request from '@/utils/request'
export function getCertunitList(query) {
return request({
url: '/crm/certunit/',
method: 'get',
params: query
})
}
export function createCertunit(data) {
return request({
url: '/crm/certunit/',
method: 'post',
data
})
}
export function deleteCertunit(id) {
return request({
url: `/crm/certunit/${id}/`,
method: 'delete'
})
}
export function updateCertunit(id, data) {
return request({
url: `/crm/certunit/${id}/`,
method: 'put',
data
})
}
export function getCertunit(id) {
return request({
url: `/crm/certunit/${id}/`,
method: 'get',
})
}

View File

@ -1,40 +0,0 @@
import request from '@/utils/request'
export function getUnitList(query) {
return request({
url: '/project/unit/',
method: 'get',
params: query
})
}
export function createUnit(data) {
return request({
url: '/project/unit/',
method: 'post',
data
})
}
export function deleteUnit(id) {
return request({
url: `/project/unit/${id}/`,
method: 'delete'
})
}
export function updateUnit(id, data) {
return request({
url: `/project/unit/${id}/`,
method: 'put',
data
})
}
export function getUnit(id) {
return request({
url: `/project/unit/${id}/`,
method: 'get',
})
}

View File

@ -1,49 +1,43 @@
<template>
<div>
<el-card >
<div slot="header" class="clearfix">
<span>认证结果评价</span>
<el-button type="primary" >创建</el-button>
</div>
<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>
<div>
<el-card>
<div slot="header" class="clearfix">
<span>认证结果评价</span>
</div>
<!-- <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>
export default {
name:'access',
data() {
return {
listLoading:false,
tableData:[]
}
}
}
name: "access",
data() {
return {
listLoading: false,
tableData: [],
};
},
};
</script>

View File

@ -10,12 +10,11 @@
</template>
<script>
import CCCform from "@/views/certapp/cccform"
import Productunit from "@/views/certapp/productunit"
import { getCertapp, completeCertapp } from "@/api/certapp"
import router from '@/router';
import QMSform from "@/views/certapp/qmsform"
export default {
components: { CCCform, Productunit, QMSform},
components: { CCCform, QMSform},
props: [],
data() {
return {

View File

@ -8,7 +8,7 @@
</el-tab-pane>
<el-tab-pane label="产品单元" v-if="certapp">
<Productunit :certapp="certapp"></Productunit>
<Certunit :certapp="certapp"></Certunit>
</el-tab-pane>
<el-tab-pane label="原材料供应商" v-if="certapp">
</el-tab-pane>
@ -32,12 +32,12 @@ import CCCform from "@/views/certapp/cccform"
import REVIEW from "@/views/certapp/review"
import CHARGE from "@/views/certapp/charge"
import Productunit from "@/views/certapp/productunit"
import Certunit from "@/views/certapp/certunit"
import { getCertapp, completeCertapp } from "@/api/certapp"
import router from '@/router';
import QMSform from "@/views/certapp/qmsform"
export default {
components: { CCCform, Productunit, QMSform,REVIEW,CHARGE},
components: { CCCform, Certunit, QMSform,REVIEW,CHARGE},
props: [],
data() {
return {

View File

@ -14,19 +14,21 @@
</el-card>
<el-row :gutter="6" style="margin-top:6px">
<el-col :xs="24" :md="20">
<el-tabs type="border-card" v-model="activeName">
<el-tab-pane label="申请信息" name="Basic" style="overflow-y:auto;overflow-x:hidden;">
<CCCform @handleCommit="save" :certapp="certappdata" v-if="kind=='CCC'&isLoad"></CCCform>
<QMSform @handleCommit="save" :certapp="certappdata" v-if="kind=='QMS'&isLoad"></QMSform>
</el-tab-pane>
<el-tab-pane label="产品单元" name="Productunit" v-if="certapp" lazy>
<Productunit :certapp="certapp"></Productunit>
</el-tab-pane>
<el-tab-pane label="原材料供应商" name="Productunit1" v-if="certapp" lazy>
</el-tab-pane>
<el-tab-pane label="检测设备" name="Productunit2" v-if="certapp" lazy>
</el-tab-pane>
<el-tabs type="border-card" v-model="activeName">
<el-tab-pane label="申请信息" name="Basic" style="overflow-y:auto;overflow-x:hidden;">
<CCCform @handleCommit="save" :certapp="certappdata" v-if="kind=='CCC'&isLoad"></CCCform>
<QMSform @handleCommit="save" :certapp="certappdata" v-if="kind=='QMS'&isLoad"></QMSform>
</el-tab-pane>
<el-tab-pane label="产品单元" name="Certunit" v-if="certapp" lazy>
<Certunit :certapp="certapp"></Certunit>
</el-tab-pane>
<el-tab-pane label="原材料供应商" name="Certunit1" v-if="certapp" lazy>
</el-tab-pane>
<el-tab-pane label="检测设备" name="Certunit2" v-if="certapp" lazy>
</el-tab-pane>
<el-tab-pane label="资料评审" name="Productunit3" v-if="certapp" lazy>
<REVIEW :certapp="certapp"></REVIEW>
</el-tab-pane>
@ -71,7 +73,7 @@
</template>
<script>
import CCCform from "@/views/certapp/cccform"
import Productunit from "@/views/certapp/productunit"
import Certunit from "@/views/certapp/certunit"
import CHARGE from "@/views/certapp/charge"
import { getCertapp, completeCertapp } from "@/api/certapp"
import router from '@/router';
@ -82,7 +84,9 @@ import access from "@/views/accessment/access"
import REVIEW from "@/views/certapp/review"
import Detectiontask from "@/views/certapp/detectiontask"
export default {
components: { CCCform,Detectiontask, Productunit, QMSform, Conclusion, Member, access, CHARGE, REVIEW},
components: { CCCform, Certunit, QMSform,Productunit, Conclusion, Member, access, CHARGE, REVIEW},
props: [],
data() {
return {

View File

@ -140,15 +140,16 @@
</template>
<script>
import { getImplementRuleList, getUnitTypeList } from "@/api/implementrule"
import { getUnitList, deleteUnit, createUnit, updateUnit } from "@/api/unit";
import { getCertunitList, deleteCertunit, createCertunit, updateCertunit } from "@/api/certunit";
import { getDictList } from "@/api/dict";
import Pagination from "@/components/Pagination";
import checkPermission from "@/utils/permission";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import { genTree } from "../../utils";
import { deleteProject } from '@/api/project';
export default {
name: "Productunit",
name: "Certunit",
components: { Pagination, Treeselect },
props:['certapp'],
data() {
@ -158,7 +159,7 @@ export default {
listQuery: {
page: 1,
page_size: 20,
certapp:this.certapp
certappunit_certunit__certapp:this.certapp
},
formData: {
certapp:this.certapp,
@ -223,7 +224,7 @@ export default {
checkPermission,
getList() {
this.listLoading = true;
getUnitList(this.listQuery).then((response) => {
getCertunitList(this.listQuery).then((response) => {
if (response.data) {
@ -237,6 +238,7 @@ export default {
this.listQuery = {
page: 1,
page_size: 20,
certappunit_certunit__certapp:this.certapp
};
this.getList();
},
@ -244,26 +246,13 @@ export default {
this.listQuery.page = 1;
this.getList();
},
handleCreate(item, index) {
this.$router.push({
name: "CertappForm",
params: { kind: item.code, action: "create" },
});
},
handleUpdate(scope) {
this.$router.push({
name: "CertappForm",
params: { action: "update", kind: scope.row.cert_field_.code },
query: { id: scope.row.id },
});
},
handleDelete(scope) {
this.$confirm("确定删除?", "警告", {
// confirmButtonText: '确定',
// cancelButtonText: '取消',
type: "warning",
}).then(() => {
deleteUnit(scope.row.id).then((res) => {
deleteCertunit(scope.row.id).then((res) => {
this.$message.success("成功");
this.getList();
});
@ -273,7 +262,7 @@ export default {
this.$refs['elForm'].validate(valid => {
if (!valid) return
// TODO 提交表单
createUnit(this.formData).then(res=>{
createCertunit(this.formData).then(res=>{
this.getList()
this.$message.success('成功')
})
@ -283,7 +272,7 @@ export default {
this.$refs['elForm'].validate(valid => {
if (!valid) return
// TODO 提交表单
updateUnit(this.formData.id, this.formData).then(res=>{
updateCertunit(this.formData.id, this.formData).then(res=>{
this.getList()
this.$message.success('成功')
})

View File

View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

View File

@ -0,0 +1,5 @@
from django.apps import AppConfig
class CertificateConfig(AppConfig):
name = 'certificate'

View File

@ -0,0 +1,18 @@
from django.db import models
from apps.system.models import CommonBModel,CommonAModel,Dict
from simple_history.models import HistoricalRecords
from django.contrib.postgres.fields import ArrayField
# Create your models here.
class Certificate(CommonAModel):
"""
证书表
"""
product = models.ForeignKey('crm.Product', on_delete=models.CASCADE, null=True, blank=True, verbose_name='关联产品')
enterprise = models.ForeignKey('crm.Enterprise', on_delete=models.CASCADE, verbose_name='所属公司')
first_send = models.DateField('证书首发时间')
used_start = models.DateField('有效期开始')
used_end = models.DateField('有效期结束')
class CertificateChange(CommonAModel):
pass

View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View File

@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.

View File

@ -0,0 +1,38 @@
# Generated by Django 3.0.7 on 2020-09-18 06:33
from django.conf import settings
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),
('certset', '0021_remove_evaluations_conform'),
('crm', '0011_enterprise_parent'),
]
operations = [
migrations.CreateModel(
name='Product',
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='删除标记')),
('name', models.CharField(max_length=200, verbose_name='名称')),
('description', models.TextField(blank=True, null=True, verbose_name='产品描述')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='product_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('enterprise', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='product_enterprise', to='crm.Enterprise', verbose_name='所属公司')),
('implementrule', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='product_implementrule', to='certset.ImplementRule', verbose_name='采用规则')),
('standard', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='product_standard', to='certset.Standard', verbose_name='采用标准')),
('unittype', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='product_unittype', to='certset.UnitType', verbose_name='单元类型')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='product_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'abstract': False,
},
),
]

View File

@ -0,0 +1,52 @@
# Generated by Django 3.0.7 on 2020-09-18 07:57
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('crm', '0012_product'),
]
operations = [
migrations.CreateModel(
name='Certunit',
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='删除标记')),
('name', models.CharField(max_length=200, verbose_name='名称')),
('description', models.TextField(blank=True, null=True, verbose_name='产品描述')),
],
options={
'abstract': False,
},
),
migrations.RemoveField(
model_name='product',
name='create_by',
),
migrations.RemoveField(
model_name='product',
name='enterprise',
),
migrations.RemoveField(
model_name='product',
name='implementrule',
),
migrations.RemoveField(
model_name='product',
name='standard',
),
migrations.RemoveField(
model_name='product',
name='unittype',
),
migrations.RemoveField(
model_name='product',
name='update_by',
),
]

View File

@ -0,0 +1,51 @@
# Generated by Django 3.0.7 on 2020-09-18 07:57
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('crm', '0013_auto_20200918_1557'),
('project', '0037_auto_20200918_1557'),
('certset', '0021_remove_evaluations_conform'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.DeleteModel(
name='Product',
),
migrations.AddField(
model_name='certunit',
name='create_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certunit_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人'),
),
migrations.AddField(
model_name='certunit',
name='enterprise',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='certunit_enterprise', to='crm.Enterprise', verbose_name='所属公司'),
),
migrations.AddField(
model_name='certunit',
name='implementrule',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='certunit_implementrule', to='certset.ImplementRule', verbose_name='采用规则'),
),
migrations.AddField(
model_name='certunit',
name='standard',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='certunit_standard', to='certset.Standard', verbose_name='采用标准'),
),
migrations.AddField(
model_name='certunit',
name='unittype',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='certunit_unittype', to='certset.UnitType', verbose_name='单元类型'),
),
migrations.AddField(
model_name='certunit',
name='update_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certunit_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'),
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 3.0.7 on 2020-09-21 02:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('laboratory', '0005_auto_20200824_1649'),
('crm', '0014_auto_20200918_1557'),
]
operations = [
migrations.AddField(
model_name='certunit',
name='testorgs',
field=models.ManyToManyField(to='laboratory.TestOrg', verbose_name='检测机构'),
),
]

View File

@ -79,6 +79,16 @@ class EnterpriseAddress(CommonAModel):
def __str__(self):
return self.name
# class Product(CommonAModel):
# name = models.CharField('名称', max_length=200)
# description = models.TextField('产品描述', null=True, blank=True)
from apps.certset.models import ImplementRule, UnitType, Standard
from apps.laboratory.models import TestOrg
class Certunit(CommonAModel):
"""
认证单元
"""
name = models.CharField('名称', max_length=200)
description = models.TextField('产品描述', null=True, blank=True)
implementrule = models.ForeignKey(ImplementRule, verbose_name='采用规则', on_delete=models.DO_NOTHING, related_name='certunit_implementrule')
unittype = models.ForeignKey(UnitType, verbose_name='单元类型', on_delete = models.DO_NOTHING, related_name='certunit_unittype')
standard = models.ForeignKey(Standard, verbose_name='采用标准', on_delete = models.DO_NOTHING, related_name='certunit_standard')
enterprise = models.ForeignKey(Enterprise, verbose_name='所属公司', on_delete = models.DO_NOTHING, related_name='certunit_enterprise')
testorgs = models.ManyToManyField(TestOrg, verbose_name='检测机构')

View File

@ -1,6 +1,7 @@
from rest_framework import serializers
from .models import Enterprise,EnterpriseAddress
from .models import Enterprise,EnterpriseAddress, Certunit
from apps.certset.serializers import StandardSerializer
from apps.system.serializers import DictSerializer
@ -28,4 +29,9 @@ class EnterpriseAddressSerializer(serializers.ModelSerializer):
fields = '__all__'
class CertunitSerializer(serializers.ModelSerializer):
standard_ = StandardSerializer(source='standard', read_only=True)
enterprise = serializers.CharField(read_only=True)
class Meta:
model = Certunit
fields = '__all__'

View File

@ -1,11 +1,12 @@
from django.db.models import base
from django.urls import path, include
from .views import EnterpriseViewSet,EnterpriseAddressViewSet
from .views import EnterpriseViewSet,EnterpriseAddressViewSet,CertunitViewSet
from rest_framework import routers
router = routers.DefaultRouter()
router.register('enterprise', EnterpriseViewSet, basename="enterprise")
router.register('enterpriseaddress', EnterpriseAddressViewSet, basename="enterpriseaddress")
router.register('certunit', CertunitViewSet, basename="product")
urlpatterns = [
path('', include(router.urls))
]

View File

@ -1,11 +1,14 @@
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from .models import Enterprise,EnterpriseAddress
from .models import Enterprise,EnterpriseAddress,Certunit
from utils.queryset import get_child_queryset2
from .serializers import EnterpriseSerializer,EnterpriseListSerializer,EnterpriseAddressSerializer
from utils.pagination import PageOrNot
from .serializers import EnterpriseSerializer,EnterpriseListSerializer,EnterpriseAddressSerializer, CertunitSerializer
from apps.system.permission_data import RbacFilterSet
from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin
from rest_framework.response import Response
from rest_framework import status
# Create your views here.
class EnterpriseViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
@ -36,4 +39,24 @@ class EnterpriseAddressViewSet(CreateUpdateCustomMixin, OptimizationMixin, Model
return None
return self.paginator.paginate_queryset(queryset, self.request, view=self)
from apps.project.models import Certappunit, CertApp
class CertunitViewSet(CreateUpdateCustomMixin, PageOrNot, ModelViewSet):
"""
认证单元
"""
perms_map = {'get': '*', 'post':'certapp_create', 'put':'certapp_update'}
queryset = Certunit.objects.all()
serializer_class = CertunitSerializer
ordering = ['pk']
filterset_fields = ['enterprise', 'certappunit_certunit__certapp']
def create(self, request, *args, **kwargs):
if 'certapp' in request.data and request.data['certapp']:
certapp = CertApp.objects.get(pk=request.data['certapp'])
data = request.data
data['enterprise'] = certapp.applicant.id
serializer = self.get_serializer(data=data)
serializer.is_valid(raise_exception=True)
instance = serializer.save()
Certappunit.objects.create(certunit=instance, certapp=certapp)
return Response(serializer.data, status=status.HTTP_201_CREATED)

View File

@ -37,4 +37,9 @@ class TestOrgNotice(CommonBModel):
def __str__(self):
return self.name
class DetectionTask(CommonBModel):
testorg = models.ForeignKey(TestOrg,verbose_name='检测机构', related_name='detectionTask_testorg', on_delete=models.DO_NOTHING)

View File

@ -0,0 +1,41 @@
# Generated by Django 3.0.7 on 2020-09-18 06:33
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('crm', '0012_product'),
('project', '0034_auto_20200917_1444'),
]
operations = [
migrations.RemoveField(
model_name='unit',
name='description',
),
migrations.RemoveField(
model_name='unit',
name='implementrule',
),
migrations.RemoveField(
model_name='unit',
name='name',
),
migrations.RemoveField(
model_name='unit',
name='standard',
),
migrations.RemoveField(
model_name='unit',
name='unittype',
),
migrations.AddField(
model_name='unit',
name='product',
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='crm.Product', verbose_name='单元'),
preserve_default=False,
),
]

View File

@ -0,0 +1,40 @@
# Generated by Django 3.0.7 on 2020-09-18 06:53
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('system', '0031_delete_bscodeset'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('crm', '0012_product'),
('project', '0035_auto_20200918_1433'),
]
operations = [
migrations.CreateModel(
name='Certunit',
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='删除标记')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certunit_belong_dept', to='system.Organization', verbose_name='所属部门')),
('certapp', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='certunit_certapp', to='project.CertApp', verbose_name='所属业务')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certunit_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='certunit_product', to='crm.Product', verbose_name='单元')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certunit_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'verbose_name': '认证单元',
'verbose_name_plural': '认证单元',
},
),
migrations.DeleteModel(
name='Unit',
),
]

View File

@ -0,0 +1,40 @@
# Generated by Django 3.0.7 on 2020-09-18 07:57
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('system', '0031_delete_bscodeset'),
('crm', '0013_auto_20200918_1557'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('project', '0036_auto_20200918_1453'),
]
operations = [
migrations.CreateModel(
name='Certappunit',
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='删除标记')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certappunit_belong_dept', to='system.Organization', verbose_name='所属部门')),
('certapp', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='certappunit_certapp', to='project.CertApp', verbose_name='所属业务')),
('certunit', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='certappunit_certunit', to='crm.Certunit', verbose_name='单元')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certappunit_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certappunit_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'verbose_name': '认证单元',
'verbose_name_plural': '认证单元',
},
),
migrations.DeleteModel(
name='Certunit',
),
]

View File

@ -0,0 +1,20 @@
# Generated by Django 3.0.7 on 2020-09-21 02:43
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('laboratory', '0005_auto_20200824_1649'),
('project', '0037_auto_20200918_1557'),
]
operations = [
migrations.AddField(
model_name='certappunit',
name='testorg',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='laboratory.TestOrg', verbose_name='检测机构'),
),
]

View File

@ -5,7 +5,7 @@ from rest_framework.exceptions import ParseError
from simple_history.models import HistoricalRecords
from apps.certset.models import ImplementRule, UnitType, Evaluations, Standard
from apps.crm.models import Enterprise
from apps.crm.models import Certunit, Enterprise
from apps.system.models import CommonAModel, CommonBModel, Dict, User
# from apps.plan.models import Plan
@ -194,17 +194,13 @@ class EvaluationDetail(CommonBModel):
def __str__(self):
return self.name
class Unit(CommonBModel):
class Certappunit(CommonBModel):
"""
认证单元,一个单元一张证书
"""
name = models.CharField('单元名称', max_length=200)
description = models.TextField('单元描述', blank=True)
implementrule = models.ForeignKey(ImplementRule, verbose_name='采用规则', on_delete=models.DO_NOTHING)
unittype = models.ForeignKey(UnitType, verbose_name='单元类型', on_delete = models.DO_NOTHING)
standard = models.ForeignKey(Standard, verbose_name='采用标准', on_delete = models.DO_NOTHING)
certapp = models.ForeignKey(CertApp, verbose_name='所属业务', on_delete = models.CASCADE)
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')
testorg = models.ForeignKey('laboratory.TestOrg', verbose_name='检测机构', on_delete=models.SET_NULL, null=True, blank=True)
class Meta:
verbose_name = '认证单元'
verbose_name_plural = verbose_name
@ -213,10 +209,10 @@ class Unit(CommonBModel):
return self.name
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
obj = self.certapp
objs = Unit.objects.filter(certapp=obj, is_deleted=False).values_list('name', flat=True)
obj.scope = obj.factory_v['address'] + ':' + ';'.join(objs)
obj.save()
# def save(self, *args, **kwargs):
# super().save(*args, **kwargs)
# obj = self.certapp
# objs = Unit.objects.filter(certapp=obj, is_deleted=False).values_list('product__name', flat=True)
# obj.scope = obj.factory_v['address'] + ':' + ';'.join(objs)
# obj.save()

View File

@ -62,11 +62,7 @@ class EvaluationDetailSerializer(serializers.ModelSerializer):
queryset = queryset.prefetch_related('cnas_scopes',)
return queryset
class UnitSerializer(serializers.ModelSerializer):
standard_ = StandardSerializer(source='standard', read_only=True)
class Meta:
model = Unit
fields = '__all__'
class ProjectSerializer(serializers.ModelSerializer):
create_by_ = UserListSerializer(source='create_by', read_only=True)

View File

@ -6,10 +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('evaluationdetail', EvaluationDetailViewset, basename="evaluationdetail")
router.register('unit', UnitViewSet, basename="unit")
router.register('project', ProjectViewSet, basename="project")
urlpatterns = [

View File

@ -137,19 +137,6 @@ class EvaluationDetailViewset(CreateUpdateCustomMixin, PageOrNot,ModelViewSet):
class UnitViewSet(RbacFilterSet, ModelViewSet):
"""
产品单元
"""
perms_map = {'get': 'certapp_view', 'post':'certapp_create', 'put':'certapp_update','delete': 'certapp_delete'}
queryset = Unit.objects.all()
serializer_class = UnitSerializer
ordering = ['pk']
filterset_fields = ['certapp']
class ProjectViewSet(RbacFilterSet, ModelViewSet):
perms_map = {'get': 'project_view', 'post':'project_create', 'put':'project_update','delete': 'project_delete'}
queryset = Project.objects.all()