Browse Source

随访记录完成

360view
bianyaqi 2 years ago
parent
commit
1e961c13e4
  1. 1
      package.json
  2. 4
      public/index.html
  3. 112
      src/components/360View/collection.vue
  4. 56
      src/components/360View/followUpRecord/add-follow-record.vue
  5. 93
      src/components/360View/followUpRecord/formList/invalid.vue
  6. 356
      src/components/360View/followUpRecord/formList/outFollow.vue
  7. 212
      src/components/360View/followUpRecord/formList/phoneFollow.vue
  8. 260
      src/components/360View/followUpRecord/index.vue
  9. 6
      src/components/360View/index1.vue
  10. 25
      src/components/360View/time-line-follow-up.vue
  11. 235
      src/page-subspecialty/main.js
  12. 762
      src/page-subspecialty/router/index.js
  13. 341
      src/page-subspecialty/views/modules/formList/InformedConsent.vue
  14. 609
      src/page-subspecialty/views/modules/formList/deveopmentFIle.vue
  15. 253
      src/page-subspecialty/views/modules/formList/laserSurgery.vue
  16. 2
      src/page-subspecialty/views/modules/optometryManagement/dioptric/index.vue
  17. 2
      src/page-subspecialty/views/modules/outpatientManagement/treat/index.vue

1
package.json

@ -23,6 +23,7 @@
"cornerstone-tools": "^5.2.0",
"cornerstone-wado-image-loader": "^3.3.2",
"cornerstone-web-image-loader": "^2.1.1",
"default-passive-events": "^2.0.0",
"dicom-parser": "^1.8.7",
"docxtemplater": "^3.25.1",
"echarts": "^4.9.0",

4
public/index.html

@ -39,8 +39,8 @@
<% if (process.env.VUE_APP_NODE_ENV === 'dev') { %>
<script>
//http://121.36.16.195:9002/huimu-admin/swagger-ui/index.html
// window.SITE_CONFIG['apiURL'] = 'http://192.168.4.24:8036/xiangan-crf';
window.SITE_CONFIG['apiURL'] = 'http://47.110.224.240:8036/xiangan-crf';
window.SITE_CONFIG['apiURL'] = 'http://192.168.4.83:8036/xiangan-crf';
// window.SITE_CONFIG['apiURL'] = 'http://47.110.224.240:8036/xiangan-crf';
</script>
<% } %>
<!-- 测试环境 -->

112
src/components/360View/collection.vue

