This commit is contained in:
caoqianming 2020-08-13 15:58:12 +08:00
parent 9c8ce37b46
commit 49c03ea4e7
13 changed files with 1002 additions and 11 deletions

40
client/src/api/certapp.js Normal file
View File

@ -0,0 +1,40 @@
import request from '@/utils/request'
export function getCertappList(query) {
return request({
url: '/project/certapp/',
method: 'get',
params: query
})
}
export function createCertapp(data) {
return request({
url: '/project/certapp/',
method: 'post',
data
})
}
export function deleteCertapp(id) {
return request({
url: `/project/certapp/${id}/`,
method: 'delete'
})
}
export function updateCertapp(id, data) {
return request({
url: `/project/certapp/${id}/`,
method: 'put',
data
})
}
export function getCertapp(id) {
return request({
url: `/project/certapp/${id}/`,
method: 'get',
})
}

View File

@ -64,7 +64,7 @@ export const asyncRoutes = [
{
path: '/project',
component: Layout,
redirect: '/project/application',
redirect: '/project/case',
name: 'ProjectManage',
meta: { title: '认证项目', icon: 'example'},
children: [
@ -72,7 +72,13 @@ export const asyncRoutes = [
path: 'application',
name: 'Applicaion',
component: () => import('@/views/application/application'),
meta: { title: '认证申请', icon: 'example', perms: ['application_view'] }
meta: { title: '认证受理', icon: 'example', perms: ['application_view'] }
},
{
path: 'certapp',
name: 'Certapp',
component: () => import('@/views/certapp/certapp'),
meta: { title: '认证受理', icon: 'example', perms: ['certapp_view'] }
},
{
path: 'application2',
@ -87,6 +93,13 @@ export const asyncRoutes = [
meta: { title: '认证申请', icon: 'example', perms: ['application_create', 'application_update'] },
hidden: true
},
{
path: 'certapp/:action/:kind/',
name: 'CertappForm',
component: () => import('@/views/certapp/certappform'),
meta: { title: '认证受理单', icon: 'example', perms: ['certapp_create', 'certapp_update'] },
hidden: true
},
]
},
{

View File

@ -107,25 +107,25 @@
</div>
<el-button size="mini" type="primary" style="margin-bottom:2px">操作按钮</el-button>
<div>
<label>申请领域:</label><span> {{item.cert_field_.name}}</span>
<span>申请领域:</span><span> {{item.cert_field_.name}}</span>
</div>
<div v-if="item.cccpv_class">
<label>产品分类:</label><el-tag> {{item.cccpv_class_.name}}</el-tag>
<span>产品分类:</span><el-tag> {{item.cccpv_class_.name}}</el-tag>
</div>
<div v-if="item.cnas_scopes.length">
<label>CNAS分类:</label><el-tag v-for="(item, index) in item.cnas_scopes_" :key="'cnas_scope' + index"> {{item.name}}</el-tag>
<span>CNAS分类:</span><el-tag v-for="(item, index) in item.cnas_scopes_" :key="'cnas_scope' + index"> {{item.name}}</el-tag>
</div>
<div >
<label>申请方:</label><span> {{formData.applicant_v.name}}</span>
<span>申请方:</span><span> {{formData.applicant_v.name}}</span>
</div>
<div v-if="item.manufacture">
<label>制造商:</label><span> {{item.manufacture_v.name}}</span>
<span>制造商:</span><span> {{item.manufacture_v.name}}</span>
</div>
<div v-if="item.factory">
<label>生产厂:</label><span> {{item.factory_v.name}}</span>
<span>生产厂:</span><span> {{item.factory_v.name}}</span>
</div>
<div v-if="item.pattern">
<label>申请模式:</label><span> {{item.pattern}}</span>
<span>申请模式:</span><span> {{item.pattern}}</span>
</div>
</el-card>
@ -148,7 +148,11 @@
</el-dialog>
</div>
</template>
<style >
.el-card__body{
font-size:16px
}
</style>
<script>
import Enterprisechose from "@/views/enterprise/enterprisechoose"
import CCCform from "@/views/application/cccform"

View File

@ -0,0 +1,458 @@
<template>
<div>
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="100px">
<el-row>
<el-col :xs="24" :md="8">
<el-form-item label="业务级别" prop="level">
<el-select
v-model="formData.level"
placeholder="请选择业务级别"
filterable
allow-create
:style="{width: '100%'}"
>
<el-option
v-for="(item, index) in levelOptions"
:key="index"
:label="item.name"
:value="item.id"
:disabled="item.disabled"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :md="8">
<el-form-item label="受理日期" prop="apply_date" >
<el-date-picker
v-model="formData.apply_date"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
:style="{width: '100%'}"
placeholder="受理日期"
clearable
></el-date-picker>
</el-form-item>
</el-col>
<el-col :xs="24" :md="8">
<el-form-item label="接收日期" prop="accept_date" >
<el-date-picker
v-model="formData.accept_date"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
:style="{width: '100%'}"
placeholder="材料接收日期"
clearable
></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<!-- <el-divider content-position="left" style="margin-top:2px">申请方</el-divider> -->
<el-row>
<el-col :xs="24" :md="12">
<el-form-item label="申请方" prop="applicant">
<el-input placeholder="请选择申请方" readonly clearable v-model="formData.applicant_v.name">
<el-button slot="append" icon="el-icon-search" @click="choose(0)"></el-button>
</el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="12">
<el-form-item label="地址" prop="applicant_v.address">
<el-select
v-model="formData.applicant_v.address"
placeholder="请选择地址"
filterable
allow-create
:style="{width: '100%'}"
>
<el-option
v-for="(item, index) in addressOptions0"
:key="index"
:label="item.address"
:value="item.address"
:disabled="item.disabled"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :xs="24" :md="4">
<el-form-item label="联系人">
<el-input v-model="formData.applicant_v.linkman_name"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="6">
<el-form-item label="手机">
<el-input v-model="formData.applicant_v.linkman_mobile"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="4">
<el-form-item label="职务">
<el-input v-model="formData.applicant_v.linkman_duty"></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- <el-divider content-position="left">制造商</el-divider> -->
<el-row>
<el-col :xs="24" :md="12">
<el-form-item label="制造商" prop="manufacture">
<el-input placeholder="请选择制造商" readonly clearable v-model="formData.manufacture_v.name">
<el-button slot="append" icon="el-icon-search" @click="choose(1)"></el-button>
</el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="12">
<el-form-item label="地址" prop="manufacture_v.address">
<el-select
v-model="formData.manufacture_v.address"
placeholder="请选择地址"
filterable
allow-create
:style="{width: '100%'}"
>
<el-option
v-for="(item, index) in addressOptions1"
:key="index"
:label="item.address"
:value="item.address"
:disabled="item.disabled"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :xs="24" :md="4">
<el-form-item label="联系人">
<el-input v-model="formData.manufacture_v.linkman_name"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="6">
<el-form-item label="手机">
<el-input v-model="formData.manufacture_v.linkman_mobile"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="4">
<el-form-item label="职务">
<el-input v-model="formData.manufacture_v.linkman_duty"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :xs="24" :md="12">
<el-form-item label="生产厂" prop="factory">
<el-input placeholder="请选择生产厂" readonly clearable v-model="formData.factory_v.name">
<el-button slot="append" icon="el-icon-search" @click="choose(2)"></el-button>
</el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="12">
<el-form-item label="地址" prop="factory_v.address">
<el-select
v-model="formData.factory_v.address"
placeholder="请选择地址"
filterable
allow-create
:style="{width: '100%'}"
>
<el-option
v-for="(item, index) in addressOptions2"
:key="index"
:label="item.address"
:value="item.address"
:disabled="item.disabled"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :xs="24" :md="4">
<el-form-item label="联系人">
<el-input v-model="formData.factory_v.linkman_name"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="6">
<el-form-item label="手机">
<el-input v-model="formData.factory_v.linkman_mobile"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="4">
<el-form-item label="职务">
<el-input v-model="formData.factory_v.linkman_duty"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :md="4">
<el-form-item label="工厂人数">
<el-input-number v-model="formData.factory_v.person_count"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :xs="24" :md="8">
<el-form-item label="产品分类" prop="cccpv_class">
<treeselect
v-model="formData.cccpv_class"
:multiple="false"
:options="cccOptions"
:disable-branch-nodes="true"
placeholder="请选择产品分类"
:style="{width: '100%'}"
clearable
/>
</el-form-item>
</el-col>
<el-col :xs="24" :md="8">
<el-form-item label="申请模式" prop="pattern">
<el-select
v-model="formData.pattern"
placeholder="请选择模式"
filterable
allow-create
:style="{width: '100%'}"
>
<el-option
v-for="(item, index) in patternOptions"
:key="index"
:label="item.label"
:value="item.value"
:disabled="item.disabled"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :md="4">
<el-form-item label="是否认可" prop="is_approve">
<el-switch v-model="formData.is_approve"></el-switch>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" align="center">
<el-button @click="close(false)">取消</el-button>
<el-button type="primary" @click="handelConfirm">保存</el-button>
</div>
<el-dialog
title="选择企业"
:visible.sync="dgVisiable"
:close-on-click-modal="false"
width="80%"
:append-to-body="true"
>
<Enterprisechose ref="Enterprisechose" @handleChose="chooseComplete"></Enterprisechose>
</el-dialog>
</div>
</template>
<script>
import { createCertapp, updateCertapp, getCertapp } from "@/api/certapp";
import Enterprisechose from "@/views/enterprise/enterprisechoose";
import { getAddressList } from "@/api/enterprise";
import { genTree } from "../../utils";
import { getDictList } from "../../api/dict";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "CCCform",
inheritAttrs: false,
components: { Enterprisechose, Treeselect },
props: ["action", "certapp"],
data() {
return {
// act:this.action,
formData: {
field_code: 'CCC',
applicant: null,
applicant_v: {},
manufacture_v: {},
manufacture: null,
factory: null,
factory_v: {},
cccpv_class: null,
pattern: "正常",
is_approve:true
},
rules: {
apply_date: [
{
required: true,
message: "请选择日期",
trigger: "change",
},
],
accept_date: [
{
required: true,
message: "请选择日期",
trigger: "change",
},
],
applicant: [
{
required: true,
message: "请选择申请方",
trigger: "change",
},
],
manufacture: [
{
required: true,
message: "请选择制造商",
trigger: "change",
},
],
factory: [
{
required: true,
message: "请选择生产厂",
trigger: "change",
},
],
cccpv_class: [
{
required: true,
message: "请选择产品分类",
trigger: "change",
},
],
pattern: [
{
required: true,
message: "请选择申请模式",
trigger: "change",
},
],
level: [
{
required: true,
message: "请选择级别",
trigger: "change",
},
],
},
addressOptions0: [],
addressOptions1: [],
addressOptions2: [],
dgVisiable: false,
dgType: 1,
cccOptions: [],
levelOptions:[],
patternOptions: [
{
label: "正常",
value: "正常",
},
{
label: "ODM",
value: "ODM",
},
{
label: "OEM",
value: "OEM",
},
],
};
},
computed: {},
watch: {
},
created() {
this.getCCCOptions();
this.getlevelOptions();
if(this.action!='create'){
this.formData.id = this.certapp
this.getCertapp_()
}
},
mounted() {},
methods: {
close(val) {
// this.$refs['elForm'].resetFields()
this.$emit("closeDg", val);
},
getCertapp_(){
getCertapp(this.formData.id).then(res=>{
this.formData = res.data
})
},
handelConfirm() {
this.$refs["elForm"].validate((valid) => {
if (!valid) return;
if(this.formData.id){
updateCertapp(this.formData.id, this.formData).then((res) => {
this.$message.success('成功')
this.$emit("handleCommit", res.data);
});
}else{
createCertapp(this.formData).then((res) => {
this.$message.success('成功')
this.$emit("handleCommit", res.data);
});
}
});
},
choose(val) {
this.dgType = val;
this.dgVisiable = true;
},
chooseComplete(val) {
this.dgVisiable = false;
if (val) {
if (this.dgType == 1) {
this.formData.manufacture = val.id;
this.formData.manufacture_v = {
name: val.name,
linkman_name: val.linkman1_name,
linkman_mobile: val.linkman1_mobile,
linkman_duty: val.linkman1_duty,
};
} else if (this.dgType == 2) {
this.formData.factory = val.id;
this.formData.factory_v = {
name: val.name,
linkman_name: val.linkman1_name,
linkman_mobile: val.linkman1_mobile,
linkman_duty: val.linkman1_duty,
person_count: val.person_count,
};
} else if (this.dgType == 0) {
this.formData.applicant = val.id;
this.formData.applicant_v = {
name: val.name,
linkman_name: val.linkman1_name,
linkman_mobile: val.linkman1_mobile,
linkman_duty: val.linkman1_duty,
person_count: val.person_count,
};
}
}
this.getAddressList_(val.id);
},
getAddressList_(id) {
getAddressList({ enterprise: id }).then((res) => {
let data = genTree(res.data);
if(this.dgType==0){
this.addressOptions0 = data;
}else if(this.dgType==1){
this.addressOptions1 = data;
}else{
this.addressOptions2 = data;
}
});
},
getCCCOptions() {
getDictList({ type__code: "ccc_list" }).then((res) => {
this.cccOptions = genTree(res.data);
});
},
getlevelOptions(){
getDictList({ type__code: "certapp_level" }).then((res) => {
this.levelOptions = genTree(res.data);
});
}
},
};
</script>
<style>
</style>

View File

@ -0,0 +1,205 @@
<template>
<div class="app-container">
<div style="display:flex">
<treeselect
v-model="listQuery.user__dept"
:multiple="false"
:options="deptOptions"
placeholder="所属组织"
:disable-branch-nodes="true"
@input="handleFilter"
style="width: 280px" clearable/>
<el-select
v-model="listQuery.is_onjob"
placeholder="是否在职"
clearable
class="filter-item"
style="margin-left:10px"
@change="handleFilter"
>
<el-option label="" value="true"/>
<el-option label="" value="false"/>
</el-select>
<el-select
v-model="listQuery.is_fulltime"
placeholder="是否全职"
clearable
class="filter-item"
style="margin-left:10px"
@change="handleFilter"
>
<el-option label="" value="true"/>
<el-option label="" value="false"/>
</el-select>
<el-input
v-model="listQuery.search"
placeholder="姓名/易记码/编号/注册领域"
style="width: 300px;margin-left:10px"
class="filter-item"
@keyup.enter.native="handleFilter"
/>
<el-button
class="filter-item"
type="primary"
icon="el-icon-search"
@click="handleFilter"
style="margin-left:10px"
>搜索</el-button>
<el-button
class="filter-item"
type="primary"
icon="el-icon-refresh-left"
@click="resetFilter"
>刷新重置</el-button>
</div>
<div style="margin-top:6px">
<el-button type="primary" icon="el-icon-plus" v-for="(item, index) in field_list" :key="'field_list' + index" @click="handleCreate(item,index)" size="mini">{{item.name}}</el-button>
<el-button type="warning" size="mini">+批量多体系</el-button>
</div>
<el-table
v-loading="listLoading"
:data="tableData.results"
style="width: 100%;margin-top:10px;"
border
fit
stripe
highlight-current-row
max-height="600"
>
<el-table-column type="index" width="50" />
<el-table-column label="单号">
<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"><el-tag>{{ scope.row.status}}</el-tag></template>
</el-table-column>
<el-table-column label="创建人">
<template slot-scope="scope">{{ scope.row.create_by_.name}}</template>
</el-table-column>
<el-table-column label="创建日期">
<template slot-scope="scope">
<span>{{ scope.row.create_time }}</span>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
type="primary"
size="small"
:disabled="!checkPermission(['case_update'])"
@click="handleUpdate(scope)"
>编辑</el-button>
<el-button
type="danger"
size="small"
:disabled="!checkPermission(['case_delete'])"
@click="handleDelete(scope)"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="tableData.count>0"
:total="tableData.count"
:page.sync="listQuery.page"
:limit.sync="listQuery.page_size"
@pagination="getList"
/>
</div>
</template>
<script>
import { getCertappList, deleteCertapp } from "@/api/certapp"
import { getOrgList } from "@/api/org"
import { getDictList } from "@/api/dict"
import Pagination from "@/components/Pagination"
import checkPermission from '@/utils/permission'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import { genTree } from '../../utils'
export default {
components: { Pagination, Treeselect },
data() {
return {
tableData: {count:0},
listLoading: true,
listQuery: {
page: 1,
page_size: 20
},
deptOptions: [],
field_list:[]
};
},
created() {
this.getList()
this.getdeptOptions()
this.getfields()
},
methods: {
checkPermission,
getList() {
this.listLoading = true;
getCertappList(this.listQuery).then(response => {
if (response.data) {
this.tableData = response.data
}
this.listLoading = false
});
},
getdeptOptions() {
getOrgList().then(res=>{
this.deptOptions = genTree(res.data)
})
},
resetFilter() {
this.listQuery = {
page: 1,
page_size: 20
}
this.getList()
},
handleFilter() {
this.listQuery.page = 1
this.getList()
},
handleCreate(item, index) {
this.$router.push({name:"CertappForm", params:{kind:item.code, action:'create'}})
},
handleUpdate(scope) {
this.$router.push({name:"CertappForm", params:{action:'update', kind:scope.row.cert_field_.code}, query:{id:scope.row.id}})
},
handleDelete(scope) {
deleteCertapp(scope.row.id).then(res=>{
this.$message.success('成功')
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
})
},
}
};
</script>

View File

@ -0,0 +1,60 @@
<template>
<div class="app-container">
<el-tabs type="border-card" >
<el-tab-pane label="申请信息" style="height:700px;overflow-y:auto;overflow-x:hidden;">
<CCCform :action="action" @handleCommit="save" :certapp="certapp" v-if="kind=='CCC'"></CCCform>
</el-tab-pane>
<el-tab-pane label="产品单元" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp">
</el-tab-pane>
<el-tab-pane label="原材料供应商" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp">
</el-tab-pane>
<el-tab-pane label="检测设备" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp">
</el-tab-pane>
<el-tab-pane label="资料评审" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp">
</el-tab-pane>
<el-tab-pane label="收费信息" style="height:700px;overflow-y:auto;overflow-x:hidden;" v-if="certapp">
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import CCCform from "@/views/certapp/cccform"
export default {
components: { CCCform },
props: [],
data() {
return {
action:null,
certapp:null,
kind:null
};
},
computed: {},
watch: {
// "formData.cert_field": "changeRules"
},
created() {
this.getParams()
},
mounted() {},
methods: {
getParams(){
var action = this.$route.params.action
var kind = this.$route.params.kind
this.action = action
this.kind = kind
if(action=='update'){
this.certapp = this.$route.query.id
}
},
save(val){
this.certapp=val.id
}
}
};
</script>

View File

@ -0,0 +1,54 @@
# Generated by Django 3.0.7 on 2020-08-12 06:54
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 = [
('crm', '0011_enterprise_parent'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('system', '0028_auto_20200807_1018'),
('project', '0015_auto_20200807_1753'),
]
operations = [
migrations.CreateModel(
name='Case',
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='删除标记')),
('number', models.CharField(blank=True, max_length=100, null=True, verbose_name='受理编号')),
('apply_date', models.DateField(blank=True, null=True, verbose_name='申请日期')),
('accept_date', models.DateField(blank=True, null=True, verbose_name='受理日期')),
('applicant_v', django.contrib.postgres.fields.jsonb.JSONField(verbose_name='申请方')),
('status', models.CharField(choices=[('草稿', '草稿'), ('已申请', '已申请'), ('已受理', '已受理'), ('进行中', '进行中'), ('已中止', '已中止'), ('已完成', '已完成')], default='草稿', max_length=50, verbose_name='申请状态')),
('evresult', models.CharField(choices=[('未评审', '未评审'), ('合格', '合格'), ('不合格', '不合格'), ('有条件放行', '有条件放行')], default='未评审', max_length=50, verbose_name='评审结论')),
('evremark', models.TextField(blank=True, verbose_name='备注')),
('is_approve', models.BooleanField(default=True, verbose_name='是否认可')),
('pattern', models.CharField(blank=True, choices=[('正常', '正常'), ('ODM', 'ODM'), ('OEM', 'OEM')], max_length=50, null=True, verbose_name='申请模式')),
('manufacture_v', django.contrib.postgres.fields.jsonb.JSONField(null=True, verbose_name='制造商')),
('factory_v', django.contrib.postgres.fields.jsonb.JSONField(null=True, verbose_name='生产厂')),
('applicant', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='case_applicant', to='crm.Enterprise')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='case_belong_dept', to='system.Organization', verbose_name='所属部门')),
('cccpv_class', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='case_cccpv_class', to='system.Dict', verbose_name='涉及CCC/PV分类')),
('cert_field', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='case_cert_field', to='system.Dict', verbose_name='认证领域')),
('cnas_scopes', models.ManyToManyField(blank=True, related_name='case_cnas_sopes', to='system.Dict', verbose_name='涉及cnas分类')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='case_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('factory', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='case_factory', to='crm.Enterprise')),
('manufacture', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='case_manufacture', to='crm.Enterprise')),
('project', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='case_project', to='project.Project')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='case_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'verbose_name': '认证受理',
'verbose_name_plural': '认证受理',
},
),
]

