Browse Source

360view

360view
bianyaqi 2 years ago
parent
commit
2c133b06a8
  1. 4
      src/assets/scss/common.scss
  2. 1
      src/components/360View/afterPart/index.vue
  3. 145
      src/components/360View/business.vue
  4. 373
      src/components/360View/collection.vue
  5. 290
      src/components/360View/dataInfo.vue
  6. 3
      src/components/360View/drawer.vue
  7. 84
      src/components/360View/img-editor.vue
  8. 31
      src/components/360View/index.vue
  9. 499
      src/components/360View/medicalRecord/callMedical/index.vue
  10. 754
      src/components/360View/medicalRecord/index.vue
  11. 74
      src/components/360View/medicalRecord/outPatientRecord/allFormPrint.vue
  12. 37
      src/components/360View/medicalRecord/outPatientRecord/diagnosisForm.vue
  13. 656
      src/components/360View/medicalRecord/outPatientRecord/foreForm.vue
  14. 49
      src/components/360View/medicalRecord/outPatientRecord/historyForm.vue
  15. 251
      src/components/360View/medicalRecord/outPatientRecord/index.vue
  16. 231
      src/components/360View/medicalRecord/outPatientRecord/leftFormList.vue
  17. 488
      src/components/360View/opticalFile/index.vue
  18. 402
      src/components/360View/opticalFile/outPatientRecord/index.vue
  19. 6
      src/components/360View/shrink.vue
  20. 15
      src/page-subspecialty/router/index.js
  21. 8
      src/page-subspecialty/views/main.vue
  22. 19
      src/page-subspecialty/views/modules/dataVisualization/index.vue
  23. 403
      src/page-subspecialty/views/modules/formList/DrugInjection.vue
  24. 695
      src/page-subspecialty/views/modules/formList/InformedConsent.vue
  25. 293
      src/page-subspecialty/views/modules/formList/InjectionTherapy.vue
  26. 378
      src/page-subspecialty/views/modules/formList/Lacrimal.vue
  27. 409
      src/page-subspecialty/views/modules/formList/MinorOperation.vue
  28. 423
      src/page-subspecialty/views/modules/formList/StyeForm.vue
  29. 333
      src/page-subspecialty/views/modules/formList/childrenLacrimal.vue
  30. 376
      src/page-subspecialty/views/modules/formList/conjunctivalOperation.vue
  31. 369
      src/page-subspecialty/views/modules/formList/cornealForeign.vue
  32. 496
      src/page-subspecialty/views/modules/formList/laserSurgery.vue
  33. 455
      src/page-subspecialty/views/modules/formList/mraForm.vue
  34. 468
      src/page-subspecialty/views/modules/formList/mraOrder.vue
  35. 364
      src/page-subspecialty/views/modules/formList/puncture.vue
  36. 336
      src/page-subspecialty/views/modules/formList/reportForm.vue
  37. 248
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/align.vue
  38. 404
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/attribute copy.vue
  39. 287
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/attribute.vue
  40. 159
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/bgBar.vue
  41. 39
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/brush.vue
  42. 50
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/centerAlign.vue
  43. 38
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/clone.vue
  44. 35
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/del.vue
  45. 43
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/flip.vue
  46. 69
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/group.vue
  47. 84
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/history.vue
  48. 76
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importImg.vue
  49. 66
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importJSON.vue
  50. 87
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importSvg.vue
  51. 101
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importTmpl.vue
  52. 213
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/layer.vue
  53. 81
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/lock.vue
  54. 40
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/save.vue
  55. 93
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/setSize.vue
  56. 143
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/svgEl.vue
  57. 15
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/svgIcon/index.js
  58. 51
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/svgIcon/index.vue
  59. 246
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/tools.vue
  60. 70
      src/page-subspecialty/views/modules/imgEditorFabric/img-editor/zoom.vue
  61. 468
      src/page-subspecialty/views/modules/imgEditorFabric/index.vue
  62. 3
      src/page-subspecialty/views/modules/nurseManagement/index.vue
  63. 3
      src/page-subspecialty/views/modules/nurseManagement/reservation/index.vue
  64. 353
      src/page-subspecialty/views/modules/nurseManagement/reservation/schedule/addPatientOrder.vue
  65. 678
      src/page-subspecialty/views/modules/nurseManagement/reservation/schedule/doctor-schedule.vue
  66. 52
      src/page-subspecialty/views/modules/nurseManagement/reservation/schedule/index.vue
  67. 196
      src/page-subspecialty/views/modules/nurseManagement/reservation/schedule/number-detail-manage.vue
  68. 108
      src/page-subspecialty/views/modules/nurseManagement/reservation/schedule/orderPatientList.vue
  69. 618
      src/page-subspecialty/views/modules/nurseManagement/reservation/subList/index.vue
  70. 131
      src/page-subspecialty/views/modules/nurseManagement/reservation/subList/printTable.vue
  71. 70
      src/page-subspecialty/views/modules/nurseManagement/reservation/subList/reDialog.vue
  72. 281
      src/page-subspecialty/views/modules/nurseManagement/reservation/subSetting/addProject.vue
  73. 413
      src/page-subspecialty/views/modules/nurseManagement/reservation/subSetting/index.vue
  74. 343
      src/page-subspecialty/views/modules/nurseManagement/reservation/subSetting/numberManage.vue
  75. 167
      src/page-subspecialty/views/modules/optometryManagement/cornea/HIS-add.vue
  76. 113
      src/page-subspecialty/views/modules/optometryManagement/cornea/editPatid.vue
  77. 334
      src/page-subspecialty/views/modules/optometryManagement/cornea/index.vue
  78. 296
      src/page-subspecialty/views/modules/optometryManagement/cornea/patient-add-or-update.vue
  79. 151
      src/page-subspecialty/views/modules/optometryManagement/dioptric/HIS-add.vue
  80. 113
      src/page-subspecialty/views/modules/optometryManagement/dioptric/editPatid.vue
  81. 388
      src/page-subspecialty/views/modules/optometryManagement/dioptric/index.vue
  82. 296
      src/page-subspecialty/views/modules/optometryManagement/dioptric/patient-add-or-update.vue
  83. 3
      src/page-subspecialty/views/modules/optometryManagement/index.vue
  84. 167
      src/page-subspecialty/views/modules/optometryManagement/outFocusEye/HIS-add.vue
  85. 113
      src/page-subspecialty/views/modules/optometryManagement/outFocusEye/editPatid.vue
  86. 211
      src/page-subspecialty/views/modules/optometryManagement/outFocusEye/eyeAxis.vue
  87. 361
      src/page-subspecialty/views/modules/optometryManagement/outFocusEye/index.vue
  88. 379
      src/page-subspecialty/views/modules/optometryManagement/outFocusEye/outDetail.vue
  89. 296
      src/page-subspecialty/views/modules/optometryManagement/outFocusEye/patient-add-or-update.vue
  90. 408
      src/page-subspecialty/views/modules/optometryManagement/outFocusEye/reviewForm.vue
  91. 211
      src/page-subspecialty/views/modules/optometryManagement/outFocusEye/sunAxis.vue
  92. 586
      src/page-subspecialty/views/modules/optometryManagement/seeDoctor/CornealReview.vue
  93. 72
      src/page-subspecialty/views/modules/optometryManagement/seeDoctor/diagnose.vue
  94. 185
      src/page-subspecialty/views/modules/optometryManagement/seeDoctor/edit-follow-unit-visit.vue
  95. 218
      src/page-subspecialty/views/modules/optometryManagement/seeDoctor/eyeAxis.vue
  96. 153
      src/page-subspecialty/views/modules/optometryManagement/seeDoctor/first-visit/add-or-update.vue
  97. 391
      src/page-subspecialty/views/modules/optometryManagement/seeDoctor/first-visit/index.vue
  98. 131
      src/page-subspecialty/views/modules/optometryManagement/seeDoctor/follow-up/add-follow-record.vue
  99. 298
      src/page-subspecialty/views/modules/optometryManagement/seeDoctor/follow-up/index.vue
  100. 98
      src/page-subspecialty/views/modules/optometryManagement/seeDoctor/followUpRecord.vue

4
src/assets/scss/common.scss

@ -202,7 +202,6 @@ img {
------------------------------ */
.aui-wrapper {
position: relative;
padding-top: $navbar--height;
}
@ -532,7 +531,8 @@ img {
.aui-content {
position: relative;
padding: $content--padding;
height: calc(100vh - #{$navbar--height});
background-color: #f0f2f5;
height: 100vh;
&__wrapper {
position: relative;
margin-left: $sidebar--width;

1
src/components/360View/afterPart/index.vue

@ -81,7 +81,6 @@
import eventBus from '@/page-subspecialty/utils/eventBus'
import treeSelect from '@/components/360View/itemSelect'
import axios from 'axios'
import Cookies from 'js-cookie'
import AfterForm from '@/components/360View/medicalRecord/outPatientRecord/afterForm.vue'
export default {
components: {

145
src/components/360View/business.vue

@ -1,145 +0,0 @@
<template>
<div class="business">
<!-- <div class="fileBox">-->
<!-- <p class="title">建立屈光档案</p>-->
<!-- <el-button type="primary" size="small" @click="sendFile">发送</el-button>-->
<!-- </div>-->
<!-- <div style="margin: 12px 0">-->
<!-- 状态<span class="circle">已发送</span>-->
<!-- </div>-->
<!-- <div style="margin-bottom: 60px;">-->
<!-- 备注-->
<!-- <el-input v-model="remark" auto-complete="off" style="width: 420px" />-->
<!-- </div>-->
<div class="fileBox">
<p class="title">预约医疗项目</p>
<el-button type="primary" size="small" @click="sendTreat">发送</el-button>
</div>
<div style="margin: 12px 0">
状态<span class="circle">已发送</span>
</div>
<div style="margin-bottom: 12px">
医疗项目
<el-select v-model="itemId" placeholder="" clearable style="display: inline-block;width: 220px;margin-left: 8px" >
<el-option
v-for="item in projectList"
:key="item.itemId"
:label="item.itemName"
:value="item.itemId"
/>
</el-select>
</div>
<div>
备注
<el-input v-model="treatRemark" auto-complete="off" style="width: 420px" />
</div>
</div>
</template>
<script>
export default {
props: {
platform: {
type: String,
default: ''
},
patientId: {
type: String,
default: ''
},
patientName: {
type: String,
default: ''
}
},
data() {
return {
remark: '',
projectList: [],
itemId: '',
treatRemark: '',
jzNumber: ''
}
},
created() {
},
mounted() {
this.queryProjects()
this.jzNumber = window.sessionStorage.getItem('jzNumber')
},
methods: {
//
async sendFile() {
// const params = {
// remark: this.treatRemark,
// jzNumber: this.jzNumber,
// platform: this.platform,
// patientName: this.patientName,
// patientId: this.patientId
// }
// const { data: res } = await this.$http.post('/appoint/sendInfo4Appoint', params)
// if (res.code === 0) {
// this.$message.success('')
// } else {
// this.$message.error(res.msg)
// }
},
queryProjects() {
this.$http.get('/patient/getZlItemDict', { params: { isAppoint: 1 }}).then(data => {
this.projectList = data.data.data || []
})
},
//
async sendTreat() {
if (!this.itemId) return this.$message.warning('请选择医疗项目!')
const params = {
itemId: this.itemId,
remark: this.treatRemark,
jzNumber: this.jzNumber,
platform: this.platform,
patientName: this.patientName,
patientId: this.patientId
}
const { data: res } = await this.$http.post('/appoint/sendInfo4Appoint', params)
if (res.code === 0) {
this.$message.success('发送成功')
} else {
this.$message.error(res.msg)
}
}
}
}
</script>
<style lang="scss" scoped>
.business {
width: 650px;
padding: 16px;
box-sizing: border-box;
box-sizing: border-box;
.fileBox{
display: flex;
justify-content: space-between;
.title{
color: rgba(0, 0, 0, 0.88);
font-weight: 500;
font-size: 16px;
margin-top: 6px;
}
}
.circle{
&::before {
content: '';
width: 6px;
height: 6px;
margin:0 8px;
display: inline-block;
vertical-align: middle;
background: #52C41A;
border-radius: 50%;
}
}
}
</style>

373
src/components/360View/collection.vue

@ -1,373 +0,0 @@
<template>
<div class="collection">
<div class="collection_title">个人收藏</div>
<div style="flex: 1" class="collect_context">
<el-button v-if="!collectData.length" size="mini" @click="dialogFormVisible = true">新增节点</el-button>
<el-tree
v-else
:data="collectData"
node-key="id"
:props="defaultProps"
>
<span slot-scope="{ node, data }" class="custom-tree-node" @click="levelClick(data)">
<span style="display: inline-block;min-width: 100px">
<span>{{ node.label }}</span>
</span>
<span>
<el-dropdown v-if="!data.patientId" trigger="click" @command="(command)=>addNode(command,node,data)">
<span>
<i class="el-icon-plus" />
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="same">新增同级节点</el-dropdown-item>
<el-dropdown-item command="child">新增子级节点</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<i v-if="data.patientId" style="color: red" class="el-icon-delete" @click="deleteNode(node, data)" />
<el-dropdown v-else trigger="click" style="margin-left: 10px" @command="(command)=>handleNode(command,node,data)">
<span>···</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="rename">重命名</el-dropdown-item>
<el-dropdown-item command="delete">删除</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</span>
</span>
</el-tree>
<el-dialog :modal-append-to-body="false" width="30%" title="节点名称" :visible.sync="dialogFormVisible">
<el-input ref="renameRef" v-model="editName" />
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false"> </el-button>
<el-button type="primary" :disabled="disabled" @click="confirmNode()"> </el-button>
</div>
</el-dialog>
</div>
<div>
<div style="display:flex;text-align: center;padding: 16px">
<span>备注</span>
<el-input v-model="remark" style="flex: 1" type="textarea" resize="none" clearable placeholder="请输入备注" />
</div>
<div style="text-align: right;padding:0 16px 16px">
<el-button style="width: 180px" type="primary" size="small" @click="handleAddPatient">收藏当前患者</el-button>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
patientIdNumber: {
type: String,
default: ''
},
platform: {
type: String,
default: ''
},
patientId: {
type: String,
default: ''
}
},
data() {
return {
dialogFormVisible: false,
remark: '',
curNode: '',
editName: '',
editMessage: '',
curPatient: {}, // id
disabled: false, //
addParam: {
id: '',
parentId: 0
},
doctorId: JSON.parse(window.sessionStorage.getItem('qg-userData')).id,
collectData: [],
tableData: [],
defaultProps: {
children: 'childs',
label: 'name'
}
}
},
watch: {
dialogFormVisible(newValue) {
if (newValue) {
this.$nextTick(() => {
this.$refs.renameRef.focus()
})
}
},
collectData(val) {
if (!val.length) {
this.disabled = false
this.addParam.id = ''
this.addParam.parentId = 0
this.editName = ''
}
}
},
async created() {
this.initPatient()
this.findCurPatientRemark()
},
methods: {
//
initPatient() {
this.findTree()
},
//
findCurPatientRemark() {
this.$http.get('tree/findPatientRemark', {
patient: this.patientId,
platform: this.platform
}).then(res => {
// console.log(res.data)
})
},
// treeId
findTreePatient() {
this.$http.get('/tree/findPatientTree', { params: {
limit: 10,
page: 1,
platform: this.platform,
treeId: this.curNode.id
}}).then(res => {
this.curPatient = res.data.data.list.map(item => {
return {
name: item.patientName,
...item
}
})
this.handlePatientList(this.collectData)
})
},
//
async queryPatientRemarks() {
const { data } = await this.$http.get('/tree/findTreeIsExistPatient', {
params: {
doctorId: this.doctorId,
patientId: this.patientId,
platform: this.platform
}
})
this.collectData = data.data
},
//
handlePatientList(data) {
data.forEach(item => {
if (!item.childs) {
item.childs = []
}
if (this.curNode.id === item.id) {
const arr = _.uniqWith(item.childs.concat(this.curPatient), (item1, item2) => item1.id === item2.id)
this.$set(item, 'childs', arr)
} else {
this.handlePatientList((item.childs))
}
})
return data
},
//
async findTree() {
const { data } = await this.$http.get(`/tree/findTree`, {
params: {
doctorId: JSON.parse(window.sessionStorage.getItem('qg-userData')).id,
platform: this.platform
}
})
await this.queryPatientRemarks()
},
//
// async patientTrees() {
// const { data } = await this.$http.get('/tree/findTreeIsExistPatient', {
// params: {
// doctorId: this.doctorId,
// patientId: this.patientId,
// platform: this.platform
// }
// })
// console.log('', data)
// },
levelClick(data) {
this.curNode = data
this.remark = data.remark || ''
this.findTreePatient()
},
searchRemark(data) {
// this.treeId = data.id
// this.remark = data.hisManagePatientEntity ? data.hisManagePatientEntity.remark : ''
// this.remarkId = data.hisManagePatientEntity ? data.hisManagePatientEntity.id : ''
},
//
handleAddPatient() {
let params = {}
if (!this.curNode.patientId) {
//
params = {
createDate: this.$moment().format('YYYY-MM-DD HH:mm:ss'),
patientId: this.patientId,
platform: this.platform,
remark: this.remark,
treeId: this.curNode.id
}
this.editMessage = '收藏成功!'
} else {
//
params = {
patientId: this.curNode.patientId,
platform: this.platform,
remark: this.remark,
treeId: this.curNode.treeId,
id: this.curNode.id
}
this.editMessage = '修改成功!'
}
this.$http.post('/tree/addPatientTree', params).then(() => {
this.$message({
message: this.editMessage,
type: 'success'
})
this.findTree()
})
},
//
addNode(command, node, data) {
this.editMessage = '添加成功!'
this.disabled = false
switch (command) {
//
case 'same':
this.dialogFormVisible = true
this.addParam.id = ''
this.addParam.parentId = data.parentId
this.editName = node.name
break
//
case 'child':
this.dialogFormVisible = true
this.addParam.id = ''
this.addParam.parentId = data.id
this.editName = node.name
break
//
default:
this.addParam.id = ''
this.addParam.parentId = 0
this.editName = ''
break
}
},
// /
async confirmNode() {
const params = {
createDate: this.$moment().format('YYYY-MM-DD HH:mm:ss'),
doctorId: this.doctorId,
flag: '1',
name: this.editName,
platform: this.platform,
...this.addParam
}
this.disabled = true
await this.$http.post('/tree/addTree', params)
this.$message({
message: this.editMessage,
type: 'success'
})
this.dialogFormVisible = false
await this.findTree()
},
//
handleNode(command, node, data) {
switch (command) {
case 'rename':
this.disabled = false
this.editNode(node, data)
break
case 'delete':
this.deleteNode(node, data)
break
case 'edit':
}
},
//
deleteNode(node, data) {
//
if (data.patientId) {
const param = {
id: data.id,
patientId: data.patientId,
platform: this.platform,
remark: data.remark,
treeId: data.treeId
}
this.$confirmFun('你确定要删除吗?').then(() => {
this.$http.post('/tree/deletePatientTree', param).then(() => {
this.$message({
message: '删除成功!',
type: 'success'
})
this.findTree()
})
})
} else {
//
const params = {
doctorId: this.doctorId,
flag: '1',
name: data.label,
platform: this.platform,
id: data.id
}
this.$confirmFun('你确定要删除吗?').then(() => {
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.editMessage = '重命名成功!'
this.addParam.id = data.id
this.addParam.parentId = data.parentId
}
}
}
</script>
<style lang="scss" scoped>
.collection {
width: 650px;
display: flex;
flex-direction: column;
justify-content: space-between;
.collection_title{
font-size: 16px;
font-weight: bold;
padding: 18px;
}
.cell-cursor {
cursor: pointer;
color: #1e79ff;
}
.table-column-disable {
color: #dddd;
}
::v-deep .el-textarea__inner{
height: 164px;
}
}
.collect_context{
overflow: hidden;
overflow-y: scroll;
}
</style>

290
src/components/360View/dataInfo.vue

@ -1,290 +0,0 @@
<template>
<div class="infoContainer">
<div v-if="foreList.length" style="padding: 6px">
<el-table
max-height="450"
:data="foreList"
style="width:100%;margin: 8px 8px 0 0"
>
<el-table-column
align="center"
type="index"
width="40"
/>
<el-table-column
align="center"
label="项目"
width="90"
>
<template slot-scope="scope">
<div>
<span v-if="scope.row.sort === 1">
<span style="margin-right: 16px">结膜充血</span>
</span>
<span v-else-if="scope.row.sort === 2">
<span style="margin-right: 16px">结膜分泌物</span>
</span>
<span v-else-if="scope.row.sort === 3">
<span style="margin-right: 16px">视盘视神经</span>
</span>
<span v-else-if="scope.row.sort === 4">
<span style="margin-right: 16px">视盘CDR</span>
</span>
<span v-else>
{{ scope.row.name }}
</span>
</div>
</template>
</el-table-column>
<el-table-column
:show-overflow-tooltip="true"
align="center"
label="OD"
>
<template slot-scope="scope">
<div>
<span v-if="scope.row.sort === 5">
<div v-if="scope.row.eyeType === 'OD'">
<p style="margin-right: 16px">球镜 DS{{ scope.row.odSph }}</p>
<p style="margin-right: 16px">柱镜 DC{{ scope.row.odCyl }}</p>
<p style="margin-right: 16px">轴位 Axis{{ scope.row.odAx }}</p>
<p style="margin-right: 16px">矫正视力(VA){{ scope.row.odVa }}</p>
<p style="margin-right: 16px">下加光(ADD){{ scope.row.odAdd }}</p>
</div>
</span>
<span v-else-if="scope.row.sort === 6">
<div v-if="scope.row.eyeType === 'OD'">
<p style="margin-right: 16px">球镜 DS{{ scope.row.odSph }}</p>
<p style="margin-right: 16px">柱镜 DC{{ scope.row.odCyl }}</p>
<p style="margin-right: 16px">轴位 Axis{{ scope.row.odAx }}</p>
<p style="margin-right: 16px">矫正视力VA{{ scope.row.odVa }}</p>
<p style="margin-right: 16px">下加光(ADD){{ scope.row.odAdd }}</p>
</div>
</span>
<span v-else>
{{ scope.row.odValue }}
</span>
</div>
</template>
</el-table-column>
<el-table-column
:show-overflow-tooltip="true"
align="center"
label="OS"
>
<template slot-scope="scope">
<div>
<span v-if="scope.row.sort === 5">
<div v-if="scope.row.eyeType === 'OS'">
<p style="margin-right: 16px">球镜 DS{{ scope.row.odSph }}</p>
<p style="margin-right: 16px">柱镜 DC{{ scope.row.odCyl }}</p>
<p style="margin-right: 16px">轴位 Axis{{ scope.row.odAx }}</p>
<p style="margin-right: 16px">矫正视力(VA){{ scope.row.odVa }}</p>
<p style="margin-right: 16px">下加光(ADD){{ scope.row.odAdd }}</p>
</div>
</span>
<span v-else-if="scope.row.sort === 6">
<div v-if="scope.row.eyeType === 'OS'">
<p style="margin-right: 16px">球镜 DS{{ scope.row.odSph }}</p>
<p style="margin-right: 16px">柱镜 DC{{ scope.row.odCyl }}</p>
<p style="margin-right: 16px">轴位 Axis{{ scope.row.odAx }}</p>
<p style="margin-right: 16px">矫正视力VA{{ scope.row.odVa }}</p>
<p style="margin-right: 16px">下加光(ADD){{ scope.row.odAdd }}</p>
</div>
</span>
<span v-else>
{{ scope.row.osValue }}
</span>
</div>
</template>
</el-table-column>
<el-table-column
:show-overflow-tooltip="true"
align="center"
label="OU"
width="80"
>
<template slot-scope="scope">
<div>
<span v-if="scope.row.sort === 1">
<span style="margin-right: 16px" />{{ scope.row.ouValue }}
</span>
<span v-else-if="scope.row.sort === 5">
<div v-if="scope.row.eyeType === 'OU'">
<p style="margin-right: 16px">球镜 DS{{ scope.row.odSph }}</p>
<p style="margin-right: 16px">柱镜 DC{{ scope.row.odCyl }}</p>
<p style="margin-right: 16px">轴位 Axis{{ scope.row.odAx }}</p>
<p style="margin-right: 16px">等效球镜{{ scope.row.odSe }}</p>
</div>
</span>
<span v-else-if="scope.row.sort === 6">
<div v-if="scope.row.eyeType === 'OU'">
<p style="margin-right: 16px">球镜 DS{{ scope.row.odSph }}</p>
<p style="margin-right: 16px">柱镜 DC{{ scope.row.odCyl }}</p>
<p style="margin-right: 16px">轴位 Axis{{ scope.row.odAx }}</p>
<p style="margin-right: 16px">矫正视力VA{{ scope.row.odVa }}</p>
</div>
</span>
<span v-else>
{{ scope.row.ouValue }}
</span>
</div>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="138">
<template slot-scope="scope">
<span
class="cell-cursor"
style="margin-left: 5px;"
:class="scope.$index === 0 ? 'table-column-disable' : ''"
@click="handleMove(scope, 'up', foreList)"
>上移</span>
<span
class="cell-cursor"
style="margin-left: 5px;"
:class="scope.$index === foreList.length - 1 ? 'table-column-disable' : ''"
@click="handleMove(scope, 'down', foreList)"
>下移</span>
<span
class="cell-cursor"
style="margin-left: 5px;color: #FF4D4F"
@click="handleDel(scope.$index, foreList)"
>
删除
<!-- <i class="el-icon-delete"></i>-->
</span>
</template>
</el-table-column>
</el-table>
</div>
<div style="width: 100%;margin-top: 16px;display: flex;justify-content: space-between">
<el-button style="width: 48%;" type="primary" size="small" @click="addExamine">引入专科检查</el-button>
<el-button class="btn" style="width: 48%" size="small" :data-clipboard-text="coryData" @click="onCopy">复制</el-button>
</div>
</div>
</template>
<script>
import eventBus from '@/page-subspecialty/utils/eventBus'
import Clipboard from 'clipboard'
export default {
props: {
patientIdNumber: {
type: String,
default: ''
},
dataList: {
type: Array,
default() {
return []
}
},
foreList: {
type: Array,
default() {
return []
}
},
afterList: {
type: Array,
default() {
return []
}
},
sourceData: {
type: String,
default: ''
}
},
data() {
return {
clipboard: null,
setPlanList: [],
coryData: [],
addFollowList: [],
patientInfoHeadHeight: '',
crfSelectVisible: false
}
},
mounted() {
},
methods: {
removeBlock(str) {
if (str) {
str = str.replace(/\[|]/g, '')
str = str.replace(/\,/g, ' ')
str = str.replace(/abcde/g, '\n')
str = str.replace(/\"/g, '')
return str
} else {
return str
}
},
//
onCopy() {
this.coryData = []
this.foreList.forEach((item, index) => {
if (item.sort === 5 || item.sort === 6) {
this.coryData.push(item.name, item.odSph, item.odCyl, item.odAx, item.odVa, item.odAdd, 'abcde')
} else {
this.coryData.push(item.name, item.odValue ? item.odValue : '', item.osValue ? item.osValue : '', 'abcde')
}
})
this.coryData = this.removeBlock(JSON.stringify(this.coryData))
this.clipboard && this.clipboard.destroy()
this.clipboard = null
this.clipboard = new Clipboard('.btn')
const self = this
this.clipboard.on('success', function(e) {
self.$message.success('复制成功!')
e.clearSelection()
})
this.clipboard.on('error', function(e) {
self.$message.warning('复制失败!')
})
},
//
handleMove(scope, moveType, list) {
const { $index } = scope
if (moveType === 'up') {
if ($index === 0) return
const isUp = list[$index - 1]
list.splice($index - 1, 1)
list.splice($index, 0, isUp)
} else {
if ($index === list.length - 1) return
const isDown = list[$index + 1]
list.splice($index + 1, 1)
list.splice($index, 0, isDown)
}
},
//
handleDel(index, list) {
list = list.splice(index, 1)
},
//
addExamine() {
eventBus.$emit('sendDataToExamine', this.foreList)
this.$parent.closeByButton()
}
}
}
</script>
<style lang="scss" >
</style>
<style lang="scss" scoped>
.infoContainer {
width: 650px;
height: 100%;
overflow-y: auto;
.cell-cursor {
cursor: pointer;
color: #1e79ff;
}
.table-column-disable {
color: #dddd;
}
}
</style>

3
src/components/360View/drawer.vue

@ -137,8 +137,7 @@ export default {
.main {
position: fixed;
z-index: 999;
top: 60px;
height: calc(100% - 70px);
height: 100%;
background: #fff;
transition: all 0.5s;
}

84
src/components/360View/img-editor.vue

@ -1,84 +0,0 @@
<template>
<el-dialog
top="1vh"
width="95%"
:visible.sync="visible"
fullscreen
append-to-body
:show-close="false"
class="img-editor"
@closed="closeDialog"
>
<home-view :is-od-or-os="isOdOrOs" @closeDialog="closeDialog" @fullImgBack="fullImgBack" />
</el-dialog>
</template>
<script>
import odOrOs from '@/components/360View/base64/odOrOs'
import HomeView from '@/page-subspecialty/views/modules/imgEditorFabric/index.vue'
export default {
components: { HomeView },
props: {
bodyStyleShow: {
type: Boolean,
default: false
},
//
title: {
type: String,
default: ''
},
isOdOrOs: {
type: String
}
},
data() {
return {
visible: false
}
},
methods: {
init() {
this.visible = true
},
fullImgBack(value) {
this.$emit('fullImgBack', value)
this.visible = false
},
closeDialog() {
this.$emit('closeDialog')
this.visible = false
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog__header{
padding: 0;
}
::v-deep .el-dialog__body{
padding: 0;
background: #515a6e;
}
::v-deep .el-dialog.is-fullscreen{
background: #515a6e;
}
.img-editor{
.replace-picture {
z-index: 999;
position: fixed;
right:35px;
top: 73px;
cursor: pointer;
}
.dialog-container {
height: calc(100vh - 1vh - 54px - 70px);
}
#inputFile {
opacity: 0;
}
.el-icon-picture-outline {
font-size: 28px;
}
}
</style>

31
src/components/360View/index.vue

@ -36,18 +36,12 @@
<el-tab-pane name="病史总览" label="病史总览" style="height: 100%">
<overView :patient-id="patientId||$route.query.patientId" />
</el-tab-pane>
<el-tab-pane name="门诊病历" label="门诊病历" style="height: 100%">
<medicalRecord :type-name="timeAxisType" :patient-id="patientId || $route.query.patientId" :is-search="isSearch || $route.query.isSearch" :only-read="readOnly" />
</el-tab-pane>
<el-tab-pane name="常规检查" label="常规检查" style="height: 100%">
<routine :patient-id="patientId||$route.query.patientId" :date="date" :only-read="readOnly" />
</el-tab-pane>
<el-tab-pane name="特殊检查" label="特殊检查" style="height: 100%">
<special :patient-id="patientId||$route.query.patientId" :only-read="readOnly" />
</el-tab-pane>
<el-tab-pane name="视光档案" label="视光档案" style="height: 100%">
<opticalFile :patient-id="patientId||$route.query.patientId" :is-search="isSearch || $route.query.isSearch" :only-read="readOnly" />
</el-tab-pane>
<el-tab-pane name="诊断" label="诊断" style="height: 100%">
<el-table
:data="timeAxisNodeInfo"
@ -204,9 +198,6 @@
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane name="随访记录" label="随访记录" style="height: 100%">
<followUpRecord :patient-id="patientId||$route.query.patientId" :only-read="readOnly" />
</el-tab-pane>
</el-tabs>
</div>
</div>
@ -223,12 +214,6 @@
:patient-id="patientId"
:patient-id-number="patientBaseData.patientIdNumber"
/>
<!-- 数据集-->
<dataInfo v-if="dataType === 2" :fore-list="foreList" :after-list="afterList" />
<!-- 病历收藏-->
<collection v-if="dataType === 3" :patient-id="patientBaseData.patientId" :platform="isSearch || $route.query.isSearch" />
<!-- 常用业务-->
<business v-if="dataType === 4" :patient-id="patientBaseData.patientId" :platform="isSearch || $route.query.isSearch" :patient-name="patientBaseData.patientName" />
</drawer>
</div>
</template>
@ -236,9 +221,6 @@
import timeLine from './time-line.vue'
import shrink from '@/components/360View/shrink'
import drawer from '@/components/360View/drawer'
import dataInfo from './dataInfo' //
import collection from './collection' //
import business from './business' //
import overView from '@/components/360View/overView' //
import routine from '@/components/360View/routine' //
import special from '@/components/360View/special' //
@ -246,11 +228,10 @@ import followUpRecord from '@/components/360View/followUpRecord'
import keyIndicators from './key-indicators'
import imgRecord from './img-reccrd.vue'
import pacsList from '@/components/360View/pacs/patientList'
import medicalRecord from '@/components/360View/medicalRecord' //
import opticalFile from '@/components/360View/opticalFile' //
import eventBus from '@/page-subspecialty/utils/eventBus'
export default {
components: { timeLine, drawer, keyIndicators, shrink, business, collection, imgRecord, overView, medicalRecord, dataInfo, routine, special, followUpRecord, opticalFile, pacsList },
name: '360view',
components: { timeLine, drawer, keyIndicators, shrink, imgRecord, overView, routine, special, followUpRecord, pacsList },
mixins: [],
props: {
patientId: {
@ -407,15 +388,11 @@ export default {
},
// 360
handlePacs() {
// const baseUrl = 'http://z1.huimucloud.com:8085'
const baseUrl = 'http://z1.huimucloud.com:8085'
// const baseUrl = 'http://10.80.5.32:8026'
const baseUrl = 'http://192.168.0.85:8001'
// const baseUrl = 'http://192.168.0.85:8001'
const href = `${baseUrl}/EXAMINE_Report/InterFace?PatID=${this.patientId}&DoctorID=${this.employeeId}&PatIdKey=&ExamNo=`
window.open(href, '_blank')
// const { href } = this.$router.resolve({
// name: 'pacsManage'
// })
// window.open(href, '_blank')
},
// 360
closePacs() {

499
src/components/360View/medicalRecord/callMedical/index.vue

@ -1,499 +0,0 @@
<template>
<div class="callMedical">
<div class="archives-content">
<div class="content-left">
<div class="content-left-top">
<div v-for="(item, index) in formList" :key="index" class="formBox" :class="[index === curIndex ? 'active' : '']" @click="handleForm(index, item)">
<div>
<p :class="[index === curIndex ? 'activeFont' : 'curFont']">{{ item.createTime }}</p>
<p>{{ item.name }}</p>
</div>
<i v-if="index === curIndex && !onlyRead && isPlatform" style="margin-top: 28px;color: rgb(199,5,5)" class="el-icon-delete" @click="deleteForm(item.id)" />
</div>
<img v-if="!formList.length" src="@/assets/img/nodata.png" alt="" class="nodata">
</div>
<div class="content-left-bottom">
<div class="commonForm-text ">
<span>常用表单</span>
<span class="line" />
<el-checkbox v-model="defaultChecked">默认新建今日</el-checkbox>
</div>
<div v-if="isSearch === '1'" class="record">
<p>门急诊电子病历</p>
<img v-if="!onlyRead" :src="require('@/assets/img/add.png')" alt="" @click="addRecord('门急诊电子病历')">
</div>
<div class="comonForm-tab">
<el-radio-group v-model="formType" size="small">
<el-radio-button label="门诊" name="门诊" style="" />
<!-- <el-radio-button label="手术" name="2" style=""></el-radio-button>-->
<el-radio-button label="其他" name="其他" style="" />
</el-radio-group>
<div v-if="formType === '门诊'" class="record">
<p>门急诊电子病历</p>
<img v-if="!onlyRead&&isSearch === '1'" :src="require('@/assets/img/add.png')" alt="" @click="addRecord('门急诊电子病历')">
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
components: {
},
mixins: [],
props: {
isSearch: {
type: String,
default: ''
},
patientIdNumber: {
type: String,
default: ''
},
patientId: {
type: String,
default: ''
},
isPlatform: {
type: Boolean,
default: true
},
onlyRead: {
type: Boolean,
default: false
},
typeName: {
type: String,
default: ''
}
},
inject: ['refresh'],
data() {
return {
id: '',
name: '',
curIndex: 0,
formIdList: [],
formList: [],
defaultChecked: true,
formType: '门诊'
}
},
watch: {
typeName(val) {
if (val === '门诊病历' && !this.formList.length) {
this.getFormList()
}
}
},
methods: {
handleForm(index, item) {
if (this.$parent.isPlatform && item.platform && this.name !== item.name) {
this.confirmChange().finally(() => {
this.setForm(index, item)
})
} else {
this.setForm(index, item)
}
},
setForm(index, item) {
this.curIndex = index
this.id = item.id
this.name = item.name
this.$parent.name = item.name
this.$parent.caseId = item.id
this.$parent.jsonText = item.jsonText
this.$parent.isPlatform = this.isSearch === item.platform
},
//
confirmChange() {
return this.$confirmFun('是否保存数据,否则当前数据会丢弃!', '保存', '', '已取消保存数据!')
.then(() => {
this.$nextTick(() => {
switch (this.name) {
case '门急诊电子病历':
this.$refs.ourPatient && this.$refs.ourPatient.handleSaveTable()
break
}
})
})
},
//
addRecord(name) {
this.saveTableData(name)
},
async saveTableData(name) {
const date = this.$moment().format('YYYY-MM-DD HH:mm:ss')
const isToday = this.formList.some(item => item.createTime.includes(date.split(' ')[0]) && item.name === '门急诊电子病历')
if (isToday) {
this.$message({
message: '已有今日病例,请勿重复添加!',
type: 'warning'
})
return
}
const params = {
flag: 8,
name: name,
createTime: date,
patientId: this.patientId,
platform: this.isSearch
}
const { data: res } = await this.$http.post('/case/save', params)
if (res.code === 0) {
await this.getFormList()
} else {
this.$message.error(res.msg)
}
},
deleteForm(id) {
const params = {
id: id
}
this.$confirmFun('你确定要删除吗?').then(async() => {
const { data: res } = await this.$http.post('/case/delete', params)
if (res.code === 0) {
this.$message.success('删除成功')
this.id = ''
await this.getFormList()
} else {
this.$message.error(res.msg)
}
})
},
async getFormList() {
const { data: res } = await this.$http.get('/patient/view/getCases', {
params: {
patientId: this.patientId,
flag: 8
}
})
if (res.code === 0) {
this.formList = res.data || []
if (this.formList.length) {
const first = this.formList[0]
this.setForm(0, first)
} else {
if (this.isSearch === '1' && !this.onlyRead) {
this.addRecord('门急诊电子病历')
}
}
} else {
this.$message.error(res.msg)
}
}
}
}
</script>
<style lang="scss" scoped>
.callMedical {
height: 100%;
.text-ellipsis {
white-space: nowrap; //
text-overflow: ellipsis;
overflow: hidden;
}
.printer {
border: 1px solid #ccc;
width: 56px;
height: 32px;
border-radius: 3px;
margin: 0;
margin-left: 10px;
cursor: pointer;
}
.archives-content {
//display: flex;
height: 100%;
overflow: hidden;
.formBox{
display: flex;
justify-content: space-between;
cursor: pointer;
padding: 2px 8px;
border-radius: 2px;
margin-top: 12px;
}
.active {
color: white;
background-color: #1C76FD;
}
.curFont {
color: #A6A4A4;
}
.activeFont {
color: #D9D9D9;
}
.content-left {
width: 185px;
height: 100%;
margin-right: 14px;
.nodata {
width: 175px;
margin-top: 30px;
}
.content-left-top,
.content-left-bottom {
height: 50%;
}
.tree-botton-arr {
margin-left: 10px;
}
.tree-date {
padding-right: 10px;
}
.content-left-top {
overflow-y: auto;
padding-bottom: 8px;;
margin-bottom: 16px;
.CRFList-list {
display: flex;
justify-content: space-between;
align-items: center;
padding-left: 24px;
padding-right: 16px;
color: #000;
}
.CRFList-list {
height: 40px;
line-height: 40px;
font-size: 14px;
cursor: pointer;
.el-icon-more {
transform: rotate(90deg);
}
}
.CRFList-icon:hover {
color: #ff2929;
}
.CRFList-list-active {
background-color: #1890ff;
color: #fff;
.el-icon-more {
color: #fff;
}
}
.button {
margin-top: 16px;
background: #f2f3f5;
border-radius: 4px;
height: 40px;
line-height: 40px;
text-align: center;
cursor: pointer;
}
.button:hover,
.el-icon-plus:hover {
color: #1890ff;
}
}
.content-left-bottom {
.commonForm-text {
display: flex;
align-items: center;
font-size: 14px;
font-weight: 700;
}
.line {
border-bottom: 1px solid #e5e6eb;
flex: 1;
display: inline-block;
margin: 0 10px;
}
.comonForm-tab {
margin-top: 10px;
}
.comonForm-tab-Pane {
margin-top: 10px;
}
.comonForm-list {
height: 40px;
line-height: 40px;
font-size: 14px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 10px;
cursor: pointer;
}
.comonForm-list:hover {
background-color: #f4f8fb;
color: #1d2129;
}
.comonForm-icon:hover {
color: #1890ff;
font-weight: 700;
}
}
}
.record{
display: flex;
justify-content: space-between;
padding-top: 12px;
cursor: pointer;
p {
display: inline-block;
font-size: 14px;
color: rgba(0, 0, 0, 0.85);
letter-spacing: 1px;
}
img {
width: 16px;
height: 16px;
margin-top: 3px;
}
}
}
.content-right {
padding: 12px;
position: relative;
flex: 1;
text-align: center;
background-color: #F0F2F5;
overflow-y: hidden;
.content-right-buttonClick {
display: flex;
justify-content: flex-end;
background: #2e2e2e;
padding: 10px;
}
.editor-CRF {
height: 93%;
}
.content-right-CRF {
background: #5c5c5c;
overflow-x: auto;
padding: 16px 16px 16px 16px;
position: relative;
height: 100%;
}
.content-right-CRF-class {
padding-right: 178px;
}
.suspension-button {
position: absolute;
right: 10px;
top: 10px;
z-index: 1;
}
.case-template,
.intelligent-filling {
cursor: pointer;
height: 140px;
width: 32px;
background: #fff;
border-radius: 4px;
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);
span {
writing-mode: vertical-rl;
letter-spacing: 6px;
}
}
.case-template:hover,
.intelligent-filling:hover {
background: linear-gradient(270deg, #f4f8fb 0%, #deebff 66.15%);
}
.case-template {
margin-bottom: 6px;
}
}
}
</style>
<style lang="scss">
.callMedical {
.el-button .el-button--text .el-button--mini {
padding: 0;
}
.tree-date {
font-size: 14px;
color: #ccc;
}
.tree-date-active {
color: #e4e4e4;
}
.el-tree-node {
margin-bottom: 6px;
}
.el-tree-node__content {
margin-bottom: 4px;
height: 35px;
//padding-left: 0 !important;
}
//.tree-children {
// padding: 2px 0 2px 20px;
// position: relative;
//}
//.el-tree-node__expand-icon.is-leaf {
// display: none;
//}
.tree-children:hover {
.tree-button {
display: inline-block;
}
}
.tree-button {
position: absolute;
bottom: 6px;
right: 4px;
display: none;
}
.tree-button-active {
color: #fff;
}
.custom-tree-node {
flex: 1;
padding-top: 6px;
overflow: hidden;
}
.tree-forname {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
width: 90%;
}
.el-tree-node__content:hover,
.el-upload-list__item:hover {
background: none;
}
.el-icon-caret-right:before {
color: #262626;
}
}
.comonForm-tab {
#tab-mz {
padding-left: 14px !important;
}
.el-tabs__nav-wrap::after {
height: 0;
}
.el-tabs__header {
padding-right: 0 !important;
}
.el-tabs__item.is-active {
color: #fff;
background: #1890ff;
}
.el-tabs__item {
background: #f2f3f5;
padding: 0 14px;
margin-left: 1px;
height: 35px;
line-height: 35px;
}
.el-tabs__content {
padding: 0 !important;
}
}
.see-doctor .comonForm-tab .el-tabs__item:last-child {
padding-right: 14px !important;
}
.see-doctor .comonForm-tab .el-tabs__item:nth-child(2) {
padding-left: 14px !important;
}
</style>

754
src/components/360View/medicalRecord/index.vue

@ -1,754 +0,0 @@
<template>
<div class="archives">
<div class="archives-content">
<div v-if="isSearch === '1' || isSearch === '3'" class="content-left">
<callMedical :type-name="typeName" :is-platform="isPlatform" :is-search="isSearch" :patient-id="patientId" :only-read="onlyRead" />
</div>
<left-form-list
v-if="isSearch === '2'"
ref="leftFormList"
:patient-id="patientId"
:is-search="isSearch"
:only-read="onlyRead"
:is-platform="isPlatform"
:form-list="formList"
:cur-index="curIndex"
@handleForm="handleForm"
@deleteForm="formDelete"
@addRecord="addRecord"
/>
<div class="content-right">
<div v-if="!formList.length && isSearch === '2'" style="height: 100%;background: #fff;display: flex;align-items: center;justify-content: center">
<img src="@/assets/img/nodata.png" alt="">
</div>
<div v-else style="height: 100%">
<ourPatientRecord
v-if="name === '门急诊电子病历'"
ref="ourPatient"
:patient-id="patientId"
:is-platform="isPlatform"
:only-read="onlyRead"
:is-search="isSearch"
:case-id="caseId"
/>
<InformedConsent
v-if="name==='眼科激光手术患者知情同意书'"
ref="informedConsent"
:only-read="onlyRead"
:is-platform="isPlatform"
:patient-detail="patientData"
:case-id="id"
@handleSaveTable="updateForm"
@formDelete="formDelete"
/>
<mra-order
v-if="name==='眼底血管造影患者预约单'"
ref="mraOrder"
:patient-detail="patientData"
:only-read="onlyRead"
:is-platform="isPlatform"
:case-id="id"
@handleSaveTable="updateForm"
@formDelete="formDelete"
/>
<mra-form
v-if="name==='眼底血管造影知情同意书'"
ref="mraForm"
:only-read="onlyRead"
:is-platform="isPlatform"
:patient-detail="patientData"
:case-id="id"
@handleSaveTable="updateForm"
@formDelete="formDelete"
/>
<laser-surgery
v-if="name==='眼科激光手术治疗'"
ref="laserSurgery"
:only-read="onlyRead"
:is-platform="isPlatform"
:patient-detail="patientData"
:case-id="id"
@handleSaveTable="updateForm"
@formDelete="formDelete"
/>
<report-form
v-if="name==='睑板腺按摩'"
ref="reportForm"
:only-read="onlyRead"
:is-platform="isPlatform"
:patient-detail="patientData"
:case-id="id"
@handleSaveTable="updateForm"
@formDelete="formDelete"
/>
<minor-operation
v-if="name==='干眼手术知情同意书'"
ref="minorOperation"
:only-read="onlyRead"
:is-platform="isPlatform"
:patient-detail="patientData"
:case-id="id"
@handleSaveTable="saveFormData"
@formDelete="formDelete"
/>
<stye-form
v-if="name==='麦粒肿、霰粒肿、肉芽肿、眼睑肿物手术知情同意书'"
ref="styeForm"
:only-read="onlyRead"
:is-platform="isPlatform"
:patient-detail="patientData"
:case-id="id"
@handleSaveTable="saveFormData"
@formDelete="formDelete"
/>
<Lacrimal
v-if="name==='泪道冲洗'"
ref="lacrimal"
:only-read="onlyRead"
:is-platform="isPlatform"
:patient-detail="patientData"
:case-id="id"
@handleSaveTable="saveFormData"
@formDelete="formDelete"
/>
<InjectionTherapy
v-if="name==='球旁注射同意书'"
ref="injectionTherapy"
:only-read="onlyRead"
:is-platform="isPlatform"
:patient-detail="patientData"
:case-id="id"
@handleSaveTable="saveFormData"
@formDelete="formDelete"
/>
<DrugInjection
v-if="name==='药物注射手术知情同意书'"
ref="drugInjection"
:only-read="onlyRead"
:is-platform="isPlatform"
:patient-detail="patientData"
:case-id="id"
@handleSaveTable="saveFormData"
@formDelete="formDelete"
/>
<childrenLacrimal
v-if="name==='小儿泪道冲洗知情同意书'"
ref="childrenLacrimal"
:only-read="onlyRead"
:is-platform="isPlatform"
:patient-detail="patientData"
:case-id="id"
@handleSaveTable="updateForm"
@formDelete="formDelete"
/>
<conjunctival-operation
v-if="name==='干眼激光治疗知情同意书'"
ref="conjunctival"
:only-read="onlyRead"
:is-platform="isPlatform"
:patient-detail="patientData"
:case-id="id"
@handleSaveTable="updateForm"
@formDelete="formDelete"
/>
<cornealForeign
v-if="name==='角膜异物剔除术知情同意书'"
ref="cornealForeign"
:only-read="onlyRead"
:is-platform="isPlatform"
:patient-detail="patientData"
:case-id="id"
@handleSaveTable="updateForm"
@formDelete="formDelete"
/>
<puncture
v-if="name==='前房穿刺知情同意书'"
ref="puncture"
:only-read="onlyRead"
:is-platform="isPlatform"
:patient-detail="patientData"
:case-id="id"
@handleSaveTable="updateForm"
@formDelete="formDelete"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import ourPatientRecord from './outPatientRecord'
import callMedical from './callMedical'
import LeftFormList from '@/components/360View/medicalRecord/outPatientRecord/leftFormList.vue'
import InformedConsent from '@/page-subspecialty/views/modules/formList/InformedConsent.vue'
import MraForm from '@/page-subspecialty/views/modules/formList/mraForm.vue'
import LaserSurgery from '@/page-subspecialty/views/modules/formList/laserSurgery.vue'
import ReportForm from '@/page-subspecialty/views/modules/formList/reportForm.vue'
import MraOrder from '@/page-subspecialty/views/modules/formList/mraOrder.vue'
import MinorOperation from '@/page-subspecialty/views/modules/formList/MinorOperation.vue'
import conjunctivalOperation from '@/page-subspecialty/views/modules/formList/conjunctivalOperation'
import cornealForeign from '@/page-subspecialty/views/modules/formList/cornealForeign'
import childrenLacrimal from '@/page-subspecialty/views/modules/formList/childrenLacrimal.vue'
import puncture from '@/page-subspecialty/views/modules/formList/puncture.vue'
import Lacrimal from '@/page-subspecialty/views/modules/formList/Lacrimal.vue'
import StyeForm from '@/page-subspecialty/views/modules/formList/StyeForm.vue'
import InjectionTherapy from '@/page-subspecialty/views/modules/formList/InjectionTherapy.vue'
import DrugInjection from '@/page-subspecialty/views/modules/formList/DrugInjection.vue'
export default {
components: {
DrugInjection,
InjectionTherapy,
StyeForm,
Lacrimal,
childrenLacrimal,
MinorOperation,
MraOrder,
callMedical,
ReportForm,
LaserSurgery,
MraForm,
InformedConsent,
puncture,
LeftFormList,
cornealForeign,
conjunctivalOperation,
ourPatientRecord
},
mixins: [],
props: {
isSearch: {
type: String,
default: ''
},
patientIdNumber: {
type: String,
default: ''
},
patientId: {
type: String,
default: ''
},
onlyRead: {
type: Boolean,
default: false
},
// tab
typeName: {
type: String,
default: ''
}
},
inject: ['refresh'],
data() {
return {
id: '',
name: '',
caseId: '',
jsonText: '',
isPlatform: true,
curIndex: 0,
formList: [],
defaultChecked: [],
formType: '门诊',
patientData: {}
}
},
created() {
this.getPatientData()
if (this.isSearch === '2') {
this.getFormList()
}
},
methods: {
handleForm({ index, item }) {
//
if (this.curIndex === index) {
return
}
if (this.name === '门急诊电子病历') {
this.isPlatform = false
}
// 360
if (this.onlyRead || !this.isPlatform) {
this.curIndex = index
this.id = item.id
this.name = item.name
this.caseId = item.id
this.isPlatform = this.isSearch === item.platform
return
}
this.confirmChange().finally(() => {
this.curIndex = index
this.id = item.id
this.name = item.name
this.caseId = item.id
this.isPlatform = this.isSearch === item.platform
})
},
//
confirmChange() {
return this.$confirmFun('是否保存数据,否则当前数据会丢弃!', '保存', '', '已取消保存数据!')
.then(() => {
this.$nextTick(() => {
switch (this.name) {
case '报告':
this.$refs.reportForm && this.$refs.reportForm.handleSaveTable()
break
case '眼科激光手术患者知情同意书':
this.$refs.informedConsent && this.$refs.informedConsent.handleSaveTable()
break
case '眼底血管造影知情同意书':
this.$refs.mraForm && this.$refs.mraForm.handleSaveTable()
break
case '眼底血管造影患者预约单':
this.$refs.mraForm && this.$refs.mraForm.handleSaveTable()
break
case '眼科激光手术治疗':
this.$refs.laserSurgery && this.$refs.laserSurgery.handleSaveTable()
break
default:
this.$refs.ourPatient && this.$refs.ourPatient.handleSaveTable()
return
}
})
})
},
getPatientData() {
const params = {
patientId: this.patientId
}
this.$http.get('/patient/view/getPatientData', { params }).then(data => {
this.patientData = data.data.data
})
},
updateForm() {
this.$message.success('保存成功')
this.getFormList('update')
},
//
saveFormData(data) {
const params = {
id: this.id,
flag: 8,
jsonText: data,
name: this.name,
patientId: this.patientId,
platform: 2
}
this.$http.post('/case/update', params).then(data => {
this.updateForm()
this.$store.commit('destroyPlugin')
})
},
//
deleteFormData() {
this.$confirmFun('确定删除吗?').then(() => {
this.$http.post('/case/delete', {
id: this.id
}).then(() => {
this.$message.success('删除成功')
this.getFormList()
})
})
},
addRecord(name) {
const date = this.$moment().format('YYYY-MM-DD HH:mm:ss')
//
const isToday = this.formList.some(item => item.createTime.includes(date.split(' ')[0]) && item.name === '门急诊电子病历')
if (name === '门急诊电子病历' && isToday) {
this.$message({
message: '今日已有病历,请勿重复添加!',
type: 'warning'
})
return
}
const isMedical = name === '门急诊电子病历'
const params = {
flag: 8,
name: name,
createTime: date,
isMedical,
patientId: this.patientId,
platform: this.isSearch
}
this.$http.post('/case/save', params).then(res => {
this.getFormList()
this.name = name
}).catch(err => {
this.$message.error(err.msg)
})
},
//
formDelete(val) {
if (!val) {
switch (this.name) {
case '眼科激光手术患者知情同意书':
this.$refs.informedConsent.formDelete()
break
case '睑板腺按摩':
this.$refs.reportForm.formDelete()
break
case '眼底血管造影知情同意书':
this.$refs.mraForm.formDelete()
break
case '眼底血管造影患者预约单':
this.$refs.mraOrder.formDelete()
break
case '眼科激光手术治疗':
this.$refs.laserSurgery.formDelete()
break
case '干眼激光治疗知情同意书':
this.$refs.conjunctival.formDelete()
break
case '角膜异物剔除术知情同意书':
this.$refs.cornealForeign.formDelete()
break
case '前房穿刺知情同意书':
this.$refs.puncture.formDelete()
break
case '小儿泪道冲洗知情同意书':
this.$refs.childrenLacrimal.formDelete()
break
default:
this.deleteFormData()
break
}
} else {
this.getFormList()
}
},
async getFormList(mode) {
const { data: res } = await this.$http.get('/patient/view/getCases', {
params: {
patientId: this.patientId,
// platform: this.isSearch,
flag: 8
}
})
if (res.code === 0) {
this.formList = res.data || []
if (this.formList.length) {
if (mode) return
this.name = this.formList[0].name
this.id = this.formList[0].id
this.curIndex = 0
this.isPlatform = this.isSearch === this.formList[0].platform
} else {
this.name = ''
}
} else {
this.$message.error(res.msg)
}
this.getPatientData()
}
}
}
</script>
<style lang="scss" scoped>
.archives {
height: 100%;
.text-ellipsis {
white-space: nowrap; //
text-overflow: ellipsis;
overflow: hidden;
}
.printer {
border: 1px solid #ccc;
width: 56px;
height: 32px;
border-radius: 3px;
margin: 0;
margin-left: 10px;
cursor: pointer;
}
.archives-content {
display: flex;
height: 100%;
overflow: hidden;
.formBox{
cursor: pointer;
padding: 2px 8px;
border-radius: 2px;
margin-top: 12px;
}
.active {
color: white;
background-color: #1C76FD;
}
.curFont {
color: #A6A4A4;
}
.activeFont {
color: #D9D9D9;
}
.content-left {
width: 200px;
height: 100%;
margin-right: 5px;
.nodata {
width: 175px;
margin-top: 30px;
}
.content-left-top,
.content-left-bottom {
height: 50%;
}
.tree-botton-arr {
margin-left: 10px;
}
.tree-date {
padding-right: 10px;
}
.content-left-top {
overflow-y: auto;
margin-bottom: 16px;
.CRFList-list {
display: flex;
justify-content: space-between;
align-items: center;
padding-left: 24px;
padding-right: 16px;
color: #000;
}
.CRFList-list {
height: 40px;
line-height: 40px;
font-size: 14px;
cursor: pointer;
.el-icon-more {
transform: rotate(90deg);
}
}
.CRFList-icon:hover {
color: #ff2929;
}
.CRFList-list-active {
background-color: #1890ff;
color: #fff;
.el-icon-more {
color: #fff;
}
}
.button {
margin-top: 16px;
background: #f2f3f5;
border-radius: 4px;
height: 40px;
line-height: 40px;
text-align: center;
cursor: pointer;
}
.button:hover,
.el-icon-plus:hover {
color: #1890ff;
}
}
.content-left-bottom {
.commonForm-text {
display: flex;
align-items: center;
font-size: 14px;
font-weight: 700;
}
.line {
border-bottom: 1px solid #e5e6eb;
flex: 1;
display: inline-block;
margin: 0 10px;
}
.comonForm-tab {
margin-top: 10px;
}
.comonForm-tab-Pane {
margin-top: 10px;
}
.comonForm-list {
height: 40px;
line-height: 40px;
font-size: 14px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 10px;
cursor: pointer;
}
.comonForm-list:hover {
background-color: #f4f8fb;
color: #1d2129;
}
.comonForm-icon:hover {
color: #1890ff;
font-weight: 700;
}
}
}
.record{
display: flex;
justify-content: space-between;
padding-top: 12px;
cursor: pointer;
p {
display: inline-block;
font-size: 14px;
color: rgba(0, 0, 0, 0.85);
letter-spacing: 1px;
}
img {
width: 16px;
height: 16px;
margin-top: 3px;
}
}
}
.content-right {
padding: 12px;
position: relative;
flex: 1;
text-align: center;
background-color: #F0F2F5;
overflow: hidden;
overflow-y: scroll;
.content-right-buttonClick {
display: flex;
justify-content: flex-end;
background: #2e2e2e;
padding: 10px;
}
.editor-CRF {
height: 93%;
}
.content-right-CRF {
background: #5c5c5c;
overflow-x: auto;
padding: 16px 16px 16px 16px;
position: relative;
height: 100%;
}
.content-right-CRF-class {
padding-right: 178px;
}
.suspension-button {
position: absolute;
right: 10px;
top: 10px;
z-index: 1;
}
.case-template,
.intelligent-filling {
cursor: pointer;
height: 140px;
width: 32px;
background: #fff;
border-radius: 4px;
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);
span {
writing-mode: vertical-rl;
letter-spacing: 6px;
}
}
.case-template:hover,
.intelligent-filling:hover {
background: linear-gradient(270deg, #f4f8fb 0%, #deebff 66.15%);
}
.case-template {
margin-bottom: 6px;
}
}
}
</style>
<style lang="scss">
.archives {
.el-button .el-button--text .el-button--mini {
padding: 0;
}
.tree-date {
font-size: 14px;
color: #ccc;
}
.tree-date-active {
color: #e4e4e4;
}
.el-tree-node {
margin-bottom: 6px;
}
.el-tree-node__content {
margin-bottom: 4px;
height: 35px;
//padding-left: 0 !important;
}
//.tree-children {
// padding: 2px 0 2px 20px;
// position: relative;
//}
//.el-tree-node__expand-icon.is-leaf {
// display: none;
//}
.tree-children:hover {
.tree-button {
display: inline-block;
}
}
.tree-button {
position: absolute;
bottom: 6px;
right: 4px;
display: none;
}
.tree-button-active {
color: #fff;
}
.custom-tree-node {
flex: 1;
padding-top: 6px;
overflow: hidden;
}
.tree-forname {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
width: 90%;
}
.el-tree-node__content:hover,
.el-upload-list__item:hover {
background: none;
}
.el-icon-caret-right:before {
color: #262626;
}
}
.comonForm-tab {
#tab-mz {
padding-left: 14px !important;
}
.el-tabs__nav-wrap::after {
height: 0;
}
.el-tabs__header {
padding-right: 0 !important;
}
.el-tabs__item.is-active {
color: #fff;
background: #1890ff;
}
.el-tabs__item {
background: #f2f3f5;
padding: 0 14px;
margin-left: 1px;
height: 35px;
line-height: 35px;
}
.el-tabs__content {
padding: 0 !important;
}
}
.see-doctor .comonForm-tab .el-tabs__item:last-child {
padding-right: 14px !important;
}
.see-doctor .comonForm-tab .el-tabs__item:nth-child(2) {
padding-left: 14px !important;
}
</style>

74
src/components/360View/medicalRecord/outPatientRecord/allFormPrint.vue

@ -1,74 +0,0 @@
<template>
<div id="allForeForm">
<div class="title">病史采集</div>
<div class="fore">
<history-form :form-data="formData" />
</div>
<div class="title">前段检查</div>
<div class="fore">
<fore-form
:is-search="isSearch"
:data-form="foreData"
/>
</div>
<div class="title">后段检查</div>
<div class="fore">
<after-form :is-search="isSearch" :data-form="afterData" />
</div>
<div class="title">专科检查</div>
<div class="fore">
<special-examine :is-search="isSearch" :patient-id="patientId" />
</div>
<div class="title">诊断处置</div>
<diagnosis-form :diagnosis="diagnosis" />
</div>
</template>
<script>
import HistoryForm from '@/components/360View/medicalRecord/outPatientRecord/historyForm.vue'
import ForeForm from '@/components/360View/medicalRecord/outPatientRecord/foreForm.vue'
import SpecialExamine from '@/components/360View/specialExamine/index.vue'
import DiagnosisForm from '@/components/360View/medicalRecord/outPatientRecord/diagnosisForm.vue'
import eventBus from '@/page-subspecialty/utils/eventBus'
import AfterForm from '@/components/360View/medicalRecord/outPatientRecord/afterForm.vue'
export default {
name: 'AllFormPrint',
components: { AfterForm, DiagnosisForm, SpecialExamine, ForeForm, HistoryForm },
props: ['formData', 'diagnosis', 'patientId', 'isSearch'],
data() {
return {
foreData: {},
afterData: {},
isPrint: true
}
},
mounted() {
this.initData()
},
methods: {
initData() {
eventBus.$off('getForeData')
eventBus.$off('getAfterData')
eventBus.$on('getForeData', data => {
this.foreData = JSON.parse(JSON.stringify(data))
})
eventBus.$on('getAfterData', data => {
this.afterData = JSON.parse(JSON.stringify(data))
})
}
}
}
</script>
<style scoped>
.title{
text-align: center;
margin-top: 50px;
}
#allForeForm{
width: 800px;
}
.fore{
width: calc(100% - 10px);
}
</style>

37
src/components/360View/medicalRecord/outPatientRecord/diagnosisForm.vue

@ -1,37 +0,0 @@
<template>
<div style="height: 100%">
<el-form id="formDiagnosis" ref="form" :model="diagnosis" label-width="120px" style="margin-top: 32px">
<el-form-item label="诊断:" style="width: 540px" prop="zd">
<el-input v-model="diagnosis.zd" type="textarea" auto-complete="off" :rows="4" style="width: 420px" />
</el-form-item>
<el-form-item label="处理:" style="width: 540px" prop="cl">
<el-input v-model="diagnosis.cl" type="textarea" auto-complete="off" :rows="4" style="width: 420px" />
</el-form-item>
<el-form-item label="治疗意见:" style="width: 540px" prop="zlyj">
<el-input v-model="diagnosis.zlyj" type="textarea" auto-complete="off" :rows="4" style="width: 420px" />
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: 'DiagnosisForm',
props: ['diagnosis'],
methods: {
reset() {
this.$nextTick(() => {
this.$refs.form.resetFields()
})
}
}
}
</script>
<style lang="scss">
#formDiagnosis{
.el-textarea__inner{
font-size: 16px;
}
}
</style>

656
src/components/360View/medicalRecord/outPatientRecord/foreForm.vue

@ -1,656 +0,0 @@
<template>
<el-table
id="foreCheck"
ref="multipleTable"
:data="tableData"
style="margin: 8px 8px 0 0"
>
<el-table-column
align="center"
label="OD"
>
<template slot-scope="scope">
<div>
<span v-if="scope.row.sort === 1">
<p style="margin:0 16px 6px 0">结膜充血</p>
<treeSelect
v-model="dataForm.jiemCxOd"
:props="treeProps"
style="display: inline-block;"
:options="scope.row.data"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
/>
</span>
<span v-if="scope.row.sort === 2">
<p style="margin:0 16px 6px 0">结膜分泌物</p>
<treeSelect
v-model="dataForm.jiemFmwOd"
:props="treeProps"
style="display: inline-block;"
:options="scope.row.data"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'od', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '眼睑' && scope.row.id">
<treeSelect
v-model="dataForm.yanjOd"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'od', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '泪器' && scope.row.id">
<treeSelect
v-model="dataForm.leiqOd"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'od', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '角膜' && scope.row.id">
<treeSelect
v-model="dataForm.jiaomOd"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'od', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '前房' && scope.row.id">
<treeSelect
v-model="dataForm.qianfOd"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'od', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '虹膜' && scope.row.id">
<treeSelect
v-model="dataForm.hongmOd"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'od', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '瞳孔' && scope.row.id">
<treeSelect
v-model="dataForm.tongkOd"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'od', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '晶状体' && scope.row.id">
<treeSelect
v-model="dataForm.jingztOd"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'od', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '睫状体' && scope.row.id">
<treeSelect
v-model="dataForm.jieztOd"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'od', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '眼位' && scope.row.id">
<treeSelect
v-model="dataForm.yanwOd"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'od', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '眼眶' && scope.row.id">
<treeSelect
v-model="dataForm.yankOd"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'od', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '眼球运动' && scope.row.id">
<treeSelect
v-model="dataForm.yanqydOd"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'od', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="!scope.row.sort && !scope.row.id">{{ scope.row.name }}</span>
</div>
</template>
</el-table-column>
<el-table-column
align="center"
label="OS"
>
<template slot-scope="scope">
<div>
<span v-if="scope.row.sort === 1">
<span style="margin-right: 16px">结膜充血</span><treeSelect
v-model="dataForm.jiemCxOs"
:props="treeProps"
style="display: inline-block;"
:options="scope.row.data"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'os', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.sort === 2">
<p style="margin:0 16px 6px 0">结膜分泌物</p><treeSelect
v-model="dataForm.jiemFmwOs"
:props="treeProps"
style="display: inline-block;"
:options="scope.row.data"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'os', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '眼睑' && scope.row.id">
<treeSelect
v-model="dataForm.yanjOs"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'os', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '泪器' && scope.row.id">
<treeSelect
v-model="dataForm.leiqOs"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'os', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '角膜' && scope.row.id">
<treeSelect
v-model="dataForm.jiaomOs"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'os', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '前房' && scope.row.id">
<treeSelect
v-model="dataForm.qianfOs"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'os', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '虹膜' && scope.row.id">
<treeSelect
v-model="dataForm.hongmOs"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'os', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '瞳孔' && scope.row.id">
<treeSelect
v-model="dataForm.tongkOs"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'os', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '晶状体' && scope.row.id">
<treeSelect
v-model="dataForm.jingztOs"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'os', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '睫状体' && scope.row.id">
<treeSelect
v-model="dataForm.jieztOs"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'os', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '眼位' && scope.row.id">
<treeSelect
v-model="dataForm.yanwOs"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'os', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '眼眶' && scope.row.id">
<treeSelect
v-model="dataForm.yankOs"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'os', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<span v-if="scope.row.name === '眼球运动' && scope.row.id">
<treeSelect
v-model="dataForm.yanqydOs"
:options="scope.row.data"
:props="treeProps"
:multiple="true"
:filterable="true"
:check-strictly="true"
:default-expand-all="true"
@handleNode="handleNode(scope.$index,'os', $event)"
@add="addTree(scope.row, $event)"
@remove="removeTree"
/>
</span>
<!-- <span v-if="scope.row.sort === 99">-->
<!-- <treeSelect-->
<!-- v-model="scope.row.os"-->
<!-- -->
<!-- :options="scope.row.data"-->
<!-- :props="treeProps"-->
<!-- :multiple="true"-->
<!-- :filterable="true"-->
<!-- :check-strictly="true"-->
<!-- :default-expand-all="true"-->
<!-- @handleNode="handleNode(scope.$index,'os', $event)"-->
<!-- @add="addTree(scope.row, $event)"-->
<!-- @remove="removeTree"-->
<!-- />-->
<!-- </span>-->
<span v-if="!scope.row.sort && !scope.row.id">{{ scope.row.name }}</span>
</div>
</template>
</el-table-column>
</el-table>
</template>
<script>
import treeSelect from '@/components/360View/itemSelect'
import axios from 'axios'
import Cookies from 'js-cookie'
export default {
name: 'ForeForm',
components: {
treeSelect
},
props: {
dataForm: {
type: Object
},
isSearch: {
type: String,
default: ''
}
},
data() {
return {
userData: {},
doctorId: '',
treeProps: {
value: 'id',
label: 'name',
children: 'child'
},
tableData: [
{
name: '眼睑'
}, {
name: '眼睑',
sort: 99,
id: 1,
type: 'anion',
od: 'yanjOd',
os: 'yanjOs'
}, {
name: '结膜'
}, {
name: '结膜',
id: 2,
sort: 1,
type: 'jimmy',
od: 'jiemCxOd',
os: 'jiemCxOs'
}, {
name: '结膜',
id: 3,
sort: 2,
type: 'jimmy',
od: 'jiemFmwOd',
os: 'jiemFmwOs'
}, {
name: '泪器'
}, {
name: '泪器',
sort: 99,
id: 4,
type: 'liq',
od: 'leiqOd',
os: 'leiqOs'
}, {
name: '角膜'
}, {
name: '角膜',
sort: 99,
id: 5,
type: 'Giacomo',
od: 'jiaomOd',
os: 'jiaomOs'
}, {
name: '前房'
}, {
name: '前房',
sort: 99,
id: 6,
type: 'Jianfeng',
od: 'qianfOd',
os: 'qianfOs'
}, {
name: '虹膜'
}, {
name: '虹膜',
sort: 99,
id: 7,
type: 'mongo',
od: 'hongmOd',
os: 'hongmOs'
}, {
name: '瞳孔'
}, {
name: '瞳孔',
sort: 99,
id: 8,
type: 'tonguing',
od: 'tongkOd',
os: 'tongkOs'
}, {
name: '晶状体'
}, {
name: '晶状体',
sort: 99,
id: 9,
type: 'jingling',
od: 'jingztOd',
os: 'jingztOs'
}, {
name: '睫状体'
}, {
name: '睫状体',
sort: 99,
id: 10,
type: 'jingles',
od: 'jieztOd',
os: 'jieztOs'
}, {
name: '眼位'
}, {
name: '眼位',
sort: 99,
id: 11,
type: 'yawn',
od: 'yanwOd',
os: 'yanwOs'
}, {
name: '眼眶'
}, {
name: '眼眶',
sort: 99,
id: 12,
type: 'yanking',
od: 'yankOd',
os: 'yankOs'
}, {
name: '眼球运动'
}, {
name: '眼球运动',
sort: 99,
id: 13,
type: 'yang',
od: 'yanqydOd',
os: 'yanqydOs'
}]
}
},
mounted() {
this.userData = JSON.parse(window.sessionStorage.getItem('qg-userData'))
this.doctorId = this.userData.id
this.queryOptions()
},
methods: {
handleSelectionChange(val) {
this.$emit('handleSelectionChange', val)
},
//
queryTree(type) {
const baseUrl = window.SITE_CONFIG['apiURL'] + '/treetag/findTree'
return new Promise((resolve, reject) => {
axios.defaults.headers.common['token'] = window.sessionStorage.getItem('xa-token') || ''
axios.get(baseUrl, {
params: {
doctorId: this.doctorId,
type: type
}
}).then(res => {
if (res.data.code === 0) {
const data = res.data
resolve(data.data)
}
})
.catch(error => {
reject(error)
})
})
},
queryOptions() {
const treeList = []
this.tableData.forEach(item => {
item.flag = false
if (item.type) {
const p = this.queryTree(item.type)
treeList.push(p)
}
})
Promise.all(treeList).then((result) => {
if (result.length) {
result.forEach(item => {
item.forEach(row => {
this.tableData.forEach((e, index) => {
if (e.type === row.type) {
e.data = item
const sort = e.sort
if (sort === 1 || sort === 2 || sort === 99) {
e.sort = ''
this.$nextTick(() => {
e.sort = sort
})
}
}
})
})
})
}
}).catch((error) => {
})
},
//
moveHandle(index, type, row) {
if (type === 1) {
this.tableData[index].od = row.os
this.tableData[index].odValue = row.osValue
} else {
this.tableData[index].os = row.od
this.tableData[index].osValue = row.odValue
}
const sort = this.tableData[index].sort
this.tableData[index].sort = ''
this.$nextTick(() => {
this.tableData[index].sort = sort
})
},
handleNode(index, type, event) {
if (type === 'os') {
this.tableData[index].osValue = event
} else {
this.tableData[index].odValue = event
}
},
addTree(item, event) {
this.$emit('addTree', { item, event })
},
removeTree(item) {
this.$emit('removeTree', item)
},
selection(selection, val) {
this.$emit('selection', { selection, val })
}
}
}
</script>
<style lang="scss" scoped>
</style>

49
src/components/360View/medicalRecord/outPatientRecord/historyForm.vue

@ -1,49 +0,0 @@
<template>
<div style="height: 100%;overflow-y: auto">
<el-form id="medHistory" ref="form" :model="formData" label-width="140px" style="margin-top: 32px">
<el-form-item label="主诉:" style="width: 540px" prop="zhuSu">
<el-input v-model="formData.zhuSu" type="textarea" auto-complete="off" :rows="4" style="width: 420px" />
</el-form-item>
<el-form-item label="现病史:" style="width: 540px" prop="xbs">
<el-input v-model="formData.xbs" type="textarea" auto-complete="off" :rows="4" style="width: 420px" />
</el-form-item>
<el-form-item label="既往病史:" style="width: 540px" prop="jws">
<el-input v-model="formData.jws" type="textarea" auto-complete="off" :rows="4" style="width: 420px" />
</el-form-item>
<el-form-item label="过敏史:" style="width: 540px" prop="gms">
<el-input v-model="formData.gms" type="textarea" auto-complete="off" :rows="4" style="width: 420px" />
</el-form-item>
<el-form-item label="周身其他病史:" style="width: 540px" prop="zsqtbs">
<el-input v-model="formData.zsqtbs" type="textarea" auto-complete="off" :rows="4" style="width: 420px" />
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: 'HistoryForm',
props: {
formData: {
type: Object
}
},
mounted() {
},
methods: {
reset() {
this.$nextTick(()=>{
this.$refs.form.resetFields()
})
}
}
}
</script>
<style lang="scss">
#medHistory{
.el-textarea__inner{
font-size: 16px;
}
}
</style>

251
src/components/360View/medicalRecord/outPatientRecord/index.vue

@ -1,251 +0,0 @@
<template>
<div class="recordContainer">
<div v-if="!onlyRead && isPlatform" class="btnBox">
<el-button v-print="printAll" size="small" @click="handleSaveTable">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button v-if="comonFormActive === '2' || comonFormActive === '3'" type="primary" size="small" @click="handleTemplate">保存为模板</el-button>
<div v-if="comonFormActive === '2' || comonFormActive === '3'" size="small" style="display:inline-block;margin-left:10px;text-align:center;width: 32px;height: 32px;background-color: #1e79ff;border-radius: 4px;vertical-align: bottom" @click="addData">
<img :src="require('@/assets/img/data.png')" alt="" style="width: 17px;height: 16px;margin-top: 5px">
</div>
</div>
<el-tabs v-model="comonFormActive" type="border-card">
<el-tab-pane label="病史采集" name="1" style="height: 100%">
<history-form ref="history" :form-data="formData" />
</el-tab-pane>
<el-tab-pane label="前段检查" name="2" style="height: 100%">
<forePart ref="foreParts" :patient-id="patientId" :is-search="isSearch" :only-read="onlyRead" :case-id="caseId" :is-platform="isPlatform" />
</el-tab-pane>
<el-tab-pane label="后段检查" name="3" style="height: 100%">
<afterPart ref="afterParts" :patient-id="patientId" :is-search="isSearch" :only-read="onlyRead" :case-id="caseId" :is-platform="isPlatform" />
</el-tab-pane>
<el-tab-pane label="专科检查" name="4" style="height: 100%">
<specialExamine ref="examines" :patient-id="patientId" :is-search="isSearch" :case-id="caseId" />
</el-tab-pane>
<el-tab-pane label="诊断处置" name="5">
<diagnosis-form ref="diagnosis" :diagnosis="diagnosis" />
</el-tab-pane>
</el-tabs>
<all-form-print
:patient-id="patientId"
:diagnosis="diagnosis"
:form-data="formData"
:is-search="isSearch"
/>
</div>
</template>
<script>
import forePart from '@/components/360View/forePart/index-copy'
import afterPart from '@/components/360View/afterPart/index-copy'
import specialExamine from '@/components/360View/specialExamine'
import HistoryForm from '@/components/360View/medicalRecord/outPatientRecord/historyForm.vue'
import AllFormPrint from '@/components/360View/medicalRecord/outPatientRecord/allFormPrint.vue'
import DiagnosisForm from '@/components/360View/medicalRecord/outPatientRecord/diagnosisForm.vue'
const Base64 = require('js-base64').Base64
export default {
components: {
DiagnosisForm,
AllFormPrint,
HistoryForm,
forePart,
afterPart,
specialExamine
},
mixins: [],
props: {
isSearch: {
type: String,
default: ''
},
patientIdNumber: {
type: String,
default: ''
},
patientId: {
type: String,
default: ''
},
caseId: {
type: String,
default: ''
},
isPlatform: {
type: Boolean,
default: true
},
onlyRead: {
type: Boolean,
default: false
}
},
inject: ['refresh'],
data() {
return {
jzNumber: '',
formData: {
caseId: this.caseId,
patientId: this.patientId,
zhuSu: '',
xbs: '',
jws: '',
gms: '',
zsqtbs: '',
id: ''
}, //
diagnosis: {
caseId: this.caseId,
patientId: this.patientId,
zd: '',
cl: '',
zlyj: '',
id: ''
}, //
flag: '', // 1 2 3 4 5
comonFormActive: '1',
printAll: {
id: 'allForeForm'
}
}
},
watch: {
caseId: {
handler: async function(newV, oldV) {
this.jzNumber = window.sessionStorage.getItem('jzNumber')
await this.getMedicalHistory()
await this.getDiagnosis()
}
}
},
async mounted() {
this.jzNumber = window.sessionStorage.getItem('jzNumber')
await this.getMedicalHistory()
await this.getDiagnosis()
},
methods: {
//
handleSaveTable() {
this.saveHistory()
this.$refs.foreParts.saveFore()
this.$refs.afterParts.saveAfter()
this.$refs.examines.saveExamine()
this.saveDiagnosis()
},
//
handleTemplate() {
if (this.comonFormActive === '2') {
this.$refs.foreParts.handleTemplate()
} else if (this.comonFormActive === '3') {
this.$refs.afterParts.handleTemplate()
}
},
//
addData() {
if (this.comonFormActive === '2') {
this.$refs.foreParts.addForeData()
} else if (this.comonFormActive === '3') {
this.$refs.afterParts.addAfterData()
}
},
//
async getMedicalHistory() {
const { data: res } = await this.$http.get('/mjz/getMjzBscjInfo', {
params: {
caseId: this.caseId,
patientId: this.patientId,
jzNumber: this.jzNumber
}
})
if (res.code === 0) {
this.formData = res.data
} else {
this.$message.error(res.msg)
}
},
async getHistoryData() {
// /patient/getHisRecord
const { data: res } = await this.$http.get('/patient/getHisRecord', {
params: {
patientId: this.patientId,
jzNumber: this.jzNumber
}
})
if (res.code === 0) {
const data = res.data || {}
if (data) {
this.formData.zhuSu = data.zs
this.formData.xbs = data.xbs
this.formData.jws = data.jws
this.diagnosis.zd = data.zd
this.diagnosis.cl = data.yz
}
} else {
this.$message.error(res.msg)
}
},
async getDiagnosis() {
const { data: res } = await this.$http.get('/mjz/getMjzZdczInfo', {
params: {
caseId: this.caseId,
patientId: this.patientId
}
})
if (res.code === 0) {
this.diagnosis = res.data
} else {
this.$message.error(res.msg)
}
},
//
async saveHistory() {
const { data: res } = await this.$http.post('/mjz/saveMjzBscj', this.formData)
if (res.code === 0) {
await this.getMedicalHistory()
} else {
this.$message.error(res.msg)
}
},
async saveDiagnosis() {
const { data: res } = await this.$http.post('/mjz/saveMjzZdcz', this.diagnosis)
if (res.code === 0) {
await this.getDiagnosis()
} else {
this.$message.error(res.msg)
}
}
}
}
</script>
<style lang="scss" scoped>
.recordContainer{
width: 100%;
height: 100%;
position: relative;
overflow: hidden;
.btnBox{
text-align: right;
position: absolute;
right: 0px;
top: -1px;
z-index: 9;
}
}
</style>
<style lang="scss">
.recordContainer{
.el-tabs{
height: 100%;
}
.el-tabs__item{
font-size: 16px;
}
.el-tabs--border-card{
border: none;
}
.el-tabs__header{
background-color: white;
}
.el-tabs__content{
padding: 8px;
}
}
</style>

231
src/components/360View/medicalRecord/outPatientRecord/leftFormList.vue

@ -1,231 +0,0 @@
<template>
<div class="content-left">
<div class="content-left-top">
<div v-for="(item, index) in formList" :key="index" class="flex" style="margin-top: 12px" :class="[index === curIndex ? 'active' : '']" @click="handleForm(index, item)">
<div class="formBox">
<p :class="[index === curIndex ? 'activeFont' : 'curFont']">{{ item.createTime }}</p>
<p>
{{ item.name }}
</p>
</div>
<i v-if="index === curIndex && !onlyRead && item.name !== '门急诊电子病历'" style="margin-top: 28px;color: rgb(199,5,5)" class="el-icon-delete" @click.stop="deleteForm()" />
</div>
<img v-if="!formList.length" src="@/assets/img/nodata.png" alt="" class="nodata">
<!-- <div class="button"><i class="el-icon-plus" /> 新建表单</div> -->
</div>
<div class="content-left-bottom">
<div class="commonForm-text ">
<span>常用表单</span>
<span class="line" />
<el-checkbox v-model="defaultChecked">默认新建今日</el-checkbox>
</div>
<div class="comonForm-tab">
<el-radio-group v-model="formType" size="small">
<el-radio-button
v-for="(item, index) in formTypeList"
:key="index"
:label="item.type"
:name="item.type"
style=""
/>
</el-radio-group>
<div style="height: calc(100% - 80px);overflow-y: auto">
<div v-for="(form, idx) in formTypeList" :key="idx">
<div v-if="formType === form.type">
<div v-for="(item,index) in form.list" :key="`${item}_${index}`" class="record">
<p>{{ item }}</p>
<template v-if="item!=='门急诊电子病历'">
<img v-if="!onlyRead&&isSearch == '2'" :src="require('@/assets/img/add.png')" alt="" @click="addRecord(item)">
</template>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'LeftFormList',
props: ['onlyRead', 'isSearch', 'patientId', 'formList', 'curIndex'],
data() {
return {
formType: '治疗',
defaultChecked: true,
formTypeList: [
{
type: '治疗',
list: ['眼科激光手术患者知情同意书', '眼科激光手术治疗', '眼底血管造影知情同意书', '眼底血管造影患者预约单']
},
{
type: '同意书',
list: ['干眼激光治疗知情同意书', '干眼手术知情同意书', '角膜异物剔除术知情同意书', '麦粒肿、霰粒肿、肉芽肿、眼睑肿物手术知情同意书', '前房穿刺知情同意书', '球旁注射同意书', '小儿泪道冲洗知情同意书', '药物注射手术知情同意书']
},
{
type: '其他',
list: ['睑板腺按摩', '泪道冲洗']
}
]
}
},
mounted() {
if (this.$route.query.patientId) {
this.formType = '治疗'
}
},
methods: {
addRecord(name) {
this.$emit('addRecord', name)
},
handleForm(index, item) {
this.$emit('handleForm', { index, item })
},
deleteForm() {
this.$emit('deleteForm')
}
}
}
</script>
<style lang="scss" scoped>
.content-left {
width: 185px;
height: 100%;
margin-right: 14px;
.flex{
display: flex;
}
.nodata {
width: 175px;
margin-top: 30px;
}
.content-left-top,
.content-left-bottom {
height: 50%;
}
.tree-botton-arr {
margin-left: 10px;
}
.tree-date {
padding-right: 10px;
}
.content-left-top {
overflow-y: auto;
margin-bottom: 16px;
.formBox{
cursor: pointer;
padding: 2px 8px;
border-radius: 2px;
margin-top: 12px;
}
.active {
color: white;
background-color: #1C76FD;
}
.curFont {
color: #A6A4A4;
}
.activeFont {
color: #D9D9D9;
}
.CRFList-list {
display: flex;
justify-content: space-between;
align-items: center;
padding-left: 24px;
padding-right: 16px;
color: #000;
}
.CRFList-list {
height: 40px;
line-height: 40px;
font-size: 14px;
cursor: pointer;
.el-icon-more {
transform: rotate(90deg);
}
}
.CRFList-icon:hover {
color: #ff2929;
}
.CRFList-list-active {
background-color: #1890ff;
color: #fff;
.el-icon-more {
color: #fff;
}
}
.button {
margin-top: 16px;
background: #f2f3f5;
border-radius: 4px;
height: 40px;
line-height: 40px;
text-align: center;
cursor: pointer;
}
.button:hover,
.el-icon-plus:hover {
color: #1890ff;
}
}
.content-left-bottom {
.commonForm-text {
display: flex;
align-items: center;
font-size: 14px;
font-weight: 700;
}
.line {
border-bottom: 1px solid #e5e6eb;
flex: 1;
display: inline-block;
margin: 0 10px;
}
.comonForm-tab {
margin-top: 10px;
height: 100%;
}
.comonForm-tab-Pane {
margin-top: 10px;
}
.comonForm-list {
height: 40px;
line-height: 40px;
font-size: 14px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 10px;
cursor: pointer;
}
.comonForm-list:hover {
background-color: #f4f8fb;
color: #1d2129;
}
.comonForm-icon:hover {
color: #1890ff;
font-weight: 700;
}
}
}
.record{
display: flex;
justify-content: space-between;
padding-top: 12px;
cursor: pointer;
p {
display: inline-block;
font-size: 14px;
color: rgba(0, 0, 0, 0.85);
letter-spacing: 1px;
}
img {
width: 16px;
height: 16px;
margin-top: 3px;
}
}
</style>

488
src/components/360View/opticalFile/index.vue

@ -1,488 +0,0 @@
<template>
<!-- 视光档案-->
<div class="opticalFile">
<div class="opticalFile-content">
<div class="content-left">
<div class="content-left-top" :class="[isSearch !== '3' ? 'height100' : '']">
<div v-for="(item, index) in formList" :key="index" class="formBox" :class="[index === curIndex ? 'active' : '']" @click="handleForm(index, item)">
<p :class="[index === curIndex ? 'activeFont' : 'curFont']">{{ item.createTime }}</p>
<p>{{ item.name }}</p>
</div>
<img v-if="!formList.length" src="@/assets/img/nodata.png" alt="" class="nodata">
<!-- <div class="button"><i class="el-icon-plus" /> 新建表单</div> -->
</div>
<div class="content-left-bottom" v-if="isSearch === '3'">
<div class="commonForm-text">
<span>常用表单</span>
<span class="line" />
<el-checkbox v-model="defaultChecked">默认新建今日</el-checkbox>
</div>
<div class="record">
<p>验光报告单</p>
<img v-if="!onlyRead" :src="require('@/assets/img/add.png')" alt="" @click="addRecord(1,'验光报告单')">
</div>
<div class="comonForm-tab">
<el-radio-group v-model="formType" size="small">
<el-radio-button label="报告单" name="1" style="" />
<el-radio-button label="其他" name="2" style="" />
</el-radio-group>
<div v-if="formType === '报告单'">
<div class="record">
<p>双眼视功能检查报告单</p>
<img v-if="!onlyRead" :src="require('@/assets/img/add.png')" alt="" @click="addRecord(2,'双眼视功能检查报告单')">
</div>
<div class="record">
<p>屈光发育档案</p>
<img v-if="!onlyRead" :src="require('@/assets/img/add.png')" alt="" @click="addRecord(1,'屈光发育档案')">
</div>
<div class="record">
<p>三级视功能检查报告单</p>
<img v-if="!onlyRead" :src="require('@/assets/img/add.png')" alt="" @click="addRecord(4,'三级视功能检查报告单')">
</div>
</div>
</div>
</div>
</div>
<div class="content-right">
<div v-if="!formList.length" style="height: 100%;background: #fff;display: flex;align-items: center;justify-content: center">
<img src="@/assets/img/nodata.png" alt="">
</div>
<eyesVision
v-if="name === '双眼视功能检查报告单'"
ref="eyesVis"
:case-id="id"
:only-read="onlyRead"
:is-platform="isPlatform"
:patient-id="patientId"
@del="deleteForm"
/>
<optometryForm v-if="name === '验光报告单'" ref="optome" :case-id="id" :is-platform="isPlatform" :only-read="onlyRead" :patient-id="patientId" :is-search="isSearch" @del="deleteForm" />
<threeVision
v-if="name === '三级视功能检查报告单'"
ref="threeVis"
:only-read="onlyRead"
:is-platform="isPlatform"
:case-id="id"
:patient-id="patientId"
@del="deleteForm"
/>
<deveopmentFile v-if="name === '屈光发育档案'" ref="deveope" :is-platform="isPlatform" :case-id="id" :only-read="onlyRead" :patient-id="patientId" :is-search="isSearch" :form-content="deveopData" @del="deleteForm" />
</div>
</div>
</div>
</template>
<script>
import ourPatientRecord from './outPatientRecord'
import eyesVision from '@/components/360View/commonForm/eyesVision' //
import threeVision from '@/components/360View/commonForm/threeVision' //
import optometryForm from '@/components/360View/commonForm/optometryForm' //
import deveopmentFile from '@/components/360View/commonForm/deveopmentFIle' //
export default {
components: {
ourPatientRecord,
eyesVision,
optometryForm,
deveopmentFile,
threeVision
},
mixins: [],
props: {
isSearch: {
type: String,
default: ''
},
patientIdNumber: {
type: String,
default: ''
},
patientId: {
type: String,
default: ''
},
onlyRead: {
type: Boolean,
default: false
}
},
inject: ['refresh'],
data() {
return {
id: '',
name: '',
isPlatform: true,
defaultChecked: [],
curIndex: 0,
formList: [],
deveopData: {},
threeData: {},
optomeData: {},
eyesData: {},
formType: '报告单'
}
},
mounted() {
this.getFormList()
},
methods: {
handleForm(index, item) {
//
if (this.curIndex === index) {
return
}
// 360
if (this.onlyRead || !this.isPlatform) {
this.curIndex = index
this.id = item.id
this.name = item.name
this.isPlatform = this.isSearch === item.platform
return
}
this.confirmChange().finally(() => {
this.curIndex = index
this.id = item.id
this.name = item.name
this.isPlatform = this.isSearch === item.platform
})
},
confirmChange() {
return this.$confirmFun('是否保存数据,否则当前数据会丢弃!', '保存', '', '已取消保存数据!')
.then(() => {
this.$nextTick(() => {
switch (this.name) {
case '验光报告单' :
this.$refs.optome.handleSaveTable()
break
case '屈光发育档案':
this.$refs.deveope.handleSaveTable()
break
case '三级视功能检查报告单':
this.$refs.threeVis.handleSaveTable()
break
case '双眼视功能检查报告单':
this.$refs.eyesVis.handleSaveTable()
break
default:
break
}
})
})
},
//
addRecord(index, name) {
this.saveTableData(name)
},
//
async saveTableData(name) {
const date = this.$moment().format('YYYY-MM-DD HH:mm:ss')
const params = {
flag: 6,
name: name,
createTime: date,
patientId: this.patientId,
platform: this.isSearch
}
const { data: res } = await this.$http.post('/case/save', params)
if (res.code === 0) {
this.$message.success('保存成功')
await this.getFormList()
} else {
this.$message.error(res.msg)
}
},
async deleteForm() {
const params = {
id: this.id
}
this.$confirmFun('你确定要删除吗?').then(async() => {
const { data: res } = await this.$http.post('/case/delete', params)
if (res.code === 0) {
this.$message.success('删除成功')
await this.getFormList()
} else {
this.$message.error(res.msg)
}
})
},
async getFormList() {
const { data: res } = await this.$http.get('/patient/view/getCases', {
params: {
patientId: this.patientId,
flag: 6
}
})
if (res.code === 0) {
this.formList = res.data || []
if (this.formList.length) {
this.curIndex = 0
this.id = this.formList[0].id
this.name = this.formList[0].name
this.isPlatform = this.isSearch === this.formList[0].platform
this.handleForm(this.curIndex, { name: this.name, id: this.id })
} else {
this.id = ''
this.name = ''
}
} else {
this.$message.error(res.msg)
}
}
}
}
</script>
<style lang="scss" scoped>
.opticalFile {
height: 100%;
.height100 {
height: 100% !important;
}
.active {
color: white;
background-color: #1C76FD;
}
.curFont {
color: #A6A4A4;
}
.activeFont {
color: #D9D9D9;
}
.text-ellipsis {
white-space: nowrap; //
text-overflow: ellipsis;
overflow: hidden;
}
.printer {
border: 1px solid #ccc;
width: 56px;
height: 32px;
border-radius: 3px;
margin: 0;
margin-left: 10px;
cursor: pointer;
}
.formBox{
cursor: pointer;
padding: 2px 8px;
border-radius: 2px;
margin-top: 12px;
}
.opticalFile-content {
display: flex;
height: 100%;
overflow: hidden;
.content-left {
width: 185px;
height: 100%;
margin-right: 14px;
.nodata {
width: 185px;
margin-top: 30px;
}
.content-left-top,
.content-left-bottom {
height: 50%;
}
.tree-botton-arr {
margin-left: 10px;
}
.tree-date {
padding-right: 10px;
}
.content-left-top {
overflow-y: auto;
margin-bottom: 16px;
.CRFList-list {
display: flex;
justify-content: space-between;
align-items: center;
padding-left: 24px;
padding-right: 16px;
color: #000;
}
.CRFList-list {
height: 40px;
line-height: 40px;
font-size: 14px;
cursor: pointer;
.el-icon-more {
transform: rotate(90deg);
}
}
.CRFList-icon:hover {
color: #ff2929;
}
.CRFList-list-active {
background-color: #1890ff;
color: #fff;
.el-icon-more {
color: #fff;
}
}
.button {
margin-top: 16px;
background: #f2f3f5;
border-radius: 4px;
height: 40px;
line-height: 40px;
text-align: center;
cursor: pointer;
}
.button:hover,
.el-icon-plus:hover {
color: #1890ff;
}
}
.content-left-bottom {
.commonForm-text {
display: flex;
align-items: center;
font-size: 14px;
font-weight: 700;
}
.line {
border-bottom: 1px solid #e5e6eb;
flex: 1;
display: inline-block;
margin: 0 10px;
}
.comonForm-tab {
margin-top: 10px;
}
.comonForm-tab-Pane {
margin-top: 10px;
}
.comonForm-list {
height: 40px;
line-height: 40px;
font-size: 14px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 10px;
cursor: pointer;
}
.comonForm-list:hover {
background-color: #f4f8fb;
color: #1d2129;
}
.comonForm-icon:hover {
color: #1890ff;
font-weight: 700;
}
}
}
.record{
display: flex;
justify-content: space-between;
padding-top: 12px;
cursor: pointer;
p {
display: inline-block;
font-size: 14px;
color: rgba(0, 0, 0, 0.85);
letter-spacing: 1px;
}
img {
width: 16px;
height: 16px;
margin-top: 3px;
}
}
}
.content-right {
padding: 12px;
position: relative;
flex: 1;
text-align: center;
background-color: #F0F2F5;
overflow-y: hidden;
.content-right-buttonClick {
display: flex;
justify-content: flex-end;
background: #2e2e2e;
padding: 10px;
}
.editor-CRF {
height: 93%;
}
.content-right-CRF {
background: #5c5c5c;
overflow-x: auto;
padding: 16px 16px 16px 16px;
position: relative;
height: 100%;
}
.content-right-CRF-class {
padding-right: 178px;
}
.suspension-button {
position: absolute;
right: 10px;
top: 10px;
z-index: 1;
}
.case-template,
.intelligent-filling {
cursor: pointer;
height: 140px;
width: 32px;
background: #fff;
border-radius: 4px;
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);
span {
writing-mode: vertical-rl;
letter-spacing: 6px;
}
}
.case-template:hover,
.intelligent-filling:hover {
background: linear-gradient(270deg, #f4f8fb 0%, #deebff 66.15%);
}
.case-template {
margin-bottom: 6px;
}
}
}
</style>
<style lang="scss">
.opticalFile {
.el-button .el-button--text .el-button--mini {
padding: 0;
}
}
.comonForm-tab {
#tab-mz {
padding-left: 14px !important;
}
.el-tabs__nav-wrap::after {
height: 0;
}
.el-tabs__header {
padding-right: 0 !important;
}
.el-tabs__item.is-active {
color: #fff;
background: #1890ff;
}
.el-tabs__item {
background: #f2f3f5;
padding: 0 14px;
margin-left: 1px;
height: 35px;
line-height: 35px;
}
.el-tabs__content {
padding: 0 !important;
}
}
.see-doctor .comonForm-tab .el-tabs__item:last-child {
padding-right: 14px !important;
}
.see-doctor .comonForm-tab .el-tabs__item:nth-child(2) {
padding-left: 14px !important;
}
</style>

402
src/components/360View/opticalFile/outPatientRecord/index.vue

@ -1,402 +0,0 @@
<template>
<div class="recordContainer">
<div class="btnBox">
<el-button v-print="'#foreCheck'" size="small">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button v-if="comonFormActive === '2' || comonFormActive === '3'" type="primary" size="small" @click="handleTemplate">保存为模板</el-button>
<div size="small" v-if="comonFormActive === '2' || comonFormActive === '3'" style="display:inline-block;margin-left:10px;text-align:center;width: 32px;height: 32px;background-color: #1e79ff;border-radius: 4px;vertical-align: bottom" @click="addData">
<img :src="require('@/assets/img/data.png')" alt="" style="width: 17px;height: 16px;margin-top: 5px">
</div>
</div>
<el-tabs v-model="comonFormActive" type="border-card" @tab-click="handleClick">
<el-tab-pane label="病史采集" name="1">
<el-form id="medHistory" ref="form" :model="formData" label-width="120px" style="margin-top: 32px">
<el-form-item label="主诉:" style="width: 540px">
<el-select
v-model="formData.zs"
clearable
filterable
allow-create
placeholder="主诉"
@blur="selectZs"
>
<el-option
v-for="item in options5"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="现病史:" style="width: 540px">
<el-select
v-model="formData.xbs"
clearable
filterable
allow-create
placeholder="现病史"
@blur="selectZs"
>
<el-option
v-for="item in options5"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="既往病史:" style="width: 540px">
<el-select
v-model="formData.jwbs"
clearable
filterable
allow-create
placeholder="既往病史"
@blur="selectZs"
>
<el-option
v-for="item in options5"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="过敏史:" style="width: 540px">
<el-select
v-model="formData.gms"
clearable
filterable
allow-create
placeholder="过敏史"
@blur="selectZs"
>
<el-option
v-for="item in options5"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="周身其他病史:" style="width: 540px">
<el-select
v-model="formData.zsqtbs"
clearable
filterable
allow-create
placeholder="周身其他病史"
@blur="selectZs"
>
<el-option
v-for="item in options5"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="前段检查" name="2" style="height: 100%">
<forePart ref="foreParts" :patient-id="patientId" />
</el-tab-pane>
<el-tab-pane label="后段检查" name="3" style="height: 100%">
<afterPart ref="afterParts" :patient-id="patientId" />
</el-tab-pane>
<el-tab-pane label="专科检查" name="4" style="height: 100%">
<specialExamine ref="examines" :patient-id="patientId" />
</el-tab-pane>
<el-tab-pane label="诊断处置" name="5">
<el-form id="formDiagnosis" :model="diagnosis" label-width="120px" style="margin-top: 32px">
<el-form-item label="诊断:" style="width: 540px">
<el-select
v-model="diagnosis.zd"
clearable
filterable
allow-create
placeholder="诊断"
@blur="selectZs"
>
<el-option
v-for="item in options5"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="处理:" style="width: 540px">
<el-select
v-model="diagnosis.cl"
clearable
filterable
allow-create
placeholder="处理"
@blur="selectZs"
>
<el-option
v-for="item in options5"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="治疗意见:" style="width: 540px">
<el-select
v-model="diagnosis.yj"
clearable
filterable
allow-create
placeholder="治疗意见"
@blur="selectZs"
>
<el-option
v-for="item in options5"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-form>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import forePart from '@/components/360View/forePart'
import afterPart from '@/components/360View/afterPart'
import specialExamine from '@/components/360View/specialExamine'
const Base64 = require('js-base64').Base64
export default {
components: {
forePart,
afterPart,
specialExamine
},
mixins: [],
props: {
patientIdNumber: {
type: String,
default: ''
},
patientId: {
type: String,
default: ''
}
},
inject: ['refresh'],
data() {
return {
formData: {
zs: '',
xbs: '',
jwbs: '',
gms: '',
zsqtbs: ''
}, //
diagnosis: {
zd: '',
cl: '',
yj: ''
},
flag: '', // 1 2 3 4 5
tableData: [
{
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
}, {
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
}, {
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
}],
options: [
{
value: '选项1',
label: '红绿色盲'
}, {
value: '选项2',
label: '双皮奶'
}, {
value: '选项3',
label: '蚵仔煎'
}, {
value: '选项5',
label: '北京烤鸭'
}],
options5: [
{
value: 'HTML',
label: 'HTML'
}, {
value: 'CSS',
label: 'CSS'
}, {
value: 'JavaScript',
label: 'JavaScript'
}],
value10: [],
comonFormActive: '1'
}
},
created() {
},
mounted() {
this.getOutPatientList('1')
this.getOutPatientList('5')
},
methods: {
//
handleSaveTable() {
this.saveTableData('1', '病史采集')
this.$refs.foreParts.saveFore()
this.$refs.afterParts.saveAfter()
this.$refs.examines.saveExamine()
this.saveTableData('5', '诊断处置')
// if (this.comonFormActive === '1') {
// this.saveTableData('1', '')
// } else if (this.comonFormActive === '2') {
// this.$refs.foreParts.saveFore()
// } else if (this.comonFormActive === '3') {
// this.$refs.afterParts.saveAfter()
// } else if (this.comonFormActive === '4') {
// this.$refs.examines.saveExamine()
// } else if (this.comonFormActive === '5') {
// this.saveTableData('5', '')
// }
},
//
handleTemplate() {
if (this.comonFormActive === '2') {
this.$refs.foreParts.handleTemplate()
} else if (this.comonFormActive === '3') {
this.$refs.afterParts.handleTemplate()
}
},
//
addData() {
if (this.comonFormActive === '2') {
this.$refs.foreParts.addForeData()
} else if (this.comonFormActive === '3') {
this.$refs.afterParts.addAfterData()
}
},
//
async getOutPatientList(flag) {
const { data: res } = await this.$http.get('/case/getCase', {
params: {
patientId: this.patientId,
platform: 1,
flag: flag
}
})
if (res.code === 0) {
if (flag === '1') {
this.formData = res.data ? JSON.parse(res.data.jsonText) : {}
} else if (flag === '5') {
this.diagnosis = res.data ? JSON.parse(res.data.jsonText) : {}
}
this.collectId = res.data ? res.data.id : ''
} else {
this.$message.error(res.msg)
}
},
//
async saveTableData(flag, name) {
let data = ''
if (flag === '1') {
data = JSON.stringify(this.formData)
} else if (flag === '5') {
data = JSON.stringify(this.diagnosis)
}
const params = {
flag: flag,
jsonText: data,
name: name,
patientId: this.patientId,
platform: 1
}
let url = ''
if (this.collectId) {
url = '/case/update'
params.id = this.collectId
} else {
url = '/case/save'
}
const { data: res } = await this.$http.post(url, params)
if (res.code === 0) {
this.$message.success('保存成功')
this.getOutPatientList(flag)
} else {
this.$message.error(res.msg)
}
},
selectZs(e) {
},
//
printerHandle() {
console.log(this)
// this.$print(this.$refs.formDiagnosis)
// this.printPage('formDiagnosis')
this.printPage('medHistory')
// this.$refs.formDiagnosis.$el.contentWindow.print()
},
// tab
handleClick() {
console.log(this.comonFormActive)
}
}
}
</script>
<style lang="scss" scoped>
.recordContainer{
width: 100%;
height: 100%;
position: relative;
.btnBox{
text-align: right;
position: absolute;
right: 0px;
top: -1px;
z-index: 9;
}
}
</style>
<style lang="scss">
.recordContainer{
.el-tabs{
height: 100%;
}
.el-tabs--border-card{
border: none;
}
.el-tabs__header{
background-color: white;
}
.el-tabs__content{
padding: 8px;
}
}
</style>

6
src/components/360View/shrink.vue

@ -5,13 +5,7 @@
</div>
<img :src="require('@/assets/img/selBg.png')" alt="" :class="active">
<img class="imgCur" :src="require('@/assets/img/unselBg.png')" alt="" @click="handleType(1)">
<img class="imgOne" :src="require('@/assets/img/unselBg.png')" alt="" @click="handleType(2)">
<img class="imgTwo" :src="require('@/assets/img/unselBg.png')" alt="" @click="handleType(3)">
<img class="imgThree" :src="require('@/assets/img/unselBg.png')" alt="" @click="handleType(4)">
<span class="dataBase dataOne" :class="[active === 'imgCur' ? 'fontColor' : '']" @click="handleType(1)">关键指标</span>
<span class="dataBase dataTwo" :class="[active === 'imgOne' ? 'fontColor' : '']" @click="handleType(2)">数据集</span>
<span class="dataBase dataThree" :class="[active === 'imgTwo' ? 'fontColor' : '']" @click="handleType(3)">病历收集</span>
<span class="dataBase dataFour" :class="[active === 'imgThree' ? 'fontColor' : '']" @click="handleType(4)">常用业务</span>
</div>
</template>

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

@ -2,7 +2,6 @@ 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)
@ -64,19 +63,6 @@ export const moduleRoutes = {
name: 'outpatientManagement',
meta: { title: '日常出诊', isTab: true }
},
// ok镜
{
path: '/patientInfo',
name: 'patientInfo',
meta: { title: '视光工作台 / OK镜 / 详情', isTab: true },
component: () => import('@/page-subspecialty/views/modules/optometryManagement/seeDoctor/index')
},
{
path: '/subjectMgt',
name: 'subjectMgt',
meta: { title: '科研工作台 / 课题 / 课题列表', isTab: true },
component: () => import('@/page-subspecialty/views/modules/scientificManagement/subjectMgt/index')
},
{
path: '/iframe',
component: null,
@ -287,7 +273,6 @@ function fnAddDynamicMenuRoutes(menuList = [], menuListChildLength, routes = [])
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) {

8
src/page-subspecialty/views/main.vue

@ -1,18 +1,12 @@
<template>
<div v-loading.fullscreen.lock="loading" :element-loading-text="$t('loading')" :class="['aui-wrapper', { 'aui-sidebar--fold': $store.state.sidebarFold }]">
<template v-if="!loading">
<main-navbar />
<main-sidebar />
<div class="aui-content__wrapper">
<main-content v-if="!$store.state.contentIsNeedRefresh" />
</div>
</template>
</div>
</template>
<script>
import MainNavbar from './main-navbar'
import MainSidebar from './main-sidebar'
import MainContent from './main-content'
import debounce from 'lodash/debounce'
import { isURL } from '@/utils/validate'
@ -30,8 +24,6 @@ export default {
}
},
components: {
MainNavbar,
MainSidebar,
MainContent
},
data() {

19
src/page-subspecialty/views/modules/dataVisualization/index.vue

@ -1,19 +0,0 @@
<template>
<div class="data-visualization">123</div>
</template>
<script>
export default {
data() {
return {
}
},
created() {
},
methods: {
}
}
</script>
<style lang="scss" scoped>
.data-visualization {
}
</style>

403
src/page-subspecialty/views/modules/formList/DrugInjection.vue

@ -1,403 +0,0 @@
<template>
<div class="formListBox">
<div v-if="!onlyRead && isPlatform" class="btnBox_top">
<el-button v-print="print" size="small" @click="handlePrint">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button type="danger" size="small" @click="formDelete">删除</el-button>
</div>
<div id="DrugInjection" style="width: 1000px;padding-right: 8px">
<div class="flex j-c">
<img width="450" src="@/assets/img/xianganlogo.png">
</div>
<hr>
<p style="color:#000000;font-size:32px;margin:0 0 30px 0;text-align:center;">
药物注射手术知情同意书
</p>
<div class="flex a-c j-b">
<div>
姓名<el-input v-model="confirmData.patientName" style="width: 100px" />
</div>
<div>
性别<el-input v-model="confirmData.patientSex" style="width: 100px" />
</div>
<div>
年龄<el-input v-model="confirmData.patientAge" style="width: 100px" />
</div>
<div>
科室<el-input v-model="confirmData.department" style="width: 100px" />
</div>
<div>
登记号<el-input v-model="confirmData.patientId" style="width: 100px" />
</div>
</div>
<div class="flex strongTitle">
疾病诊断和治疗建议
</div>
<div class="flex ">
<span style="word-break: keep-all">医生已告知我的</span><el-input v-model="confirmData.position" style="width: 50px" />
<span style="word-break: keep-all">眼患有</span><el-input v-model="confirmData.illness" style="width: 200px" />
<span style="word-break: keep-all">需要在</span><el-input v-model="confirmData.way" style="width: 120px" />
<span style="word-break: keep-all">麻醉下进行</span><el-input v-model="confirmData.operate" style="width: 200px" />手术
</div>
<div class="flex strongTitle">
手术潜在风险和对策
</div>
<div style="text-indent: 2rem;text-align: left">
医生告知我上述治疗方案可能发生的一些风险有些不常见的风险可能没有在此列出具体的手术式根据不同病人的情况有所不同医生告诉我可与我的医生讨论有关我手术的具体内容如果我有特殊的问题可与我的医生讨论
<div class="form_content">
<div v-for="(item,index) in content" :key="index" style="margin: 5px 0">
{{ item.title }}<span v-if="item.strong" :class="{underline:index===4,strong:true}">{{ item.strong }}</span>
<div v-for="(text,idx) in item.detail" :key="`${index}_${idx}`" :class="{underline:index===5}" class="form_detail">
{{ text }}
</div>
</div>
</div>
</div>
<div>
在向患方说明各治疗方案并告知利弊后患方基于当前病情需要经慎重考虑自愿选择 <el-input v-model="confirmData.treatOperate" style="width: 200px" /> 手术
注射药物<el-input v-model="confirmData.drug" style="width: 200px" />
</div>
<div class="flex strongTitle">
特殊风险或主要高危因素
</div>
<div style="text-align: left;margin-left: 2rem">
我理解根据我个人的病情我可能出现未包括在上述所交待并发症以外的风险
<el-input v-model="confirmData.docAdvice" type="textarea" :rows="3" />
一旦发生上述风险和意外医生会采取积极应对措施
</div>
<div class="flex strongTitle">
患者知情选择
</div>
<div style="text-align: left">
<p style="text-indent: 2rem">
我的医生已经告知我将要进行的治疗方式此次治疗及治疗后可能发生的并发症和风险可能存在的其它治疗方法并且解答了我关于此次治疗的相关问题
</p>
<p style="text-indent: 2rem">
我同意在治疗中医生可以根据我的病情对预定的治疗方式做出调整
</p>
<p style="text-indent: 2rem">
我理解我的治疗需要多位医生共同进行
</p>
<p style="text-indent: 2rem">
我并未得到治疗百分之百成功的许诺
</p>
<p style="text-indent: 2rem">
我授权医师对治疗切除的病变器官组织或标本进行处置包括病理学检查细胞学检查和医疗废物处理等
</p>
</div>
<div class="flex j-b" style="margin-top: 20px">
<div class="flex a-c">
<span style="word-break: keep-all;font-weight: bold">患者签名</span>
<div style="margin-left:10px" @click="signClick('minorPatientSignM')">
<span v-if="!formListValue.minorPatientSignM">
<img v-if="printHidden" :src="require('@/assets/img/signature.png')" alt="">
<el-input v-else style="width: 80px" />
</span>
<img v-else style="width: 80px;height: 40px;" :src="formListValue.minorPatientSignM">
</div>
</div>
<div style="margin-left: 100px">
签名日期
<el-date-picker
v-model="confirmData.patientDate"
style="flex: 1"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
<div class="flex">
如果患者无法签署知情同意书请其授权的亲属在此签名
</div>
<div class="flex j-b">
<div class="flex a-c">
<div style="font-weight: bold">患者授权亲属签名</div>
<div style="margin-left:10px" @click="signClick('minorKinSignM')">
<span v-if="!formListValue.minorKinSignM">
<img v-if="printHidden" :src="require('@/assets/img/signature.png')" alt="">
<el-input v-else style="width: 80px" />
</span>
<img v-else style="width: 80px;height: 40px;" :src="formListValue.minorKinSignM">
</div>
<span>与患者关系</span>
<el-input v-model="confirmData.relation" style="width: 100px" />
</div>
<div>
签名日期
<el-date-picker
v-model="confirmData.kinDate"
style="flex: 1"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
<div class="flex strongTitle">
医生陈述
</div>
<div style="font-weight: normal;font-size: 16px">
我已经告知患者将要进行的治疗方式此次治疗及治疗后可能发生的并发症和风险可能存在的其它治疗方法并且解答了患者关于此次治疗的相关问题
</div>
<div class="flex j-b" style="margin-top: 15px">
<div class="flex a-c" style="margin-left: 10px">
<span style="word-break: keep-all">医生签名</span>
<img v-if="confirmData.operator" :src="confirmData.operator" alt="" style="width: 80px;height: 50px;border-style:none;flex: 1">
</div>
<div class="flex a-c" style="margin-left: 15px">
日期<el-date-picker
v-model="confirmData.operateDate"
style="flex: 1"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import emptySign from '@static/js/emptySign'
import styeFormSign from '@/mixins/styeFormSign'
export default {
name: 'DrugInjection',
mixins: [styeFormSign],
props: {
onlyRead: {
type: Boolean,
default: false
},
isPlatform: {
type: Boolean,
default: true
},
patientDetail: {
type: Object
},
caseId: {
type: String,
default: ''
}
},
data() {
return {
options: [
{
label: '同意',
value: 1,
id: 'yes'
},
{
label: '不同意',
value: 2,
id: 'no'
}
],
content: [
{
title: '一、我理解任何手术、麻醉都存在风险;如果我患有高血压、心脏病、糖尿病、肝肾功能不全、静脉血栓等疾病或者有吸烟史,以上这些风险可能会加大,或者在术中或术后出现相关的病情加重或心脑血管意外,甚至死亡。'
},
{
title: '二、我理解任何所用药物都可能产生副作用,包括轻度的恶心、皮疹等症状到严重的过敏性休克,甚至危及生命。'
},
{
title: '三、我理解此手术可能发生的风险及医生的对策:',
detail: [
'1、各种手术都有感染的可能,但大部分经治疗均能好转,只有极个别的病人由于严重的感染不仅丧失视力,重者可能丧失眼球。',
'2、术中出血,严重时致手术终止,致视力丧失。',
'3、有可能出现视力不能提高、或提高不显著甚至下降。',
'4、术后有可能出现眼内出血、感染,多可以通过药物控制,严重时出现眼内炎需进一步手术。',
'5、术后有可能出现低眼压、高眼压,眼痛,需药物治疗,必要时行降压手术,如不能控制则产生继发性青光眼致视神经萎缩。',
'6、术后有可能出现角膜内皮失代偿,角膜混浊水肿,大泡性病变,疼痛等。',
'7、术后有可能出现白内障,需行白内障手术。',
'8、术后有可能出现眼前黑影感,视网膜裂孔,脉络膜脱离,视网膜脱离,需要进一步手术。',
'9、药物反应可能造成严重的后果。',
'10、目前抗新生血管生长因子、曲安奈德或地塞米松玻璃体内植入剂等的适应症可能尚无您的疾病,但是国内外文献及循证医学证明该药物用于治疗此类疾病是安全有效的。 ',
'11、术后需定期复查,必要时重复、多次注射治疗。',
'12、其它难以预料的意外情况。',
'13、术中发现其他病变或病情变化须更换或增加手术,亦可能无法进行预期手术须停止手术。'
]
},
{
title: '四、患者手术的医护人员团队将尽全力按操作规范实施上述治疗/手术,并且一旦发生并发症或意外情况,将从维护患者利益的角度出发积极采取措施,以努力降低并发症或意外情况导致的对患者的损害后果。'
},
{
title: '五、您有权选择同意或不同意接受上述治疗,但是如果拒绝接受上述治疗,您将面临以下风险:',
strong: '视力下降、眼底病变进展加快等。'
},
{
title: '六、根据患者目前的病情和我院目前开展的医疗技术,您还可以选择其他',
strong: '替代诊疗方案',
detail: [
'1、口服药物治疗:优点:无创; 缺点:疾病进展控制不佳。',
'2、PDT治疗:费用贵,目前国内均无此治疗药物。',
'3、视网膜激光光凝:优点:可以用于封闭裂孔及眼底出血性疾病;缺点:可能引起视野缺损,不能治疗视网膜脱离及严重的玻璃体积血。'
]
}
],
print: {
id: 'DrugInjection',
closeCallback: () => {
this.printHidden = true
}
},
printHidden: true,
orgin: '',
confirmData: {
patientName: '',
patientAge: '',
patientId: '',
patientSex: '',
department: '眼科',
drug: '',
position: '',
illness: '',
way: '',
operate: '',
treatOperate: '',
docAdvice: '',
relation: '',
patientSign: '',
familySign: '',
operator: '',
isAgree: '',
patientDate: new Date(),
kinDate: new Date(),
operateDate: new Date()
},
formListValue: {
minorPatientSignM: '',
minorKinSignM: ''
}
}
},
watch: {
caseId(val) {
if (val) {
this.queryFormData()
}
}
},
created() {
this.orgin = JSON.parse(JSON.stringify(this.confirmData))
this.queryFormData()
},
methods: {
signClick(index) {
this.initPlugin(index)
},
handlePrint() {
this.printHidden = false
this.handleSaveTable()
},
//
handleSaveTable() {
if (this.formListValue.minorPatientSignM === emptySign || this.formListValue.minorKinSignM === emptySign) {
this.$message.error('签字未成功请重新签字后再保存')
return
}
this.confirmData.patientSign = this.formListValue.minorPatientSignM
this.confirmData.familySign = this.formListValue.minorKinSignM
const data = JSON.stringify(this.confirmData)
this.$emit('handleSaveTable', data)
},
//
queryFormData() {
this.$http.get('/case/getCaseById', { params: {
id: this.caseId
}}).then(data => {
const detail = data.data.data
if (detail.jsonText) {
this.confirmData = JSON.parse(detail.jsonText)
this.formListValue.minorKinSignM = this.confirmData.familySign
this.formListValue.minorPatientSignM = this.confirmData.patientSign
} else {
this.confirmData = JSON.parse(JSON.stringify(this.orgin))
const userData = JSON.parse(window.sessionStorage.getItem('qg-userData'))
this.confirmData.operator = userData.signImgBase
this.confirmData.patientName = this.patientDetail.patientName
this.confirmData.patientAge = this.patientDetail.patientAge
this.confirmData.patientSex = this.patientDetail.patientSex
this.confirmData.patientId = this.patientDetail.patientId
this.formListValue.minorKinSignM = this.confirmData.familySign
this.formListValue.minorPatientSignM = this.confirmData.patientSign
}
})
},
//
formDelete() {
this.$emit('formDelete')
}
}
}
</script>
<style lang="scss" scoped>
.flex{
display: flex;
}
.a-c{
align-items: center;
}
.j-c{
justify-content: center;
}
.j-b{
justify-content: space-between;
}
#DrugInjection{
text-align: left;
}
.formListBox{
background: #fff;
padding: 10px 20px 50px 20px;
page-break-after:always;
height: 100%;
overflow: auto;
}
.btnBox_top{
position: fixed;
z-index: 999;
right: 90px;
}
.form_top{
margin-bottom: 15px;
}
.form_content{
text-align: left;
line-height: 26px;
}
.form_detail{
text-indent: 2rem;
margin: 3px 0;
}
.strongTitle{
font-size: 20px;
font-weight: bold;
margin: 10px 0 5px 0;
}
.strong{
font-weight: bold;
}
.underline{
text-decoration: underline;
}
::v-deep .el-icon-arrow-up{
display: none;
}
::v-deep .el-input__inner{
border: none;
border-bottom: 1px solid #cccccc;
border-radius: 0;
font-size: 16px;
height: 26px;
text-align: center;
}
::v-deep .el-input__prefix{
display: none;
}
</style>

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

@ -1,695 +0,0 @@
<template>
<div id="operation-record" style=" background: #fff; padding: 10px 20px 50px 20px;page-break-after:always">
<div v-if="!onlyRead && isPlatform" class="btnBox_top">
<el-button v-print="print" size="small" @click="handlePrint">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button type="danger" size="small" @click="formDelete">删除</el-button>
</div>
<div id="informedConsent" style="width: 840px;padding-right: 8px;text-align: left;line-height: 28px">
<div class="flex j-c">
<img width="450" src="@/assets/img/xianganlogo.png">
</div>
<hr>
<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="confirmData.patientName" style="flex: 1" placeholder="" /></div>
<div class="flex a-c item">年龄<el-input v-model="confirmData.patientAge" style="flex: 1" placeholder="" /></div>
<div class="flex a-c item">性别<el-input v-model="confirmData.patientGender" style="flex: 1" placeholder="" /></div>
<div class="flex a-c item">眼别
<el-select
ref="eyeTypeRef"
v-model="confirmData.eyeType"
filterable
allow-create
style="flex: 1"
placeholder=""
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</div>
<!--术前判断-->
<div>
<div class="formTitle">
术前诊断
</div>
<div v-for="(item, index) in judgement" :key="index" class="judgeItem">
<span>{{ `${index+1}. ${item.name}` }}</span>
<el-input v-if="item.isEdit" v-model="confirmData.other" style="flex: 1" />
<template v-else>
<div v-for="(judge,idx) in item.symptom" :key="idx" class="flex a-c">
<div class="check" @click="judge.isSelected = !judge.isSelected">
<input type="checkbox" :checked="judge.isSelected">{{ judge.title }}
</div>
<el-input v-if="judge.isEdit" v-model="judge.remark" style="flex: 1;width: 120px" />
</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">
<div class="check" @click="sel.isSelected = !sel.isSelected">
<input type="checkbox" :checked="sel.isSelected">{{ sel.name }}
</div>
</div>
</div>
</div>
<!--拟行激光术名称-->
<div>
<div class="formTitle">拟行激光术名称</div>
<div class="proposed">
<div v-for="(item,i) in proposedName" :key="i" class="flex a-c" style="margin-right: 35px">
<span class="check" @click="item.isSelected = !item.isSelected">
<input type="checkbox" :checked="item.isSelected">{{ item.name }}
</span>
<span v-if="item.area" class="flex">(
<span v-for="(area,index) in item.area" :key="`${index}_${i}`" class="areaItem flex">
<span class="check" @click="area.isSelected = !area.isSelected">
<input type="checkbox" :checked="area.isSelected">{{ area.name }}
</span>
<span v-if="area.name==='全'" style="margin-left: 5px" class="flex"> <el-input v-model="confirmData.frequency" style="width: 50px" /> </span>
</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">主诊/谈话医生签名
<img v-if="confirmData.operationSign" :src="confirmData.operationSign" alt="" style="width: 80px;height: 50px;border-style:none;">
</div>
<div class="flex a-c">日期
<el-date-picker
v-model="confirmData.operationDate"
style="flex: 1"
type="date"
value-format="yyyy-MM-dd"
/>
</div>
</div>
</div>
</div>
<!-- 术前患者-->
<div>
<div class="formTitle">术前患者或家属单位意见</div>
<div class="proposed">
医生已和我详细讨论了治疗计划手术方式治疗目的以及术后可能的效果我已详细阅读以上内容并完全理解和接受手术可能出现的风险和并发症我同意医生的治疗并接受手术
</div>
<div class="btnBox">
<div>
<div class="flex a-c">
<div>患者或直系亲属签名</div>
<div @click="signClick('informPatientSign')">
<img v-if="!formListValue.informPatientSign&&printHidden" :src="require('@/assets/img/signature.png')" alt="">
<img v-if="formListValue.informPatientSign" style="width: 80px;height: 40px;" :src="formListValue.informPatientSign">
<el-input v-if="!formListValue.informPatientSign&&!printHidden" style="width: 80px" />
</div>
<div class="flex a-c">日期
<el-date-picker
v-model="confirmData.patientDate"
style="flex: 1"
type="date"
value-format="yyyy-MM-dd"
/>
</div>
</div>
</div>
</div>
</div>
</div>
</div></template>
<script>
import emptySign from '@static/js/emptySign'
import styeFormSign from '@/mixins/styeFormSign'
export default {
name: 'InformedConsent',
mixins: [styeFormSign],
props: {
onlyRead: {
type: Boolean,
default: false
},
isPlatform: {
type: Boolean,
default: true
},
patientDetail: {
type: Object
},
caseId: {
type: String,
default: ''
}
},
data() {
return {
printHidden: true,
print: {
id: 'informedConsent',
closeCallback: () => {
this.printHidden = true
}
},
origin: '',
confirmData: {
bnz: '',
coats: '',
eyeType: '',
idList: [],
jgsh: '', //
jgshArea: '', //
jzNumber: '', //
mzfs: '', //
operationDate: '', //
operationSign: '', //
other: '', //
patientAge: '',
patientDate: '',
patientGender: '',
patientName: '',
patientSign: '',
qgy: '',
ydb: '',
swmxgxbb: '',
frequency: ''
},
options: [{
value: 'OD',
label: 'OD'
}, {
value: 'OS',
label: 'OS'
}, {
value: 'OU',
label: 'OU'
}],
//
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
}
],
formListValue: {
informPatientSign: ''
},
//
intraoperation: ['麻醉意外:需进行抢救或暂停手术', '出血:需要压迫止血,推迟或暂停手术', '其他无法预计的并发症', '术中可能会根据具体情况变更手术方式'],
postoperative: ['暂时性眼压升高', '损伤人工晶体', '角膜内皮损伤', '虹膜炎症反应', '玻璃体前界膜破裂', '视功能损伤', '渗出性视网膜脱离', '黄斑水肿', '脉络膜脱离', '虹膜(视网膜、脉络膜)出血', '其他']
}
},
watch: {
caseId(val) {
if (val) {
this.getInfoDetail()
}
}
},
created() {
this.origin = JSON.parse(JSON.stringify(this.confirmData))
this.getInfoDetail()
this.queryProject()
},
methods: {
signClick(index) {
this.initPlugin(index)
},
getInfoDetail() {
this.$http.get('/mzbl/getMzblJgshzqtysInfo', { params: {
caseId: this.caseId,
patientId: this.patientDetail.patientId
}}).then(data => {
const detail = data.data.data
this.confirmData.eyeType = detail.eyeType
const bnzList = detail.bnz && detail.bnz.split('/') || []
const qgyList = detail.qgy && detail.qgy.split('/') || []
const ydbList = detail.ydb && detail.ydb.split('/') || []
const swmList = detail.swmxgxbb && detail.swmxgxbb.split('/') || []
const mzfsList = detail.mzfs && detail.mzfs.split('/') || []
const jgshList = detail.jgsh && detail.jgsh.split('/') || []
const jgshAreaList = detail.jgshArea && detail.jgshArea.split('/') || []
this.handleDetail(bnzList, qgyList, ydbList, swmList, detail.coats, mzfsList, jgshList, jgshAreaList)
this.confirmData.other = detail.other || ''
this.formListValue.informPatientSign = detail.patientSign
if (!detail.jzNumber) {
//
this.confirmData.patientName = this.patientDetail.patientName
this.confirmData.patientAge = this.patientDetail.patientAge
this.confirmData.patientGender = this.patientDetail.patientSex
const userData = JSON.parse(window.sessionStorage.getItem('qg-userData'))
this.confirmData.operationSign = userData.signImgBase
this.confirmData.operationDate = this.$moment().format('YYYY-MM-DD')
this.confirmData.patientDate = this.$moment().format('YYYY-MM-DD')
} else {
this.confirmData.patientName = detail.patientName
this.confirmData.patientAge = detail.patientAge
this.confirmData.patientGender = detail.patientGender
this.confirmData.operationSign = detail.operationSign
this.confirmData.operationDate = detail.operationDate
this.confirmData.patientDate = detail.patientDate
}
})
},
//
handleDetail(bnz, qgy, ydb, swm, coats, mzfs, jgsh, jgshArea) {
//
this.judgement.forEach(item => {
item.symptom.forEach(sy => {
switch (item.name) {
case '白内障':
if (bnz.some(bn => bn.includes(sy.title))) {
sy.isSelected = true
sy.remark = bnz.find(bn => bn.includes('其他')) && bnz.find(bn => bn.includes('其他')).substring(2)
} else {
sy.isSelected = false
sy.remark = ''
}
break
case '青光眼':
if (qgy.some(bn => bn.includes(sy.title))) {
sy.isSelected = true
sy.remark = qgy.find(bn => bn.includes('其他')) && qgy.find(bn => bn.includes('其他')).substring(2)
} else {
sy.isSelected = false
sy.remark = ''
}
break
case '眼底病':
if (ydb.some(bn => bn.includes(sy.title))) {
sy.isSelected = true
sy.remark = ydb.find(bn => bn.includes('其他')) && ydb.find(bn => bn.includes('其他')).substring(2)
} else {
sy.isSelected = false
sy.remark = ''
}
break
case '视网膜血管性病变':
if (swm.some(bn => bn.includes(sy.title))) {
sy.isSelected = true
} else {
sy.isSelected = false
}
break
case "Coat's 病":
if (coats) {
sy.isSelected = true
} else {
sy.isSelected = false
}
break
}
})
})
//
this.modeSelect.forEach(item => {
if (mzfs.some(mz => mz === item.name)) {
item.isSelected = true
} else {
item.isSelected = false
}
})
//
this.proposedName.forEach(item => {
if (jgsh.some(mz => mz === item.name)) {
item.isSelected = true
} else {
item.isSelected = false
}
})
//
this.proposedName[6].area.forEach(item => {
if (jgshArea.some(mz => mz === item.name)) {
item.isSelected = true
} else {
item.isSelected = false
}
})
},
//
handleList() {
this.judgement.forEach(item => {
const data = item.symptom.filter(ill => ill.isSelected).map(item => {
item.other = item.title
if (item.isEdit) {
item.other = item.title + item.remark
}
return item.other
})
switch (item.name) {
case '白内障':
this.confirmData.bnz = data.join('/')
break
case '青光眼':
this.confirmData.qgy = data.join('/')
break
case '眼底病':
this.confirmData.ydb = data.join('/')
break
case '视网膜血管性病变':
this.confirmData.swmxgxbb = data.join('/')
break
case "Coat's 病":
this.confirmData.coats = "Coat's 病"
}
})
},
//
handleNarcotism() {
const data = this.modeSelect.filter(item => item.isSelected).map(item => item.name)
this.confirmData.mzfs = data.join('/')
},
//
handleMode() {
const selectList = this.proposedName.filter(item => item.isSelected)
const mode = selectList.find(item => item.name.includes('视网膜光凝术'))
this.confirmData.jgshArea = mode && mode.area.filter(item => item.isSelected).map(item => item.name).join('/')
this.confirmData.jgsh = selectList.map(item => item.name).join('/')
},
// id
async queryProject() {
const project = window.sessionStorage.getItem('projectItem') ? JSON.parse(window.sessionStorage.getItem('projectItem')) : []
const { data: res } = await this.$http.get(
'/patient/getZlItemDict',
{
params: {
caseName: '眼科激光手术患者知情同意书'
}
}
)
if (res.code === 0) {
const data = res.data || []
const list = []
if (data.length) {
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < project.length; j++) {
if (data[i].itemId === project[j].porjectCode) {
list.push(project[j].id)
}
}
}
this.confirmData.idList = list
}
} else {
this.$message.error(res.msg)
}
},
handlePrint() {
this.printHidden = false
this.handleSaveTable()
},
//
handleSaveTable() {
if (this.formListValue.informPatientSign === emptySign) {
this.$message.error('签字未成功请重新签字后再保存')
return
}
if (!this.confirmData.eyeType) {
this.$message.error('请选择眼别')
this.$refs.eyeTypeRef.focus()
return
}
this.handleList()
this.handleNarcotism()
this.handleMode()
this.confirmData.patientSign = this.formListValue.informPatientSign
this.confirmData.jzNumber = window.sessionStorage.getItem('jzNumber')
this.$http.post('/mzbl/saveMzblJgshzqtys', {
caseId: this.caseId,
...this.confirmData
}).then(() => {
this.$emit('handleSaveTable')
})
},
//
formDelete() {
this.$confirmFun('确定删除吗?').then(() => {
this.$http.post('/mzbl/delMzblJgshzqtysInfo', {
id: this.caseId
}).then(() => {
this.$message.success('删除成功')
this.$emit('formDelete', 'del')
})
})
}
}
}
</script>
<style lang="scss" scoped>
#operation-record{
height: 100%;
overflow: auto;
background: #fff;
}
::v-deep .el-icon-arrow-up{
display: none;
}
.check {
cursor: pointer;
user-select: none;
display: flex;
margin-right: 0 !important;
input{
-webkit-appearance: checkbox !important;
margin-right: 5px;
}
}
.flex{
display: flex;
}
.a-c{
align-items: center;
}
.j-c{
justify-content: 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_top{
position: fixed;
z-index: 999;
right: 90px;
}
.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>

293
src/page-subspecialty/views/modules/formList/InjectionTherapy.vue

@ -1,293 +0,0 @@
<template>
<div class="formListBox">
<div v-if="!onlyRead && isPlatform" class="btnBox_top">
<el-button v-print="print" size="small" @click="handlePrint">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button type="danger" size="small" @click="formDelete">删除</el-button>
</div>
<div id="injectionTherapy" style="width: 1000px;padding-right: 8px">
<div class="flex j-c">
<img width="450" src="@/assets/img/xianganlogo.png">
</div>
<hr>
<p style="color:#000000;font-size:32px;margin:0 0 30px 0;text-align:center;">
球旁注射治疗同意书
</p>
<div class="flex">
<div class="flex">
姓名<el-input v-model="confirmData.patientName" style="width: 120px" />
</div>
<div class="flex">
性别<el-input v-model="confirmData.patientSex" style="width: 80px" />
</div>
<div class="flex">
年龄<el-input v-model="confirmData.patientAge" style="width: 200px" />
</div>
<div class="flex">
诊断<el-input v-model="confirmData.diagnose" style="width: 300px" />
</div>
</div>
<div class="flex" style="margin-top: 15px">
<span style="margin-right: 15px">治疗方案球旁注射治疗</span>
<div
v-for="(item,index) in confirmData.options"
:key="index"
style="margin: 0 20px 0 0;cursor: pointer"
@click="item.isSelect = !item.isSelect"
>
<input type="checkbox" :checked="item.isSelect">{{ item.name }}
</div>
</div>
<div style="margin-top: 15px">
治疗中可能发生的危险
<div style="margin-top: 15px">
<span>1药物过敏甚至导致过敏性休克</span>
<span>2出血或血肿</span>
</div>
</div>
<div style="margin-top: 15px">
治疗中可能发生的并发症
<div style="margin-top: 15px">
<span>1感染</span>
<span>2损伤眼外肌</span>
<span>3可能穿刺入眼内导致不良后果</span>
</div>
<div style="margin-top: 15px">
病员或家属意见
我们了解该治疗的各种可能发生的风险同意接受治疗
</div>
</div>
<div class="flex j-b" style="margin-top: 20px">
<div class="flex a-c">
<span style="word-break: keep-all;font-weight: bold">本人签名</span>
<div style="margin-left:10px" @click="signClick('injectionPatient')">
<span v-if="!formListValue.injectionPatient">
<img v-if="printHidden" :src="require('@/assets/img/signature.png')" alt="">
<el-input v-else style="width: 80px" />
</span>
<img v-else style="width: 80px;height: 40px;" :src="formListValue.injectionPatient">
</div>
</div>
<div class="flex a-c">
<div style="font-weight: bold">或家属签名</div>
<div style="margin-left:10px" @click="signClick('injectionKin')">
<span v-if="!formListValue.injectionKin">
<img v-if="printHidden" :src="require('@/assets/img/signature.png')" alt="">
<el-input v-else style="width: 80px" />
</span>
<img v-else style="width: 80px;height: 40px;" :src="formListValue.injectionKin">
</div>
</div>
<div class="flex a-c" style="margin-left: 10px">
<span style="word-break: keep-all">操作者</span>
<img v-if="confirmData.operator" :src="confirmData.operator" alt="" style="width: 80px;height: 50px;border-style:none;flex: 1">
</div>
<div class="flex a-c" style="margin-left: 15px">
日期<el-date-picker
v-model="confirmData.operateDate"
style="flex: 1"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import emptySign from '@static/js/emptySign'
import styeFormSign from '@/mixins/styeFormSign'
export default {
name: 'InjectionTherapy',
mixins: [styeFormSign],
props: {
onlyRead: {
type: Boolean,
default: false
},
isPlatform: {
type: Boolean,
default: true
},
patientDetail: {
type: Object
},
caseId: {
type: String,
default: ''
}
},
data() {
return {
print: {
id: 'injectionTherapy',
closeCallback: () => {
this.printHidden = true
}
},
printHidden: true,
orgin: '',
confirmData: {
options: [
{
name: 'OD',
isSelect: false
}, {
name: 'OS',
isSelect: false
}, {
name: 'OU',
isSelect: false
}
],
patientName: '',
patientSex: '',
patientAge: '',
diagnose: '',
patientSign: '',
familySign: '',
operator: '',
operateDate: new Date()
},
formListValue: {
injectionPatient: '',
injectionKin: ''
}
}
},
watch: {
caseId(val) {
if (val) {
this.queryFormData()
}
}
},
created() {
this.orgin = JSON.parse(JSON.stringify(this.confirmData))
this.queryFormData()
},
methods: {
signClick(index) {
this.initPlugin(index)
},
handlePrint() {
this.printHidden = false
this.handleSaveTable()
},
//
handleSaveTable() {
if (this.formListValue.injectionPatient === emptySign || this.formListValue.injectionKin === emptySign) {
this.$message.error('签字未成功请重新签字后再保存')
return
}
this.confirmData.patientSign = this.formListValue.injectionPatient
this.confirmData.familySign = this.formListValue.injectionKin
const data = JSON.stringify(this.confirmData)
this.$emit('handleSaveTable', data)
},
//
queryFormData() {
this.$http.get('/case/getCaseById', { params: {
id: this.caseId
}}).then(data => {
const detail = data.data.data
if (detail.jsonText) {
this.confirmData = JSON.parse(detail.jsonText)
this.formListValue.injectionPatient = this.confirmData.patientSign
this.formListValue.injectionKin = this.confirmData.familySign
} else {
this.confirmData = JSON.parse(JSON.stringify(this.orgin))
const userData = JSON.parse(window.sessionStorage.getItem('qg-userData'))
this.confirmData.operator = userData.signImgBase
this.confirmData.patientName = this.patientDetail.patientName
this.confirmData.patientAge = this.patientDetail.patientAge
this.confirmData.patientSex = this.patientDetail.patientSex
this.queryDiagnostic()
this.formListValue.injectionPatient = this.confirmData.patientSign
this.formListValue.injectionKin = this.confirmData.familySign
}
})
},
queryDiagnostic() {
this.$http.get('/mzbl/getLastDiagnostic', { params: {
patientId: this.patientDetail.patientId
}}).then(data => {
this.confirmData.diagnose = data.data.data
})
},
//
formDelete() {
this.$emit('formDelete')
}
}
}
</script>
<style lang="scss" scoped>
.flex{
display: flex;
}
.a-c{
align-items: center;
}
.j-c{
justify-content: center;
}
.j-b{
justify-content: space-between;
}
#injectionTherapy{
text-align: left;
}
.formListBox{
background: #fff;
padding: 10px 20px 50px 20px;
page-break-after:always;
height: 100%;
overflow: auto;
}
.btnBox_top{
position: fixed;
z-index: 999;
right: 90px;
}
.form_top{
margin-bottom: 15px;
}
.form_content{
text-align: left;
line-height: 26px;
}
.form_detail{
text-indent: 2rem;
margin: 3px 0;
}
.strongTitle{
font-size: 20px;
font-weight: bold;
margin: 10px 0 5px 0;
}
.strong{
font-weight: bold;
}
.underline{
text-decoration: underline;
}
::v-deep .el-icon-arrow-up{
display: none;
}
::v-deep .el-input__inner{
border: none;
border-bottom: 1px solid #cccccc;
border-radius: 0;
font-size: 16px;
height: 26px;
text-align: center;
}
::v-deep .el-input__prefix{
display: none;
}
</style>

378
src/page-subspecialty/views/modules/formList/Lacrimal.vue

@ -1,378 +0,0 @@
<template>
<div class="formListBox">
<div v-if="!onlyRead && isPlatform" class="btnBox_top">
<el-button v-print="print" size="small" @click="handleSaveTable">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button type="danger" size="small" @click="formDelete">删除</el-button>
</div>
<div id="lacrimal" style="width: 800px;padding-right: 8px">
<div class="formContent">
<!--患者信息-->
<div class="flex a-c top_form">
患者姓名<el-input v-model="confirmData.patientName" style="width: 200px" />
</div>
<div class="flex left_eye">
<span class="text">右眼</span>
<div style="margin-bottom: 20px">
<div class="flex" style="flex-wrap: wrap">
<el-select v-model="confirmData.odPunctum" style="width: 100px" clearable filterable allow-create placeholder="">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">泪小点进针</span>
<el-select v-model="confirmData.odReflux" filterable allow-create style="width: 100px" clearable placeholder="">
<el-option
v-for="item in reOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">反流</span>
<el-select v-model="confirmData.odPunctumReflux" filterable allow-create style="width: 100px" clearable placeholder="">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">泪小点反流患者自诉咽部</span>
<el-select v-model="confirmData.odWet" filterable allow-create style="width: 100px" clearable placeholder="">
<el-option
v-for="item in reOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">液体</span>
<el-input v-model="confirmData.odSecretion" style="flex: 1" /><span class="text">分泌物</span>
</div>
<div class="flex" style="flex-wrap: wrap;margin-top: 15px">
<el-select v-model="confirmData.odPunctum2" filterable allow-create style="width: 100px" clearable placeholder="">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">泪小点进针</span>
<el-select v-model="confirmData.odReflux2" filterable allow-create style="width: 100px" clearable placeholder="">
<el-option
v-for="item in reOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">反流</span>
<el-select v-model="confirmData.odPunctumReflux2" filterable allow-create style="width: 100px" clearable placeholder="">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">泪小点反流患者自诉咽部</span>
<el-select v-model="confirmData.odWet2" filterable allow-create style="width: 100px" clearable placeholder="">
<el-option
v-for="item in reOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">液体</span>
<el-input v-model="confirmData.odSecretion2" style="flex: 1" /><span class="text">分泌物</span>
</div>
</div>
</div>
<div class="flex right_eye">
<span class="text">左眼</span>
<div style="margin-bottom: 20px">
<div class="flex" style="flex-wrap: wrap">
<el-select v-model="confirmData.osPunctum" filterable allow-create style="width: 100px" clearable placeholder="">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">泪小点进针</span>
<el-select v-model="confirmData.osReflux" filterable allow-create style="width: 100px" clearable placeholder="">
<el-option
v-for="item in reOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">反流</span>
<el-select v-model="confirmData.osPunctumReflux" filterable allow-create style="width: 100px" clearable placeholder="">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">泪小点反流患者自诉咽部</span>
<el-select v-model="confirmData.osWet" filterable allow-create style="width: 100px" clearable placeholder="">
<el-option
v-for="item in reOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">液体</span>
<el-input v-model="confirmData.osSecretion" style="flex: 1" /><span class="text">分泌物</span>
</div>
<div class="flex" style="flex-wrap: wrap;margin-top: 15px">
<el-select v-model="confirmData.osPunctum2" filterable allow-create style="width: 100px" clearable placeholder="">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">泪小点进针</span>
<el-select v-model="confirmData.osReflux2" filterable allow-create style="width: 100px" clearable placeholder="">
<el-option
v-for="item in reOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">反流</span>
<el-select v-model="confirmData.osPunctumReflux2" filterable allow-create style="width: 100px" clearable placeholder="">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">泪小点反流患者自诉咽部</span>
<el-select v-model="confirmData.osWet2" filterable allow-create style="width: 100px" clearable placeholder="">
<el-option
v-for="item in reOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<span class="text">液体</span>
<el-input v-model="confirmData.osSecretion2" style="flex: 1" /><span class="text">分泌物</span>
</div>
</div>
</div>
<div class="flex">
<div class="flex a-c" style="margin-left: 15px">
日期<el-date-picker
v-model="confirmData.operateDate"
style="flex: 1"
type="date"
value-format="yyyy-MM-dd"
/>
</div>
<div class="flex a-c" style="margin-left: 10px">
<span style="word-break: keep-all">操作者</span>
<img v-if="confirmData.operator" :src="confirmData.operator" alt="" style="width: 80px;height: 50px;border-style:none;flex: 1">
</div>
</div>
</div>
</div>
</div></template>
<script>
export default {
name: 'Lacrimal',
props: {
onlyRead: {
type: Boolean,
default: false
},
isPlatform: {
type: Boolean,
default: true
},
patientDetail: {
type: Object
},
caseId: {
type: String,
default: ''
}
},
data() {
return {
print: {
id: 'lacrimal'
},
options: [
{
label: '下',
value: 2
}, {
label: '上',
value: 1
}, {
label: '/',
value: 3
}
],
reOptions: [
{
label: '有',
value: 3
},
{
label: '无',
value: 4
}, {
label: '/',
value: 5
}
],
orgin: '',
confirmData: {
patientName: '',
operator: '',
operateDate: new Date(),
odPunctum: '',
odReflux: '',
odPunctumReflux: '',
odWet: '',
odSecretion: '',
odPunctum2: '',
odReflux2: '',
odPunctumReflux2: '',
odWet2: '',
odSecretion2: '',
osPunctum: '',
osReflux: '',
osPunctumReflux: '',
osWet: '',
osSecretion: '',
osPunctum2: '',
osReflux2: '',
osPunctumReflux2: '',
osWet2: '',
osSecretion2: ''
}
}
},
watch: {
caseId(val) {
if (val) {
this.queryFormData()
}
}
},
created() {
this.orgin = JSON.parse(JSON.stringify(this.confirmData))
this.queryFormData()
},
methods: {
//
handleSaveTable() {
const data = JSON.stringify(this.confirmData)
this.$emit('handleSaveTable', data)
},
queryFormData() {
this.$http.get('/case/getCaseById', { params: {
id: this.caseId
}}).then(data => {
const detail = data.data.data
if (detail.jsonText) {
this.confirmData = JSON.parse(detail.jsonText)
} else {
this.confirmData = JSON.parse(JSON.stringify(this.orgin))
this.confirmData.patientName = this.patientDetail.patientName
const userData = JSON.parse(window.sessionStorage.getItem('qg-userData'))
this.confirmData.operator = userData.signImgBase
}
})
},
//
formDelete() {
this.$confirmFun('确定删除吗?').then(() => {
this.$http.post('/mzbl/delMzblJgshzlInfo', {
id: this.caseId
}).then(() => {
this.$message.success('删除成功')
this.$emit('formDelete', 'del')
})
})
}
}
}
</script>
<style lang="scss" scoped>
.flex{
display: flex;
}
.a-c{
align-items: center;
}
.j-c{
justify-content: center;
}
.j-b{
justify-content: space-between;
}
.text{
word-break: keep-all;
}
.formListBox{
background: #fff;
padding: 10px 20px 50px 20px;
page-break-after:always;
height: 100%;
overflow: auto;
}
.btnBox_top{
position: fixed;
z-index: 999;
right: 90px;
}
.top_form{
padding: 10px;
}
.right_eye{
border-top: 1px solid #0C1016;
padding: 10px;
}
.left_eye{
padding: 10px;
}
.formContent{
border: 1px solid #0C1016;
}
::v-deep .el-input__inner{
border: none;
border-bottom: 1px solid #cccccc;
border-radius: 0;
font-size: 16px;
height: 26px;
text-align: center;
}
::v-deep .el-input__prefix{
display: none;
}
::v-deep .el-icon-arrow-up{
display: none;
}
</style>

409
src/page-subspecialty/views/modules/formList/MinorOperation.vue

@ -1,409 +0,0 @@
<template>
<div class="formListBox">
<div v-if="!onlyRead && isPlatform" class="btnBox_top">
<el-button v-print="print" size="small" @click="handlePrint">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button type="danger" size="small" @click="formDelete">删除</el-button>
</div>
<div id="minorOperation" style="width: 1000px;padding-right: 8px">
<div class="flex j-c">
<img width="450" src="@/assets/img/xianganlogo.png">
</div>
<hr>
<p style="color:#000000;font-size:32px;margin:0 0 30px 0;text-align:center;">
干眼手术知情同意书
</p>
<div class="flex a-c j-b">
<div>
姓名<el-input v-model="confirmData.patientName" style="width: 100px" />
</div>
<div>
性别<el-input v-model="confirmData.patientSex" style="width: 100px" />
</div>
<div>
年龄<el-input v-model="confirmData.patientAge" style="width: 100px" />
</div>
<div>
科室<el-input v-model="confirmData.department" style="width: 100px" />
</div>
<div>
登记号<el-input v-model="confirmData.patientId" style="width: 100px" />
</div>
</div>
<div class="flex strongTitle">
疾病诊断和治疗建议
</div>
<div class="flex ">
医生已告知我患有<el-input v-model="confirmData.illness" style="width: 200px" />
需要在<el-input v-model="confirmData.way" style="width: 200px" />
麻醉下进行<el-input v-model="confirmData.operate" style="width: 200px" />手术
</div>
<div class="flex strongTitle">
手术潜在风险和对策
</div>
<div style="text-indent: 2rem;text-align: left">
医生告知我上述治疗方案可能发生的一些风险有些不常见的风险可能没有在此列出具体的手术式根据不同病人的情况有所不同医生告诉我可与我的医生讨论有关我手术的具体内容如果我有特殊的问题可与我的医生讨论
<div class="form_content">
<div v-for="(item,index) in content" :key="index" style="margin: 5px 0">
{{ item.title }}<span v-if="item.strong" :class="{underline:index===4,strong:true}">{{ item.strong }}</span>
<div v-for="(text,idx) in item.detail" :key="`${index}_${idx}`" :class="{underline:index===5}" class="form_detail">
{{ text }}
</div>
</div>
</div>
</div>
<div>
在向患方说明各治疗方案并告知利弊后患方基于当前病情需要经慎重考虑自愿选择 <el-input v-model="confirmData.treatOperate" style="width: 200px" /> 手术
</div>
<div class="flex strongTitle">
特殊风险或主要高危因素
</div>
<div style="text-align: left;margin-left: 2rem">
我理解根据我个人的病情我可能出现未包括在上述所交待并发症以外的风险
<el-input v-model="confirmData.docAdvice" type="textarea" :rows="3" />
一旦发生上述风险和意外医生会采取积极应对措施
</div>
<div class="flex strongTitle">
患者知情选择
</div>
<div style="text-align: left">
<p style="text-indent: 2rem">
我的医生已经告知我将要进行的治疗方式此次治疗及治疗后可能发生的并发症和风险可能存在的其它治疗方法并且解答了我关于此次治疗的相关问题
</p>
<p style="text-indent: 2rem">
我同意在治疗中医生可以根据我的病情对预定的治疗方式做出调整
</p>
<p style="text-indent: 2rem">
我理解我的治疗需要多位医生共同进行
</p>
<p style="text-indent: 2rem">
我并未得到治疗百分之百成功的许诺
</p>
<p style="text-indent: 2rem">
我授权医师对治疗切除的病变器官组织或标本进行处置包括病理学检查细胞学检查和医疗废物处理等
</p>
<div class="flex" style="margin-left: 2rem">
<div></div>
<el-select v-model="confirmData.isAgree" placeholder="" clearable style="width: 100px">
<el-option
v-for="item in options"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select>
<div>接受上述治疗并授权医师在实施过程中遇有异常情况时为保障患者的生命安全对其实施必要的救治措施</div>
</div>
<div style="text-indent: 2rem">今签字为证</div>
</div>
<div class="flex j-b" style="margin-top: 20px">
<div class="flex a-c">
<span style="word-break: keep-all;font-weight: bold">患者签名</span>
<div style="margin-left:10px" @click="signClick('minPatSign')">
<img v-if="!formListValue.minPatSign&&printHidden" :src="require('@/assets/img/signature.png')" alt="">
<img v-if="formListValue.minPatSign" style="width: 80px;height: 40px;" :src="formListValue.minPatSign">
<el-input v-if="!formListValue.minPatSign&&!printHidden" style="width: 80px" />
</div>
</div>
<div style="margin-left: 100px">
签名日期
<el-date-picker
v-model="confirmData.patientDate"
style="flex: 1"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
<div class="flex">
如果患者无法签署知情同意书请其授权的亲属在此签名
</div>
<div class="flex j-b">
<div class="flex a-c">
<div style="font-weight: bold">患者授权亲属签名</div>
<div style="margin-left:10px" @click="signClick('minKinSign')">
<img v-if="!formListValue.minKinSign&&printHidden" :src="require('@/assets/img/signature.png')" alt="">
<img v-if="formListValue.minKinSign" style="width: 80px;height: 40px;" :src="formListValue.minKinSign">
<el-input v-if="!formListValue.minKinSign&&!printHidden" style="width: 80px" />
</div>
<span>与患者关系</span>
<el-input v-model="confirmData.relation" style="width: 100px" />
</div>
<div>
签名日期
<el-date-picker
v-model="confirmData.kinDate"
style="flex: 1"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
<div class="flex strongTitle">
医生陈述
</div>
<div style="font-weight: normal;font-size: 16px">
我已经告知患者将要进行的治疗方式此次治疗及治疗后可能发生的并发症和风险可能存在的其它治疗方法并且解答了患者关于此次治疗的相关问题
</div>
<div class="flex j-b" style="margin-top: 15px">
<div class="flex a-c" style="margin-left: 10px">
<span style="word-break: keep-all">医生签名</span>
<img v-if="confirmData.operator" :src="confirmData.operator" alt="" style="width: 80px;height: 50px;border-style:none;flex: 1">
</div>
<div class="flex a-c" style="margin-left: 15px">
日期<el-date-picker
v-model="confirmData.operateDate"
style="flex: 1"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import emptySign from '@static/js/emptySign'
import styeFormSign from '@/mixins/styeFormSign'
export default {
name: 'MinorOperation',
mixins: [styeFormSign],
props: {
onlyRead: {
type: Boolean,
default: false
},
isPlatform: {
type: Boolean,
default: true
},
patientDetail: {
type: Object
},
caseId: {
type: String,
default: ''
}
},
data() {
return {
options: [
{
label: '同意',
value: 1,
id: 'yes'
},
{
label: '不同意',
value: 2,
id: 'no'
}
],
content: [
{
title: '一、我理解任何手术、麻醉都存在风险;如果我患有高血压、心脏病、糖尿病、肝肾功能不全、静脉血栓等疾病或者有吸烟史,以上这些风险可能会加大,或者在术中或术后出现相关的病情加重或心脑血管意外,甚至死亡。'
},
{
title: '二、我理解任何所用药物都可能产生副作用,包括轻度的恶心、皮疹等症状到严重的过敏性休克,甚至危及生命。'
},
{
title: '三、我理解此手术可能发生的风险及医生的对策:',
detail: [
'1.各种手术都有感染的可能,手术可能出现泪囊炎、泪小管炎等感染性炎症,但大部分经治疗均能好转,只有极个别的病人由于严重的感染不仅丧失视力,重者可能丧失眼球。',
'2.临时性泪道栓子不需要取出,一般3-6个月可自行吸收,吸收后可能症状会再次出现,此时需要再次植入临时性或永久性泪道栓子。',
'3.永久性泪道栓子无特殊情况,一般不用取出,若出现感染、异物感、疼痛等不适,可根据需要手术取出或更换。',
'4.泪道栓子植入后用力揉搓内眦角处、用力擤鼻子,可能引起角膜擦伤和栓子脱落,需要针对具体情况进行后续治疗,包括促进角膜损伤修复的相关治疗、再次植入泪道栓子等。',
'5.若泪道栓子适配不佳,可能影响手术效果,必要时需再次更换不同型号的泪道栓子。',
'6.在泪道栓子植入过程中,可能出现泪小点撕裂、泪道上皮损伤、出血等并发症。',
'7.手术治疗后不一定能完全缓解干眼,甚至需要辅助其他干眼治疗方案。',
'8.泪小点封闭属于破坏性手术,一旦施行后无将导致泪小点永久性瘢痕形成。',
'9.部分患者手术后会出现溢泪。'
]
},
{
title: '四、患者手术的医护人员团队将尽全力按操作规范实施上述治疗,并且一旦发生并发症或意外情况,将从维护患者利益的角度出发积极采取措施,以努力降低并发症或意外情况导致的对患者的损害后果。'
},
{
title: '五、您有权选择同意或不同意接受上述治疗,但是如果拒绝接受上述治疗,您将面临以下风险:',
strong: '视力丧失、眼部不适、眼表新生血管等。'
},
{
title: '六、根据患者目前的病情和我院目前开展的医疗技术,您还可以选择其他',
strong: '替代诊疗方案',
detail: [
'1.激光治疗(OPT):操作简便,需多次进行;治疗效果因人而异。',
'2.药物治疗:干眼的优选治疗方案,药物治疗无效者,才考虑其他治疗方案。',
'3.物理治疗:常与药物治疗协同进行,需多次进行,包括药物熏蒸、睑板腺按摩等。',
'4.中医治疗:中医治疗手段众多,效果因人而异。',
'5.观察:患者可能长期存在眼部不适症状。'
]
}
],
print: {
id: 'minorOperation',
closeCallback: () => {
this.$nextTick(() => {
this.printHidden = true
})
}
},
printHidden: true,
orgin: '',
confirmData: {
patientName: '',
patientAge: '',
patientId: '',
patientSex: '',
department: '眼科',
illness: '',
way: '',
operate: '',
treatOperate: '',
docAdvice: '',
relation: '',
patientSign: '',
familySign: '',
operator: '',
isAgree: '',
patientDate: new Date(),
kinDate: new Date(),
operateDate: new Date()
},
formListValue: {
minPatSign: '',
minKinSign: ''
}
}
},
watch: {
caseId(val) {
if (val) {
this.queryFormData()
}
}
},
created() {
this.orgin = JSON.parse(JSON.stringify(this.confirmData))
this.queryFormData()
},
methods: {
signClick(text) {
this.initPlugin(text)
},
handlePrint() {
this.printHidden = false
this.handleSaveTable()
},
//
handleSaveTable() {
if (this.formListValue.minPatSign === emptySign || this.formListValue.minKinSign === emptySign) {
this.$message.error('签字未成功请重新签字后再保存')
return
}
this.confirmData.patientSign = this.formListValue.minPatSign
this.confirmData.familySign = this.formListValue.minKinSign
const data = JSON.stringify(this.confirmData)
this.$emit('handleSaveTable', data)
},
//
queryFormData() {
this.$http.get('/case/getCaseById', { params: {
id: this.caseId
}}).then(data => {
const detail = data.data.data
if (detail.jsonText) {
this.confirmData = JSON.parse(detail.jsonText)
this.formListValue.minPatSign = this.confirmData.patientSign
this.formListValue.minKinSign = this.confirmData.familySign
} else {
this.confirmData = JSON.parse(JSON.stringify(this.orgin))
const userData = JSON.parse(window.sessionStorage.getItem('qg-userData'))
this.confirmData.operator = userData.signImgBase
this.confirmData.patientName = this.patientDetail.patientName
this.confirmData.patientAge = this.patientDetail.patientAge
this.confirmData.patientSex = this.patientDetail.patientSex
this.confirmData.patientId = this.patientDetail.patientId
this.formListValue.minPatSign = this.confirmData.patientSign
this.formListValue.minKinSign = this.confirmData.familySign
}
})
},
//
formDelete() {
this.$emit('formDelete')
}
}
}
</script>
<style lang="scss" scoped>
.flex{
display: flex;
}
.a-c{
align-items: center;
}
.j-c{
justify-content: center;
}
.j-b{
justify-content: space-between;
}
#minorOperation{
text-align: left;
}
.formListBox{
background: #fff;
padding: 10px 20px 50px 20px;
page-break-after:always;
height: 100%;
overflow: auto;
}
.btnBox_top{
position: fixed;
z-index: 999;
right: 90px;
}
.form_top{
margin-bottom: 15px;
}
.form_content{
text-align: left;
line-height: 26px;
}
.form_detail{
text-indent: 2rem;
margin: 3px 0;
}
.strongTitle{
font-size: 20px;
font-weight: bold;
margin: 10px 0 5px 0;
}
.strong{
font-weight: bold;
}
.underline{
text-decoration: underline;
}
::v-deep .el-icon-arrow-up{
display: none;
}
::v-deep .el-input__inner{
border: none;
border-bottom: 1px solid #cccccc;
border-radius: 0;
font-size: 16px;
height: 26px;
text-align: center;
}
::v-deep .el-input__prefix{
display: none;
}
</style>

423
src/page-subspecialty/views/modules/formList/StyeForm.vue

@ -1,423 +0,0 @@
<template>
<div class="formListBox">
<div v-if="!onlyRead && isPlatform" class="btnBox_top">
<el-button v-print="print" size="small" @click="handlePrint">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button type="danger" size="small" @click="formDelete">删除</el-button>
</div>
<div id="styeForm" style="width: 1000px;padding-right: 8px">
<div class="flex j-c">
<img width="450" src="@/assets/img/xianganlogo.png">
</div>
<hr>
<p style="color:#000000;font-size:32px;margin:0 0 30px 0;text-align:center;">
麦粒肿/霰粒肿/肉芽肿/眼睑肿物手术知情同意书
</p>
<div class="flex a-c j-b">
<div>
姓名<el-input v-model="confirmData.patientName" style="width: 100px" />
</div>
<div>
性别<el-input v-model="confirmData.patientSex" style="width: 100px" />
</div>
<div>
年龄<el-input v-model="confirmData.patientAge" style="width: 100px" />
</div>
<div>
科室<el-input v-model="confirmData.department" style="width: 100px" />
</div>
<div>
登记号<el-input v-model="confirmData.patientId" style="width: 100px" />
</div>
</div>
<div>
<div class="flex">
诊断<el-input v-model="confirmData.diagnose" style="flex: 1" />
</div>
<div class="flex" style="margin: 8px 0">
眼别
<el-select
v-model="confirmData.eyeType"
filterable
allow-create
placeholder=""
style="flex: 1"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
<div class="flex" style="margin: 8px 0">
手术名称
<el-select v-model="confirmData.operationName" style="flex: 1" filterable allow-create clearable placeholder="">
<el-option
v-for="item in types"
:key="item.name"
:label="item.value"
:value="item.name"
/>
</el-select>
</div>
<div class="flex">
麻醉方式<el-input v-model="confirmData.narcotism" style="flex: 1" />
</div>
</div>
<div>
<div class="flex strongTitle">
尊敬的患者患者家属授权委托人
</div>
<div>
您好根据患者目前病情拟选择以下手术治疗方案
<div class="flex" style="margin-left: 2rem">
<div v-for="(item,index) in confirmData.options" :key="index" style="margin: 0 20px 0 0" @click="item.isSelect = !item.isSelect">
<input type="checkbox" :checked="item.isSelect">{{ item.name }}
</div>
</div>
</div>
</div>
<div style="text-indent: 2rem;text-align: left">
<div class="flex strongTitle">
在实施上述手术/治疗疗过程中及手术/治疗后可能会发生的并发症及风险主要有
</div>
<div class="form_content">
<div v-for="(item,index) in content" :key="index" style="margin: 5px 0">
{{ item }}
<span v-if="index===10" class="strong underline">病情加重进展形成肉芽肿眶蜂窝织炎全身感染败血症 </span>
<span v-if="index===11" class="underline">继续药物保守治疗病情可能无法进展仍需手术治疗</span>
</div>
</div>
</div>
<div>
在向患方说明各治疗方案并告知利弊后患方基于当前病情需要经慎重考虑自愿选择
<el-select v-model="confirmData.treatOperate" style="width: 260px" filterable allow-create clearable placeholder="">
<el-option
v-for="item in types"
:key="item.name"
:label="item.value"
:value="item.name"
/>
</el-select>
</div>
<div class="flex strongTitle">
患者知情选择
</div>
<div style="text-align: left">
我的医生已经告知我将要进行的手术/治疗此次手术/治疗及手术/治疗后可能发生的风险可能存在的其它手术/治疗方法并且解答了我关于此次手术/治疗的相关问题以上内容我已逐条认真阅读并理解行麦粒肿/霰粒肿/肉芽肿/眼睑肿物切除术的相关风险及可能并发症同意进行此项手术/治疗
</div>
<div class="flex j-b" style="margin-top: 20px">
<div class="flex a-c">
<span style="word-break: keep-all;font-weight: bold">患者签名</span>
<div style="margin-left:10px" @click="signClick('minorPatientSign')">
<span v-if="!formListValue.minorPatientSign">
<img v-if="printHidden" :src="require('@/assets/img/signature.png')" alt="">
<el-input v-else style="width: 80px" />
</span>
<img v-else style="width: 80px;height: 40px;" :src="formListValue.minorPatientSign">
</div>
</div>
<div style="margin-left: 100px">
签名日期
<el-date-picker
v-model="confirmData.patientDate"
style="flex: 1"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
<div class="flex">
如果患者无法签署知情同意书请其授权的亲属在此签名
</div>
<div class="flex j-b">
<div class="flex a-c">
<div style="font-weight: bold">患者授权亲属签名</div>
<div style="margin-left:10px" @click="signClick('minorKinSign')">
<span v-if="!formListValue.minorKinSign">
<img v-if="printHidden" :src="require('@/assets/img/signature.png')" alt="">
<el-input v-else style="width: 80px" />
</span>
<img v-else style="width: 80px;height: 40px;" :src="formListValue.minorKinSign">
</div>
<span>与患者关系</span>
<el-input v-model="confirmData.relation" style="width: 100px" />
</div>
<div>
签名日期
<el-date-picker
v-model="confirmData.kinDate"
style="flex: 1"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
<div class="flex strongTitle">
医生陈述
</div>
<div style="font-weight: normal;font-size: 16px">
我已经告知患者将要进行的手术/治疗此次手术/治疗及手术/治疗后可能发生的风险可能存在的其它手术/治疗方法并且解答了患者关于此次手术/治疗的相关问题
</div>
<div class="flex j-b" style="margin-top: 15px">
<div class="flex a-c" style="margin-left: 10px">
<span style="word-break: keep-all">医生签名</span>
<img v-if="confirmData.operator" :src="confirmData.operator" alt="" style="width: 80px;height: 50px;border-style:none;flex: 1">
</div>
<div class="flex a-c" style="margin-left: 15px">
日期<el-date-picker
v-model="confirmData.operateDate"
style="flex: 1"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import emptySign from '@static/js/emptySign'
import styeFormSign from '@/mixins/styeFormSign'
export default {
name: 'StyeForm',
mixins: [styeFormSign],
props: {
onlyRead: {
type: Boolean,
default: false
},
isPlatform: {
type: Boolean,
default: true
},
patientDetail: {
type: Object
},
caseId: {
type: String,
default: ''
}
},
data() {
return {
options: [{
value: 'OD',
label: 'OD'
}, {
value: 'OS',
label: 'OS'
}, {
value: 'OU',
label: 'OU'
}],
types: [],
content: [
'1.麻醉意外,极少数人对麻醉药物过敏,引起药物反应。',
'2.手术操作过程中难以避免的组织或器官损伤:如结膜、角膜、肌肉、神经、血管、邻近器官等,并导致其他并发症的发生。',
'3.术中出血。',
'4.术中由于病情原因切除不干净,术后复发,需再次手术治疗。',
'5.术后切口感染。',
'6.术后切口愈合不良、肉芽组织增生,需再次手术治疗。',
'7.术后出现血肿、皮下瘀血。',
'8.术后结膜、皮肤瘢痕化。',
'9.根据患者病情,若切除的组织需进行病理检查,一般7个工作日可取得报告。',
'10.医护人员团队将尽全力按操作规范实施上述手术/治疗,并且一旦发生并发症或意外情况,将从维护患者及家属利益的角度出发积极采取措施,以努力降低并发症或意外情况导致的对患者的损害后果。',
'11.您有权选择同意或不同意接受上述手术/治疗,但是如果拒绝接受上述手术/治疗,您将面临以下风险:病情加重进展、形成肉芽肿、眶蜂窝织炎、全身感染、败血症 等。',
'12.根据患者目前的病情和我院目前开展的医疗技术,您还可以选择其他替代诊疗方案 继续药物保守治疗,病情可能无法进展,仍需手术治疗'
],
print: {
id: 'styeForm',
closeCallback: () => {
this.printHidden = true
}
},
printHidden: true,
orgin: '',
formListValue: {
minorPatientSign: '',
minorKinSign: ''
},
confirmData: {
patientName: '',
patientAge: '',
patientId: '',
patientSex: '',
department: '眼科',
options: [
{
name: '麦粒肿切除术',
isSelect: false
}, {
name: '霰粒肿切除术',
isSelect: false
}, {
name: '肉芽肿切除术',
isSelect: false
}, {
name: '眼睑肿物切除术',
isSelect: false
}
],
eyeType: '',
diagnose: '',
operationName: '',
narcotism: '局部浸润麻醉',
docAdvice: '',
relation: '',
patientSign: '',
familySign: '',
operator: '',
patientDate: new Date(),
kinDate: new Date(),
operateDate: new Date()
}
}
},
watch: {
caseId(val) {
if (val) {
this.queryFormData()
}
}
},
created() {
this.orgin = JSON.parse(JSON.stringify(this.confirmData))
this.queryFormData()
},
methods: {
signClick(text) {
this.initPlugin(text)
},
queryOperations() {
this.$http.get('mzbl/getMlzZyzqtysProject').then(data => {
this.types = data.data.data
})
},
queryDiagnostic() {
this.$http.get('/mzbl/getLastDiagnostic', { params: {
patientId: this.patientDetail.patientId
}}).then(data => {
this.confirmData.diagnose = data.data.data
})
},
handlePrint() {
this.printHidden = false
this.handleSaveTable()
},
//
handleSaveTable() {
if (this.formListValue.minorPatientSign === emptySign || this.formListValue.minorKinSign === emptySign) {
this.$message.error('签字未成功请重新签字后再保存')
return
}
this.confirmData.patientSign = this.formListValue.minorPatientSign
this.confirmData.familySign = this.formListValue.minorKinSign
const data = JSON.stringify(this.confirmData)
this.$emit('handleSaveTable', data)
},
//
queryFormData() {
this.$http.get('/case/getCaseById', { params: {
id: this.caseId
}}).then(data => {
this.queryOperations()
const detail = data.data.data
if (detail.jsonText) {
this.confirmData = JSON.parse(detail.jsonText)
this.formListValue.minorPatientSign = this.confirmData.patientSign
this.formListValue.minorKinSign = this.confirmData.familySign
} else {
this.queryDiagnostic()
this.confirmData = JSON.parse(JSON.stringify(this.orgin))
const userData = JSON.parse(window.sessionStorage.getItem('qg-userData'))
this.confirmData.operator = userData.signImgBase
this.confirmData.patientName = this.patientDetail.patientName
this.confirmData.patientAge = this.patientDetail.patientAge
this.confirmData.patientSex = this.patientDetail.patientSex
this.confirmData.patientId = this.patientDetail.patientId
this.formListValue.minorPatientSign = this.confirmData.patientSign
this.formListValue.minorKinSign = this.confirmData.familySign
}
})
},
//
formDelete() {
this.$emit('formDelete')
}
}
}
</script>
<style lang="scss" scoped>
.flex{
display: flex;
}
.a-c{
align-items: center;
}
.j-c{
justify-content: center;
}
.j-b{
justify-content: space-between;
}
#styeForm{
text-align: left;
}
.formListBox{
background: #fff;
padding: 10px 20px 50px 20px;
page-break-after:always;
height: 100%;
overflow: auto;
}
.btnBox_top{
position: fixed;
z-index: 999;
right: 90px;
}
.form_top{
margin-bottom: 15px;
}
.form_content{
text-align: left;
line-height: 26px;
}
.form_detail{
text-indent: 2rem;
margin: 3px 0;
}
.strongTitle{
font-size: 20px;
font-weight: bold;
margin: 10px 0 5px 0;
}
.strong{
font-weight: bold;
}
.underline{
text-decoration: underline;
}
::v-deep .el-icon-arrow-up{
display: none;
}
::v-deep .el-input__inner{
border: none;
border-bottom: 1px solid #cccccc;
border-radius: 0;
font-size: 16px;
height: 26px;
text-align: center;
}
::v-deep .el-input__prefix{
display: none;
}
</style>

333
src/page-subspecialty/views/modules/formList/childrenLacrimal.vue

@ -1,333 +0,0 @@
<template>
<div class="lacrimalBox">
<div v-if="!onlyRead && isPlatform" class="btnBox_top">
<el-button v-print="print" size="small" @click="handlePrint">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button type="danger" size="small" @click="formDelete">删除</el-button>
</div>
<div id="lacrimalOperation" style="width: 840px;padding-right: 8px">
<div class="flex j-c">
<img width="450" src="@/assets/img/xianganlogo.png">
</div>
<hr>
<p style="color:#000000;font-size:32px;margin:0 0 30px 0;text-align:center;">
小儿泪道冲洗知情同意书
</p>
<div class="flex a-c j-b">
<div>
姓名<el-input v-model="confirmData.patientName" style="width: 100px" />
</div>
<div>
性别<el-input v-model="confirmData.patientSex" style="width: 100px" />
</div>
<div>
年龄<el-input v-model="confirmData.patientAge" style="width: 100px" />
</div>
<div>
科室<el-input v-model="confirmData.department" style="width: 100px" />
</div>
<div>
登记号<el-input v-model="confirmData.patientId" style="width: 100px" />
</div>
</div>
<!--患者信息-->
<div class="form_top">
<div class="flex a-c">
<span style="font-weight: bold">诊断</span><el-input v-model="confirmData.diagnose" style="width: 700px" />
</div>
<div class="flex a-c">
<span style="font-weight: bold">治疗名称</span><el-input v-model="confirmData.treatName" style="width: 300px" />
<div class="flex">
(<div class="checkBox" @click="confirmData.isPrint='OD'">
<input type="checkbox" :checked="confirmData.isPrint==='OD'">右眼
</div>
<div style="margin-left: 30px" class="checkBox" @click="confirmData.isPrint='OS'">
<input type="checkbox" :checked="confirmData.isPrint==='OS'">左眼
</div>
<div style="margin-left: 30px" class="checkBox" @click="confirmData.isPrint='OU'">
<input type="checkbox" :checked="confirmData.isPrint==='OU'">双眼
</div>)
</div>
</div>
<div class="flex a-c">
<span style="font-weight: bold">麻醉方式</span><el-input v-model="confirmData.anesthesiaMode" style="width: 700px" />
</div>
</div>
<div class="form_content">
<div v-for="(item,index) in content" :key="index" style="margin: 5px 0">
<span style="font-weight: bold">{{ item.title }}</span>
<div v-for="(text,idx) in item.detail" :key="`${index}_${idx}`" class="form_detail">
{{ text }}
</div>
</div>
</div>
<div style="margin-top: 15px">
<div class="flex a-c">
<div style="margin-right: 296px;">
<span style="word-break: keep-all">患儿监护人签名</span>
<span style="margin-left:10px" @click="signClick('childrenSign')">
<span v-if="!formListValue.childrenSign">
<img v-if="printHidden" :src="require('@/assets/img/signature.png')" alt="" style="margin-right: 12px">
<el-input v-else style="width: 80px" />
</span>
<img v-else style="width: 80px;height: 40px;" :src="formListValue.childrenSign">
</span>
</div>
<div>
签名日期:<el-date-picker
v-model="confirmData.operateDate"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
</div>
<div style="margin: 5px 0;text-align: left">
<span style="font-weight: bold;">医生陈述</span>
<div class="form_detail">
我已经告知患者将要进行的检查/治疗此次检查/治疗及检查/治疗后可能发生的风险可能存在的其它检查/治疗方法并且解答了患者关于此次检查/治疗的相关问题
</div>
</div>
<div class="flex a-c">
<div style="margin-right: 296px;">
<span style="word-break: keep-all">医生签名</span>
<span style="margin-left:10px">
<img style="width: 80px;height: 40px;" :src="confirmData.operator">
</span>
</div>
<div>
签名日期:<el-date-picker
v-model="confirmData.operate2Date"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import emptySign from '@static/js/emptySign'
import styeFormSign from '@/mixins/styeFormSign'
export default {
name: 'Lacrimal',
mixins: [styeFormSign],
props: {
onlyRead: {
type: Boolean,
default: false
},
isPlatform: {
type: Boolean,
default: true
},
patientDetail: {
type: Object
},
caseId: {
type: String,
default: ''
}
},
data() {
return {
content: [
{
title: '尊敬患儿家长:',
detail: [
'您好!根据患儿目前病情需要进行泪道冲洗检查,在实施上述检查/治疗过程中及治疗后可能会发生的并发症及风险主要有:',
'1.泪道冲洗过程中患儿无法配合检查,强烈挣扎可能造成呛咳,引发紫绀、缺氧、呼吸窒息、吸入性肺炎等,甚至危及生命;强烈挣扎可能损伤角膜、结膜、引起皮下瘀血、结膜炎等。',
'2.泪道冲洗过程中发生出血。',
'3.泪道冲洗后发生感染。',
'4.泪道冲洗后形成假道;或需要多次冲洗,甚至需要行泪道探查术。',
'5.医护人员团队将尽全力按操作规范实施上述检查/治疗,并且一旦发生并发症或意外情况,将从维护患儿及家属利益的角度出发积极采取措施,以努力降低并发症或意外情况导致的对患儿的损害后果。',
'6.您有权选择同意或不同意接受上述检查/治疗,但是如果拒绝接受上述检查/治疗,您将面临以下风险:病情加重进展、溢泪、泪囊炎、眶蜂窝织炎 等。',
'7.根据患者目前的病情和我院目前开展的医疗技术,您还可以选择其他替代诊疗方案 保守药物治疗,症状无法缓解,引起泪道感染等并发症。',
'在向患方说明各治疗方案并告知利弊后,患方基于当前病情需要,经慎重考虑,自愿选择 泪道冲洗 。'
]
},
{
title: '患者知情选择',
detail: [
'我的医生已经告知我将要进行的检查/治疗、此次检查/治疗及检查/治疗后可能发生的风险,可能存在的其它检查/治疗方法,并且解答了我关于此次检查/治疗的相关问题,以上内容我已逐条认真阅读并理解行小儿泪道冲洗的相关风险及可能并发症,同 意进行此项检查/治疗。'
]
}
],
sourceData: {},
print: {
id: 'lacrimalOperation',
closeCallback: () => {
this.printHidden = true
}
},
printHidden: true,
formId: '',
confirmData: {
patientName: '',
patientAge: '',
patientId: '',
patientSex: '',
department: '眼科',
diagnose: '',
isPrint: '',
treatName: '泪道冲洗',
anesthesiaMode: '表面麻醉',
patientSign: '',
operator: '',
operateDate: '',
operate2Date: ''
},
formListValue: {
childrenSign: ''
}
}
},
watch: {
caseId(val) {
if (val) {
this.getformList()
}
}
},
created() {
this.sourceData = JSON.parse(JSON.stringify(this.confirmData))
this.getformList()
},
methods: {
signClick(index) {
this.initPlugin(index)
},
setData() {
this.queryDiagnostic()
const date = this.$moment().format('YYYY-MM-DD')
this.confirmData.operateDate = date
this.confirmData.operate2Date = date
this.confirmData.operate3Date = date
const userData = JSON.parse(window.sessionStorage.getItem('qg-userData'))
this.confirmData.operator = userData.signImgBase
},
queryDiagnostic() {
this.$http.get('/mzbl/getLastDiagnostic', { params: {
patientId: this.patientDetail.patientId
}}).then(data => {
this.confirmData.diagnose = data.data.data
})
},
async getformList() {
const { data: res } = await this.$http.get('/case/getCaseById', {
params: {
id: this.caseId
}
})
if (res.code === 0) {
if (res.data) {
if (res.data.jsonText) {
this.confirmData = JSON.parse(res.data.jsonText)
this.formListValue.childrenSign = this.confirmData.patientSign
} else {
this.confirmData = JSON.parse(JSON.stringify(this.sourceData))
this.confirmData.patientName = this.patientDetail.patientName
this.confirmData.patientAge = this.patientDetail.patientAge
this.confirmData.patientSex = this.patientDetail.patientSex
this.confirmData.patientId = this.patientDetail.patientId
this.formListValue.childrenSign = ''
this.setData()
}
}
} else {
this.$message.error(res.msg)
}
},
handlePrint() {
this.printHidden = false
this.handleSaveTable()
},
//
async handleSaveTable() {
if (this.formListValue.childrenSign === emptySign) {
this.$message.error('签字未成功请重新签字后再保存')
return
}
this.confirmData.patientSign = this.formListValue.childrenSign
const params = {
id: this.caseId,
flag: '8',
jsonText: JSON.stringify(this.confirmData),
name: '小儿泪道冲洗知情同意书',
patientId: this.patientDetail.patientId,
platform: 2
}
const { data: res } = await this.$http.post('/case/update', params)
if (res.code === 0) {
this.$message.success('保存成功')
await this.getformList()
} else {
this.$message.error(res.msg)
}
},
//
formDelete() {
this.$confirmFun('确定删除吗?').then(() => {
this.$http.post('/case/delete', {
id: this.caseId
}).then(() => {
this.$message.success('删除成功')
this.$emit('formDelete', 'del')
})
})
}
}
}
</script>
<style lang="scss" scoped>
.flex{
display: flex;
}
.a-c{
align-items: center;
}
.j-c{
justify-content: center;
}
.j-b{
justify-content: space-between;
}
.lacrimalBox{
background: #fff;
padding: 10px 20px 50px 20px;
page-break-after:always;
height: 100%;
overflow: auto;
}
.btnBox_top{
position: fixed;
z-index: 999;
right: 90px;
}
.form_top{
margin-bottom: 15px;
}
.form_content{
text-align: left;
}
.form_detail{
text-indent: 2rem;
margin: 3px 0;
}
::v-deep .el-input__inner{
border: none;
border-bottom: 1px solid #cccccc;
border-radius: 0;
font-size: 16px;
height: 26px;
text-align: center;
}
::v-deep .el-input__prefix{
display: none;
}
</style>

376
src/page-subspecialty/views/modules/formList/conjunctivalOperation.vue

@ -1,376 +0,0 @@
<template>
<div class="formListBox">
<div v-if="!onlyRead && isPlatform" class="btnBox_top">
<el-button v-print="print" size="small" @click="handlePrint">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button type="danger" size="small" @click="formDelete">删除</el-button>
</div>
<div id="minorOperation" style="width: 840px;padding-right: 8px">
<div class="flex j-c">
<img width="450" src="@/assets/img/xianganlogo.png">
</div>
<hr>
<p style="color:#000000;font-size:32px;margin:0 0 30px 0;text-align:center;">
干眼激光治疗知情同意书
</p>
<div class="flex a-c j-b">
<div>
姓名<el-input v-model="confirmData.patientName" style="width: 100px" />
</div>
<div>
性别<el-input v-model="confirmData.patientSex" style="width: 100px" />
</div>
<div>
年龄<el-input v-model="confirmData.patientAge" style="width: 100px" />
</div>
<div>
科室<el-input v-model="confirmData.department" style="width: 100px" />
</div>
<div>
登记号<el-input v-model="confirmData.patientId" style="width: 100px" />
</div>
</div>
<!--患者信息-->
<div class="form_top">
<div class="flex a-c">
<span style="font-weight: bold">诊断</span><el-input v-model="confirmData.diagnose" style="width: 700px" />
</div>
</div>
<div class="form_content">
<div v-for="(item,index) in content" :key="index" style="margin: 5px 0">
<span style="font-weight: bold">{{ item.title }}</span>
<div v-for="(text,idx) in item.detail" :key="`${index}_${idx}`" class="form_detail">
{{ text }}
</div>
</div>
</div>
<div style="margin-top: 15px">
<div class="flex a-c">
<div style="margin-right: 296px;">
<span style="word-break: keep-all">患者签名</span>
<span style="margin-left:10px" @click="signClick('conPatientSign')">
<span v-if="!formListValue.conPatientSign">
<img v-if="printHidden" :src="require('@/assets/img/signature.png')" alt="" style="margin-right: 12px">
<el-input v-else style="width: 80px" />
</span>
<img v-else style="width: 80px;height: 40px;" :src="formListValue.conPatientSign">
</span>
</div>
<div>
签名日期:<el-date-picker
v-model="confirmData.operateDate"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
<div class="flex a-c">
<div>
<span>患者授权亲属签名</span>
<span style="margin-left:10px" @click="signClick('conKinSign')">
<span v-if="!formListValue.conKinSign">
<img v-if="printHidden" :src="require('@/assets/img/signature.png')" alt="" style="margin-right: 12px">
<el-input v-else style="width: 80px" />
</span>
<img v-else style="width: 80px;height: 40px;" :src="formListValue.conKinSign">
</span>
<span style="margin-left: 15px">与患者关系<el-input v-model="confirmData.relation" style="width: 150px" /></span>
</div>
<div>
签名日期:<el-date-picker
v-model="confirmData.operate2Date"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
</div>
<div style="margin: 5px 0;text-align: left">
<span style="font-weight: bold;">医生陈述</span>
<div class="form_detail">
我已经告知患者将要进行的治疗此次治疗及治疗后可能发生的风险可能存在的其它治疗方法并且解答了患者关于此次治疗的相关问题
</div>
</div>
<div class="flex a-c">
<div style="margin-right: 296px;">
<span style="word-break: keep-all">医生签名</span>
<span style="margin-left:10px">
<img style="width: 80px;height: 40px;" :src="confirmData.operator">
</span>
</div>
<div>
签名日期:<el-date-picker
v-model="confirmData.operate3Date"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import emptySign from '@static/js/emptySign'
import styeFormSign from '@/mixins/styeFormSign'
export default {
name: 'ConjunctivalOperation',
mixins: [styeFormSign],
props: {
onlyRead: {
type: Boolean,
default: false
},
isPlatform: {
type: Boolean,
default: true
},
patientDetail: {
type: Object
},
caseId: {
type: String,
default: ''
}
},
data() {
return {
content: [
{
title: '尊敬的患者、患者家属、授权委托人:',
detail: [
'欢迎你来本院眼科接受干眼激光治疗。我们将竭诚为您服务。但由于目前医学技术的有限、患者自身体质的影响及人体的不可预知性,该治疗可能会出现下列情况。'
]
},
{
title: '一、告知患者术前存在以下情况者禁止行本治疗',
detail: [
'1.治疗前的4周内有过晒黑或美黑;治疗前的4周内有敏感或过敏症状;治疗前的4周禁止使用去角质的化妆品;过去四周内有过度的暴晒史;',
'2.预治疗区域有皮肤癌或色素性损伤;',
'3.服用可以引起对560nm-1200nm光提高敏感性的光敏剂和植物药,比如异维甲酸、四环素等;',
'4.怀孕以及哺乳期;',
'5.过去一年头颈部接受过放射治疗或者激光治疗后八周内打算进行放射治疗;',
'6.激光治疗前八周接受过化疗治疗或者打算在激光治疗后八周内要进行化疗治疗。'
]
},
{
title: '二、术后反应',
detail: [
'1.治疗时会有一定程度的灼热感和微痛感,可能出现红肿,通常约在1-2小时后缓解。个别病损较重的求治者需要加大治疗能量,此时可能会出现局部的暂时的水肿、紫癜甚至水疱。',
'2.色斑和血管扩张部位治疗后的正常反应为色斑颜色加深,血管扩张处颜色发红,通常会在7-14天内自然消退。'
]
},
{
title: '三、术后防护',
detail: [
'1.避免接触热水:治疗结束四十八个小时之内,治疗部位避免接触热水或高温,术后皮肤潮红、灼热或微痛感将不易退去甚至加重。',
'2.防止继发感染:术后治疗区域避免外伤。若出现水疱不要自行弄破,待其自行吸收消退。若水疱治疗出现伤口,应每天涂2次抗菌素软膏(如金霉素眼膏等)以防止继发感染。',
'3.防晒:治疗后一段时间应避免直接阳光暴晒及其他辐射,否则易产生色素沉着。'
]
},
{
title: '四、可能的并发症及相关情况',
detail: [
'1.色素沉着及色素减退:个别患者可能出现色素沉着或减退,3-9月后可恢复,有的可能更长。术后防护不当也可导致色素沉着及减退。',
'2.感染及疤痕:术后出现水疱护理不当可能继发感染,并进而导致疤痕形成、持久性色素沉着和色素减退等并发症。'
]
},
{
title: '五、根据患者目前的病情和我院目前开展的医疗技术,您还可以选择其他替代诊疗方案',
detail: [
'1.药物治疗:干眼的优选治疗方案,药物治疗无效者,才考虑其他治疗方案。',
'2.物理治疗:常与药物治疗协同进行,需多次进行,包括药物熏蒸、睑板腺按摩等。',
'3.中医治疗:中医治疗手段众多,效果因人而异。',
'4.观察:患者可能长期存在眼部不适症状。',
'在向患方说明各治疗方案并告知利弊后,患方基于当前病情需要,经慎重考虑,自愿选择 干眼激光治疗 。'
]
},
{
title: '患者知情选择',
detail: [
'我的医生已经告知我将要进行的治疗、此次治疗及治疗后可能发生的风险,可能存在的其它治疗方法,并且解答了我关于此次治疗的相关问题,以上内容我已逐条认真阅读并理解行眼科激光治疗的相关风险及可能并发症,同 意进行此项治疗。'
]
}
],
print: {
id: '#minorOperation',
closeCallback: () => {
this.printHidden = true
}
},
printHidden: true,
formId: '',
sourceData: {},
confirmData: {
patientName: '',
patientAge: '',
patientId: '',
patientSex: '',
department: '眼科',
relation: '',
diagnose: '',
patientSign: '',
familySign: '',
operator: '',
operateDate: '',
operate2Date: '',
operate3Date: ''
},
formListValue: {
conPatientSign: '',
conKinSign: ''
}
}
},
watch: {
caseId(val) {
if (val) {
this.getformList()
}
}
},
created() {
this.sourceData = JSON.parse(JSON.stringify(this.confirmData))
this.getformList()
},
methods: {
signClick(index) {
this.initPlugin(index)
},
setData() {
this.queryDiagnostic()
const date = this.$moment().format('YYYY-MM-DD')
this.confirmData.operateDate = date
this.confirmData.operate2Date = date
this.confirmData.operate3Date = date
const userData = JSON.parse(window.sessionStorage.getItem('qg-userData'))
this.confirmData.operator = userData.signImgBase
this.confirmData.patientName = this.patientDetail.patientName
this.confirmData.patientAge = this.patientDetail.patientAge
this.confirmData.patientSex = this.patientDetail.patientSex
this.confirmData.patientId = this.patientDetail.patientId
},
queryDiagnostic() {
this.$http.get('/mzbl/getLastDiagnostic', { params: {
patientId: this.patientDetail.patientId
}}).then(data => {
this.confirmData.diagnose = data.data.data
})
},
async getformList() {
const { data: res } = await this.$http.get('/case/getCaseById', {
params: {
id: this.caseId
}
})
if (res.code === 0) {
if (res.data) {
if (res.data.jsonText) {
this.confirmData = JSON.parse(res.data.jsonText)
this.formListValue.conPatientSign = this.confirmData.patientSign
this.formListValue.conKinSign = this.confirmData.familySign
} else {
this.confirmData = JSON.parse(JSON.stringify(this.sourceData))
this.formListValue.conPatientSign = ''
this.formListValue.conKinSign = ''
this.setData()
}
}
} else {
this.$message.error(res.msg)
}
},
handlePrint() {
this.printHidden = false
this.handleSaveTable()
},
//
async handleSaveTable() {
if (this.formListValue.conPatientSign === emptySign || this.formListValue.conKinSign === emptySign) {
this.$message.error('签字未成功请重新签字后再保存')
return
}
this.confirmData.patientSign = this.formListValue.conPatientSign
this.confirmData.familySign = this.formListValue.conKinSign
const params = {
id: this.caseId,
flag: '8',
jsonText: JSON.stringify(this.confirmData),
name: '干眼激光治疗知情同意书',
patientId: this.patientDetail.patientId,
platform: 2
}
const { data: res } = await this.$http.post('/case/update', params)
if (res.code === 0) {
this.$message.success('保存成功')
await this.getformList()
} else {
this.$message.error(res.msg)
}
},
//
formDelete() {
this.$confirmFun('确定删除吗?').then(() => {
this.$http.post('/case/delete', {
id: this.caseId
}).then(() => {
this.$message.success('删除成功')
this.$emit('formDelete', 'del')
})
})
}
}
}
</script>
<style lang="scss" scoped>
.flex{
display: flex;
}
.a-c{
align-items: center;
}
.j-c{
justify-content: center;
}
.j-b{
justify-content: space-between;
}
.formListBox{
background: #fff;
padding: 10px 20px 50px 20px;
page-break-after:always;
height: 100%;
overflow: auto;
}
.btnBox_top{
position: fixed;
z-index: 999;
right: 90px;
}
.form_top{
margin-bottom: 15px;
}
.form_content{
text-align: left;
}
.form_detail{
text-indent: 2rem;
margin: 3px 0;
}
::v-deep .el-input__inner{
border: none;
border-bottom: 1px solid #cccccc;
border-radius: 0;
font-size: 16px;
height: 26px;
text-align: center;
}
::v-deep .el-input__prefix{
display: none;
}
</style>

369
src/page-subspecialty/views/modules/formList/cornealForeign.vue

@ -1,369 +0,0 @@
<template>
<div class="cornealBox">
<div v-if="!onlyRead && isPlatform" class="btnBox_top">
<el-button v-print="print" size="small" @click="handlePrint">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button type="danger" size="small" @click="formDelete">删除</el-button>
</div>
<div id="cornealOperation" style="width: 840px;padding-right: 8px">
<div class="flex j-c">
<img width="450" src="@/assets/img/xianganlogo.png">
</div>
<hr>
<p style="color:#000000;font-size:32px;margin:0 0 30px 0;text-align:center;">
角膜异物剔除术知情同意书
</p>
<div class="flex a-c j-b">
<div>
姓名<el-input v-model="confirmData.patientName" style="width: 100px" />
</div>
<div>
性别<el-input v-model="confirmData.patientSex" style="width: 100px" />
</div>
<div>
年龄<el-input v-model="confirmData.patientAge" style="width: 100px" />
</div>
<div>
科室<el-input v-model="confirmData.department" style="width: 100px" />
</div>
<div>
登记号<el-input v-model="confirmData.patientId" style="width: 100px" />
</div>
</div>
<!--患者信息-->
<div class="form_top">
<div class="flex a-c">
<span style="font-weight: bold">诊断</span><el-input v-model="confirmData.diagnose" style="width: 400px" />
<div class="flex">
(<div class="checkBox" @click="confirmData.isPrint='OD'">
<input type="checkbox" :checked="confirmData.isPrint==='OD'">右眼
</div>
<div style="margin-left: 30px" class="checkBox" @click="confirmData.isPrint='OS'">
<input type="checkbox" :checked="confirmData.isPrint==='OS'">左眼
</div>
<div style="margin-left: 30px" class="checkBox" @click="confirmData.isPrint='OU'">
<input type="checkbox" :checked="confirmData.isPrint==='OU'">双眼
</div>)
</div>
</div>
<div class="flex a-c">
<span style="font-weight: bold">治疗名称</span><el-input v-model="confirmData.treatName" style="width: 400px" />
<div class="flex">
(<div class="checkBox" @click="confirmData.isTreat='OD'">
<input type="checkbox" :checked="confirmData.isTreat==='OD'">右眼
</div>
<div style="margin-left: 30px" class="checkBox" @click="confirmData.isTreat='OS'">
<input type="checkbox" :checked="confirmData.isTreat==='OS'">左眼
</div>
<div style="margin-left: 30px" class="checkBox" @click="confirmData.isTreat='OU'">
<input type="checkbox" :checked="confirmData.isTreat==='OU'">双眼
</div>)
</div>
</div>
<div class="flex a-c">
<span style="font-weight: bold">麻醉方式</span><el-input v-model="confirmData.anesthesiaMode" style="width: 700px" />
</div>
</div>
<div class="form_content">
<div v-for="(item,index) in content" :key="index" style="margin: 5px 0">
<span style="font-weight: bold">{{ item.title }}</span>
<div v-for="(text,idx) in item.detail" :key="`${index}_${idx}`" class="form_detail">
{{ text }}
</div>
</div>
</div>
<div style="margin-top: 15px">
<div class="flex a-c">
<div style="margin-right: 296px;">
<span style="word-break: keep-all">患者签名</span>
<span style="margin-left:10px" @click="signClick('cornealPatientSign')">
<span v-if="!formListValue.cornealPatientSign">
<img v-if="printHidden" :src="require('@/assets/img/signature.png')" alt="" style="margin-right: 12px">
<el-input v-else style="width: 80px" />
</span>
<img v-else style="width: 80px;height: 40px;" :src="formListValue.cornealPatientSign">
</span>
</div>
<div>
签名日期:<el-date-picker
v-model="confirmData.operateDate"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
<div class="flex a-c">
<div>
<span>患者授权亲属签名</span>
<span style="margin-left:10px" @click="signClick('cornealKinSign')">
<span v-if="!formListValue.cornealKinSign">
<img v-if="printHidden" :src="require('@/assets/img/signature.png')" alt="">
<el-input v-else style="width: 80px" />
</span>
<img v-else style="width: 80px;height: 40px;" :src="formListValue.cornealKinSign">
</span>
<span style="margin-left: 15px">与患者关系<el-input v-model="confirmData.relation" style="width: 150px" /></span>
</div>
<div>
签名日期:<el-date-picker
v-model="confirmData.operate2Date"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
</div>
<div style="margin: 5px 0;text-align: left">
<span style="font-weight: bold;">医生陈述</span>
<div class="form_detail">
我已经告知患者将要进行的治疗此次治疗及治疗后可能发生的风险可能存在的其它治疗方法并且解答了患者关于此次治疗的相关问题
</div>
</div>
<div class="flex a-c">
<div style="margin-right: 296px;">
<span style="word-break: keep-all">医生签名</span>
<span style="margin-left:10px">
<img style="width: 80px;height: 40px;" :src="confirmData.operator">
</span>
</div>
<div>
签名日期:<el-date-picker
v-model="confirmData.operate3Date"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import emptySign from '@static/js/emptySign'
import styeFormSign from '@/mixins/styeFormSign'
export default {
name: 'ConjunctivalOperation',
mixins: [styeFormSign],
props: {
onlyRead: {
type: Boolean,
default: false
},
isPlatform: {
type: Boolean,
default: true
},
patientDetail: {
type: Object
},
caseId: {
type: String,
default: ''
}
},
data() {
return {
content: [
{
title: '尊敬的患者、患者家属、授权委托人:',
detail: [
'您好!根据患者目前病情需要行“角膜异物剔除术”,在实施该治疗疗过程中及治疗后可能会发生的并发症及风险主要有:',
'1.麻醉意外,极少数人对麻醉药物过敏,引起药物反应。',
'2.某些异物无法一次剔除干净,需分次剔除治疗;部分粉末状异物可能会永久残留。',
'3.治疗过程中若配合欠佳,可能造成角膜、结膜等邻近组织的损伤。',
'4.治疗过程出血,治疗后发生感染。',
'5.异物剔除后异物感、畏光、流泪、疼痛加重可能。',
'6.治疗后角膜疤痕形成而引起视力下降可能。',
'7.异物带入致病菌引起角膜感染(真菌或细菌),可能造成角膜溃疡、角膜穿孔等,需进一步治疗。',
'8.异物剔除后需遵医嘱按时使用滴眼液或眼膏,注意眼部卫生,勿揉眼,一周内避免不洁水进入眼中,遵医嘱复查。',
'9.医护人员团队将尽全力按操作规范实施上述治疗,并且一旦发生并发症或意外情况,将从维护患者及家属利益的角度出发积极采取措施,以努力降低并发症或意外情况导致的对患者的损害后果。',
'10.您有权选择同意或不同意接受上述治疗,但是如果拒绝接受上述治疗,您将面临以下风险:病情加重进展、角膜溃疡、角膜穿孔、视力丧失 等。',
'11.根据患者目前的病情和我院目前开展的医疗技术,您还可以选择其他替代诊疗方案 保守治疗,继续局部用药,症状无法缓解,甚至进一步发展,最终导致角膜穿孔、视力下降甚至丧失等并发症,需进一步行手术治疗。',
'在向患方说明各治疗方案并告知利弊后,患方基于当前病情需要,经慎重考虑,自愿选择 角膜异物剔除术 治疗。'
]
},
{
title: '患者知情选择',
detail: [
'我的医生已经告知我将要进行的治疗、此次治疗及治疗后可能发生的风险,可能存在的其它治疗方法,并且解答了我关于此次治疗的相关问题,以上内容我已逐条认真阅读并理解行角膜异物剔除术的相关风险及可能并发症,同意进行此项治疗。'
]
}
],
print: {
id: 'cornealOperation',
closeCallback: () => {
this.printHidden = true
}
},
printHidden: true,
formId: '',
sourceData: {},
formListValue: {
cornealPatientSign: '',
cornealKinSign: ''
},
confirmData: {
patientName: '',
patientAge: '',
patientId: '',
patientSex: '',
department: '眼科',
relation: '',
isPrint: '',
isTreat: '',
diagnose: '角膜异物',
treatName: '角膜异物剔除术',
anesthesiaMode: '表面麻醉',
patientSign: '',
familySign: '',
operator: '',
operateDate: '',
operate2Date: '',
operate3Date: ''
}
}
},
watch: {
caseId(val) {
if (val) {
this.getformList()
}
}
},
created() {
this.sourceData = JSON.parse(JSON.stringify(this.confirmData))
this.getformList()
},
methods: {
signClick(index) {
this.initPlugin(index)
},
setData() {
const date = this.$moment().format('YYYY-MM-DD')
this.confirmData.operateDate = date
this.confirmData.operate2Date = date
this.confirmData.operate3Date = date
const userData = JSON.parse(window.sessionStorage.getItem('qg-userData'))
this.confirmData.operator = userData.signImgBase
this.confirmData.patientName = this.patientDetail.patientName
this.confirmData.patientAge = this.patientDetail.patientAge
this.confirmData.patientSex = this.patientDetail.patientSex
this.confirmData.patientId = this.patientDetail.patientId
},
async getformList() {
const { data: res } = await this.$http.get('/case/getCaseById', {
params: {
id: this.caseId
}
})
if (res.code === 0) {
if (res.data) {
if (res.data.jsonText) {
this.confirmData = JSON.parse(res.data.jsonText)
this.formListValue.cornealPatientSign = this.confirmData.patientSign
this.formListValue.cornealKinSign = this.confirmData.familySign
} else {
this.confirmData = JSON.parse(JSON.stringify(this.sourceData))
this.formListValue.cornealPatientSign = ''
this.formListValue.cornealKinSign = ''
this.setData()
}
}
} else {
this.$message.error(res.msg)
}
},
handlePrint() {
this.printHidden = false
this.handleSaveTable()
},
//
async handleSaveTable() {
if (this.formListValue.cornealPatientSign === emptySign || this.formListValue.cornealKinSign === emptySign) {
this.$message.error('签字未成功请重新签字后再保存')
return
}
this.confirmData.patientSign = this.formListValue.cornealPatientSign
this.confirmData.familySign = this.formListValue.cornealKinSign
const params = {
id: this.caseId,
flag: '8',
jsonText: JSON.stringify(this.confirmData),
name: '角膜异物剔除术知情同意书',
patientId: this.patientDetail.patientId,
platform: 2
}
const { data: res } = await this.$http.post('/case/update', params)
if (res.code === 0) {
this.$message.success('保存成功')
await this.getformList()
} else {
this.$message.error(res.msg)
}
},
//
formDelete() {
this.$confirmFun('确定删除吗?').then(() => {
this.$http.post('/case/delete', {
id: this.caseId
}).then(() => {
this.$message.success('删除成功')
this.$emit('formDelete', 'del')
})
})
}
}
}
</script>
<style lang="scss" scoped>
.flex{
display: flex;
}
.a-c{
align-items: center;
}
.j-c{
justify-content: center;
}
.j-b{
justify-content: space-between;
}
.cornealBox{
background: #fff;
padding: 10px 20px 50px 20px;
page-break-after:always;
height: 100%;
overflow: auto;
}
.btnBox_top{
position: fixed;
z-index: 999;
right: 90px;
}
.form_top{
margin-bottom: 15px;
}
.form_content{
text-align: left;
}
.form_detail{
text-indent: 2rem;
margin: 3px 0;
}
::v-deep .el-input__inner{
border: none;
border-bottom: 1px solid #cccccc;
border-radius: 0;
font-size: 16px;
height: 26px;
text-align: center;
}
::v-deep .el-input__prefix{
display: none;
}
</style>

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

@ -1,496 +0,0 @@
<template>
<div style=" background: #fff; padding: 10px 20px 50px 20px;page-break-after:always">
<div v-if="!onlyRead && isPlatform" class="btnBox">
<el-button v-print="'#laserFunc'" size="small" @click="handleSaveTable">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button type="danger" size="small" @click="formDelete">删除</el-button>
</div>
<div id="laserFunc" style="width: 840px;padding-right: 8px">
<div class="flex j-c">
<img width="450" src="@/assets/img/xianganlogo.png">
</div>
<hr>
<p style="color:#000000;font-size:32px;margin:0 0 30px 0;text-align:center;">
眼科激光手术治疗
</p>
<!--患者信息-->
<div>
<div class="flex m-b">
<div class="flex a-c item">
<div class="label_width">姓名:</div>
<el-input v-model="confirmData.patientName" style="flex: 1" /></div>
<div class="flex a-c item">年龄:<el-input v-model="confirmData.patientAge" style="flex: 1" /></div>
<div class="flex a-c item">性别:<el-input v-model="confirmData.patientSex" style="flex: 1" /></div>
<div class="flex a-c item">登记号:<el-input v-model="confirmData.patientId" style="flex: 1" /></div>
</div>
<div class="flex m-b">
<div class="flex a-c">
<div class="label_width">联系电话:</div>
<el-input v-model="confirmData.patientPhone" style="flex: 1" />
</div>
<div class="flex a-c item">家庭住址:<el-input v-model="confirmData.patientAddress" style="flex: 1" /></div>
</div>
<div class="flex a-c m-b">
<div class="label_width">诊断:</div>
<el-input v-model="confirmData.diagnostic" :autosize="{ minRows: 3, maxRows: 3}" type="textarea" style="flex: 1;border-bottom: 1px solid #8e8c8c;font-size: 16px" />
</div>
<div class="flex a-c m-b">
<div class="label_width">
治疗眼别:
</div>
<el-select v-model="confirmData.eyeType" placeholder="请选择" @change="changeEyeType">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</div>
<!-- 治疗前-->
<div class="flex m-b">
<div class="label_width">
治疗前:
</div>
<table class="treatAction">
<tbody>
<tr>
<td>
视力
</td>
<td>
疾病分期
</td>
</tr>
<tr>
<td>
<el-input ref="input1" v-model="confirmData.zlqSl" style="flex: 1" @keyup.enter.native="onEnter(1)" />
</td>
<td>
<el-input ref="input2" v-model="confirmData.zlqJbfq" style="flex: 1" @keyup.enter.native="onEnter(2)" />
</td>
</tr>
</tbody>
</table>
</div>
<div class="flex m-b" style="margin-top: 20px">
<div class="label_width">
激光类型:
</div>
<el-select
v-model="confirmData.laserType"
filterable
allow-create
placeholder=""
>
<el-option
v-for="item in laserTypeList"
:key="item.value"
:label="item.name"
:value="item.value"
/>
</el-select>
</div>
<!-- 激光治疗-->
<div class="flex m-b" style="margin-top: 20px">
<div class="label_width">
激光治疗:
</div>
<table class="treatAction">
<tbody>
<tr>
<td>
次数
</td>
<td>
<el-input ref="input3" v-model="confirmData.jgzlCount" style="flex: 1" @keyup.enter.native="onEnter(3)" />
</td>
</tr>
<tr>
<td>
曝光时间
</td>
<td>
<div class="flex">
<el-input ref="input4" v-model="confirmData.jgzlBgsj" style="flex: 1" @keyup.enter.native="onEnter(4)" />
<span> s </span>
</div>
</td>
</tr>
<tr>
<td>
光斑大小
</td>
<td>
<div class="flex">
<el-input ref="input5" v-model="confirmData.jgzlGbMin" style="flex: 1" @keyup.enter.native="onEnter(5)" />
<span> μm </span>
<span style="margin:0 10px">-</span>
<el-input ref="input6" v-model="confirmData.jgzlGbMax" style="flex: 1" @keyup.enter.native="onEnter(6)" />
<span> μm </span>
</div>
</td>
</tr>
<tr>
<td>
功率
</td>
<td>
<div class="flex">
<el-input ref="input7" v-model="confirmData.jgzlGlMin" style="flex: 1" @keyup.enter.native="onEnter(7)" />
<span> mw </span>
<span style="margin:0 10px">-</span>
<el-input ref="input8" v-model="confirmData.jgzlGlMax" style="flex: 1" @keyup.enter.native="onEnter(8)" />
<span> mw </span>
</div>
</td>
</tr>
<tr>
<td>
点数
</td>
<td>
<el-input ref="input9" v-model="confirmData.jgzlDs" style="flex: 1" @keyup.enter.native="onEnter(9)" />
</td>
</tr>
<tr>
<td>
光斑间隔
</td>
<td>
<div class="flex">
<el-input ref="input10" v-model="confirmData.spotSpacing" style="flex: 1" @keyup.enter.native="onEnter(10)" />
<span>Φ</span>
</div>
</td>
</tr>
<tr>
<td>
备注
</td>
<td>
<el-input ref="input11" v-model="confirmData.remark" style="flex: 1" @keyup.enter.native="onEnter(11)" />
</td>
</tr>
</tbody>
</table>
<div class="descImg" @click="editImg()">
<div>示意图 <span>{{ confirmData.eyeType }}</span></div>
<img v-if="confirmData.jgzlSyt" :src="confirmData.jgzlSyt">
</div>
</div>
<div class="flex a-c">
<div class="flex a-c item">
<div class="label_width">操作人:</div>
<img v-if="confirmData.operateSign" :src="confirmData.operateSign" alt="" style="width: 80px;height: 50px;border-style:none;">
</div>
<div class="flex a-c item">
<div class="label_width">操作时间:</div>
<el-date-picker
v-model="confirmData.operateDate"
style="flex: 1"
type="date"
value-format="yyyy-MM-dd"
/>
</div>
</div>
<img-editor v-if="editorShow" ref="imgEditorRef" :is-od-or-os="this.confirmData.eyeType" @closeDialog="closeDialog" @fullImgBack="fullImgBack" />
</div>
</div>
</template>
<script>
import ImgEditor from '@/components/360View/img-editor.vue'
import odOrOs from '@/components/360View/base64/odOrOs'
export default {
name: 'LaserSurgery',
components: { ImgEditor },
props: {
onlyRead: {
type: Boolean,
default: false
},
isPlatform: {
type: Boolean,
default: true
},
patientDetail: {
type: Object
},
caseId: {
type: String,
default: ''
}
},
data() {
return {
origin: '',
editorShow: false,
confirmData: {
patientAddress: '',
patientAge: '',
patientId: '',
patientName: '',
patientPhone: '',
patientSex: '',
jzNumber: '',
diagnostic: '',
idList: [],
eyeType: 'OD',
//
zlqSl: '',
zlqJbfq: '',
operateSign: '',
operateDate: '',
jgzlCount: '',
jgzlBgsj: '',
jgzlGbMin: '',
jgzlGbMax: '',
jgzlGlMin: '',
jgzlGlMax: '',
remark: '',
spotSpacing: '',
jgzlDs: '',
jgzlSyt: '',
laserType: ''
},
//
options: [{
value: 'OD',
label: 'OD'
}, {
value: 'OS',
label: 'OS'
}],
//
laserTypeList: [{
name: 'Sub Mode',
value: 'Sub Mode'
}, {
name: 'PATTERNS',
value: 'PATTERNS'
}, {
name: 'CLASSIC',
value: 'CLASSIC'
}, {
name: 'YAG激光',
value: 'YAG激光'
}]
}
},
watch: {
caseId(val) {
if (val) {
this.getConfirmDetail()
}
}
},
created() {
//
this.getConfirmDetail()
this.queryProject()
},
methods: {
changeEyeType(value) {
if (value === 'OD') {
this.confirmData.jgzlSyt = require('@/assets/img/od.png')
} else {
this.confirmData.jgzlSyt = require('@/assets/img/os.png')
}
},
onEnter(index) {
const nextIndex = index + 1
const nextInputRef = `input${nextIndex}`
if (this.$refs[nextInputRef]) {
this.$refs[nextInputRef].focus()
}
},
queryDiagnostic() {
this.$http.get('/mzbl/getLastDiagnostic', { params: {
patientId: this.patientDetail.patientId
}}).then(data => {
this.confirmData.diagnostic = data.data.data
})
},
editImg() {
this.editorShow = true
this.$nextTick(() => {
this.$refs.imgEditorRef.init()
})
},
closeDialog() {
this.editorShow = false
},
// id
async queryProject() {
const project = window.sessionStorage.getItem('projectItem') ? JSON.parse(window.sessionStorage.getItem('projectItem')) : []
const { data: res } = await this.$http.get(
'/patient/getZlItemDict',
{
params: {
caseName: '眼科激光手术治疗'
}
}
)
if (res.code === 0) {
const data = res.data || []
const list = []
if (data.length) {
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < project.length; j++) {
if (data[i].itemId === project[j].porjectCode) {
list.push(project[j].id)
}
}
}
this.confirmData.idList = list
}
} else {
this.$message.error(res.msg)
}
},
fullImgBack(val) {
if (val) {
this.confirmData.jgzlSyt = val
}
},
getConfirmDetail() {
this.$http.get('/mzbl/getMzblJgshzlInfo', { params: {
caseId: this.caseId
}}).then(data => {
const detail = data.data.data
this.confirmData = { ...detail }
if (!detail.jzNumber) {
this.queryDiagnostic()
this.confirmData.patientName = this.patientDetail.patientName
this.confirmData.patientAge = this.patientDetail.patientAge
this.confirmData.patientSex = this.patientDetail.patientSex
this.confirmData.patientId = this.patientDetail.patientId
this.confirmData.patientAddress = this.patientDetail.patientAddress
this.confirmData.patientPhone = this.patientDetail.patientPhone
this.confirmData.operateDate = new Date()
this.confirmData.eyeType = 'OD'
if (this.confirmData.eyeType === 'OD') {
this.confirmData.jgzlSyt = require('@/assets/img/od.png')
} else {
this.confirmData.jgzlSyt = require('@/assets/img/os.png')
}
}
const userData = JSON.parse(window.sessionStorage.getItem('qg-userData'))
this.confirmData.operateSign = userData.signImgBase
})
},
//
handleSaveTable() {
this.confirmData.jzNumber = window.sessionStorage.getItem('jzNumber')
this.$http.post('/mzbl/saveMzblJgshzl', {
caseId: this.caseId,
...this.confirmData
}).then(() => {
this.$emit('handleSaveTable')
})
},
//
formDelete() {
this.$confirmFun('确定删除吗?').then(() => {
this.$http.post('/mzbl/delMzblJgshzlInfo', {
id: this.caseId
}).then(() => {
this.$message.success('删除成功')
this.$emit('formDelete', 'del')
})
})
}
}
}
</script>
<style lang="scss" scoped>
.label_width{
width: 100px;
text-align: right;
margin-right: 10px;
}
#laserFunc{
padding: 20px;
}
.flex{
display: flex;
}
.a-c{
align-items: center;
}
.j-c{
justify-content: center;
}
.item{
flex: 1;
&:not(:last-child){
margin-right: 15px;
}
}
.m-b{
margin-bottom: 10px;
}
.descImg{
font-size: 16px;
padding: 10px;
flex: 1;
border: 1px solid #8e8c8c;
margin-left: 20px;
height: 280px;
span{
font-weight: bold;
}
div{
height: 20px;
text-align: left;
}
img{
height: calc(100% - 20px);
}
}
.treatAction{
width: 100%;
flex: 1;
tr td,tr th{
border: 1px solid #8e8c8c;
padding: 5px;
}
::v-deep .el-input__inner{
border: 0;
}
td{
width: 25%;
}
}
.btnBox{
position: fixed;
z-index: 999;
right: 90px;
}
::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 #8e8c8c;
border-radius: 0;
padding: 0;
}
::v-deep .el-textarea__inner{
border: none;
}
::v-deep .el-input__prefix {
display: none;
}
::v-deep .el-icon-arrow-up{
display: none;
}
</style>

455
src/page-subspecialty/views/modules/formList/mraForm.vue

@ -1,455 +0,0 @@
<template>
<div id="operation-record" style=" background: #fff; padding: 10px 20px 50px 20px;page-break-after:always">
<div v-if="!onlyRead && isPlatform" class="btnBox">
<el-button v-print="print" size="small" @click="handlePrint">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button type="danger" size="small" @click="formDelete">删除</el-button>
</div>
<div style="padding: 20px 80px;">
<div id="mraFunc" style="width: 840px;padding-right: 8px">
<div class="flex j-c">
<img width="450" src="@/assets/img/xianganlogo.png">
</div>
<hr>
<p style="color:#000000;font-size:32px;margin:0 0 30px 0;text-align:center;">
眼底血管造影知情同意书
</p>
<div class="flex j-b">
<div class="item">
患者姓名:<el-input v-model="formData.patientName" style="flex: 1" />
</div>
<div class="item">
性别:<el-input v-model="formData.patientSex" style="flex: 1" />
</div>
<div class="item">
年龄:<el-input v-model="formData.patientAge" style="flex: 1" />
</div>
<div class="item">
登记号:<el-input v-model="formData.patientId" style="flex: 1" />
</div>
</div>
<div>
<p>尊敬的患者:</p>
<p class="context">
您好!眼底血管造影检查属特殊检查可能产生不良后果为使该项检查顺利完成特将相关事项提前告知:
</p>
<p class="context" style="text-decoration: underline;font-size: 18px;font-weight: bold">
请您务必在检查前认真阅读!
</p>
<div v-for="(item,index) in context" :key="index">
<p>{{ `${index+1}. ${item.title}` }}</p>
<p v-for="(det,idx) in item.detail" :key="`${index}_${idx}`" class="context">
{{ `${idx+1}${det}` }}
</p>
</div>
<div class="context_check">
<div style="cursor: pointer" @click="formData.lightCheck = !formData.lightCheck">
<input type="checkbox" :checked="formData.lightCheck">
<span>今日行
<span class="underline">荧光素血管造影</span>以上内容我已逐条认真阅读并理解眼底血管造影相关风险同意进行此项检查
<span class="underline">及荧光素钠注射液药物过敏试验</span>
</span>
</div>
<div style="cursor: pointer" @click="formData.greenCheck = !formData.greenCheck">
<input type="checkbox" :checked="formData.greenCheck">
<span>今日行
<span class="underline">吲哚菁绿血管造影</span>以上内容我已逐条认真阅读并理解眼底血管造影相关风险同意进行此项检查
</span>
</div>
</div>
<div>
<div class="flex">
患者签字:
<div style="margin-left: 10px" @click="signClick('fundusDocSign')">
<img v-if="!formListValue.fundusDocSign&&printHidden" :src="require('@/assets/img/signature.png')" alt="">
<img v-if="formListValue.fundusDocSign" style="width: 80px;height: 40px;" :src="formListValue.fundusDocSign">
<el-input v-if="!formListValue.fundusDocSign&&!printHidden" style="width: 80px" />
</div>
</div>
<div class="flex">
<span>或授权亲属签字(关系):</span>
<div style="margin-left: 10px" @click="signClick('kinSign')">
<img v-if="!formListValue.kinSign&&printHidden" :src="require('@/assets/img/signature.png')" alt="">
<img v-if="formListValue.kinSign" style="width: 80px;height: 40px;" :src="formListValue.kinSign">
<el-input v-if="!formListValue.kinSign&&printHidden" style="width: 80px" />
</div>
<span style="margin-left: 80px">日期:</span>
<el-date-picker
v-model="formData.patientDate"
type="date"
value-format="yyyy-MM-dd"
/>
</div>
<div class="flex">
<span>医生签字:</span>
<img
v-if="formData.doctorSign"
:src="formData.doctorSign"
alt=""
style="width: 80px;height: 50px;border-style:none;"
>
<span style="margin-left: 80px">日期:</span>
<el-date-picker
v-model="formData.doctorDate"
type="date"
value-format="yyyy-MM-dd"
/>
</div>
</div>
<div class="bottom_detail">
<div>检查当日患者情况:</div>
<div class="flex">
血压:<el-input v-model="formData.bloodPressure" style="flex: 1" />mmHg,
脉搏:<el-input v-model="formData.pulse" style="flex: 1" />/,
血糖:<el-input v-model="formData.bloodSugar" style="flex: 1" />mmol/L,
</div>
<div class="flex">
眼压:
右眼:
<el-input v-model="formData.pressureOd" style="flex: 1" />mmHg,
左眼:<el-input v-model="formData.pressureOs" style="flex: 1" />mmHg
</div>
<div>检查前药物过敏试验情况:</div>
<div class="flex">
过敏试验结果:
<el-select
v-model="formData.negative"
:class="formData.negative === '荧光素钠注射液过敏试验阳性(+)'?'active':'active_other'"
style="flex: 1"
autocomplete
placeholder=""
filterable
allow-create
clearable
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<div class="flex a-c">
时间:
<el-date-picker
v-model="startTime"
type="datetime"
placeholder=""
format="yyyy-MM-dd HH:mm"
style="width: 180px"
/>
-
<el-date-picker
v-model="endTime"
type="datetime"
placeholder=""
format="yyyy-MM-dd HH:mm"
style="width: 180px"
/>
</div>
</div>
<div>
阳性:反应情况:恶心呕吐头晕皮肤反应其它
</div>
<div class="flex">
药物批号:<el-input v-model="formData.drugBatchNumber" style="width: 240px" />
</div>
<div>检查前药物过敏试验情况:</div>
<div class="flex">
执行药敏试验者签字:
<div style="margin:0 10px" @click="signClick('performerSign')">
<img v-if="!formListValue.performerSign&&printHidden" :src="require('@/assets/img/signature.png')" alt="">
<img v-if="formListValue.performerSign" style="width: 80px;height: 40px;" :src="formListValue.performerSign">
<el-input v-if="!formListValue.performerSign&&!printHidden" style="width: 120px" />
</div>
工号:<el-input v-model="formData.performerId" style="width: 240px;margin-left: 15px" />
</div>
<div class="flex">
核对药敏实验者签字:
<div style="margin:0 10px" @click="signClick('checkerSign')">
<img v-if="!formListValue.checkerSign&&printHidden" :src="require('@/assets/img/signature.png')" alt="">
<img v-if="formListValue.checkerSign" style="width: 80px;height: 40px;" :src="formListValue.checkerSign">
<el-input v-if="!formListValue.checkerSign&&!printHidden" style="width: 80px" />
</div>
工号:<el-input v-model="formData.checkerId" style="width: 240px" />
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import emptySign from '@static/js/emptySign'
import styeFormSign from '@/mixins/styeFormSign'
export default {
name: 'MraForm',
mixins: [styeFormSign],
props: {
onlyRead: {
type: Boolean,
default: false
},
isPlatform: {
type: Boolean,
default: true
},
patientDetail: {
type: Object
},
caseId: {
type: String
}
},
data() {
return {
printHidden: true,
print: {
id: 'mraFunc',
closeCallback: () => {
this.printHidden = true
}
},
startTime: '',
endTime: '',
rangTime: '',
formData: {
patientName: '',
patientAge: '',
patientSex: '',
patientId: '',
lightCheck: false,
greenCheck: false,
doctorSign: '',
doctorDate: '',
patientDate: '',
bloodPressure: '',
pulse: '',
bloodSugar: '',
pressureOd: '',
pressureOs: '',
negative: '',
negativeTime: '',
drugBatchNumber: '',
performerId: '',
checkerId: ''
},
options: [{
value: '荧光素钠注射液过敏试验阴性(-)',
label: '荧光素钠注射液过敏试验阴性(-)'
}, {
value: '荧光素钠注射液过敏试验阳性(+)',
label: '荧光素钠注射液过敏试验阳性(+)'
}],
context: [
{
title: '造影前的全身要求',
detail: [
'高血压:高血压患者建议检查前一周保持血压平稳在 160/90mmHg 以下,检查当日在造影室检测血压,合格者方可行造影检查,不合格者请至内科调整血压并重新预约。',
'糖尿病:糖尿病患者检查当日需要携带近半年的肝肾功能化验单及随机血糖结果,肾功能正常及随机血糖<13mmol/L 可行造影检查,不合格者请至内科调整血糖并重新预约。',
'肝肾疾病:肝肾疾病患者检查当日需要携带近半年肝肾功能化验单,正常方可行造影检查。',
'心、脑血管疾病:半年内有新发生或反复发作的心脑血管疾病均不建议行该项检查。心血管疾病患者检查当日需要携带近一月心电图及心内科会诊记录',
'呼吸系统疾病;过敏性哮喘的患者慎做该项检查,处于哮喘发作期不建议做该项检查。如检查当日存在呼吸道感染症状者,需改期行造影检查。',
'妊娠期妇女、哺乳期妇女及恶病质患者均不建议进行该项检查',
'碘过敏患者不建议行吲哚菁绿造影检查。',
'如有明确的荧光素钠或吲哚菁绿过敏史不建议行造影检查。'
]
},
{
title: '造影可能出现的情况',
detail: [
'造影剂一般安全可靠,荧光素眼底造影检查当日注射荧光素钠注射液前,遵医嘱行药物过敏试验。',
'在静脉给药后 1-2 天内皮肤发黄,尿及大便变黄绿色均属正常现象。',
'造影检查过程中可能出现一过性恶心、呕吐,一般经深呼吸可自行缓解',
'部分患者可能出现荨麻疹。',
'极少数患者可能出现喉头水肿、过敏性休克等情况,需进行相关治疗。'
]
},
{
title: '检查后患者注意事项',
detail: [
'检查后留观至少30 分钟;当天适当多饮水 (荧光素钠约 24 到 36 小时内大部分排空,皮肤、眼睛、尿液等发黄属正常现象,对身体无害)。',
'检查后当天勿直视强光、勿驾车、勿进行危险和精细作业。',
'造影后 24 小时内避免行血清肌酥、总蛋白、皮质醇、地高辛、奎宁丁和甲状腺素 ,以及其他比色法测定的实验室检测,以免干扰检测结果。',
'如回家后有其他不适症状,或不适症状未缓解请就近到医院就诊。'
]
},
{
title: '造影报告的获取:一般是当日完成,如因病情复杂需专家会诊或需补充相关检查,结果无法当日完成,将另行通知患者取结果时间。'
}
],
formListValue: {
fundusDocSign: '',
kinSign: '',
performerSign: '',
checkerSign: ''
}
}
},
watch: {
caseId(val) {
if (val) {
this.getOrderDetail()
}
},
startTime(val) {
if (val) {
this.endTime = new Date(val).getTime() + 20 * 60 * 1000
}
}
},
created() {
this.getOrderDetail()
},
methods: {
handlePrint() {
this.printHidden = false
this.handleSaveTable()
},
handleSaveTable() {
if (this.formListValue.fundusDocSign === emptySign ||
this.formListValue.kinSign === emptySign ||
this.formListValue.performerSign === emptySign ||
this.formListValue.checkerSign === emptySign
) {
this.$message.error('签字未成功请重新签字后再保存')
return
}
const start = this.startTime ? this.$moment(this.startTime).format('yyyy-MM-DD HH:mm') : ''
const end = this.endTime ? this.$moment(this.endTime).format('yyyy-MM-DD HH:mm') : ''
this.formData.negativeTime = start + '~' + end
this.formData.jzNumber = window.sessionStorage.getItem('jzNumber') || this.$route.query.jzNumber || ''
this.formData.patientSign = this.formListValue.fundusDocSign
this.formData.dependantSign = this.formListValue.kinSign
this.formData.performerSign = this.formListValue.performerSign
this.formData.checkerSign = this.formListValue.checkerSign
this.$http.post('/mzbl/saveMzblYdxgzyzqtys', {
caseId: this.caseId,
...this.formData
}).then(() => {
this.$emit('handleSaveTable')
})
},
getOrderDetail() {
this.$http.get('/mzbl/getMzblYdxgzyzqtysInfo', { params: {
caseId: this.caseId,
patientId: this.patientDetail.patientId
}}).then(data => {
const detail = data.data.data
this.formData = { ...detail }
this.formListValue.fundusDocSign = detail.patientSign
this.formListValue.kinSign = detail.dependantSign
this.formListValue.performerSign = detail.performerSign
this.formListValue.checkerSign = detail.checkerSign
if (this.formData.negativeTime) {
const range = this.formData.negativeTime.split('~')
this.startTime = range[0]
this.endTime = range[1]
}
if (!detail.jzNumber) {
//
const userData = JSON.parse(window.sessionStorage.getItem('qg-userData'))
this.formData.doctorSign = userData.signImgBase
this.formData.patientName = this.patientDetail.patientName
this.formData.patientAge = this.patientDetail.patientAge
this.formData.patientSex = this.patientDetail.patientSex
this.formData.patientId = this.patientDetail.patientId
this.startTime = ''
this.endTime = ''
}
})
},
signClick(text) {
this.initPlugin((text))
},
formDelete() {
this.$confirmFun('确定删除吗?').then(() => {
this.$http.post('/case/delete', {
id: this.caseId
}).then(() => {
this.$message.success('删除成功')
this.$emit('formDelete', 'del')
})
})
}
}
}
</script>
<style lang="scss" scoped>
.flex{
display: flex;
}
.a-c{
align-items: center;
}
.j-c{
justify-content: center;
}
.j-b{
justify-content: space-between;
}
#mraFunc{
font-size: 16px;
text-align: left;
line-height: 30px;
}
.item{
display: flex;
align-items: center;
&:not(:last-child){
margin-right: 20px;
}
}
.context{
text-indent: 2em;
}
.btnBox{
position: fixed;
z-index: 999;
right: 90px;
}
.active{
::v-deep .el-input__inner{
color: #ff0000;
}
}
::v-deep .el-icon-arrow-up{
display: none;
}
.active_other{
::v-deep .el-input__inner{
color: #409EFF;
}
}
::v-deep .el-input__inner {
border: none;
font-size: 16px;
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;
}
.underline{
text-decoration: underline;
}
.context_check{
margin: 20px 0;
}
.bottom_detail{
border: 1px solid #cccccc;
padding: 10px;
margin-top: 20px;
}
</style>

468
src/page-subspecialty/views/modules/formList/mraOrder.vue

@ -1,468 +0,0 @@
<template>
<div id="operation-record" style=" background: #fff; padding: 10px 20px 50px 20px;page-break-after:always">
<div v-if="!onlyRead && isPlatform" class="btnBox">
<el-button v-print="'#mraFunc'" size="small" @click="handleSaveTable">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button type="danger" size="small" @click="formDelete">删除</el-button>
</div>
<div id="mraFunc" style="width: 860px">
<div class="flex j-c">
<img width="450" src="@/assets/img/xianganlogo.png">
</div>
<hr>
<p style="color:#000000;font-size:32px;margin:0 0 15px 0;text-align:center;">
眼底血管造影患者预约单
</p>
<div>
眼底血管造影检查准备工作
</div>
<table>
<tr>
<td>
<div class="flex">
患者姓名<el-input v-model="formData.patientName" style="flex: 1" />
</div>
</td>
<td width="55%">
<div class="flex">
登记号<el-input v-model="formData.patientId" style="flex: 1" />
</div>
</td>
</tr>
<tr>
<td>
<div class="flex">
<div class="flex">
出生日期<el-input v-model="formData.patientBirthday" style="flex: 1" />
</div>
<div class="flex">
来源<el-input v-model="formData.source" style="flex: 1" />
</div>
</div>
</td>
<td>
<div class="flex">
<div class="flex">
年龄<el-input v-model="formData.patientAge" style="flex: 1" />
</div>
<div class="flex">
性别<el-input v-model="formData.patientSex" style="flex: 1" />
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="flex">
造影项目
<el-select
v-model="formData.project"
style="flex: 1"
filterable
allow-create
default-first-option
placeholder=""
>
<el-option
v-for="item in projectOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</td>
<td>
<div class="flex">
<div class="flex">
科室<el-input v-model="formData.department" style="flex: 1" />
</div>
<div class="flex">
医生
<el-select
v-model="formData.doctor"
style="flex: 1"
filterable
allow-create
placeholder=""
>
<el-option
v-for="item in doctorList"
:key="item.id"
:label="item.realName"
:value="item.realName"
/>
</el-select>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="flex">
视力
<div class="flex" style="flex: 1">
VOD<el-input v-model="formData.eyeVOD" style="flex: 1" />
</div>
<div class="flex" style="flex: 1">
VOS<el-input v-model="formData.eyeVOS" style="flex: 1" />
</div>
</div>
</td>
<td>
<div class="flex">
主照眼
<el-select v-model="formData.lightEye" style="flex: 1" placeholder="">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</td>
</tr>
<tr>
<td>
<div class="flex">
联系方式<el-input v-model="formData.patientPhone" style="flex: 1" />
</div>
</td>
<td>
<div class="flex">
备注<el-input v-model="formData.remark" type="textarea" :autosize="{ minRows: 1, maxRows: 3}" style="flex: 1" />
</div>
</td>
</tr>
<tr>
<td>
完善血常规常规生化全套心电图等检查
<div class="flex">
<div class="checkBox" @click="formData.yzOpen='Y'">
<input type="checkbox" :checked="formData.yzOpen==='Y'">已开医嘱
</div>
<div style="margin-left: 30px" class="checkBox" @click="formData.yzOpen='N'">
<input type="checkbox" :checked="formData.yzOpen==='N'">未开医嘱
</div>
</div>
</td>
<td>
<div class="flex">
<div class="checkBox" @click="formData.isPrint='Y'">
<input type="checkbox" :checked="formData.isPrint==='Y'">已打印
</div>
<div style="margin-left: 30px" class="checkBox" @click="formData.isPrint='N'">
<input type="checkbox" :checked="formData.isPrint==='N'">未打印
</div>
<div style="margin-left: 30px" class="checkBox" @click="formData.isPrint='S'">
<input type="checkbox" :checked="formData.isPrint==='S'">患者自带
</div>
</div>
</td>
</tr>
<tr>
<td>
预约眼底血管造影检查时间
</td>
<td>
<el-date-picker
v-model="formData.examineDate"
style="width: 100%"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
/>
</td>
</tr>
<tr>
<td>造影检查医嘱</td>
<td>
<div class="flex">
<div class="checkBox" @click="formData.checkAdvice='Y'">
<input type="checkbox" :checked="formData.checkAdvice==='Y'">
</div>
<div class="checkBox" style="margin-left: 30px" @click="formData.checkAdvice='N'">
<input type="checkbox" :checked="formData.checkAdvice==='N'">
</div>
</div>
<div v-if="formData.checkAdvice==='Y'" class="flex">
备注<el-input v-model="formData.docAdvice" style="flex: 1" />
</div>
</td>
</tr>
</table>
<div>
<div v-for="(item,index) in context" :key="index">
<h4>{{ item.title }}</h4>
<p v-for="(det,idx) in item.detail" :key="`${index}_${idx}`" class="context">
{{ `${idx+1}.${det}` }}
</p>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'MraOrder',
props: {
onlyRead: {
type: Boolean,
default: false
},
isPlatform: {
type: Boolean,
default: true
},
patientDetail: {
type: Object
},
caseId: {
type: String
}
},
data() {
return {
origin: '',
options: [{
value: 'OD',
label: 'OD'
}, {
value: 'OS',
label: 'OS'
}],
projectOptions: [{
value: 'FFA',
label: 'FFA'
}, {
value: 'ICGA',
label: 'ICGA'
}],
doctorList: [],
formData: {
idList: [],
patientName: '',
patientAge: '',
patientSex: '',
patientId: '',
patientBirthday: '',
project: '',
department: '眼科',
doctor: '',
eyeVOD: '',
eyeVOS: '',
lightEye: '',
patientPhone: '',
remark: '',
yzOpen: '',
isPrint: '',
examineDate: '',
checkAdvice: '',
docAdvice: '',
source: ''
},
context: [
{
title: '眼底血管造影检查前注意事项(请仔细阅读);',
detail: [
'请主动告知医生您的身体情况、过敏史、全身疾病史;',
'门诊患者:预约当日检查者可缴纳检查费用、取药且把药品交给护士(药物须避光保存)。预约其他时间检查者,于预约日期当日挂号、缴纳检查费用、取药且把药品交给护士(药物须避光保存);住院患者: 检查时将药品及其他用品带至门诊二楼眼科交给门诊护士(药物须避光保存);',
'检查当日需家属陪同;',
'避免空腹进行检查,饮食无特殊要求,建议尽量食用易消化的食物;',
'检查当日控制全身病的各种药物正常服用;',
'请穿着宽松上衣方便静脉注射;',
'检查当日需测量血压、血糖、眼压;检查前患者须监测并控制好血糖血压。',
'无散瞳禁忌症患者常规散瞳。'
]
},
{
title: '眼底血管造影检查后注意事项 (请仔细阅读):',
detail: [
'检查后至少留观 30 分钟。',
'检查后当天适当多饮水(荧光素钠约 24 到 36 小时内大部分排空,皮肤、眼睛、尿液等发黄属正常现象,对身体无害);',
'检查后当天勿直视强光、勿驾车、勿进行危险和精细作业;',
'造影后乳汁颜色可能不发黄,但哺乳期妇女至少停止哺乳 24 小时并将乳汁弃置,如哺乳正接受光疗的新生儿,至少停止哺乳 72 小时 (乳汁的荧光素钠消除半衰期约为 62 小时);',
'造影后 24 小时内避免行血清肌、总蛋白、皮质醇、地高辛、奎宁丁和甲状腺素,以及其他比色法测定的实验室检测,以免干扰检测结果;',
'门诊患者回家后若出现其他不适症状请就近到医院就诊。'
]
}
]
}
},
watch: {
caseId(val) {
if (val) {
this.getOrderDetail()
}
}
},
created() {
this.getDoctorList()
this.queryProject()
this.getOrderDetail()
},
methods: {
//
getDoctorList() {
this.$http.get('/sys/user', { params: { position: '门诊医师' }}).then(data => {
this.doctorList = data.data.data
}).catch(err => {
this.$message.error(err.msg)
})
},
handleSaveTable() {
this.formData.jzNumber = window.sessionStorage.getItem('jzNumber') || this.$route.query.jzNumber || ''
this.$http.post('/mzbl/saveMzblYdxgzy', {
caseId: this.caseId,
...this.formData
}).then(() => {
this.$emit('handleSaveTable')
})
},
//
queryOrderForm() {
this.$http.get('/mzbl/getLastAppointInfo', { params: {
patientId: this.formData.patientId
}}).then(data => {
const formDetail = data.data.data
this.formData.source = formDetail.source
this.formData.remark = formDetail.remark
this.formData.project = formDetail.project
this.formData.doctor = formDetail.doctor
this.formData.checkAdvice = formDetail.checkAdvice
this.formData.examineDate = formDetail.examineDate
this.formData.lightEye = formDetail.lightEye
})
},
getOrderDetail() {
this.$http.get('/mzbl/getMzblYdxgzyInfo', { params: {
caseId: this.caseId,
patientId: this.patientDetail.patientId
}}).then(data => {
const detail = data.data.data
this.formData = { ...detail }
if (!detail.jzNumber) {
//
this.formData.patientName = this.patientDetail.patientName
this.formData.patientAge = this.patientDetail.patientAge
this.formData.patientSex = this.patientDetail.patientSex
this.formData.patientId = this.patientDetail.patientId
this.formData.patientBirthday = this.$moment(this.patientDetail.patientBirthday).format('YYYY-MM-DD')
this.formData.patientPhone = this.patientDetail.patientPhone
this.formData.department = '眼科'
this.queryOrderForm()
}
})
},
// id
async queryProject() {
const project = window.sessionStorage.getItem('projectItem') ? JSON.parse(window.sessionStorage.getItem('projectItem')) : []
const { data: res } = await this.$http.get(
'/patient/getZlItemDict',
{
params: {
caseName: '眼底血管造影患者预约单'
}
}
)
if (res.code === 0) {
const data = res.data || []
const list = []
if (data.length) {
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < project.length; j++) {
if (data[i].itemId === project[j].porjectCode) {
list.push(project[j].id)
}
}
}
this.confirmData.idList = list
}
} else {
this.$message.error(res.msg)
}
},
//
formDelete() {
this.$confirmFun('确定删除吗?').then(() => {
this.$http.post('/mzbl/delMzblYdxgzyInfo', {
id: this.caseId
}).then(() => {
this.$message.success('删除成功')
this.$emit('formDelete', 'del')
})
})
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-textarea__inner{
border: none;
}
.flex{
display: flex;
}
.a-c{
align-items: center;
}
.j-c{
justify-content: center;
}
.j-b{
justify-content: space-between;
}
.j-a{
justify-content: space-around;
}
input{
-webkit-appearance: checkbox !important;
margin-right: 5px;
}
#mraFunc{
font-size: 16px;
text-align: left;
line-height: 30px;
padding: 20px;
}
.item{
display: flex;
align-items: center;
&:not(:last-child){
margin-right: 20px;
}
}
.context{
text-indent: 2em;
}
.btnBox{
position: fixed;
z-index: 999;
right: 90px;
}
::v-deep .el-input__inner {
border: none;
height: 26px !important;
line-height: 26px !important;
text-align: center;
border: none !important;
border-radius: 0;
padding: 0;
}
::v-deep .el-input__prefix {
display: none;
}
::v-deep .el-input__suffix {
display: none;
}
table tr td{
border: 1px solid #ccc;
padding: 3px 5px;
}
.checkBox{
cursor: pointer;
}
</style>

364
src/page-subspecialty/views/modules/formList/puncture.vue

@ -1,364 +0,0 @@
<template>
<div class="punctureBox">
<div v-if="!onlyRead && isPlatform" class="btnBox_top">
<el-button v-print="print" size="small" @click="handlePrint">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button type="danger" size="small" @click="formDelete">删除</el-button>
</div>
<div id="punctureOperation" style="width: 840px;padding-right: 8px">
<div class="flex j-c">
<img width="450" src="@/assets/img/xianganlogo.png">
</div>
<hr>
<p style="color:#000000;font-size:32px;margin:0 0 30px 0;text-align:center;">
前房穿刺知情同意书
</p>
<div class="flex a-c j-b">
<div>
姓名<el-input v-model="confirmData.patientName" style="width: 100px" />
</div>
<div>
性别<el-input v-model="confirmData.patientSex" style="width: 100px" />
</div>
<div>
年龄<el-input v-model="confirmData.patientAge" style="width: 100px" />
</div>
<div>
科室<el-input v-model="confirmData.department" style="width: 100px" />
</div>
<div>
登记号<el-input v-model="confirmData.patientId" style="width: 100px" />
</div>
</div>
<div class="form_content">
<div v-for="(item,index) in content" :key="index" style="margin: 5px 0">
<span style="font-weight: bold">{{ item.title }}</span>
<div v-if="item.flag === 1">
<span style="margin-left: 30px">医生已告知我患有</span><el-input v-model="confirmData.illness" style="width: 180px" />需要在<el-input v-model="confirmData.narcotize" style="width: 120px" />麻醉下进行<el-input v-model="confirmData.operation" style="width: 120px" />手术
</div>
<div v-for="(text,idx) in item.detail" :key="`${index}_${idx}`" class="form_detail">
{{ text }}
</div>
<div v-if="item.flag === 2" style="padding-left: 30px">
在向患方说明各治疗方案并告知利弊后患方基于当前病情需要经慎重考虑自愿选择<el-input v-model="confirmData.illMode" style="width: 180px" />手术
</div>
<div v-if="item.flag === 3" style="padding-left: 30px">
<el-input v-model="confirmData.risk" type="textarea" :rows="3" style="width: 600px" />
<p>一旦发生上述风险和意外医生会采取积极应对措施</p>
</div>
</div>
</div>
<div style="margin-top: 15px">
<div class="flex a-c">
<div style="margin-right: 296px;">
<span style="word-break: keep-all">患者签名</span>
<span style="margin-left:10px" @click="signClick('puncturePatientSign')">
<span v-if="!formListValue.puncturePatientSign">
<img v-if="printHidden" :src="require('@/assets/img/signature.png')" alt="" style="margin-right: 12px">
<el-input v-else style="width: 80px" />
</span>
<img v-else style="width: 80px;height: 40px;" :src="formListValue.puncturePatientSign">
</span>
</div>
<div>
签名日期:<el-date-picker
v-model="confirmData.operateDate"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
<p style="text-align: left">如果患者无法签署知情同意书请其授权的亲属在此签名</p>
<div class="flex a-c">
<div>
<span>患者授权亲属签名</span>
<span style="margin-left:10px" @click="signClick('punctureKinSign')">
<span v-if="!formListValue.punctureKinSign">
<img v-if="printHidden" :src="require('@/assets/img/signature.png')" alt="">
<el-input v-else style="width: 80px" />
</span>
<img v-else style="width: 80px;height: 40px;" :src="formListValue.punctureKinSign">
</span>
<span style="margin-left: 15px">与患者关系<el-input v-model="confirmData.relation" style="width: 150px" /></span>
</div>
<div>
签名日期:<el-date-picker
v-model="confirmData.operate2Date"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
</div>
<div style="margin: 5px 0;text-align: left">
<span style="font-weight: bold;">医生陈述</span>
<div class="form_detail">
我已经告知患者将要进行的治疗此次治疗及治疗后可能发生的风险可能存在的其它治疗方法并且解答了患者关于此次治疗的相关问题
</div>
</div>
<div class="flex a-c">
<div style="margin-right: 296px;">
<span style="word-break: keep-all">医生签名</span>
<span style="margin-left:10px">
<img style="width: 80px;height: 40px;" :src="confirmData.operator">
</span>
</div>
<div>
签名日期:<el-date-picker
v-model="confirmData.operate3Date"
type="date"
format="yyyy年MM月dd日"
value-format="yyyy-MM-dd"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import emptySign from '@static/js/emptySign'
import styeFormSign from '@/mixins/styeFormSign'
export default {
name: 'Puncture',
mixins: [styeFormSign],
props: {
onlyRead: {
type: Boolean,
default: false
},
isPlatform: {
type: Boolean,
default: true
},
patientDetail: {
type: Object
},
caseId: {
type: String,
default: ''
}
},
data() {
return {
content: [
{
title: '疾病诊断和治疗建议:',
flag: 1,
detail: []
},
{
title: '手术潜在风险和对策:',
flag: 2,
detail: [
'医生告知我上述治疗方案可能发生的一些风险,有些不常见的风险可能没有在此列出,具体的手术式根据不同病人的情况有所不同,医生告诉我可与我的医生讨论有关我手术的具体内容,如果我有特殊的问题可与我的医生讨论。',
' 一、我理解任何手术、麻醉都存在风险;如果我患有高血压、心脏病、糖尿病、肝肾功能不全、静脉血栓等疾病或者有吸烟史,以上这些风险可能会加大,或者在术中或术后出现相关的病情加重或心脑血管意外,甚至死亡。',
' 二、我理解任何所用药物都可能产生副作用,包括轻度的恶心、皮疹等症状到严重的过敏性休克,甚至危及生命。',
' 三、我理解此手术可能发生的风险及医生的对策:',
' 1.麻醉意外',
' 2.损伤角膜,晶体、眼内炎',
' 3.前房出血',
' 4.多次穿刺、冲洗,低眼压、伤口漏、感染',
' 5.视力下降',
' 四、患者手术的医护人员团队将尽全力按操作规范实施上述手术,并且一旦发生并发症或意外情况,将从维护患者利益的角度出发积极采取措施,以努力降低并发症或意外情况导致的对患者的损害后果。',
' 五、您有权选择同意或不同意接受上述治疗,但是如果拒绝接受上述治疗,您将面临以下风险:视力丧失、高眼压、前房炎症加重。',
' 六、根据患者目前的病情和我院目前开展的医疗技术,您还可以选择其他替代诊疗方案',
' 1.药物治疗:无法进一步降低眼压。',
' 2.观察:视力丧失、高眼压、前房炎症加重。'
]
},
{
title: '特殊风险或主要高危因素:',
flag: 3,
detail: [
'我理解根据我个人的病情,我可能出现未包括在上述所交待并发症以外的风险:'
]
},
{
title: '患者知情选择',
detail: [
'我的医生已经告知我将要进行的治疗方式、此次治疗及治疗后可能发生的并发症和风险、可能存在的其它治疗方法并且解答了我关于此次治疗的相关问题。',
'我同意在治疗中医生可以根据我的病情对预定的治疗方式做出调整。',
'我理解我的治疗需要多位医生共同进行。',
'我并未得到治疗百分之百成功的许诺。',
'我授权医师对治疗切除的病变器官、组织或标本进行处置,包括病理学检查、细胞学检查和医疗废物处理等。',
'我 (同意/不同意)接受上述治疗/手术,并授权医师在实施过程中遇有异常情况时,为保障患者的生命安全对其实施必要的救治措施。今签字为证。'
]
}
],
print: {
id: 'punctureOperation',
closeCallback: () => {
this.printHidden = true
}
},
printHidden: true,
formId: '',
sourceData: {},
confirmData: {
patientName: '',
patientAge: '',
patientId: '',
patientSex: '',
department: '眼科',
illness: '',
narcotize: '',
operation: '',
illMode: '',
risk: '',
patientSign: '',
familySign: '',
operator: '',
operateDate: '',
operate2Date: '',
operate3Date: ''
},
formListValue: {
puncturePatientSign: '',
punctureKinSign: ''
}
}
},
watch: {
caseId(val) {
if (val) {
this.getformList()
}
}
},
created() {
this.sourceData = JSON.parse(JSON.stringify(this.confirmData))
this.getformList()
},
methods: {
signClick(text) {
this.initPlugin(text)
},
setData() {
const date = this.$moment().format('YYYY-MM-DD')
this.confirmData.operateDate = date
this.confirmData.operate2Date = date
this.confirmData.operate3Date = date
const userData = JSON.parse(window.sessionStorage.getItem('qg-userData'))
this.confirmData.operator = userData.signImgBase
this.confirmData.patientName = this.patientDetail.patientName
this.confirmData.patientAge = this.patientDetail.patientAge
this.confirmData.patientSex = this.patientDetail.patientSex
this.confirmData.patientId = this.patientDetail.patientId
},
async getformList() {
const { data: res } = await this.$http.get('/case/getCaseById', {
params: {
id: this.caseId
}
})
if (res.code === 0) {
if (res.data) {
if (res.data.jsonText) {
this.confirmData = JSON.parse(res.data.jsonText)
this.formListValue.punctureKinSign = this.confirmData.familySign
this.formListValue.puncturePatientSign = this.confirmData.patientSign
} else {
this.confirmData = JSON.parse(JSON.stringify(this.sourceData))
this.formListValue.punctureKinSign = ''
this.formListValue.puncturePatientSign = ''
this.setData()
}
}
} else {
this.$message.error(res.msg)
}
},
handlePrint() {
this.printHidden = false
this.handleSaveTable()
},
//
async handleSaveTable() {
if (this.formListValue.puncturePatientSign === emptySign || this.formListValue.punctureKinSign === emptySign) {
this.$message.error('签字未成功请重新签字后再保存')
return
}
this.confirmData.patientSign = this.formListValue.puncturePatientSign
this.confirmData.familySign = this.formListValue.punctureKinSign
const params = {
id: this.caseId,
flag: '8',
jsonText: JSON.stringify(this.confirmData),
name: '前房穿刺知情同意书',
patientId: this.patientDetail.patientId,
platform: 2
}
const { data: res } = await this.$http.post('/case/update', params)
if (res.code === 0) {
this.$message.success('保存成功')
await this.getformList()
} else {
this.$message.error(res.msg)
}
},
//
formDelete() {
this.$confirmFun('确定删除吗?').then(() => {
this.$http.post('/case/delete', {
id: this.caseId
}).then(() => {
this.$message.success('删除成功')
this.$emit('formDelete', 'del')
})
})
}
}
}
</script>
<style lang="scss" scoped>
.flex{
display: flex;
}
.a-c{
align-items: center;
}
.j-c{
justify-content: center;
}
.j-b{
justify-content: space-between;
}
.punctureBox{
background: #fff;
padding: 10px 20px 50px 20px;
page-break-after:always;
height: 100%;
overflow: auto;
}
.btnBox_top{
position: fixed;
z-index: 999;
right: 90px;
}
.form_top{
margin-bottom: 15px;
}
.form_content{
text-align: left;
}
.form_detail{
text-indent: 2rem;
margin: 3px 0;
}
::v-deep .el-input__inner{
border: none;
border-bottom: 1px solid #cccccc;
border-radius: 0;
font-size: 16px;
height: 26px;
text-align: center;
}
::v-deep .el-input__prefix{
display: none;
}
</style>

336
src/page-subspecialty/views/modules/formList/reportForm.vue

@ -1,336 +0,0 @@
<template>
<div id="operation-record" style=" background: #fff; padding: 10px 20px 50px 20px;page-break-after:always">
<div v-if="!onlyRead && isPlatform" class="btnBox">
<el-button v-print="'#reportForm'" size="small" @click="handleSaveTable">打印</el-button>
<el-button type="primary" size="small" @click="handleSaveTable">保存</el-button>
<el-button type="danger" size="small" @click="formDelete">删除</el-button>
</div>
<div id="reportForm" style="width: 840px;padding-right: 8px;text-align: left">
<div class="flex">
<div class="flex" style="width: 240px">患者姓名<el-input v-model="confirmData.patientName" style="flex: 1" /></div>
<div class="flex a-c">登记号:<el-input v-model="confirmData.patientId" style="flex: 1" /></div>
<div class="flex a-c">年龄:<el-input v-model="confirmData.patientAge" style="flex: 1" /></div>
</div>
<table class="treatAction">
<thead>
<tr>
<td colspan="2">睑板腺综合治疗睑脂性状分析</td>
</tr>
<tr>
<td>右眼</td>
<td>左眼</td>
</tr>
</thead>
<tbody>
<tr>
<td>
<div v-for="(item,index) in formData.form.OD" :key="index" style="display:flex;">
<div class="check" @click="item.isSelect = !item.isSelect">
<input type="checkbox" :checked="item.isSelect">{{ item.name }}
</div>
<el-input v-if="item.isEdit" v-model="item.remark" style="flex: 1" />
</div>
</td>
<td>
<div v-for="(item,index) in formData.form.OS" :key="`${index}_${index}`" style="display: flex">
<div class="check" @click="item.isSelect = !item.isSelect">
<input type="checkbox" :checked="item.isSelect">{{ item.name }}
</div>
<el-input v-if="item.isEdit" v-model="item.remark" style="flex: 1" />
</div></td>
</tr>
<tr>
<td colspan="2">
<div class="flex">
备注<el-input v-model="confirmData.remark" style="flex:1" />
</div>
</td>
</tr>
<tr>
<td colspan="2">
<div class="flex a-c j-b">
<div>
操作者<img v-if="confirmData.operator" :src="confirmData.operator" alt="" style="width: 80px;height: 50px;border-style:none;">
</div>
<div class="flex a-c" style="margin-left: 15px">
日期<el-date-picker
v-model="confirmData.operateDate"
style="flex: 1"
type="date"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
/>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</template>
<script>
export default {
name: 'ReportForm',
props: {
onlyRead: {
type: Boolean,
default: false
},
isPlatform: {
type: Boolean,
default: true
},
patientDetail: {
type: Object
},
caseId: {
type: String,
default: ''
}
},
data() {
return {
origin: {},
originForm: {},
confirmData: {
fmwOd: '',
fmwOs: '',
jzNumber: '',
patientName: '',
patientAge: '',
patientId: '',
remark: '',
operator: '',
idList: [],
operateDate: ''
},
formData: {
form: {
OD: [
{
name: '分泌物清亮',
isSelect: false
}, {
name: '分泌物轻浑,云雾状',
isSelect: false
}, {
name: '分泌物浑浊,粘稠可见颗粒物质',
isSelect: false
}, {
name: '分泌物呈牙膏状或压迫出现气泡',
isSelect: false
}, {
name: '其他:',
isSelect: false,
isEdit: true,
remark: ''
}
],
OS: [
{
name: '分泌物清亮',
isSelect: false
}, {
name: '分泌物轻浑,云雾状',
isSelect: false
}, {
name: '分泌物浑浊,粘稠可见颗粒物质',
isSelect: false
}, {
name: '分泌物呈牙膏状或压迫出现气泡',
isSelect: false
}, {
name: '其他:',
isSelect: false,
isEdit: true,
remark: ''
}
]
}
}
}
},
watch: {
caseId(val) {
if (val) {
this.getReportInfo()
}
}
},
created() {
this.originForm = JSON.parse(JSON.stringify(this.formData))
this.getReportInfo()
},
methods: {
//
handleFormEye(data) {
const list = data.filter(item => item.isSelect).map(item => {
item.other = item.name
if (item.isEdit) {
item.other = item.name + item.remark
}
return item.other
})
return list
},
//
handleResValue(val, change) {
if (!val) {
return
}
change.forEach(item => {
item.isSelect = false
item.remark = ''
})
const list = val.split('/')
change.forEach(item => {
list.forEach(lis => {
if (lis === item.name) {
item.isSelect = true
}
if (lis.includes('其他') && item.name === '其他:') {
item.isSelect = true
item.remark = lis.split(':')[1]
}
})
//
if (!item.isSelect && item.name === '其他:') {
item.remark = ''
}
})
},
//
handleSaveTable() {
this.confirmData.fmwOd = this.handleFormEye(this.formData.form.OD).join('/')
this.confirmData.fmwOs = this.handleFormEye(this.formData.form.OS).join('/')
this.confirmData.jzNumber = window.sessionStorage.getItem('jzNumber')
this.$http.post('/mzbl/saveMzblBg', {
caseId: this.caseId,
...this.confirmData
}).then(() => {
this.getReportInfo()
this.$emit('handleSaveTable')
})
},
getReportInfo() {
const params = {
patientId: this.patientDetail.patientId,
caseId: this.caseId
}
this.$http.get('/mzbl/getMzblBgInfo', { params }).then(data => {
const res = data.data.data
this.setData(res)
})
},
setData(res) {
this.confirmData = res
this.handleResValue(res.fmwOd, this.formData.form.OD)
this.handleResValue(res.fmwOs, this.formData.form.OS)
if (!res.jzNumber) {
this.formData = JSON.parse(JSON.stringify(this.originForm))
this.confirmData.patientName = this.patientDetail.patientName
this.confirmData.patientId = this.patientDetail.patientId
this.confirmData.patientAge = this.patientDetail.patientAge
const userData = JSON.parse(window.sessionStorage.getItem('qg-userData'))
this.confirmData.operator = userData.signImgBase
this.confirmData.operateDate = this.$moment().format('YYYY-MM-DD')
}
},
// id
async queryProject() {
const project = window.sessionStorage.getItem('projectItem') ? JSON.parse(window.sessionStorage.getItem('projectItem')) : []
const { data: res } = await this.$http.get(
'/patient/getZlItemDict',
{
params: {
caseName: '报告'
}
}
)
if (res.code === 0) {
const data = res.data || []
const list = []
if (data.length) {
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < project.length; j++) {
if (data[i].itemId === project[j].porjectCode) {
list.push(project[j].id)
}
}
}
this.confirmData.idList = list
}
} else {
this.$message.error(res.msg)
}
},
formDelete() {
this.$confirmFun('确定删除吗?').then(() => {
this.$http.post('/mzbl/delMzblBgInfo', {
id: this.caseId
}).then(() => {
this.$message.success('删除成功')
this.$emit('formDelete', 'del')
})
})
}
}
}
</script>
<style lang="scss" scoped>
.btnBox{
position: fixed;
z-index: 999;
right: 90px;
}
.check {
cursor: pointer;
user-select: none;
display: flex;
input{
-webkit-appearance: checkbox !important;
margin-right: 5px;
}
}
.flex{
display: flex;
}
.a-c{
align-items: center;
}
.j-b{
justify-content: space-between;
}
.treatAction{
width: 100%;
margin-top: 10px;
thead{
text-align: center;
}
tr td,tr th{
border: 1px solid #ccc;
padding: 5px;
}
td{
width: 25%;
}
}
::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>

248
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/align.vue

@ -1,248 +0,0 @@
<!--
* @Author: 秦少卫
* @Date: 2022-09-03 19:16:55
* @LastEditors: 秦少卫
* @LastEditTime: 2023-01-07 02:19:20
* @Description: 组合元素对齐
-->
<template>
<ButtonGroup size="small">
<!-- 水平对齐 -->
<Button :disabled="notMultiple()" @click="left"><svg t="1650442284704" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2345" width="14" height="14"><path d="M80 24h64v976H80zM198 227h448v190H198zM198 607h746v190H198z" p-id="2346" /></svg></Button>
<Button :disabled="notMultiple()" @click="xcenter"><svg t="1650442754876" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1514" width="14" height="14"><path d="M477.312 576V448H266.688a32 32 0 0 1-32-32v-192a32 32 0 0 1 32-32h210.624V34.688a34.688 34.688 0 0 1 69.376 0V192h210.624a32 32 0 0 1 32 32v192a32 32 0 0 1-32 32H546.688v128H896a32 32 0 0 1 32 32v192a32 32 0 0 1-32 32H546.688v157.312a34.688 34.688 0 1 1-69.376 0V832H128a32 32 0 0 1-32-32v-192A32 32 0 0 1 128 576h349.312z" fill="#666666" p-id="1515" /></svg></Button>
<Button :disabled="notMultiple()" @click="right"><svg t="1650442299564" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2543" width="14" height="14"><path d="M944 1000h-64V24h64zM826 417H378V227h448zM826 797H80V607h746z" p-id="2544" /></svg></Button>
<!-- 垂直对齐 -->
<Button :disabled="notMultiple()" @click="top"><svg t="1650442692910" class="icon" viewBox="0 0 1170 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1118" width="14" height="14"><path d="M1170.285714 36.571429a36.571429 36.571429 0 0 1-36.571428 36.571428H36.571429a36.571429 36.571429 0 0 1 0-73.142857h1097.142857a36.571429 36.571429 0 0 1 36.571428 36.571429z m-219.428571 146.285714v512a36.571429 36.571429 0 0 1-36.571429 36.571428h-219.428571a36.571429 36.571429 0 0 1-36.571429-36.571428v-512a36.571429 36.571429 0 0 1 36.571429-36.571429h219.428571a36.571429 36.571429 0 0 1 36.571429 36.571429z m-438.857143 0v804.571428a36.571429 36.571429 0 0 1-36.571429 36.571429h-219.428571a36.571429 36.571429 0 0 1-36.571429-36.571429v-804.571428a36.571429 36.571429 0 0 1 36.571429-36.571429h219.428571a36.571429 36.571429 0 0 1 36.571429 36.571429z" fill="#666666" p-id="1119" /></svg></Button>
<Button :disabled="notMultiple()" @click="ycenter"><svg t="1650442732396" class="icon" viewBox="0 0 1243 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1316" width="14" height="14"><path d="M548.571429 472.356571h146.285714V231.643429a36.571429 36.571429 0 0 1 36.571428-36.571429h219.428572a36.571429 36.571429 0 0 1 36.571428 36.571429v240.713142h179.785143a39.643429 39.643429 0 0 1 0 79.286858H987.428571v240.713142a36.571429 36.571429 0 0 1-36.571428 36.571429h-219.428572a36.571429 36.571429 0 0 1-36.571428-36.571429V551.643429h-146.285714V950.857143a36.571429 36.571429 0 0 1-36.571429 36.571428H292.571429a36.571429 36.571429 0 0 1-36.571429-36.571428V551.643429H76.214857a39.643429 39.643429 0 1 1 0-79.286858H256V73.142857A36.571429 36.571429 0 0 1 292.571429 36.571429h219.428571a36.571429 36.571429 0 0 1 36.571429 36.571428v399.213714z" fill="#666666" p-id="1317" /></svg></Button>
<Button :disabled="notMultiple()" @click="bottom"><svg t="1650442674784" class="icon" viewBox="0 0 1170 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="920" width="14" height="14"><path d="M1170.285714 987.428571a36.571429 36.571429 0 0 0-36.571428-36.571428H36.571429a36.571429 36.571429 0 0 0 0 73.142857h1097.142857a36.571429 36.571429 0 0 0 36.571428-36.571429z m-219.428571-146.285714v-512a36.571429 36.571429 0 0 0-36.571429-36.571428h-219.428571a36.571429 36.571429 0 0 0-36.571429 36.571428v512a36.571429 36.571429 0 0 0 36.571429 36.571429h219.428571a36.571429 36.571429 0 0 0 36.571429-36.571429z m-438.857143 0V36.571429a36.571429 36.571429 0 0 0-36.571429-36.571429h-219.428571a36.571429 36.571429 0 0 0-36.571429 36.571429v804.571428a36.571429 36.571429 0 0 0 36.571429 36.571429h219.428571a36.571429 36.571429 0 0 0 36.571429-36.571429z" fill="#666666" p-id="921" /></svg></Button>
<!-- 平均对齐 -->
<Button :disabled="notMultiple()" @click="xequation"><svg t="1650442800956" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1910" width="14" height="14"><path d="M96 0a32 32 0 0 1 32 32v960a32 32 0 0 1-64 0V32A32 32 0 0 1 96 0z m832 0a32 32 0 0 1 32 32v960a32 32 0 0 1-64 0V32a32 32 0 0 1 32-32zM384 800v-576a32 32 0 0 1 32-32h192a32 32 0 0 1 32 32v576a32 32 0 0 1-32 32h-192a32 32 0 0 1-32-32z" fill="#515151" p-id="1911" /></svg></Button>
<Button :disabled="notMultiple()" @click="yequation"><svg t="1650442784286" class="icon" viewBox="0 0 1170 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1712" width="14" height="14"><path d="M1170.285714 36.571429a36.571429 36.571429 0 0 1-36.571428 36.571428H36.571429a36.571429 36.571429 0 0 1 0-73.142857h1097.142857a36.571429 36.571429 0 0 1 36.571428 36.571429z m0 950.857142a36.571429 36.571429 0 0 1-36.571428 36.571429H36.571429a36.571429 36.571429 0 0 1 0-73.142857h1097.142857a36.571429 36.571429 0 0 1 36.571428 36.571428zM256 365.714286h658.285714a36.571429 36.571429 0 0 1 36.571429 36.571428v219.428572a36.571429 36.571429 0 0 1-36.571429 36.571428h-658.285714a36.571429 36.571429 0 0 1-36.571429-36.571428v-219.428572a36.571429 36.571429 0 0 1 36.571429-36.571428z" fill="#515151" p-id="1713" /></svg></Button>
</ButtonGroup>
</template>
<script>
import select from '@/mixins/select'
export default {
name: 'ToolBar',
mixins: [select],
data() {
return {
id: '',
list: []
}
},
methods: {
//
notMultiple() {
return this.mSelectMode !== 'multiple'
},
//
left() {
const activeObject = this.canvas.c.getActiveObject()
if (activeObject && activeObject.type === 'activeSelection') {
const activeSelection = activeObject
const activeObjectLeft = -(activeObject.width / 2)
activeSelection.forEachObject(item => {
item.set({
left: activeObjectLeft
})
item.setCoords()
this.canvas.c.renderAll()
})
}
},
//
right() {
const activeObject = this.canvas.c.getActiveObject()
if (activeObject && activeObject.type === 'activeSelection') {
const activeSelection = activeObject
const activeObjectLeft = (activeObject.width / 2)
activeSelection.forEachObject(item => {
item.set({
left: activeObjectLeft - (item.width * item.scaleX)
})
item.setCoords()
this.canvas.c.renderAll()
})
}
},
//
xcenter() {
const activeObject = this.canvas.c.getActiveObject()
if (activeObject && activeObject.type === 'activeSelection') {
const activeSelection = activeObject
activeSelection.forEachObject(item => {
item.set({
left: 0 - ((item.width * item.scaleX) / 2)
})
item.setCoords()
this.canvas.c.renderAll()
})
}
},
//
ycenter() {
const activeObject = this.canvas.c.getActiveObject()
if (activeObject && activeObject.type === 'activeSelection') {
const activeSelection = activeObject
activeSelection.forEachObject(item => {
item.set({
top: 0 - ((item.height * item.scaleY) / 2)
})
item.setCoords()
this.canvas.c.renderAll()
})
}
},
//
top() {
const activeObject = this.canvas.c.getActiveObject()
if (activeObject && activeObject.type === 'activeSelection') {
const activeSelection = activeObject
const activeObjectTop = -(activeObject.height / 2)
activeSelection.forEachObject(item => {
item.set({
top: activeObjectTop
})
item.setCoords()
this.canvas.c.renderAll()
})
}
},
//
bottom() {
const activeObject = this.canvas.c.getActiveObject()
if (activeObject && activeObject.type === 'activeSelection') {
const activeSelection = activeObject
const activeObjectTop = (activeObject.height / 2)
activeSelection.forEachObject(item => {
item.set({
top: activeObjectTop - (item.height * item.scaleY)
})
item.setCoords()
this.canvas.c.renderAll()
})
}
},
//
xequation() {
const activeObject = this.canvas.c.getActiveObject()
if (activeObject && activeObject.type === 'activeSelection') {
const activeSelection = activeObject
//
activeSelection._objects.sort((a, b) => {
return a.left - b.left
})
//
const itemSpac = spacWidth()
//
const yHeight = (activeObject.width / 2)
activeObject.forEachObject((item, i) => {
//
const preHeight = getItemLeft(i)
// * + -
const top = itemSpac * i + preHeight - yHeight
item.set('left', top)
})
this.canvas.c.renderAll()
}
//
function spacWidth() {
const count = getAllItemHeight()
const allSpac = activeObject.width - count
return allSpac / (activeObject._objects.length - 1)
}
//
function getAllItemHeight() {
let count = 0
activeObject.forEachObject(item => {
count += getItemWidth(item)
})
return count
}
// width
function getItemWidth(item) {
return item.aCoords.tr.x - item.aCoords.tl.x
}
//
function getItemLeft(i) {
if (i === 0) return 0
let width = 0
for (let index = 0; index < i; index++) {
width += getItemWidth(activeObject._objects[index])
}
return width
}
},
//
yequation() {
const activeObject = this.canvas.c.getActiveObject()
if (activeObject && activeObject.type === 'activeSelection') {
const activeSelection = activeObject
//
activeSelection._objects.sort((a, b) => {
return a.top - b.top
})
//
const itemSpac = spacHeight()
//
const yHeight = (activeObject.height / 2)
activeObject.forEachObject((item, i) => {
//
const preHeight = getItemTop(i)
// * + -
const top = itemSpac * i + preHeight - yHeight
item.set('top', top)
})
this.canvas.c.renderAll()
}
//
function spacHeight() {
const count = getAllItemHeight()
const allSpac = activeObject.height - count
return allSpac / (activeObject._objects.length - 1)
}
//
function getAllItemHeight() {
let count = 0
activeObject.forEachObject(item => {
count += getItemHeight(item)
})
return count
}
// width
function getItemHeight(item) {
return item.aCoords.bl.y - item.aCoords.tl.y
}
//
function getItemTop(i) {
if (i === 0) return 0
let height = 0
for (let index = 0; index < i; index++) {
height += getItemHeight(activeObject._objects[index])
}
return height
}
}
}
}
</script>
<style scoped lang="less">
/deep/ .ivu-btn[disabled]{
svg{ opacity: 0.2;}
}
</style>

404
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/attribute copy.vue

File diff suppressed because one or more lines are too long

287
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/attribute.vue

File diff suppressed because one or more lines are too long

159
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/bgBar.vue

@ -1,159 +0,0 @@
<template>
<div class="baBar">
<el-divider orientation="left" plain>背景</el-divider>
<div>
<img
ref="od"
src="@/assets/img/od.png"
class="img"
alt=""
@click="(e) => setBgImg(e.target)"
>
<img
ref="os"
src="@/assets/img/os.png"
class="img"
alt=""
@click="(e) => setBgImg(e.target)"
>
</div>
</div>
</template>
<script>
import { getImgStr } from '@/utils/utils'
import eventBus from '@/page-subspecialty/utils/eventBus'
export default {
name: 'BgBar',
inject: ['canvas', 'fabric'],
props: {
isOdOrOs: {
type: String
}
},
data() {
return {
showModal: false,
color: '',
imgFile: ''
}
},
mounted() {
this.$nextTick(() => {
this.setBgImg()
eventBus.$off('clearCanvas')
eventBus.$on('clearCanvas', () => {
this.setBgImg()
})
})
},
methods: {
//
setBgImg(target) {
let imgContent = target
if (this.isOdOrOs === 'OD') {
imgContent = this.$refs.od
} else {
imgContent = this.$refs.os
}
const imgEl = imgContent.cloneNode(true)
// console.log(imgEl)
imgEl.onload = () => {
//
const imgInstance = new this.fabric.Image(imgEl, { crossOrigin: 'anonymous', erasable: false })
// console.log(imgInstance)
//
this.canvas.c.setBackgroundImage(imgInstance, this.canvas.c.renderAll.bind(this.canvas.c), {
scaleX: this.canvas.c.width / imgInstance.width,
scaleY: this.canvas.c.width / imgInstance.width
})
this.canvas.c.renderAll()
this.canvas.c.requestRenderAll()
}
},
//
insert() {
this.imgFile = ''
this.showModal = true
},
//
insertImgFile() {
if (this.imgFile === '') {
return this.$Message.error('请选择文件')
}
const imgEl = document.createElement('img')
imgEl.src = this.imgFile
//
document.body.appendChild(imgEl)
imgEl.onload = () => {
this.setBgImg(imgEl)
imgEl.remove()
}
},
//
handleUpload(file) {
getImgStr(file).then(res => {
this.imgFile = res
})
},
//
setThisColor() {
this.setColor(this.color)
},
//
setColor(color) {
this.canvas.c.setBackgroundColor(color, this.canvas.c.renderAll.bind(this.canvas.c))
this.canvas.c.backgroundImage = ''
this.canvas.c.renderAll()
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="less">
.ivu-select-dropdown {
z-index: 9999 !important;
}
</style>
<style scoped lang="less">
/deep/ .ivu-form-item {
margin-bottom: 0;
}
.img {
width: 320px*0.2;
height: 320px*0.2;
padding: 5px;
margin-left: 5px;
cursor: pointer;
background: #fff;
}
::v-deep .el-divider__text{
background: #29292a !important;
color: #fff;
}
.color-list {
padding: 10px 0;
.item {
padding-bottom: 5px;
}
span {
display: inline-block;
margin-left: 6px;
background: #f5f5f5;
height: 20px;
width: 20px;
font-size: 12px;
line-height: 20px;
vertical-align: middle;
cursor: pointer;
}
}
/deep/ .ivu-divider-plain.ivu-divider-with-text-left {
margin: 10px 0;
font-weight: bold;
}
</style>

39
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/brush.vue

@ -1,39 +0,0 @@
<template>
<div class="canvas-set">
<div style="display: inline-block; margin-left: 10px">
<button id="drawing-mode" class="btn btn-info">Cancel drawing mode</button><br>
<button id="clear-canvas" class="btn btn-info">Clear</button><br>
<div id="drawing-mode-options">
<label for="drawing-mode-selector">Mode:</label>
<select id="drawing-mode-selector">
<option>Pencil</option>
<option>Circle</option>
<option>Spray</option>
<option>Pattern</option>
<option>hline</option>
<option>vline</option>
<option>square</option>
<option>diamond</option>
<option>texture</option>
</select><br>
<label for="drawing-line-width">Line width:</label>
<span class="info">30</span><input id="drawing-line-width" type="range" value="30" min="0" max="150"><br>
<label for="drawing-color">Line color:</label>
<input id="drawing-color" type="color" value="#005E7A"><br>
<label for="drawing-shadow-color">Shadow color:</label>
<input id="drawing-shadow-color" type="color" value="#005E7A"><br>
<label for="drawing-shadow-width">Shadow width:</label>
<span class="info">0</span><input id="drawing-shadow-width" type="range" value="0" min="0" max="50"><br>
<label for="drawing-shadow-offset">Shadow offset:</label>
<span class="info">0</span><input id="drawing-shadow-offset" type="range" value="0" min="0" max="50"><br>
</div>
</div>
</div>
</template>

50
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/centerAlign.vue

@ -1,50 +0,0 @@
<!--
* @Author: 秦少卫
* @Date: 2022-09-03 19:16:55
* @LastEditors: 秦少卫
* @LastEditTime: 2022-09-03 23:55:33
* @Description: 多元素或单元素对齐方式
-->
<template>
<ButtonGroup size="small">
<!-- 水平集中 -->
<Button :disabled="!mSelectMode" @click="position('centerH')"><svg t="1650442559691" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3787" width="14" height="14"><path d="M885 607H544V417h192V227H544V24h-64v203H288v190h192v190H139v190h341v203h64V797h341z" p-id="3788" /></svg></Button>
<!-- 水平垂直居中 -->
<Button :disabled="!mSelectMode" @click="position('center')"><svg t="1650852784867" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2351" width="14" height="14"><path d="M544 480V64h-64v416H64v64h416v416h64V544h416v-64z" fill="#727272" p-id="2352" /><path d="M123.7 241.1h119.5v64H123.7zM302.9 241.1h119.5v64H302.9zM601.6 241.1h119.5v64H601.6zM780.8 241.1h119.5v64H780.8zM123.7 718.9h119.5v64H123.7zM302.9 718.9h119.5v64H302.9zM601.6 718.9h119.5v64H601.6zM780.8 718.9h119.5v64H780.8z" fill="#B2B2B2" p-id="2353" /></svg></Button>
<!-- 垂直居中 -->
<Button :disabled="!mSelectMode" @click="position('centerV')"><svg t="1650442510967" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3412" width="14" height="14"><path d="M859.9 474H164.1c-4.5 0-8.1 3.6-8.1 8v60c0 4.4 3.6 8 8.1 8h695.8c4.5 0 8.1-3.6 8.1-8v-60c0-4.4-3.6-8-8.1-8z m-353.6-74.7c2.9 3.7 8.5 3.7 11.3 0l100.8-127.5c3.7-4.7 0.4-11.7-5.7-11.7H550V104c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v156h-62.8c-6 0-9.4 7-5.7 11.7l100.8 127.6z m11.4 225.4c-2.9-3.7-8.5-3.7-11.3 0L405.6 752.3c-3.7 4.7-0.4 11.7 5.7 11.7H474v156c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V764h62.8c6 0 9.4-7 5.7-11.7L517.7 624.7z" p-id="3413" /></svg></Button>
</ButtonGroup>
</template>
<script>
import select from '@/mixins/select'
export default {
name: 'ToolBar',
mixins: [select],
data() {
return {
}
},
created() {
},
methods: {
position(name) {
const activeObject = this.canvas.c.getActiveObject()
if (activeObject) {
activeObject[name]()
this.canvas.c.renderAll()
}
}
}
}
</script>
<style scoped lang="less">
/deep/ .ivu-btn[disabled]{
svg{ opacity: 0.2;}
}
svg{
vertical-align: text-bottom;
}
</style>

38
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/clone.vue

@ -1,38 +0,0 @@
<template>
<Button v-if="mSelectMode === 'one'" icon="ios-copy" size="small" @click="clone" />
</template>
<script>
import select from '@/mixins/select'
import { v4 as uuid } from 'uuid'
export default {
name: 'ToolBar',
mixins: [select],
data() {
return {
}
},
methods: {
clone() {
const activeObject = this.canvas.c.getActiveObject()
activeObject.clone(cloned => {
this.canvas.c.discardActiveObject()
//
const grid = 10
cloned.set({
left: cloned.left + grid,
top: cloned.top + grid,
id: uuid()
})
this.canvas.c.add(cloned)
this.canvas.c.setActiveObject(cloned)
this.canvas.c.requestRenderAll()
})
}
}
}
</script>
<style scoped lang="less">
</style>

35
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/del.vue

@ -1,35 +0,0 @@
<!--
* @Author: 秦少卫
* @Date: 2022-09-03 19:16:55
* @LastEditors: 秦少卫
* @LastEditTime: 2022-09-03 22:35:59
* @Description: 删除元素按钮
-->
<template>
<Button v-if="mSelectMode" icon="ios-trash" size="small" @click="del" />
</template>
<script>
import select from '@/mixins/select'
export default {
name: 'ToolBar',
mixins: [select],
data() {
return {
}
},
methods: {
del() {
const activeObject = this.canvas.c.getActiveObjects()
activeObject && activeObject.map(item => this.canvas.c.remove(item))
this.canvas.c.requestRenderAll()
this.canvas.c.discardActiveObject()
}
}
}
</script>
<style scoped lang="less">
</style>

43
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/flip.vue

@ -1,43 +0,0 @@
<!--
* @Author: 秦少卫
* @Date: 2022-09-03 19:16:55
* @LastEditors: 秦少卫
* @LastEditTime: 2022-12-07 13:28:38
* @Description: 元素翻转
-->
<template>
<ButtonGroup size="small">
<Button :disabled="notSelectOneMode()" @click="flip('X')"><svg t="1650443094178" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1549" width="14" height="14"><path d="M252.76928 299.904l146.2784 0 0 472.42752-146.2784 0 0-472.42752Z" p-id="1550" /><path d="M477.48096 85.34528l70.87104 0 0 885.80608-70.87104 0 0-885.80608Z" p-id="1551" /><path d="M629.80096 284.8l31.0016 0 0 502.88128-31.0016 0L629.80096 284.8zM776.42752 284.8l31.0016 0 0 502.88128-31.0016 0L776.42752 284.8zM657.09056 315.8016l0-31.0016 123.04896 0 0 31.0016L657.09056 315.8016zM657.27488 787.64544l0-31.0016 123.04896 0 0 31.0016L657.27488 787.64544z" p-id="1552" /></svg></Button>
<Button :disabled="notSelectOneMode()" @click="flip('Y')"><svg t="1650443104385" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1749" width="14" height="14"><path d="M286.01856 250.91584l472.4224 0 0 146.2784-472.4224 0 0-146.2784Z" p-id="1750" /><path d="M87.19872 475.62752l885.80096 0 0 70.87104-885.80096 0 0-70.87104Z" p-id="1751" /><path d="M773.55008 627.94752l0 31.0016L270.6688 658.94912l0-31.0016L773.55008 627.94752zM773.55008 774.5792l0 31.0016L270.6688 805.5808l0-31.0016L773.55008 774.5792zM742.54848 655.24224l31.0016 0 0 123.04896-31.0016 0L742.54848 655.24224zM270.70464 655.42144l31.0016 0 0 123.04896-31.0016 0L270.70464 655.42144z" p-id="1752" /></svg></Button>
</ButtonGroup>
</template>
<script>
import select from '@/mixins/select'
export default {
name: 'ToolBar',
mixins: [select],
data() {
return {
}
},
methods: {
//
notSelectOneMode() {
return this.mSelectMode !== 'one'
},
flip(type) {
const activeObject = this.canvas.c.getActiveObject()
activeObject.set('flip' + type, !activeObject['flip' + type]).setCoords()
this.canvas.c.requestRenderAll()
}
}
}
</script>
<style scoped lang="less">
/deep/ .ivu-btn[disabled]{
svg{ opacity: 0.2;}
}
</style>

69
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/group.vue

@ -1,69 +0,0 @@
<!--
* @Author: 秦少卫
* @Date: 2022-09-03 19:16:55
* @LastEditors: 秦少卫
* @LastEditTime: 2022-12-07 13:34:56
* @Description: 组合与拆分组合
-->
<template>
<ButtonGroup size="small">
<!-- 组合按钮 多选时不可用 -->
<Button :disabled="!isMultiple" @click="group"><svg t="1650848913991" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="17131" width="14" height="14"><path d="M341.333333 341.333333 341.333333 512 554.666667 512 554.666667 341.333333 341.333333 341.333333M42.666667 42.666667 213.333333 42.666667 213.333333 85.333333 810.666667 85.333333 810.666667 42.666667 981.333333 42.666667 981.333333 213.333333 938.666667 213.333333 938.666667 810.666667 981.333333 810.666667 981.333333 981.333333 810.666667 981.333333 810.666667 938.666667 213.333333 938.666667 213.333333 981.333333 42.666667 981.333333 42.666667 810.666667 85.333333 810.666667 85.333333 213.333333 42.666667 213.333333 42.666667 42.666667M213.333333 810.666667 213.333333 853.333333 810.666667 853.333333 810.666667 810.666667 853.333333 810.666667 853.333333 213.333333 810.666667 213.333333 810.666667 170.666667 213.333333 170.666667 213.333333 213.333333 170.666667 213.333333 170.666667 810.666667 213.333333 810.666667M256 256 640 256 640 426.666667 768 426.666667 768 768 341.333333 768 341.333333 597.333333 256 597.333333 256 256M640 597.333333 426.666667 597.333333 426.666667 682.666667 682.666667 682.666667 682.666667 512 640 512 640 597.333333Z" p-id="17132" /></svg></Button>
<!-- 拆分组合按钮为单选且组元素时可用 -->
<Button :disabled="!isGroup" @click="unGroup"><svg t="1650848938557" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="17281" width="14" height="14"><path d="M85.333333 85.333333 256 85.333333 256 128 554.666667 128 554.666667 85.333333 725.333333 85.333333 725.333333 256 682.666667 256 682.666667 384 768 384 768 341.333333 938.666667 341.333333 938.666667 512 896 512 896 768 938.666667 768 938.666667 938.666667 768 938.666667 768 896 512 896 512 938.666667 341.333333 938.666667 341.333333 768 384 768 384 682.666667 256 682.666667 256 725.333333 85.333333 725.333333 85.333333 554.666667 128 554.666667 128 256 85.333333 256 85.333333 85.333333M768 512 768 469.333333 682.666667 469.333333 682.666667 554.666667 725.333333 554.666667 725.333333 725.333333 554.666667 725.333333 554.666667 682.666667 469.333333 682.666667 469.333333 768 512 768 512 810.666667 768 810.666667 768 768 810.666667 768 810.666667 512 768 512M554.666667 256 554.666667 213.333333 256 213.333333 256 256 213.333333 256 213.333333 554.666667 256 554.666667 256 597.333333 384 597.333333 384 512 341.333333 512 341.333333 341.333333 512 341.333333 512 384 597.333333 384 597.333333 256 554.666667 256M512 512 469.333333 512 469.333333 597.333333 554.666667 597.333333 554.666667 554.666667 597.333333 554.666667 597.333333 469.333333 512 469.333333 512 512Z" p-id="17282" /></svg></Button>
</ButtonGroup>
</template>
<script>
import select from '@/mixins/select'
import { v4 as uuid } from 'uuid'
export default {
name: 'ToolBar',
mixins: [select],
data() {
return {
}
},
computed: {
//
isGroup() {
return (this.mSelectMode === 'one' && this.mSelectOneType === 'group')
},
//
isMultiple() {
return (this.mSelectMode === 'multiple')
}
},
methods: {
//
unGroup() {
//
this.canvas.c.getActiveObject().toActiveSelection()
this.canvas.c.getActiveObject().getObjects().forEach(item => {
item.set('id', uuid())
})
this.canvas.c.discardActiveObject().renderAll()
},
group() {
//
var activeObj = this.canvas.c.getActiveObject()
var activegroup = activeObj.toGroup()
var objectsInGroup = activegroup.getObjects()
activegroup.clone((newgroup) => {
this.canvas.c.remove(activegroup)
objectsInGroup.forEach((object) => {
this.canvas.c.remove(object)
})
this.canvas.c.add(newgroup)
this.canvas.c.setActiveObject(newgroup)
})
}
}
}
</script>
<style scoped lang="less">
/deep/ .ivu-btn[disabled]{
svg{ opacity: 0.2;}
}
</style>

84
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/history.vue

@ -1,84 +0,0 @@
<!--
* @Author: 秦少卫
* @Date: 2022-09-03 19:16:55
* @LastEditors: 秦少卫
* @LastEditTime: 2023-01-07 02:09:06
* @Description: 回退重做
-->
<template>
<el-button-group size="small">
<!-- 后退 -->
<el-button :disabled="!list.length" @click="undo"><i class="el-icon-d-arrow-left" />{{ list.length }}</el-button>
<!-- 重做 -->
<el-button :disabled="!redoList.length" @click="redo"><i class="el-icon-d-arrow-right" />{{ redoList.length }}</el-button>
</el-button-group>
</template>
<script>
import select from '@/mixins/select'
import { keyNames, hotkeys } from '@/core/initHotKeys'
const maxStep = 10
export default {
name: 'ToolBar',
mixins: [select],
data() {
return {
index: 0,
redoList: [],
list: []
}
},
created() {
//
this.canvas.c.on({
'object:modified': this.save,
'selection:updated': this.save
})
hotkeys(keyNames.ctrlz, this.undo)
},
methods: {
//
save() {
const data = this.canvas.c.toJSON(['id'])
if (this.list.length > maxStep) {
this.list.shift()
}
this.list.push(data)
},
// 退
undo() {
if (this.list.length) {
const item = this.list.pop()
this.redoList.push(item)
this.renderCanvas(item)
}
},
//
redo() {
if (this.redoList.length) {
const item = this.redoList.pop()
this.list.push(item)
this.renderCanvas(item)
}
},
//
renderCanvas(data) {
this.canvas.c.clear()
this.canvas.c.loadFromJSON(data, this.canvas.c.renderAll.bind(this.canvas.c))
this.canvas.c.requestRenderAll()
}
}
}
</script>
<style scoped lang="less">
span.active {
svg.icon{
fill: #2d8cf0;
}
}
</style>

76
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importImg.vue

@ -1,76 +0,0 @@
<!--
* @Author: 秦少卫
* @Date: 2022-09-03 19:16:55
* @LastEditors: 秦少卫
* @LastEditTime: 2022-09-05 22:33:57
* @Description: 插入图片
-->
<template>
<div style="display: inline-block">
<Button size="small" @click="insert">插入图片</Button>
<Modal
v-model="showModal"
title="请选择"
:z-index="9999"
@on-ok="insertImgFile"
@on-cancel="showModal = false,imgFile = null "
>
<Upload :before-upload="handleUpload" action="#">
<Button icon="ios-cloud-upload-outline">选择图片文件</Button>
</Upload>
</Modal>
</div>
</template>
<script>
import select from '@/mixins/select'
import { getImgStr } from '@/utils/utils'
import { v4 as uuid } from 'uuid'
export default {
name: 'ToolBar',
mixins: [select],
data() {
return {
showModal: false,
imgFile: null
}
},
methods: {
insert() {
this.imgFile = ''
this.showModal = true
},
insertImgFile() {
const imgEl = document.createElement('img')
imgEl.src = this.imgFile
//
document.body.appendChild(imgEl)
imgEl.onload = () => {
//
const imgInstance = new this.fabric.Image(imgEl, {
id: uuid(),
name: '图片1',
left: 100, top: 100
})
//
imgInstance.scale(0.2)
this.canvas.c.add(imgInstance)
this.canvas.c.setActiveObject(imgInstance)
this.canvas.c.renderAll()
//
imgEl.remove()
}
},
//
handleUpload(file) {
getImgStr(file).then(res => {
this.imgFile = res
})
}
}
}
</script>
<style scoped lang="less">
</style>

66
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importJSON.vue

@ -1,66 +0,0 @@
<!--
* @Author: 秦少卫
* @Date: 2022-09-03 19:16:55
* @LastEditors: 秦少卫
* @LastEditTime: 2023-01-07 02:19:24
* @Description: 导入JSON文件
-->
<template>
<div style="display: inline-block">
<Button size="small" @click="insert">导入文件</Button>
<Modal
v-model="showModal"
title="请选择"
:z-index="9999"
@on-ok="insertSvgFile"
@on-cancel="(showModal = false), (jsonFile = null)"
>
<Upload :before-upload="handleUpload" action="#">
<Button icon="ios-cloud-upload-outline">选择JSON文件</Button>
</Upload>
</Modal>
</div>
</template>
<script>
import select from '@/mixins/select'
import { downFontByJSON } from '@/utils/utils'
export default {
name: 'ToolBar',
mixins: [select],
data() {
return {
showModal: false,
jsonFile: null
}
},
methods: {
insert() {
this.svg = ''
this.showModal = true
},
insertSvgFile() {
if (!this.jsonFile) {
this.$Message.error('请选择文件')
return
}
//
downFontByJSON(this.jsonFile).then(() => {
this.canvas.c.loadFromJSON(this.jsonFile, this.canvas.c.renderAll.bind(this.canvas.c))
})
},
handleUpload(file) {
const reader = new FileReader()
reader.readAsText(file, 'UTF-8')
reader.onload = () => {
this.jsonFile = reader.result
}
return false
}
}
}
</script>
<style scoped lang="less">
</style>

87
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importSvg.vue

@ -1,87 +0,0 @@
<!--
* @Author: 秦少卫
* @Date: 2022-09-03 19:16:55
* @LastEditors: 秦少卫
* @LastEditTime: 2022-09-05 22:36:02
* @Description: 插入SVG元素
-->
<template>
<div style="display:inline-block">
<Button size="small" @click="insert">插入SVG元素</Button>
<Modal
v-model="showModal"
title="请选择"
:z-index="9999"
@on-ok="insertSvg"
@on-cancel="showModal = false"
>
<RadioGroup v-model="insertType" type="button" button-style="solid" style="padding-bottom: 10px">
<Radio label="string">字符串</Radio>
<Radio label="file">文件</Radio>
</RadioGroup>
<!-- 字符串 -->
<Input v-if="insertType === 'string'" v-model="svgStr" show-word-limit type="textarea" placeholder="请输入SVG字符" />
<!-- 文件 -->
<Upload v-if="insertType === 'file'" :before-upload="handleUpload" action="#">
<Button icon="ios-cloud-upload-outline">选择SVG文件</Button>
</Upload>
</Modal>
</div>
</template>
<script>
import { getImgStr } from '@/utils/utils'
import select from '@/mixins/select'
import { v4 as uuid } from 'uuid'
export default {
name: 'ToolBar',
mixins: [select],
data() {
return {
insertType: 'string', // file | string
showModal: false,
svgStr: '',
svgFile: null
}
},
methods: {
insert() {
this.svgStr = ''
this.svgFile = null
this.showModal = true
},
insertSvg() {
if (this.insertType === 'string') {
this.insertSvgStr()
} else {
this.insertSvgFile()
}
},
//
insertSvgStr() {
const This = this
this.fabric.loadSVGFromString(this.svgStr, function(objects, options) {
const item = This.fabric.util.groupSVGElements(objects, { ...options, name: 'defaultSVG', id: uuid() })
This.canvas.c.add(item).centerObject(item).renderAll()
})
},
//
insertSvgFile() {
const This = this
this.fabric.loadSVGFromURL(this.svgFile, function(objects, options) {
const item = This.fabric.util.groupSVGElements(objects, { ...options, name: 'defaultSVG', id: uuid() })
This.canvas.c.add(item).centerObject(item).renderAll()
})
},
handleUpload(file) {
getImgStr(file).then(res => {
this.svgFile = res
})
}
}
}
</script>
<style scoped lang="less">
</style>

101
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/importTmpl.vue

@ -1,101 +0,0 @@
<!--
* @Author: 秦少卫
* @Date: 2022-09-03 19:16:55
* @LastEditors: 秦少卫
* @LastEditTime: 2022-09-07 00:17:35
* @Description: 导入模板
-->
<template>
<div style="display:inline-block">
<div plain orientation="left">标题模板</div>
<div v-for="(item, i) in list" :key="i + '-bai1-button'" :content="item.label" placement="top">
<img class="tmpl-img" :alt="item.label" :src="item.src" @click="getTempData(item.tempUrl)">
</div>
<!-- <Divider plain orientation="left">形状模板</Divider> -->
</div>
</template>
<script>
import select from '@/mixins/select'
import { downFontByJSON } from '@/utils/utils'
// import { Tooltip, Divider } from 'view-design'
export default {
name: 'ToolBar',
components: {
// Tooltip, Divider
},
mixins: [select],
data() {
return {
jsonFile: null,
list: [
{
label: '笔记模板',
tempUrl: './template/073606d4-22de-491b-8b51-b90d72101d89.json',
src: './template/073606d4-22de-491b-8b51-b90d72101d89.png'
},
{
label: '醒目封面',
tempUrl: './template/dcebee41-59b5-408b-a65a-c51bc390be3d.json',
src: './template/dcebee41-59b5-408b-a65a-c51bc390be3d.png'
},
{
label: '教师节',
tempUrl: './template/3a7471f2-b8cf-4939-ad1a-a7d586768640.json',
src: './template/3a7471f2-b8cf-4939-ad1a-a7d586768640.png'
},
{
label: '升职锦囊',
tempUrl: './template/ef5eb884-28e0-4d79-9e98-a73d759541f8.json',
src: './template/ef5eb884-28e0-4d79-9e98-a73d759541f8.png'
},
{
label: '古风模板',
tempUrl: './template/ecc3fca2-f66e-465e-b2c7-80b7522fdb3b.json',
src: './template/ecc3fca2-f66e-465e-b2c7-80b7522fdb3b.png'
}
]
}
},
methods: {
//
insertSvgFile() {
this.$Spin.show({
render: (h) => {
return h('div', '正在加载字体,您耐心等候...')
}
})
downFontByJSON(this.jsonFile).then(() => {
this.$Spin.hide()
this.canvas.c.loadFromJSON(this.jsonFile, this.canvas.c.renderAll.bind(this.canvas.c))
}).catch((e) => {
this.$Spin.hide()
this.$Message.error('字体加载失败,请重试')
})
},
//
getTempData(tmplUrl) {
this.$Spin.show({
render: (h) => {
return h('div', '加载数据中...')
}
})
const getTemp = this.$http.get(tmplUrl)
getTemp.then(res => {
this.jsonFile = JSON.stringify(res.data)
this.insertSvgFile()
})
}
}
}
</script>
<style scoped lang="less">
.tmpl-img{
width: 77px;
cursor: pointer;
margin-right: 5px;
}
</style>

213
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/layer.vue

File diff suppressed because one or more lines are too long

81
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/lock.vue

@ -1,81 +0,0 @@
<!--
* @Author: 秦少卫
* @Date: 2022-09-03 19:16:55
* @LastEditors: 秦少卫
* @LastEditTime: 2022-12-07 23:55:56
* @Description: 锁定元素
-->
<template>
<i-switch v-if="mSelectMode === 'one'" v-model="isLock" @on-change="doLock">
<Icon slot="open" type="md-lock" />
<Icon slot="close" type="md-unlock" />
</i-switch>
</template>
<script>
import select from '@/mixins/select'
const lockAttrs = ['lockMovementX', 'lockMovementY', 'lockRotation', 'lockScalingX', 'lockScalingY']
export default {
name: 'ToolBar',
mixins: [select],
data() {
return {
isLock: false
}
},
created() {
this.event.on('selectOne', (items) => {
this.isLock = !items[0].hasControls
this.mSelectActive = items[0]
})
},
methods: {
doLock(isLock) {
isLock ? this.lock() : this.unLock()
},
lock() {
//
this.mSelectActive.hasControls = false
//
lockAttrs.forEach(key => {
this.mSelectActive[key] = true
})
this.mSelectActive.selectable = false
this.isLock = true
this.canvas.c.renderAll()
},
unLock() {
//
this.mSelectActive.hasControls = true
//
lockAttrs.forEach(key => {
this.mSelectActive[key] = false
})
this.mSelectActive.selectable = true
this.isLock = false
this.canvas.c.renderAll()
}
}
}
</script>
<style scoped lang="less">
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>

40
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/save.vue

@ -1,40 +0,0 @@
<template>
<div class="save-box">
<el-button type="warning" style="margin-left: 10px" size="small" @click="clear">清空</el-button>
<el-button type="primary" size="small" @click="saveWith">保存</el-button>
</div>
</template>
<script>
import select from '@/mixins/select'
import { v4 as uuid } from 'uuid'
import eventBus from '@/page-subspecialty/utils/eventBus'
export default {
name: 'SaveBar',
mixins: [select],
data() {
return {
}
},
methods: {
saveWith() {
this.$emit('fullImgBack', this.canvas.c.toDataURL())
},
clear() {
this.canvas.c.clear()
eventBus.$emit('clearCanvas')
this.canvas.c.setBackgroundColor('#ffffff', this.canvas.c.renderAll.bind(this.canvas.c))
},
close() {
this.$emit('closeDialog')
}
}
}
</script>
<style scoped lang="less">
.save-box{
display: inline-block;
padding-right: 10px;
}
</style>

93
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/setSize.vue

@ -1,93 +0,0 @@
<!--
* @Author: 秦少卫
* @Date: 2022-09-03 19:16:55
* @LastEditors: 秦少卫
* @LastEditTime: 2022-09-04 00:21:58
* @Description: 尺寸设置
-->
<template>
<div>
<el-divider plain orientation="left">尺寸</el-divider>
<div>
宽度
<el-input-number id="numberInput" v-model="width" :max="2000" :min="1" size="small" @change="setSize" />
</div>
<div style="margin-top: 10px">
高度
<el-input-number id="numberInput" v-model="height" :max="2000" :min="1" size="small" @change="setSize" />
</div>
<!-- <el-divider plain orientation="left">预设尺寸</el-divider>-->
<!-- <el-button-group vertical>-->
<!-- <el-button-->
<!-- v-for="(item, i) in presetSize"-->
<!-- :key="i + 'presetSize'"-->
<!-- size="small"-->
<!-- style="text-align:left;margin-bottom: 5px"-->
<!-- @click="setSizeBy(item.width * item.scale, item.height * item.scale)"-->
<!-- >-->
<!-- {{ item.label }}:{{ item.width }}x{{ item.height }}*{{ item.scale }}-->
<!-- </el-button>-->
<!-- </el-button-group>-->
</div>
</template>
<script>
export default {
name: 'CanvasSize',
inject: ['canvas', 'fabric'],
data() {
return {
width: 320 * 2.5,
height: 320 * 2.5,
presetSize: [{
label: '红书竖版',
width: 900,
height: 1200,
scale: 0.5
},
{
label: '红书横版',
width: 1200,
height: 900,
scale: 0.5
},
{
label: '手机壁纸',
width: 1080,
height: 1920,
scale: 0.4
}
]
}
},
created() {
this.setSize()
},
methods: {
setSizeBy(width, height) {
this.canvas.c.setWidth(width)
this.canvas.c.setHeight(height)
this.canvas.c.renderAll()
this.width = width
this.height = height
},
setSize() {
this.canvas.c.setWidth(this.width)
this.canvas.c.setHeight(this.height)
this.canvas.c.renderAll()
}
}
}
</script>
<style lang="less" scoped>
::v-deep .el-divider__text{
background: #29292a !important;
color: #fff;
}
#numberInput{
::v-deep .el-input__inner{
height: 30px !important;
}
}
</style>

143
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/svgEl.vue

@ -1,143 +0,0 @@
<!--
* @Author: 秦少卫
* @Date: 2022-09-03 19:16:55
* @LastEditors: 秦少卫
* @LastEditTime: 2023-01-17 19:45:19
* @Description: 素材面板
-->
<template>
<div>
<Divider plain orientation="left">卡通</Divider>
<div class="box">
<img v-for="(item) in getIndex(460, 489)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem($event,item)">
<!-- <div v-for="(item) in getIndex(460, 489)" :key="item">{{ `./svg/${item}.svg` }}</div> -->
</div>
<Divider plain orientation="left">卡通水果</Divider>
<div class="box">
<img v-for="(item) in getIndex(386, 409)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">体育</Divider>
<div class="box">
<img v-for="(item) in getIndex(410, 459)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">秋天</Divider>
<div class="box">
<img v-for="(item) in getIndex(40, 49)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">计算机</Divider>
<div class="box">
<img v-for="(item) in getIndex(50, 75)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">卡通水果</Divider>
<div class="box">
<img v-for="(item) in getIndex(76, 89)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">服饰</Divider>
<div class="box">
<img v-for="(item) in getIndex(89, 136)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">旗子</Divider>
<div class="box">
<img v-for="(item) in getIndex(137, 151)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">树木</Divider>
<div class="box">
<img v-for="(item) in getIndex(152, 181)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">食物</Divider>
<div class="box">
<img v-for="(item) in getIndex(182, 201)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">服饰</Divider>
<div class="box">
<img v-for="(item) in getIndex(202, 222)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">奖牌</Divider>
<div class="box">
<img v-for="(item) in getIndex(223, 252)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">商务</Divider>
<div class="box">
<img v-for="(item) in getIndex(253, 261)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">活动</Divider>
<div class="box">
<img v-for="(item) in getIndex(262, 270)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">卡通水果</Divider>
<div class="box">
<img v-for="(item) in getIndex(271, 300)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">复古</Divider>
<div class="box">
<img v-for="(item) in getIndex(301, 350)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">卡通</Divider>
<div class="box">
<img v-for="(item) in getIndex(351, 385)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">动物</Divider>
<div class="box">
<img v-for="(item) in getIndex(490, 519)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
<Divider plain orientation="left">手绘</Divider>
<div class="box">
<img v-for="(item) in getIndex(0, 39)" :key="item" v-lazy="`./svg/${item}.svg`" alt="" @click="addItem">
</div>
</div>
</template>
<script>
import { v4 as uuid } from 'uuid'
const defaultPosition = {
left: 100, top: 100, shadow: '', fontFamily: '1-1'
}
export default {
name: 'ToolBar',
inject: ['canvas', 'fabric'],
data() {
return {
arr: []
}
},
created() {
},
methods: {
getIndex(start, end) {
const arr = Array(end - (start - 1)).fill('')
// console.log(arr.map((item, i) => (i + start)));
return arr.map((item, i) => (i + start))
},
//
addItem(e, item) {
const url = e.target.src
// console.log(item)
this.fabric.loadSVGFromURL(url, (objects, options) => {
var item = this.fabric.util.groupSVGElements(objects, { ...options, ...defaultPosition,
id: uuid(),
name: 'svg元素'
})
this.canvas.c.add(item)
this.canvas.c.renderAll()
})
}
}
}
</script>
<style scoped lang="less">
img {
display: inline-block;
width: 53px;
margin-left: 2px;
margin-bottom: 2px;
background: #F5F5F5;
padding: 6px;
cursor: pointer;
}
</style>

15
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/svgIcon/index.js

@ -1,15 +0,0 @@
/*
* @Author: 秦少卫
* @Date: 2022-04-20 17:13:36
* @LastEditors: 秦少卫
* @LastEditTime: 2022-04-20 17:19:46
* @Description: file content
*/
import svgIcon from './index.vue'
export default {
install(Vue) {
Vue.component(svgIcon.name, svgIcon)
}
}

51
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/svgIcon/index.vue

@ -1,51 +0,0 @@
<template>
<span>
<svg
t="1650443094178"
viewBox="0 0 1024 1024"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
p-id="1549"
:width="size"
:height="size"
:fill="color"
>
<!-- -->
<template v-if="name === 'default'">
<path d="M252.76928 299.904l146.2784 0 0 472.42752-146.2784 0 0-472.42752Z" p-id="1550" /><path d="M477.48096 85.34528l70.87104 0 0 885.80608-70.87104 0 0-885.80608Z" p-id="1551" /><path d="M629.80096 284.8l31.0016 0 0 502.88128-31.0016 0L629.80096 284.8zM776.42752 284.8l31.0016 0 0 502.88128-31.0016 0L776.42752 284.8zM657.09056 315.8016l0-31.0016 123.04896 0 0 31.0016L657.09056 315.8016zM657.27488 787.64544l0-31.0016 123.04896 0 0 31.0016L657.27488 787.64544z" p-id="1552" />
</template>
<!-- up -->
<template v-if="name === 'up'">
<path d="M876.2 434.3L536.7 94.9c-6.6-6.6-15.5-10.3-24.7-10.3-9.3 0-18.2 3.7-24.7 10.3L147.8 434.3c-13.7 13.7-13.7 35.8 0 49.5 13.7 13.7 35.8 13.7 49.5 0L477 204.1v700.2c0 19.3 15.7 35 35 35s35-15.7 35-35V204.1l279.7 279.7c6.8 6.8 15.8 10.3 24.7 10.3s17.9-3.4 24.7-10.3c13.7-13.7 13.7-35.8 0.1-49.5z" p-id="1800" />
</template>
</svg>
</span>
</template>
<script>
export default {
name: 'SvgIcon',
props: {
name: {
type: String,
default: 'default'
},
color: {
type: String,
default: '#ea9518'
},
size: {
type: Number,
default: 14
}
},
data() {
return {}
},
methods: {}
}
</script>
<style scoped lang="less">
</style>

246
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/tools.vue

File diff suppressed because one or more lines are too long

70
src/page-subspecialty/views/modules/imgEditorFabric/img-editor/zoom.vue

@ -1,70 +0,0 @@
<!--
* @Author: 秦少卫
* @Date: 2022-04-21 20:20:20
* @LastEditors: 秦少卫
* @LastEditTime: 2022-04-25 10:32:58
* @Description: file content
-->
<template>
<ButtonGroup class="zoom">
<Button icon="el-icon-zoom-in" size="medium" @click="big">放大</Button>
<Button icon="el-icon-zoom-out" size="medium" @click="small">缩小</Button>
<Button size="medium" @click="rSet">还原</Button>
</ButtonGroup>
</template>
<script>
import select from '@/mixins/select'
import { ButtonGroup, Button } from 'element-ui'
export default {
name: 'ToolBar',
components: {
ButtonGroup,
Button
},
mixins: [select],
data() {
return {
zoom: 0
}
},
computed: {
unShow() {
return (this.mSelectMode === 'one' && this.mSelectOneType === 'group')
},
createShow() {
return (this.mSelectMode === 'multiple')
}
},
methods: {
rSet() {
this.canvas.c.zoomToPoint(
new this.fabric.Point(this.canvas.c.getWidth() / 2, this.canvas.c.getHeight() / 2), 1
)
this.zoom = `${Math.round(100)}%`
},
big() {
let zoomRatio = this.canvas.c.getZoom()
zoomRatio += 0.05
this.canvas.c.zoomToPoint(
new this.fabric.Point(this.canvas.c.getWidth() / 2, this.canvas.c.getHeight() / 2), zoomRatio
)
this.zoom = `${Math.round(zoomRatio * 100)}%`
},
small() {
let zoomRatio = this.canvas.c.getZoom()
zoomRatio -= 0.05
this.canvas.c.zoomToPoint(
new this.fabric.Point(this.canvas.c.getWidth() / 2, this.canvas.c.getHeight() / 2), zoomRatio
)
this.zoom = `${Math.round(zoomRatio * 100)}%`
}
}
}
</script>
<style scoped lang="less">
.zoom{
margin: 10px;
}
</style>

468
src/page-subspecialty/views/modules/imgEditorFabric/index.vue

@ -1,468 +0,0 @@
<template>
<div class="home">
<div>
<div v-if="show" class="img_header">
<div style="font-size: 20px; font-weight: bold">眼底绘图 {{ isOdOrOs }}</div>
<div>
<save @fullImgBack="fullImgBack" />
<el-button size="small" @click="closeDialog">关闭</el-button>
</div>
</div>
<div style=" display: flex; height: calc(100vh - 70px);">
<div style="width: 380px; height: 100%; background:#fff; display: flex">
<el-tabs v-model="menuActive" tab-position="left">
<el-tab-pane label="元素" name="1" />
<el-tab-pane label="背景" name="2" />
<el-tab-pane label="画笔" name="3" />
</el-tabs>
<div class="content">
<template v-if="show">
<div v-show="menuActive === '1'" class="left-panel">
<tools />
</div>
<!-- 背景设置 -->
<div v-show="menuActive === '2'" class="left-panel">
<set-size />
<bg-bar ref="bgBar" :is-od-or-os="isOdOrOs" />
</div>
</template>
<!-- 画笔设置 -->
<div v-show="menuActive === '3'" class="left-panel">
<div style="display: inline-block">
<el-button type="primary" class="btn btn-info" size="small" @click="changeDrawing">{{ controlBtn }}</el-button>
<div v-if="controlDrawing">
<div class="drawing_item" style="display: flex">
<span for="drawing-mode-selector">风格:</span>
<el-select id="drawing-mode-selector" v-model="model" class="modeStyle" style="flex: 1" @change="changeModel">
<el-option :value="'铅笔'">铅笔</el-option>
<el-option :value="'圆点'">圆点</el-option>
</el-select>
</div>
<div class="drawing_item">
<div for="drawing-line-width">线条宽度:<span class="info">{{ lineWidth }}</span></div>
<el-slider v-model="lineWidth" :min="0" :max="150" @change="changeLineWidth" />
</div>
<div class="drawing_item" style="display: flex;align-items: center">
<div>线条颜色:</div>
<el-color-picker v-model="lineColor" @change="changeColor" />
</div>
<div id="eraser-btn" class="drawing_item" style="display: flex;align-items: center">
<div>橡皮擦: </div>
<el-button size="mini" type="text" style="font-size: 16px;margin-left: 4px" @click="setEarser">橡皮擦</el-button>
<!-- <span @click="setUndoErasing">恢复擦拭</span>-->
</div>
<div class="drawing_item" style="display: flex;align-items: center">
<div>画笔: </div>
<el-button size="mini" type="text" style="font-size: 16px;margin-left: 4px" @click="changeModel('圆点')">画笔</el-button>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 画布区域 -->
<div style="width: 100%;position: relative; background:#F1F1F1;">
<div class="canvas-box">
<canvas id="canvas" />
</div>
<zoom />
</div>
<!-- 属性区域 -->
<div class="rightTools">
<layer v-if="show" />
</div>
</div>
</div>
</div>
</template>
<script>
//
import save from '@/page-subspecialty/views/modules/imgEditorFabric/img-editor/save.vue'
import zoom from '@/page-subspecialty/views/modules/imgEditorFabric/img-editor/zoom.vue'
//
import tools from '@/page-subspecialty/views/modules/imgEditorFabric/img-editor/tools.vue'
import bgBar from '@/page-subspecialty/views/modules/imgEditorFabric/img-editor/bgBar.vue'
import setSize from '@/page-subspecialty/views/modules/imgEditorFabric/img-editor/setSize.vue'
import brush from '@/page-subspecialty/views/modules/imgEditorFabric/img-editor/brush.vue'
//
import layer from '@/page-subspecialty/views/modules/imgEditorFabric/img-editor/layer.vue'
//
import EventHandle from '@/utils/eventHandler'
import { fabric } from 'fabric'
import 'fabric/src/mixins/eraser_brush.mixin'
// 线
import initAligningGuidelines from '@/core/initAligningGuidelines'
import initHotkeys from '@/core/initHotKeys'
import initControls from '@/core/initControls'
// import { changeColor } from 'view-design/src/components/color-picker/utils'
const event = new EventHandle()
const canvas = {}
export default {
name: 'HomeView',
components: {
zoom,
save,
tools,
bgBar,
setSize,
brush,
layer
},
props: {
isOdOrOs: {
type: String
}
},
provide: {
canvas,
fabric,
event
},
data() {
return {
menuActive: '3',
show: false,
select: null,
model: '圆点',
controlBtn: '取消绘图模式',
controlDrawing: true,
lineWidth: 30,
lineColor: '#FF0000'
}
},
watch: {
menuActive(value) {
if (value !== '3') {
this.canvas.isDrawingMode = false
} else {
this.canvas.isDrawingMode = true
}
console.log(this.canvas.isDrawingMode)
}
},
mounted() {
this.canvas = canvas.c = new fabric.Canvas('canvas', {
isDrawingMode: true
})
// console.log(this.canvas)
this.canvas.set('backgroundColor', '#fff')
this.show = true
event.init(canvas.c)
initAligningGuidelines(canvas.c)
initHotkeys(canvas.c)
initControls(canvas.c)
this.$nextTick(() => {
this.setBrush()
this.changeModel('圆点')
})
},
methods: {
changeColor(value) {
var brush = this.canvas.freeDrawingBrush
brush.color = this.lineColor
if (brush.getPatternSrc) {
brush.source = brush.getPatternSrc.call(brush)
}
},
fullImgBack(value) {
this.$emit('fullImgBack', value)
},
closeDialog() {
this.$emit('closeDialog')
},
//
changeModel(value, canvas = this.canvas) {
var $ = function(id) { return document.getElementById(id) }
const that = this
if (fabric.PatternBrush) {
var vLinePatternBrush = new fabric.PatternBrush(canvas)
vLinePatternBrush.getPatternSrc = function() {
var patternCanvas = fabric.document.createElement('canvas')
patternCanvas.width = patternCanvas.height = 10
var ctx = patternCanvas.getContext('2d')
ctx.strokeStyle = this.color
ctx.lineWidth = 5
ctx.beginPath()
ctx.moveTo(0, 5)
ctx.lineTo(10, 5)
ctx.closePath()
ctx.stroke()
return patternCanvas
}
var hLinePatternBrush = new fabric.PatternBrush(canvas)
hLinePatternBrush.getPatternSrc = function() {
var patternCanvas = fabric.document.createElement('canvas')
patternCanvas.width = patternCanvas.height = 10
var ctx = patternCanvas.getContext('2d')
ctx.strokeStyle = this.color
ctx.lineWidth = 5
ctx.beginPath()
ctx.moveTo(5, 0)
ctx.lineTo(5, 10)
ctx.closePath()
ctx.stroke()
return patternCanvas
}
var squarePatternBrush = new fabric.PatternBrush(canvas)
squarePatternBrush.getPatternSrc = function() {
var squareWidth = 10; var squareDistance = 2
var patternCanvas = fabric.document.createElement('canvas')
patternCanvas.width = patternCanvas.height = squareWidth + squareDistance
var ctx = patternCanvas.getContext('2d')
ctx.fillStyle = this.color
ctx.fillRect(0, 0, squareWidth, squareWidth)
return patternCanvas
}
var diamondPatternBrush = new fabric.PatternBrush(canvas)
diamondPatternBrush.getPatternSrc = function() {
var squareWidth = 10; var squareDistance = 5
var patternCanvas = fabric.document.createElement('canvas')
var rect = new fabric.Rect({
width: squareWidth,
height: squareWidth,
angle: 45,
fill: this.color
})
var canvasWidth = rect.getBoundingRect().width
patternCanvas.width = patternCanvas.height = canvasWidth + squareDistance
rect.set({ left: canvasWidth / 2, top: canvasWidth / 2 })
var ctx = patternCanvas.getContext('2d')
rect.render(ctx)
return patternCanvas
}
var PatternBrush = new fabric.PatternBrush(canvas)
PatternBrush.getPatternSrc = function() {
var dotWidth = 10
var dotDistance = 5
var patternCanvas = fabric.document.createElement('canvas')
var patternCtx = patternCanvas.getContext('2d')
patternCanvas.width = patternCanvas.height = dotWidth + dotDistance
patternCtx.fillStyle = this.color
patternCtx.beginPath()
patternCtx.arc(dotWidth / 2, dotWidth / 2, dotWidth / 2, 0, Math.PI * 2, false)
patternCtx.closePath()
patternCtx.fill()
return patternCanvas
}
var img = new Image()
img.src = '../assets/honey_im_subtle.png'
var texturePatternBrush = new fabric.PatternBrush(canvas)
texturePatternBrush.source = img
}
if (value === 'hline') {
canvas.freeDrawingBrush = vLinePatternBrush
} else if (value === 'vline') {
canvas.freeDrawingBrush = hLinePatternBrush
} else if (value === 'square') {
canvas.freeDrawingBrush = squarePatternBrush
} else if (value === '钻石') {
canvas.freeDrawingBrush = diamondPatternBrush
} else if (value === 'texture') {
canvas.freeDrawingBrush = texturePatternBrush
} else if (value === '圆点') {
canvas.freeDrawingBrush = PatternBrush
} else if (value === '铅笔') {
const text = 'Pencil'
canvas.freeDrawingBrush = new fabric[text + 'Brush'](canvas)
}
if (canvas.freeDrawingBrush) {
var brush = canvas.freeDrawingBrush
brush.color = that.lineColor
if (brush.getPatternSrc) {
brush.source = brush.getPatternSrc.call(brush)
}
brush.width = parseInt(this.lineWidth, 10) || 1
}
},
setEarser() {
this.canvas.isDrawingMode = true //
//
this.canvas.freeDrawingBrush = new fabric.EraserBrush(this.canvas)
this.canvas.freeDrawingBrush.color = 'rgba(0,0,0,0)' //
this.canvas.freeDrawingBrush.width = 30 //
},
setUndoErasing() {
this.canvas.isDrawingMode = true
this.canvas.freeDrawingBrush = new fabric.EraserBrush(this.canvas)
this.canvas.freeDrawingBrush.width = 10
this.canvas.freeDrawingBrush.inverted = true //
},
//
changeDrawing() {
this.canvas.isDrawingMode = !this.canvas.isDrawingMode
if (this.canvas.isDrawingMode) {
this.controlBtn = '取消绘图模式'
this.controlDrawing = true
} else {
this.controlBtn = '开启绘图模式'
this.controlDrawing = false
}
},
// 线
changeLineWidth(value) {
this.lineWidth = value
this.canvas.freeDrawingBrush.width = parseInt(this.lineWidth, 10) || 1
},
setBrush() {
var $ = function(id) { return document.getElementById(id) }
var canvas = this.canvas
fabric.Object.prototype.transparentCorners = false
if (canvas.freeDrawingBrush) {
canvas.freeDrawingBrush.color = this.lineColor
canvas.freeDrawingBrush.source = canvas.freeDrawingBrush.getPatternSrc && canvas.freeDrawingBrush.getPatternSrc.call(this)
canvas.freeDrawingBrush.width = parseInt(this.lineWidth, 10) || 1
}
var mainScriptEl = document.getElementById('main')
if (!mainScriptEl) return
var preEl = document.createElement('pre')
var codeEl = document.createElement('code')
codeEl.innerHTML = mainScriptEl.innerHTML
codeEl.className = 'language-javascript'
preEl.appendChild(codeEl)
document.getElementById('bd-wrapper').appendChild(preEl)
window.addEventListener('load', function() {
var canvas = this.canvas
var canvases = this.__canvases || this.canvases
canvas && canvas.calcOffset && canvas.calcOffset()
if (canvases && canvases.length) {
for (var i = 0, len = canvases.length; i < len; i++) {
canvases[i].calcOffset()
}
}
})
}
}
}
</script>
<style lang="scss" scoped>
.toolStyle{
flex: 1;
margin-left: 10px;
background: none;
::v-deep .el-input__inner{
border: 0 !important;
background-color: #29292a !important;
}
}
.modeStyle{
margin-left:10px;
::v-deep .el-input__inner{
border-radius: 5px;
overflow: hidden !important;
}
}
input{
margin-right: 5px;
}
::v-deep .el-tabs--left{
background: #151515;
color: #fff;
}
::v-deep .el-tabs__nav-wrap.is-right::after{
background: #151515;
}
::v-deep .el-tabs__item{
color: #fff;
}
::v-deep .el-tabs__item.is-active{
color: #409EFF;
}
::v-deep .el-tabs__nav-wrap.is-left::after{
background: #151515 !important;
}
::v-deep .ivu-layout-header {
padding: 0 10px;
}
.home,.ivu-layout{
height: calc( 100vh - 30px );
}
.img_header{
padding: 10px;
display: flex;
justify-content: space-between;
align-items: center;
background: #515a6e;
color: #fff;
}
.info{
margin-left: 10px;
}
.icon{
display: block;
}
.rightTools{
width: 380px;
height: 100%;
padding:10px;
overflow-y: auto;
background:#fff;
background: #29292a;
}
.canvas-box{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
#canvas{
width: 300px;
height: 300px;
margin: 0 auto;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAHUlEQVQ4jWNgYGAQIYAJglEDhoUBg9+FowbQ2gAARjwKARjtnN8AAAAASUVORK5CYII=");
background-size: 30px 30px;
}
.left-panel{
padding: 10px;
}
.drawing_item{
margin: 10px 0;
font-size: 16px;
}
.content{
background: #29292a;
color: #fff;
flex: 1;
width: 200px;
padding:10px;
padding-top: 0;
height: 100%;
overflow-y: auto;
}
::v-deep .el-color-picker__trigger{
border: 0;
margin-left: 10px;
}
</style>

3
src/page-subspecialty/views/modules/nurseManagement/index.vue

@ -1,3 +0,0 @@
<template>
<router-view />
</template>

3
src/page-subspecialty/views/modules/nurseManagement/reservation/index.vue

@ -1,3 +0,0 @@
<template>
<router-view />
</template>

353
src/page-subspecialty/views/modules/nurseManagement/reservation/schedule/addPatientOrder.vue

@ -1,353 +0,0 @@
<template>
<el-dialog top="30px" class="number-manage" append-to-body :visible.sync="visible" width="50%" :title="title" :before-close="closeDialog">
<el-form ref="addPatientForm" :rules="dataRule" size="small" :model="form" label-width="90px">
<el-form-item required label="选择患者:" prop="patientId">
<el-input v-model="form.patientId" :readonly="isEdit" suffix-icon="el-icon-search" placeholder="请输入登记号" @change="searchPatient" />
</el-form-item>
<div v-if="patientInfo" class="patientDetail">
<div style="font-size: 16px;font-weight: bold">患者信息</div>
<div class="detailItem">
<div>登记号{{ patientInfo.patientId }}</div>
<div>电话{{ patientInfo.patientPhone }}</div>
</div>
<div class="detailItem">
<div>姓名{{ patientInfo.patientName }}</div>
<div>性别{{ patientInfo.patientSex }}</div>
<div>生日{{ $moment(patientInfo.patientBirthday).format('YYYY-MM-DD') }}</div>
<div v-if="patientInfo.patientAge">年龄{{ patientInfo.patientAge }}</div>
<div v-if="patientInfo.source">来源{{ patientInfo.source }}</div>
</div>
</div>
<el-form-item label="负责医生:">
<el-col :span="10">
<el-select v-model="form.doctorId" placeholder="请选择" @change="selectDoctor">
<el-option
v-for="item in doctorList"
:key="item.employeeId"
:label="item.realName"
:value="item.employeeId"
/>
</el-select>
</el-col>
<el-col :span="11" style="display: flex;align-items: center">
<span style="margin-right: 6px;margin-bottom: 3px">来源:</span>
<el-radio-group v-model="form.source">
<el-radio label="门诊" />
<el-radio label="住院" />
<el-radio label="会诊" />
</el-radio-group>
</el-col>
</el-form-item>
<el-form-item label="备注:">
<el-input v-model="form.remark" type="textarea" maxlength="75" :autosize="{ minRows: 3, maxRows: 3}" show-word-limit />
</el-form-item>
<div style="display: flex;padding:0 0 20px 0">
<el-col :span="10" style="display: flex;align-items: center">
<div class="addLabel">眼别:</div>
<el-radio v-model="form.eyeType" label="OD">OD
</el-radio>
<el-radio v-model="form.eyeType" label="OS">OS
</el-radio>
<el-radio v-model="form.eyeType" label="OU">OU
</el-radio>
</el-col>
</div>
<div style="display: flex;padding:0 0 20px 0px">
<el-col :span="24" style="display: flex;align-items: center">
<div class="addLabel">项目:</div>
<el-checkbox-group v-model="form.project">
<el-checkbox v-for="(item,index) in projectList" :key="index" :label="item" />
<el-checkbox label="其他" />
<el-input v-model="form.otherProject" class="otherProject" size="small" placeholder="" style="width: 125px;" />
</el-checkbox-group>
</el-col>
</div>
<div style="display: flex;padding:0 0 20px 0px">
<el-col :span="24" style="display: flex;align-items: center">
<div class="addLabel">准备工作:</div>
<el-checkbox-group v-model="form.preparation">
<el-checkbox label="激光/三面镜/造影/电生理/视功能/ubm等 医嘱已开" />
<el-checkbox label="激光/三面镜/造影/电生理/视功能/ubm等 医嘱未开" />
<el-checkbox label="散瞳" />
<el-checkbox label="表麻" />
<el-checkbox label="全身检查医嘱已开" />
<el-checkbox label="全身检查已完成" />
<el-checkbox label="缩瞳" />
</el-checkbox-group>
</el-col>
</div>
<el-form-item label="预约时间:" required>
<el-col :span="11">
<el-form-item prop="date1">
<el-date-picker v-model="form.date1" value-format="yyyy-MM-dd" type="date" placeholder="选择日期" style="width: 100%;" @change="orderDateChange" />
</el-form-item>
</el-col>
<el-col class="line" style="text-align: center" :span="2">-</el-col>
<el-col :span="11">
<el-form-item prop="date2">
<el-time-select
v-model="form.date2"
:picker-options="{
start: startTime,
step: step,
end: endTime
}"
placeholder="选择时间"
/>
</el-form-item>
</el-col>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" size="small" @click="handleSave">保存</el-button>
<el-button size="small" @click="closeDialog">关闭</el-button>
</span>
</el-dialog>
</template>
<script>
export default {
name: 'AddPatientOrder',
props: {
title: {
type: String,
default: '新增预约'
},
patientDetail: {
type: Object
},
morOrAft: {
type: Number
},
orderDetail: {
type: Object
},
project: {
type: Object
},
isEdit: {
type: Boolean,
default: false
}
},
data() {
return {
visible: false,
patientInfo: null,
form: {
patientId: '',
source: '',
project: [],
preparation: [],
doctorName: '',
remark: '',
doctorId: '',
eyeType: '',
otherProject: '',
date1: '',
date2: ''
},
startTime: '08:30',
step: '00:15',
endTime: '18:00',
projectList: [],
doctorList: []
}
},
computed: {
dataRule() {
return {
patientId: [
{ required: true, message: '请选择患者' }
],
date1: [
{ required: true, message: '请选择日期' }
],
date2: [
{ required: true, message: '请选择时间' }
]
}
}
},
created() {
this.getDoctorList()
this.getProjectList()
},
mounted() {
if (this.patientDetail) {
this.form.patientId = this.patientDetail.patientId
this.form.doctorId = this.patientDetail.doctorId
this.form.doctorName = this.patientDetail.doctorName
this.form.eyeType = this.patientDetail.eyeType
this.form.project = this.patientDetail.project && this.patientDetail.project.split(',') || []
this.form.preparation = this.patientDetail.preparation && this.patientDetail.preparation.split(',') || []
this.form.remark = this.patientDetail.remark
this.form.otherProject = this.patientDetail.otherProject
this.form.source = this.patientDetail.source
if (this.patientDetail.appointDate) {
this.form.date1 = this.patientDetail.appointDate.split(' ')[0]
this.form.date2 = this.patientDetail.appointDate.split(' ')[1].substring(0, 5)
}
this.patientInfo = this.patientDetail
}
if (this.orderDetail) {
this.form.date1 = this.orderDetail.date
if (this.morOrAft === 1) {
this.startTime = this.orderDetail.workTimeAm || '08:00'
this.endTime = '12:00'
this.step = `00:${this.orderDetail.timeInterval}`
} else {
this.startTime = this.orderDetail.workTimePm
this.step = `00:${this.orderDetail.timeInterval}`
this.endTime = '18:00'
}
}
},
methods: {
init() {
this.visible = true
},
//
searchPatient(val) {
this.$http.get('/appoint/getPatientInfo', { params: { patientId: val }}).then((data) => {
if (data.data.data.list.length) {
this.patientInfo = data.data.data.list[0]
} else {
this.patientInfo = null
this.$message.error('未找到该患者!')
}
})
},
//
orderDateChange(value) {
if (this.orderDetail.date !== value) {
this.endTime = '18:00'
}
},
//
getDoctorList() {
this.$http.get('/sys/user', { params: { position: '门诊医师' }}).then(data => {
this.doctorList = data.data.data
}).catch(err => {
this.$message.error(err.msg)
})
},
getProjectList() {
this.$http.get('/appoint/getAppiontProJectDict').then(data => {
this.projectList = data.data.data
}).catch(err => {
this.$message.error(err.msg)
})
},
//
selectDoctor(val) {
const curDoctor = this.doctorList.find(item => item.employeeId === val)
this.form.doctorName = curDoctor.realName
},
//
handleSave() {
this.$refs.addPatientForm.validate((valid) => {
if (!valid) {
return false
}
const project = this.form.project.join(',')
const preparation = this.form.preparation.join(',')
if (!this.isEdit) {
const params = {
appointDate: `${this.form.date1} ${this.form.date2}:00`,
patientName: this.patientInfo.patientName,
jzNumber: this.patientInfo.jzNumber,
appointSource: this.patientInfo.source,
itemId: this.project.itemId,
itemName: this.project.itemName,
...this.form
}
params.project = project
params.preparation = preparation
this.$http.post('/appoint/saveAppointInfo', params).then(res => {
if (res.data.code !== 0) {
return this.$message.error(res.data.msg)
}
this.$message.success('添加成功')
this.$emit('updateAppoint')
// this.visible = false
})
} else {
const params = {
appointDate: `${this.form.date1} ${this.form.date2}:00`,
patientName: this.patientDetail.patientName,
id: this.patientDetail.id,
itemId: this.patientDetail.itemId,
...this.form
}
params.project = project
params.preparation = preparation
this.$http.post('/appoint/updateAppointInfo', params).then(() => {
this.$message.success('修改成功')
this.$emit('updateAppoint')
// this.visible = false
})
}
})
},
//
closeDialog() {
this.$emit('closeDialog')
}
}
}
</script>
<style lang="scss" scoped>
.radioItem{
user-select: none;
cursor: pointer;
margin:0 8px;
display: flex;
}
.addLabel{
width: 80px;
text-align: right;
margin-right: 10px
}
input{
-webkit-appearance: checkbox !important;
margin-right: 5px !important;
}
::v-deep .el-form-item__label{
font-size: 14px;
}
::v-deep .el-form-item{
margin-bottom: 16px;
}
::v-deep .el-radio{
margin-right: 8px;
}
::v-deep .el-checkbox{
margin-right: 12px;
}
.otherProject{
::v-deep .el-input__inner{
border: 0;
border-radius: 0;
border-bottom: 1px solid #ccc !important;
}
}
.patientDetail{
border: 1px solid #6EB1FF;
border-radius: 8px;
background: #E8F5FF;
padding: 16px;
font-size: 14px;
color: rgba(0, 0, 0, 0.88);
margin-bottom: 22px;
}
.detailItem{
display:flex;
margin: 8px 0;
div{
margin-right: 20px;
}
}
</style>

678
src/page-subspecialty/views/modules/nurseManagement/reservation/schedule/doctor-schedule.vue

@ -1,678 +0,0 @@
<template>
<div class="doctor-schedule">
<div class="date-head data-head-fixed">
<div class="date-head-right">
<el-button-group style="margin-right:10px;">
<el-button plain icon="el-icon-arrow-left" size="small" @click="weekPre">上周</el-button>
<el-button plain size="small" @click="weekNext">下周<i class="el-icon-arrow-right el-icon--right" />
</el-button>
</el-button-group>
<span>选择日期</span>
<el-date-picker
v-model="newDate"
class="right-pick-btn"
:clearable="false"
type="date"
size="small"
placeholder="按日期查询"
@change="pickDateChange"
/>
</div>
</div>
<div v-loading="pageLoading" class="doctor-schedule-content">
<el-row class="weeks">
<el-col :span="3" class="doctor-list-text">项目</el-col>
<el-col
v-for="(day, index) in days"
:key="index"
:span="3"
class="date-item"
:class="{selected: index == tabIndex}"
@click="pick(day, index)"
>
<!--本月-->
<div class="date-day">
<span class="hidden-sm-and-down">{{ day | dateFormat }}</span>
<p>{{ day | getWeekFormat }}</p>
</div>
<div class="morning-after">
<span>上午</span>
<span>下午</span>
</div>
</el-col>
</el-row>
<div class="scroll-list">
<el-row v-for="(item,index) in doctorList" :key="index" :gutter="10" class="content">
<el-col :span="3" class="doctor-name">
<div class="doctorList">
<div class="list">
<p>{{ item.itemName }}</p>
</div>
</div>
</el-col>
<el-col v-for="(weekInfoItem,weekInfoIndex) in item.weekInfo" :key="weekInfoIndex" :span="3">
<div class="surplu-num">
<div v-show="sortName==='预约配置'" class="surplu-num-morning">
<!-- 上午预定后 -->
<div
v-show="selectedShow && weekInfoItem.date == rowListObj.operaDate && rowListObj.mainDoctorName == item.doctorName && rowListObj.morOrAft===1"
class="morning-top"
@mouseover.stop="mouseoverHandle(index,weekInfoIndex,weekInfoItem,'morning')"
@mouseout="mouseoutHandle"
>
<p>{{ rowListObj.morOrAft===1 ? '上午' : '下午' }}</p>
<p>{{ rowListObj.operaTime }}</p>
</div>
<div
slot="reference"
class="morning"
:class="weekInfoItem.morning.surplusNum<=0 ? 'morningAfterClass' :'' "
@mouseover.stop="mouseoverHandle(index,weekInfoIndex,weekInfoItem,'morning')"
@mouseout="mouseoutHandle"
>
<p v-show="!weekInfoItem.morningOpen" class="none"></p>
<div
v-show="weekInfoItem.morningOpen && (weekInfoItem.morning.maxNumber <= weekInfoItem.morning.orderNum)"
class="yue-man"
>
<p>约满</p>
<p>
<span class="ordered">{{ weekInfoItem.morning.orderNum }}</span> /
<span class="grayfont">{{ weekInfoItem.morning.maxNumber }}</span>
</p>
</div>
<div
v-show="weekInfoItem.morningOpen && (weekInfoItem.morning.maxNumber > weekInfoItem.morning.orderNum) "
:class="index%2===0?'yi-yue':'yi-yue2'"
>
<p>已约</p>
<p>
<span class="ordered">{{ weekInfoItem.morning.orderNum }}</span> /
<span class="grayfont">{{ weekInfoItem.morning.maxNumber }}</span>
</p>
</div>
<div
v-show="currentIndex===index && currentWeekIndex===weekInfoIndex && mouseMoveIsShow && showMorningAfterText==='morning'"
class="show-plus-one"
>
<p @click="numberMangeClick(item,weekInfoItem,1,index,weekInfoIndex)">详情</p>
</div>
</div>
</div>
<div v-show="sortName==='预约配置'" class="surplu-num-after">
<!-- 下午预定后 -->
<div
v-show="selectedShow && weekInfoItem.date == rowListObj.operaDate && rowListObj.mainDoctorName == item.doctorName && rowListObj.morOrAft===2"
class="after-top"
@mouseover.stop="mouseoverHandle(index,weekInfoIndex,weekInfoItem,'after')"
@mouseout="mouseoutHandle"
>
<p>{{ rowListObj.morOrAft===1 ? '上午':'下午' }}</p>
<p>{{ rowListObj.operaTime }}</p>
</div>
<!-- 下午 -->
<div
slot="reference"
class="after"
:class="weekInfoItem.after.surplusNum<=0 ? 'morningAfterClass' :'' "
@mouseover.stop="mouseoverHandle(index,weekInfoIndex,weekInfoItem,'after')"
@mouseout="mouseoutHandle"
>
<p v-show="!weekInfoItem.afterOpen" class="none"></p>
<div
v-show="weekInfoItem.afterOpen && (weekInfoItem.after.maxNumber <= weekInfoItem.after.orderNum)"
class="yue-man"
>
<p>约满</p>
<p>
<span class="ordered">{{ weekInfoItem.after.orderNum }}</span> /
<span class="grayfont">{{ weekInfoItem.after.maxNumber }}</span>
</p>
</div>
<div
v-show="weekInfoItem.afterOpen && (weekInfoItem.after.maxNumber > weekInfoItem.after.orderNum) "
:class="index%2===0?'yi-yue':'yi-yue2'"
>
<p>已约</p>
<p>
<span class="ordered">{{ weekInfoItem.after.orderNum }}</span> /
<span class="grayfont">{{ weekInfoItem.after.maxNumber }}</span>
</p>
</div>
<div
v-show="currentIndex===index && currentWeekIndex===weekInfoIndex && mouseMoveIsShow && showMorningAfterText==='after'"
class="show-plus-one"
>
<p @click="numberMangeClick(item,weekInfoItem,2,index,weekInfoIndex)">详情</p>
</div>
</div>
</div>
</div>
</el-col>
</el-row>
</div>
</div>
<numberDetailManage
v-if="numberManageVisible"
ref="numberManageRef"
:patients-list="curPatients"
:can-add="canAdd"
@closeDialog="numberManageVisible=false"
@getScheduleList="getScheduleList"
@rowList="rowList"
/>
</div>
</template>
<script>
import moment from 'moment'
import _ from 'lodash'
import { dateFilterTwo } from '@/filters'
import NumberDetailManage from '@/page-subspecialty/views/modules/nurseManagement/reservation/schedule/number-detail-manage.vue'
/* eslint-disable */
export default {
components: {
NumberDetailManage,
},
data() {
return {
pageLoading:false,
currentYear: 1970, //
currentMonth: 1, //
currentDay: 1, //
currentWeek: 1, //
days: [],
tabIndex: null,
newDate: moment(new Date()).format("YYYY-MM-DD"),
tabTimeIndex: 4,
numberManageVisible: false,
curPatients: [],
curIndex: '',
curWeekInfoIndex:"",
curTime: '',
canAdd: true,
mouseMoveIsShow: false,
currentIndex: null,
currentWeekIndex: null,
showMorningAfterText: '',
selectedShow: false,
doctorList:[],
rowListObj: {},
sortName:'预约配置',
};
},
filters: {
dateFormat(date) {
return moment(date).format("YYYY-MM-DD");
},
getWeekFormat(date) {
const weeksObj = {
1: "周一",
2: "周二",
3: "周三",
4: "周四",
5: "周五",
6: "周六",
7: "周日"
};
let weekNumber = moment(date).isoWeekday();
// console.log(weekNumber);
return weeksObj[weekNumber];
}
},
mounted() {
const index = _.findIndex(this.days, function (o) {
return o.getDate() === new Date().getDate();
});
this.tabIndex = index;
},
created() {
this.initData(null);
this.getScheduleList()
},
methods: {
//
async getScheduleList() {
this.pageLoading = true
const { data: res } = await this.$http.get('/appoint/getAppointCalendarInfo', {
params: {
searchDate: this.newDate,
}
})
if (res.code === 0) {
this.pageLoading = false
this.doctorList = res.data
if (typeof this.curIndex === 'number'){
if (this.curTime===1){
const item = this.doctorList.length && this.doctorList[this.curIndex]
const weekInfoItem = item.weekInfo[this.curWeekInfoIndex]
this.curPatients = weekInfoItem.morning.appointPatients
this.canAdd = weekInfoItem.morning.maxNumber>weekInfoItem.morning.orderNum || !item.needLimit
}else {
const weekInfoItem = this.doctorList.length && this.doctorList[this.curIndex].weekInfo[this.curWeekInfoIndex]
this.curPatients = weekInfoItem.after.appointPatients
this.canAdd = weekInfoItem.after.maxNumber>weekInfoItem.after.orderNum || !item.needLimit
}
}
} else {
this.pageLoading = false
this.$message.error(res.msg)
}
},
//
rowList(rowList) {
this.rowListObj = rowList
this.$emit('rowList', rowList)
this.selectedShow = true
},
formatDate(year, month, day) {
const y = year;
let m = month;
if (m < 10) m = `0${m}`;
let d = day;
if (d < 10) d = `0${d}`;
return `${y}-${m}-${d}`;
},
//
pickDateChange(date) {
let that = this;
that.newDate = moment(date).format("YYYY-MM-DD");
that.$emit("dateValue", that.newDate);
console.log("this.newDate: ", that.newDate);
that.initData(that.newDate);
const index = _.findIndex(that.days, function (o) {
return o.getDate() === new Date(that.newDate).getDate();
});
this.sortName === '预约配置' ? this.getScheduleList() : this.getBatchNumSet()
// console.log("index: ", index);
this.tabIndex = index;
},
initData(cur) {
let date = "";
if (cur) {
date = new Date(cur);
} else {
date = new Date();
}
this.currentDay = date.getDate(); //
this.currentYear = date.getFullYear(); //
this.currentMonth = date.getMonth() + 1; //
this.currentWeek = date.getDay(); // 1...6,0 //
if (this.currentWeek === 0) {
this.currentWeek = 7;
}
const str = this.formatDate(
this.currentYear,
this.currentMonth,
this.currentDay
); // --
this.days.length = 0;
// 76 i<= 35- this.currentWeek
/* eslint-disabled */
//
for (let i = this.currentWeek - 1; i >= 0; i -= 1) {
const d = new Date(str);
d.setDate(d.getDate() - i);
// console.log(y:" + d.getDate())
// console.log('d: ', d);
this.days.push(d);
}
//
for (let i = 1; i <= 7 - this.currentWeek; i += 1) {
const d = new Date(str);
d.setDate(d.getDate() + i);
this.days.push(d);
// console.log('d1: ', d);
}
},
//
weekPre() {
const d = this.days[0]; // 77
d.setDate(d.getDate() - 7);
this.initData(d);
this.newDate = dateFilterTwo(this.days[0])
this.sortName === '预约配置' ? this.getScheduleList() : this.getBatchNumSet()
},
//
weekNext() {
const d = this.days[6]; // 77
d.setDate(d.getDate() + 7);
this.initData(d);
this.newDate = dateFilterTwo(this.days[0])
this.sortName === '预约配置' ? this.getScheduleList() : this.getBatchNumSet()
},
//
pick(date, index) {
this.newDate = moment(date).format("YYYY-MM-DD");
this.$emit("dateValue", this.newDate);
// console.log("index: ", index);
this.tabIndex = index;
// alert(
// this.formatDate(date.getFullYear(), date.getMonth() + 1, date.getDate())
// );
},
//
mouseoverHandle(index, weekInfoIndex, weekInfoItem, showMorningAfterText) {
// console.log(weekInfoItem[showMorningAfterText]);
let maxNumber = weekInfoItem[showMorningAfterText].maxNumber
let orderNum = weekInfoItem[showMorningAfterText].orderNum
this.currentIndex = index
this.currentWeekIndex = weekInfoIndex
this.showMorningAfterText = showMorningAfterText
this.mouseMoveIsShow = true
},
//
mouseoutHandle() {
this.currentIndex = null
this.currentWeekIndex = null
this.showMorningAfterText = ''
this.mouseMoveIsShow = false
},
//
async numberMangeClick(item, weekInfoItem, morOrAft,index,weekInfoIndex) {
this.numberMangeClickFun(item, weekInfoItem, morOrAft,index,weekInfoIndex)
},
numberMangeClickFun(item, weekInfoItem, morOrAft,index,weekInfoIndex) {
this.numberManageVisible = true
this.curIndex = index
this.curWeekInfoIndex = weekInfoIndex
this.curTime = morOrAft
this.$nextTick(() => {
if (morOrAft===1){
this.curPatients = weekInfoItem.morning.appointPatients
this.$refs.numberManageRef.dateInfo = weekInfoItem.date + '上午'
this.canAdd = weekInfoItem.morning.maxNumber>weekInfoItem.morning.orderNum || !item.needLimit
}else {
this.curPatients = weekInfoItem.after.appointPatients
this.$refs.numberManageRef.dateInfo = weekInfoItem.date + '下午'
this.canAdd = weekInfoItem.after.maxNumber>weekInfoItem.after.orderNum || !item.needLimit
}
this.$refs.numberManageRef.curProject = item //
this.$refs.numberManageRef.projectName = item.itemName
this.$refs.numberManageRef.weekName = weekInfoItem.weekName
this.$refs.numberManageRef.orderDetail = weekInfoItem
this.$refs.numberManageRef.morOrAft = morOrAft
this.$refs.numberManageRef.init()
})
},
}
};
</script>
<style lang="scss" scoped>
.ordered{
font-size: 24px;
}
.grayfont{
color: #C0C4CC;
}
.doctor-schedule {
font-size: 14px;
margin-top: 15px;
.date-head {
display: flex;
justify-content: space-between;
align-items: center;
padding-bottom: 10px;
.date-head-left {
font-size: 16px;
}
}
.data-head-fixed {
padding: 10px 16px 0 16px;
z-index: 0;
}
.doctor-schedule-content {
background: #f7f9fd;
padding: 10px 0;
.weeks {
display: flex;
padding-bottom: 10px;
border-bottom: 1px solid #e2ebf9;
color: #88939d;
.doctor-list-text,.moren {
display: flex;
justify-content: center;
align-items: center;
width: 5%;
text-align: center;
}
.date-day {
text-align: center;
margin-bottom: 10px;
}
.morning-after {
display: flex;
justify-content: space-around;
}
.date-item {
cursor: pointer;
padding: 5px 10px;
border-right: none;
list-style: none;
flex: 1;
text-align: center;
&:hover {
background: #dff0d8;
}
&:active {
background: #dff0d8;
}
}
}
.scroll-list {
height: calc(100vh - 50px - 220px);
overflow-y: auto;
overflow-x: hidden;
.doctor-name {
width: 5%;
}
}
.content {
border-bottom: 1px solid #e2ebf9;
padding: 16px 0;
display: flex;
align-items: center;
justify-content: space-between;
.doctorList {
text-align: center;
.list {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.list-img {
width: 64px;
height: 64px;
border-radius: 50%;
overflow: hidden;
img {
width: 64px;
height: 64px;
}
}
}
.surplu-num {
display: flex;
justify-content: center;
.surplu-num-morning,
.surplu-num-after {
width: 45%;
height: 60px;
position: relative;
}
.morning-top,
.after-top {
position: absolute;
width: 100%;
height: 100%;
border-radius: 3px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
z-index: 1;
background: #1b5bfb;
color: #fff;
}
.morning,
.after {
position: relative;
color: #88939d;
width: 100%;
height: 100%;
border-radius: 3px;
background: #fff;
overflow: hidden;
.yue-man,
.yi-yue,
.yi-yue2,
.none {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: 14px;
p:nth-child(1) {
color: #88939d;
}
p:nth-child(2) {
font-weight: 700;
}
}
.yue-man {
border-top: 2px solid #f40000;
p:nth-child(2) {
color: #f40000;
}
}
.yi-yue {
border-top: 2px solid #00bb61;
p:nth-child(2) {
color: #00bb61;
}
}
.yi-yue2 {
border-top: 2px solid #409EFF;
p:nth-child(2) {
color: #409EFF;
}
}
.none {
border-top: 2px solid #e1e1e1;
}
}
.after,
.after-top {
margin-left: 6px;
}
.morningAfterClass {
border-top: 2px solid #e1e1e1;
background: #fcfdfe;
}
.morning:hover,
.after:hover {
box-shadow: 0px 0px 16px rgba(8, 115, 215, 0.24);
}
.show-plus-one:hover {
border-top: 2px solid #1b5bfb !important;
}
.show-plus-one,
.show-plus-two {
width: 100%;
height: 100%;
background: #fff;
position: absolute;
left: 0;
top: 0;
z-index: 999;
text-align: center;
}
.show-plus-one {
font-size: 12px;
p {
height: 50%;
display: flex;
align-items: center;
justify-content: center;
color: #1e79ff;
cursor: pointer;
}
p:nth-child(1) {
border-bottom: 1px solid #f1f1f1;
}
}
.show-plus-two {
font-size: 24px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
}
}
.content:nth-last-child(1) {
border-bottom: 0;
}
}
.time-range {
display: flex;
justify-content: space-around;
align-items: center;
padding: 10px 0;
span {
cursor: pointer;
padding-bottom: 5px;
border-bottom: 3px solid #fff;
&:hover {
border-bottom: 3px solid rgb(151, 198, 245);
}
}
}
}
.today-item {
cursor: pointer;
line-height: 45px;
}
.selected {
box-sizing: border-box;
}
.item-wrapper {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.doctor-list-text,
.prev-btn,
.next-btn {
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
.fa-icon {
font-size: 18px;
}
}
</style>
<style lang="scss">
.surplu-num {
.el-input__inner {
text-align: center;
height: 60px;
line-height: 60px;
}
}
</style>

52
src/page-subspecialty/views/modules/nurseManagement/reservation/schedule/index.vue

@ -1,52 +0,0 @@
<template>
<div class="schedule-date">
<div class="tab-content">
<!-- 号源标识 1:手术号源 2:检查号源 -->
<doctorSchedule title="newAddNUm" />
</div>
</div>
</template>
<script>
/* eslint-disable */
import DoctorSchedule from "@/page-subspecialty/views/modules/nurseManagement/reservation/schedule/doctor-schedule.vue";
export default {
components: {
DoctorSchedule
},
data() {
return {
};
},
created() {
},
methods: {
}
};
</script>
<style lang="scss" scoped>
.schedule-date {
font-size: 14px;
.tab-content {
background: #fff;
}
}
</style>
<style lang="scss">
.schedule-date {
.el-tabs__nav-wrap::after {
height: 0;
}
.el-tabs__header {
padding: 0 10px;
margin: 0;
}
}
</style>

196
src/page-subspecialty/views/modules/nurseManagement/reservation/schedule/number-detail-manage.vue

@ -1,196 +0,0 @@
<template>
<el-dialog top="30px" class="number-manage" append-to-body :visible.sync="visible" width="50%" @close="closeDialog">
<div slot="title">
<div>
<div class="title_header">已约患者列表</div>
<div style="margin: 8px 0">{{ dateInfo }}</div>
<div>{{ projectName }}</div>
</div>
</div>
<el-row style="margin-bottom: 15px">
<el-col v-if="canAdd" style="margin: 8px" :span="11">
<el-button style="width: 100%" size="mini" icon="el-icon-plus" type="primary" @click="addOrder">新增预约</el-button>
</el-col>
<el-col v-for="(item,index) in patientsList" :key="index" :span="11" class="patientBox">
<div class="patient_left">
<div style="margin-right: 8px;color: #1C76FD;">{{ item.appointDate }}</div>
<div style="margin-right: 8px">{{ item.patientName }}</div>
<div style="margin-right: 8px">{{ item.patientSex }}</div>
<div>{{ item.patientAge }}</div>
</div>
<div class="patient_right">
<div class="edit" @click="changeOrder(item)">改约</div>
<div class="delete" @click="deleteOrder(item)">删除</div>
</div>
</el-col>
</el-row>
<add-patient-order
v-if="addPatientVisible"
ref="addPatientOrder"
:project="curProject"
:patient-detail="curPatient"
:title="addTitle"
:order-detail="orderDetail"
:mor-or-aft="morOrAft"
:is-edit="isEdit"
@goFormList="goFormList"
@closeDialog="closeAddDialog"
@updateAppoint="updateAppoint"
/>
</el-dialog>
</template>
<script>
import AddPatientOrder from '@/page-subspecialty/views/modules/nurseManagement/reservation/schedule/addPatientOrder.vue'
export default {
components: { AddPatientOrder },
props: {
patientsList: {
type: Array,
default: () => []
},
canAdd: {
type: Boolean,
default: true
}
},
data() {
return {
visible: false,
addPatientVisible: false,
orderDate: '',
dateInfo: '',
isEdit: false,
projectName: '',
curProject: '',
curPatient: null,
title: '',
addTitle: '',
orderDetail: null,
morOrAft: ''
}
},
methods: {
init() {
this.visible = true
},
addOrder() {
this.addPatientVisible = true
this.addTitle = `新增预约-${this.projectName}`
this.isEdit = false
this.curPatient = null
this.$nextTick(() => {
this.$refs.addPatientOrder.init()
})
},
//
changeOrder(value) {
this.addPatientVisible = true
this.addTitle = '修改预约'
this.curPatient = value
this.$nextTick(() => {
this.isEdit = true
this.$refs.addPatientOrder.init()
})
},
//
deleteOrder(item) {
this.$confirmFun('确认删除吗?').then(() => {
this.$http.get('/appoint/delAppiontInfo', {
params: {
id: item.id
}
}).then(() => {
this.$message.success('删除成功')
this.$emit('getScheduleList')
})
})
},
closeAddDialog() {
this.addPatientVisible = false
},
goFormList() {
this.$emit('goFormList')
},
updateAppoint() {
this.$emit('getScheduleList')
},
//
closeDialog() {
this.$emit('closeDialog')
}
}
}
</script>
<style lang="scss" scoped>
.number-manage {
.number-manage-head {
border-bottom: 1px dashed #d6d6d6;
}
.head-content {
font-size: 14px;
padding: 10px;
margin: 4px 0 12px 0;
background: #eff4ff;
border: 1px solid #c5d5fe;
display: flex;
justify-content: space-between;
.head-content-left,
.head-content-right {
span {
padding-right: 6px;
}
span:nth-child(1) {
font-weight: 700;
}
}
}
.form-two {
margin-left: 16px;
}
.operation-details {
cursor: pointer;
}
}
</style>
<style lang="scss">
::v-deep .el-dialog__header{
background:linear-gradient(rgba(27, 91, 251, 0.8) , #1B5BFB 100%);
color: #fff;
}
.title_header{
font-size: 20px;
font-weight: bold;
}
.patientBox{
display: flex;
justify-content: space-between;
align-items: center;
padding: 4px 8px 4px 16px;
background: #EFF4FF;
border: 1px solid rgba(27, 91, 251, 0.2);
border-radius: 2px;
font-size: 14px;
line-height: 22px;
margin: 8px;
.patient_left{
display: flex;
}
.patient_right{
display: flex;
}
.edit{
cursor: pointer;
user-select: none;
color: #1C76FD;
}
.delete{
color: #FF4D4F;
cursor: pointer;
user-select: none;
margin-left: 8px;
}
}
</style>

108
src/page-subspecialty/views/modules/nurseManagement/reservation/schedule/orderPatientList.vue

@ -1,108 +0,0 @@
<template>
<el-dialog
:visible.sync="dialogVisible"
width="40%"
:show-close="false"
:before-close="closeDialog"
>
<div slot="title" style="display: flex;justify-content: space-between">
<div>
<div class="title_header">已约患者列表</div>
<div style="margin: 8px 0">202-11-23 上午</div>
<div>眼前节激光治疗</div>
</div>
<div style="font-size: 22px">
<i class="el-icon-close" @click="closeDialog" />
</div>
</div>
<el-row>
<el-col style="margin: 8px" :span="11">
<el-button style="width: 100%" size="mini" icon="el-icon-plus" type="primary" @click="addOrder">新增预约</el-button>
</el-col>
<el-col v-for="item in 6" :key="item" :span="11" class="patientBox">
<div class="patient_left">
<div style="margin-right: 8px;color: #1C76FD;">09-10</div>
<div style="margin-right: 8px">李四</div>
<div style="margin-right: 8px"></div>
<div>32</div>
</div>
<div class="patient_right">
<div class="edit">改约</div>
<div class="delete">删除</div>
</div>
</el-col>
</el-row>
</el-dialog>
</template>
<script>
export default {
name: 'OrderPatientList',
props: {
isShow: {
type: Boolean,
default: false
}
},
data() {
return {
title: '',
dialogVisible: false
}
},
watch: {
isShow(val) {
this.dialogVisible = val
}
},
methods: {
addOrder() {
this.$emit('addOrder')
},
closeDialog(val) {
this.dialogVisible = val
this.$emit('close', false)
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog__header{
background:linear-gradient(rgba(27, 91, 251, 0.8) , #1B5BFB 100%);
color: #fff;
}
.title_header{
font-size: 20px;
font-weight: bold;
}
.patientBox{
display: flex;
justify-content: space-between;
align-items: center;
padding: 4px 8px 4px 16px;
background: #EFF4FF;
border: 1px solid rgba(27, 91, 251, 0.2);
border-radius: 2px;
font-size: 14px;
line-height: 22px;
margin: 8px;
.patient_left{
display: flex;
}
.patient_right{
display: flex;
}
.edit{
cursor: pointer;
user-select: none;
color: #1C76FD;
}
.delete{
color: #FF4D4F;
cursor: pointer;
user-select: none;
margin-left: 8px;
}
}
</style>

618
src/page-subspecialty/views/modules/nurseManagement/reservation/subList/index.vue

@ -1,618 +0,0 @@
<template>
<!-- 预约列表 -->
<div class="nurse_content">
<div v-if="!detailViewVisible" class="scheduled-patient">
<div class="scheduled-patient-head">
<div style="display:flex;">
<el-select
v-model="dataForm.searchType"
placeholder="请选择"
size="small"
@change="getDataListInitial"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-select
v-model="dataForm.itemId"
style="margin:0 15px"
placeholder="请选择"
filterable
:remote-method="queryProjects"
size="small"
@change="projectChange"
>
<el-option
v-for="item in projects"
:key="item.itemId"
:label="item.itemName"
:value="item.itemId"
/>
</el-select>
<div style="margin-left: 15px">
预约时间:
<el-date-picker
v-model="appointTime"
size="small"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
@change="dateChange"
/>
</div>
</div>
<div>
<el-button type="primary" icon="el-icon-edit" size="small" @click="changeOrder">改约</el-button>
<el-button v-print="printObj" type="primary" icon="el-icon-edit" size="small">打印</el-button>
</div>
</div>
<div style="display: flex;margin: 15px 0 0 15px">
<el-button
v-for="(item,index) in typeList"
:key="index"
:class="[curIndex === index ? 'active' : '']"
style="margin-left: 0"
size="small"
color="white"
@click="handleType(item.value, index)"
>{{ item.label }}</el-button>
<div style="margin-left: 15px">
<el-button
v-for="(item,index) in optionList"
:key="item.label"
:class="[curIndex2 === index ? 'active' : '']"
style="margin-left: 0"
size="small"
color="white"
@click="changeType(item.value, index)"
>{{ item.label }}</el-button>
</div>
<div style="margin-left: 15px">
<el-button
v-for="(item,index) in todayList"
:key="item.label"
:class="[curIndex3 === index ? 'active' : '']"
style="margin-left: 0"
size="small"
color="white"
@click="changeToday(item.value, index)"
>{{ item.label }}</el-button>
</div>
</div>
<div v-loading="dataListLoading" class="scheduled-patient-content">
<div>
<el-table
ref="multipleTable"
:data="dataList"
tooltip-effect="dark"
style="width: 100%"
:cell-class-name="tableCellClassName"
@selection-change="handleSelectionChange"
@sort-change="sortList"
>
<el-table-column type="selection" />
<el-table-column label="预约时间" header-align="center" align="center" width="110px">
<template slot-scope="scope">
{{ scope.row.appointDate ? scope.row.appointDate : '-' }}
</template>
</el-table-column>
<el-table-column label="类型" prop="source" header-align="center" align="center" width="55px" />
<el-table-column label="负责医生" header-align="center" align="center" width="100px">
<template slot-scope="scope">
{{ scope.row.doctorName ? scope.row.doctorName : '-' }}
</template>
</el-table-column>
<el-table-column prop="patientName" label="患者姓名" header-align="center" align="center" width="100px" />
<el-table-column prop="patientId" label="登记号" header-align="center" align="center" width="120px" />
<el-table-column prop="patientPhone" label="电话" header-align="center" align="center" width="120px" />
<el-table-column label="眼别" prop="eyeType" header-align="center" align="center" width="80px" />
<el-table-column label="医疗项目" prop="itemName" header-align="center" align="center" width="100px" />
<el-table-column label="项目" prop="project" header-align="center" align="center">
<template slot-scope="scope">
<div v-if="scope.row.project">
<div v-for="item in scope.row.project.split(',')" :key="item">
<div v-if="item!=='其他'">
{{ item }}
</div>
<div v-else>
{{ `${item}: ${scope.row.otherProject}` }}
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="操作者工号" prop="operatorId" header-align="center" align="center" width="110px" />
<el-table-column label="备注" prop="remark" header-align="center" align="center" />
<el-table-column label="准备工作" prop="preparation" header-align="center" align="center" width="160px">
<template slot-scope="scope">
<div v-if="scope.row.preparation">
<div
v-for="item in scope.row.preparation.split(',')"
:key="item"
:class="item==='缩瞳'?'active_check_red':'active_check'"
class="readyItem"
>
{{ item }}
</div>
</div>
</template>
</el-table-column>
<el-table-column sortable label="是否到达" header-align="center" align="center" width="110px">
<template slot-scope="scope">
<div>
<el-select v-model="scope.row.arrival" :class="{'active_check':scope.row.arrival==='Y'}" class="arrivalSelect" placeholder="" size="small" @change="value=>changeEyeType(value,scope)">
<el-option
v-for="item in arrivalList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<div v-if="scope.row.arrivalDate && scope.row.arrival==='Y'">
{{ scope.row.arrivalDate }}
</div>
</div>
</template>
</el-table-column>
<el-table-column label="操作" class-name="hidden" header-align="center" align="center" width="210px">
<template slot-scope="scope">
<span class="call" @click="goFormList(scope.row)">表单</span>
<span class="call" @click="editOpera(scope.row)">{{ scope.row.appointDate ? "改约":"预约" }}</span>
<span class="cancel" @click="cancelClick(scope.row)">取消</span>
<span class="call" @click="checkPatientDetail(scope.row)">患者360</span>
</template>
</el-table-column>
</el-table>
</div>
<el-pagination background layout="total,prev, pager, next" :total="total" :current-page.sync="page" @current-change="pageCurrentChangeHandle" />
</div>
</div>
<div class="printHiddenTable">
<print-table :arrival-list="arrivalList" :data-list="dataList" :cur-project="curProject" />
</div>
<re-dialog
v-if="reDialogShow"
ref="reDialog"
:patient-list="patientList"
:projects="selectedProjects"
@close="closeReDialog"
@saveAppoint="saveAppoint"
/>
<add-patient-order
v-if="addPatientVisible"
ref="addPatientOrder"
:project="curPatient"
:patient-detail="curPatient"
:title="addTitle"
:is-edit="isEdit"
@closeDialog="closeAddDialog"
@updateAppoint="updateAppoint"
/>
<detail-view
v-if="detailViewVisible"
ref="viewRef"
:only-read="onlyRead"
:is-search="'1'"
:patient-id="curPatient.patientId"
:patient-id-number="curPatient.patientIdNumber"
@detailViewVisible="detailViewVisible=false"
/>
</div>
</template>
<script>
import mixinViewModule from '@/mixins/view-module'
import DetailView from '@/components/360View/index.vue'
import ReDialog from '@/page-subspecialty/views/modules/nurseManagement/reservation/subList/reDialog.vue'
import AddProject from '@/page-subspecialty/views/modules/nurseManagement/reservation/subSetting/addProject.vue'
import AddPatientOrder
from '@/page-subspecialty/views/modules/nurseManagement/reservation/schedule/addPatientOrder.vue'
import PrintTable from '@/page-subspecialty/views/modules/nurseManagement/reservation/subList/printTable.vue'
export default {
name: 'SubList',
components: {
PrintTable,
AddPatientOrder,
AddProject,
ReDialog,
DetailView
// scheduledOrder
},
mixins: [mixinViewModule],
data() {
return {
mixinViewModuleOptions: {
getDataListURL: '/appoint/page',
getDataListIsPage: true,
createdIsNeed: false
},
appointTime: [],
isEdit: false,
addTitle: '',
addPatientVisible: false,
detailViewVisible: false,
onlyRead: true,
reDialogShow: false,
dataForm: {
appointStatus: '',
searchType: '9',
itemId: '',
morning: '',
arrival: '',
beginDate: '',
endDate: '',
arrivalSort: ''
},
options: [
{
value: '9',
label: '今天以后'
},
{
value: '0',
label: '今天'
}, {
value: '7',
label: '明天'
}, {
value: '8',
label: '后天'
}, {
value: '1',
label: '昨天'
}, {
value: '2',
label: '前天'
}, {
value: '3',
label: '近三天'
}, {
value: '4',
label: '近一周'
}, {
value: '5',
label: '近一个月 '
}, {
value: '6',
label: '近半年 '
}, {
value: '',
label: '全部'
}],
typeList: [
{
value: '',
label: '全部'
}, {
value: '100',
label: '未预约'
}, {
value: '200',
label: '已预约'
}],
optionList: [
{
value: '',
label: '全部'
}, {
value: 'Y',
label: '已到达'
}, {
value: 'N',
label: '未到达'
}],
todayList: [
{
value: '',
label: '全部'
}, {
value: '1',
label: '上午'
}, {
value: '2',
label: '下午'
}],
arrivalList: [{
value: 'Y',
label: '是'
}, {
value: 'N',
label: '否'
}],
curIndex: 0,
curIndex2: 0,
curIndex3: 0,
projects: [],
curProject: null,
selectedProjects: [],
patientList: [],
//
currentCell: null,
//
curPatient: null,
//
printObj: {
id: 'multipleTable',
extraHead: '<style> .el-table .el-table__cell{padding:9px 0 !important;}</style>'
}
}
},
created() {
this.queryProjects()
this.getDataListInitial()
},
methods: {
showPreparation(scope, value) {
if (!scope) {
return false
}
return scope.includes(value)
},
dateChange(e) {
//
this.dataForm.beginDate = e ? e[0] : ''
this.dataForm.endDate = e ? e[1] : ''
this.dataForm.searchType = e ? '' : '9'
this.getDataListInitial()
},
handleType(value, index) {
this.curIndex = index
this.dataForm.appointStatus = value
if (index === 1) {
this.dataForm.searchType = ''
}
this.getDataListInitial()
},
changeType(value, index) {
this.curIndex2 = index
this.dataForm.arrival = value
if (index === 1) {
this.dataForm.searchType = ''
}
this.getDataListInitial()
},
changeToday(value, index) {
this.curIndex3 = index
this.dataForm.morning = value
if (index === 1) {
this.dataForm.searchType = ''
}
this.getDataListInitial()
},
//
changeEyeType(value, scope) {
this.$http.get('/appoint/updateArrival', {
params: {
id: scope.row.id,
arrival: value
}
}).then(res => {
if (res.data.data) {
this.$message.error(res.data.data)
}
this.getDataListInitial()
})
},
projectChange(value) {
this.curProject = this.projects.find(item => item.itemId === value)
this.getDataListInitial()
},
//
queryProjects(value) {
this.$http.get('/patient/getZlItemDict', {
params: { isAppoint: 1, itemName: value }
}).then(data => {
this.projects = data.data.data
this.projects.unshift({
caseName: '',
enable: 1,
itemId: '',
itemName: '全部项目'
})
})
},
//
changeOrder() {
this.reDialogShow = true
this.$nextTick(() => {
this.$refs.reDialog.init()
this.$refs.reDialog.patients = JSON.parse(JSON.stringify(this.patientList)).filter(item => !!item.itemId)
})
},
closeReDialog(val) {
this.reDialogShow = val
},
saveAppoint() {
this.getDataList()
this.closeReDialog()
},
closeAddDialog() {
this.addPatientVisible = false
},
updateAppoint() {
this.getDataList()
},
handleSelectionChange(val) {
this.patientList = val
},
sortList(val) {
if (val.order === 'ascending') {
val.order = 'asc'
}
if (val.order === 'descending') {
val.order = 'desc'
}
this.dataForm.arrivalSort = val.order
this.getDataList()
},
// index
tableCellClassName({ row, column, rowIndex, columnIndex }) {
row.index = rowIndex
column.index = columnIndex
},
//
editOpera(scopeRow) {
this.addPatientVisible = true
this.curPatient = scopeRow
if (scopeRow.appointDate) {
this.isEdit = true
this.addTitle = '修改预约'
} else {
this.isEdit = false
this.addTitle = '预约'
}
this.$nextTick(() => {
this.$refs.addPatientOrder.init()
})
},
goFormList(scopeRow) {
this.$router.push({
path: '/360view',
query: {
onlyRead: false,
isSearch: '2',
patientId: scopeRow.patientId,
jzNumber: scopeRow.jzNumber
}
})
},
//
cancelClick(scopeRow) {
this.$confirmFun('确定要取消此患者预约吗?').then(async() => {
const { data: res } = await this.$http.get('/appoint/delAppiontInfo', {
params: {
id: scopeRow.id
}
})
if (res.code === 0) {
this.getDataList()
this.$message({
message: '取消成功',
type: 'success'
})
} else {
this.$message.error(res.msg)
}
})
},
// 360
checkPatientDetail(scopeRow) {
this.curPatient = scopeRow
this.detailViewVisible = true
}
}
}
</script>
<style lang="scss" scoped>
.readyItem:not(:last-child){
border-bottom: 1px dashed #cccccc;
}
::v-deep .el-table .el-table__cell{
padding:9px 0;
}
.active{
color: #3ea3f6;
background-color: #e0f2fd;
border-color: #3ea3f6;
}
.nurse_content{
height: 100%;
}
.scheduled-patient {
background: #fff;
.scheduled-patient-content {
padding: 16px;
margin-bottom: 45px;
}
.scheduled-patient-head {
padding: 10px 16px 0 16px;
display: flex;
justify-content: space-between;
}
.call {
cursor: pointer;
color: #1890ff;
padding-right: 8px;
}
.cancel{
cursor: pointer;
padding-right: 8px;
color: #FF4D4F;
}
}
.printHiddenTable{
position: absolute;
top: 0;
left: -100%;
}
.scheduled-patient {
.form-item-date{
.el-input__inner {
width: 210px !important;
}
}
.scheduled-patient-head {
.el-form-item__label {
text-align: left;
}
.el-form {
display: flex;
justify-content: space-between;
}
.el-form-item {
display: flex;
}
.el-form-item {
margin-bottom: 0;
width: 35%;
}
.el-form-item__content,
.el-select,
.el-range-editor--small.el-input__inner {
width:auto
}
}
.el-select {
width: 100%;
}
.db-input-edit {
.el-input__inner {
background: #ccc;
width: 120px;
}
.el-input.is-active .el-input__inner, .el-input__inner:focus {
border: none;
}
}
}
.active_check{
color: #409EFF;
}
.active_check_red{
color: #ff0000;
}
::v-deep .active_check>.el-input--suffix>.el-input__inner{
color: #67C23A;
}
.arrivalSelect{
::v-deep .el-input__suffix{
display: none;
}
::v-deep .el-input__inner{
border: 0;
font-size: 16px;
text-align: center;
padding: 0;
}
}
.project_title{
font-weight: bold;
font-size: 18px;
}
</style>

131
src/page-subspecialty/views/modules/nurseManagement/reservation/subList/printTable.vue

@ -1,131 +0,0 @@
<template>
<div id="multipleTable">
<div v-if="curProject" class="project_title">医疗项目{{ curProject.itemName }}</div>
<el-table
:data="dataList"
tooltip-effect="dark"
style="width: 100%"
@sort-change="sortList"
>
<el-table-column label="预约时间" header-align="center" align="center" width="110px">
<template slot-scope="scope">
{{ scope.row.appointDate ? scope.row.appointDate : '-' }}
</template>
</el-table-column>
<el-table-column label="类型" prop="source" header-align="center" align="center" width="55px" />
<el-table-column label="负责医生" header-align="center" align="center" width="100px">
<template slot-scope="scope">
{{ scope.row.doctorName ? scope.row.doctorName : '-' }}
</template>
</el-table-column>
<el-table-column prop="patientName" label="患者姓名" header-align="center" align="center" width="100px" />
<el-table-column prop="patientId" label="登记号" header-align="center" align="center" width="120px" />
<el-table-column prop="patientPhone" label="电话" header-align="center" align="center" width="120px" />
<el-table-column label="眼别" prop="eyeType" header-align="center" align="center" width="80px" />
<el-table-column label="项目" prop="project" header-align="center" align="center" width="120px">
<template slot-scope="scope">
<div v-if="scope.row.project">
<div v-for="item in scope.row.project.split(',')" :key="item">
<div v-if="item!=='其他'">
{{ item }}
</div>
<div v-else>
{{ `${item}: ${scope.row.otherProject}` }}
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="准备工作" prop="preparation" header-align="center" align="center" width="160px">
<template slot-scope="scope">
<div v-if="scope.row.preparation">
<div
v-for="item in scope.row.preparation.split(',')"
:key="item"
:class="item==='缩瞳'?'active_check_red':'active_check'"
class="readyItem"
>
{{ item }}
</div>
</div>
</template>
</el-table-column>
<el-table-column sortable label="是否到达" header-align="center" align="center" width="110px">
<template slot-scope="scope">
<div>
<el-select v-model="scope.row.arrival" :class="{'active_check':scope.row.arrival==='Y'}" class="arrivalSelect" placeholder="" size="small" @change="value=>changeEyeType(value,scope)">
<el-option
v-for="item in arrivalList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<div v-if="scope.row.arrivalDate && scope.row.arrival==='Y'">
{{ scope.row.arrivalDate }}
</div>
</div>
</template>
</el-table-column>
<el-table-column label="备注" prop="remark" header-align="center" align="center" width="240px" />
</el-table>
</div>
</template>
<script>
export default {
name: 'PrintTable',
props: {
curProject: {
type: Object
},
dataList: {
type: Array
},
arrivalList: {
type: Array
}
},
methods: {
sortList(val) {
if (val.order === 'ascending') {
val.order = 'asc'
}
if (val.order === 'descending') {
val.order = 'desc'
}
this.dataForm.arrivalSort = val.order
this.getDataList()
},
showPreparation(scope, value) {
if (!scope) {
return false
}
return scope.includes(value)
}
}
}
</script>
<style lang="scss" scoped>
.active_check{
color: #409EFF;
}
.active_check_red{
color: #ff0000;
}
.arrivalSelect{
::v-deep .el-input__suffix{
display: none;
}
::v-deep .el-input__inner{
border: 0;
font-size: 16px;
text-align: center;
padding: 0;
}
}
.readyItem:not(:last-child){
border-bottom: 1px dashed #cccccc;
}
</style>

70
src/page-subspecialty/views/modules/nurseManagement/reservation/subList/reDialog.vue

@ -1,70 +0,0 @@
<template>
<el-dialog title="改约" :visible.sync="show" :before-close="closeDialog">
<el-form id="reOrder" ref="form" size="small" :model="form" label-width="100px">
<div v-for="(item,index) in patients" :key="index">
<div class="secTitle">{{ `${item.itemName} ${item.patientName}` }}</div>
<el-date-picker
v-model="item.appointDate"
type="datetime"
placeholder="选择日期时间"
/>
</div>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button size="small" @click="closeDialog"> </el-button>
<el-button type="primary" size="small" @click="handleSave"> </el-button>
</span>
</el-dialog>
</template>
<script>
export default {
name: 'ReDialog',
data() {
return {
show: false,
print: {
id: 'reOrder'
},
patients: [],
form: {
date1: '',
date2: '',
date3: '',
date4: '',
date5: '',
date6: ''
}
}
},
methods: {
init() {
this.show = true
},
closeDialog() {
this.$emit('close')
},
handleSave() {
this.patients.forEach(item => {
this.$set(item, 'appointDate', this.$moment(item.appointDate).format('YYYY-MM-DD HH:mm:ss'))
})
this.$http.post('/appoint/batchUpdateAppointInfo', [...this.patients]).then(() => {
this.$emit('saveAppoint')
})
}
}
}
</script>
<style lang="scss" scoped>
.line{
text-align: center;
}
.secTitle{
font-size: 16px;
font-weight: bold;
color: rgba(0, 0, 0, 0.85);
margin: 16px 0;
}
</style>

281
src/page-subspecialty/views/modules/nurseManagement/reservation/subSetting/addProject.vue

@ -1,281 +0,0 @@
<template>
<el-dialog :title="title" :visible.sync="show" width="50%" :before-close="closeDialog">
<el-form id="reOrder" ref="addForm" :rules="rules" size="small" :model="form" label-width="130px">
<el-form-item required label="项目名称:" style="width: 100%" prop="project">
<el-select v-model="form.project" allow-create filterable clearable placeholder="请选择" style="width: 100%">
<el-option
v-for="item in options"
:key="item.itemId"
:label="item.itemName"
:value="item.itemId"
/>
</el-select>
</el-form-item>
<el-form-item required label="是否限制人数:" style="width: 100%" prop="needLimit">
<el-radio v-model="form.needLimit" :label="1"></el-radio>
<el-radio v-model="form.needLimit" :label="0"></el-radio>
</el-form-item>
<div style="display: flex">
<el-form-item style="flex: 1" required label="上班时间 上午:" prop="workTimeAm">
<el-time-select
v-model="form.workTimeAm"
:picker-options="{
start: '07:30',
end: '12:00'
}"
placeholder="选择时间"
style="width: 100%;"
/>
</el-form-item>
<el-form-item style="flex: 1" required label="时间间隔:" prop="timeInterval">
<el-input v-model="form.timeInterval" placeholder="">
<template slot="append">分钟</template>
</el-input>
</el-form-item>
</div>
<div style="display: flex">
<el-form-item style="flex: 1" required label="上班时间 下午:" prop="workTimePm">
<el-time-select
v-model="form.workTimePm"
:picker-options="{
start: '12:00',
end: '21:00'
}"
placeholder="选择时间"
style="width: 100%;"
/>
</el-form-item>
<el-form-item style="flex: 1" required label="人数上限:" prop="maxNumber">
<el-input v-model="form.maxNumber" placeholder="">
<template slot="append">(半天)</template>
</el-input>
</el-form-item>
</div>
</el-form>
<el-table
:data="tableData"
border
style="width: 100%"
>
<el-table-column
prop="time"
label="开启设置"
width="90"
>
<template slot-scope="scope">
<span style="margin-left: 10px">{{ scope.row.time }}</span>
</template>
</el-table-column>
<el-table-column
prop="Mon"
label="周一"
align="center"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.monTime" />
</template>
</el-table-column>
<el-table-column
prop="Tues"
label="周二"
align="center"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.tuesTime" />
</template>
</el-table-column>
<el-table-column
prop="Wed"
label="周三"
align="center"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.wedTime" />
</template>
</el-table-column>
<el-table-column
prop="Thur"
label="周四"
align="center"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.thurTime" />
</template>
</el-table-column>
<el-table-column
prop="Fri"
label="周五"
align="center"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.friTime" />
</template>
</el-table-column>
<el-table-column
prop="Sat"
label="周六"
align="center"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.satTime" />
</template>
</el-table-column>
<el-table-column
prop="Sun"
label="周日"
align="center"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.sunTime" />
</template>
</el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button size="small" @click="closeDialog"> </el-button>
<el-button type="primary" size="small" @click="handleSave"> </el-button>
</span>
</el-dialog>
</template>
<script>
export default {
name: 'AddProject',
props: {
title: {
type: String,
default: ''
},
projectDetail: {
type: Object,
default: () => {}
}
},
data() {
return {
show: false,
form: {
project: '',
workTimeAm: '',
workTimePm: '',
timeInterval: '',
maxNumber: '',
needLimit: ''
},
options: [],
tableData: [
{
time: '上午',
monTime: false,
tuesTime: false,
wedTime: false,
thurTime: false,
friTime: false,
satTime: false,
sunTime: false
}, {
time: '下午',
monTime: false,
tuesTime: false,
wedTime: false,
thurTime: false,
friTime: false,
satTime: false,
sunTime: false
}
],
originForm: {},
originTable: [],
message: '',
rules: {
project: [
{ required: true, message: '请选择项目' }
],
workTimeAm: [
{ required: true, message: '请选择时间' }
],
workTimePm: [
{ required: true, message: '请选择时间' }
],
timeInterval: [
{ required: true, message: '请填写时间间隔' }
],
maxNumber: [
{ required: true, message: '请填写人数上限' }
],
needLimit: [
{ required: true, message: '请选择限制' }
]
}
}
},
created() {
this.originForm = JSON.parse(JSON.stringify(this.form))
this.originTable = JSON.parse(JSON.stringify(this.tableData))
this.queryProjects()
},
methods: {
init() {
this.show = true
this.$nextTick(() => {
this.getDetailData()
})
},
queryProjects() {
this.$http.get('/patient/getZlItemDict', { params: { isAppoint: 1 }}).then(data => {
this.options = data.data.data
})
},
getDetailData() {
if (this.title === '修改项目') {
this.$nextTick(() => {
this.message = '修改成功'
this.form = JSON.parse(JSON.stringify(this.projectDetail))
this.tableData = JSON.parse(JSON.stringify(this.projectDetail.openVoList)) || this.originTable
this.form.project = this.projectDetail.itemId
})
} else {
this.$nextTick(() => {
this.form = this.originForm
this.tableData = this.originTable
this.message = '新增成功'
this.$refs['addForm'].resetFields()
})
}
},
closeDialog(val) {
this.$refs['addForm'].resetFields()
this.$emit('closeDialog', val)
},
//
handleSave() {
this.$refs['addForm'].validate((valid) => {
if (!valid) {
return false
}
const project = this.options.find(pro => pro.itemId === this.form.project)
const params = {
itemId: this.form.project,
...this.form,
itemName: project.itemName || '',
openVoList: this.tableData
}
this.$http.post('/appoint/saveOrUpdateAppointItem', params).then(() => {
this.$message.success(this.message)
this.$emit('refreshList')
})
})
}
}
}
</script>
<style lang="scss" scoped>
input{
-webkit-appearance: checkbox;
}
.checkTime{
width: 16px;
height: 16px;
}
</style>

413
src/page-subspecialty/views/modules/nurseManagement/reservation/subSetting/index.vue

@ -1,413 +0,0 @@
<template>
<div class="project">
<div style="margin-bottom: 15px">
<el-button type="primary" size="small" icon="el-icon-plus" @click="addProject">新增</el-button>
</div>
<div>
<el-table
:data="dataList"
style="width: 100%"
>
<el-table-column
:resizable="false"
prop="itemName"
label="项目"
width="200"
/>
<el-table-column
:resizable="false"
label="周一"
align="center"
>
<el-table-column
:resizable="false"
label="上午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox disabled :value="handleIsSelected(scope.row.openVoList,'mon','am')" />
</template>
</el-table-column>
<el-table-column
:resizable="false"
label="下午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox disabled :value="handleIsSelected(scope.row.openVoList,'mon','pm')" />
</template>
</el-table-column>
</el-table-column>
<el-table-column
:resizable="false"
label="周二"
align="center"
>
<el-table-column
:resizable="false"
label="上午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox disabled :value="handleIsSelected(scope.row.openVoList,'tues','am')" />
</template>
</el-table-column>
<el-table-column
:resizable="false"
label="下午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox disabled :value="handleIsSelected(scope.row.openVoList,'tues','pm')" />
</template>
</el-table-column>
</el-table-column>
<el-table-column
:resizable="false"
label="周三"
align="center"
>
<el-table-column
:resizable="false"
label="上午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox disabled :value="handleIsSelected(scope.row.openVoList,'wed','am')" />
</template>
</el-table-column>
<el-table-column
:resizable="false"
label="下午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox disabled :value="handleIsSelected(scope.row.openVoList,'wed','pm')" />
</template>
</el-table-column>
</el-table-column>
<el-table-column
:resizable="false"
label="周四"
align="center"
>
<el-table-column
:resizable="false"
label="上午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox disabled :value="handleIsSelected(scope.row.openVoList,'thur','am')" />
</template>
</el-table-column>
<el-table-column
:resizable="false"
label="下午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox disabled :value="handleIsSelected(scope.row.openVoList,'thur','pm')" />
</template>
</el-table-column>
</el-table-column>
<el-table-column
:resizable="false"
label="周五"
align="center"
>
<el-table-column
:resizable="false"
label="上午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox disabled :value="handleIsSelected(scope.row.openVoList,'fri','am')" />
</template>
</el-table-column>
<el-table-column
:resizable="false"
label="下午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox disabled :value="handleIsSelected(scope.row.openVoList,'fri','pm')" />
</template>
</el-table-column>
</el-table-column>
<el-table-column
:resizable="false"
label="周六"
align="center"
>
<el-table-column
:resizable="false"
label="上午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox disabled :value="handleIsSelected(scope.row.openVoList,'sat','am')" />
</template>
</el-table-column>
<el-table-column
:resizable="false"
label="下午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox disabled :value="handleIsSelected(scope.row.openVoList,'sat','pm')" />
</template>
</el-table-column>
</el-table-column>
<el-table-column
:resizable="false"
label="周日"
align="center"
>
<el-table-column
:resizable="false"
label="上午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox disabled :value="handleIsSelected(scope.row.openVoList,'sun','am')" />
</template>
</el-table-column>
<el-table-column
:resizable="false"
label="下午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox disabled :value="handleIsSelected(scope.row.openVoList,'sun','pm')" />
</template>
</el-table-column>
</el-table-column>
<el-table-column
:resizable="false"
label="上班时间"
align="center"
>
<el-table-column
prop="workTimeAm"
:resizable="false"
label="上午"
align="center"
/>
<template slot-scope="scope">
<input class="checkTime" type="checkbox" :ischecked="scope.row.workTimeAm">
</template>
</el-table-column>
<el-table-column
:resizable="false"
label="上班时间"
align="center"
>
<el-table-column
prop="workTimePm"
:resizable="false"
label="下午"
align="center"
/>
<template slot-scope="scope">
<input class="checkTime" type="checkbox" :ischecked="scope.row.workTimePm">
</template>
</el-table-column>
<el-table-column
:resizable="false"
prop="timeInterval"
label="时间间隔"
align="center"
/>
<el-table-column
:resizable="false"
prop="maxNumber"
label="人数上限"
align="center"
/>
<el-table-column
:resizable="false"
label="操作"
align="center"
width="150px"
>
<template slot-scope="scope">
<span
style="color: #1890ff; padding-right: 8px;cursor: pointer"
class="call"
@click="editOpera(scope.row)"
>修改</span>
<span
style="color: #FF4D4F; padding-right: 8px;cursor: pointer"
class="call"
@click="cancelClick(scope.row)"
>取消</span>
</template>
</el-table-column>
</el-table>
</div>
<add-project
v-if="addShow"
ref="addProject"
:project-detail="projectItem"
:title="title"
@refreshList="refreshList"
@closeDialog="closeDialog"
/>
</div>
</template>
<script>
import AddProject from '@/page-subspecialty/views/modules/nurseManagement/reservation/subSetting/addProject.vue'
import mixinViewModule from '@/mixins/view-module'
export default {
name: 'SubSetting',
components: { AddProject },
mixins: [mixinViewModule],
data() {
return {
mixinViewModuleOptions: {
getDataListURL: '/appoint/itemList',
getDataListIsPage: true,
createdIsNeed: false
},
dataForm: {
appointStatus: '',
searchType: '0'
},
addShow: false,
title: '',
projectItem: null
}
},
created() {
this.getDataListInitial()
},
methods: {
refreshList() {
this.addShow = false
this.getDataListInitial()
},
//
handleIsSelected(value, week, time) {
if (!value) {
return false
}
if (time === 'am') {
switch (week) {
case 'mon':
return value[0].monTime
case 'tues':
return value[0].tuesTime
case 'wed':
return value[0].wedTime
case 'thur':
return value[0].thurTime
case 'fri':
return value[0].friTime
case 'sat':
return value[0].satTime
case 'sun':
return value[0].sunTime
}
} else {
switch (week) {
case 'mon':
return value[1].monTime
case 'tues':
return value[1].tuesTime
case 'wed':
return value[1].wedTime
case 'thur':
return value[1].thurTime
case 'fri':
return value[1].friTime
case 'sat':
return value[1].satTime
case 'sun':
return value[1].sunTime
}
}
},
//
editOpera(scopeRow) {
this.title = '修改项目'
this.addShow = true
this.$nextTick(() => {
this.$refs.addProject.init()
})
this.projectItem = scopeRow
},
//
cancelClick(scopeRow) {
this.$confirmFun('确定取消该项目吗?').then(() => {
this.$http.get('/appoint/delAppiontItem', {
params: {
itemId: scopeRow.itemId
}
}).then(() => {
this.getDataListInitial()
this.$message.success('删除成功')
})
})
},
//
closeDialog() {
this.addShow = false
},
//
addProject() {
this.title = '新增项目'
this.addShow = true
this.$nextTick(() => {
this.$refs.addProject.init()
})
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{
background: #409EFF;
border-color: #409EFF;
}
::v-deep .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{
border-color: #fff
}
::v-deep .checkFont{
font-size: 12px !important;
}
.project{
padding: 10px 20px;
background: #fff;
}
</style>

343
src/page-subspecialty/views/modules/nurseManagement/reservation/subSetting/numberManage.vue

@ -1,343 +0,0 @@
<template>
<el-dialog
title="号源管理"
:visible.sync="dialogVisible"
width="70%"
:before-close="handleClose"
>
<div>
<el-button type="primary" icon="el-icon-plus" size="small">新增</el-button>
<el-table
:data="tableData"
border
style="width: 100%"
>
<el-table-column
:resizable="false"
prop="projectName"
label="检查项目"
width="150"
/>
<el-table-column
:resizable="false"
prop="Mon"
label="周一"
align="center"
>
<el-table-column
:resizable="false"
label="上午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.monFront" />
</template>
</el-table-column>
<el-table-column
:resizable="false"
label="下午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.monAfter" />
</template>
</el-table-column>
</el-table-column>
<el-table-column
:resizable="false"
prop="Tues"
label="周二"
align="center"
>
<el-table-column
:resizable="false"
label="上午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.tuesFront" />
</template>
</el-table-column>
<el-table-column
:resizable="false"
label="下午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.tuesAfter" />
</template>
</el-table-column>
</el-table-column>
<el-table-column
:resizable="false"
prop="Wed"
label="周三"
align="center"
>
<el-table-column
:resizable="false"
label="上午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.webFront" />
</template>
</el-table-column>
<el-table-column
:resizable="false"
label="下午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.webAfter" />
</template>
</el-table-column>
</el-table-column>
<el-table-column
:resizable="false"
prop="Thur"
label="周四"
align="center"
>
<el-table-column
:resizable="false"
label="上午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.thurFront" />
</template>
</el-table-column>
<el-table-column
:resizable="false"
label="下午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.thurAfter" />
</template>
</el-table-column>
</el-table-column>
<el-table-column
:resizable="false"
prop="Fri"
label="周五"
align="center"
>
<el-table-column
:resizable="false"
label="上午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.friFront" />
</template>
</el-table-column>
<el-table-column
:resizable="false"
label="下午"
align="center"
label-class-name="checkFont"
width="50"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.friAfter" />
</template>
</el-table-column>
<template slot-scope="scope">
<input class="checkTime" type="checkbox" :ischecked="scope.row.FriTime">
</template>
</el-table-column>
<el-table-column
:resizable="false"
prop="Sat"
label="周六"
align="center"
>
<el-table-column
:resizable="false"
label="上午"
align="center"
label-class-name="checkFont"
width="50"
/>
<el-table-column
:resizable="false"
label="下午"
align="center"
label-class-name="checkFont"
width="50"
/>
<template slot-scope="scope">
<input class="checkTime" type="checkbox" :ischecked="scope.row.SatTime">
</template>
</el-table-column>
<el-table-column
:resizable="false"
prop="Sun"
label="周日"
align="center"
>
<el-table-column
:resizable="false"
label="上午"
align="center"
label-class-name="checkFont"
width="50"
/>
<el-table-column
:resizable="false"
label="下午"
align="center"
label-class-name="checkFont"
width="50"
/>
<template slot-scope="scope">
<input class="checkTime" type="checkbox" :ischecked="scope.row.SunTime">
</template>
</el-table-column>
<el-table-column
:resizable="false"
prop="Sun"
label="上班时间"
align="center"
>
<el-table-column
:resizable="false"
prop="Sun"
label="上午"
align="center"
/>
<template slot-scope="scope">
<input class="checkTime" type="checkbox" :ischecked="scope.row.SunTime">
</template>
</el-table-column>
<el-table-column
:resizable="false"
prop="Sun"
label="上班时间"
align="center"
>
<el-table-column
:resizable="false"
prop="Sun"
label="下午"
align="center"
/>
<template slot-scope="scope">
<input class="checkTime" type="checkbox" :ischecked="scope.row.SunTime">
</template>
</el-table-column>
<el-table-column
:resizable="false"
prop="Sun"
label="时间间隔"
align="center"
>
<template slot-scope="scope">
<input class="checkTime" type="checkbox" :ischecked="scope.row.SunTime">
</template>
</el-table-column>
<el-table-column
:resizable="false"
prop="Sun"
label="人数上限"
align="center"
>
<template slot-scope="scope">
<input class="checkTime" type="checkbox" :ischecked="scope.row.SunTime">
</template>
</el-table-column>
<el-table-column
:resizable="false"
prop="Sun"
label="操作"
align="center"
>
<template slot-scope="scope">
<input class="checkTime" type="checkbox" :ischecked="scope.row.SunTime">
</template>
</el-table-column>
</el-table>
</div>
</el-dialog>
</template>
<script>
export default {
name: 'NumberManage',
props: {
isShow: {
type: Boolean,
default: false
}
},
data() {
return {
dialogVisible: false,
tableData: [
{
projectName: '视诱发电位',
monFront: false,
monAfter: false,
tuesFront: false,
tuesAfter: false,
webFront: false,
webAfter: false,
thurFront: false,
thurAfter: false,
friFront: false,
friAfter: false,
ThurTime: false,
FriTime: false,
SatTime: false,
SunTime: false
}, {
projectName: '电脑视野计检查',
MonTime: false,
TuesTime: false,
WedTime: false,
ThurTime: false,
FriTime: false,
SatTime: false,
SunTime: false
}
]
}
},
watch: {
isShow(val) {
this.dialogVisible = val
}
},
methods: {
handleClose() {
this.$emit('close', false)
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .checkFont{
font-size: 12px !important;
}
</style>

167
src/page-subspecialty/views/modules/optometryManagement/cornea/HIS-add.vue

@ -1,167 +0,0 @@
<template>
<el-dialog
class="HIS-dialog"
:visible.sync="visible"
width="60%"
title="HIS查询"
>
<el-form ref="dataFormHis" :inline="true" :model="dataFormHis" class="demo-form-inline" :rules="dataRule" @keyup.enter.native="findHandle(2)">
<el-form-item prop="patientId">
<el-input v-model="dataFormHis.patientId" placeholder="请输入登记号" clearable />
</el-form-item>
<el-form-item prop="patientName">
<el-input v-model="dataFormHis.patientName" placeholder="请输入姓名" clearable />
</el-form-item>
<el-form-item prop="patientIdNumber">
<el-input v-model="dataFormHis.patientIdNumber" placeholder="请输入身份证号" clearable />
</el-form-item>
<el-col :span="6">
<el-form-item>
<el-button type="primary" @click="findHandle(2)">查询</el-button>
<el-button @click="visible = !visible">取消</el-button>
</el-form-item>
</el-col>
</el-form>
<el-table v-loading="loading" :data="tableData" style="margin-bottom: 32px" height="500">
<template slot="empty">
<span style="color: #969799;">{{ tableText }}</span>
</template>
<el-table-column property="patientId" label="登记号" />
<el-table-column property="patientName" label="患者姓名" />
<el-table-column property="patientIdNumber" label="身份证号" />
<el-table-column property="patientPhone" label="联系电话" />
<el-table-column property="zlProject" label="医疗项目" width="140" />
<el-table-column property="remark" label="备注" width="140" />
<!-- <el-table-column property="patientAddress" label="家庭地址" />-->
<el-table-column label="操作" width="80">
<template slot-scope="scope">
<p class="introduce" @click="introduceHandle(scope.row)">引入</p>
</template>
</el-table-column>
</el-table>
</el-dialog>
</template>
<script>
export default {
data() {
return {
visible: false,
dataFormHis: {
patientId: '',
patientName: '',
patientIdNumber: ''
},
dataForm: {},
tableData: [],
tableText: '请查询所需数据',
loading: false
}
},
computed: {
dataRule() {
return {
patientId: [
{ message: '请输入登记号', trigger: 'blur' }
],
patientName: [
{ message: '请输入姓名', trigger: 'blur' }
],
patientIdNumber: [
{ message: '请输入身份证号', trigger: 'blur' }
]
}
}
},
methods: {
init() {
this.visible = true
this.$nextTick(() => {
this.tableText = '请查询所需数据'
this.$refs.dataFormHis.resetFields() //
this.tableData = []
})
},
// His
async findHandle(flag) {
if (flag === 2 && !this.dataFormHis.patientId && !this.dataFormHis.patientName && !this.dataFormHis.patientIdNumber) {
return this.$message.error('搜索内容不能为空')
}
this.loading = true
const { data: res } = await this.$http.get('/patient/getHisPatient', {
params: this.dataFormHis
})
if (res.code === 0) {
this.loading = false
this.tableData = res.data
if (res.data.length <= 0 && flag === 2) {
this.tableText = '查询成功,未查询到相关数据'
} else if (res.data.length <= 0 && flag === 1) {
this.tableText = '请查询所需数据'
}
} else {
this.loading = false
this.tableText = res.msg
this.$message.error(res.msg)
}
},
//
async introduceHandle(scopwRow) {
this.dataFormHis.patientId = scopwRow.patientId
this.dataFormHis.patientName = scopwRow.patientName
this.visible = false
// this.$parent.addOrUpdateHandle('', scopwRow, 'HIS')
await this.doLeadIn()
},
async doLeadIn() {
this.loading = true
const { data: res } = await this.$http.get('/lenses/doLeadIn', {
params: this.dataFormHis
})
if (res.code === 0) {
this.loading = false
this.$parent.getDataListInitial()
} else {
this.loading = false
this.$message.error(res.msg)
}
}
}
}
</script>
<style lang="scss" scoped>
.HIS-dialog {
box-sizing: border-box;
.cycle-display {
.el-form-item__content {
display: flex;
}
.el-input-number {
width: 100px;
margin-right: 16px;
}
}
.introduce {
color: #1F78FF;
cursor: pointer;
}
}
</style>
<style lang="scss">
.HIS-dialog {
.el-form {
display: flex;
}
.el-dialog__header {
margin-bottom:12px
}
.el-dialog__body {
padding-right: 30px;
}
.formItemOne .el-form-item__content {
display: flex;
}
}
</style>

113
src/page-subspecialty/views/modules/optometryManagement/cornea/editPatid.vue

@ -1,113 +0,0 @@
<template>
<el-dialog
class="patientDialog"
:visible.sync="visible"
width="30%"
title="修改身份证"
@close="closedDialog"
>
<el-form ref="dataForm" :model="dataForm" :rules="dataRule">
<el-form-item label="身份证号:" label-width="90px" prop="newIdNumber" class="formItemOne">
<el-input v-model="dataForm.newIdNumber" placeholder="请输入患者身份证号" />
</el-form-item>
</el-form>
<template slot="footer">
<el-button @click="visible = false">{{ $t('cancel') }}</el-button>
<el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button>
</template>
</el-dialog>
</template>
<script>
import debounce from 'lodash/debounce'
export default {
props: {
patientTypeList: {
type: Array,
default: () => []
}
},
data() {
return {
visible: false,
dataForm: {
newIdNumber: '',
oldIdNumber: '',
drgsName: window.localStorage.getItem('identity')
}
}
},
computed: {
dataRule() {
return {
newIdNumber: [
{ required: true, message: '请输入身份证号', trigger: 'blur' }
]
}
}
},
methods: {
init() {
this.visible = true
this.$nextTick(() => {
this.$refs.dataForm.resetFields() //
})
},
//
dataFormSubmitHandle: debounce(function() {
this.$refs.dataForm.validate((valid) => {
if (!valid) {
return false
}
this.$http.post('/pat/Manage/updateIdNumber', this.dataForm).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.visible = false
this.$emit('refreshDataList')
}
})
}).catch(() => {})
})
}, 1000, { leading: true, trailing: false }),
// dialog
closedDialog() {
this.$emit('editPatidVisible')
}
}
}
</script>
<style lang="scss" scoped>
.patientDialog {
.cycle-display {
.el-form-item__content {
display: flex;
}
.el-input-number {
width: 100px;
margin-right: 16px;
}
}
}
</style>
<style lang="scss">
.patientDialog {
.el-dialog__header {
margin-bottom:12px
}
.el-dialog__body {
padding-right: 30px;
}
.formItemOne .el-form-item__content {
display: flex;
}
}
</style>

334
src/page-subspecialty/views/modules/optometryManagement/cornea/index.vue

@ -1,334 +0,0 @@
<template>
<div class="corneaMgt">
<template>
<div v-if="!detailViewVisible">
<div class="patient-info-head">
<el-form :inline="true" :model="dataForm" class="demo-form-inline" @keyup.enter.native="getDataListInitial()">
<el-form-item label="登记号:">
<el-input v-model="dataForm.patientId" size="small" clearable placeholder="登记号" @clear="getDataListInitial()" />
</el-form-item>
<el-form-item label="患者姓名:">
<el-input v-model="dataForm.patientName" placeholder="患者姓名" size="small" clearable @clear="getDataListInitial()" />
</el-form-item>
<el-form-item label="身份证:">
<el-input v-model="dataForm.patientIdNumber" size="small" clearable placeholder="身份证" @clear="getDataListInitial()" />
</el-form-item>
<el-form-item prop="dateRange" label="就诊时间" class="form-item-date">
<el-date-picker
v-model="nextVisitTime"
size="small"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
@change="dateChange"
/>
</el-form-item>
<el-form-item style="flex:1">
<el-button type="primary" icon="el-icon-search" size="small" @click="getDataListInitial()">查询</el-button>
</el-form-item>
</el-form>
</div>
<div style="display: flex;justify-content: space-between;background-color: white;padding: 16px 16px 0">
<div>
<el-button v-for="(item,index) in typeList" :key="index" :class="[curIndex === index ? 'active' : '']" style="margin-left: 0" size="small" color="white" @click="handleType(item.value, index)">{{ item.label }}</el-button>
</div>
<div>
<el-button type="primary" size="small" @click="HISHandle">
<svg-icon icon-class="icon-HIS-up" style="font-size:12px;" />
<span style="padding-left:5px;vertical-align: middle;">HIS引入</span>
</el-button>
</div>
</div>
<div v-loading="dataListLoading" class="patient-info-content">
<el-table
ref="multipleTable"
:data="dataList"
tooltip-effect="dark"
style="width: 100%"
@sort-change="dataListSortChangeHandle"
>
<el-table-column prop="patientId" label="登记号 " header-align="center" align="center" />
<el-table-column prop="patientName" label="患者姓名" header-align="center" align="center" />
<el-table-column prop="brand" label="品牌" header-align="center" align="center">
<template slot-scope="scope">
<div v-if="scope.row.brandEyeTypeList && scope.row.brandEyeTypeList.length">
<span class="odType">{{ scope.row.brandEyeTypeList[0]. brand }}</span>
<span class="osType">{{ scope.row.brandEyeTypeList[1] ? '/' + scope.row.brandEyeTypeList[1].brand : ''}}</span>
</div>
</template>
</el-table-column>
<el-table-column prop="eyeType" label="眼别" header-align="center" align="center">
<template slot-scope="scope">
<div v-if="scope.row.brandEyeTypeList && scope.row.brandEyeTypeList.length">
<span class="odType">{{ scope.row.brandEyeTypeList[0].eyeType }}</span>
<span class="osType">{{ scope.row.brandEyeTypeList[1] ? '/' + scope.row.brandEyeTypeList[1].eyeType : ''}}</span>
</div>
</template>
</el-table-column>
<el-table-column prop="patientSex" label="患者性别" header-align="center" align="center" />
<el-table-column prop="djTime" label="戴镜时间" header-align="center" align="center" />
<el-table-column label="出生日期" header-align="center" align="center">
<template slot-scope="scope">
{{ scope.row.patientBirthday ? $options.filters.dateFilterTwo( scope.row.patientBirthday): '- ' }}
</template>
</el-table-column>
<el-table-column prop="doctor" label="负责医生" header-align="center" align="center">
<template slot-scope="scope">
<el-select v-model="scope.row.doctorName" class="eyeType" placeholder="" size="small" @change="value=>changeDoctor(value,scope.row,1)">
<el-option
v-for="item in doctorList"
:key="item.employeeId"
:label="item.realName"
:value="item.employeeId"
/>
</el-select>
</template>
</el-table-column>
<el-table-column prop="opDoctor" label="验配师" header-align="center" align="center">
<template slot-scope="scope">
<el-select v-model="scope.row.ypName" class="eyeType" placeholder="" size="small" @change="value=>changeDoctor(value,scope.row)">
<el-option
v-for="item in doctorList"
:key="item.employeeId"
:label="item.realName"
:value="item.employeeId"
/>
</el-select>
</template>
</el-table-column>
<el-table-column prop="operation" label="操作" header-align="center" align="center">
<template slot-scope="scope">
<span
style="color: #1890ff; padding-right: 8px"
class="operation-details"
@click="browseClick(scope.row)"
>OK镜</span>
</template>
</el-table-column>
</el-table>
<el-pagination background layout="total,prev, pager, next" :total="total" :current-page.sync="page" @current-change="pageCurrentChangeHandle" />
</div>
</div>
<!-- 弹窗, 新增 / 修改 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataListInitial" />
<!-- HIS引入弹框 -->
<his-add v-if="HisAddVisible" ref="HisAddRef" />
</template>
</div>
</template>
<script>
import checked from '@/mixins/checked'
import headTemplate from '@/components/head'
import mixinViewModule from '@/mixins/view-module'
import AddOrUpdate from './patient-add-or-update'
import hisAdd from './HIS-add'
export default {
components: {
headTemplate,
AddOrUpdate,
hisAdd
},
mixins: [checked, mixinViewModule],
data() {
return {
mixinViewModuleOptions: {
getDataListURL: '/lenses/page',
// getDataListURL: '/patient/page',
getDataListIsPage: true
},
nextVisitTime: [],
detailViewVisible: false,
HisAddVisible: false,
dataForm: {
// platform: 3,
patientId: '',
beginDate: '',
endDate: '',
// searchType: '0',
patientName: '',
patientStatus: '',
patientIdNumber: '',
nextCheckFlag: ''
},
addGroupVisible: false,
patientIdNumber: '',
detailId: '',
curIndex: 0,
doctorList: [],
typeList: [
{
value: '',
label: '全部'
}, {
value: '1',
label: '待查'
}, {
value: '3',
label: '今日已诊'
}, {
value: '2',
label: '超时'
}]
}
},
created() {
this.getDoctorList()
},
methods: {
reFresh() {
this.pageCurrentChangeHandle(this.page)
},
//
browseClick(scopeRow) {
this.$router.push({
path: '/patientInfo',
query: {
info: this.$Base64.encode(JSON.stringify({
patientIdNumber: scopeRow.patientIdNumber,
patientId: scopeRow.patientId
}))
}
})
},
handleType(value, index) {
this.curIndex = index
this.dataForm.nextCheckFlag = value
this.getDataListInitial()
},
//
changeDoctor(value, scopeRow, type) {
const params = {}
params.id = scopeRow.id
// let ypCode = ''
// let doctorCode = ''
if (type) {
params.doctorCode = value
} else {
params.ypCode = value
}
this.$http.post('lenses/updateDoctorInfo', params).then(res => {
this.getDataList()
})
},
//
dateChange(e) {
this.dataForm.beginDate = e ? e[0] : ''
this.dataForm.endDate = e ? e[1] : ''
this.getDataListInitial()
},
// His
HISHandle() {
this.HisAddVisible = true
this.$nextTick(() => {
this.$refs.HisAddRef.init()
})
},
//
getDoctorList(val) {
this.$http.get('/sys/user').then(res => {
this.doctorList = res.data.data
})
}
}
}
</script>
<style lang="scss" scoped>
.odType{
color: #409EFF;
}
.osType{
color: #67C23A;
}
.corneaMgt {
width: 100%;
height: 100%;
.patient-info-head,
.patient-info-content {
background: #fff;
.head {
padding-bottom: 10px;
}
}
.patient-info-content {
padding: 16px;
margin-bottom: 45px;
::v-deep .el-input__suffix{
display: none;
}
::v-deep .el-input__inner{
border: 0;
font-size: 16px;
text-align: center;
padding: 0;
}
}
.patient-info-head {
margin-bottom: 16px;
padding: 10px 16px;
}
.operation-delete,
.operation-details {
cursor: pointer;
}
}
</style>
<style lang="scss">
.corneaMgt {
.patient-info-head {
.el-form {
display: flex;
justify-content: space-between;
}
.el-form-item {
display: flex;
}
.el-form-item__label {
min-width: 75px;
}
.el-form-item {
margin-bottom: 0;
width: 25%;
}
.el-form-item__content,
.el-select,
.el-range-editor--small.el-input__inner {
width: 100%;
}
.form-item-date .el-form-item__content {
min-width: 180px;
}
}
.el-select {
width: 100%;
}
.detail-view {
height: 100%;
background: #0c1016;
padding: 0;
}
.detail-view .el-dialog .el-dialog__header > .el-dialog__title{
color: #FFFFFF;
}
.detail-view .el-dialog > .el-dialog__header{
width: 100%;
height: 48px;
line-height: 48px;
text-align: center;
background: linear-gradient(180deg,#0c1016, #2c3543 100%);
padding: 0;
}
.detail-view .el-dialog > .el-dialog__body{
height: calc(100% - 48px);
flex: 1;
background: #0c1016;
padding: 0;
}
.active{
color: #3ea3f6;
background-color: #e0f2fd;
border-color: #3ea3f6;
}
}
</style>

296
src/page-subspecialty/views/modules/optometryManagement/cornea/patient-add-or-update.vue

@ -1,296 +0,0 @@
<template>
<el-dialog
class="patientDialog"
:visible.sync="visible"
width="40%"
:title="dataForm.title"
@close="closeDialog"
>
<el-form ref="dataForm" :model="dataForm" :rules="dataRule">
<el-form-item label="登记号:" label-width="120px" prop="patientId" class="formItemOne">
<el-input v-model="dataForm.patientId" placeholder="请输入登记号" />
</el-form-item>
<el-form-item label="患者姓名:" label-width="120px" prop="patientName">
<el-input v-model="dataForm.patientName" placeholder="请输入姓名" />
</el-form-item>
<el-form-item label="身份证号:" label-width="120px" prop="patientIdNumber">
<el-input v-model="dataForm.patientIdNumber" placeholder="请输入身份证号" @change="handleBirth" />
</el-form-item>
<el-form-item label="出生日期:" label-width="120px" prop="patientBirthday">
<el-date-picker
v-model="dataForm.patientBirthday"
align="right"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
/>
</el-form-item>
<el-form-item label="性别:" label-width="120px" prop="gender">
<el-radio-group v-model="dataForm.patientSex" size="medium">
<el-radio-button label="男"></el-radio-button>
<el-radio-button label="女"></el-radio-button>
<el-radio-button label="保密">保密</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="联系电话:" label-width="120px" prop="patientPhone">
<el-input v-model="dataForm.patientPhone" placeholder="请输入手机号" />
</el-form-item>
<el-form-item label="家庭地址:" label-width="120px" prop="patientAddress">
<el-input v-model="dataForm.patientAddress" placeholder="请输入地址" />
</el-form-item>
<div style="border-bottom: 1px solid #ccc;margin-bottom: 20px" />
<el-form-item required label="患者来源:" prop="patientSource" label-width="120px">
<el-select v-model="dataForm.patientSource" placeholder="请选择患者来源">
<el-option
v-for="item in sourceList"
:key="item.value"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="门诊医师:" prop="mzDoctorId" label-width="120px">
<el-select v-model="dataForm.mzDoctorId" placeholder="请选择门诊医师">
<el-option
v-for="item in mzDoctorList"
:key="item.id"
:label="item.realName"
:value="item.employeeId
"
/>
</el-select>
</el-form-item>
<el-form-item label="视光医师" prop="sgDoctorId" label-width="120px">
<el-select v-model="dataForm.sgDoctorId" placeholder="请选择视光医师">
<el-option
v-for="item in sgDoctorList"
:key="item.id"
:label="item.realName"
:value="item.employeeId
"
/>
</el-select>
</el-form-item>
<el-form-item label="眼别:" prop="zlEye" label-width="120px">
<el-select v-model="dataForm.zlEye" placeholder="请选择眼别">
<el-option v-for="item in zlEyeList" :key="item.value" :label="item.name" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="医疗项目:" label-width="120px" prop="zlProjectCode">
<el-select v-model="dataForm.zlProjectCode" multiple placeholder="请选择医疗项目">
<el-option
v-for="item in projectList"
:key="item.itemId"
:label="item.itemName"
:value="item.itemId
"
/>
</el-select>
</el-form-item>
<el-form-item label="备注:" label-width="120px" prop="remarks">
<el-input v-model="dataForm.remark" type="textarea" />
</el-form-item>
</el-form>
<template slot="footer">
<el-button @click="visible = false">{{ $t('cancel') }}</el-button>
<el-button :disabled="disabled" type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button>
</template>
</el-dialog>
</template>
<script>
import debounce from 'lodash/debounce'
import { isMobile, isIDNumber } from '@/utils/validate'
export default {
data() {
return {
disabled: false,
visible: false,
dataForm: {
registerType: 1,
// platform: 3,
patientId: '',
patientName: '',
patientIdNumber: '',
patientSex: '男',
patientPhone: '',
patientAddress: '',
patientBirthday: '',
mzDoctorId: '', //
sgDoctorId: '', //
patientSource: '',
zlEye: 'ou',
zlProjectCode: [],
visitId: '',
remark: ''
},
zlEyeList: [
{ name: '左眼', value: 'os' },
{ name: '右眼', value: 'od' },
{ name: '双眼', value: 'ou' }
],
sourceList: [{
name: '门诊',
value: '门诊'
}, {
name: '住院',
value: '住院'
}
],
params: {},
mzDoctorList: [],
sgDoctorList: [],
projectList: []
}
},
computed: {
dataRule() {
var validataMobile = (rule, value, callback) => {
if (value && !isMobile(value)) {
return callback(new Error('您输入的手机号格式不正确'))
}
callback()
}
var validataIDNumber = (rule, value, callback) => {
if (value && !isIDNumber(value)) {
return callback(new Error('您输入的身份证格式不正确'))
} else if (!value) {
return callback(new Error('请输入身份证号'))
}
callback()
}
return {
patientId: [
{ required: true, message: '请输入登记号', trigger: 'blur' }
],
patientName: [
{ required: true, message: '请输入患者姓名', trigger: 'blur' }
],
patientIdNumber: [
{ validator: validataIDNumber, trigger: 'blur' }
],
sgDoctorId: [
{ required: false, message: '请选择视光医师', trigger: 'blur' }
],
patientSource: [
{ required: true, message: '请选择患者来源', trigger: 'blur' }
]
}
}
},
methods: {
init() {
this.visible = true
this.dataForm.registerType = 1
this.getDoctorList('视光医师')
this.getDoctorList('门诊医师')
this.getProject()
this.$nextTick(() => {
this.$refs.dataForm.resetFields() //
if (this.params.patientId && this.dataForm.title !== 'HIS引入') {
this.dataForm = {
title: this.dataForm.title,
...this.params
}
} else if (this.dataForm.title === 'HIS引入') {
this.getHisInfo()
}
})
},
handleBirth(value) {
if (value) {
const year = value.substr(6, 4)
const month = value.substr(10, 2)
const day = value.substr(12, 2)
this.dataForm.patientBirthday = `${year}-${month}-${day}`
}
},
//
getDoctorList(val) {
this.$http.get('/sys/user', { params: { position: val }}).then(data => {
if (val === '视光医师') {
this.sgDoctorList = data.data.data
} else {
this.mzDoctorList = data.data.data
}
// this.dataForm.sgDoctorId = JSON.parse(window.sessionStorage.getItem('qg-userData')).employeeId
})
},
//
getProject() {
this.$http.get('/patient/getZlItemDict', { params: { type: this.dataForm.platform }}).then(data => {
this.projectList = data.data.data
})
},
// His
getHisInfo() {
this.dataForm = { ...this.dataForm, ...this.params }
this.dataForm.revisitCycles = this.dataForm.revisitCycles ? this.dataForm.revisitCycles : '1'
this.dataForm.revisitCyclesUnit = this.dataForm.revisitCyclesUnit ? this.dataForm.revisitCyclesUnit : '3'
this.dataForm.registerType = 0
},
//
dataFormSubmitHandle: debounce(function() {
this.disabled = true
this.$refs.dataForm.validate((valid) => {
if (!valid) {
this.disabled = false
return false
}
this.dataForm.zlProjectCode = this.dataForm.zlProjectCode.length && this.dataForm.zlProjectCode.join(',')
this.$http[!this.dataForm.id ? 'post' : 'put']('/patient/savePatient', this.dataForm)
.then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.visible = false
this.$emit('refreshDataList')
}
})
})
.catch(() => {})
.finally(() => { this.disabled = false })
})
}, 1000, { leading: true, trailing: false }),
//
closeDialog() {
this.$emit('closeDialog')
}
}
}
</script>
<style lang="scss" scoped>
.patientDialog {
.cycle-display {
.el-form-item__content {
display: flex;
}
.el-input-number {
width: 100px;
margin-right: 16px;
}
}
}
</style>
<style lang="scss">
.patientDialog {
.el-dialog__header {
margin-bottom:12px
}
.el-dialog__body {
padding-right: 30px;
}
.formItemOne .el-form-item__content {
display: flex;
}
.el-date-editor.el-input, .el-date-editor.el-input__inner {
width: 100%;
}
}
</style>

151
src/page-subspecialty/views/modules/optometryManagement/dioptric/HIS-add.vue

@ -1,151 +0,0 @@
<template>
<el-dialog
class="HIS-dialog"
:visible.sync="visible"
width="60%"
title="HIS查询"
>
<el-form ref="dataFormHis" :inline="true" :model="dataFormHis" class="demo-form-inline" :rules="dataRule" @keyup.enter.native="findHandle(2)">
<el-form-item prop="patientId">
<el-input v-model="dataFormHis.patientId" placeholder="请输入登记号" clearable />
</el-form-item>
<el-form-item prop="patientName">
<el-input v-model="dataFormHis.patientName" placeholder="请输入姓名" clearable />
</el-form-item>
<el-form-item prop="patientIdNumber">
<el-input v-model="dataFormHis.patientIdNumber" placeholder="请输入身份证号" clearable />
</el-form-item>
<el-col :span="6">
<el-form-item>
<el-button type="primary" @click="findHandle(2)">查询</el-button>
<el-button @click="visible = !visible">取消</el-button>
</el-form-item>
</el-col>
</el-form>
<el-table v-loading="loading" :data="tableData" style="margin-bottom: 32px" height="500">
<template slot="empty">
<span style="color: #969799;">{{ tableText }}</span>
</template>
<el-table-column property="patientId" label="登记号" />
<el-table-column property="patientName" label="患者姓名" />
<el-table-column property="patientIdNumber" label="身份证号" />
<el-table-column property="patientPhone" label="联系电话" />
<el-table-column property="zlProject" label="医疗项目" width="140" />
<el-table-column property="remark" label="备注" width="140" />
<!-- <el-table-column property="patientAddress" label="家庭地址" />-->
<el-table-column label="操作" width="80">
<template slot-scope="scope">
<p class="introduce" @click="introduceHandle(scope.row)">引入</p>
</template>
</el-table-column>
</el-table>
</el-dialog>
</template>
<script>
export default {
data() {
return {
visible: false,
dataFormHis: {
patientId: '',
patientName: '',
patientIdNumber: ''
},
dataForm: {},
tableData: [],
tableText: '请查询所需数据',
loading: false
}
},
computed: {
dataRule() {
return {
patientId: [
{ message: '请输入登记号', trigger: 'blur' }
],
patientName: [
{ message: '请输入姓名', trigger: 'blur' }
],
patientIdNumber: [
{ message: '请输入身份证号', trigger: 'blur' }
]
}
}
},
methods: {
init() {
this.visible = true
this.$nextTick(() => {
this.tableText = '请查询所需数据'
this.$refs.dataFormHis.resetFields() //
this.tableData = []
})
},
// His
async findHandle(flag) {
if (flag === 2 && !this.dataFormHis.patientId && !this.dataFormHis.patientName && !this.dataFormHis.patientIdNumber) {
return this.$message.error('搜索内容不能为空')
}
this.loading = true
const { data: res } = await this.$http.get('/patient/getHisPatient', {
params: this.dataFormHis
})
if (res.code === 0) {
this.loading = false
this.tableData = res.data
if (res.data.length <= 0 && flag === 2) {
this.tableText = '查询成功,未查询到相关数据'
} else if (res.data.length <= 0 && flag === 1) {
this.tableText = '请查询所需数据'
}
} else {
this.loading = false
this.tableText = res.msg
this.$message.error(res.msg)
}
},
//
async introduceHandle(scopwRow) {
this.visible = false
this.$parent.addOrUpdateHandle('', scopwRow, 'HIS引入')
}
}
}
</script>
<style lang="scss" scoped>
.HIS-dialog {
box-sizing: border-box;
.cycle-display {
.el-form-item__content {
display: flex;
}
.el-input-number {
width: 100px;
margin-right: 16px;
}
}
.introduce {
color: #1F78FF;
cursor: pointer;
}
}
</style>
<style lang="scss">
.HIS-dialog {
.el-form {
display: flex;
}
.el-dialog__header {
margin-bottom:12px
}
.el-dialog__body {
padding-right: 30px;
}
.formItemOne .el-form-item__content {
display: flex;
}
}
</style>

113
src/page-subspecialty/views/modules/optometryManagement/dioptric/editPatid.vue

@ -1,113 +0,0 @@
<template>
<el-dialog
class="patientDialog"
:visible.sync="visible"
width="30%"
title="修改身份证"
@close="closedDialog"
>
<el-form ref="dataForm" :model="dataForm" :rules="dataRule">
<el-form-item label="身份证号:" label-width="90px" prop="newIdNumber" class="formItemOne">
<el-input v-model="dataForm.newIdNumber" placeholder="请输入患者身份证号" />
</el-form-item>
</el-form>
<template slot="footer">
<el-button @click="visible = false">{{ $t('cancel') }}</el-button>
<el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button>
</template>
</el-dialog>
</template>
<script>
import debounce from 'lodash/debounce'
export default {
props: {
patientTypeList: {
type: Array,
default: () => []
}
},
data() {
return {
visible: false,
dataForm: {
newIdNumber: '',
oldIdNumber: '',
drgsName: window.localStorage.getItem('identity')
}
}
},
computed: {
dataRule() {
return {
newIdNumber: [
{ required: true, message: '请输入身份证号', trigger: 'blur' }
]
}
}
},
methods: {
init() {
this.visible = true
this.$nextTick(() => {
this.$refs.dataForm.resetFields() //
})
},
//
dataFormSubmitHandle: debounce(function() {
this.$refs.dataForm.validate((valid) => {
if (!valid) {
return false
}
this.$http.post('/pat/Manage/updateIdNumber', this.dataForm).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.visible = false
this.$emit('refreshDataList')
}
})
}).catch(() => {})
})
}, 1000, { leading: true, trailing: false }),
// dialog
closedDialog() {
this.$emit('editPatidVisible')
}
}
}
</script>
<style lang="scss" scoped>
.patientDialog {
.cycle-display {
.el-form-item__content {
display: flex;
}
.el-input-number {
width: 100px;
margin-right: 16px;
}
}
}
</style>
<style lang="scss">
.patientDialog {
.el-dialog__header {
margin-bottom:12px
}
.el-dialog__body {
padding-right: 30px;
}
.formItemOne .el-form-item__content {
display: flex;
}
}
</style>

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

@ -1,388 +0,0 @@
<template>
<!-- 屈光发育档案 -->
<div class="dioptricMgt">
<div v-if="!detailViewVisible" style="height: 100%">
<div class="patient-info-head">
<el-form :inline="true" :model="dataForm" class="demo-form-inline" @keyup.enter.native="getDataListInitial()">
<el-form-item label="登记号:">
<el-input v-model="dataForm.patientId" size="small" clearable placeholder="登记号" @clear="getDataListInitial()" />
</el-form-item>
<el-form-item label="患者姓名:">
<el-input v-model="dataForm.patientName" placeholder="患者姓名" size="small" clearable @clear="getDataListInitial()" />
</el-form-item>
<el-form-item label="身份证:">
<el-input v-model="dataForm.patientIdNumber" size="small" clearable placeholder="身份证" @clear="getDataListInitial()" />
</el-form-item>
<el-form-item prop="dateRange" label="就诊时间" class="form-item-date">
<el-date-picker
v-model="nextVisitTime"
size="small"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
@change="dateChange"
/>
</el-form-item>
<el-form-item style="flex:1">
<el-button type="primary" icon="el-icon-getDataListInitial" size="small" @click="getDataListInitial()">查询</el-button>
</el-form-item>
</el-form>
</div>
<div style="display: flex;justify-content: space-between;background-color: white;padding: 16px 16px 0">
<div>
<el-select v-model="dataForm.searchType" placeholder="请选择" style="width:120px;float: left;margin-right: 16px" size="small" @change="getDataListInitial">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-button v-for="(item,index) in typeList" :key="index" :disabled="buttonDisabled" :class="[curIndex === index ? 'active' : '']" style="margin-left: 0px" size="small" color="white" @click="handleType(item.value, index)">{{ item.label }}</el-button>
</div>
<div>
<el-button type="primary" size="small" @click="handleCallSort()">顺呼</el-button>
<el-button type="primary" size="small" icon="el-icon-plus" @click="addOrUpdateHandle('','','新增患者')">新增</el-button>
<el-button type="primary" size="small" @click="HISHandle">
<svg-icon icon-class="icon-HIS-up" style="font-size:12px;" />
<span style="padding-left:5px;vertical-align: middle;">HIS引入</span>
</el-button>
</div>
</div>
<div v-loading="dataListLoading" class="patient-info-content">
<el-table
ref="multipleTable"
:data="dataList"
tooltip-effect="dark"
style="width: 100%"
>
<el-table-column prop="patientId" label="登记号" header-align="center" align="center" width="110" />
<el-table-column label="状态" header-align="center" align="center" width="70">
<template slot-scope="scope">
{{ scope.row.patientStatus | patientStatus }}
</template>
</el-table-column>
<el-table-column label="患者姓名" header-align="center" align="center" width="90">
<template slot-scope="scope">
{{ scope.row.patientName }}
</template>
</el-table-column>
<el-table-column prop="patientSex" label="性别" header-align="center" align="center" width="60" />
<el-table-column label="出生日期" header-align="center" align="center" width="110">
<template slot-scope="scope">
{{ scope.row.patientBirthday ? $options.filters.dateFilterTwo( scope.row.patientBirthday): '- ' }}
</template>
</el-table-column>
<el-table-column prop="mzDoctorName" label="门诊医师" header-align="center" align="center" width="90" />
<el-table-column prop="sgDoctorName" label="视光师" header-align="center" align="center" width="90" />
<el-table-column prop="zlPorject" label="医疗项目" header-align="center" align="center" width="100">
<template slot-scope="scope">
{{ getYLProject(scope.row.zlProjectList) }}
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" header-align="center" align="center" />
<el-table-column prop="updateDate" label="就诊时间" header-align="center" align="center" width="165" />
<el-table-column prop="callSort" label="排队序号" header-align="center" align="center" width="90" />
<el-table-column prop="callStatus" label="叫号状态" header-align="center" align="center" width="90">
<template slot-scope="scope">
{{ scope.row.callStatus | callStatus }}
</template>
</el-table-column>
<el-table-column prop="operation" label="操作" header-align="center" align="center" width="170">
<template slot-scope="scope">
<span
v-if="scope.row.patientStatus >= '300'"
style="color: #1890ff; padding-right: 8px"
class="operation-details"
@click="handleCall(scope.row,'1')"
>叫号</span>
<!-- v-if="scope.row.callStatus !== '1' && scope.row.callStatus !== '3' && scope.row.callStatus !== '5'"-->
<span
style="color: #1890ff; padding-right: 8px"
class="operation-details"
@click="showDetail(scope.row, 1)"
>接诊</span>
<span
style="color: #1890ff; padding-right: 8px"
class="operation-details"
@click="showDetail(scope.row, 2)"
>患者360</span>
</template>
</el-table-column>
</el-table>
<el-pagination background layout="total,prev, pager, next" :total="total" :current-page.sync="page" @current-change="pageCurrentChangeHandle" />
</div>
</div>
<!-- 弹窗, 新增 / 修改 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataListInitial" />
<!-- HIS引入弹框 -->
<his-add v-if="HisAddVisible" ref="HisAddRef" />
<!-- 详情页 -->
<detail-view v-if="detailViewVisible" ref="viewRef" :only-read="onlyRead" :is-search="'3'" :patient-id="patientId" @detailViewVisible="detailViewVisible=false" />
</div>
</template>
<script>
import mixinViewModule from '@/mixins/view-module'
import tableAutoHeight from '@/mixins/tableAutoHeight'
import AddOrUpdate from './patient-add-or-update'
import hisAdd from './HIS-add'
import detailView from '@/components/360View/index' // 360
export default {
components: {
hisAdd,
AddOrUpdate,
detailView
},
filters: {
callStatus(val) {
switch (val) {
case '1':
return '未叫号'
case '2':
return '已叫号'
case '3':
return '过号'
case '4':
return '呼叫中'
default:
return val
}
},
patientStatus(val) {
switch (val) {
case '200':
return '未报到'
case '300':
return '未诊断'
case '400':
return '已诊'
default:
return val
}
}
},
mixins: [mixinViewModule, tableAutoHeight],
data() {
return {
mixinViewModuleOptions: {
getDataListURL: '/patient/page',
getDataListIsPage: true
},
curIndex: 0,
options: [
{
value: '0',
label: '今天'
}, {
value: '1',
label: '昨天'
}, {
value: '2',
label: '前天'
}, {
value: '3',
label: '近三天'
}, {
value: '4',
label: '近一周'
}, {
value: '5',
label: '近一个月 '
}, {
value: '6',
label: '近半年 '
}, {
value: '',
label: '全部'
}],
typeList: [
{
value: '',
label: '全部'
}, {
value: '200',
label: '未报到'
}, {
value: '300',
label: '未诊'
}, {
value: '400',
label: '已诊'
}],
disabled: false,
nextVisitTime: [],
patientTypeList: [],
onlyRead: false,
detailViewVisible: false,
HisAddVisible: false,
dataForm: {
platform: 3,
patientId: '',
beginDate: '',
endDate: '',
searchType: '0',
patientName: '',
patientStatus: '',
patientIdNumber: ''
},
patientId: '',
patientIdNumber: '',
detailId: ''
}
},
methods: {
reFresh() {
this.pageCurrentChangeHandle(this.page)
},
getYLProject(list) {
if (!list.length) {
return
}
const projects = list.map(item => item.porjectName).join('、')
return projects
},
//
dateChange(e) {
this.dataForm.beginDate = e ? e[0] : ''
this.dataForm.endDate = e ? e[1] : ''
this.dataForm.searchType = e ? '' : '0'
this.getDataListInitial()
},
//
handleType(value, index) {
this.curIndex = index
this.dataForm.patientStatus = value
this.getDataListInitial()
},
// //
async receiveTreat(item) {
const { data: res } = await this.$http.get('/patient/updateSGDoctorAndJzStatus', {
params: {
patientId: item.patientId,
jzNumber: item.jzNumber,
risNo: item.risNo,
platform: 3
}
})
if (res.code === 0) {
} else {
this.$message.error(res.msg)
}
},
//
async handleCallSort() {
const { data: res } = await this.$http.get('/patient/callBySort', {
params: {
platform: 3
}
})
if (res.code === 0) {
} else {
this.$message.error(res.msg)
}
},
//
async handleCall(scopeRow, status) {
this.patientId = scopeRow.patientId
const { data: res } = await this.$http.get('/patient/changeStatus', {
params: {
patientId: this.patientId,
status: status,
platform: 3
}
})
if (res.code === 0) {
} else {
this.$message.error(res.msg)
}
},
//
showDetail(scopeRow, index) {
const list = []
const project = scopeRow.zlProjectList
if (project.length) {
project.forEach(item => {
list.push({ id: item.id, porjectCode: item.porjectCode })
})
}
if (index === 1) {
this.receiveTreat(scopeRow)
}
this.onlyRead = index !== 1
this.detailViewVisible = true
this.patientId = scopeRow.patientId
this.patientIdNumber = scopeRow.patientIdNumber
const mzName = scopeRow.mzDoctorName ? scopeRow.mzDoctorName : ''
const jzNumber = scopeRow.jzNumber ? scopeRow.jzNumber : ''
window.sessionStorage.setItem('mzDoctorName', mzName)
window.sessionStorage.setItem('jzNumber', jzNumber)
window.sessionStorage.setItem('projectItem', list.length ? JSON.stringify(list) : '')
},
// His
HISHandle() {
this.HisAddVisible = true
this.$nextTick(() => {
this.$refs.HisAddRef.init()
})
}
}
}
</script>
<style lang="scss" scoped>
.dioptricMgt {
height: 100%;
.patient-info-head,
.patient-info-content {
background: #fff;
.head {
padding-bottom: 10px;
}
}
.patient-info-content {
width: 100%;
padding: 10px 16px;
box-sizing: border-box;
}
.patient-info-head {
margin-bottom: 10px;
padding: 10px;
}
.operation-delete,
.operation-details {
cursor: pointer;
}
.active{
color: #3ea3f6;
background-color: #e0f2fd;
border-color: #3ea3f6;
}
}
</style>
<style lang="scss">
.dioptricMgt {
.patient-info-head {
.el-form {
display: flex;
justify-content: space-between;
}
.el-form-item {
display: flex;
margin-bottom: 0;
width: 25%;
}
.el-form-item__content,
.el-select,
.el-range-editor--small.el-input__inner {
width: 100%;
}
.form-item-date .el-form-item__content {
min-width: 180px;
}
}
.el-select {
width: 100%;
}
}
</style>

296
src/page-subspecialty/views/modules/optometryManagement/dioptric/patient-add-or-update.vue

@ -1,296 +0,0 @@
<template>
<el-dialog
class="patientDialog"
:visible.sync="visible"
width="40%"
:title="dataForm.title"
@close="closeDialog"
>
<el-form ref="dataForm" :model="dataForm" :rules="dataRule">
<el-form-item label="登记号:" label-width="120px" prop="patientId" class="formItemOne">
<el-input v-model="dataForm.patientId" placeholder="请输入登记号" />
</el-form-item>
<el-form-item label="患者姓名:" label-width="120px" prop="patientName">
<el-input v-model="dataForm.patientName" placeholder="请输入姓名" />
</el-form-item>
<el-form-item label="身份证号:" label-width="120px" prop="patientIdNumber">
<el-input v-model="dataForm.patientIdNumber" placeholder="请输入身份证号" @change="handleBirth" />
</el-form-item>
<el-form-item label="出生日期:" label-width="120px" prop="patientBirthday">
<el-date-picker
v-model="dataForm.patientBirthday"
align="right"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
/>
</el-form-item>
<el-form-item label="性别:" label-width="120px" prop="gender">
<el-radio-group v-model="dataForm.patientSex" size="medium">
<el-radio-button label="男"></el-radio-button>
<el-radio-button label="女"></el-radio-button>
<el-radio-button label="保密">保密</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="联系电话:" label-width="120px" prop="patientPhone">
<el-input v-model="dataForm.patientPhone" placeholder="请输入手机号" />
</el-form-item>
<el-form-item label="家庭地址:" label-width="120px" prop="patientAddress">
<el-input v-model="dataForm.patientAddress" placeholder="请输入地址" />
</el-form-item>
<div style="border-bottom: 1px solid #ccc;margin-bottom: 20px" />
<el-form-item required label="患者来源:" prop="patientSource" label-width="120px">
<el-select v-model="dataForm.patientSource" filterable allow-create clearable placeholder="请选择患者来源">
<el-option
v-for="item in sourceList"
:key="item.value"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="门诊医师:" prop="mzDoctorId" label-width="120px">
<el-select v-model="dataForm.mzDoctorId" filterable allow-create clearable placeholder="请选择门诊医师">
<el-option
v-for="item in mzDoctorList"
:key="item.id"
:label="item.realName"
:value="item.employeeId
"
/>
</el-select>
</el-form-item>
<el-form-item label="视光医师" prop="sgDoctorId" label-width="120px">
<el-select v-model="dataForm.sgDoctorId" filterable allow-create clearable placeholder="请选择视光医师">
<el-option
v-for="item in sgDoctorList"
:key="item.id"
:label="item.realName"
:value="item.employeeId
"
/>
</el-select>
</el-form-item>
<el-form-item label="眼别:" prop="zlEye" label-width="120px">
<el-select v-model="dataForm.zlEye" filterable allow-create clearable placeholder="请选择眼别">
<el-option v-for="item in zlEyeList" :key="item.value" :label="item.name" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="医疗项目:" label-width="120px" prop="zlProjectCode">
<el-select v-model="dataForm.zlProjectCode" filterable allow-create clearable multiple placeholder="请选择医疗项目">
<el-option
v-for="item in projectList"
:key="item.itemId"
:label="item.itemName"
:value="item.itemId
"
/>
</el-select>
</el-form-item>
<el-form-item label="备注:" label-width="120px" prop="remarks">
<el-input v-model="dataForm.remark" type="textarea" />
</el-form-item>
</el-form>
<template slot="footer">
<el-button @click="visible = false">{{ $t('cancel') }}</el-button>
<el-button :disabled="disabled" type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button>
</template>
</el-dialog>
</template>
<script>
import debounce from 'lodash/debounce'
import { isMobile, isIDNumber } from '@/utils/validate'
export default {
data() {
return {
disabled: false,
visible: false,
dataForm: {
registerType: 1,
platform: 3,
patientId: '',
patientName: '',
patientIdNumber: '',
patientSex: '男',
patientPhone: '',
patientAddress: '',
patientBirthday: '',
mzDoctorId: '', //
sgDoctorId: '', //
patientSource: '',
zlEye: 'ou',
zlProjectCode: [],
visitId: '',
remark: ''
},
zlEyeList: [
{ name: '左眼', value: 'os' },
{ name: '右眼', value: 'od' },
{ name: '双眼', value: 'ou' }
],
sourceList: [{
name: '门诊',
value: '门诊'
}, {
name: '住院',
value: '住院'
}
],
params: {},
mzDoctorList: [],
sgDoctorList: [],
projectList: []
}
},
computed: {
dataRule() {
var validataMobile = (rule, value, callback) => {
if (value && !isMobile(value)) {
return callback(new Error('您输入的手机号格式不正确'))
}
callback()
}
var validataIDNumber = (rule, value, callback) => {
if (value && !isIDNumber(value)) {
return callback(new Error('您输入的身份证格式不正确'))
} else if (!value) {
return callback(new Error('请输入身份证号'))
}
callback()
}
return {
patientId: [
{ required: true, message: '请输入登记号', trigger: 'blur' }
],
patientName: [
{ required: true, message: '请输入患者姓名', trigger: 'blur' }
],
patientIdNumber: [
{ validator: validataIDNumber, trigger: 'blur' }
],
sgDoctorId: [
{ required: true, message: '请选择视光医师', trigger: 'blur' }
],
patientSource: [
{ required: true, message: '请选择患者来源', trigger: 'blur' }
]
}
}
},
methods: {
init() {
this.visible = true
this.dataForm.registerType = 1
this.getDoctorList('视光医师')
this.getDoctorList('门诊医师')
this.getProject()
this.$nextTick(() => {
this.$refs.dataForm.resetFields() //
if (this.params.patientId && this.dataForm.title !== 'HIS引入') {
this.dataForm = {
title: this.dataForm.title,
...this.params
}
} else if (this.dataForm.title === 'HIS引入') {
this.getHisInfo()
}
})
},
handleBirth(value) {
if (value) {
const year = value.substr(6, 4)
const month = value.substr(10, 2)
const day = value.substr(12, 2)
this.dataForm.patientBirthday = `${year}-${month}-${day}`
}
},
//
getDoctorList(val) {
this.$http.get('/sys/user', { params: { position: val }}).then(data => {
if (val === '视光医师') {
this.sgDoctorList = data.data.data
} else {
this.mzDoctorList = data.data.data
}
this.dataForm.sgDoctorId = JSON.parse(window.sessionStorage.getItem('qg-userData')).employeeId
})
},
//
getProject() {
this.$http.get('/patient/getZlItemDict', { params: { type: this.dataForm.platform }}).then(data => {
this.projectList = data.data.data
})
},
// His
getHisInfo() {
this.dataForm = { ...this.dataForm, ...this.params }
this.dataForm.revisitCycles = this.dataForm.revisitCycles ? this.dataForm.revisitCycles : '1'
this.dataForm.revisitCyclesUnit = this.dataForm.revisitCyclesUnit ? this.dataForm.revisitCyclesUnit : '3'
this.dataForm.registerType = 0
},
//
dataFormSubmitHandle: debounce(function() {
this.disabled = true
this.$refs.dataForm.validate((valid) => {
if (!valid) {
this.disabled = false
return false
}
this.dataForm.zlProjectCode = this.dataForm.zlProjectCode.length && this.dataForm.zlProjectCode.join(',')
this.$http[!this.dataForm.id ? 'post' : 'put']('/patient/savePatient', this.dataForm)
.then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.visible = false
this.$emit('refreshDataList')
}
})
})
.catch(() => {})
.finally(() => { this.disabled = false })
})
}, 1000, { leading: true, trailing: false }),
//
closeDialog() {
this.$emit('closeDialog')
}
}
}
</script>
<style lang="scss" scoped>
.patientDialog {
.cycle-display {
.el-form-item__content {
display: flex;
}
.el-input-number {
width: 100px;
margin-right: 16px;
}
}
}
</style>
<style lang="scss">
.patientDialog {
.el-dialog__header {
margin-bottom:12px
}
.el-dialog__body {
padding-right: 30px;
}
.formItemOne .el-form-item__content {
display: flex;
}
.el-date-editor.el-input, .el-date-editor.el-input__inner {
width: 100%;
}
}
</style>

3
src/page-subspecialty/views/modules/optometryManagement/index.vue

@ -1,3 +0,0 @@
<template>
<router-view />
</template>

167
src/page-subspecialty/views/modules/optometryManagement/outFocusEye/HIS-add.vue

@ -1,167 +0,0 @@
<template>
<el-dialog
class="HIS-dialog"
:visible.sync="visible"
width="60%"
title="HIS查询"
>
<el-form ref="dataFormHis" :inline="true" :model="dataFormHis" class="demo-form-inline" :rules="dataRule" @keyup.enter.native="findHandle(2)">
<el-form-item prop="patientId">
<el-input v-model="dataFormHis.patientId" placeholder="请输入登记号" clearable />
</el-form-item>
<el-form-item prop="patientName">
<el-input v-model="dataFormHis.patientName" placeholder="请输入姓名" clearable />
</el-form-item>
<el-form-item prop="patientIdNumber">
<el-input v-model="dataFormHis.patientIdNumber" placeholder="请输入身份证号" clearable />
</el-form-item>
<el-col :span="6">
<el-form-item>
<el-button type="primary" @click="findHandle(2)">查询</el-button>
<el-button @click="visible = !visible">取消</el-button>
</el-form-item>
</el-col>
</el-form>
<el-table v-loading="loading" :data="tableData" style="margin-bottom: 32px" height="500">
<template slot="empty">
<span style="color: #969799;">{{ tableText }}</span>
</template>
<el-table-column property="patientId" label="登记号" />
<el-table-column property="patientName" label="患者姓名" />
<el-table-column property="patientIdNumber" label="身份证号" />
<el-table-column property="patientPhone" label="联系电话" />
<el-table-column property="zlProject" label="医疗项目" width="140" />
<el-table-column property="remark" label="备注" width="140" />
<!-- <el-table-column property="patientAddress" label="家庭地址" />-->
<el-table-column label="操作" width="80">
<template slot-scope="scope">
<p class="introduce" @click="introduceHandle(scope.row)">引入</p>
</template>
</el-table-column>
</el-table>
</el-dialog>
</template>
<script>
export default {
data() {
return {
visible: false,
dataFormHis: {
patientId: '',
patientName: '',
patientIdNumber: ''
},
dataForm: {},
tableData: [],
tableText: '请查询所需数据',
loading: false
}
},
computed: {
dataRule() {
return {
patientId: [
{ message: '请输入登记号', trigger: 'blur' }
],
patientName: [
{ message: '请输入姓名', trigger: 'blur' }
],
patientIdNumber: [
{ message: '请输入身份证号', trigger: 'blur' }
]
}
}
},
methods: {
init() {
this.visible = true
this.$nextTick(() => {
this.tableText = '请查询所需数据'
this.$refs.dataFormHis.resetFields() //
this.tableData = []
})
},
// His
async findHandle(flag) {
if (flag === 2 && !this.dataFormHis.patientId && !this.dataFormHis.patientName && !this.dataFormHis.patientIdNumber) {
return this.$message.error('搜索内容不能为空')
}
this.loading = true
const { data: res } = await this.$http.get('/patient/getHisPatient', {
params: this.dataFormHis
})
if (res.code === 0) {
this.loading = false
this.tableData = res.data
if (res.data.length <= 0 && flag === 2) {
this.tableText = '查询成功,未查询到相关数据'
} else if (res.data.length <= 0 && flag === 1) {
this.tableText = '请查询所需数据'
}
} else {
this.loading = false
this.tableText = res.msg
this.$message.error(res.msg)
}
},
//
async introduceHandle(scopwRow) {
this.dataFormHis.patientId = scopwRow.patientId
this.dataFormHis.patientName = scopwRow.patientName
this.visible = false
// this.$parent.addOrUpdateHandle('', scopwRow, 'HIS')
await this.doLeadIn()
},
async doLeadIn() {
this.loading = true
const { data: res } = await this.$http.get('/defocused/doLeadIn', {
params: this.dataFormHis
})
if (res.code === 0) {
this.loading = false
this.$parent.getDataListInitial()
} else {
this.loading = false
this.$message.error(res.msg)
}
}
}
}
</script>
<style lang="scss" scoped>
.HIS-dialog {
box-sizing: border-box;
.cycle-display {
.el-form-item__content {
display: flex;
}
.el-input-number {
width: 100px;
margin-right: 16px;
}
}
.introduce {
color: #1F78FF;
cursor: pointer;
}
}
</style>
<style lang="scss">
.HIS-dialog {
.el-form {
display: flex;
}
.el-dialog__header {
margin-bottom:12px
}
.el-dialog__body {
padding-right: 30px;
}
.formItemOne .el-form-item__content {
display: flex;
}
}
</style>

113
src/page-subspecialty/views/modules/optometryManagement/outFocusEye/editPatid.vue

@ -1,113 +0,0 @@
<template>
<el-dialog
class="patientDialog"
:visible.sync="visible"
width="30%"
title="修改身份证"
@close="closedDialog"
>
<el-form ref="dataForm" :model="dataForm" :rules="dataRule">
<el-form-item label="身份证号:" label-width="90px" prop="newIdNumber" class="formItemOne">
<el-input v-model="dataForm.newIdNumber" placeholder="请输入患者身份证号" />
</el-form-item>
</el-form>
<template slot="footer">
<el-button @click="visible = false">{{ $t('cancel') }}</el-button>
<el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button>
</template>
</el-dialog>
</template>
<script>
import debounce from 'lodash/debounce'
export default {
props: {
patientTypeList: {
type: Array,
default: () => []
}
},
data() {
return {
visible: false,
dataForm: {
newIdNumber: '',
oldIdNumber: '',
drgsName: window.localStorage.getItem('identity')
}
}
},
computed: {
dataRule() {
return {
newIdNumber: [
{ required: true, message: '请输入身份证号', trigger: 'blur' }
]
}
}
},
methods: {
init() {
this.visible = true
this.$nextTick(() => {
this.$refs.dataForm.resetFields() //
})
},
//
dataFormSubmitHandle: debounce(function() {
this.$refs.dataForm.validate((valid) => {
if (!valid) {
return false
}
this.$http.post('/pat/Manage/updateIdNumber', this.dataForm).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.visible = false
this.$emit('refreshDataList')
}
})
}).catch(() => {})
})
}, 1000, { leading: true, trailing: false }),
// dialog
closedDialog() {
this.$emit('editPatidVisible')
}
}
}
</script>
<style lang="scss" scoped>
.patientDialog {
.cycle-display {
.el-form-item__content {
display: flex;
}
.el-input-number {
width: 100px;
margin-right: 16px;
}
}
}
</style>
<style lang="scss">
.patientDialog {
.el-dialog__header {
margin-bottom:12px
}
.el-dialog__body {
padding-right: 30px;
}
.formItemOne .el-form-item__content {
display: flex;
}
}
</style>

211
src/page-subspecialty/views/modules/optometryManagement/outFocusEye/eyeAxis.vue

@ -1,211 +0,0 @@
<template>
<div v-loading="loading">
<div :id="idName" ref="yanyaRef" :style="{ height: height, width: width }" />
</div>
</template>
<script>
import moment from 'moment/moment'
export default {
name: 'EyeAxis',
props: {
idName: { type: String, default: 'chart' },
width: { type: String, default: '100%' },
height: { type: String, default: '200px' },
desc: { type: String, default: '眼轴' },
patientId: {
type: String
}
},
data() {
return {
loading: false,
date: [],
typeList: {
OD: [],
OS: [],
typeNull: []
},
chartData: [],
legendData: [],
seriesData: [],
disabled: false
}
},
mounted() {
this.queryAxisData()
},
methods: {
queryAxisData() {
this.loading = true
this.$http.get('/defocused/getSecDefocusedLine', { params: {
patientId: this.patientId
}}).then(res => {
this.loading = false
console.log(res)
this.chartData = res.data.data
this.initFun()
})
},
initFun() {
this.date = []
this.typeList = {
OD: [],
OS: [],
typeNull: []
}
this.legendData = []
this.seriesData = []
if (this.chartData && this.chartData.length > 0) {
this.disabled = false
this.chartData.forEach(item => {
this.date.push(moment(item.checkDate).format('l'))
this.typeList.OD.push([item.checkDate, item.iolOd])
this.legendData[0] = 'OD'
this.typeList.OS.push([item.checkDate, item.iolOs])
this.legendData[1] = 'OS'
})
} else {
this.disabled = true
}
this.$nextTick(() => {
this.visionFun()
})
},
visionFun() {
// domecharts
const yanya = this.$echarts.init(document.getElementById(this.idName))
var colors = ['#4462FF', '#0DB760', '#000000']
Object.keys(this.typeList).forEach((item, index) => {
if (this.typeList[item].length > 0) {
this.seriesData.push({
name: item,
type: 'line',
// stack: index,
data: this.typeList[item],
label: {
show: true,
position: item === 'OD' ? [-25, -30] : [10, -5],
backgroundColor: item === 'OD' ? '#4a6bff' : '#0db760',
padding: [6, 6],
color: '#ffffff',
// color: 'rgba(24, 24, 24, 0.1)',
borderRadius: 10
},
smooth: true,
itemStyle: {
color: colors[index]
},
symbolSize: 10
})
}
})
// domecharts
yanya.setOption({
title: {
text: this.desc,
textStyle: {
'color': '#000000'
},
left: 10
},
tooltip: {
// trigger: 'axis'
backgroundColor: '#ece6e6',
textStyle: {
color: '#000000' //
},
formatter(params) {
return params.seriesName + '<br/>' + params.data[0] + '&nbsp&nbsp&nbsp' + params.data[1]
}
},
legend: {
data: this.legendData,
icon: 'pin',
textStyle: {
color: '#000000'
},
right: 30
},
dataZoom: [
{
type: 'inside',
disabled: this.disabled,
start: 0,
end: 100
}
],
grid: {
top: 55,
left: 50,
right: 50,
bottom: 30,
containLabel: false
},
xAxis: {
type: 'time',
boundaryGap: false,
axisLabel: {
show: true,
showMaxLabel: true,
textStyle: {
color: '#000000'
},
formatter: function(value, index) {
const showD = moment(value).format('YYYY/M/D')
return showD
}
},
axisLine: {
lineStyle: {
color: 'rgba(24, 24, 24, 0.1)'
}
},
// 线
splitLine: {
show: true
}
},
yAxis: {
type: 'value',
min: function(value) { //
return Math.floor(value.min)
},
max: function(value) { //
return Math.ceil(value.max)
},
splitNumber: 1, //
axisLabel: {
show: true,
textStyle: {
color: '#000000'
}
},
axisLine: {
lineStyle: {
color: 'rgba(24, 24, 24, 0.1)'
}
}
},
series: [
...this.seriesData
]
})
//
window.addEventListener('resize', () => { yanya.resize() })
// div
this.$erd.listenTo(this.$refs.yanyaRef, () => {
this.$nextTick(() => {
yanya.resize()
})
})
}
}
}
</script>
<style scoped>
</style>

361
src/page-subspecialty/views/modules/optometryManagement/outFocusEye/index.vue

@ -1,361 +0,0 @@
<template>
<div class="patient-info">
<template>
<div v-if="!detailViewVisible">
<div class="patient-info-head">
<el-form :inline="true" :model="dataForm" class="demo-form-inline" @keyup.enter.native="getDataListInitial()">
<el-form-item label="登记号:">
<el-input v-model="dataForm.patientId" size="small" clearable placeholder="登记号" @clear="getDataListInitial()" />
</el-form-item>
<el-form-item label="患者姓名:">
<el-input v-model="dataForm.patientName" placeholder="患者姓名" size="small" clearable @clear="getDataListInitial()" />
</el-form-item>
<el-form-item label="身份证:">
<el-input v-model="dataForm.patientIdNumber" size="small" clearable placeholder="身份证" @clear="getDataListInitial()" />
</el-form-item>
<el-form-item prop="dateRange" label="就诊时间" class="form-item-date">
<el-date-picker
v-model="nextVisitTime"
size="small"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
@change="dateChange"
/>
</el-form-item>
<el-form-item style="flex:1">
<el-button type="primary" icon="el-icon-search" size="small" @click="getDataListInitial()">查询</el-button>
</el-form-item>
</el-form>
</div>
<div style="display: flex;justify-content: space-between;background-color: white;padding: 16px 16px 0">
<div>
<el-button v-for="(item,index) in typeList" :key="index" :class="[curIndex === index ? 'active' : '']" style="margin-left: 0" size="small" color="white" @click="handleType(item.value, index)">{{ item.label }}</el-button>
</div>
<div>
<el-button type="primary" size="small" @click="HISHandle">
<svg-icon icon-class="icon-HIS-up" style="font-size:12px;" />
<span style="padding-left:5px;vertical-align: middle;">HIS引入</span>
</el-button>
</div>
</div>
<div v-loading="dataListLoading" class="patient-info-content">
<el-table
ref="multipleTable"
:data="dataList"
tooltip-effect="dark"
style="width: 100%"
@sort-change="dataListSortChangeHandle"
>
<el-table-column prop="patientId" label="登记号 " header-align="center" align="center" />
<el-table-column prop="patientName" label="患者姓名" header-align="center" align="center" />
<el-table-column prop="brand" label="品牌" header-align="center" align="center">
<template slot-scope="scope">
<div v-if="scope.row.brandEyeTypeList && scope.row.brandEyeTypeList.length">
<span class="odType">{{ scope.row.brandEyeTypeList[0]. brand }}</span>
<span class="osType">{{ scope.row.brandEyeTypeList[1] ? '/' + scope.row.brandEyeTypeList[1].brand : '' }}</span>
</div>
</template>
</el-table-column>
<el-table-column prop="eyeType" label="眼别" header-align="center" align="center">
<template slot-scope="scope">
<div v-if="scope.row.brandEyeTypeList && scope.row.brandEyeTypeList.length">
<span class="odType">{{ scope.row.brandEyeTypeList[0].eyeType }}</span>
<span class="osType">{{ scope.row.brandEyeTypeList[1] ? '/' + scope.row.brandEyeTypeList[1].eyeType : ''}}</span>
</div>
</template>
</el-table-column>
<el-table-column prop="patientSex" label="患者性别" header-align="center" align="center" />
<el-table-column label="出生日期" header-align="center" align="center">
<template slot-scope="scope">
{{ scope.row.patientBirthday ? $options.filters.dateFilterTwo( scope.row.patientBirthday): '- ' }}
</template>
</el-table-column>
<el-table-column prop="doctor" label="负责医生" header-align="center" align="center">
<template slot-scope="scope">
<el-select v-model="scope.row.doctorName" class="eyeType" placeholder="" size="small" @change="value=>changeDoctor(value,scope.row,1)">
<el-option
v-for="item in doctorList"
:key="item.employeeId"
:label="item.realName"
:value="item.employeeId"
/>
</el-select>
</template>
</el-table-column>
<el-table-column prop="opDoctor" label="验配师" header-align="center" align="center">
<template slot-scope="scope">
<el-select v-model="scope.row.ypName" class="eyeType" placeholder="" size="small" @change="value=>changeDoctor(value,scope.row)">
<el-option
v-for="item in doctorList"
:key="item.employeeId"
:label="item.realName"
:value="item.employeeId"
/>
</el-select>
</template>
</el-table-column>
<el-table-column prop="operation" label="操作" header-align="center" align="center">
<template slot-scope="scope">
<span
style="color: #1890ff; padding-right: 16px"
class="operation-details"
@click="browseClick(scope.row)"
>离焦眼镜</span>
<span
style="color: #ff183b;"
class="operation-details"
@click="handleDel(scope.row)"
>删除</span>
</template>
</el-table-column>
</el-table>
<el-pagination background layout="total,prev, pager, next" :total="total" :current-page.sync="page" @current-change="pageCurrentChangeHandle" />
</div>
</div>
<!-- 弹窗, 新增 / 修改 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataListInitial" />
<!-- HIS引入弹框 -->
<his-add v-if="HisAddVisible" ref="HisAddRef" />
<out-detail v-if="detailViewVisible" :is-search="'3'" :patient-id="patientId" />
</template>
</div>
</template>
<script>
import checked from '@/mixins/checked'
import headTemplate from '@/components/head'
import mixinViewModule from '@/mixins/view-module'
import AddOrUpdate from './patient-add-or-update'
import hisAdd from './HIS-add'
import outDetail from './outDetail'
export default {
components: {
headTemplate,
AddOrUpdate,
outDetail,
hisAdd
},
mixins: [checked, mixinViewModule],
data() {
return {
mixinViewModuleOptions: {
getDataListURL: '/defocused/page',
getDataListIsPage: true
},
nextVisitTime: [],
detailViewVisible: false,
HisAddVisible: false,
dataForm: {
// platform: 3,
patientId: '',
beginDate: '',
endDate: '',
// searchType: '0',
patientName: '',
patientStatus: '',
patientIdNumber: '',
nextCheckFlag: ''
},
doctorList: [],
typeList: [
{
value: '',
label: '全部'
}, {
value: '1',
label: '待查'
}, {
value: '3',
label: '今日已诊'
}, {
value: '2',
label: '超时'
}],
curIndex: 0,
addGroupVisible: false,
patientId: '',
patientIdNumber: ''
}
},
created() {
this.getDoctorList()
},
methods: {
reFresh() {
this.pageCurrentChangeHandle(this.page)
},
//
browseClick(scopeRow) {
this.detailViewVisible = true
this.patientId = scopeRow.patientId
this.patientIdNumber = scopeRow.patientIdNumber
},
handleType(value, index) {
this.curIndex = index
this.dataForm.nextCheckFlag = value
this.getDataListInitial()
},
//
handleDel(row) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.deletePatient(row.id)
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
},
async deletePatient(id) {
const params = {
id: id
}
const { data: res } = await this.$http.post('/defocused/delPatientInfo', params)
if (res.code === 0) {
this.$message.success('删除成功')
await this.pageCurrentChangeHandle(this.page)
} else {
this.$message.error(res.msg)
}
},
//
changeDoctor(value, scopeRow, type) {
const params = {}
params.id = scopeRow.id
// let ypCode = ''
// let doctorCode = ''
if (type) {
params.doctorCode = value
} else {
params.ypCode = value
}
this.$http.post('/defocused/updateDoctorInfo', params).then(res => {
this.getDataList()
})
},
//
dateChange(e) {
this.dataForm.beginDate = e ? e[0] : ''
this.dataForm.endDate = e ? e[1] : ''
this.getDataListInitial()
},
// His
HISHandle() {
this.HisAddVisible = true
this.$nextTick(() => {
this.$refs.HisAddRef.init()
})
},
//
getDoctorList(val) {
this.$http.get('/sys/user').then(res => {
this.doctorList = res.data.data
})
}
}
}
</script>
<style lang="scss" scoped>
.patient-info {
width: 100%;
height: 100%;
.patient-info-head,
.patient-info-content {
background: #fff;
.head {
padding-bottom: 10px;
}
}
.patient-info-content {
padding: 16px;
margin-bottom: 45px;
::v-deep .el-input__suffix{
display: none;
}
::v-deep .el-input__inner{
border: 0;
font-size: 16px;
text-align: center;
padding: 0;
}
}
.patient-info-head {
margin-bottom: 16px;
padding: 10px 16px;
}
.operation-delete,
.operation-details {
cursor: pointer;
}
.odType{
color: #409EFF;
}
.osType{
color: #67C23A;
}
}
</style>
<style lang="scss">
.patient-info {
.patient-info-head {
.el-form {
display: flex;
justify-content: space-between;
}
.el-form-item {
display: flex;
}
.el-form-item__label {
min-width: 75px;
}
.el-form-item {
margin-bottom: 0;
width: 25%;
}
.el-form-item__content,
.el-select,
.el-range-editor--small.el-input__inner {
width: 100%;
}
.form-item-date .el-form-item__content {
min-width: 180px;
}
}
.el-select {
width: 100%;
}
.detail-view {
height: 100%;
background: #0c1016;
padding: 0;
}
.detail-view .el-dialog .el-dialog__header > .el-dialog__title{
color: #FFFFFF;
}
.detail-view .el-dialog > .el-dialog__header{
width: 100%;
height: 48px;
line-height: 48px;
text-align: center;
background: linear-gradient(180deg,#0c1016, #2c3543 100%);
padding: 0;
}
.detail-view .el-dialog > .el-dialog__body{
height: calc(100% - 48px);
flex: 1;
background: #0c1016;
padding: 0;
}
.active{
color: #3ea3f6;
background-color: #e0f2fd;
border-color: #3ea3f6;
}
}
</style>

379
src/page-subspecialty/views/modules/optometryManagement/outFocusEye/outDetail.vue

@ -1,379 +0,0 @@
<template>
<div class="see-doctor">
<div class="header">
<img :src="require('@/assets/img/back-l.png')" alt="" style="margin-right: 8px;cursor: pointer" @click="backList">
<img :src="require('@/assets/img/boy.png')" alt="">
<p class="head-t">
<span class="head-r">{{ patientInfoObj.patientName }}</span>
<span class="head-r">{{ patientInfoObj.patientSex }}</span>
<span v-if="patientInfoObj.patientAge" class="head-r">{{ patientInfoObj.patientAge }}</span>
<img v-if="patientInfoObj.patientId" class="icon-a" :src="require('@/assets/img/pid.png')" alt="" style="margin-right: 6px;vertical-align: text-top">
<span style="vertical-align: text-bottom">{{ patientInfoObj.patientId }}</span>
</p>
<p class="head-b">
<img v-if="patientInfoObj.patientId" :src="require('@/assets/img/id.png')" alt="" style="margin-right: 6px;vertical-align: middle">
<span class="mr16" style="vertical-align: middle">{{ patientInfoObj.patientId }}</span>
<img v-if="patientInfoObj.patientPhone" :src="require('@/assets/img/phone.png')" alt="" style="margin-right: 6px;vertical-align: middle">
<span class="mr16" style="vertical-align: middle">{{ patientInfoObj.patientPhone }}</span>
<img v-if="patientInfoObj.patientAddress" :src="require('@/assets/img/position.png')" alt="" style="margin-right: 6px;vertical-align: middle">
<span style="vertical-align: middle">{{ patientInfoObj.patientAddress }}</span>
</p>
</div>
<div class="see-docto-right">
<el-tabs v-model="activeName" type="card" @tab-click="TabClick">
<el-tab-pane label="初诊" name="1">
<div style="display: flex;justify-content: flex-end;margin-bottom: 16px">
<el-button type="primary" size="small" @click="saveFirstForm()">保存</el-button>
</div>
<el-table
:data="tableData"
:span-method="objectSpanMethod"
style="width: 100%"
>
<el-table-column
label="初诊信息"
width="220"
align="center"
>
<template slot-scope="scope">
日期
<el-date-picker
style="width: 140px"
v-model="firstForm.checkDate"
value-format="yyyy-MM-dd"
type="date"
placeholder="选择日期"
/>
</template>
</el-table-column>
<el-table-column
width="100"
align="center"
label="眼别"
prop="name"
/>
<el-table-column
align="center"
label="球镜"
>
<template slot-scope="scope">
<el-input v-if="scope.row.ds === '右眼'" v-model="firstForm.dsOd" placeholder="" />
<el-input v-if="scope.row.ds === '左眼'" v-model="firstForm.dsOs" placeholder="" />
</template>
</el-table-column>
<el-table-column
label="柱镜"
align="center"
>
<template slot-scope="scope">
<el-input v-if="scope.row.dc === '右眼'" v-model="firstForm.dcOd" placeholder="" />
<el-input v-if="scope.row.dc === '左眼'" v-model="firstForm.dcOs" placeholder="" />
</template>
</el-table-column>
<el-table-column
label="轴向"
align="center"
>
<template slot-scope="scope">
<el-input v-if="scope.row.a === '右眼'" v-model="firstForm.aod" placeholder="" />
<el-input v-if="scope.row.a === '左眼'" v-model="firstForm.aos" placeholder="" />
</template>
</el-table-column>
<el-table-column
label="矫正视力"
align="center"
>
<template slot-scope="scope">
<el-input v-if="scope.row.va === '右眼'" v-model="firstForm.vaOd" placeholder=""/>
<el-input v-if="scope.row.va === '左眼'" v-model="firstForm.vaOs" placeholder=""/>
</template>
</el-table-column>
<el-table-column
label="瞳距"
align="center"
>
<template slot-scope="scope">
<el-input v-if="scope.row.pd === '右眼'" v-model="firstForm.pdOd" placeholder="" />
<el-input v-if="scope.row.pd === '左眼'" v-model="firstForm.pdOs" placeholder="" />
</template>
</el-table-column>
<el-table-column
label="瞳高"
align="center"
>
<template slot-scope="scope">
<el-input v-if="scope.row.ph === '右眼'" v-model="firstForm.phOd" placeholder="" />
<el-input v-if="scope.row.ph === '左眼'" v-model="firstForm.phOs" placeholder="" />
</template>
</el-table-column>
<el-table-column
label="眼轴"
align="center"
>
<template slot-scope="scope">
<el-input v-if="scope.row.iol === '右眼'" v-model="firstForm.iolOd" placeholder="" />
<el-input v-if="scope.row.iol === '左眼'" v-model="firstForm.iolOs" placeholder="" />
</template>
</el-table-column>
<el-table-column
label="备注"
width="160"
align="center"
>
<template slot-scope="scope">
<el-input type="textarea" :rows="3" v-model="firstForm.remark" placeholder="" />
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="复诊" name="2">
<reviewForm v-if="activeName==='2'" :patient-id="patientId"></reviewForm>
</el-tab-pane>
<el-tab-pane label="眼轴折线图" name="3">
<eye-axis v-if="activeName==='3'" :patient-id="patientId" :id-name="'eyeAxis'" />
<div style="margin-top: 32px">
<sun-axis v-if="activeName==='3'" :patient-id="patientId" :id-name="'sunAxis'" />
</div>
</el-tab-pane>
</el-tabs>
</div>
</div>
</template>
<script>
import eyeAxis from './eyeAxis'
import sunAxis from './sunAxis'
import reviewForm from './reviewForm'
export default {
components: {
eyeAxis,
sunAxis,
reviewForm
},
props: {
patientId: {
type: String,
default: ''
},
onlyRead: {
type: Boolean,
default: false
},
isSearch: {
type: String,
default: ''
}
},
data() {
return {
tableData: [
{
checkDate: '',
name: '右眼',
ds: '右眼',
dc: '右眼',
iol: '右眼',
pd: '右眼',
ph: '右眼',
va: '右眼',
a: '右眼',
remark: ''
},
{
checkDate: '',
name: '左眼',
ds: '左眼',
dc: '左眼',
iol: '左眼',
pd: '左眼',
ph: '左眼',
va: '左眼',
a: '左眼',
remark: ''
}
],
firstForm: {
patientId: '',
checkDate: '',
dcOd: '',
dcOs: '',
dsOd: '',
dsOs: '',
iolOd: '',
iolOs: '',
pdOd: '',
pdOs: '',
phOd: '',
phOs: '',
remark: '',
vaOd: '',
vaOs: '',
aod: '',
aos: ''
},
patientInfoObj: {},
activeName: '1'
}
},
mounted() {
},
created() {
this.getFirstForm()
this.getPatientInfo()
},
methods: {
backList() {
this.$parent.detailViewVisible = false
this.$parent.reFresh()
},
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 0 || columnIndex === 9) {
if (rowIndex % 2 === 0) {
return {
rowspan: 2,
colspan: 1
}
} else {
return {
rowspan: 0,
colspan: 0
}
}
}
},
//
async getPatientInfo() {
this.$http.get('/patient/view/getPatientData', {
params: {
patientId: this.patientId
}
}).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
} else {
this.patientInfoObj = res.data
}
}).catch(() => {})
},
async getFirstForm() {
this.$http.get('/defocused/getFirstDefocused', {
params: {
patientId: this.patientId
}
}).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
} else {
this.firstForm = res.data
this.firstForm.patientId = this.patientId
}
}).catch(() => {})
},
saveFirstForm() {
this.$http.post('/defocused/saveOrUpdateFirstDefocused', this.firstForm).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.getFirstForm()
}
})
}).catch(() => {})
},
TabClick(tab, event) {
}
}
}
</script>
<style lang="scss" scoped>
.see-doctor {
width: 100%;
height: 100%;
.header{
width: 100%;
height: 88px;
padding: 8px;
position: relative;
margin-bottom: 16px;
box-sizing: border-box;
background: #FFFFFF;
border-radius: 4px;
.head-t{
position: absolute;
left: 155px;
top: 20px;
}
.head-b{
position: absolute;
left: 155px;
bottom: 20px;
font-size: 14px;
}
.head-r{
margin-right: 16px;
font-weight: 500;
font-size: 20px;
color: rgba(0, 0, 0, 0.88);
}
}
.mr16{
margin-right: 16px;
}
.see-docto-right{
height: calc( 100vh - 90px - 82px);
overflow: hidden;
}
}
</style>
<style lang="scss">
.see-doctor {
.el-tabs__nav {
z-index:0;
}
.el-tabs__header {
margin: 0;
}
.el-tabs__nav {
background: #fff;
}
.el-tabs__content {
padding: 16px;
background: #fff;
height: calc( 100vh - 145px - 32px - 42px);
}
.el-tabs--card>.el-tabs__header .el-tabs__nav {
border: 1px solid #f0f0f0;
}
.el-tab-pane{
height: 100%;
}
.detail-view {
height: 100%;
background: #0c1016;
padding: 0;
}
.detail-view .el-dialog .el-dialog__header > .el-dialog__title{
color: #FFFFFF;
}
.detail-view .el-dialog > .el-dialog__header{
width: 100%;
height: 48px;
line-height: 48px;
text-align: center;
background: linear-gradient(180deg,#0c1016, #2c3543 100%);
padding: 0;
}
.detail-view .el-dialog > .el-dialog__body{
height: 100%;
flex: 1;
background: #0c1016;
padding: 0;
}
}
</style>

296
src/page-subspecialty/views/modules/optometryManagement/outFocusEye/patient-add-or-update.vue

@ -1,296 +0,0 @@
<template>
<el-dialog
class="patientDialog"
:visible.sync="visible"
width="40%"
:title="dataForm.title"
@close="closeDialog"
>
<el-form ref="dataForm" :model="dataForm" :rules="dataRule">
<el-form-item label="登记号:" label-width="120px" prop="patientId" class="formItemOne">
<el-input v-model="dataForm.patientId" placeholder="请输入登记号" />
</el-form-item>
<el-form-item label="患者姓名:" label-width="120px" prop="patientName">
<el-input v-model="dataForm.patientName" placeholder="请输入姓名" />
</el-form-item>
<el-form-item label="身份证号:" label-width="120px" prop="patientIdNumber">
<el-input v-model="dataForm.patientIdNumber" placeholder="请输入身份证号" @change="handleBirth" />
</el-form-item>
<el-form-item label="出生日期:" label-width="120px" prop="patientBirthday">
<el-date-picker
v-model="dataForm.patientBirthday"
align="right"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
/>
</el-form-item>
<el-form-item label="性别:" label-width="120px" prop="gender">
<el-radio-group v-model="dataForm.patientSex" size="medium">
<el-radio-button label="男"></el-radio-button>
<el-radio-button label="女"></el-radio-button>
<el-radio-button label="保密">保密</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="联系电话:" label-width="120px" prop="patientPhone">
<el-input v-model="dataForm.patientPhone" placeholder="请输入手机号" />
</el-form-item>
<el-form-item label="家庭地址:" label-width="120px" prop="patientAddress">
<el-input v-model="dataForm.patientAddress" placeholder="请输入地址" />
</el-form-item>
<div style="border-bottom: 1px solid #ccc;margin-bottom: 20px" />
<el-form-item required label="患者来源:" prop="patientSource" label-width="120px">
<el-select v-model="dataForm.patientSource" placeholder="请选择患者来源">
<el-option
v-for="item in sourceList"
:key="item.value"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="门诊医师:" prop="mzDoctorId" label-width="120px">
<el-select v-model="dataForm.mzDoctorId" placeholder="请选择门诊医师">
<el-option
v-for="item in mzDoctorList"
:key="item.id"
:label="item.realName"
:value="item.employeeId
"
/>
</el-select>
</el-form-item>
<el-form-item label="视光医师" prop="sgDoctorId" label-width="120px">
<el-select v-model="dataForm.sgDoctorId" placeholder="请选择视光医师">
<el-option
v-for="item in sgDoctorList"
:key="item.id"
:label="item.realName"
:value="item.employeeId
"
/>
</el-select>
</el-form-item>
<el-form-item label="眼别:" prop="zlEye" label-width="120px">
<el-select v-model="dataForm.zlEye" placeholder="请选择眼别">
<el-option v-for="item in zlEyeList" :key="item.value" :label="item.name" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="医疗项目:" label-width="120px" prop="zlProjectCode">
<el-select v-model="dataForm.zlProjectCode" multiple placeholder="请选择医疗项目">
<el-option
v-for="item in projectList"
:key="item.itemId"
:label="item.itemName"
:value="item.itemId
"
/>
</el-select>
</el-form-item>
<el-form-item label="备注:" label-width="120px" prop="remarks">
<el-input v-model="dataForm.remark" type="textarea" />
</el-form-item>
</el-form>
<template slot="footer">
<el-button @click="visible = false">{{ $t('cancel') }}</el-button>
<el-button :disabled="disabled" type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button>
</template>
</el-dialog>
</template>
<script>
import debounce from 'lodash/debounce'
import { isMobile, isIDNumber } from '@/utils/validate'
export default {
data() {
return {
disabled: false,
visible: false,
dataForm: {
registerType: 1,
// platform: 3,
patientId: '',
patientName: '',
patientIdNumber: '',
patientSex: '男',
patientPhone: '',
patientAddress: '',
patientBirthday: '',
mzDoctorId: '', //
sgDoctorId: '', //
patientSource: '',
zlEye: 'ou',
zlProjectCode: [],
visitId: '',
remark: ''
},
zlEyeList: [
{ name: '左眼', value: 'os' },
{ name: '右眼', value: 'od' },
{ name: '双眼', value: 'ou' }
],
sourceList: [{
name: '门诊',
value: '门诊'
}, {
name: '住院',
value: '住院'
}
],
params: {},
mzDoctorList: [],
sgDoctorList: [],
projectList: []
}
},
computed: {
dataRule() {
var validataMobile = (rule, value, callback) => {
if (value && !isMobile(value)) {
return callback(new Error('您输入的手机号格式不正确'))
}
callback()
}
var validataIDNumber = (rule, value, callback) => {
if (value && !isIDNumber(value)) {
return callback(new Error('您输入的身份证格式不正确'))
} else if (!value) {
return callback(new Error('请输入身份证号'))
}
callback()
}
return {
patientId: [
{ required: true, message: '请输入登记号', trigger: 'blur' }
],
patientName: [
{ required: true, message: '请输入患者姓名', trigger: 'blur' }
],
patientIdNumber: [
{ validator: validataIDNumber, trigger: 'blur' }
],
sgDoctorId: [
{ required: false, message: '请选择视光医师', trigger: 'blur' }
],
patientSource: [
{ required: true, message: '请选择患者来源', trigger: 'blur' }
]
}
}
},
methods: {
init() {
this.visible = true
this.dataForm.registerType = 1
this.getDoctorList('视光医师')
this.getDoctorList('门诊医师')
this.getProject()
this.$nextTick(() => {
this.$refs.dataForm.resetFields() //
if (this.params.patientId && this.dataForm.title !== 'HIS引入') {
this.dataForm = {
title: this.dataForm.title,
...this.params
}
} else if (this.dataForm.title === 'HIS引入') {
this.getHisInfo()
}
})
},
handleBirth(value) {
if (value) {
const year = value.substr(6, 4)
const month = value.substr(10, 2)
const day = value.substr(12, 2)
this.dataForm.patientBirthday = `${year}-${month}-${day}`
}
},
//
getDoctorList(val) {
this.$http.get('/sys/user', { params: { position: val }}).then(data => {
if (val === '视光医师') {
this.sgDoctorList = data.data.data
} else {
this.mzDoctorList = data.data.data
}
// this.dataForm.sgDoctorId = JSON.parse(window.sessionStorage.getItem('qg-userData')).employeeId
})
},
//
getProject() {
this.$http.get('/patient/getZlItemDict', { params: { type: this.dataForm.platform }}).then(data => {
this.projectList = data.data.data
})
},
// His
getHisInfo() {
this.dataForm = { ...this.dataForm, ...this.params }
this.dataForm.revisitCycles = this.dataForm.revisitCycles ? this.dataForm.revisitCycles : '1'
this.dataForm.revisitCyclesUnit = this.dataForm.revisitCyclesUnit ? this.dataForm.revisitCyclesUnit : '3'
this.dataForm.registerType = 0
},
//
dataFormSubmitHandle: debounce(function() {
this.disabled = true
this.$refs.dataForm.validate((valid) => {
if (!valid) {
this.disabled = false
return false
}
this.dataForm.zlProjectCode = this.dataForm.zlProjectCode.length && this.dataForm.zlProjectCode.join(',')
this.$http[!this.dataForm.id ? 'post' : 'put']('/patient/savePatient', this.dataForm)
.then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.visible = false
this.$emit('refreshDataList')
}
})
})
.catch(() => {})
.finally(() => { this.disabled = false })
})
}, 1000, { leading: true, trailing: false }),
//
closeDialog() {
this.$emit('closeDialog')
}
}
}
</script>
<style lang="scss" scoped>
.patientDialog {
.cycle-display {
.el-form-item__content {
display: flex;
}
.el-input-number {
width: 100px;
margin-right: 16px;
}
}
}
</style>
<style lang="scss">
.patientDialog {
.el-dialog__header {
margin-bottom:12px
}
.el-dialog__body {
padding-right: 30px;
}
.formItemOne .el-form-item__content {
display: flex;
}
.el-date-editor.el-input, .el-date-editor.el-input__inner {
width: 100%;
}
}
</style>

408
src/page-subspecialty/views/modules/optometryManagement/outFocusEye/reviewForm.vue

@ -1,408 +0,0 @@
<template>
<div class="reviewContain">
<div class="reviewLeft">
<div class="content-top">
<div v-for="(item, index) in formList" :key="index" class="formBox" :class="[index === curIndex ? 'active' : '']" @click="handleForm(index, item)">
<div style="display: flex;padding: 2px 0">
<p :class="[index === curIndex ? 'activeFont' : 'curFont']">{{ item.checkDate }}</p>
<i v-if="index === curIndex" style="margin-top: 5px;color: rgb(199,5,5);margin-left: 12px" class="el-icon-delete" @click="deleteForm(item.id)" />
</div>
</div>
<img v-if="!formList.length" src="@/assets/img/nodata.png" alt="" class="nodata">
</div>
<div class="content-bottom">
<div class="commonForm-text">
<span>常用表单</span>
<span class="line" />
</div>
<div class="record">
<p>离焦眼镜复查单</p>
<img :src="require('@/assets/img/add.png')" alt="" @click="addRecord()">
</div>
</div>
</div>
<div class="reviewRight">
<div v-if="formList.length">
<div style="display: flex;justify-content: flex-end;margin-bottom: 16px">
<el-button type="primary" size="small" @click="saveSecondForm()">保存</el-button>
</div>
<el-table
:data="tableData"
:span-method="objectSecondMethod"
style="width: 100%"
>
<el-table-column
label="复诊记录"
width="220"
align="center"
>
<template slot-scope="scope">
日期
<el-date-picker
v-model="secondForm.checkDate"
style="width: 140px"
value-format="yyyy-MM-dd"
type="date"
placeholder="选择日期"
/>
<!-- <el-input v-model="secondForm.checkDate" placeholder="" style="width: 100px" />-->
</template>
</el-table-column>
<el-table-column
width="100"
align="center"
label="眼别"
prop="name"
/>
<el-table-column
align="center"
label="球镜"
>
<template slot-scope="scope">
<el-input v-if="scope.row.ds === '右眼'" v-model="secondForm.dsOd" placeholder="" />
<el-input v-if="scope.row.ds === '左眼'" v-model="secondForm.dsOs" placeholder="" />
</template>
</el-table-column>
<el-table-column
label="柱镜"
align="center"
>
<template slot-scope="scope">
<el-input v-if="scope.row.dc === '右眼'" v-model="secondForm.dcOd" placeholder="" />
<el-input v-if="scope.row.dc === '左眼'" v-model="secondForm.dcOs" placeholder="" />
</template>
</el-table-column>
<el-table-column
label="轴向"
align="center"
>
<template slot-scope="scope">
<el-input v-if="scope.row.a === '右眼'" v-model="secondForm.aod" placeholder="" />
<el-input v-if="scope.row.a === '左眼'" v-model="secondForm.aos" placeholder="" />
</template>
</el-table-column>
<el-table-column
label="矫正视力"
align="center"
>
<template slot-scope="scope">
<el-input v-if="scope.row.va === '右眼'" v-model="secondForm.vaOd" placeholder="" />
<el-input v-if="scope.row.va === '左眼'" v-model="secondForm.vaOs" placeholder="" />
</template>
</el-table-column>
<el-table-column
label="戴镜视力"
align="center"
>
<template slot-scope="scope">
<el-input v-if="scope.row.vag === '右眼'" v-model="secondForm.vagOd" placeholder="" />
<el-input v-if="scope.row.vag === '左眼'" v-model="secondForm.vagOs" placeholder="" />
</template>
</el-table-column>
<el-table-column
label="眼轴"
align="center"
>
<template slot-scope="scope">
<el-input v-if="scope.row.iol === '右眼'" v-model="secondForm.iolOd" placeholder="" />
<el-input v-if="scope.row.iol === '左眼'" v-model="secondForm.iolOs" placeholder="" />
</template>
</el-table-column>
<el-table-column
label="联合光度"
align="center"
>
<template slot-scope="scope">
<el-input v-if="scope.row.lhgd === '右眼'" v-model="secondForm.lhgdOd" placeholder="" />
<el-input v-if="scope.row.lhgd === '左眼'" v-model="secondForm.lhgdOs" placeholder="" />
</template>
</el-table-column>
<el-table-column
label="下次复诊时间"
align="center"
width="150"
>
<template slot-scope="scope">
<el-date-picker
v-model="secondForm.nextCheckDate"
style="width: 140px"
value-format="yyyy-MM-dd"
type="date"
placeholder="选择日期"
/>
</template>
</el-table-column>
<el-table-column
label="备注"
width="130"
align="center"
>
<template slot-scope="scope">
<el-input v-model="secondForm.remark" type="textarea" :rows="3" placeholder="" />
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
patientId: {
type: String,
default: ''
}
},
data() {
return {
tableData: [
{
checkDate: '',
nextCheckDate: '',
name: '右眼',
ds: '右眼',
dc: '右眼',
iol: '右眼',
lhgd: '右眼',
vag: '右眼',
va: '右眼',
a: '右眼',
remark: ''
},
{
checkDate: '',
nextCheckDate: '',
name: '左眼',
ds: '左眼',
dc: '左眼',
iol: '左眼',
lhgd: '左眼',
vag: '左眼',
va: '左眼',
a: '左眼',
remark: ''
}
],
secondForm: {
patientId: '',
checkDate: '',
nextCheckDate: '',
dcOd: '',
dcOs: '',
dsOd: '',
dsOs: '',
iolOd: '',
iolOs: '',
lhgdOd: '',
lhgdOs: '',
vagOd: '',
vagOs: '',
remark: '',
vaOd: '',
vaOs: '',
aod: '',
aos: ''
},
id: '',
curIndex: 0,
formList: []
}
},
mounted() {
this.getFormList()
},
methods: {
objectSecondMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 0 || columnIndex === 9 || columnIndex === 10) {
if (rowIndex % 2 === 0) {
return {
rowspan: 2,
colspan: 1
}
} else {
return {
rowspan: 0,
colspan: 0
}
}
}
},
saveSecondForm() {
this.secondForm.patientId = this.patientId
this.$http.post('/defocused/saveOrUpdateSecondDefocused', this.secondForm).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.getSecondForm()
}
})
}).catch(() => {})
},
async getSecondForm() {
this.$http.get('/defocused/getSecondDefocused', {
params: {
id: this.id
}
}).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
} else {
this.secondForm = res.data
}
}).catch(() => {})
},
async getFormList() {
const { data: res } = await this.$http.get('/defocused/getAllSecDefocusedByPid', {
params: {
patientId: this.patientId
}
})
if (res.code === 0) {
this.formList = res.data || []
if (this.formList.length) {
this.curIndex = 0
this.id = this.formList[0].id
this.secondForm = this.formList[0]
}
} else {
this.$message.error(res.msg)
}
},
handleForm(index, item) {
this.curIndex = index
this.id = item.id
this.secondForm = item
},
async addRecord() {
const params = {
patientId: this.patientId
}
const { data: res } = await this.$http.post('/defocused/saveOrUpdateSecondDefocused', params)
if (res.code === 0) {
await this.getFormList()
this.$message.success('新增成功')
} else {
this.$message.error(res.msg)
}
},
deleteForm(id) {
const params = {
id: id
}
this.$confirmFun('你确定要删除吗?').then(async() => {
const { data: res } = await this.$http.post('/defocused/delSecDefocusedById', params)
if (res.code === 0) {
this.$message.success('删除成功')
await this.getFormList()
} else {
this.$message.error(res.msg)
}
})
}
}
}
</script>
<style lang="scss" scoped>
.reviewContain {
width: 100%;
height: 100%;
display: flex;
.reviewLeft{
width: 180px;
height: 100%;
margin-right: 16px;
.content-top, .content-bottom{
height: 50%;
overflow-y: auto;
}
.content-bottom {
.commonForm-text {
display: flex;
align-items: center;
font-size: 14px;
font-weight: 700;
}
.line {
border-bottom: 1px solid #e5e6eb;
flex: 1;
display: inline-block;
margin: 0 10px;
}
.record{
display: flex;
justify-content: space-between;
padding-top: 12px;
cursor: pointer;
p {
display: inline-block;
font-size: 14px;
color: rgba(0, 0, 0, 0.85);
letter-spacing: 1px;
}
img {
width: 16px;
height: 16px;
margin-top: 3px;
}
}
}
.formBox{
display: flex;
justify-content: space-between;
cursor: pointer;
padding: 2px 8px;
border-radius: 2px;
margin-top: 12px;
}
.active {
color: white;
background-color: #1C76FD;
}
.curFont {
color: #A6A4A4;
}
.activeFont {
color: #D9D9D9;
}
.nodata {
width: 180px;
margin-top: 50px;
}
}
.reviewRight{
flex: 1;
//background-color: #ececf1;
}
.review-head {
display: flex;
justify-content: space-between;
padding-bottom: 16px;
}
.review-content {
width: 100%;
height: calc( 100vh - 50px - 32px - 42px - 48px - 15px);
padding: 16px;
background: #ffffff;
overflow-x: auto;
}
.vision{
display: inline-block;
width: 24px;
height: 24px;
line-height: 24px;
border-radius: 50%;
text-align: center;
color: #1E79FF;
font-weight: 600;
margin-right: 8px;
background-color: #EBF6FF;
}
}
</style>

211
src/page-subspecialty/views/modules/optometryManagement/outFocusEye/sunAxis.vue

@ -1,211 +0,0 @@
<template>
<div v-loading="loading">
<div :id="idName" ref="yanyaRef" :style="{ height: height, width: width }" />
</div>
</template>
<script>
import moment from 'moment/moment'
export default {
name: 'sunAxis',
props: {
idName: { type: String, default: 'chart' },
width: { type: String, default: '100%' },
height: { type: String, default: '200px' },
desc: { type: String, default: '联合光度' },
patientId: {
type: String
}
},
data() {
return {
loading: false,
date: [],
typeList: {
OD: [],
OS: [],
typeNull: []
},
chartData: [],
legendData: [],
seriesData: [],
disabled: false
}
},
mounted() {
this.queryAxisData()
},
methods: {
queryAxisData() {
this.loading = true
this.$http.get('/defocused/getSecDefocusedLine', { params: {
patientId: this.patientId
}}).then(res => {
this.loading = false
console.log(res)
this.chartData = res.data.data
this.initFun()
})
},
initFun() {
this.date = []
this.typeList = {
OD: [],
OS: [],
typeNull: []
}
this.legendData = []
this.seriesData = []
if (this.chartData && this.chartData.length > 0) {
this.disabled = false
this.chartData.forEach(item => {
this.date.push(moment(item.checkDate).format('l'))
this.typeList.OD.push([item.checkDate, item.lhgdOd])
this.legendData[0] = 'OD'
this.typeList.OS.push([item.checkDate, item.lhgdOs])
this.legendData[1] = 'OS'
})
} else {
this.disabled = true
}
this.$nextTick(() => {
this.visionFun()
})
},
visionFun() {
// domecharts
const yanya = this.$echarts.init(document.getElementById(this.idName))
var colors = ['#4462FF', '#0DB760', '#000000']
Object.keys(this.typeList).forEach((item, index) => {
if (this.typeList[item].length > 0) {
this.seriesData.push({
name: item,
type: 'line',
// stack: index,
data: this.typeList[item],
label: {
show: true,
position: item === 'OD' ? [-25, -30] : [10, -5],
backgroundColor: item === 'OD' ? '#4a6bff' : '#0db760',
padding: [6, 6],
color: '#ffffff',
// color: 'rgba(24, 24, 24, 0.1)',
borderRadius: 10
},
smooth: true,
itemStyle: {
color: colors[index]
},
symbolSize: 10
})
}
})
// domecharts
yanya.setOption({
title: {
text: this.desc,
textStyle: {
'color': '#000000'
},
left: 10
},
tooltip: {
// trigger: 'axis'
backgroundColor: '#ece6e6',
textStyle: {
color: '#000000' //
},
formatter(params) {
return params.seriesName + '<br/>' + params.data[0] + '&nbsp&nbsp&nbsp' + params.data[1]
}
},
legend: {
data: this.legendData,
icon: 'pin',
textStyle: {
color: '#000000'
},
right: 30
},
dataZoom: [
{
type: 'inside',
disabled: this.disabled,
start: 0,
end: 100
}
],
grid: {
top: 55,
left: 50,
right: 50,
bottom: 30,
containLabel: false
},
xAxis: {
type: 'time',
boundaryGap: false,
axisLabel: {
show: true,
showMaxLabel: true,
textStyle: {
color: '#000000'
},
formatter: function(value, index) {
const showD = moment(value).format('YYYY/M/D')
return showD
}
},
axisLine: {
lineStyle: {
color: 'rgba(24, 24, 24, 0.1)'
}
},
// 线
splitLine: {
show: true
}
},
yAxis: {
type: 'value',
min: function(value) { //
return Math.floor(value.min)
},
max: function(value) { //
return Math.ceil(value.max)
},
splitNumber: 1, //
axisLabel: {
show: true,
textStyle: {
color: '#000000'
}
},
axisLine: {
lineStyle: {
color: 'rgba(24, 24, 24, 0.1)'
}
}
},
series: [
...this.seriesData
]
})
//
window.addEventListener('resize', () => { yanya.resize() })
// div
this.$erd.listenTo(this.$refs.yanyaRef, () => {
this.$nextTick(() => {
yanya.resize()
})
})
}
}
}
</script>
<style scoped>
</style>

586
src/page-subspecialty/views/modules/optometryManagement/seeDoctor/CornealReview.vue

@ -1,586 +0,0 @@
<template>
<div class="corneal">
<head-template>
<el-button type="primary" size="small" @click="handleSaveTable()">保存</el-button>
<el-button v-print="print" size="small" @click="handlePrint">打印</el-button>
</head-template>
<div class="notice-content">
<div class="notice-box">
<div id="secondPrint" class="notice_tip" style="page-break-after:always">
<h2 style="text-align: center;margin-bottom: 32px;">
角膜塑形镜复查单
</h2>
<table class="cornealTable">
<tr>
<td colspan="2"><div class="tdItem">姓名 <el-input v-model="formData.patientName" style="flex: 1" placeholder="" /></div></td>
<td colspan="2">
<div class="tdItem">
<span style="word-break: keep-all">检查日期</span>
<el-date-picker
v-model="formData.checkDate"
type="date"
/>
</div>
</td>
<td colspan="2">
<div class="tdItem">
已戴镜时间
<el-select v-model="formData.djTime" placeholder="" clearable filterable allow-create style="flex: 1">
<el-option v-for="(item,index) in timeList " :key="index" :value="item.name" :label="item.name" />
</el-select>
</div>
</td>
</tr>
<tr>
<td colspan="6">
<div style="display: flex;flex-wrap: wrap">
<el-select v-model="formData.checkResult" placeholder="" clearable multiple filterable allow-create style="width: 100%">
<el-option v-for="(item,index) in cornealOtherList " :key="item.id" :value="item.id" :label="item.name" />
</el-select>
</div>
</td>
</tr>
<tr>
<td colspan="2">项目</td>
<td colspan="2">右眼</td>
<td colspan="2">左眼</td>
</tr>
<tr>
<td colspan="2">视力</td>
<td colspan="2"><el-input v-model="formData.vaOd" /></td>
<td colspan="2"><el-input v-model="formData.vaOs" /></td>
</tr>
<tr>
<td colspan="2">眼压</td>
<td colspan="2"><el-input v-model="formData.iopOd" /></td>
<td colspan="2"><el-input v-model="formData.iopOs" /></td>
</tr>
<tr>
<td colspan="2">眼轴</td>
<td colspan="2"><el-input v-model="formData.iolOd" /></td>
<td colspan="2"><el-input v-model="formData.iolOs" /></td>
</tr>
<tr>
<td colspan="2">角膜地形图</td>
<td colspan="2">
<el-select v-model="formData.jmdxtOd" placeholder="" clearable multiple filterable allow-create style="width: 100%">
<el-option v-for="(item,index) in cornealList " :key="item.id" :value="item.id" :label="item.name" />
</el-select>
</td>
<td colspan="2">
<el-select v-model="formData.jmdxtOs" placeholder="" clearable multiple filterable allow-create style="width: 100%">
<el-option v-for="(item,index) in cornealList " :key="item.id" :value="item.id" :label="item.name" />
</el-select>
</td>
</tr>
<tr>
<td rowspan="4">眼表</td>
</tr>
<tr>
<td>角膜</td>
<td colspan="2"><el-input v-model="formData.corneaOd" /></td>
<td colspan="2"><el-input v-model="formData.corneaOs" /></td>
</tr>
<tr>
<td>结膜</td>
<td colspan="2"><el-input v-model="formData.conjunctivaOd" /></td>
<td colspan="2"><el-input v-model="formData.conjunctivaOs" /></td>
</tr>
<tr>
<td>其他</td>
<td colspan="2"><el-input v-model="formData.otherOd" /></td>
<td colspan="2"><el-input v-model="formData.otherOs" /></td>
</tr>
<tr>
<td colspan="2">镜片</td>
<td colspan="2">
<div style="display: flex;flex-wrap: wrap">
<el-select v-model="formData.mirrorOd" placeholder="" clearable multiple filterable allow-create style="width: 100%">
<el-option v-for="(item,index) in lensList " :key="index" :value="item.id" :label="item.name" />
</el-select>
</div>
</td>
<td colspan="2">
<div style="display: flex;flex-wrap: wrap">
<el-select v-model="formData.mirrorOs" placeholder="" clearable multiple filterable allow-create style="width: 100%">
<el-option v-for="(item,index) in lensList " :key="index" :value="item.id" :label="item.name" />
</el-select>
</div>
</td>
</tr>
<tr>
<td>备注</td>
<td colspan="3">
<el-input v-model="formData.remark" :autosize="{ minRows: 1, maxRows: 3}" type="textarea" />
</td>
<td>复查时间</td>
<td colspan="5">
<el-date-picker
v-model="formData.nextCheckDate"
type="date"
value-format="yyyy-MM-dd"
/>
</td>
</tr>
<tr>
<td colspan="6" style="padding: 0">
<div style="display: flex">
<div style="flex: 1;padding: 5px 10px;display: flex;align-items: center">
<span style="word-break: keep-all">检查人签字:</span>
<img v-if="formData.doctorSign" :src="formData.doctorSign" alt="" style="width: 80px;height: 50px;border-style:none;margin-left: 12px">
</div>
<div style="flex: 1;border-left: 1px solid #ccc;padding: 5px 10px;display: flex;align-items: center" @click="signClick('checkSign')">
<span style="word-break: keep-all">医生签字:</span>
<img v-if="!formListValue.checkSign&&printHidden" :src="require('@/assets/img/signature.png')" alt="" style="margin-left: 12px">
<img v-if="formListValue.checkSign" style="width: 80px;height: 40px;" :src="formListValue.checkSign">
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</template>
<script>
import headTemplate from '@/components/head'
import emptySign from '@static/js/emptySign'
import styeFormSign from '@/mixins/styeFormSign'
export default {
name: 'CornealReview',
components: {
headTemplate
},
mixins: [styeFormSign],
props: {
caseId: {
type: String,
default: ''
},
patientId: {
type: String,
default: ''
}
},
data() {
return {
printHidden: true,
print: {
id: 'secondPrint',
closeCallback: () => {
this.printHidden = true
}
},
cornealOtherList: [
{
name: '正常',
id: '1'
}, {
name: '重影',
id: '2'
}, {
name: '视力波动',
id: '3'
}, {
name: '异物感',
id: '4'
}, {
name: '镜片难摘',
id: '5'
}, {
name: '眼红',
id: '6'
}, {
name: '眼痛',
id: '7'
}, {
name: '炫光',
id: '8'
}, {
name: '视力不佳',
id: '9'
}, {
name: '其他',
id: '10'
}
],
cornealList: [
{
name: '居中',
id: '1'
},
{
name: '大致居中',
id: '2'
},
{
name: '偏上',
id: '3'
},
{
name: '偏下',
id: '4'
},
{
name: '偏鼻',
id: '5'
},
{
name: '偏颞',
id: '6'
},
{
name: '偏颞上',
id: '7'
},
{
name: '偏颞下',
id: '8'
},
{
name: '偏鼻上',
id: '9'
},
{
name: '偏鼻下',
id: '10'
},
{
name: '稍上',
id: '11'
},
{
name: '稍下',
id: '12'
},
{
name: '稍鼻',
id: '13'
},
{
name: '稍颞',
id: '14'
},
{
name: '稍颞上',
id: '15'
},
{
name: '稍颞下',
id: '16'
},
{
name: '稍鼻上',
id: '17'
},
{
name: '稍鼻下',
id: '18'
}
],
checkList: [
{
name: '正常',
id: '1'
}, {
name: '重影',
id: '2'
}, {
name: '视力波动',
id: '3'
}, {
name: '异物感',
id: '4'
}, {
name: '镜片难摘',
id: '5'
}, {
name: '眼红',
id: '6'
}, {
name: '眼痛',
id: '7'
}, {
name: '眩光',
id: '8'
}, {
name: '视力不佳',
id: '9'
}, {
name: '其他',
id: '10'
}
],
lensList: [
{
name: '正常',
id: '1'
}, {
name: '划痕',
id: '2'
}, {
name: '污染',
id: '3'
}, {
name: '破损',
id: '4'
}
],
timeList: [
{
name: '一天',
id: '1'
}, {
name: '一周',
id: '2'
}, {
name: '一个月',
id: '3'
}, {
name: '两个月',
id: '4'
}, {
name: '三个月',
id: '5'
}, {
name: '四个月',
id: '6'
}, {
name: '五个月',
id: '7'
}, {
name: '半年',
id: '8'
}, {
name: '七个月',
id: '9'
}, {
name: '八个月',
id: '10'
}, {
name: '九个月',
id: '11'
}, {
name: '十个月',
id: '12'
}, {
name: '十一个月',
id: '13'
}, {
name: '一年',
id: '14'
}
],
formData: {
checkResult: [], //
checkSign: '', //
conjunctivaOd: '', //
conjunctivaOs: '', //
corneaOd: '', //
corneaOs: '', //
djTime: '', //
doctorSign: '', //
iolOd: '', //
iolOs: '', //
iopOd: '', //
iopOs: '', //
jmdxtOd: [], //
jmdxtOs: [], //
mirrorOd: [], //
mirrorOs: [], //
otherOd: '', //
otherOs: '', //
patientName: '', //
patientAddress: '', //
patientBirthday: '', //
patientId: '', // id
patientPhone: '', //
patientSex: '', //
remark: '', //
vaOd: '', //
vaOs: '', //
checkDate: '', //
nextCheckDate: '' //
},
formListValue: {
checkSign: ''
}
}
},
watch: {
caseId(val) {
this.querySecondVisit()
}
},
mounted() {
this.querySecondVisit()
},
methods: {
signClick(text) {
this.initPlugin(text)
},
async querySecondInfo() {
const params = {
patientId: this.patientId
}
const { data: res } = await this.$http.get('/hospital/notice/getSecondDiagnosisInfos', {
params: params
})
if (res.code === 0) {
this.formData.iolOd = res.data.iolOd
this.formData.iolOs = res.data.iolOs
this.formData.iopOd = res.data.iopOd
this.formData.iopOs = res.data.iopOs
this.formData.vaOd = res.data.vaOd
this.formData.vaOs = res.data.vaOs
} else {
this.$message.error(res.msg)
}
},
setSign() {
const userData = window.sessionStorage.getItem('qg-userData')
const date = this.$moment().format('YYYY-MM-DD')
this.formData.doctorSign = JSON.parse(userData).signImgBase
this.formData.checkDate = date
},
async querySecondVisit() {
const params = {
caseId: this.caseId
}
const { data: res } = await this.$http.get('/hospital/notice/getSecondDiagnosis', {
params: params
})
if (res.code === 0) {
this.formData = res.data
this.formData.checkResult = this.formData.checkResult ? this.formData.checkResult.split(',') : []
this.formData.jmdxtOd = this.formData.jmdxtOd ? this.formData.jmdxtOd.split(',') : []
this.formData.jmdxtOs = this.formData.jmdxtOs ? this.formData.jmdxtOs.split(',') : []
this.formData.mirrorOd = this.formData.mirrorOd ? this.formData.mirrorOd.split(',') : []
this.formData.mirrorOs = this.formData.mirrorOs ? this.formData.mirrorOs.split(',') : []
if (this.formData.isChange === 0) {
this.formListValue.checkSign = ''
await this.getPatientData()
await this.querySecondInfo()
this.setSign()
} else {
this.formListValue.checkSign = res.data.checkSign
}
} else {
this.$message.error(res.msg)
}
},
//
async getPatientData() {
const { data: res } = await this.$http.get(
'/patient/view/getPatientData',
{
params: {
patientId: this.patientId
}
}
)
if (res.code === 0) {
if (res.data) {
this.formData.patientId = res.data.patientId
this.formData.patientName = res.data.patientName
}
} else {
this.$message.error(res.msg)
}
},
handlePrint() {
this.printHidden = false
this.handleSaveTable()
},
async handleSaveTable() {
if (this.formListValue.checkSign === emptySign) {
this.$message.error('签字未成功请重新签字后再保存')
return
}
this.formData.checkResult = this.formData.checkResult.length ? this.formData.checkResult.join(',') : ''
this.formData.jmdxtOd = this.formData.jmdxtOd.length ? this.formData.jmdxtOd.join(',') : ''
this.formData.jmdxtOs = this.formData.jmdxtOs.length ? this.formData.jmdxtOs.join(',') : ''
this.formData.mirrorOd = this.formData.mirrorOd.length ? this.formData.mirrorOd.join(',') : ''
this.formData.mirrorOs = this.formData.mirrorOs.length ? this.formData.mirrorOs.join(',') : ''
this.formData.checkSign = this.formListValue.checkSign ? this.formListValue.checkSign : ''
const data = JSON.parse(JSON.stringify(this.formData))
const params = {
...data
}
const { data: res } = await this.$http.post('/hospital/notice/saveOrUpdateSecondDiagnosis', params)
if (res.code === 0) {
await this.querySecondVisit()
this.$message.success('保存成功')
} else {
this.$message.error(res.msg)
}
}
}
}
</script>
<style lang="scss" scoped>
input{
-webkit-appearance: checkbox !important;
margin-right: 5px;
}
::v-deep .el-input__prefix {
display: none;
}
.el-date-editor.el-input, .el-date-editor.el-input__inner{
width: 100%;
}
.cornealTable{
width: 100%;
tr td{
border: 1px solid #ccc;
font-size: 18px;
padding: 5px 10px;
::v-deep .el-input__inner {
border: none !important;
text-align: center;
border-radius: 0;
padding: 0;
}
::v-deep .el-textarea__inner{
border: none;
}
.tdItem{
display: flex !important;
align-items: center;
}
.checkItem{
cursor: pointer;
user-select: none;
word-break: keep-all;
margin-right: 20px;
}
::v-deep .el-icon-arrow-up{
display: none;
}
}
}
.corneal{
width: 100%;
height: 100%;
display:flex;
flex-direction: column;
}
.notice-content{
width: 100%;
flex:1;
overflow-y: auto;
.notice-box{
width: 100%;
height: 100%;
}
.notice_tip{
border: 1px solid #000;
padding: 64px 32px;
margin-right: 16px;
}
}
</style>

72
src/page-subspecialty/views/modules/optometryManagement/seeDoctor/diagnose.vue

@ -1,72 +0,0 @@
<template>
<div class="diagnose">
<!-- 诊断头部 -->
<div class="diagnose-head">
<div class="diagnose-head-left">
<span class="text">首诊记录</span>
<svg class="icon-svg"><use xlink:href="#icon-sync" /></svg>
</div>
<el-button type="primary" size="small">新增</el-button>
</div>
<!-- 诊断内容 -->
<el-table
ref="multipleTable"
:data="dataList"
tooltip-effect="dark"
style="width: 100%"
>>
<el-table-column type="index" width="50" label="NO" />
<el-table-column prop="date" label="首诊日期" />
<el-table-column prop="patientSex" label="诊断前缀名称" />
<el-table-column prop="patientSex" label="诊断名称" />
<el-table-column prop="patientSex" label="诊断后缀名称" />
<el-table-column prop="suggest" label="主诊断">
<template slot-scope="scope">
</template>
</el-table-column>
<el-table-column prop="operation" label="操作">
<template slot-scope="scope">
<span
style="color: #1890ff; padding-right: 8px"
class="operation-details"
>编辑</span>
<span
style="color: #ff4d4f"
class="operation-delete"
>删除</span>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
dataList: []
}
},
created() {
},
methods: {
}
}
</script>
<style lang="scss" scoped>
.diagnose-head{
display: flex;
justify-content: space-between;
padding-bottom: 16px;
.diagnose-head-left {
display: flex;
align-items: center;
.text {
padding-right: 16px;
}
.icon-svg{
color: #1E79FF;
}
}
}
</style>

185
src/page-subspecialty/views/modules/optometryManagement/seeDoctor/edit-follow-unit-visit.vue

@ -1,185 +0,0 @@
<template>
<el-dialog
class="follow-unit-visit-dialog"
:visible.sync="visible"
width="30%"
:title="title"
>
<el-form ref="dataForm" :model="dataForm" :rules="dataRule">
<el-form-item v-if="title=='修改随访周期'" label="随访周期:" label-width="120px" prop="revisitCycles" class="cycle-display">
<el-input
v-model="dataForm.revisitCycles"
/>
<el-radio-group v-model="dataForm.revisitCyclesUnit">
<el-radio-button label="3"></el-radio-button>
<el-radio-button label="4"></el-radio-button>
<el-radio-button label="2"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-if="title=='修改下次来访' && dataForm.nextVisitTime.length > 0" label="下次来访时间:" label-width="120px" prop="nextVisitTime">
<el-date-picker
v-model="dataForm.nextVisitTime"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
/>
</el-form-item>
<el-form-item label="变更备注:" label-width="120px" prop="remark">
<el-input v-model="dataForm.remark" type="textarea" />
</el-form-item>
</el-form>
<template slot="footer">
<el-button @click="visible = false">{{ $t('cancel') }}</el-button>
<el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button>
</template>
</el-dialog>
</template>
<script>
import debounce from 'lodash/debounce'
export default {
props: {
patientTypeList: {
type: Array,
default: () => []
},
title: {
type: String,
default: ''
},
patientIdNumber: {
type: String,
default: ''
}
},
data() {
return {
visible: false,
dataForm: {
revisitCycles: '1', //
revisitCyclesUnit: '3', // 1234
nextVisitTime: '',
remark: '',
patIdNumber: this.patientIdNumber,
drgsName: window.localStorage.getItem('identity')
}
}
},
computed: {
dataRule() {
return {
revisitCycles: [
{ required: true, message: '请输入随访周期', trigger: 'change' }
],
nextVisitTime: [
{ required: true, message: '请选择下次来访时间', trigger: 'change' }
]
}
}
},
methods: {
init() {
this.visible = true
this.$nextTick(() => {
this.$refs.dataForm.resetFields() //
if (this.dataForm.id) {
this.getInfo()
}
})
},
//
getInfo() {
this.$http.get('/pat/Manage', {
params: {
patIdNumber: this.dataForm.id,
drgsName: this.dataForm.drgsName,
isSearch: ''
}
}).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.dataForm = {
...this.dataForm,
...res.data
}
this.dataForm.nextVisitTime ? '' : this.dataForm.nextVisitTime = ''
this.dataForm.revisitCyclesUnit = res.data.revisitCyclesUnit ? res.data.revisitCyclesUnit : '3'
this.dataForm.revisitCycles = res.data.revisitCycles ? res.data.revisitCycles : '1'
}).catch(() => {})
},
//
dataFormSubmitHandle: debounce(function() {
this.$refs.dataForm.validate((valid) => {
if (!valid) {
return false
}
const url = this.title === '修改随访周期' ? '/flow/addCycle' : '/pat/Manage/updateNextVisitDate'
const dataList = this.title === '修改随访周期' ? {
patIdNumber: this.dataForm.patIdNumber,
remark: this.dataForm.remark,
revisitCycles: this.dataForm.revisitCycles,
revisitCyclesUnit: this.dataForm.revisitCyclesUnit
} : {
patIdNumber: this.dataForm.patIdNumber,
nextVisitTime: this.dataForm.nextVisitTime
}
this.$http.post(url, dataList).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.visible = false
this.$emit('refreshDataList')
}
})
}).catch(() => {})
})
}, 1000, { leading: true, trailing: false })
}
}
</script>
<style lang="scss" scoped>
.follow-unit-visit-dialog {
}
</style>
<style lang="scss">
.follow-unit-visit-dialog {
.el-radio-group {
display: flex;
}
.cycle-display {
.el-form-item__content {
display: flex;
}
.el-input{
width: 100px;
margin-right: 10px;
}
}
.el-dialog {
overflow: hidden;
}
.el-dialog__header {
margin-bottom:12px
}
.el-dialog__body {
padding-right: 30px;
}
.formItemOne .el-form-item__content {
display: flex;
}
.el-textarea {
display: flex;
}
.el-date-editor.el-input, .el-date-editor.el-input__inner {
width: 100%;
}
}
</style>

218
src/page-subspecialty/views/modules/optometryManagement/seeDoctor/eyeAxis.vue

@ -1,218 +0,0 @@
<template>
<div v-loading="loading">
<div v-if="chartData.length" :id="idName" ref="yanyaRef" :style="{ height: height, width: width }" />
<div
v-else
style="height: 100%;background: #fff;display: flex;align-items: center;justify-content: center"
>
<img src="@/assets/img/nodata.png" alt="">
</div>
</div>
</template>
<script>
import moment from 'moment/moment'
export default {
name: 'EyeAxis',
props: {
idName: { type: String, default: 'chart' },
width: { type: String, default: '100%' },
height: { type: String, default: '200px' },
desc: { type: String, default: '' },
patientId: {
type: String
}
},
data() {
return {
loading: false,
date: [],
typeList: {
OD: [],
OS: [],
typeNull: []
},
chartData: [],
legendData: [],
seriesData: [],
disabled: false
}
},
mounted() {
this.queryAxisData()
},
methods: {
queryAxisData() {
this.loading = true
this.$http.get('hospital/notice/getAllSecDiagInfoByPid', { params: {
patientId: this.patientId
}}).then(res => {
this.loading = false
this.chartData = res.data.data.slAndYzList
this.initFun()
})
},
initFun() {
this.date = []
this.typeList = {
OD: [],
OS: [],
typeNull: []
}
this.legendData = []
this.seriesData = []
if (this.chartData && this.chartData.length > 0) {
this.disabled = false
this.chartData.forEach(item => {
item.osIol = item.osIol && item.osIol.replace('mm', '')
item.odIol = item.odIol && item.odIol.replace('mm', '')
this.date.push(moment(item.examTime).format('l'))
this.typeList.OD.push([item.examTime, item.odIol])
this.legendData[0] = 'OD'
this.typeList.OS.push([item.examTime, item.osIol])
this.legendData[1] = 'OS'
})
} else {
this.disabled = true
}
this.$nextTick(() => {
this.visionFun()
})
},
visionFun() {
// domecharts
const yanya = this.$echarts.init(document.getElementById(this.idName))
var colors = ['#4462FF', '#0DB760', '#000000']
Object.keys(this.typeList).forEach((item, index) => {
if (this.typeList[item].length > 0) {
this.seriesData.push({
name: item,
type: 'line',
// stack: index,
data: this.typeList[item],
label: {
show: true,
position: item === 'OD' ? [-25, -30] : [10, -5],
backgroundColor: item === 'OD' ? '#4a6bff' : '#0db760',
padding: [6, 6],
color: '#ffffff',
// color: 'rgba(24, 24, 24, 0.1)',
borderRadius: 10
},
smooth: true,
itemStyle: {
color: colors[index]
},
symbolSize: 10
})
}
})
// domecharts
yanya.setOption({
title: {
text: this.desc,
textStyle: {
'color': '#000000'
},
left: 10
},
tooltip: {
// trigger: 'axis'
backgroundColor: '#ece6e6',
textStyle: {
color: '#000000' //
},
formatter(params) {
return params.seriesName + '<br/>' + params.data[0] + '&nbsp&nbsp&nbsp' + params.data[1]
}
},
legend: {
data: this.legendData,
icon: 'pin',
textStyle: {
color: '#000000'
},
right: 30
},
dataZoom: [
{
type: 'inside',
disabled: this.disabled,
start: 0,
end: 100
}
],
grid: {
top: 55,
left: 50,
right: 50,
bottom: 30,
containLabel: false
},
xAxis: {
type: 'time',
boundaryGap: false,
axisLabel: {
show: true,
showMaxLabel: true,
textStyle: {
color: '#000000'
},
formatter: function(value, index) {
const showD = moment(value).format('YYYY/M/D')
return showD
}
},
axisLine: {
lineStyle: {
color: 'rgba(24, 24, 24, 0.1)'
}
},
// 线
splitLine: {
show: true
}
},
yAxis: {
type: 'value',
min: function(value) { //
return Math.floor(value.min)
},
max: function(value) { //
return Math.ceil(value.max)
},
splitNumber: 1, //
axisLabel: {
show: true,
textStyle: {
color: '#000000'
}
},
axisLine: {
lineStyle: {
color: 'rgba(24, 24, 24, 0.1)'
}
}
},
series: [
...this.seriesData
]
})
//
window.addEventListener('resize', () => { yanya.resize() })
// div
this.$erd.listenTo(this.$refs.yanyaRef, () => {
this.$nextTick(() => {
yanya.resize()
})
})
}
}
}
</script>
<style scoped>
</style>

153
src/page-subspecialty/views/modules/optometryManagement/seeDoctor/first-visit/add-or-update.vue

@ -1,153 +0,0 @@
<template>
<div class="crf-add-dialog">
<el-dialog
width="90%"
top="2vh"
:visible.sync="visible"
:title="dataForm.title||(!dataForm.id ? $t('add') : $t('update'))"
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<el-form
ref="dataForm"
:model="dataForm"
:rules="dataRule"
label-width="auto"
@keyup.enter.native="initBaseInfo()"
>
<el-form-item prop="type" :label="'名称'">
<el-radio-group v-model="dataForm.crfType" size="small">
<el-radio-button label="首诊" />
<el-radio-button label="随访" />
</el-radio-group>
</el-form-item>
<el-form-item prop="name" :label="'名称'">
<el-input
v-model="dataForm.name"
:placeholder="'请填写表单名称'"
size="small"
/>
</el-form-item>
<el-form-item prop="content" :label="'表单'" style="margin-top:20px;">
<!-- <crf-editor ref="crf" v-model="dataForm.content" :height="height" />-->
</el-form-item>
<el-form-item prop="description" :label="'描述'">
<el-input
v-model="dataForm.description"
type="textarea"
:rows="1"
:placeholder="'相关描述'"
size="small"
/>
</el-form-item>
</el-form>
<template slot="footer">
<el-button size="small" @click="visible = false">{{ $t('cancel') }}</el-button>
<el-button type="primary" size="small" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button>
</template>
</el-dialog>
</div>
</template>
<script>
import debounce from 'lodash/debounce'
// import crfEditor from '@/components/hm-crf'
const Base64 = require('js-base64').Base64
export default {
// components: { crfEditor },
data() {
return {
visible: false,
height: 'calc(100vh - 300px)',
dataForm: {
id: '',
projectId: '',
crfType: '首诊',
name: '',
drgsName: '眼视光', //
description: '',
content: ''
}
}
},
computed: {
dataRule() {
var validate_content = (rule, value, callback) => {
if (this.dataForm.content === '') {
return callback(new Error('请设计表单内容'))
}
callback()
}
return {
name: [
{ required: true, message: this.$t('validate.required'), trigger: 'blur' }
],
content: [
{ required: true, validator: validate_content, trigger: 'change' }
]
}
}
},
methods: {
init() {
this.visible = true
this.$nextTick(() => {
this.$refs.dataForm.resetFields()
this.dataForm.projectId = window.SITE_CONFIG['projectId']
if (this.dataForm.id) {
this.getInfo()
} else {
this.dataForm = { ...this.dataForm }
}
})
},
//
getInfo() {
this.$http.get('/crf/template', { params: { crfId: this.dataForm.id }}).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
if (res.data) {
this.dataForm.name = res.data.name
this.dataForm.content = Base64.decode(res.data.content)
this.dataForm.description = res.data.description
this.$refs['crf'].renderContent()
}
}).catch(() => {})
},
//
dataFormSubmitHandle: debounce(function() {
this.$refs.dataForm.validate((valid) => {
if (!valid) {
return false
}
this.$http[!this.dataForm.id ? 'post' : 'put']('/crf/template', { ...this.dataForm, content: Base64.encode(this.dataForm.content) }).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.visible = false
this.$emit('refreshDataList')
}
})
}).catch(() => {})
})
}, 1000, { leading: true, trailing: false })
}
}
</script>
<style lang="scss">
.crf-add-dialog {
.el-form-item {
margin-bottom:8px
}
}
</style>

391
src/page-subspecialty/views/modules/optometryManagement/seeDoctor/first-visit/index.vue

@ -1,391 +0,0 @@
<template>
<div class="first-visit">
<head-template>
<el-button type="primary" size="small" @click="handleSaveTable()">保存</el-button>
<el-button v-print="'cornealPrint'" size="small">打印</el-button>
</head-template>
<div class="notice-content">
<div class="notice-box">
<div id="cornealPrint" class="notice_tip" style="page-break-after:always">
<h2 style="text-align: center;margin-bottom: 32px;">
验配流程
</h2>
<div style="float: right">
<span style="word-break: keep-all;font-size: 18px">验配日期</span>
<el-date-picker
v-model="formData.ypDate"
style="width: 220px"
type="date"
/>
</div>
<table class="cornealTable">
<tr>
<td colspan="1"><div class="tdItem">姓名 <el-input v-model="formData.patientName" style="flex: 1" placeholder="" /></div></td>
<td colspan="1"><div class="tdItem">姓别 <el-input v-model="formData.patientSex" style="flex: 1" placeholder="" /></div></td>
<td colspan="1">
<div class="tdItem">
<span style="word-break: keep-all">检查日期</span>
<el-date-picker
v-model="formData.checkDate"
type="date"
/>
</div>
</td>
<td colspan="1"><div class="tdItem">联系电话 <el-input v-model="formData.patientPhone" style="flex: 1" placeholder="" /></div></td>
</tr>
<tr>
<td colspan="2">
<div class="tdItem">家庭住址 <el-input v-model="formData.patientAddress" style="flex: 1" placeholder="" /></div>
</td>
<td colspan="2">
<div class="tdItem">近视家族史 <el-input v-model="formData.jsjzs" style="flex: 1" placeholder="" /></div>
</td>
</tr>
<tr>
<td colspan="2">
<div class="tdItem">裸眼视力:
R<el-input v-model="formData.vanOd" style="flex: 1" placeholder="" />
L<el-input v-model="formData.vanOs" style="flex: 1" placeholder="" />
</div>
</td>
<td colspan="2">
<div class="tdItem">眼压:
R<el-input v-model="formData.iopOd" style="flex: 1" placeholder="" />
L<el-input v-model="formData.iopOs" style="flex: 1" placeholder="" />
</div>
</td>
</tr>
<tr>
<td colspan="4">
<div class="tdItem">电脑验光:
R<el-input v-model="formData.dnygR" style="flex: 1" placeholder="" />
L<el-input v-model="formData.dnygL" style="flex: 1" placeholder="" />
</div>
</td>
</tr>
<tr>
<td colspan="4">
<div class="tdItem">主觉验光:
R<el-input v-model="formData.zjygR" style="flex: 1" placeholder="" />
L<el-input v-model="formData.zjygL" style="flex: 1" placeholder="" />
</div>
</td>
</tr>
<tr>
<td colspan="2">右眼</td>
<td colspan="2">左眼</td>
</tr>
<tr>
<td colspan="2">
<div class="tdItem">K1: <el-input v-model="formData.hod" style="flex: 1" placeholder="" /></div>
</td>
<td colspan="2">
<div class="tdItem">K1: <el-input v-model="formData.hos" style="flex: 1" placeholder="" /></div>
</td>
</tr>
<tr>
<td colspan="2">
<div class="tdItem">K2: <el-input v-model="formData.vod" style="flex: 1" placeholder="" /></div>
</td>
<td colspan="2">
<div class="tdItem">K2: <el-input v-model="formData.vos" style="flex: 1" placeholder="" /></div>
</td>
</tr>
<tr>
<td colspan="2">
<div class="tdItem">E值: <el-input v-model="formData.eod" style="flex: 1" placeholder="" /></div>
</td>
<td colspan="2">
<div class="tdItem">E值: <el-input v-model="formData.eos" style="flex: 1" placeholder="" /></div>
</td>
</tr>
<tr>
<td colspan="2">
<div class="tdItem">角膜直径: <el-input v-model="formData.zjOd" style="flex: 1" placeholder="" /></div>
</td>
<td colspan="2">`
<div class="tdItem">角膜直径: <el-input v-model="formData.zjOs" style="flex: 1" placeholder="" /></div>
</td>
</tr>
<tr>
<td colspan="2">
<div class="tdItem">眼轴: <el-input v-model="formData.iolOd" style="flex: 1" placeholder="" /></div>
</td>
<td colspan="2">
<div class="tdItem">眼轴: <el-input v-model="formData.iolOs" style="flex: 1" placeholder="" /></div>
</td>
</tr>
<tr>
<td colspan="2">
<div class="tdItem">角膜厚度: <el-input v-model="formData.hdOd" style="flex: 1" placeholder="" /></div>
</td>
<td colspan="2">
<div class="tdItem">角膜厚度: <el-input v-model="formData.hdOs" style="flex: 1" placeholder="" /></div>
</td>
</tr>
<tr>
<td colspan="2">
<div class="tdItem">角膜内皮: <el-input v-model="formData.npOd" style="flex: 1" placeholder="" /></div>
</td>
<td colspan="2">
<div class="tdItem">角膜内皮: <el-input v-model="formData.npOs" style="flex: 1" placeholder="" /></div>
</td>
</tr>
<tr>
<td colspan="2">
<div class="tdItem">BUT: <el-input v-model="formData.butOd" style="flex: 1" placeholder="" /></div>
</td>
<td colspan="2">
<div class="tdItem">BUT: <el-input v-model="formData.butOs" style="flex: 1" placeholder="" /></div>
</td>
</tr>
<tr>
<td colspan="4">试戴参数:</td>
</tr>
<tr>
<td colspan="2">
<div class="tdItem">R: <el-input v-model="formData.sdcsR1" style="flex: 1" placeholder="" /></div>
</td>
<td colspan="2">
<div class="tdItem">L: <el-input v-model="formData.sdcsL1" style="flex: 1" placeholder="" /></div>
</td>
</tr>
<tr>
<td colspan="2">
<div class="tdItem">R: <el-input v-model="formData.sdcsR2" style="flex: 1" placeholder="" /></div>
</td>
<td colspan="2">
<div class="tdItem">L: <el-input v-model="formData.sdcsL2" style="flex: 1" placeholder="" /></div>
</td>
</tr>
<tr>
<td colspan="2">
<div class="tdItem">R: <el-input v-model="formData.sdcsR3" style="flex: 1" placeholder="" /></div>
</td>
<td colspan="2">
<div class="tdItem">L: <el-input v-model="formData.sdcsL3" style="flex: 1" placeholder="" /></div>
</td>
</tr>
<tr>
<td colspan="4">订片参数:</td>
</tr>
<tr>
<td colspan="2">
<div class="tdItem">R: <el-input v-model="formData.dpcsR1" style="flex: 1" placeholder="" /></div>
</td>
<td colspan="2">
<div class="tdItem">L: <el-input v-model="formData.dpcsL1" style="flex: 1" placeholder="" /></div>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</template>
<script>
import headTemplate from '@/components/head'
export default {
name: 'CornealReview',
components: {
headTemplate
},
props: {
patientId: {
type: String,
default: ''
}
},
data() {
return {
formData: {
butOd: '', // but
butOs: '',
dnygL: '', //
dnygR: '',
dpcsL1: '', //
dpcsR1: '',
hod: '', // h
hos: '', // h
eod: '', // e
eos: '',
hdOd: '', //
hdOs: '', //
iolOd: '', //
iolOs: '', //
iopOs: '', //
iopOd: '', //
jsjzs: '', //
npOd: '', //
npOs: '', //
patientName: '', //
patientAddress: '', //
patientBirthday: '', //
patientId: '', // id
patientPhone: '', // id
patientSex: '', // id
sdcsL1: '', //
sdcsL2: '', //
sdcsL3: '', //
sdcsR1: '', //
sdcsR2: '', //
sdcsR3: '', //
vanOd: '', //
vanOs: '', //
vod: '', // v
vos: '', // v
ypDate: '', //
zjOd: '', //
zjOs: '', //
zjygL: '', //
zjygR: '' //
}
}
},
mounted() {
this.queryFirstVisit()
},
methods: {
async queryFirstVisit() {
const params = {
patientId: this.patientId
}
const { data: res } = await this.$http.get('/hospital/notice/getFirstDiagnosis', {
params: params
})
if (res.code === 0) {
this.formData = res.data
if (!this.formData.id) {
await this.queryFirstInfo()
await this.getPatientData()
}
} else {
this.$message.error(res.msg)
}
},
async queryFirstInfo() {
const params = {
patientId: this.patientId
}
const { data: res } = await this.$http.get('/hospital/notice/getFirstDiagnosisInfos', {
params: params
})
if (res.code === 0) {
this.formData = res.data
} else {
this.$message.error(res.msg)
}
},
//
async getPatientData() {
const { data: res } = await this.$http.get(
'/patient/view/getPatientData',
{
params: {
patientId: this.patientId
}
}
)
if (res.code === 0) {
if (res.data) {
this.$set(this.formData, 'patientId', res.data.patientId)
this.$set(this.formData, 'patientSex', res.data.patientSex)
this.$set(this.formData, 'patientName', res.data.patientName)
this.$set(this.formData, 'patientAddress', res.data.patientAddress)
this.$set(this.formData, 'patientPhone', res.data.patientPhone)
}
} else {
this.$message.error(res.msg)
}
},
async handleSaveTable() {
const data = JSON.parse(JSON.stringify(this.formData))
const params = {
...data
}
const { data: res } = await this.$http.post('/hospital/notice/saveOrUpdateFirstDiagnosis', params)
if (res.code === 0) {
await this.queryFirstVisit()
this.$message.success('保存成功')
} else {
this.$message.error(res.msg)
}
}
}
}
</script>
<style lang="scss" scoped>
.first-visit{
height: 100%;
}
input{
-webkit-appearance: checkbox !important;
margin-right: 5px;
}
::v-deep .el-input__inner {
border: none !important;
text-align: center;
border-radius: 0;
padding: 0;
font-size: 16px;
}
::v-deep .el-input__prefix {
display: none;
}
.el-date-editor.el-input, .el-date-editor.el-input__inner{
width: 100%;
}
.cornealTable{
width: 100%;
tr td{
border: 1px solid #ccc;
font-size: 18px;
padding: 3px 10px;
::v-deep .el-input__inner {
border: none !important;
text-align: center;
border-radius: 0;
padding: 0;
}
::v-deep .el-textarea__inner{
border: none;
}
.tdItem{
display: flex !important;
align-items: center;
}
.checkItem{
cursor: pointer;
user-select: none;
word-break: keep-all;
margin-right: 20px;
}
}
}
.corneal{
width: 100%;
height: 100%;
display:flex;
flex-direction: column;
}
.notice-content{
width: 100%;
height: calc(100% - 50px);
flex:1;
//overflow-y: auto;
.notice-box{
width: 100%;
height: 100%;
}
.notice_tip{
height: 100%;
overflow-y: auto;
border: 1px solid #000;
padding: 32px 32px;
margin-right: 16px;
}
}
</style>

131
src/page-subspecialty/views/modules/optometryManagement/seeDoctor/follow-up/add-follow-record.vue

@ -1,131 +0,0 @@
<template>
<el-dialog
class="follow-record-dialog"
:visible.sync="visible"
width="30%"
title="新增随访记录"
>
<el-form ref="dataForm" :model="dataForm" :rules="dataRule">
<el-form-item label="随访时间:" label-width="90px" prop="realVisitTime">
<el-date-picker
v-model="dataForm.realVisitTime"
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 crfVoS.childrenList" :key="item.crfId" v-model="dataForm.crfId" :label="item.crfId" @change="radioChange(item)">{{ item.name }}</el-radio>
</el-form-item>
</el-form>
<template slot="footer">
<el-button @click="visible = false">{{ $t('cancel') }}</el-button>
<el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button>
</template>
</el-dialog>
</template>
<script>
import debounce from 'lodash/debounce'
export default {
props: {
patientTypeList: {
type: Array,
default: () => []
},
crfVoS: {
type: Object,
default: () => {
return {}
}
},
patientIdNumber: {
type: String,
default: ''
}
},
data() {
return {
visible: false,
dataForm: {
realVisitTime: '',
crfId: '',
realVisitType: '', // 访 访 访
creatorId: '', // Id
patIdNumber: this.patientIdNumber,
drgsName: window.localStorage.getItem('identity')
}
}
},
computed: {
dataRule() {
return {
realVisitTime: [
{ required: true, message: '请选择随访时间', trigger: 'blur' }
],
crfId: [
{ required: true, message: '请选择要使用的随访表单', trigger: 'change' }
]
}
}
},
methods: {
init() {
this.visible = true
this.$nextTick(() => {
this.$refs.dataForm.resetFields() //
})
},
// 访
radioChange(item) {
this.dataForm.realVisitType = item.name
},
//
dataFormSubmitHandle: debounce(function() {
this.$refs.dataForm.validate((valid) => {
if (!valid) {
return false
}
this.dataForm.creatorId = JSON.parse(window.localStorage.getItem('yzk-sysUserDTO')).id
this.$http.post('/flow/add', this.dataForm).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.visible = false
res.data.isWrite = '0'
this.$emit('getTimeAxisData', res.data)
this.$emit('refreshDataList', res.data)
}
})
}).catch(() => {})
})
}, 1000, { leading: true, trailing: false })
}
}
</script>
<style lang="scss">
.follow-record-dialog {
.el-dialog__header {
margin-bottom:12px
}
.el-dialog__body {
padding-right: 30px;
}
.formItemOne .el-form-item__content {
display: flex;
}
.el-date-editor {
width: 100%;
}
.el-radio {
display: block;
padding: 8px 0;
}
}
</style>

298
src/page-subspecialty/views/modules/optometryManagement/seeDoctor/follow-up/index.vue

@ -1,298 +0,0 @@
<template>
<div class="follow-up">
<!-- 随访记录 -->
<!-- 首诊记录头部 -->
<head-template head-left="随访记录">
<el-button v-show="timeAxisData.length > 0" type="primary" size="small" @click="addOrUpdateHandle(dataForm)">修改</el-button>
<el-button v-show="timeAxisData.length > 0" type="danger" plain size="small" @click="deleteHandle">删除</el-button>
<button v-show="timeAxisData.length > 0" class="printer" @click="printerHandle">打印</button>
</head-template>
<!-- 随访内容 -->
<div v-show="timeAxisData.length > 0" iv class="follow-up-content">
<div class="content-left">
<el-button type="primary" round plain size="small" icon="el-icon-plus" class="addfollow" @click="addFollowHandle">新增随访</el-button>
<time-line-follow-up ref="timeline" :time-axis-data="timeAxisData" class="time-line" @refreshDataList="init" />
</div>
<div class="content-right">
<crf
v-if="crfVisible"
ref="crfComponent"
:value="dataForm.content"
:height="'100%'"
:js-arr="jsArr"
style="margin: 0;padding: 40px 0;width: 95%;border: 1px solid #000;background:#fff;"
:body-style-show="true"
/>
</div>
</div>
<!-- 没有随访数据 -->
<div v-show="timeAxisData.length <= 0" class="no-follow-up-father">
<div class="no-follow-up">
<img src="@/assets/img/nodata.png" alt="">
<div class="no-follow-up-content">
<p class="title-one">暂无随访记录</p>
<p class="title-two">你可以点击新增记录按钮新增随访记录</p>
<el-button type="primary" icon="el-icon-plus" round @click="addFollowHandle">新增记录</el-button>
</div>
</div>
</div>
<!-- 新增随访记录 -->
<add-follow-record v-if="followRecordVisible" ref="followRecordRef" :patient-id-number="patientIdNumber" :crf-vo-s="crfVoS" @getTimeAxisData="getTimeAxisData('add',$event)" />
<!-- 弹窗, 新增 / 修改 -->
<follow-up v-if="followUpVisible" ref="followUp" :is-sign="true" is-first="2" title="青光眼随访" @refreshDataList="init()" @getTimeAxisData="getTimeAxisData" />
</div>
</template>
<script>
import headTemplate from '@/components/head'
import timeLineFollowUp from '@/components/360View/time-line-follow-up'
// import crf from '@/components/hm-crf/load_content.vue'
// import followUp from '@/components/hm-crf/followUp.vue'
import addFollowRecord from './add-follow-record.vue'
import qgyCRFData from '@/mixins/qgyCRFData'
const Base64 = require('js-base64').Base64
export default {
components: {
timeLineFollowUp,
headTemplate,
addFollowRecord,
// crf,
// followUp
},
mixins: [qgyCRFData],
props: {
crfVoS: {
type: Object,
default: () => {
return {}
}
},
patientIdNumber: {
type: String,
default: ''
},
patientId: {
type: String,
default: ''
}
},
inject: ['refresh'],
data() {
return {
timeAxisData: [], //
followRecordVisible: false,
crfVisible: false,
followUpVisible: false,
jsArr: [],
dataForm: {},
realVisitType: '',
realVisitTime: ''
}
},
created() {
// this.getTimeAxisData()
},
methods: {
//
printerHandle() {
this.$refs.crfComponent.$el.contentWindow.print()
},
//
addFollowHandle() {
this.followRecordVisible = true
this.$nextTick(() => {
this.$refs.followRecordRef.init()
})
},
// 访
init(item) {
item ? this.dataForm = { ...this.dataForm, ...item } : ''
this.crfVisible = false
this.$nextTick(() => {
// isWrite=0 isWrite=1
console.log(this.dataForm)
if (this.dataForm.isWrite === '0') {
this.realVisitTime = this.dataForm.realVisitTime
this.realVisitType = this.dataForm.realVisitType
this.getQgyCRFData()
}
this.$http.get('/crf/getFlowForm', {
params: {
patientIdNumber: this.patientIdNumber,
formId: this.dataForm.formId
}
})
.then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
if (res.data) {
this.dataForm = { ...this.dataForm, ...res.data }
this.dataForm.content = Base64.decode(res.data.content)
this.crfVisible = true
}
}).catch(() => { })
})
},
// --
async getTimeAxisData(flag, data, del) {
data ? this.dataForm = { ...this.dataForm, ...data } : ''
const { data: res } = await this.$http.get('/flow/findCycle360', {
params: {
patIdNumber: 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) => {
if (item.date === this.dataForm.realVisitTime) {
this.$refs.timeline.itemCurrentIndex = index
item.itemList.forEach((iten, itenIndex) => {
if (iten.formId === this.dataForm.formId) {
this.$refs.timeline.itemListCurrentIndex = itenIndex
}
})
}
}) : ''
// 访
flag === 'add' ? this.addOrUpdateHandle(data) : ''
// dataform访
if (del && !flag) {
//
const Isdate = this.timeAxisData.some(item => item.date === this.dataForm.realVisitTime)
//
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].itemList[itemListIndex]
console.log(123)
this.init()
} else {
// 访dataform
const itemIndex = itemCurrentIndex === 0 ? 0 : itemCurrentIndex - 1
this.$refs.timeline.itemCurrentIndex = itemIndex
this.$refs.timeline.itemListCurrentIndex = 0
this.dataForm = this.timeAxisData[itemIndex].itemList[0]
console.log(123)
this.init()
}
} 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
this.dataForm = this.timeAxisData[getItemCurrentIndex].itemList[getItemListCurrentIndex]
this.init()
}
} else {
del ? this.$emit('refreshFollow') : ''
}
} else {
this.$message.error(res.msg)
}
},
//
addOrUpdateHandle(data) {
console.log(data)
this.followUpVisible = true
console.log(this.dataForm.isWrite)
this.$nextTick(() => {
this.$refs.followUp.crfId = this.dataForm.crfId
this.$refs.followUp.dataForm.formId = this.dataForm.formId
this.$refs.followUp.id = this.dataForm.id
this.$refs.followUp.realVisitType = this.dataForm.realVisitType
this.$refs.followUp.realVisitTime = data.realVisitTime
this.$refs.followUp.patientIdNumber = this.patientIdNumber
this.$refs.followUp.patientId = this.patientId
this.$refs.followUp.isWrite = this.dataForm.isWrite
this.$refs.followUp.init()
})
},
//
async deleteHandle() {
this.$confirmFun('你确定要删除此随访记录吗?').then(async() => {
const { data: res } = await this.$http.delete('/flow', {
params: {
id: this.dataForm.id
}
})
if (res.code === 0) {
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.getTimeAxisData('', '', 'delete')
}
})
} else {
this.$message.error(res.msg)
}
})
}
}
}
</script>
<style lang="scss" scoped>
.follow-up {
.follow-up-head {
display: flex;
justify-content: space-between;
align-items: center;
padding-bottom: 16px;
}
.printer {
border: 1px solid #ccc;
width: 56px;
height: 32px;
border-radius: 3px;
margin: 0;
margin-left: 10px;
cursor: pointer;
}
.no-follow-up-father {
background: #F7F9FD;
height: calc(100vh - 26px - 32px - 42px - 54px - 32px);
width: 100%;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
.title-one {
font-size: 14px;
color: rgba(0, 0, 0, 0.85);
margin-bottom: 8px;
font-weight: 700;
}
.title-two {
font-size: 12px;
color: rgba(0, 0, 0, 0.45);
margin-bottom: 8px;
}
}
.follow-up-content {
display: flex;
.content-left {
width: 160px;
.el-button {
margin-top: 10px;
}
}
}
.content-right {
height: calc(100vh - 26px - 32px - 42px - 54px - 32px);
flex: 1;
// min-width: 910px;
overflow-x:auto ;
padding: 16px;
background: #ededed;
text-align: center;
}
}
</style>

98
src/page-subspecialty/views/modules/optometryManagement/seeDoctor/followUpRecord.vue

@ -1,98 +0,0 @@
<template>
<el-dialog :visible.sync="visible" width="35%" title="变更记录">
<el-table
:data="tableData"
style="width: 100%"
>
<el-table-column
prop="createTime"
align="center"
label="日期"
>
<template slot-scope="scope">
{{ scope.row.createTime ? scope.row.createTime.substring(0, 10) : '' }}
</template>
</el-table-column>
<el-table-column
prop="remark"
label="变更记录"
align="center"
/>
<el-table-column
label="周期"
align="center"
>
<template slot-scope="scope">
{{ scope.row.revisitCycles }}
{{ scope.row.revisitCyclesUnit | unitState }}
</template>
</el-table-column>
</el-table>
<el-pagination small background layout="prev, pager, next" :total="total" :page-size="limit" :current-page="page" @current-change="pageChangeHandle" />
<template slot="footer">
<el-button @click="visible = false">{{ $t('cancel') }}</el-button>
</template>
</el-dialog>
</template>
<script>
export default {
filters: {
unitState(value) {
switch (value) {
case '1':
return '年'
case '2':
return '月'
case '3':
return '天'
case '4':
return '周'
}
}
},
props: {
patientIdNumber: {
type: String,
default: ''
}
},
data() {
return {
visible: false,
tableData: [],
page: 1,
limit: 5,
total: 0
}
},
methods: {
init() {
this.visible = true
this.$nextTick(() => {
this.pageChangeHandle(1)
})
},
pageChangeHandle(page) {
this.page = page
this.getInfo()
},
//
getInfo() {
this.$http.get('/flow/findLog', {
params: {
page: this.page,
limit: this.limit,
patIdNumber: this.patientIdNumber
}
}).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.tableData = res.data ? res.data.list : []
this.total = res.data ? res.data.total : 0
}).catch(() => { })
}
}
}
</script>

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save