下拉内容

This commit is contained in:
shilixia 2020-10-19 15:14:03 +08:00
commit 0659467696
49 changed files with 1522 additions and 159 deletions

View File

@ -7,7 +7,40 @@ export function getCertappunitList(query) {
params: query params: query
}) })
} }
export function getCertappunit(id) {
return request({
url: `/project/certappunit/${id}/`,
method: 'get'
})
}
export function accessCertappunit(id,data) {
return request({
url: `/project/certappunit/${id}/access/`,
method: 'put',
data
})
}
export function testtaskCertappunit(id,data) {
return request({
url: `/project/certappunit/${id}/testtask/`,
method: 'put',
data
})
}
export function teststateCertappunit(id,data) {
return request({
url: `/project/certappunit/${id}/teststate/`,
method: 'put',
data
})
}
export function createsamplesCertappunit(id,data) {
return request({
url: `/project/certappunit/${id}/createsamples/`,
method: 'put',
data
})
}
// export function createAccess(data) { // export function createAccess(data) {
// return request({ // return request({
// url: '/accessment/certass/', // url: '/accessment/certass/',

View File

@ -0,0 +1,19 @@
import request from '@/utils/request'
export function getCertificateList(query) {
return request({
url: '/certificate/certificate/',
method: 'get',
params: query
})
}
export function createCertificate(data) {
return request({
url: '/certificate/certificate/',
method: 'post',
data
})
}

View File

@ -212,6 +212,19 @@ export const asyncRoutes = [
component: () => import('@/views/testorg/testorgnotice'), component: () => import('@/views/testorg/testorgnotice'),
meta: { title: '实验室通知公告', icon: 'example', perms: ['testorg_manage'] } meta: { title: '实验室通知公告', icon: 'example', perms: ['testorg_manage'] }
}, },
{
path: 'taskmanagement',
name: 'TaskManagement',
component: () => import('@/views/testorg/taskmanagement'),
meta: { title: '任务管理', icon: 'example', perms: ['testorg_manage'] }
},
{
path: 'feedback/create',
name: 'FeedbackCreate',
component: () => import('@/views/testorg/feedback.vue'),
meta: { title: '任务反馈', noCache: true, icon: '', perms: ['feedback_create']},
hidden: true
},
] ]
}, },
@ -244,12 +257,25 @@ export const asyncRoutes = [
name: 'CertificateManage', name: 'CertificateManage',
meta: { title: '证书管理', icon: 'example'}, meta: { title: '证书管理', icon: 'example'},
children: [ children: [
{
path: 'issueindex',
name: 'issueindex',
component: () => import('@/views/certificate/issueindex'),
meta: { title: '证书颁发', icon: 'example', perms: ['certificate_issue'] }
},
{ {
path: 'index', path: 'index',
name: 'Certificate', name: 'Certificate',
component: () => import('@/views/certificate/index'), component: () => import('@/views/certificate/index'),
meta: { title: '证书管理', icon: 'example', perms: ['certificate_view'] } meta: { title: '证书管理', icon: 'example', perms: ['certificate_view'] }
}, },
{
path: 'certapp/:id/:action/',
name: 'Certissue',
component: () => import('@/views/certapp/certapphandle'),
meta: { title: '证书颁发', icon: 'example', perms: ['certificate_issue'] },
hidden: true
},
] ]
}, },
{ {

View File

@ -69,7 +69,7 @@
> >
<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" >{{ scope.row.name }}</template> <template slot-scope="scope" v-if="scope.row.certunit_">{{ scope.row.certunit_.name }}</template>
</el-table-column> </el-table-column>
<el-table-column label="证书信息"> <el-table-column label="证书信息">
<template slot-scope="scope"> <template slot-scope="scope">
@ -83,38 +83,59 @@
</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-select
type="danger" v-model="scope.row.decision"
size="small" clearable
:disabled="!checkPermission(['certapps_update'])" collapse-tags
@click="handleDelete(scope)" :style="{width: '100%'}"
>删除</el-button> --> @change="((val)=>{handleAcessunit(val, scope.row.id)})"
>
<el-option
v-for="(item, index) in decisionOptions"
:key="index"
:label="item.name"
:value="item.id"
:disabled="item.disabled"
></el-option>
</el-select>
</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="danger" type="primary"
size="small" size="small"
:disabled="!checkPermission(['certapps_update'])" :disabled="!checkPermission(['certapp_access'])"
@click="handleDelete(scope)" @click="handleAcessunit(scope)"
>删除</el-button> --> >决定</el-button>
</template> </template>
</el-table-column> </el-table-column> -->
</el-table> </el-table>
</el-card> </el-card>
<!-- <el-dialog title="决定" :visible.sync="dialogVisible">
<el-select>
</el-select>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="dialogVisible = false"> </el-button>
</span>
</el-dialog> -->
</div> </div>
</template> </template>
<script> <script>
import { getDictList } from "@/api/dict" import { getDictList } from "@/api/dict"
import { accessCertapp, getCertapp } from "@/api/certapp" import { accessCertapp, getCertapp } from "@/api/certapp"
import { getCertappunitList } from "@/api/certappunit" import { getCertappunitList, accessCertappunit } from "@/api/certappunit"
import { getCertunitList } from "@/api/certunit"; import { getCertunitList } from "@/api/certunit";
import checkPermission from "@/utils/permission";
export default { export default {
name: "access", name: "access",
props:['certapp'], props:['certapp'],
data() { data() {
return { return {
dialogVisible:false,
listLoading: false, listLoading: false,
tableData: [], tableData: [],
formData:{}, formData:{},
@ -143,6 +164,7 @@ export default {
}, },
conclusionOptions:[], conclusionOptions:[],
nonOptions:[], nonOptions:[],
decisionOptions:[],
tableUnitData: [], tableUnitData: [],
listQuery:{ listQuery:{
pageoff:true, pageoff:true,
@ -154,9 +176,16 @@ export default {
this.getConclusion() this.getConclusion()
this.getOptions1() this.getOptions1()
this.getOptions2() this.getOptions2()
this.getUnitList(); this.getUnitList()
this.getDecisionOptions()
}, },
methods:{ methods:{
checkPermission,
getDecisionOptions() {
getDictList({type__code:'cert_decision', pageoff:true}).then(res=>{
this.decisionOptions = res.data
})
},
getConclusion() { getConclusion() {
getCertapp(this.certapp).then(res=>{ getCertapp(this.certapp).then(res=>{
if(res.data){ if(res.data){
@ -176,12 +205,9 @@ export default {
}, },
getUnitList() { getUnitList() {
this.listLoading = true; this.listLoading = true;
getCertappunitList(this.listQuery).then((response) => { getCertappunitList(this.listQuery).then(res => {
if (res.data) {
if (response.data) { this.tableUnitData = res.data;
this.tableUnitData = response.data;
} }
this.listLoading = false; this.listLoading = false;
}); });
@ -193,6 +219,12 @@ export default {
this.$message.success('成功') this.$message.success('成功')
}); });
}); });
},
handleAcessunit(val,id){
accessCertappunit(id, {'decision':val}).then(res=>{
this.$message.success('成功')
})
} }
} }
}; };

View File

@ -64,7 +64,7 @@
</el-table-column> </el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.status}} {{ scope.row.state}}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="创建人"> <el-table-column label="创建人">

View File

@ -35,7 +35,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope">{{ scope.row.status}}</template> <template slot-scope="scope">{{ scope.row.state}}</template>
</el-table-column> </el-table-column>
<el-table-column label="创建人"> <el-table-column label="创建人">
<template slot-scope="scope">{{ scope.row.create_by_.name}}</template> <template slot-scope="scope">{{ scope.row.create_by_.name}}</template>
@ -105,7 +105,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope">{{ scope.row.status}}</template> <template slot-scope="scope">{{ scope.row.state}}</template>
</el-table-column> </el-table-column>
<el-table-column label="是否可派差"> <el-table-column label="是否可派差">
<template slot-scope="scope"> <template slot-scope="scope">
@ -165,12 +165,12 @@ export default {
return { return {
listLoading: true, listLoading: true,
listQuery: { listQuery: {
status: "已受理", state: "已受理",
}, },
listQuery_project: { listQuery_project: {
page: 1, page: 1,
page_size: 20, page_size: 20,
status:"待策划" state:"待策划"
}, },
projectData: { count: 0, results: [] }, projectData: { count: 0, results: [] },
}; };
@ -193,7 +193,7 @@ export default {
}, },
resetFilter() { resetFilter() {
this.listQuery = { this.listQuery = {
status: "已受理", state: "已受理",
}; };
this.getCertappList_(); this.getCertappList_();
}, },

View File

@ -62,7 +62,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope">{{ scope.row.status}}</template> <template slot-scope="scope">{{ scope.row.state}}</template>
</el-table-column> </el-table-column>
<el-table-column label="审核组成员"> <el-table-column label="审核组成员">
<template slot-scope="scope" v-if="scope.row.members"> <template slot-scope="scope" v-if="scope.row.members">
@ -139,7 +139,7 @@
</el-table-column> </el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.status}} {{ scope.row.state}}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="审核组成员"> <el-table-column label="审核组成员">

View File

@ -88,7 +88,7 @@
</el-table-column> </el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.status}} {{ scope.row.state}}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="创建人"> <el-table-column label="创建人">

