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> <template>
<div> <div>
<el-card > <el-card>
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span>认证结果评价</span> <span>认证结果评价</span>
<el-button type="primary" >创建</el-button> </div>
</div> <!-- <el-table
<el-table ref="elTable"
ref="elTable" v-loading="listLoading"
v-loading="listLoading" :data="tableData"
:data="tableData" style="width: 100%;"
style="width: 100%;" border
border fit
fit stripe
stripe highlight-current-row
highlight-current-row >
> <el-table-column label="评定表编号">
<el-table-column label="评定表编号"> <template slot-scope="scope">{{ scope.row.number }}</template>
<template slot-scope="scope">{{ scope.row.number }}</template> </el-table-column>
</el-table-column> <el-table-column label="工厂检查结论">
<el-table-column label="工厂检查结论"> <template slot-scope="scope">{{ scope.row.conclusion }}</template>
<template slot-scope="scope"> </el-table-column>
{{ scope.row.conclusion }} <el-table-column label="不符合项分类">
</template> <template slot-scope="scope">{{ scope.row.create_time }}</template>
</el-table-column> </el-table-column>
<el-table-column label="不符合项分类"> <el-table-column label="创建时间">
<template slot-scope="scope" >{{ scope.row.create_time }}</template> <template slot-scope="scope">{{ scope.row.create_time }}</template>
</el-table-column> </el-table-column>
<el-table-column label="创建时间"> </el-table> -->
<template slot-scope="scope"> </el-card>
{{ scope.row.create_time }} </div>
</template>
</el-table-column>
</el-table>
</el-card>
</div>
</template> </template>
<script> <script>
export default { export default {
name:'access', name: "access",
data() { data() {
return { return {
listLoading:false, listLoading: false,
tableData:[] tableData: [],
} };
} },
};
}
</script> </script>

View File

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

View File

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

View File