View File

@ -0,0 +1,57 @@
# Generated by Django 3.0.7 on 2020-08-12 08:54
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),
('system', '0028_auto_20200807_1018'),
('crm', '0011_enterprise_parent'),
('project', '0016_case'),
]
operations = [
migrations.CreateModel(
name='CertApp',
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='删除标记')),
('number', models.CharField(blank=True, max_length=100, null=True, verbose_name='受理编号')),
('apply_date', models.DateField(blank=True, null=True, verbose_name='申请日期')),
('accept_date', models.DateField(blank=True, null=True, verbose_name='受理日期')),
('applicant_v', django.contrib.postgres.fields.jsonb.JSONField(verbose_name='申请方')),
('status', models.CharField(choices=[('草稿', '草稿'), ('已申请', '已申请'), ('已受理', '已受理'), ('进行中', '进行中'), ('已中止', '已中止'), ('已完成', '已完成')], default='草稿', max_length=50, verbose_name='申请状态')),
('evresult', models.CharField(choices=[('未评审', '未评审'), ('合格', '合格'), ('不合格', '不合格'), ('有条件放行', '有条件放行')], default='未评审', max_length=50, verbose_name='评审结论')),
('evremark', models.TextField(blank=True, verbose_name='备注')),
('is_approve', models.BooleanField(default=True, verbose_name='是否认可')),
('pattern', models.CharField(blank=True, choices=[('正常', '正常'), ('ODM', 'ODM'), ('OEM', 'OEM')], max_length=50, null=True, verbose_name='申请模式')),
('manufacture_v', django.contrib.postgres.fields.jsonb.JSONField(null=True, verbose_name='制造商')),
('factory_v', django.contrib.postgres.fields.jsonb.JSONField(null=True, verbose_name='生产厂')),
('applicant', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='certapp_applicant', to='crm.Enterprise')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certapp_belong_dept', to='system.Organization', verbose_name='所属部门')),
('cccpv_class', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='certapp_cccpv_class', to='system.Dict', verbose_name='涉及CCC/PV分类')),
('cert_field', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='certapp_cert_field', to='system.Dict', verbose_name='认证领域')),
('cnas_scopes', models.ManyToManyField(blank=True, related_name='certapp_cnas_sopes', to='system.Dict', verbose_name='涉及cnas分类')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certapp_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('factory', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='certapp_factory', to='crm.Enterprise')),
('manufacture', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='certapp_manufacture', to='crm.Enterprise')),
('project', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certapp_project', to='project.Project')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certapp_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'verbose_name': '认证受理',
'verbose_name_plural': '认证受理',
},
),
migrations.DeleteModel(
name='Case',
),
]