View File

@ -43,11 +43,14 @@
<el-tab-pane label="现场审核反馈" name="Certappfeedback" v-if="certapp" lazy> <el-tab-pane label="现场审核反馈" name="Certappfeedback" v-if="certapp" lazy>
<Conclusion :certapp="certapp"></Conclusion> <Conclusion :certapp="certapp"></Conclusion>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="安排检测任务" name="Certapptask" v-if="certapp" lazy>
<Detectiontask :certapp="certapp"></Detectiontask>
</el-tab-pane>
<el-tab-pane label="认证评定" name="Certappaccess" v-if="certapp" lazy> <el-tab-pane label="认证评定" name="Certappaccess" v-if="certapp" lazy>
<access :certapp="certapp"></access> <access :certapp="certapp"></access>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="安排检测任务" name="Certapptask" v-if="certapp" lazy> <el-tab-pane label="证书颁发" name="Certissue" v-if="certapp" lazy>
<Detectiontask :certapp="certapp"></Detectiontask> <issue :certapp="certapp"></issue>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</el-col> </el-col>
@ -82,14 +85,17 @@ 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"
import REVIEW from "@/views/certapp/review" import REVIEW from "@/views/certapp/review"
import issue from "@/views/certificate/issue"
import Detectiontask from "@/views/certapp/detectiontask" import Detectiontask from "@/views/certapp/detectiontask"
export default { export default {
components: { CCCform,Detectiontask, Certunit, QMSform, Conclusion, Member, access, CHARGE, REVIEW}, components: { CCCform,Detectiontask,Certunit, QMSform, Conclusion, Member, access, CHARGE, REVIEW, issue},
props: [], props: [],
data() { data() {
return { return {
// steps:['申请', '受理', ''],
activeName:'Basic', activeName:'Basic',
certapp:null, certapp:null,
certappdata:null, certappdata:null,

View File

@ -152,6 +152,7 @@ export default {
pageoff:true, pageoff:true,
certappunit_certunit__certapp:this.certapp certappunit_certunit__certapp:this.certapp
}, },
delarr: [],
formData: { formData: {
certapp:this.certapp, certapp:this.certapp,
implementrule: undefined, implementrule: undefined,

View File

@ -13,11 +13,26 @@
> >
<el-table-column type="index" width="50" /> <el-table-column type="index" width="50" />
<el-table-column label="状态">
<template slot-scope="scope" >{{ scope.row.teststate }}</template>
</el-table-column>
<el-table-column label="检测任务号"> <el-table-column label="检测任务号">
<template slot-scope="scope" >{{ scope.row.detnumber }}</template> <template slot-scope="scope" >{{ scope.row.detnumber }}</template>
</el-table-column>
<el-table-column label="检测单元">
<template slot-scope="scope" >{{ scope.row.certunit_.name }}</template>
</el-table-column>
<el-table-column label="样品描述">
<template slot-scope="scope" >{{ scope.row.sampledec }}</template>
</el-table-column>
<el-table-column label="收费方式">
<template slot-scope="scope" >{{ scope.row.charge }}</template>
</el-table-column> </el-table-column>
<el-table-column label="被委托检测机构"> <el-table-column label="被委托检测机构">
<template slot-scope="scope" >{{ scope.row.testorg}}</template> <template slot-scope="scope" >{{ scope.row.testorg_.name}}</template>
</el-table-column>
<el-table-column label="检验项目">
<template slot-scope="scope" >{{ scope.row.testitem}}</template>
</el-table-column> </el-table-column>
<el-table-column label="创建时间"> <el-table-column label="创建时间">
<template slot-scope="scope"> <template slot-scope="scope">
@ -26,18 +41,26 @@
</el-table-column> </el-table-column>
<el-table-column label="操作"> <el-table-column label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button-group>
<el-button <el-button
type="danger" type="danger"
size="small" size="small"
:disabled="!checkPermission(['certapps_update'])" :disabled="!checkPermission(['certapps_update'])"
@click="handleDelete(scope)" @click="handleDelete(scope)"
>删除</el-button> >删除</el-button>
<el-button
type="primary"
size="small"
:disabled="!checkPermission(['certapps_update'])"
@click="handlestate(scope.row.id)"
>下达实验室</el-button>
</el-button-group>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="150px" style="margin-top:10px"> <el-form ref="elForm" :model="formData" size="medium" label-width="150px" style="margin-top:10px">
<el-col :xs="24" :md="12"> <el-col :xs="24" :md="12">
<el-form-item label="被委托检测机构" prop="testorg"> <el-form-item label="被委托检测机构" prop="testorg">
<el-select v-model="formData.testorg" placeholder="请选择检测机构" clearable :style="{width: '100%'}"> <el-select v-model="formData.testorg" placeholder="请选择检测机构" clearable :style="{width: '100%'}">
@ -97,15 +120,14 @@
<el-form-item label="检测任务号" prop="detnumber"> <el-form-item label="检测任务号" prop="detnumber">
<el-input v-model="formData.detnumber" <el-input v-model="formData.detnumber"
placeholder="请输入检测任务号" placeholder="请输入检测任务号"
readonly
clearable clearable
:style="{width: '100%'}" :style="{width: '100%'}"
></el-input> ></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :xs="24" :md="12"> <el-col :xs="24" :md="12">
<el-form-item label="检测单元" prop="testunity"> <el-form-item label="检测单元" prop="certunit">
<el-select v-model="formData.testunity" placeholder="请选择检测单元" clearable :style="{width: '100%'}"> <el-select v-model="formData.certunit" placeholder="请选择检测单元" clearable :style="{width: '100%'}">
<el-option <el-option
v-for="(item, index) in unitOptions" v-for="(item, index) in unitOptions"
:key="index" :key="index"
@ -118,8 +140,8 @@
</el-col> </el-col>
<el-col :xs="24" :md="12"> <el-col :xs="24" :md="12">
<el-form-item label="样品描述" prop="standard"> <el-form-item label="样品描述" prop="sampledec">
<el-input type="textarea" :rows="5" <el-input v-model="formData.sampledec" type="textarea" :rows="5"
clearable clearable
:style="{width: '100%'}"></el-input> :style="{width: '100%'}"></el-input>
</el-form-item> </el-form-item>
@ -134,6 +156,7 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item size="large"> <el-form-item size="large">
<el-button type="primary" @click="createNew">保存</el-button> <el-button type="primary" @click="createNew">保存</el-button>
<el-button type="primary" @click="updatestate">提交CTC</el-button>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-form> </el-form>
@ -143,7 +166,7 @@
import { getTestOrgList} from "@/api/laboratory" import { getTestOrgList} from "@/api/laboratory"
import { getDictList } from "@/api/dict"; import { getDictList } from "@/api/dict";
import { getCertunitList } from "@/api/certunit"; import { getCertunitList } from "@/api/certunit";
import {getCertappunitList} from "@/api/certappunit"; import { getCertappunitList, testtaskCertappunit,teststateCertappunit } from "@/api/certappunit";
import Pagination from "@/components/Pagination"; import Pagination from "@/components/Pagination";
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
import Treeselect from "@riophae/vue-treeselect"; import Treeselect from "@riophae/vue-treeselect";
@ -171,7 +194,7 @@ export default {
testitem:undefined, testitem:undefined,
detnumber:undefined, detnumber:undefined,
remark:undefined, remark:undefined,
testunity:undefined sampledec:undefined
}, },
TestOptions:[], TestOptions:[],
unitOptions:[], unitOptions:[],
@ -214,16 +237,16 @@ export default {
this.listLoading = true; this.listLoading = true;
getCertappunitList({ pageoff:true, getCertappunitList({ pageoff:true,
certappunit_certunit__certapp:this.certapp}).then((response) => { certapp:this.certapp}).then((response) => {
if (response.data) { if (response.data) {
this.tableData = response.data; this.tableData = response.data;
} }
this.listLoading = false; this.listLoading = false;
}); });
}, },
gettunitList() { gettunitList() {
this.listLoading = true; this.listLoading = true;
getCertunitList(this.listQuery1).then(res=>{ getCertunitList(this.listQuery1).then(res=>{
@ -234,17 +257,36 @@ export default {
}); });
}, },
getTestOptions(){ getTestOptions(){
getTestOrgList().then(res=>{ getTestOrgList().then(res=>{
this.TestOptions = genTree(res.data.results) this.TestOptions = genTree(res.data.results)
}) })
}, },
getDataList(){
handlestate(id){
var val='待实验室检验';
teststateCertappunit(id, {'teststate':val}).then(res=>{
this.$message.success('成功')
})
},
createNew() {
this.$refs["elForm"].validate((valid) => {
if (!valid) return;
testtaskCertappunit(this.formData.id, this.formData).then((res) => {
this.$message.success('成功')
});
});
},
updatestate()
{
alert(提交CTC还没有做)
},
rowClick(row, column, event){
this.formData = Object.assign({}, row);
console.log( this.formData)
} }
}, },
}; };

View File

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

View File

@ -59,7 +59,7 @@
</el-table-column> </el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.status}} {{ scope.row.state}}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="创建人"> <el-table-column label="创建人">

