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>
<script>
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'
export function getDetectOrgList(query) {
export function getTestOrgList(query) {
return request({
url: '/laboratory/detectorg/',
url: '/laboratory/testorg/',
method: 'get',
params: query
})
}
export function getDetectOrg(id) {
export function getTestOrg(id) {
return request({
url: `/laboratory/detectorg/${id}/`,
url: `/laboratory/testorg/${id}/`,
method: 'get'
})
}
export function createDetectOrg(data) {
export function createTestOrg(data) {
return request({
url: '/laboratory/detectorg/',
url: '/laboratory/testorg/',
method: 'post',
data
})
}
export function updateDetectOrg(id, data) {
export function updateTestOrg(id, data) {
return request({
url: `/laboratory/detectorg/${id}/`,
url: `/laboratory/testorg/${id}/`,
method: 'put',
data
})
}
export function deleteDetectOrg(id) {
export function deleteTestOrg(id) {
return request({
url: `/laboratory/detectorg/${id}/`,
url: `/laboratory/testorg/${id}/`,
method: 'delete'
})
}
export function getDetectOrgNoticeList(query) {
export function getTestOrgNoticeList(query) {
return request({
url: '/laboratory/detectorgnotice/',
url: '/laboratory/testnotice/',
method: 'get',
params: query
})
}
export function getDetectOrgNotice(id) {
export function getTestOrgNotice(id) {
return request({
url: `/laboratory/detectorgnotice/${id}/`,
url: `/laboratory/testnotice/${id}/`,
method: 'get'
})
}
export function createDetectOrgNotice(data) {
export function createTestOrgNotice(data) {
return request({
url: '/laboratory/detectorgnotice/',
url: '/laboratory/testnotice/',
method: 'post',
data
})
}
export function updateDetectOrgNotice(id, data) {
export function updateTestOrgNotice(id, data) {
return request({
url: `/laboratory/detectorgnotice/${id}/`,
url: `/laboratory/testnotice/${id}/`,
method: 'put',
data
})
}
export function deleteDetectOrgNotice(id) {
export function deleteTestOrgNotice(id) {
return request({
url: `/laboratory/detectorgnotice/${id}/`,
url: `/laboratory/testnotice/${id}/`,
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',
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',
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',
component: Layout,
redirect: '/system/user',

View File

@ -371,8 +371,10 @@ export default {
},
created() {
if(this.certapp!=null){
this.formData = this.certapp
}
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 label="收费信息" name="Productunit4" v-if="certapp" lazy>
<el-button
type="primary"
@click="handleComplete()"
>完成受理</el-button>
<CHARGE :certapp="certapp"></CHARGE>
</el-tab-pane>
<el-tab-pane label="审核成员" name="Certappmember" v-if="certapp" lazy>
<Member :certapp="certapp" ></Member>
@ -69,7 +68,8 @@
</template>
<script>
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 router from '@/router';
import QMSform from "@/views/certapp/qmsform"
@ -77,7 +77,7 @@ import Conclusion from "@/views/audit/conclusion"
import Member from "@/views/audit/member"
import access from "@/views/accessment/access"
export default {
components: { CCCform, Productunit, QMSform, Conclusion, Member, access},
components: { CCCform, Productunit, QMSform, Conclusion, Member, access, CHARGE},
props: [],
data() {
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() {
this.listLoading = true;
getUnitList(this.listQuery).then((response) => {
if (response.data) {
this.tableData = response.data;
}
this.listLoading = false;
});

View File

@ -328,12 +328,12 @@ export default {
},
created() {
if(this.action!='create'){
this.formData.id = this.certapp
this.getCertapp_()
if(this.certapp!=null){
this.formData = this.certapp
}
this.getTypeOptions();
this.getProfOptions()
this.getProfOptions();
},
mounted() {},
methods: {
@ -347,16 +347,12 @@ export default {
},
getProfOptions() {
getDictList({ type__code: "industry_classification" }).then(response => {
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;
@ -368,7 +364,7 @@ export default {
}else{
createCertapp(this.formData).then((res) => {
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() {
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">
<el-button type="primary" icon="el-icon-plus" @click="handleCreate">新增</el-button>
</div>
<el-table
v-loading="listLoading"
:data="evaluationitem.results"
style="width: 100%;margin-top:10px;"
border
fit
stripe
highlight-current-row
max-height="600"
>
<el-table v-loading="listLoading"
:data="evaluationitem.results"
style="width: 100%;margin-top:10px;"
border
fit
stripe
highlight-current-row
max-height="600">
<el-table-column type="index" width="50" />
<el-table-column label="编号">
<el-table-column label="名称">
<template slot-scope="scope">
{{ scope.row.cert_field }}
{{ scope.row.name }}
</template>
</el-table-column>
<el-table-column label="名称">
<template slot-scope="scope">{{ scope.row.name }}</template>
<el-table-column label="认证领域">
<template slot-scope="scope">
{{ scope.row.cert_field.name}}
</template>
</el-table-column>
<el-table-column label="上传日期">
<template slot-scope="scope">
<span>{{ scope.row.create_time }}</span>
</template>
</el-table-column>
<el-table-column label="操作" >
<template slot-scope="scope">
<el-button
type="primary"
size="small"
:disabled="!checkPermission(['evaluationitem_update'])"
@click="handleUpdate(scope)"
>编辑</el-button>
<!-- <el-button
type="primary"
size="small"
:disabled="!checkPermission(['implementrule_update'])"
@click="handleUpate(scope)"
>单元划分</el-button> -->
<el-button
type="danger"
size="small"
:disabled="!checkPermission(['evaluationitem_delete'])"
@click="handleDelete(scope)"
>删除</el-button>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button type="primary"
size="small"
:disabled="!checkPermission(['evaluationitem_update'])"
@click="handleUpdate(scope)">编辑</el-button>
<!-- <el-button
type="primary"
size="small"
:disabled="!checkPermission(['implementrule_update'])"
@click="handleUpate(scope)"
>单元划分</el-button> -->
<el-button type="danger"
size="small"
:disabled="!checkPermission(['evaluationitem_delete'])"
@click="handleDelete(scope)">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination

View File

@ -5,54 +5,54 @@
<el-tab-pane label="评审信息">
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="100px">
<el-row>
<el-col :span="8">
<el-col :span="12">
<el-form-item label="认证类型" prop="cert_field">
<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="24" 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"
:multiple="false"></treeselect>
</el-form-item>
</el-col>
<el-col :span="24" 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"
:multiple="true"></treeselect>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="评审标题" prop="name">
<el-input v-model="formData.name" placeholder="请输入评审标题" clearable :style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12" 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="12" 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-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="评审标题" prop="name">
<el-input v-model="formData.name" placeholder="请输入评审标题" clearable :style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24" style="margin-top:4px">
<el-form-item size="large">
<el-button type="primary" @click="submitForm">保存</el-button>
<el-button @click="resetForm">重置</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-row>
<el-row>
<el-col :span="24" style="margin-top:4px">
<el-form-item size="large">
<el-button type="primary" @click="submitForm">保存</el-button>
<el-button @click="resetForm">重置</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="评审项信息" v-if="formData.id">
<Evaluations :evItem="formData.id"></Evaluations>
@ -79,7 +79,7 @@ export default {
id: null,
name:undefined,
cert_field: undefined,
pv_scope: undefined,
pv_scope: undefined,
pv_class: undefined,
ccc_list: undefined
@ -105,7 +105,44 @@ export default {
this.getCerttype();
},
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() {
getDictList({ type__code: "cert_field" }).then(response => {
if (response.data) {

View File

@ -6,18 +6,37 @@
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="100px">
<el-row>
<el-col :span="12">
<el-form-item label="评审标题" prop="name">
<el-input v-model="formData.name" placeholder="请输入评审标题" clearable :style="{width: '100%'}"></el-input>
<el-col :span="8">
<el-form-item label="认证类型" prop="cert_field">
<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-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="评审代号" prop="cert_field">
<el-input v-model="formData.cert_field" placeholder="请输入评审代号" clearable :style="{width: '100%'}"></el-input>
<el-form-item label="评审标题" prop="name">
<el-input v-model="formData.name" placeholder="请输入评审标题" clearable :style="{width: '100%'}"></el-input>
</el-form-item>
</el-col>
@ -41,7 +60,9 @@
</div>
</template>
<script>
import { getDictList } from "@/api/dict";
import { updateEvaluationItem,getEvaluationItem} from "@/api/evaluationitem";
import { genTree } from "@/utils";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
@ -53,29 +74,119 @@ export default {
return {
formData: {
id: null,
id: null,
name:undefined,
cert_field: undefined,
pv_scope: undefined,
pv_class: undefined,
ccc_list: undefined
},
rules: {
},
cert_fieldOptions: [],
cert_field_code:null,
pv_scopeOptions: [],
pv_classOptions: [],
ccc_listOptions: [],
cert_patternOptions: []
};
},
created() {
this.formData.id = this.$route.query.id;//接收参数
this.getData();
this.getPvscope();
this.getPvclass();
this.getCccList();
this.getCertpattern();
this.getCerttype();
},
mounted() {},
methods: {
getData() {
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() {
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 => {
this.formData = response.data;
this.cert_field_code = response.data.cert_field_.code
})
},
},
submitForm() {
this.$refs["elForm"].validate(valid => {
if (!valid) return;

View File

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

View File

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

View File

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

View File

@ -65,9 +65,24 @@ class UnitTypeSerializer(serializers.ModelSerializer):
queryset = queryset.select_related('standard','implementrule')
return queryset
class EvaluationItemSerializer(serializers.ModelSerializer):
cert_field_ = DictSerializer(source='cert_field', read_only=True)
class Meta:
model = EvaluationItem
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 Meta:
model = Evaluations

View File

@ -1,7 +1,7 @@
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
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.mixins import CreateUpdateCustomMixin, OptimizationMixin
# Create your views here.
@ -53,13 +53,28 @@ class EvaluationItemViewSet(CreateUpdateCustomMixin, ModelViewSet):
serializer_class = EvaluationItemSerializer
search_fields = ['cert_field']
ordering = ['-create_time']
def get_serializer_class(self):
# 根据请求类型动态变更serializer
if self.action == 'list':
return EvaluationItemListSerializer
return EvaluationItemSerializer
class EvaluationsViewSet(CreateUpdateCustomMixin, ModelViewSet):
"""
培训记录-增删改查
"""
perms_map = {'get': '*', 'post': 'evaluations_create',
'put': 'evaluations_update', 'delete': 'evaluations_delete'}
queryset = Evaluations.objects.all()
serializer_class = EvaluationsSerializer
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
class EnterpriseAddressSerializer(serializers.ModelSerializer):
class EnterpriseSerializer(serializers.ModelSerializer):
class Meta:
model = EnterpriseAddress
model = Enterprise
fields = '__all__'
class EnterpriseListSerializer(serializers.ModelSerializer):
type = DictSerializer()
economy_class = DictSerializer()
class Meta:
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']
@ -23,16 +18,14 @@ class EnterpriseListSerializer(serializers.ModelSerializer):
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
class EnterpriseSerializer(serializers.ModelSerializer):
address_ = EnterpriseAddressSerializer(source='enterpriseaddress_enterprise', many=True)
def get_cert_type(self, obj):
return obj.get_cert_type_display()
class EnterpriseAddressSerializer(serializers.ModelSerializer):
class Meta:
model = Enterprise
model = EnterpriseAddress
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
import uuid
# Create your models here.
class DetectOrg(CommonBModel):
class TestOrg(CommonBModel):
code = models.CharField('实验室编号', max_length=100)
name = models.CharField('实验室名称',null=True, blank=True,max_length=200)
address = models.CharField('通讯地址',null=True, blank=True,max_length=500)
contactman = 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)
password = models.CharField('登录密码',null=True, blank=True,max_length=50)
note = models.CharField('备注',null=True, blank=True,max_length=200)
@ -22,7 +22,7 @@ class DetectOrg(CommonBModel):
def __str__(self):
return self.name
class DetectOrgNotice(CommonBModel):
class TestOrgNotice(CommonBModel):
name = models.CharField('公告标题',null=True, blank=True,max_length=500)
publishdate = models.DateTimeField('发布时间')
@ -30,7 +30,7 @@ class DetectOrgNotice(CommonBModel):
note = models.CharField('公告内容',null=True, blank=True,max_length=6000)
isalluser = models.BooleanField('是否通知全员', default=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:
verbose_name = '实验室通知公告'
verbose_name_plural = verbose_name

View File

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

View File

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

View File

@ -1,30 +1,30 @@
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from .models import DetectOrg,DetectOrgNotice
from .models import TestOrg,TestOrgNotice
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.mixins import CreateUpdateCustomMixin, OptimizationMixin
# Create your views here.
class DetectOrgViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
perms_map = {'get': '*', 'post': 'DetectOrg_create',
'put': 'DetectOrg_update', 'delete': 'DetectOrg_delete'}
queryset = DetectOrg.objects
serializer_class = DetectOrgSerializer
class TestOrgViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
perms_map = {'get': '*', 'post': 'TestOrg_create',
'put': 'TestOrg_update', 'delete': 'TestOrg_delete'}
queryset = TestOrg.objects
serializer_class = TestOrgSerializer
search_fields = ['name', 'code']
ordering = ['-create_time']
class DetectOrgNoticeViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
perms_map = {'get': '*', 'post': 'DetectOrgNotice_create',
'put': 'DetectOrgNotice_update', 'delete': 'DetectOrgNotice_delete'}
queryset = DetectOrgNotice.objects
serializer_class = DetectOrgNoticeSerializer
class TestOrgNoticeViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):
perms_map = {'get': '*', 'post': 'TestOrgNotice_create',
'put': 'TestOrgNotice_update', 'delete': 'TestOrgNotice_delete'}
queryset = TestOrgNotice.objects
serializer_class = TestOrgNoticeSerializer
search_fields = ['name']
ordering = ['-create_time']
def get_serializer_class(self):
# 根据请求类型动态变更serializer
if self.action == 'list':
return DetectOrgNoticListSerializer
return DetectOrgNoticeSerializer
return TestOrgNoticListSerializer
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 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.system.models import CommonAModel, CommonBModel, Dict, User
# 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_v = JSONField(verbose_name='生产厂', null=True)
scope = models.TextField('认证范围', null=True, blank=True)
system_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)
@ -105,7 +104,7 @@ class CertApp(CommonBModel):
supervise_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)
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)
risk = models.CharField('风险系数', choices=risk_choices, max_length=50, null=True, blank=True)
class Meta:
@ -188,19 +187,18 @@ class EvaluationDetail(CommonBModel):
('符合', '符合'),
('不符合', '不符合'),
('不适用', '不适用'),
('需说明', '需说明')
('需说明', '需说明'),
)
application = models.ForeignKey(Application, on_delete=models.CASCADE)
item = models.ForeignKey(EvaluationItem, verbose_name='项目内容', on_delete=models.DO_NOTHING)
result = models.CharField('评审结果',choices = result_choices, default='符合', max_length=50)
remark = models.TextField('备注', blank=True)
cert_app = models.ManyToManyField(CertApp, verbose_name='关联受理', related_name='evaluationdetail_cert_app')
item = models.ForeignKey(Evaluations,on_delete=models.DO_NOTHING,verbose_name='评审项',null=True, blank=True, related_name='evaluationdetail_item')
item_v = JSONField(verbose_name='评审项目',null=True, blank=True)
remark = models.TextField('备注', null=True, blank=True)
class Meta:
verbose_name = '评审记录详情'
verbose_name_plural = verbose_name
def __str__(self):
return self.application.number
return self.name
class Unit(CommonBModel):
"""
@ -220,6 +218,7 @@ class Unit(CommonBModel):
def __str__(self):
return self.name
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
obj = self.certapp

View File

@ -47,6 +47,13 @@ class CertappSerializer(serializers.ModelSerializer):
class Meta:
model = CertApp
fields = '__all__'
class EvaluationDetailSerializer(serializers.ModelSerializer):
class Meta:
model = EvaluationDetail
fields = '__all__'
@staticmethod
def setup_eager_loading(queryset):
@ -88,4 +95,4 @@ class ProjectUpdateSerializer(serializers.ModelSerializer):
class Meta:
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('subapplication', SubApplicationViewSet, basename="subapplication")
router.register('certapp', CertappViewset, basename="certapp")
router.register('evaluationdetail', EvaluationDetailViewset, basename="evaluationdetail")
router.register('unit', UnitViewSet, basename="unit")
router.register('project', ProjectViewSet, basename="project")
urlpatterns = [
path('', include(router.urls))
]

View File

@ -89,6 +89,24 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
headers = self.get_success_headers(serializer.data)
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'},
url_name='complete_certapp')
def complete(self, request, pk=None):
@ -185,4 +203,4 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet):
obj.edate0 = request.data['edate0']
obj.edate1 = request.data['edate1']
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.employee',
'apps.project',
'apps.financial',
'apps.laboratory',
'apps.plan',
'apps.audit'

View File

@ -36,6 +36,7 @@ urlpatterns = [
path('crm/', include('apps.crm.urls')),
path('employee/', include('apps.employee.urls')),
path('project/', include('apps.project.urls')),
path('financial/', include('apps.financial.urls')),
path('plan/', include('apps.plan.urls')),
path('audit/', include('apps.audit.urls')),
path('laboratory/', include('apps.laboratory.urls')),