You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
645 lines
18 KiB
645 lines
18 KiB
<template>
|
|
<div class="afterBox">
|
|
<div class="moveIcon">
|
|
<p @click="moveAll(1)"><i class="el-icon-back" /></p>
|
|
<p style="margin-top: 5px" @click="moveAll(2)"><i class="el-icon-back" style="transform: rotateY(180deg)" /></p>
|
|
</div>
|
|
<div style="display: flex;margin-top: 32px">
|
|
<div style="width: 200px;padding-right: 8px;text-align: left">
|
|
<p style="font-weight: bold;margin-bottom: 12px;text-align: left">描述项模板</p>
|
|
<el-button v-if="!treeCaseList.length" type="primary" size="small" @click="append(1)">+新增</el-button>
|
|
<el-tree
|
|
ref="tree"
|
|
:data="treeCaseList"
|
|
:props="treeProps"
|
|
:render-content="renderContent"
|
|
:default-expand-all="true"
|
|
:expand-on-click-node="false"
|
|
@node-click="templateData"
|
|
/>
|
|
</div>
|
|
<after-form
|
|
:table-data="tableData"
|
|
@handleNode="handleNode"
|
|
@addTree="addTree"
|
|
@moveHandle="moveHandle"
|
|
@handleSelectionChange="handleSelectionChange"
|
|
@removeTree="removeTree"
|
|
/>
|
|
</div>
|
|
<el-dialog :title="title" :visible.sync="dialogFormVisible">
|
|
<el-form :model="form" style="margin-top: 16px">
|
|
<el-form-item label="名称:" label-width="120px">
|
|
<el-input v-model="form.name" auto-complete="off" style="width: 300px" />
|
|
</el-form-item>
|
|
</el-form>
|
|
<div slot="footer" class="dialog-footer">
|
|
<el-button @click="dialogFormVisible = false">取 消</el-button>
|
|
<el-button type="primary" @click="handSaveBtn">确 定</el-button>
|
|
</div>
|
|
</el-dialog>
|
|
<el-dialog title="保存模板" :visible.sync="templateFlag">
|
|
<el-form :model="form" style="margin-top: 16px">
|
|
<el-form-item label="名称:" label-width="120px">
|
|
<el-input v-model="form.name" auto-complete="off" style="width: 300px" />
|
|
</el-form-item>
|
|
<el-form-item label="选择节点:" label-width="120px">
|
|
<el-tree
|
|
ref="tree"
|
|
:data="treeTemplate"
|
|
:props="treeProps"
|
|
:default-expand-all="true"
|
|
:expand-on-click-node="false"
|
|
@node-click="templateNodeClick"
|
|
/>
|
|
</el-form-item>
|
|
</el-form>
|
|
|
|
<div slot="footer" class="dialog-footer">
|
|
<el-button @click="templateFlag = false">取 消</el-button>
|
|
<el-button type="primary" @click="saveTreeTemplete">确 定</el-button>
|
|
</div>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import _ from 'lodash'
|
|
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'
|
|
const Base64 = require('js-base64').Base64
|
|
export default {
|
|
components: {
|
|
AfterForm,
|
|
treeSelect
|
|
},
|
|
mixins: [],
|
|
props: {
|
|
patientIdNumber: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
patientId: {
|
|
type: String,
|
|
default: ''
|
|
}
|
|
},
|
|
inject: ['refresh'],
|
|
data() {
|
|
return {
|
|
userData: {},
|
|
title: '',
|
|
addType: '',
|
|
sourceData: [],
|
|
treeCaseList: [],
|
|
treeTemplate: [],
|
|
treeProps: {
|
|
value: 'id',
|
|
label: 'name',
|
|
children: 'child'
|
|
},
|
|
type: '',
|
|
doctorId: '',
|
|
deleteId: '',
|
|
treeFlag: '',
|
|
treeId: '',
|
|
treeName: '',
|
|
weight: '',
|
|
parentId: 0,
|
|
collectId: '',
|
|
form: {
|
|
name: ''
|
|
},
|
|
multipleSelection: [],
|
|
templateFlag: false,
|
|
dialogFormVisible: false,
|
|
tableData: [
|
|
{
|
|
name: '黄斑'
|
|
}, {
|
|
name: '黄斑',
|
|
sort: 99,
|
|
id: 14,
|
|
type: 'hangman',
|
|
od: '',
|
|
os: ''
|
|
}, {
|
|
name: '视盘'
|
|
}, {
|
|
name: '视盘',
|
|
id: 15,
|
|
sort: 3,
|
|
type: 'shipman',
|
|
od: '',
|
|
os: ''
|
|
}, {
|
|
name: '视盘',
|
|
id: 16,
|
|
sort: 4,
|
|
type: 'shipman',
|
|
od: '',
|
|
os: ''
|
|
}, {
|
|
name: '视网膜'
|
|
}, {
|
|
name: '视网膜',
|
|
sort: 99,
|
|
id: 17,
|
|
type: 'showing',
|
|
od: '',
|
|
os: ''
|
|
}, {
|
|
name: '脉络膜'
|
|
}, {
|
|
name: '脉络膜',
|
|
sort: 99,
|
|
id: 18,
|
|
type: 'mailbomb',
|
|
od: '',
|
|
os: ''
|
|
}, {
|
|
name: '玻璃体 vitreous'
|
|
}, {
|
|
name: '玻璃体 vitreous',
|
|
sort: 99,
|
|
id: 19,
|
|
type: 'blit',
|
|
od: '',
|
|
os: ''
|
|
}, {
|
|
name: '血管'
|
|
}, {
|
|
name: '血管',
|
|
sort: 99,
|
|
id: 20,
|
|
type: 'began',
|
|
od: '',
|
|
os: ''
|
|
}, {
|
|
name: '巩膜'
|
|
}, {
|
|
name: '巩膜',
|
|
sort: 99,
|
|
id: 21,
|
|
type: 'gong',
|
|
od: '',
|
|
os: ''
|
|
}, {
|
|
name: '边缘 periphery'
|
|
}, {
|
|
name: '边缘 periphery',
|
|
sort: 99,
|
|
id: 22,
|
|
type: 'banyan',
|
|
od: '',
|
|
os: ''
|
|
}],
|
|
treeList: []
|
|
}
|
|
},
|
|
watch: {
|
|
tableData: {
|
|
deep: true,
|
|
handler: (value) => {
|
|
if (value) {
|
|
eventBus.$emit('getAfterData', value)
|
|
}
|
|
}
|
|
}
|
|
},
|
|
created() {
|
|
},
|
|
mounted() {
|
|
this.userData = JSON.parse(window.localStorage.getItem('qg-userData'))
|
|
this.doctorId = this.userData.id
|
|
this.getforeList('3').then(() => {
|
|
this.queryOptions()
|
|
})
|
|
this.queryTreeCase()
|
|
},
|
|
methods: {
|
|
async getforeList(flag) {
|
|
const { data: res } = await this.$http.get('/case/getCase', {
|
|
params: {
|
|
patientId: this.patientId,
|
|
platform: 1,
|
|
flag: flag // 1病史采集2前段检查3后段检查4专科检查
|
|
}
|
|
})
|
|
if (res.code === 0) {
|
|
// this.tableData = res.data ? JSON.parse(res.data.jsonText) : []
|
|
this.collectId = res.data ? res.data.id : ''
|
|
} else {
|
|
this.$message.error(res.msg)
|
|
}
|
|
},
|
|
// 表格复选框
|
|
handleSelectionChange(val) {
|
|
this.multipleSelection = val
|
|
},
|
|
handleNode(val) {
|
|
if (val.type === 'os') {
|
|
this.tableData[val.index].osValue = val.event
|
|
} else {
|
|
this.tableData[val.index].odValue = val.event
|
|
}
|
|
},
|
|
// 添加数据集
|
|
addAfterData() {
|
|
if (!this.multipleSelection.length) return this.$message.warning('请勾选数据!')
|
|
const data = this.multipleSelection.filter(item => {
|
|
return item.type !== undefined
|
|
})
|
|
eventBus.$emit('sendForData', data)
|
|
},
|
|
// 获取下拉选择项,把数据封装进表格中
|
|
queryOptions() {
|
|
const treeList = []
|
|
this.tableData.forEach(item => {
|
|
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 => {
|
|
if (e.type === row.type) {
|
|
e.data = item
|
|
const sort = item.sort
|
|
item.sort = ''
|
|
this.$nextTick(() => {
|
|
item.sort = sort
|
|
})
|
|
}
|
|
})
|
|
})
|
|
})
|
|
}
|
|
this.sourceData = _.cloneDeep(this.tableData) || []
|
|
eventBus.$emit('getAfterData', this.tableData)
|
|
}).catch((error) => {
|
|
console.log(error)
|
|
})
|
|
},
|
|
// 全部移动
|
|
moveAll(type) {
|
|
if (type === 1) {
|
|
this.tableData.forEach(item => {
|
|
if (item.sort) {
|
|
item.od = item.os
|
|
item.odValue = item.osValue
|
|
const sort = item.sort
|
|
item.sort = ''
|
|
this.$nextTick(() => {
|
|
item.sort = sort
|
|
})
|
|
}
|
|
})
|
|
} else {
|
|
this.tableData.forEach(item => {
|
|
if (item.sort) {
|
|
item.os = item.od
|
|
item.osValue = item.odValue
|
|
const sort = item.sort
|
|
item.sort = ''
|
|
this.$nextTick(() => {
|
|
item.sort = sort
|
|
})
|
|
}
|
|
})
|
|
}
|
|
},
|
|
// 移动
|
|
moveHandle(value) {
|
|
if (value.type === 1) {
|
|
this.tableData[value.index].od = value.row
|
|
this.tableData[value.index].odValue = value.row.osValue
|
|
} else {
|
|
this.tableData[value.index].os = value.row
|
|
this.tableData[value.index].osValue = value.row.odValue
|
|
}
|
|
const sort = this.tableData[value.index].sort
|
|
this.tableData[value.index].sort = ''
|
|
this.$nextTick(() => {
|
|
this.tableData[value.index].sort = sort
|
|
})
|
|
},
|
|
// 保存后段检查
|
|
async saveAfter() {
|
|
const params = {
|
|
flag: '3', // 1病史采集2前段检查3后段检查4专科检查
|
|
jsonText: JSON.stringify(this.tableData),
|
|
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('保存成功')
|
|
await this.getforeList('3')
|
|
} else {
|
|
this.$message.error(res.msg)
|
|
}
|
|
},
|
|
handSaveBtn() {
|
|
if (this.addType === 1) {
|
|
this.handleSaveTree()
|
|
} else {
|
|
this.handleSaveCase()
|
|
}
|
|
},
|
|
// 新增树
|
|
addTree(value) {
|
|
this.title = '新增子级'
|
|
this.addType = 1
|
|
this.form.name = ''
|
|
this.type = value.event.type
|
|
this.parentId = value.event.id
|
|
this.treeFlag = value.event.flag
|
|
this.dialogFormVisible = true
|
|
},
|
|
// 新增保存树-眼睛部位下拉选择
|
|
async handleSaveTree() {
|
|
const params = {
|
|
doctorId: this.doctorId,
|
|
name: this.form.name,
|
|
flag: this.treeFlag, // 1公共树,2个人树
|
|
type: this.type,
|
|
parentId: this.parentId,
|
|
platform: 1
|
|
}
|
|
const { data: res } = await this.$http.post('/treetag/addTree', params)
|
|
if (res.code === 0) {
|
|
this.dialogFormVisible = false
|
|
this.updataList()
|
|
this.$message.success('保存成功')
|
|
} else {
|
|
this.$message.error(res.msg)
|
|
}
|
|
},
|
|
// 删除树
|
|
removeTree(item) {
|
|
this.type = item.type
|
|
this.deleteId = item.id
|
|
this.$confirm('确定删除该节点?', '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
this.handleRemove()
|
|
}).catch(() => {
|
|
|
|
})
|
|
},
|
|
async handleRemove() {
|
|
const params = {
|
|
id: this.deleteId
|
|
}
|
|
const { data: res } = await this.$http.post('/treetag/deleteTree', params)
|
|
if (res.code === 0) {
|
|
this.$message.success('删除成功')
|
|
this.updataList()
|
|
} else {
|
|
this.$message.error(res.msg)
|
|
}
|
|
},
|
|
// 刷新下拉树
|
|
updataList() {
|
|
this.queryTree(this.type).then((res) => {
|
|
this.tableData.forEach(item => {
|
|
if (item.type === this.type) {
|
|
const sort = item.sort
|
|
item.sort = ''
|
|
this.$nextTick(() => {
|
|
item.sort = sort
|
|
})
|
|
item.data = res
|
|
}
|
|
})
|
|
})
|
|
},
|
|
queryTree(type) {
|
|
// 47.110.224.240:8036
|
|
// 192.168.4.24:8036
|
|
return new Promise((resolve, reject) => {
|
|
axios.defaults.headers.common['token'] = Cookies.get('xa-token') || ''
|
|
axios.get('http://192.168.4.83:8036/xiangan-crf/treetag/findTree', {
|
|
params: {
|
|
doctorId: this.doctorId,
|
|
type: type,
|
|
platform: 1
|
|
}
|
|
}).then(res => {
|
|
if (res.data.code === 0) {
|
|
const data = res.data
|
|
resolve(data.data)
|
|
}
|
|
})
|
|
.catch(error => {
|
|
reject(error)
|
|
})
|
|
})
|
|
},
|
|
// 点击左侧模板数据覆盖表格内容
|
|
templateData(data, node) {
|
|
if (data && data.caseJson) {
|
|
this.tableData = JSON.parse(data.caseJson)
|
|
} else {
|
|
this.tableData = _.cloneDeep(this.sourceData)
|
|
}
|
|
},
|
|
// 点击保存模板后弹框
|
|
handleTemplate() {
|
|
// if (!this.multipleSelection.length) return this.$message.warning('请勾选模板内容!')
|
|
this.form.name = ''
|
|
this.queryTemplate()
|
|
this.templateFlag = true
|
|
},
|
|
// 保存模板时选择树节点
|
|
templateNodeClick(node) {
|
|
this.treeId = node.id
|
|
},
|
|
// 保存模板树
|
|
async saveTreeTemplete() {
|
|
if (!this.treeId) return this.$message.warning('请选择节点!')
|
|
const params = {
|
|
caseJson: JSON.stringify(this.tableData),
|
|
doctorId: this.doctorId,
|
|
name: this.form.name,
|
|
type: 3, // 2前段检查 3后段检查
|
|
treeId: this.treeId
|
|
}
|
|
const { data: res } = await this.$http.post('/treetemplate/addTreeCase', params)
|
|
if (res.code === 0) {
|
|
this.templateFlag = false
|
|
await this.queryTreeCase()
|
|
this.$message.success('保存成功')
|
|
} else {
|
|
this.$message.error(res.msg)
|
|
}
|
|
},
|
|
// 新增左侧描述项树弹框
|
|
append(type, data) {
|
|
this.addType = 2
|
|
this.form.name = ''
|
|
type === 1 ? this.title = '新增父级' : this.title = '新增子级'
|
|
type === 1 ? this.parentId = 0 : this.parentId = data.id
|
|
this.dialogFormVisible = true
|
|
console.log(this.title)
|
|
},
|
|
// 左侧描述项树新增
|
|
async handleSaveCase() {
|
|
const params = {
|
|
doctorId: this.doctorId,
|
|
name: this.form.name,
|
|
weight: this.weight,
|
|
parentId: this.parentId,
|
|
platform: 1
|
|
}
|
|
const { data: res } = await this.$http.post('/treetemplate/addTree', params)
|
|
if (res.code === 0) {
|
|
this.dialogFormVisible = false
|
|
this.queryTreeCase()
|
|
this.$message.success('保存成功')
|
|
} else {
|
|
this.$message.error(res.msg)
|
|
}
|
|
},
|
|
// 删除左侧树/模板节点弹框
|
|
remove(node, data) {
|
|
this.deleteId = data.id
|
|
let url = ''
|
|
if (data.type) {
|
|
// 模板节点
|
|
url = '/treetemplate/deleteTreeCase'
|
|
} else {
|
|
// 树节点
|
|
url = '/treetemplate/deleteTree'
|
|
}
|
|
this.$confirm('确定删除该节点?', '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
this.removeTemplate(url)
|
|
}).catch(() => {
|
|
|
|
})
|
|
},
|
|
// 删除左侧树/模板节点
|
|
async removeTemplate(url) {
|
|
const params = {
|
|
id: this.deleteId
|
|
}
|
|
const { data: res } = await this.$http.post(url, params)
|
|
if (res.code === 0) {
|
|
this.$message.success('删除成功')
|
|
await this.queryTreeCase()
|
|
await this.getforeList('3')
|
|
} else {
|
|
this.$message.error(res.msg)
|
|
}
|
|
},
|
|
// 描述项模板
|
|
renderContent(h, { node, data, store }) {
|
|
return (
|
|
<span style='flex: 1; display: flex; align-items: center; justify-content: space-between; font-size: 14px; padding-right: 8px;'>
|
|
<span>
|
|
<span>{node.label}</span>
|
|
</span>
|
|
<span>
|
|
<el-button icon='el-icon-plus' style='font-size: 12px;color: black' type='text' on-click={ () => this.append(2, data) }>
|
|
</el-button>
|
|
<el-button icon='el-icon-delete' style='font-size: 12px;color: black' type='text' on-click={ () => this.remove(node, data) }>
|
|
</el-button>
|
|
</span>
|
|
</span>)
|
|
},
|
|
// 查询弹框模板树
|
|
async queryTemplate() {
|
|
const { data: res } = await this.$http.get('/treetemplate/findTree', {
|
|
params: {
|
|
platform: 1,
|
|
doctorId: this.doctorId
|
|
}
|
|
})
|
|
if (res.code === 0) {
|
|
this.treeTemplate = res.data
|
|
} else {
|
|
this.$message.error(res.msg)
|
|
}
|
|
},
|
|
// 使用递归遍历树,合并模板节点和child节点
|
|
fn(data) {
|
|
data.forEach((item, i) => {
|
|
if (item.list && item.list.length) {
|
|
item.child = item.child.concat(item.list)
|
|
// 调用递归函数
|
|
}
|
|
if (item.child) {
|
|
this.fn(item.child)
|
|
}
|
|
})
|
|
return data
|
|
},
|
|
// 查询左侧病历树
|
|
async queryTreeCase() {
|
|
const { data: res } = await this.$http.get('/treetemplate/findTreeCase', {
|
|
params: {
|
|
type: 3, // 2前段检查 3后段检查
|
|
platform: 1,
|
|
doctorId: this.doctorId
|
|
}
|
|
})
|
|
if (res.code === 0) {
|
|
this.treeCaseList = this.fn(res.data)
|
|
} else {
|
|
this.$message.error(res.msg)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
.afterBox{
|
|
width: 100%;
|
|
height: 100%;
|
|
//padding: 16px;
|
|
box-sizing: border-box;
|
|
overflow-y: auto;
|
|
position: relative;
|
|
.btnBox{
|
|
position: fixed;
|
|
right: 84px;
|
|
text-align: right;
|
|
margin-right: 16px;
|
|
background-color: white;
|
|
z-index: 999;
|
|
}
|
|
.moveIcon{
|
|
position: absolute;
|
|
left: calc(50% + 120px);
|
|
top: 40px;
|
|
z-index: 9;
|
|
}
|
|
}
|
|
</style>
|
|
<style lang="scss">
|
|
.afterBox{
|
|
.el-form-item__content{
|
|
text-align: left;
|
|
}
|
|
}
|
|
</style>
|