View File

@ -0,0 +1,20 @@
# Generated by Django 3.0.7 on 2020-08-13 06:39
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('system', '0028_auto_20200807_1018'),
('project', '0017_auto_20200812_1654'),
]
operations = [
migrations.AddField(
model_name='certapp',
name='level',
field=models.ForeignKey(default=111, on_delete=django.db.models.deletion.DO_NOTHING, related_name='certapp_level', to='system.Dict', verbose_name='业务级别'),
),
]

View File

@ -16,6 +16,55 @@ class Project(CommonBModel):
"""
pass
class CertApp(CommonBModel):
"""
认证受理
"""
status_choices = (
('草稿', '草稿'),
('已申请', '已申请'),
('已受理', '已受理'),
('进行中', '进行中'),
('已中止', '已中止'),
('已完成', '已完成')
)
result_choices = (
('未评审', '未评审'),
('合格', '合格'),
('不合格', '不合格'),
('有条件放行', '有条件放行')
)
number = models.CharField('受理编号', max_length = 100, null=True, blank=True)
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='certapp_applicant', on_delete=models.DO_NOTHING)
status = models.CharField('申请状态', choices=status_choices, default='草稿', max_length=50)
evresult = models.CharField('评审结论', choices = result_choices, default='未评审', max_length=50)
evremark = models.TextField('备注', blank=True)
level = models.ForeignKey(Dict, verbose_name='业务级别', related_name='certapp_level', on_delete=models.DO_NOTHING, default=Dict.objects.get(code='ybxm').id)
pattern_choices = (
('正常', '正常'),
('ODM', 'ODM'),
('OEM', 'OEM')
)
cert_field = models.ForeignKey(Dict, verbose_name='认证领域', related_name='certapp_cert_field', on_delete=models.DO_NOTHING)
cccpv_class = models.ForeignKey(Dict, verbose_name='涉及CCC/PV分类', related_name='certapp_cccpv_class', on_delete=models.DO_NOTHING, null=True, blank=True)
cnas_scopes = models.ManyToManyField(Dict, verbose_name='涉及cnas分类', related_name='certapp_cnas_sopes', blank=True)
project = models.ForeignKey(Project, related_name='certapp_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='certapp_manufacture', null=True, blank=True)
manufacture_v = JSONField(verbose_name='制造商', null=True)
factory = models.ForeignKey(Enterprise, on_delete=models.CASCADE, related_name='certapp_factory', null=True, blank=True)
factory_v = JSONField(verbose_name='生产厂', null=True)
class Meta:
verbose_name = '认证受理'
verbose_name_plural = verbose_name
class Application(CommonBModel):
"""
主申请

