feat:新增批量删除功能

This commit is contained in:
zty 2024-04-12 17:18:14 +08:00
parent 4a06a9d68a
commit 864cc31433
27 changed files with 1285 additions and 273 deletions

View File

@ -2,7 +2,7 @@ import request from '@/utils/request'
export function getEa(query) { export function getMyEas(query) {
return request({ return request({
url: '/info/ea/', url: '/info/ea/',
method: 'get', method: 'get',
@ -10,13 +10,6 @@ export function getEa(query) {
}) })
} }
export function getMyEas(query) {
return request({
url: '/info/ea/activate_info/',
method: 'get',
params: query
})
}
export function getOneEa(id) { export function getOneEa(id) {
return request({ return request({

View File

@ -2,21 +2,14 @@ import request from '@/utils/request'
export function getRcs(query) { export function getgetMyRcsRcs(query) {
return request({ return request({
url: '/info/qa/', url: '/info/qa/',
method: 'get', method: 'get',
params: query params: query
}) })
} }
export function getMyRcs(query) {
return request({
url: '/info/qa/activate_info/',
method: 'get',
params: query
})
}
export function getRc(id) { export function getRc(id) {
return request({ return request({

View File

@ -1,18 +1,8 @@
import request from '@/utils/request' import request from '@/utils/request'
export function getRcs(query) {
return request({
url: '/info/qc/',
method: 'get',
params: query
})
}
export function getMyRcs(query) { export function getMyRcs(query) {
return request({ return request({
url: '/info/qc/commentdation_info/', url: '/info/qc/',
method: 'get', method: 'get',
params: query params: query
}) })

View File

@ -0,0 +1,59 @@
import request from '@/utils/request'
export function getMyQi(query) {
return request({
url: '/info/faq/',
method: 'get',
params: query
})
}
export function getQi(id) {
return request({
url: `/info/faq/${id}/`,
method: 'get'
})
}
export function updateQi(id, data) {
return request({
url: `/info/faq/${id}/`,
method: 'patch',
data
})
}
export function createQi(data) {
return request({
url: `/info/faq/`,
method: 'post',
data
})
}
export function delQi(id) {
return request({
url: `/info/faq/${id}/`,
method: 'delete'
})
}
export function exportData(data) {
return request({
url: `/info/faq/filter_by_date/`,
method: 'post',
data
})
}
export function getChangeInfo(query) {
return request({
url: `/info/faqch/`,
method: 'get',
params: query
})
}

View File

@ -2,7 +2,7 @@ import request from '@/utils/request'
export function getRsAll(query) { export function getMyRs(query) {
return request({ return request({
url: '/info/ar/', url: '/info/ar/',
method: 'get', method: 'get',
@ -10,14 +10,8 @@ export function getRsAll(query) {
}) })
} }
export function getMyRs(query) {
return request({
url: '/info/ar/review_info/',
method: 'get',
params: query
})
}
export function getRs(id) { export function getRs(id) {
return request({ return request({
url: `/info/ar/${id}/`, url: `/info/ar/${id}/`,

View File

@ -501,4 +501,45 @@ export function taskAnalyse(data) {
method: 'post', method: 'post',
data data
}) })
}
export function delPts(data) {
return request({
url: '/supervision/pt/bulk_delete/',
method: 'delete',
data
})
}
export function delRcs(data) {
return request({
url: '/supervision/rc/bulk_delete/',
method: 'delete',
data
})
}
export function delRicks(data) {
return request({
url: '/supervision/risk/bulk_delete/',
method: 'delete',
data
})
}
export function delComplaints(data) {
return request({
url: '/supervision/complaint/bulk_delete/',
method: 'delete',
data
})
}
export function delOinspects(data) {
return request({
url: '/supervision/oinspect/bulk_delete/',
method: 'delete',
data
})
} }

View File

@ -415,6 +415,18 @@ export const asyncRoutes = [
meta: { title: '信息收集', icon: 'PT', perms: ['infoCollect'] }, meta: { title: '信息收集', icon: 'PT', perms: ['infoCollect'] },
alwaysShow: true, alwaysShow: true,
children: [ children: [
{
path: 'qualificInfo',
name: 'qualificInfo',
component: () => import('@/views/informatiomCollect/qualificInfo.vue'),
meta: { title: '资质情况', perms: ['infoCollect_QIN'] }
},
{
path: 'qualiChange',
name: 'qualiChange',
component: () => import('@/views/informatiomCollect/qualiChange.vue'),
meta: { title: '资质变更情况', perms: ['infoCollect_QICH'] }
},
{ {
path: 'reviewStatus', path: 'reviewStatus',
name: 'reviewStatus', name: 'reviewStatus',

View File

@ -46,11 +46,11 @@
</el-table-column> --> </el-table-column> -->
<el-table-column align="center" label="操作" width="120px" fixed="right"> <el-table-column align="center" label="操作" width="120px" fixed="right">
<template slot-scope="scope"> <template slot-scope="scope">
<el-link :disabled="!checkPermission(['infoCollect_LC'])" type="primary" size="small" <el-link v-if="currentDept=scope.row.belong_dept" :disabled="!checkPermission(['infoCollect_LC'])" type="primary" size="small"
@click="handleEdit(scope)">编辑</el-link> @click="handleEdit(scope)">编辑</el-link>
<el-divider direction="vertical" <el-divider direction="vertical"
v-if="checkPermission(['infoCollect_LC']) && checkPermission(['infoCollect_LC'])"></el-divider> v-if="checkPermission(['infoCollect_LC']) && checkPermission(['infoCollect_LC'])"></el-divider>
<el-link :disabled="!checkPermission(['infoCollect_LC'])" type="danger" size="small" <el-link v-if="currentDept=scope.row.belong_dept" :disabled="!checkPermission(['infoCollect_LC'])" type="danger" size="small"
@click="handleDelete(scope)">删除</el-link> @click="handleDelete(scope)">删除</el-link>
</template> </template>
</el-table-column> </el-table-column>
@ -141,6 +141,7 @@ export default {
tel_quality: "", tel_quality: "",
email_quality: "" email_quality: ""
}, },
currentDept: this.$store.state.user.dept,
upHeaders: upHeaders(), upHeaders: upHeaders(),
upUrl: upUrl(), upUrl: upUrl(),
fileList: [], fileList: [],
@ -247,6 +248,8 @@ export default {
this.Content = Object.assign({}, scope.row); // copy obj this.Content = Object.assign({}, scope.row); // copy obj
this.dialogType = "edit"; this.dialogType = "edit";
this.dialogVisible = true; this.dialogVisible = true;
console.log(this.Content);
console.log(this.currentDept)
if (this.Content.file) { if (this.Content.file) {
this.fileList = [ this.fileList = [
{ {

View File

@ -0,0 +1,86 @@
<template>
<div class="app-container">
<el-card style="margin-top: 10px">
<el-table :data="tableData.results" style="width: 100%" v-loading="listLoading" >
<el-table-column label="公司名称" prop="company_name"></el-table-column>
<el-table-column
v-for="column in tableColumns"
:key="column.difference.name"
:prop="column.difference.name"
:new="column.difference.new"
:old="column.difference.old"
></el-table-column>
</el-table>
<pagination v-show="tableData.count > 0" :total="tableData.count" :page.sync="listQuery.page"
:limit.sync="listQuery.page_size" @pagination="getTableList" />
</el-card>
</div>
</template>
<script>
import checkPermission from "@/utils/permission";
import Pagination from "@/components/Pagination"; // secondary package based on el-pagination
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import { getDictList, getDictTypeList } from "@/api/dict";
import { getChangeInfo} from "@/api/qualificationInfo";
export default {
components: { Pagination, Treeselect },
data(){
return {
listLoading: false,
listQuery: {
page: 1,
page_size: 20,
},
tableColumns: [],
tableData: {
count: 0
},
activateOptions:[
{key:'国家级',value:'国家级'},
{key:'省级',value:'省级'}
],
ac_options:{'国家级':'国家级', '省级':'省级'}
}
},
mounted() {
let that = this;
// let height1 = document.getElementsByClassName('app-main')[0].clientHeight;
// let height2 = document.getElementsByClassName('elHeader')[0].clientHeight;
// that.tableHeight = height1 - height2 - 70;
// console.log(that.tableHeight)
that.getList();
},
methods: {
//提交表单
getTableList(){
this.getList()
},
checkPermission,
getList() {
this.listLoading = true;
this.tableData.results =[];
this.tableData.count =0;
getChangeInfo(this.listQuery).then((response) => {
console.log(response);
if (response.data) {
this.tableData = response.data;
this.tableColumns = response.data.results
console.log(this.tableColumns)
}
this.listLoading = false;
});
},
},
};
</script>
<style></style>

View File

@ -0,0 +1,392 @@
<template>
<div class="app-container">
<el-card class="elHeader">
<el-button type="primary" icon="el-icon-plus" @click="handleAddFile">新增</el-button>
<el-button type="primary" @click="showExportDialog = true">导出</el-button>
</el-card>
<el-card style="margin-top: 10px">
<el-table v-loading="listLoading"
:data="tableData.results"
border fit stripe
highlight-current-row>
<el-table-column type="index" width="50" />
<el-table-column label="公司名称" prop="company_name"></el-table-column>
<el-table-column label="资质名称" prop="name"></el-table-column>
<el-table-column label="资质类型" prop="quali_type">
<template slot-scope="scope">
<span>{{ac_options[scope.row.quali_type]}}</span>
</template>
</el-table-column>
<el-table-column label="发证单位" prop="org"></el-table-column>
<el-table-column label="发证日期" prop="org_date"></el-table-column>
<el-table-column label="截至日期" prop="expiration_date"></el-table-column>
<el-table-column label="资质范围" prop="scope"></el-table-column>
<el-table-column label="参数数量" prop="number"></el-table-column>
<el-table-column label="变更日期" prop="update_time"></el-table-column>
<el-table-column align="center" label="操作" width="120px" fixed="right">
<template slot-scope="scope">
<el-link :disabled="!checkPermission(['infoCollect_QIN'])" type="primary" size="small"
@click="handleEdit(scope)">编辑</el-link>
<el-divider direction="vertical"
v-if="checkPermission(['infoCollect_QIN']) && checkPermission(['infoCollect_QIN'])"></el-divider>
<el-link :disabled="!checkPermission(['infoCollect_QIN'])" type="danger" size="small"
@click="handleDelete(scope)">删除</el-link>
</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="getTableList" />
</el-card>
<el-dialog :visible.sync="dialogVisible" :title="dialogType === 'edit' ? '编辑' : '新增'">
<el-form ref="Form" :model="Content" label-width="80px" label-position="right" :rules="rule">
<el-form-item label="公司名称" prop="company_name">
<el-input v-model="Content.company_name" placeholder="公司名称"/>
</el-form-item>
<el-form-item label="资质名称" prop="name">
<el-input v-model="Content.name" placeholder="资质名称"/>
</el-form-item>
<el-form-item label="资质类型">
<el-select
v-model="Content.quali_type"
placeholder="请选择"
>
<el-option
v-for="item in activateOptions"
:key="item.value"
:label="item.key"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="发证单位" prop="org">
<el-input v-model="Content.org" ></el-input>
</el-form-item>
<el-form-item label="发证日期" prop="org_date">
<el-date-picker
v-model="Content.org_date"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
style="width:50%"
>
</el-date-picker>
</el-form-item>
<el-form-item label="截至日期" prop="expiration_date">
<el-date-picker
v-model="Content.expiration_date"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
style="width:50%"
>
</el-date-picker>
</el-form-item>
<el-form-item label="资质范围" prop="scope">
<el-input v-model="Content.scope" ></el-input>
</el-form-item>
<el-form-item label="参数数量" prop="number" >
<el-input-number
v-model="Content.number"
:min="1"
controls-position="right"
:step="1"
/>
</el-form-item>
<el-form-item label="证书上传" prop="file">
<el-upload
ref="upload"
:action="upUrl"
:on-success="handleUpSuccess"
:on-remove="handleRemove"
:on-preview="handlePreview"
:headers="upHeaders"
:file-list="fileList"
:limit="1"
accept=".doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip">
<el-button size="small" type="primary">上传证书</el-button>
</el-upload>
</el-form-item>
</el-form>
<div style="text-align: right">
<el-button type="danger" @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="confirm('Form')">确认</el-button>
</div>
</el-dialog>
<el-dialog
title="选择时间范围"
:visible.sync="showExportDialog"
width="50%"
@close="showExportDialog = false"
>
<el-form :model="exportForm" ref="exportForm" label-width="120px">
<el-form-item label="开始日期">
<el-date-picker
v-model="exportForm.startDate"
type="date"
placeholder="选择开始日期"
></el-date-picker>
</el-form-item>
<el-form-item label="结束日期">
<el-date-picker
v-model="exportForm.endDate"
type="date"
placeholder="选择结束日期"
></el-date-picker>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="showExportDialog = false">取消</el-button>
<el-button type="primary" @click="handleExport">确定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import checkPermission from "@/utils/permission";
import Pagination from "@/components/Pagination"; // secondary package based on el-pagination
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import { getDictList, getDictTypeList } from "@/api/dict";
import { getMyQi, getQi, updateQi, createQi, delQi} from "@/api/qualificationInfo";
import { upUrl, upHeaders } from "@/api/file";
import { saveAs } from 'file-saver';
import XLSX from 'xlsx';
const defaultContent = {
company_name: "",
name: "",
quali_type: "",
org: "",
org_date: "",
expiration_date: "",
scope: "",
number: "",
cie_path: ""
};
export default {
components: { Pagination, Treeselect },
data(){
return {
form: {
company_name: "",
name: "",
quali_type: "",
org: "",
org_date: "",
expiration_date: "",
scope: "",
number: "",
cie_path: ""
},
upHeaders: upHeaders(),
upUrl: upUrl(),
fileList: [],
Content: defaultContent,
typeOptions: [],
listLoading: false,
dialogVisible: false,
showExportDialog: false,
exportForm: {
startDate: '', // 开始日期
endDate: '', // 结束日期
},
listQuery: {
page: 1,
page_size: 20,
},
tableData: {
count: 0
},
dialogType: "new",
rule: {
name: [{ required: true, message: "请输入名称", trigger: "blur" }],
},
filterOrgText: "",
// tableHeight: '300px',
activateOptions:[
{key:'国家级',value:'国家级'},
{key:'省级',value:'省级'}
],
ac_options:{'国家级':'国家级', '省级':'省级'}
}
},
mounted() {
let that = this;
let height1 = document.getElementsByClassName('app-main')[0].clientHeight;
let height2 = document.getElementsByClassName('elHeader')[0].clientHeight;
that.tableHeight = height1 - height2 - 70;
console.log(that.tableHeight)
that.getList();
},
methods: {
//提交表单
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
if (this.dialogType == "new") {
this.addData();
} else {
this.editData();
}
} else {
console.log("error submit!!");
return false;
}
});
},
getTableList(){
this.getList()
},
handleExport() {
if (!this.exportForm.startDate || !this.exportForm.endDate) {
this.$message.error('请选择完整的起止日期!');
return;}
console.log(this.exportForm)
exportData(this.exportForm).then((response) => {
if (response.data) {
let filename = '质量活动表.xlsx';
let tableData = response.data;
console.log(tableData)
const ws = XLSX.utils.json_to_sheet(tableData.results);
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
try {
saveAs(new Blob([wbout], { type: 'application/octet-stream' }), filename);
} catch (e) { if(typeof console !== 'undefined') console.log(e, wbout); }
return;
}else {
this.$message.error(data.message || '导出失败');
}
})
// this.showExportDialog = false;
.catch(error => {
this.$message.error('请求失败,请稍后再试');
console.error(error);
})
.finally(() => {
this.handleDialogClose();
});
},
handleDialogClose(){
this.showExportDialog = false;
this.startDate = '';
this.endDate = '';
},
handlePreview(file) {
if ("url" in file) {
window.open(file.url);
} else {
window.open(file.response.data.path);
}
},
handleUpSuccess(res, file, filelist) {
console.log(res.data.path)
this.Content.cie_path = res.data.path;
this.Content.file = res.data.id;
},
handleRemove(file, filelist) {
this.Content.file = null;
},
checkPermission,
getList() {
this.listLoading = true;
this.tableData.results =[];
this.tableData.count =0;
getMyQi(this.listQuery).then((response) => {
console.log(response);
if (response.data) {
this.tableData = response.data;
}
this.listLoading = false;
});
},
handleAddFile() {
this.Content = Object.assign({}, defaultContent);
this.dialogType = "new";
this.dialogVisible = true;
this.fileList = []
this.$nextTick(() => {
this.$refs["Form"].clearValidate();
});
},
handleEdit(scope) {
this.Content = Object.assign({}, scope.row); // copy obj
this.dialogType = "edit";
this.dialogVisible = true;
if (this.Content.file) {
this.fileList = [
{
name: this.Content.file_.name,
url: this.Content.file,
},
];
}
this.$nextTick(() => {
this.$refs["Form"].clearValidate();
});
},
handleDelete(scope) {
this.$confirm("确认删除?", "警告", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "error",
})
.then(async () => {
await delQi(scope.row.id).then(() => {
this.getList();
this.$message.success("成功");
this.getTableList();
})
})
.catch((err) => {
console.error(err);
});
},
async confirm(form) {
this.$refs[form].validate((valid) => {
if (valid) {
const isEdit = this.dialogType === "edit";
if (isEdit) {
console.log(this.Content, "edited");
updateQi(this.Content.id, this.Content).then((response) => {
if (response.data) {
this.tableData = response.data;
}
this.listLoading = false;
this.dialogVisible = false;
this.getTableList();
});
} else {
createQi(this.Content).then((response) => {
if (response.data) {
console.log(response.data, "created");
this.tableData = response.data;
}
this.listLoading = false;
this.dialogVisible = false;
this.getTableList();
});
}
} else {
return false;
}
});
},
},
};
</script>
<style></style>

View File

@ -7,20 +7,22 @@
</div> </div>
</el-card> </el-card>
<el-card style="margin-top: 10px"> <el-card style="margin-top: 10px">
<el-table v-loading="listLoading" :data="tableData.results" :hieght="tableHeight" border fit stripe <el-table v-loading="listLoading" :data="tableData.results" :hieght="tableHeight" border fit stripe
highlight-current-row> highlight-current-row>
<el-table-column type="index" width="50" /> <el-table-column type="index" width="50" />
<el-table-column label="公司名称"> <el-table-column label="公司名称">
<template slot-scope="scope">{{ scope.row.name }}</template> <template slot-scope="scope">{{ scope.row.name }}</template>
</el-table-column> </el-table-column>
<el-table-column label="资质名称"> <el-table-column label="资质名称">
<template slot-scope="scope">{{ scope.row.qualification_name }}</template> <template slot-scope="scope">{{ scope.row.quali_name }}</template>
</el-table-column> </el-table-column>
<el-table-column label="评审方法"> <el-table-column label="评审方法">
<template slot-scope="scope">{{ scope.row.judging_method }}</template> <template slot-scope="scope">
<span>{{ cateOptions[scope.row.judging_method] }}</span>
</template>
</el-table-column> </el-table-column>
<el-table-column label="评审类型"> <el-table-column label="评审类型">
<template slot-scope="scope">{{ scope.row.judging_type }}</template> <template slot-scope="scope">{{ typesOp[scope.row.judging_type] }}</template>
</el-table-column> </el-table-column>
<el-table-column label="新增参数(个)"> <el-table-column label="新增参数(个)">
<template slot-scope="scope">{{ scope.row.add_param }}</template> <template slot-scope="scope">{{ scope.row.add_param }}</template>
@ -54,8 +56,17 @@
<el-form-item label="公司名称" prop="name"> <el-form-item label="公司名称" prop="name">
<el-input v-model="Content.name" placeholder="公司名称" /> <el-input v-model="Content.name" placeholder="公司名称" />
</el-form-item> </el-form-item>
<el-form-item label="资质名称" prop="qualification_name"> <el-form-item label="资质名称" prop="quali">
<el-input v-model="Content.qualification_name" placeholder="资质名称" /> <template>
<el-select v-model="Content.quali" placeholder="请选择" @visible-change="handleVisibleChange">
<el-option
v-for="item in options"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</template>
</el-form-item> </el-form-item>
<el-form-item label="评审方法" prop="judging_method"> <el-form-item label="评审方法" prop="judging_method">
<el-select v-model="Content.judging_method" placeholder="请选择"> <el-select v-model="Content.judging_method" placeholder="请选择">
@ -149,12 +160,14 @@ import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css"; import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import { getDictList, getDictTypeList } from "@/api/dict"; import { getDictList, getDictTypeList } from "@/api/dict";
import { createRs, delRs, updateRs, getMyRs, getRs, exportData } from "@/api/review"; import { createRs, delRs, updateRs, getMyRs, getRs, exportData } from "@/api/review";
import { getMyQi} from "@/api/qualificationInfo";
import { upUrl, upHeaders } from "@/api/file"; import { upUrl, upHeaders } from "@/api/file";
import { saveAs } from 'file-saver'; import { saveAs } from 'file-saver';
import XLSX from 'xlsx'; import XLSX from 'xlsx';
const defaultContent = { const defaultContent = {
name: "", name: "",
qualification_name: "", qualification_name: "",
quali:"",
judging_method: "", judging_method: "",
judging_type: "", judging_type: "",
add_param: "", add_param: "",
@ -175,9 +188,24 @@ export default {
add_param: "", add_param: "",
review_date: "", review_date: "",
now_count: "", now_count: "",
add_count: "" add_count: "",
quali:""
}, },
method_options: [{value: 0,label: '文审'},{value: 10,label: '现场'}], method_options: [{value: 0,label: '文审'},{value: 10,label: '现场'}],
cateOptions: {
0:'文审',
10:'现场'
},
typesOp: {
0:'初次',
10:'扩项',
20:'变更',
30:'复评',
40:'迁址'
},
selectedValue: '',
options: [],
isoading: false, //是否正在加载数据
type_options: [{ type_options: [{
value: 0, value: 0,
label: '初次'}, label: '初次'},
@ -253,12 +281,10 @@ export default {
this.Content.file = null; this.Content.file = null;
}, },
checkPermission, checkPermission,
filterNode(value, data) { filterNode(value, data) {
if (!value) return true; if (!value) return true;
return data.label.indexOf(value) !== -1; return data.label.indexOf(value) !== -1;
}, },
getList() { getList() {
this.listLoading = true; this.listLoading = true;
this.tableData.results =[]; this.tableData.results =[];
@ -380,6 +406,32 @@ export default {
} }
}); });
}, },
async handleVisibleChange(val) {
if (val) {
// 当下拉框变为可见时调用接口获取数据
if (!this.isLoading) {
this.isLoading = true; // 设置加载状态防止重复请求
try {
const response = await this.fetchOptions();
console.log(response,"ceshi");
} catch (error) {
// 处理错误
console.error(error);
} finally {
this.isLoading = false; // 无论成功还是失败都重置加载状态
}
}
}
},
fetchOptions() {
getMyQi().then((response) => {
console.log(response);
if (response.data) {
this.options = response.data.results;
}
});
}
}, },
}; };

View File

@ -244,6 +244,7 @@
<el-button type="primary" size="mini" @click="handleImport('oinspect')">导入</el-button> <el-button type="primary" size="mini" @click="handleImport('oinspect')">导入</el-button>
<el-button type="primary" size="mini" icon="el-icon-plus" @click="handleCreate('oinspect')"></el-button> <el-button type="primary" size="mini" icon="el-icon-plus" @click="handleCreate('oinspect')"></el-button>
<el-button type="primary" size="mini" @click="exportTableExcel('oinspect','外部监督检查信息')">导出</el-button> <el-button type="primary" size="mini" @click="exportTableExcel('oinspect','外部监督检查信息')">导出</el-button>
<el-button type="danger" size="mini" :disabled="this.sels.length==0" @click="batchDelete('oinspect')">批量删除</el-button>
</div> </div>
</div> </div>
<el-table <el-table
@ -252,7 +253,9 @@
stripe stripe
highlight-current-row highlight-current-row
max-height="300" max-height="300"
> row-key="id"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="40"></el-table-column>
<el-table-column label="序号" type="index" width="50" /> <el-table-column label="序号" type="index" width="50" />
<el-table-column label="检查类型"> <el-table-column label="检查类型">
<template slot-scope="scope"> <template slot-scope="scope">
@ -287,28 +290,7 @@
>删除</el-link> >删除</el-link>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<el-table
:data="oinspectList"
fit
stripe
highlight-current-row
id="oinspect"
style="display: none;"
>
<el-table-column label="序号" type="index" width="50" />
<el-table-column label="检查类型">
<template slot-scope="scope">
<span>{{ cateOptions[scope.row.cate] }}</span>
</template>
</el-table-column>
<el-table-column label="检查机构" prop="checker"></el-table-column>
<el-table-column label="检查日期" prop="date_inspect"></el-table-column>
<el-table-column label="检查结果" prop="result"></el-table-column>
<el-table-column label="结果日期" prop="result_date"></el-table-column>
<el-table-column label="检查通知单" prop="notification_form"></el-table-column>
<el-table-column label="结果告知单" prop="result_form"></el-table-column>
</el-table>
</el-card> </el-card>
<saveoin-dialog <saveoin-dialog
v-if="dialogOin" v-if="dialogOin"
@ -329,6 +311,7 @@
<el-button type="primary" size="mini" @click="handleImport('rc')">导入</el-button> <el-button type="primary" size="mini" @click="handleImport('rc')">导入</el-button>
<el-button type="primary" size="mini" icon="el-icon-plus" @click="handleCreate('rc')"></el-button> <el-button type="primary" size="mini" icon="el-icon-plus" @click="handleCreate('rc')"></el-button>
<el-button type="primary" size="mini" @click="exportTableExcel('rcList','不准确报告/证书')">导出</el-button> <el-button type="primary" size="mini" @click="exportTableExcel('rcList','不准确报告/证书')">导出</el-button>
<el-button type="danger" size="mini" :disabled="this.sels.length==0" @click="batchDelete('rc')">批量删除</el-button>
</div> </div>
</div> </div>
<el-table <el-table
@ -337,7 +320,10 @@
stripe stripe
highlight-current-row highlight-current-row
max-height="300" max-height="300"
row-key="id"
@selection-change="handleSelectionChange"
> >
<el-table-column type="selection" width="40"></el-table-column>
<el-table-column label="序号" type="index" width="50" /> <el-table-column label="序号" type="index" width="50" />
<el-table-column label="报告/证书编号" prop="number"></el-table-column> <el-table-column label="报告/证书编号" prop="number"></el-table-column>
<el-table-column label="更改后报告/证书编号" prop="number_correct"></el-table-column> <el-table-column label="更改后报告/证书编号" prop="number_correct"></el-table-column>
@ -389,6 +375,7 @@
<el-button type="primary" size="mini" @click="handleImport('rc2')">导入</el-button> <el-button type="primary" size="mini" @click="handleImport('rc2')">导入</el-button>
<el-button type="primary" size="mini" icon="el-icon-plus" @click="handleCreate('rc2')"></el-button> <el-button type="primary" size="mini" icon="el-icon-plus" @click="handleCreate('rc2')"></el-button>
<el-button type="primary" size="mini" @click="exportTableExcel('rc2','超期报告/证书')">导出</el-button> <el-button type="primary" size="mini" @click="exportTableExcel('rc2','超期报告/证书')">导出</el-button>
<el-button type="danger" size="mini" :disabled="this.sels.length==0" @click="batchDelete('rc2')">批量删除</el-button>
</div> </div>
</div> </div>
<el-table <el-table
@ -397,7 +384,10 @@
stripe stripe
highlight-current-row highlight-current-row
max-height="300" max-height="300"
row-key="id"
@selection-change="handleSelectionChange"
> >
<el-table-column type="selection" width="40"></el-table-column>
<el-table-column label="序号" type="index" width="50" /> <el-table-column label="序号" type="index" width="50" />
<el-table-column label="超期报告/证书编号" prop="number"></el-table-column> <el-table-column label="超期报告/证书编号" prop="number"></el-table-column>
<el-table-column label="业务受理日期" prop="date_accept"></el-table-column> <el-table-column label="业务受理日期" prop="date_accept"></el-table-column>
@ -439,6 +429,7 @@
id="rc2" id="rc2"
style="display: none;" style="display: none;"
> >
<el-table-column type="selection" width="40"></el-table-column>
<el-table-column label="序号" type="index" width="50" /> <el-table-column label="序号" type="index" width="50" />
<el-table-column label="超期报告/证书编号" prop="number"></el-table-column> <el-table-column label="超期报告/证书编号" prop="number"></el-table-column>
<el-table-column label="业务受理日期" prop="date_accept"></el-table-column> <el-table-column label="业务受理日期" prop="date_accept"></el-table-column>
@ -464,6 +455,7 @@
<el-button type="primary" size="mini" @click="handleImport('pt')">导入</el-button> <el-button type="primary" size="mini" @click="handleImport('pt')">导入</el-button>
<el-button type="primary" size="mini" icon="el-icon-plus" @click="handleCreate('pt')"></el-button> <el-button type="primary" size="mini" icon="el-icon-plus" @click="handleCreate('pt')"></el-button>
<el-button type="primary" size="mini" @click="exportTableExcel('ptList','能力验证结果')">导出</el-button> <el-button type="primary" size="mini" @click="exportTableExcel('ptList','能力验证结果')">导出</el-button>
<el-button type="danger" size="mini" :disabled="this.sels.length==0" @click="batchDelete('pt')">批量删除</el-button>
</div> </div>
</div> </div>
<el-table <el-table
@ -472,7 +464,10 @@
stripe stripe
highlight-current-row highlight-current-row
max-height="300" max-height="300"
@selection-change="handleSelectionChange"
> >
<el-table-column type="selection" width="40"></el-table-column>
<el-table-column label="序号" type="index" width="50" /> <el-table-column label="序号" type="index" width="50" />
<el-table-column label="能力验证名称" prop="name"></el-table-column> <el-table-column label="能力验证名称" prop="name"></el-table-column>
<el-table-column label="项目编号" prop="number"></el-table-column> <el-table-column label="项目编号" prop="number"></el-table-column>
@ -576,6 +571,7 @@
<el-button type="primary" size="mini" @click="handleImport('complaint')">导入</el-button> <el-button type="primary" size="mini" @click="handleImport('complaint')">导入</el-button>
<el-button type="primary" size="mini" icon="el-icon-plus" @click="handleCreate('complaint')"></el-button> <el-button type="primary" size="mini" icon="el-icon-plus" @click="handleCreate('complaint')"></el-button>
<el-button type="primary" size="mini" @click="exportTableExcel('complaint','客户投诉信息')">导出</el-button> <el-button type="primary" size="mini" @click="exportTableExcel('complaint','客户投诉信息')">导出</el-button>
<el-button type="danger" size="mini" :disabled="this.sels.length==0" @click="batchDelete('complaint')">批量删除</el-button>
</div> </div>
</div> </div>
<el-table <el-table
@ -584,7 +580,9 @@
stripe stripe
highlight-current-row highlight-current-row
max-height="300" max-height="300"
@selection-change="handleSelectionChange"
> >
<el-table-column type="selection" width="40"></el-table-column>
<el-table-column label="序号" type="index" width="50" /> <el-table-column label="序号" type="index" width="50" />
<el-table-column label="投诉人/机构" prop="complainant"></el-table-column> <el-table-column label="投诉人/机构" prop="complainant"></el-table-column>
<el-table-column label="投诉内容" prop="content"></el-table-column> <el-table-column label="投诉内容" prop="content"></el-table-column>
@ -624,6 +622,7 @@
id="complaint" id="complaint"
style="display: none;" style="display: none;"
> >
<el-table-column type="selection" width="40"></el-table-column>
<el-table-column label="序号" type="index" width="50" /> <el-table-column label="序号" type="index" width="50" />
<el-table-column label="投诉人/机构" prop="complainant"></el-table-column> <el-table-column label="投诉人/机构" prop="complainant"></el-table-column>
<el-table-column label="投诉内容" prop="content"></el-table-column> <el-table-column label="投诉内容" prop="content"></el-table-column>
@ -655,6 +654,7 @@
<el-button type="primary" size="mini" @click="handleImport('risk')">导入</el-button> <el-button type="primary" size="mini" @click="handleImport('risk')">导入</el-button>
<el-button type="primary" size="mini" icon="el-icon-plus" @click="handleCreate('risk')"></el-button> <el-button type="primary" size="mini" icon="el-icon-plus" @click="handleCreate('risk')"></el-button>
<el-button type="primary" size="mini" @click="exportTableExcel('risk','风险识别信息')">导出</el-button> <el-button type="primary" size="mini" @click="exportTableExcel('risk','风险识别信息')">导出</el-button>
<el-button type="danger" size="mini" :disabled="this.sels.length==0" @click="batchDelete('risk')">批量删除</el-button>
</div> </div>
</div> </div>
<el-table <el-table
@ -663,7 +663,9 @@
stripe stripe
highlight-current-row highlight-current-row
max-height="300" max-height="300"
@selection-change="handleSelectionChange"
> >
<el-table-column type="selection" width="40"></el-table-column>
<el-table-column label="序号" type="index" width="50" /> <el-table-column label="序号" type="index" width="50" />
<el-table-column label="风险事实描述" prop="content"></el-table-column> <el-table-column label="风险事实描述" prop="content"></el-table-column>
<el-table-column label="风险类别"> <el-table-column label="风险类别">
@ -775,7 +777,7 @@
import { getMyTask2Do,getPgoalDeptList,createPgoalDept,updatePgoalDept,noNum, import { getMyTask2Do,getPgoalDeptList,createPgoalDept,updatePgoalDept,noNum,
deletePgoalDept,saveNum,getPtList,deletePt,getRcList,deleteRc,getRiskList, deletePgoalDept,saveNum,getPtList,deletePt,getRcList,deleteRc,getRiskList,
deleteRisk,getComplaintList,deleteComplaint,getOinspectList,deleteOinspect, deleteRisk,getComplaintList,deleteComplaint,getOinspectList,deleteOinspect,
impPt,impRc,impOverdue,impRisk,impComplaint,impOinspect,getPgoalList} from "@/api/task"; impPt,impRc,impOverdue,impRisk,impComplaint,impOinspect,getPgoalList, delPts,delOinspects, delComplaints, delRcs, delRicks} from "@/api/task";
import { getOrgList, getSubOrgList } from "@/api/org"; import { getOrgList, getSubOrgList } from "@/api/org";
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
import Pagination from "@/components/Pagination"; import Pagination from "@/components/Pagination";
@ -808,6 +810,7 @@
orgData:[], orgData:[],
subData:[], subData:[],
fileList:[], fileList:[],
sels:[],
task2do:'', task2do:'',
taskYear:'', taskYear:'',
deptName:'', deptName:'',
@ -927,6 +930,53 @@
return wbout return wbout
}, },
checkPermission, checkPermission,
handleSelectionChange(sels) {
this.sels = sels;
console.log("选中的值",sels.map((item) => item.id));
},
batchDelete(type) {
if (this.sels.length === 0) {
this.$message({
message: '请选择要删除的项',
type: 'warning'
});
return;
}else{
// 删除前的提示
this.$confirm("确认删除记录吗?", "提示", {
type: "warning",
}).then(() => {
let ids = this.sels.map((item) => item.id);
console.log("ids",ids);
this.deleteItems(type, ids);
this.getList()});
}
},
deleteItems(type, ids){
let item = {ids:ids}
if(type=='rc'){
delRcs(item).then(res=>{
this.getRcList();
})
}else if(type=='pt'){
console.log("删除的值",item);
delPts(item).then(res=>{
this.getPtList();
})
}else if(type=='risk'){
delRicks(item).then(res=>{
this.getRiskList();
})
}else if(type=='complaint'){
delComplaints(item).then(res=>{
this.getComplaintList();
})
}else if(type=='oinspect'){
delOinspects(item).then(res=>{
this.getOinspectList();
})
}
},
getOrgList() { getOrgList() {
let that = this; let that = this;
if (that.checkPermission(["record_confirm"])) { if (that.checkPermission(["record_confirm"])) {

View File

@ -65,10 +65,6 @@
accept=".doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip"> accept=".doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip">
<el-button size="small" type="primary">上传文件</el-button> <el-button size="small" type="primary">上传文件</el-button>
</el-upload> </el-upload>
<div style="text-align: right">
<el-button type="danger" @click="impDialogVisible = false">取消</el-button>
<el-button type="primary" @click="onSubmit()">确认</el-button>
</div>
</el-form-item> </el-form-item>
<el-form-item label="结果告知单" prop="file"> <el-form-item label="结果告知单" prop="file">
<el-upload <el-upload
@ -154,7 +150,6 @@
//表单注入数据 //表单注入数据
setData(data) { setData(data) {
console.log(data); console.log(data);
console.log("111111111111111")
Object.assign(this.form, data); Object.assign(this.form, data);
if(data.notification_form){ if(data.notification_form){
this.fileList = [{ name: data.notification_form.split('/')[5], value: data.notification_form }]; this.fileList = [{ name: data.notification_form.split('/')[5], value: data.notification_form }];

View File

@ -0,0 +1,28 @@
# Generated by Django 3.2.12 on 2024-04-10 06:34
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('information', '0019_auditlog_qualification'),
]
operations = [
migrations.AlterField(
model_name='auditlog',
name='change_time',
field=models.DateField(verbose_name='变更时间'),
),
migrations.AlterField(
model_name='qualification',
name='create_date',
field=models.DateField(auto_now_add=True, null=True),
),
migrations.AlterField(
model_name='qualification',
name='update_date',
field=models.DateField(auto_now=True, null=True),
),
]

View File

@ -0,0 +1,23 @@
# Generated by Django 3.2.12 on 2024-04-10 08:04
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('information', '0020_auto_20240410_1434'),
]
operations = [
migrations.RemoveField(
model_name='abilityreview',
name='qualification_name',
),
migrations.AddField(
model_name='abilityreview',
name='qualification',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='information.qualification', verbose_name='资质情况'),
),
]

View File

@ -0,0 +1,65 @@
# Generated by Django 3.2.12 on 2024-04-10 08:55
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('system', '0023_alter_user_first_name'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('information', '0021_auto_20240410_1604'),
]
operations = [
migrations.RemoveField(
model_name='abilityreview',
name='create_date',
),
migrations.RemoveField(
model_name='abilityreview',
name='department',
),
migrations.RemoveField(
model_name='abilityreview',
name='update_date',
),
migrations.AddField(
model_name='abilityreview',
name='belong_dept',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='abilityreview_belong_dept', to='system.organization', verbose_name='所属部门'),
),
migrations.AddField(
model_name='abilityreview',
name='create_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='abilityreview_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人'),
),
migrations.AddField(
model_name='abilityreview',
name='create_time',
field=models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间'),
),
migrations.AddField(
model_name='abilityreview',
name='is_deleted',
field=models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记'),
),
migrations.AddField(
model_name='abilityreview',
name='qualification_name',
field=models.CharField(blank=True, max_length=20, null=True, verbose_name='资质名称'),
),
migrations.AddField(
model_name='abilityreview',
name='update_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='abilityreview_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'),
),
migrations.AddField(
model_name='abilityreview',
name='update_time',
field=models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间'),
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 3.2.12 on 2024-04-10 09:13
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('information', '0022_auto_20240410_1655'),
]
operations = [
migrations.AlterField(
model_name='abilityreview',
name='qualification',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='information.qualification', verbose_name='资质情况'),
),
]

View File

@ -0,0 +1,22 @@
# Generated by Django 3.2.12 on 2024-04-11 01:40
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('information', '0023_alter_abilityreview_qualification'),
]
operations = [
migrations.RenameField(
model_name='abilityreview',
old_name='qualification',
new_name='quali',
),
migrations.RemoveField(
model_name='abilityreview',
name='qualification_name',
),
]

View File

@ -0,0 +1,224 @@
# Generated by Django 3.2.12 on 2024-04-11 06:17
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('system', '0023_alter_user_first_name'),
('information', '0024_auto_20240411_0940'),
]
operations = [
migrations.RemoveField(
model_name='contact',
name='create_date',
),
migrations.RemoveField(
model_name='contact',
name='update_date',
),
migrations.RemoveField(
model_name='externalauditors',
name='create_date',
),
migrations.RemoveField(
model_name='externalauditors',
name='department',
),
migrations.RemoveField(
model_name='externalauditors',
name='update_date',
),
migrations.RemoveField(
model_name='qualification',
name='create_date',
),
migrations.RemoveField(
model_name='qualification',
name='department',
),
migrations.RemoveField(
model_name='qualification',
name='update_date',
),
migrations.RemoveField(
model_name='qualityactivities',
name='create_date',
),
migrations.RemoveField(
model_name='qualityactivities',
name='department',
),
migrations.RemoveField(
model_name='qualityactivities',
name='update_date',
),
migrations.RemoveField(
model_name='qualitycommendation',
name='create_date',
),
migrations.RemoveField(
model_name='qualitycommendation',
name='department',
),
migrations.RemoveField(
model_name='qualitycommendation',
name='update_date',
),
migrations.AddField(
model_name='contact',
name='belong_dept',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='contact_belong_dept', to='system.organization', verbose_name='所属部门'),
),
migrations.AddField(
model_name='contact',
name='create_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='contact_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人'),
),
migrations.AddField(
model_name='contact',
name='create_time',
field=models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间'),
),
migrations.AddField(
model_name='contact',
name='is_deleted',
field=models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记'),
),
migrations.AddField(
model_name='contact',
name='update_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='contact_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'),
),
migrations.AddField(
model_name='contact',
name='update_time',
field=models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间'),
),
migrations.AddField(
model_name='externalauditors',
name='belong_dept',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='externalauditors_belong_dept', to='system.organization', verbose_name='所属部门'),
),
migrations.AddField(
model_name='externalauditors',
name='create_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='externalauditors_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人'),
),
migrations.AddField(
model_name='externalauditors',
name='create_time',
field=models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间'),
),
migrations.AddField(
model_name='externalauditors',
name='is_deleted',
field=models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记'),
),
migrations.AddField(
model_name='externalauditors',
name='update_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='externalauditors_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'),
),
migrations.AddField(
model_name='externalauditors',
name='update_time',
field=models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间'),
),
migrations.AddField(
model_name='qualification',
name='belong_dept',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='qualification_belong_dept', to='system.organization', verbose_name='所属部门'),
),
migrations.AddField(
model_name='qualification',
name='create_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='qualification_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人'),
),
migrations.AddField(
model_name='qualification',
name='create_time',
field=models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间'),
),
migrations.AddField(
model_name='qualification',
name='is_deleted',
field=models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记'),
),
migrations.AddField(
model_name='qualification',
name='update_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='qualification_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'),
),
migrations.AddField(
model_name='qualification',
name='update_time',
field=models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间'),
),
migrations.AddField(
model_name='qualityactivities',
name='belong_dept',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='qualityactivities_belong_dept', to='system.organization', verbose_name='所属部门'),
),
migrations.AddField(
model_name='qualityactivities',
name='create_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='qualityactivities_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人'),
),
migrations.AddField(
model_name='qualityactivities',
name='create_time',
field=models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间'),
),
migrations.AddField(
model_name='qualityactivities',
name='is_deleted',
field=models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记'),
),
migrations.AddField(
model_name='qualityactivities',
name='update_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='qualityactivities_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'),
),
migrations.AddField(
model_name='qualityactivities',
name='update_time',
field=models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间'),
),
migrations.AddField(
model_name='qualitycommendation',
name='belong_dept',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='qualitycommendation_belong_dept', to='system.organization', verbose_name='所属部门'),
),
migrations.AddField(
model_name='qualitycommendation',
name='create_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='qualitycommendation_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人'),
),
migrations.AddField(
model_name='qualitycommendation',
name='create_time',
field=models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间'),
),
migrations.AddField(
model_name='qualitycommendation',
name='is_deleted',
field=models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记'),
),
migrations.AddField(
model_name='qualitycommendation',
name='update_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='qualitycommendation_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'),
),
migrations.AddField(
model_name='qualitycommendation',
name='update_time',
field=models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间'),
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 3.2.12 on 2024-04-12 08:08
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('information', '0025_auto_20240411_1417'),
]
operations = [
migrations.AlterField(
model_name='auditlog',
name='instance_id',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='information.qualification', verbose_name='实例ID'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2024-04-12 08:12
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('information', '0026_alter_auditlog_instance_id'),
]
operations = [
migrations.RenameField(
model_name='auditlog',
old_name='instance_id',
new_name='instance',
),
]

View File

@ -1,9 +1,10 @@
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
from apps.system.models import Organization
import uuid import uuid
from apps.system.models import CommonBDModel
class Qualification(models.Model):
class Qualification(CommonBDModel):
quali_options = (('国家级','国家级'),('省级','省级')) quali_options = (('国家级','国家级'),('省级','省级'))
company_name = models.CharField(max_length=20, verbose_name='公司名称', null=True, blank=True) company_name = models.CharField(max_length=20, verbose_name='公司名称', null=True, blank=True)
name = models.CharField(max_length=20, verbose_name='资质名称',null=True, blank=True) name = models.CharField(max_length=20, verbose_name='资质名称',null=True, blank=True)
@ -14,15 +15,7 @@ class Qualification(models.Model):
scope = models.TextField(verbose_name='资质范围', null=True, blank=True) scope = models.TextField(verbose_name='资质范围', null=True, blank=True)
number = models.IntegerField(verbose_name='参数数量', null=True, blank=True) number = models.IntegerField(verbose_name='参数数量', null=True, blank=True)
cie_path = models.CharField(max_length=100, verbose_name='证书路径', null=True, blank=True) cie_path = models.CharField(max_length=100, verbose_name='证书路径', null=True, blank=True)
create_date = models.DateTimeField(auto_now_add=True, null=True)
update_date = models.DateTimeField(auto_now=True, null=True)
department = models.ForeignKey(Organization, on_delete=models.PROTECT, null=True, verbose_name='所属单位')
def save(self, *args, **kwargs):
if not self.id:
self.create_date = timezone.now()
# update_date将自动设置为当前时间因为auto_now=True
super(Qualification, self).save(*args, **kwargs)
class Meta: class Meta:
verbose_name = '资质情况' verbose_name = '资质情况'
@ -32,10 +25,10 @@ class Qualification(models.Model):
class AuditLog(models.Model): class AuditLog(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
action = models.CharField('动作', max_length=20) action = models.CharField('动作', max_length=20)
instance_id = models.CharField('记录ID', max_length=20, editable=False) instance = models.ForeignKey(Qualification, on_delete=models.CASCADE, verbose_name='实例ID')
change_reason = models.CharField('变更原因', default='', max_length=50) change_reason = models.CharField('变更原因', default='', max_length=50)
change_user = models.ForeignKey('system.user', on_delete=models.SET_NULL, verbose_name='操作人', null=True, blank=True) change_user = models.ForeignKey('system.user', on_delete=models.SET_NULL, verbose_name='操作人', null=True, blank=True)
change_time = models.DateTimeField('变更时间') change_time = models.DateField('变更时间')
val_new = models.JSONField('变更后完整数据', default=dict) val_new = models.JSONField('变更后完整数据', default=dict)
difference = models.JSONField('变更情况', default=list) difference = models.JSONField('变更情况', default=list)
@ -44,7 +37,7 @@ class AuditLog(models.Model):
db_table = 'qfn_change_info' db_table = 'qfn_change_info'
class AbilityReview(models.Model): class AbilityReview(CommonBDModel):
type_method = ( type_method = (
(0, '文审'), (0, '文审'),
(10, '现场')) (10, '现场'))
@ -55,29 +48,21 @@ class AbilityReview(models.Model):
(30, '复评'), (30, '复评'),
(40, '迁址')) (40, '迁址'))
name = models.CharField(max_length=20, unique=True, verbose_name='公司名称') name = models.CharField(max_length=20, unique=True, verbose_name='公司名称')
qualification_name = models.CharField(max_length=20, verbose_name='资质名称') # qualification_name = models.CharField(max_length=20, verbose_name='资质名称', null=True, blank=True)
judging_method = models.PositiveSmallIntegerField(max_length=20, choices=type_method, verbose_name='评审方法') judging_method = models.PositiveSmallIntegerField(max_length=20, choices=type_method, verbose_name='评审方法')
judging_type = models.PositiveSmallIntegerField(max_length=20, choices=juge_type, verbose_name='评审类型') judging_type = models.PositiveSmallIntegerField(max_length=20, choices=juge_type, verbose_name='评审类型')
add_param = models.IntegerField(default=0, verbose_name='新增参数') add_param = models.IntegerField(default=0, verbose_name='新增参数')
review_date = models.DateField(verbose_name='评审日期', null=True) review_date = models.DateField(verbose_name='评审日期', null=True)
now_count = models.IntegerField(default=0, verbose_name='现有场所数量') now_count = models.IntegerField(default=0, verbose_name='现有场所数量')
add_count = models.IntegerField(default=0, verbose_name='新增场所数量') add_count = models.IntegerField(default=0, verbose_name='新增场所数量')
create_date = models.DateTimeField(auto_now_add=True, null=True) quali = models.ForeignKey(Qualification, on_delete=models.SET_NULL, null=True, verbose_name='资质情况')
update_date = models.DateTimeField(auto_now=True, null=True)
department = models.ForeignKey(Organization, on_delete=models.PROTECT, null=True, verbose_name='所属单位')
def save(self, *args, **kwargs):
if not self.id:
self.create_date = timezone.now()
# update_date将自动设置为当前时间因为auto_now=True
super(AbilityReview, self).save(*args, **kwargs)
class Meta: class Meta:
verbose_name = '评审情况' verbose_name = '评审情况'
db_table = 'ability_review' db_table = 'ability_review'
class QualityCommendation(models.Model): class QualityCommendation(CommonBDModel):
name = models.CharField(max_length=20, unique=True, verbose_name='项目名称') name = models.CharField(max_length=20, unique=True, verbose_name='项目名称')
commendation_name = models.CharField(max_length=20, verbose_name='表彰名称') commendation_name = models.CharField(max_length=20, verbose_name='表彰名称')
Awards_level = models.CharField(max_length=20, verbose_name='获奖等级') Awards_level = models.CharField(max_length=20, verbose_name='获奖等级')
@ -85,21 +70,12 @@ class QualityCommendation(models.Model):
awardee_people = models.CharField(max_length=20, verbose_name='获奖人', null=True) awardee_people = models.CharField(max_length=20, verbose_name='获奖人', null=True)
awarded_by = models.CharField(max_length=20, verbose_name='颁奖单位') awarded_by = models.CharField(max_length=20, verbose_name='颁奖单位')
awarded_date = models.DateField(verbose_name='获奖日期', null=True) awarded_date = models.DateField(verbose_name='获奖日期', null=True)
create_date = models.DateTimeField(auto_now_add=True, null=True)
update_date = models.DateTimeField(auto_now=True, null=True)
department = models.ForeignKey(Organization, on_delete=models.PROTECT, null=True, verbose_name='所属单位')
def save(self, *args, **kwargs):
if not self.id:
self.create_date = timezone.now()
# update_date将自动设置为当前时间因为auto_now=True
super(QualityCommendation, self).save(*args, **kwargs)
class Meta: class Meta:
verbose_name = '质量表彰' verbose_name = '质量表彰'
db_table = 'quality_commendation' db_table = 'quality_commendation'
class QualityActivities(models.Model): class QualityActivities(CommonBDModel):
role = ((0,'组织方'),(1,'活动方')) role = ((0,'组织方'),(1,'活动方'))
name = models.CharField(max_length=20, unique=True, verbose_name='活动名称') name = models.CharField(max_length=20, unique=True, verbose_name='活动名称')
roles = models.PositiveSmallIntegerField(max_length=20, choices=role, verbose_name='参与角色') roles = models.PositiveSmallIntegerField(max_length=20, choices=role, verbose_name='参与角色')
@ -110,22 +86,13 @@ class QualityActivities(models.Model):
participations = models.IntegerField(verbose_name='活动参与单位数量', null=True, blank=True) participations = models.IntegerField(verbose_name='活动参与单位数量', null=True, blank=True)
function = models.CharField(max_length=100, verbose_name='活动中发挥的作用', null=True) function = models.CharField(max_length=100, verbose_name='活动中发挥的作用', null=True)
earnings = models.FloatField(verbose_name='活动收益', null=True) earnings = models.FloatField(verbose_name='活动收益', null=True)
create_date = models.DateTimeField(auto_now_add=True, null=True)
update_date = models.DateTimeField(auto_now=True, null=True)
department = models.ForeignKey(Organization, on_delete=models.PROTECT, null=True, verbose_name='组织单位')
def save(self, *args, **kwargs):
if not self.id:
self.create_date = timezone.now()
# update_date将自动设置为当前时间因为auto_now=True
super(QualityActivities, self).save(*args, **kwargs)
class Meta: class Meta:
verbose_name = '质量活动' verbose_name = '质量活动'
db_table = 'quality_activities' db_table = 'quality_activities'
class Contact(models.Model): class Contact(CommonBDModel):
name = models.CharField(max_length=20, unique=True, verbose_name='姓名') name = models.CharField(max_length=20, unique=True, verbose_name='姓名')
address = models.CharField(max_length=100, verbose_name='地址') address = models.CharField(max_length=100, verbose_name='地址')
header = models.CharField(max_length=20, verbose_name='负责人') header = models.CharField(max_length=20, verbose_name='负责人')
@ -135,22 +102,14 @@ class Contact(models.Model):
tel_technology = models.CharField(max_length=20, verbose_name='技术负责人电话') tel_technology = models.CharField(max_length=20, verbose_name='技术负责人电话')
email_technology = models.CharField(max_length=50, verbose_name='技术负责人邮箱', null=True, blank=True) email_technology = models.CharField(max_length=50, verbose_name='技术负责人邮箱', null=True, blank=True)
head_quality = models.CharField(max_length=50, verbose_name='质量负责人') head_quality = models.CharField(max_length=50, verbose_name='质量负责人')
tel_quality = models.CharField(max_length=20, verbose_name='质量负责人电话') tel_quality = models.CharField(max_length=20, verbose_name='质量负责人电话')
create_date = models.DateTimeField(auto_now_add=True, null=True)
update_date = models.DateTimeField(auto_now=True, null=True)
email_quality = models.CharField(max_length=50, verbose_name='质量负责人邮箱', null=True, blank=True) email_quality = models.CharField(max_length=50, verbose_name='质量负责人邮箱', null=True, blank=True)
def save(self, *args, **kwargs):
if not self.id:
self.create_date = timezone.now()
# update_date将自动设置为当前时间因为auto_now=True
super(Contact, self).save(*args, **kwargs)
class Meta: class Meta:
verbose_name = '实验室联系方式' verbose_name = '实验室联系方式'
db_table = 'contact' db_table = 'contact'
class ExternalAuditors(models.Model): class ExternalAuditors(CommonBDModel):
review_type = ( (0, 'CNAS'), review_type = ( (0, 'CNAS'),
(1, 'CMA'), (1, 'CMA'),
(2, 'DICA')) (2, 'DICA'))
@ -161,15 +120,6 @@ class ExternalAuditors(models.Model):
contact = models.CharField(max_length=20, verbose_name='联系方式') contact = models.CharField(max_length=20, verbose_name='联系方式')
judging_areas = models.CharField(max_length=20, verbose_name='评审领域') judging_areas = models.CharField(max_length=20, verbose_name='评审领域')
remark = models.CharField(max_length=20, verbose_name='备注', null=True, blank=True) remark = models.CharField(max_length=20, verbose_name='备注', null=True, blank=True)
create_date = models.DateTimeField(auto_now_add=True, null=True)
update_date = models.DateTimeField(auto_now=True, null=True)
department = models.ForeignKey(Organization, on_delete=models.PROTECT, null=True, verbose_name='单位名称')
def save(self, *args, **kwargs):
if not self.id:
self.create_date = timezone.now()
# update_date将自动设置为当前时间因为auto_now=True
super(ExternalAuditors, self).save(*args, **kwargs)
class Meta: class Meta:
verbose_name = '外审员情况' verbose_name = '外审员情况'

View File

@ -2,47 +2,54 @@ from rest_framework import serializers
from apps.system.serializers import OrganizationSimpleSerializer from apps.system.serializers import OrganizationSimpleSerializer
from .models import AbilityReview, QualityCommendation, QualityActivities, Contact, ExternalAuditors, AuditLog, Qualification from .models import AbilityReview, QualityCommendation, QualityActivities, Contact, ExternalAuditors, AuditLog, Qualification
class BaseMeta:
class AbilityReviewSerializer(serializers.ModelSerializer): fields = '__all__'
class Meta: read_only_fields = ['create_time', 'update_time', 'create_by', 'update_by', 'is_deleted', 'belong_dept']
model = AbilityReview
fields = '__all__'
class QualityCommendationSerializer(serializers.ModelSerializer): class QualityCommendationSerializer(serializers.ModelSerializer):
class Meta: class Meta(BaseMeta):
model = QualityCommendation model = QualityCommendation
fields = '__all__' fields = '__all__'
read_only_fields = ['id'] read_only_fields = ['id']
class QualityActivitiesSerializer(serializers.ModelSerializer): class QualityActivitiesSerializer(serializers.ModelSerializer):
class Meta: class Meta(BaseMeta):
model = QualityActivities model = QualityActivities
fields = '__all__' fields = '__all__'
read_only_fields = ['id'] read_only_fields = ['id']
class ContactSerializer(serializers.ModelSerializer): class ContactSerializer(serializers.ModelSerializer):
class Meta: class Meta(BaseMeta):
model = Contact model = Contact
fields = '__all__' fields = '__all__'
class ExternalAuditorsSerializer(serializers.ModelSerializer): class ExternalAuditorsSerializer(serializers.ModelSerializer):
class Meta: class Meta(BaseMeta):
model = ExternalAuditors model = ExternalAuditors
fields = '__all__' fields = '__all__'
class QualificationSerializer(serializers.ModelSerializer): class QualificationSerializer(serializers.ModelSerializer):
class Meta: class Meta(BaseMeta):
model = Qualification model = Qualification
fields = '__all__' fields = '__all__'
class AbilityReviewSerializer(serializers.ModelSerializer):
quali_name = serializers.CharField(source='quali.name', read_only=True)
class Meta(BaseMeta):
model = AbilityReview
fields = '__all__'
class AuditLogSerializer(serializers.ModelSerializer): class AuditLogSerializer(serializers.ModelSerializer):
class Meta: company_name = serializers.CharField(source='instance.company_name', read_only=True)
class Meta(BaseMeta):
model = AuditLog model = AuditLog
fields = '__all__' fields = '__all__'

View File

@ -1,6 +1,6 @@
from django.urls import path, include from django.urls import path, include
from rest_framework import routers from rest_framework import routers
from .views import AbilityReviewViewSet, QualityCommendationViewSet, QualityActivitiesViewSet, ContactViewSet, ExternalAuditorsViewSet, QualificationViewSet from .views import AbilityReviewViewSet, QualityCommendationViewSet, QualityActivitiesViewSet, QualiChangeViewSet, ContactViewSet, ExternalAuditorsViewSet, QualificationViewSet
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register('ar', AbilityReviewViewSet, basename='abilityreviews') router.register('ar', AbilityReviewViewSet, basename='abilityreviews')
@ -9,6 +9,8 @@ router.register('qa', QualityActivitiesViewSet, basename='qualityactivities')
router.register('contact', ContactViewSet, basename='contact') router.register('contact', ContactViewSet, basename='contact')
router.register('ea', ExternalAuditorsViewSet, basename='externalauditors') router.register('ea', ExternalAuditorsViewSet, basename='externalauditors')
router.register('faq', QualificationViewSet, basename='faq') router.register('faq', QualificationViewSet, basename='faq')
router.register('faqch', QualiChangeViewSet, basename='faqch')
urlpatterns = [ urlpatterns = [
path('', include(router.urls)) path('', include(router.urls))
] ]

View File

@ -2,6 +2,7 @@ from rest_framework import status
from django.conf import settings from django.conf import settings
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.viewsets import ModelViewSet from rest_framework.viewsets import ModelViewSet
from apps.system.permission_data import RbacFilterSet
from utils.queryset import get_child_queryset2 from utils.queryset import get_child_queryset2
from rest_framework.response import Response from rest_framework.response import Response
from apps.system.permission import has_permission from apps.system.permission import has_permission
@ -14,31 +15,40 @@ from .serializers import *
from datetime import datetime from datetime import datetime
import os import os
class AbilityReviewViewSet(ModelViewSet):
queryset = AbilityReview.objects.all()
serializer_class = AbilityReviewSerializer
def create(self, request): class CreateUpdateCustomMixin:
if Organization.objects.filter(name=request.data['name']).exists(): """
department_id = Organization.objects.filter(name=request.data['name']).first().id 整合
request.data['department'] = department_id """
serializer = self.get_serializer(data=request.data) def perform_create(self, serializer):
if serializer.is_valid(raise_exception=True): if hasattr(self.queryset.model, 'belong_dept'):
serializer.save() belong_dept = serializer.validated_data.get('belong_dept', self.request.user.dept)
return Response(serializer.data, status = status.HTTP_201_CREATED) serializer.save(create_by = self.request.user, belong_dept=belong_dept)
else: else:
raise ParseError("公司名称不存在") serializer.save(create_by = self.request.user)
def perform_update(self, serializer):
serializer.save(update_by = self.request.user)
# 查询子以及已经本公司的评审情况
@action(detail=False, methods=['get']) class AbilityReviewViewSet(RbacFilterSet, CreateUpdateCustomMixin, ModelViewSet):
def review_info(self, request, *args, **kwargs): perms_map = {'get': '*', 'post': 'abilityreview',
father_dept = request.user.dept 'put': 'abilityreview', 'delete': 'abilityreview'}
child_dept = get_child_queryset2(father_dept) queryset = AbilityReview.objects.select_related('quali').all()
query = AbilityReview.objects.filter(department__in=child_dept) serializer_class = AbilityReviewSerializer
serializer = AbilityReviewSerializer(query, many=True) filterset_fields = ['belong_dept', 'judging_method', 'judging_type']
data = {'count':len(serializer.data), 'results':serializer.data} search_fields = ['name']
return Response(data, status = status.HTTP_200_OK)
# def get_queryset(self):
# qs = super().get_queryset()
# if self.request.method == 'GET':
# return qs
# else:
# return qs.filter(belong_dept__in=get_child_queryset2(self.request.user.dept))
# if has_permission('ability_review_jygl', self.request.user):
# return qs
# return qs.filter(belong_dept__in=get_child_queryset2(self.request.user.dept))
#根据日期过滤数据 #根据日期过滤数据
@action(detail=False, methods=['post']) @action(detail=False, methods=['post'])
@ -134,22 +144,10 @@ class ImpMixin:
return Response({'uploaded': 'File uploaded successfully'}, status=status.HTTP_201_CREATED) return Response({'uploaded': 'File uploaded successfully'}, status=status.HTTP_201_CREATED)
class QualityCommendationViewSet(ModelViewSet): class QualityCommendationViewSet(RbacFilterSet, CreateUpdateCustomMixin, ModelViewSet):
queryset = QualityCommendation.objects.all() queryset = QualityCommendation.objects.all()
serializer_class = QualityCommendationSerializer serializer_class = QualityCommendationSerializer
def create(self, request, *args, **kwargs):
if Organization.objects.filter(name=request.data['awardee_company']).exists():
department_id = Organization.objects.filter(name=request.data['awardee_company']).first().id
request.data['department'] = department_id
serializer = self.get_serializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status = status.HTTP_201_CREATED)
# 人名存在重复
else:
raise ParseError("获奖单位不存在")
def build_qt_data(self, sheet): def build_qt_data(self, sheet):
data_list = [] data_list = []
for row in sheet.iter_rows(min_row=2, values_only=True): # 假设第一行是表头,从第二行开始读取数据 for row in sheet.iter_rows(min_row=2, values_only=True): # 假设第一行是表头,从第二行开始读取数据
@ -176,16 +174,7 @@ class QualityCommendationViewSet(ModelViewSet):
data_list.append(serializer_data) data_list.append(serializer_data)
return data_list return data_list
# 查询子以及已经本公司的质量表彰
@action(detail=False, methods=['get'])
def commentdation_info(self, request, *args, **kwargs):
father_dept = request.user.dept
child_dept = get_child_queryset2(father_dept)
query = QualityCommendation.objects.filter(department__in=child_dept)
serializer = QualityCommendationSerializer(query, many=True)
data = {'count':len(serializer.data), 'results':serializer.data}
return Response(data, status = status.HTTP_200_OK)
#根据日期过滤数据 #根据日期过滤数据
@action(detail=False, methods=['post']) @action(detail=False, methods=['post'])
@transaction.atomic @transaction.atomic
@ -213,29 +202,9 @@ class QualityCommendationViewSet(ModelViewSet):
# 质量活动 # 质量活动
class QualityActivitiesViewSet(ModelViewSet): class QualityActivitiesViewSet(RbacFilterSet, CreateUpdateCustomMixin, ModelViewSet):
queryset = QualityActivities.objects.all() queryset = QualityActivities.objects.all()
serializer_class = QualityActivitiesSerializer serializer_class = QualityActivitiesSerializer
def create(self, request):
if Organization.objects.filter(name=request.data['orgunits']).exists():
department_id = Organization.objects.filter(name=request.data['orgunits']).first().id
request.data['department'] = department_id
serializer = self.get_serializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status = status.HTTP_201_CREATED)
else:
raise ParseError("组织单位不存在")
# 查询子以及已经本公司的质量活动
@action(detail=False, methods=['get'])
def activate_info(self, request, *args, **kwargs):
child_dept = get_child_queryset2(request.user.dept)
query = QualityActivities.objects.filter(department__in=child_dept)
serializer = QualityActivitiesSerializer(query, many=True)
data = {'count':len(serializer.data), 'results':serializer.data}
return Response(data, status = status.HTTP_200_OK)
#根据日期过滤数据 #根据日期过滤数据
@action(detail=False, methods=['post']) @action(detail=False, methods=['post'])
@ -268,35 +237,26 @@ class QualityActivitiesViewSet(ModelViewSet):
return Response(data, status = status.HTTP_200_OK) return Response(data, status = status.HTTP_200_OK)
class ContactViewSet(ModelViewSet): class ContactViewSet(RbacFilterSet, CreateUpdateCustomMixin, ModelViewSet):
queryset = Contact.objects.all() queryset = Contact.objects.all()
serializer_class = ContactSerializer serializer_class = ContactSerializer
def get_queryset(self):
qs = super().get_queryset()
if self.request.method == 'GET':
return qs
else:
return qs.filter(belong_dept__in=get_child_queryset2(self.request.user.dept))
# if has_permission('ability_review_jygl', self.request.user):
# return qs
# return qs.filter(belong_dept__in=get_child_queryset2(self.request.user.dept))
class ExternalAuditorsViewSet(ModelViewSet):
class ExternalAuditorsViewSet(RbacFilterSet, CreateUpdateCustomMixin, ModelViewSet):
queryset = ExternalAuditors.objects.all() queryset = ExternalAuditors.objects.all()
serializer_class = ExternalAuditorsSerializer serializer_class = ExternalAuditorsSerializer
def create(self, request):
if Organization.objects.filter(name=request.data['name_company']).exists():
department_id = Organization.objects.filter(name=request.data['name_company']).first().id
request.data['department'] = department_id
serializer = self.get_serializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status = status.HTTP_201_CREATED)
else:
raise ParseError("公司名称不存在")
# 查询子以及已经本公司的质量活动
@action(detail=False, methods=['get'])
def activate_info(self, request, *args, **kwargs):
child_dept = get_child_queryset2(request.user.dept)
query = ExternalAuditors.objects.filter(department__in=child_dept)
serializer = ExternalAuditorsSerializer(query, many=True)
data = {'count':len(serializer.data), 'results':serializer.data}
return Response(data, status = status.HTTP_200_OK)
#根据日期过滤数据 #根据日期过滤数据
@action(detail=False, methods=['post']) @action(detail=False, methods=['post'])
@transaction.atomic @transaction.atomic
@ -326,22 +286,10 @@ class ExternalAuditorsViewSet(ModelViewSet):
return Response(data, status = status.HTTP_200_OK) return Response(data, status = status.HTTP_200_OK)
class QualificationViewSet(ModelViewSet): class QualificationViewSet(RbacFilterSet, CreateUpdateCustomMixin, ModelViewSet):
queryset = Qualification.objects.all() queryset = Qualification.objects.all()
serializer_class = QualificationSerializer serializer_class = QualificationSerializer
#重写保存方法
def create(self, request):
if Organization.objects.filter(name=request.data['company_name']).exists():
department_id = Organization.objects.filter(name=request.data['company_name']).first().id
request.data['department'] = department_id
serializer = self.get_serializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status = status.HTTP_201_CREATED)
else:
raise ParseError("公司名称不存在")
# 重写更新的方法 # 重写更新的方法
def partial_update(self, request, pk=None): def partial_update(self, request, pk=None):
#获取需要更新的实列 #获取需要更新的实列
@ -354,27 +302,23 @@ class QualificationViewSet(ModelViewSet):
if k not in ignore_fields: if k not in ignore_fields:
origin_value = origin_dict.get(k) origin_value = origin_dict.get(k)
if origin_value != v: if origin_value != v:
diff.append({k:{'old':origin_value, 'new':v}}) diff.append({'old':origin_value, 'new':v, 'name':k})
serializers = self.get_serializer(instance, data=request.data, partial=True) serializers = self.get_serializer(instance, data=request.data, partial=True)
serializers.is_valid(raise_exception=True) serializers.is_valid(raise_exception=True)
self.perform_update(serializers) self.perform_update(serializers)
if diff: if diff:
AuditLog.objects.create( AuditLog.objects.create(
action='update', action='update',
instance_id=instance.id, instance=instance,
change_time = datetime.now(), change_time = datetime.now(),
change_user=request.user, change_user=request.user,
val_new=serializers.data, val_new=serializers.data,
difference=diff difference=diff
) )
return Response(serializers.data, status = status.HTTP_204_NO_CONTENT) return Response(serializers.data, status = status.HTTP_204_NO_CONTENT)
# 查询子以及已经本公司的资质情况
@action(detail=False, methods=['get']) class QualiChangeViewSet(RbacFilterSet, ModelViewSet):
def activate_info(self, request, *args, **kwargs): queryset = AuditLog.objects.select_related('instance').all()
child_dept = get_child_queryset2(request.user.dept) serializer_class = AuditLogSerializer
query = Qualification.objects.filter(department__in=child_dept)
serializer = QualificationSerializer(query, many=True)
data = {'count':len(serializer.data), 'results':serializer.data}
return Response(data, status = status.HTTP_200_OK)

View File

@ -256,7 +256,7 @@ class Pt(CommonBDModel):
params = models.TextField('参加参数名称') params = models.TextField('参加参数名称')
result = models.PositiveSmallIntegerField('结果', choices=pt_result_choices, default=0, help_text=str(pt_result_choices)) result = models.PositiveSmallIntegerField('结果', choices=pt_result_choices, default=0, help_text=str(pt_result_choices))
handle_result = models.PositiveSmallIntegerField('处理结果', choices = pt_hresult_choices, default=0, help_text=str(pt_hresult_choices)) handle_result = models.PositiveSmallIntegerField('处理结果', choices = pt_hresult_choices, default=0, help_text=str(pt_hresult_choices))
certificate_date = models.DateField('证书日期') certificate_date = models.DateField('证书日期',null=True, blank=True)
field = models.PositiveSmallIntegerField('领域', choices=field_choices, help_text=str(field_choices),default=0) field = models.PositiveSmallIntegerField('领域', choices=field_choices, help_text=str(field_choices),default=0)
a_class = models.BooleanField('A类', default=True) a_class = models.BooleanField('A类', default=True)
task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True) task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True)
@ -294,7 +294,7 @@ class Oinspect(CommonBDModel):
checker = models.CharField('检查方', max_length=100) checker = models.CharField('检查方', max_length=100)
date_inspect = models.DateField('检查日期') date_inspect = models.DateField('检查日期')
result = models.TextField('检查结果', null=True, blank=True, default='') result = models.TextField('检查结果', null=True, blank=True, default='')
result_date = models.DateField('检查结果日期', default=timezone.now()) result_date = models.DateField('检查结果日期', null=True, blank=True)
notification_form = models.CharField('检查通知单', max_length=100, null=True) notification_form = models.CharField('检查通知单', max_length=100, null=True)
result_form = models.CharField('检查结果告知单', max_length=100, null=True) result_form = models.CharField('检查结果告知单', max_length=100, null=True)
task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True) task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True)

View File

@ -570,6 +570,36 @@ class Task2DoViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet):
serializer = Task2DoSerializer(queryset, many=True) serializer = Task2DoSerializer(queryset, many=True)
return Response(serializer.data) return Response(serializer.data)
class BulkDeleteModelViewSet(ModelViewSet):
"""
A ModelViewSet with a bulk delete action.
"""
def get_queryset(self):
"""
Override this method to define your queryset if necessary.
"""
return super().get_queryset()
@action(methods=['delete'], detail=False)
def bulk_delete(self, request, *args, **kwargs):
# 获取要删除的对象的ID列表
print("--", request.data)
ids = request.data.get('ids', [])
if not ids:
return Response({"error": "No IDs provided for deletion"}, status=status.HTTP_400_BAD_REQUEST)
# 构建查询条件
query = Q()
for id in ids:
query |= Q(id=id)
# 执行批量删除
deleted_count, _ = self.get_queryset().filter(query).delete()
# 返回删除的数量
return Response({"deleted_count": deleted_count}, status=status.HTTP_200_OK)
class Domixin: class Domixin:
perms_map = {'get': '*', 'put': 'task2do', 'post': 'task2do', 'delete': 'task2do'} perms_map = {'get': '*', 'put': 'task2do', 'post': 'task2do', 'delete': 'task2do'}
@ -699,7 +729,7 @@ class ImpMixin:
self.countup_task2do(task2do) # 统计执行情况 self.countup_task2do(task2do) # 统计执行情况
return Response() return Response()
class RcViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): class RcViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin,BulkDeleteModelViewSet, ModelViewSet):
queryset = Rc.objects.all() queryset = Rc.objects.all()
serializer_class = RcSerializer serializer_class = RcSerializer
count_dict = { count_dict = {
@ -745,7 +775,7 @@ class RcViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet):
class ComplaintViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): class ComplaintViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, BulkDeleteModelViewSet, ModelViewSet):
queryset = Complaint.objects.all() queryset = Complaint.objects.all()
serializer_class = ComplaintSerializer serializer_class = ComplaintSerializer
count_dict = { count_dict = {
@ -772,7 +802,7 @@ class ComplaintViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet)
return self.gen_imp_view(request, 5, ComplaintSerializer) return self.gen_imp_view(request, 5, ComplaintSerializer)
class PtViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): class PtViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, BulkDeleteModelViewSet, ModelViewSet):
queryset = Pt.objects.all() queryset = Pt.objects.all()
serializer_class = PtSerializer serializer_class = PtSerializer
count_dict = { count_dict = {
@ -801,7 +831,7 @@ class PtViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet):
return self.gen_imp_view(request, 5, PtSerializer, 0, Pt, repalce=True, types='pt') return self.gen_imp_view(request, 5, PtSerializer, 0, Pt, repalce=True, types='pt')
class RiskViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): class RiskViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, BulkDeleteModelViewSet, ModelViewSet):
queryset = Risk.objects.all() queryset = Risk.objects.all()
serializer_class = RiskSerializer serializer_class = RiskSerializer
count_dict = { count_dict = {
@ -826,7 +856,7 @@ class RiskViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet):
return self.gen_imp_view(request, 5, RiskSerializer) return self.gen_imp_view(request, 5, RiskSerializer)
class OinspectViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet): class OinspectViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, BulkDeleteModelViewSet, ModelViewSet):
queryset = Oinspect.objects.all() queryset = Oinspect.objects.all()
serializer_class = OinspectSerializer serializer_class = OinspectSerializer
count_dict = { count_dict = {
@ -850,4 +880,5 @@ class OinspectViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet):
导入表格 导入表格
""" """
return self.gen_imp_view(request, 5, OinspectSerializer, 0, Oinspect, repalce=True, types="oinspect") return self.gen_imp_view(request, 5, OinspectSerializer, 0, Oinspect, repalce=True, types="oinspect")