View File

@ -0,0 +1,136 @@
<template>
<div>
<el-table
v-loading="listLoading"
:data="tableUnitData"
style="width: 100%;"
border
fit
stripe
highlight-current-row
height="380"
>
<el-table-column type="index" width="50" />
<el-table-column label="单元名称">
<template slot-scope="scope" v-if="scope.row.certunit_">{{ scope.row.certunit_.name }}</template>
</el-table-column>
<el-table-column label="证书信息">
<template slot-scope="scope" v-if="scope.row.certificate_">
{{scope.row.certificate_.number}}
</template>
</el-table-column>
<el-table-column label="认证决定">
<template slot-scope="scope" v-if="scope.row.decision_">
{{ scope.row.decision_.name }}
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
type="primary"
size="small"
:disabled="!checkPermission(['certificate_issue'])"
@click="handleIssue(scope)"
>发证</el-button>
</template>
</el-table-column>
</el-table>
<el-drawer
title="发证"
:visible.sync="drawerVisible"
direction="rtl"
:close-on-click-modal="false"
:with-header="false">
</el-drawer>
</div>
</template>
<script>
import { getDictList } from "@/api/dict"
import { accessCertapp, getCertapp } from "@/api/certapp"
import { getCertappunitList, accessCertappunit } from "@/api/certappunit"
import { getCertunitList } from "@/api/certunit";
import checkPermission from "@/utils/permission";
import { createCertificate } from "@/api/certificate"
export default {
name: "issue",
props:['certapp'],
data() {
return {
drawerVisible:false,
listLoading: false,
tableData: [],
formData:{},
rules:{
conclusion: [
{
required: true,
message: "请选择",
trigger: "blur",
},
],
nonitems: [
{
required: true,
message: "请选择",
trigger: "blur",
},
],
score: [
{
required: true,
message: "请输入",
trigger: "blur",
},
],
},
conclusionOptions:[],
nonOptions:[],
decisionOptions:[],
tableUnitData: [],
listQuery:{
pageoff:true,
certapp:this.certapp
}
};
},
created() {
this.getUnitList()
this.getDecisionOptions()
},
methods:{
checkPermission,
getDecisionOptions() {
getDictList({type__code:'cert_decision', pageoff:true}).then(res=>{
this.decisionOptions = res.data
})
},
getConclusion() {
getCertapp(this.certapp).then(res=>{
if(res.data){
this.formData = res.data
}
})
},
getUnitList() {
this.listLoading = true;
getCertappunitList(this.listQuery).then(res => {
if (res.data) {
this.tableUnitData = res.data;
}
this.listLoading = false;
});
},
handleIssue(scope){
// this.drawerVisible = true
createCertificate({certunit:scope.row.certunit, first_send:'2020-06-19', used_start:'2020-06-19', used_end:'2021-11-11'}).then(res=>{
this.$message.success('成功')
this.getUnitList()
})
}
}
};
</script>

View File

