fix conflict

This commit is contained in:
caoqianming 2020-09-15 15:34:46 +08:00
commit a95dcdc77c
65 changed files with 2341 additions and 274 deletions

View File

@ -7,6 +7,14 @@
.el-table--medium td,   .el-table--medium th {
padding: 5px 0;
}
.el-form-item {
margin-bottom: 10px;
}
</style> </style>
<script> <script>
export default { export default {

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

@ -0,0 +1,69 @@
import request from '@/utils/request'
export function getBillList(query) {
return request({
url: '/financial/bill/',
method: 'get',
params: query
})
}
export function getBill(id) {
return request({
url: `/financial/bill/${id}/`,
method: 'get'
})
}
export function createBill(data) {
return request({
url: '/financial/bill/',
method: 'post',
data
})
}
export function updateBill(id, data) {
return request({
url: `/financial/bill/${id}/`,
method: 'put',
data
})
}
export function deleteBill(id) {
return request({
url: `/financial/bill/${id}/`,
method: 'delete'
})
}
export function getChargeitemList(query) {
return request({
url: '/financial/chargeitem/',
method: 'get',
params: query
})
}
export function createChargeitem(data) {
return request({
url: '/financial/chargeitem/',
method: 'post',
data
})
}
export function updateChargeitem(id, data) {
return request({
url: `/financial/chargeitem/${id}/`,
method: 'put',
data
})
}
export function deleteChargeitem(id) {
return request({
url: `/financial/chargeitem/${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

@ -192,29 +192,7 @@ export const asyncRoutes = [
}, },
] ]
}, },
{
path: '/detectorg',
component: Layout,
redirect: '/detectorg/detectorg',
name: 'detectorg',
meta: { title: '产品检测', icon: 'example' },
children: [
{
path: 'detectorg',
name: 'DetectOrg',
component: () => import('@/views/detectorg/detectorg'),
meta: { title: '实验室信息', icon: 'example', perms: ['detectorg_manage'] }
},
{
path: 'detectorgnotice',
name: 'DetectOrgNotice',
component: () => import('@/views/detectorg/detectorgnotice'),
meta: { title: '实验室通知公告', icon: 'example', perms: ['detectorg_manage'] }
},
]
},
{ {
path: '/accessment', path: '/accessment',
component: Layout, component: Layout,
@ -292,42 +270,7 @@ export const asyncRoutes = [
}, },
] ]
}, },
{
path: '/crm',
component: Layout,
redirect: '/crm/enterprise',
name: 'crm',
meta: { title: '客户企业', icon: 'example' },
children: [
{
path: 'enterprise',
name: 'Enterprise',
component: () => import('@/views/enterprise/enterprise'),
meta: { title: '组织信息', icon: 'example', perms: ['enterprise_manage'] }
},
{
path: 'enterprise2',
name: 'Enterprise2',
component: () => import('@/views/enterprise/enterprise'),
meta: { title: '组织信息2', icon: 'example', perms: ['enterprise_manage'] }
},
{
path: 'enterprise/create',
name: 'EnterpriseCreate',
component: () => import('@/views/enterprise/enterprisecreate.vue'),
meta: { title: '新增组织信息', noCache: true, icon: '', perms: ['enterprise_create']},
hidden: true
},
{
path: 'enterprise/update',
name: 'EnterpriseUpdate',
component: () => import('@/views/enterprise/enterpriseupdate.vue'),
meta: { title: '修改组织信息', noCache: true, icon: '', perms: ['enterprise_update'] },
hidden: true
},
]
},
{ {
path: '/certset', path: '/certset',
component: Layout, component: Layout,
@ -384,6 +327,67 @@ export const asyncRoutes = [
] ]
}, },
{ {
path: '/crm',
component: Layout,
redirect: '/crm/enterprise',
name: 'crm',
meta: { title: '客户企业', icon: 'example' },
children: [
{
path: 'enterprise',
name: 'Enterprise',
component: () => import('@/views/enterprise/enterprise'),
meta: { title: '组织信息', icon: 'example', perms: ['enterprise_manage'] }
},
{
path: 'enterprise2',
name: 'Enterprise2',
component: () => import('@/views/enterprise/enterprise'),
meta: { title: '组织信息2', icon: 'example', perms: ['enterprise_manage'] }
},
{
path: 'enterprise/create',
name: 'EnterpriseCreate',
component: () => import('@/views/enterprise/enterprisecreate.vue'),
meta: { title: '新增组织信息', noCache: true, icon: '', perms: ['enterprise_create']},
hidden: true
},
{
path: 'enterprise/update',
name: 'EnterpriseUpdate',
component: () => import('@/views/enterprise/enterpriseupdate.vue'),
meta: { title: '修改组织信息', noCache: true, icon: '', perms: ['enterprise_update'] },
hidden: true
},
]
},
{
path: '/testorg',
component: Layout,
redirect: '/testorg/testorg',
name: 'testorg',
meta: { title: '产品检测', icon: 'example' },
children: [
{
path: 'testorg',
name: 'TestOrg',
component: () => import('@/views/testorg/testorg'),
meta: { title: '实验室信息', icon: 'example', perms: ['testorg_manage'] }
},
{
path: 'testorgnotice',
name: 'TextOrgNotice',
component: () => import('@/views/testorg/testorgnotice'),
meta: { title: '实验室通知公告', icon: 'example', perms: ['testorg_manage'] }
},
]
},
{
path: '/system', path: '/system',
component: Layout, component: Layout,
redirect: '/system/user', redirect: '/system/user',

View File

@ -371,8 +371,10 @@ export default {
}, },
created() { created() {
if(this.certapp!=null){ if(this.certapp!=null){
this.formData = this.certapp this.formData = this.certapp
} }
this.getCCCOptions(); this.getCCCOptions();

View File

@ -0,0 +1,84 @@
<template>
<div class="app-container">
<el-tabs type="border-card">
<el-tab-pane label="申请信息" style="overflow-y:auto;overflow-x:hidden;">
<CCCform :action="action" @handleCommit="save" :certapp="certapp" v-if="kind=='CCC'&isLoad"></CCCform>
<QMSform :action="action" @handleCommit="save" :certapp="certapp" v-if="kind=='QMS'&isLoad"></QMSform>
</el-tab-pane>
<el-tab-pane label="产品单元" v-if="certapp">
<Productunit :certapp="certapp"></Productunit>
</el-tab-pane>
<el-tab-pane label="原材料供应商" v-if="certapp">
</el-tab-pane>
<el-tab-pane label="检测设备" v-if="certapp">
</el-tab-pane>
<el-tab-pane label="资料评审" v-if="certapp">
<REVIEW :certapp="certapp"></REVIEW>
</el-tab-pane>
<el-tab-pane label="收费信息" v-if="certapp">
<CHARGE :certapp="certapp"></CHARGE>
<!--<el-button type="primary"
@click="handleComplete()">完成受理</el-button>-->
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import CCCform from "@/views/certapp/cccform"
import REVIEW from "@/views/certapp/review"
import CHARGE from "@/views/certapp/charge"
import Productunit from "@/views/certapp/productunit"
import { getCertapp, completeCertapp } from "@/api/certapp"
import router from '@/router';
import QMSform from "@/views/certapp/qmsform"
export default {
components: { CCCform, Productunit, QMSform,REVIEW,CHARGE},
props: [],
data() {
return {
action:'create',
certapp:null,
kind:'CCC',
isLoad:false
};
},
computed: {},
watch: {
// "formData.cert_field": "changeRules"
},
created() {
this.getParams()
},
mounted() {},
methods: {
getParams(){
var action = this.$route.params.action
var kind = this.$route.params.kind
this.action = action
this.kind = kind
if(action=='update'){
getCertapp(this.$route.query.id).then(res=>{
this.certapp = res.data
this.isLoad = true
})
}else{
this.isLoad = true
}
},
save(val){
this.certapp=val
},
handleComplete(){
completeCertapp(this.certapp.id).then(res=>{
this.$message.success('成功')
this.$router.go(-1)
})
}
}
};
</script>

View File

@ -31,10 +31,9 @@
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="收费信息" name="Productunit4" v-if="certapp" lazy> <el-tab-pane label="收费信息" name="Productunit4" v-if="certapp" lazy>
<el-button
type="primary" <CHARGE :certapp="certapp"></CHARGE>
@click="handleComplete()"
>完成受理</el-button>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="审核成员" name="Certappmember" v-if="certapp" lazy> <el-tab-pane label="审核成员" name="Certappmember" v-if="certapp" lazy>
<Member :certapp="certapp" ></Member> <Member :certapp="certapp" ></Member>
@ -69,7 +68,8 @@
</template> </template>
<script> <script>
import CCCform from "@/views/certapp/cccform" import CCCform from "@/views/certapp/cccform"
import Productunit from "@/views/certapp/productunit" import Productunit from "@/views/certapp/productunit"
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';
import QMSform from "@/views/certapp/qmsform" import QMSform from "@/views/certapp/qmsform"
@ -77,7 +77,7 @@ import Conclusion from "@/views/audit/conclusion"
import Member from "@/views/audit/member" import Member from "@/views/audit/member"
import access from "@/views/accessment/access" import access from "@/views/accessment/access"
export default { export default {
components: { CCCform, Productunit, QMSform, Conclusion, Member, access}, components: { CCCform, Productunit, QMSform, Conclusion, Member, access, CHARGE},
props: [], props: [],
data() { data() {
return { return {

View File

@ -0,0 +1,343 @@
<template>
<div>
<div class="tableDate">
<div class="button" style="width:6%;float:right;">
<P><el-button class="el-icon-plus" @click.prevent="addRow()"></el-button></P>
<p><el-button class="el-icon-minus" @click.prevent="delData()"></el-button></p>
</div>
<div class="table">
<el-table :data="tableData"
ref="table"
tooltip-effect="dark"
border
stripe
style="width: 93%"
@selection-change='selectRow'>
<el-table-column type="selection" width="45" align="center"></el-table-column>
<el-table-column label="序号" type="index" width="60" align="center"></el-table-column>
<el-table-column label="收费项目" align="center">
<template slot-scope="scope">
<el-input v-model="scope.row.itemkind"></el-input>
</template>
</el-table-column>
<el-table-column label="单元数量" align="center">
<template slot-scope="scope">
<el-input v-model="scope.row.unitcount"></el-input>
</template>
</el-table-column>
<el-table-column label="单价" align="center">
<template slot-scope="scope">
<el-input v-model="scope.row.perfee"></el-input>
</template>
</el-table-column>
<el-table-column label="小计" align="center">
<template slot-scope="scope">
{{ (scope.row.pertotal = scope.row.unitcount *scope.row.perfee) | keepTwoNum}}
</template>
</el-table-column>
</el-table>
</div>
</div>
<div style="padding-top:20px">
<el-form ref="elForm" :model="formData" size="medium" label-width="100px">
<el-row :gutter="24">
<el-row>
<el-col :xs="24" :md="11" font="left">
<el-form-item label="收费单号" prop="feecode">
<el-input placeholder="请输入收费单号" v-model="formData.feecode"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="11" font="left">
<el-form-item label="费用性质" prop="feecharacter">
<el-select filterable v-model="formData.feecharacter"
placeholder="请输入费用性质"
clearable
:style="{width: '100%'}">
<el-option v-for="(item, index) in feeOptions"
:key="index"
:label="item.name"
:value="item.value"
:disabled="item.disabled">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :xs="24" :md="11" font="left">
<el-form-item label="总计" prop="totalfee">
<el-input placeholder="请输入总计"
v-model="formData.totalfee"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="11" font="left">
<el-form-item label="扣减额" prop="deductions">
<el-input placeholder="请输入扣减额"
v-model="formData.deductions"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :xs="24" :md="11" font="left">
<el-form-item label="外汇类型" prop="exchangetype">
<el-select v-model="formData.exchangetype"
placeholder="请选择外汇类型"
filterable
allow-create
:style="{width: '100%'}">
<el-option v-for="(item, index) in exchangetypeOptions"
:key="index"
:label="item.label"
:value="item.value"
:disabled="item.disabled"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :md="11" font="left">
<el-form-item label="外币汇率" prop="exchangerate">
<el-input placeholder="请输入外币汇率"
v-model="formData.exchangerate"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :xs="24" :md="11" font="left">
<el-form-item label="实收人名币" prop="paidrmb">
<el-input placeholder="请输入金额"
v-model="formData.paidrmb"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="11" font="left">
<el-form-item label="实收外币" prop="paidwb">
<el-input placeholder="请输入金额"
v-model="formData.paidwb"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :xs="24" :md="22" font="left">
<el-form-item label="备注" prop="remark">
<el-input type="textarea" :rows="2" v-model="formData.remark"
clearable
:style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col font="right">
<el-button style="float: right;" type="primary" @click="submitForm">保存</el-button>
</el-col>
</el-row>
</el-row>
</el-form>
</div>
</div>
</template>
<script>
import { getChargeitemList,getBillList,getBill,createChargeitem,createBill,updateChargeitem} from "@/api/finanacial";
import { getDictList } from "@/api/dict";
import { genTree } from "@/utils";
import checkPermission from '@/utils/permission'
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
inheritAttrs: false,
components: { Treeselect },
props: ["certapp"],
data() {
return {
tableData: [],
selectlistRow: [],
rowNum:1,
formData: {
number:this.certapp,
totalfee: null,
deductions:null,
exchangetype: "人名币-RMB-¥",
exchangerate: null,
paidrmb: null,
paidwb: null,
remark: null,
feecode:null
},
feeOptions:[],
listLoading: true,
dialogVisible:false,
dialogType: 'create',
exchangetypeOptions: [
{
label: "人民币-RMB-¥",
value: "人民币-RMB-¥",
},
{
label: "欧元-EURO-€",
value: "欧元-EURO-€",
},
{
label: "美元-USD—$",
value: "美元-USD—$",
},
],
dgVisiable: false,
};
},
computed: {},
watch: {
},
created() {
this.getDiclist();
if(this.certapp!=null){
this.getChareList();
}
},
mounted() {},
methods: {
checkPermission,
// 获取表格选中时的数据
selectRow (val) {
this.selectlistRow = val
console.log(this.selectlistRow)
},
// 增加行
addRow () {
var list = {
rowNum:this.rowNum,
itemkind:'',
unitcount: '',
perfee: '',
pertotal:''
};
this.tableData.unshift(list)
this.rowNum += 1;
},
// 删除方法
// 删除选中行
delData () {
for (let i = 0; i < this.selectlistRow.length; i++) {
let val = this.selectlistRow
val.forEach((val, index) => {
this.tableData.forEach((v, i) => {
if (val.rowNum === v.rowNum) {
// i 为选中的索引
this.tableData.splice(i, 1)
}
})
})
}
// 删除完数据之后清除勾选框
this.$refs.table.clearSelection()
}
,
getChareList() {
getBillList({ number:this.certapp }).then((response) => {
this.listLoading = true;
if (response.data.length) {
this.formData = response.data[0];
getChargeitemList({ bills:response.data[0].feecode }).then((response) => {
if (response.data) {
this.tableData = response.data;
}
});
}
this.listLoading = false;
});
},
//费用性质
getDiclist() {
getDictList({ type__code: "cost_nature" }).then(response => {
this.feeOptions = genTree(response.data);
});
}
,
submitForm() {
let val = this.selectlistRow
this.$refs["elForm"].validate(valid => {
if (!valid) return;
// TODO 提交表单
createBill(this.formData).then(response => {
this.$message({
type: 'success',
message: '成功!'
})
for (var i=0; i < val.length; i++) {
this.chargeIetm = val[i]
this.chargeIetm.bills = this.formData.feecode;
createChargeitem(this.chargeIetm).then(response => {
this.$message({
type: 'success',
message: '成功!'
})
})
}
});
});
},
}
};
</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

@ -224,8 +224,11 @@ export default {
getList() { getList() {
this.listLoading = true; this.listLoading = true;
getUnitList(this.listQuery).then((response) => { getUnitList(this.listQuery).then((response) => {
if (response.data) { if (response.data) {
this.tableData = response.data; this.tableData = response.data;
} }
this.listLoading = false; this.listLoading = false;
}); });

View File

@ -328,12 +328,12 @@ export default {
}, },
created() { created() {
if(this.action!='create'){ if(this.certapp!=null){
this.formData.id = this.certapp this.formData = this.certapp
this.getCertapp_()
} }
this.getTypeOptions(); this.getTypeOptions();
this.getProfOptions() this.getProfOptions();
}, },
mounted() {}, mounted() {},
methods: { methods: {
@ -347,16 +347,12 @@ 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);
}); });
}, },
getCertapp_(){
getCertapp(this.formData.id).then(res=>{
this.formData = res.data
})
},
handelConfirm() { handelConfirm() {
this.$refs["elForm"].validate((valid) => { this.$refs["elForm"].validate((valid) => {
if (!valid) return; if (!valid) return;
@ -368,7 +364,7 @@ export default {
}else{ }else{
createCertapp(this.formData).then((res) => { createCertapp(this.formData).then((res) => {
this.$message.success('成功') this.$message.success('成功')
this.$emit("handleCommit", res.data); this.$router.replace({name:"Certappupdate", params:{id:res.data.id}})
}); });
} }

View File

@ -0,0 +1,153 @@
<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"
ref="multipleTable"
:data="eltList"
style="width: 100%;margin-top:10px;"
border
fit
highlight-current-row
@selection-change='selectRow'
max-height="600">
<el-table-column type="selection" label="选择" align="center" width="55"></el-table-column>
<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[scope.$index]" @change="changeHandler">
<el-radio :label="item.id" :key="item.id" v-for="item in scope.row.options ">{{item.name}}</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="dialogFormAdd">保存</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";
import { options } from "runjs";
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: [],
review_options:[
{
id : "1",
name : "符合"
},
{
id : "2",
name : "不符合"
}
,
{
id : "3",
name : "不适用"
}
,
{
id : "4",
name : "需说明"
}
],
eltList: [],
dgType: 0,
dgVisiable: false,
};
},
computed: {},
watch: {
},
created() {
this.getList()
},
mounted() {},
methods: {
getList() {
getEvaluationsList().then(response => {
this.eltList = response.data.results
for (var i = 0; i < this.eltList.length; i++) {
this.eltList[i].options = this.review_options;
}
});
},
// 获取表格选中时的数据
selectRow (val) {
this.selectlistRow = val
},
changeHandler(value) {
this.radioresult = value;
}
,
handleSelectionChange(val) {
this.multipleTable = val; // this.multipleTable 选中的值
console.log(val);
},
dialogFormAdd() {
//for (var i = 0; i < this.multipleTable.length; i++) {
// var halo = this.multipleTable[i];
// console.log(halo);
//}
console.log(this.selectlistRow);
},
handelConfirm() {
let val = this.selectlistRow
console.log(this.selectlistRow);
},
}
};
</script>
<style>
</style>

View File

@ -494,7 +494,7 @@
}, },
getECtype() { getECtype() {
getDictList({ type__code: "economy_type" }).then(response => { getDictList({ type__code: "economy_type" }).then(response => {
this. economy_typeOptions = genTree(response.data); this.economy_typeOptions = genTree(response.data);
}); });
}, },

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

@ -0,0 +1,17 @@
# Generated by Django 3.0.5 on 2020-09-03 08:58
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('certset', '0020_evaluations_conform'),
]
operations = [
migrations.RemoveField(
model_name='evaluations',
name='conform',
),
]

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

View File

@ -65,9 +65,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

@ -4,18 +4,13 @@ from .models import Enterprise,EnterpriseAddress
from apps.system.serializers import DictSerializer from apps.system.serializers import DictSerializer
class EnterpriseSerializer(serializers.ModelSerializer):
class EnterpriseAddressSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = EnterpriseAddress model = Enterprise
fields = '__all__' fields = '__all__'
class EnterpriseListSerializer(serializers.ModelSerializer): class EnterpriseListSerializer(serializers.ModelSerializer):
type = DictSerializer() type = DictSerializer()
economy_class = DictSerializer() economy_class = DictSerializer()
class Meta: class Meta:
model = Enterprise model = Enterprise
fields = ['id','query_code', 'code', 'name','ename','type','legal','build_time','person_count','ceramics_output','gassets','linkman1_name','linkman1_tel','linkman1_mobile','country_code','parent','credit_code','professional','all_person','economy_class','economy_type','linkman1_duty','business_type'] fields = ['id','query_code', 'code', 'name','ename','type','legal','build_time','person_count','ceramics_output','gassets','linkman1_name','linkman1_tel','linkman1_mobile','country_code','parent','credit_code','professional','all_person','economy_class','economy_type','linkman1_duty','business_type']
@ -23,16 +18,14 @@ class EnterpriseListSerializer(serializers.ModelSerializer):
def setup_eager_loading(queryset): def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """ """ Perform necessary eager loading of data. """
queryset = queryset.select_related('type','economy_class') queryset = queryset.select_related('type','economy_class')
queryset = queryset.prefetch_related('enterpriseaddress_enterprise',)
return queryset return queryset
class EnterpriseSerializer(serializers.ModelSerializer): def get_cert_type(self, obj):
address_ = EnterpriseAddressSerializer(source='enterpriseaddress_enterprise', many=True) return obj.get_cert_type_display()
class EnterpriseAddressSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Enterprise model = EnterpriseAddress
fields = '__all__' fields = '__all__'
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
# queryset = queryset.select_related('type','economy_class')
queryset = queryset.prefetch_related('enterpriseaddress_enterprise',)
return queryset

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,49 @@
# Generated by Django 3.0.5 on 2020-09-03 08:58
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),
('system', '0031_delete_bscodeset'),
('financial', '0001_initial'),
]
operations = [
migrations.AlterModelOptions(
name='bill',
options={'verbose_name': '收费信息', 'verbose_name_plural': '收费信息'},
),
migrations.RemoveField(
model_name='bill',
name='applicant',
),
migrations.CreateModel(
name='Chargeitem',
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='删除标记')),
('itemkind', models.CharField(max_length=300, verbose_name='收费项目')),
('eitemkind', models.CharField(max_length=300, verbose_name='收费英文项目')),
('unitcount', models.FloatField(blank=True, default=0, null=True, verbose_name='单元数量')),
('perfee', models.FloatField(blank=True, default=0, null=True, verbose_name='单价')),
('pertotal', models.FloatField(blank=True, default=0, null=True, verbose_name='小计')),
('remark', models.CharField(max_length=300, verbose_name='备注')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='chargeitem_belong_dept', to='system.Organization', verbose_name='所属部门')),
('bills', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='chargeitem_bill', to='financial.Bill')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='chargeitem_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='chargeitem_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'verbose_name': '收费项目',
'verbose_name_plural': '收费项目',
},
),
]

View File

@ -0,0 +1,24 @@
# Generated by Django 3.0.5 on 2020-09-07 01:56
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('financial', '0002_auto_20200903_1658'),
]
operations = [
migrations.AlterField(
model_name='bill',
name='feecode',
field=models.CharField(max_length=300, unique=True, verbose_name='收费单号'),
),
migrations.AlterField(
model_name='chargeitem',
name='bills',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='chargeitem_bill', to='financial.Bill', to_field='feecode'),
),
]

View File

@ -0,0 +1,34 @@
# Generated by Django 3.0.5 on 2020-09-07 07:51
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('financial', '0003_auto_20200907_0956'),
]
operations = [
migrations.AlterField(
model_name='chargeitem',
name='bills',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='chargeitem_bill', to='financial.Bill', to_field='feecode'),
),
migrations.AlterField(
model_name='chargeitem',
name='eitemkind',
field=models.CharField(blank=True, max_length=300, null=True, verbose_name='收费英文项目'),
),
migrations.AlterField(
model_name='chargeitem',
name='itemkind',
field=models.CharField(blank=True, max_length=300, null=True, verbose_name='收费项目'),
),
migrations.AlterField(
model_name='chargeitem',
name='remark',
field=models.CharField(blank=True, max_length=300, null=True, verbose_name='备注'),
),
]

View File

@ -0,0 +1,17 @@
# Generated by Django 3.0.5 on 2020-09-07 07:55
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('financial', '0004_auto_20200907_1551'),
]
operations = [
migrations.RemoveField(
model_name='chargeitem',
name='eitemkind',
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 3.0.5 on 2020-09-08 03:43
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('financial', '0005_remove_chargeitem_eitemkind'),
]
operations = [
migrations.AlterField(
model_name='chargeitem',
name='bills',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='chargeitem_bill', to='financial.Bill'),
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 3.0.5 on 2020-09-08 03:46
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('financial', '0006_auto_20200908_1143'),
]
operations = [
migrations.AlterField(
model_name='chargeitem',
name='bills',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='chargeitem_bill', to='financial.Bill', to_field='feecode'),
),
]

View File

@ -0,0 +1,43 @@
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('收费单号',unique=True, 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)
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)
class Meta:
verbose_name = '收费信息'
verbose_name_plural = verbose_name
def __str__(self):
return self.feecode
class Chargeitem(CommonBModel):
"""
收费项目
"""
bills = models.ForeignKey(Bill, related_name='chargeitem_bill',to_field='feecode',null=True, blank=True, on_delete=models.DO_NOTHING)
itemkind = models.CharField('收费项目',null=True, blank=True, max_length=300)
unitcount = models.FloatField('单元数量',null=True, blank=True, default=0)
perfee = models.FloatField('单价',null=True, blank=True, default=0)
pertotal = models.FloatField('小计',null=True, blank=True, default=0)
remark = models.CharField('备注',null=True, blank=True, max_length=300)
class Meta:
verbose_name = '收费项目'
verbose_name_plural = verbose_name
def __str__(self):
return self.itemkind

View File

@ -0,0 +1,24 @@
from rest_framework import serializers
from .models import Bill,Chargeitem
class BillSerializer(serializers.ModelSerializer):
class Meta:
model = Bill
fields = '__all__'
class ChargeitemSerializer(serializers.ModelSerializer):
class Meta:
model = Chargeitem
fields = '__all__'
class BillsSerializer(serializers.ModelSerializer):
number_=ChargeitemSerializer(source='chargeitem_number')
class Meta:
model = Bill
fields = '__all__'
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
# queryset = queryset.select_related('type','economy_class')
queryset = queryset.prefetch_related('chargeitem_bill',)
return queryset

View File

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

View File

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

View File

@ -0,0 +1,37 @@
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from .models import Bill,Chargeitem
from utils.queryset import get_child_queryset2
from .serializers import BillSerializer,ChargeitemSerializer
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 = ['feecode']
ordering = ['-create_time']
filterset_fields = ['number']
ordering = ['-create_time']
def paginate_queryset(self, queryset):
if ((not self.request.query_params.get('page', None)) and (self.request.query_params.get('number', None))) or (self.paginator is None):
return None
return self.paginator.paginate_queryset(queryset, self.request, view=self)
class ChargeitemViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
perms_map = {'get': '*', 'post': 'chargeitem_create',
'put': 'chargeitem_update', 'delete': 'chargeitem_delete'}
queryset = Chargeitem.objects
serializer_class = ChargeitemSerializer
search_fields = ['itemkind']
filterset_fields = ['bills']
ordering = ['-create_time']
def paginate_queryset(self, queryset):
if ((not self.request.query_params.get('page', None)) and (self.request.query_params.get('bills', None))) or (self.paginator is None):
return None
return self.paginator.paginate_queryset(queryset, self.request, view=self)

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

@ -0,0 +1,14 @@
# Generated by Django 3.0.5 on 2020-09-03 03:42
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('project', '0031_auto_20200901_1525'),
('project', '0027_auto_20200825_1636'),
]
operations = [
]

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, Standard from apps.certset.models import ImplementRule, UnitType, Evaluations, Standard
from apps.crm.models import Enterprise from apps.crm.models import Enterprise
from apps.system.models import CommonAModel, CommonBModel, Dict, User from apps.system.models import CommonAModel, CommonBModel, Dict, User
# from apps.plan.models import Plan # from apps.plan.models import Plan
@ -96,7 +96,6 @@ class CertApp(CommonBModel):
factory = models.ForeignKey(Enterprise, on_delete=models.CASCADE, related_name='certapp_factory', null=True, blank=True) factory = models.ForeignKey(Enterprise, on_delete=models.CASCADE, related_name='certapp_factory', null=True, blank=True)
factory_v = JSONField(verbose_name='生产厂', null=True) factory_v = JSONField(verbose_name='生产厂', null=True)
scope = models.TextField('认证范围', null=True, blank=True) scope = models.TextField('认证范围', null=True, blank=True)
system_people = models.FloatField('体系相关员工数',null=True, blank=True, default=0) system_people = models.FloatField('体系相关员工数',null=True, blank=True, default=0)
initial_people = models.FloatField('初始人日数',null=True, blank=True, default=0) initial_people = models.FloatField('初始人日数',null=True, blank=True, default=0)
supervision_people = models.FloatField('监督人日数',null=True, blank=True, default=0) supervision_people = models.FloatField('监督人日数',null=True, blank=True, default=0)
@ -105,7 +104,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:
@ -188,19 +187,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):
""" """
@ -220,6 +218,7 @@ class Unit(CommonBModel):
def __str__(self): def __str__(self):
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

View File

@ -47,6 +47,13 @@ class CertappSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = CertApp model = CertApp
fields = '__all__' fields = '__all__'
class EvaluationDetailSerializer(serializers.ModelSerializer):
class Meta:
model = EvaluationDetail
fields = '__all__'
@staticmethod @staticmethod
def setup_eager_loading(queryset): def setup_eager_loading(queryset):
@ -88,4 +95,4 @@ class ProjectUpdateSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Project model = Project
fields = ['remark', 'can_paichai'] fields = ['remark', 'can_paichai']

View File

@ -6,8 +6,12 @@ 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('unit', UnitViewSet, basename="unit") router.register('unit', UnitViewSet, basename="unit")
router.register('project', ProjectViewSet, basename="project") router.register('project', ProjectViewSet, basename="project")
urlpatterns = [ urlpatterns = [
path('', include(router.urls)) path('', include(router.urls))
] ]

View File

@ -89,6 +89,24 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
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)
@action(methods=['put'], detail=True, perms_map={'put':'complete_certapp'}, @action(methods=['put'], detail=True, perms_map={'put':'complete_certapp'},
url_name='complete_certapp') url_name='complete_certapp')
def complete(self, request, pk=None): def complete(self, request, pk=None):
@ -185,4 +203,4 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet):
obj.edate0 = request.data['edate0'] obj.edate0 = request.data['edate0']
obj.edate1 = request.data['edate1'] obj.edate1 = request.data['edate1']
obj.save() obj.save()
return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)

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',
'apps.plan', 'apps.plan',
'apps.audit' 'apps.audit'

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('plan/', include('apps.plan.urls')), path('plan/', include('apps.plan.urls')),
path('audit/', include('apps.audit.urls')), path('audit/', include('apps.audit.urls')),
path('laboratory/', include('apps.laboratory.urls')), path('laboratory/', include('apps.laboratory.urls')),