taskdo vue

This commit is contained in:
caoqianming 2021-03-16 16:03:27 +08:00
commit 6c473fd78a
12 changed files with 518 additions and 216 deletions

View File

@ -12,4 +12,41 @@ export function getRecordList(query) {
} }
export function getRecord(id) {
return request({
url: `/supervision/record/${id}/`,
method: 'get'
})
}
export function confirmRecord(id, data) {
return request({
url: `/supervision/record/${id}/confirm/`,
method: 'put',
data
})
}
export function updateRecord(id, data) {
return request({
url: `/supervision/record/${id}/`,
method: 'put',
data
})
}
export function upRecord(id, data) {
return request({
url: `/supervision/record/${id}/up/`,
method: 'put',
data
})
}
export function rejectRecord(id, data) {
return request({
url: `/supervision/record/${id}/reject/`,
method: 'put',
data
})
}

View File

@ -2,20 +2,35 @@
<div class="app-container"> <div class="app-container">
<div> <div>
<el-input <el-input
v-model="listQuery.content__name"
placeholder="材料名称" placeholder="材料名称"
style="width: 200px" style="width: 200px"
class="filter-item" class="filter-item"
@keyup.enter.native="handleFilter"
/> />
<el-input <el-date-picker
placeholder="上报时间" v-model="listQuery.up_date"
style="width: 200px" align="right"
class="filter-item" type="date"
/> placeholder="上报时间"
<el-input :picker-options="pickerOptions1"
@change="handleFilter">
</el-date-picker>
<el-select
v-model="listQuery.state"
placeholder="记录状态" placeholder="记录状态"
style="width: 200px" clearable
style="width:140px"
class="filter-item" class="filter-item"
/> @change="handleFilter"
>
<el-option
v-for="item in stateOptions"
:key="item.key"
:label="item.name"
:value="item.key"
/>
</el-select>
<el-input <el-input
placeholder="所属部门" placeholder="所属部门"
style="width: 200px" style="width: 200px"
@ -40,7 +55,7 @@
> >
<el-table <el-table
v-loading="listLoading" v-loading="listLoading"
:data="contentList" :data="recordList.results"
border border
fit fit
stripe stripe
@ -49,176 +64,138 @@
> >
<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.task_.name }}</template>
</el-table-column> </el-table-column>
<el-table-column label="材料内容"> <el-table-column label="材料名称">
<template slot-scope="scope">{{ scope.row.name }}</template> <template slot-scope="scope">{{ scope.row.content_.name }}</template>
</el-table-column> </el-table-column>
<el-table-column label="上报时间"> <el-table-column label="上报时间">
<template slot-scope="scope">{{ scope.row.name }}</template> <template slot-scope="scope">{{ scope.row.up_date }}</template>
</el-table-column> </el-table-column>
<el-table-column label="上报人"> <el-table-column label="上报人">
<template slot-scope="scope">{{ scope.row.name }}</template> <template slot-scope="scope">{{ scope.row.up_user }}</template>
</el-table-column> </el-table-column>
<el-table-column label="截止时间"> <el-table-column label="截止时间">
<template slot-scope="scope">{{ scope.row.name }}</template> <template slot-scope="scope">{{ scope.row.end_date }}</template>
</el-table-column> </el-table-column>
<el-table-column label="记录状态"> <el-table-column label="记录状态">
<template slot-scope="scope">{{ scope.row.name }}</template> <template slot-scope="scope">{{ scope.row.state }}</template>
</el-table-column> </el-table-column>
<el-table-column label="是否适用"> <el-table-column label="是否适用">
<template slot-scope="scope">{{ scope.row.name }}</template> <template slot-scope="scope">
<el-tag type="success" v-if="scope.row.is_yes"></el-tag>
<el-tag type="danger" v-else></el-tag></template>
</el-table-column> </el-table-column>
<el-table-column label="上报备注"> <el-table-column label="上报备注">
<template slot-scope="scope">{{ scope.row.name }}</template> <template slot-scope="scope">{{ scope.row.note }}</template>
</el-table-column> </el-table-column>
<el-table-column label="上报说明"> <el-table-column label="上报说明">
<template slot-scope="scope">{{ scope.row.name }}</template> <template slot-scope="scope">{{ scope.row.noteb }}</template>
</el-table-column> </el-table-column>
<el-table-column label="上报文件"> <el-table-column label="上报文件">
<template slot-scope="scope">{{ scope.row.name }}</template> <template slot-scope="scope">{{ scope.row.files }}</template>
</el-table-column>
</el-table-column>
<el-table-column label="上报单位">
<template slot-scope="scope">{{ scope.row.dept_.name }}</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination
v-show="recordList.count > 0"
:total="recordList.count"
:page.sync="listQuery.page"
:limit.sync="listQuery.page_size"
@pagination="getList"
/>
</el-card> </el-card>
<el-dialog
:visible.sync="dialogVisible"
:title="dialogType === 'edit' ? '编辑资料' : '新增资料'"
>
<el-form
ref="Form"
:model="Content"
label-width="80px"
label-position="right"
:rules="rule1"
>
<el-form-item label="名称" prop="name">
<el-input v-model="Content.name" placeholder="名称" />
</el-form-item>
<el-form-item label="材料类型" prop="type" >
<el-cascader
v-model = "Content.type"
:options="typeOptions"
:props="{ emitPath : false , }"
clearable
style="width:100%"
></el-cascader>
</el-form-item>
<el-form-item label="详情" prop="desc">
<el-input
type="textarea"
:rows="4"
v-model="Content.desc"
placeholder="详情"
/>
</el-form-item>
<el-form-item label="是否可主动报送" prop="can_doself" label-width="120px">
<el-switch v-model="Content.can_doself" ></el-switch>
</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>
</div> </div>
</template> </template>
<style>
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409eff;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 100px;
height: 100px;
line-height: 100px;
text-align: center;
}
.avatar {
width: 100px;
height: 100px;
display: block;
}
</style>
<script> <script>
import { import {getRecordList} from "@/api/record";
getContentList,
createContent,
deleteContent,
updateContent,
} from "@/api/content";
import getRecordList
from "@/api/record";
import { genTree } from "@/utils";
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
import Pagination from "@/components/Pagination"; // secondary package based on el-pagination import Pagination from "@/components/Pagination"; // secondary package based on el-pagination
import Treeselect from "@riophae/vue-treeselect"; const defaultrecord = {
import "@riophae/vue-treeselect/dist/vue-treeselect.css"; name: ""
import { getDictList, getDictTypeList } from "@/api/dict";
const defaultContent = {
name: "",
desc: "",
type: null,
can_doself: false,
}; };
export default { export default {
components: { Pagination, Treeselect }, components: { Pagination },
data() { data() {
return { return {
Content: defaultContent, record: defaultrecord,
contentList: [], recordList: {
typeOptions: [], count: 0,
listLoading: true, },
stateOptions: [
{ key: "待上报", name: "待上报" },
{ key: "已上报", name: "已上报" },
{ key: "已确认", name: "已确认" },
{ key: "待整改", name: "待整改" },
],
pickerOptions1: {
disabledDate(time) {
return time.getTime() > Date.now();
},
shortcuts: [{
text: '今天',
onClick(picker) {
picker.$emit('pick', new Date());
}
}, {
text: '昨天',
onClick(picker) {
const date = new Date();
date.setTime(date.getTime() - 3600 * 1000 * 24);
picker.$emit('pick', date);
}
}, {
text: '一周前',
onClick(picker) {
const date = new Date();
date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit('pick', date);
}
}]
},
listQuery: {
page: 1,
page_size: 20,
},
listLoading: false,
dialogVisible: false, dialogVisible: false,
dialogType: "new", dialogType: "new",
rule1: { rule1: {
name: [{ required: true, message: "请输入名称", trigger: "blur" }], name: [{ required: true, message: "请输入", trigger: "blur" }]
}, },
filterOrgText: "",
treeLoding: false,
}; };
}, },
computed: {}, computed: {},
watch: { watch: {
filterOrgText(val) {
this.$refs.tree.filter(val);
},
}, },
created() { created() {
this.getList(); this.getList();
}, },
methods: { methods: {
checkPermission, getList(){
getRecordList(this.listQuery).then((response)=>{
this.recordList=response.data
filterNode(value, data) { })
if (!value) return true; }
return data.label.indexOf(value) !== -1; ,
}, handleFilter() {
getList() {
this.listLoading = true;
getContentList().then((response) => {
if (response.data) {
this.contentList = response.data;
}
this.listLoading = false;
});
},
handleFilter() {
this.listQuery.page = 1; this.listQuery.page = 1;
this.getList(); this.getList();
}, },
resetFilter() {
this.listQuery = {
page: 1,
page_size: 20,
}
this.getList();
},

View File

@ -1,9 +0,0 @@
<template>
<div class="app-container">
<div>待整改界面</div>
</div>
</template>
<script>
</script>

View File

@ -1,9 +0,0 @@
<template>
<div class="app-container">
<div>已确认</div>
</div>
</template>
<script>
</script>

View File

@ -1,9 +1,173 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<div>上报界面</div> <div class="ma">上报记录</div>
<div class="ma">
<span class="term">清单内容</span>
<span class="desc">{{ record.content_.name }}</span>
</div>
<div class="ma">
<span class="term">上报状态</span>
<span class="desc">{{ record.state }}</span>
</div>
<div class="ma">
<span class="term">所属任务</span>
<span class="desc">{{ record.task_.name }}</span>
</div>
<div class="ma">
<span class="term">任务过期</span>
<span class="desc">{{ record.task_.end_date }}</span>
</div>
<div class="ma">
<span class="term">上报备注</span>
<el-input
v-model="record.note"
placeholder=""
type="textarea"
:readonly="record.state != '待上报'"
>
</el-input>
</div>
<div class="ma">
<span class="term">执行部门</span>
<span class="desc">{{ record.belong_dept_.name }}</span>
</div>
<div class="ma" v-if="record.up_user_">
<span class="term">上报人</span>
<span class="desc">{{ record.up_user_.name }}/{{ record.up_state }}</span>
</div>
<div class="ma">
<span class="term">上报说明</span>
<el-input
v-model="record.noteb"
placeholder=""
type="textarea"
:readonly="record.state == '已上报' && record.state == '已确认'"
>
</el-input>
</div>
<div class="ma">
<span class="term">是否适用</span>
<el-switch v-model="record.is_yes"></el-switch>
</div>
<div class="ma">
<el-upload
ref="upload"
:action="upUrl"
:before-upload="beforeUpload"
:on-success="handleUpSuccess"
:headers="upHeaders"
:on-preview="handlePreview"
multiple
:file-list="fileList"
accept="image/*,application/pdf,application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/msword,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
>
<el-button size="small" type="primary">上传文件</el-button>
<template #tip>
<div class="el-upload__tip">
可上传pdf,word,ppt,excel,图片文件,大小不超过20M
</div>
</template>
</el-upload>
</div>
<el-divider></el-divider>
<div style="text-align: right">
<el-button type="primary" @click="confirm()" v-if="this.data.action =='reject'">驳回</el-button>
<el-button type="primary" @click="confirm()" >确认</el-button>
</div>
</div> </div>
</template> </template>
<style>
.ma {
margin-bottom: 10px;
}
.term {
color: rgba(0, 0, 0, 0.85);
font-weight: bold;
font-size: 16px;
}
.desc {
color: rgba(0, 0, 0, 0.65);
font-weight: bold;
font-size: 16px;
}
</style>
<script> <script>
import { upUrl, upHeaders } from "@/api/file";
import { updateRecord, upRecord, rejectRecord, confirmRecord } from "@/api/record"
export default {
name: "recorddo",
props: ["data"],
data() {
return {
upHeaders: upHeaders(),
upUrl: upUrl(),
record: this.data.record,
fileList:[]
};
},
created() {
},
mounted() {
this.initList()
},
methods: {
initList(){
for(var i=0;i<this.record.files_.length;i++){
this.fileList.push({
id:this.record.files_.id,
name:this.record.files_.name,
url:this.record.files_.path
})
}
},
handlePreview(file){
if ("url" in file) {
window.open(file.url);
} else {
window.open(file.response.data.path);
}
},
handleUpSuccess(res, file, filelist) {
this.$message.success('成功')
},
beforeRemove(){
if(this.record.state!='待上报'&& this.record.state!='待整改'){
this.$message.error("当前状态不可移除")
return False;
}
return True
},
beforeUpload(file) {
const isLt2M = file.size / 1024 / 1024 < 20;
if (!isLt2M) {
this.$message.error("单文件不能超过20MB!");
}
return isLt2M;
},
confirm(){
if(this.data.action=='update'){
updateRecord(this.record.id, this.record).then(res=>{
this.$message.success('成功')
})
}
else if(this.data.action=='up'){
upRecord(this.record.id, this.record).then(res=>{
this.$message.success('成功')
})
}
else if(this.data.action=='reject'){
rejectRecord(this.record.id, this.record).then(res=>{
this.$message.success('成功')
})
}
else if(this.data.action=='confirm'){
confirmRecord(this.record.id).then(res=>{
this.$message.success('成功')
})
}
this.$emit('handleDo')
}
},
};
</script> </script>

View File

@ -1,9 +0,0 @@
<template>
<div class="app-container">
<div>待整改界面</div>
</div>
</template>
<script>
</script>

View File

@ -42,16 +42,12 @@
> >
<el-tabs v-model="activeName" @tab-click="handleClick"> <el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="待上报" name="first" lazy> <el-tab-pane label="待上报" name="first" lazy>
<recorddo></recorddo>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="已上报" name="three" lazy> <el-tab-pane label="已上报" name="three" lazy>
<Recordsub></Recordsub>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="待整改" name="secord" lazy> <el-tab-pane label="待整改" name="secord" lazy>
<Recordchange></Recordchange>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="已确认" name="fore" lazy> <el-tab-pane label="已确认" name="fore" lazy>
<Recordcomplete></Recordcomplete>
</el-tab-pane> </el-tab-pane>
@ -63,11 +59,8 @@
</template> </template>
<script> <script>
import Recorddo from "@/views/supervision/recorddo" import Recorddo from "@/views/supervision/recorddo"
import Recordchange from "@/views/supervision/recordchange"
import Recordcomplete from "@/views/supervision/recordcomplete"
import Recordsub from "@/views/supervision/recordsub"
export default { export default {
components: { Recorddo,Recordchange,Recordcomplete,Recordsub }, components: { Recorddo },
data() { data() {
return { return {
}; };

View File

@ -28,9 +28,6 @@
<el-button type="primary" icon="el-icon-plus" @click="handleCreate" <el-button type="primary" icon="el-icon-plus" @click="handleCreate"
>创建报送任务</el-button >创建报送任务</el-button
> >
<el-button type="primary" icon="el-icon-plus" @click="handleCreate2"
>创建主动报送任务</el-button
>
</div> </div>
</el-card> </el-card>
<el-card style="margin-top: 10px"> <el-card style="margin-top: 10px">
@ -47,11 +44,6 @@
<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="是否主动报送">
<template slot-scope="scope">
<el-tag v-if="scope.row.is_self" type="success"></el-tag>
</template>
</el-table-column>
<el-table-column label="状态"> <el-table-column label="状态">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag>{{scope.row.state}}</el-tag> <el-tag>{{scope.row.state}}</el-tag>

View File

@ -24,8 +24,8 @@
<span class="desc" v-if="task.create_by_"> <span class="desc" v-if="task.create_by_">
{{ task.create_by_.name }}/</span {{ task.create_by_.name }}/</span
> >
<span class="desc" v-if="task.belong_dept_">{{ <span class="desc" v-if="task.belong_belong_dept_">{{
task.belong_dept_.name task.belong_belong_dept_.name
}}</span> }}</span>
</div> </div>
</el-col> </el-col>
@ -83,8 +83,15 @@
</el-card> </el-card>
</el-col> </el-col>
<el-col :span="20"> <el-col :span="20">
<el-card shadow="never" style="height: 600px; overflow-y: auto; overflow-x: auto"> <el-card
<el-table shadow="never"
style="height: 600px; overflow-y: auto; overflow-x: auto"
>
<div style="margin-bottom: 4px">
当前选择的是
<span style="color: red">{{ now.name }}</span>
</div>
<el-table
v-loading="listLoading" v-loading="listLoading"
:data="recordList" :data="recordList"
border border
@ -93,12 +100,56 @@
highlight-current-row highlight-current-row
max-height="600px" max-height="600px"
> >
<el-table-column label="序号" type="index" align="center" />
<el-table-column label="单位">
<template slot-scope="scope">{{
scope.row.belong_dept_.name
}}</template>
</el-table-column>
<el-table-column label="状态"> <el-table-column label="状态">
<template slot-scope="scope">{{ scope.row.state }}</template> <template slot-scope="scope">{{
scope.row.state
}}</template>
</el-table-column>
<el-table-column label="上报情况">
<template slot-scope="scope"
>{{ scope.row.up_user }}/{{ scope.row.up_date }}</template
>
</el-table-column>
<el-table-column label="文件">
<template slot-scope="scope">
</template>
</el-table-column>
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-button
v-if="scope.row.state == '待上报'"
type="primary"
:disabled="!checkPermission(['record_update'])"
size="small"
@click="handleUpdate(scope)"
>编辑</el-button
>
<el-button
v-if="scope.row.state == '已提交'"
type="primary"
:disabled="!checkPermission(['record_confirm'])"
size="small"
@click="handleConfirm(scope)"
>确认</el-button
>
<el-button
v-if="scope.state == '已提交'"
:disabled="!checkPermission(['record_reject'])"
type="danger"
size="small"
@click="handleReject(scope)"
>驳回</el-button
>
</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>
@ -125,10 +176,10 @@
shadow="never" shadow="never"
style="height: 600px; overflow-y: auto; overflow-x: auto" style="height: 600px; overflow-y: auto; overflow-x: auto"
> >
<div> <div style="margin-bottom: 4px">
当前选择的是 当前选择的是
<span style="color:red">{{now.name}}</span> <span style="color: red">{{ now.name }}</span>
</div> </div>
<el-table <el-table
v-loading="listLoading" v-loading="listLoading"
:data="recordList" :data="recordList"
@ -139,7 +190,9 @@
max-height="600px" max-height="600px"
> >
<el-table-column label="名称"> <el-table-column label="名称">
<template slot-scope="scope">{{ scope.row.state }}</template> <template slot-scope="scope">{{
scope.row.state
}}</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-card> </el-card>
@ -156,6 +209,9 @@
> >
<taskinit ref="taskinit" @handleChose="chooseComplete"></taskinit> <taskinit ref="taskinit" @handleChose="chooseComplete"></taskinit>
</el-dialog> </el-dialog>
<el-drawer title="记录" :visible.sync="drawer" :with-header="false">
<recorddo ref="recorddo" :data="data" @handleDo="handleDo" v-if="drawer"></recorddo>
</el-drawer>
</div> </div>
</template> </template>
<style > <style >
@ -173,7 +229,7 @@
margin-bottom: 4px; margin-bottom: 4px;
margin-left: 2px; margin-left: 2px;
cursor: pointer; cursor: pointer;
color: #409EFF; color: #409eff;
} }
</style> </style>
<script> <script>
@ -181,8 +237,10 @@ import { gettask, inittask, gettaskcontents, gettaskdepts } from "@/api/task";
import { getRecordList } from "@/api/record"; import { getRecordList } from "@/api/record";
import Pagination from "@/components/Pagination"; import Pagination from "@/components/Pagination";
import taskinit from "@/views/supervision/taskinit"; import taskinit from "@/views/supervision/taskinit";
import checkPermission from "@/utils/permission";
import recorddo from "@/views/supervision/recorddo";
export default { export default {
components: { Pagination, taskinit }, components: { Pagination, taskinit, recorddo },
data() { data() {
return { return {
task: { id: 0 }, task: { id: 0 },
@ -192,7 +250,9 @@ export default {
depts: [], depts: [],
listLoading: false, listLoading: false,
recordList: [], recordList: [],
now:{} now: {},
drawer: false,
data: {},
}; };
}, },
created() { created() {
@ -202,6 +262,7 @@ export default {
this.gettaskdepts(); this.gettaskdepts();
}, },
methods: { methods: {
checkPermission,
gettask() { gettask() {
gettask(this.task.id).then((res) => { gettask(this.task.id).then((res) => {
this.task = res.data; this.task = res.data;
@ -225,6 +286,17 @@ export default {
gettaskcontents() { gettaskcontents() {
gettaskcontents(this.task.id).then((res) => { gettaskcontents(this.task.id).then((res) => {
this.contents = res.data; this.contents = res.data;
this.listLoading = true;
getRecordList({
pageoff: true,
content: this.contents[0].id,
task: this.task.id,
}).then((res) => {
this.now = this.contents[0];
this.now.type = 'content';
this.listLoading = false;
this.recordList = res.data;
});
}); });
}, },
gettaskdepts() { gettaskdepts() {
@ -232,21 +304,53 @@ export default {
this.depts = res.data; this.depts = res.data;
}); });
}, },
chose1(item){ getRecordList(){
this.now = item this.listLoading = true;
this.listLoading = true var data = {
getRecordList({pageoff:true, content:item.id}).then(res=>{ pageoff: true,
this.listLoading = false task: this.task.id,
this.recordList = res.data }
}) if (this.now.type=='content'){
data.content = this.now.id
}else{
data.belong_dept = this.now.id
}
getRecordList(data).then((res) => {
this.listLoading = false;
this.recordList = res.data;
});
}, },
chose2(item){ chose1(item) {
this.now = item this.now = item;
this.listLoading = true this.now.type = 'content'
getRecordList({pageoff:true, belong_dept:item.id}).then(res=>{ this.listLoading = true;
this.listLoading = false this.getRecordList();
this.recordList = res.data },
}) chose2(item) {
this.now = item;
this.now.type = 'belong_dept'
this.getRecordList();
},
handleUpdate(scope) {
this.data = {
action: "update",
record: scope.row,
};
this.drawer = true;
},
handleReject(scope) {
this.data = {
action: "reject",
record: scope.row,
};
this.drawer = true;
},
handleConfirm(scope) {
},
handleDo(data){
this.drawer = false
this.getRecordList()
} }
}, },
}; };

View File

@ -1,7 +1,7 @@
from django.db.models.base import Model from django.db.models.base import Model
from rest_framework import serializers from rest_framework import serializers
from .models import * from .models import *
from apps.system.serializers import OrganizationSerializer,FileListSerializer,UserSimpleSerializer,OrganizationSimpleSerializer from apps.system.serializers import OrganizationSerializer,FileListSerializer,UserSimpleSerializer,OrganizationSimpleSerializer, FileSimpleSerializer
class ContentSerializer(serializers.ModelSerializer): class ContentSerializer(serializers.ModelSerializer):
@ -38,20 +38,25 @@ class TaskListSerializer(serializers.ModelSerializer):
fields = ['name', 'end_date', 'note', 'complete_rate', 'state', 'id'] fields = ['name', 'end_date', 'note', 'complete_rate', 'state', 'id']
class RecordSerializer(serializers.ModelSerializer): class RecordSerializer(serializers.ModelSerializer):
files_ = FileListSerializer(source='files', many=True, read_only=True)
task_ = TaskListSerializer(source='task') task_ = TaskListSerializer(source='task')
content_=ContentListSerializer(source='content') content_=ContentListSerializer(source='content')
belong_dept_ = OrganizationSimpleSerializer(source='belong_dept', read_only=True)
files_ = FileSimpleSerializer(source='files', many=True, read_only=True)
up_user_ = UserSimpleSerializer(source='up_user', read_only = True)
class Meta: class Meta:
model = Record model = Record
fields = ('id', 'up_date', 'up_user', 'end_date', 'state', fields = '__all__'
'is_yes', 'note', 'noteb','content','content_','task_','task', 'files', 'files_')
@staticmethod @staticmethod
def setup_eager_loading(queryset): def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """ queryset = queryset.select_related('task', 'content', 'belong_dept', 'up_user')
queryset = queryset.select_related('task', 'content', 'belong_dept') queryset = queryset.prefetch_related('files',)
return queryset return queryset
class RecordCreateUpdateSerializer(serializers.ModelSerializer):
pass
class TaksDetailSerializer(serializers.ModelSerializer): class TaksDetailSerializer(serializers.ModelSerializer):
create_by_ = UserSimpleSerializer(source='create_by', read_only = True) create_by_ = UserSimpleSerializer(source='create_by', read_only = True)
belong_dept_ = OrganizationSimpleSerializer(source='belong_dept', read_only=True) belong_dept_ = OrganizationSimpleSerializer(source='belong_dept', read_only=True)

View File

@ -10,8 +10,9 @@ from rest_framework.response import Response
from apps.system.models import Organization from apps.system.models import Organization
from django.db.models import Count from django.db.models import Count
from utils.pagination import PageOrNot from utils.pagination import PageOrNot
from apps.system.mixins import OptimizationMixin
from apps.system.mixins import CreateUpdateCustomMixin from apps.system.mixins import CreateUpdateCustomMixin
from django.utils import timezone
# Create your views here. # Create your views here.
class ContentViewSet(CreateUpdateCustomMixin, ModelViewSet): class ContentViewSet(CreateUpdateCustomMixin, ModelViewSet):
@ -94,13 +95,64 @@ class TaskViewSet(CreateUpdateCustomMixin, ModelViewSet):
serializer = OrganizationSimpleSerializer(obj.depts.distinct(), many=True) serializer = OrganizationSimpleSerializer(obj.depts.distinct(), many=True)
return Response(serializer.data) return Response(serializer.data)
class RecordViewSet(PageOrNot, CreateUpdateCustomMixin, ModelViewSet): class RecordViewSet(OptimizationMixin,PageOrNot, CreateUpdateCustomMixin, ModelViewSet):
perms_map = {'get': '*', 'post': 'record_create', perms_map = {'get': '*', 'post': 'record_create',
'put': 'record_update', 'delete': 'record_delete'} 'put': 'record_update', 'delete': 'record_delete'}
queryset = Record.objects.all() queryset = Record.objects.all()
serializer_class = RecordSerializer serializer_class = RecordSerializer
search_fields = ['name'] search_fields = ['content','task','up_date','state']
ordering = ['-create_time'] ordering = ['-create_time']
filterset_fields = ['content', 'belong_dept'] filterset_fields = ['content', 'belong_dept', 'task']
def update(self, request, *args, **kwargs):
instance = self.get_object()
instance.note = request.data.get('note', None)
instance.save()
return Response(status=status.HTTP_200_OK)
@action(methods=['put'], detail=True, perms_map = {'post':'record_up'})
def up(self, request, *args, **kwargs):
"""
上报
"""
obj = self.get_object()
if obj.state == '待上报' or obj.state == '待整改':
if request.data.get('files', None):
obj.files = request.data['files']
if request.data.get('noteb', None):
obj.noteb = request.data['noteb']
if request.data.get('is_yes', True):
obj.is_yes = request.data.get('is_yes')
obj.state = '已上报'
obj.up_user = request.user
obj.up_date = timezone.now()
obj.save()
return Response(status=status.HTTP_200_OK)
return Response('记录状态错误', status=status.HTTP_400_BAD_REQUEST)
@action(methods=['put'], detail=True, perms_map = {'post':'record_reject'})
def reject(self, request, *args, **kwargs):
"""
驳回
"""
obj = self.get_object()
if obj.state == '已上报':
if request.data.get('note', None):
obj.note = request.data['note']
obj.save()
return Response(status=status.HTTP_200_OK)
else:
return Response('请填写备注', status=status.HTTP_200_OK)
return Response('记录状态错误', status=status.HTTP_400_BAD_REQUEST)
@action(methods=['put'], detail=True, perms_map = {'post':'record_confirm'})
def confirm(self, request, *args, **kwargs):
"""
确认
"""
obj = self.get_object()
if obj.state == '已上报':
obj.state = '已确认'
obj.save()
return Response(status=status.HTTP_200_OK)
return Response('记录状态错误', status=status.HTTP_400_BAD_REQUEST)

View File

@ -148,3 +148,8 @@ class OrganizationSimpleSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Organization model = Organization
fields = ['id', 'name'] fields = ['id', 'name']
class FileSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = File
fields = ['id', 'name', 'path']