@ -0,0 +1,180 @@
<template>
<div class="app-container">
<div style="display:flex">
<treeselect
v-model="listQuery.user__dept"
:multiple="false"
:options="deptOptions"
placeholder="所属组织"
:disable-branch-nodes="true"
@input="handleFilter"
style="width: 280px" clearable/>
<el-input
v-model="listQuery.search"
placeholder="姓名/易记码/编号/注册领域"
style="width: 300px;margin-left:10px"
class="filter-item"
@keyup.enter.native="handleFilter"
/>
<el-button
class="filter-item"
type="primary"
icon="el-icon-search"
@click="handleFilter"
>搜索</el-button>
<el-button
class="filter-item"
type="primary"
icon="el-icon-refresh-left"
@click="resetFilter"
>刷新重置</el-button>
</div>
<el-table
v-loading="listLoading"
:data="tableData.results"
style="width: 100%;margin-top:10px;"
border
fit
stripe
highlight-current-row
>
<el-table-column type="index" width="50" />
<el-table-column label="申请单号">
<template slot-scope="scope" v-if="scope.row.number">{{ scope.row.number }}</template>
</el-table-column>
<el-table-column label="认证领域/分类">
<template slot-scope="scope">
<el-tag >{{scope.row.cert_field_.name}}</el-tag>
<el-tag v-if="scope.row.cccpv_class_" type="warning" style="margin:2px">{{scope.row.cccpv_class_.name}}</el-tag>
</template>
</el-table-column>
<el-table-column label="申请信息" width="300px">
<template slot-scope="scope">
<div><span style="color:darkblue;font-weight:bold">申请方</span>:{{ scope.row.applicant_v.name }}</div>
<div v-if="scope.row.manufacture"><span style="color:darkblue;font-weight:bold">制造商</span>:{{ scope.row.manufacture_v.name }}</div>
<div v-if="scope.row.factory"><span style="color:darkblue;font-weight:bold">生产厂</span>:{{ scope.row.factory_v.name }}</div>
</template>
</el-table-column>
<el-table-column label="当前状态">
<template slot-scope="scope">
{{ scope.row.state}}
</template>
</el-table-column>
<el-table-column label="创建人">
<template slot-scope="scope">{{ scope.row.create_by_.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="操作" fixed="right">
<template slot-scope="scope" >
<el-button
type="primary"
size="small"
:disabled="!checkPermission(['certapp_accessment'])"
@click="handleIssue(scope)"
>颁发</el-button>
<el-button
size="small"
:disabled="!checkPermission(['certapp_detail'])"
@click="handleCertappDetail(scope)"
>详情</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="tableData.count>0"
:total="tableData.count"
:page.sync="listQuery.page"
:limit.sync="listQuery.page_size"
@pagination="getList"
/>
</div>
</template>
<script>
import { getCertappList, deleteCertapp } from "@/api/certapp"
import { getOrgList } from "@/api/org"
import { getDictList } from "@/api/dict"
import Pagination from "@/components/Pagination"
import checkPermission from '@/utils/permission'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import { genTree } from '../../utils'
export default {
components: { Pagination, Treeselect },
data() {
return {
tableData: {count:0},
listLoading: true,
listQuery: {
page: 1,
page_size: 20
},
deptOptions: [],
field_list:[]
};
},
created() {
this.getList()
this.getdeptOptions()
this.getfields()
},
methods: {
checkPermission,
getList() {
this.listLoading = true;
getCertappList(this.listQuery).then(response => {
if (response.data) {
this.tableData = response.data
}
this.listLoading = false
});
},
getdeptOptions() {
getOrgList().then(res=>{
this.deptOptions = genTree(res.data)
})
},
resetFilter() {
this.listQuery = {
page: 1,
page_size: 20
}
this.getList()
},
handleFilter() {
this.listQuery.page = 1
this.getList()
},
getfields(){
getDictList({type__code:'cert_field'}).then(res=>{
let fields = []
for(var i=0;i<res.data.length;i++){
if(res.data[i].parent!=null){
fields.push({id:res.data[i].id, name:res.data[i].name, code:res.data[i].code})
}
}
this.field_list = fields
})
},
handleCertappDetail(scope) {
this.$router.push({
name: "Certappdetail",
params: { id: scope.row.id },
});
},
handleIssue(scope) {
this.$router.push({
name: "Certissue",
params: { id: scope.row.id, action:'issue' },
});
}
}
};
</script>

View File

@ -45,7 +45,7 @@
</div> </div>
<div class="text item"> <div class="text item">
<span class="span">当前状态</span> <span class="span">当前状态</span>
{{project.status}} {{project.state}}
</div> </div>
<div class="text item" v-if="project.assign_by_"> <div class="text item" v-if="project.assign_by_">
<span class="span">下达人</span> <span class="span">下达人</span>
@ -111,7 +111,7 @@
</template> </template>
</el-table-column>--> </el-table-column>-->
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope">{{ scope.row.status}}</template> <template slot-scope="scope">{{ scope.row.state}}</template>
</el-table-column> </el-table-column>
<el-table-column label="受理/确认人"> <el-table-column label="受理/确认人">
<template <template

View File

@ -35,7 +35,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope">{{ scope.row.status}}</template> <template slot-scope="scope">{{ scope.row.state}}</template>
</el-table-column> </el-table-column>
<el-table-column label="创建人"> <el-table-column label="创建人">
<template slot-scope="scope">{{ scope.row.create_by_.name}}</template> <template slot-scope="scope">{{ scope.row.create_by_.name}}</template>
@ -105,7 +105,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope">{{ scope.row.status}}</template> <template slot-scope="scope">{{ scope.row.state}}</template>
</el-table-column> </el-table-column>
<el-table-column label="是否可派差"> <el-table-column label="是否可派差">
<template slot-scope="scope"> <template slot-scope="scope">
@ -165,12 +165,12 @@ export default {
return { return {
listLoading: true, listLoading: true,
listQuery: { listQuery: {
status: "已受理", state: "已受理",
}, },
listQuery_project: { listQuery_project: {
page: 1, page: 1,
page_size: 20, page_size: 20,
status:"待策划" state:"待策划"
}, },
projectData: { count: 0, results: [] }, projectData: { count: 0, results: [] },
}; };
@ -193,7 +193,7 @@ export default {
}, },
resetFilter() { resetFilter() {
this.listQuery = { this.listQuery = {
status: "已受理", state: "已受理",
}; };
this.getCertappList_(); this.getCertappList_();
}, },

View File

@ -95,7 +95,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope">{{ scope.row.status}}</template> <template slot-scope="scope">{{ scope.row.state}}</template>
</el-table-column> </el-table-column>
<el-table-column label="创建人"> <el-table-column label="创建人">
<template slot-scope="scope">{{ scope.row.create_by_.name}}</template> <template slot-scope="scope">{{ scope.row.create_by_.name}}</template>
@ -170,7 +170,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope">{{ scope.row.status}}</template> <template slot-scope="scope">{{ scope.row.state}}</template>
</el-table-column> </el-table-column>
<el-table-column label="是否可派差"> <el-table-column label="是否可派差">
<template slot-scope="scope"> <template slot-scope="scope">
@ -195,7 +195,7 @@
@click="planProject(scope)" @click="planProject(scope)"
>计划</el-button> >计划</el-button>
<el-button <el-button
v-if="scope.row.status !='待现场审核'" v-if="scope.row.state !='待现场审核'"
type="primary" type="primary"
size="small" size="small"
:disabled="!checkPermission(['project_assgin'])||!scope.row.can_paichai" :disabled="!checkPermission(['project_assgin'])||!scope.row.can_paichai"
@ -270,7 +270,7 @@ export default {
listQuery_project: { listQuery_project: {
page: 1, page: 1,
page_size: 20, page_size: 20,
status: "待策划", state: "待策划",
planoff: true, planoff: true,
}, },
listQuery2: { listQuery2: {
@ -326,7 +326,7 @@ export default {
}, },
resetFilter() { resetFilter() {
this.listQuery = { this.listQuery = {
status: "已受理", state: "已受理",
}; };
this.getCertappList_(); this.getCertappList_();
}, },

View File

@ -25,7 +25,7 @@
</div> </div>
<div class="text item"> <div class="text item">
<span class="span">当前状态</span> <span class="span">当前状态</span>
{{project.status}} {{project.state}}
</div> </div>
<div class="text item" v-if="project.assign_by_"> <div class="text item" v-if="project.assign_by_">
<span class="span">任务下达人</span> <span class="span">任务下达人</span>
@ -145,7 +145,7 @@
</template> </template>
</el-table-column>--> </el-table-column>-->
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope">{{ scope.row.status}}</template> <template slot-scope="scope">{{ scope.row.state}}</template>
</el-table-column> </el-table-column>
<el-table-column label="受理/确认人"> <el-table-column label="受理/确认人">
<template <template

View File

@ -48,7 +48,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope">{{ scope.row.status}}</template> <template slot-scope="scope">{{ scope.row.state}}</template>
</el-table-column> </el-table-column>
<el-table-column label="创建人"> <el-table-column label="创建人">
<template slot-scope="scope">{{ scope.row.create_by_.name}}</template> <template slot-scope="scope">{{ scope.row.create_by_.name}}</template>
@ -111,7 +111,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope">{{ scope.row.status}}</template> <template slot-scope="scope">{{ scope.row.state}}</template>
</el-table-column> </el-table-column>
<el-table-column label="创建人"> <el-table-column label="创建人">
<template slot-scope="scope">{{ scope.row.create_by_.name}}</template> <template slot-scope="scope">{{ scope.row.create_by_.name}}</template>
@ -139,7 +139,7 @@ export default {
tableData: [], tableData: [],
listLoading: true, listLoading: true,
listQuery: { listQuery: {
status: "已受理", state: "已受理",
}, },
deptOptions: [], deptOptions: [],
field_list: [], field_list: [],
@ -166,7 +166,7 @@ export default {
}, },
resetFilter() { resetFilter() {
this.listQuery = { this.listQuery = {
status: "已受理", state: "已受理",
}; };
this.getList(); this.getList();
}, },

View File

@ -30,7 +30,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="当前状态" > <el-table-column label="当前状态" >
<template slot-scope="scope">{{ scope.row.status}}</template> <template slot-scope="scope">{{ scope.row.state}}</template>
</el-table-column> </el-table-column>
<el-table-column label="创建人"> <el-table-column label="创建人">
<template slot-scope="scope">{{ scope.row.create_by_.name}}</template> <template slot-scope="scope">{{ scope.row.create_by_.name}}</template>
@ -44,7 +44,7 @@
<template slot-scope="scope"> <template slot-scope="scope">
<el-button-group> <el-button-group>
<el-button <el-button
v-if="scope.row.status == '创建中'" v-if="scope.row.state == '创建中'"
type="warning" type="warning"
size="small" size="small"
:disabled="!checkPermission(['project_assign'])" :disabled="!checkPermission(['project_assign'])"
@ -127,7 +127,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="当前状态"> <el-table-column label="当前状态">
<template slot-scope="scope">{{ scope.row.status}}</template> <template slot-scope="scope">{{ scope.row.state}}</template>
</el-table-column> </el-table-column>
<el-table-column label="创建人"> <el-table-column label="创建人">
<template slot-scope="scope">{{ scope.row.create_by_.name}}</template> <template slot-scope="scope">{{ scope.row.create_by_.name}}</template>
@ -193,7 +193,7 @@ export default {
listQuery: { listQuery: {
page:1, page:1,
page_size:20, page_size:20,
status: "已受理", state: "已受理",
}, },
listQuery_project: { listQuery_project: {
page:1, page:1,
@ -262,7 +262,7 @@ export default {
}, },
resetFilter() { resetFilter() {
this.listQuery = { this.listQuery = {
status: "已受理", state: "已受理",
}; };
this.getCertappList_(); this.getCertappList_();
}, },

View File

@ -0,0 +1,273 @@
<template>
<div class="app-container">
<el-tabs type="border-card" v-model="activeName" >
<el-form ref="Form"
:model="formData"
label-width="130px"
label-position="right"
:rules="rule1">
<el-col :span="12">
<el-form-item label="检测任务号" prop="detnumber">
<el-input v-model="formData.detnumber" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="认证性质" prop="name">
<el-input v-model="formData.name" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生产企业" prop="">
<el-input v-model="formData.certunit_.enterprise_.name" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生产单位地址" prop="contactman">
<el-input v-model="formData.contactman" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单元描述" prop="ontactManTel">
<el-input v-model="formData.certunit_.description" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="样品描述" prop="sampledec">
<el-input v-model="formData.sampledec" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="到样日期" prop="sampledate">
<el-date-picker v-model="formData.sampledate"
type="date"
placeholder="选择日期"
format="yyyy 年 MM 月 dd 日"
value-format="yyyy-MM-dd":style="{width: '100%'}">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="完成日期" prop="completedate">
<el-date-picker v-model="formData.completedate"
type="date"
placeholder="选择日期"
format="yyyy 年 MM 月 dd 日"
value-format="yyyy-MM-dd":style="{width: '100%'}">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报告签发日期" prop="issuancedate">
<el-date-picker v-model="formData.issuancedate"
type="date"
placeholder="选择日期"
format="yyyy 年 MM 月 dd 日"
value-format="yyyy-MM-dd":style="{width: '100%'}">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="检验结论" prop="conclusion">
<el-select placeholder="请选择检验结论" v-model="formData.conclusion" filterable allow-create :style="{width: '100%'}"
>
<el-option
v-for="(item, index) in conclusionOptions"
:key="index"
:label="item.label"
:value="item.value"
:disabled="item.disabled"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检测状态" prop="inspectionstate">
<el-select placeholder="请选择检测状态" v-model="formData.inspectionstate" filterable allow-create :style="{width: '100%'}"
>
<el-option
v-for="(item, index) in inspectionOptions"
:key="index"
:label="item.label"
:value="item.value"
:disabled="item.disabled"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="确认的收费方式" prop="password">
<el-select placeholder="请选择收费方式" v-model="formData.charge" filterable allow-create :style="{width: '100%'}"
>
<el-option
v-for="(item, index) in chargeOptions"
:key="index"
:label="item.label"
:value="item.value"
:disabled="item.disabled"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="不符合项目描述" prop="resultremark">
<el-input type="textarea"
:rows="2"
v-model="formData.resultremark">
</el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remarks">
<el-input type="textarea"
:rows="2"
v-model="formData.remarks">
</el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="相关文件资料" prop="path">
<el-upload
:on-preview="handlePreview"
:on-success="handleSuccess"
:action="upUrl"
:headers="upHeaders"
:limit="1"
:file-list="fileList"
>
<el-button size="small" type="primary">点击上传</el-button>
</el-upload>
</el-form-item>
</el-col>
<el-col :span="24" style="margin-top:4px">
<el-form-item size="large">
<el-button type="danger" @click="resetForm">取消</el-button>
<el-button type="primary" @click="submitForm">确认</el-button>
</el-form-item>
</el-col>
</el-form>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import { getTestOrgList, createTestOrg, updateTestOrg, deleteTestOrg } from "@/api/laboratory"
import { getCertappunitList,getCertappunit,testtaskCertappunit,createsamplesCertappunit,teststateCertappunit } from "@/api/certappunit";
import Pagination from "@/components/Pagination"
import checkPermission from '@/utils/permission'
import { upUrl, upHeaders } from "@/api/file";
export default {
components: { Pagination },
data() {
return {
fileList: [],
upUrl: upUrl(),
upHeaders: upHeaders(),
detectoryList: { count: 0 },
formData: {
detnumber: undefined,
testitem:undefined,
sampledate:undefined,
completedate:undefined,
issuancedate:undefined,
conclusion:undefined,
resultremark:undefined,
remarks:undefined
},
chargeOptions:[
{
label: "CTC代收",
value: "CTC代收",
},
{
label: "自收",
value: "自收",
}
],
inspectionOptions:[
{
label: "待检测",
value: "待检测",
},
{
label: "在检测",
value: "在检测",
}
,
{
label: "已检测",
value: "已检测",
}
],
conclusionOptions:[
{
label: "合格",
value: "合格",
},
{
label: "不合格",
value: "不合格",
}
],
listLoading: true,
listQuery: {
page: 1,
page_size: 20
},
dialogVisible: false,
dialogType: 'create',
rule1: {
},
fileList: []
};
},
created() {
this.getData();
},
methods: {
checkPermission,
getData() {
console.log(this.$route.query.taskid)
getCertappunit(this.$route.query.taskid).then(response => {
this.formData = response.data
})
},
handlePreview(file) {
if ("url" in file) {
window.open(file.url);
} else {
window.open(file.response.data.path);
}
},
handleSuccess(response, file, fileList) {
this.formData.path = response.data.path;
},
submitForm() {
this.$refs["Form"].validate(valid => {
if (!valid) return;
// TODO 提交表单
createsamplesCertappunit(this.$route.query.taskid,this.formData).then(response => {
this.$message.success('成功')
this.close(true);
});
});
},
resetForm() {
this.$refs["Form"].resetFields();
}
}
};
</script>

View File

@ -0,0 +1,152 @@
<template>
<div class="app-container">
<div style="display:flex">
<treeselect
v-model="listQuery.teststate"
:multiple="false"
:options="taskOptions"
placeholder="任务状态"
:disable-branch-nodes="true"
@input="handleFilter"
style="width: 280px" clearable/>
</div>
<div>
<el-table
v-loading="listLoading"
:data="tableData"
style="width: 100%;"
border
fit
stripe
highlight-current-row
height="380"
@row-click="rowClick"
>
<el-table-column type="index" width="50" />
<el-table-column label="状态">
<template slot-scope="scope" >{{ scope.row.teststate }}</template>
</el-table-column>
<el-table-column label="检测任务号">
<template slot-scope="scope" >{{ scope.row.detnumber }}</template>
</el-table-column>
<el-table-column label="检测单元">
<template slot-scope="scope" >{{ scope.row.certunit_.name }}</template>
</el-table-column>
<el-table-column label="样品描述">
<template slot-scope="scope" >{{ scope.row.sampledec }}</template>
</el-table-column>
<el-table-column label="收费方式">
<template slot-scope="scope" >{{ scope.row.charge }}</template>
</el-table-column>
<el-table-column label="被委托检测机构">
<template slot-scope="scope" >{{ scope.row.testorg_.name}}</template>
</el-table-column>
<el-table-column label="检验项目">
<template slot-scope="scope" >{{ scope.row.testitem}}</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="操作" width="250">
<template slot-scope="scope">
<el-button-group>
<el-button
type="primary"
size="small"
:disabled="!checkPermission(['certapps_update'])"
@click="handleCreate(scope)"
>任务反馈</el-button>
<el-button
type="primary"
size="small"
:disabled="!checkPermission(['certapps_update'])"
@click="handlestate(scope.row.id)"
>查看任务</el-button>
</el-button-group>
</template>
</el-table-column>
</el-table>
</div>
</div>
</template>
<script>
import { getTestOrgList} from "@/api/laboratory"
import { getDictList } from "@/api/dict";
import { getCertunitList } from "@/api/certunit";
import { getCertappunitList, testtaskCertappunit,teststateCertappunit } from "@/api/certappunit";
import Pagination from "@/components/Pagination";
import checkPermission from "@/utils/permission";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import { genTree } from "../../utils";
export default {
name: "Detectform",
components: { Pagination, Treeselect },
props:['certapp'],
data() {
return {
tableData: [],
listLoading: true,
taskOptions:[
{
label: "待检任务",
value: "待检任务",
},
{
label: "在检任务",
value: "在检任务",
},
{
label: "已检任务",
value: "已检任务",
}],
listQuery: {
page: 1,
page_size: 20
},
};
},
watch:{
},
created() {
this.getList();
this.getTestOptions();
this.gettunitList()
},
methods: {
checkPermission,
getList() {
this.listLoading = true;
getCertappunitList({ pageoff:true,
certapp:this.certapp}).then((response) => {
if (response.data) {
this.tableData = response.data;
}
this.listLoading = false;
});
},
handleCreate(scope) {
this.$router.push({path:"/testorg/feedback/create",query:{taskid:scope.row.id}})
},
},
};
</script>

View File

@ -0,0 +1,35 @@
# Generated by Django 3.0.7 on 2020-10-09 03:06
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('system', '0031_delete_bscodeset'),
('certificate', '0001_initial'),
]
operations = [
migrations.AlterModelOptions(
name='certificate',
options={'verbose_name': '证书', 'verbose_name_plural': '证书'},
),
migrations.RemoveField(
model_name='certificate',
name='enterprise',
),
migrations.AddField(
model_name='certificate',
name='number',
field=models.CharField(default=1, max_length=100, verbose_name='证书编号'),
preserve_default=False,
),
migrations.AddField(
model_name='certificate',
name='state',
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='system.Dict', verbose_name='证书状态'),
preserve_default=False,
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.0.7 on 2020-10-09 03:42
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('certificate', '0002_auto_20201009_1106'),
]
operations = [
migrations.RenameField(
model_name='certificate',
old_name='state',
new_name='status',
),
]

View File

@ -0,0 +1,20 @@
# Generated by Django 3.0.7 on 2020-10-09 07:50
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('crm', '0015_certunit_testorgs'),
('certificate', '0003_auto_20201009_1142'),
]
operations = [
migrations.AlterField(
model_name='certificate',
name='certunit',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='certificate_certunit', to='crm.Certunit', verbose_name='关联单元'),
),
]

View File

@ -8,8 +8,16 @@ class Certificate(CommonAModel):
""" """
证书表 证书表
""" """
certunit = models.ForeignKey('crm.Certunit', on_delete=models.CASCADE, null=True, blank=True, verbose_name='关联单元') number = models.CharField('证书编号', max_length=100)
enterprise = models.ForeignKey('crm.Enterprise', on_delete=models.CASCADE, verbose_name='所属公司') certunit = models.ForeignKey('crm.Certunit', on_delete=models.CASCADE, null=True, blank=True, verbose_name='关联单元', related_name='certificate_certunit')
first_send = models.DateField('证书首发时间') first_send = models.DateField('证书首发时间')
used_start = models.DateField('有效期开始') used_start = models.DateField('有效期开始')
used_end = models.DateField('有效期结束') used_end = models.DateField('有效期结束')
status = models.ForeignKey(Dict, verbose_name='证书状态', on_delete=models.CASCADE)
class Meta:
verbose_name = '证书'
verbose_name_plural = verbose_name
def __str__(self):
return self.number

View File

@ -0,0 +1,22 @@
from rest_framework import serializers
from .models import *
from apps.system.serializers import DictSerializer
class CertificateSerializer(serializers.ModelSerializer):
class Meta:
model = Certificate
fields = '__all__'
class CertificateCreateSerializer(serializers.ModelSerializer):
number = serializers.CharField(read_only = True)
status = serializers.CharField(read_only = True)
class Meta:
model = Certificate
fields = '__all__'
class CertificateSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Certificate
fields = ['id', 'number']

View File

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

View File

@ -1,3 +1,38 @@
from apps.certificate.serializers import CertificateSerializer
import re
from django.http import request
from rest_framework.views import APIView
from django.shortcuts import render from django.shortcuts import render
from rest_framework.serializers import ModelSerializer
from rest_framework.viewsets import ModelViewSet, GenericViewSet
from rest_framework.response import Response
from rest_framework import status
from .models import *
from apps.system.models import Dict
from apps.system.permission_data import RbacFilterSet
from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin
import random
from rest_framework.decorators import action
from utils.pagination import PageOrNot
from .serializers import *
from rest_framework.exceptions import ParseError, NotAuthenticated
from django.utils import timezone
# Create your views here. # Create your views here.
class CertificateViewSet(PageOrNot, OptimizationMixin, ModelViewSet):
perms_map = {'get': 'certificate_view', 'post':'certificate_create', 'put':'certificate_update'}
queryset = Certificate.objects.all()
serializer_class = CertificateSerializer
ordering = ['-create_time']
def create(self, request, *args, **kwargs):
"""
证书颁发
"""
serializer = CertificateCreateSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
if Certificate.objects.filter(certunit__id=request.data['certunit']).exists():
return Response('该认证单元已存在证书', status = status.HTTP_400_BAD_REQUEST)
serializer.save(create_by = self.request.user, number = 'ZS' + str(random.randrange(2000,3000)), status = Dict.objects.get(code='validate_01'))
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

View File

@ -9,6 +9,7 @@ class EnterpriseSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Enterprise model = Enterprise
fields = '__all__' fields = '__all__'
class EnterpriseListSerializer(serializers.ModelSerializer): class EnterpriseListSerializer(serializers.ModelSerializer):
type = DictSerializer() type = DictSerializer()
economy_class = DictSerializer() economy_class = DictSerializer()
@ -28,10 +29,19 @@ class EnterpriseAddressSerializer(serializers.ModelSerializer):
model = EnterpriseAddress model = EnterpriseAddress
fields = '__all__' fields = '__all__'
class SimpEnterpriseSerializer(serializers.ModelSerializer):
class Meta:
model = Enterprise
fields = ['name']
class CertunitSerializer(serializers.ModelSerializer): class CertunitSerializer(serializers.ModelSerializer):
standard_ = StandardSerializer(source='standard', read_only=True) standard_ = StandardSerializer(source='standard', read_only=True)
enterprise = serializers.CharField(read_only=True) enterprise_ = serializers.CharField(source='enterprise',read_only=True)
class Meta: class Meta:
model = Certunit model = Certunit
fields = '__all__' fields = '__all__'
class CertunitSimpleSerializer(serializers.ModelSerializer):
enterprise_ = SimpEnterpriseSerializer(source='enterprise',read_only=True)
class Meta:
model = Certunit
fields = ['id', 'name','description','enterprise','enterprise_']

View File

@ -9,6 +9,7 @@ from apps.system.permission_data import RbacFilterSet
from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import status from rest_framework import status
from rest_framework.decorators import action
# Create your views here. # Create your views here.
class EnterpriseViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet): class EnterpriseViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet):

View File

@ -0,0 +1,16 @@
# Generated by Django 3.0.5 on 2020-10-13 01:00
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('laboratory', '0008_auto_20200924_1203'),
]
operations = [
migrations.DeleteModel(
name='DetectionTask',
),
]