@ -14,19 +14,21 @@
</el-card> </el-card>
<el-row :gutter="6" style="margin-top:6px"> <el-row :gutter="6" style="margin-top:6px">
<el-col :xs="24" :md="20"> <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> <el-tab-pane label="资料评审" name="Productunit3" v-if="certapp" lazy>
<REVIEW :certapp="certapp"></REVIEW> <REVIEW :certapp="certapp"></REVIEW>
</el-tab-pane> </el-tab-pane>
@ -71,7 +73,7 @@
</template> </template>
<script> <script>
import CCCform from "@/views/certapp/cccform" 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 CHARGE from "@/views/certapp/charge"
import { getCertapp, completeCertapp } from "@/api/certapp" import { getCertapp, completeCertapp } from "@/api/certapp"
import router from '@/router'; import router from '@/router';
@ -82,7 +84,9 @@ import access from "@/views/accessment/access"
import REVIEW from "@/views/certapp/review" import REVIEW from "@/views/certapp/review"
import Detectiontask from "@/views/certapp/detectiontask" import Detectiontask from "@/views/certapp/detectiontask"
export default { export default {
components: { CCCform,Detectiontask, Productunit, QMSform, Conclusion, Member, access, CHARGE, REVIEW},
components: { CCCform, Certunit, QMSform,Productunit, Conclusion, Member, access, CHARGE, REVIEW},
props: [], props: [],
data() { data() {
return { return {

View File

@ -140,15 +140,16 @@
</template> </template>
<script> <script>
import { getImplementRuleList, getUnitTypeList } from "@/api/implementrule" 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 { getDictList } from "@/api/dict";
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";
import "@riophae/vue-treeselect/dist/vue-treeselect.css"; import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import { genTree } from "../../utils"; import { genTree } from "../../utils";
import { deleteProject } from '@/api/project';
export default { export default {
name: "Productunit", name: "Certunit",
components: { Pagination, Treeselect }, components: { Pagination, Treeselect },
props:['certapp'], props:['certapp'],
data() { data() {
@ -158,7 +159,7 @@ export default {
listQuery: { listQuery: {
page: 1, page: 1,
page_size: 20, page_size: 20,
certapp:this.certapp certappunit_certunit__certapp:this.certapp
}, },
formData: { formData: {
certapp:this.certapp, certapp:this.certapp,
@ -223,7 +224,7 @@ export default {
checkPermission, checkPermission,
getList() { getList() {
this.listLoading = true; this.listLoading = true;
getUnitList(this.listQuery).then((response) => { getCertunitList(this.listQuery).then((response) => {
if (response.data) { if (response.data) {
@ -237,6 +238,7 @@ export default {
this.listQuery = { this.listQuery = {
page: 1, page: 1,
page_size: 20, page_size: 20,
certappunit_certunit__certapp:this.certapp
}; };
this.getList(); this.getList();
}, },
@ -244,26 +246,13 @@ export default {
this.listQuery.page = 1; this.listQuery.page = 1;
this.getList(); 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) { handleDelete(scope) {
this.$confirm("确定删除?", "警告", { this.$confirm("确定删除?", "警告", {
// confirmButtonText: '确定', // confirmButtonText: '确定',
// cancelButtonText: '取消', // cancelButtonText: '取消',
type: "warning", type: "warning",
}).then(() => { }).then(() => {
deleteUnit(scope.row.id).then((res) => { deleteCertunit(scope.row.id).then((res) => {
this.$message.success("成功"); this.$message.success("成功");
this.getList(); this.getList();
}); });
@ -273,7 +262,7 @@ export default {
this.$refs['elForm'].validate(valid => { this.$refs['elForm'].validate(valid => {
if (!valid) return if (!valid) return
// TODO 提交表单 // TODO 提交表单
createUnit(this.formData).then(res=>{ createCertunit(this.formData).then(res=>{
this.getList() this.getList()
this.$message.success('成功') this.$message.success('成功')
}) })
@ -283,7 +272,7 @@ export default {
this.$refs['elForm'].validate(valid => { this.$refs['elForm'].validate(valid => {
if (!valid) return if (!valid) return
// TODO 提交表单 // TODO 提交表单
updateUnit(this.formData.id, this.formData).then(res=>{ updateCertunit(this.formData.id, this.formData).then(res=>{
this.getList() this.getList()
this.$message.success('成功') 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): def __str__(self):
return self.name return self.name
# class Product(CommonAModel): from apps.certset.models import ImplementRule, UnitType, Standard
# name = models.CharField('名称', max_length=200) from apps.laboratory.models import TestOrg
# description = models.TextField('产品描述', null=True, blank=True) 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 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 from apps.system.serializers import DictSerializer
@ -28,4 +29,9 @@ class EnterpriseAddressSerializer(serializers.ModelSerializer):
fields = '__all__' 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 django.urls import path, include
from .views import EnterpriseViewSet,EnterpriseAddressViewSet from .views import EnterpriseViewSet,EnterpriseAddressViewSet,CertunitViewSet
from rest_framework import routers from rest_framework import routers
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register('enterprise', EnterpriseViewSet, basename="enterprise") router.register('enterprise', EnterpriseViewSet, basename="enterprise")
router.register('enterpriseaddress', EnterpriseAddressViewSet, basename="enterpriseaddress") router.register('enterpriseaddress', EnterpriseAddressViewSet, basename="enterpriseaddress")
router.register('certunit', CertunitViewSet, basename="product")
urlpatterns = [ urlpatterns = [
path('', include(router.urls)) path('', include(router.urls))
] ]

View File

@ -1,11 +1,14 @@
from django.shortcuts import render from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet 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 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.permission_data import RbacFilterSet
from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin
from rest_framework.response import Response
from rest_framework import status
# Create your views here. # Create your views here.
class EnterpriseViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet): class EnterpriseViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
@ -36,4 +39,24 @@ class EnterpriseAddressViewSet(CreateUpdateCustomMixin, OptimizationMixin, Model
return None return None
return self.paginator.paginate_queryset(queryset, self.request, view=self) 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): def __str__(self):
return self.name 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 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 Certunit, Enterprise
from apps.system.models import CommonAModel, CommonBModel, Dict, User from apps.system.models import CommonAModel, CommonBModel, Dict, User
# from apps.plan.models import Plan # from apps.plan.models import Plan
@ -194,17 +194,13 @@ class EvaluationDetail(CommonBModel):
def __str__(self): def __str__(self):
return self.name return self.name
class Unit(CommonBModel): class Certappunit(CommonBModel):
""" """
认证单元,一个单元一张证书 认证单元,一个单元一张证书
""" """
name = models.CharField('单元名称', max_length=200) certunit = models.ForeignKey('crm.Certunit', verbose_name='单元', on_delete=models.CASCADE, related_name='certappunit_certunit')
description = models.TextField('单元描述', blank=True) certapp = models.ForeignKey(CertApp, verbose_name='所属业务', on_delete = models.CASCADE, related_name='certappunit_certapp')
implementrule = models.ForeignKey(ImplementRule, verbose_name='采用规则', on_delete=models.DO_NOTHING) testorg = models.ForeignKey('laboratory.TestOrg', verbose_name='检测机构', on_delete=models.SET_NULL, null=True, blank=True)
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)
class Meta: class Meta:
verbose_name = '认证单元' verbose_name = '认证单元'
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
@ -213,10 +209,10 @@ class Unit(CommonBModel):
return self.name return self.name
def save(self, *args, **kwargs): # def save(self, *args, **kwargs):
super().save(*args, **kwargs) # super().save(*args, **kwargs)
obj = self.certapp # obj = self.certapp
objs = Unit.objects.filter(certapp=obj, is_deleted=False).values_list('name', flat=True) # objs = Unit.objects.filter(certapp=obj, is_deleted=False).values_list('product__name', flat=True)
obj.scope = obj.factory_v['address'] + ':' + ';'.join(objs) # obj.scope = obj.factory_v['address'] + ':' + ';'.join(objs)
obj.save() # obj.save()

View File

@ -62,11 +62,7 @@ class EvaluationDetailSerializer(serializers.ModelSerializer):
queryset = queryset.prefetch_related('cnas_scopes',) queryset = queryset.prefetch_related('cnas_scopes',)
return queryset return queryset
class UnitSerializer(serializers.ModelSerializer):
standard_ = StandardSerializer(source='standard', read_only=True)
class Meta:
model = Unit
fields = '__all__'
class ProjectSerializer(serializers.ModelSerializer): class ProjectSerializer(serializers.ModelSerializer):
create_by_ = UserListSerializer(source='create_by', read_only=True) 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('application', ApplicationViewSet, basename="application")
router.register('subapplication', SubApplicationViewSet, basename="subapplication") router.register('subapplication', SubApplicationViewSet, basename="subapplication")
router.register('certapp', CertappViewset, basename="certapp") router.register('certapp', CertappViewset, basename="certapp")
router.register('evaluationdetail', EvaluationDetailViewset, basename="evaluationdetail") router.register('evaluationdetail', EvaluationDetailViewset, basename="evaluationdetail")
router.register('unit', UnitViewSet, basename="unit")
router.register('project', ProjectViewSet, basename="project") router.register('project', ProjectViewSet, basename="project")
urlpatterns = [ urlpatterns = [

View File

@ -136,19 +136,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): class ProjectViewSet(RbacFilterSet, ModelViewSet):
perms_map = {'get': 'project_view', 'post':'project_create', 'put':'project_update','delete': 'project_delete'} perms_map = {'get': 'project_view', 'post':'project_create', 'put':'project_update','delete': 'project_delete'}