gengxinneiron

This commit is contained in:
shilixia 2020-09-02 11:14:45 +08:00
parent cadd1bc4bb
commit 4004d7c5c1
51 changed files with 1627 additions and 199 deletions

View File

@ -7,7 +7,7 @@
.el-table--medium td,   .el-table--medium th { .el-table--medium td,   .el-table--medium th {
padding: 0px 0; padding: 5px 0;
} }
.el-form-item { .el-form-item {
margin-bottom: 10px; margin-bottom: 10px;

View File

@ -0,0 +1,39 @@
import request from '@/utils/request'
export function getEvaluationDetailList(query) {
return request({
url: '/project/evaluationdetail/',
method: 'get',
params: query
})
}
export function getEvaluationDetail(id) {
return request({
url: `/project/evaluationdetail/${id}/`,
method: 'get'
})
}
export function createEvaluationDetail(data) {
return request({
url: '/project/evaluationdetail/',
method: 'post',
data
})
}
export function updateEvaluationDetail(id, data) {
return request({
url: `/project/evaluationdetail/${id}/`,
method: 'put',
data
})
}
export function deleteEvaluationDetail(id) {
return request({
url: `/project/evaluationdetail/ ${id}/`,
method: 'delete'
})
}

View File

@ -1,73 +1,73 @@
import request from '@/utils/request' import request from '@/utils/request'
export function getDetectOrgList(query) { export function getTestOrgList(query) {
return request({ return request({
url: '/laboratory/detectorg/', url: '/laboratory/testorg/',
method: 'get', method: 'get',
params: query params: query
}) })
} }
export function getDetectOrg(id) { export function getTestOrg(id) {
return request({ return request({
url: `/laboratory/detectorg/${id}/`, url: `/laboratory/testorg/${id}/`,
method: 'get' method: 'get'
}) })
} }
export function createDetectOrg(data) { export function createTestOrg(data) {
return request({ return request({
url: '/laboratory/detectorg/', url: '/laboratory/testorg/',
method: 'post', method: 'post',
data data
}) })
} }
export function updateDetectOrg(id, data) { export function updateTestOrg(id, data) {
return request({ return request({
url: `/laboratory/detectorg/${id}/`, url: `/laboratory/testorg/${id}/`,
method: 'put', method: 'put',
data data
}) })
} }
export function deleteDetectOrg(id) { export function deleteTestOrg(id) {
return request({ return request({
url: `/laboratory/detectorg/${id}/`, url: `/laboratory/testorg/${id}/`,
method: 'delete' method: 'delete'
}) })
} }
export function getDetectOrgNoticeList(query) { export function getTestOrgNoticeList(query) {
return request({ return request({
url: '/laboratory/detectorgnotice/', url: '/laboratory/testnotice/',
method: 'get', method: 'get',
params: query params: query
}) })
} }
export function getDetectOrgNotice(id) { export function getTestOrgNotice(id) {
return request({ return request({
url: `/laboratory/detectorgnotice/${id}/`, url: `/laboratory/testnotice/${id}/`,
method: 'get' method: 'get'
}) })
} }
export function createDetectOrgNotice(data) { export function createTestOrgNotice(data) {
return request({ return request({
url: '/laboratory/detectorgnotice/', url: '/laboratory/testnotice/',
method: 'post', method: 'post',
data data
}) })
} }
export function updateDetectOrgNotice(id, data) { export function updateTestOrgNotice(id, data) {
return request({ return request({
url: `/laboratory/detectorgnotice/${id}/`, url: `/laboratory/testnotice/${id}/`,
method: 'put', method: 'put',
data data
}) })
} }
export function deleteDetectOrgNotice(id) { export function deleteTestOrgNotice(id) {
return request({ return request({
url: `/laboratory/detectorgnotice/${id}/`, url: `/laboratory/testnotice/${id}/`,
method: 'delete' method: 'delete'
}) })
} }

View File

@ -249,24 +249,24 @@ export const asyncRoutes = [
] ]
}, },
{ {
path: '/detectorg', path: '/testorg',
component: Layout, component: Layout,
redirect: '/detectorg/detectorg', redirect: '/testorg/testorg',
name: 'detectorg', name: 'testorg',
meta: { title: '实验室管理', icon: 'example' }, meta: { title: '实验室管理', icon: 'example' },
children: [ children: [
{ {
path: 'detectorg', path: 'testorg',
name: 'DetectOrg', name: 'TestOrg',
component: () => import('@/views/detectorg/detectorg'), component: () => import('@/views/testorg/testorg'),
meta: { title: '实验室信息', icon: 'example', perms: ['detectorg_manage'] } meta: { title: '实验室信息', icon: 'example', perms: ['testorg_manage'] }
}, },
{ {
path: 'detectorgnotice', path: 'testorgnotice',
name: 'DetectOrgNotice', name: 'TextOrgNotice',
component: () => import('@/views/detectorg/detectorgnotice'), component: () => import('@/views/testorg/testorgnotice'),
meta: { title: '实验室通知公告', icon: 'example', perms: ['detectorg_manage'] } meta: { title: '实验室通知公告', icon: 'example', perms: ['testorg_manage'] }
}, },
] ]

View File

@ -1,32 +1,37 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-tabs type="border-card" > <el-tabs type="border-card">
<el-tab-pane label="申请信息" style="height:700px;overflow-y:auto;overflow-x:hidden;"> <el-tab-pane label="申请信息" style="height:700px;overflow-y:auto;overflow-x:hidden;">
<CCCform :action="action" @handleCommit="save" :certapp="certapp" v-if="kind=='CCC'"></CCCform> <CCCform :action="action" @handleCommit="save" :certapp="certapp" v-if="kind=='CCC'"></CCCform>
<QMSform :action="action" @handleCommit="save" :certapp="certapp" v-if="kind=='QMS'"></QMSform> <QMSform :action="action" @handleCommit="save" :certapp="certapp" v-if="kind=='QMS'"></QMSform>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="受理信息" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp&&kind=='QMS'">
<review :action="action" :certapp="certapp" v-if="kind=='QMS'"></review>
</el-tab-pane>
<el-tab-pane label="产品单元" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp"> <el-tab-pane label="产品单元" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp">
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="原材料供应商" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp"> <el-tab-pane label="原材料供应商" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp">
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="检测设备" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp"> <el-tab-pane label="检测设备" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp">
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="资料评审" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp"> <el-tab-pane label="资料评审" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp">
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="收费信息" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp"> <el-tab-pane label="收费信息" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp">
<charge :action="action" @handleCommit="save" :certapp="certapp" v-if="kind=='QMS'"></charge>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
</template> </template>
<script> <script>
import CCCform from "@/views/certapp/cccform" import CCCform from "@/views/certapp/cccform"
import QMSform from "@/views/certapp/qmsform" import QMSform from "@/views/certapp/qmsform"
import review from "@/views/certapp/review"
import charge from "@/views/certapp/charge"
export default { export default {
components: { CCCform,QMSform }, components: { CCCform,QMSform,review ,charge},
props: [], props: [],
data() { data() {
return { return {

View File

@ -0,0 +1,134 @@
<template>
<div>
<el-form ref="elForm" :model="formData" size="medium" label-width="100px">
<el-row :gutter="12">
<el-col :span="8">
<el-card shadow="always">
<el-row>
<el-col font="left">
<el-form-item label="收费单号" prop="feecode">
<el-input placeholder="请输入收费单号"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col font="left">
<el-form-item label="费用性质" prop="feecharacter">
<el-input placeholder="请输入费用性质"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col font="left">
<el-form-item label="申请放名称" prop="query_code">
<el-input placeholder="请输入申请方名称"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col font="left">
<el-form-item label="工厂名称" prop="query_code">
<el-input placeholder="请输入工厂名称"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col font="left">
<el-form-item label="工厂编号" prop="query_code">
<el-input placeholder="请输入工厂编号"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col font="left">
<el-form-item label="总计" prop="query_code">
<el-input placeholder="请输入总计"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col font="left">
<el-form-item label="扣减额" prop="query_code">
<el-input placeholder="请输入扣减额"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col font="left">
<el-form-item label="外汇类型" prop="query_code">
<el-input placeholder="请输入外汇类型"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col font="left">
<el-form-item label="外币汇率" prop="query_code">
<el-input placeholder="请输入外币汇率"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col font="left">
<el-form-item label="实收人名币" prop="query_code">
<el-input placeholder="请输入金额"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col font="left">
<el-form-item label="实收外币" prop="query_code">
<el-input placeholder="请输入金额"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col font="left">
<el-form-item label="备注" prop="query_code">
<el-input placeholder="请输入备注"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-col>
<el-col :span="16">
<el-card shadow="always">
历次合同内容
</el-card>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script>
</script>

View File

@ -0,0 +1,430 @@
<template>
<div>
<el-form ref="elForm" :model="formData" size="medium" label-width="150px">
<el-collapse v-model="activeNames" @change="handleChange">
<el-collapse-item title="申请信息" name="1">
<el-row>
<el-col :xs="24" :md="8">
<el-form-item label="受理日期" prop="apply_date">
<el-date-picker v-model="formData.apply_date"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
:style="{width: '100%'}"
placeholder="受理日期"
clearable></el-date-picker>
</el-form-item>
</el-col>
<el-col :xs="24" :md="8">
<el-form-item label="接收日期" prop="accept_date">
<el-date-picker v-model="formData.accept_date"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
:style="{width: '100%'}"
placeholder="材料接收日期"
clearable></el-date-picker>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="申请方" name="2">
<el-row>
<el-col :xs="24" :md="8">
<el-form-item label="申请方" prop="applicant">
<el-input placeholder="请选择申请方" readonly clearable v-model="formData.applicant_v.name">
<el-button slot="append" icon="el-icon-search" @click="choose(0)"></el-button>
</el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="8">
<el-form-item label="地址" prop="applicant_v.address">
<el-select v-model="formData.applicant_v.address"
placeholder="请选择地址"
filterable
allow-create
:style="{width: '100%'}">
<el-option v-for="(item, index) in addressOptions0"
:key="index"
:label="item.address"
:value="item.address"
:disabled="item.disabled"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :xs="24" :md="8">
<el-form-item label="联系人">
<el-input v-model="formData.applicant_v.linkman_name"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="8">
<el-form-item label="手机">
<el-input v-model="formData.applicant_v.linkman_mobile"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="8">
<el-form-item label="职务">
<el-input v-model="formData.applicant_v.linkman_duty"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="质量管理体系信息" name="3">
<el-row>
<el-col :xs="24" :md="5">
<el-form-item label="体系相关人数">
<el-input v-model="formData.system_people"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="5">
<el-form-item label="初始人数">
<el-input v-model="formData.initial_people"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="5">
<el-form-item label="监督人日">
<el-input v-model="formData.supervision_people"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="5">
<el-form-item label="认可情况" prop="is_approve">
<el-switch v-model="formData.is_approve"
active-color="#13ce66"
inactive-color="#8C969D">
</el-switch>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :xs="24" :md="5">
<el-form-item label="初次认证费">
<el-input v-model="formData.Initial_certification"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="5">
<el-form-item label="年金">
<el-input v-model="formData.annuity"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="5">
<el-form-item label="监督金额">
<el-input v-model="formData.supervise_amount"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="5">
<el-form-item label="复评金额">
<el-input v-model="formData.review_amount"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :xs="24" :md="8">
<el-form-item label="依据的体系标准" prop="system_standard">
<el-select v-model="formData.system_standard"
placeholder="请选择"
clearable
:style="{width: '100%'}">
<el-option v-for="(item, index) in type_Options"
:key="index"
:label="item.name"
:value="item.value"
:disabled="item.disabled">
</el-option>
</el-select>
</el-form-item>
</el-col>
<!--<el-col :xs="24" :md="8">
<el-form-item label="产品生产依据的国家/行业标准代号">
<el-input v-model="formData.factory_v.linkman_mobile"></el-input>
</el-form-item>
</el-col>-->
<el-col :xs="24" :md="12">
<el-form-item label="专业代码">
<el-select v-model="formData.professional_code"
multiple
filterable
allow-create
default-first-option
:style="{width: '100%'}"
placeholder="请选择专业代码">
<el-option v-for="item in professionaloptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :xs="24">
<el-form-item label="认证范围">
<el-input type="textarea" :rows="2" v-model="formData.certification"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<!--<el-collapse-item title="机构转换" name="4">
<el-row>
<el-col :xs="24" :md="8">
<el-form-item label="原认证机构名称">
<el-input v-model="formData.factory_v.linkman_name"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="8">
<el-form-item label="原(已)获认证的认证注册号">
<el-input v-model="formData.factory_v.linkman_mobile"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="申请性质" name="5">
<el-row>
<el-col :xs="24" :md="5">
<el-form-item label="项目级别">
<el-input v-model="formData.factory_v.linkman_mobile"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="5">
<el-form-item label="申请性质">
<el-input v-model="formData.factory_v.linkman_duty"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="5">
<el-form-item label="审查方式">
<el-input v-model="formData.factory_v.linkman_name"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="5">
<el-form-item label="专业范围">
<el-input v-model="formData.factory_v.linkman_mobile"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :xs="24" :md="11">
<el-form-item label="认证范围">
<el-input type="textarea" :rows="2" v-model="formData.remarks"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="11">
<el-form-item label="特殊要求">
<el-input type="textarea" :rows="2" v-model="formData.remarks"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :xs="24" :md="8">
<el-form-item label="申请认证范围涉及的产品是否获得其它认证">
<el-input type="textarea" :rows="5" v-model="formData.remarks"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="8">
<el-form-item label="如获得过其他机构颁发的质量体系证书,该证书是否仍然有效?">
<el-input type="textarea" :rows="5" v-model="formData.remarks"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="8">
<el-form-item label="备注">
<el-input type="textarea" :rows="5" v-model="formData.remarks"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>-->
</el-collapse>
</el-form>
<div slot="footer" align="center">
<el-button @click="close(false)">取消</el-button>
<el-button type="primary" @click="handelConfirm">保存</el-button>
</div>
<el-dialog title="选择企业"
:visible.sync="dgVisiable"
:close-on-click-modal="false"
width="80%"
:append-to-body="true">
<Enterprisechose ref="Enterprisechose" @handleChose="chooseComplete"></Enterprisechose>
</el-dialog>
</div>
</template>
<script>
import { createCertapp, updateCertapp, getCertapp } from "@/api/certapp";
import Enterprisechose from "@/views/enterprise/enterprisechoose";
import { getAddressList } from "@/api/enterprise";
import { genTree } from "../../utils";
import { getDictList } from "../../api/dict";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "DTXform",
inheritAttrs: false,
components: { Enterprisechose, Treeselect },
props: ["action", "certapp"],
data() {
return {
activeNames: ['1', '2', '3', '4','5'],
formData: {
field_code: 'DTX',
applicant: null,
applicant_v: {},
factory: null,
factory_v: {},
cccpv_class: null,
pattern: "正常",
is_approve: true,
},
dgType: 0,
dgVisiable: false,
addressOptions0: [],
type_Options: [],
professionaloptions:[],
};
},
computed: {},
watch: {
},
created() {
if(this.action!='create'){
this.formData.id = this.certapp
this.getCertapp_()
}
this.getTypeOptions();
this.getProfOptions()
},
mounted() {},
methods: {
handleChange(val) {
console.log(val);
},
getTypeOptions() {
getDictList({ type__code: "system_standards" }).then(response => {
this.type_Options = genTree(response.data);
});
},
getProfOptions() {
getDictList({ type__code: "cnas_scope" }).then(response => {
this.professionaloptions = genTree(response.data);
});
},
getCertapp_(){
getCertapp(this.formData.id).then(res=>{
this.formData = res.data
})
},
handelConfirm() {
this.$refs["elForm"].validate((valid) => {
if (!valid) return;
if(this.formData.id){
updateCertapp(this.formData.id, this.formData).then((res) => {
this.$message.success('成功')
this.$emit("handleCommit", res.data);
});
}else{
createCertapp(this.formData).then((res) => {
this.$message.success('成功')
this.$emit("handleCommit", res.data);
});
}
});
},
choose(val) {
this.dgType = val;
this.dgVisiable = true;
},
chooseComplete(val) {
this.dgVisiable = false;
if (val) {
if (this.dgType == 1) {
this.formData.manufacture = val.id;
this.formData.manufacture_v = {
name: val.name,
linkman_name: val.linkman1_name,
linkman_mobile: val.linkman1_mobile,
linkman_duty: val.linkman1_duty,
};
} else if (this.dgType == 2) {
this.formData.factory = val.id;
this.formData.factory_v = {
name: val.name,
linkman_name: val.linkman1_name,
linkman_mobile: val.linkman1_mobile,
linkman_duty: val.linkman1_duty,
person_count: val.person_count,
};
} else if (this.dgType == 0) {
this.formData.applicant = val.id;
this.formData.applicant_v = {
name: val.name,
linkman_name: val.linkman1_name,
linkman_mobile: val.linkman1_mobile,
linkman_duty: val.linkman1_duty,
person_count: val.person_count,
};
}
}
this.getAddressList_(val.id);
},
getAddressList_(id) {
getAddressList({ enterprise: id }).then((res) => {
let data = genTree(res.data);
if(this.dgType==0){
this.addressOptions0 = data;
}
});
},
}
};
</script>
<style>
</style>

View File

@ -347,7 +347,7 @@ export default {
}, },
getProfOptions() { getProfOptions() {
getDictList({ type__code: "industry_classification" }).then(response => { getDictList({ type__code: "cnas_scope" }).then(response => {
this.professionaloptions = genTree(response.data); this.professionaloptions = genTree(response.data);
}); });

View File

@ -0,0 +1,127 @@
<template>
<div id="print">
<el-form ref="elForm" :model="formData" size="medium" label-width="70px">
<el-row :gutter="12">
<el-col>
<el-card shadow="always">
<el-table id="evl"
:data="eltList"
style="width: 100%;margin-top:10px;"
border
fit
highlight-current-row
max-height="600">
<el-table-column type="index" width="50" />
<el-table-column align="center" label="项目内容" width="750">
<template slot-scope="scope">
{{ scope.row.content }}
</template>
</el-table-column>
<el-table-column label="符合">
<template slot-scope="scope">
<el-radio-group v-model="radio">
<el-radio :label="1">符合</el-radio>
<el-radio :label="2">不符合</el-radio>
<el-radio :label="3">不适用</el-radio>
<el-radio :label="4">需说明</el-radio>
</el-radio-group>
</template>
</el-table-column>
</el-table>
</el-card>
</el-col>
</el-row>
</el-form>
<div slot="footer" align="center">
<el-button @click="close(false)">取消</el-button>
<el-button type="primary" @click="handelConfirm">保存</el-button>
</div>
</div>
</template>
<script type="text/javascript">
import { createEvaluationDetail, updateEvaluationDetail, getEvaluationDetailList } from "@/api/evaluationdetail";
import { getEvaluationsList } from "@/api/evaluationitem";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
inheritAttrs: false,
components: { Treeselect },
props: ["action", "certapp"],
data() {
return {
formData: {
field_code: 'QMS',
result:null,
is_approve: true,
remark:null,
cert_app:this.certapp
},
radio: 3,
eltList: [],
dgType: 0,
dgVisiable: false,
};
},
computed: {},
watch: {
},
created() {
this.getList()
},
mounted() {},
methods: {
getList() {
getEvaluationsList().then(response => {
this.eltList = response.data.results
});
},
handelConfirm() {
this.$refs["elForm"].validate((valid) => {
if (!valid) return;
if(this.formData.id){
updateEvaluationDetail(this.formData.id, this.formData).then((res) => {
this.$message.success('成功')
this.$emit("handleCommit", res.data);
});
}else{
for (var i = 0; i < this.evl.length; i++) {
var halo = this.evl[i];
console.log(halo);
}
}
});
},
}
};
</script>
<style>
</style>

View File

@ -4,53 +4,50 @@
<div style="margin-top:6px"> <div style="margin-top:6px">
<el-button type="primary" icon="el-icon-plus" @click="handleCreate">新增</el-button> <el-button type="primary" icon="el-icon-plus" @click="handleCreate">新增</el-button>
</div> </div>
<el-table <el-table v-loading="listLoading"
v-loading="listLoading" :data="evaluationitem.results"
:data="evaluationitem.results" style="width: 100%;margin-top:10px;"
style="width: 100%;margin-top:10px;" border
border fit
fit stripe
stripe highlight-current-row
highlight-current-row max-height="600">
max-height="600"
>
<el-table-column type="index" width="50" /> <el-table-column type="index" width="50" />
<el-table-column label="编号"> <el-table-column label="名称">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.cert_field }} {{ scope.row.name }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="名称"> <el-table-column label="认证领域">
<template slot-scope="scope">{{ scope.row.name }}</template> <template slot-scope="scope">
{{ scope.row.cert_field.name}}
</template>
</el-table-column> </el-table-column>
<el-table-column label="上传日期"> <el-table-column label="上传日期">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ scope.row.create_time }}</span> <span>{{ scope.row.create_time }}</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-button <el-button type="primary"
type="primary" size="small"
size="small" :disabled="!checkPermission(['evaluationitem_update'])"
:disabled="!checkPermission(['evaluationitem_update'])" @click="handleUpdate(scope)">编辑</el-button>
@click="handleUpdate(scope)" <!-- <el-button
>编辑</el-button> type="primary"
<!-- <el-button size="small"
type="primary" :disabled="!checkPermission(['implementrule_update'])"
size="small" @click="handleUpate(scope)"
:disabled="!checkPermission(['implementrule_update'])" >单元划分</el-button> -->
@click="handleUpate(scope)" <el-button type="danger"
>单元划分</el-button> --> size="small"
<el-button :disabled="!checkPermission(['evaluationitem_delete'])"
type="danger" @click="handleDelete(scope)">删除</el-button>
size="small" </template>
:disabled="!checkPermission(['evaluationitem_delete'])" </el-table-column>
@click="handleDelete(scope)"
>删除</el-button>
</template>
</el-table-column>
</el-table> </el-table>
<pagination <pagination

View File

@ -5,54 +5,54 @@
<el-tab-pane label="评审信息"> <el-tab-pane label="评审信息">
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="100px"> <el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="100px">
<el-row> <el-row>
<el-col :span="8"> <el-col :span="12">
<el-form-item label="认证类型" prop="cert_field"> <el-form-item label="认证类型" prop="cert_field">
<treeselect v-model="formData.cert_field" :multiple="false" :options="cert_fieldOptions" placeholder="请选择认证类型" :style="{width: '100%'}" @select="typeChange" <treeselect v-model="formData.cert_field" :multiple="false" :options="cert_fieldOptions" placeholder="请选择认证类型" :style="{width: '100%'}" @select="typeChange"
:clearable="false" :defaultExpandLevel='1' :disable-branch-nodes="true" /> :clearable="false" :defaultExpandLevel='1' :disable-branch-nodes="true" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24" v-if="cert_field_code =='PV'"> </el-row>
<el-form-item label="产品分类" prop="pv_class"> <el-row>
<treeselect v-model="formData.pv_class" <el-col :span="12" v-if="cert_field_code =='PV'">
:disable-branch-nodes="true" <el-form-item label="产品分类" prop="pv_class">
placeholder="请选择产品分类" <treeselect v-model="formData.pv_class"
clearable :disable-branch-nodes="true"
:style="{width: '100%'}" placeholder="请选择产品分类"
:options="pv_classOptions" clearable
:multiple="false"></treeselect> :style="{width: '100%'}"
</el-form-item> :options="pv_classOptions"></treeselect>
</el-col> </el-form-item>
<el-col :span="24" v-if="cert_field_code =='CCC'"> </el-col>
<el-form-item label="产品分类" prop="ccc_list"> <el-col :span="12" v-if="cert_field_code =='CCC'">
<treeselect v-model="formData.ccc_list" <el-form-item label="产品分类" prop="ccc_list">
:disable-branch-nodes="true" <treeselect v-model="formData.ccc_list"
placeholder="请选择产品分类" :disable-branch-nodes="true"
clearable placeholder="请选择产品分类"
:style="{width: '100%'}" clearable
:options="ccc_listOptions" :style="{width: '100%'}"
:multiple="true"></treeselect> :options="ccc_listOptions"></treeselect>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="评审标题" prop="name"> <el-form-item label="评审标题" prop="name">
<el-input v-model="formData.name" placeholder="请输入评审标题" clearable :style="{width: '100%'}"></el-input> <el-input v-model="formData.name" placeholder="请输入评审标题" clearable :style="{width: '100%'}"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="24" style="margin-top:4px"> <el-col :span="24" style="margin-top:4px">
<el-form-item size="large"> <el-form-item size="large">
<el-button type="primary" @click="submitForm">保存</el-button> <el-button type="primary" @click="submitForm">保存</el-button>
<el-button @click="resetForm">重置</el-button> <el-button @click="resetForm">重置</el-button>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="评审项信息" v-if="formData.id"> <el-tab-pane label="评审项信息" v-if="formData.id">
<Evaluations :evItem="formData.id"></Evaluations> <Evaluations :evItem="formData.id"></Evaluations>
@ -79,7 +79,7 @@ export default {
id: null, id: null,
name:undefined, name:undefined,
cert_field: undefined, cert_field: undefined,
pv_scope: undefined, pv_scope: undefined,
pv_class: undefined, pv_class: undefined,
ccc_list: undefined ccc_list: undefined
@ -105,7 +105,44 @@ export default {
this.getCerttype(); this.getCerttype();
}, },
mounted() {}, mounted() {},
methods: { methods: {
typeChange(node,id){
this.cert_field_code = node.code
this.changeRules(node.code)
},
changeRules(val) {
if (val == "PV") {
this.rules.pv_scope = [
{
required: true,
message: "请选择",
trigger: "change"
}
];
this.rules.pv_class = [
{
required: true,
message: "请选择",
trigger: "change"
}
];
this.rules.ccc_list = [];
} else if (val == "CCC") {
this.rules.ccc_list = [
{
required: true,
message: "请选择",
trigger: "change"
}
];
this.rules.pv_class = [];
this.rules.pv_scope = [];
} else {
this.rules.pv_class = [];
this.rules.pv_scope = [];
this.rules.ccc_list = [];
}
},
getCerttype() { getCerttype() {
getDictList({ type__code: "cert_field" }).then(response => { getDictList({ type__code: "cert_field" }).then(response => {
if (response.data) { if (response.data) {

View File

@ -6,18 +6,37 @@
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="100px"> <el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="100px">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="8">
<el-form-item label="评审标题" prop="name"> <el-form-item label="认证类型" prop="cert_field">
<el-input v-model="formData.name" placeholder="请输入评审标题" clearable :style="{width: '100%'}"></el-input> <treeselect v-model="formData.cert_field" :multiple="false" :options="cert_fieldOptions" placeholder="请选择认证类型" :style="{width: '100%'}" @select="typeChange"
:clearable="false" :defaultExpandLevel='1' :disable-branch-nodes="true" />
</el-form-item>
</el-col>
<el-col :span="8" v-if="cert_field_code =='PV'">
<el-form-item label="产品分类" prop="pv_class">
<treeselect v-model="formData.pv_class"
:disable-branch-nodes="true"
placeholder="请选择产品分类"
clearable
:style="{width: '100%'}"
:options="pv_classOptions"></treeselect>
</el-form-item>
</el-col>
<el-col :span="8" v-if="cert_field_code =='CCC'">
<el-form-item label="产品分类" prop="ccc_list">
<treeselect v-model="formData.ccc_list"
:disable-branch-nodes="true"
placeholder="请选择产品分类"
clearable
:style="{width: '100%'}"
:options="ccc_listOptions"></treeselect>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="评审代号" prop="cert_field"> <el-form-item label="评审标题" prop="name">
<el-input v-model="formData.cert_field" placeholder="请输入评审代号" clearable :style="{width: '100%'}"></el-input> <el-input v-model="formData.name" placeholder="请输入评审标题" clearable :style="{width: '100%'}"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -41,7 +60,9 @@
</div> </div>
</template> </template>
<script> <script>
import { getDictList } from "@/api/dict";
import { updateEvaluationItem,getEvaluationItem} from "@/api/evaluationitem"; import { updateEvaluationItem,getEvaluationItem} from "@/api/evaluationitem";
import { genTree } from "@/utils";
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";
@ -53,29 +74,119 @@ export default {
return { return {
formData: { formData: {
id: null, id: null,
name:undefined, name:undefined,
cert_field: undefined, cert_field: undefined,
pv_scope: undefined,
pv_class: undefined,
ccc_list: undefined
}, },
rules: { rules: {
}, },
cert_fieldOptions: [],
cert_field_code:null,
pv_scopeOptions: [],
pv_classOptions: [],
ccc_listOptions: [],
cert_patternOptions: []
}; };
}, },
created() { created() {
this.formData.id = this.$route.query.id;//接收参数 this.formData.id = this.$route.query.id;//接收参数
this.getData(); this.getData();
this.getPvscope();
this.getPvclass();
this.getCccList();
this.getCertpattern();
this.getCerttype();
}, },
mounted() {}, mounted() {},
methods: { methods: {
getData() {
typeChange(node,id){
this.cert_field_code = node.code
this.changeRules(node.code)
},
changeRules(val) {
if (val == "PV") {
this.rules.pv_scope = [
{
required: true,
message: "请选择",
trigger: "change"
}
];
this.rules.pv_class = [
{
required: true,
message: "请选择",
trigger: "change"
}
];
this.rules.ccc_list = [];
} else if (val == "CCC") {
this.rules.ccc_list = [
{
required: true,
message: "请选择",
trigger: "change"
}
];
this.rules.pv_class = [];
this.rules.pv_scope = [];
} else {
this.rules.pv_class = [];
this.rules.pv_scope = [];
this.rules.ccc_list = [];
}
},
getCerttype() {
getDictList({ type__code: "cert_field" }).then(response => {
if (response.data) {
this.cert_fieldOptions = genTree(response.data);
}
});
},
getPvscope() {
getDictList({ type__code: "pv_scope" }).then(response => {
if (response.data) {
this.pv_scopeOptions = genTree(response.data);
}
});
},
getPvclass() {
getDictList({ type__code: "pv_class" }).then(response => {
if (response.data) {
this.pv_classOptions = genTree(response.data);
}
});
},
getCccList() {
getDictList({ type__code: "ccc_list" }).then(response => {
if (response.data) {
this.ccc_listOptions = genTree(response.data);
}
});
},
getCertpattern() {
getDictList({ type__code: "cert_pattern" }).then(response => {
if (response.data) {
this.cert_patternOptions = genTree(response.data);
}
});
},
getData() {
getEvaluationItem(this.formData.id).then(response => { getEvaluationItem(this.formData.id).then(response => {
this.formData = response.data; this.formData = response.data;
this.cert_field_code = response.data.cert_field_.code
}) })
}, },
submitForm() { submitForm() {
this.$refs["elForm"].validate(valid => { this.$refs["elForm"].validate(valid => {
if (!valid) return; if (!valid) return;

View File

@ -36,7 +36,7 @@
:model="evalutionsData" :model="evalutionsData"
label-width="80px" label-width="80px"
label-position="right" label-position="right"
:rules="rule1"> >
<el-form-item label="评审项:" prop="content"> <el-form-item label="评审项:" prop="content">
<el-input type="textarea" :rows="2" v-model="evalutionsData.content" <el-input type="textarea" :rows="2" v-model="evalutionsData.content"
@ -70,20 +70,22 @@ export default {
evalutionsData: { evalutionsData: {
id: null, id: null,
content: null, content: null,
},
listQuery: {
evItem: this.evItem, evItem: this.evItem,
}, },
eltList: [], eltList: [],
listLoading: true, listLoading: true,
dialogVisible:false, dialogVisible:false,
dialogType:'create', dialogType:'create',
rule1: {
}
}; };
}, },
created() { created() {
this.getList() this.getList()
}, },
@ -92,10 +94,10 @@ export default {
getList() { getList() {
this.listLoading = true; this.listLoading = true;
getEvaluationsList({ evItem:this.evItem }).then(response => { getEvaluationsList(this.listQuery).then(response => {
if (response.data) { if (response.data) {
this.eltList = response.data.results; this.eltList = response.data
console.log(this.eltList) console.log(this.listQuery)
} }
this.listLoading = false this.listLoading = false

View File

@ -68,12 +68,12 @@
<el-button type="primary" <el-button type="primary"
size="small" size="small"
icon="el-icon-edit" icon="el-icon-edit"
:disabled="!checkPermission(['detectorg_update'])" :disabled="!checkPermission(['testorg_update'])"
@click="handleUpdate(scope)" /> @click="handleUpdate(scope)" />
<el-button type="danger" <el-button type="danger"
size="small" size="small"
icon="el-icon-delete" icon="el-icon-delete"
:disabled="!checkPermission(['detectorg_delete'])" :disabled="!checkPermission(['testorg_delete'])"
@click="handleDelete(scope)" /> @click="handleDelete(scope)" />
</template> </template>
</el-table-column> </el-table-column>
@ -137,7 +137,7 @@
</div> </div>
</template> </template>
<script> <script>
import { getDetectOrgList, createDetectOrg, updateDetectOrg, deleteDetectOrg } from "@/api/laboratory" import { getTestOrgList, createTestOrg, updateTestOrg, deleteTestOrg } from "@/api/laboratory"
import Pagination from "@/components/Pagination" import Pagination from "@/components/Pagination"
import checkPermission from '@/utils/permission' import checkPermission from '@/utils/permission'
@ -181,7 +181,7 @@
checkPermission, checkPermission,
getList() { getList() {
this.listLoading = true; this.listLoading = true;
getDetectOrgList(this.listQuery).then(response => { getTestOrgList(this.listQuery).then(response => {
if (response.data) { if (response.data) {
this.detectoryList = response.data this.detectoryList = response.data
} }
@ -223,7 +223,7 @@
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
deleteDetectOrg(scope.row.id).then(res=>{ deleteTestOrg(scope.row.id).then(res=>{
this.$message.success('删除成功') this.$message.success('删除成功')
this.getList() this.getList()
}) })
@ -243,7 +243,7 @@
if (valid) { if (valid) {
const isEdit = this.dialogType === "update"; const isEdit = this.dialogType === "update";
if (isEdit) { if (isEdit) {
updateDetectOrg(this.standard.id, this.standard).then(res => { updateTestOrg(this.standard.id, this.standard).then(res => {
this.getList(); this.getList();
this.dialogVisible = false this.dialogVisible = false
@ -251,7 +251,7 @@
}); });
} else { } else {
createDetectOrg(this.standard).then(res => { createTestOrg(this.standard).then(res => {
this.getList(); this.getList();
this.dialogVisible = false this.dialogVisible = false

View File

@ -48,12 +48,12 @@
<el-button type="primary" <el-button type="primary"
size="small" size="small"
icon="el-icon-edit" icon="el-icon-edit"
:disabled="!checkPermission(['detectorg_update'])" :disabled="!checkPermission(['testorg_update'])"
@click="handleUpdate(scope)" /> @click="handleUpdate(scope)" />
<el-button type="danger" <el-button type="danger"
size="small" size="small"
icon="el-icon-delete" icon="el-icon-delete"
:disabled="!checkPermission(['detectorg_delete'])" :disabled="!checkPermission(['testorg_delete'])"
@click="handleDelete(scope)" /> @click="handleDelete(scope)" />
</template> </template>
</el-table-column> </el-table-column>
@ -145,7 +145,7 @@
</div> </div>
</template> </template>
<script> <script>
import { getDetectOrgNoticeList,getDetectOrgList, createDetectOrgNotice, updateDetectOrgNotice, deleteDetectOrgNotice } from "@/api/laboratory" import { getTestOrgNoticeList,getTestOrgList, createTestOrgNotice, updateTestOrgNotice, deleteTestOrgNotice } from "@/api/laboratory"
import { upUrl, upHeaders} from "@/api/file" import { upUrl, upHeaders} from "@/api/file"
import Pagination from "@/components/Pagination" import Pagination from "@/components/Pagination"
import checkPermission from '@/utils/permission' import checkPermission from '@/utils/permission'
@ -201,7 +201,7 @@
}, },
getStaffList() { getStaffList() {
getDetectOrgList().then(response => { getTestOrgList().then(response => {
this.staffList = response.data.results; this.staffList = response.data.results;
@ -210,7 +210,7 @@
getList() { getList() {
this.listLoading = true; this.listLoading = true;
getDetectOrgNoticeList(this.listQuery).then(response => { getTestOrgNoticeList(this.listQuery).then(response => {
if (response.data) { if (response.data) {
this.detectorynoticeList = response.data this.detectorynoticeList = response.data
console.log(this.detectorynoticeList) console.log(this.detectorynoticeList)
@ -289,7 +289,7 @@
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
deleteDetectOrgNotice(scope.row.id).then(res=>{ deleteTestOrgNotice(scope.row.id).then(res=>{
this.$message.success('删除成功') this.$message.success('删除成功')
this.getList() this.getList()
}) })
@ -309,7 +309,7 @@
if (valid) { if (valid) {
const isEdit = this.dialogType === "update"; const isEdit = this.dialogType === "update";
if (isEdit) { if (isEdit) {
updateDetectOrgNotice(this.standard.id, this.standard).then(res => { updateTestOrgNotice(this.standard.id, this.standard).then(res => {
this.getList(); this.getList();
this.dialogVisible = false this.dialogVisible = false
@ -317,7 +317,7 @@
}); });
} else { } else {
createDetectOrgNotice(this.standard).then(res => { createTestOrgNotice(this.standard).then(res => {
this.getList(); this.getList();
this.dialogVisible = false this.dialogVisible = false

View File

@ -0,0 +1,29 @@
# Generated by Django 3.0.5 on 2020-08-21 09:52
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('system', '0031_delete_bscodeset'),
('certset', '0017_auto_20200821_1522'),
]
operations = [
migrations.RemoveField(
model_name='evaluationitem',
name='cccpv_class',
),
migrations.AddField(
model_name='evaluationitem',
name='ccc_list',
field=models.ManyToManyField(blank=True, related_name='EvaluationItem_ccc_list', to='system.Dict', verbose_name='CCC产品分类'),
),
migrations.AddField(
model_name='evaluationitem',
name='pv_class',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='EvaluationItem_pv_class', to='system.Dict', verbose_name='自愿性产品认证产品分类'),
),
]

View File

@ -0,0 +1,24 @@
# Generated by Django 3.0.5 on 2020-08-21 09:55
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('system', '0031_delete_bscodeset'),
('certset', '0018_auto_20200821_1752'),
]
operations = [
migrations.RemoveField(
model_name='evaluationitem',
name='ccc_list',
),
migrations.AddField(
model_name='evaluationitem',
name='ccc_list',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='EvaluationItem_ccc_list', to='system.Dict', verbose_name='CCC产品分类'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.0.5 on 2020-09-01 07:25
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('certset', '0019_auto_20200821_1755'),
]
operations = [
migrations.AddField(
model_name='evaluations',
name='conform',
field=models.TextField(default='符合', verbose_name='是否符合'),
),
]

View File

@ -63,8 +63,8 @@ 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.DO_NOTHING)
cccpv_class = models.ForeignKey(Dict, verbose_name='涉及CCC/PV分类', related_name='Evaluations_cccpv_class', on_delete=models.DO_NOTHING, null=True, blank=True) 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')
class Meta: class Meta:
verbose_name = '评审表项目' verbose_name = '评审表项目'
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
@ -73,6 +73,7 @@ class EvaluationItem(CommonAModel):
return self.cert_field return self.cert_field
class Evaluations(CommonAModel): class Evaluations(CommonAModel):
content = models.TextField('内容', blank=True) content = models.TextField('内容', blank=True)
conform = models.TextField('是否符合', default='符合')
evItem = models.ForeignKey(EvaluationItem, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='评审标准', related_name='Evaluations_evItem') evItem = models.ForeignKey(EvaluationItem, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='评审标准', related_name='Evaluations_evItem')
class Meta: class Meta:
verbose_name = '评审列' verbose_name = '评审列'

View File

@ -46,9 +46,24 @@ class UnitTypeSerializer(serializers.ModelSerializer):
queryset = queryset.select_related('standard','implementrule') queryset = queryset.select_related('standard','implementrule')
return queryset return queryset
class EvaluationItemSerializer(serializers.ModelSerializer): class EvaluationItemSerializer(serializers.ModelSerializer):
cert_field_ = DictSerializer(source='cert_field', read_only=True)
class Meta: class Meta:
model = EvaluationItem model = EvaluationItem
fields = '__all__' fields = '__all__'
class EvaluationItemListSerializer(serializers.ModelSerializer):
pv_class = DictSerializer()
cert_field = DictSerializer()
ccc_list = DictSerializer()
class Meta:
model = EvaluationItem
fields = ['id', 'name', 'cert_field', 'pv_class', 'create_time', 'ccc_list']
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.select_related('pv_class', 'cert_field')
queryset = queryset.prefetch_related('ccc_list',)
return queryset
class EvaluationsSerializer(serializers.ModelSerializer): class EvaluationsSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Evaluations model = Evaluations

View File

@ -1,7 +1,7 @@
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 Standard, UnitType, ImplementRule,EvaluationItem,Evaluations from .models import Standard, UnitType, ImplementRule,EvaluationItem,Evaluations
from .serializers import StandardSerializer, ImplementRuleSerializer, UnitTypeSerializer, ImplementRuleListSerializer,EvaluationItemSerializer,EvaluationsSerializer from .serializers import StandardSerializer, ImplementRuleSerializer, UnitTypeSerializer,EvaluationItemListSerializer, ImplementRuleListSerializer,EvaluationItemSerializer,EvaluationsSerializer
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
# Create your views here. # Create your views here.
@ -53,13 +53,28 @@ class EvaluationItemViewSet(CreateUpdateCustomMixin, ModelViewSet):
serializer_class = EvaluationItemSerializer serializer_class = EvaluationItemSerializer
search_fields = ['cert_field'] search_fields = ['cert_field']
ordering = ['-create_time'] ordering = ['-create_time']
def get_serializer_class(self):
# 根据请求类型动态变更serializer
if self.action == 'list':
return EvaluationItemListSerializer
return EvaluationItemSerializer
class EvaluationsViewSet(CreateUpdateCustomMixin, ModelViewSet): class EvaluationsViewSet(CreateUpdateCustomMixin, ModelViewSet):
""" """
培训记录-增删改查 培训记录-增删改查
""" """
perms_map = {'get': '*', 'post': 'evaluations_create', perms_map = {'get': '*', 'post': 'evaluations_create',
'put': 'evaluations_update', 'delete': 'evaluations_delete'} 'put': 'evaluations_update', 'delete': 'evaluations_delete'}
queryset = Evaluations.objects.all() queryset = Evaluations.objects.all()
serializer_class = EvaluationsSerializer serializer_class = EvaluationsSerializer
search_fields = ['content'] search_fields = ['content']
ordering = ['-create_time'] filterset_fields = ['evItem','content']
ordering = ['-create_time']
def paginate_queryset(self, queryset):
if ((not self.request.query_params.get('page', None)) and (self.request.query_params.get('evItem', None))) or (self.paginator is None):
return None
return self.paginator.paginate_queryset(queryset, self.request, view=self)

View File

View File

@ -0,0 +1,5 @@
from django.contrib import admin
from .models import *
# Register your models here.
admin.site.register(Bill)

View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class CrmConfig(AppConfig):
name = 'financial'
verbose_name = '财务管理'

View File

@ -0,0 +1,47 @@
# Generated by Django 3.0.5 on 2020-08-27 03:48
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('system', '0031_delete_bscodeset'),
('project', '0024_auto_20200827_1132'),
('crm', '0011_enterprise_parent'),
]
operations = [
migrations.CreateModel(
name='Bill',
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='删除标记')),
('feecode', models.CharField(max_length=300, verbose_name='收费单号')),
('totalfee', models.FloatField(blank=True, default=0, null=True, verbose_name='总金额')),
('deductions', models.FloatField(blank=True, default=0, null=True, verbose_name='扣减额')),
('exchangetype', models.CharField(max_length=300, verbose_name='外汇类型')),
('exchangerate', models.FloatField(blank=True, default=0, null=True, verbose_name='外币汇率')),
('paidrmb', models.FloatField(blank=True, default=0, null=True, verbose_name='实收人名币')),
('paidwb', models.FloatField(blank=True, default=0, null=True, verbose_name='实收外币')),
('remark', models.CharField(max_length=300, verbose_name='备注')),
('applicant', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='bill_applicant', to='crm.Enterprise')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bill_belong_dept', to='system.Organization', verbose_name='所属部门')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bill_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('feecharacter', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='bill_feecharacter', to='system.Dict', verbose_name='费用性质')),
('number', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='bill_number', to='project.CertApp')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bill_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'abstract': False,
},
),
]

View File

@ -0,0 +1,23 @@
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
from apps.project.models import CertApp
from apps.crm.models import Enterprise
import uuid
# Create your models here.
class Bill(CommonBModel):
"""
收费单表
"""
feecode = models.CharField('收费单号', max_length=300)
number = models.ForeignKey(CertApp, related_name='bill_number', on_delete=models.DO_NOTHING)
feecharacter = models.ForeignKey(Dict, verbose_name='费用性质', related_name='bill_feecharacter', on_delete=models.DO_NOTHING)
applicant = models.ForeignKey(Enterprise, related_name='bill_applicant', on_delete=models.DO_NOTHING)
totalfee = models.FloatField('总金额',null=True, blank=True, default=0)
deductions = models.FloatField('扣减额',null=True, blank=True, default=0)
exchangetype = models.CharField('外汇类型', max_length=300)
exchangerate = models.FloatField('外币汇率',null=True, blank=True, default=0)
paidrmb = models.FloatField('实收人名币',null=True, blank=True, default=0)
paidwb = models.FloatField('实收外币',null=True, blank=True, default=0)
remark = models.CharField('备注', max_length=300)

View File

@ -0,0 +1,11 @@
from rest_framework import serializers
from .models import Bill
class BillSerializer(serializers.ModelSerializer):
class Meta:
model = Bill
fields = '__all__'

View File

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

View File

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

View File

@ -0,0 +1,18 @@
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from .models import Bill
from utils.queryset import get_child_queryset2
from .serializers import BillSerializer
from apps.system.permission_data import RbacFilterSet
from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin
# Create your views here.
class BillViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
perms_map = {'get': '*', 'post': 'Bill_create',
'put': 'Bill_update', 'delete': 'Bill_delete'}
queryset = Bill.objects
serializer_class = BillSerializer
search_fields = ['name','query_code', 'code']
ordering = ['-create_time']

View File

@ -0,0 +1,89 @@
# Generated by Django 3.0.5 on 2020-08-24 08:49
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),
('laboratory', '0004_auto_20200812_1516'),
]
operations = [
migrations.CreateModel(
name='TestOrg',
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='删除标记')),
('code', models.CharField(max_length=100, verbose_name='实验室编号')),
('name', models.CharField(blank=True, max_length=200, null=True, verbose_name='实验室名称')),
('address', models.CharField(blank=True, max_length=500, null=True, verbose_name='通讯地址')),
('contactman', models.CharField(blank=True, max_length=50, null=True, verbose_name='联系人')),
('contactmanmoblie', models.CharField(blank=True, max_length=50, null=True, verbose_name='联系人手机')),
('contactManTel', models.CharField(blank=True, max_length=50, null=True, verbose_name='联系人电话')),
('loginname', models.CharField(blank=True, max_length=50, null=True, verbose_name='登录名')),
('password', models.CharField(blank=True, max_length=50, null=True, verbose_name='登录密码')),
('note', models.CharField(blank=True, max_length=200, null=True, verbose_name='备注')),
('iszy', models.BooleanField(default=True, verbose_name='是否自有')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='testorg_belong_dept', to='system.Organization', verbose_name='所属部门')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='testorg_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='testorg_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'verbose_name': '实验室信息',
'verbose_name_plural': '实验室信息',
},
),
migrations.CreateModel(
name='TestOrgNotice',
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(blank=True, max_length=500, null=True, verbose_name='公告标题')),
('publishdate', models.DateTimeField(verbose_name='发布时间')),
('ismportant', models.BooleanField(default=True, verbose_name='是否重要公告')),
('note', models.CharField(blank=True, max_length=6000, null=True, verbose_name='公告内容')),
('isalluser', models.BooleanField(default=True, verbose_name='是否通知全员')),
('path', models.CharField(blank=True, max_length=1000, null=True, verbose_name='文件地址')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='testorgnotice_belong_dept', to='system.Organization', verbose_name='所属部门')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='testorgnotice_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('dettonotice', models.ManyToManyField(blank=True, related_name='testorgnotice_dettonotice', to='laboratory.TestOrg', verbose_name='选择的实验室')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='testorgnotice_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'verbose_name': '实验室通知公告',
'verbose_name_plural': '实验室通知公告',
},
),
migrations.RemoveField(
model_name='detectorgnotice',
name='belong_dept',
),
migrations.RemoveField(
model_name='detectorgnotice',
name='create_by',
),
migrations.RemoveField(
model_name='detectorgnotice',
name='dettonotice',
),
migrations.RemoveField(
model_name='detectorgnotice',
name='update_by',
),
migrations.DeleteModel(
name='DetectOrg',
),
migrations.DeleteModel(
name='DetectOrgNotice',
),
]

View File

@ -4,14 +4,14 @@ from simple_history.models import HistoricalRecords
from django.contrib.postgres.fields import ArrayField from django.contrib.postgres.fields import ArrayField
import uuid import uuid
# Create your models here. # Create your models here.
class DetectOrg(CommonBModel): class TestOrg(CommonBModel):
code = models.CharField('实验室编号', max_length=100) code = models.CharField('实验室编号', max_length=100)
name = models.CharField('实验室名称',null=True, blank=True,max_length=200) name = models.CharField('实验室名称',null=True, blank=True,max_length=200)
address = models.CharField('通讯地址',null=True, blank=True,max_length=500) address = models.CharField('通讯地址',null=True, blank=True,max_length=500)
contactman = models.CharField('联系人',null=True, blank=True,max_length=50) contactman = models.CharField('联系人',null=True, blank=True,max_length=50)
contactmanmoblie = models.CharField('联系人手机',null=True, blank=True,max_length=50) contactmanmoblie = models.CharField('联系人手机',null=True, blank=True,max_length=50)
ontactManTel = models.CharField('联系人电话',null=True, blank=True,max_length=50) contactManTel = models.CharField('联系人电话',null=True, blank=True,max_length=50)
loginname = models.CharField('登录名',null=True, blank=True,max_length=50) loginname = models.CharField('登录名',null=True, blank=True,max_length=50)
password = models.CharField('登录密码',null=True, blank=True,max_length=50) password = models.CharField('登录密码',null=True, blank=True,max_length=50)
note = models.CharField('备注',null=True, blank=True,max_length=200) note = models.CharField('备注',null=True, blank=True,max_length=200)
@ -22,7 +22,7 @@ class DetectOrg(CommonBModel):
def __str__(self): def __str__(self):
return self.name return self.name
class DetectOrgNotice(CommonBModel): class TestOrgNotice(CommonBModel):
name = models.CharField('公告标题',null=True, blank=True,max_length=500) name = models.CharField('公告标题',null=True, blank=True,max_length=500)
publishdate = models.DateTimeField('发布时间') publishdate = models.DateTimeField('发布时间')
@ -30,7 +30,7 @@ class DetectOrgNotice(CommonBModel):
note = models.CharField('公告内容',null=True, blank=True,max_length=6000) note = models.CharField('公告内容',null=True, blank=True,max_length=6000)
isalluser = models.BooleanField('是否通知全员', default=True) isalluser = models.BooleanField('是否通知全员', default=True)
path = models.CharField('文件地址', max_length=1000, null=True, blank=True) path = models.CharField('文件地址', max_length=1000, null=True, blank=True)
dettonotice = models.ManyToManyField(DetectOrg, blank=True, verbose_name='选择的实验室', related_name= 'detectorgnotice_dettonotice') dettonotice = models.ManyToManyField(TestOrg, blank=True, verbose_name='选择的实验室', related_name= 'testorgnotice_dettonotice')
class Meta: class Meta:
verbose_name = '实验室通知公告' verbose_name = '实验室通知公告'
verbose_name_plural = verbose_name verbose_name_plural = verbose_name

View File

@ -1,19 +1,19 @@
from rest_framework import serializers from rest_framework import serializers
from .models import DetectOrg,DetectOrgNotice from .models import TestOrg,TestOrgNotice
from apps.system.serializers import DictSerializer from apps.system.serializers import DictSerializer
class DetectOrgSerializer(serializers.ModelSerializer): class TestOrgSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = DetectOrg model = TestOrg
fields = '__all__' fields = '__all__'
class DetectOrgNoticeSerializer(serializers.ModelSerializer): class TestOrgNoticeSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = DetectOrgNotice model = TestOrgNotice
fields = '__all__' fields = '__all__'
class DetectOrgNoticListSerializer(serializers.ModelSerializer): class TestOrgNoticListSerializer(serializers.ModelSerializer):
dettonotice = DetectOrgSerializer(many=True) dettonotice = TestOrgSerializer(many=True)
class Meta: class Meta:
model = DetectOrgNotice model = TestOrgNotice
fields = ['id','name','publishdate','ismportant','note','dettonotice','path'] fields = ['id','name','publishdate','ismportant','note','dettonotice','path']

View File

@ -1,10 +1,10 @@
from django.urls import path, include from django.urls import path, include
from .views import DetectOrgViewSet,DetectOrgNoticeViewSet from .views import TestOrgViewSet,TestOrgNoticeViewSet
from rest_framework import routers from rest_framework import routers
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register('detectorg', DetectOrgViewSet, basename="detectorg") router.register('testorg', TestOrgViewSet, basename="TestOrg")
router.register('detectorgnotice', DetectOrgNoticeViewSet, basename="detectorgnotice") router.register('testnotice', TestOrgNoticeViewSet, basename="TestOrgnotice")
urlpatterns = [ urlpatterns = [
path('', include(router.urls)) path('', include(router.urls))

View File

@ -1,30 +1,30 @@
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 DetectOrg,DetectOrgNotice from .models import TestOrg,TestOrgNotice
from utils.queryset import get_child_queryset2 from utils.queryset import get_child_queryset2
from .serializers import DetectOrgSerializer,DetectOrgNoticeSerializer,DetectOrgNoticListSerializer from .serializers import TestOrgSerializer,TestOrgNoticeSerializer,TestOrgNoticListSerializer
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
# Create your views here. # Create your views here.
class DetectOrgViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet): class TestOrgViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
perms_map = {'get': '*', 'post': 'DetectOrg_create', perms_map = {'get': '*', 'post': 'TestOrg_create',
'put': 'DetectOrg_update', 'delete': 'DetectOrg_delete'} 'put': 'TestOrg_update', 'delete': 'TestOrg_delete'}
queryset = DetectOrg.objects queryset = TestOrg.objects
serializer_class = DetectOrgSerializer serializer_class = TestOrgSerializer
search_fields = ['name', 'code'] search_fields = ['name', 'code']
ordering = ['-create_time'] ordering = ['-create_time']
class DetectOrgNoticeViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet): class TestOrgNoticeViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
perms_map = {'get': '*', 'post': 'DetectOrgNotice_create', perms_map = {'get': '*', 'post': 'TestOrgNotice_create',
'put': 'DetectOrgNotice_update', 'delete': 'DetectOrgNotice_delete'} 'put': 'TestOrgNotice_update', 'delete': 'TestOrgNotice_delete'}
queryset = DetectOrgNotice.objects queryset = TestOrgNotice.objects
serializer_class = DetectOrgNoticeSerializer serializer_class = TestOrgNoticeSerializer
search_fields = ['name'] search_fields = ['name']
ordering = ['-create_time'] ordering = ['-create_time']
def get_serializer_class(self): def get_serializer_class(self):
# 根据请求类型动态变更serializer # 根据请求类型动态变更serializer
if self.action == 'list': if self.action == 'list':
return DetectOrgNoticListSerializer return TestOrgNoticListSerializer
return DetectOrgNoticeSerializer return TestOrgNoticeSerializer

View File

@ -0,0 +1,19 @@
# Generated by Django 3.0.5 on 2020-08-25 07:50
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('project', '0022_auto_20200821_1435'),
]
operations = [
migrations.AlterField(
model_name='evaluationdetail',
name='application',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='project.CertApp'),
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 3.0.5 on 2020-08-27 03:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('system', '0031_delete_bscodeset'),
('project', '0023_auto_20200825_1550'),
]
operations = [
migrations.AlterField(
model_name='certapp',
name='professional_code',
field=models.ManyToManyField(related_name='certapp_professional_code', to='system.Dict', verbose_name='专业代码'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.0.5 on 2020-08-28 01:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('project', '0024_auto_20200827_1132'),
]
operations = [
migrations.AddField(
model_name='evaluationdetail',
name='xmremark',
field=models.TextField(blank=True, verbose_name='项目需说明备注'),
),
]

View File

@ -0,0 +1,35 @@
# Generated by Django 3.0.5 on 2020-08-31 03:08
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('certset', '0019_auto_20200821_1755'),
('project', '0025_evaluationdetail_xmremark'),
]
operations = [
migrations.AlterField(
model_name='evaluationdetail',
name='item',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='certset.EvaluationItem', verbose_name='项目内容'),
),
migrations.AlterField(
model_name='evaluationdetail',
name='remark',
field=models.TextField(blank=True, null=True, verbose_name='备注'),
),
migrations.AlterField(
model_name='evaluationdetail',
name='result',
field=models.CharField(blank=True, choices=[('合格', '合格'), ('不合格', '不合格'), ('有条件放行', '有条件放行')], default='符合', max_length=50, null=True, verbose_name='评审结果'),
),
migrations.AlterField(
model_name='evaluationdetail',
name='xmremark',
field=models.TextField(blank=True, null=True, verbose_name='项目需说明备注'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.0.5 on 2020-08-31 03:30
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('project', '0026_auto_20200831_1108'),
]
operations = [
migrations.RenameField(
model_name='evaluationdetail',
old_name='application',
new_name='cert_APP',
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.0.5 on 2020-08-31 03:33
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('project', '0027_auto_20200831_1130'),
]
operations = [
migrations.RenameField(
model_name='evaluationdetail',
old_name='cert_APP',
new_name='cert_app',
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 3.0.5 on 2020-08-31 03:54
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('project', '0028_auto_20200831_1133'),
]
operations = [
migrations.AlterField(
model_name='evaluationdetail',
name='cert_app',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='evaluationdetail_cert_app', to='project.CertApp', verbose_name='关联受理'),
),
]

View File

@ -0,0 +1,26 @@
# Generated by Django 3.0.5 on 2020-08-31 08:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('project', '0029_auto_20200831_1154'),
]
operations = [
migrations.RemoveField(
model_name='evaluationdetail',
name='result',
),
migrations.RemoveField(
model_name='evaluationdetail',
name='xmremark',
),
migrations.AlterField(
model_name='evaluationdetail',
name='item',
field=models.TextField(blank=True, null=True, verbose_name='项目明'),
),
]

View File

@ -0,0 +1,35 @@
# Generated by Django 3.0.5 on 2020-09-01 07:25
import django.contrib.postgres.fields.jsonb
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('certset', '0020_evaluations_conform'),
('project', '0030_auto_20200831_1653'),
]
operations = [
migrations.AddField(
model_name='evaluationdetail',
name='item_v',
field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True, verbose_name='评审项目'),
),
migrations.RemoveField(
model_name='evaluationdetail',
name='cert_app',
),
migrations.AddField(
model_name='evaluationdetail',
name='cert_app',
field=models.ManyToManyField(related_name='evaluationdetail_cert_app', to='project.CertApp', verbose_name='关联受理'),
),
migrations.AlterField(
model_name='evaluationdetail',
name='item',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='evaluationdetail_item', to='certset.Evaluations', verbose_name='评审项'),
),
]

View File

@ -4,7 +4,7 @@ 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.certset.models import ImplementRule, UnitType, EvaluationItem from apps.certset.models import ImplementRule, UnitType, Evaluations
from apps.crm.models import Enterprise from apps.crm.models import Enterprise
from apps.system.models import CommonAModel, CommonBModel, Dict, User from apps.system.models import CommonAModel, CommonBModel, Dict, User
@ -73,7 +73,7 @@ class CertApp(CommonBModel):
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.DO_NOTHING)
professional_code = models.ManyToManyField(Dict, verbose_name='专业代码',null=True, blank=True, related_name='certapp_professional_code') professional_code = models.ManyToManyField(Dict, verbose_name='专业代码', related_name='certapp_professional_code')
certification = models.CharField('认证范围', max_length = 1000, null=True, blank=True) certification = models.CharField('认证范围', max_length = 1000, null=True, blank=True)
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)
class Meta: class Meta:
@ -156,19 +156,18 @@ class EvaluationDetail(CommonBModel):
('符合', '符合'), ('符合', '符合'),
('不符合', '不符合'), ('不符合', '不符合'),
('不适用', '不适用'), ('不适用', '不适用'),
('需说明', '需说明') ('需说明', '需说明'),
) )
application = models.ForeignKey(Application, on_delete=models.CASCADE) cert_app = models.ManyToManyField(CertApp, verbose_name='关联受理', related_name='evaluationdetail_cert_app')
item = models.ForeignKey(EvaluationItem, verbose_name='项目内容', on_delete=models.DO_NOTHING) item = models.ForeignKey(Evaluations,on_delete=models.DO_NOTHING,verbose_name='评审项',null=True, blank=True, related_name='evaluationdetail_item')
result = models.CharField('评审结果',choices = result_choices, default='符合', max_length=50) item_v = JSONField(verbose_name='评审项目',null=True, blank=True)
remark = models.TextField('备注', blank=True) remark = models.TextField('备注', null=True, blank=True)
class Meta: class Meta:
verbose_name = '评审记录详情' verbose_name = '评审记录详情'
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
def __str__(self): def __str__(self):
return self.application.number return self.name
class Unit(CommonBModel): class Unit(CommonBModel):
""" """
@ -188,3 +187,4 @@ class Unit(CommonBModel):
def __str__(self): def __str__(self):
return self.name return self.name

View File

@ -43,4 +43,9 @@ class CertappSerializer(serializers.ModelSerializer):
create_by_ = UserListSerializer(source='create_by', read_only=True) create_by_ = UserListSerializer(source='create_by', read_only=True)
class Meta: class Meta:
model = CertApp model = CertApp
fields = '__all__' fields = '__all__'
class EvaluationDetailSerializer(serializers.ModelSerializer):
class Meta:
model = EvaluationDetail
fields = '__all__'

View File

@ -6,6 +6,8 @@ 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")
urlpatterns = [ urlpatterns = [
path('', include(router.urls)) path('', include(router.urls))
] ]

View File

@ -79,4 +79,20 @@ class CertappViewset(CreateUpdateCustomMixin, ModelViewSet):
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
self.perform_create(serializer) self.perform_create(serializer)
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)
class EvaluationDetailViewset(CreateUpdateCustomMixin, ModelViewSet):
"""
受理信息
"""
perms_map = {'get': '*', 'post': 'EvaluationDetail_create',
'put': 'EvaluationDetail_update', 'delete': 'EvaluationDetail_delete'}
queryset = EvaluationDetail.objects
serializer_class = EvaluationDetailSerializer
filterset_fields = ['cert_app']
ordering = ['-create_time']
def paginate_queryset(self, queryset):
if ((not self.request.query_params.get('page', None)) and (self.request.query_params.get('cert_app', None))) or (self.paginator is None):
return None
return self.paginator.paginate_queryset(queryset, self.request, view=self)

View File

@ -49,6 +49,7 @@ INSTALLED_APPS = [
'apps.certset', 'apps.certset',
'apps.employee', 'apps.employee',
'apps.project', 'apps.project',
'apps.financial',
'apps.laboratory' 'apps.laboratory'
] ]

View File

@ -36,6 +36,7 @@ urlpatterns = [
path('crm/', include('apps.crm.urls')), path('crm/', include('apps.crm.urls')),
path('employee/', include('apps.employee.urls')), path('employee/', include('apps.employee.urls')),
path('project/', include('apps.project.urls')), path('project/', include('apps.project.urls')),
path('financial/', include('apps.financial.urls')),
path('laboratory/', include('apps.laboratory.urls')), path('laboratory/', include('apps.laboratory.urls')),
path('docs/', include_docs_urls(title="接口文档", path('docs/', include_docs_urls(title="接口文档",
authentication_classes=[], permission_classes=[])), authentication_classes=[], permission_classes=[])),