40 changed files with 38 additions and 4697 deletions
			
			
		| @ -1,69 +0,0 @@ | |||
| <template> | |||
|   <!-- 预警列表 --> | |||
|   <el-card shadow="never" class="aui-card--fill"> | |||
|     <div class="mod-sys__role"> | |||
|       <head-template head-left="预警列表" /> | |||
|       <el-table | |||
|         :data="dataList" | |||
|         :height="tableHeight" | |||
|         style="width: 100%;" | |||
|       > | |||
|         <el-table-column prop="patientName" label="患者姓名" header-align="center" align="center" /> | |||
|         <el-table-column prop="examTime" label="检查日期" header-align="center" align="center" /> | |||
|         <el-table-column prop="warnType" label="指标名称" header-align="center" align="center" /> | |||
|         <el-table-column prop="" label="本次数值" header-align="center" align="center"> | |||
|           <template slot-scope="scope"> | |||
|             <span>OD:{{ scope.row.od }}、</span> | |||
|             <span>OS:{{ scope.row.os }}</span> | |||
|           </template> | |||
|         </el-table-column> | |||
|         <el-table-column label="详情" header-align="center" width="500"> | |||
|           <template slot-scope="scope"> | |||
|             <p v-for="(item,index) in scope.row.result" :key="index" v-html="item" /> | |||
|           </template> | |||
|         </el-table-column> | |||
|         <!-- <el-table-column label="操作" fixed="right" header-align="center" align="center"> | |||
|           <template slot-scope="scope"> | |||
|             <el-button | |||
|               type="text" | |||
|               size="small" | |||
|               @click="addOrUpdateHandle(scope.row.id,scope.row)" | |||
|             >{{ $t('update') }}</el-button> | |||
|             <el-button | |||
|               type="text" | |||
|               size="small" | |||
|               style="color:red" | |||
|               @click="deleteHandle([scope.row.id])" | |||
|             >{{ $t('delete') }}</el-button> | |||
|           </template> | |||
|         </el-table-column> --> | |||
|       </el-table> | |||
|     </div> | |||
|   </el-card> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import mixinViewModule from '@/mixins/view-module' | |||
| import tableAutoHeight from '@/mixins/tableAutoHeight' | |||
| import headTemplate from '@/components/head' | |||
| export default { | |||
|   components: { | |||
|     headTemplate | |||
|   }, | |||
|   mixins: [mixinViewModule, tableAutoHeight], | |||
|   data() { | |||
|     return { | |||
|       mixinViewModuleOptions: { | |||
|         getDataListURL: '/sys/target/earlyWarning', | |||
|         deleteURL: '/sys/role', | |||
|         deleteIsBatch: true | |||
|       }, | |||
|       dataForm: { | |||
|         name: '' | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| </style> | |||
| @ -1,188 +0,0 @@ | |||
| <template> | |||
|   <el-dialog | |||
|     class="alert-setting" | |||
|     :visible.sync="visible" | |||
|     width="30%" | |||
|     :title="dataForm.id ? '修改预警条件':'新增预警条件'" | |||
|   > | |||
|     <el-form ref="dataForm" :model="dataForm" :rules="dataRule"> | |||
|       <el-form-item label="指标名称:" label-width="100px" prop="name"> | |||
|         <el-select v-model="dataForm.name " placeholder="请选择指标名称" clearable> | |||
|           <el-option v-for="(item,index) in targetNameList " :key="index" :value="item.name" :label="item.name" @click.native="selectOptionHandle(item)" /> | |||
|         </el-select> | |||
|       </el-form-item> | |||
|       <!-- flag=1,较上次上升/下降,flag=0,值大于/小于 --> | |||
|       <template v-if="ISFlag"> | |||
|         <el-form-item label="值大于:" prop="greaterThan" label-width="100px"> | |||
|           <el-input v-model="dataForm.greaterThan" placeholder="请填写值" /> | |||
|           <span class="company">{{ dataForm.targetUnit }}</span> | |||
|         </el-form-item> | |||
|         <el-form-item label="值小于:" label-width="100px" prop="lessThan"> | |||
|           <el-input v-model="dataForm.lessThan" placeholder="请填写值" /> | |||
|           <span class="company">{{ dataForm.targetUnit }}</span> | |||
|         </el-form-item> | |||
|       </template> | |||
|       <template v-else> | |||
|         <el-form-item label="较上次下降:" label-width="100px" prop="lowerThan"> | |||
|           <el-input v-model="dataForm.lowerThan" placeholder="请填写值" /> | |||
|         </el-form-item> | |||
|         <el-form-item label="较上次上升:" label-width="100px" prop="upThan"> | |||
|           <el-input v-model="dataForm.upThan" up="请填写值" /> | |||
|         </el-form-item> | |||
|       </template> | |||
|       <el-form-item label="启用" label-width="90px"> | |||
|         <el-switch v-model="dataForm.status" :active-value="1" :inactive-value="0" /> | |||
|       </el-form-item> | |||
|     </el-form> | |||
|     <template slot="footer"> | |||
|       <el-button @click="visible = false">{{ $t('cancel') }}</el-button> | |||
|       <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button> | |||
|     </template> | |||
|   </el-dialog> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import debounce from 'lodash/debounce' | |||
| export default { | |||
|   props: { | |||
|     targetNameList: { | |||
|       type: Array, | |||
|       default: () => [] | |||
|     } | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       visible: false, | |||
|       dataForm: { | |||
|         greaterThan: '', // 值大于 | |||
|         lessThan: '', // 值小于 | |||
|         id: '', | |||
|         status: 1, // 1:开启 0:关闭 | |||
|         lowerThan: '', // 较上次下降 | |||
|         upThan: '', // 较上次上升 | |||
|         name: '', // 指标名称 | |||
|         targetUnit: '' // 指标单位 | |||
|       }, | |||
|       ISFlag: true // 大于小于为true | |||
|     } | |||
|   }, | |||
|   computed: { | |||
|     dataRule() { | |||
|       return { | |||
|         name: [ | |||
|           { required: true, message: '请选择指标名称', trigger: 'change' } | |||
|         ] | |||
|       } | |||
|     } | |||
|   }, | |||
|   created() { | |||
|   }, | |||
|   methods: { | |||
|     // 选择指标发生变化时 | |||
|     selectOptionHandle(item) { | |||
|       console.log(item) | |||
|       // flag=1,较上次上升/下降,flag=0,值大于/小于 | |||
|       this.ISFlag = item.flag === 0 | |||
|       this.dataForm.targetUnit = item.targetUnit | |||
|     }, | |||
|     // 状态切换 | |||
|     // switchHandle(e) { | |||
|     //   // 1:开启 0:关闭 | |||
|     //   console.log(e) | |||
|     //   this.dataForm.status = e ? 1 : 0 | |||
|     // }, | |||
|     // 初始化 | |||
|     init() { | |||
|       this.visible = true | |||
|       this.$nextTick(() => { | |||
|         this.$refs.dataForm.resetFields() // 重置表单 | |||
|         if (this.dataForm.id) { | |||
|           this.getInfo() | |||
|         } | |||
|       }) | |||
|     }, | |||
|     // 获取信息 | |||
|     getInfo() { | |||
|       this.$http.get(`/sys/target/${this.dataForm.id}`).then(({ data: res }) => { | |||
|         if (res.code !== 0) { | |||
|           return this.$message.error(res.msg) | |||
|         } | |||
|         this.dataForm = { | |||
|           ...this.dataForm, | |||
|           ...res.data | |||
|         } | |||
|         this.ISFlag = res.data.flag === 0 | |||
|       }).catch(() => { }) | |||
|     }, | |||
|     // 表单提交 | |||
|     dataFormSubmitHandle: debounce(function() { | |||
|       console.log(this.dataForm) | |||
|       this.$refs.dataForm.validate((valid) => { | |||
|         if (!valid) { | |||
|           return false | |||
|         } | |||
|         // if (this.ISFlag && !this.dataForm.greaterThan && !this.dataForm.lessThan) { | |||
|         //   return this.$message.error('值必须填写一个') | |||
|         // } else if (!this.ISFlag) { | |||
|         //   if (!this.dataForm.lowerThan && !this.dataForm.upThan) { | |||
|         //     return this.$message.error('值必须填写一个') | |||
|         //   } else if (this.dataForm.lowerThan && this.dataForm.upThan) { | |||
|         //     return this.$message.error('值只能填写一个') | |||
|         //   } | |||
|         // } | |||
|         this.$http[!this.dataForm.id ? 'post' : 'put']('/sys/target', this.dataForm).then(({ data: res }) => { | |||
|           if (res.code !== 0) { | |||
|             return this.$message.error(res.msg) | |||
|           } | |||
|           this.$message({ | |||
|             message: this.$t('prompt.success'), | |||
|             type: 'success', | |||
|             duration: 500, | |||
|             onClose: () => { | |||
|               this.visible = false | |||
|               this.$emit('refreshDataList') | |||
|             } | |||
|           }) | |||
|         }).catch(() => {}) | |||
|       }) | |||
|     }, 1000, { leading: true, trailing: false }) | |||
|   } | |||
| } | |||
| </script> | |||
| <style lang="scss"> | |||
| .alert-setting { | |||
|   .company { | |||
|     display: inline-block; | |||
|     width: 60px; | |||
|     padding-left: 5px; | |||
|   } | |||
|   .el-form-item__content { | |||
|     display: flex; | |||
|   } | |||
|   .el-dialog__header { | |||
|     margin-bottom:12px | |||
|   } | |||
|     .el-dialog__body { | |||
|         padding-right: 30px; | |||
|     } | |||
|     .formItemOne .el-form-item__content { | |||
|       display: flex; | |||
|     } | |||
|     .el-date-editor.el-input, .el-date-editor.el-input__inner{ | |||
|       width: 100%; | |||
|     } | |||
|     .el-select{ | |||
|       display: block; | |||
|       width: 100%; | |||
|       padding-right: 50px; | |||
|     } | |||
|     .el-input-number { | |||
|       display: block; | |||
|       width: 100%; | |||
|     } | |||
|     .el-switch { | |||
|       line-height: 40px; | |||
|       display: block; | |||
|     } | |||
| } | |||
| </style> | |||
| @ -1,104 +0,0 @@ | |||
| <template> | |||
|   <div class="charge-management"> | |||
|     <!-- 模板列表 --> | |||
|     <head-template head-left="预警设置"> | |||
|       <el-button type="primary" size="small" icon="el-icon-plus" @click="addOrUpdateHandle()">新增</el-button> | |||
|     </head-template> | |||
|     <!-- 模板内容 --> | |||
|     <el-table ref="multipleTable" :data="dataList" tooltip-effect="dark" style="width: 100%" :height="tableHeight"> | |||
|       <el-table-column label="状态"> | |||
|         <template slot-scope="scope"> | |||
|           <!-- 1:开启 0:关闭 --> | |||
|           <el-switch :value="scope.row.status == 1 ? true : false" @change="switchHandle(scope.row,$event)" /> | |||
|         </template> | |||
|       </el-table-column> | |||
|       <el-table-column label="指标名称"> | |||
|         <template slot-scope="scope"> | |||
|           <span>{{ scope.row.name }}</span> | |||
|         </template> | |||
|       </el-table-column> | |||
|       <el-table-column prop="content" label="条件" /> | |||
|       <el-table-column prop="operation" label="操作"> | |||
|         <template slot-scope="scope"> | |||
|           <span style="color: #1890ff; padding-right: 8px" class="details" @click="addOrUpdateHandle(scope.row.id,'')">修改</span> | |||
|           <span style="color: #ff4d4f" class="delete" @click="deleteHandle(scope.row.id)">删除</span> | |||
|         </template> | |||
|       </el-table-column> | |||
|     </el-table> | |||
|     <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" :target-name-list="targetNameList" @refreshDataList="getDataList" /> | |||
|     <!-- <el-pagination background layout="prev, pager, next" :total="total" @current-change="pageCurrentChangeHandle" /> --> | |||
|   </div> | |||
| </template> | |||
| <script> | |||
| import headTemplate from '@/components/head' | |||
| import addOrUpdate from './add-or-update.vue' | |||
| import mixinViewModule from '@/mixins/view-module' | |||
| import tableAutoHeight from '@/mixins/tableAutoHeight' | |||
| export default { | |||
|   components: { | |||
|     headTemplate, | |||
|     addOrUpdate | |||
|   }, | |||
|   mixins: [mixinViewModule, tableAutoHeight], | |||
|   data() { | |||
|     return { | |||
|       targetNameList: [], | |||
|       mixinViewModuleOptions: { | |||
|         getDataListURL: '/sys/target/targetList', | |||
|         deleteURL: '/sys/target' | |||
|       } | |||
|     } | |||
|   }, | |||
|   created() { | |||
|     this.getTargetName() | |||
|   }, | |||
|   methods: { | |||
|     // 获取指标名称 | |||
|     async getTargetName() { | |||
|       const { data: res } = await this.$http.get('/sys/target/selectTarget') | |||
|       if (res.code === 0) { | |||
|         this.targetNameList = res.data | |||
|       } else { | |||
|         this.$message.error(res.msg) | |||
|       } | |||
|     }, | |||
|     // 修改预警状态 | |||
|     async switchHandle(scopeRow, e) { | |||
|       console.log(scopeRow, e) | |||
|       // 1:开启 0:关闭 | |||
|       const { data: res } = await this.$http.post('/sys/target/switchStatus', { | |||
|         id: scopeRow.id, | |||
|         status: e === false ? 0 : 1 | |||
|       }) | |||
|       if (res.code === 0) { | |||
|         this.getDataListInitial() | |||
|       } else { | |||
|         this.$message.error(res.msg) | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .charge-management { | |||
|   background: #fff; | |||
|   padding: 20px; | |||
|   min-height: calc(calc(100vh - 50px - 30px) - 2px); | |||
|   .defaultButton { | |||
|     display: inline-block; | |||
|     border: 1px solid #1E79FF; | |||
|     color: #1E79FF; | |||
|     font-size: 12px; | |||
|     padding: 0 10px; | |||
|     border-radius: 16px; | |||
|     margin-left: 10px; | |||
|   } | |||
|   .details, | |||
|   .delete { | |||
|     cursor: pointer; | |||
|   } | |||
|   .el-icon-more { | |||
|       margin-left: 6px; | |||
|   } | |||
| } | |||
| </style> | |||
| @ -1,5 +0,0 @@ | |||
| <template> | |||
|   <div> | |||
|     <router-view /> | |||
|   </div> | |||
| </template> | |||
| @ -1,5 +0,0 @@ | |||
| <template> | |||
|   <div> | |||
|     <router-view /> | |||
|   </div> | |||
| </template> | |||
| @ -1,113 +0,0 @@ | |||
| <template> | |||
|   <el-dialog class="add-edit-centre" :visible.sync="visible" :title="!dataForm.id ? '新增宣教' : '修改宣教'" @close="closeDialog"> | |||
|     <el-form ref="dataForm" :model="dataForm" :rules="dataRule" label-width="auto" @keyup.enter.native="dataFormSubmitHandle()"> | |||
|       <el-form-item prop="node" label="状态节点"> | |||
|         <el-input v-model="dataForm.node" placeholder="请输入状态节点" /> | |||
|       </el-form-item> | |||
|       <el-form-item prop="url" label="url"> | |||
|         <el-input v-model="dataForm.url" placeholder="请输入URL" /> | |||
|       </el-form-item> | |||
|       <el-form-item prop="title" label="名称"> | |||
|         <el-input v-model="dataForm.title" placeholder="请输入名称" /> | |||
|       </el-form-item> | |||
|       <el-form-item prop="remark" label="备注"> | |||
|         <el-input v-model="dataForm.remark" placeholder="请输入备注" /> | |||
|       </el-form-item> | |||
|     </el-form> | |||
|     <template slot="footer"> | |||
|       <el-button @click="visible = false">{{ $t('cancel') }}</el-button> | |||
|       <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button> | |||
|     </template> | |||
|   </el-dialog> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import debounce from 'lodash/debounce' | |||
| export default { | |||
|   props: { | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       visible: false, | |||
|       dataForm: { | |||
|         id: '', | |||
|         url: '', | |||
|         node: '', | |||
|         title: '', | |||
|         remark: '' | |||
|       } | |||
|     } | |||
|   }, | |||
|   computed: { | |||
|     dataRule() { | |||
|       return { | |||
|         node: [ | |||
|           { required: true, message: '请输入状态节点', trigger: 'blur' } | |||
|         ], | |||
|         url: [ | |||
|           { required: true, message: '请输入URL', trigger: 'blur' } | |||
|         ] | |||
|       } | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     init() { | |||
|       this.visible = true | |||
|       this.$nextTick(() => { | |||
|         this.$refs.dataForm.resetFields() | |||
|         if (this.dataForm.id) { | |||
|           this.getInfo() | |||
|         } | |||
|       }) | |||
|     }, | |||
|     // 获取信息 | |||
|     getInfo() { | |||
|       this.$http.get(`/preach/${this.dataForm.id}`).then(({ data: res }) => { | |||
|         if (res.code !== 0) { | |||
|           return this.$message.error(res.msg) | |||
|         } | |||
|         this.dataForm = { | |||
|           ...this.dataForm, | |||
|           ...res.data | |||
|         } | |||
|       }).catch(() => {}) | |||
|     }, | |||
|     // 表单提交 | |||
|     dataFormSubmitHandle: debounce(function() { | |||
|       this.$refs.dataForm.validate((valid) => { | |||
|         if (!valid) { | |||
|           return false | |||
|         } | |||
|         this.$http[!this.dataForm.id ? 'post' : 'put']('/preach', this.dataForm).then(({ data: res }) => { | |||
|           if (res.code !== 0) { | |||
|             return this.$message.error(res.msg) | |||
|           } | |||
|           this.$message({ | |||
|             message: this.$t('prompt.success'), | |||
|             type: 'success', | |||
|             duration: 500, | |||
|             onClose: () => { | |||
|               this.visible = false | |||
|               this.$emit('refreshDataList') | |||
|             } | |||
|           }) | |||
|         }).catch(() => {}) | |||
|       }) | |||
|     }, 1000, { leading: true, trailing: false }), | |||
| 
 | |||
|     closeDialog() { | |||
|       this.$emit('closeDialog') | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| <style lang="scss"> | |||
| .add-edit-centre{ | |||
|   .el-dialog__header { | |||
|     margin-bottom:12px | |||
|   } | |||
|   .el-select { | |||
|     display: block; | |||
|   } | |||
| } | |||
| </style> | |||
| @ -1,96 +0,0 @@ | |||
| <template> | |||
|   <!-- 通知机制 --> | |||
|   <el-card shadow="never" class="aui-card--fill propaganda"> | |||
|     <div class="mod-sys__role"> | |||
|       <head-template head-left="通知机制"> | |||
|         <el-button size="small" @click="enterHandle">平台入口</el-button> | |||
|         <el-button type="primary" size="small" icon="el-icon-plus" @click="addOrUpdateHandle()">新增</el-button> | |||
|       </head-template> | |||
|       <el-table | |||
|         v-loading="dataListLoading" | |||
|         :data="dataList" | |||
|         :height="tableHeight" | |||
|         style="width: 100%;" | |||
|         @selection-change="dataListSelectionChangeHandle" | |||
|         @sort-change="dataListSortChangeHandle" | |||
|       > | |||
|         <!-- <el-table-column type="selection" header-align="center" align="center" width="50" /> --> | |||
|         <el-table-column prop="node" label="状态节点" header-align="center" align="center" /> | |||
|         <el-table-column prop="title" label="名称" header-align="center" align="center" /> | |||
|         <el-table-column prop="url" label="URL" header-align="center" align="center"> | |||
|           <template slot-scope="scope"> | |||
|             <span class="url-span" @click="URLEnterHandle(scope.row)"> {{ scope.row.url }}</span> | |||
|           </template> | |||
|         </el-table-column> | |||
|         <el-table-column prop="updateDate" label="修改时间" header-align="center" align="center" /> | |||
|         <el-table-column prop="remark" label="备注" header-align="center" align="center"> | |||
|           <template slot-scope="scope"> | |||
|             {{ scope.row.remark ? scope.row.remark : '-' }} | |||
|           </template> | |||
|         </el-table-column> | |||
|         <el-table-column prop="operation" label="操作" header-align="center" align="center"> | |||
|           <template slot-scope="scope"> | |||
|             <span style="color: #1890ff; padding-right: 8px" class="button-span" @click="addOrUpdateHandle(scope.row.id,scope.row)">编辑</span> | |||
|             <span style="color: #ff4d4f;" class="button-span" @click="deleteHandle(scope.row.id)">删除</span> | |||
|           </template> | |||
|         </el-table-column> | |||
|       </el-table> | |||
|       <el-pagination background layout="prev, pager, next" :total="total" @current-change="pageCurrentChangeHandle" /> | |||
|       <!-- 弹窗, 新增 / 修改 --> | |||
|       <add-propaganda v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList" @closeDialog="addOrUpdateVisible=false" /> | |||
|     </div> | |||
|   </el-card> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import addPropaganda from './add-propaganda.vue' | |||
| import mixinViewModule from '@/mixins/view-module' | |||
| import tableAutoHeight from '@/mixins/tableAutoHeight' | |||
| import headTemplate from '@/components/head' | |||
| export default { | |||
|   components: { | |||
|     addPropaganda, | |||
|     headTemplate | |||
|   }, | |||
|   mixins: [mixinViewModule, tableAutoHeight], | |||
|   data() { | |||
|     return { | |||
|       mixinViewModuleOptions: { | |||
|         getDataListURL: '/preach', | |||
|         deleteURL: '/preach', | |||
|         deleteIsBatch: true, | |||
|         getDataListIsPage: false | |||
|       }, | |||
|       dataForm: { | |||
|         name: '' | |||
|       } | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     // URL入口 | |||
|     enterHandle() { | |||
|       window.open('https://mp.weixin.qq.com/') | |||
|     }, | |||
|     // 链接跳转 | |||
|     URLEnterHandle(scopeRow) { | |||
|       window.open(scopeRow.url) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .propaganda { | |||
|   .url-span { | |||
|     white-space: nowrap; // 段落不换行 | |||
|     text-overflow: ellipsis; | |||
|     overflow: hidden; | |||
|   } | |||
|   .url-span:hover { | |||
|     color: #1e79ff; | |||
|     cursor: pointer; | |||
|   } | |||
|   .button-span { | |||
|     cursor: pointer; | |||
|   } | |||
| } | |||
| </style> | |||
| @ -1,158 +0,0 @@ | |||
| <template> | |||
|   <!-- 宣教统计 --> | |||
|   <div class="statistics"> | |||
|     <template v-if="isShowPatient"> | |||
|       <div class="statistics-head"> | |||
|         <el-form :inline="true" :model="dataForm" class="demo-form-inline" @keyup.enter.native="getDataListInitial()"> | |||
|           <el-form-item label="患者ID:"> | |||
|             <el-input v-model="dataForm.patientId" size="small" clearable placeholder="患者ID" @clear="getDataListInitial()" /> | |||
|           </el-form-item> | |||
|           <el-form-item label="患者姓名:"> | |||
|             <el-input v-model="dataForm.patientName" placeholder="患者姓名" size="small" clearable @clear="getDataListInitial()" /> | |||
|           </el-form-item> | |||
|           <el-form-item label="阅读进度:"> | |||
|             <el-select v-model="dataForm.readProgress" clearable placeholder="请选择阅读进度" @change="getDataListInitial()"> | |||
|               <el-option v-for="(item,index) in readProgressList" :key="index" :label="item.name" :value="item.value" /> | |||
|             </el-select> | |||
|           </el-form-item> | |||
|           <el-form-item prop="dateRange" label="日期" class="form-item-date"> | |||
|             <el-date-picker | |||
|               v-model="dataForm.searchDate" | |||
|               class="right-pick-btn" | |||
|               clearable | |||
|               type="date" | |||
|               size="small" | |||
|               value-format="yyyy-MM-dd" | |||
|               placeholder="按日期查询" | |||
|               @change="getDataListInitial()" | |||
|             /> | |||
|           </el-form-item> | |||
|           <el-form-item style="flex:1"> | |||
|             <el-button type="primary" icon="el-icon-search" size="small" @click="getDataListInitial()">查询</el-button> | |||
|           </el-form-item> | |||
|         </el-form> | |||
|       </div> | |||
|       <div class="statistics-content"> | |||
|         <el-table | |||
|           ref="multipleTable" | |||
|           :data="dataList" | |||
|           :height="tableHeight" | |||
|           tooltip-effect="dark" | |||
|           style="width: 100%" | |||
|         > | |||
|           <el-table-column prop="patientId" label="患者ID " header-align="center" align="center" /> | |||
|           <el-table-column prop="patientName" label="患者姓名" header-align="center" align="center" /> | |||
|           <el-table-column prop="articleName" label="文章名称" header-align="center" align="center" /> | |||
|           <el-table-column label="阅读进度"> | |||
|             <template slot-scope="scope"> | |||
|               <el-progress :percentage="Number(scope.row.rate)" /> | |||
|             </template> | |||
|           </el-table-column> | |||
|         </el-table> | |||
|         <el-pagination background layout="total,prev, pager, next" :total="total" :current-page.sync="page" @current-change="pageCurrentChangeHandle" /> | |||
|       </div></template> | |||
|     <router-view v-else /> | |||
|   </div> | |||
| </template> | |||
| <script> | |||
| import mixinViewModule from '@/mixins/view-module' | |||
| import tableAutoHeight from '@/mixins/tableAutoHeight' | |||
| import { dateFilterTwo } from '@/filters/index.js' | |||
| export default { | |||
|   components: { | |||
|   }, | |||
|   mixins: [mixinViewModule, tableAutoHeight], | |||
|   data() { | |||
|     return { | |||
|       mixinViewModuleOptions: { | |||
|         getDataListURL: '/propagation/page', | |||
|         getDataListIsPage: true, | |||
|         createdIsNeed: false | |||
|       }, | |||
|       nextVisitTime: [], | |||
|       isShowPatient: true, | |||
|       detailViewVisible: false, | |||
|       dataForm: { | |||
|         patientId: '', | |||
|         patientName: '', | |||
|         readProgress: '', | |||
|         searchDate: '' | |||
|       }, | |||
|       doctorNameList: [], | |||
|       currentTableList: [], | |||
|       patientIdNumber: '', | |||
|       detailId: '', | |||
|       readProgressList: [{ | |||
|         value: 0, | |||
|         name: '未开始' | |||
|       }, { | |||
|         value: 1, | |||
|         name: '阅读中' | |||
|       }, { | |||
|         value: 2, | |||
|         name: '已完成' | |||
|       }] | |||
|     } | |||
|   }, | |||
|   created() { | |||
|     this.dataForm.searchDate = dateFilterTwo(this.$moment().format('L')) | |||
|     this.getDataList() | |||
|   }, | |||
|   methods: { | |||
|   } | |||
| } | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .statistics { | |||
|   .statistics-head, | |||
|   .statistics-content { | |||
|     background: #fff; | |||
|     .head { | |||
|       padding-bottom: 10px; | |||
|     } | |||
|   } | |||
|   .statistics-content { | |||
|     padding: 16px; | |||
|     margin-bottom: 45px; | |||
|   } | |||
|   .statistics-head { | |||
|     margin-bottom: 16px; | |||
|     padding: 10px 16px; | |||
|   } | |||
|   .operation-delete, | |||
|   .operation-details { | |||
|     cursor: pointer; | |||
|   } | |||
| } | |||
| </style> | |||
| <style lang="scss"> | |||
| .statistics { | |||
|   .statistics-head { | |||
|     .el-form { | |||
|       display: flex; | |||
|       justify-content: space-between; | |||
|     } | |||
|     .el-form-item { | |||
|       display: flex; | |||
|     } | |||
|     .el-form-item__label { | |||
|       min-width: 75px; | |||
|     } | |||
|     .el-form-item { | |||
|       margin-bottom: 0; | |||
|       width: 25%; | |||
|     } | |||
|     .el-form-item__content, | |||
|     .el-select, | |||
|     .el-range-editor--small.el-input__inner { | |||
|       width: 100%; | |||
|     } | |||
|     .form-item-date .el-form-item__content { | |||
|         min-width: 180px; | |||
|       } | |||
|   } | |||
|   .el-select { | |||
|     width: 100%; | |||
|   } | |||
| } | |||
| </style> | |||
| @ -1,197 +0,0 @@ | |||
| <template> | |||
|   <el-dialog | |||
|     :visible.sync="visible" | |||
|     :title="dataForm.title||(!dataForm.id ? $t('add') : $t('update'))" | |||
|     :close-on-click-modal="false" | |||
|     :close-on-press-escape="false" | |||
|   > | |||
|     <el-form | |||
|       ref="dataForm1" | |||
|       class="wsInfo" | |||
|       :model="dataForm" | |||
|       :rules="dataRule" | |||
|       label-width="auto" | |||
|       @submit.native.prevent | |||
|       @keyup.enter.native="initBaseInfo()" | |||
|     > | |||
|       <!-- webservice地址 --> | |||
|       <el-form-item prop="webServiceUrl" :label="'webservice地址'"> | |||
|         <el-input v-model="dataForm.webServiceUrl" :placeholder="'输入webservice地址配置'" /> | |||
|       </el-form-item> | |||
|     </el-form> | |||
|     <el-form ref="dataForm2" class="baseInfo" :model="dataForm" :rules="dataRule" label-width="auto" @keyup.enter.native="dataFormSubmitHandle()"> | |||
|       <!-- 分中心名称 --> | |||
|       <el-form-item prop="name" :label="'分中心名称'"> | |||
|         <el-input v-model="dataForm.name" :placeholder="'分中心名称'" /> | |||
|       </el-form-item> | |||
|       <!-- 分中心地址 --> | |||
|       <el-form-item prop="regionList" :label="'分中心地址'"> | |||
|         <region-tree v-model="dataForm.regionList" /> | |||
|       </el-form-item> | |||
|       <!-- 详细地址 --> | |||
|       <el-form-item prop="address" :label="'详细地址'"> | |||
|         <el-input v-model="dataForm.address" :placeholder="'详细地址'" /> | |||
|       </el-form-item> | |||
|       <!-- 组织机构代码 --> | |||
|       <el-form-item prop="organizationCode" :label="'组织机构代码'"> | |||
|         <el-input v-model="dataForm.organizationCode" :placeholder="'组织机构代码'" /> | |||
|       </el-form-item> | |||
|     </el-form> | |||
|     <template slot="footer"> | |||
|       <el-button @click="visible = false">{{ $t('cancel') }}</el-button> | |||
|       <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button> | |||
|     </template> | |||
|   </el-dialog> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import debounce from 'lodash/debounce' | |||
| import regionTree from '@/components/region-tree' | |||
| export default { | |||
|   components: { | |||
|     regionTree | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       visible: false, | |||
|       deptList: [], | |||
|       deptListVisible: false, | |||
|       dataForm: { | |||
|         id: '', | |||
|         webServiceUrl: '', | |||
|         name: '', | |||
|         regionList: [], // [130000, 130100, 130104], | |||
|         provinceId: 0, | |||
|         cityId: 0, | |||
|         areaId: 0, | |||
|         address: '', | |||
|         organizationCode: '' | |||
|       } | |||
|     } | |||
|   }, | |||
|   computed: { | |||
|     dataRule() { | |||
|       var validateTree = (rule, value, callback) => { | |||
|         if (this.dataForm.regionList.length === 0) { | |||
|           return callback(new Error('请选择地区')) | |||
|         } | |||
|         callback() | |||
|       } | |||
|       return { | |||
|         webServiceUrl: [ | |||
|           { required: true, message: this.$t('validate.required'), trigger: 'blur' } | |||
|         ], | |||
|         name: [ | |||
|           { required: true, message: this.$t('validate.required'), trigger: 'blur' } | |||
|         ], | |||
|         regionList: [ | |||
|           { required: true, validator: validateTree, trigger: 'change' } | |||
|         ], | |||
|         address: [ | |||
|           { required: true, message: this.$t('validate.required'), trigger: 'blur' } | |||
|         ], | |||
|         organizationCode: [ | |||
|           { required: true, message: this.$t('validate.required'), trigger: 'blur' } | |||
|         ] | |||
|       } | |||
|     } | |||
|   }, | |||
|   watch: { | |||
|     'dataForm.regionList': { | |||
|       handler(newValue, oldValue) { | |||
|         if (newValue && newValue.length > 0) { | |||
|           this.dataForm.provinceId = newValue[0] || '' | |||
|           this.dataForm.cityId = newValue[1] || '' | |||
|           this.dataForm.areaId = newValue[2] || '' | |||
|         } | |||
|       }, | |||
|       deep: true | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     init() { | |||
|       this.visible = true | |||
|       this.$nextTick(() => { | |||
|         this.$refs.dataForm1.resetFields() | |||
|         this.$refs.dataForm2.resetFields() | |||
|         if (this.dataForm.id) { | |||
|           this.getInfo() | |||
|         } | |||
|       }) | |||
|     }, | |||
|     initBaseInfo() {}, | |||
|     // 获取信息 | |||
|     getInfo() { | |||
|       this.$http.get(`/sys/dept/${this.dataForm.id}`).then(({ data: res }) => { | |||
|         if (res.code !== 0) { | |||
|           return this.$message.error(res.msg) | |||
|         } | |||
|         this.dataForm = { | |||
|           ...this.dataForm, | |||
|           ...res.data | |||
|         } | |||
|         this.dataForm.regionList = [ | |||
|           this.dataForm.provinceId || null, | |||
|           this.dataForm.cityId || null, | |||
|           this.dataForm.areaId || null | |||
|         ] | |||
|       }).catch(() => {}) | |||
|     }, | |||
|     // 上级部门树, 选中 | |||
|     deptListTreeCurrentChangeHandle(data) { | |||
|       this.dataForm.pid = data.id | |||
|       this.dataForm.parentName = data.name | |||
|       this.deptListVisible = false | |||
|     }, | |||
|     // 表单提交 | |||
|     dataFormSubmitHandle: debounce(function() { | |||
|       this.$refs.dataForm1.validate((valid1) => { | |||
|         if (!valid1) { | |||
|           return false | |||
|         } | |||
|         this.$refs.dataForm2.validate((valid2) => { | |||
|           if (!valid2) { | |||
|             return false | |||
|           } | |||
|           this.$http[!this.dataForm.id ? 'post' : 'put']('/sys/dept', this.dataForm).then(({ data: res }) => { | |||
|             if (res.code !== 0) { | |||
|               return this.$message.error(res.msg) | |||
|             } | |||
|             this.$message({ | |||
|               message: this.$t('prompt.success'), | |||
|               type: 'success', | |||
|               duration: 500, | |||
|               onClose: () => { | |||
|                 this.visible = false | |||
|                 this.$emit('refreshDataList') | |||
|               } | |||
|             }) | |||
|           }).catch(() => {}) | |||
|         }) | |||
|       }) | |||
|     }, 1000, { leading: true, trailing: false }) | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss"> | |||
| .mod-sys__dept { | |||
|   .dept-list { | |||
|     .el-input__inner, | |||
|     .el-input__suffix { | |||
|       cursor: pointer; | |||
|     } | |||
|   } | |||
| } | |||
| 
 | |||
| .wsInfo{ | |||
|    padding:0 20px; | |||
| } | |||
| 
 | |||
| .baseInfo{ | |||
|     padding: 20px; | |||
|     // background: rgba(205,205,205,0.18000000715255737); | |||
|     border-radius: 4px; | |||
|     // border: 1px solid #C2C2C2 !important; | |||
| } | |||
| </style> | |||
| @ -1,83 +0,0 @@ | |||
| <template> | |||
|   <el-card shadow="never" class="aui-card--fill"> | |||
|     <div class="mod-sys__dept"> | |||
|       <el-form :inline="true" :model="dataForm" @submit.native.prevent @keyup.enter.native="getDataList()"> | |||
|         <el-form-item> | |||
|           <el-button v-if="$hasPermission('sys:dept:save')" type="primary" @click="addOrUpdateHandle(null,null,'添加分中心')">{{ $t('add') }}</el-button> | |||
|         </el-form-item> | |||
|       </el-form> | |||
|       <el-table v-loading="dataListLoading" :data="dataList" row-key="id" border style="width: 100%;"> | |||
|         <!-- 名称 --> | |||
|         <el-table-column prop="name" :label="$t('dept.name')" header-align="center" min-width="150" /> | |||
|         <!-- 地址 --> | |||
|         <el-table-column prop="address" :label="'地址'" header-align="center" width="300" :show-overflow-tooltip="true" /> | |||
|         <!-- 管理员 --> | |||
|         <el-table-column prop="deptAdminUser" :label="'管理员'" header-align="center" align="center"> | |||
|           <template slot-scope="scope"> | |||
|             {{ scope.row.deptAdminUser|filterList }} | |||
|           </template> | |||
|         </el-table-column> | |||
|         <!-- 课题数量 --> | |||
|         <el-table-column prop="projectCount" :label="'课题数量'" sortable="custom" header-align="center" align="center" width="120"> | |||
|           <template slot-scope="scope"> | |||
|             {{ scope.row.projectCount +'个' }} | |||
|           </template> | |||
|         </el-table-column> | |||
|         <!-- 研究员数量 --> | |||
|         <el-table-column prop="researcherCount" :label="'研究员数量'" sortable="custom" header-align="center" align="center" width="120"> | |||
|           <template slot-scope="scope"> | |||
|             {{ scope.row.researcherCount +'人' }} | |||
|           </template> | |||
|         </el-table-column> | |||
|         <!-- 创建时间 --> | |||
|         <el-table-column :label="$t('handle')" header-align="center" align="center" width="150"> | |||
|           <template slot-scope="scope"> | |||
|             <el-button | |||
|               v-if="$hasPermission('sys:dept:update')" | |||
|               type="text" | |||
|               size="small" | |||
|               @click="addOrUpdateHandle(scope.row.id,null,'修改分中心信息')" | |||
|             >{{ $t('update') }}</el-button> | |||
|             <el-button | |||
|               v-if="$hasPermission('sys:dept:delete')" | |||
|               type="text" | |||
|               size="small" | |||
|               style="color:red" | |||
|               @click="deleteHandle(scope.row.id)" | |||
|             >{{ $t('delete') }}</el-button> | |||
|           </template> | |||
|         </el-table-column> | |||
|       </el-table> | |||
|       <!-- 弹窗, 新增 / 修改 --> | |||
|       <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList" /> | |||
|     </div> | |||
|   </el-card> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import mixinViewModule from '@/mixins/view-module' | |||
| import AddOrUpdate from './depart-add-or-update' | |||
| export default { | |||
|   components: { | |||
|     AddOrUpdate | |||
|   }, | |||
|   filters: { | |||
|     filterList(arr) { | |||
|       const result = [] | |||
|       arr.forEach(item => { | |||
|         result.push(item.userName) | |||
|       }) | |||
|       return result.join(',') | |||
|     } | |||
|   }, | |||
|   mixins: [mixinViewModule], | |||
|   data() { | |||
|     return { | |||
|       mixinViewModuleOptions: { | |||
|         getDataListURL: '/sys/dept/list', | |||
|         deleteURL: '/sys/dept' | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| @ -1,72 +0,0 @@ | |||
| <template> | |||
|   <el-card shadow="never" class="aui-card--fill"> | |||
|     <div class="mod-sys__log-error"> | |||
|       <el-form :inline="true" :model="dataForm" @submit.native.prevent @keyup.enter.native="getDataList()"> | |||
|         <el-form-item> | |||
|           <el-button type="info" @click="exportHandle()">{{ $t('export') }}</el-button> | |||
|         </el-form-item> | |||
|       </el-form> | |||
|       <el-table v-loading="dataListLoading" :data="dataList" border style="width: 100%;" @sort-change="dataListSortChangeHandle"> | |||
|         <el-table-column prop="requestUri" :label="$t('logError.requestUri')" header-align="center" align="center" /> | |||
|         <el-table-column prop="requestMethod" :label="$t('logError.requestMethod')" header-align="center" align="center" width="90" /> | |||
|         <el-table-column prop="requestParams" :label="$t('logError.requestParams')" header-align="center" align="center" width="150" :show-overflow-tooltip="true" /> | |||
|         <el-table-column prop="ip" :label="$t('logError.ip')" header-align="center" align="center" width="125" /> | |||
|         <el-table-column prop="userAgent" :label="$t('logError.userAgent')" header-align="center" align="center" width="150" :show-overflow-tooltip="true" /> | |||
|         <el-table-column prop="createDate" :label="$t('logError.createDate')" sortable="custom" header-align="center" align="center" width="180" /> | |||
|         <el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="150"> | |||
|           <template slot-scope="scope"> | |||
|             <el-button type="text" size="small" @click="infoHandle(scope.row.errorInfo)">{{ $t('logError.errorInfo') }}</el-button> | |||
|           </template> | |||
|         </el-table-column> | |||
|       </el-table> | |||
|       <el-pagination | |||
|         :current-page="page" | |||
|         :page-sizes="[10, 20, 50, 100]" | |||
|         :page-size="limit" | |||
|         :total="total" | |||
|         layout="total, sizes, prev, pager, next, jumper" | |||
|         @size-change="pageSizeChangeHandle" | |||
|         @current-change="pageCurrentChangeHandle" | |||
|       /> | |||
|     </div> | |||
|   </el-card> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import mixinViewModule from '@/mixins/view-module' | |||
| export default { | |||
|   mixins: [mixinViewModule], | |||
|   data() { | |||
|     return { | |||
|       mixinViewModuleOptions: { | |||
|         getDataListURL: '/sys/log/error/page', | |||
|         getDataListIsPage: true, | |||
|         exportURL: '/sys/log/error/export' | |||
|       } | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     // 异常信息 | |||
|     infoHandle(info) { | |||
|       this.$alert(info, this.$t('logError.errorInfo'), { | |||
|         customClass: 'mod-sys__log-error-view-info' | |||
|       }) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss"> | |||
| .mod-sys__log-error { | |||
|   &-view-info { | |||
|     width: 80%; | |||
|     height: calc(100% - 100px); | |||
| 
 | |||
|      .el-message-box__content{ | |||
|       overflow: auto; | |||
|       height: calc(100% - 90px); | |||
|     } | |||
|   } | |||
| } | |||
| 
 | |||
| </style> | |||
| @ -1,71 +0,0 @@ | |||
| <template> | |||
|   <el-card shadow="never" class="aui-card--fill"> | |||
|     <div class="mod-sys__log-login"> | |||
|       <el-form :inline="true" :model="dataForm" @submit.native.prevent @keyup.enter.native="getDataList()"> | |||
|         <el-form-item> | |||
|           <el-input v-model="dataForm.creatorName" :placeholder="$t('logLogin.creatorName')" clearable /> | |||
|         </el-form-item> | |||
|         <el-form-item> | |||
|           <el-select v-model="dataForm.status" :placeholder="$t('logLogin.status')" clearable> | |||
|             <el-option :label="$t('logLogin.status0')" :value="0" /> | |||
|             <el-option :label="$t('logLogin.status1')" :value="1" /> | |||
|             <el-option :label="$t('logLogin.status2')" :value="2" /> | |||
|           </el-select> | |||
|         </el-form-item> | |||
|         <el-form-item> | |||
|           <el-button @click="getDataList()">{{ $t('query') }}</el-button> | |||
|         </el-form-item> | |||
|         <el-form-item> | |||
|           <el-button type="info" @click="exportHandle()">{{ $t('export') }}</el-button> | |||
|         </el-form-item> | |||
|       </el-form> | |||
|       <el-table v-loading="dataListLoading" :data="dataList" border style="width: 100%;" @sort-change="dataListSortChangeHandle"> | |||
|         <el-table-column prop="creatorName" :label="$t('logLogin.creatorName')" header-align="center" align="center" /> | |||
|         <el-table-column prop="operation" :label="$t('logLogin.operation')" header-align="center" align="center"> | |||
|           <template slot-scope="scope"> | |||
|             {{ scope.row.operation === 0 ? $t('logLogin.operation0') : $t('logLogin.operation1') }} | |||
|           </template> | |||
|         </el-table-column> | |||
|         <el-table-column prop="status" :label="$t('logLogin.status')" sortable="custom" header-align="center" align="center"> | |||
|           <template slot-scope="scope"> | |||
|             <el-tag v-if="scope.row.status === 0" size="small" type="danger">{{ $t('logLogin.status0') }}</el-tag> | |||
|             <el-tag v-else-if="scope.row.status === 1" size="small" type="success">{{ $t('logLogin.status1') }}</el-tag> | |||
|             <el-tag v-else size="small" type="warning">{{ $t('logLogin.status2') }}</el-tag> | |||
|           </template> | |||
|         </el-table-column> | |||
|         <el-table-column prop="ip" :label="$t('logLogin.ip')" header-align="center" align="center" /> | |||
|         <el-table-column prop="userAgent" :label="$t('logLogin.userAgent')" header-align="center" align="center" width="150" :show-overflow-tooltip="true" /> | |||
|         <el-table-column prop="createDate" :label="$t('logLogin.createDate')" sortable="custom" header-align="center" align="center" width="180" /> | |||
|       </el-table> | |||
|       <el-pagination | |||
|         :current-page="page" | |||
|         :page-sizes="[10, 20, 50, 100]" | |||
|         :page-size="limit" | |||
|         :total="total" | |||
|         layout="total, sizes, prev, pager, next, jumper" | |||
|         @size-change="pageSizeChangeHandle" | |||
|         @current-change="pageCurrentChangeHandle" | |||
|       /> | |||
|     </div> | |||
|   </el-card> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import mixinViewModule from '@/mixins/view-module' | |||
| export default { | |||
|   mixins: [mixinViewModule], | |||
|   data() { | |||
|     return { | |||
|       mixinViewModuleOptions: { | |||
|         getDataListURL: '/sys/log/login/page', | |||
|         getDataListIsPage: true, | |||
|         exportURL: '/sys/log/login/export' | |||
|       }, | |||
|       dataForm: { | |||
|         creatorName: '', | |||
|         status: '' | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| @ -1,144 +0,0 @@ | |||
| <template> | |||
|   <el-card shadow="never" class="aui-card--fill"> | |||
|     <div class="mod-sys__log-operation"> | |||
|       <el-form :inline="true" :model="dataForm" @submit.native.prevent @keyup.enter.native="getDataList()"> | |||
|         <!-- 用户名 --> | |||
|         <el-form-item> | |||
|           <el-input v-model="dataForm.username" :placeholder="'用户名'" clearable style="width:120px;" /> | |||
|         </el-form-item> | |||
|         <!-- 用户操作 --> | |||
|         <el-form-item> | |||
|           <el-input v-model="dataForm.action" :placeholder="'用户操作'" clearable style="width:250px;" /> | |||
|         </el-form-item> | |||
|         <!-- 请求方式 --> | |||
|         <el-form-item> | |||
|           <el-select v-model="dataForm.method" :placeholder="'请求方式'" clearable style="width:120px;"> | |||
|             <el-option label="GET" value="GET" /> | |||
|             <el-option label="POST" value="POST" /> | |||
|             <el-option label="PUT" value="PUT" /> | |||
|             <el-option label="DELETE" value="DELETE" /> | |||
|           </el-select> | |||
|         </el-form-item> | |||
|         <!-- 状态 --> | |||
|         <el-form-item> | |||
|           <el-select v-model="dataForm.status" :placeholder="$t('logOperation.status')" clearable style="width:120px;"> | |||
|             <el-option :label="$t('logOperation.status0')" :value="0" /> | |||
|             <el-option :label="$t('logOperation.status1')" :value="1" /> | |||
|           </el-select> | |||
|         </el-form-item> | |||
|         <!-- IP地址 --> | |||
|         <el-form-item> | |||
|           <el-input v-model="dataForm.ip" :placeholder="'IP地址'" clearable style="width:160px;" /> | |||
|         </el-form-item> | |||
|         <!-- 课题ID --> | |||
|         <el-form-item> | |||
|           <el-input v-model="tempProjectId" :placeholder="'课题ID'" clearable style="width:160px;" /> | |||
|         </el-form-item> | |||
|         <el-form-item> | |||
|           <el-button @click="getDataList()">{{ $t('query') }}</el-button> | |||
|         </el-form-item> | |||
|         <!-- <el-form-item><el-button type="info" @click="exportHandle()">{{ $t('export') }}</el-button></el-form-item> --> | |||
|       </el-form> | |||
|       <el-table v-loading="dataListLoading" :data="dataList" border style="width: 100%;" @sort-change="dataListSortChangeHandle"> | |||
|         <!-- 展开 --> | |||
|         <el-table-column type="expand"> | |||
|           <template slot-scope="scope"> | |||
|             <el-form label-width="90px" class="expand-form"> | |||
|               <el-form-item :label="$t('logOperation.creatorName')"> | |||
|                 <span>{{ scope.row.creatorName }}</span> | |||
|               </el-form-item> | |||
|               <el-form-item :label="$t('logOperation.operation')"> | |||
|                 <span>{{ scope.row.operation }}</span> | |||
|               </el-form-item> | |||
|               <el-form-item :label="$t('logOperation.requestUri')"> | |||
|                 <span>{{ scope.row.requestUri }}</span> | |||
|               </el-form-item> | |||
|               <el-form-item :label="$t('logOperation.requestMethod')"> | |||
|                 <span>{{ scope.row.requestMethod }}</span> | |||
|               </el-form-item> | |||
|               <el-form-item :label="$t('logOperation.requestParams')"> | |||
|                 <span>{{ scope.row.requestParams }}</span> | |||
|               </el-form-item> | |||
|               <el-form-item :label="$t('logOperation.requestTime')"> | |||
|                 <span>{{ `${scope.row.requestTime}ms` }}</span> | |||
|               </el-form-item> | |||
|               <el-form-item :label="$t('logOperation.status')"> | |||
|                 <el-tag v-if="scope.row.status === 0" size="small" type="danger">{{ $t('logOperation.status0') }}</el-tag> | |||
|                 <el-tag v-else size="small" type="success">{{ $t('logOperation.status1') }}</el-tag> | |||
|               </el-form-item> | |||
|               <el-form-item :label="$t('logOperation.ip')"> | |||
|                 <span>{{ scope.row.ip }}</span> | |||
|               </el-form-item> | |||
|               <el-form-item :label="$t('logOperation.userAgent')"> | |||
|                 <span>{{ scope.row.userAgent }}</span> | |||
|               </el-form-item> | |||
|               <el-form-item :label="$t('logOperation.createDate')"> | |||
|                 <span>{{ scope.row.createDate }}</span> | |||
|               </el-form-item> | |||
|             </el-form> | |||
|           </template> | |||
|         </el-table-column> | |||
| 
 | |||
|         <el-table-column prop="creatorName" :label="$t('logOperation.creatorName')" header-align="center" align="center" width="120" /> | |||
|         <el-table-column prop="operation" :label="$t('logOperation.operation')" /> | |||
|         <el-table-column prop="requestUri" :label="$t('logOperation.requestUri')" /> | |||
|         <el-table-column prop="requestMethod" :label="$t('logOperation.requestMethod')" header-align="center" align="center" width="80" /> | |||
|         <!-- <el-table-column prop="requestParams" :label="$t('logOperation.requestParams')" width="150" :show-overflow-tooltip="true" /> --> | |||
|         <el-table-column prop="requestTime" :label="'耗时'" sortable="custom" header-align="center" width="80"> | |||
|           <template slot-scope="scope"> | |||
|             {{ `${scope.row.requestTime}ms` }} | |||
|           </template> | |||
|         </el-table-column> | |||
|         <!--<el-table-column prop="status" :label="$t('logOperation.status')" sortable="custom" > | |||
|           <template slot-scope="scope"> | |||
|             <el-tag v-if="scope.row.status === 0" size="small" type="danger">{{ $t('logOperation.status0') }}</el-tag> | |||
|             <el-tag v-else size="small" type="success">{{ $t('logOperation.status1') }}</el-tag> | |||
|           </template> | |||
|         </el-table-column>--> | |||
|         <el-table-column prop="ip" :label="$t('logOperation.ip')" width="125" header-align="center" /> | |||
|         <!-- <el-table-column prop="userAgent" :label="$t('logOperation.userAgent')"  width="150" :show-overflow-tooltip="true" />  --> | |||
|         <el-table-column prop="createDate" :label="$t('logOperation.createDate')" header-align="center" sortable="custom" width="160" /> | |||
|       </el-table> | |||
|       <!-- 分页 --> | |||
|       <el-pagination | |||
|         :current-page="page" | |||
|         :page-sizes="[10, 20, 50, 100]" | |||
|         :page-size="limit" | |||
|         :total="total" | |||
|         layout="total, sizes, prev, pager, next, jumper" | |||
|         @size-change="pageSizeChangeHandle" | |||
|         @current-change="pageCurrentChangeHandle" | |||
|       /> | |||
|     </div> | |||
|   </el-card> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import mixinViewModule from '@/mixins/view-module' | |||
| export default { | |||
|   mixins: [mixinViewModule], | |||
|   data() { | |||
|     return { | |||
|       mixinViewModuleOptions: { | |||
|         getDataListURL: '/sys/log/operation/page', | |||
|         getDataListIsPage: true | |||
|         // exportURL: '/sys/log/operation/export' | |||
|       }, | |||
|       tempProjectId: '', | |||
|       dataForm: { | |||
|         status: '', | |||
|         username: '', | |||
|         action: '', | |||
|         method: '', | |||
|         ip: '', | |||
|         projectId: null | |||
|       } | |||
|     } | |||
|   }, | |||
|   watch: { | |||
|     tempProjectId(val) { | |||
|       this.dataForm.projectId = !val ? null : val | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| @ -1,237 +0,0 @@ | |||
| <template> | |||
|   <el-dialog :visible.sync="visible" :title="!dataForm.id ? $t('add') : $t('update')" :close-on-click-modal="false" :close-on-press-escape="false"> | |||
|     <el-form | |||
|       ref="dataForm" | |||
|       :model="dataForm" | |||
|       :rules="dataRule" | |||
|       label-width="auto" | |||
|       @submit.native.prevent | |||
|       @keyup.enter.native="dataFormSubmitHandle()" | |||
|     > | |||
|       <!-- 类型 --> | |||
|       <el-form-item prop="type" :label="$t('menu.type')"> | |||
|         <el-radio-group v-model="dataForm.type" :disabled="!!dataForm.id"> | |||
|           <el-radio-button :label="0">{{ $t('menu.type0') }}</el-radio-button> | |||
|           <el-radio-button :label="1">{{ $t('menu.type1') }}</el-radio-button> | |||
|         </el-radio-group> | |||
|       </el-form-item> | |||
|       <!-- 名称 --> | |||
|       <el-form-item prop="name" :label="$t('menu.name')"> | |||
|         <el-input v-model="dataForm.name" :placeholder="$t('menu.name')" /> | |||
|       </el-form-item> | |||
|       <!-- 上级菜单 --> | |||
|       <el-form-item prop="parentName" :label="$t('menu.parentName')" class="menu-list"> | |||
|         <el-popover ref="menuListPopover" v-model="menuListVisible" placement="bottom-start" trigger="click"> | |||
|           <el-tree | |||
|             ref="menuListTree" | |||
|             :data="menuList" | |||
|             :props="{ label: 'name', children: 'children' }" | |||
|             node-key="id" | |||
|             :highlight-current="true" | |||
|             :expand-on-click-node="false" | |||
|             accordion | |||
|             @current-change="menuListTreeCurrentChangeHandle" | |||
|           /> | |||
|         </el-popover> | |||
|         <el-input v-model="dataForm.parentName" v-popover:menuListPopover :readonly="true" :placeholder="$t('menu.parentName')"> | |||
|           <i v-if="dataForm.pid !== '0'" slot="suffix" class="el-icon-circle-close el-input__icon" @click.stop="deptListTreeSetDefaultHandle()" /> | |||
|         </el-input> | |||
|       </el-form-item> | |||
|       <!-- 排序 --> | |||
|       <el-form-item prop="sort" :label="$t('menu.sort')"> | |||
|         <el-input-number v-model="dataForm.sort" controls-position="right" :min="0" :label="$t('menu.sort')" /> | |||
|       </el-form-item> | |||
|       <!-- 授权标识 --> | |||
|       <el-form-item prop="permissions" :label="$t('menu.permissions')"> | |||
|         <el-input v-model="dataForm.permissions" :placeholder="$t('menu.permissionsTips')" /> | |||
|       </el-form-item> | |||
|       <!-- 路由 --> | |||
|       <el-form-item v-if="dataForm.type === 0" prop="url" :label="$t('menu.url')"> | |||
|         <el-input v-model="dataForm.url" :placeholder="$t('menu.url')" /> | |||
|       </el-form-item> | |||
|       <!-- 图标 --> | |||
|       <el-form-item v-if="dataForm.type === 0" prop="icon" :label="$t('menu.icon')" class="icon-list"> | |||
|         <el-popover ref="iconListPopover" v-model="iconListVisible" placement="bottom-start" trigger="click" popper-class="mod-sys__menu-icon-popover"> | |||
|           <div class="mod-sys__menu-icon-inner"> | |||
|             <div class="mod-sys__menu-icon-list"> | |||
|               <el-button | |||
|                 v-for="(item, index) in iconList" | |||
|                 :key="index" | |||
|                 :class="{ 'is-active': dataForm.icon === item }" | |||
|                 @click="iconListCurrentChangeHandle(item)" | |||
|               > | |||
|                 <svg class="icon-svg" aria-hidden="true"><use :xlink:href="`#${item}`" /></svg> | |||
|               </el-button> | |||
|             </div> | |||
|           </div> | |||
|         </el-popover> | |||
|         <el-input v-model="dataForm.icon" v-popover:iconListPopover :readonly="true" :placeholder="$t('menu.icon')" /> | |||
|       </el-form-item> | |||
|     </el-form> | |||
|     <template slot="footer"> | |||
|       <el-button @click="visible = false">{{ $t('cancel') }}</el-button> | |||
|       <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button> | |||
|     </template> | |||
|   </el-dialog> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import debounce from 'lodash/debounce' | |||
| import { getIconList } from '@/utils' | |||
| export default { | |||
|   data() { | |||
|     return { | |||
|       visible: false, | |||
|       menuList: [], | |||
|       menuListVisible: false, | |||
|       iconList: [], | |||
|       iconListVisible: false, | |||
|       dataForm: { | |||
|         id: '', | |||
|         menuType: 0, | |||
|         type: 0, | |||
|         name: '', | |||
|         pid: '0', | |||
|         parentName: '', | |||
|         url: '', | |||
|         permissions: '', | |||
|         sort: 0, | |||
|         icon: '' | |||
|       } | |||
|     } | |||
|   }, | |||
|   computed: { | |||
|     dataRule() { | |||
|       return { | |||
|         name: [ | |||
|           { required: true, message: this.$t('validate.required'), trigger: 'blur' } | |||
|         ], | |||
|         parentName: [ | |||
|           { required: true, message: this.$t('validate.required'), trigger: 'change' } | |||
|         ] | |||
|       } | |||
|     } | |||
|   }, | |||
|   watch: { | |||
|     'dataForm.type'(val) { | |||
|       this.$refs['dataForm'].clearValidate() | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     init() { | |||
|       this.visible = true | |||
|       this.$nextTick(() => { | |||
|         this.$refs['dataForm'].resetFields() | |||
|         this.iconList = getIconList() | |||
|         this.dataForm.parentName = this.$t('menu.parentNameDefault') | |||
|         this.getMenuList().then(() => { | |||
|           if (this.dataForm.id) { | |||
|             this.getInfo() | |||
|           } | |||
|         }) | |||
|       }) | |||
|     }, | |||
|     // 获取菜单列表 | |||
|     getMenuList() { | |||
|       return this.$http.get('/sys/menu/getMenuList?menuType=0&withButton=2').then(({ data: res }) => { | |||
|         if (res.code !== 0) { | |||
|           return this.$message.error(res.msg) | |||
|         } | |||
|         this.menuList = res.data | |||
|       }).catch(() => {}) | |||
|     }, | |||
|     // 获取信息 | |||
|     getInfo() { | |||
|       this.$http.get(`/sys/menu/${this.dataForm.id}`).then(({ data: res }) => { | |||
|         if (res.code !== 0) { | |||
|           return this.$message.error(res.msg) | |||
|         } | |||
|         this.dataForm = { | |||
|           ...this.dataForm, | |||
|           ...res.data | |||
|         } | |||
|         if (this.dataForm.pid === '0') { | |||
|           return this.deptListTreeSetDefaultHandle() | |||
|         } | |||
|         this.$refs.menuListTree.setCurrentKey(this.dataForm.pid) | |||
|       }).catch(() => {}) | |||
|     }, | |||
|     // 上级菜单树, 设置默认值 | |||
|     deptListTreeSetDefaultHandle() { | |||
|       this.dataForm.pid = '0' | |||
|       this.dataForm.parentName = this.$t('menu.parentNameDefault') | |||
|     }, | |||
|     // 上级菜单树, 选中 | |||
|     menuListTreeCurrentChangeHandle(data) { | |||
|       this.dataForm.pid = data.id | |||
|       this.dataForm.parentName = data.name | |||
|       this.menuListVisible = false | |||
|     }, | |||
|     // 图标, 选中 | |||
|     iconListCurrentChangeHandle(icon) { | |||
|       this.dataForm.icon = icon | |||
|       this.iconListVisible = false | |||
|     }, | |||
|     // 表单提交 | |||
|     dataFormSubmitHandle: debounce(function() { | |||
|       this.$refs['dataForm'].validate((valid) => { | |||
|         if (!valid) { | |||
|           return false | |||
|         } | |||
|         this.$http[!this.dataForm.id ? 'post' : 'put']('/sys/menu', this.dataForm).then(({ data: res }) => { | |||
|           if (res.code !== 0) { | |||
|             return this.$message.error(res.msg) | |||
|           } | |||
|           this.$message({ | |||
|             message: this.$t('prompt.success'), | |||
|             type: 'success', | |||
|             duration: 500, | |||
|             onClose: () => { | |||
|               this.visible = false | |||
|               this.$emit('refreshDataList') | |||
|             } | |||
|           }) | |||
|         }).catch(() => {}) | |||
|       }) | |||
|     }, 1000, { 'leading': true, 'trailing': false }) | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss"> | |||
| .mod-sys__menu { | |||
|   .menu-list, | |||
|   .icon-list { | |||
|     .el-input__inner, | |||
|     .el-input__suffix { | |||
|       cursor: pointer; | |||
|     } | |||
|   } | |||
|   &-icon-popover { | |||
|     width: 458px; | |||
|     overflow: hidden; | |||
|   } | |||
|   &-icon-inner { | |||
|     width: 478px; | |||
|     max-height: 258px; | |||
|     overflow-x: hidden; | |||
|     overflow-y: auto; | |||
|   } | |||
|   &-icon-list { | |||
|     width: 458px; | |||
|     padding: 0; | |||
|     margin: -8px 0 0 -8px; | |||
|     > .el-button { | |||
|       padding: 8px; | |||
|       margin: 8px 0 0 8px; | |||
|       > span { | |||
|         display: inline-block; | |||
|         vertical-align: middle; | |||
|         width: 18px; | |||
|         height: 18px; | |||
|         font-size: 18px; | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| </style> | |||
| @ -1,70 +0,0 @@ | |||
| <template> | |||
|   <!-- 系统菜单 --> | |||
|   <el-card shadow="never" class="aui-card--fill"> | |||
|     <div class="mod-sys__menu"> | |||
|       <el-form :inline="true" :model="dataForm" @submit.native.prevent @keyup.enter.native="getDataList()"> | |||
|         <el-form-item> | |||
|           <el-button v-if="$hasPermission('sys:menu:save')" type="primary" @click="addOrUpdateHandle()">{{ $t('add') }}</el-button> | |||
|         </el-form-item> | |||
|       </el-form> | |||
|       <el-table | |||
|         v-loading="dataListLoading" | |||
|         :data="dataList" | |||
|         row-key="id" | |||
|         border | |||
|         style="width: 100%;" | |||
|       > | |||
|         <el-table-column prop="name" :label="$t('menu.name')" header-align="center" min-width="150" /> | |||
|         <el-table-column prop="icon" :label="$t('menu.icon')" header-align="center" align="center" width="100"> | |||
|           <template slot-scope="scope"> | |||
|             <!-- <svg class="icon-svg" aria-hidden="true"><use :xlink:href="`#${scope.row.icon}`" /></svg> --> | |||
|             <svg-icon :icon-class="`${scope.row.icon}`" /> | |||
|           </template> | |||
|         </el-table-column> | |||
|         <el-table-column prop="type" :label="$t('menu.type')" header-align="center" align="center" width="100"> | |||
|           <template slot-scope="scope"> | |||
|             <el-tag v-if="scope.row.type === 0" size="small">{{ $t('menu.type0') }}</el-tag> | |||
|             <el-tag v-else size="small" type="info">{{ $t('menu.type1') }}</el-tag> | |||
|           </template> | |||
|         </el-table-column> | |||
|         <el-table-column prop="sort" :label="$t('menu.sort')" header-align="center" align="center" width="100" /> | |||
|         <el-table-column prop="url" :label="$t('menu.url')" header-align="center" align="center" min-width="150" :show-overflow-tooltip="true" /> | |||
|         <el-table-column prop="permissions" :label="$t('menu.permissions')" header-align="center" align="left" min-width="250" :show-overflow-tooltip="true" /> | |||
|         <el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="150"> | |||
|           <template slot-scope="scope"> | |||
|             <el-button v-if="$hasPermission('sys:menu:update')" type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">{{ $t('update') }}</el-button> | |||
|             <el-button v-if="$hasPermission('sys:menu:delete')" type="text" size="small" style="color:red" @click="deleteHandle(scope.row.id)">{{ $t('delete') }}</el-button> | |||
|           </template> | |||
|         </el-table-column> | |||
|       </el-table> | |||
|       <!-- 弹窗, 新增 / 修改 --> | |||
|       <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList" /> | |||
|     </div> | |||
|   </el-card> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import mixinViewModule from '@/mixins/view-module' | |||
| import AddOrUpdate from './menu-dept-add-or-update' | |||
| export default { | |||
|   components: { | |||
|     AddOrUpdate | |||
|   }, | |||
| 
 | |||
|   mixins: [mixinViewModule], | |||
|   data() { | |||
|     return { | |||
|       mixinViewModuleOptions: { | |||
|         getDataListURL: '/sys/menu/getMenuList?menuType=0', | |||
|         deleteURL: '/sys/menu' | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| <style scoped> | |||
| .svg-icon { | |||
|   width: 1.5em; | |||
|   height: 1.5em; | |||
| } | |||
| </style> | |||
| @ -1,237 +0,0 @@ | |||
| <template> | |||
|   <el-dialog :visible.sync="visible" :title="!dataForm.id ? $t('add') : $t('update')" :close-on-click-modal="false" :close-on-press-escape="false"> | |||
|     <el-form | |||
|       ref="dataForm" | |||
|       :model="dataForm" | |||
|       :rules="dataRule" | |||
|       label-width="auto" | |||
|       @submit.native.prevent | |||
|       @keyup.enter.native="dataFormSubmitHandle()" | |||
|     > | |||
|       <!-- 类型 --> | |||
|       <el-form-item prop="type" :label="$t('menu.type')"> | |||
|         <el-radio-group v-model="dataForm.type" :disabled="!!dataForm.id"> | |||
|           <el-radio-button :label="0">{{ $t('menu.type0') }}</el-radio-button> | |||
|           <el-radio-button :label="1">{{ $t('menu.type1') }}</el-radio-button> | |||
|         </el-radio-group> | |||
|       </el-form-item> | |||
|       <!-- 名称 --> | |||
|       <el-form-item prop="name" :label="$t('menu.name')"> | |||
|         <el-input v-model="dataForm.name" :placeholder="$t('menu.name')" /> | |||
|       </el-form-item> | |||
|       <!-- 上级菜单 --> | |||
|       <el-form-item prop="parentName" :label="$t('menu.parentName')" class="menu-list"> | |||
|         <el-popover ref="menuListPopover" v-model="menuListVisible" placement="bottom-start" trigger="click"> | |||
|           <el-tree | |||
|             ref="menuListTree" | |||
|             :data="menuList" | |||
|             :props="{ label: 'name', children: 'children' }" | |||
|             node-key="id" | |||
|             :highlight-current="true" | |||
|             :expand-on-click-node="false" | |||
|             accordion | |||
|             @current-change="menuListTreeCurrentChangeHandle" | |||
|           /> | |||
|         </el-popover> | |||
|         <el-input v-model="dataForm.parentName" v-popover:menuListPopover :readonly="true" :placeholder="$t('menu.parentName')"> | |||
|           <i v-if="dataForm.pid !== '0'" slot="suffix" class="el-icon-circle-close el-input__icon" @click.stop="deptListTreeSetDefaultHandle()" /> | |||
|         </el-input> | |||
|       </el-form-item> | |||
|       <!-- 排序 --> | |||
|       <el-form-item prop="sort" :label="$t('menu.sort')"> | |||
|         <el-input-number v-model="dataForm.sort" controls-position="right" :min="0" :label="$t('menu.sort')" /> | |||
|       </el-form-item> | |||
|       <!-- 授权标识 --> | |||
|       <el-form-item prop="permissions" :label="$t('menu.permissions')"> | |||
|         <el-input v-model="dataForm.permissions" :placeholder="$t('menu.permissionsTips')" /> | |||
|       </el-form-item> | |||
|       <!-- 路由 --> | |||
|       <el-form-item v-if="dataForm.type === 0" prop="url" :label="$t('menu.url')"> | |||
|         <el-input v-model="dataForm.url" :placeholder="$t('menu.url')" /> | |||
|       </el-form-item> | |||
|       <!-- 图标 --> | |||
|       <el-form-item v-if="dataForm.type === 0" prop="icon" :label="$t('menu.icon')" class="icon-list"> | |||
|         <el-popover ref="iconListPopover" v-model="iconListVisible" placement="bottom-start" trigger="click" popper-class="mod-sys__menu-icon-popover"> | |||
|           <div class="mod-sys__menu-icon-inner"> | |||
|             <div class="mod-sys__menu-icon-list"> | |||
|               <el-button | |||
|                 v-for="(item, index) in iconList" | |||
|                 :key="index" | |||
|                 :class="{ 'is-active': dataForm.icon === item }" | |||
|                 @click="iconListCurrentChangeHandle(item)" | |||
|               > | |||
|                 <svg class="icon-svg" aria-hidden="true"><use :xlink:href="`#${item}`" /></svg> | |||
|               </el-button> | |||
|             </div> | |||
|           </div> | |||
|         </el-popover> | |||
|         <el-input v-model="dataForm.icon" v-popover:iconListPopover :readonly="true" :placeholder="$t('menu.icon')" /> | |||
|       </el-form-item> | |||
|     </el-form> | |||
|     <template slot="footer"> | |||
|       <el-button @click="visible = false">{{ $t('cancel') }}</el-button> | |||
|       <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button> | |||
|     </template> | |||
|   </el-dialog> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import debounce from 'lodash/debounce' | |||
| import { getIconList } from '@/utils' | |||
| export default { | |||
|   data() { | |||
|     return { | |||
|       visible: false, | |||
|       menuList: [], | |||
|       menuListVisible: false, | |||
|       iconList: [], | |||
|       iconListVisible: false, | |||
|       dataForm: { | |||
|         id: '', | |||
|         menuType: 1, // 菜单类型 0:中心 1:课题 | |||
|         type: 0, | |||
|         name: '', | |||
|         pid: '0', | |||
|         parentName: '', | |||
|         url: '', | |||
|         permissions: '', | |||
|         sort: 0, | |||
|         icon: '' | |||
|       } | |||
|     } | |||
|   }, | |||
|   computed: { | |||
|     dataRule() { | |||
|       return { | |||
|         name: [ | |||
|           { required: true, message: this.$t('validate.required'), trigger: 'blur' } | |||
|         ], | |||
|         parentName: [ | |||
|           { required: true, message: this.$t('validate.required'), trigger: 'change' } | |||
|         ] | |||
|       } | |||
|     } | |||
|   }, | |||
|   watch: { | |||
|     'dataForm.type'(val) { | |||
|       this.$refs['dataForm'].clearValidate() | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     init() { | |||
|       this.visible = true | |||
|       this.$nextTick(() => { | |||
|         this.$refs['dataForm'].resetFields() | |||
|         this.iconList = getIconList() | |||
|         this.dataForm.parentName = this.$t('menu.parentNameDefault') | |||
|         this.getMenuList().then(() => { | |||
|           if (this.dataForm.id) { | |||
|             this.getInfo() | |||
|           } | |||
|         }) | |||
|       }) | |||
|     }, | |||
|     // 获取菜单列表 | |||
|     getMenuList() { | |||
|       return this.$http.get('/sys/menu/getMenuList?menuType=1&withButton=2').then(({ data: res }) => { | |||
|         if (res.code !== 0) { | |||
|           return this.$message.error(res.msg) | |||
|         } | |||
|         this.menuList = res.data | |||
|       }).catch(() => {}) | |||
|     }, | |||
|     // 获取信息 | |||
|     getInfo() { | |||
|       this.$http.get(`/sys/menu/${this.dataForm.id}`).then(({ data: res }) => { | |||
|         if (res.code !== 0) { | |||
|           return this.$message.error(res.msg) | |||
|         } | |||
|         this.dataForm = { | |||
|           ...this.dataForm, | |||
|           ...res.data | |||
|         } | |||
|         if (this.dataForm.pid === '0') { | |||
|           return this.deptListTreeSetDefaultHandle() | |||
|         } | |||
|         this.$refs.menuListTree.setCurrentKey(this.dataForm.pid) | |||
|       }).catch(() => {}) | |||
|     }, | |||
|     // 上级菜单树, 设置默认值 | |||
|     deptListTreeSetDefaultHandle() { | |||
|       this.dataForm.pid = '0' | |||
|       this.dataForm.parentName = this.$t('menu.parentNameDefault') | |||
|     }, | |||
|     // 上级菜单树, 选中 | |||
|     menuListTreeCurrentChangeHandle(data) { | |||
|       this.dataForm.pid = data.id | |||
|       this.dataForm.parentName = data.name | |||
|       this.menuListVisible = false | |||
|     }, | |||
|     // 图标, 选中 | |||
|     iconListCurrentChangeHandle(icon) { | |||
|       this.dataForm.icon = icon | |||
|       this.iconListVisible = false | |||
|     }, | |||
|     // 表单提交 | |||
|     dataFormSubmitHandle: debounce(function() { | |||
|       this.$refs['dataForm'].validate((valid) => { | |||
|         if (!valid) { | |||
|           return false | |||
|         } | |||
|         this.$http[!this.dataForm.id ? 'post' : 'put']('/sys/menu', this.dataForm).then(({ data: res }) => { | |||
|           if (res.code !== 0) { | |||
|             return this.$message.error(res.msg) | |||
|           } | |||
|           this.$message({ | |||
|             message: this.$t('prompt.success'), | |||
|             type: 'success', | |||
|             duration: 500, | |||
|             onClose: () => { | |||
|               this.visible = false | |||
|               this.$emit('refreshDataList') | |||
|             } | |||
|           }) | |||
|         }).catch(() => {}) | |||
|       }) | |||
|     }, 1000, { 'leading': true, 'trailing': false }) | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss"> | |||
| .mod-sys__menu { | |||
|   .menu-list, | |||
|   .icon-list { | |||
|     .el-input__inner, | |||
|     .el-input__suffix { | |||
|       cursor: pointer; | |||
|     } | |||
|   } | |||
|   &-icon-popover { | |||
|     width: 458px; | |||
|     overflow: hidden; | |||
|   } | |||
|   &-icon-inner { | |||
|     width: 478px; | |||
|     max-height: 258px; | |||
|     overflow-x: hidden; | |||
|     overflow-y: auto; | |||
|   } | |||
|   &-icon-list { | |||
|     width: 458px; | |||
|     padding: 0; | |||
|     margin: -8px 0 0 -8px; | |||
|     > .el-button { | |||
|       padding: 8px; | |||
|       margin: 8px 0 0 8px; | |||
|       > span { | |||
|         display: inline-block; | |||
|         vertical-align: middle; | |||
|         width: 18px; | |||
|         height: 18px; | |||
|         font-size: 18px; | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| </style> | |||
| @ -1,69 +0,0 @@ | |||
| <template> | |||
|   <!-- 项目(课题)菜单 --> | |||
|   <el-card shadow="never" class="aui-card--fill"> | |||
|     <div class="mod-sys__menu"> | |||
|       <el-form :inline="true" :model="dataForm" @submit.native.prevent @keyup.enter.native="getDataList()"> | |||
|         <el-form-item> | |||
|           <el-button v-if="$hasPermission('sys:menu:save')" type="primary" @click="addOrUpdateHandle()">{{ $t('add') }}</el-button> | |||
|         </el-form-item> | |||
|       </el-form> | |||
|       <el-table | |||
|         v-loading="dataListLoading" | |||
|         :data="dataList" | |||
|         row-key="id" | |||
|         border | |||
|         style="width: 100%;" | |||
|       > | |||
|         <el-table-column prop="name" :label="$t('menu.name')" header-align="center" min-width="150" /> | |||
|         <el-table-column prop="icon" :label="$t('menu.icon')" header-align="center" align="center" width="100"> | |||
|           <template slot-scope="scope"> | |||
|             <svg-icon :icon-class="`${scope.row.icon}`" /> | |||
|           </template> | |||
|         </el-table-column> | |||
|         <el-table-column prop="type" :label="$t('menu.type')" header-align="center" align="center" width="100"> | |||
|           <template slot-scope="scope"> | |||
|             <el-tag v-if="scope.row.type === 0" size="small">{{ $t('menu.type0') }}</el-tag> | |||
|             <el-tag v-else size="small" type="info">{{ $t('menu.type1') }}</el-tag> | |||
|           </template> | |||
|         </el-table-column> | |||
|         <el-table-column prop="sort" :label="$t('menu.sort')" header-align="center" align="center" width="100" /> | |||
|         <el-table-column prop="url" :label="$t('menu.url')" header-align="center" align="center" min-width="150" :show-overflow-tooltip="true" /> | |||
|         <el-table-column prop="permissions" :label="$t('menu.permissions')" header-align="center" align="left" min-width="250" :show-overflow-tooltip="true" /> | |||
|         <el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="150"> | |||
|           <template slot-scope="scope"> | |||
|             <el-button v-if="$hasPermission('sys:menu:update')" type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">{{ $t('update') }}</el-button> | |||
|             <el-button v-if="$hasPermission('sys:menu:delete')" type="text" size="small" style="color:red" @click="deleteHandle(scope.row.id)">{{ $t('delete') }}</el-button> | |||
|           </template> | |||
|         </el-table-column> | |||
|       </el-table> | |||
|       <!-- 弹窗, 新增 / 修改 --> | |||
|       <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList" /> | |||
|     </div> | |||
|   </el-card> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import mixinViewModule from '@/mixins/view-module' | |||
| import AddOrUpdate from './menu-project-add-or-update' | |||
| export default { | |||
|   components: { | |||
|     AddOrUpdate | |||
|   }, | |||
| 
 | |||
|   mixins: [mixinViewModule], | |||
|   data() { | |||
|     return { | |||
|       mixinViewModuleOptions: { | |||
|         getDataListURL: '/sys/menu/getMenuList?menuType=1', | |||
|         deleteURL: '/sys/menu' | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| <style scoped> | |||
| .svg-icon { | |||
|   width: 1.5em; | |||
|   height: 1.5em; | |||
| } | |||
| </style> | |||
| @ -1,168 +0,0 @@ | |||
| <template> | |||
|   <el-dialog :visible.sync="visible" :title="!dataForm.id ? $t('add') : $t('update')" :close-on-click-modal="false" :close-on-press-escape="false"> | |||
|     <el-form | |||
|       ref="dataForm" | |||
|       :model="dataForm" | |||
|       :rules="dataRule" | |||
|       label-width="auto" | |||
|       @submit.native.prevent | |||
|       @keyup.enter.native="dataFormSubmitHandle()" | |||
|     > | |||
|       <!-- 角色类型 --> | |||
|       <el-form-item prop="roleType" :label="$t('role.type')"> | |||
|         <el-radio-group v-model="dataForm.roleType" style="margin-bottom: 30px;" @change="radioChangeHandle()"> | |||
|           <el-radio-button label="1">系统角色</el-radio-button> | |||
|           <el-radio-button label="2">课题角色</el-radio-button> | |||
|         </el-radio-group> | |||
|       </el-form-item> | |||
|       <el-form-item prop="name" :label="$t('role.name')"> | |||
|         <el-input v-model="dataForm.name" :placeholder="$t('role.name')" /> | |||
|       </el-form-item> | |||
|       <el-form-item prop="remark" :label="$t('role.remark')"> | |||
|         <el-input v-model="dataForm.remark" :placeholder="$t('role.remark')" /> | |||
|       </el-form-item> | |||
|       <el-form-item prop="menuList" :label="$t('role.menuList')"> | |||
|         <el-tree | |||
|           ref="menuListTree" | |||
|           :data="menuList" | |||
|           :props="{ label: 'name', children: 'children' }" | |||
|           node-key="id" | |||
|           accordion | |||
|           show-checkbox | |||
|         /> | |||
|       </el-form-item> | |||
|     </el-form> | |||
|     <template slot="footer"> | |||
|       <el-button @click="visible = false">{{ $t('cancel') }}</el-button> | |||
|       <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button> | |||
|     </template> | |||
|   </el-dialog> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import debounce from 'lodash/debounce' | |||
| // 角色类型=>菜单类型 | |||
| const typeMap = { | |||
|   // 系统角色1 =》部门菜单0 | |||
|   1: 0, | |||
|   // 课题角色2 =》课题菜单1 | |||
|   2: 1 | |||
| } | |||
| 
 | |||
| export default { | |||
|   data() { | |||
|     return { | |||
|       visible: false, | |||
|       menuList: [], | |||
|       // deptList: [], | |||
|       tempMenuIdList: [], | |||
|       dataForm: { | |||
|         id: '', | |||
|         name: '', | |||
|         menuIdList: [], | |||
|         deptId: '', | |||
|         // deptIdList: [], | |||
|         remark: '', | |||
|         roleType: 1 | |||
|       } | |||
|     } | |||
|   }, | |||
|   computed: { | |||
|     dataRule() { | |||
|       var validateTree = (rule, value, callback) => { | |||
|         if (this.$refs.menuListTree.getCheckedKeys().length === 0) { return callback(new Error('请勾选菜单授权项')) } | |||
|         callback() | |||
|       } | |||
|       return { | |||
|         name: [ | |||
|           { required: true, message: this.$t('validate.required'), trigger: 'blur' } | |||
|         ], | |||
|         menuList: [ | |||
|           { required: true, validator: validateTree, trigger: 'change' } | |||
|         ] | |||
|       } | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     init() { | |||
|       this.visible = true | |||
|       this.$nextTick(() => { | |||
|         this.$refs.dataForm.resetFields() | |||
|         this.$refs.menuListTree.setCheckedKeys([]) | |||
|         this.dataForm.roleType = this.dataForm.params.roleType || 1 | |||
| 
 | |||
|         Promise.all([ | |||
|           this.getMenuList() | |||
|           // ,this.getDeptList() | |||
|         ]).then(() => { | |||
|           if (this.dataForm.id) { | |||
|             this.getInfo() | |||
|           } | |||
|         }) | |||
|       }) | |||
|     }, | |||
|     // 获取菜单列表 | |||
|     getMenuList() { | |||
|       return this.$http.get(`/sys/menu/select?menuType=${typeMap[this.dataForm.roleType]}`).then(({ data: res }) => { | |||
|         if (res.code !== 0) { | |||
|           return this.$message.error(res.msg) | |||
|         } | |||
|         this.menuList = res.data | |||
|       }).catch(() => {}) | |||
|     }, | |||
|     async radioChangeHandle() { | |||
|       await this.getMenuList() | |||
|       this.dataForm.menuIdList.forEach(item => this.$refs.menuListTree.setChecked(item, true)) | |||
|     }, | |||
|     // // 获取部门列表 | |||
|     // getDeptList() { | |||
|     //   return this.$http.get('/sys/dept/list').then(({ data: res }) => { | |||
|     //     if (res.code !== 0) { | |||
|     //       return this.$message.error(res.msg) | |||
|     //     } | |||
|     //     this.deptList = res.data | |||
|     //   }).catch(() => {}) | |||
|     // }, | |||
|     // 获取信息 | |||
|     getInfo() { | |||
|       this.$http.get(`/sys/role/${this.dataForm.id}`).then(({ data: res }) => { | |||
|         if (res.code !== 0) { | |||
|           return this.$message.error(res.msg) | |||
|         } | |||
|         this.dataForm = { | |||
|           ...this.dataForm, | |||
|           ...res.data | |||
|         } | |||
|         this.dataForm.menuIdList.forEach(item => this.$refs.menuListTree.setChecked(item, true)) | |||
|       }).catch(() => {}) | |||
|     }, | |||
|     // 表单提交 | |||
|     dataFormSubmitHandle: debounce(function() { | |||
|       this.$refs.dataForm.validate((valid) => { | |||
|         if (!valid) { | |||
|           return false | |||
|         } | |||
|         this.dataForm.menuIdList = [ | |||
|           ...this.$refs.menuListTree.getHalfCheckedKeys(), | |||
|           ...this.$refs.menuListTree.getCheckedKeys() | |||
|         ] | |||
|         this.dataForm.deptId = this.$store.state.user.deptId // 默认本中心部门的id | |||
|         this.$http[!this.dataForm.id ? 'post' : 'put']('/sys/role', this.dataForm).then(({ data: res }) => { | |||
|           if (res.code !== 0) { | |||
|             return this.$message.error(res.msg) | |||
|           } | |||
|           this.$message({ | |||
|             message: this.$t('prompt.success'), | |||
|             type: 'success', | |||
|             duration: 500, | |||
|             onClose: () => { | |||
|               this.visible = false | |||
|               this.$emit('refreshDataList') | |||
|             } | |||
|           }) | |||
|         }).catch(() => {}) | |||
|       }) | |||
|     }, 1000, { leading: true, trailing: false }) | |||
|   } | |||
| } | |||
| </script> | |||
| @ -1,109 +0,0 @@ | |||
| <template> | |||
|   <!-- 角色管理 --> | |||
|   <el-card shadow="never" class="aui-card--fill"> | |||
|     <div class="mod-sys__role"> | |||
|       <el-form :inline="true" :model="dataForm" @submit.native.prevent @keyup.enter.native="getDataList()"> | |||
|         <el-form-item> | |||
|           <el-input v-model="dataForm.name" :placeholder="$t('role.name')" clearable /> | |||
|         </el-form-item> | |||
|         <el-form-item> | |||
|           <el-button @click="getDataList()">{{ $t('query') }}</el-button> | |||
|         </el-form-item> | |||
|         <el-form-item> | |||
|           <el-button v-if="$hasPermission('sys:role:save')" type="primary" @click="addOrUpdateHandle()">{{ $t('add') }}</el-button> | |||
|         </el-form-item> | |||
|         <el-form-item> | |||
|           <el-button v-if="$hasPermission('sys:role:delete')" type="danger" @click="deleteHandle()">{{ $t('deleteBatch') }}</el-button> | |||
|         </el-form-item> | |||
|       </el-form> | |||
|       <el-table | |||
|         v-loading="dataListLoading" | |||
|         :data="dataList" | |||
|         border | |||
|         style="width: 100%;" | |||
|         @selection-change="dataListSelectionChangeHandle" | |||
|         @sort-change="dataListSortChangeHandle" | |||
|       > | |||
|         <el-table-column type="selection" header-align="center" align="center" width="50" :selectable="selectable" /> | |||
|         <el-table-column prop="name" :label="$t('role.name')" header-align="center" align="center" /> | |||
|         <el-table-column prop="remark" :label="$t('role.remark')" header-align="center" align="center" /> | |||
| 
 | |||
|         <el-table-column prop="roleType" :label="$t('role.type')" sortable="custom" header-align="center" align="center" width="200"> | |||
|           <template slot-scope="scope"> | |||
|             <!-- 系统角色 --> | |||
|             <el-tag v-if="scope.row.roleType === 1" size="small" type="primary">系统角色</el-tag> | |||
|             <!-- 课题角色 --> | |||
|             <el-tag v-else size="small" type="success">课题角色</el-tag> | |||
|           </template> | |||
|         </el-table-column> | |||
|         <el-table-column prop="createDate" :label="$t('role.createDate')" sortable="custom" header-align="center" align="center" width="180" /> | |||
| 
 | |||
|         <el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="150"> | |||
|           <template v-if="opPermission_systemRole(scope.row.isSystemRole)" slot-scope="scope"> | |||
|             <el-button | |||
|               v-if="$hasPermission('sys:role:update')" | |||
|               type="text" | |||
|               size="small" | |||
|               @click="addOrUpdateHandle(scope.row.id,...scope.row)" | |||
|             >{{ $t('update') }}</el-button> | |||
|             <el-button | |||
|               v-if="$hasPermission('sys:role:delete')" | |||
|               type="text" | |||
|               size="small" | |||
|               style="color:red" | |||
|               @click="deleteHandle(scope.row.id)" | |||
|             >{{ $t('delete') }}</el-button> | |||
|           </template> | |||
|         </el-table-column> | |||
|       </el-table> | |||
|       <el-pagination | |||
|         :current-page="page" | |||
|         :page-sizes="[10, 20, 50, 100]" | |||
|         :page-size="limit" | |||
|         :total="total" | |||
|         layout="total, sizes, prev, pager, next, jumper" | |||
|         @size-change="pageSizeChangeHandle" | |||
|         @current-change="pageCurrentChangeHandle" | |||
|       /> | |||
|       <!-- 弹窗, 新增 / 修改 --> | |||
|       <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList" /> | |||
|     </div> | |||
|   </el-card> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import mixinViewModule from '@/mixins/view-module' | |||
| import AddOrUpdate from './role-add-or-update' | |||
| export default { | |||
|   components: { | |||
|     AddOrUpdate | |||
|   }, | |||
|   mixins: [mixinViewModule], | |||
|   data() { | |||
|     return { | |||
|       mixinViewModuleOptions: { | |||
|         getDataListURL: '/sys/role/page', | |||
|         getDataListIsPage: true, | |||
|         deleteURL: '/sys/role', | |||
|         deleteIsBatch: true | |||
|       }, | |||
|       dataForm: { | |||
|         name: '' | |||
|       }, | |||
|       order: 'asc', | |||
|       orderField: 'role_type' | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     opPermission_systemRole(isSystemRole) { | |||
|       if (isSystemRole === 1) { | |||
|         return this.$store.state.user.superAdmin === 1 | |||
|       } | |||
|       return true | |||
|     }, | |||
|     selectable(row, index) { | |||
|       return this.opPermission_systemRole(row.isSystemRole) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| @ -1,229 +0,0 @@ | |||
| <template> | |||
|   <el-dialog :visible.sync="visible" :title="!dataForm.id ? $t('add') : $t('update')" :close-on-click-modal="false" :close-on-press-escape="false" :top="'3vh'"> | |||
|     <el-form | |||
|       ref="dataForm" | |||
|       :model="dataForm" | |||
|       :rules="dataRule" | |||
|       label-width="auto" | |||
|       @submit.native.prevent | |||
|       @keyup.enter.native="dataFormSubmitHandle()" | |||
|     > | |||
|       <!-- 用户名 --> | |||
|       <el-form-item prop="username" :label="$t('user.username')"> | |||
|         <el-input v-model="dataForm.username" :placeholder="$t('user.username')" /> | |||
|       </el-form-item> | |||
|       <!-- 所属机构 --> | |||
|       <el-form-item prop="deptId" :label="$t('user.deptName')"> | |||
|         <dept-select v-model="dataForm.deptId" :placeholder="$t('dept.title')" /> | |||
|       </el-form-item> | |||
|       <!-- 密码 --> | |||
|       <el-form-item prop="password" :label="$t('user.password')" :class="{ 'is-required': !dataForm.id }"> | |||
|         <el-input v-model="dataForm.password" type="password" :placeholder="$t('user.password')" /> | |||
|       </el-form-item> | |||
|       <el-form-item prop="confirmPassword" :label="$t('user.confirmPassword')" :class="{ 'is-required': !dataForm.id }"> | |||
|         <el-input v-model="dataForm.confirmPassword" type="password" :placeholder="$t('user.confirmPassword')" /> | |||
|       </el-form-item> | |||
|       <!-- 工号 --> | |||
|       <el-form-item prop="jobNumber" :label="'工号'"> | |||
|         <el-input v-model="dataForm.jobNumber" :placeholder="'工号'" /> | |||
|       </el-form-item> | |||
|       <!-- 真实姓名 --> | |||
|       <el-form-item prop="realName" :label="$t('user.realName')"> | |||
|         <el-input v-model="dataForm.realName" :placeholder="$t('user.realName')" /> | |||
|       </el-form-item> | |||
|       <!-- 性别 --> | |||
|       <el-form-item prop="gender" :label="$t('user.gender')"> | |||
|         <ren-radio-group v-model="dataForm.gender" dict-type="gender" /> | |||
|       </el-form-item> | |||
|       <!-- 手机号 --> | |||
|       <el-form-item prop="mobile" :label="$t('user.mobile')"> | |||
|         <el-input v-model="dataForm.mobile" :placeholder="$t('user.mobile')" /> | |||
|       </el-form-item> | |||
|       <!-- 配置角色 --> | |||
|       <el-form-item prop="" :label="'配置角色'" class="role-list"> | |||
|         <el-select v-model="dataForm.sysRoleId" :placeholder="$t('user.roleIdList')"> | |||
|           <el-option v-for="role in roleList" :key="role.id" :label="role.name" :value="role.id" /> | |||
|         </el-select> | |||
|       </el-form-item> | |||
|       <!-- 状态 --> | |||
|       <el-form-item prop="status" :label="$t('user.status')" size="mini"> | |||
|         <el-radio-group v-model="dataForm.status"> | |||
|           <el-radio :label="0">{{ $t('user.status0') }}</el-radio> | |||
|           <el-radio :label="1">{{ $t('user.status1') }}</el-radio> | |||
|         </el-radio-group> | |||
|       </el-form-item> | |||
|     </el-form> | |||
|     <template slot="footer"> | |||
|       <el-button @click="visible = false">{{ $t('cancel') }}</el-button> | |||
|       <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button> | |||
|     </template> | |||
|   </el-dialog> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import debounce from 'lodash/debounce' | |||
| import { isMobile } from '@/utils/validate' | |||
| import deptSelect from '@/components/dept-select' | |||
| export default { | |||
|   components: { deptSelect }, | |||
|   data() { | |||
|     return { | |||
|       visible: false, | |||
|       roleList: [], | |||
|       roleIdListDefault: [], | |||
|       dataForm: { | |||
|         id: '', | |||
|         username: '', | |||
|         jobNumber: '', | |||
|         deptId: '', | |||
|         deptName: '', | |||
|         password: '', | |||
|         confirmPassword: '', | |||
|         realName: '', | |||
|         gender: 0, | |||
|         email: '', | |||
|         mobile: '', | |||
|         sysRoleId: null, | |||
|         roleIdList: [], | |||
|         status: 1 | |||
|       } | |||
|     } | |||
|   }, | |||
|   computed: { | |||
|     dataRule() { | |||
|       var validatePassword = (rule, value, callback) => { | |||
|         if (!this.dataForm.id && !/\S/.test(value)) { | |||
|           return callback(new Error(this.$t('validate.required'))) | |||
|         } | |||
|         callback() | |||
|       } | |||
|       var validateConfirmPassword = (rule, value, callback) => { | |||
|         if (!this.dataForm.id && !/\S/.test(value)) { | |||
|           return callback(new Error(this.$t('validate.required'))) | |||
|         } | |||
|         if (this.dataForm.password !== value) { | |||
|           return callback(new Error(this.$t('user.validate.confirmPassword'))) | |||
|         } | |||
|         callback() | |||
|       } | |||
|       var validateMobile = (rule, value, callback) => { | |||
|         if (value && !isMobile(value)) { | |||
|           return callback(new Error(this.$t('validate.format', { attr: this.$t('user.mobile') }))) | |||
|         } | |||
|         callback() | |||
|       } | |||
|       return { | |||
|         username: [ | |||
|           { required: true, message: this.$t('validate.required'), trigger: 'blur' } | |||
|         ], | |||
|         jobNumber: [ | |||
|           { required: true, message: this.$t('validate.required'), trigger: 'blur' } | |||
|         ], | |||
|         deptId: [ | |||
|           { required: true, message: this.$t('validate.required'), trigger: 'change' } | |||
|         ], | |||
|         password: [ | |||
|           { validator: validatePassword, trigger: 'blur' } | |||
|         ], | |||
|         confirmPassword: [ | |||
|           { validator: validateConfirmPassword, trigger: 'blur' } | |||
|         ], | |||
|         realName: [ | |||
|           { required: true, message: this.$t('validate.required'), trigger: 'blur' } | |||
|         ], | |||
|         mobile: [ | |||
|           { required: true, validator: validateMobile, trigger: 'blur' } | |||
|         ] | |||
|       } | |||
|     } | |||
|   }, | |||
|   watch: { | |||
|     'dataForm.deptId': { | |||
|       handler(newValue, oldValue) { | |||
|         if (newValue) { | |||
|           this.getRoleList() | |||
|         } else { | |||
|           this.roleList = [] | |||
|           this.roleIdListDefault = [] | |||
|         } | |||
|       }, | |||
|       deep: true | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     init() { | |||
|       this.visible = true | |||
|       // this.dataForm.deptId = this.$store.state.user.deptId | |||
|       this.$nextTick(() => { | |||
|         this.$refs.dataForm.resetFields() | |||
|         this.roleIdListDefault = [] | |||
|         if (this.dataForm.deptId) { | |||
|           this.getRoleList() | |||
|         } | |||
|         if (this.dataForm.id) { | |||
|           this.getInfo() | |||
|         } | |||
|       }) | |||
|     }, | |||
|     // 获取角色列表 | |||
|     getRoleList() { | |||
|       this.$http.get(`/sys/role/getSysRoleListForSaveUser`, { params: { deptId: this.dataForm.deptId }}).then(({ data: res }) => { | |||
|         this.roleList = res.data | |||
|       }) | |||
|     }, | |||
|     // 获取信息 | |||
|     getInfo() { | |||
|       this.$http.get(`/sys/user/${this.dataForm.id}`).then(({ data: res }) => { | |||
|         this.dataForm = { | |||
|           ...this.dataForm, | |||
|           ...res.data | |||
|           // roleIdList: [] | |||
|         } | |||
|         // // 角色配置, 区分是否为默认角色 | |||
|         // for (var i = 0; i < res.data.roleIdList.length; i++) { | |||
|         //   if (this.roleList.filter(item => item.id === res.data.roleIdList[i])[0]) { | |||
|         //     this.dataForm.roleIdList.push(res.data.roleIdList[i]) | |||
|         //     continue | |||
|         //   } | |||
|         //   this.roleIdListDefault.push(res.data.roleIdList[i]) | |||
|         // } | |||
|       }) | |||
|     }, | |||
|     // 表单提交 | |||
|     dataFormSubmitHandle: debounce(function() { | |||
|       this.$refs.dataForm.validate((valid) => { | |||
|         if (!valid) { | |||
|           return false | |||
|         } | |||
|         this.$http[!this.dataForm.id ? 'post' : 'put']('/sys/user', { | |||
|           ...this.dataForm | |||
|           // roleIdList: [ | |||
|           //   ...this.dataForm.roleIdList, | |||
|           //   ...this.roleIdListDefault | |||
|           // ] | |||
|         }).then(({ data: res }) => { | |||
|           this.$message({ | |||
|             message: this.$t('prompt.success'), | |||
|             type: 'success', | |||
|             duration: 500, | |||
|             onClose: () => { | |||
|               this.visible = false | |||
|               this.$emit('refreshDataList') | |||
|             } | |||
|           }) | |||
|         }) | |||
|       }) | |||
|     }, 1000, { leading: true, trailing: false }) | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss"> | |||
| .mod-sys__user { | |||
|   .role-list { | |||
|     .el-select { | |||
|       width: 100%; | |||
|     } | |||
|   } | |||
| } | |||
| </style> | |||
| @ -1,153 +0,0 @@ | |||
| <template> | |||
|   <el-card shadow="never" class="aui-card--fill"> | |||
|     <div class="mod-sys__user"> | |||
|       <el-form | |||
|         :inline="true" | |||
|         :model="dataForm" | |||
|         @submit.native.prevent | |||
|         @keyup.enter.native="getDataList()" | |||
|       > | |||
|         <!-- 用户名 --> | |||
|         <el-form-item> | |||
|           <el-input v-model="dataForm.username" :placeholder="'用户名、姓名'" clearable /> | |||
|         </el-form-item> | |||
|         <!-- 性别 --> | |||
|         <!-- <el-form-item> | |||
|           <ren-select v-model="dataForm.gender" dict-type="gender" :placeholder="$t('user.gender')" /> | |||
|         </el-form-item> --> | |||
|         <el-form-item> | |||
|           <el-button @click="getDataList()">{{ $t('query') }}</el-button> | |||
|         </el-form-item> | |||
|         <el-form-item> | |||
|           <el-button v-if="$hasPermission('sys:user:save')" type="primary" @click="addOrUpdateHandle()">{{ $t('add') }}</el-button> | |||
|         </el-form-item> | |||
|         <el-form-item> | |||
|           <el-button v-if="$hasPermission('sys:user:delete')" type="danger" @click="deleteHandle()">{{ $t('deleteBatch') }}</el-button> | |||
|         </el-form-item> | |||
|         <!-- <el-form-item> | |||
|           <el-button v-if="$hasPermission('sys:user:export')" type="info" @click="exportHandle()">{{ $t('export') }}</el-button> | |||
|         </el-form-item> --> | |||
|       </el-form> | |||
|       <el-table | |||
|         v-loading="dataListLoading" | |||
|         :data="dataList" | |||
|         border | |||
|         style="width: 100%;" | |||
|         @selection-change="dataListSelectionChangeHandle" | |||
|         @sort-change="dataListSortChangeHandle" | |||
|       > | |||
|         <el-table-column type="selection" header-align="center" align="center" width="50" :selectable="selectable" /> | |||
|         <!-- 用户名 --> | |||
|         <el-table-column prop="username" :label="$t('user.username')" sortable="custom" header-align="center" align="center" /> | |||
|         <!-- 用户名 --> | |||
|         <el-table-column prop="roleName" :label="'系统角色'" header-align="center" align="center" /> | |||
|         <!-- 所属机构 --> | |||
|         <!-- <el-table-column prop="deptName" :label="'所属机构'" header-align="center" align="center" /> --> | |||
|         <!-- 姓名 --> | |||
|         <el-table-column prop="realName" :label="'姓名'" header-align="center" align="center" /> | |||
|         <!-- 性别 --> | |||
|         <el-table-column prop="gender" :label="$t('user.gender')" sortable="custom" header-align="center" align="center" width="80"> | |||
|           <template slot-scope="scope"> | |||
|             {{ $getDictLabel("gender", scope.row.gender) }} | |||
|           </template> | |||
|         </el-table-column> | |||
|         <!-- 手机号 --> | |||
|         <!-- <el-table-column prop="mobile" :label="$t('user.mobile')" sortable="custom" header-align="center" align="center" /> --> | |||
|         <!-- 状态 --> | |||
|         <el-table-column prop="status" :label="$t('user.status')" sortable="custom" header-align="center" align="center" width="80"> | |||
|           <template slot-scope="scope"> | |||
|             <el-tag v-if="scope.row.status === 0" size="small" type="danger">{{ $t('user.status0') }}</el-tag> | |||
|             <el-tag v-else size="small" type="success">{{ $t('user.status1') }}</el-tag> | |||
|           </template> | |||
|         </el-table-column> | |||
|         <!-- 创建时间 --> | |||
|         <el-table-column prop="createDate" :label="$t('user.createDate')" sortable="custom" header-align="center" align="center" /> | |||
|         <!-- 参与课题 --> | |||
|         <el-table-column prop="projectList" :label="'参与课题'" header-align="center" align="center" :show-overflow-tooltip="true"> | |||
|           <template slot-scope="scope"> | |||
|             {{ scope.row.projectList|filterList }} | |||
|           </template> | |||
|         </el-table-column> | |||
|         <!-- 操作 --> | |||
|         <el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="150"> | |||
|           <template slot-scope="scope"> | |||
|             <el-button | |||
|               v-if="$hasPermission('sys:user:update') && opPermission(scope.row.systemAdmin)" | |||
|               type="text" | |||
|               size="small" | |||
|               @click="addOrUpdateHandle(scope.row.id)" | |||
|             >{{ $t('update') }}</el-button> | |||
|             <el-button | |||
|               v-if="$hasPermission('sys:user:delete') && opPermission(scope.row.systemAdmin)" | |||
|               type="text" | |||
|               size="small" | |||
|               style="color:red" | |||
|               @click="deleteHandle(scope.row.id)" | |||
|             >{{ $t('delete') }}</el-button> | |||
|           </template> | |||
|         </el-table-column> | |||
|       </el-table> | |||
|       <el-pagination | |||
|         :current-page="page" | |||
|         :page-sizes="[10, 20, 50, 100]" | |||
|         :page-size="limit" | |||
|         :total="total" | |||
|         layout="total, sizes, prev, pager, next, jumper" | |||
|         @size-change="pageSizeChangeHandle" | |||
|         @current-change="pageCurrentChangeHandle" | |||
|       /> | |||
|       <!-- 弹窗, 新增 / 修改 --> | |||
|       <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList" /> | |||
|     </div> | |||
|   </el-card> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import mixinViewModule from '@/mixins/view-module' | |||
| import AddOrUpdate from './user-add-or-update' | |||
| export default { | |||
|   components: { | |||
|     AddOrUpdate | |||
|   }, | |||
|   filters: { | |||
|     filterList(arr) { | |||
|       const result = [] | |||
|       arr.forEach(item => { | |||
|         result.push(item.name) | |||
|       }) | |||
|       return result.join(',') | |||
|     } | |||
|   }, | |||
|   mixins: [mixinViewModule], | |||
|   data() { | |||
|     return { | |||
|       mixinViewModuleOptions: { | |||
|         getDataListURL: '/sys/user/page', | |||
|         getDataListIsPage: true, | |||
|         deleteURL: '/sys/user', | |||
|         deleteIsBatch: true | |||
|         // exportURL: '/sys/user/export' | |||
|       }, | |||
|       dataForm: { | |||
|         username: '' | |||
|         // deptId: '', | |||
|         // gender: '' | |||
|       } | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     opPermission(isSystemAdmin) { | |||
|       if (this.$store.state.user.superAdmin === 1) { | |||
|         return isSystemAdmin > 0 | |||
|       } | |||
|       if (this.$store.state.user.systemAdmin === 1) { | |||
|         return isSystemAdmin === 0 | |||
|       } | |||
|       return true | |||
|     }, | |||
|     selectable(row, index) { | |||
|       return this.opPermission(row.systemAdmin) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| @ -1,81 +0,0 @@ | |||
| <template> | |||
|   <div class="sms-template"> | |||
|     <!-- 模板列表 --> | |||
|     <head-template head-left="模板列表"> | |||
|       <el-button type="primary" size="small" icon="el-icon-plus">新增</el-button> | |||
|     </head-template> | |||
|     <!-- 模板内容 --> | |||
|     <el-table ref="multipleTable" :data="dataList" tooltip-effect="dark" style="width: 100%">> | |||
|       <el-table-column type="index" width="50" label="NO" header-align="center" align="center" /> | |||
|       <el-table-column label="简称" header-align="center" align="center"> | |||
|         <template slot-scope="scope"> | |||
|           <span>{{ scope.row.abbreviation }}</span> | |||
|           <span v-if="scope.row.flag=='1'" class="defaultButton">默认</span> | |||
|         </template> | |||
|       </el-table-column> | |||
|       <el-table-column prop="content" label="内容" header-align="center" align="center" /> | |||
|       <el-table-column prop="operation" label="操作" header-align="center" align="center"> | |||
|         <template slot-scope="scope"> | |||
|           <span style="color: #1890ff; padding-right: 8px" class="details">修改</span> | |||
|           <span style="color: #ff4d4f" class="delete">删除</span> | |||
|           <el-dropdown trigger="click"> | |||
|             <i class="el-icon-more" /> | |||
|             <el-dropdown-menu slot="dropdown"> | |||
|               <el-dropdown-item>设置为默认</el-dropdown-item> | |||
|               <el-dropdown-item>更新所有</el-dropdown-item> | |||
|             </el-dropdown-menu> | |||
|           </el-dropdown> | |||
| 
 | |||
|         </template> | |||
|       </el-table-column> | |||
|     </el-table> | |||
|     <el-pagination background layout="prev, pager, next" :total="total" @current-change="pageCurrentChangeHandle" /> | |||
|   </div> | |||
| </template> | |||
| <script> | |||
| import headTemplate from '@/components/head' | |||
| export default { | |||
|   components: { | |||
|     headTemplate | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       total: 0, | |||
|       dataList: [{ | |||
|         abbreviation: '青光眼', | |||
|         content: '测试数据', | |||
|         flag: '1' | |||
|       }] | |||
|     } | |||
|   }, | |||
|   created() { | |||
|   }, | |||
|   methods: { | |||
|     // 分页, 当前页 | |||
|     pageCurrentChangeHandle(val) { | |||
|       this.currentPage = val | |||
|       this.getDataList() | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .sms-template { | |||
|   .defaultButton { | |||
|     display: inline-block; | |||
|     border: 1px solid #1E79FF; | |||
|     color: #1E79FF; | |||
|     font-size: 12px; | |||
|     padding: 0 10px; | |||
|     border-radius: 16px; | |||
|     margin-left: 10px; | |||
|   } | |||
|   .details, | |||
|   .delete { | |||
|     cursor: pointer; | |||
|   } | |||
|   .el-icon-more { | |||
|       margin-left: 6px; | |||
|   } | |||
| } | |||
| </style> | |||
| @ -1,187 +0,0 @@ | |||
| <template> | |||
|   <el-dialog | |||
|     class="alert-setting" | |||
|     :visible.sync="visible" | |||
|     width="30%" | |||
|     :title="dataForm.id ? '修改预警条件':'新增预警条件'" | |||
|   > | |||
|     <el-form ref="dataForm" :model="dataForm" :rules="dataRule"> | |||
|       <el-form-item label="指标名称:" label-width="100px" prop="name"> | |||
|         <el-select v-model="dataForm.name " placeholder="请选择指标名称" clearable> | |||
|           <el-option v-for="(item,index) in targetNameList " :key="index" :value="item.name" :label="item.name" @click.native="selectOptionHandle(item)" /> | |||
|         </el-select> | |||
|       </el-form-item> | |||
|       <!-- flag=1,较上次上升/下降,flag=0,值大于/小于 --> | |||
|       <template v-if="ISFlag"> | |||
|         <el-form-item label="值大于:" prop="greaterThan" label-width="100px"> | |||
|           <el-input v-model="dataForm.greaterThan" placeholder="请填写值" /> | |||
|           <span class="company">{{ dataForm.targetUnit }}</span> | |||
|         </el-form-item> | |||
|         <el-form-item label="值小于:" label-width="100px" prop="lessThan"> | |||
|           <el-input v-model="dataForm.lessThan" placeholder="请填写值" /> | |||
|           <span class="company">{{ dataForm.targetUnit }}</span> | |||
|         </el-form-item> | |||
|       </template> | |||
|       <template v-else> | |||
|         <el-form-item label="较上次下降:" label-width="100px" prop="lowerThan"> | |||
|           <el-input v-model="dataForm.lowerThan" placeholder="请填写值" /> | |||
|         </el-form-item> | |||
|         <el-form-item label="较上次上升:" label-width="100px" prop="upThan"> | |||
|           <el-input v-model="dataForm.upThan" up="请填写值" /> | |||
|         </el-form-item> | |||
|       </template> | |||
|       <el-form-item label="启用" label-width="90px"> | |||
|         <el-switch v-model="dataForm.status" :active-value="1" :inactive-value="0" /> | |||
|       </el-form-item> | |||
|     </el-form> | |||
|     <template slot="footer"> | |||
|       <el-button @click="visible = false">{{ $t('cancel') }}</el-button> | |||
|       <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button> | |||
|     </template> | |||
|   </el-dialog> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import debounce from 'lodash/debounce' | |||
| export default { | |||
|   props: { | |||
|     targetNameList: { | |||
|       type: Array, | |||
|       default: () => [] | |||
|     } | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       visible: false, | |||
|       dataForm: { | |||
|         greaterThan: '', // 值大于 | |||
|         lessThan: '', // 值小于 | |||
|         id: '', | |||
|         status: 1, // 1:开启 0:关闭 | |||
|         lowerThan: '', // 较上次下降 | |||
|         upThan: '', // 较上次上升 | |||
|         name: '', // 指标名称 | |||
|         targetUnit: '' // 指标单位 | |||
|       }, | |||
|       ISFlag: true // 大于小于为true | |||
|     } | |||
|   }, | |||
|   computed: { | |||
|     dataRule() { | |||
|       return { | |||
|         name: [ | |||
|           { required: true, message: '请选择指标名称', trigger: 'change' } | |||
|         ] | |||
|       } | |||
|     } | |||
|   }, | |||
|   created() { | |||
|   }, | |||
|   methods: { | |||
|     // 选择指标发生变化时 | |||
|     selectOptionHandle(item) { | |||
|       // flag=1,较上次上升/下降,flag=0,值大于/小于 | |||
|       this.ISFlag = item.flag === 0 | |||
|       this.dataForm.targetUnit = item.targetUnit | |||
|     }, | |||
|     // 状态切换 | |||
|     // switchHandle(e) { | |||
|     //   // 1:开启 0:关闭 | |||
|     //   console.log(e) | |||
|     //   this.dataForm.status = e ? 1 : 0 | |||
|     // }, | |||
|     // 初始化 | |||
|     init() { | |||
|       this.visible = true | |||
|       this.$nextTick(() => { | |||
|         this.$refs.dataForm.resetFields() // 重置表单 | |||
|         if (this.dataForm.id) { | |||
|           this.getInfo() | |||
|         } | |||
|       }) | |||
|     }, | |||
|     // 获取信息 | |||
|     getInfo() { | |||
|       this.$http.get(`/yzk/target/${this.dataForm.id}`).then(({ data: res }) => { | |||
|         if (res.code !== 0) { | |||
|           return this.$message.error(res.msg) | |||
|         } | |||
|         this.dataForm = { | |||
|           ...this.dataForm, | |||
|           ...res.data | |||
|         } | |||
|         this.ISFlag = res.data.flag === 0 | |||
|       }).catch(() => { }) | |||
|     }, | |||
|     // 表单提交 | |||
|     dataFormSubmitHandle: debounce(function() { | |||
|       console.log(this.dataForm) | |||
|       this.$refs.dataForm.validate((valid) => { | |||
|         if (!valid) { | |||
|           return false | |||
|         } | |||
|         if (this.ISFlag && !this.dataForm.greaterThan && !this.dataForm.lessThan) { | |||
|           return this.$message.error('值必须填写一个') | |||
|         } else if (!this.ISFlag) { | |||
|           if (!this.dataForm.lowerThan && !this.dataForm.upThan) { | |||
|             return this.$message.error('值必须填写一个') | |||
|           } else if (this.dataForm.lowerThan && this.dataForm.upThan) { | |||
|             return this.$message.error('值只能填写一个') | |||
|           } | |||
|         } | |||
|         this.$http[!this.dataForm.id ? 'post' : 'put']('/yzk/target', this.dataForm).then(({ data: res }) => { | |||
|           if (res.code !== 0) { | |||
|             return this.$message.error(res.msg) | |||
|           } | |||
|           this.$message({ | |||
|             message: this.$t('prompt.success'), | |||
|             type: 'success', | |||
|             duration: 500, | |||
|             onClose: () => { | |||
|               this.visible = false | |||
|               this.$emit('refreshDataList') | |||
|             } | |||
|           }) | |||
|         }).catch(() => {}) | |||
|       }) | |||
|     }, 1000, { leading: true, trailing: false }) | |||
|   } | |||
| } | |||
| </script> | |||
| <style lang="scss"> | |||
| .alert-setting { | |||
|   .company { | |||
|     display: inline-block; | |||
|     width: 60px; | |||
|     padding-left: 5px; | |||
|   } | |||
|   .el-form-item__content { | |||
|     display: flex; | |||
|   } | |||
|   .el-dialog__header { | |||
|     margin-bottom:12px | |||
|   } | |||
|     .el-dialog__body { | |||
|         padding-right: 30px; | |||
|     } | |||
|     .formItemOne .el-form-item__content { | |||
|       display: flex; | |||
|     } | |||
|     .el-date-editor.el-input, .el-date-editor.el-input__inner{ | |||
|       width: 100%; | |||
|     } | |||
|     .el-select{ | |||
|       display: block; | |||
|       width: 100%; | |||
|       padding-right: 50px; | |||
|     } | |||
|     .el-input-number { | |||
|       display: block; | |||
|       width: 100%; | |||
|     } | |||
|     .el-switch { | |||
|       line-height: 40px; | |||
|       display: block; | |||
|     } | |||
| } | |||
| </style> | |||
| @ -1,100 +0,0 @@ | |||
| <template> | |||
|   <div class="sms-template"> | |||
|     <!-- 模板列表 --> | |||
|     <head-template head-left="预警设置"> | |||
|       <el-button type="primary" size="small" icon="el-icon-plus" @click="addOrUpdateHandle()">新增</el-button> | |||
|     </head-template> | |||
|     <!-- 模板内容 --> | |||
|     <el-table ref="multipleTable" :data="dataList" tooltip-effect="dark" style="width: 100%">> | |||
|       <el-table-column label="状态"> | |||
|         <template slot-scope="scope"> | |||
|           <!-- 1:开启 0:关闭 --> | |||
|           <el-switch :value="scope.row.status == 1 ? true : false" @change="switchHandle(scope.row,$event)" /> | |||
|         </template> | |||
|       </el-table-column> | |||
|       <el-table-column label="指标名称"> | |||
|         <template slot-scope="scope"> | |||
|           <span>{{ scope.row.name }}</span> | |||
|         </template> | |||
|       </el-table-column> | |||
|       <el-table-column prop="content" label="条件" /> | |||
|       <el-table-column prop="operation" label="操作"> | |||
|         <template slot-scope="scope"> | |||
|           <span style="color: #1890ff; padding-right: 8px" class="details" @click="addOrUpdateHandle(scope.row.id,'')">修改</span> | |||
|           <span style="color: #ff4d4f" class="delete" @click="deleteHandle(scope.row.id)">删除</span> | |||
|         </template> | |||
|       </el-table-column> | |||
|     </el-table> | |||
|     <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" :target-name-list="targetNameList" @refreshDataList="getDataList" /> | |||
|     <!-- <el-pagination background layout="prev, pager, next" :total="total" @current-change="pageCurrentChangeHandle" /> --> | |||
|   </div> | |||
| </template> | |||
| <script> | |||
| import headTemplate from '@/components/head' | |||
| import addOrUpdate from './add-or-update.vue' | |||
| import mixinViewModule from '@/mixins/view-module' | |||
| export default { | |||
|   components: { | |||
|     headTemplate, | |||
|     addOrUpdate | |||
|   }, | |||
|   mixins: [mixinViewModule], | |||
|   data() { | |||
|     return { | |||
|       targetNameList: [], | |||
|       mixinViewModuleOptions: { | |||
|         getDataListURL: '/yzk/target/targetList', | |||
|         deleteURL: '/yzk/target' | |||
|       } | |||
|     } | |||
|   }, | |||
|   created() { | |||
|     this.getTargetName() | |||
|   }, | |||
|   methods: { | |||
|     // 获取指标名称 | |||
|     async getTargetName() { | |||
|       const { data: res } = await this.$http.get('/yzk/target/selectTarget') | |||
|       if (res.code === 0) { | |||
|         this.targetNameList = res.data | |||
|       } else { | |||
|         this.$message.error(res.msg) | |||
|       } | |||
|     }, | |||
|     // 修改预警状态 | |||
|     async switchHandle(scopeRow, e) { | |||
|       console.log(scopeRow, e) | |||
|       // 1:开启 0:关闭 | |||
|       const { data: res } = await this.$http.post('/yzk/target/switchStatus', { | |||
|         id: scopeRow.id, | |||
|         status: e === false ? 0 : 1 | |||
|       }) | |||
|       if (res.code === 0) { | |||
|         this.getDataList() | |||
|       } else { | |||
|         this.$message.error(res.msg) | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .sms-template { | |||
|   .defaultButton { | |||
|     display: inline-block; | |||
|     border: 1px solid #1E79FF; | |||
|     color: #1E79FF; | |||
|     font-size: 12px; | |||
|     padding: 0 10px; | |||
|     border-radius: 16px; | |||
|     margin-left: 10px; | |||
|   } | |||
|   .details, | |||
|   .delete { | |||
|     cursor: pointer; | |||
|   } | |||
|   .el-icon-more { | |||
|       margin-left: 6px; | |||
|   } | |||
| } | |||
| </style> | |||
| @ -1,174 +0,0 @@ | |||
| <template> | |||
|   <div class="crf-add-dialog"> | |||
|     <el-dialog | |||
|       width="90%" | |||
|       top="2vh" | |||
|       :visible.sync="visible" | |||
|       :title="dataForm.title||(!dataForm.id ? $t('add') : $t('update'))" | |||
|       :close-on-click-modal="false" | |||
|       :close-on-press-escape="false" | |||
|       @close="closeDialog" | |||
|     > | |||
|       <el-form | |||
|         ref="dataForm" | |||
|         :model="dataForm" | |||
|         :rules="dataRule" | |||
|         label-width="auto" | |||
|         @keyup.enter.native="initBaseInfo()" | |||
|       > | |||
|         <el-form-item prop="type" :label="'CRF类型'"> | |||
|           <el-radio-group v-model="dataForm.type" size="small"> | |||
|             <el-radio-button label="门诊" /> | |||
|             <el-radio-button label="手术" /> | |||
|             <el-radio-button label="随访" /> | |||
|             <el-radio-button label="其他" /> | |||
|           </el-radio-group> | |||
|         </el-form-item> | |||
|         <el-form-item prop="name" :label="'名称'"> | |||
|           <el-input | |||
|             v-model="dataForm.name" | |||
|             :placeholder="'请填写表单名称'" | |||
|             size="small" | |||
|           /> | |||
|         </el-form-item> | |||
|         <el-form-item prop="content" :label="'表单'" style="margin-top:20px;"> | |||
| <!--          <crf-editor ref="crf" v-model="dataForm.content" :height="height" :is-p="true" />--> | |||
|         </el-form-item> | |||
|         <el-form-item prop="description" :label="'描述'"> | |||
|           <el-input | |||
|             v-model="dataForm.description" | |||
|             type="textarea" | |||
|             :rows="1" | |||
|             :placeholder="'相关描述'" | |||
|             size="small" | |||
|           /> | |||
|         </el-form-item> | |||
|       </el-form> | |||
|       <template slot="footer"> | |||
|         <el-button size="small" @click="visible = false">{{ $t('cancel') }}</el-button> | |||
|         <el-button type="primary" size="small" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button> | |||
|         <!-- <el-button type="primary" @click="exportContent">引入</el-button> --> | |||
|       </template> | |||
|     </el-dialog> | |||
|   </div> | |||
| 
 | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import debounce from 'lodash/debounce' | |||
| // import crfEditor from '@/components/hm-crf' | |||
| const Base64 = require('js-base64').Base64 | |||
| 
 | |||
| export default { | |||
|   // components: { crfEditor }, | |||
|   props: { | |||
|     systemInfo: { | |||
|       type: Object, | |||
|       default: () => { | |||
|         return {} | |||
|       } | |||
|     } | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       visible: false, | |||
|       height: 'calc(100vh - 300px)', | |||
|       dataForm: { | |||
|         id: '', | |||
|         type: '门诊', | |||
|         name: '', | |||
|         description: '', | |||
|         content: '' | |||
|       } | |||
|     } | |||
|   }, | |||
|   computed: { | |||
|     dataRule() { | |||
|       var validate_content = (rule, value, callback) => { | |||
|         if (this.dataForm.content === '') { | |||
|           return callback(new Error('请设计表单内容')) | |||
|         } | |||
|         callback() | |||
|       } | |||
|       return { | |||
|         type: [ | |||
|           { required: true, message: '请选择CRF类型', trigger: 'change' } | |||
|         ], | |||
|         name: [ | |||
|           { required: true, message: this.$t('validate.required'), trigger: 'blur' } | |||
|         ], | |||
|         content: [ | |||
|           { required: true, validator: validate_content, trigger: 'change' } | |||
|         ] | |||
|       } | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     init() { | |||
|       this.visible = true | |||
|       this.$nextTick(() => { | |||
|         this.$refs.dataForm.resetFields() | |||
|         if (this.dataForm.id) { | |||
|           this.getInfo() | |||
|         } else { | |||
|           this.dataForm = { ...this.dataForm } | |||
|         } | |||
|       }) | |||
|     }, | |||
|     // 获取信息 | |||
|     getInfo() { | |||
|       this.$http.get(`/crf/template/${this.dataForm.id}`).then(({ data: res }) => { | |||
|         if (res.code !== 0) { | |||
|           return this.$message.error(res.msg) | |||
|         } | |||
|         if (res.data) { | |||
|           this.dataForm.name = res.data.name | |||
|           this.dataForm.type = res.data.type | |||
|           this.dataForm.content = Base64.decode(res.data.content) | |||
|           this.dataForm.description = res.data.description | |||
|           this.$refs['crf'].renderContent() | |||
|         } | |||
|       }).catch(() => {}) | |||
|     }, | |||
|     // 引入内容 | |||
|     exportContent() { | |||
|       // 在编辑器中获取填充方法 | |||
|       // console.log(document.querySelector('#myEditor_ifr').contentWindow) | |||
|       this.$refs.crf.fullContent('右眼<input id="youyan" class="hminput border-1" style="width: 120px; height: 18px; text-align: center;" title="" autocomplete="off" name="youyan" type="text" placeholder="" data-hm_id="youyan" data-hm_type="text" data-hm_required="false" data-hm_bd_id="DAT1_VA.OD_VAN" data-hm_bd_eye_type="" />左眼<input id="zuoyan" class="hminput border-1 " style="width: 120px; height: 18px; text-align: center;" title="" autocomplete="off" name="zuoyan" type="text" placeholder="" data-hm_id="zuoyan" data-hm_type="text" data-hm_required="false" data-hm_bd_id="DAT1_VA.OS_VAN" data-hm_bd_eye_type="" />') | |||
|     }, | |||
|     // 表单提交 | |||
|     dataFormSubmitHandle: debounce(function() { | |||
|       this.$refs.dataForm.validate((valid) => { | |||
|         if (!valid) { | |||
|           return false | |||
|         } | |||
|         this.$http[!this.dataForm.id ? 'post' : 'put']('/crf/template', { ...this.dataForm, content: Base64.encode(this.dataForm.content) }).then(({ data: res }) => { | |||
|           if (res.code !== 0) { | |||
|             return this.$message.error(res.msg) | |||
|           } | |||
|           this.$message({ | |||
|             message: this.$t('prompt.success'), | |||
|             type: 'success', | |||
|             duration: 500, | |||
|             onClose: () => { | |||
|               this.visible = false | |||
|               this.$emit('refreshDataList') | |||
|             } | |||
|           }) | |||
|         }).catch(() => {}) | |||
|       }) | |||
|     }, 1000, { leading: true, trailing: false }), | |||
|     closeDialog() { | |||
|       this.$emit('closeDialog') | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss"> | |||
| .crf-add-dialog { | |||
|   .el-form-item { | |||
|     margin-bottom:8px | |||
|   } | |||
| } | |||
| </style> | |||
| @ -1,105 +0,0 @@ | |||
| <template> | |||
|   <div class="mod-sys__dept"> | |||
|     <head-template head-left="表单管理"> | |||
|       <el-button type="primary" size="small" icon="el-icon-plus" @click="addOrUpdateHandle(null,null,'新增表单')">新增 | |||
|       </el-button> | |||
|     </head-template> | |||
|     <el-table v-loading="dataListLoading" :data="dataList" row-key="id" style="width: 100%;" :height="tableHeight"> | |||
| 
 | |||
|       <!-- 名称 --> | |||
|       <el-table-column prop="name" :label="'表单名称'" /> | |||
|       <!-- crf类型 --> | |||
|       <el-table-column prop="type" :label="'表单类型'" /> | |||
|       <!-- 描述 --> | |||
|       <el-table-column prop="description" :label="'描述'" /> | |||
|       <!-- 操作 --> | |||
|       <el-table-column prop="operation" :label="$t('handle')"> | |||
|         <template slot-scope="scope"> | |||
|           <!-- <el-button type="text" size="small" @click="testClick1(scope.row.id,scope.row)">测试1</el-button> | |||
|           <el-button type="text" size="small" @click="testClick2(scope.row.id,scope.row)">测试2</el-button> --> | |||
|           <el-button type="text" size="small" @click="preview(scope.row.id,scope.row)">预览</el-button> | |||
|           <el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.id,scope.row)">编辑</el-button> | |||
|           <el-button type="text" size="small" style="color:red" @click="deleteHandle([scope.row.id])">删除</el-button> | |||
|         </template> | |||
|       </el-table-column> | |||
|     </el-table> | |||
|     <!-- 添加分页组件 --> | |||
|     <el-pagination background layout="prev, pager, next" :total="total" @current-change="pageCurrentChangeHandle" /> | |||
| 
 | |||
|     <!-- 弹窗, 新增 / 修改 --> | |||
|     <add-or-update | |||
|       v-if="addOrUpdateVisible" | |||
|       ref="addOrUpdate" | |||
|       @refreshDataList="getDataList" | |||
|       @closeDialog="addOrUpdateVisible=false" | |||
|     /> | |||
|     <!-- 弹窗, 预览 --> | |||
| <!--    <preview v-if="previewVisible" ref="preview" :body-style-show="true" />--> | |||
|     <!-- 填写测试 --> | |||
|     <!-- <test v-if="testVisible" ref="Test" :exam-name="test.name" :list="test.exams" /> --> | |||
|     <!-- 填写测试 --> | |||
|     <!-- <follow-up v-if="followUpVisible" ref="followUp" /> --> | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import mixinViewModule from '@/mixins/view-module' | |||
| import tableAutoHeight from '@/mixins/tableAutoHeight' | |||
| import AddOrUpdate from './add-or-update.vue' | |||
| // import Preview from '@/components/hm-crf/preview' | |||
| import headTemplate from '@/components/head' | |||
| // 测试 | |||
| // import test from '@/components/hm-crf/crf-data-test' | |||
| // import followUp from '@/components/hm-crf/followUp' | |||
| export default { | |||
|   components: { | |||
|     AddOrUpdate, | |||
|     // Preview, | |||
|     headTemplate | |||
|     // test, | |||
|     // followUp // 测试 | |||
|   }, | |||
|   mixins: [mixinViewModule, tableAutoHeight], | |||
|   data() { | |||
|     return { | |||
|       // testVisible: false, // 测试 | |||
|       // followUpVisible: false, // 测试 | |||
|       previewVisible: false, | |||
|       mixinViewModuleOptions: { | |||
|         getDataListURL: '/crf/template/page', | |||
|         getDataListIsPage: true, | |||
|         deleteURL: '/crf/template' | |||
|       }, | |||
|       dataForm: {}, | |||
|       systemInfo: {} | |||
|     } | |||
|   }, | |||
|   created() { | |||
|   }, | |||
|   methods: { | |||
|     preview(id, params, title) { | |||
|       console.log(123) | |||
|       this.previewVisible = true | |||
|       this.$nextTick(() => { | |||
|         this.$refs.preview.dataForm = { id, title, ...params } | |||
|         this.$refs.preview.init() | |||
|       }) | |||
|     }, | |||
|     testClick1(id, params, title) { | |||
|       this.testVisible = true | |||
|       this.$nextTick(() => { | |||
|         this.$refs.Test.init() | |||
|       }) | |||
|     }, | |||
|     testClick2(id, params, title) { | |||
|       console.log(params) | |||
|       this.followUpVisible = true | |||
|       this.$nextTick(() => { | |||
|         this.$refs.followUp.crfId = params.id | |||
|         this.$refs.followUp.patientIdNumber = '342826195112180617' | |||
|         this.$refs.followUp.init() | |||
|       }) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| @ -1,382 +0,0 @@ | |||
| <template> | |||
|   <div class="follow-management"> | |||
|     <!-- 弹框 --> | |||
|     <el-dialog | |||
|       :title="sureEditText=='修改' ? '修改随访方案':'新增随访方案'" | |||
|       :visible.sync="dialogFormVisible" | |||
|       width="60%" | |||
|       @close="closeDialog" | |||
|     > | |||
|       <el-form ref="followRuleForm" :model="form" :rules="rules"> | |||
|         <el-form-item label="名称:" label-width="120px" prop="name"> | |||
|           <el-input | |||
|             v-model="form.name" | |||
|             autocomplete="off" | |||
|             placeholder="请输入名称" | |||
|           /> | |||
|         </el-form-item> | |||
|         <el-form-item label="描述:" label-width="120px" prop="description"> | |||
|           <el-input | |||
|             v-model="form.description" | |||
|             type="textarea" | |||
|             placeholder="方案描述" | |||
|           /> | |||
|         </el-form-item> | |||
|         <el-form-item label="周期:" label-width="120px" class="cycle-display" prop="unit"> | |||
|           <el-input-number | |||
|             v-model="form.period" | |||
|             controls-position="right" | |||
|             :min="1" | |||
|             @change="handleChangeCycle" | |||
|           /> | |||
|           <el-checkbox-group v-model="form.unit" label-width="120px" :max="1"> | |||
|             <el-checkbox-button label="天" name="type" /> | |||
|             <el-checkbox-button label="周" name="type" /> | |||
|             <el-checkbox-button label="月" name="type" /> | |||
|           </el-checkbox-group> | |||
|         </el-form-item> | |||
|         <el-form-item | |||
|           label="短信提醒:" | |||
|           label-width="120px" | |||
|           class="sms-reminder" | |||
|         > | |||
|           <el-select v-model="form.smsPeriod" placeholder="请选择活动区域"> | |||
|             <el-option label="提前1天" value="1" /> | |||
|             <el-option label="提前2天" value="2" /> | |||
|           </el-select> | |||
|           <el-input | |||
|             v-model="form.smsMessage" | |||
|             type="textarea" | |||
|             label-width="120px" | |||
|           /> | |||
|         </el-form-item> | |||
|         <el-form-item label="设为默认:" label-width="120px"> | |||
|           <el-switch v-model="form.isDefault" /> | |||
|         </el-form-item> | |||
|       </el-form> | |||
|       <div slot="footer" class="dialog-footer"> | |||
|         <el-button @click="dialogFormVisible = false">取 消</el-button> | |||
|         <el-button type="primary" @click="sureEditFollowClick(sureEditText)">{{ sureEditText }}</el-button> | |||
|       </div> | |||
|     </el-dialog> | |||
|     <!-- 头部 --> | |||
|     <head-template head-left="随访方案列表"> | |||
|       <el-button type="primary" size="small" icon="el-icon-plus" @click="addFollowClick">新增方案</el-button> | |||
|     </head-template> | |||
|     <el-table | |||
|       ref="multipleTable" | |||
|       :data="followList" | |||
|       tooltip-effect="dark" | |||
|       style="width: 100%" | |||
|     > | |||
|       <el-table-column prop="name" label="随访方案" /> | |||
|       <el-table-column label="随访周期"> | |||
|         <template slot-scope="scope"> | |||
|           <span>{{ scope.row.period }}{{ scope.row.unit }}</span> | |||
|         </template> | |||
|       </el-table-column> | |||
|       <el-table-column prop="description" label="描述" /> | |||
|       <el-table-column label="提醒时间"> | |||
|         <template slot-scope="scope"> | |||
|           <span>提前{{ scope.row.smsPeriod }}天</span> | |||
|         </template> | |||
|       </el-table-column> | |||
|       <el-table-column prop="operation" label="操作"> | |||
|         <template slot-scope="scope"> | |||
|           <span | |||
|             style="color: #1890ff; padding-right: 8px" | |||
|             class="operation-details" | |||
|             @click="editClick(scope.row)" | |||
|           >编辑</span> | |||
|           <span | |||
|             style="color: #ff4d4f" | |||
|             class="operation-delete" | |||
|             @click="deleteClick(scope.row)" | |||
|           >删除</span> | |||
|         </template> | |||
|       </el-table-column> | |||
|     </el-table> | |||
|     <el-pagination | |||
|       background | |||
|       layout="prev, pager, next" | |||
|       :total="total" | |||
|       @current-change="currentChange" | |||
|       @prev-click="upPageClick" | |||
|       @next-click="nextPageClick" | |||
|     /> | |||
|   </div> | |||
| </template> | |||
| <script> | |||
| import dialogjs from '@/mixins/dialog' | |||
| import { confirm } from '@/utils/confirm' | |||
| import headTemplate from '@/components/head' | |||
| export default { | |||
|   inject: ['refresh'], | |||
|   components: { | |||
|     headTemplate | |||
|   }, | |||
|   mixins: [dialogjs], | |||
|   data() { | |||
|     return { | |||
|       inputSearchValue: '', | |||
|       projectId: '', | |||
|       followList: [], | |||
|       limit: 10, | |||
|       currentPage: 1, | |||
|       total: 0, | |||
|       searchTime: '', | |||
|       // 弹框表格 | |||
|       form: { | |||
|         name: '', | |||
|         // 方案描述 | |||
|         description: '', | |||
|         // 周期数 | |||
|         period: 1, | |||
|         // 周期单位 | |||
|         unit: [], | |||
|         // 提前几天 | |||
|         smsPeriod: '', | |||
|         // 短信 | |||
|         smsMessage: '', | |||
|         // 默认 0:否 1:是 | |||
|         isDefault: false | |||
|       }, | |||
|       rules: { | |||
|         name: [ | |||
|           { required: true, message: '请输入名称', trigger: 'blur' } | |||
|         ], | |||
|         description: [ | |||
|           { required: true, message: '请填写描述', trigger: 'blur' } | |||
|         ], | |||
|         unit: [ | |||
|           { type: 'array', required: true, message: '请选择周期单位', trigger: 'change' } | |||
|         ] | |||
| 
 | |||
|       }, | |||
|       sureEditText: '确定', | |||
|       currentId: '' | |||
|     } | |||
|   }, | |||
|   created() { | |||
|     this.projectId = window.SITE_CONFIG['projectId'] | |||
|     this.getFollowList() | |||
|   }, | |||
|   methods: { | |||
|     // 点击新增方案 | |||
|     addFollowClick() { | |||
|       this.sureEditText = '确定' | |||
|       this.dialogFormVisible = true | |||
|     }, | |||
|     // 新增/修改随访方案按钮 | |||
|     sureEditFollowClick(sureEditText) { | |||
|       this.$refs.followRuleForm.validate((valid) => { | |||
|         if (valid) { | |||
|           this.setAddEditFollow(sureEditText) | |||
|         } else { | |||
|           console.log('error submit!!') | |||
|           return false | |||
|         } | |||
|       }) | |||
|     }, | |||
|     // 调取后台接口新增/修改随访方案 | |||
|     async setAddEditFollow(sureEditText) { | |||
|       this.dialogFormVisible = true | |||
|       const { data: res } = await this.$http({ | |||
|         method: sureEditText === '确定' ? 'post' : 'put', | |||
|         url: '/visit', | |||
|         data: { | |||
|           name: this.form.name, | |||
|           description: this.form.description, | |||
|           period: this.form.period, | |||
|           unit: this.form.unit[0], | |||
|           smsPeriod: this.form.smsPeriod, | |||
|           smsMessage: this.form.smsMessage, | |||
|           isDefault: this.form.isDefault ? 1 : 0, | |||
|           projectId: this.projectId, | |||
|           id: this.currentId | |||
|         } | |||
|       }) | |||
|       if (res.code === 0) { | |||
|         this.$message({ | |||
|           type: 'success', | |||
|           message: sureEditText === '确定' ? '添加成功!' : '修改成功' | |||
|         }) | |||
|         this.dialogFormVisible = false | |||
|         this.formFormat() | |||
|         this.refresh() | |||
|         this.currentId = '' | |||
|       } else { | |||
|         this.$message.error(res.msg) | |||
|       } | |||
|     }, | |||
|     // 改变周期 | |||
|     handleChangeCycle() {}, | |||
|     // 获取随访列表 | |||
|     async getFollowList(e) { | |||
|       const { data: res } = await this.$http.get('/visit/page', { | |||
|         params: { | |||
|           limit: this.limit, | |||
|           page: this.currentPage, | |||
|           name: this.inputSearchValue, | |||
|           projectId: this.projectId | |||
|         } | |||
|       }) | |||
|       this.followList = res.data.list | |||
|       this.total = res.data.total | |||
|     }, | |||
|     // 移出 | |||
|     deleteClick(scopeRow) { | |||
|       confirm('').then(async() => { | |||
|         const { data: res } = await this.$http.delete('/visit', { | |||
|           params: { | |||
|             id: scopeRow.id | |||
|           } | |||
|         }) | |||
|         if (res.code === 0) { | |||
|           this.$message({ | |||
|             type: 'success', | |||
|             message: '删除成功!' | |||
|           }) | |||
|           this.refresh() | |||
|         } else { | |||
|           this.$message.error(res.msg) | |||
|         } | |||
|       }) | |||
|     }, | |||
|     // 编辑 | |||
|     editClick(scopeRow) { | |||
|       this.sureEditText = '修改' | |||
|       this.currentId = scopeRow.id | |||
|       this.getVisitInfo(scopeRow) | |||
|     }, | |||
|     // 获取随访详情 | |||
|     async getVisitInfo(scopeRow) { | |||
|       const { data: res } = await this.$http.get('/visit/getInfo', { | |||
|         params: { | |||
|           id: scopeRow.id | |||
|         } | |||
|       }) | |||
|       if (res.code === 0) { | |||
|         this.dialogFormVisible = true | |||
|         this.form = res.data | |||
|         this.form.isDefault === 0 ? this.form.isDefault = false : this.form.isDefault = true | |||
|         this.form.unit = [this.form.unit] | |||
|       } else { | |||
|         this.$message.error(res.msg) | |||
|       } | |||
|     }, | |||
|     // 关闭弹框 | |||
|     closeDialog() { | |||
|       this.dialogFormVisible = false | |||
|       this.formFormat() | |||
|     }, | |||
|     // 表格内容置空 | |||
|     formFormat() { | |||
|       this.form = { | |||
|         name: '', | |||
|         // 方案描述 | |||
|         description: '', | |||
|         // 周期数 | |||
|         period: 1, | |||
|         // 周期单位 | |||
|         unit: [], | |||
|         // 提前几天 | |||
|         smsPeriod: '', | |||
|         // 短信 | |||
|         smsMessage: '', | |||
|         // 默认 0:否 1:是 | |||
|         isDefault: false | |||
|       } | |||
|     }, | |||
|     // 当前页改变时触发 | |||
|     currentChange(e) { | |||
|       this.currentPage = e | |||
|       this.getFollowList() | |||
|     }, | |||
|     // 用户点击上一页按钮改变当前页后触发 | |||
|     upPageClick(e) { | |||
|     }, | |||
|     // 用户点击下一页按钮改变当前页后触发 | |||
|     nextPageClick(e) { | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| <style lang='scss' scoped> | |||
| .follow-management { | |||
|   background-color: #fff; | |||
|   padding: 16px; | |||
|   .sms-reminder { | |||
|     .el-select { | |||
|       margin-bottom: 24px; | |||
|       display: flex; | |||
|     } | |||
|   } | |||
| 
 | |||
|   .title { | |||
|     height: 64px; | |||
|     padding-left: 24px; | |||
|     line-height: 64px; | |||
|     font-size: 16px; | |||
|     background-color: #fff; | |||
|     box-shadow: inset 0px -1px 0px #f0f0f0; | |||
|     border-radius: 2px 2px 0px 0px; | |||
|   } | |||
|   .state-circle { | |||
|     display: inline-block; | |||
|     width: 6px; | |||
|     height: 6px; | |||
|     border-radius: 50%; | |||
|     margin-right: 8px; | |||
|   } | |||
|   .state-circle-green { | |||
|     background-color: #52c41a; | |||
|   } | |||
|   .state-circle-red { | |||
|     background-color: #ff4d4f; | |||
|   } | |||
|   .operation-details, | |||
|   .operation-delete { | |||
|     cursor: pointer; | |||
|   } | |||
| } | |||
| </style> | |||
| <style lang="scss"> | |||
| .follow-management { | |||
|   .cycle-display { | |||
|     .el-form-item__content { | |||
|       display: flex; | |||
|     } | |||
|     .el-input-number { | |||
|       width: 100px; | |||
|       margin-right: 16px; | |||
|     } | |||
|   } | |||
|   .el-dialog__footer { | |||
|     border-top: 1px solid #f0f0f0; | |||
|     padding: 10px 20px; | |||
|   } | |||
| } | |||
| 
 | |||
| .input-search { | |||
|   display: flex; | |||
|   .el-icon-d-arrow-right { | |||
|     transform: rotate(-90deg); | |||
|   } | |||
| } | |||
| .el-transfer__button:first-child { | |||
|   margin-bottom: 4px; | |||
| } | |||
| .el-transfer__buttons { | |||
|   .el-button { | |||
|     display: block; | |||
|     padding: 0; | |||
|     width: 24px; | |||
|     height: 24px; | |||
|   } | |||
|   .el-button:nth-child(2) { | |||
|     margin-left: 0; | |||
|   } | |||
| } | |||
| 
 | |||
| </style> | |||
| @ -1,65 +0,0 @@ | |||
| <template> | |||
|   <div class="set-management"> | |||
|     <el-tabs v-model="activeName" type="card" @tab-click="handleClick"> | |||
|       <!-- <el-tab-pane label="随访方案" name="followUpProtocol"> | |||
|         <followup-potocol /> | |||
|       </el-tab-pane> --> | |||
|       <el-tab-pane label="样式模板" name="caseTemplate"> | |||
|         <case-template /> | |||
|       </el-tab-pane> | |||
|       <!-- <el-tab-pane  label="短信模板" name="SMSTemplate"> | |||
|         <sms-template /> | |||
|       </el-tab-pane> --> | |||
|       <!-- <el-tab-pane label="预警设置" name="alertSetting"> | |||
|         <alert-setting /> | |||
|       </el-tab-pane> --> | |||
|     </el-tabs> | |||
|   </div> | |||
| </template> | |||
| <script> | |||
| // import smsTemplate from './SMS-template' | |||
| import caseTemplate from './case-template' | |||
| // import alertSetting from './alert-setting' | |||
| export default { | |||
|   components: { | |||
|     // smsTemplate, | |||
|     caseTemplate | |||
|     // alertSetting | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       activeName: 'caseTemplate' | |||
|     } | |||
|   }, | |||
|   created() { | |||
|   }, | |||
|   methods: { | |||
|     handleClick() { | |||
| 
 | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| <style lang="scss" soped> | |||
| .set-management { | |||
| } | |||
| </style> | |||
| <style lang="scss"> | |||
| .set-management { | |||
|   .el-tabs__header { | |||
|     margin: 0; | |||
|   } | |||
|   .el-tabs__nav { | |||
|     background: #fff; | |||
|   } | |||
|   .el-tabs__content { | |||
|     padding: 16px; | |||
|     background: #fff; | |||
|     height: calc( 100vh - 50px - 32px - 42px); | |||
|   } | |||
|   .el-tabs--card>.el-tabs__header .el-tabs__nav { | |||
|   border: 1px solid #f0f0f0; | |||
|   } | |||
| } | |||
| </style> | |||
| 
 | |||
| @ -1,48 +0,0 @@ | |||
| <template> | |||
|   <el-dialog | |||
|     width="90%" | |||
|     top="2vh" | |||
|     :visible.sync="visible" | |||
|     :title="'预览'" | |||
|     :close-on-click-modal="false" | |||
|     :close-on-press-escape="false" | |||
|     append-to-body | |||
|   > | |||
|     123 | |||
|     <template slot="footer"> | |||
|       <el-button @click="visible = false">{{ $t('cancel') }}</el-button> | |||
|       <el-button type="primary" @click="submit">{{ $t('confirm') }}</el-button> | |||
|     </template> | |||
|   </el-dialog> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| const Base64 = require('js-base64').Base64 | |||
| 
 | |||
| export default { | |||
|   props: { | |||
|     bodyStyleShow: { | |||
|       type: Boolean, | |||
|       default: false | |||
|     }, | |||
|     // 是否为病历模板 | |||
|     title: { | |||
|       type: String, | |||
|       default: '' | |||
|     } | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       visible: false, | |||
|       height: 'calc(100vh - 200px)' | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     init() { | |||
|       this.visible = true | |||
|       this.$nextTick(() => { | |||
|       }) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| @ -1,216 +0,0 @@ | |||
| <template> | |||
|   <!-- 手术实时状态大屏 --> | |||
|   <div class="statusScreen" @click="screenFull"> | |||
|     <el-row class="head"> | |||
|       <el-col :span="6"> <svg-icon icon-class="icon-logo-one" class="icon-logo" /></el-col> | |||
|       <el-col :span="12" class="patient-status"> | |||
|         <img src="../../../assets/img/tixing.png" alt=""> | |||
|         <span>患者手术实时状态</span> | |||
|       </el-col> | |||
|       <el-col :span="6" class="right-date"> | |||
|         <span>{{ date }}</span> | |||
|         <span>{{ time }}</span> | |||
|       </el-col> | |||
|     </el-row> | |||
|     <div class="content"> | |||
|       <!-- 头部 --> | |||
|       <el-row class="table-head"> | |||
|         <el-col :span="2">NO</el-col> | |||
|         <el-col :span="6">姓名</el-col> | |||
|         <el-col :span="8">手术名称</el-col> | |||
|         <el-col :span="8">状态</el-col> | |||
|       </el-row> | |||
|       <!-- 内容 --> | |||
|       <el-row v-for="(item,index) in surgicalStatus" :key="index" class="table-content"> | |||
| 
 | |||
|         <el-col :span="2">{{ ((index+1 + ((dataForm.page - 1) * 6)) < 10 ? '00': ((index+1 + ((dataForm.page - 1) * 6)) >= 10 && (index+1 + ((dataForm.page - 1) * 6)) < 100 ? '0' : '')) + (index+1 + ((dataForm.page - 1) * 6)) }}</el-col> | |||
|         <el-col :span="6">{{ item.patientName }}</el-col> | |||
|         <el-col :span="8">{{ item.operaName }}</el-col> | |||
|         <!-- status 1:进入手术区域,2:手术准备,3:等待手术,4:开始手术,5:手术结束,6:准备离开手术区域 --> | |||
|         <el-col :span="8" class="col-stauts">{{ item.status === 1 ? '进入手术区域' : | |||
|           (item.status === 2 ? '手术准备' : | |||
|             (item.status === 3 ? '等待手术' : | |||
|               (item.status === 4 ? '开始手术' : | |||
|                 (item.status === 5 ? '手术结束' : | |||
|                   (item.status === 6 ? '准备离开手术区域' : '手术结束'))))) }}</el-col> | |||
|       </el-row> | |||
| 
 | |||
|     </div> | |||
|     <div class="footers"> | |||
|       <span>温馨提示:</span> | |||
|       <span>请您耐心等待</span> | |||
|     </div> | |||
|   </div> | |||
| </template> | |||
| <script> | |||
| import screenfull from 'screenfull' | |||
| export default { | |||
|   data() { | |||
|     return { | |||
|       surgicalStatus: [], | |||
|       time: '', | |||
|       date: '', | |||
|       dataForm: { | |||
|         page: 1, | |||
|         limit: 6, | |||
|         centreCode: 'WZYSG_QG' | |||
|       }, | |||
|       currentPage: 1, | |||
|       total: '', | |||
|       pages: null, | |||
|       screenTimer: null | |||
|     } | |||
|   }, | |||
|   created() { | |||
|     setInterval(() => { | |||
|       this.time = this.$moment().format('LTS') | |||
|       this.date = this.$moment().format('ll') | |||
|     }, 1000) | |||
|     this.getScreenData() | |||
|     this.screenTimer = setInterval(() => { | |||
|       this.pages && (this.dataForm.page < this.pages) ? this.dataForm.page++ : this.dataForm.page = 1 | |||
|       // this.surgicalStatus = [] | |||
|       this.getScreenData('time') | |||
|     }, 8000) | |||
|   }, | |||
|   destroyed() { | |||
|     this.dataForm.page = 1 | |||
|     this.surgicalStatus = [] | |||
|     clearInterval(this.screenTimer) | |||
|   }, | |||
|   methods: { | |||
|     async getScreenData(flag) { | |||
|       const { data: res } = await this.$http.get('/pda', { | |||
|         params: this.dataForm | |||
|       }) | |||
|       if (res.code === 0) { | |||
|         this.surgicalStatus = res.data.list | |||
|         res.data.list.forEach(item => { | |||
|           if (item.patientName.length === 2) { | |||
|             item.patientName = item.patientName.substring(0, 1) + '*' // 截取name 字符串截取第一个字符, | |||
|           } else if (item.patientName.length === 3) { | |||
|             item.patientName = item.patientName.substring(0, 1) + '*' + item.patientName.substring(2, 3)// 截取第一个和第三个字符 | |||
|           } else if (item.patientName.length > 3) { | |||
|             item.patientName = item.patientName.substring(0, 1) + '*' + '*' + item.patientName.substring(3, item.patientName.length)// 截取第一个和大于第4个字符 | |||
|           } | |||
|         }) | |||
|         this.total = res.data.total | |||
|         this.pages = Math.ceil(this.total / 6) | |||
|       } else { | |||
|         this.$message.error(res.msg) | |||
|       } | |||
|     }, | |||
|     //   全屏 | |||
|     screenFull() { | |||
|       // 这里建议打印一下screenfull看看属性名称是不是enabled | |||
|       console.log(screenfull) | |||
|       if (!screenfull.enabled) { | |||
|         // 如果不允许进入全屏,发出不允许提示 | |||
|         this.$message({ | |||
|           message: '不支持全屏', | |||
|           type: 'warning' | |||
|         }) | |||
|         return | |||
|       } | |||
|       screenfull.toggle(document.getElementById('full-screen')) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .statusScreen { | |||
|   display: flex; | |||
|   flex-direction: column; | |||
|   justify-content: space-between; | |||
|   height: 100vh; | |||
|   .head { | |||
|     padding: 0 38px; | |||
|     display: flex; | |||
|     align-items: center; | |||
|     height: 140px; | |||
|     width: 100vw; | |||
|     background: #1e4972; | |||
|     color: #fff; | |||
|     .icon-logo { | |||
|       font-size: 250px; | |||
|     } | |||
|     .patient-status { | |||
|       position: relative; | |||
|       width: 700px; | |||
|       img { | |||
|         width: 100%; | |||
|         height: 140px; | |||
|       } | |||
|       span { | |||
|         width: 100%; | |||
|         font-size: 48px; | |||
|         position: absolute; | |||
|         text-align: center; | |||
|         left: 50%; | |||
|         top: 50%; | |||
|         transform: translate(-50%,-50%) | |||
|       } | |||
|     } | |||
|     .right-date { | |||
|        width: 33.33%; | |||
|        text-align: right; | |||
|       span { | |||
|         color: #A1FFF9; | |||
|       } | |||
|       span:nth-child(1) { | |||
|         font-size: 32px; | |||
|         padding-right: 16px; | |||
|       } | |||
|       span:nth-child(2) { | |||
|         font-size: 58px; | |||
|       } | |||
|     } | |||
|   } | |||
|   .content { | |||
|     height: calc(100vh - 140px - 100px); | |||
|     overflow: hidden; | |||
|     .table-head,.table-content { | |||
|       padding: 0 48px; | |||
|       font-size: 48px; | |||
|     } | |||
|     .table-head { | |||
|       height: calc(100% / 7); | |||
|       color: #00417C; | |||
|       background: linear-gradient(180deg, #EEF8FF 0%, #CDEDFF 100%); | |||
|     } | |||
|     .table-content { | |||
|       height: calc(100% / 7); | |||
|       .col-stauts { | |||
|         color:#058B2B; | |||
|       } | |||
|     } | |||
|     .table-content:nth-of-type(odd) { | |||
|       background: #DDF2FF; | |||
|     } | |||
|     .table-content:nth-of-type(even) { | |||
|       background: #F9FFFF; | |||
|     } | |||
|     .el-col { | |||
|       height: 100%; | |||
|       display: flex; | |||
|       align-items: center; | |||
|       justify-content: center; | |||
|     } | |||
|   } | |||
|   .footers { | |||
|     height: 100px; | |||
|     line-height: 100px; | |||
|     padding: 0 48px; | |||
|     color: #fff; | |||
|     font-size: 32px; | |||
|     background: #1e4972; | |||
|   } | |||
| } | |||
| @media screen and (min-width: 320px) { | |||
| 
 | |||
| } | |||
| </style> | |||
| <style lang="scss"> | |||
|   .statusScreen { | |||
|   } | |||
| </style> | |||
| @ -1,744 +0,0 @@ | |||
| <template> | |||
|   <div class="schedule-date"> | |||
|     <div class="date-head"> | |||
|       <div class="date-head-left">手术日程安排</div> | |||
|       <div class="date-head-right"> | |||
|         <el-button-group style="margin-right:10px;"> | |||
|           <el-button type="primary" icon="el-icon-arrow-left" size="small" @click="weekPre">上周</el-button> | |||
|           <el-button type="primary" size="small" @click="weekNext">上周<i class="el-icon-arrow-right el-icon--right" /> | |||
|           </el-button> | |||
|         </el-button-group> | |||
|         <span>选择日期:</span> | |||
|         <el-date-picker | |||
|           v-model="newDate" | |||
|           class="right-pick-btn" | |||
|           :clearable="false" | |||
|           type="date" | |||
|           size="small" | |||
|           placeholder="按日期查询" | |||
|           @change="pickDate" | |||
|         /> | |||
|       </div> | |||
|     </div> | |||
|     <div class="date-content"> | |||
|       <el-row class="weeks"> | |||
|         <el-col :span="3" class="doctor-list-text">医生列表</el-col> | |||
|         <el-col | |||
|           v-for="(day, index) in days" | |||
|           :key="index" | |||
|           :span="3" | |||
|           class="date-item" | |||
|           :class="{selected: index == tabIndex}" | |||
|           @click="pick(day, index)" | |||
|         > | |||
|           <!--本月--> | |||
|           <div class="date-day"> | |||
|             <span class="hidden-sm-and-down">{{ day | dateFormat }}</span> | |||
|             <p>{{ day | getWeekFormat }}</p> | |||
|           </div> | |||
|           <div class="morning-after"> | |||
|             <span>上午</span> | |||
|             <span>下午</span> | |||
|           </div> | |||
|         </el-col> | |||
|       </el-row> | |||
|       <el-row v-for="(item,index) in doctorList" :key="index" :gutter="10" class="content"> | |||
|         <el-col :span="3"> | |||
|           <div class="doctorList"> | |||
|             <div class="list"> | |||
|               <div class="list-img"> | |||
|                 <img src="@/assets/img/avatar.png" alt=""> | |||
|               </div> | |||
|               <p>{{ item.name }}</p> | |||
|               <p>{{ item.expertise }}</p> | |||
|             </div> | |||
|           </div> | |||
|         </el-col> | |||
|         <el-col v-for="(weekInfoItem,weekInfoIndex) in item.weekInfo" :key="weekInfoIndex" :span="3"> | |||
|           <div class="surplu-num"> | |||
|             <!-- 上午 --> | |||
|             <div | |||
|               class="morning" | |||
|               :class="weekInfoItem.morning.surplusNum<=0 ? 'morningAfterClass' :'' " | |||
|               @mouseover.stop="mouseoverHandle(index,weekInfoIndex,'morning')" | |||
|               @mouseout="mouseoutHandle" | |||
|             > | |||
|               <p>余</p> | |||
|               <p :style="{'color':weekInfoItem.morning.surplusNum<=0 ? 'red':'#00BB61'}"> | |||
|                 {{ weekInfoItem.morning.surplusNum }}</p> | |||
|               <div | |||
|                 v-show="currentIndex===index && currentWeekIndex===weekInfoIndex && plusIsShow && showMorningAfterText==='morning' && weekInfoItem.morning.surplusNum>0" | |||
|                 class="show-plus" | |||
|               > | |||
|                 <i class="el-icon-plus" /> | |||
|               </div> | |||
|             </div> | |||
|             <!-- 下午 --> | |||
|             <div | |||
|               class="after" | |||
|               :class="weekInfoItem.after.surplusNum<=0 ? 'morningAfterClass' :'' " | |||
|               @mouseover.stop="mouseoverHandle(index,weekInfoIndex,'after')" | |||
|               @mouseout="mouseoutHandle" | |||
|             > | |||
|               <p>余</p> | |||
|               <p :style="{'color':weekInfoItem.after.surplusNum<=0 ? 'red':'#00BB61'}"> | |||
|                 {{ weekInfoItem.after.surplusNum }}</p> | |||
|               <div | |||
|                 v-show="currentIndex===index && currentWeekIndex===weekInfoIndex && plusIsShow && showMorningAfterText==='after' && weekInfoItem.morning.surplusNum>0" | |||
|                 class="show-plus" | |||
|                 @click="addPatientHandle" | |||
|               > | |||
|                 <i class="el-icon-plus" /> | |||
|               </div> | |||
|             </div> | |||
|           </div> | |||
|         </el-col> | |||
|       </el-row> | |||
|     </div> | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import moment from 'moment' | |||
| import _ from 'lodash' | |||
| /* eslint-disable */ | |||
| export default { | |||
|   props: { | |||
|     dateValue: { | |||
|       type: String, | |||
|       default: moment(new Date()).format("YYYY-MM-DD") | |||
|     }, | |||
|     timeValue: { | |||
|       type: String, | |||
|       default: "00:00" | |||
|     } | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       currentYear: 1970, // 年份 | |||
|       currentMonth: 1, // 月份 | |||
|       currentDay: 1, // 日期 | |||
|       currentWeek: 1, // 星期 | |||
|       days: [], | |||
|       value1: "", | |||
|       tabIndex: null, | |||
|       newDate: moment(new Date()).format("YYYY-MM-DD"), | |||
|       tabTimeIndex: 4, | |||
|       times: [ | |||
|         { time: "00:00:00~06:00:00", label: "00:00~06:00" }, | |||
|         { time: "06:00:00~12:00:00", label: "06:00~12:00" }, | |||
|         { time: "12:00:00~18:00:00", label: "12:00~18:00" }, | |||
|         { time: "18:00:00~24:00:00", label: "18:00~24:00" }, | |||
|         { time: "00:00:00~24:00:00", label: "今日全部" } | |||
|       ], | |||
|       plusIsShow: false, | |||
|       currentIndex: null, | |||
|       currentWeekIndex: null, | |||
|       showMorningAfterText: '', | |||
|       doctorList: [{ | |||
|         image: '@/assets/img/avatar.png', | |||
|         name: '李浩', | |||
|         expertise: '激光手术', | |||
|         weekInfo: [{ | |||
|           date: '', | |||
|           morning: { | |||
|             surplusNum: 12,  // 剩余数量 | |||
|             scheduled_patients: [] | |||
|           }, | |||
|           after: { | |||
|             surplusNum: 0,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|         }, { | |||
|           date: '', | |||
|           morning: { | |||
|             surplusNum: 12,  // 剩余数量 | |||
|             scheduled_patients: [] | |||
|           }, | |||
|           after: { | |||
|             surplusNum: 12,  // 剩余数量 | |||
|             scheduled_patients: [] | |||
|           }, | |||
|         }, { | |||
|           date: '', | |||
|           morning: { | |||
|             surplusNum: 0,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|           after: { | |||
|             surplusNum: 5,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|         }, { | |||
|           date: '', | |||
|           morning: { | |||
|             surplusNum: 0,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|           after: { | |||
|             surplusNum: 8,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|         }, { | |||
|           date: '', | |||
|           morning: { | |||
|             surplusNum: 5,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|           after: { | |||
|             surplusNum: 9,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|         }, { | |||
|           date: '', | |||
|           morning: { | |||
|             surplusNum: 12,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|           after: { | |||
|             surplusNum: 7,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|         }, { | |||
|           date: '', | |||
|           morning: { | |||
|             surplusNum: 4,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|           after: { | |||
|             surplusNum: 7,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|         }] | |||
|       }, { | |||
|         image: '@/assets/img/avatar.png', | |||
|         name: '李浩', | |||
|         expertise: '激光手术', | |||
|         weekInfo: [{ | |||
|           date: '', | |||
|           morning: { | |||
|             surplusNum: 0,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|           after: { | |||
|             surplusNum: 12,  // 剩余数量 | |||
|             scheduled_patients: [0] | |||
|           }, | |||
|         }, { | |||
|           date: '', | |||
|           morning: { | |||
|             surplusNum: 0,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|           after: { | |||
|             surplusNum: 12,  // 剩余数量 | |||
|             scheduled_patients: [] | |||
|           }, | |||
|         }, { | |||
|           date: '', | |||
|           morning: { | |||
|             surplusNum: 0,  // 剩余数量 | |||
|             scheduled_patients: [] | |||
|           }, | |||
|           after: { | |||
|             surplusNum: 4,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|         }, { | |||
|           date: '', | |||
|           morning: { | |||
|             surplusNum: 7,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|           after: { | |||
|             surplusNum: 9,  // 剩余数量 | |||
|             scheduled_patients: [{ | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }, { | |||
|               name: '李二狗', | |||
|               sex: '男', | |||
|               age: '45' | |||
|             }] | |||
|           }, | |||
|         }, { | |||
|           date: '', | |||
|           morning: { | |||
|             surplusNum: 12,  // 剩余数量 | |||
|             scheduled_patients: [] | |||
|           }, | |||
|           after: { | |||
|             surplusNum: 12,  // 剩余数量 | |||
|             scheduled_patients: [] | |||
|           }, | |||
|         }, { | |||
|           date: '', | |||
|           morning: { | |||
|             surplusNum: 12,  // 剩余数量 | |||
|             scheduled_patients: [] | |||
|           }, | |||
|           after: { | |||
|             surplusNum: 12,  // 剩余数量 | |||
|             scheduled_patients: [] | |||
|           }, | |||
|         }, { | |||
|           date: '', | |||
|           morning: { | |||
|             surplusNum: 12,  // 剩余数量 | |||
|             scheduled_patients: [] | |||
|           }, | |||
|           after: { | |||
|             surplusNum: 12,  // 剩余数量 | |||
|             scheduled_patients: [] | |||
|           }, | |||
|         }] | |||
|       }] | |||
|     }; | |||
|   }, | |||
|   filters: { | |||
|     dateFormat(date) { | |||
|       return moment(date).format("YYYY-MM-DD"); | |||
|     }, | |||
|     getWeekFormat(date) { | |||
|       const weeksObj = { | |||
|         1: "周一", | |||
|         2: "周二", | |||
|         3: "周三", | |||
|         4: "周四", | |||
|         5: "周五", | |||
|         6: "周六", | |||
|         7: "周日" | |||
|       }; | |||
|       let weekNumber = moment(date).isoWeekday(); | |||
|       return weeksObj[weekNumber]; | |||
|     } | |||
|   }, | |||
| 
 | |||
|   mounted() { | |||
|     const index = _.findIndex(this.days, function (o) { | |||
|       // console.log('o: ', o.getDate()); | |||
|       // console.log('new Date().getDate(): ', new Date().getDate()); | |||
|       return o.getDate() === new Date().getDate(); | |||
|     }); | |||
|     console.log("index: ", index); | |||
|     this.tabIndex = index; | |||
|   }, | |||
| 
 | |||
|   created() { | |||
|     this.initData(null); | |||
|   }, | |||
| 
 | |||
|   methods: { | |||
|     formatDate(year, month, day) { | |||
|       const y = year; | |||
|       let m = month; | |||
|       if (m < 10) m = `0${m}`; | |||
|       let d = day; | |||
|       if (d < 10) d = `0${d}`; | |||
|       return `${y}-${m}-${d}`; | |||
|     }, | |||
|     pickDate(date) { | |||
|       let that = this; | |||
|       that.newDate = moment(date).format("YYYY-MM-DD"); | |||
|       that.$emit("dateValue", that.newDate); | |||
|       console.log("this.newDate: ", that.newDate); | |||
|       that.initData(that.newDate); | |||
|       const index = _.findIndex(that.days, function (o) { | |||
|         return o.getDate() === new Date(that.newDate).getDate(); | |||
|       }); | |||
|       // console.log("index: ", index); | |||
|       this.tabIndex = index; | |||
|     }, | |||
|     initData(cur) { | |||
|       let date = ""; | |||
|       if (cur) { | |||
|         date = new Date(cur); | |||
|       } else { | |||
|         date = new Date(); | |||
|       } | |||
|       this.currentDay = date.getDate(); // 今日日期 几号 | |||
|       this.currentYear = date.getFullYear(); // 当前年份 | |||
|       this.currentMonth = date.getMonth() + 1; // 当前月份 | |||
|       this.currentWeek = date.getDay(); // 1...6,0  // 星期几 | |||
|       if (this.currentWeek === 0) { | |||
|         this.currentWeek = 7; | |||
|       } | |||
|       const str = this.formatDate( | |||
|         this.currentYear, | |||
|         this.currentMonth, | |||
|         this.currentDay | |||
|       ); // 今日日期 年-月-日 | |||
|       this.days.length = 0; | |||
|       // 今天是周日,放在第一行第7个位置,前面6个 这里默认显示一周,如果需要显示一个月,则第二个循环为 i<= 35- this.currentWeek | |||
|       /* eslint-disabled */ | |||
|       // 今天 | |||
|       for (let i = this.currentWeek - 1; i >= 0; i -= 1) { | |||
|         const d = new Date(str); | |||
|         d.setDate(d.getDate() - i); | |||
|         // console.log(y:" + d.getDate()) | |||
|         // console.log('d: ', d); | |||
|         this.days.push(d); | |||
|       } | |||
|       // 这个星期 | |||
|       for (let i = 1; i <= 7 - this.currentWeek; i += 1) { | |||
|         const d = new Date(str); | |||
|         d.setDate(d.getDate() + i); | |||
|         this.days.push(d); | |||
|         // console.log('d1: ', d); | |||
|       } | |||
|     }, | |||
| 
 | |||
|     // 上个星期 | |||
|     weekPre() { | |||
|       const d = this.days[0]; // 如果当期日期是7号或者小于7号 | |||
|       d.setDate(d.getDate() - 7); | |||
|       this.initData(d); | |||
|     }, | |||
| 
 | |||
|     // 下个星期 | |||
|     weekNext() { | |||
|       const d = this.days[6]; // 如果当期日期是7号或者小于7号 | |||
|       d.setDate(d.getDate() + 7); | |||
|       this.initData(d); | |||
|     }, | |||
| 
 | |||
|     // 上一個月  传入当前年份和月份 | |||
|     pickPre(year, month) { | |||
|       const d = new Date(this.formatDate(year, month, 1)); | |||
|       d.setDate(0); | |||
|       this.initData(this.formatDate(d.getFullYear(), d.getMonth() + 1, 1)); | |||
|     }, | |||
| 
 | |||
|     // 下一個月  传入当前年份和月份 | |||
|     pickNext(year, month) { | |||
|       const d = new Date(this.formatDate(year, month, 1)); | |||
|       d.setDate(35); | |||
|       this.initData(this.formatDate(d.getFullYear(), d.getMonth() + 1, 1)); | |||
|     }, | |||
| 
 | |||
|     // 当前选择日期 | |||
|     pick(date, index) { | |||
|       this.newDate = moment(date).format("YYYY-MM-DD"); | |||
|       this.$emit("dateValue", this.newDate); | |||
|       // console.log("index: ", index); | |||
|       this.tabIndex = index; | |||
|       // alert( | |||
|       //   this.formatDate(date.getFullYear(), date.getMonth() + 1, date.getDate()) | |||
|       // ); | |||
|     }, | |||
|     pickTime(time, index) { | |||
|       // console.log('time: ', time); | |||
|       let timeArr = []; | |||
|       timeArr.push(_.split(time.time, "~")); | |||
|       // console.log("timeArr: ", timeArr); | |||
|       this.$emit("timeValue", _.join(timeArr), ""); | |||
|       // console.log("index: ", index); | |||
|       this.tabTimeIndex = index; | |||
|       // alert( | |||
|       //   this.formatDate(date.getFullYear(), date.getMonth() + 1, date.getDate()) | |||
|       // ); | |||
|     }, | |||
|     // 鼠标移入 | |||
|     mouseoverHandle(index, weekInfoIndex, showMorngingAfterText) { | |||
|       this.currentIndex = index | |||
|       this.currentWeekIndex = weekInfoIndex | |||
|       this.showMorningAfterText = showMorningAfterText | |||
|       this.plusIsShow = true | |||
|     }, | |||
|     // 鼠标移入 | |||
|     mouseoutHandle() { | |||
|       this.currentIndex = null | |||
|       this.currentWeekIndex = null | |||
|       this.showMorningAfterText = '' | |||
|       this.plusIsShow = false | |||
|     }, | |||
|     // 新增日程安排 | |||
|     addPatientHandle() { | |||
| 
 | |||
|     }  | |||
|   } | |||
| }; | |||
| </script> | |||
| 
 | |||
| <style lang="scss" scoped> | |||
| .schedule-date { | |||
|   font-size: 14px; | |||
|   margin-top: 15px; | |||
|   padding: 16px; | |||
|   .date-head { | |||
|     display: flex; | |||
|     justify-content: space-between; | |||
|     margin-bottom: 16px; | |||
|   } | |||
|   .date-content { | |||
|     background: #f7f9fd; | |||
|     padding: 10px 0; | |||
|     .weeks { | |||
|       display: flex; | |||
|       padding-bottom: 10px; | |||
|       border-bottom: 1px solid #e2ebf9; | |||
|       color: #88939d; | |||
|       .doctor-list-text { | |||
|         display: flex; | |||
|         justify-content: center; | |||
|         align-items: center; | |||
|       } | |||
|       .date-day { | |||
|         text-align: center; | |||
|         margin-bottom: 10px; | |||
|       } | |||
|       .morning-after { | |||
|         display: flex; | |||
|         justify-content: space-around; | |||
|       } | |||
|       .date-item { | |||
|         cursor: pointer; | |||
|         padding: 5px 10px; | |||
|         border-right: none; | |||
|         list-style: none; | |||
|         flex: 1; | |||
|         text-align: center; | |||
|         &:hover { | |||
|           background: #dff0d8; | |||
|         } | |||
|         &:active { | |||
|           background: #dff0d8; | |||
|         } | |||
|       } | |||
|     } | |||
|     .content { | |||
|       border-bottom: 1px solid #e2ebf9; | |||
|       padding: 16px 0; | |||
|       display: flex; | |||
|       align-items: center; | |||
|       .doctorList { | |||
|         text-align: center; | |||
|         .list { | |||
|           display: flex; | |||
|           flex-direction: column; | |||
|           align-items: center; | |||
|           justify-content: center; | |||
|         } | |||
|         .list-img { | |||
|           width: 64px; | |||
|           height: 64px; | |||
|           border-radius: 50%; | |||
|           overflow: hidden; | |||
|           img { | |||
|             width: 64px; | |||
|             height: 64px; | |||
|           } | |||
|         } | |||
|       } | |||
|       .surplu-num { | |||
|         display: flex; | |||
|         .morning { | |||
|           margin-right: 6px; | |||
|         } | |||
|         .morning, | |||
|         .after { | |||
|           position: relative; | |||
|           color: #88939d; | |||
|           width: 45%; | |||
|           height: 120px; | |||
|           border-radius: 3px; | |||
|           border-top: 2px solid #00bb61; | |||
|           background: #fff; | |||
|           display: flex; | |||
|           flex-direction: column; | |||
|           align-items: center; | |||
|           justify-content: center; | |||
|           cursor: pointer; | |||
|           p:nth-child(2) { | |||
|             font-size: 24px; | |||
|           } | |||
|         } | |||
|         .morningAfterClass { | |||
|           border-top: 2px solid #e1e1e1; | |||
|           background: #fcfdfe; | |||
|         } | |||
|         .morning:hover, | |||
|         .after:hover { | |||
|           border-top: 2px solid #1b5bfb !important; | |||
|           box-shadow: 0px 0px 16px rgba(8, 115, 215, 0.24); | |||
|         } | |||
|         .show-plus { | |||
|           width: 100%; | |||
|           height: 100%; | |||
|           background: #fff; | |||
|           position: absolute; | |||
|           left: 0; | |||
|           top: 0; | |||
|           text-align: center; | |||
|           font-size: 24px; | |||
|           line-height: 120px; | |||
|         } | |||
|       } | |||
|     } | |||
|   } | |||
| 
 | |||
|   .time-range { | |||
|     display: flex; | |||
|     justify-content: space-around; | |||
|     align-items: center; | |||
|     padding: 10px 0; | |||
|     span { | |||
|       cursor: pointer; | |||
|       padding-bottom: 5px; | |||
|       border-bottom: 3px solid #fff; | |||
|       &:hover { | |||
|         border-bottom: 3px solid rgb(151, 198, 245); | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| .today-item { | |||
|   cursor: pointer; | |||
|   line-height: 45px; | |||
| } | |||
| .selected { | |||
|   box-sizing: border-box; | |||
| } | |||
| .item-wrapper { | |||
|   display: flex; | |||
|   justify-content: center; | |||
|   align-items: center; | |||
|   flex-direction: column; | |||
| } | |||
| .doctor-list-text, | |||
| .prev-btn, | |||
| .next-btn { | |||
|   cursor: pointer; | |||
|   display: flex; | |||
|   justify-content: center; | |||
|   align-items: center; | |||
|   .fa-icon { | |||
|     font-size: 18px; | |||
|   } | |||
| } | |||
| </style> | |||
| <style lang="scss"> | |||
| .schedule-date { | |||
| } | |||
| </style> | |||
					Loading…
					
					
				
		Reference in new issue