View File

@ -5,10 +5,10 @@ class CertAppFilter(filters.FilterSet):
noproject = filters.BooleanFilter(field_name='project', lookup_expr='isnull') noproject = filters.BooleanFilter(field_name='project', lookup_expr='isnull')
class Meta: class Meta:
model = CertApp model = CertApp
fields = ['status', 'noproject'] fields = ['state', 'noproject']
class ProjectFilter(filters.FilterSet): class ProjectFilter(filters.FilterSet):
planoff = filters.BooleanFilter(field_name='plan', lookup_expr='isnull') planoff = filters.BooleanFilter(field_name='plan', lookup_expr='isnull')
class Meta: class Meta:
model = Project model = Project
fields = ['plan', 'planoff', 'status', 'certapp_project__member_certapp__user'] fields = ['plan', 'planoff', 'state', 'certapp_project__member_certapp__user']

View File

@ -0,0 +1,14 @@
# Generated by Django 3.0.7 on 2020-10-09 03:04
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('project', '0034_evaluationdetail_result'),
('project', '0039_auto_20200929_1605'),
]
operations = [
]

View File

@ -0,0 +1,23 @@
# Generated by Django 3.0.7 on 2020-10-09 07:18
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('project', '0040_merge_20201009_1104'),
]
operations = [
migrations.AlterField(
model_name='certapp',
name='status',
field=models.CharField(choices=[('申请', '申请'), ('受理', '受理'), ('策划', '策划'), ('现场审核', '现场审核'), ('产品检测', '产品检测'), ('评定', '评定'), ('出证', '出证'), ('归档', '归档')], default='申请', max_length=50, verbose_name='申请状态'),
),
migrations.AlterField(
model_name='project',
name='status',
field=models.CharField(choices=[('创建中', '创建中'), ('待策划', '待策划'), ('策划中', '策划中'), ('审核任务已下达', '审核任务已下达'), ('审核任务已接受', '审核任务已接受'), ('待现场审核', '待现场审核'), ('现场审核中', '现场审核中'), ('任务已反馈', '任务已反馈'), ('归档', '归档')], default='创建中', max_length=50, verbose_name='项目状态'),
),
]

