业务流程状态梳理

This commit is contained in:
caoqianming 2020-10-19 15:13:08 +08:00
parent de4b832165
commit 2242cf1edd
26 changed files with 696 additions and 467 deletions

View File

@ -39,9 +39,9 @@ export function getProject(id) {
})
}
export function nextProject(id) {
export function assginProject(id) {
return request({
url: `/project/project/${id}/next/`,
url: `/project/project/${id}/assgin/`,
method: 'put'
})
}
@ -60,4 +60,11 @@ export function planProject(data) {
method: 'put',
data
})
}
export function acceptAudit(id) {
return request({
url: `/project/project/${id}/accept/`,
method: 'put',
})
}

View File

@ -68,17 +68,17 @@ export const asyncRoutes = [
name: 'ProjectManage',
meta: { title: '认证项目', icon: 'example'},
children: [
{
path: 'application',
name: 'Applicaion',
component: () => import('@/views/application/application'),
meta: { title: '业务受理2', icon: 'example', perms: ['application_view'] }
},
// {
// path: 'application',
// name: 'Applicaion',
// component: () => import('@/views/application/application'),
// meta: { title: '业务受理2', icon: 'example', perms: ['application_view'] }
// },
{
path: 'certapp',
name: 'Certapp',
component: () => import('@/views/certapp/certapp'),
meta: { title: '业务受理1', icon: 'example', perms: ['certapp_view'] }
meta: { title: '业务受理', icon: 'example', perms: ['certapp_view'] }
},
// {
// path: 'application2',

View File

@ -100,4 +100,7 @@ div:focus {
}
// .el-button {
// border-radius: 0px;
// }
// }
.el-tabs__header {
margin: 0 0 6px;
}

View File

@ -71,14 +71,9 @@
<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">
<!-- <el-button
type="danger"
size="small"
:disabled="!checkPermission(['certapps_update'])"
@click="handleDelete(scope)"
>删除</el-button> -->
<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="认证决定">

View File

@ -42,7 +42,7 @@
</el-table>
<el-row :gutter="6">
<el-col :xs="24" :md="12">
<el-card style="margin-top:6px">
<el-card style="margin-top:6px" v-if="$route.params.action=='member'">
<div slot="header" class="clearfix">
<span>成员配置</span>
</div>
@ -99,7 +99,7 @@
</el-card>
</el-col>
<el-col :xs="24" :md="12">
<el-card style="margin-top:6px">
<el-card style="margin-top:6px" v-if="$route.params.action=='feedback'">
<div slot="header" class="clearfix">
<span>审核员参与天数/人日数</span>
</div>
@ -136,7 +136,8 @@
</el-col>
</el-row>
<el-row style="text-align:right;">
<el-button type="warning" @click="saveDays">保存</el-button>
<el-button type="warning" @click="saveDays"
>保存</el-button>
</el-row>
</el-form>
</el-card>

View File

@ -1,198 +1,245 @@
<template>
<div class="app-container">
<el-card style="margin-top:6px">
<div slot="header" class="clearfix">
<span>我的项目</span>
</div>
<el-row :gutter="6">
<el-col :xs="24" :md="6">
<el-card >
<el-row :gutter="6">
<el-col :xs="24" :md="3">
<el-select
v-model="listQuery.state"
placeholder="接受状态"
clearable
class="filter-item"
@change="handleFilter"
>
<el-option label="全部" value=""/>
<el-option label="待接受" value="审核任务已下达"/>
</el-select>
</el-col>
<el-col :xs="24" :md="6">
<el-input
v-model="listQuery.search"
placeholder="受审核方/所属计划"
class="filter-item"
@keyup.enter.native="handleFilter"
/>
</el-col>
<el-col :xs="24" :md="6">
<el-button-group>
<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>
</el-button-group>
</el-col>
</el-row>
<el-table
v-loading="listLoading"
:data="projectData.results"
style="width: 100%;margin-top:6px"
border
fit
stripe
highlight-current-row
height="300"
@row-click = "handleRclick"
>
<el-table-column type="selection" width="55"></el-table-column>
<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" v-if="scope.row.plan">{{ scope.row.plan_.name }}</template>
</el-table-column>
<el-table-column label="受审核方" >
<template slot-scope="scope">{{ scope.row.auditee_v.name }}</template>
</el-table-column>
<el-table-column label="业务信息" >
<template slot-scope="scope" v-if="scope.row.certapps">
<el-tag
v-for="(item, index) in scope.row.certapps"
:key="index"
style="margin:2px"
>{{item}}</el-tag>
</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" v-if="scope.row.members">
<!-- <el-tooltip effect="dark" :content="item.identity_?item.identity_.name:'组员' " placement="top-start" > -->
<el-tag style="margin:2px" :type="item.is_leader?'danger':''" effect="plain" v-for="(item, index) in scope.row.members" :key="index">
{{item.user_.name}}
</el-col>
<el-col :xs="24" :md="6">
<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
>
</el-col>
</el-row>
<el-table
v-loading="listLoading"
:data="projectData.results"
style="width: 100%; margin-top: 6px"
border
fit
stripe
highlight-current-row
height="320"
@row-click="handleRclick"
>
<el-table-column type="selection" width="55"></el-table-column>
<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" v-if="scope.row.plan">{{
scope.row.plan_.name
}}</template>
</el-table-column>
<el-table-column label="受审核方">
<template slot-scope="scope">{{ scope.row.auditee_v.name }}</template>
</el-table-column>
<el-table-column label="业务信息">
<template slot-scope="scope" v-if="scope.row.certapps">
<el-tag
v-for="(item, index) in scope.row.certapps"
:key="index"
style="margin: 2px"
>{{ item }}</el-tag
>
</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" v-if="scope.row.members">
<!-- <el-tooltip effect="dark" :content="item.identity_?item.identity_.name:'组员' " placement="top-start" > -->
<el-tag
style="margin: 2px"
:type="item.is_leader ? 'danger' : ''"
effect="plain"
v-for="(item, index) in scope.row.members"
:key="index"
>
{{ item.user_.name }}
</el-tag>
<!-- </el-tooltip> -->
</template>
</el-table-column>
<el-table-column label="创建日期" width="190">
<template slot-scope="scope">
<span>{{ scope.row.create_time }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="300" fixed="right">
<template slot-scope="scope">
<el-button-group>
<el-button
type="primary"
size="small"
:disabled="!checkPermission(['project_update'])"
@click="handleTask(scope)"
>处理</el-button>
<el-button
type="danger"
size="small"
:disabled="!checkPermission(['project_delete'])"
@click="handleDetailProject(scope)"
>详情</el-button>
</el-button-group>
</template>
</el-table-column>
</el-table>
<pagination
v-show="projectData.count>0"
:total="projectData.count"
:page.sync="listQuery.page"
:limit.sync="listQuery.page_size"
@pagination="getProjectList_"
/>
</el-card>
<el-card style="margin-top:6px">
<div slot="header" class="clearfix">
<span>项目下我的业务</span>
</div>
<el-table
v-loading="listLoading2"
:data="certappData"
style="width: 100%;margin-top:6px"
border
fit
stripe
highlight-current-row
height="300"
>
<el-table-column type="index" width="55"></el-table-column>
<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" v-if="scope.row.members">
<el-tooltip effect="dark" :content="item.identity_?item.identity_.name:'' " placement="top-start" v-for="(item, index) in scope.row.members" :key="index">
<el-tag style="margin:2px" :type="item.is_leader?'danger':''" effect="plain" >
{{item.user_.name}}
</el-tag>
</template>
</el-table-column>
<el-table-column label="创建日期" width="190">
<template slot-scope="scope">
<span>{{ scope.row.create_time }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="300" fixed="right">
<template slot-scope="scope">
<el-button
v-if="scope.row.state=='审核任务已下达'"
type="primary"
size="small"
:disabled="!checkPermission(['audit_accept'])"
@click="handleAccept(scope)"
>接受任务</el-button
>
<el-button
size="small"
:disabled="!checkPermission(['project_delete'])"
@click="handleDetailProject(scope)"
>详情</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="projectData.count > 0"
:total="projectData.count"
:page.sync="listQuery.page"
:limit.sync="listQuery.page_size"
@pagination="getProjectList_"
/>
</el-card>
<el-card style="margin-top: 6px">
<div slot="header" class="clearfix">
<span>项目下我的业务</span>
</div>
<el-table
v-loading="listLoading2"
:data="certappData"
style="width: 100%; margin-top: 6px"
border
fit
stripe
highlight-current-row
height="300"
>
<el-table-column type="index" width="55"></el-table-column>
<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" v-if="scope.row.members">
<el-tooltip
effect="dark"
:content="item.identity_ ? item.identity_.name : ''"
placement="top-start"
v-for="(item, index) in scope.row.members"
:key="index"
>
<el-tag
style="margin: 2px"
:type="item.is_leader ? 'danger' : ''"
effect="plain"
>
{{ item.user_.name }}
</el-tag>
</el-tooltip>
</template>
</el-table-column>
<el-table-column label="创建日期" width="190">
<template slot-scope="scope">
<span>{{ scope.row.create_time }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="300" fixed="right">
<template slot-scope="scope">
<el-button-group>
<el-button
type="primary"
size="small"
:disabled="!checkPermission(['certapp_feedback'])"
@click="handleCertappFeedback(scope)"
>反馈</el-button>
<el-button
type="danger"
size="small"
:disabled="!checkPermission(['certapp_detail'])"
@click="handleCertappDetail(scope)"
>详情</el-button>
</el-button-group>
</template>
</el-table-column>
</el-table>
</el-card>
</template>
</el-table-column>
<el-table-column label="创建日期" width="190">
<template slot-scope="scope">
<span>{{ scope.row.create_time }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="300" fixed="right">
<template slot-scope="scope">
<el-button
type="primary"
size="small"
:disabled="!checkPermission(['certapp_feedback']) || projectstate != '现场审核中'"
@click="handleCertappFeedback(scope)"
>反馈</el-button
>
<el-button
type="danger"
size="small"
:disabled="!checkPermission(['certapp_detail'])"
@click="handleCertappDetail(scope)"
>详情</el-button
>
</template>
</el-table-column>
</el-table>
</el-card>
</div>
</template>
<script>
import { getProjectList } from "@/api/project";
import { getAuditTaskList, getAuditCertappList } from "@/api/audit"
import { getProjectList, acceptAudit } from "@/api/project";
import { getAuditTaskList, getAuditCertappList } from "@/api/audit";
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";
import router from '@/router';
import store from '@/store'
import router from "@/router";
import store from "@/store";
export default {
components: { Pagination, Treeselect },
data() {
return {
projectstate:'',
listLoading: false,
listLoading2: false,
listQuery: {
@ -200,11 +247,10 @@ export default {
page_size: 20,
},
projectData: { count: 0, results: [] },
certappData: []
certappData: [],
};
},
watch: {
},
watch: {},
created() {
this.getProjectList_();
},
@ -223,8 +269,8 @@ export default {
this.listQuery = {
page: 1,
page_size: 20,
}
this.getProjectList_()
};
this.getProjectList_();
},
handleFilter() {
this.getProjectList_();
@ -235,12 +281,23 @@ export default {
params: { id: scope.row.id },
});
},
handleRclick(row, column, event){
this.listLoading2 = true
getAuditCertappList({project:row.id, pageoff:true}).then(res=>{
this.certappData = res.data
this.listLoading2 = false
}).catch(e=>{this.listLoading2=false})
handleRclick(row, column, event) {
this.listLoading2 = true;
this.projectstate = row.state
getAuditCertappList({ project: row.id, pageoff: true })
.then((res) => {
this.certappData = res.data;
this.listLoading2 = false;
})
.catch((e) => {
this.listLoading2 = false;
});
},
handleAccept(scope) {
acceptAudit(scope.row.id).then(res=>{
this.getProjectList_()
this.$message.success('成功')
}).catch(e=>{})
},
handleCertappFeedback(scope) {
this.$router.push({
@ -249,10 +306,16 @@ export default {
});
},
handleCertappDetail(scope) {
this.$router.push({
this.$router.push({
name: "Certappdetail",
params: { id: scope.row.id },
});
},
handleDetailProject(scope) {
this.$router.push({
name: "AuditProject",
params: { id: scope.row.id },
});
}
},
};

View File

@ -16,7 +16,7 @@
<QMSform @handleCommit="save" :certapp="certappdata" v-if="kind=='QMS'&isLoad"></QMSform>
</el-tab-pane>
<el-tab-pane label="产品单元" name="Certunit" v-if="certapp" lazy>
<Certunit :certapp="certapp" :key="time2"></Certunit>
<Certunit :certapp="certapp" :key="Certunitkey"></Certunit>
</el-tab-pane>
<el-tab-pane label="原材料供应商" name="Certunit1" v-if="certapp" lazy>
</el-tab-pane>
@ -42,9 +42,9 @@
<Detectiontask :certapp="certapp"></Detectiontask>
</el-tab-pane>
<el-tab-pane label="认证评定" name="Certappaccess" v-if="certapp" lazy>
<access :certapp="certapp"></access>
<access :certapp="certapp" :key="Certappaccesskey"></access>
</el-tab-pane>
<el-tab-pane label="证书颁发" name="Certissue" v-if="certapp" lazy>
<el-tab-pane label="证书颁发/通知" name="Certissue" v-if="certapp" lazy>
<issue :certapp="certapp"></issue>
</el-tab-pane>
</el-tabs>
@ -105,7 +105,7 @@ export default {
content: '创建成功',
timestamp: '2018-04-11'
}],
time2:'',
Certunitkey:'',
};
},
computed: {},
@ -119,7 +119,9 @@ export default {
methods: {
handleLoad(){
if(this.activeName=="Certunit"){
this.time2 = new Date().getTime()
this.Certunitkey = new Date().getTime()
}else if(this.activeName == "Certappaccess"){
this.Certappaccesskey = new Date().getTime()
}
},
getParams(){

View File

@ -1,6 +1,7 @@
<template>
<div class="app-container">
<div style="display:flex">
<el-row :gutter="6">
<!-- <el-col :xs="24" :md="4">
<treeselect
v-model="listQuery.user__dept"
:multiple="false"
@ -8,15 +9,18 @@
placeholder="所属组织"
:disable-branch-nodes="true"
@input="handleFilter"
style="width: 280px" clearable/>
style="width: 100%" clearable/>
</el-col> -->
<el-col :xs="24" :md="4">
<el-input
v-model="listQuery.search"
placeholder="姓名/易记码/编号/注册领域"
style="width: 300px;margin-left:10px"
placeholder="证书编号/企业/产品单元"
style="width: 100%"
class="filter-item"
@keyup.enter.native="handleFilter"
/>
</el-col>
<el-col :xs="24" :md="4">
<el-button
class="filter-item"
type="primary"
@ -28,8 +32,9 @@
type="primary"
icon="el-icon-refresh-left"
@click="resetFilter"
>刷新重置</el-button>
</div>
>刷新</el-button>
</el-col>
</el-row>
<el-table
v-loading="listLoading"
:data="tableData.results"
@ -41,43 +46,48 @@
>
<el-table-column type="index" width="50" />
<el-table-column label="申请单">
<el-table-column label="证书">
<template slot-scope="scope" v-if="scope.row.number">{{ scope.row.number }}</template>
</el-table-column>
<el-table-column label="认证领域/分类">
<el-table-column label="企业" width="300px">
<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>
{{ scope.row.enterprise_.name}}
</template>
</el-table-column>
<el-table-column label="申请信息" width="300px">
<el-table-column label="认证单元">
<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>
{{ scope.row.certunit_.name}}
</template>
</el-table-column>
<el-table-column label="当前状态">
<el-table-column label="证书状态">
<template slot-scope="scope">
{{ scope.row.state}}
{{ scope.row.status_.name}}
</template>
</el-table-column>
<el-table-column label="首发日期">
<template slot-scope="scope">
<span>{{ scope.row.first_send }}</span>
</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="创建日期">
<el-table-column label="有效期开始">
<template slot-scope="scope">
<span>{{ scope.row.create_time }}</span>
<span>{{ scope.row.used_start }}</span>
</template>
</el-table-column>
<el-table-column label="有效期结束">
<template slot-scope="scope">
<span>{{ scope.row.used_end }}</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right">
<template slot-scope="scope" >
<el-button
<!-- <el-button
type="primary"
size="small"
:disabled="!checkPermission(['certapp_accessment'])"
@click="handleAccessment(scope)"
>评定</el-button>
>评定</el-button> -->
<el-button
size="small"
:disabled="!checkPermission(['certapp_detail'])"
@ -97,7 +107,7 @@
</div>
</template>
<script>
import { getCertappList, deleteCertapp } from "@/api/certapp"
import { getCertificateList } from "@/api/certificate"
import { getOrgList } from "@/api/org"
import { getDictList } from "@/api/dict"
import Pagination from "@/components/Pagination"
@ -122,13 +132,12 @@ export default {
created() {
this.getList()
this.getdeptOptions()
this.getfields()
},
methods: {
checkPermission,
getList() {
this.listLoading = true;
getCertappList(this.listQuery).then(response => {
getCertificateList(this.listQuery).then(response => {
if (response.data) {
this.tableData = response.data
}
@ -151,30 +160,6 @@ export default {
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 },
});
},
handleAccessment(scope) {
this.$router.push({
name: "Certappaccess",
params: { id: scope.row.id, action:'access' },
});
}
}
};
</script>

View File

@ -14,16 +14,16 @@
<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" v-if="scope.row.certificate_">
{{scope.row.certificate_.number}}
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
@ -32,6 +32,11 @@
:disabled="!checkPermission(['certificate_issue'])"
@click="handleIssue(scope)"
>发证</el-button>
<el-button
size="small"
:disabled="!checkPermission(['certificate_issue'])"
@click="handleIssue(scope)"
>发通知书</el-button>
</template>
</el-table-column>
</el-table>

View File

@ -189,20 +189,20 @@
<template slot-scope="scope">
<el-button-group>
<el-button
v-if="scope.row.state =='策划中'"
type="primary"
size="small"
:disabled="!checkPermission(['project_update'])"
@click="planProject(scope)"
>计划</el-button>
<el-button
v-if="scope.row.state !='待现场审核'"
v-if="scope.row.state =='策划中'"
type="primary"
size="small"
:disabled="!checkPermission(['project_assgin'])||!scope.row.can_paichai"
@click="nextProject(scope)"
@click="assginProject(scope)"
>任务下达</el-button>
<el-button
type="danger"
size="small"
:disabled="!checkPermission(['project_delete'])"
@click="handleDetailProject(scope)"
@ -241,7 +241,6 @@
</div>
</template>
<script>
import { nextProject } from "@/api/project"
import { getCertappList } from "@/api/certapp";
import { getPlanList, createPlan, updatePlan, deletePlan } from "@/api/plan";
import {
@ -445,10 +444,10 @@ export default {
this.listLoadingplan2 = false
})
},
nextProject(scope) {
assginProject(scope) {
this.$confirm("确定下达审核任务?", "警告", { type: "warning" }).then(
() => {
nextProject(scope.row.id).then((res) => {
assginProject(scope.row.id).then((res) => {
this.$message.success("成功");
this.getProjectList_2();
});

View File

@ -160,29 +160,25 @@
</el-table-column>
<el-table-column label="操作" width="300" fixed="right">
<template slot-scope="scope">
<el-button-group>
<el-button
v-if="$route.name == 'AuditProject'"
type="primary"
size="small"
:disabled="!checkPermission(['certapp_detail'])"
:disabled="!checkPermission(['certapp_detail']) || project.state != '现场审核中'"
@click="handleFeedback(scope)"
>反馈</el-button>
<el-button
v-if="$route.name == 'PlanProject'"
v-if="$route.name == 'PlanProject'"
type="primary"
size="small"
:disabled="!checkPermission(['certapp_detail'])"
:disabled="!checkPermission(['certapp_detail']) || project.state != '策划中'"
@click="handlePlan(scope)"
>派人</el-button>
<el-button
type="primary"
size="small"
:disabled="!checkPermission(['certapp_detail'])"
@click="handleDetail(scope)"
>详情</el-button>
</el-button-group>
</template>
</el-table-column>
</el-table>
@ -295,7 +291,6 @@
fit
stripe
highlight-current-row
height="160"
@row-click="handleMClick"
>
<el-table-column label="姓名">
@ -309,8 +304,18 @@
<el-table-column label="身份">
<template slot-scope="scope" v-if="scope.row.identity">{{ scope.row.identity_.name }}</template>
</el-table-column>
<el-table-column label="是否接受">
<template slot-scope="scope">
<el-switch
v-model="scope.row.is_accepted"
disabled
active-color="#13ce66"
inactive-color="#ff0000"
></el-switch>
</template>
</el-table-column>
</el-table>
<el-form
<!-- <el-form
ref="elForm2"
:model="formDataMember"
label-width="80px"
@ -355,7 +360,7 @@
<el-button @click="resetForm2" size="mini">重置</el-button>
</el-button-group>
</div>
</el-form>
</el-form> -->
</el-card>
</el-col>
<el-col :xs="24" :md="8">
@ -408,9 +413,9 @@
</el-col>
</el-row>
<el-row>
<div style="text-align:right;" v-if="$route.name=='AuditProject'">
<div style="text-align:center;" v-if="$route.name=='AuditProject'">
<el-button-group>
<el-button type="primary" @click="createNewRecord" size="mini">提交反馈</el-button>
<el-button type="primary" @click="createNewRecord" :disabled="project.state != '现场审核中'">提交反馈</el-button>
</el-button-group>
</div>
</el-row>
@ -573,13 +578,13 @@ export default {
getContactRecordList_() {
getContactRecordList({
pageoff: true,
project: this.$route.query.project,
project: this.$route.params.id,
}).then((res) => {
this.contactData = res.data;
});
},
getMemberList_() {
getMemberList({ project: this.$route.query.project, pageoff: true }).then(
getMemberList({ certapp__project: this.$route.params.id, pageoff: true }).then(
(res) => {
this.memberData = res.data;
}
@ -615,7 +620,7 @@ export default {
if (val) {
this.$confirm("确定标记为可派差?", "提示", {})
.then(() => {
updateProject(this.$route.query.project, {
updateProject(this.$route.params.id, {
can_paichai: true,
}).then((res) => {
this.$message.success("成功");

View File

@ -188,12 +188,13 @@ export default {
data() {
return {
certapps_data:[],
certappData: [],
certappData: {count:0,results:[]},
listLoading: true,
listQuery: {
page:1,
page_size:20,
state: "已受理",
state: "策划",
noproject:true
},
listQuery_project: {
page:1,
@ -262,7 +263,8 @@ export default {
},
resetFilter() {
this.listQuery = {
state: "已受理",
state: "策划",
noproject:true
};
this.getCertappList_();
},

View File

@ -3,7 +3,7 @@ from rest_framework import serializers
from .models import *
from apps.system.serializers import DictSerializer, UserListSerializer
from apps.system.serializers import DictSimpleSerializer, UserListSerializer
from apps.project.models import Project
from apps.plan.models import Member
from apps.project.serializers import PlanSerializer
@ -25,7 +25,7 @@ class ProjectSerializerX(serializers.ModelSerializer):
def get_members(self, obj):
queryset = obj.certapp_project.all()
members = Member.objects.filter(certapp__in=queryset, is_accepted=True, is_deleted=False).distinct('is_leader','user').order_by('-is_leader')
members = Member.objects.filter(certapp__in=queryset, is_deleted=False).distinct('is_leader','user').order_by('-is_leader')
serializer = MemberSerializer(members, many=True)
return serializer.data
@ -38,9 +38,9 @@ class ProjectSerializerX(serializers.ModelSerializer):
return queryset
class CertappSerializerX(serializers.ModelSerializer):
cert_field_ = DictSerializer(source='cert_field', read_only=True)
cccpv_class_ = DictSerializer(source='cccpv_class' , read_only=True)
cnas_scopes_ = DictSerializer(source='cnas_scopes', many=True , read_only=True)
cert_field_ = DictSimpleSerializer(source='cert_field', read_only=True)
cccpv_class_ = DictSimpleSerializer(source='cccpv_class' , read_only=True)
cnas_scopes_ = DictSimpleSerializer(source='cnas_scopes', many=True , read_only=True)
create_by_ = UserListSerializer(source='create_by', read_only=True)
accept_by_ = UserListSerializer(source='accept_by', read_only=True)
members = serializers.SerializerMethodField()
@ -56,6 +56,6 @@ class CertappSerializerX(serializers.ModelSerializer):
return queryset
def get_members(self, obj):
members = Member.objects.filter(certapp=obj, is_accepted=True, is_deleted=False).order_by('-is_leader')
members = Member.objects.filter(certapp=obj, is_deleted=False).order_by('-is_leader')
serializer = MemberSerializer(members, many=True)
return serializer.data

View File

@ -20,4 +20,4 @@ class Certificate(CommonAModel):
verbose_name_plural = verbose_name
def __str__(self):
return self.number
return self.number

View File

@ -1,14 +1,24 @@
from apps.crm.models import Certunit, Enterprise
from rest_framework import serializers
from .models import *
from apps.system.serializers import DictSerializer
from apps.system.serializers import DictSimpleSerializer
from apps.crm.serializers import EnterpriseSimpleSerializer
from apps.crm.serializers import CertunitSimpleSerializer
class CertificateSerializer(serializers.ModelSerializer):
status_ = DictSimpleSerializer(source='status', read_only=True)
enterprise_ = EnterpriseSimpleSerializer(source='certunit.enterprise', read_only=True)
certunit_ = CertunitSimpleSerializer(source='certunit', read_only=True)
class Meta:
model = Certificate
fields = '__all__'
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.select_related('certunit','certunit__enterprise')
return queryset
class CertificateCreateSerializer(serializers.ModelSerializer):
number = serializers.CharField(read_only = True)
status = serializers.CharField(read_only = True)
@ -19,4 +29,10 @@ class CertificateCreateSerializer(serializers.ModelSerializer):
class CertificateSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Certificate
fields = ['id', 'number']
fields = ['id', 'number']
# class CertificateListSerializer(serializers.ModelSerializer):
# status_ = DictSerializer(source='status', read_only=True)
# class Meta:
# model = Certificate
# fields = '__all__'

View File

@ -24,6 +24,8 @@ class CertificateViewSet(PageOrNot, OptimizationMixin, ModelViewSet):
queryset = Certificate.objects.all()
serializer_class = CertificateSerializer
ordering = ['-create_time']
filterset_fields = ['number', 'certunit__unittype']
search_fields = ['number', 'certunit__name', 'certunit__enterprise__name']
def create(self, request, *args, **kwargs):
"""

View File

@ -39,4 +39,9 @@ class CertunitSerializer(serializers.ModelSerializer):
class CertunitSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Certunit
fields = ['id', 'name']
class EnterpriseSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Enterprise
fields = ['id', 'name']

View File

@ -43,11 +43,13 @@ class MemberViewSet(CreateUpdateCustomMixin, PageOrNot, ModelViewSet):
queryset = Member.objects.all()
serializer_class = MemberSerializer
ordering = ['-is_leader', 'pk']
filterset_fields = ['certapp']
filterset_fields = ['certapp', 'certapp__project']
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
if CertApp.object.get(pk=request.data['certapp'])!='策划':
return Response('业务状态异常,操作失败', status = status.HTTP_400_BAD_REQUEST)
if Member.objects.filter(user = request.data['user'], certapp=request.data['certapp'], is_deleted=False).exists():
return Response('已存在该成员', status= status.HTTP_400_BAD_REQUEST)
self.perform_create(serializer)

View File

@ -1,5 +1,4 @@
from apps.project.views import ApplicationViewSet
from django.contrib import admin
from .models import *
# Register your models here.
admin.site.register(Application)

View File

@ -0,0 +1,82 @@
# Generated by Django 3.0.7 on 2020-10-14 04:15
from django.conf import settings
import django.contrib.postgres.fields.jsonb
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),
('project', '0042_auto_20201009_1550'),
]
operations = [
migrations.CreateModel(
name='CertAppFlow',
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='删除标记')),
('operation', models.TextField(verbose_name='操作描述')),
('remark', models.TextField(blank=True, default='', verbose_name='操作备注')),
('state', models.CharField(max_length=200, verbose_name='业务状态')),
('data', django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True, verbose_name='certapp数据json')),
('certapp', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='project.CertApp', verbose_name='业务')),
('hander', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='处理人')),
],
options={
'abstract': False,
},
),
migrations.RemoveField(
model_name='subapplication',
name='application',
),
migrations.RemoveField(
model_name='subapplication',
name='belong_dept',
),
migrations.RemoveField(
model_name='subapplication',
name='cccpv_class',
),
migrations.RemoveField(
model_name='subapplication',
name='cert_field',
),
migrations.RemoveField(
model_name='subapplication',
name='cnas_scopes',
),
migrations.RemoveField(
model_name='subapplication',
name='create_by',
),
migrations.RemoveField(
model_name='subapplication',
name='factory',
),
migrations.RemoveField(
model_name='subapplication',
name='manufacture',
),
migrations.RemoveField(
model_name='subapplication',
name='project',
),
migrations.RemoveField(
model_name='subapplication',
name='update_by',
),
migrations.DeleteModel(
name='Application',
),
migrations.DeleteModel(
name='SubApplication',
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.0.7 on 2020-10-14 06:12
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('project', '0043_auto_20201014_1215'),
]
operations = [
migrations.RenameField(
model_name='certappflow',
old_name='hander',
new_name='handler',
),
]

View File

@ -1,3 +1,4 @@
from django.contrib.postgres.fields.jsonb import JsonAdapter
from utils import model
from django.contrib.postgres.fields import JSONField
from django.db import models
@ -11,6 +12,76 @@ from apps.system.models import CommonAModel, CommonBModel, Dict, User
# Create your models here.
# class Application(CommonBModel):
# """
# 主申请
# """
# status_choices = (
# ('草稿', '草稿'),
# ('已申请', '已申请'),
# ('已受理', '已受理'),
# ('进行中', '进行中'),
# ('已中止', '已中止'),
# ('已完成', '已完成')
# )
# result_choices = (
# ('未评审', '未评审'),
# ('合格', '合格'),
# ('不合格', '不合格'),
# ('有条件放行', '有条件放行')
# )
# stage_choices = (
# (0, '基本信息'),
# (1, '申请内容')
# )
# number = models.CharField('申请编号', max_length = 100)
# apply_date = models.DateField('申请日期', null=True, blank=True)
# accept_date = models.DateField('受理日期', null=True, blank=True)
# applicant_v = JSONField(verbose_name='申请方')
# applicant = models.ForeignKey(Enterprise, related_name='application_applicant', on_delete=models.DO_NOTHING)
# fields = models.TextField('认证领域', blank=True)
# status = models.CharField('申请状态', choices=status_choices, default='草稿', max_length=50)
# stage = models.IntegerField('步骤状态', choices=stage_choices, default=0)
# evresult = models.CharField('评审结论', choices = result_choices, default='未评审', max_length=50)
# evremark = models.TextField('备注', blank=True)
# level = models.ForeignKey(Dict, related_name='application_level', on_delete = models.DO_NOTHING)
# class Meta:
# verbose_name = '认证主申请'
# verbose_name_plural = verbose_name
# def __str__(self):
# return self.number
# class SubApplication(CommonBModel):
# """
# 子申请
# """
# pattern_choices = (
# ('正常', '正常'),
# ('ODM', 'ODM'),
# ('OEM', 'OEM')
# )
# number = models.CharField('子申请编号', max_length = 100)
# application = models.ForeignKey(Application, on_delete=models.CASCADE, related_name='subapplication_application')
# cert_field = models.ForeignKey(Dict, verbose_name='认证领域', related_name='subapplication_cert_field', on_delete=models.DO_NOTHING)
# cccpv_class = models.ForeignKey(Dict, verbose_name='涉及CCC/PV分类', related_name='subapplication_cccpv_class', on_delete=models.DO_NOTHING, null=True, blank=True)
# cnas_scopes = models.ManyToManyField(Dict, verbose_name='涉及cnas分类', related_name='subapplication_cnas_sopes', blank=True)
# project = models.ForeignKey(Project, related_name='subapplication_project', on_delete=models.SET_NULL, null=True)
# is_approve = models.BooleanField('是否认可', default=True)
# pattern = models.CharField('申请模式', choices=pattern_choices, max_length=50, null=True, blank=True)
# manufacture = models.ForeignKey(Enterprise, on_delete=models.CASCADE, related_name='subapplication_manufacture', null=True, blank=True)
# manufacture_v = JSONField(verbose_name='制造商', null=True)
# factory = models.ForeignKey(Enterprise, on_delete=models.CASCADE, related_name='subapplication_factory', null=True, blank=True)
# factory_v = JSONField(verbose_name='生产厂', null=True)
# class Meta:
# verbose_name = '认证子申请'
# verbose_name_plural = verbose_name
# def __str__(self):
# return self.number
class Project(CommonBModel):
"""
认证项目
@ -118,76 +189,16 @@ class CertApp(CommonBModel):
verbose_name = '认证受理'
verbose_name_plural = verbose_name
class Application(CommonBModel):
class CertAppFlow(model.BaseModel):
"""
主申请
certapp流转记录
"""
status_choices = (
('草稿', '草稿'),
('已申请', '已申请'),
('已受理', '已受理'),
('进行中', '进行中'),
('已中止', '已中止'),
('已完成', '已完成')
)
result_choices = (
('未评审', '未评审'),
('合格', '合格'),
('不合格', '不合格'),
('有条件放行', '有条件放行')
)
stage_choices = (
(0, '基本信息'),
(1, '申请内容')
)
number = models.CharField('申请编号', max_length = 100)
apply_date = models.DateField('申请日期', null=True, blank=True)
accept_date = models.DateField('受理日期', null=True, blank=True)
applicant_v = JSONField(verbose_name='申请方')
applicant = models.ForeignKey(Enterprise, related_name='application_applicant', on_delete=models.DO_NOTHING)
fields = models.TextField('认证领域', blank=True)
status = models.CharField('申请状态', choices=status_choices, default='草稿', max_length=50)
stage = models.IntegerField('步骤状态', choices=stage_choices, default=0)
evresult = models.CharField('评审结论', choices = result_choices, default='未评审', max_length=50)
evremark = models.TextField('备注', blank=True)
level = models.ForeignKey(Dict, related_name='application_level', on_delete = models.DO_NOTHING)
class Meta:
verbose_name = '认证主申请'
verbose_name_plural = verbose_name
def __str__(self):
return self.number
class SubApplication(CommonBModel):
"""
子申请
"""
pattern_choices = (
('正常', '正常'),
('ODM', 'ODM'),
('OEM', 'OEM')
)
number = models.CharField('子申请编号', max_length = 100)
application = models.ForeignKey(Application, on_delete=models.CASCADE, related_name='subapplication_application')
cert_field = models.ForeignKey(Dict, verbose_name='认证领域', related_name='subapplication_cert_field', on_delete=models.DO_NOTHING)
cccpv_class = models.ForeignKey(Dict, verbose_name='涉及CCC/PV分类', related_name='subapplication_cccpv_class', on_delete=models.DO_NOTHING, null=True, blank=True)
cnas_scopes = models.ManyToManyField(Dict, verbose_name='涉及cnas分类', related_name='subapplication_cnas_sopes', blank=True)
project = models.ForeignKey(Project, related_name='subapplication_project', on_delete=models.SET_NULL, null=True)
is_approve = models.BooleanField('是否认可', default=True)
pattern = models.CharField('申请模式', choices=pattern_choices, max_length=50, null=True, blank=True)
manufacture = models.ForeignKey(Enterprise, on_delete=models.CASCADE, related_name='subapplication_manufacture', null=True, blank=True)
manufacture_v = JSONField(verbose_name='制造商', null=True)
factory = models.ForeignKey(Enterprise, on_delete=models.CASCADE, related_name='subapplication_factory', null=True, blank=True)
factory_v = JSONField(verbose_name='生产厂', null=True)
class Meta:
verbose_name = '认证子申请'
verbose_name_plural = verbose_name
def __str__(self):
return self.number
certapp = models.ForeignKey(CertApp, on_delete=models.CASCADE, verbose_name='业务')
handler = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='处理人')
operation = models.TextField('操作描述')
remark = models.TextField('操作备注', default='', blank=True)
state = models.CharField('业务状态', max_length=200)
data = JSONField('certapp数据json', null=True, blank=True)
class EvaluationDetail(CommonBModel):
@ -207,10 +218,20 @@ class Certappunit(CommonBModel):
"""
认证单元,一个单元一张证书
"""
state_choices = (
('检测任务已提交', '检测任务已提交'),
('检测任务已下达', '检测任务已下达'),
('检测任务已接受', '检测任务已接受'),
('样品已收到', '样品已收到'),
('检测中', '检测中'),
('结果已反馈', '结果已反馈'),
('已评定', '已评定'),
)
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')
testorg = models.ForeignKey('laboratory.TestOrg', verbose_name='检测机构', on_delete=models.SET_NULL, null=True, blank=True)
test_state = models.TextField('检测状态', choices=state_choices, null=True, blank=True)
# 认证评定
decision = models.ForeignKey(Dict,verbose_name='认证决定', on_delete=models.CASCADE, related_name='unitaccess_decision', null=True, blank=True)

View File

@ -8,36 +8,36 @@ from apps.system.serializers import DictSerializer, UserSimpleSerializer, DictSi
from apps.certset.serializers import StandardSerializer
from apps.plan.serializers import PlanSerializer
class ApplicationCreateSerializer(serializers.ModelSerializer):
number = serializers.CharField(required=False)
class Meta:
model = Application
fields = '__all__'
# class ApplicationCreateSerializer(serializers.ModelSerializer):
# number = serializers.CharField(required=False)
# class Meta:
# model = Application
# fields = '__all__'
class ApplicationUpdateSerializer(serializers.ModelSerializer):
number = serializers.CharField(read_only=True)
stage_ = serializers.SerializerMethodField(source='stage', read_only=True)
class Meta:
model = Application
fields = '__all__'
# class ApplicationUpdateSerializer(serializers.ModelSerializer):
# number = serializers.CharField(read_only=True)
# stage_ = serializers.SerializerMethodField(source='stage', read_only=True)
# class Meta:
# model = Application
# fields = '__all__'
def get_stage_(self, obj):
return obj.get_stage_display()
# def get_stage_(self, obj):
# return obj.get_stage_display()
class SubApplicationCreateSerializer(serializers.ModelSerializer):
number = serializers.CharField(required=False)
class Meta:
model = SubApplication
fields = '__all__'
# class SubApplicationCreateSerializer(serializers.ModelSerializer):
# number = serializers.CharField(required=False)
# class Meta:
# model = SubApplication
# fields = '__all__'
class SubApplicationUpdateSerializer(serializers.ModelSerializer):
number = serializers.CharField(read_only=True)
cert_field_ = DictSerializer(source='cert_field')
cccpv_class_ = DictSerializer(source='cccpv_class')
cnas_scopes_ = DictSerializer(source='cnas_scopes', many=True)
class Meta:
model = SubApplication
fields = '__all__'
# class SubApplicationUpdateSerializer(serializers.ModelSerializer):
# number = serializers.CharField(read_only=True)
# cert_field_ = DictSerializer(source='cert_field')
# cccpv_class_ = DictSerializer(source='cccpv_class')
# cnas_scopes_ = DictSerializer(source='cnas_scopes', many=True)
# class Meta:
# model = SubApplication
# fields = '__all__'
class CertappSerializer(serializers.ModelSerializer):
cert_field_ = DictSerializer(source='cert_field', read_only=True)
@ -61,6 +61,7 @@ from apps.certificate.models import Certificate
class CertappunitSerializer(serializers.ModelSerializer):
certunit_ = CertunitSimpleSerializer(source = 'certunit', read_only=True)
decision_ = DictSimpleSerializer(source = 'decision', read_only=True)
# certificate_ = CertificateSimpleSerializer(source = 'certunit.certificate_certunit', read_only=True)
certificate_ = serializers.SerializerMethodField()
class Meta:
model = Certappunit

View File

@ -3,8 +3,8 @@ from .views import *
from rest_framework import routers
router = routers.DefaultRouter()
router.register('application', ApplicationViewSet, basename="application")
router.register('subapplication', SubApplicationViewSet, basename="subapplication")
# router.register('application', ApplicationViewSet, basename="application")
# router.register('subapplication', SubApplicationViewSet, basename="subapplication")
router.register('certapp', CertappViewset, basename="certapp")
router.register('certappunit', CertappunitViewset, basename="certappunit")
router.register('evaluationdetail', EvaluationDetailViewset, basename="evaluationdetail")

View File

@ -20,54 +20,54 @@ from rest_framework.exceptions import ParseError, NotAuthenticated
from django.utils import timezone
# Create your views here.
class ApplicationViewSet(RbacFilterSet, ModelViewSet):
"""
认证申请
"""
perms_map = {'get': 'application_view', 'post':'application_create', 'put':'application_update','delete': 'application_delete'}
queryset = Application.objects.all()
serializer_class = ApplicationCreateSerializer
ordering = ['-create_time']
# class ApplicationViewSet(RbacFilterSet, ModelViewSet):
# """
# 认证申请
# """
# perms_map = {'get': 'application_view', 'post':'application_create', 'put':'application_update','delete': 'application_delete'}
# queryset = Application.objects.all()
# serializer_class = ApplicationCreateSerializer
# ordering = ['-create_time']
def get_serializer_class(self):
if self.action == 'create':
return ApplicationCreateSerializer
else:
return ApplicationUpdateSerializer
# def get_serializer_class(self):
# if self.action == 'create':
# return ApplicationCreateSerializer
# else:
# return ApplicationUpdateSerializer
def perform_create(self, serializer):
serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept, number=random.randrange(1000,2000))
# def perform_create(self, serializer):
# serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept, number=random.randrange(1000,2000))
class SubApplicationViewSet(RbacFilterSet, ModelViewSet):
"""
子认证申请
"""
perms_map = {'get': 'application_view', 'post':'application_create', 'put':'application_update','delete': 'application_delete'}
queryset = SubApplication.objects.all()
serializer_class = SubApplicationCreateSerializer
filterset_fields = ['application']
ordering = ['-create_time']
# class SubApplicationViewSet(RbacFilterSet, ModelViewSet):
# """
# 子认证申请
# """
# perms_map = {'get': 'application_view', 'post':'application_create', 'put':'application_update','delete': 'application_delete'}
# queryset = SubApplication.objects.all()
# serializer_class = SubApplicationCreateSerializer
# filterset_fields = ['application']
# ordering = ['-create_time']
def get_serializer_class(self):
if self.action == 'create':
return SubApplicationCreateSerializer
else:
return SubApplicationUpdateSerializer
# def get_serializer_class(self):
# if self.action == 'create':
# return SubApplicationCreateSerializer
# else:
# return SubApplicationUpdateSerializer
def create(self, request, *args, **kwargs):
postdata = request.data
postdata['number'] = random.randrange(1000,2000)
serializer = self.get_serializer(data=postdata)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
# def create(self, request, *args, **kwargs):
# postdata = request.data
# postdata['number'] = random.randrange(1000,2000)
# serializer = self.get_serializer(data=postdata)
# serializer.is_valid(raise_exception=True)
# self.perform_create(serializer)
# headers = self.get_success_headers(serializer.data)
# return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def paginate_queryset(self, queryset):
# def paginate_queryset(self, queryset):
if ((not self.request.query_params.get('page', None)) and (self.request.query_params.get('application', None))) or (self.paginator is None):
return None
return self.paginator.paginate_queryset(queryset, self.request, view=self)
# if ((not self.request.query_params.get('page', None)) and (self.request.query_params.get('application', None))) or (self.paginator is None):
# return None
# return self.paginator.paginate_queryset(queryset, self.request, view=self)
class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
"""
@ -88,7 +88,9 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
postdata['cert_field'] = Dict.objects.get(code=postdata['field_code']).id
serializer = self.get_serializer(data=postdata)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
# self.perform_create(serializer)
instance = serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept, state='受理')
CertAppFlow.objects.create(certapp = instance, handler=self.request.user, data=serializer.data, operation='创建申请', state='申请')
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
@ -101,6 +103,7 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
obj = self.get_object()
obj.state = '策划'
obj.save()
CertAppFlow.objects.create(certapp = obj, handler=self.request.user, data=self.get_serializer(obj), operation='完成受理', state='受理')
return Response(status=status.HTTP_200_OK)
@action(methods=['put'], detail=False, perms_map={'put':'certapp_review'},
@ -119,7 +122,7 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
@action(methods=['put'], detail=True, perms_map={'put':'certapp_access'}, url_name='certapp_access')
def access(self, request, pk=None):
"""
认证评定
评定
"""
# instance, ok = Certaccess.objects.get_or_create(certapp=self.get_object(), defaults={'certapp':self.get_object()
# , 'conclusion':Dict.objects.get(pk=request.data['conclusion']), 'score':request.data['score']})
@ -177,6 +180,7 @@ class CertappunitViewset(PageOrNot, ListModelMixin, GenericViewSet):
obj.save()
return Response(status=status.HTTP_200_OK)
from apps.plan.models import Member
class ProjectViewSet(RbacFilterSet, ModelViewSet):
perms_map = {'get': 'project_view', 'post':'project_create', 'put':'project_update','delete': 'project_delete'}
queryset = Project.objects.all()
@ -195,28 +199,23 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet):
postdata['number'] = random.randrange(8000,9000)
serializer = self.get_serializer(data=postdata)
serializer.is_valid(raise_exception=True)
if self.request.user is not None:
instance = serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept)
if 'certapps' in postdata and postdata['certapps']:
CertApp.objects.filter(pk__in = postdata['certapps']).update(project=instance, state='进行中')
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
else:
return NotAuthenticated()
instance = serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept)
if 'certapps' in postdata and postdata['certapps']:
CertApp.objects.filter(pk__in = postdata['certapps']).update(project=instance)
instance.state = '待策划'
instance.save()
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
@action(methods=['put'], detail=True, perms_map={'put':'project_next'},
url_name='project_next')
def next(self, request, pk=None):
@action(methods=['put'], detail=True, perms_map={'put':'project_assgin'},
url_name='project_assgin')
def assgin(self, request, pk=None):
"""
项目流转
审核任务下达
"""
obj = self.get_object()
if obj.state == '创建中':
obj.state = '待策划'
obj.save()
return Response(status=status.HTTP_200_OK)
elif obj.state == '策划中' and obj.can_paichai:
obj.state = '待现场审核'
if obj.state == '策划中':
obj.state = '审核任务已下达'
obj.save()
return Response(status=status.HTTP_200_OK)
else:
@ -227,16 +226,16 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet):
url_name='project_plan')
def plan(self, request, *args, **kwargs):
"""
项目计划
加入计划
"""
projects = request.data['projects']
plan = request.data['plan']
if projects:
objs = Project.objects.filter(pk__in=projects)
for i in objs:
i.plan=plan
i.plan=Plan.objects.get(pk=plan)
if i.state == '待策划':
i.state == '策划中'
i.state = '策划中'
i.save()
return Response(status=status.HTTP_200_OK)
@ -251,3 +250,20 @@ class ProjectViewSet(RbacFilterSet, ModelViewSet):
obj.edate1 = request.data['edate1']
obj.save()
return Response(status=status.HTTP_200_OK)
@action(methods=['put'], detail=True, perms_map={'put':'audit_accept'},url_name='audit_accept')
def accept(self, request, *args, **kwargs):
"""
接受项目审核任务
"""
obj = self.get_object()
if obj.state == '审核任务已下达':
obj.state = '审核任务已接受'
obj.save()
Member.objects.filter(certapp__project=obj).update(is_accepted=True)
obj.certapp_project.all().update(state='审核')
for i in obj.certapp_project.all():
CertAppFlow.objects.create(certapp = i, handler=self.request.user, operation='审核任务已接受', state='策划')
return Response(status=status.HTTP_200_OK)
return Response('项目状态异常,操作失败', status=status.HTTP_400_BAD_REQUEST)

View File

@ -42,7 +42,7 @@ class DictSerializer(serializers.ModelSerializer):
class DictSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Dict
fields = ['pk', 'name', 'code']
fields = ['id', 'name', 'code']
class PositionSerializer(serializers.ModelSerializer):
"""