task表
This commit is contained in:
		
							parent
							
								
									3e7febf4c4
								
							
						
					
					
						commit
						3475acae63
					
				|  | @ -9,18 +9,3 @@ export default { | ||||||
|   name: 'App' |   name: 'App' | ||||||
| } | } | ||||||
| </script> | </script> | ||||||
| <style > |  | ||||||
|   .el-table--medium td,   .el-table--medium th { |  | ||||||
|     padding: 2px 0; |  | ||||||
|   } |  | ||||||
|   .el-form-item { |  | ||||||
|     margin-bottom: 16px; |  | ||||||
| } |  | ||||||
|   |  | ||||||
| .el-card__body { |  | ||||||
|     padding: 10px; |  | ||||||
| } |  | ||||||
| .el-card__header { |  | ||||||
|     padding: 10px; |  | ||||||
| } |  | ||||||
| </style> |  | ||||||
|  | @ -121,10 +121,10 @@ export const asyncRoutes = [ | ||||||
|       meta: { title: '资料清单', icon: 'documentation', perms: ['content_manage'] } |       meta: { title: '资料清单', icon: 'documentation', perms: ['content_manage'] } | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       path: 'organization', |       path: 'task', | ||||||
|       name: 'Organization', |       name: 'STask', | ||||||
|       component: () => import('@/views/system/organization'), |       component: () => import('@/views/supervision/task.vue'), | ||||||
|       meta: { title: '上报计划', icon: 'tree', perms: ['org_manage'] } |       meta: { title: '报送任务', icon: 'guide', perms: ['task_manage'] } | ||||||
|     }] |     }] | ||||||
| }, | }, | ||||||
|   |   | ||||||
|  |  | ||||||
|  | @ -95,17 +95,7 @@ const actions = { | ||||||
|     return new Promise((resolve, reject) => { |     return new Promise((resolve, reject) => { | ||||||
|       getInfo(state.token).then(response => { |       getInfo(state.token).then(response => { | ||||||
|         const { data } = response |         const { data } = response | ||||||
| 
 |  | ||||||
|         if (!data) { |  | ||||||
|           getInfo(state.token).then(response => { |  | ||||||
|             const { data } = response |  | ||||||
|      |  | ||||||
|             if (!data) { |  | ||||||
|               reject('验证失败,重新登录.') |  | ||||||
|             } |  | ||||||
|      |  | ||||||
|         const { perms, name, avatar } = data |         const { perms, name, avatar } = data | ||||||
|      |  | ||||||
|         // perms must be a non-empty array
 |         // perms must be a non-empty array
 | ||||||
|         if (!perms || perms.length <= 0) { |         if (!perms || perms.length <= 0) { | ||||||
|           reject('没有任何权限!') |           reject('没有任何权限!') | ||||||
|  | @ -115,21 +105,7 @@ const actions = { | ||||||
|         commit('SET_NAME', name) |         commit('SET_NAME', name) | ||||||
|         commit('SET_AVATAR', avatar) |         commit('SET_AVATAR', avatar) | ||||||
|         resolve(data) |         resolve(data) | ||||||
|           }).catch(error => { |  | ||||||
|             reject(error)}) |  | ||||||
|         }else{ |  | ||||||
|           const { perms, name, avatar } = data |  | ||||||
| 
 | 
 | ||||||
|         // perms must be a non-empty array
 |  | ||||||
|         if (!perms || perms.length <= 0) { |  | ||||||
|           reject('没有任何权限!') |  | ||||||
|         } |  | ||||||
|          |  | ||||||
|         commit('SET_PERMS', perms) |  | ||||||
|         commit('SET_NAME', name) |  | ||||||
|         commit('SET_AVATAR', avatar) |  | ||||||
|         resolve(data) |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|          |          | ||||||
|       }).catch(error => { |       }).catch(error => { | ||||||
|  |  | ||||||
|  | @ -10,6 +10,7 @@ body { | ||||||
|   -webkit-font-smoothing: antialiased; |   -webkit-font-smoothing: antialiased; | ||||||
|   text-rendering: optimizeLegibility; |   text-rendering: optimizeLegibility; | ||||||
|   font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; |   font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; | ||||||
|  |   background-color: #f0f2f5; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| label { | label { | ||||||
|  | @ -101,3 +102,18 @@ div:focus { | ||||||
| .el-button { | .el-button { | ||||||
|   border-radius: 0px; |   border-radius: 0px; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | .el-table--medium td,   .el-table--medium th { | ||||||
|  |   padding: 2px 0; | ||||||
|  | } | ||||||
|  | .el-form-item { | ||||||
|  |   margin-bottom: 16px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .el-card__body { | ||||||
|  |   padding: 10px; | ||||||
|  | } | ||||||
|  | .el-card__header { | ||||||
|  |   padding: 10px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -1,15 +1,16 @@ | ||||||
| <template> | <template> | ||||||
|   <div class="app-container"> |   <div class="app-container"> | ||||||
|           |  | ||||||
|     <div style="margin-top: 10px"> |     <div style="margin-top: 10px"> | ||||||
|       <el-button type="primary" icon="el-icon-plus" @click="handleAddContent" |       <el-button type="primary" icon="el-icon-plus" @click="handleAddContent" | ||||||
|         >新增</el-button |         >新增</el-button | ||||||
|       > |       > | ||||||
|     </div> |     </div> | ||||||
|  |     <el-card | ||||||
|  |     style="margin-top: 10px" | ||||||
|  |     > | ||||||
|     <el-table |     <el-table | ||||||
|       v-loading="listLoading" |       v-loading="listLoading" | ||||||
|       :data="contentList" |       :data="contentList" | ||||||
|             style="width: 100%; margin-top: 10px" |  | ||||||
|       border |       border | ||||||
|       fit |       fit | ||||||
|       stripe |       stripe | ||||||
|  | @ -17,30 +18,25 @@ | ||||||
|       max-height="600" |       max-height="600" | ||||||
|     > |     > | ||||||
|       <el-table-column type="index" width="50" /> |       <el-table-column type="index" width="50" /> | ||||||
|             <el-table-column align="center" 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 align="center" label="详情"> |       <el-table-column label="详情"> | ||||||
|         <template slot-scope="scope">{{ scope.row.desc }}</template> |         <template slot-scope="scope">{{ scope.row.desc }}</template> | ||||||
|       </el-table-column> |       </el-table-column> | ||||||
| 
 | 
 | ||||||
|             <el-table-column align="center" label="材料类型"> |       <el-table-column label="材料类型"> | ||||||
|         <template slot-scope="scope">{{ scope.row.type_ }}</template> |         <template slot-scope="scope">{{ scope.row.type_ }}</template> | ||||||
|       </el-table-column> |       </el-table-column> | ||||||
|       <el-table-column align="center" label="是否可主动报送"> |       <el-table-column align="center" label="是否可主动报送"> | ||||||
|                 |         <template slot-scope="scope"> | ||||||
|               <template slot-scope="scope">  <el-tag type="success" v-if="scope.row.can_doself">是</el-tag> |           <el-tag type="success" v-if="scope.row.can_doself">是</el-tag> | ||||||
|               <el-tag type="danger" v-else>否</el-tag></template> |           <el-tag type="danger" v-else>否</el-tag></template | ||||||
|  |         > | ||||||
|       </el-table-column> |       </el-table-column> | ||||||
| 
 | 
 | ||||||
|             <el-table-column |       <el-table-column align="center" label="操作" width="200px" fixed="right"> | ||||||
|               align="center" |  | ||||||
|               label="操作" |  | ||||||
|               width="200px" |  | ||||||
|               fixed="right" |  | ||||||
|             > |  | ||||||
|         <template slot-scope="scope"> |         <template slot-scope="scope"> | ||||||
|                 |  | ||||||
|           <el-button |           <el-button | ||||||
|             :disabled="!checkPermission(['content_update'])" |             :disabled="!checkPermission(['content_update'])" | ||||||
|             type="primary" |             type="primary" | ||||||
|  | @ -58,12 +54,10 @@ | ||||||
|         </template> |         </template> | ||||||
|       </el-table-column> |       </el-table-column> | ||||||
|     </el-table> |     </el-table> | ||||||
| 
 | </el-card> | ||||||
|           |  | ||||||
| 
 |  | ||||||
|     <el-dialog |     <el-dialog | ||||||
|       :visible.sync="dialogVisible" |       :visible.sync="dialogVisible" | ||||||
|       :title="dialogType === 'edit' ? '编辑用户' : '新增用户'" |       :title="dialogType === 'edit' ? '编辑资料' : '新增资料'" | ||||||
|     > |     > | ||||||
|       <el-form |       <el-form | ||||||
|         ref="Form" |         ref="Form" | ||||||
|  | @ -76,26 +70,27 @@ | ||||||
|           <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="type" > |         <el-form-item label="材料类型" prop="type" > | ||||||
|               <treeselect |           <el-cascader | ||||||
|             v-model = "Content.type" |             v-model = "Content.type" | ||||||
|                 :disable-branch-nodes="true" |  | ||||||
|                 placeholder="请选择产品分类" |  | ||||||
|                 clearable |  | ||||||
|                 :style="{width: '100%'}" |  | ||||||
|             :options="typeOptions" |             :options="typeOptions" | ||||||
|                 :multiple="false" |             :props="{ emitPath : false , }" | ||||||
|               ></treeselect> |             clearable | ||||||
|  |             style="width:100%" | ||||||
|  |           ></el-cascader> | ||||||
|         </el-form-item> |         </el-form-item> | ||||||
| 
 | 
 | ||||||
|        |  | ||||||
|         <el-form-item label="详情" prop="desc"> |         <el-form-item label="详情" prop="desc"> | ||||||
|           <el-input  type="textarea"  :rows="4" v-model="Content.desc" placeholder="详情" /> |           <el-input | ||||||
|  |             type="textarea" | ||||||
|  |             :rows="4" | ||||||
|  |             v-model="Content.desc" | ||||||
|  |             placeholder="详情" | ||||||
|  |           /> | ||||||
|         </el-form-item> |         </el-form-item> | ||||||
| 
 | 
 | ||||||
|          <el-form-item label="是否有效" prop="can_doself"> |         <el-form-item label="是否可主动报送" prop="can_doself" label-width="120px"> | ||||||
|           <el-switch v-model="Content.can_doself" ></el-switch> |           <el-switch v-model="Content.can_doself" ></el-switch> | ||||||
|         </el-form-item> |         </el-form-item> | ||||||
|          |  | ||||||
|       </el-form> |       </el-form> | ||||||
|       <div style="text-align: right"> |       <div style="text-align: right"> | ||||||
|         <el-button type="danger" @click="dialogVisible = false">取消</el-button> |         <el-button type="danger" @click="dialogVisible = false">取消</el-button> | ||||||
|  | @ -134,7 +129,7 @@ import { | ||||||
|   getContentList, |   getContentList, | ||||||
|   createContent, |   createContent, | ||||||
|   deleteContent, |   deleteContent, | ||||||
|   updateContent |   updateContent, | ||||||
| } from "@/api/content"; | } from "@/api/content"; | ||||||
| import { genTree } from "@/utils"; | import { genTree } from "@/utils"; | ||||||
| import checkPermission from "@/utils/permission"; | import checkPermission from "@/utils/permission"; | ||||||
|  | @ -145,24 +140,24 @@ import {getDictList, getDictTypeList} from "@/api/dict"; | ||||||
| const defaultContent = { | const defaultContent = { | ||||||
|   name: "", |   name: "", | ||||||
|   desc: "", |   desc: "", | ||||||
|   can_doself: false |   type: null, | ||||||
|  |   can_doself: false, | ||||||
| }; | }; | ||||||
| export default { | export default { | ||||||
|   components: { Pagination, Treeselect }, |   components: { Pagination, Treeselect }, | ||||||
|   data() { |   data() { | ||||||
|     return { |     return { | ||||||
|       Content: defaultContent, |       Content: defaultContent, | ||||||
|  |       contentList: [], | ||||||
|       typeOptions: [], |       typeOptions: [], | ||||||
|       listLoading: true, |       listLoading: true, | ||||||
|       dialogVisible: false, |       dialogVisible: false, | ||||||
|       dialogType: "new", |       dialogType: "new", | ||||||
|       rule1: { |       rule1: { | ||||||
|         name: [{ required: true, message: "请输入名称", trigger: "blur" }] |         name: [{ required: true, message: "请输入名称", trigger: "blur" }], | ||||||
|       }, |       }, | ||||||
|       filterOrgText: "", |       filterOrgText: "", | ||||||
|       treeLoding: false, |       treeLoding: false, | ||||||
| 
 |  | ||||||
|        |  | ||||||
|     }; |     }; | ||||||
|   }, |   }, | ||||||
|   computed: {}, |   computed: {}, | ||||||
|  | @ -172,7 +167,6 @@ export default { | ||||||
|     }, |     }, | ||||||
|   }, |   }, | ||||||
|   created() { |   created() { | ||||||
|      |  | ||||||
|     this.getList(); |     this.getList(); | ||||||
|     this.getTypeAll(); |     this.getTypeAll(); | ||||||
|   }, |   }, | ||||||
|  | @ -194,16 +188,14 @@ export default { | ||||||
|       }); |       }); | ||||||
|     }, |     }, | ||||||
|     getTypeAll() { |     getTypeAll() { | ||||||
|       getDictList({type__code:"data_type"}).then(res=>{ |       getDictList({ type__code: "data_type" }).then((res) => { | ||||||
|         this.typeOptions = genTree(res.data) |         this.typeOptions = genTree(res.data); | ||||||
|         this.defaultContent.type=this.typeOptions[0].id; |       }); | ||||||
|       }) |  | ||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|     handleFilter() { |     handleFilter() { | ||||||
|       this.listQuery.page = 1; |       this.listQuery.page = 1; | ||||||
|       this.getList(); |       this.getList(); | ||||||
|        |  | ||||||
|     }, |     }, | ||||||
|     handleAddContent() { |     handleAddContent() { | ||||||
|       this.Content = Object.assign({}, defaultContent); |       this.Content = Object.assign({}, defaultContent); | ||||||
|  | @ -261,7 +253,7 @@ export default { | ||||||
|           return false; |           return false; | ||||||
|         } |         } | ||||||
|       }); |       }); | ||||||
|     } |     }, | ||||||
|   }, |   }, | ||||||
| }; | }; | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
|  | @ -0,0 +1,259 @@ | ||||||
|  | <template> | ||||||
|  |   <div class="app-container"> | ||||||
|  |     <div style="margin-top: 10px"> | ||||||
|  |       <el-button type="primary" icon="el-icon-plus" @click="handleAddContent" | ||||||
|  |         >新增</el-button | ||||||
|  |       > | ||||||
|  |     </div> | ||||||
|  |     <el-card | ||||||
|  |     style="margin-top: 10px" | ||||||
|  |     > | ||||||
|  |     <el-table | ||||||
|  |       v-loading="listLoading" | ||||||
|  |       :data="contentList" | ||||||
|  |       border | ||||||
|  |       fit | ||||||
|  |       stripe | ||||||
|  |       highlight-current-row | ||||||
|  |       max-height="600" | ||||||
|  |     > | ||||||
|  |       <el-table-column type="index" width="50" /> | ||||||
|  |       <el-table-column label="名称"> | ||||||
|  |         <template slot-scope="scope">{{ scope.row.name }}</template> | ||||||
|  |       </el-table-column> | ||||||
|  |       <el-table-column label="详情"> | ||||||
|  |         <template slot-scope="scope">{{ scope.row.desc }}</template> | ||||||
|  |       </el-table-column> | ||||||
|  | 
 | ||||||
|  |       <el-table-column label="材料类型"> | ||||||
|  |         <template slot-scope="scope">{{ scope.row.type_ }}</template> | ||||||
|  |       </el-table-column> | ||||||
|  |       <el-table-column align="center" label="是否可主动报送"> | ||||||
|  |         <template slot-scope="scope"> | ||||||
|  |           <el-tag type="success" v-if="scope.row.can_doself">是</el-tag> | ||||||
|  |           <el-tag type="danger" v-else>否</el-tag></template | ||||||
|  |         > | ||||||
|  |       </el-table-column> | ||||||
|  | 
 | ||||||
|  |       <el-table-column align="center" label="操作" width="200px" fixed="right"> | ||||||
|  |         <template slot-scope="scope"> | ||||||
|  |           <el-button | ||||||
|  |             :disabled="!checkPermission(['content_update'])" | ||||||
|  |             type="primary" | ||||||
|  |             size="small" | ||||||
|  |             icon="el-icon-edit" | ||||||
|  |             @click="handleEdit(scope)" | ||||||
|  |           /> | ||||||
|  |           <el-button | ||||||
|  |             :disabled="!checkPermission(['content_delete'])" | ||||||
|  |             type="danger" | ||||||
|  |             size="small" | ||||||
|  |             icon="el-icon-delete" | ||||||
|  |             @click="handleDelete(scope)" | ||||||
|  |           /> | ||||||
|  |         </template> | ||||||
|  |       </el-table-column> | ||||||
|  |     </el-table> | ||||||
|  | </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> | ||||||
|  | </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> | ||||||
|  | import { | ||||||
|  |   getContentList, | ||||||
|  |   createContent, | ||||||
|  |   deleteContent, | ||||||
|  |   updateContent, | ||||||
|  | } from "@/api/content"; | ||||||
|  | import { genTree } from "@/utils"; | ||||||
|  | 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"; | ||||||
|  | const defaultContent = { | ||||||
|  |   name: "", | ||||||
|  |   desc: "", | ||||||
|  |   type: null, | ||||||
|  |   can_doself: false, | ||||||
|  | }; | ||||||
|  | export default { | ||||||
|  |   components: { Pagination, Treeselect }, | ||||||
|  |   data() { | ||||||
|  |     return { | ||||||
|  |       Content: defaultContent, | ||||||
|  |       contentList: [], | ||||||
|  |       typeOptions: [], | ||||||
|  |       listLoading: true, | ||||||
|  |       dialogVisible: false, | ||||||
|  |       dialogType: "new", | ||||||
|  |       rule1: { | ||||||
|  |         name: [{ required: true, message: "请输入名称", trigger: "blur" }], | ||||||
|  |       }, | ||||||
|  |       filterOrgText: "", | ||||||
|  |       treeLoding: false, | ||||||
|  |     }; | ||||||
|  |   }, | ||||||
|  |   computed: {}, | ||||||
|  |   watch: { | ||||||
|  |     filterOrgText(val) { | ||||||
|  |       this.$refs.tree.filter(val); | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   created() { | ||||||
|  |     this.getList(); | ||||||
|  |     this.getTypeAll(); | ||||||
|  |   }, | ||||||
|  |   methods: { | ||||||
|  |     checkPermission, | ||||||
|  | 
 | ||||||
|  |     filterNode(value, data) { | ||||||
|  |       if (!value) return true; | ||||||
|  |       return data.label.indexOf(value) !== -1; | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     getList() { | ||||||
|  |       this.listLoading = true; | ||||||
|  |       getContentList().then((response) => { | ||||||
|  |         if (response.data) { | ||||||
|  |           this.contentList = response.data; | ||||||
|  |         } | ||||||
|  |         this.listLoading = false; | ||||||
|  |       }); | ||||||
|  |     }, | ||||||
|  |     getTypeAll() { | ||||||
|  |       getDictList({ type__code: "data_type" }).then((res) => { | ||||||
|  |         this.typeOptions = genTree(res.data); | ||||||
|  |       }); | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     handleFilter() { | ||||||
|  |       this.listQuery.page = 1; | ||||||
|  |       this.getList(); | ||||||
|  |     }, | ||||||
|  |     handleAddContent() { | ||||||
|  |       this.Content = Object.assign({}, defaultContent); | ||||||
|  |       this.dialogType = "new"; | ||||||
|  |       this.dialogVisible = true; | ||||||
|  |       this.$nextTick(() => { | ||||||
|  |         this.$refs["Form"].clearValidate(); | ||||||
|  |       }); | ||||||
|  |     }, | ||||||
|  |     handleEdit(scope) { | ||||||
|  |       this.Content = Object.assign({}, scope.row); // copy obj | ||||||
|  |       this.dialogType = "edit"; | ||||||
|  |       this.dialogVisible = true; | ||||||
|  |       this.$nextTick(() => { | ||||||
|  |         this.$refs["Form"].clearValidate(); | ||||||
|  |       }); | ||||||
|  |     }, | ||||||
|  |     handleDelete(scope) { | ||||||
|  |       this.$confirm("确认删除?", "警告", { | ||||||
|  |         confirmButtonText: "确认", | ||||||
|  |         cancelButtonText: "取消", | ||||||
|  |         type: "error", | ||||||
|  |       }) | ||||||
|  |         .then(async () => { | ||||||
|  |           await deleteContent(scope.row.id); | ||||||
|  |           this.getList(); | ||||||
|  |           this.$message.success("成功"); | ||||||
|  |         }) | ||||||
|  |         .catch((err) => { | ||||||
|  |           console.error(err); | ||||||
|  |         }); | ||||||
|  |     }, | ||||||
|  |     async confirm(form) { | ||||||
|  |       this.$refs[form].validate((valid) => { | ||||||
|  |         if (valid) { | ||||||
|  |           const isEdit = this.dialogType === "edit"; | ||||||
|  |           if (isEdit) { | ||||||
|  |             updateContent(this.Content.id, this.Content).then((res) => { | ||||||
|  |               if (res.code >= 200) { | ||||||
|  |                 this.getList(); | ||||||
|  |                 this.dialogVisible = false; | ||||||
|  |                 this.$message.success("成功"); | ||||||
|  |               } | ||||||
|  |             }); | ||||||
|  |           } else { | ||||||
|  |             createContent(this.Content).then((res) => { | ||||||
|  |               if (res.code >= 200) { | ||||||
|  |                 this.getList(); | ||||||
|  |                 this.dialogVisible = false; | ||||||
|  |                 this.$message.success("成功"); | ||||||
|  |               } | ||||||
|  |             }); | ||||||
|  |           } | ||||||
|  |         } else { | ||||||
|  |           return false; | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  | </script> | ||||||
|  | @ -0,0 +1,18 @@ | ||||||
|  | # Generated by Django 3.0.5 on 2021-03-12 03:25 | ||||||
|  | 
 | ||||||
|  | from django.db import migrations, models | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     dependencies = [ | ||||||
|  |         ('supervision', '0003_auto_20210311_1658'), | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |         migrations.AlterField( | ||||||
|  |             model_name='content', | ||||||
|  |             name='desc', | ||||||
|  |             field=models.TextField(verbose_name='详情'), | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
|  | @ -0,0 +1,18 @@ | ||||||
|  | # Generated by Django 3.0.5 on 2021-03-12 03:26 | ||||||
|  | 
 | ||||||
|  | from django.db import migrations, models | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     dependencies = [ | ||||||
|  |         ('supervision', '0004_auto_20210312_1125'), | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |         migrations.AlterField( | ||||||
|  |             model_name='content', | ||||||
|  |             name='desc', | ||||||
|  |             field=models.TextField(blank=True, null=True, verbose_name='详情'), | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
|  | @ -0,0 +1,103 @@ | ||||||
|  | # Generated by Django 3.0.5 on 2021-03-12 06:40 | ||||||
|  | 
 | ||||||
|  | from django.conf import settings | ||||||
|  | from django.db import migrations, models | ||||||
|  | import django.db.models.deletion | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     dependencies = [ | ||||||
|  |         migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||||||
|  |         ('system', '0008_auto_20210311_0919'), | ||||||
|  |         ('supervision', '0005_auto_20210312_1126'), | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |         migrations.AlterModelOptions( | ||||||
|  |             name='task', | ||||||
|  |             options={'verbose_name': '上报任务', 'verbose_name_plural': '上报任务'}, | ||||||
|  |         ), | ||||||
|  |         migrations.RenameField( | ||||||
|  |             model_name='task', | ||||||
|  |             old_name='is_do', | ||||||
|  |             new_name='is_self', | ||||||
|  |         ), | ||||||
|  |         migrations.RemoveField( | ||||||
|  |             model_name='record', | ||||||
|  |             name='is_lock', | ||||||
|  |         ), | ||||||
|  |         migrations.RemoveField( | ||||||
|  |             model_name='record', | ||||||
|  |             name='updepart', | ||||||
|  |         ), | ||||||
|  |         migrations.RemoveField( | ||||||
|  |             model_name='record', | ||||||
|  |             name='upuser', | ||||||
|  |         ), | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='record', | ||||||
|  |             name='belong_to', | ||||||
|  |             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='record_belong_to', to='system.Organization', verbose_name='所属部门'), | ||||||
|  |         ), | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='record', | ||||||
|  |             name='create_by', | ||||||
|  |             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='record_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人'), | ||||||
|  |         ), | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='record', | ||||||
|  |             name='end_date', | ||||||
|  |             field=models.DateField(blank=True, null=True, verbose_name='截止时间'), | ||||||
|  |         ), | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='record', | ||||||
|  |             name='noteb', | ||||||
|  |             field=models.TextField(blank=True, null=True, verbose_name='上报说明'), | ||||||
|  |         ), | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='record', | ||||||
|  |             name='state', | ||||||
|  |             field=models.CharField(choices=[('待上报', '待上报'), ('已上报', '已上报'), ('已确认', '已确认'), ('待整改', '待整改')], default='待上报', max_length=50, verbose_name='记录状态'), | ||||||
|  |         ), | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='record', | ||||||
|  |             name='up_user', | ||||||
|  |             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='上报人'), | ||||||
|  |         ), | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='record', | ||||||
|  |             name='update_by', | ||||||
|  |             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='record_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'), | ||||||
|  |         ), | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='task', | ||||||
|  |             name='contents', | ||||||
|  |             field=models.ManyToManyField(through='supervision.Record', to='supervision.Content'), | ||||||
|  |         ), | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='task', | ||||||
|  |             name='depts', | ||||||
|  |             field=models.ManyToManyField(through='supervision.Record', to='system.Organization'), | ||||||
|  |         ), | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='task', | ||||||
|  |             name='end_date', | ||||||
|  |             field=models.DateField(blank=True, null=True, verbose_name='截止时间'), | ||||||
|  |         ), | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='task', | ||||||
|  |             name='note', | ||||||
|  |             field=models.TextField(blank=True, null=True, verbose_name='任务备注'), | ||||||
|  |         ), | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='task', | ||||||
|  |             name='state', | ||||||
|  |             field=models.CharField(choices=[('创建中', '创建中'), ('执行中', '执行中'), ('已完成', '已完成')], default='创建中', max_length=50, verbose_name='任务状态'), | ||||||
|  |         ), | ||||||
|  |         migrations.AlterField( | ||||||
|  |             model_name='record', | ||||||
|  |             name='note', | ||||||
|  |             field=models.TextField(blank=True, null=True, verbose_name='上报备注'), | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
|  | @ -8,7 +8,7 @@ class Content(CommonAModel): | ||||||
|     资料清单 |     资料清单 | ||||||
|     """ |     """ | ||||||
|     name = models.CharField('名称', max_length=100) |     name = models.CharField('名称', max_length=100) | ||||||
|     desc = models.CharField('详情', max_length=1000) |     desc = models.TextField('详情', null=True, blank=True) | ||||||
|     type = models.ForeignKey(Dict, verbose_name='材料类型', on_delete= models.DO_NOTHING) |     type = models.ForeignKey(Dict, verbose_name='材料类型', on_delete= models.DO_NOTHING) | ||||||
|     can_doself = models.BooleanField('可随时主动报送', default=False) |     can_doself = models.BooleanField('可随时主动报送', default=False) | ||||||
| 
 | 
 | ||||||
|  | @ -18,23 +18,46 @@ class Content(CommonAModel): | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Task(CommonBModel): | class Task(CommonBModel): | ||||||
|  |     """ | ||||||
|  |     上报任务 | ||||||
|  |     """ | ||||||
|  |     state_choices = ( | ||||||
|  |         ('创建中', '创建中'), | ||||||
|  |         ('执行中', '执行中'), | ||||||
|  |         ('已完成', '已完成'), | ||||||
|  |     ) | ||||||
|     name = models.CharField('名称', max_length=100) |     name = models.CharField('名称', max_length=100) | ||||||
|     is_do = models.BooleanField('是否自创任务', default=False) |     is_self = models.BooleanField('是否主动报送', default=False) | ||||||
|  |     end_date = models.DateField('截止时间', null=True, blank=True) | ||||||
|  |     note = models.TextField('任务备注', null=True, blank=True) | ||||||
|     complete_rate = models.IntegerField('完成度', default=0) |     complete_rate = models.IntegerField('完成度', default=0) | ||||||
|  |     contents = models.ManyToManyField('supervision.content', through='supervision.record') | ||||||
|  |     depts = models.ManyToManyField('system.organization', through='supervision.record') | ||||||
|  |     state = models.CharField('任务状态', max_length=50, choices=state_choices, default='创建中') | ||||||
|  |     class Meta: | ||||||
|  |         verbose_name = '上报任务' | ||||||
|  |         verbose_name_plural = verbose_name | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | class Record(CommonBModel): | ||||||
| class Record(BaseModel): |  | ||||||
|     """ |     """ | ||||||
|     上报记录 |     上报记录 | ||||||
|     """ |     """ | ||||||
|  |     state_choices = ( | ||||||
|  |         ('待上报', '待上报'), | ||||||
|  |         ('已上报', '已上报'), | ||||||
|  |         ('已确认', '已确认'), | ||||||
|  |         ('待整改', '待整改') | ||||||
|  |     ) | ||||||
|     content = models.ForeignKey(Content, verbose_name='材料内容', on_delete=models.DO_NOTHING) |     content = models.ForeignKey(Content, verbose_name='材料内容', on_delete=models.DO_NOTHING) | ||||||
|     task = models.ForeignKey(Task, verbose_name='关联任务', null=True, blank=True, on_delete=models.SET_NULL) |     task = models.ForeignKey(Task, verbose_name='关联任务', null=True, blank=True, on_delete=models.SET_NULL) | ||||||
|     updepart = models.ForeignKey(Organization, verbose_name='上传部门', null=True, blank=True,on_delete=models.DO_NOTHING) |     up_date = models.DateField('上报时间', null=True, blank=True) | ||||||
|     upuser = models.ForeignKey(User,verbose_name='上传人', null=True, blank=True,on_delete=models.DO_NOTHING) |     up_user = models.ForeignKey(User, verbose_name='上报人', null=True, blank=True,on_delete=models.SET_NULL) | ||||||
|     is_lock = models.BooleanField('是否锁住', default=False) |     end_date = models.DateField('截止时间', null=True, blank=True) | ||||||
|  |     state = models.CharField('记录状态', max_length=50, choices=state_choices, default='待上报') | ||||||
|     is_yes = models.BooleanField('是否适用', default=True) |     is_yes = models.BooleanField('是否适用', default=True) | ||||||
|     note = models.TextField('说明') |     note = models.TextField('上报备注', null=True, blank=True) | ||||||
|  |     noteb = models.TextField('上报说明', null=True, blank=True) | ||||||
|     files = models.ManyToManyField(File, verbose_name="关联文件") |     files = models.ManyToManyField(File, verbose_name="关联文件") | ||||||
|     class Meta: |     class Meta: | ||||||
|         verbose_name = '上报记录' |         verbose_name = '上报记录' | ||||||
|  |  | ||||||
|  | @ -19,3 +19,13 @@ class ContentSerializer(serializers.ModelSerializer): | ||||||
|         if obj.type.pid: |         if obj.type.pid: | ||||||
|             data = obj.type.pid.name + '/' + data |             data = obj.type.pid.name + '/' + data | ||||||
|         return data |         return data | ||||||
|  | 
 | ||||||
|  | class TaskCreateUpdateSerializer(serializers.ModelSerializer): | ||||||
|  |     class Meta: | ||||||
|  |         model = Task | ||||||
|  |         fields = ['name', 'end_date', 'note'] | ||||||
|  | 
 | ||||||
|  | class TaskListSerializer(serializers.ModelSerializer): | ||||||
|  |     class Meta: | ||||||
|  |         model = Task | ||||||
|  |         fields = ['name', 'is_self', 'end_date', 'note', 'complete_rate'] | ||||||
|  | @ -11,11 +11,11 @@ from apps.system.models import Organization | ||||||
| from openpyxl import Workbook, load_workbook | from openpyxl import Workbook, load_workbook | ||||||
| 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 CreateModelAMixin | from apps.system.mixins import CreateUpdateCustomMixin | ||||||
| 
 | 
 | ||||||
| # Create your views here. | # Create your views here. | ||||||
| 
 | 
 | ||||||
| class ContentViewSet(CreateModelAMixin, ModelViewSet): | class ContentViewSet(CreateUpdateCustomMixin, ModelViewSet): | ||||||
|     """ |     """ | ||||||
|     资料清单:增删改查 |     资料清单:增删改查 | ||||||
|     """ |     """ | ||||||
|  | @ -23,9 +23,19 @@ class ContentViewSet(CreateModelAMixin, ModelViewSet): | ||||||
|                  'put': 'content_update', 'delete': 'content_delete'} |                  'put': 'content_update', 'delete': 'content_delete'} | ||||||
|     queryset = Content.objects.all() |     queryset = Content.objects.all() | ||||||
|     serializer_class = ContentSerializer |     serializer_class = ContentSerializer | ||||||
|  |     pagination_class = None | ||||||
|     search_fields = ['name', 'desc'] |     search_fields = ['name', 'desc'] | ||||||
|     filterset_fields = ['type'] |     filterset_fields = ['type'] | ||||||
|     ordering = ['type__sort', 'create_time'] |     ordering = ['type__sort', 'create_time'] | ||||||
|     def paginate_queryset(self, queryset): | 
 | ||||||
|         return None | class TaskViewSet(CreateUpdateCustomMixin, ModelViewSet): | ||||||
|  |     perms_map = {'get': '*', 'post': 'task_create', | ||||||
|  |                  'put': 'task_update', 'delete': 'task_delete'} | ||||||
|  |     queryset = Task.objects.all() | ||||||
|  |     search_fields = ['name'] | ||||||
|  |     ordering = ['-create_time'] | ||||||
|  |     def get_serializer_class(self): | ||||||
|  |         if self.action in ['create', 'update']: | ||||||
|  |             return TaskCreateUpdateSerializer | ||||||
|  |         return TaskListSerializer | ||||||
|          |          | ||||||
|  | @ -2,30 +2,47 @@ from rest_framework import status | ||||||
| from rest_framework.response import Response | from rest_framework.response import Response | ||||||
| from rest_framework.settings import api_settings | from rest_framework.settings import api_settings | ||||||
| 
 | 
 | ||||||
| class CreateModelAMixin: | class CreateUpdateModelAMixin: | ||||||
|     """ |     """ | ||||||
|     业务用基本表A用 |     业务用基本表A用 | ||||||
|     """ |     """ | ||||||
|     def perform_create(self, serializer): |     def perform_create(self, serializer): | ||||||
|         serializer.save(create_by = self.request.user) |         serializer.save(create_by = self.request.user) | ||||||
|      |      | ||||||
| class UpdateModelAMixin: |  | ||||||
|     """ |  | ||||||
|     业务用基本表A用 |  | ||||||
|     """ |  | ||||||
|     def perform_update(self, serializer): |     def perform_update(self, serializer): | ||||||
|         serializer.save(update_by = self.request.user) |         serializer.save(update_by = self.request.user) | ||||||
| 
 | 
 | ||||||
| class CreateModelBMixin: | class CreateUpdateModelBMixin: | ||||||
|     """ |     """ | ||||||
|     业务用基本表B用 |     业务用基本表B用 | ||||||
|     """ |     """ | ||||||
|     def perform_create(self, serializer): |     def perform_create(self, serializer): | ||||||
|         serializer.save(create_by = self.request.user, belong_to=self.request.user.dept) |         serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept) | ||||||
|      |      | ||||||
| class UpdateModelBMixin: |  | ||||||
|     """ |  | ||||||
|     业务用基本表B用 |  | ||||||
|     """ |  | ||||||
|     def perform_update(self, serializer): |     def perform_update(self, serializer): | ||||||
|         serializer.save(update_by = self.request.user) |         serializer.save(update_by = self.request.user) | ||||||
|  | 
 | ||||||
|  | class CreateUpdateCustomMixin: | ||||||
|  |     """ | ||||||
|  |     整合 | ||||||
|  |     """ | ||||||
|  |     def perform_create(self, serializer): | ||||||
|  |         if hasattr(self.queryset.model, 'belong_dept'): | ||||||
|  |             serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept) | ||||||
|  |         else: | ||||||
|  |             serializer.save(create_by = self.request.user) | ||||||
|  |     def perform_update(self, serializer): | ||||||
|  |         serializer.save(update_by = self.request.user) | ||||||
|  | 
 | ||||||
|  | class OptimizationMixin: | ||||||
|  |     """ | ||||||
|  |     性能优化,需要在序列化器里定义setup_eager_loading,可在必要的View下继承 | ||||||
|  |     """ | ||||||
|  |     def get_queryset(self): | ||||||
|  |         queryset = self.queryset | ||||||
|  |         if isinstance(queryset, QuerySet): | ||||||
|  |             # Ensure queryset is re-evaluated on each request. | ||||||
|  |             queryset = queryset.all() | ||||||
|  |         if hasattr(self.get_serializer_class(), 'setup_eager_loading'): | ||||||
|  |             queryset = self.get_serializer_class().setup_eager_loading(queryset)  # 性能优化 | ||||||
|  |         return queryset | ||||||
|  | @ -313,14 +313,13 @@ from django.conf import settings | ||||||
| from rest_framework.parsers import (FileUploadParser, JSONParser, | from rest_framework.parsers import (FileUploadParser, JSONParser, | ||||||
|                                     MultiPartParser) |                                     MultiPartParser) | ||||||
| 
 | 
 | ||||||
| from .mixins import CreateModelAMixin |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| class FileViewSet(ModelViewSet): | class FileViewSet(ModelViewSet): | ||||||
|     """ |     """ | ||||||
|     文件:增删改查 |     文件:增删改查 | ||||||
|     """ |     """ | ||||||
|     perms_map = None |     perms_map = None | ||||||
|  |     permission_classes=[IsAuthenticated] | ||||||
|     parser_classes = [MultiPartParser, JSONParser] |     parser_classes = [MultiPartParser, JSONParser] | ||||||
|     queryset = File.objects.all() |     queryset = File.objects.all() | ||||||
|     serializer_class = FileSerializer |     serializer_class = FileSerializer | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue