业务流程状态梳理
This commit is contained in:
parent
de4b832165
commit
2242cf1edd
|
|
@ -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',
|
||||
})
|
||||
}
|
||||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -100,4 +100,7 @@ div:focus {
|
|||
}
|
||||
// .el-button {
|
||||
// border-radius: 0px;
|
||||
// }
|
||||
// }
|
||||
.el-tabs__header {
|
||||
margin: 0 0 6px;
|
||||
}
|
||||
|
|
@ -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="认证决定">
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 },
|
||||
});
|
||||
}
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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(){
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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("成功");
|
||||
|
|
|
|||
|
|
@ -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_();
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -20,4 +20,4 @@ class Certificate(CommonAModel):
|
|||
verbose_name_plural = verbose_name
|
||||
|
||||
def __str__(self):
|
||||
return self.number
|
||||
return self.number
|
||||
|
|
@ -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__'
|
||||
|
|
@ -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):
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -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']
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -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',
|
||||
),
|
||||
]
|
||||
|
|
@ -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',
|
||||
),
|
||||
]
|
||||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
@ -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):
|
||||
"""
|
||||
|
|
|
|||
Loading…
Reference in New Issue