@ -6,15 +6,13 @@
<el-tree
v-else
:data="tableData"
:props="collectProps"
node-key="id"
default-expand-all
:expand-on-click-node="false"
>
<span slot-scope="{ node, data }" class="custom-tree-node" :name="node.id">
<span slot-scope="{ node, data }" class="custom-tree-node" :name="node.id" @click="levelClick(data)">
<span style="display: inline-block;min-width: 100px">
<span>{{ node.label }}</span>
<!-- <el-input v-else v-model="editName" :autofocus="true" @blur="" @change="getRename" />-->
</span>
<span>
<el-dropdown trigger="click" @command="(command)=>addNode(command,node,data)">
@ -36,11 +34,11 @@
</span>
</span>
</el-tree>
<el-dialog width="30%" :modal="false" title="节点名称" :visible.sync="dialogFormVisible">
<el-input v-model="editName" />
<el-dialog :modal-append-to-body="false" width="30%" title="节点名称" :visible.sync="dialogFormVisible">
<el-input ref="renameRef" v-model="editName" @change="confirmNode" />
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false"> </el-button>
<el-button type="primary" @click="confirmNode()"> </el-button>
<el-button type="primary" :disabled="disabled" @click="confirmNode()"> </el-button>
</div>
</el-dialog>
</div>
@ -83,70 +81,30 @@ export default {
return {
dialogFormVisible: false,
remark: '',
currentNumber: '',
curId: '',
editName: '',
collectProps: {
// children: 'childs',
// label: 'name'
},
editMessage: '',
disabled: false, //
addParam: {
id: 0,
parentId: 0
},
doctorId: JSON.parse(window.localStorage.getItem('qg-userData')).id,
collectData: [],
tableData: [{
id: 1,
label: '一级 1',
isEdit: false,
children: [{
id: 4,
label: '二级 1-1',
children: [{
id: 9,
label: '三级 1-1-1'
}, {
id: 10,
label: '三级 1-1-2'
}]
}]
}, {
id: 2,
isEdit: false,
label: '一级 2',
children: [{
id: 5,
label: '二级 2-1'
}, {
id: 6,
label: '二级 2-2'
}]
}, {
id: 3,
isEdit: false,
label: '一级 3',
children: [{
id: 7,
label: '二级 3-1'
}, {
id: 8,
label: '二级 3-2'
}]
}],
setPlanList: [],
addFollowList: [],
patientInfoHeadHeight: '',
crfSelectVisible: false
tableData: []
}
},
watch: {
dialogFormVisible(newValue) {
if (newValue) {
this.$nextTick(() => {
this.$refs.renameRef.focus()
})
}
}
},
async created() {
this.initPatient()
},
mounted() {
},
methods: {
//
@ -187,28 +145,52 @@ export default {
// })
// console.log('', data)
// },
levelClick(data) {
this.curId = data.id
console.log(this.curId)
},
searchRemark(data) {
// this.treeId = data.id
// this.remark = data.hisManagePatientEntity ? data.hisManagePatientEntity.remark : ''
// this.remarkId = data.hisManagePatientEntity ? data.hisManagePatientEntity.id : ''
},
handleAddPatient() {
this.$http.post('/tree/addPatientTree', {})
const params = {
createDate: new Date().getDate(),
id: 0,
patientId: this.patientId,
platform: this.platform,
remark: this.remark,
treeId: this.curId
}
this.$http.post('/tree/addPatientTree', params).then(() => {
this.editMessage = '收藏成功!'
this.$message({
message: this.editMessage,
type: 'success'
})
})
},
//
addNode(command, node) {
this.editMessage = '添加成功!'
this.disabled = false
switch (command) {
//
case 'same':
this.dialogFormVisible = true
this.addParam.id = node.id
this.addParam.parentId = node.parent.id
this.editName = node.name
break
//
case 'child':
this.dialogFormVisible = true
this.addParam.id = node.id
this.addParam.parentId = node.parent.id
this.editName = node.name
break
//
default:
this.addParam.id = 0
this.addParam.parentId = 0
@ -227,14 +209,17 @@ export default {
weight: 1,
...this.addParam
}
this.disabled = true
await this.$http.post('/tree/addTree', params)
await this.findTree()
this.dialogFormVisible = false
await this.findTree()
},
//
handleNode(command, node, data) {
if (command === 'delete') {
this.deleteNode(node, data)
} else {
this.disabled = false
this.editNode(node, data)
}
},
@ -251,14 +236,19 @@ export default {
weight: 1,
...this.addParam
}
this.$http.post('/tree/deleteTree', params)
this.$http.post('/tree/deleteTree', params).then(() => {
this.$message({
message: '删除成功!',
type: 'success'
})
})
this.findTree()
},
//
editNode(node, data) {
this.dialogFormVisible = true
this.editName = node.label
this.findTree()
this.editMessage = '重命名成功!'
}
}
}

56
src/components/360View/followUpRecord/add-follow-record.vue