View File

@ -0,0 +1,23 @@
# Generated by Django 3.0.7 on 2020-10-09 07:50
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('project', '0041_auto_20201009_1518'),
]
operations = [
migrations.RenameField(
model_name='certapp',
old_name='status',
new_name='state',
),
migrations.RenameField(
model_name='project',
old_name='status',
new_name='state',
),
]

View File

@ -0,0 +1,14 @@
# Generated by Django 3.0.5 on 2020-10-13 01:00
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('project', '0042_auto_20201009_1550'),
('project', '0042_auto_20200929_1618'),
]
operations = [
]

View File

@ -0,0 +1,22 @@
# Generated by Django 3.0.5 on 2020-10-13 01:00
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('project', '0043_merge_20201013_0900'),
]
operations = [
migrations.RemoveField(
model_name='certappunit',
name='decision',
),
migrations.AddField(
model_name='certappunit',
name='teststate',
field=models.CharField(blank=True, choices=[('待提交CTC', '待提交CTC'), ('待CTC下达', '待CTC下达'), ('待实验室检验', '待实验室检验'), ('待提取报告', '待提取报告'), ('待实验室整改', '待实验室整改'), ('待评定', '待评定'), ('评定完成', '评定完成'), ('任务撤销', '任务撤销')], max_length=50, null=True, verbose_name='任务状态'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.0.5 on 2020-10-13 01:05
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('project', '0044_auto_20201013_0900'),
]
operations = [
migrations.AlterField(
model_name='certappunit',
name='teststate',
field=models.CharField(blank=True, choices=[('待提交CTC', '待提交CTC'), ('待CTC下达', '待CTC下达'), ('待实验室检验', '待实验室检验'), ('待提取报告', '待提取报告'), ('待实验室整改', '待实验室整改'), ('待评定', '待评定'), ('评定完成', '评定完成'), ('任务撤销', '任务撤销')], default='待提交CTC', max_length=50, null=True, verbose_name='任务状态'),
),
]

View File

@ -0,0 +1,20 @@
# Generated by Django 3.0.5 on 2020-10-13 03:53
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('system', '0031_delete_bscodeset'),
('project', '0045_auto_20201013_0905'),
]
operations = [
migrations.AddField(
model_name='certappunit',
name='decision',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='unitaccess_decision', to='system.Dict', verbose_name='认证决定'),
),
]

View File

@ -0,0 +1,43 @@
# Generated by Django 3.0.5 on 2020-10-15 08:35
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('project', '0046_certappunit_decision'),
]
operations = [
migrations.AddField(
model_name='certappunit',
name='completedate',
field=models.DateField(blank=True, null=True, verbose_name='完成日期'),
),
migrations.AddField(
model_name='certappunit',
name='conclusion',
field=models.CharField(blank=True, choices=[('合格', '合格'), ('不合格', '不合格')], max_length=50, null=True, verbose_name='检验结论'),
),
migrations.AddField(
model_name='certappunit',
name='issuancedate',
field=models.DateField(blank=True, null=True, verbose_name='报告签发日期'),
),
migrations.AddField(
model_name='certappunit',
name='remarks',
field=models.TextField(blank=True, null=True, verbose_name='检验反馈备注'),
),
migrations.AddField(
model_name='certappunit',
name='resultremark',
field=models.TextField(blank=True, null=True, verbose_name='不符合项目描述'),
),
migrations.AddField(
model_name='certappunit',
name='sampledate',
field=models.DateField(blank=True, null=True, verbose_name='到样日期'),
),
]