View File

@ -35,3 +35,12 @@ class SubApplicationUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = SubApplication
fields = '__all__'
class CertappSerializer(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)
create_by_ = UserListSerializer(source='create_by', read_only=True)
class Meta:
model = CertApp
fields = '__all__'

View File

@ -5,6 +5,7 @@ from rest_framework import routers
router = routers.DefaultRouter()
router.register('application', ApplicationViewSet, basename="application")
router.register('subapplication', SubApplicationViewSet, basename="subapplication")
router.register('certapp', CertappViewset, basename="certapp")
urlpatterns = [
path('', include(router.urls))
]

View File

@ -59,3 +59,24 @@ class SubApplicationViewSet(CreateUpdateCustomMixin, ModelViewSet):
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(CreateUpdateCustomMixin, ModelViewSet):
"""
申请受理
"""
perms_map = {'get': 'certapp_view', 'post':'certapp_create', 'put':'certapp_update','delete': 'certapp_delete'}
queryset = CertApp.objects.all()
serializer_class = CertappSerializer
ordering = ['-create_time']
def create(self, request, *args, **kwargs):
postdata = request.data
postdata['number'] = random.randrange(1000,2000)
if postdata.get('field_code', None):
postdata['cert_field'] = Dict.objects.get(code=postdata['field_code']).id
print(postdata)
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)