@ -8,16 +8,18 @@
@close="closeDialog"
>
<el-form ref="dataForm" :model="dataForm" :rules="dataRule">
<el-form-item label="随访时间:" label-width="90px" prop="visitDate">
<el-form-item label="随访时间:" label-width="90px" prop="createTime">
<el-date-picker
v-model="dataForm.visitDate"
v-model="dataForm.createTime"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
/>
</el-form-item>
<el-form-item label="随访表单:" label-width="90px" prop="crfId">
<el-radio v-for="item in followFormList" :key="item.id" v-model="dataForm.crfId" :label="item.id" @change="radioChange(item)">{{ item.name }}</el-radio>
<el-form-item label="随访表单:" label-width="90px" prop="name">
<el-radio-group v-model="dataForm.name">
<el-radio v-for="item in followFormList" :key="item.id" :label="item.name">{{ item.name }}</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template slot="footer">
@ -30,16 +32,31 @@
<script>
import debounce from 'lodash/debounce'
export default {
props: {
crfVoS: {
type: Object,
default: () => {
return {}
}
},
platform: {
type: String,
default: ''
},
patientId: {
type: String,
default: ''
}
},
data() {
return {
visible: false,
dataForm: {
visitDate: '',
crfId: '',
centreId: '',
patientCentreId: '',
createTime: '',
flag: '7',
name: '',
patientIdNumber: ''
patientId: '',
platform: ''
},
followFormList: []
}
@ -47,10 +64,10 @@ export default {
computed: {
dataRule() {
return {
visitDate: [
createTime: [
{ required: true, message: '请选择随访时间', trigger: 'blur' }
],
crfId: [
name: [
{ required: true, message: '请选择要使用的随访表单', trigger: 'change' }
]
}
@ -61,22 +78,19 @@ export default {
this.visible = true
this.$nextTick(() => {
this.$refs.dataForm.resetFields() //
this.dataForm.visitDate = this.$moment().format('YYYY-MM-DD')
this.dataForm.createTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
})
},
// 访
radioChange(item) {
// console.log(item)
this.dataForm.name = item.name
},
//
dataFormSubmitHandle: debounce(function() {
this.$refs.dataForm.validate((valid) => {
if (!valid) {
return false
}
this.dataForm.centreId = JSON.parse(window.localStorage.getItem('qg-userData')).centreId
this.$http.post('/visit/record', this.dataForm).then(({ data: res }) => {
this.dataForm.platform = this.platform
this.dataForm.patientId = this.patientId
this.dataForm.createTime = this.$moment(this.dataForm.createTime).format('YYYY-MM-DD HH:mm:ss')
this.$http.post('/case/save', this.dataForm).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
@ -86,9 +100,7 @@ export default {
duration: 500,
onClose: () => {
this.visible = false
res.data.isWrite = 0
this.$emit('getTimeAxisData', res.data)
this.$emit('refreshDataList', res.data)
this.$emit('getTimeAxisData', this.dataForm)
}
})
}).catch(() => {})

93
src/components/360View/followUpRecord/formList/invalid.vue

@ -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>

356
src/components/360View/followUpRecord/formList/outFollow.vue

@ -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>

212
src/components/360View/followUpRecord/formList/phoneFollow.vue

@ -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>

260
src/components/360View/followUpRecord/index.vue

@ -8,13 +8,18 @@
<div class="buttonBackground">
<el-button type="primary" plain size="small" icon="el-icon-plus" class="addfollow" @click="addFollowHandle">新增随访</el-button>
</div>
<time-line-follow-up ref="timeline" :time-axis-data="timeAxisData" class="time-line" @refreshDataList="childInit" />
<time-line-follow-up ref="timeline" :time-axis-data="timeAxisDataVisit" class="time-line" @refreshDataVisitList="childInit" />
</div>
<div class="content-right">
<div class="buttons">
<el-button type="primary" size="small" @click="addOrUpdateHandle(dataForm,'put')">修改</el-button>
<div class="btnGroup">
<el-button type="primary" size="small" @click="addOrUpdateHandle()">保存</el-button>
<el-button type="danger" size="small" @click="deleteHandle">删除</el-button>
<el-button size="small" @click="printerHandle">打印</el-button>
<el-button v-print="'#followFunc'" size="small">打印</el-button>
</div>
<div class="table_form">
<invalid v-if="curFormType==='无效联系'" id="followFunc" ref="followRef" :json-text="dataForm.jsonText" :follow-id="dataForm.id" />
<phone-follow v-else-if="curFormType==='电话随访'" id="followFunc" ref="followRef" :json-text="dataForm.jsonText" :follow-id="dataForm.id" />
<out-follow v-else id="followFunc" ref="followRef" :patient-id="patientId" :json-text="dataForm.jsonText" :follow-id="dataForm.id" :platform="platform" />
</div>
</div>
<!-- 没有随访数据 -->
@ -30,9 +35,9 @@
</div>
</div>
<!-- 新增随访记录 -->
<add-follow-record v-if="followRecordVisible" ref="followRecordRef" @getTimeAxisData="getTimeAxisData('add',$event)" @closeDialog="followRecordVisible=false" />
<add-follow-record v-if="followRecordVisible" ref="followRecordRef" :platform="platform" :patient-id="patientId" @getTimeAxisData="getAxisData" @closeDialog="followRecordVisible=false" />
<!-- 弹窗, 新增 / 修改 -->
<follow-up v-if="followUpVisible" ref="followUp" updata-file="getTimeAxisData" :is-sign="true" :is-close-refresh="isCloseRefresh" @refreshDataList="childInit()" @getTimeAxisData="getTimeAxisData" @closeDialog="followUpVisible=false" />
<!-- <follow-up v-if="followUpVisible" ref="followUp" updata-file="getTimeAxisData" :is-sign="true" :is-close-refresh="isCloseRefresh" @refreshDataList="childInit()" @getTimeAxisData="getTimeAxisData" @closeDialog="followUpVisible=false" />-->
</div>
</template>
@ -44,9 +49,15 @@ import editFullCaseTemplate from '@/components/hm-crf/edit-full-case-template.vu
import intelligentFull from '@/components/hm-crf/intelligent-full.vue'
import addFollowRecord from './add-follow-record.vue'
import IntelligentFill from '@/mixins/IntelligentFill'
import Invalid from '@/components/360View/followUpRecord/formList/invalid.vue'
import PhoneFollow from '@/components/360View/followUpRecord/formList/phoneFollow.vue'
import OutFollow from '@/components/360View/followUpRecord/formList/outFollow.vue'
const Base64 = require('js-base64').Base64
export default {
components: {
OutFollow,
PhoneFollow,
Invalid,
timeLineFollowUp,
addFollowRecord,
followUp,
@ -66,6 +77,10 @@ export default {
patientId: {
type: String,
default: ''
},
platform: {
type: String,
default: ''
}
},
inject: ['refresh'],
@ -73,8 +88,10 @@ export default {
return {
visible: true,
timeAxisData: [], //
timeAxisDataVisit: [], //
curFormType: '',
followRecordVisible: false,
crfVisible: false,
// crfVisible: false,
followUpVisible: false,
editFullCaseTemplateVisible: false,
intelligentFullVisible: false,
@ -98,32 +115,75 @@ export default {
recordLength: '10:12:12',
flag: 0
}],
followFormList: [],
followFormList: [
{
id: '1',
name: '无效联系'
}, {
id: '2',
name: '电话随访'
}, {
id: '3',
name: '门诊随访'
}
],
loading: true,
isCloseRefresh: false
}
},
created() {
this.getAxisDataVisit()
},
methods: {
init() {
this.visible = true
this.$nextTick(() => {
this.getTimeAxisData()
// 访
this.getFollowFormList()
},
getAxisDataVisit(del, add, value) {
const params = {
patientId: this.patientId
}
this.$http.get('/patient/view/getTimeAxisDataVisit', { params }).then(res => {
this.timeAxisDataVisit = res.data.data
if (add) {
const index = this.timeAxisDataVisit.findIndex(item => item.date === this.$moment(value.createTime).format('YYYY-MM-DD'))
this.$refs.timeline.itemCurrentIndex = index || 0
this.$refs.timeline.itemListCurrentIndex = 0
this.dataForm = this.timeAxisDataVisit[index].itemList[0]
window.sessionStorage.setItem('itemCurrentIndex', index)
window.sessionStorage.setItem('itemListIndex', 0)
}
if (del) {
//
const Isdate = this.timeAxisDataVisit.some(item => item.date === this.dataForm.opDate)
//
const itemCurrentIndex = this.$refs.timeline.itemCurrentIndex
const itemListCurrentIndex = this.$refs.timeline.itemListCurrentIndex
// 访dataform
if (Isdate) {
const itemListIndex = itemListCurrentIndex === 0 ? 0 : itemListCurrentIndex - 1
this.$refs.timeline.itemListCurrentIndex = itemListIndex
this.dataForm = this.timeAxisDataVisit[itemCurrentIndex].itemList[itemListIndex]
window.sessionStorage.setItem('itemCurrentIndex', itemCurrentIndex)
window.sessionStorage.setItem('itemListIndex', itemListIndex)
} else {
// 访dataform
const itemIndex = itemCurrentIndex === 0 ? 0 : itemCurrentIndex - 1
this.$refs.timeline.itemCurrentIndex = itemIndex
this.$refs.timeline.itemListCurrentIndex = 0
this.dataForm = this.timeAxisDataVisit[itemIndex].itemList[0]
window.sessionStorage.setItem('itemCurrentIndex', itemIndex)
window.sessionStorage.setItem('itemListIndex', 0)
}
}
})
},
getAxisData(val) {
this.curFormType = val.name
this.getAxisDataVisit('', 'add', val)
},
//
printerHandle() {
this.$refs.crfComponent.$el.contentWindow.print()
},
// 访
async getFollowFormList() {
const { data: res } = await this.$http.get('/crf/template/getListByType/随访')
if (res.code === 0) {
this.followFormList = res.data
} else {
this.$message.error(res.msg)
}
this.printPage('followFunc')
},
// 访 +访
addFollowHandle() {
@ -131,154 +191,35 @@ export default {
this.isCloseRefresh = true
this.$nextTick(() => {
this.$refs.followRecordRef.followFormList = this.followFormList
this.$refs.followRecordRef.dataForm.patientIdNumber = this.patientIdNumber
this.$refs.followRecordRef.dataForm.patientCentreId = this.patientCentreId
this.$refs.followRecordRef.init()
})
},
// CRF
addOrUpdateHandle(data, flag) {
this.isCloseRefresh = flag !== 'put'
// console.log(data)
this.$store.commit('destroyPlugin')
if (data.crfDescription === '病历模板') {
this.editFullCaseTemplateVisible = true
this.$nextTick(() => {
this.$refs.editFullCaseTemplateRef.dataForm.id = flag === 'post' ? data.id : data.formId
this.$refs.editFullCaseTemplateRef.dataForm.description = data.crfDescription
this.$refs.editFullCaseTemplateRef.dataForm.patientIdNumber = data.patientIdNumber
this.$refs.editFullCaseTemplateRef.dataForm.patientCentreId = data.patientCentreId
this.$refs.editFullCaseTemplateRef.init()
})
} else if (data.crfDescription === '智能填充') {
this.intelligentFullVisible = true
this.$nextTick(() => {
this.$refs.intelligentFullRef.dataForm.crfId = data.crfId
this.$refs.intelligentFullRef.dataForm.formId = flag === 'post' ? data.id : data.formId
this.$refs.intelligentFullRef.dataForm.isWrite = data.isWrite
this.$refs.intelligentFullRef.init()
})
} else {
this.followUpVisible = true
this.$nextTick(() => {
this.$refs.followUp.dataForm.crfId = data.crfId
this.$refs.followUp.dataForm.formId = flag === 'post' ? data.id : data.formId
this.$refs.followUp.dataForm.isWrite = data.isWrite
this.$refs.followUp.init()
})
}
},
// 访
childInit(item) {
console.log(item)
item ? this.dataForm = { ...this.dataForm, ...item } : ''
this.crfVisible = false
this.$nextTick(() => {
this.$http.get(`/visit/record/${this.dataForm.formId}`)
.then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
if (res.data) {
res.data.formId = res.data.id
delete res.data.id
this.dataForm = { ...this.dataForm, ...res.data }
// console.log(this.dataForm)
this.dataForm.content = Base64.decode(res.data.formContent)
// console.log(this.dataForm)
this.crfVisible = true
console.log(this.dataForm)
this.dataForm.isWrite === 0 && (this.dataForm.crfDescription === '智能填充' || this.dataForm.crfDescription === '病历模板') ? this.getFirstFeedbackData('智能填充', this.dataForm.formId) : this.CRFLoading = false
}
}).catch(() => { })
})
this.dataForm = item
this.curFormType = this.dataForm.groupName
},
// --
async getTimeAxisData(flag, data, del) {
this.loading = true
const addFromData = data
data ? this.dataForm = data : ''
const { data: res } = await this.$http.get(`/visit/record/${this.patientCentreId}/${this.patientIdNumber}`)
if (res.code === 0) {
if (res.data.length > 0) {
res.data.forEach(item => {
item.active = false
})
this.timeAxisData = res.data
// 访
data ? this.timeAxisData.forEach((item, index) => {
// console.log('data', data)
// console.log('item', item)
// console.log('this.dataForm', this.dataForm)
if (item.dateStr === this.dataForm.formDate) {
this.$refs.timeline.itemCurrentIndex = index
item.dataList.forEach((iten, itenIndex) => {
if (iten.formId === this.dataForm.id) {
this.$refs.timeline.itemListCurrentIndex = itenIndex
window.sessionStorage.setItem('itemCurrentIndex', index)
window.sessionStorage.setItem('itemListIndex', itenIndex)
}
})
}
}) : ''
// 访
flag === 'add' ? this.addOrUpdateHandle(addFromData, 'post') : ''
// dataform访
if (del && !flag) {
//
const Isdate = this.timeAxisData.some(item => item.dateStr === this.dataForm.formDate)
//
const itemCurrentIndex = this.$refs.timeline.itemCurrentIndex
const itemListCurrentIndex = this.$refs.timeline.itemListCurrentIndex
// 访dataform
if (Isdate) {
const itemListIndex = itemListCurrentIndex == 0 ? 0 : itemListCurrentIndex - 1
this.$refs.timeline.itemListCurrentIndex = itemListIndex
this.dataForm = this.timeAxisData[itemCurrentIndex].dataList[itemListIndex]
window.sessionStorage.setItem('itemCurrentIndex', itemCurrentIndex)
window.sessionStorage.setItem('itemListIndex', itemListIndex)
this.childInit()
} else {
// 访dataform
const itemIndex = itemCurrentIndex == 0 ? 0 : itemCurrentIndex - 1
this.$refs.timeline.itemCurrentIndex = itemIndex
this.$refs.timeline.itemListCurrentIndex = 0
this.dataForm = this.timeAxisData[itemIndex].dataList[0]
window.sessionStorage.setItem('itemCurrentIndex', itemIndex)
window.sessionStorage.setItem('itemListIndex', 0)
// console.log(123)
this.childInit()
}
} else if (!del && !flag) {
// console.log(123)
const getItemListCurrentIndex = window.sessionStorage.getItem('itemListIndex') ? window.sessionStorage.getItem('itemListIndex') : 0
const getItemCurrentIndex = window.sessionStorage.getItem('itemCurrentIndex') ? window.sessionStorage.getItem('itemCurrentIndex') : 0
// console.log(this.timeAxisData)
this.dataForm = this.timeAxisData[getItemCurrentIndex].dataList[getItemListCurrentIndex]
// console.log(this.dataForm)
this.childInit()
}
} else {
this.dataForm = {}
this.timeAxisData = []
del ? this.$emit('refreshFollow') : ''
}
this.loading = false
} else {
this.$message.error(res.msg)
}
//
addOrUpdateHandle() {
this.$refs.followRef.addOrUpdateHandle().then(() => {
this.$message({
message: '保存成功!',
type: 'success'
})
this.getAxisDataVisit()
})
},
//
async deleteHandle() {
this.$confirmFun('你确定要删除此随访记录吗?').then(async() => {
const { data: res } = await this.$http.delete(`/visit/record/${this.dataForm.id}`)
const { data: res } = await this.$http.post('/case/delete', { id: this.dataForm.id })
if (res.code === 0) {
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.getTimeAxisData('', '', 'delete')
this.getAxisDataVisit('del')
}
})
} else {
@ -329,6 +270,10 @@ export default {
}
}
.btnGroup{
display: flex;
justify-content: flex-end;
}
.content-right {
flex: 1;
//overflow:hidden;
@ -409,6 +354,13 @@ export default {
padding-right: 0;
}
}
.table_form{
height: calc(100vh - 300px);
width: 100%;
padding-bottom: 10px;
overflow: hidden;
overflow-y: scroll;
}
</style>
<style lang="scss">
.follow-up-record {

6
src/components/360View/index1.vue

@ -186,13 +186,13 @@
</el-table>
</el-tab-pane>
<el-tab-pane name="随访记录" label="随访记录" style="height: 100%">
<followUpRecord />
<followUpRecord :platform="platform" :patient-id="patientId" />
</el-tab-pane>
</el-tabs>
</div>
</div>
</div>
<shrink ref="shrinks" :arrowType="1" @display="handleDisplay"/>
<shrink ref="shrinks" :arrow-type="1" @display="handleDisplay" />
<drawer ref="drawers" :display.sync="display" :width="drawerWidth" :mask="false">
<!-- 关键指标-->
<key-indicators
@ -204,7 +204,7 @@
:patient-id="patientBaseData.patientId"
/>
<!-- 数据集-->
<dataInfo v-if="dataType === 2" :source-data="source" :data-list="collectList"/>
<dataInfo v-if="dataType === 2" :source-data="source" :data-list="collectList" />
<!-- 病历收藏-->
<collection v-if="dataType === 3" :platform="platform" :patient-id="patientId" />
<!-- 常用业务-->

25
src/components/360View/time-line-follow-up.vue

@ -14,24 +14,26 @@
<!-- 抬头 -->
<div class="time-line-item-wrapper-title">
<span class="title">
<span class="title-time">{{ itemData.dateStr ? $options.filters.dateFilterTwo( itemData.dateStr): '空 ' }}</span>
<span class="title-time">{{ itemData.date || '空 ' }}</span>
</span>
</div>
<!-- 内容 -->
<div
v-for="(item2, itemListIndex) in itemData.dataList"
v-for="(item2, itemListIndex) in itemData.itemList"
:key="itemListIndex"
class="time-line-item-wrapper-item"
:class="itemCurrentIndex == itemDataIndex && itemListCurrentIndex==itemListIndex ? 'activeTitle' : ''"
@click="sclectMentItem(item2,itemDataIndex,itemListIndex)"
>
<svg-icon
:icon-class="item2.formName.includes('电话随访') ? 'icon-record-microphone':
(item2.formName.includes('短信随访') ? 'icon-message-three' :
(item2.formName.includes('门诊随访') ? 'icon-hospital-one' : 'icon-hospital-one'))"
:class="itemCurrentIndex == itemDataIndex && itemListCurrentIndex==itemListIndex ? 'activeTitle' : 'svg-gray'"
/>
<span class="time-line-item-wrapper-item-title">{{ item2.formName }}</span>
<template v-if="!!item2.groupName">
<svg-icon
:icon-class="item2.groupName.includes('电话随访') ? 'icon-record-microphone':
(item2.groupName.includes('短信随访') ? 'icon-message-three' :
(item2.groupName.includes('门诊随访') ? 'icon-hospital-one' : 'icon-hospital-one'))"
:class="itemCurrentIndex == itemDataIndex && itemListCurrentIndex==itemListIndex ? 'activeTitle' : 'svg-gray'"
/>
<span class="time-line-item-wrapper-item-title">{{ item2.groupName }}</span>
</template>
</div>
</div>
</div>
@ -62,7 +64,6 @@ export default {
}
},
created() {
console.log(this.timeAxisData)
this.itemListCurrentIndex = window.sessionStorage.getItem('itemListIndex') ? window.sessionStorage.getItem('itemListIndex') : 0
this.itemCurrentIndex = window.sessionStorage.getItem('itemCurrentIndex') ? window.sessionStorage.getItem('itemCurrentIndex') : 0
},
@ -71,7 +72,7 @@ export default {
sclectMentItem(item2, itemDataIndex, itemListIndex) {
this.itemCurrentIndex = itemDataIndex
this.itemListCurrentIndex = itemListIndex
this.$emit('refreshDataList', item2)
this.$emit('refreshDataVisitList', item2)
window.sessionStorage.setItem('itemListIndex', itemListIndex)
window.sessionStorage.setItem('itemCurrentIndex', itemDataIndex)
}
@ -227,7 +228,7 @@ export default {
background-color: #3e9fff !important;
}
.scroll-father {
height: calc(100vh - 26px - 32px - 42px - 54px - 32px - 50px);
height: calc(100vh - 26px - 32px - 42px - 54px - 32px - 70px);
overflow-y: auto;
}

235
src/page-subspecialty/main.js

@ -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");

762
src/page-subspecialty/router/index.js

@ -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;

341
src/page-subspecialty/views/modules/formList/InformedConsent.vue

@ -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>

609
src/page-subspecialty/views/modules/formList/deveopmentFIle.vue

@ -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>

253
src/page-subspecialty/views/modules/formList/laserSurgery.vue

@ -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>

2
src/page-subspecialty/views/modules/optometryManagement/dioptric/index.vue

@ -111,7 +111,7 @@
<!-- HIS引入弹框 -->
<his-add v-if="HisAddVisible" ref="HisAddRef" />
<!-- 详情页 -->
<detail-view v-if="detailViewVisible" :id="detailId" ref="viewRef" platform="2" :patient-id="patientId" :patient-id-number="patientIdNumber" is-search="" @detailViewVisible="detailViewVisible=false" />
<detail-view v-if="detailViewVisible" :id="detailId" ref="viewRef" platform="3" :patient-id="patientId" :patient-id-number="patientIdNumber" is-search="" @detailViewVisible="detailViewVisible=false" />
</template>
</div>
</template>

2
src/page-subspecialty/views/modules/outpatientManagement/treat/index.vue

@ -105,7 +105,7 @@
<!-- HIS引入弹框 -->
<his-add v-if="HisAddVisible" ref="HisAddRef" />
<!-- 详情页 -->
<detail-view v-if="detailViewVisible" :id="detailId" ref="viewRef" platform="1" :patient-id="patientId" :patient-id-number="patientIdNumber" @detailViewVisible="detailViewVisible=false" />
<detail-view v-if="detailViewVisible" :id="detailId" ref="viewRef" platform="2" :patient-id="patientId" :patient-id-number="patientIdNumber" @detailViewVisible="detailViewVisible=false" />
</div>
</template>
<script>

Loading…
Cancel
Save