View File

@ -0,0 +1,23 @@
# Generated by Django 3.0.5 on 2020-10-19 01:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('project', '0047_auto_20201015_1635'),
]
operations = [
migrations.AddField(
model_name='certappunit',
name='path',
field=models.CharField(blank=True, max_length=1000, null=True, verbose_name='文件地址'),
),
migrations.AlterField(
model_name='certappunit',
name='teststate',
field=models.CharField(blank=True, choices=[('待提交CTC', '待提交CTC'), ('待CTC下达', '待CTC下达'), ('待实验室检验', '待实验室检验'), ('到样检测中', '到样检测中'), ('待提取报告', '待提取报告'), ('待实验室整改', '待实验室整改'), ('待评定', '待评定'), ('评定完成', '评定完成'), ('任务撤销', '任务撤销')], default='待提交CTC', max_length=50, null=True, verbose_name='任务状态'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.0.5 on 2020-10-19 02:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('project', '0048_auto_20201019_0937'),
]
operations = [
migrations.AddField(
model_name='certappunit',
name='inspectionstate',
field=models.CharField(blank=True, choices=[('CTC代收', 'CTC代收'), ('自收', '自收')], max_length=50, null=True, verbose_name='实验室检验状态'),
),
]

View File

@ -14,7 +14,7 @@ class Project(CommonBModel):
""" """
认证项目 认证项目
""" """
status_choices = ( state_choices = (
('创建中', '创建中'), ('创建中', '创建中'),
('待策划', '待策划'), ('待策划', '待策划'),
('策划中', '策划中'), ('策划中', '策划中'),
@ -22,9 +22,10 @@ class Project(CommonBModel):
('审核任务已接受', '审核任务已接受'), ('审核任务已接受', '审核任务已接受'),
('待现场审核', '待现场审核'), ('待现场审核', '待现场审核'),
('现场审核中', '现场审核中'), ('现场审核中', '现场审核中'),
('任务已反馈', '任务已反馈') ('任务已反馈', '任务已反馈'),
('归档', '归档')
) )
status = models.CharField('项目状态', choices=status_choices, default='创建中', max_length=50) state = models.CharField('项目状态', choices=state_choices, default='创建中', max_length=50)
number = models.CharField('项目编号', max_length = 100, null=True, blank=True) number = models.CharField('项目编号', max_length = 100, null=True, blank=True)
auditee = models.ForeignKey(Enterprise, related_name='project_auditee', on_delete=models.DO_NOTHING, verbose_name='受审核方') auditee = models.ForeignKey(Enterprise, related_name='project_auditee', on_delete=models.DO_NOTHING, verbose_name='受审核方')
auditee_v = JSONField(verbose_name='受审核方', default=dict) auditee_v = JSONField(verbose_name='受审核方', default=dict)
@ -49,13 +50,15 @@ class CertApp(CommonBModel):
""" """
认证受理 认证受理
""" """
status_choices = ( state_choices = (
('草稿', '草稿'), ('申请', '申请'),
('已申请', '已申请'), ('受理', '受理'),
('已受理', '已受理'), ('策划', '策划'),
('进行中', '进行中'), ('现场审核', '现场审核'),
('已中止', '已中止'), ('产品检测', '产品检测'),
('已完成', '已完成') ('评定', '评定'),
('出证', '出证'),
('归档', '归档'),
) )
result_choices = ( result_choices = (
('未评审', '未评审'), ('未评审', '未评审'),
@ -70,7 +73,7 @@ class CertApp(CommonBModel):
applicant_v = JSONField(verbose_name='申请方') applicant_v = JSONField(verbose_name='申请方')
applicant = models.ForeignKey(Enterprise, related_name='certapp_applicant', on_delete=models.DO_NOTHING) applicant = models.ForeignKey(Enterprise, related_name='certapp_applicant', on_delete=models.DO_NOTHING)
status = models.CharField('申请状态', choices=status_choices, default='草稿', max_length=50) state = models.CharField('申请状态', choices=state_choices, default='申请', max_length=50)
evresult = models.CharField('评审结论', choices = result_choices, default='未评审', max_length=50) evresult = models.CharField('评审结论', choices = result_choices, default='未评审', max_length=50)
evremark = models.TextField('备注', blank=True) evremark = models.TextField('备注', blank=True)
level = models.ForeignKey(Dict, verbose_name='业务级别', related_name='certapp_level', on_delete=models.DO_NOTHING, default=Dict.objects.get(code='ybxm').id) level = models.ForeignKey(Dict, verbose_name='业务级别', related_name='certapp_level', on_delete=models.DO_NOTHING, default=Dict.objects.get(code='ybxm').id)
@ -205,6 +208,7 @@ class Certappunit(CommonBModel):
""" """
certunit = models.ForeignKey('crm.Certunit', verbose_name='单元', on_delete=models.CASCADE, related_name='certappunit_certunit') certunit = models.ForeignKey('crm.Certunit', verbose_name='单元', on_delete=models.CASCADE, related_name='certappunit_certunit')
certapp = models.ForeignKey(CertApp, verbose_name='所属业务', on_delete = models.CASCADE, related_name='certappunit_certapp') certapp = models.ForeignKey(CertApp, verbose_name='所属业务', on_delete = models.CASCADE, related_name='certappunit_certapp')
decision = models.ForeignKey(Dict,verbose_name='认证决定', on_delete = models.CASCADE, related_name='unitaccess_decision', null=True, blank=True)
#检测任务 #检测任务
item_choices = ( item_choices = (
('规则规定的项目', '规则规定的项目'), ('规则规定的项目', '规则规定的项目'),
@ -214,6 +218,28 @@ class Certappunit(CommonBModel):
('CTC代收', 'CTC代收'), ('CTC代收', 'CTC代收'),
('自收', '自收'), ('自收', '自收'),
)
teststate_choices = (
('待提交CTC', '待提交CTC'),
('待CTC下达', '待CTC下达'),
('待实验室检验', '待实验室检验'),
('到样检测中','到样检测中'),
('待提取报告', '待提取报告'),
('待实验室整改', '待实验室整改'),
('待评定', '待评定'),
('评定完成', '评定完成'),
('任务撤销', '任务撤销'),
)
inspectionstate_choices=(
('待检验', '待检验'),
('在检验', '在检验'),
('已检验', '已检验'),
)
conclusion_choices= (
('合格', '合格'),
('不合格', '不合格'),
) )
testorg = models.ForeignKey('laboratory.TestOrg',verbose_name='检测机构',null=True, blank=True, related_name='certappunit_testorg', on_delete=models.DO_NOTHING) testorg = models.ForeignKey('laboratory.TestOrg',verbose_name='检测机构',null=True, blank=True, related_name='certappunit_testorg', on_delete=models.DO_NOTHING)
remark = models.TextField('备注', null=True, blank=True) remark = models.TextField('备注', null=True, blank=True)
@ -221,7 +247,15 @@ class Certappunit(CommonBModel):
detnumber = models.CharField('检测任务号', max_length = 100,null=True, blank=True) detnumber = models.CharField('检测任务号', max_length = 100,null=True, blank=True)
testitem = models.CharField('检测项目', choices=item_choices,null=True, blank=True, max_length=50) testitem = models.CharField('检测项目', choices=item_choices,null=True, blank=True, max_length=50)
charge = models.CharField('收费方式', choices=charge_choices,null=True, blank=True, max_length=50) charge = models.CharField('收费方式', choices=charge_choices,null=True, blank=True, max_length=50)
teststate = models.CharField('任务状态',default='待提交CTC', choices=teststate_choices,null=True, blank=True, max_length=50)
sampledate = models.DateField('到样日期',null=True, blank=True)
conclusion = models.CharField('检验结论', choices=conclusion_choices,null=True, blank=True, max_length=50)
completedate = models.DateField('完成日期',null=True, blank=True)
issuancedate = models.DateField('报告签发日期',null=True, blank=True)
resultremark = models.TextField('不符合项目描述',null=True, blank=True)
remarks = models.TextField('检验反馈备注', null=True, blank=True)
path = models.CharField('文件地址', max_length=1000, null=True, blank=True)
inspectionstate = models.CharField('实验室检验状态', choices=charge_choices,null=True, blank=True, max_length=50)
class Meta: class Meta:
verbose_name = '认证单元' verbose_name = '认证单元'
verbose_name_plural = verbose_name verbose_name_plural = verbose_name

View File

@ -1,11 +1,13 @@
from apps.project.filters import CertAppFilter
from apps.plan.models import Plan from apps.plan.models import Plan
from rest_framework import serializers from rest_framework import serializers
from .models import * from .models import *
from apps.system.serializers import DictSerializer, UserSimpleSerializer from apps.system.serializers import DictSerializer, UserSimpleSerializer, DictSimpleSerializer
from apps.certset.serializers import StandardSerializer from apps.certset.serializers import StandardSerializer
from apps.plan.serializers import PlanSerializer from apps.plan.serializers import PlanSerializer
from apps.laboratory.serializers import TestOrgSerializer
class ApplicationCreateSerializer(serializers.ModelSerializer): class ApplicationCreateSerializer(serializers.ModelSerializer):
number = serializers.CharField(required=False) number = serializers.CharField(required=False)
@ -55,11 +57,30 @@ class CertappSerializer(serializers.ModelSerializer):
queryset = queryset.prefetch_related('cnas_scopes',) queryset = queryset.prefetch_related('cnas_scopes',)
return queryset return queryset
from apps.crm.serializers import CertunitSimpleSerializer
from apps.certificate.models import Certificate
class CertappunitSerializer(serializers.ModelSerializer): class CertappunitSerializer(serializers.ModelSerializer):
certunit_ = CertunitSimpleSerializer(source = 'certunit', read_only=True)
decision_ = DictSimpleSerializer(source = 'decision', read_only=True)
testorg_ = TestOrgSerializer(source = 'testorg', read_only=True)
certificate_ = serializers.SerializerMethodField()
class Meta: class Meta:
model = Certappunit model = Certappunit
fields = '__all__' fields = '__all__'
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.select_related('certunit','testorg','decision')
return queryset
def get_certificate_(self, obj):
certificates = Certificate.objects.filter(certunit = obj.certunit).order_by('-create_time')
if certificates.exists():
certificate = certificates[0]
return {'id':certificate.id,'number':certificate.number}
return None
class EvaluationDetailSerializer(serializers.ModelSerializer): class EvaluationDetailSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = EvaluationDetail model = EvaluationDetail

View File

@ -10,6 +10,7 @@ from rest_framework import status
from .models import * from .models import *
from .serializers import * from .serializers import *
from apps.system.models import Dict from apps.system.models import Dict
from apps.laboratory.models import TestOrg
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
import random import random
@ -77,7 +78,7 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
queryset = CertApp.objects.all() queryset = CertApp.objects.all()
serializer_class = CertappSerializer serializer_class = CertappSerializer
ordering = ['-create_time'] ordering = ['-create_time']
filterset_fields = ['status', 'project'] filterset_fields = ['state', 'project']
# filterset_class = CertAppFilter # filterset_class = CertAppFilter
@ -99,7 +100,7 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
完成受理 完成受理
""" """
obj = self.get_object() obj = self.get_object()
obj.status = '已受理' obj.state = '策划'
obj.save() obj.save()
return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)
@ -127,6 +128,7 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
instance = self.get_object() instance = self.get_object()
instance.conclusion = Dict.objects.get(pk=request.data['conclusion']) instance.conclusion = Dict.objects.get(pk=request.data['conclusion'])
instance.score = request.data['score'] instance.score = request.data['score']
instance.state = '出证'
instance.save() instance.save()
instance.nonitems.clear() instance.nonitems.clear()
instance.nonitems.add(*request.data['nonitems']) instance.nonitems.add(*request.data['nonitems'])
@ -155,11 +157,12 @@ class EvaluationDetailViewset(CreateUpdateCustomMixin, PageOrNot,ModelViewSet):
return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)
from rest_framework.mixins import ListModelMixin
class CertappunitViewset(PageOrNot, ListModelMixin, GenericViewSet): class CertappunitViewset(PageOrNot, ModelViewSet):
perms_map={'*':'certapp_view'} perms_map={'get': '*', '*':'certapp_view'}
queryset = Certappunit.objects.all() queryset = Certappunit.objects.all()
serializer_class = CertappunitSerializer serializer_class = CertappunitSerializer
filterset_fields = ['certapp']
ordering= ['-id'] ordering= ['-id']
@action(methods=['put'], detail=True, perms_map={'put':'certapp_access'}, url_name='certappunit_access') @action(methods=['put'], detail=True, perms_map={'put':'certapp_access'}, url_name='certappunit_access')
@ -168,9 +171,64 @@ class CertappunitViewset(PageOrNot, ListModelMixin, GenericViewSet):
单元评定 单元评定
""" """
obj = self.get_object() obj = self.get_object()
if request.data['decision']:
obj.decision = Dict.objects.get(pk=request.data['decision']) obj.decision = Dict.objects.get(pk=request.data['decision'])
else:
obj.decision = None
obj.save() obj.save()
return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)
@action(methods=['put'], detail=True, perms_map={'put':'certapp_testtask'}, url_name='certappunit_testtask')
def testtask(self, request, pk=None):
"""
检测任务
"""
obj = self.get_object()
obj.testorg = TestOrg.objects.get(pk=request.data['testorg'])
obj.remark = request.data['remark']
obj.sampledec = request.data['sampledec']
obj.detnumber = request.data['detnumber']
obj.testitem = request.data['testitem']
obj.charge = request.data['charge']
obj.save()
return Response(status=status.HTTP_200_OK)
@action(methods=['put'], detail=True, perms_map={'put':'certapp_teststate'}, url_name='certappunit_teststate')
def teststate(self, request, pk=None):
"""
修改检测任务状态
"""
obj = self.get_object()
if obj.teststate == "待CTC下达":
obj.teststate = request.data['teststate']
obj.inspectionstate = "待检验"
obj.save()
return Response(status=status.HTTP_200_OK)
else:
return Response('检测任务异常,操作失败', status=status.HTTP_400_BAD_REQUEST)
@action(methods=['put'], detail=True, perms_map={'put':'certapp_createsamples'}, url_name='certappunit_createsamples')
def createsamples(self, request, pk=None):
"""
实验室任务反馈
"""
obj = self.get_object()
obj.sampledate = request.data['sampledate']
obj.inspectionstate = request.data['inspectionstate']
if request.data['inspectionstate']=="已检测":
obj.teststate = '待评定'
else:
obj.teststate = '到样检测中'
obj.path = request.data['path']
obj.conclusion = request.data['conclusion']
obj.completedate = request.data['completedate']
obj.issuancedate = request.data['issuancedate']
obj.resultremark = request.data['resultremark']
obj.remarks = request.data['remarks']
obj.save()
return Response(status=status.HTTP_200_OK)
class ProjectViewSet(RbacFilterSet, ModelViewSet): class ProjectViewSet(RbacFilterSet, ModelViewSet):
perms_map = {'get': 'project_view', 'post':'project_create', 'put':'project_update','delete': 'project_delete'} perms_map = {'get': 'project_view', 'post':'project_create', 'put':'project_update','delete': 'project_delete'}
@ -193,7 +251,7 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet):
if self.request.user is not None: if self.request.user is not None:
instance = serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept) instance = serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept)
if 'certapps' in postdata and postdata['certapps']: if 'certapps' in postdata and postdata['certapps']:
CertApp.objects.filter(pk__in = postdata['certapps']).update(project=instance, status='进行中') CertApp.objects.filter(pk__in = postdata['certapps']).update(project=instance, state='进行中')
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)
else: else:
@ -206,12 +264,12 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet):
项目流转 项目流转
""" """
obj = self.get_object() obj = self.get_object()
if obj.status == '创建中': if obj.state == '创建中':
obj.status = '待策划' obj.state = '待策划'
obj.save() obj.save()
return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)
elif obj.status == '策划中' and obj.can_paichai: elif obj.state == '策划中' and obj.can_paichai:
obj.status = '待现场审核' obj.state = '待现场审核'
obj.save() obj.save()
return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)
else: else:
@ -230,8 +288,8 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet):
objs = Project.objects.filter(pk__in=projects) objs = Project.objects.filter(pk__in=projects)
for i in objs: for i in objs:
i.plan=plan i.plan=plan
if i.status == '待策划': if i.state == '待策划':
i.status == '策划中' i.state == '策划中'
i.save() i.save()
return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)

View File

@ -39,6 +39,11 @@ class DictSerializer(serializers.ModelSerializer):
# return obj.code + obj.name # return obj.code + obj.name
# return obj.name # return obj.name
class DictSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Dict
fields = ['pk', 'name', 'code']
class PositionSerializer(serializers.ModelSerializer): class PositionSerializer(serializers.ModelSerializer):
""" """
岗位序列化 岗位序列化

View File

@ -40,6 +40,7 @@ urlpatterns = [
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')),
path('certificate/', include('apps.certificate.urls')),
# path('accessment/', include('apps.accessment.urls')), # path('accessment/', include('apps.accessment.urls')),
path('docs/', include_docs_urls(title="接口文档", path('docs/', include_docs_urls(title="接口文档",
authentication_classes=[], permission_classes=[])), authentication_classes=[], permission_classes=[])),