17 changed files with 2604 additions and 725 deletions
			
			
		| @ -0,0 +1,93 @@ | |||
| <template> | |||
|   <table> | |||
|     <tbody> | |||
|       <tr> | |||
|         <td rowspan="2" style="width: 30%" /> | |||
|         <td class="table_title">翔安医院</td> | |||
|       </tr> | |||
|       <tr> | |||
|         <td>个案管理信息表</td> | |||
|       </tr> | |||
|       <tr><td colspan="2" style="font-weight: bold">无效联系记录</td></tr> | |||
|       <tr> | |||
|         <td colspan="2"> | |||
|           <el-radio v-model="radio" label="1">拒接</el-radio> | |||
|           <el-radio v-model="radio" label="2">未接</el-radio> | |||
|           <el-radio v-model="radio" label="3">空号</el-radio> | |||
|         </td> | |||
|       </tr> | |||
|     </tbody> | |||
|   </table> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| export default { | |||
|   name: 'Invalid', | |||
|   props: { | |||
|     followId: { | |||
|       type: String, | |||
|       default: '' | |||
|     }, | |||
|     jsonText: { | |||
|       type: String, | |||
|       default: '' | |||
|     } | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       radio: '0' | |||
|     } | |||
|   }, | |||
|   watch: { | |||
|     jsonText(val) { | |||
|       if (val) { | |||
|         const data = val && JSON.parse(val) | |||
|         this.radio = data.radio | |||
|       } else { | |||
|         this.radio = '0' | |||
|       } | |||
|     } | |||
|   }, | |||
|   created() { | |||
|     if (this.jsonText) { | |||
|       this.radio = this.jsonText && JSON.parse(this.jsonText).radio | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     addOrUpdateHandle() { | |||
|       const jsonText = JSON.stringify({ | |||
|         radio: this.radio | |||
|       }) | |||
|       const dataForm = { | |||
|         flag: '7', | |||
|         name: '无效联系', | |||
|         patientId: this.patientId, | |||
|         platform: this.platform, | |||
|         id: this.followId, | |||
|         updateTime: this.$moment().format('YYYY-MM-DD HH:mm:ss') | |||
|       } | |||
|       const params = { | |||
|         jsonText: jsonText, | |||
|         ...dataForm | |||
|       } | |||
|       return this.$http.post('/case/update', params) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss" scoped> | |||
| table{ | |||
|   width: 100%; | |||
|   margin-top: 20px; | |||
|   font-size: 16px; | |||
|   .table_title{ | |||
|     font-size: 22px !important; | |||
|   } | |||
|   tr td{ | |||
|     border: 1px solid #ccc; | |||
|     text-align: center; | |||
|     padding: 10px 0; | |||
|   } | |||
| } | |||
| </style> | |||
| @ -0,0 +1,356 @@ | |||
| <template> | |||
|   <div> | |||
|     <table> | |||
|       <tbody> | |||
|         <tr> | |||
|           <td rowspan="2" style="width: 30%" /> | |||
|           <td class="table_title" colspan="2">翔安医院</td> | |||
|         </tr> | |||
|         <tr> | |||
|           <td colspan="2">个案管理信息表</td> | |||
|         </tr> | |||
|         <tr><td colspan="3" style="font-weight: bold">门诊随访记录</td></tr> | |||
|         <tr> | |||
|           <td colspan="3"> | |||
|             <div class="flex">随访日期: | |||
|               <el-date-picker | |||
|                 v-model="patientData.followDate" | |||
|                 type="date" | |||
|               /> | |||
|             </div> | |||
|           </td> | |||
|         </tr> | |||
|         <tr> | |||
|           <td colspan="3"> | |||
|             <div class="flex a-c" style="width: 380px"> | |||
|               主诉:<el-input v-model="patientData.mainSuit" style="flex: 1" /> | |||
|             </div> | |||
|           </td> | |||
|         </tr> | |||
|         <tr><td colspan="3"> | |||
|           <div class="flex a-c"> | |||
|             诊断: | |||
|             <div class="flex" style="width: 180px">眼别:<el-input v-model="patientData.eyeLevel" style="flex: 1;margin-right: 15px" /></div> | |||
|             <div class="flex" style="width: 280px">疾病诊断:<el-input v-model="patientData.diagnose" style="flex: 1;margin-right: 15px" /></div> | |||
|           </div> | |||
|         </td></tr> | |||
|         <!--    常规检查--> | |||
|         <tr> | |||
|           <td colspan="3"><div class="flex">常规检查</div></td> | |||
|         </tr> | |||
|         <tr v-for="(check,index) in checks" :key="index" class="content_input"> | |||
|           <td>{{ check.name }}</td> | |||
|           <td> | |||
|             <div v-if="check.OD==='OD'">{{ check.OD }}</div> | |||
|             <div v-else> | |||
|               <el-input v-model="check.OD" /> | |||
|             </div> | |||
|           </td> | |||
|           <td> | |||
|             <div v-if="check.OS==='OS'">{{ check.OS }}</div> | |||
|             <div v-else> | |||
|               <el-input v-model="check.OS" /> | |||
|             </div> | |||
|           </td> | |||
|         </tr> | |||
|         <!--    裂隙灯检查--> | |||
|         <tr> | |||
|           <td colspan="3"><div class="flex">裂隙灯检查</div></td> | |||
|         </tr> | |||
|         <tr v-for="(check,index) in slitChecks" :key="index+check.name" class="content_input"> | |||
|           <td> | |||
|             <el-checkbox v-if="check.name!=='检查内容'" v-model="check.isSelect">{{ check.name }}</el-checkbox> | |||
|             <div v-else>{{ check.name }}</div> | |||
|           </td> | |||
|           <td> | |||
|             <div v-if="check.OD==='OD'">{{ check.OD }}</div> | |||
|             <div v-else> | |||
|               <el-input v-model="check.OD" /> | |||
|             </div> | |||
|           </td> | |||
|           <td> | |||
|             <div v-if="check.OS==='OS'">{{ check.OS }}</div> | |||
|             <div v-else> | |||
|               <el-input v-model="check.OS" /> | |||
|             </div> | |||
|           </td> | |||
|         </tr> | |||
|         <!--    诊断措施--> | |||
|         <tr> | |||
|           <td colspan="3"> | |||
|             <div class="flex">诊断措施: | |||
|               <div v-for="(item,idx) in diaMeasures" :key="idx+'_'+idx" style="margin-right: 15px"> | |||
|                 <el-input v-model="item.cure" :placeholder="item.placeholder" style="flex: 1;margin-right: 15px" /> | |||
|               </div> | |||
|             </div> | |||
|           </td> | |||
|         </tr> | |||
|         <!--      复查--> | |||
|         <tr> | |||
|           <td colspan="3"> | |||
|             <div class="flex">复查备注(计划)</div> | |||
|             <div class="flex" style="margin-top: 10px"> | |||
|               <el-radio v-model="patientData.period" label="week">按计划随访</el-radio> | |||
|               <el-radio v-model="patientData.period" label="month">临时调整</el-radio> | |||
|               日期:<el-date-picker v-model="patientData.periodDate" type="date" /> | |||
|             </div> | |||
|           </td> | |||
|         </tr> | |||
|       </tbody> | |||
|     </table> | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| export default { | |||
|   name: 'OutFollow', | |||
|   props: { | |||
|     patientId: { | |||
|       type: String, | |||
|       default: '' | |||
|     }, | |||
|     platform: { | |||
|       type: String, | |||
|       default: '' | |||
|     }, | |||
|     followId: { | |||
|       type: String, | |||
|       default: '' | |||
|     }, | |||
|     jsonText: { | |||
|       type: String, | |||
|       default: '' | |||
|     } | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       initData: {}, | |||
|       patientData: { | |||
|         followDate: '', | |||
|         mainSuit: '', | |||
|         eyeLevel: '', | |||
|         diagnose: '', | |||
|         period: '', | |||
|         periodDate: '' | |||
|       }, | |||
|       // 常规检查 | |||
|       checks: [ | |||
|         { | |||
|           name: '检查内容', | |||
|           OD: 'OD', | |||
|           OS: 'OS' | |||
|         }, | |||
|         { | |||
|           name: '视力', | |||
|           OD: '', | |||
|           OS: '' | |||
|         }, | |||
|         { | |||
|           name: '眼压', | |||
|           OD: '', | |||
|           OS: '' | |||
|         }, | |||
|         { | |||
|           name: 'C/D', | |||
|           OD: '', | |||
|           OS: '' | |||
|         } | |||
|       ], | |||
|       slitChecks: [ | |||
|         { | |||
|           name: '检查内容', | |||
|           OD: 'OD', | |||
|           OS: 'OS' | |||
|         }, | |||
|         { | |||
|           name: '结膜/滤过泡', | |||
|           isSelect: false, | |||
|           OD: '', | |||
|           OS: '' | |||
|         }, | |||
|         { | |||
|           name: '角膜', | |||
|           isSelect: false, | |||
|           OD: '', | |||
|           OS: '' | |||
|         }, | |||
|         { | |||
|           name: '中央前房', | |||
|           isSelect: false, | |||
|           OD: '', | |||
|           OS: '' | |||
|         }, | |||
|         { | |||
|           name: '周边前房', | |||
|           isSelect: false, | |||
|           OD: '', | |||
|           OS: '' | |||
|         }, | |||
|         { | |||
|           name: '虹膜', | |||
|           isSelect: false, | |||
|           OD: '', | |||
|           OS: '' | |||
|         }, | |||
|         { | |||
|           name: '瞳孔', | |||
|           isSelect: false, | |||
|           OD: '', | |||
|           OS: '' | |||
|         }, | |||
|         { | |||
|           name: '直径', | |||
|           isSelect: false, | |||
|           OD: '', | |||
|           OS: '' | |||
|         }, | |||
|         { | |||
|           name: '对光反射', | |||
|           isSelect: false, | |||
|           OD: '', | |||
|           OS: '' | |||
|         }, | |||
|         { | |||
|           name: '晶体', | |||
|           isSelect: false, | |||
|           OD: '', | |||
|           OS: '' | |||
|         }, | |||
|         { | |||
|           name: '盘沿', | |||
|           isSelect: false, | |||
|           OD: '', | |||
|           OS: '' | |||
|         }, | |||
|         { | |||
|           name: '神经纤维层', | |||
|           isSelect: false, | |||
|           OD: '', | |||
|           OS: '' | |||
|         }, | |||
|         { | |||
|           name: '动态房角镜', | |||
|           isSelect: false, | |||
|           OD: '', | |||
|           OS: '' | |||
|         }, | |||
|         { | |||
|           name: '静态房角镜', | |||
|           isSelect: false, | |||
|           OD: '', | |||
|           OS: '' | |||
|         } | |||
|       ], | |||
|       diaMeasures: [ | |||
|         { | |||
|           placeholder: '降压用药', | |||
|           cure: '' | |||
|         }, | |||
|         { | |||
|           placeholder: '手术', | |||
|           cure: '' | |||
|         }, | |||
|         { | |||
|           placeholder: '激光', | |||
|           cure: '' | |||
|         } | |||
|       ] | |||
|     } | |||
|   }, | |||
|   watch: { | |||
|     jsonText(val) { | |||
|       if (val) { | |||
|         const data = JSON.parse(this.jsonText) | |||
|         this.patientData = data.patientData | |||
|         this.checks = data.checks | |||
|         this.slitChecks = data.slitChecks | |||
|         this.diaMeasures = data.diaMeasures | |||
|       } else { | |||
|         this.patientData = this.initData.patientData | |||
|         this.checks = this.initData.checks | |||
|         this.slitChecks = this.initData.slitChecks | |||
|         this.diaMeasures = this.initData.diaMeasures | |||
|       } | |||
|     } | |||
|   }, | |||
|   created() { | |||
|     // 初始化赋空 | |||
|     const data = { | |||
|       patientData: this.patientData, | |||
|       checks: this.checks, | |||
|       slitChecks: this.slitChecks, | |||
|       diaMeasures: this.diaMeasures | |||
|     } | |||
|     this.initData = JSON.parse(JSON.stringify(data)) | |||
|     // 赋值 | |||
|     if (this.jsonText) { | |||
|       const data = JSON.parse(this.jsonText) | |||
|       this.patientData = data.patientData | |||
|       this.checks = data.checks | |||
|       this.slitChecks = data.slitChecks | |||
|       this.diaMeasures = data.diaMeasures | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     addOrUpdateHandle() { | |||
|       const jsonText = JSON.stringify({ | |||
|         patientData: this.patientData, | |||
|         checks: this.checks, | |||
|         slitChecks: this.slitChecks, | |||
|         diaMeasures: this.diaMeasures | |||
|       }) | |||
|       const dataForm = { | |||
|         id: this.followId, | |||
|         flag: '7', | |||
|         name: '门诊随访', | |||
|         patientId: this.patientId, | |||
|         platform: this.platform, | |||
|         updateTime: this.$moment().format('YYYY-MM-DD HH:mm:ss') | |||
|       } | |||
|       const params = { | |||
|         jsonText: jsonText, | |||
|         ...dataForm | |||
|       } | |||
|       return this.$http.post('/case/update', params) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss" scoped> | |||
| .flex{ | |||
|   display: flex; | |||
| } | |||
| table{ | |||
|   width: 100%; | |||
|   margin-top: 20px; | |||
|   .table_title{ | |||
|     font-size: 22px !important; | |||
|   } | |||
|   tr td{ | |||
|     border: 1px solid #ccc; | |||
|     text-align: center; | |||
|     padding: 10px; | |||
|   } | |||
| } | |||
| ::v-deep .el-input__inner { | |||
|   border: none; | |||
|   height: 26px !important; | |||
|   line-height: 26px !important; | |||
|   text-align: center; | |||
| } | |||
| 
 | |||
| ::v-deep .el-input__inner { | |||
|   border-bottom: 1px solid #ccc; | |||
|   border-radius: 0; | |||
|   padding: 0; | |||
| } | |||
| ::v-deep .el-input__prefix { | |||
|   display: none; | |||
| } | |||
| .content_input{ | |||
|   ::v-deep .el-input__inner{ | |||
|     width: 150px; | |||
|   } | |||
| } | |||
| </style> | |||
| @ -0,0 +1,212 @@ | |||
| <template> | |||
|   <table> | |||
|     <tbody> | |||
|       <tr> | |||
|         <td rowspan="2" style="width: 30%" /> | |||
|         <td class="table_title" colspan="2">翔安医院</td> | |||
|       </tr> | |||
|       <tr> | |||
|         <td colspan="2">个案管理信息表</td> | |||
|       </tr> | |||
|       <tr><td colspan="3" style="font-weight: bold">电话随访记录</td></tr> | |||
|       <tr> | |||
|         <td colspan="3"> | |||
|           <div class="flex a-c"> | |||
|             <div class="flex a-c"> | |||
|               随访日期:<el-date-picker | |||
|                 v-model="followData.followDate" | |||
|                 type="date" | |||
|               /> | |||
|             </div> | |||
|             <div class="flex a-c">上次复查注意事项:<el-input v-model="followData.followDesc" style="flex: 1" /></div> | |||
|           </div> | |||
|         </td> | |||
|       </tr> | |||
|       <tr> | |||
|         <td colspan="3"> | |||
|           <div class="flex a-c"> | |||
|             主诉:<el-input v-model="followData.mainSuit" style="flex: 1" /> | |||
|           </div></td> | |||
|       </tr> | |||
|       <tr> | |||
|         <td colspan="3"> | |||
|           <div class="flex a-c"> | |||
|             诊断:眼别:<el-input v-model="followData.eyeLevel" style="flex: 1;margin-right: 15px" /> | |||
|             疾病诊断:<el-input v-model="followData.diagnose" style="flex: 1;margin-right: 15px" /> | |||
|             后缀:<el-input v-model="followData.suffix" style="flex: 1" /> | |||
|           </div> | |||
|         </td> | |||
|       </tr> | |||
|       <!--      常规检查--> | |||
|       <tr> | |||
|         <td colspan="3">常规检查</td> | |||
|       </tr> | |||
|       <tr> | |||
|         <td>检查内容</td> | |||
|         <td>OD</td> | |||
|         <td>OS</td> | |||
|       </tr> | |||
|       <tr> | |||
|         <td>视力</td> | |||
|         <td><el-input v-model="followData.OD.vision" style="flex: 1" /></td> | |||
|         <td><el-input v-model="followData.OD.pressure" style="flex: 1" /></td> | |||
|       </tr> | |||
|       <tr> | |||
|         <td>眼压</td> | |||
|         <td><el-input v-model="followData.OS.vision" style="flex: 1" /></td> | |||
|         <td><el-input v-model="followData.OS.pressure" style="flex: 1" /></td> | |||
|       </tr> | |||
|       <!--      处理选择--> | |||
|       <tr> | |||
|         <td colspan="3"> | |||
|           处理选择: | |||
|           <el-radio v-model="followData.selection" label="again">继续随访</el-radio> | |||
|           <el-radio v-model="followData.selection" label="add">加药</el-radio> | |||
|           <el-radio v-model="followData.selection" label="sub">减药</el-radio> | |||
|           <el-radio v-model="followData.selection" label="goin">预约入院手术</el-radio> | |||
|         </td> | |||
|       </tr> | |||
|       <!--      用药--> | |||
|       <tr> | |||
|         <td colspan="3"> | |||
|           <div class="flex a-c">用药:<el-input v-model="followData.pharmacy" style="flex: 1" /></div> | |||
|         </td> | |||
|       </tr> | |||
|       <!--      备注--> | |||
|       <tr> | |||
|         <td colspan="3"> | |||
|           <div class="flex a-c">备注: | |||
|             <el-radio v-model="followData.notes" label="suspicious">可疑进展</el-radio> | |||
|             <el-radio v-model="followData.notes" label="confirm">确认进展</el-radio> | |||
|           </div> | |||
|         </td> | |||
|       </tr> | |||
|       <!--    复查备注--> | |||
|       <tr> | |||
|         <td colspan="3"> | |||
|           <div class="flex a-c">复查备注(计划): | |||
|             <el-radio v-model="followData.schedule" label="onSchedule">按计划随访</el-radio> | |||
|             <div style="width: 180px"><el-input v-model="followData.period" style="flex: 1" placeholder="请输入周期" /></div> | |||
|             <el-radio v-model="followData.periodCircle" label="week">周</el-radio> | |||
|             <el-radio v-model="followData.periodCircle" label="month">月</el-radio> | |||
|           </div> | |||
|         </td> | |||
|       </tr> | |||
|     </tbody> | |||
|   </table> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| export default { | |||
|   name: 'PhoneFollow', | |||
|   props: { | |||
|     followId: { | |||
|       type: String, | |||
|       default: '' | |||
|     }, | |||
|     jsonText: { | |||
|       type: String, | |||
|       default: '' | |||
|     } | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       initData: {}, | |||
|       followData: { | |||
|         followDate: '', | |||
|         followDesc: '', | |||
|         mainSuit: '', | |||
|         eyeLevel: '', | |||
|         diagnose: '', // 疾病诊断 | |||
|         suffix: '', // 后缀 | |||
|         OD: { | |||
|           vision: '', | |||
|           pressure: '' | |||
|         }, | |||
|         OS: { | |||
|           vision: '', | |||
|           pressure: '' | |||
|         }, | |||
|         selection: '', // 处理选择 | |||
|         pharmacy: '', | |||
|         notes: '', // 备注 | |||
|         schedule: '', | |||
|         period: '', // 周期 | |||
|         periodCircle: '' // 周期单选 | |||
|       } | |||
|     } | |||
|   }, | |||
|   watch: { | |||
|     jsonText(val) { | |||
|       if (val) { | |||
|         this.followData = JSON.parse(this.jsonText) | |||
|       } else { | |||
|         this.followData = this.initData | |||
|       } | |||
|     } | |||
|   }, | |||
|   created() { | |||
|     this.initData = JSON.parse(JSON.stringify(this.followData)) | |||
|     if (this.jsonText) { | |||
|       this.followData = JSON.parse(this.jsonText) | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     addOrUpdateHandle() { | |||
|       const jsonText = JSON.stringify({ | |||
|         ...this.followData | |||
|       }) | |||
|       const dataForm = { | |||
|         flag: '7', | |||
|         name: '电话随访', | |||
|         patientId: this.patientId, | |||
|         platform: this.platform, | |||
|         id: this.followId, | |||
|         updateTime: this.$moment().format('YYYY-MM-DD HH:mm:ss') | |||
|       } | |||
|       const params = { | |||
|         jsonText: jsonText, | |||
|         ...dataForm | |||
|       } | |||
|       return this.$http.post('/case/update', params) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss" scoped> | |||
| .flex{ | |||
|   display: flex; | |||
| } | |||
| .a-c{ | |||
|   align-items: center; | |||
| } | |||
| table{ | |||
|   width: 100%; | |||
|   margin-top: 20px; | |||
|   font-size: 16px; | |||
|   .table_title{ | |||
|     font-size: 22px !important; | |||
|   } | |||
|   tr td{ | |||
|     border: 1px solid #ccc; | |||
|     text-align: center; | |||
|     padding: 10px; | |||
|   } | |||
| } | |||
| ::v-deep .el-input__inner { | |||
|   border: none; | |||
|   height: 26px !important; | |||
|   line-height: 26px !important; | |||
|   text-align: center; | |||
| } | |||
| 
 | |||
| ::v-deep .el-input__inner { | |||
|   border-bottom: 1px solid #ccc; | |||
|   border-radius: 0; | |||
|   padding: 0; | |||
| } | |||
| ::v-deep .el-input__prefix { | |||
|   display: none; | |||
| } | |||
| </style> | |||
| @ -1,117 +1,118 @@ | |||
| // system入口
 | |||
| import Vue from 'vue' | |||
| import Element from 'element-ui' | |||
| // import 'lib-flexible/flexible'
 | |||
| import App from './App.vue' | |||
| import router from './router' | |||
| import store from './store' | |||
| import http from './utils/request' | |||
| import jQuery from 'jquery' | |||
| import 'element-ui/lib/theme-chalk/index.css' | |||
| import '@/icons' | |||
| import '@/assets/scss/aui.scss' | |||
| import '@/assets/scss/reset.scss' | |||
| import i18n from '@/i18n' | |||
| import * as filters from '@/filters' | |||
| import renRadioGroup from '@/components/ren-radio-group' | |||
| import renDeptTree from '@/components/ren-dept-tree' | |||
| import { hasPermission, getDictLabel } from '@/utils' | |||
| import cloneDeep from 'lodash/cloneDeep' | |||
| import 'xe-utils' | |||
| import VXETable from 'vxe-table' | |||
| import 'vxe-table/lib/index.css' | |||
| // import echarts from 'echarts'
 | |||
| import * as echarts from 'echarts' | |||
| import moment from 'moment' | |||
| import VueChatScroll from 'vue-chat-scroll' | |||
| 
 | |||
| // import jsNSV from '@/utils/js-NSV.js'
 | |||
| 
 | |||
| import Base64 from '@/utils/base64.js' | |||
| Vue.prototype.$Base64 = Base64 | |||
| 
 | |||
| import Print from 'vue-print-nb' | |||
| Vue.use(Print) | |||
| 
 | |||
| import { confirm } from '@/utils/confirm' | |||
| Vue.prototype.$confirmFun = confirm | |||
| 
 | |||
| // import VueDragResize from 'vue-drag-resize'
 | |||
| // Vue.component('vue-drag-resize', VueDragResize)
 | |||
| 
 | |||
| // 裁切工具
 | |||
| import VueCropper from 'vue-cropper' | |||
| Vue.use(VueCropper) | |||
| 
 | |||
| import Recorder from 'js-audio-recorder' | |||
| const recorder = new Recorder({ | |||
|   sampleBits: 16, // 采样位数,支持 8 或 16,默认是16
 | |||
|   sampleRate: 16000, // 采样率,支持 11025、16000、22050、24000、44100、48000,根据浏览器默认值,我的chrome是48000
 | |||
|   numChannels: 1 // 声道,支持 1 或 2, 默认是1
 | |||
| // compiling: false,(0.x版本中生效,1.x增加中)  // 是否边录边转换,默认是false
 | |||
| }) | |||
| Vue.prototype.$recorder = recorder | |||
| 
 | |||
| // 全局监听DOM元素
 | |||
| import ElementResizeDetectorMaker from 'element-resize-detector' | |||
| Vue.prototype.$erd = ElementResizeDetectorMaker() | |||
| 
 | |||
| import animejs from 'animejs' | |||
| Vue.prototype.$anime = animejs | |||
| 
 | |||
| moment.locale('zh-cn') // 设置语言 或 moment.lang('zh-cn');
 | |||
| 
 | |||
| Vue.use(Element, { | |||
|   size: 'default', | |||
|   i18n: (key, value) => i18n.t(key, value) | |||
| }) | |||
| 
 | |||
| Object.keys(filters).forEach(key => { | |||
|   Vue.filter(key, filters[key]) | |||
| }) | |||
| 
 | |||
| // 全局组件
 | |||
| Vue.use(renRadioGroup) | |||
| Vue.use(renDeptTree) | |||
| Vue.use(VueChatScroll) | |||
| Vue.use(VXETable) | |||
| 
 | |||
| // DICOM
 | |||
| import cornerstone from 'cornerstone-core' | |||
| import cornerstoneMath from 'cornerstone-math' | |||
| import cornerstoneTools from 'cornerstone-tools' | |||
| import Hammer from 'hammerjs' | |||
| import dicomParser from 'dicom-parser' | |||
| import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader' | |||
| import cornerstoneWebImageLoader from 'cornerstone-web-image-loader' | |||
| 
 | |||
| cornerstoneTools.external.cornerstone = cornerstone | |||
| cornerstoneTools.external.Hammer = Hammer | |||
| cornerstoneTools.external.cornerstoneMath = cornerstoneMath | |||
| cornerstoneWADOImageLoader.external.dicomParser = dicomParser | |||
| cornerstoneWADOImageLoader.external.cornerstoneMath = cornerstoneMath | |||
| cornerstoneWADOImageLoader.external.cornerstone = cornerstone | |||
| cornerstoneWebImageLoader.external.cornerstone = cornerstone | |||
| cornerstone.registerImageLoader('http', cornerstoneWADOImageLoader.loadImage) | |||
| cornerstone.registerImageLoader('https', cornerstoneWADOImageLoader.loadImage) | |||
| cornerstone.registerImageLoader('http', cornerstoneWebImageLoader.loadImage) | |||
| Vue.prototype.$cornerstone = cornerstone | |||
| Vue.prototype.$cornerstoneTools = cornerstoneTools | |||
| 
 | |||
| // 挂载全局
 | |||
| Vue.prototype.$http = http | |||
| Vue.prototype.$ = jQuery | |||
| Vue.prototype.$hasPermission = hasPermission | |||
| Vue.prototype.$getDictLabel = getDictLabel | |||
| Vue.prototype.$moment = moment | |||
| Vue.prototype.$echarts = echarts | |||
| 
 | |||
| Vue.config.productionTip = false | |||
| // 保存整站vuex本地储存初始状态
 | |||
| window.SITE_CONFIG.storeState = cloneDeep(store.state) | |||
| new Vue({ | |||
|   i18n, | |||
|   router, | |||
|   store, | |||
|   render: h => h(App) | |||
| }).$mount('#app') | |||
| // system入口
 | |||
| import Vue from "vue"; | |||
| import Element from "element-ui"; | |||
| // import 'lib-flexible/flexible'
 | |||
| import App from "./App.vue"; | |||
| import router from "./router"; | |||
| import store from "./store"; | |||
| import http from "./utils/request"; | |||
| import jQuery from "jquery"; | |||
| import "element-ui/lib/theme-chalk/index.css"; | |||
| import "@/icons"; | |||
| import "@/assets/scss/aui.scss"; | |||
| import "@/assets/scss/reset.scss"; | |||
| import i18n from "@/i18n"; | |||
| import * as filters from "@/filters"; | |||
| import renRadioGroup from "@/components/ren-radio-group"; | |||
| import renDeptTree from "@/components/ren-dept-tree"; | |||
| import { hasPermission, getDictLabel } from "@/utils"; | |||
| import cloneDeep from "lodash/cloneDeep"; | |||
| import "xe-utils"; | |||
| import VXETable from "vxe-table"; | |||
| import "vxe-table/lib/index.css"; | |||
| // import echarts from 'echarts'
 | |||
| import * as echarts from "echarts"; | |||
| import moment from "moment"; | |||
| import VueChatScroll from "vue-chat-scroll"; | |||
| import "default-passive-events"; | |||
| 
 | |||
| // import jsNSV from '@/utils/js-NSV.js'
 | |||
| 
 | |||
| import Base64 from "@/utils/base64.js"; | |||
| Vue.prototype.$Base64 = Base64; | |||
| 
 | |||
| import Print from "vue-print-nb"; | |||
| Vue.use(Print); | |||
| 
 | |||
| import { confirm } from "@/utils/confirm"; | |||
| Vue.prototype.$confirmFun = confirm; | |||
| 
 | |||
| // import VueDragResize from 'vue-drag-resize'
 | |||
| // Vue.component('vue-drag-resize', VueDragResize)
 | |||
| 
 | |||
| // 裁切工具
 | |||
| import VueCropper from "vue-cropper"; | |||
| Vue.use(VueCropper); | |||
| 
 | |||
| import Recorder from "js-audio-recorder"; | |||
| const recorder = new Recorder({ | |||
|   sampleBits: 16, // 采样位数,支持 8 或 16,默认是16
 | |||
|   sampleRate: 16000, // 采样率,支持 11025、16000、22050、24000、44100、48000,根据浏览器默认值,我的chrome是48000
 | |||
|   numChannels: 1, // 声道,支持 1 或 2, 默认是1
 | |||
|   // compiling: false,(0.x版本中生效,1.x增加中)  // 是否边录边转换,默认是false
 | |||
| }); | |||
| Vue.prototype.$recorder = recorder; | |||
| 
 | |||
| // 全局监听DOM元素
 | |||
| import ElementResizeDetectorMaker from "element-resize-detector"; | |||
| Vue.prototype.$erd = ElementResizeDetectorMaker(); | |||
| 
 | |||
| import animejs from "animejs"; | |||
| Vue.prototype.$anime = animejs; | |||
| 
 | |||
| moment.locale("zh-cn"); // 设置语言 或 moment.lang('zh-cn');
 | |||
| 
 | |||
| Vue.use(Element, { | |||
|   size: "default", | |||
|   i18n: (key, value) => i18n.t(key, value), | |||
| }); | |||
| 
 | |||
| Object.keys(filters).forEach((key) => { | |||
|   Vue.filter(key, filters[key]); | |||
| }); | |||
| 
 | |||
| // 全局组件
 | |||
| Vue.use(renRadioGroup); | |||
| Vue.use(renDeptTree); | |||
| Vue.use(VueChatScroll); | |||
| Vue.use(VXETable); | |||
| 
 | |||
| // DICOM
 | |||
| import cornerstone from "cornerstone-core"; | |||
| import cornerstoneMath from "cornerstone-math"; | |||
| import cornerstoneTools from "cornerstone-tools"; | |||
| import Hammer from "hammerjs"; | |||
| import dicomParser from "dicom-parser"; | |||
| import cornerstoneWADOImageLoader from "cornerstone-wado-image-loader"; | |||
| import cornerstoneWebImageLoader from "cornerstone-web-image-loader"; | |||
| 
 | |||
| cornerstoneTools.external.cornerstone = cornerstone; | |||
| cornerstoneTools.external.Hammer = Hammer; | |||
| cornerstoneTools.external.cornerstoneMath = cornerstoneMath; | |||
| cornerstoneWADOImageLoader.external.dicomParser = dicomParser; | |||
| cornerstoneWADOImageLoader.external.cornerstoneMath = cornerstoneMath; | |||
| cornerstoneWADOImageLoader.external.cornerstone = cornerstone; | |||
| cornerstoneWebImageLoader.external.cornerstone = cornerstone; | |||
| cornerstone.registerImageLoader("http", cornerstoneWADOImageLoader.loadImage); | |||
| cornerstone.registerImageLoader("https", cornerstoneWADOImageLoader.loadImage); | |||
| cornerstone.registerImageLoader("http", cornerstoneWebImageLoader.loadImage); | |||
| Vue.prototype.$cornerstone = cornerstone; | |||
| Vue.prototype.$cornerstoneTools = cornerstoneTools; | |||
| 
 | |||
| // 挂载全局
 | |||
| Vue.prototype.$http = http; | |||
| Vue.prototype.$ = jQuery; | |||
| Vue.prototype.$hasPermission = hasPermission; | |||
| Vue.prototype.$getDictLabel = getDictLabel; | |||
| Vue.prototype.$moment = moment; | |||
| Vue.prototype.$echarts = echarts; | |||
| 
 | |||
| Vue.config.productionTip = false; | |||
| // 保存整站vuex本地储存初始状态
 | |||
| window.SITE_CONFIG.storeState = cloneDeep(store.state); | |||
| new Vue({ | |||
|   i18n, | |||
|   router, | |||
|   store, | |||
|   render: (h) => h(App), | |||
| }).$mount("#app"); | |||
|  | |||
| @ -1,352 +1,410 @@ | |||
| import Vue from 'vue' | |||
| import Router from 'vue-router' | |||
| import http from '../utils/request' | |||
| import { isURL } from '@/utils/validate' | |||
| import Cookies from 'js-cookie' | |||
| 
 | |||
| Vue.use(Router) | |||
| 
 | |||
| // 解决Vue-Router升级导致的Uncaught(in promise) navigation guard问题----------
 | |||
| const originalPush = Router.prototype.push | |||
| Router.prototype.push = function push(location, onResolve, onReject) { | |||
|   if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject) | |||
|   return originalPush.call(this, location).catch(err => err) | |||
| } | |||
| // 解决Vue-Router升级导致的Uncaught(in promise) navigation guard问题----------
 | |||
| 
 | |||
| // 页面路由(独立页面)
 | |||
| export const pageRoutes = [ | |||
|   { | |||
|     path: '/404', | |||
|     component: () => import('@/page-subspecialty/views/pages/404'), | |||
|     name: '404', | |||
|     meta: { title: '404未找到' }, | |||
|     beforeEnter(to, from, next) { | |||
|       // 拦截处理特殊业务场景
 | |||
|       // 如果, 重定向路由包含__双下划线, 为临时添加路由
 | |||
|       if (/__.*/.test(to.redirectedFrom)) { | |||
|         return next(to.redirectedFrom.replace(/__.*/, '')) | |||
|       } | |||
|       next() | |||
|     } | |||
|   }, | |||
|   { | |||
|     path: '/login', | |||
|     component: () => import('@/page-subspecialty/views/pages/login'), | |||
|     name: 'login', | |||
|     meta: { title: '登录' } | |||
|   }, | |||
|   // 录音
 | |||
|   { | |||
|     path: '/luyin', | |||
|     name: 'luyin', | |||
|     component: () => import('@/page-subspecialty/views/pages/luyin') | |||
|   }, | |||
|   // 日程安排
 | |||
|   { | |||
|     path: '/schedule', | |||
|     name: 'schedule', | |||
|     component: () => import('@/page-subspecialty/views/pages/schedule') | |||
|   }, | |||
|   { | |||
|     path: '/question', | |||
|     name: 'question', | |||
|     component: () => import('@/page-subspecialty/views/pages/question') | |||
|   }, | |||
|   { | |||
|     path: '/satusScreen', | |||
|     name: 'satusScreen', | |||
|     component: () => import('@/page-subspecialty/views/pages/satusScreen') | |||
|   }, | |||
|   { | |||
|     path: '/imageEdit', | |||
|     name: 'imageEdit', | |||
|     component: () => import('@/page-subspecialty/views/pages/imageEdit') | |||
|   }, | |||
|   { | |||
|     path: '/articleContent', | |||
|     name: 'articleContent', | |||
|     component: () => import('@/page-subspecialty/views/modules/articleManagement/articleContent') | |||
|   }, | |||
|   { | |||
|     path: '/transfer', | |||
|     name: 'transfer', | |||
|     component: () => import('@/page-subspecialty/views/pages/transfer') | |||
|   } | |||
| ] | |||
| 
 | |||
| // 模块路由(基于主入口布局页面)*8
 | |||
| export const moduleRoutes = { | |||
|   path: '/', | |||
|   component: () => import('@/page-subspecialty/views/main'), | |||
|   name: 'main', | |||
|   redirect: { name: 'patientManagement' }, | |||
|   meta: { title: '首页' }, | |||
|   children: [ | |||
|     { | |||
|       path: '/patientManagement', | |||
|       component: () => import('@/page-subspecialty/views/modules/patientManagement/index'), | |||
|       name: 'patientManagement', | |||
|       meta: { title: '分诊管理', isTab: true } | |||
|     }, | |||
|     { | |||
|       path: '/patientDetail', | |||
|       component: () => import('@/page-subspecialty/views/modules/patientDetail'), | |||
|       name: 'patientDetail', | |||
|       meta: { title: '档案管理', isTab: true } | |||
|     }, | |||
|     // ok镜
 | |||
|     { | |||
|       path: '/patientInfo', | |||
|       name: 'patientInfo', | |||
|       meta: { title: '详情', isTab: true }, | |||
|       component: () => import('@/page-subspecialty/views/modules/optometryManagement/seeDoctor/index') | |||
|     }, | |||
|     { | |||
|       path: '/iframe', | |||
|       component: null, | |||
|       name: 'iframe', | |||
|       meta: { title: 'iframe', isTab: true } | |||
|     }, | |||
|     { | |||
|       path: '/redirect', | |||
|       name: 'redirect', | |||
|       component: () => import('@/page-subspecialty/views/redirect') | |||
|     } | |||
|   ] | |||
| } | |||
| 
 | |||
| export function addDynamicRoute(routeParams, router) { | |||
|   // 组装路由名称, 并判断是否已添加, 如是: 则直接跳转
 | |||
|   var routeName = routeParams.routeName | |||
|   var dynamicRoute = window.SITE_CONFIG['dynamicRoutes'].filter(item => item.name === routeName)[0] | |||
|   if (dynamicRoute) { | |||
|     return router.push({ name: routeName, params: routeParams.params }) | |||
|   } | |||
|   // 否则: 添加并全局变量保存, 再跳转
 | |||
|   dynamicRoute = { | |||
|     path: routeName, | |||
|     component: () => Promise.resolve(require(`@/page-subspecialty/views/modules/${routeParams.path}`).default), | |||
|     // component: () => import(`@/views/modules/${routeParams.path}`),
 | |||
|     name: routeName, | |||
|     meta: { | |||
|       ...window.SITE_CONFIG['contentTabDefault'], | |||
|       menuId: routeParams.menuId, | |||
|       title: `${routeParams.title}` | |||
|     } | |||
|   } | |||
|   router.addRoutes([ | |||
|     { | |||
|       ...moduleRoutes, | |||
|       name: `main-dynamic__${dynamicRoute.name}`, | |||
|       children: [dynamicRoute] | |||
|     } | |||
|   ]) | |||
|   window.SITE_CONFIG['dynamicRoutes'].push(dynamicRoute) | |||
|   router.push({ name: dynamicRoute.name, params: routeParams.params }) | |||
| } | |||
| 
 | |||
| const createRouter = () => new Router({ | |||
|   mode: 'history', | |||
|   scrollBehavior: () => ({ y: 0 }), | |||
|   routes: pageRoutes.concat(moduleRoutes) | |||
| }) | |||
| const router = createRouter() | |||
| 
 | |||
| // [vue-router] Duplicate named routes definition 重复的命名路由定义
 | |||
| // 动态路由退出再登录会出现警告重复路由
 | |||
| // 解决方案:在退出时调用resetRouter()方法
 | |||
| export function resetRouter() { | |||
|   const newRouter = createRouter() | |||
|   router.matcher = newRouter.matcher // reset router
 | |||
| } | |||
| 
 | |||
| router.beforeEach((to, from, next) => { | |||
|   // 添加动态(菜单)路由
 | |||
|   // 已添加或者当前路由为页面路由, 可直接访问
 | |||
|   if (window.SITE_CONFIG['dynamicMenuRoutesHasAdded'] || fnCurrentRouteIsPageRoute(to, pageRoutes)) { | |||
|     return next() | |||
|   } | |||
|   if (to.path === from.path) { | |||
|     return | |||
|   } | |||
|   if (to.name === 'login' || to.path === '/login' || to.path === 'satusScreen' || to.name === 'satusScreen') { | |||
|     next() | |||
|   } else { | |||
|     // 获取字典列表, 添加并全局变量保存
 | |||
|     // http.get('/sys/dict/type/all').then(({ data: res }) => {
 | |||
|     //   if (res.code !== 0) {
 | |||
|     //     return
 | |||
|     //   }
 | |||
|     //   window.SITE_CONFIG['dictList'] = res.data
 | |||
|     // }).catch(() => {})
 | |||
| 
 | |||
|     // 获取左侧菜单列表,添加并全局变量保存
 | |||
|     http.get('/sys/menu/nav').then(({ data: res }) => { | |||
|       if (res.code !== 0) { | |||
|         Vue.prototype.$message.error(res.msg) | |||
|         return next({ name: 'login' }) | |||
|       } | |||
|       window.SITE_CONFIG['menuList'] = res.data | |||
|     }).catch(() => { | |||
|       return next({ name: 'login' }) | |||
|     }) | |||
| 
 | |||
|     // 获取菜单管理菜单列表,并添加动态路由
 | |||
|     http.get('/sys/menu/list', { | |||
|       params: { | |||
|         type: 0 | |||
|       } | |||
|     }).then(({ data: res }) => { | |||
|       if (res.code !== 0) { | |||
|         Vue.prototype.$message.error(res.msg) | |||
|         return next({ name: 'login' }) | |||
|       } | |||
|       // window.SITE_CONFIG['menuList'] = res.data
 | |||
|       const menuListChild = res.data.filter(item => item.children.length > 0) | |||
|       // console.log(menuListChild)
 | |||
|       fnAddDynamicMenuRoutes(JSON.parse(JSON.stringify(res.data)), menuListChild.length) | |||
| 
 | |||
|       next({ ...to, replace: true }) | |||
|     }).catch(() => { | |||
|       // console.log(123)
 | |||
|       return next({ name: 'login' }) | |||
|     }) | |||
|     // 获取【字段字典表】, 添加并全局变量保存
 | |||
|     // http.get('/sys/table/dict/getList', { params: { type: 1 }}).then(({ data: res }) => {
 | |||
|     //   window.SITE_CONFIG['dict_colSearch'] = res.data
 | |||
|     // })
 | |||
|     getInitData() | |||
|   } | |||
| }) | |||
| function getInitData() { | |||
|   // 获取字典列表, 添加并全局变量保存
 | |||
|   // http.get('/sys/dict/type/all').then(({ data: res }) => {
 | |||
|   //   if (res.code !== 0) { return }
 | |||
|   //   window.SITE_CONFIG['dictList'] = res.data
 | |||
|   // })
 | |||
| 
 | |||
|   // 获取【字段字典表】, 添加并全局变量保存
 | |||
|   http.get('/table/dict/optionsColumn').then(({ data: res }) => { | |||
|     window.SITE_CONFIG['dict_colAll'] = res.data | |||
|   }) | |||
| 
 | |||
|   // 获取【字段字典表】, 添加并全局变量保存
 | |||
|   http.get('/table/dict/optionsColumn', { params: { type: 1 }}).then(({ data: res }) => { | |||
|     window.SITE_CONFIG['dict_colSearch'] = res.data | |||
|   }) | |||
| 
 | |||
|   // 获取【字段字典表】, 添加并全局变量保存
 | |||
|   http.get('/table/dict/optionsColumn', { params: { type: 2 }}).then(({ data: res }) => { | |||
|     window.SITE_CONFIG['dict_colChart'] = res.data | |||
|   }) | |||
| 
 | |||
|   // 获取【字段字典表】, 添加并全局变量保存
 | |||
|   http.get('/table/dict/optionsColumn', { params: { type: 3 }}).then(({ data: res }) => { | |||
|     window.SITE_CONFIG['dict_colCrf'] = res.data | |||
|   }) | |||
| 
 | |||
|   // 获取【字段字典表】, 添加并全局变量保存
 | |||
|   http.get('/table/dict/optionsColumn', { params: { type: 4 }}).then(({ data: res }) => { | |||
|     window.SITE_CONFIG['dict_colExport'] = res.data | |||
|   }) | |||
| 
 | |||
|   // 获取【检查项目字典】, 添加并全局变量保存
 | |||
|   // http.get('/table/dict/examItem').then(({ data: res }) => {
 | |||
|   //   sortChinese(res.data, 'itemName')
 | |||
|   //   window.SITE_CONFIG['dict_examItem'] = res.data
 | |||
|   // })
 | |||
| 
 | |||
|   // 获取【设备信息字典】, 添加并全局变量保存
 | |||
|   // http.get('/device/getData2RelDeviceList').then(({ data: res }) => {
 | |||
|   //   window.SITE_CONFIG['dict_device'] = res.data
 | |||
|   // })
 | |||
| 
 | |||
|   // 获取【设备与检查项目字典】, 添加并全局变量保存
 | |||
|   // http.get('/device/getData2RelDeviceItemList').then(({ data: res }) => {
 | |||
|   //   window.SITE_CONFIG['dict_device_item'] = res.data
 | |||
|   // })
 | |||
| } | |||
| /** | |||
|  * 判断当前路由是否为页面路由 | |||
|  * @param {*} route 当前路由 | |||
|  * @param {*} pageRoutes 页面路由 | |||
|  */ | |||
| function fnCurrentRouteIsPageRoute(route, pageRoutes = []) { | |||
|   var temp = [] | |||
|   for (var i = 0; i < pageRoutes.length; i++) { | |||
|     if (route.path === pageRoutes[i].path) { | |||
|       return true | |||
|     } | |||
|     if (pageRoutes[i].children && pageRoutes[i].children.length >= 1) { | |||
|       temp = temp.concat(pageRoutes[i].children) | |||
|     } | |||
|   } | |||
|   return temp.length >= 1 ? fnCurrentRouteIsPageRoute(route, temp) : false | |||
| } | |||
| 
 | |||
| /** | |||
|  * 添加动态(菜单)路由 | |||
|  * PH:自上而下遍历,累积平铺 | |||
|  * @param {*} menuList 菜单列表 | |||
|  * @param {*} routes 递归创建的动态(菜单)路由 | |||
|  */ | |||
| function fnAddDynamicMenuRoutes(menuList = [], menuListChildLength, routes = []) { | |||
|   let index = 0 | |||
|   // console.log(menuList)
 | |||
|   menuList.forEach((item, i) => { | |||
|     // eslint-disable-next-line
 | |||
|     let URL = (item.url || '').replace(/{{([^}}]+)?}}/g, (s1, s2) => eval(s2)) // URL支持{{ window.xxx }}占位符变量
 | |||
|     item['meta'] = { | |||
|       ...window.SITE_CONFIG['contentTabDefault'], | |||
|       menuId: item.id, | |||
|       title: item.name | |||
|     } | |||
|     if (isURL(URL)) { | |||
|       item['path'] = item['name'] = `i-${item.id}` | |||
|       item['meta'].push({ | |||
|         iframeURL: URL | |||
|       }) | |||
|     } else { | |||
|       // console.log(URL)
 | |||
|       URL = URL.replace(/^\//, '').replace(/_/g, '-') | |||
|       item['path'] = '/' + URL.replace(/\//g, '-') | |||
|       item['name'] = URL.replace(/\//g, '-') | |||
|       // 坑!!!父级也必须要有component,父级要有自己的vue组件,父级路由必须有<router-view />占位符
 | |||
|       // 其孩子children才能展示出来,孩子展示在父级占位符的地方
 | |||
|       URL.includes('seeDoctor') ? URL = 'seeDoctor' : '' // 不同父级有相同子级seeDoctor,防止面包屑冲突,动态路由名字区分设置为seeDoctor、seeDoctorOne,在寻找组件时替换回seeDoctor,可以找到对应组件路径
 | |||
|       item['component'] = () => Promise.resolve(require(`@/page-subspecialty/views/modules/${URL}`).default) | |||
|       // 如果是父级给父级添加重定向到子菜单第一项
 | |||
|       if (item.children.length > 0 && item.children[0].url) { | |||
|         // console.log(item)
 | |||
|         // isShow:0显示不菜单 1显示菜单
 | |||
|         item.children[0].isShow === 0 ? '' : item['redirect'] = '/' + item.children[0].url.replace(/\//g, '-') | |||
|       } | |||
|     } | |||
|     if (item.children.length > 0) { | |||
|       index++ | |||
|       fnAddDynamicMenuRoutes(item.children) | |||
|     } | |||
|   }) | |||
|   // routes = menuList
 | |||
|   // console.log(routes)
 | |||
|   // 此处一定要加判断,因为此方法在递归,要等到递归完成后再执行下面的内容
 | |||
|   // 坑!!!如果不加此判断,this.$route.matched面包屑的父级就不会展示
 | |||
|   if (menuListChildLength === index) { | |||
|     routes = menuList | |||
|     // PH:底层调用一次
 | |||
|     // 添加路由
 | |||
|     router.addRoutes([ | |||
|       { | |||
|         ...moduleRoutes, | |||
|         name: 'main-dynamic-menu', | |||
|         children: [...routes] | |||
|       }, | |||
|       { path: '*', redirect: { name: '404' }} | |||
|     ]) | |||
|     // console.log('----------------------')
 | |||
|     window.SITE_CONFIG['dynamicMenuRoutes'] = routes | |||
|     window.SITE_CONFIG['dynamicMenuRoutesHasAdded'] = true | |||
|   } | |||
| } | |||
| export default router | |||
| import Vue from "vue"; | |||
| import Router from "vue-router"; | |||
| import http from "../utils/request"; | |||
| import { isURL } from "@/utils/validate"; | |||
| import Cookies from "js-cookie"; | |||
| 
 | |||
| Vue.use(Router); | |||
| 
 | |||
| // 解决Vue-Router升级导致的Uncaught(in promise) navigation guard问题----------
 | |||
| const originalPush = Router.prototype.push; | |||
| Router.prototype.push = function push(location, onResolve, onReject) { | |||
|   if (onResolve || onReject) { | |||
|     return originalPush.call(this, location, onResolve, onReject); | |||
|   } | |||
|   return originalPush.call(this, location).catch((err) => err); | |||
| }; | |||
| // 解决Vue-Router升级导致的Uncaught(in promise) navigation guard问题----------
 | |||
| 
 | |||
| // 页面路由(独立页面)
 | |||
| export const pageRoutes = [ | |||
|   { | |||
|     path: "/404", | |||
|     component: () => import("@/page-subspecialty/views/pages/404"), | |||
|     name: "404", | |||
|     meta: { title: "404未找到" }, | |||
|     beforeEnter(to, from, next) { | |||
|       // 拦截处理特殊业务场景
 | |||
|       // 如果, 重定向路由包含__双下划线, 为临时添加路由
 | |||
|       if (/__.*/.test(to.redirectedFrom)) { | |||
|         return next(to.redirectedFrom.replace(/__.*/, "")); | |||
|       } | |||
|       next(); | |||
|     }, | |||
|   }, | |||
|   { | |||
|     path: "/login", | |||
|     component: () => import("@/page-subspecialty/views/pages/login"), | |||
|     name: "login", | |||
|     meta: { title: "登录" }, | |||
|   }, | |||
|   // 录音
 | |||
|   { | |||
|     path: "/luyin", | |||
|     name: "luyin", | |||
|     component: () => import("@/page-subspecialty/views/pages/luyin"), | |||
|   }, | |||
|   // 日程安排
 | |||
|   { | |||
|     path: "/schedule", | |||
|     name: "schedule", | |||
|     component: () => import("@/page-subspecialty/views/pages/schedule"), | |||
|   }, | |||
|   { | |||
|     path: "/question", | |||
|     name: "question", | |||
|     component: () => import("@/page-subspecialty/views/pages/question"), | |||
|   }, | |||
|   { | |||
|     path: "/satusScreen", | |||
|     name: "satusScreen", | |||
|     component: () => import("@/page-subspecialty/views/pages/satusScreen"), | |||
|   }, | |||
|   { | |||
|     path: "/imageEdit", | |||
|     name: "imageEdit", | |||
|     component: () => import("@/page-subspecialty/views/pages/imageEdit"), | |||
|   }, | |||
|   { | |||
|     path: "/articleContent", | |||
|     name: "articleContent", | |||
|     component: () => | |||
|       import( | |||
|         "@/page-subspecialty/views/modules/articleManagement/articleContent" | |||
|       ), | |||
|   }, | |||
|   { | |||
|     path: "/transfer", | |||
|     name: "transfer", | |||
|     component: () => import("@/page-subspecialty/views/pages/transfer"), | |||
|   }, | |||
| ]; | |||
| 
 | |||
| // 模块路由(基于主入口布局页面)*8
 | |||
| export const moduleRoutes = { | |||
|   path: "/", | |||
|   component: () => import("@/page-subspecialty/views/main"), | |||
|   name: "main", | |||
|   redirect: { name: "patientManagement" }, | |||
|   meta: { title: "首页" }, | |||
|   children: [ | |||
|     { | |||
|       path: "/patientManagement", | |||
|       component: () => | |||
|         import("@/page-subspecialty/views/modules/patientManagement/index"), | |||
|       name: "patientManagement", | |||
|       meta: { title: "分诊管理", isTab: true }, | |||
|     }, | |||
|     { | |||
|       path: "/patientDetail", | |||
|       component: () => | |||
|         import("@/page-subspecialty/views/modules/patientDetail"), | |||
|       name: "patientDetail", | |||
|       meta: { title: "档案管理", isTab: true }, | |||
|     }, | |||
|     // ok镜
 | |||
|     { | |||
|       path: "/patientInfo", | |||
|       name: "patientInfo", | |||
|       meta: { title: "详情", isTab: true }, | |||
|       component: () => | |||
|         import( | |||
|           "@/page-subspecialty/views/modules/optometryManagement/seeDoctor/index" | |||
|         ), | |||
|     }, | |||
|     { | |||
|       path: "/iframe", | |||
|       component: null, | |||
|       name: "iframe", | |||
|       meta: { title: "iframe", isTab: true }, | |||
|     }, | |||
|     { | |||
|       path: "/redirect", | |||
|       name: "redirect", | |||
|       component: () => import("@/page-subspecialty/views/redirect"), | |||
|     }, | |||
|     { | |||
|       path: "/ot", | |||
|       name: "ot", | |||
|       component: () => | |||
|         import("@/page-subspecialty/views/modules/formList/deveopmentFIle.vue"), | |||
|     }, | |||
|   ], | |||
| }; | |||
| 
 | |||
| export function addDynamicRoute(routeParams, router) { | |||
|   // 组装路由名称, 并判断是否已添加, 如是: 则直接跳转
 | |||
|   var routeName = routeParams.routeName; | |||
|   var dynamicRoute = window.SITE_CONFIG["dynamicRoutes"].filter( | |||
|     (item) => item.name === routeName | |||
|   )[0]; | |||
|   if (dynamicRoute) { | |||
|     return router.push({ name: routeName, params: routeParams.params }); | |||
|   } | |||
|   // 否则: 添加并全局变量保存, 再跳转
 | |||
|   dynamicRoute = { | |||
|     path: routeName, | |||
|     component: () => | |||
|       Promise.resolve( | |||
|         require(`@/page-subspecialty/views/modules/${routeParams.path}`).default | |||
|       ), | |||
|     // component: () => import(`@/views/modules/${routeParams.path}`),
 | |||
|     name: routeName, | |||
|     meta: { | |||
|       ...window.SITE_CONFIG["contentTabDefault"], | |||
|       menuId: routeParams.menuId, | |||
|       title: `${routeParams.title}`, | |||
|     }, | |||
|   }; | |||
|   router.addRoutes([ | |||
|     { | |||
|       ...moduleRoutes, | |||
|       name: `main-dynamic__${dynamicRoute.name}`, | |||
|       children: [dynamicRoute], | |||
|     }, | |||
|   ]); | |||
|   window.SITE_CONFIG["dynamicRoutes"].push(dynamicRoute); | |||
|   router.push({ name: dynamicRoute.name, params: routeParams.params }); | |||
| } | |||
| 
 | |||
| const createRouter = () => | |||
|   new Router({ | |||
|     mode: "history", | |||
|     scrollBehavior: () => ({ y: 0 }), | |||
|     routes: pageRoutes.concat(moduleRoutes), | |||
|   }); | |||
| const router = createRouter(); | |||
| 
 | |||
| // [vue-router] Duplicate named routes definition 重复的命名路由定义
 | |||
| // 动态路由退出再登录会出现警告重复路由
 | |||
| // 解决方案:在退出时调用resetRouter()方法
 | |||
| export function resetRouter() { | |||
|   const newRouter = createRouter(); | |||
|   router.matcher = newRouter.matcher; // reset router
 | |||
| } | |||
| 
 | |||
| router.beforeEach((to, from, next) => { | |||
|   // 添加动态(菜单)路由
 | |||
|   // 已添加或者当前路由为页面路由, 可直接访问
 | |||
|   if ( | |||
|     window.SITE_CONFIG["dynamicMenuRoutesHasAdded"] || | |||
|     fnCurrentRouteIsPageRoute(to, pageRoutes) | |||
|   ) { | |||
|     return next(); | |||
|   } | |||
|   if (to.path === from.path) { | |||
|     return; | |||
|   } | |||
|   if ( | |||
|     to.name === "login" || | |||
|     to.path === "/login" || | |||
|     to.path === "satusScreen" || | |||
|     to.name === "satusScreen" | |||
|   ) { | |||
|     next(); | |||
|   } else { | |||
|     // 获取字典列表, 添加并全局变量保存
 | |||
|     // http.get('/sys/dict/type/all').then(({ data: res }) => {
 | |||
|     //   if (res.code !== 0) {
 | |||
|     //     return
 | |||
|     //   }
 | |||
|     //   window.SITE_CONFIG['dictList'] = res.data
 | |||
|     // }).catch(() => {})
 | |||
| 
 | |||
|     // 获取左侧菜单列表,添加并全局变量保存
 | |||
|     http | |||
|       .get("/sys/menu/nav") | |||
|       .then(({ data: res }) => { | |||
|         if (res.code !== 0) { | |||
|           Vue.prototype.$message.error(res.msg); | |||
|           return next({ name: "login" }); | |||
|         } | |||
|         window.SITE_CONFIG["menuList"] = res.data; | |||
|       }) | |||
|       .catch(() => { | |||
|         return next({ name: "login" }); | |||
|       }); | |||
| 
 | |||
|     // 获取菜单管理菜单列表,并添加动态路由
 | |||
|     http | |||
|       .get("/sys/menu/list", { | |||
|         params: { | |||
|           type: 0, | |||
|         }, | |||
|       }) | |||
|       .then(({ data: res }) => { | |||
|         if (res.code !== 0) { | |||
|           Vue.prototype.$message.error(res.msg); | |||
|           return next({ name: "login" }); | |||
|         } | |||
|         // window.SITE_CONFIG['menuList'] = res.data
 | |||
|         const menuListChild = res.data.filter( | |||
|           (item) => item.children.length > 0 | |||
|         ); | |||
|         // console.log(menuListChild)
 | |||
|         fnAddDynamicMenuRoutes( | |||
|           JSON.parse(JSON.stringify(res.data)), | |||
|           menuListChild.length | |||
|         ); | |||
| 
 | |||
|         next({ ...to, replace: true }); | |||
|       }) | |||
|       .catch(() => { | |||
|         // console.log(123)
 | |||
|         return next({ name: "login" }); | |||
|       }); | |||
|     // 获取【字段字典表】, 添加并全局变量保存
 | |||
|     // http.get('/sys/table/dict/getList', { params: { type: 1 }}).then(({ data: res }) => {
 | |||
|     //   window.SITE_CONFIG['dict_colSearch'] = res.data
 | |||
|     // })
 | |||
|     getInitData(); | |||
|   } | |||
| }); | |||
| function getInitData() { | |||
|   // 获取字典列表, 添加并全局变量保存
 | |||
|   // http.get('/sys/dict/type/all').then(({ data: res }) => {
 | |||
|   //   if (res.code !== 0) { return }
 | |||
|   //   window.SITE_CONFIG['dictList'] = res.data
 | |||
|   // })
 | |||
| 
 | |||
|   // 获取【字段字典表】, 添加并全局变量保存
 | |||
|   http.get("/table/dict/optionsColumn").then(({ data: res }) => { | |||
|     window.SITE_CONFIG["dict_colAll"] = res.data; | |||
|   }); | |||
| 
 | |||
|   // 获取【字段字典表】, 添加并全局变量保存
 | |||
|   http | |||
|     .get("/table/dict/optionsColumn", { params: { type: 1 } }) | |||
|     .then(({ data: res }) => { | |||
|       window.SITE_CONFIG["dict_colSearch"] = res.data; | |||
|     }); | |||
| 
 | |||
|   // 获取【字段字典表】, 添加并全局变量保存
 | |||
|   http | |||
|     .get("/table/dict/optionsColumn", { params: { type: 2 } }) | |||
|     .then(({ data: res }) => { | |||
|       window.SITE_CONFIG["dict_colChart"] = res.data; | |||
|     }); | |||
| 
 | |||
|   // 获取【字段字典表】, 添加并全局变量保存
 | |||
|   http | |||
|     .get("/table/dict/optionsColumn", { params: { type: 3 } }) | |||
|     .then(({ data: res }) => { | |||
|       window.SITE_CONFIG["dict_colCrf"] = res.data; | |||
|     }); | |||
| 
 | |||
|   // 获取【字段字典表】, 添加并全局变量保存
 | |||
|   http | |||
|     .get("/table/dict/optionsColumn", { params: { type: 4 } }) | |||
|     .then(({ data: res }) => { | |||
|       window.SITE_CONFIG["dict_colExport"] = res.data; | |||
|     }); | |||
| 
 | |||
|   // 获取【检查项目字典】, 添加并全局变量保存
 | |||
|   // http.get('/table/dict/examItem').then(({ data: res }) => {
 | |||
|   //   sortChinese(res.data, 'itemName')
 | |||
|   //   window.SITE_CONFIG['dict_examItem'] = res.data
 | |||
|   // })
 | |||
| 
 | |||
|   // 获取【设备信息字典】, 添加并全局变量保存
 | |||
|   // http.get('/device/getData2RelDeviceList').then(({ data: res }) => {
 | |||
|   //   window.SITE_CONFIG['dict_device'] = res.data
 | |||
|   // })
 | |||
| 
 | |||
|   // 获取【设备与检查项目字典】, 添加并全局变量保存
 | |||
|   // http.get('/device/getData2RelDeviceItemList').then(({ data: res }) => {
 | |||
|   //   window.SITE_CONFIG['dict_device_item'] = res.data
 | |||
|   // })
 | |||
| } | |||
| /** | |||
|  * 判断当前路由是否为页面路由 | |||
|  * @param {*} route 当前路由 | |||
|  * @param {*} pageRoutes 页面路由 | |||
|  */ | |||
| function fnCurrentRouteIsPageRoute(route, pageRoutes = []) { | |||
|   var temp = []; | |||
|   for (var i = 0; i < pageRoutes.length; i++) { | |||
|     if (route.path === pageRoutes[i].path) { | |||
|       return true; | |||
|     } | |||
|     if (pageRoutes[i].children && pageRoutes[i].children.length >= 1) { | |||
|       temp = temp.concat(pageRoutes[i].children); | |||
|     } | |||
|   } | |||
|   return temp.length >= 1 ? fnCurrentRouteIsPageRoute(route, temp) : false; | |||
| } | |||
| 
 | |||
| /** | |||
|  * 添加动态(菜单)路由 | |||
|  * PH:自上而下遍历,累积平铺 | |||
|  * @param {*} menuList 菜单列表 | |||
|  * @param {*} routes 递归创建的动态(菜单)路由 | |||
|  */ | |||
| function fnAddDynamicMenuRoutes( | |||
|   menuList = [], | |||
|   menuListChildLength, | |||
|   routes = [] | |||
| ) { | |||
|   let index = 0; | |||
|   // console.log(menuList)
 | |||
|   menuList.forEach((item, i) => { | |||
|     // eslint-disable-next-line
 | |||
|     let URL = (item.url || "").replace(/{{([^}}]+)?}}/g, (s1, s2) => eval(s2)); // URL支持{{ window.xxx }}占位符变量
 | |||
|     item["meta"] = { | |||
|       ...window.SITE_CONFIG["contentTabDefault"], | |||
|       menuId: item.id, | |||
|       title: item.name, | |||
|     }; | |||
|     if (isURL(URL)) { | |||
|       item["path"] = item["name"] = `i-${item.id}`; | |||
|       item["meta"].push({ | |||
|         iframeURL: URL, | |||
|       }); | |||
|     } else { | |||
|       // console.log(URL)
 | |||
|       URL = URL.replace(/^\//, "").replace(/_/g, "-"); | |||
|       item["path"] = "/" + URL.replace(/\//g, "-"); | |||
|       item["name"] = URL.replace(/\//g, "-"); | |||
|       // 坑!!!父级也必须要有component,父级要有自己的vue组件,父级路由必须有<router-view />占位符
 | |||
|       // 其孩子children才能展示出来,孩子展示在父级占位符的地方
 | |||
|       URL.includes("seeDoctor") ? (URL = "seeDoctor") : ""; // 不同父级有相同子级seeDoctor,防止面包屑冲突,动态路由名字区分设置为seeDoctor、seeDoctorOne,在寻找组件时替换回seeDoctor,可以找到对应组件路径
 | |||
|       item["component"] = () => | |||
|         Promise.resolve( | |||
|           require(`@/page-subspecialty/views/modules/${URL}`).default | |||
|         ); | |||
|       // 如果是父级给父级添加重定向到子菜单第一项
 | |||
|       if (item.children.length > 0 && item.children[0].url) { | |||
|         // console.log(item)
 | |||
|         // isShow:0显示不菜单 1显示菜单
 | |||
|         item.children[0].isShow === 0 | |||
|           ? "" | |||
|           : (item["redirect"] = "/" + item.children[0].url.replace(/\//g, "-")); | |||
|       } | |||
|     } | |||
|     if (item.children.length > 0) { | |||
|       index++; | |||
|       fnAddDynamicMenuRoutes(item.children); | |||
|     } | |||
|   }); | |||
|   // routes = menuList
 | |||
|   // console.log(routes)
 | |||
|   // 此处一定要加判断,因为此方法在递归,要等到递归完成后再执行下面的内容
 | |||
|   // 坑!!!如果不加此判断,this.$route.matched面包屑的父级就不会展示
 | |||
|   if (menuListChildLength === index) { | |||
|     routes = menuList; | |||
|     // PH:底层调用一次
 | |||
|     // 添加路由
 | |||
|     router.addRoutes([ | |||
|       { | |||
|         ...moduleRoutes, | |||
|         name: "main-dynamic-menu", | |||
|         children: [...routes], | |||
|       }, | |||
|       { path: "*", redirect: { name: "404" } }, | |||
|     ]); | |||
|     // console.log('----------------------')
 | |||
|     window.SITE_CONFIG["dynamicMenuRoutes"] = routes; | |||
|     window.SITE_CONFIG["dynamicMenuRoutesHasAdded"] = true; | |||
|   } | |||
| } | |||
| export default router; | |||
|  | |||
| @ -0,0 +1,341 @@ | |||
| <template> | |||
|   <div id="operation-record" style=" background: #fff; padding: 10px 20px 50px 20px;page-break-after:always"> | |||
|     <div class="btnBox"> | |||
|       <el-button v-print="'#threeFunc'" size="small">打印</el-button> | |||
|       <el-button type="primary" size="small" @click="handleSaveTable">保存</el-button> | |||
|     </div> | |||
|     <div id="threeFunc" style="width: 840px;padding-right: 8px"> | |||
|       <p style="color:#000000;font-size:32px;margin:0 0 30px 0;text-align:center;"> | |||
|         眼科激光手术患者知情同意书 | |||
|       </p> | |||
|       <!--患者信息--> | |||
|       <div class="flex"> | |||
|         <div class="flex a-c item">姓名:<el-input v-model="patient.patientName" style="flex: 1" placeholder="" /></div> | |||
|         <div class="flex a-c item">年龄:<el-input v-model="patient.age" style="flex: 1" placeholder="" />岁</div> | |||
|         <div class="flex a-c item">性别:<el-input v-model="patient.sex" style="flex: 1" placeholder="" /></div> | |||
|         <div class="flex a-c item">眼别:<el-input v-model="patient.eyeLevel" style="flex: 1" placeholder="" /></div> | |||
|       </div> | |||
|       <!--术前判断--> | |||
|       <div> | |||
|         <div class="formTitle"> | |||
|           一、术前诊断: | |||
|         </div> | |||
|         <div v-for="(item, index) in judgement" :key="index" class="judgeItem"> | |||
|           {{ `${index+1}. ${item.name}:` }} | |||
|           <el-input v-if="item.isEdit" v-model="item.remark" style="flex: 1" /> | |||
|           <template v-else> | |||
|             <div v-for="(judge,idx) in item.symptom" :key="idx" class="flex a-c"> | |||
|               <el-checkbox v-model="judge.isSelected" class="checkboxItem" /> | |||
|               {{ judge.title }} | |||
|               <el-input v-if="judge.isEdit" v-model="judge.remark" style="flex: 1" /> | |||
|             </div> | |||
|           </template> | |||
|         </div> | |||
|       </div> | |||
|       <!--麻醉方式选择--> | |||
|       <div> | |||
|         <div class="formTitle">二、麻醉方式选择:</div> | |||
|         <div class="flex"> | |||
|           <div v-for="(sel,i) in modeSelect" :key="i" style="margin-right: 30px"><el-checkbox v-model="sel.isSelected" class="checkboxItem" />{{ sel.name }}</div> | |||
|         </div> | |||
|       </div> | |||
|       <!--拟行激光术名称--> | |||
|       <div> | |||
|         <div class="formTitle">三、拟行激光术名称:</div> | |||
|         <div class="proposed"> | |||
|           <div v-for="(item,i) in proposedName" :key="i" style="margin-right: 35px"><el-checkbox v-model="item.isSelected" class="checkboxItem" /> | |||
|             {{ item.name }} | |||
|             <span v-if="item.area">( | |||
|               <span v-for="(area,index) in item.area" :key="`${index}_${i}`" class="areaItem"><el-checkbox v-model="area.isSelected" class="checkboxItem" />{{ area.name }}</span> | |||
|               )</span> | |||
|           </div> | |||
|         </div> | |||
|       </div> | |||
|       <!--      术中可能发生的并发症及处理--> | |||
|       <div> | |||
|         <div class="formTitle">四、术中可能发生的并发症及处理:</div> | |||
|         <div v-for="(item,index) in intraoperation" :key="index"> | |||
|           {{ `${index+1}. ${item}` }} | |||
|         </div> | |||
|       </div> | |||
|       <!--      术后视力预后--> | |||
|       <div> | |||
|         <div class="formTitle">五、术后视力预后</div> | |||
|         <div>取决于眼内情况,若眼底条件太差或者出现并发症,激光治疗后视力可能恢复不良。</div> | |||
|       </div> | |||
|       <!--      术后可能发生下列并发症--> | |||
|       <div> | |||
|         <div class="formTitle">六、术后可能发生下列并发症</div> | |||
|         <div class="proposed"> | |||
|           <div v-for="(post,idx) in postoperative" :key="idx" class="postItem" style="margin-right: 30px"> | |||
|             {{ `${idx+1},${post}` }} | |||
|           </div> | |||
|         </div> | |||
|         <div class="btnBox"> | |||
|           <div> | |||
|             <div class="flex a-c">主诊/谈话医生签名:<el-input v-model="doctor.name" style="flex: 1" /></div> | |||
|             <div class="flex a-c">日期:<el-input v-model="doctor.dateTime" style="flex: 1" /></div> | |||
|           </div> | |||
|         </div> | |||
|       </div> | |||
|       <!--      术前患者--> | |||
|       <div> | |||
|         <div class="formTitle">七、术前患者(或家属、单位意见):</div> | |||
|         <div class="proposed"> | |||
|           医生已和我详细讨论了治疗计划、手术方式、治疗目的以及术后可能的效果。我已详细阅读以上内容,并完全理解和接受手术可能出现的风险和并发症,我同意医生的治疗并接受手术。 | |||
|         </div> | |||
|         <div class="btnBox"> | |||
|           <div> | |||
|             <div class="flex a-c">患者或直系亲属签名:<el-input v-model="patientInfo.name" style="flex: 1" /></div> | |||
|             <div class="flex a-c">日期:<el-input v-model="patientInfo.dateTime" style="flex: 1" /></div> | |||
|           </div> | |||
|         </div> | |||
|       </div> | |||
|     </div> | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| export default { | |||
|   name: 'InformedConsent', | |||
|   data() { | |||
|     return { | |||
|       // 患者信息 | |||
|       patient: { | |||
|         patientName: '', | |||
|         age: '', | |||
|         sex: '', | |||
|         eyeLevel: '' | |||
|       }, | |||
|       // 主诊医生 | |||
|       doctor: { | |||
|         name: '', | |||
|         dateTime: '' | |||
|       }, | |||
|       patientInfo: { | |||
|         name: '', | |||
|         dateTime: '' | |||
|       }, | |||
|       // 术前判断 | |||
|       judgement: [ | |||
|         { | |||
|           name: '白内障', | |||
|           symptom: [{ | |||
|             title: '后发性', | |||
|             isSelected: false | |||
|           }, { | |||
|             title: '其他', | |||
|             isSelected: false, | |||
|             isEdit: true, | |||
|             remark: '' | |||
|           }] | |||
|         }, { | |||
|           name: '青光眼', | |||
|           symptom: [{ | |||
|             title: '闭角型', | |||
|             isSelected: false | |||
|           }, { | |||
|             title: '开角型', | |||
|             isSelected: false | |||
|           }, { | |||
|             title: '其他', | |||
|             isSelected: false, | |||
|             remark: '', | |||
|             isEdit: true | |||
|           }] | |||
|         }, { | |||
|           name: '眼底病', | |||
|           symptom: [{ | |||
|             title: '糖尿病视网膜病变', | |||
|             isSelected: false | |||
|           }, { | |||
|             title: '视网膜裂孔', | |||
|             isSelected: false | |||
|           }, { | |||
|             title: '视网膜变性', | |||
|             isSelected: false | |||
|           }, { | |||
|             title: '黄斑部疾病', | |||
|             isSelected: false | |||
|           }, { | |||
|             title: '其他', | |||
|             isSelected: false, | |||
|             isEdit: true, | |||
|             remark: '' | |||
|           }] | |||
|         }, { | |||
|           name: '视网膜血管性病变', | |||
|           symptom: [{ | |||
|             title: '视网膜静脉阻塞(中央)', | |||
|             isSelected: false | |||
|           }, { | |||
|             title: '视网膜静脉阻塞(分支)', | |||
|             isSelected: false | |||
|           }, { | |||
|             title: '视网膜静脉周围炎', | |||
|             isSelected: false | |||
|           }] | |||
|         }, { | |||
|           name: "Coat's 病", | |||
|           symptom: [{ | |||
|             title: '', | |||
|             isSelected: false | |||
|           }] | |||
|         }, { | |||
|           name: '其他', | |||
|           isEdit: true, | |||
|           remark: '', | |||
|           symptom: [] | |||
|         } | |||
|       ], | |||
|       // 麻醉方式选择 | |||
|       modeSelect: [ | |||
|         { | |||
|           name: '表麻', | |||
|           isSelected: false | |||
|         }, { | |||
|           name: '局麻', | |||
|           isSelected: false | |||
|         }, { | |||
|           name: '局麻+镇静', | |||
|           isSelected: false | |||
|         }, { | |||
|           name: '基础麻醉', | |||
|           isSelected: false | |||
|         }, { | |||
|           name: '其他', | |||
|           isSelected: false, | |||
|           isEdit: true, | |||
|           remark: '' | |||
|         } | |||
|       ], | |||
|       // 拟行激光术名称 | |||
|       proposedName: [ | |||
|         { | |||
|           name: '激光后囊切开术', | |||
|           isSelected: false | |||
|         }, { | |||
|           name: '激光前囊切开术', | |||
|           isSelected: false | |||
|         }, { | |||
|           name: '激光周边虹膜切除', | |||
|           isSelected: false | |||
|         }, { | |||
|           name: '激光房角成形术', | |||
|           isSelected: false | |||
|         }, { | |||
|           name: '激光睫状体光凝术', | |||
|           isSelected: false | |||
|         }, { | |||
|           name: '激光断线', | |||
|           isSelected: false | |||
|         }, { | |||
|           name: '视网膜光凝术', | |||
|           isSelected: false, | |||
|           area: [{ | |||
|             name: '局部', | |||
|             isSelected: false | |||
|           }, { | |||
|             name: '全', | |||
|             isSelected: false | |||
|           }, { | |||
|             name: '黄斑区', | |||
|             isSelected: false | |||
|           }] | |||
|         }, { | |||
|           name: '激光瞳孔成形术', | |||
|           isSelected: false | |||
|         }, { | |||
|           name: '激光瞳孔残膜切开术', | |||
|           isSelected: false | |||
|         }, { | |||
|           name: '激光虹膜黏连剖除术', | |||
|           isSelected: false | |||
|         }, { | |||
|           name: '玻璃体条索切开术', | |||
|           isSelected: false | |||
|         }, { | |||
|           name: '激光倒睫术', | |||
|           isSelected: false | |||
|         }, { | |||
|           name: '其他', | |||
|           isSelected: false | |||
|         } | |||
|       ], | |||
|       // 术中 | |||
|       intraoperation: ['麻醉意外:需进行抢救或暂停手术', '出血:需要压迫止血,推迟或暂停手术', '其他无法预计的并发症', '术中可能会根据具体情况变更手术方式'], | |||
|       postoperative: ['暂时性眼压升高', '损伤人工晶体', '角膜内皮损伤', '虹膜炎症反应', '玻璃体前界膜破裂', '视功能损伤', '渗出性视网膜脱离', '黄斑水肿', '脉络膜脱离', '虹膜(视网膜、脉络膜)出血', '其他'] | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     handleSaveTable() { | |||
|       const data = { | |||
|         patient: this.patient, | |||
|         doctor: this.doctor, | |||
|         patientInfo: this.patientInfo, | |||
|         judgement: this.judgement, | |||
|         modeSelect: this.modeSelect, | |||
|         proposedName: this.proposedName | |||
|       } | |||
|       console.log(data) | |||
|       this.$emit('save', data) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss" scoped> | |||
| .flex{ | |||
|   display: flex; | |||
| } | |||
| .a-c{ | |||
|   align-items: center; | |||
| } | |||
| .item{ | |||
|   &:not(:last-child){ | |||
|     margin-right: 15px; | |||
|   } | |||
| } | |||
| .formTitle{ | |||
|   font-weight: bold; | |||
|   margin-top: 10px; | |||
| } | |||
| .areaItem{ | |||
|   &:not(:last-child){ | |||
|     margin-right: 10px; | |||
|   } | |||
| } | |||
| .judgeItem{ | |||
|   display: flex; | |||
|   align-items: center; | |||
|   div{ | |||
|     margin: 0 5px; | |||
|   } | |||
| } | |||
| .checkboxItem{ | |||
|   margin-right: 5px; | |||
| } | |||
| .proposed{ | |||
|   display: flex; | |||
|   flex-wrap: wrap; | |||
| } | |||
| .btnBox{ | |||
|   display: flex; | |||
|   justify-content: flex-end; | |||
| } | |||
| ::v-deep .el-input__inner { | |||
|   border: none; | |||
|   height: 26px !important; | |||
|   line-height: 26px !important; | |||
|   text-align: center; | |||
| } | |||
| 
 | |||
| ::v-deep .el-input__inner { | |||
|   border-bottom: 1px solid #ccc; | |||
|   border-radius: 0; | |||
|   padding: 0; | |||
| } | |||
| ::v-deep .el-input__prefix { | |||
|   display: none; | |||
| } | |||
| </style> | |||
| @ -0,0 +1,609 @@ | |||
| <template> | |||
|   <div id="operation-record" style=" background: #fff; padding: 10px 20px 50px 20px;page-break-after:always"> | |||
|     <div class="btnBox"> | |||
|       <el-button v-print="'#threeFunc'" size="small">打印</el-button> | |||
|       <el-button type="primary" size="small" @click="handleSaveTable">保存</el-button> | |||
|     </div> | |||
|     <div id="threeFunc" style="width: 840px;padding-right: 8px"> | |||
|       <p style="color:#000000;font-size:32px;margin:0 0 30px 0;text-align:center;"> | |||
|         青少年儿童屈光发育档案 | |||
|       </p> | |||
|       <div class="operation-record-table"> | |||
|         <el-table :data="headData" :span-method="headSpanMethod" border style="width: 820px; margin-top: 20px"> | |||
|           <el-table-column label="" width="" align="center" :resizable="false"> | |||
|             <template slot-scope="scope"> | |||
|               <span>{{ scope.row.name }}</span> | |||
|             </template> | |||
|           </el-table-column> | |||
|           <el-table-column label="" width="" :resizable="false" prop="type"> | |||
|             <template slot-scope="scope"> | |||
|               <div v-if="scope.row.name == '姓名'"> | |||
|                 <div class="width-100 center"> | |||
|                   <el-input v-model="scope.row.patientName" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '身高'"> | |||
|                 <div class="width-100 center"> | |||
|                   <el-input v-model="scope.row.height" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '是否戴镜'"> | |||
|                 <div class="width-100 center"> | |||
|                   <el-input v-model="scope.row.isMirror" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|             </template> | |||
|           </el-table-column> | |||
|           <el-table-column label="" width="" :resizable="false"> | |||
|             <template slot-scope="scope"> | |||
|               <div v-if="scope.row.name == '姓名'"> | |||
|                 <div class="width-100 center"> | |||
|                   性别 | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '身高'"> | |||
|                 <div class="width-100 center"> | |||
|                   体重 | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '是否戴镜'"> | |||
|                 <div class="width-100 center"> | |||
|                   戴镜习惯 | |||
|                 </div> | |||
|               </div> | |||
|             </template> | |||
|           </el-table-column> | |||
|           <el-table-column label="" width="" :resizable="false"> | |||
|             <template slot-scope="scope"> | |||
|               <div v-if="scope.row.name == '姓名'"> | |||
|                 <div class="width-100 center"> | |||
|                   <el-input v-model="scope.row.sex" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '身高'"> | |||
|                 <div class="width-100 center"> | |||
|                   <el-input v-model="scope.row.weight" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '是否戴镜'"> | |||
|                 <div class="width-100 center"> | |||
|                   <el-input v-model="scope.row.mirrorHabit" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|             </template> | |||
|           </el-table-column> | |||
|           <el-table-column label="" width="" :resizable="false"> | |||
|             <template slot-scope="scope"> | |||
|               <div v-if="scope.row.name == '姓名'"> | |||
|                 <div class="width-100 center"> | |||
|                   出生日期 | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '身高'"> | |||
|                 <div class="width-100 center"> | |||
|                   何时发现视力下降 | |||
|                 </div> | |||
|               </div> | |||
|             </template> | |||
|           </el-table-column> | |||
|           <el-table-column label="" width="" :resizable="false"> | |||
|             <template slot-scope="scope"> | |||
|               <div v-if="scope.row.name == '姓名'"> | |||
|                 <div class="width-100 center"> | |||
|                   <el-input v-model="scope.row.birthday" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '身高'"> | |||
|                 <div class="width-100 center"> | |||
|                   <el-input v-model="scope.row.time" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|             </template> | |||
|           </el-table-column> | |||
|         </el-table> | |||
|         <el-table :data="tableData" :span-method="objectSpanMethod" border style="width: 820px"> | |||
|           <el-table-column label="" width="" align="center" :resizable="false"> | |||
|             <template slot-scope="scope"> | |||
|               <span>{{ scope.row.name }}</span> | |||
|             </template> | |||
|           </el-table-column> | |||
|           <el-table-column label="" width="" :resizable="false" prop="type"> | |||
|             <template slot-scope="scope"> | |||
|               <div v-if="scope.row.name == '戴镜类型'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-checkbox-group v-model="scope.row.mirrorType"> | |||
|                     <el-checkbox label="框架" /> | |||
|                     <el-checkbox label="OK镜" /> | |||
|                     <el-checkbox label="RGP" /> | |||
|                     <el-checkbox label="软镜" /> | |||
|                   </el-checkbox-group> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '旧镜参数'"> | |||
|                 <div class="width-120 center"> | |||
|                   OD:<el-input v-model="scope.row.od" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '父母是否近视'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-checkbox-group v-model="scope.row.shortsighte"> | |||
|                     <el-checkbox label="父亲" /> | |||
|                     <el-checkbox label="母亲" /> | |||
|                     <el-checkbox label="父亲和母亲" /> | |||
|                     <el-checkbox label="均无" /> | |||
|                   </el-checkbox-group> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '户外活动时间'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-checkbox-group v-model="scope.row.outTime"> | |||
|                     <el-checkbox label="<1h" /> | |||
|                     <el-checkbox label="1h-2h" /> | |||
|                     <el-checkbox label=">2h" /> | |||
|                   </el-checkbox-group> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '备注'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.note" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '项目'"> | |||
|                 <div class="width-180 center"> | |||
|                   OD | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '裸眼/旧镜视力'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.od" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '是否散瞳'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-checkbox-group v-model="scope.row.mydriasis"> | |||
|                     <el-checkbox label="未散瞳" /> | |||
|                     <el-checkbox label="美多丽" /> | |||
|                     <el-checkbox label="阿托品" /> | |||
|                     <el-checkbox label="其他" /> | |||
|                   </el-checkbox-group> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '主觉验光'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.od" placeholder="" style="width: 100px" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '眼位'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.od" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '眼压/mmHg'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.od" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '角膜曲率/D'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.od" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '角膜厚度/μm'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.od" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '处方'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.od" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '建议'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-checkbox-group v-model="scope.row.suggest"> | |||
|                     <el-checkbox label="框架" /> | |||
|                     <el-checkbox label="OK镜" /> | |||
|                     <el-checkbox label="RGP" /> | |||
|                     <el-checkbox label="软镜" /> | |||
|                     <el-checkbox label="其他" /> | |||
|                   </el-checkbox-group> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '眼轴/眼底照/地形图'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.type" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|             </template> | |||
|           </el-table-column> | |||
|           <el-table-column label="" width="" :resizable="false"> | |||
|             <template slot-scope="scope"> | |||
|               <div v-if="scope.row.name == '旧镜参数'"> | |||
|                 <div class="width-120 center"> | |||
|                   OS:<el-input v-model="scope.row.os" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '项目'"> | |||
|                 <div class="width-180 center"> | |||
|                   OS | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '裸眼/旧镜视力'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.os" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '主觉验光'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.os" placeholder="" style="width: 100px" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '眼位'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.os" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '眼压/mmHg'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.os" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '角膜曲率/D'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.os" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '角膜厚度/μm'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.os" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|               <div v-if="scope.row.name == '处方'"> | |||
|                 <div class="width-180 center"> | |||
|                   <el-input v-model="scope.row.os" placeholder="" /> | |||
|                 </div> | |||
|               </div> | |||
|             </template> | |||
|           </el-table-column> | |||
|         </el-table> | |||
|       </div> | |||
|     </div> | |||
|   </div> | |||
| </template> | |||
| <script> | |||
| export default { | |||
|   props: { | |||
|     archiveCaseCRFItem: { | |||
|       type: Object, | |||
|       default: () => { } | |||
|     }, | |||
|     formContent: { | |||
|       type: Object, | |||
|       default: () => { } | |||
|     } | |||
|   }, | |||
|   data() { | |||
|     return { | |||
|       dataForm: { | |||
|         yghcValue: '', | |||
|         operationListValueOD: [] | |||
|       }, | |||
|       headData: [ | |||
|         { | |||
|           name: '个人基础信息', | |||
|           type: '' | |||
|         }, | |||
|         { | |||
|           name: '姓名', | |||
|           patientName: '', | |||
|           sex: '', | |||
|           birthday: '', | |||
|           type: '' | |||
|         }, { | |||
|           name: '身高', | |||
|           height: '', | |||
|           weight: '', | |||
|           time: '' | |||
|         }, { | |||
|           name: '是否戴镜', | |||
|           isMirror: '', | |||
|           mirrorHabit: '', | |||
|           type: '' | |||
|         }], | |||
|       tableData: [ | |||
|         { | |||
|           name: '戴镜类型', | |||
|           mirrorType: [] | |||
|         }, | |||
|         { | |||
|           name: '旧镜参数', | |||
|           od: '', | |||
|           os: '', | |||
|           type: '' | |||
|         }, { | |||
|           name: '父母是否近视', | |||
|           shortsighte: [] | |||
|         }, { | |||
|           name: '户外活动时间', | |||
|           outTime: [], | |||
|           type: '' | |||
|         }, { | |||
|           name: '备注', | |||
|           note: '' | |||
|         }, { | |||
|           name: '综合检查信息', | |||
|           type: '1' | |||
|         }, { | |||
|           name: '项目' | |||
|         }, { | |||
|           name: '裸眼/旧镜视力', | |||
|           od: '', | |||
|           os: '' | |||
|         }, { | |||
|           name: '是否散瞳', | |||
|           mydriasis: [] | |||
|         }, { | |||
|           name: '主觉验光', | |||
|           od: '', | |||
|           os: '', | |||
|           vaod: '', | |||
|           vaos: '', | |||
|           type: '2' | |||
|         }, { | |||
|           name: '眼位', | |||
|           od: '', | |||
|           os: '', | |||
|           type: '' | |||
|         }, { | |||
|           name: '眼压/mmHg', | |||
|           od: '', | |||
|           os: '' | |||
|         }, { | |||
|           name: '角膜曲率/D', | |||
|           od: '', | |||
|           os: '' | |||
|         }, { | |||
|           name: '角膜厚度/μm', | |||
|           od: '', | |||
|           os: '' | |||
|         }, { | |||
|           name: '处方', | |||
|           od: '', | |||
|           os: '' | |||
|         }, { | |||
|           name: '建议', | |||
|           suggest: [] | |||
|         }, { | |||
|           name: '眼轴/眼底照/地形图', | |||
|           type: '' | |||
|         }] | |||
|     } | |||
|   }, | |||
|   computed: { | |||
|     operationRecord: { | |||
|       get() { | |||
|         return this.$store.getters.operationRecord | |||
|       } | |||
|     } | |||
|   }, | |||
|   watch: { | |||
|     operationRecord: { | |||
|       handler(value) { | |||
|         console.log(value) | |||
|       }, | |||
|       deep: true, | |||
|       immediate: true | |||
|     } | |||
|   }, | |||
|   created() { | |||
|     // this.printPage('threeFunc') | |||
|   }, | |||
|   methods: { | |||
|     setData() { | |||
|       this.headData = this.formContent.a | |||
|       this.tableData = this.formContent.b | |||
|     }, | |||
|     //   签名 | |||
|     singHandle(text) { | |||
|       const value = { | |||
|         text: text, | |||
|         pageName: 'operationRecord' | |||
|       } | |||
|       this.$store.commit('beginSign', value) | |||
|     }, | |||
|     objectSpanMethod({ row, column, rowIndex, columnIndex }) { | |||
|       if (columnIndex === 0) { | |||
|         if (rowIndex === 5) { | |||
|           return { | |||
|             rowspan: 1, | |||
|             colspan: 3 | |||
|           } | |||
|         } | |||
|       } else if (columnIndex === 1) { | |||
|         if (rowIndex === 0 || rowIndex === 2 || rowIndex === 3 || rowIndex === 4 || rowIndex === 8 || rowIndex === 15 || rowIndex === 16) { | |||
|           return { | |||
|             rowspan: 1, | |||
|             colspan: 2 | |||
|           } | |||
|         } else if (rowIndex === 5) { | |||
|           return { | |||
|             rowspan: 0, | |||
|             colspan: 0 | |||
|           } | |||
|         } | |||
|       } else if (columnIndex === 2) { | |||
|         if (rowIndex === 0 || rowIndex === 2 || rowIndex === 3 || rowIndex === 4 || rowIndex === 5 || rowIndex === 8 || rowIndex === 15 || rowIndex === 16) { | |||
|           return { | |||
|             rowspan: 0, | |||
|             colspan: 0 | |||
|           } | |||
|         } | |||
|       } | |||
|     }, | |||
|     headSpanMethod({ row, column, rowIndex, columnIndex }) { | |||
|       if (columnIndex === 0) { | |||
|         if (rowIndex === 0) { | |||
|           return { | |||
|             rowspan: 1, | |||
|             colspan: 6 | |||
|           } | |||
|         } | |||
|       } else if (columnIndex === 1 || columnIndex === 3) { | |||
|         if (rowIndex === 3) { | |||
|           return { | |||
|             rowspan: 1, | |||
|             colspan: 2 | |||
|           } | |||
|         } | |||
|       } else if (columnIndex === 1 || columnIndex === 2 || columnIndex === 3 || columnIndex === 4 || columnIndex === 5) { | |||
|         if (rowIndex === 0) { | |||
|           return { | |||
|             rowspan: 0, | |||
|             colspan: 0 | |||
|           } | |||
|         } | |||
|       } | |||
|     }, | |||
|     handlePrint() { | |||
|       this.printPage('threeFunc') | |||
|     }, | |||
|     handleSaveTable() { | |||
|       const data = { | |||
|         a: this.headData, | |||
|         b: this.tableData | |||
|       } | |||
|       this.$emit('save', data) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss"> | |||
| 
 | |||
| #operation-record { | |||
|   //height: 93%; | |||
|   // overflow: auto; | |||
|   .btnBox{ | |||
|     display: flex; | |||
|     justify-content: flex-end; | |||
|   } | |||
|   .el-table--border{ | |||
|     border-right: 1px solid #EBEEF5; | |||
|   } | |||
|   .operation-record-table { | |||
|     //width: 100%; | |||
|     width: 840px !important; | |||
|     padding-right: 8px; | |||
|     .operation-text { | |||
|       font-weight: 700; | |||
|     } | |||
|     .text { | |||
|       font-weight: 700; | |||
|     } | |||
|     .sign { | |||
|       cursor: pointer; | |||
|       color: #46a1ff; | |||
|       font-weight: 400; | |||
|     } | |||
|   } | |||
|   .center { | |||
|     text-align: center; | |||
|   } | |||
|   .left { | |||
|     text-align: left; | |||
|   } | |||
| 
 | |||
|   .width-50 { | |||
|     .el-input { | |||
|       width: 50px; | |||
|     } | |||
|   } | |||
|   .width-70 { | |||
|     .el-input { | |||
|       width: 70px; | |||
|     } | |||
|   } | |||
| 
 | |||
|   .width-100 { | |||
|     .el-input { | |||
|       width: 100px; | |||
|     } | |||
|   } | |||
|   .width-120 { | |||
|     .el-input { | |||
|       width: 120px; | |||
|     } | |||
|   } | |||
|   .width-180 { | |||
|     .el-input { | |||
|       width: 180px; | |||
|     } | |||
|   } | |||
|   .el-input__inner { | |||
|     border: none; | |||
|     height: 26px !important; | |||
|     line-height: 26px !important; | |||
|     text-align: center; | |||
|   } | |||
| 
 | |||
|   .el-input__inner { | |||
|     border-bottom: 1px solid #ccc; | |||
|     border-radius: 0; | |||
|     padding: 0; | |||
|   } | |||
|   .el-input__prefix { | |||
|     display: none; | |||
|   } | |||
|   //.el-date-editor.el-input, | |||
|   //.el-date-editor.el-input__inner { | |||
|   //  width: 140px; | |||
|   //} | |||
|   //.el-input__suffix { | |||
|   //  top: -7px; | |||
|   //} | |||
|   //.el-checkbox__input.is-checked + .el-checkbox__label { | |||
|   //  color: #606266; | |||
|   //} | |||
|   //.el-checkbox__input.is-checked .el-checkbox__inner, | |||
|   //.el-checkbox__input.is-indeterminate .el-checkbox__inner { | |||
|   //  background: #767676; | |||
|   //  border-color: #767676; | |||
|   //} | |||
|   //.el-checkbox__inner:hover, | |||
|   //.el-checkbox__inner { | |||
|   //  border-color: #767676; | |||
|   //} | |||
|   //.el-radio__input.is-checked + .el-radio__label { | |||
|   //  color: #606266; | |||
|   //} | |||
|   //.el-radio__input.is-checked .el-radio__inner { | |||
|   //  background: #767676; | |||
|   //  border-color: #767676; | |||
|   //} | |||
|   //.el-radio { | |||
|   //  margin-right: 8px; | |||
|   //  display: block; | |||
|   //} | |||
|   //.el-radio__inner { | |||
|   //  border: 1px solid #767676 !important; | |||
|   //} | |||
|   //.el-radio__inner:hover { | |||
|   //  border-color: #767676; | |||
|   //} | |||
|   .el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell { | |||
|     background: none !important; | |||
|   } | |||
|   .has-gutter { | |||
|     display: none; | |||
|     .cell { | |||
|       font-weight: 700; | |||
|     } | |||
|     .el-table__cell { | |||
|       background: #ced4d9; | |||
|     } | |||
|   } | |||
|   .el-table__header-wrapper{ | |||
|     display: none; | |||
|   } | |||
| } | |||
| </style> | |||
| @ -0,0 +1,253 @@ | |||
| <template> | |||
|   <div id="operation-record" style=" background: #fff; padding: 10px 20px 50px 20px;page-break-after:always"> | |||
|     <div class="btnBox"> | |||
|       <el-button v-print="'#threeFunc'" size="small">打印</el-button> | |||
|       <el-button type="primary" size="small" @click="handleSaveTable">保存</el-button> | |||
|     </div> | |||
|     <div id="threeFunc" style="width: 840px;padding-right: 8px"> | |||
|       <p style="color:#000000;font-size:32px;margin:0 0 30px 0;text-align:center;"> | |||
|         眼科激光手术患者知情同意书 | |||
|       </p> | |||
|       <!--患者信息--> | |||
|       <div> | |||
|         <div class="flex"> | |||
|           <div class="flex a-c item">姓名:<el-input v-model="patient.patientName" style="flex: 1" /></div> | |||
|           <div class="flex a-c item">年龄:<el-input v-model="patient.age" style="flex: 1" />岁</div> | |||
|           <div class="flex a-c item">性别:<el-input v-model="patient.sex" style="flex: 1" /></div> | |||
|           <div class="flex a-c item">病例号:<el-input v-model="patient.caseNo" style="flex: 1" /></div> | |||
|         </div> | |||
|         <div class="flex"> | |||
|           <div class="flex a-c">联系电话:<el-input v-model="patient.phone" style="flex: 1" /></div> | |||
|           <div class="flex a-c item">家庭住址:<el-input v-model="patient.address" style="flex: 1" /></div> | |||
|         </div> | |||
|         <div class="flex a-c item">诊断:<el-input v-model="patient.diagnose" style="flex: 1" /></div> | |||
|       </div> | |||
|       <!--      治疗前--> | |||
|       <div class="subTitle">治疗前</div> | |||
|       <table class="treatAction"> | |||
|         <thead> | |||
|           <tr> | |||
|             <th colspan="2">OD</th> | |||
|             <th colspan="2">OS</th> | |||
|           </tr> | |||
|         </thead> | |||
|         <tbody> | |||
|           <tr> | |||
|             <td> | |||
|               <div class="flex a-c">{{ beforeTreat.OD.eye.name }}:<el-input v-model="beforeTreat.OD.eye.level" style="flex: 1" /></div> | |||
|               <div class="flex a-c">{{ beforeTreat.OD.illness.name }}:<el-input v-model="beforeTreat.OD.illness.desc" style="flex: 1" /></div> | |||
|             </td> | |||
|             <td> | |||
|               <div class="descImg">示意图</div> | |||
|             </td> | |||
|             <td> | |||
|               <div class="flex a-c">{{ beforeTreat.OS.eye.name }}:<el-input v-model="beforeTreat.OS.eye.level" style="flex: 1" /></div> | |||
|               <div class="flex a-c">{{ beforeTreat.OS.illness.name }}:<el-input v-model="beforeTreat.OS.illness.desc" style="flex: 1" /></div> | |||
|             </td> | |||
|             <td> | |||
|               <div class="descImg">示意图</div> | |||
|             </td> | |||
|           </tr> | |||
|         </tbody> | |||
|       </table> | |||
|       <!--      激光治疗--> | |||
|       <div class="subTitle">激光治疗</div> | |||
|       <table class="treatAction"> | |||
|         <thead> | |||
|           <tr> | |||
|             <th colspan="2">OD</th> | |||
|             <th colspan="2">OS</th> | |||
|           </tr> | |||
|         </thead> | |||
|         <tbody> | |||
|           <tr v-for="(item,index) in treatData" :key="index"> | |||
|             <td> | |||
|               <div class="flex a-c">日期:<el-input v-model="item.OD.data" style="flex: 1" /></div> | |||
|               <div class="flex a-c">次数:<el-input v-model="item.OD.order" style="flex: 1" /></div> | |||
|               <div class="flex a-c">视力:<el-input v-model="item.OD.vision" style="flex: 1" /></div> | |||
|               <div class="flex a-c">光斑大小:<el-input v-model="item.OD.flareSize" style="flex: 1" /></div> | |||
|               <div class="flex a-c">功率:<el-input v-model="item.OD.power" style="flex: 1" /></div> | |||
|               <div class="flex a-c">点数:<el-input v-model="item.OD.count" style="flex: 1" /></div> | |||
|             </td> | |||
|             <td> | |||
|               <div class="descImg">示意图</div> | |||
|             </td> | |||
|             <td> | |||
|               <div class="flex a-c">日期:<el-input v-model="item.OS.data" style="flex: 1" /></div> | |||
|               <div class="flex a-c">次数:<el-input v-model="item.OS.order" style="flex: 1" /></div> | |||
|               <div class="flex a-c">视力:<el-input v-model="item.OS.vision" style="flex: 1" /></div> | |||
|               <div class="flex a-c">光斑大小:<el-input v-model="item.OS.flareSize" style="flex: 1" /></div> | |||
|               <div class="flex a-c">功率:<el-input v-model="item.OS.power" style="flex: 1" /></div> | |||
|               <div class="flex a-c">点数:<el-input v-model="item.OS.count" style="flex: 1" /></div> | |||
|             </td> | |||
|             <td> | |||
|               <div class="descImg">示意图</div> | |||
|             </td> | |||
|           </tr> | |||
|         </tbody> | |||
|       </table> | |||
|     </div> | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| export default { | |||
|   name: 'LaserSurgery', | |||
|   data() { | |||
|     return { | |||
|       // 患者信息 | |||
|       patient: { | |||
|         patientName: '', | |||
|         age: '', | |||
|         sex: '', | |||
|         caseNo: '', | |||
|         phone: '', | |||
|         address: '', | |||
|         diagnose: '' | |||
|       }, | |||
|       beforeTreat: { | |||
|         OD: { | |||
|           eye: { | |||
|             name: '视力1', | |||
|             level: '' | |||
|           }, | |||
|           illness: { | |||
|             name: '疾病分期', | |||
|             desc: '' | |||
|           } | |||
|         }, | |||
|         OS: { | |||
|           eye: { | |||
|             name: '视力2', | |||
|             level: '' | |||
|           }, | |||
|           illness: { | |||
|             name: '疾病分期', | |||
|             desc: '' | |||
|           } | |||
|         } | |||
|       }, | |||
|       treatData: [ | |||
|         { | |||
|           OD: { | |||
|             date: '', | |||
|             order: '', | |||
|             vision: '', | |||
|             flareSize: '', | |||
|             power: '', | |||
|             count: '' | |||
|           }, | |||
|           OS: { | |||
|             date: '', | |||
|             order: '', | |||
|             vision: '', | |||
|             flareSize: '', | |||
|             power: '', | |||
|             count: '' | |||
|           } | |||
|         }, | |||
|         { | |||
|           OD: { | |||
|             date: '', | |||
|             order: '', | |||
|             vision: '', | |||
|             flareSize: '', | |||
|             power: '', | |||
|             count: '' | |||
|           }, | |||
|           OS: { | |||
|             date: '', | |||
|             order: '', | |||
|             vision: '', | |||
|             flareSize: '', | |||
|             power: '', | |||
|             count: '' | |||
|           } | |||
|         }, | |||
|         { | |||
|           OD: { | |||
|             date: '', | |||
|             order: '', | |||
|             vision: '', | |||
|             flareSize: '', | |||
|             power: '', | |||
|             count: '' | |||
|           }, | |||
|           OS: { | |||
|             date: '', | |||
|             order: '', | |||
|             vision: '', | |||
|             flareSize: '', | |||
|             power: '', | |||
|             count: '' | |||
|           } | |||
|         } | |||
|       ] | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     handleSaveTable() { | |||
|       const data = { | |||
|         treat: this.treatData, | |||
|         beforeTreat: this.beforeTreat | |||
|       } | |||
|       // console.log(data) | |||
|       this.$emit('save', data) | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss" scoped> | |||
| .flex{ | |||
|   display: flex; | |||
| } | |||
| .a-c{ | |||
|   align-items: center; | |||
| } | |||
| .item{ | |||
|   flex: 1; | |||
|   &:not(:last-child){ | |||
|     margin-right: 15px; | |||
|   } | |||
| } | |||
| .subTitle{ | |||
|   text-align: center; | |||
|   font-size: 16px; | |||
|   font-weight: 500; | |||
|   margin-top: 30px; | |||
| } | |||
| .descImg{ | |||
|   font-size: 12px; | |||
|   height: 140px; | |||
| } | |||
| .treatAction{ | |||
|   width: 100%; | |||
|   tr td,tr th{ | |||
|     border: 1px solid #ccc; | |||
|     padding: 5px; | |||
|   } | |||
|   td{ | |||
|     width: 25%; | |||
|   } | |||
| } | |||
| .btnBox{ | |||
|   display: flex; | |||
|   justify-content: flex-end; | |||
| } | |||
| ::v-deep .el-input__inner { | |||
|   border: none; | |||
|   height: 26px !important; | |||
|   line-height: 26px !important; | |||
|   text-align: center; | |||
| } | |||
| 
 | |||
| ::v-deep .el-input__inner { | |||
|   border-bottom: 1px solid #ccc; | |||
|   border-radius: 0; | |||
|   padding: 0; | |||
| } | |||
| ::v-deep .el-input__prefix { | |||
|   display: none; | |||
| } | |||
| </style> | |||
					Loading…
					
					
				
		Reference in new issue