2025-12-06 发版,具体发版内容见发版记录

This commit is contained in:
whm
2025-12-06 11:41:04 +08:00
parent 82716b2cdd
commit 0c0d812ff9
986 changed files with 110558 additions and 25178 deletions

View File

@@ -1,4 +1,4 @@
import { bodyTemperature, TOP_KEYS, HEAD_HEIGHT, LINE_HEIGHT } from './config'
import { bodyTemperature, TOP_KEYS, HEAD_HEIGHT, LINE_HEIGHT } from './config';
export default class viewConfig {
constructor({
@@ -12,47 +12,44 @@ export default class viewConfig {
strokeWidth = 2, // stroke width of line and dots
strokeLinecap = 'round', // stroke line cap of line
strokeLinejoin = 'round', // stroke line join of line
renderData
renderData,
} = {}) {
// 基础配置赋值
this.width = width
this.height = height
this.stroke = stroke
this.strokeWidth = strokeWidth
this.strokeLinecap = strokeLinecap
this.renderData = renderData
this.strokeLinejoin = strokeLinejoin
this.marginRight = marginRight
this.marginLeft = marginLeft
this.marginBottom = marginBottom
this.marginTop = marginTop
this.width = width;
this.height = height;
this.stroke = stroke;
this.strokeWidth = strokeWidth;
this.strokeLinecap = strokeLinecap;
this.renderData = renderData;
this.strokeLinejoin = strokeLinejoin;
this.marginRight = marginRight;
this.marginLeft = marginLeft;
this.marginBottom = marginBottom;
this.marginTop = marginTop;
// 计算属性赋值
this.contentWidth = width - marginLeft - marginRight
this.step = this.contentWidth / 8
this.bottomPos = height - HEAD_HEIGHT - marginTop - (marginBottom - 30) // 底部坐标30是因为默认的30忘记计算了后续的按照30的偏移量计算
this.tableHeight = height - marginBottom - HEAD_HEIGHT
const { micoStep, verticalHeight } = this.utilsGetMicoPos(
this.step,
this.bottomPos
)
this.micoStep = micoStep
this.verticalHeight = verticalHeight
this.X_OFFSET = micoStep / 2 // 为了让图标在小格子居中展示,需要进行一个偏移
this.xRange = [this.step, width - marginLeft - marginRight] // [60, 860]
this.topPos = marginTop + HEAD_HEIGHT
this.topKeysPos = LINE_HEIGHT * (TOP_KEYS.length + 1) // 1 是时间那一行
this.bottomKeysPosStart = this.topKeysPos + verticalHeight + 20
this.yRange = [this.bottomKeysPosStart - 20, this.topKeysPos]
this.contentWidth = width - marginLeft - marginRight;
this.step = this.contentWidth / 8;
this.bottomPos = height - HEAD_HEIGHT - marginTop - (marginBottom - 30); // 底部坐标30是因为默认的30忘记计算了后续的按照30的偏移量计算
this.tableHeight = height - marginBottom - HEAD_HEIGHT;
const { micoStep, verticalHeight } = this.utilsGetMicoPos(this.step, this.bottomPos);
this.micoStep = micoStep;
this.verticalHeight = verticalHeight;
this.X_OFFSET = micoStep / 2; // 为了让图标在小格子居中展示,需要进行一个偏移
this.xRange = [this.step, width - marginLeft - marginRight]; // [60, 860]
this.topPos = marginTop + HEAD_HEIGHT;
this.topKeysPos = LINE_HEIGHT * (TOP_KEYS.length + 1); // 1 是时间那一行
this.bottomKeysPosStart = this.topKeysPos + verticalHeight + 20;
this.yRange = [this.bottomKeysPosStart - 20, this.topKeysPos];
}
// 获取折线区域的高度
utilsGetMicoPos(step, botpos) {
const micoStep = (step * 7) / 42 // 折线小格子的宽度
const verticalLength = bodyTemperature[1] - bodyTemperature[0] // 根据体温来计算格子
const verticalHeight = micoStep * 5 * verticalLength
const micoStep = (step * 7) / 42; // 折线小格子的宽度
const verticalLength = bodyTemperature[1] - bodyTemperature[0]; // 根据体温来计算格子
const verticalHeight = micoStep * 5 * verticalLength;
return {
micoStep,
verticalHeight
}
verticalHeight,
};
}
}

View File

@@ -1,271 +1,215 @@
import dayjs from 'dayjs'
import dayjs from 'dayjs';
import {
HospitalName,
temperatureName,
showPainFlag,
getInfoKeys,
getBottomKeys
} from './template'
getBottomKeys,
} from './template';
// 存放体温单的配置信息
export const Header = {
HospitalName,
temperatureName
}
temperatureName,
};
// 患者信息
export const INFO_KEYS = getInfoKeys()
export const INFO_KEYS = getInfoKeys();
// 头部信息标签
export const TOP_KEYS = [
//{
// name: '患病日数',
// getValue: (i, renderData) => {
// const { beginDate, hospDays, outdate = '', dateClosed } = renderData.infoData
// const tieml = new Date()
// const timeNew = new Date((tieml / 1000 + 86400) * 1000)
// const todayDate = dayjs(timeNew).format('YYYY-MM-DD')
// const endDate = dayjs(outdate).add(1, 'day').format('YYYY-MM-DD')
// const eachTime = dayjs(beginDate)
// .add(i, 'day')
// .format('YYYY-MM-DD')
// if (eachTime === endDate || todayDate === eachTime) {
// dateClosed.stopNumber = true
// }
// return dateClosed.stopNumber ? hospDays + i + 1 : ''
// }
//},
{
name: '日 期',
getValue: (i, renderData) => {
const { beginDate, outdate = '', hospDate = '', dateClosed } = renderData.infoData
const tieml = new Date()
const timeNew = new Date((tieml / 1000 + 86400) * 1000)
const todayDate = dayjs(timeNew).format('YYYY-MM-DD')
const endDate = dayjs(outdate).format('YYYY-MM-DD')
const startDate = dayjs(hospDate).format('YYYY-MM-DD')
let eachTime = dayjs(beginDate).add(i, 'day').format('YYYY-MM-DD')
const { beginDate, outdate = '', hospDate = '', dateClosed } = renderData.infoData;
const tieml = new Date();
const timeNew = new Date((tieml / 1000 + 86400) * 1000);
const todayDate = dayjs(timeNew).format('YYYY-MM-DD');
const endDate = dayjs(outdate).format('YYYY-MM-DD');
const startDate = dayjs(hospDate).format('YYYY-MM-DD');
let eachTime = dayjs(beginDate).add(i, 'day').format('YYYY-MM-DD');
if (eachTime === endDate || eachTime === todayDate) {
dateClosed.stopTime = true
dateClosed.stopTime = true;
}
if ((startDate === eachTime && i === 0) || dayjs(eachTime).format('MM-DD') === '01-01') {
eachTime = dayjs(eachTime).format('YYYY年MM月DD日')
eachTime = dayjs(eachTime).format('YYYY年MM月DD日');
} else if (i === 0 || dayjs(eachTime).format('DD') === '01') {
eachTime = dayjs(eachTime).format('MM月DD日')
eachTime = dayjs(eachTime).format('MM月DD日');
} else {
eachTime = dayjs(eachTime).format('DD日')
eachTime = dayjs(eachTime).format('DD日');
}
return dateClosed.stopTime ? eachTime : ''
}
return dateClosed.stopTime ? eachTime : '';
},
},
{
name: '住院日数',
getValue: (i, renderData) => {
const { beginDate, hospDays, outdate = '', dateClosed } = renderData.infoData
const tieml = new Date()
const timeNew = new Date((tieml / 1000 + 86400) * 1000)
const todayDate = dayjs(timeNew).format('YYYY-MM-DD')
const endDate = dayjs(outdate).add(1, 'day').format('YYYY-MM-DD')
const eachTime = dayjs(beginDate).add(i, 'day').format('YYYY-MM-DD')
const { beginDate, hospDays, outdate = '', dateClosed } = renderData.infoData;
const tieml = new Date();
const timeNew = new Date((tieml / 1000 + 86400) * 1000);
const todayDate = dayjs(timeNew).format('YYYY-MM-DD');
const endDate = dayjs(outdate).add(1, 'day').format('YYYY-MM-DD');
const eachTime = dayjs(beginDate).add(i, 'day').format('YYYY-MM-DD');
if (eachTime === endDate || todayDate === eachTime) {
dateClosed.stopNumber = false
dateClosed.stopNumber = false;
}
const num = dateClosed.stopNumber ? hospDays + i + 1 : ''
let hosNum = ''
const num = dateClosed.stopNumber ? hospDays + i + 1 : '';
let hosNum = '';
if (num !== '') {
hosNum = '第' + "\xa0\xa0\xa0" + num + "\xa0\xa0\xa0" + '日'
hosNum = '第' + '\xa0\xa0\xa0' + num + '\xa0\xa0\xa0' + '日';
} else {
hosNum = '第' + "\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0" + '日'
hosNum = '第' + '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0' + '日';
}
return hosNum
}
return hosNum;
},
},
{
name: '术/娩后日数',
getValue: (i, renderData) => {
const { beginDate } = renderData.infoData
const surgeryNumDays = renderData.surgeryNumDays
const eachTime = dayjs(beginDate).add(i, 'day').format('YYYY-MM-DD')
let num = surgeryNumDays.filter(item => item.date === eachTime)
let hosNum = ''
const { beginDate } = renderData.infoData;
const surgeryNumDays = renderData.surgeryNumDays;
const eachTime = dayjs(beginDate).add(i, 'day').format('YYYY-MM-DD');
let num = surgeryNumDays.filter((item) => item.date === eachTime);
let hosNum = '';
if (num.length > 0) {
hosNum = '第' + "\xa0\xa0\xa0" + num[0].typeValue + "\xa0\xa0\xa0" + '日'
hosNum = '第' + '\xa0\xa0\xa0' + num[0].typeValue + '\xa0\xa0\xa0' + '日';
} else {
hosNum = '第' + "\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0" + '日'
hosNum = '第' + '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0' + '日';
}
return hosNum
}
}
]
return hosNum;
},
},
];
// 最底部的字段绘制
export const BOTTOM_KEYS = getBottomKeys()
export const BOTTOM_KEYS = getBottomKeys();
// 是否显示疼痛评分
export const showPain = showPainFlag
export const showPain = showPainFlag;
/** *********** 以下是固定选项 **************************/
export const timeNumber = [2, 6, 10, 14, 18, 22] // 时间展示
export const nightTime = [2, 18, 22] // 夜间红色高亮时间
//export const leftTEXT1 = [
// // ['脉3搏,(次/分), 180', '160', '140', '120', '100', '80', '60', '40'],
// // ['体4温,(℃), 42', '41', '40', '39', '38', '37', '36', '35']
// // ['华氏,( °F), 107.6', '105.8', '104', '102.2', '100.4', '98.6', '96.8', '95']
// ['华氏,( °F), ', '', '107', '106', '105', '104', '103', '102', '101', '100', '99', '98', '97', '96', '95', '94']
// // ['摄氏,(℃), 42', '41', '40', '39', '38', '37', '36', '35']
//]
//export const leftTEXT2 = [
// ['摄氏,(℃), ', '42', '41', '40', '39', '38', '37', '36', '35']
//]
//export const rightTEXT = [
// [',, ', '180', '160', '140', '120', '100', '80', '60', '40']
//]
//export const painTEXT = [
// ['疼 痛'],
// ['8', '6', '4', '2']
//]
export const timeNumber = [2, 6, 10, 14, 18, 22]; // 时间展示
export const nightTime = [2, 18, 22]; // 夜间红色高亮时间
export const leftTEXT = [
['脉搏,(次/分),', '180', '160', '140', '120', '100', '80', '60', '40'],
['体温,(℃), ', '42', '41', '40', '39', '38', '37', '36', '35']
]
export const painTEXT = [['疼 痛 强 度'], ['10', '8', '6', '4', '2', '0']]
export const inOutItem = ['入观', '分娩', '手术', '转入', '出观', '死亡']
export const otherItem = ['外出', '请假', '拒测', '离院', '其他']
['体温,(℃), ', '42', '41', '40', '39', '38', '37', '36', '35'],
];
export const painTEXT = [['疼 痛 强 度'], ['10', '8', '6', '4', '2', '0']];
export const inOutItem = ['入观', '分娩', '手术', '转入', '出观', '死亡'];
export const otherItem = ['外出', '请假', '拒测', '离院', '其他'];
export const sheetOptions = {
locations: [{
code: '1',
display: '体温'
}, {
code: '2',
display: '口温'
}, {
code: '3',
display: '肛温'
}, {
code: '4',
display: '温'
}],
breath: [{
code: '',
display: '自主呼吸'
}, {
code: '®',
display: '机械通气'
}],
poop: [{
code: '',
display: '正常'
}, {
code: '',
display: '失禁'
}, {
code: '☆',
display: '人工肛门'
}, {
code: '/E',
display: '灌肠'
}],
pee: [{
code: '',
display: '正常'
}, {
code: '※',
display: '失禁'
}, {
code: 'C+',
display: '导尿'
}],
locations: [
{
code: '1',
display: '体温',
},
{
code: '2',
display: '口温',
},
{
code: '3',
display: '温',
},
{
code: '4',
display: '耳温',
},
],
breath: [
{
code: '',
display: '自主呼吸',
},
{
code: '®',
display: '机械通气',
},
],
poop: [
{
code: '',
display: '正常',
},
{
code: '',
display: '失禁',
},
{
code: '☆',
display: '人工肛门',
},
{
code: '/E',
display: '灌肠',
},
],
pee: [
{
code: '',
display: '正常',
},
{
code: '※',
display: '失禁',
},
{
code: 'C+',
display: '导尿',
},
],
heart: ['窦性心律', '起搏心律', '房性心律', '异常心律'],
weight: ['正常', '卧床', '轮椅', '平车']
}
weight: ['正常', '卧床', '轮椅', '平车'],
};
// 此处是显示数字的 要和leftTEXT保持一直
// export const bodyTemperature1 = [94, 107]
// export const starNumEnv1 = bodyTemperature1[0] // 开始体温
// export const endNumEnv1 = bodyTemperature1[1] // 结束体温
export const bodyTemperature = [33, 43]
export const starNumEnv = bodyTemperature[0] // 开始体温
export const endNumEnv = bodyTemperature[1] // 结束体温
export const heartRange = [0, 200]
export const painScore = [0, 10]
export const bodyTemperature = [33, 43];
export const starNumEnv = bodyTemperature[0]; // 开始体温
export const endNumEnv = bodyTemperature[1]; // 结束体温
export const heartRange = [0, 200];
export const painScore = [0, 10];
// 中间图表字段对应
export const CHART_KEYS = [
{
key: '001',
code: 'breath',
name: '呼吸'
name: '呼吸',
},
{
key: '002',
code: 'sphygmus',
name: '脉搏'
name: '脉搏',
},
{
key: '003',
code: 'temperature',
name: '体温'
name: '体温',
},
{
key: '012',
code: 'inOut',
name: '特殊标记'
name: '特殊标记',
},
{
key: '013',
code: 'refuse',
name: '标记内容'
name: '标记内容',
},
{
key: '014',
code: 'heartRate',
name: '心率'
name: '心率',
},
{
key: '015',
code: 'lowerTemp',
name: '物理降温'
name: '物理降温',
},
{
key: '016',
code: 'painScore',
name: '疼痛评分'
}
// {
// key: '017',
// code: 'admission',
// name: '入院'
// },
// {
// key: '018',
// code: 'bigSurgery',
// name: '大手术'
// },
// {
// key: '019',
// code: 'smallSurgery',
// name: '小手术'
// },
// {
// key: '020',
// code: 'discharge',
// name: '出院'
// },
// {
// key: '021',
// code: 'parturition',
// name: '分娩'
// },
// {
// key: '022',
// code: 'transfer',
// name: '转科'
// },
// {
// key: '9507',
// code: 'death',
// name: '死亡'
// }
]
export const HEAD_HEIGHT = 80 // 头部文字预留位置
export const LINE_HEIGHT = 20 // 一行的行高
export const textLeftMargin = 4 // 文字左边边距
export const TEXT_MARGIN_BOTTOM = 6 // 文字向上偏移量
export const symbolArrowHeight = 20
name: '疼痛评分',
},
];
export const HEAD_HEIGHT = 120; // 头部文字预留位置
export const LINE_HEIGHT = 20; // 一行的行高
export const textLeftMargin = 4; // 文字左边边距
export const TEXT_MARGIN_BOTTOM = 6; // 文字向上偏移量
export const symbolArrowHeight = 20;

View File

@@ -4,42 +4,32 @@
// index: 0
// value: 36
// }
export function getMaxList({
list = [],
max = 0,
min = 0,
maxDefault = 0,
minDefault = 0
} = {}) {
return list.map(item => {
if (((item.value > max) || (item.value < min)) && item.value !== null) {
const ismax = item.value > max
export function getMaxList({ list = [], max = 0, min = 0, maxDefault = 0, minDefault = 0 } = {}) {
return list.map((item) => {
if ((item.value > max || item.value < min) && item.value !== null) {
const ismax = item.value > max;
return {
...item,
value: ismax ? maxDefault : minDefault,
sourceValue: item.value,
ismax: ismax,
max,
min
}
min,
};
} else {
return null
return null;
}
})
});
}
export function levelingData({
list = [],
maxDefault = 0,
minDefault = 0
}) {
return list.map(item => {
if (item.value === null) return item
export function levelingData({ list = [], maxDefault = 0, minDefault = 0 }) {
return list.map((item) => {
if (item.value === null) return item;
if (item.value > maxDefault) {
item.value = maxDefault
item.value = maxDefault;
} else if (item.value < minDefault) {
item.value = minDefault
item.value = minDefault;
}
return item
})
return item;
});
}

View File

@@ -1,6 +1,6 @@
// 数据处理
import * as d3 from 'd3'
import { symbol } from 'd3-shape'
import * as d3 from 'd3';
import { symbol } from 'd3-shape';
import {
getTypeData,
getTypeDatas,
@@ -13,12 +13,19 @@ import {
getType,
getHeartRate,
disconnectEvents,
getBrokenLine
} from './utils'
import { HEAD_HEIGHT, LINE_HEIGHT, TOP_KEYS, BOTTOM_KEYS, symbolArrowHeight, textLeftMargin} from './config'
getBrokenLine,
} from './utils';
import {
HEAD_HEIGHT,
LINE_HEIGHT,
TOP_KEYS,
BOTTOM_KEYS,
symbolArrowHeight,
textLeftMargin,
} from './config';
export const iconDrawObj = {
// 绘制圆形图标
getDrawRoundIcon: ({ content,data, x, y, fill = 'blue',stroke = 'blue', r = 5 }) => {
getDrawRoundIcon: ({ content, data, x, y, fill = 'blue', stroke = 'blue', r = 5 }) => {
// 增加icon 红色空心
content
.append('g')
@@ -29,23 +36,32 @@ export const iconDrawObj = {
.data(data)
.join('circle')
.attr('transform', (i) => {
const yVal = y(i) || 0
const yVal = y(i) || 0;
if (!yVal) {
return 'scale(0)'
return 'scale(0)';
}
return ''
return '';
})
.attr('cx', x)
.attr('cy', y)
.attr('r', (i) => {
if (y(i)) {
return r
return r;
}
return 0
})
return 0;
});
},
// 绘制圆形点图标
getDrawRoundDotIcon: ({ content, data, x, y, fill = 'white', stroke = 'blue', deepFill = 'blue', r = 6 }) => {
getDrawRoundDotIcon: ({
content,
data,
x,
y,
fill = 'white',
stroke = 'blue',
deepFill = 'blue',
r = 6,
}) => {
content
.append('g')
.attr('fill', fill)
@@ -55,11 +71,11 @@ export const iconDrawObj = {
.data(data)
.join('circle')
.attr('transform', (i) => {
const yVal = y(i) || 0
const yVal = y(i) || 0;
if (!yVal) {
return 'scale(0)'
return 'scale(0)';
}
return ''
return '';
})
.attr('cx', x)
.attr('cy', y)
@@ -68,7 +84,7 @@ export const iconDrawObj = {
.attr('cx', x)
.attr('cy', y)
.attr('r', 1)
.attr('fill', deepFill)
.attr('fill', deepFill);
},
// 绘制x
getDrawXIcon: ({ content, data, x, y, fill = 'blue', stroke = 'blue' }) => {
@@ -81,43 +97,43 @@ export const iconDrawObj = {
.data(data)
.join('line')
.attr('transform', (i) => {
let yVal = y
let yVal = y;
if (typeof y === 'function') {
yVal = y(i) || 0
yVal = y(i) || 0;
}
if (!yVal) {
return 'scale(0)'
return 'scale(0)';
}
return ''
return '';
})
.attr('x1', function(d) {
return x(d) - 4
.attr('x1', function (d) {
return x(d) - 4;
})
.attr('y1', function(d) {
return y(d) - 4
.attr('y1', function (d) {
return y(d) - 4;
})
.attr('x2', function(d) {
return x(d) + 4
.attr('x2', function (d) {
return x(d) + 4;
})
.attr('y2', function(d) {
return y(d) + 4
.attr('y2', function (d) {
return y(d) + 4;
})
.clone()
.attr('x1', function(d) {
return x(d) + 4
.attr('x1', function (d) {
return x(d) + 4;
})
.attr('y1', function(d) {
return y(d) - 4
.attr('y1', function (d) {
return y(d) - 4;
})
.attr('x2', function(d) {
return x(d) - 4
})
.attr('y2', function(d) {
return y(d) + 4
.attr('x2', function (d) {
return x(d) - 4;
})
.attr('y2', function (d) {
return y(d) + 4;
});
},
// 绘制三角形
drawThreeIcon: ({ content, data, x,y, fill = 'blue', stroke = 'blue', riangle = 48 }) => {
drawThreeIcon: ({ content, data, x, y, fill = 'blue', stroke = 'blue', riangle = 48 }) => {
// 蓝色三角形
content
.append('g')
@@ -126,74 +142,82 @@ export const iconDrawObj = {
.data(data)
.join('g')
.attr('transform', (i) => {
const yVal = y(i) || 0
const yVal = y(i) || 0;
if (!yVal) {
return 'scale(0)'
return 'scale(0)';
}
return `translate(${x(i)},${yVal})`
return `translate(${x(i)},${yVal})`;
})
.append('path')
.call((path) => {
const symbolThree = symbol()
const symbolIndex = 5
symbolThree.type(d3.symbols[symbolIndex])
path.attr('d', symbolThree.size(riangle)).attr('fill', fill) .attr('stroke', stroke)
const symbolThree = symbol();
const symbolIndex = 5;
symbolThree.type(d3.symbols[symbolIndex]);
path.attr('d', symbolThree.size(riangle)).attr('fill', fill).attr('stroke', stroke);
// .transition()
// .duration(1500)
// .attr('d', symbolThree.size(48))
})
}
}
});
},
};
export function getG(svg, viewConfig) {
return svg .append('g') .attr( 'transform', `translate(${viewConfig.marginLeft},${viewConfig.marginTop + HEAD_HEIGHT})` )
return svg
.append('g')
.attr('transform', `translate(${viewConfig.marginLeft},${viewConfig.marginTop + HEAD_HEIGHT})`);
}
// 设置数据
export function getData(allData) {
const rowsData = allData.rows // allData, '【全部数据】'
const infoData = allData.grParamBOS
const typesData = getTypeDatas(allData.types, allData.grParamBOS.beginDate)
const selectOp = allData.selectOp
const symbolTextArr = getTypeData('018', rowsData, false, allData.grParamBOS.beginDate) // 【特殊标记】
const symbolGoUp = getType('003', rowsData, allData.grParamBOS.beginDate) // 不升
const rowsData = allData.rows; // allData, '【全部数据】'
const infoData = allData.grParamBOS;
const typesData = getTypeDatas(allData.types, allData.grParamBOS.beginDate);
const selectOp = allData.selectOp;
const symbolTextArr = getTypeData('018', rowsData, false, allData.grParamBOS.beginDate); // 【特殊标记】
const symbolGoUp = getType('003', rowsData, allData.grParamBOS.beginDate); // 不升
// 体温单特殊数据
const dicData = JSON.parse(window.localStorage.getItem('transDictCode'))
const signsManagementList = dicData ? dicData.filter(item => item.name === '95')[0].concept.sort((a, b) => { return a.displayOrder - b.displayOrder }) :[]
const otherArr = []
const dicData = JSON.parse(window.localStorage.getItem('transDictCode'));
const signsManagementList = dicData
? dicData
.filter((item) => item.name === '95')[0]
.concept.sort((a, b) => {
return a.displayOrder - b.displayOrder;
})
: [];
const otherArr = [];
if (signsManagementList.length > 0) {
for (let j = 0; j < signsManagementList.length; j++) {
if (signsManagementList[j].code !== '9502' & signsManagementList[j].code !== '9503') {
const otherArrItem = getTypeData(signsManagementList[j].code, rowsData, false, allData.grParamBOS.beginDate)
otherArr.push(otherArrItem)
if ((signsManagementList[j].code !== '9502') & (signsManagementList[j].code !== '9503')) {
const otherArrItem = getTypeData(
signsManagementList[j].code,
rowsData,
false,
allData.grParamBOS.beginDate
);
otherArr.push(otherArrItem);
}
}
}
const surgeryNumDays = allData.types.filter(item => item.typeCode === '031')
const surgeryArr = getTypeData('9502', rowsData, false, allData.grParamBOS.beginDate) // '【手术】'
const minSurgeryArr = getTypeData('9503', rowsData, false, allData.grParamBOS.beginDate) // '【小手术】'
const temArr = getTypeData('00301', rowsData, false, allData.grParamBOS.beginDate) // '【体温拒测等】'
// const symbolGoUp = getType('003', rowsData, allData.grParamBOS.beginDate) // symbolGoUp, '不升'
const surgeryNumDays = allData.types.filter((item) => item.typeCode === '031');
const surgeryArr = getTypeData('9502', rowsData, false, allData.grParamBOS.beginDate); // '【手术】'
const minSurgeryArr = getTypeData('9503', rowsData, false, allData.grParamBOS.beginDate); // '【小手术】'
const temArr = getTypeData('00301', rowsData, false, allData.grParamBOS.beginDate); // '【体温拒测等】'
// const symbolGoUp = getType('003', rowsData, allData.grParamBOS.beginDate) // symbolGoUp, '不升'
// 35度线上的内容
const symbolDegreesEvents = degreesOnline(symbolTextArr, selectOp, 0)
const symbolDegreesOnline = disconnectEvents( symbolTextArr, selectOp, 'isBeforeAfter', 0 )
const symbolDegreesEvents = degreesOnline(symbolTextArr, selectOp, 0);
const symbolDegreesOnline = disconnectEvents(symbolTextArr, selectOp, 'isBeforeAfter', 0);
// 40~42线上的内容
const symbolTopOnline = degreesOnline(symbolTextArr, selectOp, 1)
const symbolTopDegreesOnline = disconnectEvents(
symbolTextArr,
selectOp,
'isBeforeAfter',
1
)
const symbolContent = getTypeData('013', rowsData, false, allData.grParamBOS.beginDate) // symbolContent, '【标记内容】'
const mergeTag = setMergeTag(symbolTopOnline, symbolContent) // mergeTag, '【合并标记,标记内容】'
const symbolTopOnline = degreesOnline(symbolTextArr, selectOp, 1);
const symbolTopDegreesOnline = disconnectEvents(symbolTextArr, selectOp, 'isBeforeAfter', 1);
const symbolContent = getTypeData('013', rowsData, false, allData.grParamBOS.beginDate); // symbolContent, '【标记内容】'
const mergeTag = setMergeTag(symbolTopOnline, symbolContent); // mergeTag, '【合并标记,标记内容】'
// 产后日数
infoData.postpartum = postpartumDays('031', typesData) // infoData, '产后日数'
infoData.postpartum = postpartumDays('031', typesData); // infoData, '产后日数'
// 写死的先
infoData.dateClosed = {
stopTime: true, // 控制结束日期
stopNumber: true // 控制住院天数
}
stopNumber: true, // 控制住院天数
};
// 折线
const brokenLineData = getBrokenLine(
'003',
@@ -202,22 +226,23 @@ export function getData(allData) {
symbolGoUp,
symbolTopDegreesOnline,
allData.grParamBOS.beginDate
)
);
// 模拟数据 体温
const datasetAnus = getTypeAnimalHeat('003', rowsData, '1', allData.grParamBOS.beginDate) // datasetAnus, '腋温【x】'
const bodyData = getTypeAnimalHeat('003', rowsData, '2', allData.grParamBOS.beginDate) // dbodyData, '口温'
const datasetAnus = getTypeAnimalHeat('003', rowsData, '1', allData.grParamBOS.beginDate); // datasetAnus, '腋温【x】'
const bodyData = getTypeAnimalHeat('003', rowsData, '2', allData.grParamBOS.beginDate); // dbodyData, '口温'
// const datasetHeartrate = getTypeAnimalHeat('003', rowsData)
const datasetHeartrate = getTypeAnimalHeat('003', rowsData, '3', allData.grParamBOS.beginDate) // datasetHeartrate, '肛温【红空圆】'
const earCool = getTypeAnimalHeat('003', rowsData, '4', allData.grParamBOS.beginDate) // earCool, '耳朵温'
const painScore = getHeartRate( // painScore, '疼痛'
const datasetHeartrate = getTypeAnimalHeat('003', rowsData, '3', allData.grParamBOS.beginDate); // datasetHeartrate, '肛温【红空圆】'
const earCool = getTypeAnimalHeat('003', rowsData, '4', allData.grParamBOS.beginDate); // earCool, '耳朵温'
const painScore = getHeartRate(
// painScore, '疼痛'
'016',
rowsData,
symbolDegreesOnline,
symbolTopDegreesOnline,
true,
allData.grParamBOS.beginDate
)
const allTemperatureData = [bodyData, datasetAnus, datasetHeartrate, earCool] // 所有的温度记录
);
const allTemperatureData = [bodyData, datasetAnus, datasetHeartrate, earCool]; // 所有的温度记录
// '脉搏【红实圆】'
const datasetPulse = getHeartRate(
'002',
@@ -226,7 +251,7 @@ export function getData(allData) {
symbolTopDegreesOnline,
true,
allData.grParamBOS.beginDate
)
);
// 心率【空心】
const datasetHeartRate = getHeartRate(
'014',
@@ -235,14 +260,14 @@ export function getData(allData) {
symbolTopDegreesOnline,
true,
allData.grParamBOS.beginDate
)
);
// const allTemperatureData = getDrawData('003', rowsData, '1', allData.grParamBOS.beginDate) // datasetAnus, '腋温【x】'
// const dataCool = getDrawCoolData('015', rowsData, true, allData.grParamBOS.beginDate) // dataCool, '【物理降温】'
const dataCool = getTypeData('015', rowsData, true, allData.grParamBOS.beginDate) // 【物理降温】
const dataCool = getTypeData('015', rowsData, true, allData.grParamBOS.beginDate); // 【物理降温】
// 呼吸【黑实圆】
const datasetPain = getTypeData('001', rowsData, false, allData.grParamBOS.beginDate)// 呼吸
const datasetPain = getTypeData('001', rowsData, false, allData.grParamBOS.beginDate); // 呼吸
const title = infoData.title
const title = infoData.title;
return {
title,
datasetHeartRate,
@@ -269,8 +294,8 @@ export function getData(allData) {
temArr,
surgeryArr,
minSurgeryArr,
surgeryNumDays
}
surgeryNumDays,
};
}
export function drawTopMask(svg, viewConfig) {
@@ -289,19 +314,17 @@ export function drawTopMask(svg, viewConfig) {
.attr('height', LINE_HEIGHT * (TOP_KEYS.length + 7.5) - 1)
.attr('stroke', viewConfig.stroke)
.attr('fill', '#fff')
.attr('style', 'stroke-width: 0')
.attr('style', 'stroke-width: 0');
drawTopVerticalLine(svg, viewConfig)
drawTopVerticalLine(svg, viewConfig);
}
export function drawTopVerticalLine(svg, viewConfig) {
// 补上下竖线
let start = viewConfig.step
const lineG = getG(svg, viewConfig)
.append('g')
.attr('class', 'maskline-top')
let start = viewConfig.step;
const lineG = getG(svg, viewConfig).append('g').attr('class', 'maskline-top');
while (start < viewConfig.contentWidth) {
// const isLastLine = (start + viewConfig.step) >= viewConfig.contentWidth
// const isLastLine = (start + viewConfig.step) >= viewConfig.contentWidth
lineG
.append('line')
.attr('fill', 'stroke')
@@ -311,13 +334,13 @@ export function drawTopVerticalLine(svg, viewConfig) {
.attr('x2', start)
.attr('stroke', start > viewConfig.step ? '#B22222' : viewConfig.stroke)
// .attr('stroke', isLastLine ? 'black' : (start > viewConfig.step ? '#B22222' : viewConfig.stroke))
.attr('stroke-width', 4) // 设置线条宽度为2
start = start + viewConfig.step
.attr('stroke-width', 4); // 设置线条宽度为2
start = start + viewConfig.step;
}
}
export function drawBottomMask(svg, viewConfig) {
const g = getG(svg, viewConfig)
const g = getG(svg, viewConfig);
// 遮罩层挡住超出的折线
g.append('rect')
.attr('class', 'mask-rect')
@@ -327,18 +350,16 @@ export function drawBottomMask(svg, viewConfig) {
.attr('height', LINE_HEIGHT * (BOTTOM_KEYS.length + 5))
.attr('stroke', viewConfig.stroke)
.attr('fill', '#ffffff')
.attr('style', 'stroke-width: 0')
drawBottomMaskLine(svg, viewConfig)
.attr('style', 'stroke-width: 0');
drawBottomMaskLine(svg, viewConfig);
}
function drawBottomMaskLine(svg, viewConfig) {
// 补上下竖线
let start = viewConfig.step
const lineG = getG(svg, viewConfig)
.append('g')
.attr('class', 'maskline')
let start = viewConfig.step;
const lineG = getG(svg, viewConfig).append('g').attr('class', 'maskline');
while (start < viewConfig.contentWidth) {
// const isLastLine = (start + viewConfig.step) >= viewConfig.contentWidth;
// const isLastLine = (start + viewConfig.step) >= viewConfig.contentWidth;
lineG
.append('line')
.attr('fill', 'stroke')
@@ -348,14 +369,14 @@ function drawBottomMaskLine(svg, viewConfig) {
.attr('x2', start)
.attr('stroke', start > viewConfig.step ? '#B22222' : viewConfig.stroke)
//.attr('stroke', isLastLine ? 'black' : (start > viewConfig.step ? '#B22222' : viewConfig.stroke))
.attr('stroke-width', 4) // 设置线条宽度为2
start = start + viewConfig.step
.attr('stroke-width', 4); // 设置线条宽度为2
start = start + viewConfig.step;
}
}
// 绘制特殊事件文字 --- 有时间
export function drawSpecialText(svg, viewConfig, textData) {
const g = getG(svg, viewConfig)
const g = getG(svg, viewConfig);
g.append('g')
.selectAll('text')
.data(textData)
@@ -363,43 +384,46 @@ export function drawSpecialText(svg, viewConfig, textData) {
.attr('style', 'font-size:14px; fill: red;')
.attr('class', 'mytext')
.html((d, i) => {
const t = (d?.value || '').split(',')
let time = ''
const t = (d?.value || '').split(',');
let time = '';
if (t.length > 1) {
time = t[0] + '于' + transNum(t[1].split(':')[0]) + '时' + transNum(t[1].split(':')[1]) + '分'
time =
t[0] + '于' + transNum(t[1].split(':')[0]) + '时' + transNum(t[1].split(':')[1]) + '分';
// time = t[0] + '㇑' + transNum(t[1].split(':')[0]) + '时' + transNum(t[1].split(':')[1]) + '分'
}
const texts = time.split('')
const texts = time.split('');
return texts
.map((text, i) => {
return `<tspan dx="${i === 1 ? -14 : i === 0 ? 0 : Number(text) ? -8 : -14}" dy="${20}">${text}</tspan>`
return `<tspan dx="${
i === 1 ? -14 : i === 0 ? 0 : Number(text) ? -8 : -14
}" dy="${20}">${text}</tspan>`;
})
.join('')
.join('');
})
.attr('x', (d, i) => {
return viewConfig.step + d.index * viewConfig.micoStep + textLeftMargin
return viewConfig.step + d.index * viewConfig.micoStep + textLeftMargin;
})
.attr('y', () => {
return viewConfig.topKeysPos - textLeftMargin
})
return viewConfig.topKeysPos - textLeftMargin;
});
}
// 绘制特殊事件文字 --- 大手术小手术
export function drawSurgery(svg, viewConfig, textData) {
const g = getG(svg, viewConfig)
const textDatas = []
const g = getG(svg, viewConfig);
const textDatas = [];
if (textData.length > 0) {
for (let j = 0; j < textData.length; j++) {
let item = {}
let item = {};
if (textData[j].value) {
item = {
index: textData[j].index,
value: textData[j].value.split(',')[0],
date: textData[j].date
}
date: textData[j].date,
};
} else {
item = textData[j]
item = textData[j];
}
textDatas.push(item)
textDatas.push(item);
}
}
g.append('g')
@@ -409,40 +433,39 @@ export function drawSurgery(svg, viewConfig, textData) {
.attr('style', 'font-size:15px; fill: red;')
.attr('class', 'mytext')
.html((d, i) => {
const texts = (d?.value || '').split('')
const texts = (d?.value || '').split('');
return texts
.map((text, i) => {
return `<tspan dx="${
i === 1 ? -15 : i === 0 ? 0 : Number(text) ? -8 : -15
}" dy="${20}">${text}</tspan>`
}" dy="${20}">${text}</tspan>`;
})
.join('')
.join('');
})
.attr('x', (d, i) => {
return viewConfig.step + d.index * viewConfig.micoStep + textLeftMargin - 2;
})
.attr(
'x',
(d, i) => { return viewConfig.step + d.index * viewConfig.micoStep + textLeftMargin - 2 }
)
.attr('y', () => {
return viewConfig.topKeysPos - textLeftMargin
})
return viewConfig.topKeysPos - textLeftMargin;
});
}
// 绘制特殊事件文字 --- 无时间
export function drawSpecialNoTimeText(svg, viewConfig, textData) {
const g = getG(svg, viewConfig)
const textDatas = []
const g = getG(svg, viewConfig);
const textDatas = [];
if (textData.length > 0) {
for (let j = 0; j < textData.length; j++) {
let item = {}
let item = {};
if (textData[j].value) {
item = {
index: textData[j].index,
value: textData[j].value.split(',')[0],
date: textData[j].date
}
date: textData[j].date,
};
} else {
item = textData[j]
item = textData[j];
}
textDatas.push(item)
textDatas.push(item);
}
}
g.append('g')
@@ -452,7 +475,7 @@ export function drawSpecialNoTimeText(svg, viewConfig, textData) {
.attr('style', 'font-size:15px; fill: red;')
.attr('class', 'mytext')
.html((d, i) => {
const texts = (d?.value || '').split('')
const texts = (d?.value || '').split('');
// let time = ''
// if (t.length > 1) {
// time = t[0] + '㇑' + transNum(t[1].split(':')[0]) + '时' + transNum(t[1].split(':')[1]) + '分'
@@ -460,39 +483,38 @@ export function drawSpecialNoTimeText(svg, viewConfig, textData) {
// const texts = time.split('')
return texts
.map((text, i) => {
return `<tspan dx="${
i === 1 ? -15 : i === 0 ? 0 : Number(text) ? -8 : -15
}" dy="${ i === 0 ? 20 : 80}">${text}</tspan>`
return `<tspan dx="${i === 1 ? -15 : i === 0 ? 0 : Number(text) ? -8 : -15}" dy="${
i === 0 ? 20 : 80
}">${text}</tspan>`;
})
.join('')
.join('');
})
.attr('x', (d, i) => {
return viewConfig.step + d.index * viewConfig.micoStep + textLeftMargin - 2;
})
.attr(
'x',
(d, i) => { return viewConfig.step + d.index * viewConfig.micoStep + textLeftMargin - 2 }
)
.attr('y', () => {
return viewConfig.topKeysPos - textLeftMargin
})
return viewConfig.topKeysPos - textLeftMargin;
});
}
// 数字转换成文字
function transNum(num) {
const arr1 = ['', '十']
const arr2 = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
const sw = num.split('')[0]
const gw = num.split('')[1]
const str1 = sw > 1 ? arr2[sw] + '十' : arr1[sw]
let strNum = str1 + arr2[gw]
const arr1 = ['', '十'];
const arr2 = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
const sw = num.split('')[0];
const gw = num.split('')[1];
const str1 = sw > 1 ? arr2[sw] + '十' : arr1[sw];
let strNum = str1 + arr2[gw];
// 若H为十点整小时则把零去掉若m为十分,则去掉零
if (strNum.indexOf('十') > 0 || strNum.indexOf('零') === 1) {
strNum = strNum.replace('零', '')
strNum = strNum.replace('零', '');
}
return strNum
return strNum;
}
// 绘制标签文字
export function drawTagText(svg, viewConfig, textData) {
const g = getG(svg, viewConfig)
const g = getG(svg, viewConfig);
g.append('g')
.selectAll('text')
.data(textData)
@@ -500,25 +522,24 @@ export function drawTagText(svg, viewConfig, textData) {
.attr('style', 'font-size:14px; fill: black;')
.attr('class', 'mytext')
.html((d, i) => {
const texts = (d?.value || '').split('')
const texts = (d?.value || '').split('');
return texts
.map((text, i) => {
return `<tspan dx="${i === 1 ? -14 : i === 0 ? 0 : Number(text) ? -8 : -14}" dy="${20}">${text}</tspan>`
return `<tspan dx="${
i === 1 ? -14 : i === 0 ? 0 : Number(text) ? -8 : -14
}" dy="${20}">${text}</tspan>`;
})
.join('')
.join('');
})
.attr(
'x',
(d, i) => viewConfig.step + d.index * viewConfig.micoStep + textLeftMargin
)
.attr('x', (d, i) => viewConfig.step + d.index * viewConfig.micoStep + textLeftMargin)
.attr('y', () => {
return viewConfig.topKeysPos - textLeftMargin + 198
})
return viewConfig.topKeysPos - textLeftMargin + 198;
});
}
// 绘制特殊事件文字底部
export function drawBottomSpecialText(svg, viewConfig, textData) {
const g = getG(svg, viewConfig)
const g = getG(svg, viewConfig);
g.append('g')
.selectAll('text')
.data(textData)
@@ -526,23 +547,20 @@ export function drawBottomSpecialText(svg, viewConfig, textData) {
.attr('style', 'font-size:14px; fill: blue;')
.attr('class', 'mytext')
.html((d, i) => {
const texts = (d?.value || '').split('')
const texts = (d?.value || '').split('');
return texts
.map((text, i) => {
return `<tspan dx="${
i === 1 ? -14 : i === 0 ? 0 : Number(text) ? -8 : -14
}" dy="${20}">${text}</tspan>`
}" dy="${20}">${text}</tspan>`;
})
.join('')
.join('');
})
.attr(
'x',
(d, i) => viewConfig.step + d.index * viewConfig.micoStep + textLeftMargin
)
.attr('x', (d, i) => viewConfig.step + d.index * viewConfig.micoStep + textLeftMargin)
.attr('y', (d) => {
const texts = (d?.value || '').split('')
return viewConfig.bottomKeysPosStart - texts.length * LINE_HEIGHT - 6 - 58
})
const texts = (d?.value || '').split('');
return viewConfig.bottomKeysPosStart - texts.length * LINE_HEIGHT - 6 - 58;
});
}
export function initArrow(svg) {
@@ -556,12 +574,9 @@ export function initArrow(svg) {
.attr('viewBox', '0 0 12 12')
.attr('refX', '6')
.attr('refY', '6')
.attr('orient', 'auto')
const arrowPath = 'M2,2 L10,6 L2,10 L6,6 L2,2'
arrowMarkerRed
.append('path')
.attr('d', arrowPath)
.attr('fill', 'red')
.attr('orient', 'auto');
const arrowPath = 'M2,2 L10,6 L2,10 L6,6 L2,2';
arrowMarkerRed.append('path').attr('d', arrowPath).attr('fill', 'red');
const arrowMarkerBlue = svg
.append('defs')
.append('marker')
@@ -572,16 +587,13 @@ export function initArrow(svg) {
.attr('viewBox', '0 0 12 12')
.attr('refX', '6')
.attr('refY', '6')
.attr('orient', 'auto')
arrowMarkerBlue
.append('path')
.attr('d', arrowPath)
.attr('fill', 'blue')
.attr('orient', 'auto');
arrowMarkerBlue.append('path').attr('d', arrowPath).attr('fill', 'blue');
}
export function lineArrow({ svg, viewConfig, scale, data } = {}) {
const g = getG(svg, viewConfig)
const vaildData = data.filter((item) => item)
const g = getG(svg, viewConfig);
const vaildData = data.filter((item) => item);
// {
// ...item,
// value: ismax ? maxDefault : minDefault,
@@ -595,96 +607,85 @@ export function lineArrow({ svg, viewConfig, scale, data } = {}) {
.data(vaildData)
.join('line')
.attr('x1', (d, i) => {
return scale(d.index) + +viewConfig.X_OFFSET
return scale(d.index) + +viewConfig.X_OFFSET;
})
.attr('y1', (d, i) => {
if (d.ismax) {
// 顶部箭头
return viewConfig.topKeysPos + symbolArrowHeight * 1.5
return viewConfig.topKeysPos + symbolArrowHeight * 1.5;
} else {
// 底部箭头
return viewConfig.bottomKeysPosStart - symbolArrowHeight * 1.5
return viewConfig.bottomKeysPosStart - symbolArrowHeight * 1.5;
}
})
.attr('x2', (d, i) => {
return scale(d.index) + +viewConfig.X_OFFSET
return scale(d.index) + +viewConfig.X_OFFSET;
})
.attr('y2', (d, i) => {
if (d.ismax) {
// 顶部箭头
return viewConfig.topKeysPos + symbolArrowHeight / 2
return viewConfig.topKeysPos + symbolArrowHeight / 2;
} else {
// 底部箭头
return viewConfig.bottomKeysPosStart - symbolArrowHeight / 2
return viewConfig.bottomKeysPosStart - symbolArrowHeight / 2;
}
})
.attr('stroke', (d) => {
return d.ismax ? 'red' : 'blue'
return d.ismax ? 'red' : 'blue';
})
.attr('stroke-width', 2)
.attr('marker-end', (d, i) => {
return d.ismax ? 'url(#redArrow)' : 'url(#blueArrow)'
})
return d.ismax ? 'url(#redArrow)' : 'url(#blueArrow)';
});
g.selectAll('text')
.data(vaildData)
.join('text')
.attr('class', 'desctextname')
.html((item, i) => {
const value = `${item.sourceValue}`.split('')
const dotIndex = value.indexOf('.')
const value = `${item.sourceValue}`.split('');
const dotIndex = value.indexOf('.');
return value
.map((d, index) => {
let y
let multiple = index
let addition = 0 // dot height
let y;
let multiple = index;
let addition = 0; // dot height
if (item.ismax) {
if (index >= dotIndex) {
addition = 8
multiple = index - 1
addition = 8;
multiple = index - 1;
}
y =
viewConfig.topKeysPos +
symbolArrowHeight * 1.5 +
(2 + multiple * 1.5) * viewConfig.X_OFFSET +
addition
addition;
} else {
if (index >= dotIndex) {
addition = 9
multiple = index - 1
addition = 9;
multiple = index - 1;
}
y =
viewConfig.bottomKeysPosStart -
(2 + (value.length - multiple) * 1.5) * viewConfig.X_OFFSET +
addition
addition;
}
return `
<tspan rotate="90" x="${scale(item.index) +
viewConfig.X_OFFSET -
4}"
y="${y}">${d}</tspan>`
<tspan rotate="90" x="${scale(item.index) + viewConfig.X_OFFSET - 4}"
y="${y}">${d}</tspan>`;
})
.join('')
.join('');
})
.attr('x', (item, i) => {
return scale(item.index) + viewConfig.X_OFFSET - 4
return scale(item.index) + viewConfig.X_OFFSET - 4;
})
.attr('y', item => {
.attr('y', (item) => {
if (item.ismax) {
return (
viewConfig.topKeysPos + symbolArrowHeight * 1.5 + LINE_HEIGHT / 2
)
return viewConfig.topKeysPos + symbolArrowHeight * 1.5 + LINE_HEIGHT / 2;
} else {
return (
viewConfig.bottomKeysPosStart -
symbolArrowHeight / 2 -
LINE_HEIGHT / 2
)
return viewConfig.bottomKeysPosStart - symbolArrowHeight / 2 - LINE_HEIGHT / 2;
}
})
.attr('style', item => {
return `font-size:14px;fill:${
item.ismax ? 'red' : 'blue'
};font-weight: bold;`
})
.attr('style', (item) => {
return `font-size:14px;fill:${item.ismax ? 'red' : 'blue'};font-weight: bold;`;
});
}

View File

@@ -5,14 +5,13 @@
* @LastEditors: 程堡
* @Description: 体温单
* @FilePath: src\action\nurseStation\temperatureSheet\index.js
*/
import Request from '@/axios/index.js'
const temperaturePath = 'app/temperature'
const getTemperaturePath = 'app/temperature/by-encounter-id'
const delTemperaturePath = 'app/temperature/retired'
*/
import Request from '@/axios/index.js';
const temperaturePath = 'app/temperature';
const getTemperaturePath = 'app/temperature/by-encounter-id';
const delTemperaturePath = 'app/temperature/retired';
// import data from '../temperatureSheet/datas.js';
export const API = {
/**
* @description 查询患者体温单
* @param encounterId
@@ -23,27 +22,24 @@ export const API = {
method: 'get', // 提交方法get
verification: true, // 是否统一拦截验证
untoken: false, // 是否不带token
params: { // 参数列表
id
}
})
params: {
// 参数列表
id,
},
});
},
/**
* @description 创建体温单
* @param encounterId
*/
createTemperature(encounterId,
hisNo,
clinicCode,
recordTime,
type,
content) {
createTemperature(encounterId, hisNo, clinicCode, recordTime, type, content) {
return Request({
url: temperaturePath,
method: 'post',
verification: true,
untoken: false,
data: { // 参数列表
data: {
// 参数列表
encounterId,
hisNo,
clinicCode,
@@ -52,28 +48,23 @@ export const API = {
operName: sessionStorage.getItem('userName'),
type,
content,
hospitalOrgId: sessionStorage.getItem('hospitalOrgId')
}
})
hospitalOrgId: sessionStorage.getItem('hospitalOrgId'),
},
});
},
/**
* @description 修改体温单
* @param encounterId
*/
updateTemperature(encounterId,
hisNo,
clinicCode,
recordTime,
type,
content,
id) {
updateTemperature(encounterId, hisNo, clinicCode, recordTime, type, content, id) {
return Request({
url: temperaturePath,
method: 'put',
verification: true,
untoken: false,
data: { // 参数列表
data: {
// 参数列表
encounterId,
hisNo,
clinicCode,
@@ -82,9 +73,9 @@ export const API = {
operName: sessionStorage.getItem('userName'),
type,
content,
id
}
})
id,
},
});
},
/**
* @description 删除记录
@@ -96,10 +87,11 @@ export const API = {
method: 'post',
verification: true,
untoken: false,
data: { // 参数列表
id
}
})
data: {
// 参数列表
id,
},
});
},
/**
* @description 获取患者时间线
@@ -107,24 +99,22 @@ export const API = {
*/
NewSheet(patientInfo) {
return {
grParamBOS:
{
age: patientInfo.age,
birth: 868723200000,
cwh: patientInfo.bedName,
cardNo: patientInfo.hisId,
hospDate: patientInfo.firstInBedTime.substring(0, 10),
inDate: patientInfo.firstInBedTime,
inDiagName: patientInfo.diag,
name: patientInfo.patientName,
deptName: patientInfo.deptName,
operaDays: null,
outdate: patientInfo.checkOutWardTime,
sex: patientInfo.gender.display
},
grParamBOS: {
age: patientInfo.age,
birth: 868723200000,
cwh: patientInfo.bedName,
cardNo: patientInfo.hisId,
hospDate: patientInfo.firstInBedTime.substring(0, 10),
inDate: patientInfo.firstInBedTime,
inDiagName: patientInfo.diag,
name: patientInfo.patientName,
deptName: patientInfo.deptName,
operaDays: null,
outdate: patientInfo.checkOutWardTime,
sex: patientInfo.gender.display,
},
rows: [],
types: []
}
}
}
types: [],
};
},
};

View File

@@ -1,264 +1,296 @@
// 医院名称
// export const HospitalName = '中国人民解放军联勤保障部队第九六四医院'
export const HospitalName = ''
export const HospitalName = '';
// 体温单名称
export const temperatureName = '体 温 单'
export const temperatureName = '体 温 单';
// 患者信息显示项目(修改显示顺序及是否显示)
export const INFO_KEYS = [
{
name: '姓名',
key: 'name',
order: 1,
show: true
show: true,
},
{
name: '科室',
key: 'deptName',
name: '性别',
key: 'sex',
order: 2,
show: true
show: true,
},
{
name: '年龄',
key: 'age',
order: 3,
show: true,
},
{
name: '病室',
key: 'deptName',
order: 4,
show: true,
},
{
name: '床号',
key: 'cwh',
order: 3,
show: true
},
{
name: '病人ID',
key: 'patientId',
order: 4,
show: true
},
{
name: '住院号',
key: 'hosNum',
order: 5,
show: true
show: true,
},
// {
// name: '入院日期',
// key: 'hospDate',
// order: 6,
// show: true
// }
]
{
name: '病历号',
key: 'hosNum',
order: 6,
show: true,
},
{
name: '入院日期',
key: 'hospDate',
order: 6,
show: false,
},
{
name: '诊断',
key: 'inDiagName',
order: 8,
show: false,
},
];
// 体温单录入项目(修改显示顺序及是否显示)
// 新增项目注意 key值、code值唯一性不要与之前的项目重复
export const BOTTOM_KEYS = [
{
name: '血\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0压',
name: '血mmHg',
code: 'bloodPressure',
key: '008',
times: 2,
order: 1,
show: true
show: true,
},
{
name: '大便次数',
name: '大\u00A0便\u00A0次\u00A0数',
code: 'poop',
key: '005',
order: 2,
show: true
show: true,
},
{
name: '体\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0重',
code: 'weight',
key: '009',
order: 3,
show: true
},
{
name: '尿\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0量',
name: '\u00A0便\u00A0\u00A0',
code: 'urine',
key: '004',
order: 4,
show: true
order: 3,
show: true,
},
{
name: '摄入液量',
name: '液体总入量ml',
code: 'input',
key: '006',
order: 5,
show: true
order: 4,
show: true,
},
{
name: '排出液量',
name: '其\u00A0\u00A0他ml',
code: 'output',
key: '007',
order: 6,
show: true
order: 5,
show: true,
},
{
name: '术后天数',
code: 'output',
key: '010',
name: '尿\u00A0\u00A0量ml',
code: 'urineOutput',
key: '011',
order: 6,
show: true,
},
{
name: '体\u00A0\u00A0重kg',
code: 'weight',
key: '009',
order: 8,
show: true,
},
{
name: '身\u00A0\u00A0高cm',
code: 'height',
key: '030',
order: 9,
show: true,
},
{
name: 'SPO2',
code: 'SPO2',
key: '021',
times: 2,
order: 10,
show: false,
},
{
name: '皮\u00A0试\u00A0阳\u00A0性',
code: 'allergy',
key: '017',
order: 11,
show: true,
lines: 2,
},
{
name: '过\u00A0敏\u00A0试\u00A0验',
code: 'allergyTest',
key: '020',
order: 12,
show: false,
lines: 2,
},
{
name: '其\u00A0\u00A0他',
code: 'other',
key: '025',
order: 7,
show: true
show: false,
lines: 2,
},
{
name: '',
code: 'useless1',
key: '100',
order: 20,
show: true
show: true,
},
{
name: '',
code: 'useless2',
key: '100',
order: 21,
show: true
},
{
name: '',
code: 'useless3',
key: '100',
order: 22,
show: true
},
{
name: '',
code: 'useless4',
key: '100',
order: 23,
show: true
},
{
name: '',
code: 'useless5',
key: '100',
order: 24,
show: true
},
{
name: '',
code: 'useless6',
key: '100',
order: 25,
show: true
}
]
];
// 是否显示疼痛评分
export const showPainFlag = true
export const showPainFlag = true;
/** *********** 以上信息是本地化可以修改的部分 **************************/
// 获取患者信息显示项目
export function getInfoKeys() {
return INFO_KEYS.filter(x => x.show).sort((a, b) => a.order - b.order)
return INFO_KEYS.filter((x) => x.show).sort((a, b) => a.order - b.order);
}
// 获取患者信息显示项目
export function getBottomKeys() {
return BOTTOM_KEYS.filter(x => x.show).sort((a, b) => a.order - b.order)
return BOTTOM_KEYS.filter((x) => x.show).sort((a, b) => a.order - b.order);
}
export const timeNumber = [2, 6, 10, 14, 18, 22] // 时间展示
export const nightTime = [2, 18, 22] // 夜间红色高亮时间
export const timeNumber = [2, 6, 10, 14, 18, 22]; // 时间展示
export const nightTime = [2, 18, 22]; // 夜间红色高亮时间
export const leftTEXT = [
['脉搏,(次/分),180', '160', '140', '120', '100', '80', '60', '40'],
['体温,(℃), 42', '41', '40', '39', '38', '37', '36', '35']
]
['体温,(℃), 42', '41', '40', '39', '38', '37', '36', '35'],
];
export const inOutItem = ['入观', '分娩', '手术', '转入', '出观', '死亡']
export const otherItem = ['外出', '请假', '拒测', '离院', '其他']
export const inOutItem = ['入观', '分娩', '手术', '转入', '出观', '死亡'];
export const otherItem = ['外出', '请假', '拒测', '离院', '其他'];
export const sheetOptions = {
locations: [{
code: '1',
display: '体温'
}, {
code: '2',
display: '口温'
}, {
code: '3',
display: '肛温'
}, {
code: '4',
display: '温'
}],
breath: [{
code: '',
display: '自主呼吸'
}, {
code: '®',
display: '机械通气'
}],
poop: [{
code: '',
display: '正常'
}, {
code: '',
display: '失禁'
}, {
code: '☆',
display: '人工肛门'
}, {
code: '/E',
display: '灌肠'
}],
pee: [{
code: '',
display: '正常'
}, {
code: '※',
display: '失禁'
}, {
code: 'C+',
display: '导尿'
}],
locations: [
{
code: '1',
display: '体温',
},
{
code: '2',
display: '口温',
},
{
code: '3',
display: '温',
},
{
code: '4',
display: '耳温',
},
],
breath: [
{
code: '',
display: '自主呼吸',
},
{
code: '®',
display: '机械通气',
},
],
poop: [
{
code: '',
display: '正常',
},
{
code: '',
display: '失禁',
},
{
code: '☆',
display: '人工肛门',
},
{
code: '/E',
display: '灌肠',
},
],
pee: [
{
code: '',
display: '正常',
},
{
code: '※',
display: '失禁',
},
{
code: 'C+',
display: '导尿',
},
],
heart: ['窦性心律', '起搏心律', '房性心律', '异常心律'],
weight: ['正常', '卧床', '轮椅', '平车']
}
weight: ['正常', '卧床', '轮椅', '平车'],
};
// 此处是显示数字的 要和leftTEXT保持一直
export const bodyTemperature = [34, 42]
export const starNumEnv = bodyTemperature[0] // 开始体温
export const endNumEnv = bodyTemperature[1] // 结束体温
export const heartRange = [20, 180]
export const bodyTemperature = [34, 42];
export const starNumEnv = bodyTemperature[0]; // 开始体温
export const endNumEnv = bodyTemperature[1]; // 结束体温
export const heartRange = [20, 180];
// 中间图表字段对应
export const CHART_KEYS = [
{
key: '001',
code: 'breath',
name: '呼吸'
name: '呼吸',
},
{
key: '002',
code: 'sphygmus',
name: '脉搏'
name: '脉搏',
},
{
key: '003',
code: 'temperature',
name: '不升'
name: '不升',
},
{
key: '012',
code: 'inOut',
name: '特殊标记'
name: '特殊标记',
},
{
key: '013',
code: 'refuse',
name: '标记内容'
name: '标记内容',
},
{
key: '014',
code: 'heartRate',
name: '心率'
name: '心率',
},
{
key: '015',
code: 'lowerTemp',
name: '物理降温'
name: '物理降温',
},
{
key: '016',
code: 'painScore',
name: '疼痛评分'
}
]
name: '疼痛评分',
},
];
export const HEAD_HEIGHT = 120 // 头部文字预留位置
export const LINE_HEIGHT = 20 // 一行的行高
export const textLeftMargin = 4 // 文字左边边距
export const TEXT_MARGIN_BOTTOM = 6 // 文字向上偏移量
export const symbolArrowHeight = 20
export const HEAD_HEIGHT = 120; // 头部文字预留位置
export const LINE_HEIGHT = 20; // 一行的行高
export const textLeftMargin = 4; // 文字左边边距
export const TEXT_MARGIN_BOTTOM = 6; // 文字向上偏移量
export const symbolArrowHeight = 20;

View File

@@ -1,9 +1,7 @@
import moment from 'moment'
import moment from 'moment';
export function getG(svg, translateX, translateY) {
return svg
.append('g')
.attr('transform', `translate(${translateX},${translateY})`)
return svg.append('g').attr('transform', `translate(${translateX},${translateY})`);
}
// function generatePointer ({ pathData, type, yScaleInstance }) {
@@ -51,247 +49,259 @@ export function getG(svg, translateX, translateY) {
// }
// }
export function getTypeDatas(typeData, beginDate) {
const types = typeData.sort((a, b) => new Date(a.date) - new Date(b.date))
return types.map(item => {
const types = typeData.sort((a, b) => new Date(a.date) - new Date(b.date));
return types.map((item) => {
return {
index: getIndex(beginDate, item.date, '00:00:00') / 6,
times: 0,
date: item.date,
typeCode: item.typeCode,
typeValue: (item.typeValue) || null
}
})
typeValue: item.typeValue || null,
};
});
}
export function getTypeData(type, allData = [], isNumber = true, beginDate) {
const getList = allData
.map((rowBOSItem, index) => {
const rowBOS = rowBOSItem.rowBOS
const rowBOS = rowBOSItem.rowBOS;
const cur =
rowBOS.find((item) => {
return item.typeCode === type
}) || {}
return item.typeCode === type;
}) || {};
return {
index: getIndex(beginDate, cur.date, cur.times),
date: cur.date,
value: (isNumber ? +cur.typeValue : cur.typeValue) || null
}
value: (isNumber ? +cur.typeValue : cur.typeValue) || null,
};
})
.map((item) => {
if (item.value) {
// item.value = NaN
}
return item
})
return getList.sort((a, b) => a.index - b.index)
return item;
});
return getList.sort((a, b) => a.index - b.index);
}
// 获取不升
export function getType(type, allData = [], beginDate) {
const getList = allData
.map((rowBOSItem, index) => {
const rowBOS = rowBOSItem.rowBOS
const rowBOS = rowBOSItem.rowBOS;
const cur =
rowBOS.find((item) => {
return item.typeCode === type
}) || {}
return item.typeCode === type;
}) || {};
return {
index: getIndex(beginDate, cur.date, cur.times),
date: cur.date,
value: cur.typeValue !== '' ? (parseFloat(cur.typeValue) <= 35 ? '不升' : null) : null
}
value: cur.typeValue !== '' ? (parseFloat(cur.typeValue) <= 35 ? '不升' : null) : null,
};
})
.map((item) => {
if (item.value) {
// item.value = NaN
}
return item
})
return getList.sort((a, b) => a.index - b.index)
return item;
});
return getList.sort((a, b) => a.index - b.index);
}
// 合并标记内容
export function setMergeTag(ymbolTextArr = [], symbolContent = []) {
const arr = []
ymbolTextArr.forEach(item => {
symbolContent.forEach(res => {
const arr = [];
ymbolTextArr.forEach((item) => {
symbolContent.forEach((res) => {
if (item.index === res.index) {
arr.push({ ...item, ...res, value: (item.value !== null ? item.value : '') + (res.value !== null ? res.value : '') })
arr.push({
...item,
...res,
value: (item.value !== null ? item.value : '') + (res.value !== null ? res.value : ''),
});
}
})
})
return arr
});
});
return arr;
}
// 筛选手术产后日数
export function postpartumDays(type, arr) {
return arr.filter(item => item.typeCode === type).map(i => i.typeValue)
return arr.filter((item) => item.typeCode === type).map((i) => i.typeValue);
}
// 筛选体温
export function getTypeAnimalHeat(type, allData = [], code, beginDate) {
const getList = allData
.map((rowBOSItem, index) => {
console.log(rowBOSItem.rowBOS, 'rowBOSItem.rowBOS')
const rowBOS = rowBOSItem.rowBOS
const curList = // 改为 filter 来获取所有符合条件的项
rowBOS.filter((item) => {
return item.typeCode === type
}) || []
// 针对每个 cur 处理并生成新的对象数组
return curList.map((cur) => ({
const rowBOS = rowBOSItem.rowBOS;
const cur =
rowBOS.find((item) => {
return item.typeCode === type;
}) || {};
return {
index: getIndex(beginDate, cur.date, cur.times),
date: cur.date,
value: (+cur.collectionMode === +code ? +cur.typeValue : null) || null
}))
value: (+cur.collectionMode === +code ? +cur.typeValue : null) || null,
};
})
.flat() // 将二维数组展平为一维数组
.map((item) => {
if (item.value) {
// item.value = NaN
}
return item
})
console.log(getList, 'getList')
return getList.sort((a, b) => a.index - b.index)
return item;
});
return getList.sort((a, b) => a.index - b.index);
}
// 设置折线
export function getBrokenLine(type, allData = [], arr = [], list = [], topList = [], beginDate) {
const result = []
const result = [];
const getList = allData
.map((rowBOSItem, index) => {
const rowBOS = rowBOSItem.rowBOS
const rowBOS = rowBOSItem.rowBOS;
const cur =
rowBOS.find((item) => {
return item.typeCode === type
}) || {}
rowBOS.find((item) => {
return item.typeCode === type;
}) || {};
return {
index: getIndex(beginDate, cur.date, cur.times),
date: cur.date,
value: +cur.typeValue
}
value: +cur.typeValue,
};
})
.map((item) => {
if (item.value) {
// item.value = NaN
}
return item
})
const _a = arr.filter(item => item.value)
const _b = list.filter(item => item.value)
const _c = topList.filter(item => item.value)
const mergingData = [..._a, ..._b, ..._c, { index: 50 }].sort((a, b) => a.index - b.index)
let start = 0
mergingData.forEach(item => {
const _p = getList.sort((a, b) => a.index - b.index).slice(start, item.index)
start = item.index + 1
result.push(_p)
})
return result
return item;
});
const _a = arr.filter((item) => item.value);
const _b = list.filter((item) => item.value);
const _c = topList.filter((item) => item.value);
const mergingData = [..._a, ..._b, ..._c, { index: 50 }].sort((a, b) => a.index - b.index);
let start = 0;
mergingData.forEach((item) => {
const _p = getList.sort((a, b) => a.index - b.index).slice(start, item.index);
start = item.index + 1;
result.push(_p);
});
return result;
}
// 处理脉搏心率
export function getHeartRate(type, allData = [], arr = [], topList = [], isNumber = true, beginDate) {
const result = []
export function getHeartRate(
type,
allData = [],
arr = [],
topList = [],
isNumber = true,
beginDate
) {
const result = [];
const getList = allData
.map((rowBOSItem, index) => {
const rowBOS = rowBOSItem.rowBOS
const rowBOS = rowBOSItem.rowBOS;
const cur =
rowBOS.find((item) => {
return item.typeCode === type
}) || {}
rowBOS.find((item) => {
return item.typeCode === type;
}) || {};
return {
index: getIndex(beginDate, cur.date, cur.times),
date: cur.date,
value: (isNumber ? +cur.typeValue : cur.typeValue) || null
}
value: (isNumber ? +cur.typeValue : cur.typeValue) || null,
};
})
.map((item) => {
if (item.value) {
// item.value = NaN
}
return item
})
const _a = arr.filter(item => item.value)
const _c = topList.filter(item => item.value)
const mergingData = [..._a, ..._c, { index: 50 }].sort((a, b) => a.index - b.index)
let start = 0
mergingData.forEach(item => {
const _p = getList.slice(start, item.index).sort((a, b) => { return a.index - b.index })
start = item.index
result.push(_p)
})
return result
return item;
});
const _a = arr.filter((item) => item.value);
const _c = topList.filter((item) => item.value);
const mergingData = [..._a, ..._c, { index: 50 }].sort((a, b) => a.index - b.index);
let start = 0;
mergingData.forEach((item) => {
const _p = getList.slice(start, item.index).sort((a, b) => {
return a.index - b.index;
});
start = item.index;
result.push(_p);
});
return result;
}
function getIndex(beginDate, date, time) {
if (beginDate === undefined || date === undefined) return
const diffTime = moment(date.substring(0, 10)).diff(moment(beginDate.substring(0, 10))) / 1000 / 3600 / 24
const diffIndex = parseInt(time.substring(0, 2))
return diffTime * 6 + Math.floor(diffIndex / 4)
if (beginDate === undefined || date === undefined) return;
const diffTime =
moment(date.substring(0, 10)).diff(moment(beginDate.substring(0, 10))) / 1000 / 3600 / 24;
const diffIndex = parseInt(time.substring(0, 2));
return diffTime * 6 + Math.floor(diffIndex / 4);
}
// 筛选35和40~42数据
export function degreesOnline(allData, data, type) {
const arr = allData.map((item, index) => {
const cur = data?.find(res => item.value === res.name && +res.isShowPlace === type) || null
const cur = data?.find((res) => item.value === res.name && +res.isShowPlace === type) || null;
return {
index: index,
date: item.date,
value: cur?.name || null
}
})
return arr
value: cur?.name || null,
};
});
return arr;
}
// 35或42上断开的事件
export function disconnectEvents(allData, data, code, type) {
const arr = allData.map((item, index) => {
const cur = data?.find(res => item.value === res.name && +res.isShowPlace === type && +res[code] === 1) || null
const cur =
data?.find(
(res) => item.value === res.name && +res.isShowPlace === type && +res[code] === 1
) || null;
return {
index: index,
date: item.date,
value: cur?.name || null
}
})
return arr
value: cur?.name || null,
};
});
return arr;
}
export function getDrawCoolData(type, allData = [], isNumber = true, beginDate) {
const getList = allData
.map((rowBOSItem, index) => {
const rowBOS = rowBOSItem.rowBOS
const rowBOS = rowBOSItem.rowBOS;
const cur =
rowBOS.find((item) => {
return item.typeCode === type
}) || {}
return item.typeCode === type;
}) || {};
return {
index: getIndex(beginDate, cur.date, cur.times),
date: cur.date + cur.times,
value: (isNumber ? +cur.typeValue : cur.typeValue) || null
}
value: (isNumber ? +cur.typeValue : cur.typeValue) || null,
};
})
.map((item) => {
if (item.value) {
// item.value = NaN
}
return item
})
return getList.sort((a, b) => a.index - b.index)
return item;
});
return getList.sort((a, b) => a.index - b.index);
}
// 筛选降温getDrawData
export function getDrawData(type, allData = [], code, beginDate) {
const getList = allData
.map((rowBOSItem, index) => {
const rowBOS = rowBOSItem.rowBOS
const rowBOS = rowBOSItem.rowBOS;
const cur =
rowBOS.find((item) => {
return item.typeCode === type
}) || {}
return item.typeCode === type;
}) || {};
return {
index: getIndex(beginDate, cur.date, cur.times),
date: cur.date + cur.times,
value: (+cur.collectionMode === +code ? +cur.typeValue : null) || null
}
value: (+cur.collectionMode === +code ? +cur.typeValue : null) || null,
};
})
.map((item) => {
if (item.value) {
// item.value = NaN
}
return item
})
return getList.sort((a, b) => a.index - b.index)
return item;
});
return getList.sort((a, b) => a.index - b.index);
}

View File

@@ -45,22 +45,45 @@ export function getSupplierList(data) {
})
}
/**
* 获取项目定价方式,批次售价/统一售价
*/
export function getAdjustPriceSwitchState(params) {
return request({
url: '/change/price/getAdjustPriceSwitchState',
method: 'get',
params: params
})
}
/**
* 批次号匹配
*/
export function lotNumberMatch(params) {
return request({
url: '/app-common/lot-number-match',
method: 'get',
params: params
})
}
import axios from 'axios';
const env = import.meta.env.MODE;
export function invokeYbPlugin(data) {
if(env == 'development'){
return axios.create(
{
// axios中请求配置有baseURL选项表示请求URL公共部分
baseURL: '/ybplugin',//ybplugin
// 超时
timeout: 60000
}
).post('/api/data/', data);
// if(env == 'development'){
// return axios.create(
// {
// // axios中请求配置有baseURL选项表示请求URL公共部分
// baseURL: '/ybplugin',//ybplugin
// // 超时
// timeout: 60000
// }
// ).post('/api/data/', data);
} else {
// } else {
return axios.create(
{
// axios中请求配置有baseURL选项表示请求URL公共部分
@@ -70,4 +93,4 @@ if(env == 'development'){
}
).post('http://localhost:5000/api/data/', data);
}
}
// }

View File

@@ -212,4 +212,4 @@ aside {
display: flex;
align-items: center;
width: 100%;
}
}

View File

@@ -2,7 +2,7 @@
<div class="recordBill">
<div :id="'exeSheetTitle' + printData.id" class="printView_header">
<div style="text-align: center; height: 60px">
呼和浩特市第一医院医嘱执行单
长春市朝阳区中医院医嘱执行单
</div>
<div>
<span style="display: inline-block; width: 100px">床号{{ printData.patientInfo.encounterLocationName }}</span>

View File

@@ -2,7 +2,7 @@
<div class="recordBill">
<div id="div1" class="printView_header">
<div style="text-align: center; font-size: 20px; height: 40px">
呼和浩特市第一医院输液执行单
长春市朝阳区中医院输液执行单
</div>
<div>
<span>座位{{ printData.patientInfo.encounterLocationName }}</span>

View File

@@ -1,6 +1,6 @@
<template>
<div class="printTicket">
<p>xx人民医院</p>
<p>长春市朝阳区中医院</p>
<div>
<span>姓名</span>
<span>{{ printData.patientName }}</span>
@@ -21,11 +21,11 @@
<span>分诊时间</span>
<span>{{ printData.triageTime }}</span>
</div>
<img ref="refQr" style="position: absolute; top: 10px; left: 100px">
<img ref="refQr" style="position: absolute; top: 10px; left: 100px" />
</div>
</template>
<script>
import JsBarcode from 'jsbarcode'
import JsBarcode from 'jsbarcode';
export default {
name: 'TriageTicket',
props: {
@@ -37,41 +37,33 @@ export default {
dept: '',
triageLevel: '',
triageTime: '',
hisId: ''
}
}
}
hisId: '',
};
},
},
},
data() {
return {
}
return {};
},
updated() {
JsBarcode(this.$refs.refQr,
this.printData.hisId,
{
format: 'CODE128',
lineColor: '#000',
background: '#fff',
displayValue: false,
height: 30,
margin: 2
})
JsBarcode(this.$refs.refQr, this.printData.hisId, {
format: 'CODE128',
lineColor: '#000',
background: '#fff',
displayValue: false,
height: 30,
margin: 2,
});
},
mounted() {
},
methods: {
}
}
mounted() {},
methods: {},
};
</script>
<style>
.printTicket{
display: block;
width: 300px;
height: 200px;
border: 1px solid #A3A3A3;
}
.printTicket {
display: block;
width: 300px;
height: 200px;
border: 1px solid #a3a3a3;
}
</style>

View File

@@ -0,0 +1,338 @@
{
"panels": [
{
"index": 0,
"name": 1,
"paperType": "自定义",
"height": 80,
"width": 279,
"paperList": {
"type": "自定义",
"width": 279,
"height": 80
},
"panelPageRule": "none",
"paperHeader": 0,
"paperFooter": 422.3622047244095,
"paperNumberDisabled": true,
"paperNumberContinue": true,
"panelAngle": 0,
"overPrintOptions": {
"content": "",
"opacity": 0.7,
"type": 1
},
"watermarkOptions": {
"content": "",
"fillStyle": "rgba(87, 13, 248, 0.5)",
"fontSize": "36px",
"rotate": 25,
"width": 413,
"height": 310,
"timestamp": true,
"format": "YYYY-MM-DD HH:mm"
},
"panelLayoutOptions": {
"layoutType": "column",
"layoutRowGap": 0,
"layoutColumnGap": 0
},
"printElements": [
{
"options": {
"left": 0,
"top": 15,
"height": 16.5,
"width": 792,
"title": "长春市朝阳区中医院预交金收据",
"coordinateSync": false,
"widthHeightSync": false,
"fontWeight": "bold",
"letterSpacing": 0.75,
"textAlign": "center",
"qrCodeLevel": 0,
"fontSize": 15,
"fontFamily": "Microsoft YaHei"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 111,
"top": 46.5,
"height": 14,
"width": 151.5,
"title": "姓名",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"field": "patientName",
"fontFamily": "Microsoft YaHei"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 295.5,
"top": 48,
"height": 14,
"width": 148.5,
"title": "住院号",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"field": "encounterNosd",
"fontFamily": "Microsoft YaHei"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 480,
"top": 48,
"height": 14,
"width": 162,
"title": "科室",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"field": "inHospitalOrgName",
"fontFamily": "Microsoft YaHei"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 111,
"top": 73.5,
"height": 14,
"width": 153,
"title": "ID号",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"field": "patientId",
"fontFamily": "Microsoft YaHei"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 295.5,
"top": 73.5,
"height": 14,
"width": 147,
"title": "医保类别",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"field": "contractName",
"fontFamily": "Microsoft YaHei"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 480,
"top": 73.5,
"height": 14,
"width": 163.5,
"title": "时间",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"field": "currentTime",
"fontFamily": "Microsoft YaHei"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 111,
"top": 105,
"height": 25,
"width": 120,
"title": "金额",
"coordinateSync": false,
"widthHeightSync": false,
"textAlign": "center",
"textContentVerticalAlign": "middle",
"borderLeft": "solid",
"borderTop": "solid",
"borderRight": "solid",
"borderBottom": "solid",
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 231,
"top": 105,
"height": 25,
"width": 393,
"title": "金额",
"coordinateSync": false,
"widthHeightSync": false,
"textAlign": "center",
"textContentVerticalAlign": "middle",
"borderTop": "solid",
"borderRight": "solid",
"borderBottom": "solid",
"qrCodeLevel": 0,
"field": "balanceAmount",
"hideTitle": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 111,
"top": 129,
"height": 30,
"width": 120,
"title": "人民币(大写)",
"coordinateSync": false,
"widthHeightSync": false,
"textAlign": "center",
"textContentVerticalAlign": "middle",
"borderLeft": "solid",
"borderTop": "solid",
"borderRight": "solid",
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 231,
"top": 129,
"height": 30,
"width": 393,
"title": "金额",
"coordinateSync": false,
"widthHeightSync": false,
"textAlign": "center",
"textContentVerticalAlign": "middle",
"borderTop": "solid",
"borderRight": "solid",
"qrCodeLevel": 0,
"field": "amountInWords",
"hideTitle": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 111,
"top": 159,
"height": 30,
"width": 513,
"title": " ",
"coordinateSync": false,
"widthHeightSync": false,
"textAlign": "center",
"textContentVerticalAlign": "middle",
"borderLeft": "solid",
"borderRight": "solid",
"borderBottom": "solid",
"qrCodeLevel": 0,
"field": "paymentDetails",
"hideTitle": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 111,
"top": 198,
"height": 14,
"width": 120,
"title": "签章",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"field": "patientNamesfs",
"fontFamily": "Microsoft YaHei"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 297,
"top": 198,
"height": 14,
"width": 132,
"title": "交款人",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"field": "patientNameada",
"fontFamily": "Microsoft YaHei"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 481.5,
"top": 198,
"height": 14,
"width": 124.5,
"title": "收款人",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"field": "cashier",
"fontFamily": "Microsoft YaHei"
},
"printElementType": {
"title": "文本",
"type": "text"
}
}
]
}
]
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,454 @@
{
"panels": [
{
"index": 1,
"name": 3,
"paperType": "A5",
"height": 210,
"width": 148,
"paperList": {
"type": "A5",
"width": 148,
"height": 210
},
"paperHeader": 0,
"paperFooter": 592.4409448818898,
"orient": 1,
"paperNumberDisabled": true,
"paperNumberContinue": true,
"panelAngle": 0,
"overPrintOptions": {
"content": "",
"opacity": 0.01,
"type": 1
},
"watermarkOptions": {
"content": "",
"fillStyle": "rgba(87, 13, 248, 0.5)",
"fontSize": "10px",
"rotate": 25,
"width": 100,
"height": 100,
"timestamp": false,
"format": "YYYY-MM-DD HH:mm"
},
"panelLayoutOptions": {
"layoutType": "column",
"layoutRowGap": 0,
"layoutColumnGap": 0
},
"printElements": [
{
"options": {
"left": 0,
"top": 22.5,
"height": 19.5,
"width": 420,
"title": "长春市朝阳区中医院",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 20.25,
"qrCodeLevel": 0,
"textAlign": "center",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 0,
"top": 50,
"height": 20,
"width": 420,
"title": "处置单",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 13.5,
"textAlign": "center",
"qrCodeLevel": 0,
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 154.5,
"top": 75,
"height": 13.5,
"width": 100,
"title": "性别",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "genderEnum_enumText",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 288,
"top": 75,
"height": 13.5,
"width": 99,
"title": "年龄",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "age",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 76.5,
"height": 13.5,
"width": 100,
"title": "姓名",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "patientName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 288,
"top": 100.5,
"height": 13.5,
"width": 99,
"title": "开单医生",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "doctorName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 27,
"top": 102,
"height": 13.5,
"width": 99,
"title": "科室",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "departmentName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 154.5,
"top": 102,
"height": 13.5,
"width": 120,
"title": "费用性质",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "contractName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 130.5,
"height": 13.5,
"width": 174,
"title": "门诊号",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "encounterNo",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 222,
"top": 130.5,
"height": 13.5,
"width": 165,
"title": "日期",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "reqTime",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 156,
"height": 9,
"width": 400,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 28,
"top": 166.5,
"height": 9.75,
"width": 120,
"title": "Rp",
"coordinateSync": false,
"widthHeightSync": false,
"fixed": true,
"fontSize": 18,
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 15,
"top": 190.5,
"height": 36,
"width": 390,
"title": "undefined+beforeDragIn",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"textAlign": "center",
"tableBorder": "border",
"tableHeaderFontWeight": "500",
"field": "prescriptionList",
"columns": [
[
{
"title": "项目名",
"width": 116.47241770689429,
"field": "itemName",
"checked": true,
"columnId": "itemName",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "单价",
"width": 95.6749835266735,
"field": "unitPrice",
"checked": true,
"columnId": "unitPrice",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "数量",
"width": 87.60415049837947,
"field": "quantity",
"checked": true,
"columnId": "quantity",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "执行次数",
"width": 90.24844826805275,
"field": "quantity",
"checked": true,
"columnId": "quantity",
"fixed": false,
"rowspan": 1,
"colspan": 1
}
]
]
},
"printElementType": {
"title": "表格",
"type": "table",
"editable": true,
"columnDisplayEditable": true,
"columnDisplayIndexEditable": true,
"columnTitleEditable": true,
"columnResizable": true,
"columnAlignEditable": true,
"isEnableEditField": true,
"isEnableContextMenu": true,
"isEnableInsertRow": true,
"isEnableDeleteRow": true,
"isEnableInsertColumn": true,
"isEnableDeleteColumn": true,
"isEnableMergeCell": true
}
},
{
"options": {
"left": 10.5,
"top": 508.5,
"height": 13.5,
"width": 100,
"title": "医师",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "doctorName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 111,
"top": 509.0000066757202,
"height": 13.5,
"width": 100,
"title": "发药:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 214.5,
"top": 509.0000066757202,
"height": 13.5,
"width": 100,
"title": "划价:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 319,
"top": 509.0000066757202,
"height": 13.5,
"width": 100,
"title": "调配:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 532.5,
"height": 9,
"width": 400,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false,
"fixed": true
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 289,
"top": 551.5,
"height": 13.5,
"width": 120,
"title": "金额",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "medTotalAmount",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
}
],
"paperNumberLeft": 236,
"paperNumberTop": 573
}
]
}

View File

@@ -0,0 +1,454 @@
{
"panels": [
{
"index": 1,
"name": 3,
"paperType": "A5",
"height": 210,
"width": 148,
"paperList": {
"type": "A5",
"width": 148,
"height": 210
},
"paperHeader": 0,
"paperFooter": 592.4409448818898,
"orient": 1,
"paperNumberDisabled": true,
"paperNumberContinue": true,
"panelAngle": 0,
"overPrintOptions": {
"content": "",
"opacity": 0.01,
"type": 1
},
"watermarkOptions": {
"content": "",
"fillStyle": "rgba(87, 13, 248, 0.5)",
"fontSize": "10px",
"rotate": 25,
"width": 100,
"height": 100,
"timestamp": false,
"format": "YYYY-MM-DD HH:mm"
},
"panelLayoutOptions": {
"layoutType": "column",
"layoutRowGap": 0,
"layoutColumnGap": 0
},
"printElements": [
{
"options": {
"left": 0,
"top": 22.5,
"height": 19.5,
"width": 420,
"title": "长春市红旗中医院",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 20.25,
"qrCodeLevel": 0,
"textAlign": "center",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 0,
"top": 50,
"height": 20,
"width": 420,
"title": "处置单",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 13.5,
"textAlign": "center",
"qrCodeLevel": 0,
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 154.5,
"top": 75,
"height": 13.5,
"width": 100,
"title": "性别",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "genderEnum_enumText",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 288,
"top": 75,
"height": 13.5,
"width": 99,
"title": "年龄",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "age",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 76.5,
"height": 13.5,
"width": 100,
"title": "姓名",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "patientName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 288,
"top": 100.5,
"height": 13.5,
"width": 99,
"title": "开单医生",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "doctorName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 27,
"top": 102,
"height": 13.5,
"width": 99,
"title": "科室",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "departmentName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 154.5,
"top": 102,
"height": 13.5,
"width": 120,
"title": "费用性质",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "contractName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 130.5,
"height": 13.5,
"width": 174,
"title": "门诊号",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "encounterNo",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 222,
"top": 130.5,
"height": 13.5,
"width": 165,
"title": "日期",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "reqTime",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 156,
"height": 9,
"width": 400,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 28,
"top": 166.5,
"height": 9.75,
"width": 120,
"title": "Rp",
"coordinateSync": false,
"widthHeightSync": false,
"fixed": true,
"fontSize": 18,
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 15,
"top": 190.5,
"height": 36,
"width": 390,
"title": "undefined+beforeDragIn",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"textAlign": "center",
"tableBorder": "border",
"tableHeaderFontWeight": "500",
"field": "prescriptionList",
"columns": [
[
{
"title": "项目名",
"width": 116.47241770689429,
"field": "itemName",
"checked": true,
"columnId": "itemName",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "单价",
"width": 95.6749835266735,
"field": "unitPrice",
"checked": true,
"columnId": "unitPrice",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "数量",
"width": 87.60415049837947,
"field": "quantity",
"checked": true,
"columnId": "quantity",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "执行次数",
"width": 90.24844826805275,
"field": "quantity",
"checked": true,
"columnId": "quantity",
"fixed": false,
"rowspan": 1,
"colspan": 1
}
]
]
},
"printElementType": {
"title": "表格",
"type": "table",
"editable": true,
"columnDisplayEditable": true,
"columnDisplayIndexEditable": true,
"columnTitleEditable": true,
"columnResizable": true,
"columnAlignEditable": true,
"isEnableEditField": true,
"isEnableContextMenu": true,
"isEnableInsertRow": true,
"isEnableDeleteRow": true,
"isEnableInsertColumn": true,
"isEnableDeleteColumn": true,
"isEnableMergeCell": true
}
},
{
"options": {
"left": 10.5,
"top": 508.5,
"height": 13.5,
"width": 100,
"title": "医师",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "doctorName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 111,
"top": 509.0000066757202,
"height": 13.5,
"width": 100,
"title": "发药:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 214.5,
"top": 509.0000066757202,
"height": 13.5,
"width": 100,
"title": "划价:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 319,
"top": 509.0000066757202,
"height": 13.5,
"width": 100,
"title": "调配:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 532.5,
"height": 9,
"width": 400,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false,
"fixed": true
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 289,
"top": 551.5,
"height": 13.5,
"width": 120,
"title": "金额",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "medTotalAmount",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
}
],
"paperNumberLeft": 236,
"paperNumberTop": 573
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,701 @@
{
"panels": [
{
"index": 1,
"name": 3,
"paperType": "A4",
"height": 297,
"width": 210,
"paperList": {
"type": "自定义",
"width": 80,
"height": 60
},
"paperHeader": 166.5,
"paperFooter": 760.5,
"paperNumberDisabled": true,
"paperNumberContinue": true,
"expandCss": "",
"panelAngle": 0,
"overPrintOptions": {
"content": "",
"opacity": 0.7,
"type": 1
},
"watermarkOptions": {
"content": "",
"fillStyle": "rgba(87, 13, 248, 0.5)",
"fontSize": "36px",
"rotate": 25,
"width": 413,
"height": 310,
"timestamp": true,
"format": "YYYY-MM-DD HH:mm"
},
"panelLayoutOptions": {
"layoutType": "column",
"layoutRowGap": 0,
"layoutColumnGap": 0
},
"printElements": [
{
"options": {
"left": 0,
"top": 22.5,
"height": 19.5,
"width": 595.5,
"title": "长春市朝阳区中医院",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 20.25,
"qrCodeLevel": 0,
"textAlign": "center"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 0,
"top": 54.5,
"height": 20,
"width": 595.5,
"title": "门诊病历",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 13.5,
"textAlign": "center",
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 235.5,
"top": 81,
"height": 13.5,
"width": 100,
"title": "性别",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "genderEnum_enumText"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 429,
"top": 81,
"height": 13.5,
"width": 160.5,
"title": "年龄",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "age"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 24,
"top": 82.5,
"height": 13.5,
"width": 100,
"title": "姓名",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "patientName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 24,
"top": 108,
"height": 13.5,
"width": 190.5,
"title": "电话",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "phone"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 235.5,
"top": 108,
"height": 13.5,
"width": 175.5,
"title": "医保类型",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "contractName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 429,
"top": 108,
"height": 13.5,
"width": 162,
"title": "病历号",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "busNo"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 24,
"top": 132,
"height": 13.5,
"width": 200,
"title": "就诊日期",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "onsetDate"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 235.5,
"top": 132,
"height": 13.5,
"width": 175.5,
"title": "就诊科室",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "doctorName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 429,
"top": 132,
"height": 13.5,
"width": 162,
"title": "接诊医生",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "doctorName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 163.5,
"height": 9,
"width": 576,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 25.5,
"top": 171,
"height": 13.5,
"width": 50,
"title": "主诉",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 187.5,
"height": 33,
"width": 550,
"title": " ",
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "complaint",
"lHeight": 50
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 231,
"height": 13.5,
"width": 50,
"title": "现病史",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 253,
"height": 42,
"width": 550,
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "presentIllness",
"title": "无",
"lHeight": 30
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 305,
"height": 13.5,
"width": 50,
"title": "既往史",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 324,
"height": 30,
"width": 550,
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "pastIllness",
"title": "无",
"lHeight": 20
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 366,
"height": 13.5,
"width": 50,
"title": "过敏史",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 384,
"height": 22.5,
"width": 550,
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "allergyHistory",
"title": "无",
"lHeight": 20
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 412.5,
"height": 13.5,
"width": 50,
"title": "家族史",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 432,
"height": 22.5,
"width": 550,
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "familyHistory",
"title": "无",
"lHeight": 20
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 465,
"height": 13.5,
"width": 50,
"title": "个人史",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 486,
"height": 28.5,
"width": 550,
"title": " ",
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "personalHistory",
"lHeight": 20
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 522.2500162124634,
"height": 13.5,
"width": 82.5,
"title": "体格检查",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 544.7500162124634,
"height": 30,
"width": 550,
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"title": "长文",
"lHeight": 20,
"formatter": "function(title, value, options, templateData, target, paperNo) {\n // 获取所有体检数据\n const bloodHigh = templateData.bloodHigh || '';\n const bloodLow = templateData.bloodLow || '';\n const breathe = templateData.breathe || '';\n const temperature = templateData.temperature || '';\n const pulse = templateData.pulse || '';\n \n // 格式化每个字段\n \n let formattedTemperature = '';\n if (temperature && !isNaN(temperature)) {\n formattedTemperature = 'T' + temperature + '℃';\n }\n \n let formattedPulse = '';\n if (pulse && !isNaN(pulse)) {\n formattedPulse = 'P' + pulse + '次/分';\n }\n let formattedR = '';\n if (breathe && !isNaN(breathe)) {\n formattedR = 'R' + breathe + '次/分';\n }\n \n let formattedBP = '';\n if (bloodHigh && !isNaN(bloodHigh)) {\n formattedBP = 'BP' + bloodHigh +'/'+bloodLow+ 'mmHg';\n }\n \n \n // 组合所有信息\n const result = [\n formattedR,\n formattedBP,\n formattedTemperature,\n formattedPulse\n ].filter(item => item !== '').join(' ');\n \n return result;\n}\n\n"
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 582,
"height": 13.5,
"width": 79.5,
"title": "辅助检查",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 601.5,
"height": 30,
"width": 550,
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "auxiliaryExam",
"title": "长文",
"lHeight": 20
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 640.5,
"height": 13.5,
"width": 79.5,
"title": "诊断",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 661.5,
"height": 28.5,
"width": 550,
"title": "无",
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "diagnosisText",
"lHeight": 30
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 694.7431640625,
"height": 13.5,
"width": 79.5,
"title": "处置",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 720,
"height": 28.5,
"width": 550,
"title": "无",
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "treatment",
"lHeight": 30
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 9,
"top": 766.5,
"height": 9,
"width": 576,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false,
"fixed": true
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 28.5,
"top": 787.5,
"height": 13.5,
"width": 223.5,
"title": "医生签字:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 399,
"top": 787.5,
"height": 13.5,
"width": 186,
"title": "日期",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"fixed": true,
"field": "reqTime"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 28.5,
"top": 810,
"height": 19.5,
"width": 556.5,
"title": "为了您和家人的健康,请勿吸烟!如需戒烟帮助,请到戒烟干预室咨询。",
"coordinateSync": false,
"widthHeightSync": false,
"fixed": true,
"fontSize": 12,
"letterSpacing": 1.5,
"textAlign": "center"
},
"printElementType": {
"title": "长文",
"type": "longText"
}
}
],
"paperNumberLeft": 236,
"paperNumberTop": 573
}
]
}

View File

@@ -0,0 +1,599 @@
{
"panels": [
{
"index": 1,
"name": 3,
"paperType": "A5",
"height": 210,
"width": 148,
"paperList": {
"type": "A5",
"width": 148,
"height": 210
},
"paperHeader": 0,
"paperFooter": 592.4409448818898,
"paperNumberDisabled": true,
"paperNumberContinue": true,
"expandCss": "",
"panelAngle": 0,
"overPrintOptions": {
"content": "",
"opacity": 0.01,
"type": 1
},
"watermarkOptions": {
"content": "",
"fillStyle": "rgba(87, 13, 248, 0.5)",
"fontSize": "10px",
"rotate": 0,
"width": 100,
"height": 100,
"timestamp": false,
"format": "YYYY-MM-DD HH:mm"
},
"panelLayoutOptions": {
"layoutType": "column",
"layoutRowGap": 0,
"layoutColumnGap": 0
},
"printElements": [
{
"options": {
"left": 0,
"top": 22.5,
"height": 19.5,
"width": 420,
"title": "长春市朝阳区中医院",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 20.25,
"qrCodeLevel": 0,
"textAlign": "center",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 0,
"top": 50,
"height": 20,
"width": 420,
"title": "处方签",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 13.5,
"textAlign": "center",
"qrCodeLevel": 0,
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 26,
"top": 90,
"height": 13.5,
"width": 100,
"title": "医保编号",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 283,
"top": 90,
"height": 13.5,
"width": 117,
"title": "就诊类型",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "orgId_dictText",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 26,
"top": 117,
"height": 13.5,
"width": 100,
"title": "处方编号",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "prescriptionNo",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 283,
"top": 117,
"height": 13.5,
"width": 117,
"title": "病人性质",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "contractName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 138,
"height": 9,
"width": 400,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false,
"fixed": true
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 160.5,
"top": 153,
"height": 13.5,
"width": 100,
"title": "性别",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "genderEnum_enumText",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 288,
"top": 153,
"height": 13.5,
"width": 99,
"title": "年龄",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "age"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 26,
"top": 154.5,
"height": 13.5,
"width": 100,
"title": "姓名",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "patientName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 27,
"top": 177,
"height": 13.5,
"width": 132,
"title": "地址:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 160.5,
"top": 178.5,
"height": 13.5,
"width": 99,
"title": "科室",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "departmentName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 288,
"top": 178.5,
"height": 13.5,
"width": 99,
"title": "电话",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 205.5,
"height": 13.5,
"width": 189,
"title": "门诊号",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "encounterNo"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 219,
"top": 205.5,
"height": 13.5,
"width": 198,
"title": "开具日期",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "reqTime"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 232.5,
"height": 13.5,
"width": 381,
"title": "临床诊断",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "conditionName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 256.5,
"height": 9,
"width": 400,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 28,
"top": 282,
"height": 9.75,
"width": 120,
"title": "Rp",
"coordinateSync": false,
"widthHeightSync": false,
"fixed": true,
"fontSize": 18,
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 15,
"top": 306,
"height": 36,
"width": 390,
"title": "undefined+beforeDragIn",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"textAlign": "center",
"tableBorder": "border",
"tableHeaderFontWeight": "500",
"field": "prescriptionList",
"columns": [
[
{
"title": "名称",
"width": 55.386224315781,
"field": "itemName",
"checked": true,
"columnId": "itemName",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "规格",
"width": 59.41840807183531,
"field": "totalVolume",
"checked": true,
"columnId": "totalVolume",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "产地",
"width": 79.59183673469389,
"field": "manufacturerText",
"checked": true,
"columnId": "manufacturerText",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "单价",
"width": 45.49640338326492,
"field": "unitPrice",
"checked": true,
"columnId": "unitPrice",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "数量",
"width": 41.658473534111906,
"field": "quantity",
"checked": true,
"columnId": "quantity",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "金额",
"width": 42.9159186212175,
"field": "totalPrice",
"checked": true,
"columnId": "totalPrice",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "等级",
"width": 65.53273533909551,
"field": "contractName",
"checked": true,
"columnId": "contractName",
"fixed": false,
"rowspan": 1,
"colspan": 1
}
]
]
},
"printElementType": {
"title": "表格",
"type": "table",
"editable": true,
"columnDisplayEditable": true,
"columnDisplayIndexEditable": true,
"columnTitleEditable": true,
"columnResizable": true,
"columnAlignEditable": true,
"isEnableEditField": true,
"isEnableContextMenu": true,
"isEnableInsertRow": true,
"isEnableDeleteRow": true,
"isEnableInsertColumn": true,
"isEnableDeleteColumn": true,
"isEnableMergeCell": true
}
},
{
"options": {
"left": 25.5,
"top": 379.5,
"height": 13.5,
"width": 241.5,
"title": "用法",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 18,
"top": 513,
"height": 13.5,
"width": 80,
"title": "医师",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "doctorName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 124.5,
"top": 513,
"height": 13.5,
"width": 80,
"title": "发药",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 222,
"top": 513,
"height": 13.5,
"width": 80,
"title": "划价",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 310.5,
"top": 513,
"height": 13.5,
"width": 80,
"title": "调配",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 532.5,
"height": 9,
"width": 400,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 289,
"top": 551.5,
"height": 13.5,
"width": 120,
"title": "总金额",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "medTotalAmount"
},
"printElementType": {
"title": "文本",
"type": "text"
}
}
],
"paperNumberLeft": 236,
"paperNumberTop": 573
}
]
}

View File

@@ -0,0 +1,407 @@
{
"panels": [
{
"index": 1,
"name": 3,
"paperType": "A4",
"height": 297,
"width": 210,
"paperList": {
"type": "A4",
"width": 210,
"height": 297
},
"paperHeader": 0,
"paperFooter": 837,
"paperNumberDisabled": true,
"paperNumberContinue": true,
"expandCss": "",
"panelAngle": 0,
"overPrintOptions": {
"content": "",
"opacity": 0.7,
"type": 1
},
"watermarkOptions": {
"content": "",
"fillStyle": "rgba(87, 13, 248, 0.5)",
"fontSize": "36px",
"rotate": 25,
"width": 413,
"height": 310,
"timestamp": true,
"format": "YYYY-MM-DD HH:mm"
},
"panelLayoutOptions": {
"layoutType": "column",
"layoutRowGap": 0,
"layoutColumnGap": 0
},
"printElements": [
{
"options": {
"left": 0,
"top": 22.5,
"height": 19.5,
"width": 595.5,
"title": "长春市朝阳区中医院",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 20.25,
"qrCodeLevel": 0,
"textAlign": "center"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 0,
"top": 54.5,
"height": 20,
"width": 595.5,
"title": "手术记录",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 13.5,
"textAlign": "center",
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 247.5,
"top": 81,
"height": 13.5,
"width": 190.5,
"title": "性别",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "genderEnum_enumText"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 460.5,
"top": 81,
"height": 13.5,
"width": 99,
"title": "年龄",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "age"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 82.5,
"height": 13.5,
"width": 193.5,
"title": "姓名",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "patientName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 108,
"height": 13.5,
"width": 192,
"title": "医保",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "contractName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 247.5,
"top": 108,
"height": 13.5,
"width": 190.5,
"title": "电话",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "phone"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 460.5,
"top": 108,
"height": 13.5,
"width": 99,
"title": "医生",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "doctorName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 460.5,
"top": 132.99999618530273,
"height": 13.5,
"width": 124.5,
"title": "科室",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "department"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 133.5,
"height": 13.5,
"width": 196.5,
"title": "病历号",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "busNo"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 247.5,
"top": 133.5,
"height": 13.5,
"width": 200,
"title": "手术日期",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "operationDate"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 157.5,
"height": 61.5,
"width": 550.5,
"title": "诊断",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "busNosds"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 226.5,
"height": 9,
"width": 576,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 25.5,
"top": 250.5,
"height": 13.5,
"width": 81,
"title": "详细记录",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 271.5,
"height": 493.5,
"width": 550,
"title": " ",
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "surgicalDetails",
"lHeight": 60,
"formatter": "function(title, value, options, templateData, target, paperNo) {\n // 返回原始值,让组件自动处理高度\n return value;\n}",
"styler": "function(value, options, target, templateData, paperNo) {\n return { \n 'word-wrap': 'break-word',\n 'word-break': 'break-all',\n 'white-space': 'normal',\n 'line-height': '1.4',\n 'overflow': 'visible'\n };\n}"
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 9,
"top": 774,
"height": 9,
"width": 576,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false,
"fixed": true
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 28.5,
"top": 787.5,
"height": 13.5,
"width": 223.5,
"title": "病人或家人签字:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 399,
"top": 787.5,
"height": 13.5,
"width": 186,
"title": "医生签字:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 399,
"top": 811.5,
"height": 13.5,
"width": 186,
"title": "日期",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "reqTime",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 28.5,
"top": 813,
"height": 13.5,
"width": 222,
"title": "日期",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "reqTime",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
}
],
"paperNumberLeft": 236,
"paperNumberTop": 573
}
]
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,239 @@
{
"panels": [
{
"index": 1,
"name": 2,
"paperType": "自定义",
"height": 50,
"width": 70,
"paperList": {
"type": "自定义",
"width": 70,
"height": 50
},
"paperHeader": 0,
"paperFooter": 138.8976377952756,
"paperNumberDisabled": true,
"paperNumberContinue": true,
"panelAngle": 0,
"overPrintOptions": {
"content": "",
"opacity": 0.01,
"type": 1
},
"watermarkOptions": {
"content": "",
"fillStyle": "rgba(87, 13, 248, 0.5)",
"fontSize": "10px",
"rotate": 0,
"width": 100,
"height": 100,
"timestamp": false,
"format": "YYYY-MM-DD HH:mm"
},
"panelLayoutOptions": {
"layoutType": "column",
"layoutRowGap": 0,
"layoutColumnGap": 0
},
"printElements": [
{
"options": {
"left": 6,
"top": 7.5,
"height": 15,
"width": 51,
"title": "文本",
"field": "patientName",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"hideTitle": true,
"fontSize": 10.5,
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 90,
"top": 7.5,
"height": 15,
"width": 33,
"title": "文本",
"field": "genderEnum_enumText",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"hideTitle": true,
"fontSize": 10.5,
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 147,
"top": 7.5,
"height": 15,
"width": 45,
"title": "文本",
"field": "age",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"hideTitle": true,
"fontSize": 10.5,
"fontWeight": "bold",
"textAlign": "right"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 6,
"top": 33,
"height": 15,
"width": 81,
"title": "频次 qd",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"fontSize": 10.5,
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 122,
"top": 33,
"height": 15,
"width": 70.5,
"title": "文本",
"field": "date",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"hideTitle": true,
"fontSize": 10.5,
"fontWeight": "bold",
"textAlign": "right"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 4.5,
"top": 52.5,
"height": 36,
"width": 189,
"title": "undefined+beforeDragIn",
"field": "infuseData",
"coordinateSync": false,
"widthHeightSync": false,
"tableHeaderBackground": "#ffffff",
"tableBodyCellBorder": "noBorder",
"rowsColumnsMerge": "function(data, col, colIndex, rowIndex, tableData, printData){ \n // 合并前三列 (columnIndex 0-2)\n if (colIndex >= 0 && colIndex <= 2) {\n // 第一列显示合并后的单元格\n if (colIndex === 0) {\n return [1, 3]; // rowspan=1, colspan=3\n } \n // 其他两列不显示(被合并)\n else {\n return [0, 0]; // rowspan=0, colspan=0\n }\n }\n // 其他列正常显示\n return [1, 1]; // rowspan=1, colspan=1\n}",
"tableBodyRowBorder": "topBottomBorder",
"columns": [
[
{
"title": "用法",
"titleSync": false,
"halign": "center",
"tableQRCodeLevel": 0,
"tableSummaryTitle": true,
"tableSummary": "",
"width": 45.48982644423766,
"field": "data",
"checked": true,
"columnId": "data",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "剂量",
"titleSync": false,
"align": "center",
"tableQRCodeLevel": 0,
"tableSummaryTitle": true,
"tableSummary": "",
"width": 47.79422504530706,
"checked": true,
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "速度",
"titleSync": false,
"align": "center",
"tableQRCodeLevel": 0,
"tableSummaryTitle": true,
"tableSummary": "",
"width": 48.74985321589121,
"checked": true,
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "数量",
"titleSync": false,
"align": "center",
"tableQRCodeLevel": 0,
"tableSummaryTitle": true,
"tableSummary": "",
"formatter2": "function(value,row,index,options,rowIndex,column){ return value + ' ' + row.unitCode_dictText; }",
"width": 46.96609529456407,
"field": "quantity",
"checked": true,
"columnId": "quantity",
"fixed": false,
"rowspan": 1,
"colspan": 1
}
]
]
},
"printElementType": {
"title": "表格",
"type": "table",
"editable": true,
"columnDisplayEditable": true,
"columnDisplayIndexEditable": true,
"columnTitleEditable": true,
"columnResizable": true,
"columnAlignEditable": true,
"isEnableEditField": true,
"isEnableContextMenu": true,
"isEnableInsertRow": true,
"isEnableDeleteRow": true,
"isEnableInsertColumn": true,
"isEnableDeleteColumn": true,
"isEnableMergeCell": true
}
}
],
"paperNumberLeft": 151.5,
"paperNumberTop": 91
}
]
}

View File

@@ -0,0 +1,245 @@
{
"panels": [
{
"index": 1,
"name": 2,
"paperType": "自定义",
"height": 34,
"width": 58,
"paperList": {
"type": "自定义",
"width": 60,
"height": 40
},
"paperHeader": 0,
"paperFooter": 91.5,
"paperNumberDisabled": true,
"paperNumberContinue": true,
"expandCss": "",
"panelAngle": 0,
"overPrintOptions": {
"content": "",
"opacity": 0.01,
"type": 1
},
"watermarkOptions": {
"content": "",
"fillStyle": "rgba(87, 13, 248, 0.5)",
"fontSize": "10px",
"rotate": 25,
"width": 100,
"height": 100,
"timestamp": false,
"format": "YYYY-MM-DD HH:mm"
},
"panelLayoutOptions": {
"layoutType": "column",
"layoutRowGap": 0,
"layoutColumnGap": 0
},
"printElements": [
{
"options": {
"left": 6,
"top": 7.5,
"height": 10,
"width": 51,
"title": "文本",
"field": "patientName",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"hideTitle": true,
"fontSize": 7.5,
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 70,
"top": 7.5,
"height": 10,
"width": 33,
"title": "文本",
"field": "genderEnum_enumText",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"hideTitle": true,
"fontSize": 7.5,
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 119,
"top": 7.5,
"height": 10,
"width": 45,
"title": "文本",
"field": "age",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"hideTitle": true,
"fontSize": 7.5,
"fontWeight": "bold",
"textAlign": "right"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 6,
"top": 19.5,
"height": 12,
"width": 81,
"title": "频次 qd",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"fontSize": 8.25,
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 93,
"top": 19.5,
"height": 10,
"width": 70.5,
"title": "文本",
"field": "date",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"hideTitle": true,
"fontSize": 7.5,
"fontWeight": "bold",
"textAlign": "right"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 4.5,
"top": 36,
"height": 30,
"width": 156,
"title": "undefined+beforeDragIn",
"field": "infuseData",
"coordinateSync": false,
"widthHeightSync": false,
"tableHeaderBackground": "#ffffff",
"tableBodyCellBorder": "noBorder",
"rowsColumnsMerge": "function(data, col, colIndex, rowIndex, tableData, printData){ \n // 合并前三列 (columnIndex 0-2)\n if (colIndex >= 0 && colIndex <= 2) {\n // 第一列显示合并后的单元格\n if (colIndex === 0) {\n return [1, 3]; // rowspan=1, colspan=3\n } \n // 其他两列不显示(被合并)\n else {\n return [0, 0]; // rowspan=0, colspan=0\n }\n }\n // 其他列正常显示\n return [1, 1]; // rowspan=1, colspan=1\n}",
"tableBodyRowBorder": "topBottomBorder",
"fontSize": 7.5,
"tableHeaderRepeat": "first",
"maxRows": 3,
"tableHeaderRowHeight": 6,
"tableHeaderFontSize": 6.75,
"columns": [
[
{
"title": "用法",
"titleSync": false,
"halign": "center",
"tableQRCodeLevel": 0,
"tableSummaryTitle": true,
"tableSummary": "",
"width": 37.54715833492632,
"field": "data",
"checked": true,
"columnId": "data",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "剂量",
"titleSync": false,
"align": "center",
"tableQRCodeLevel": 0,
"tableSummaryTitle": true,
"tableSummary": "",
"width": 39.4492016246979,
"checked": true,
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "速度",
"titleSync": false,
"align": "center",
"tableQRCodeLevel": 0,
"tableSummaryTitle": true,
"tableSummary": "",
"width": 40.23797408295783,
"checked": true,
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "数量",
"titleSync": false,
"align": "center",
"tableQRCodeLevel": 0,
"tableSummaryTitle": true,
"tableSummary": "",
"formatter2": "function(value,row,index,options,rowIndex,column){ return value + ' ' + row.unitCode_dictText; }",
"width": 38.765665957417966,
"field": "quantity",
"checked": true,
"columnId": "quantity",
"fixed": false,
"rowspan": 1,
"colspan": 1
}
]
]
},
"printElementType": {
"title": "表格",
"type": "table",
"editable": true,
"columnDisplayEditable": true,
"columnDisplayIndexEditable": true,
"columnTitleEditable": true,
"columnResizable": true,
"columnAlignEditable": true,
"isEnableEditField": true,
"isEnableContextMenu": true,
"isEnableInsertRow": true,
"isEnableDeleteRow": true,
"isEnableInsertColumn": true,
"isEnableDeleteColumn": true,
"isEnableMergeCell": true
}
}
],
"paperNumberLeft": 151.5,
"paperNumberTop": 91
}
]
}

View File

@@ -0,0 +1,290 @@
{
"panels": [
{
"index": 1,
"name": 2,
"paperType": "自定义",
"height": 60,
"width": 80,
"paperList": {
"type": "自定义",
"width": 80,
"height": 60
},
"paperHeader": 0,
"paperFooter": 166.5,
"paperNumberDisabled": true,
"paperNumberContinue": true,
"panelAngle": 0,
"overPrintOptions": {
"content": "",
"opacity": 0.7,
"type": 1
},
"watermarkOptions": {
"content": "",
"fillStyle": "rgba(87, 13, 248, 0.5)",
"fontSize": "36px",
"rotate": 25,
"width": 413,
"height": 310,
"timestamp": true,
"format": "YYYY-MM-DD HH:mm"
},
"panelLayoutOptions": {
"layoutType": "column",
"layoutRowGap": 0,
"layoutColumnGap": 0
},
"printElements": [
{
"options": {
"left": 6,
"top": 7.5,
"height": 10,
"width": 69,
"title": "病区",
"field": "patientName",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"fontSize": 7.5,
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 81,
"top": 7.5,
"height": 10,
"width": 52.5,
"title": "姓名",
"field": "patientName",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"fontSize": 7.5,
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 147,
"top": 7.5,
"height": 10,
"width": 72,
"title": "床位号",
"field": "bedNo",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"fontSize": 7.5,
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 6,
"top": 22,
"height": 12,
"width": 81,
"title": "频次 qd",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"fontSize": 8.25,
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 147,
"top": 24,
"height": 10,
"width": 70.5,
"title": "日期",
"field": "date",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0,
"fontSize": 7.5,
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 4.5,
"top": 45,
"height": 30,
"width": 216,
"title": "undefined+beforeDragIn",
"field": "infuseData",
"coordinateSync": false,
"widthHeightSync": false,
"tableHeaderBackground": "#ffffff",
"tableBodyCellBorder": "noBorder",
"rowsColumnsMerge": "function(data, col, colIndex, rowIndex, tableData, printData){ \n // 合并前三列 (columnIndex 0-2)\n if (colIndex >= 0 && colIndex <= 2) {\n // 第一列显示合并后的单元格\n if (colIndex === 0) {\n return [1, 3]; // rowspan=1, colspan=3\n } \n // 其他两列不显示(被合并)\n else {\n return [0, 0]; // rowspan=0, colspan=0\n }\n }\n // 其他列正常显示\n return [1, 1]; // rowspan=1, colspan=1\n}",
"tableBodyRowBorder": "topBottomBorder",
"fontSize": 7.5,
"tableHeaderRepeat": "first",
"maxRows": 3,
"tableHeaderRowHeight": 6,
"tableHeaderFontSize": 6.75,
"columns": [
[
{
"title": "用法",
"titleSync": false,
"halign": "center",
"tableQRCodeLevel": 0,
"tableSummaryTitle": true,
"tableSummary": "",
"width": 51.988373079128756,
"field": "data",
"checked": true,
"columnId": "data",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "剂量",
"titleSync": false,
"align": "center",
"tableQRCodeLevel": 0,
"tableSummaryTitle": true,
"tableSummary": "",
"width": 55.016471480350916,
"checked": true,
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "滴速",
"titleSync": false,
"align": "center",
"tableQRCodeLevel": 0,
"tableSummaryTitle": true,
"tableSummary": "",
"width": 55.31961796101854,
"field": "",
"checked": true,
"columnId": "",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "数量",
"titleSync": false,
"align": "center",
"tableQRCodeLevel": 0,
"tableSummaryTitle": true,
"tableSummary": "",
"formatter2": "function(value,row,index,options,rowIndex,column){ return value + ' ' + row.unitCode_dictText; }",
"width": 53.6755374795018,
"field": "quantity",
"checked": true,
"columnId": "quantity",
"fixed": false,
"rowspan": 1,
"colspan": 1
}
]
]
},
"printElementType": {
"title": "表格",
"type": "table",
"editable": true,
"columnDisplayEditable": true,
"columnDisplayIndexEditable": true,
"columnTitleEditable": true,
"columnResizable": true,
"columnAlignEditable": true,
"isEnableEditField": true,
"isEnableContextMenu": true,
"isEnableInsertRow": true,
"isEnableDeleteRow": true,
"isEnableInsertColumn": true,
"isEnableDeleteColumn": true,
"isEnableMergeCell": true
}
},
{
"options": {
"left": 10,
"top": 144,
"height": 9,
"width": 210,
"borderWidth": "0.75",
"title": "undefined+beforeDragIn",
"coordinateSync": false,
"widthHeightSync": false
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 10,
"top": 153,
"height": 9.75,
"width": 82.5,
"title": "执行人",
"field": "prepareName",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 111,
"top": 153,
"height": 9.75,
"width": 82.5,
"title": "时间",
"field": "date",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
}
],
"paperNumberLeft": 151.5,
"paperNumberTop": 91
}
]
}

View File

@@ -0,0 +1,734 @@
{
"panels": [
{
"index": 1,
"name": 3,
"paperType": "A4",
"height": 297,
"width": 210,
"paperList": {
"type": "A4",
"width": 210,
"height": 297
},
"paperHeader": 217.5,
"paperFooter": 771,
"paperNumberDisabled": true,
"paperNumberContinue": true,
"panelAngle": 0,
"overPrintOptions": {
"content": "",
"opacity": 0.7,
"type": 1
},
"watermarkOptions": {
"content": "",
"fillStyle": "rgba(87, 13, 248, 0.5)",
"fontSize": "36px",
"rotate": 25,
"width": 413,
"height": 310,
"timestamp": true,
"format": "YYYY-MM-DD HH:mm"
},
"panelLayoutOptions": {
"layoutType": "column",
"layoutRowGap": 0,
"layoutColumnGap": 0
},
"printElements": [
{
"options": {
"left": 0,
"top": 22.5,
"height": 19.5,
"width": 595.5,
"title": "长春市朝阳区中医院",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 20.25,
"qrCodeLevel": 0,
"textAlign": "center"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 0,
"top": 54.5,
"height": 20,
"width": 595.5,
"title": "门诊病历",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 13.5,
"textAlign": "center",
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 247.5,
"top": 81,
"height": 13.5,
"width": 100,
"title": "性别",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "genderEnum_enumText"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 460.5,
"top": 81,
"height": 13.5,
"width": 99,
"title": "年龄",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "age"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 82.5,
"height": 13.5,
"width": 100,
"title": "姓名",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "patientName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 108,
"height": 13.5,
"width": 99,
"title": "医保",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "contractName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 247.5,
"top": 108,
"height": 13.5,
"width": 190.5,
"title": "电话",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "phone"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 460.5,
"top": 108,
"height": 13.5,
"width": 99,
"title": "医生",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "doctorName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 133.5,
"height": 13.5,
"width": 196.5,
"title": "病历号",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "busNo"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 247.5,
"top": 133.5,
"height": 13.5,
"width": 200,
"title": "发病日期",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "onsetDate"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 159,
"height": 13.5,
"width": 50,
"title": "诊断",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "vxc"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 174,
"height": 30,
"width": 550,
"hideTitle": true,
"field": "diagnosisText",
"title": "无",
"lHeight": 20,
"formatter": "function(title, value, options, templateData, target, paperNo) {\n return value || '无';\n}",
"styler": "function(value, options, target, templateData, paperNo) {\n return { \n 'word-wrap': 'break-word',\n 'word-break': 'break-all',\n 'white-space': 'normal',\n 'line-height': '1.4'\n };\n}",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 10,
"top": 210,
"height": 9,
"width": 576,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 25.5,
"top": 217.5,
"height": 13.5,
"width": 50,
"title": "主诉",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 235.5,
"height": 33,
"width": 550,
"title": " ",
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "complaint",
"lHeight": 50
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 277.5,
"height": 13.5,
"width": 50,
"title": "现病史",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 299.5,
"height": 31.5,
"width": 550,
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "presentIllness",
"title": "无",
"lHeight": 30
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 341,
"height": 13.5,
"width": 50,
"title": "既往史",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 360,
"height": 25.5,
"width": 550,
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "pastIllness",
"title": "无",
"lHeight": 20
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 396,
"height": 13.5,
"width": 50,
"title": "过敏史",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 414,
"height": 33,
"width": 550,
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "allergyHistory",
"title": "无",
"lHeight": 20
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 462,
"height": 13.5,
"width": 50,
"title": "家族史",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 481.5,
"height": 22.5,
"width": 550,
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "familyHistory",
"title": "无",
"lHeight": 20
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 514.5,
"height": 13.5,
"width": 50,
"title": "个人史",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 535.5,
"height": 28.5,
"width": 550,
"title": " ",
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "personalHistory",
"lHeight": 20
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 571.7500162124634,
"height": 13.5,
"width": 50,
"title": "体检",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 594.2500162124634,
"height": 30,
"width": 550,
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"title": "长文",
"lHeight": 20,
"formatter": "function(title, value, options, templateData, target, paperNo) {\n // 获取所有体检数据\n const height = templateData.height || '';\n const weight = templateData.weight || '';\n const temperature = templateData.temperature || '';\n const pulse = templateData.pulse || '';\n \n // 格式化每个字段\n let formattedHeight = '';\n if (height && !isNaN(height)) {\n formattedHeight = '身高:' + height + 'cm';\n }\n \n let formattedWeight = '';\n if (weight && !isNaN(weight)) {\n formattedWeight = '体重:' + weight + 'kg';\n }\n \n let formattedTemperature = '';\n if (temperature && !isNaN(temperature)) {\n formattedTemperature = '体温:' + temperature + '℃';\n }\n \n let formattedPulse = '';\n if (pulse && !isNaN(pulse)) {\n formattedPulse = '脉搏:' + pulse + '次/分';\n }\n \n // 组合所有信息\n const result = [\n formattedHeight,\n formattedWeight,\n formattedTemperature,\n formattedPulse\n ].filter(item => item !== '').join(' ');\n \n return result;\n}\n\n"
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 631.5,
"height": 13.5,
"width": 79.5,
"title": "辅助检查",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 651,
"height": 22.5,
"width": 550,
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "auxiliaryExam",
"title": "长文",
"lHeight": 20
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 678.2431640625,
"height": 13.5,
"width": 50,
"title": "处置",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 700.5,
"height": 21,
"width": 550,
"title": "无",
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "treatment",
"lHeight": 30
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 25.5,
"top": 730,
"height": 13.5,
"width": 50,
"title": "治疗",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "physicalExamdsd",
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 747,
"height": 25.5,
"width": 550,
"title": "无",
"coordinateSync": false,
"widthHeightSync": false,
"hideTitle": true,
"field": "physicalExam",
"lHeight": 20
},
"printElementType": {
"title": "长文",
"type": "longText"
}
},
{
"options": {
"left": 9,
"top": 774,
"height": 9,
"width": 576,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 28.5,
"top": 787.5,
"height": 13.5,
"width": 223.5,
"title": "病人或家人签字:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 399,
"top": 787.5,
"height": 13.5,
"width": 186,
"title": "医生签字:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 399,
"top": 811.5,
"height": 13.5,
"width": 186,
"title": "日期",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "reqTime"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 28.5,
"top": 813,
"height": 13.5,
"width": 222,
"title": "日期",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "reqTime"
},
"printElementType": {
"title": "文本",
"type": "text"
}
}
],
"paperNumberLeft": 236,
"paperNumberTop": 573
}
]
}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,632 @@
{
"panels": [
{
"index": 1,
"name": 3,
"paperType": "A5",
"height": 210,
"width": 148,
"paperList": {
"type": "A5",
"width": 148,
"height": 210
},
"paperHeader": 0,
"paperFooter": 592.4409448818898,
"paperNumberDisabled": true,
"paperNumberContinue": true,
"panelAngle": 0,
"overPrintOptions": {
"content": "",
"opacity": 0.01,
"type": 1
},
"watermarkOptions": {
"content": "",
"fillStyle": "rgba(87, 13, 248, 0.5)",
"fontSize": "10px",
"rotate": 0,
"width": 100,
"height": 100,
"timestamp": false,
"format": "YYYY-MM-DD HH:mm"
},
"panelLayoutOptions": {
"layoutType": "column",
"layoutRowGap": 0,
"layoutColumnGap": 0
},
"printElements": [
{
"options": {
"left": 0,
"top": 22.5,
"height": 19.5,
"width": 420,
"title": "长春市朝阳区中医院",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 20.25,
"qrCodeLevel": 0,
"textAlign": "center",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 0,
"top": 50,
"height": 20,
"width": 420,
"title": "处方签",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 13.5,
"textAlign": "center",
"qrCodeLevel": 0,
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 26,
"top": 90,
"height": 13.5,
"width": 100,
"title": "医保编号",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 283,
"top": 90,
"height": 13.5,
"width": 117,
"title": "就诊类型",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "orgId_dictText",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 26,
"top": 117,
"height": 13.5,
"width": 100,
"title": "处方编号",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "prescriptionNo",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 283,
"top": 117,
"height": 13.5,
"width": 117,
"title": "病人性质",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "contractName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 138,
"height": 9,
"width": 400,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false,
"fixed": true
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 142.5,
"top": 153,
"height": 13.5,
"width": 100,
"title": "性别",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "genderEnum_enumText",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 288,
"top": 153,
"height": 13.5,
"width": 99,
"title": "年龄",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "age",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 26,
"top": 154.5,
"height": 13.5,
"width": 100,
"title": "姓名",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "patientName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 142.5,
"top": 178.5,
"height": 13.5,
"width": 99,
"title": "科室",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "departmentName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 288,
"top": 178.5,
"height": 13.5,
"width": 99,
"title": "电话",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 180,
"height": 13.5,
"width": 100,
"title": "门诊号",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "encounterNo",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 205.5,
"height": 13.5,
"width": 141,
"title": "地址",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 195,
"top": 205.5,
"height": 13.5,
"width": 210,
"title": "开具日期",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "reqTime",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 25.5,
"top": 232.5,
"height": 13.5,
"width": 367.5,
"title": "临床诊断",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "conditionName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 256.5,
"height": 9,
"width": 400,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false,
"fixed": true
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 28,
"top": 282,
"height": 9.75,
"width": 120,
"title": "Rp",
"coordinateSync": false,
"widthHeightSync": false,
"fixed": true,
"fontSize": 18,
"qrCodeLevel": 0
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 15,
"top": 306,
"height": 36,
"width": 390,
"title": "undefined+beforeDragIn",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"textAlign": "center",
"tableBorder": "border",
"tableHeaderFontWeight": "500",
"field": "prescriptionList",
"columns": [
[
{
"title": "名称",
"width": 55.386224315781,
"field": "itemName",
"checked": true,
"columnId": "itemName",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "规格",
"width": 59.41840807183531,
"field": "totalVolume",
"checked": true,
"columnId": "totalVolume",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "厂家",
"width": 79.59183673469389,
"checked": true,
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "单价",
"width": 45.49640338326492,
"field": "unitPrice",
"checked": true,
"columnId": "unitPrice",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "数量",
"width": 41.658473534111906,
"field": "quantity",
"checked": true,
"columnId": "quantity",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "金额",
"width": 42.9159186212175,
"field": "totalPrice",
"checked": true,
"columnId": "totalPrice",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "等级",
"width": 65.53273533909551,
"field": "contractName",
"checked": true,
"columnId": "contractName",
"fixed": false,
"rowspan": 1,
"colspan": 1
}
]
]
},
"printElementType": {
"title": "表格",
"type": "table",
"editable": true,
"columnDisplayEditable": true,
"columnDisplayIndexEditable": true,
"columnTitleEditable": true,
"columnResizable": true,
"columnAlignEditable": true,
"isEnableEditField": true,
"isEnableContextMenu": true,
"isEnableInsertRow": true,
"isEnableDeleteRow": true,
"isEnableInsertColumn": true,
"isEnableDeleteColumn": true,
"isEnableMergeCell": true
}
},
{
"options": {
"left": 25.5,
"top": 379.5,
"height": 13.5,
"width": 241.5,
"title": "用法",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 8.996109008789062,
"top": 510,
"height": 13.5,
"width": 100,
"title": "医师",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "doctorName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 113,
"top": 510,
"height": 13.5,
"width": 100,
"title": "发药",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 217,
"top": 510,
"height": 13.5,
"width": 100,
"title": "划价",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 318,
"top": 510,
"height": 13.5,
"width": 100,
"title": "调配",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "nickName",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 532.5,
"height": 9,
"width": 400,
"borderWidth": "1.5",
"coordinateSync": false,
"widthHeightSync": false,
"fixed": true
},
"printElementType": {
"title": "横线",
"type": "hline"
}
},
{
"options": {
"left": 26,
"top": 551.5,
"height": 13.5,
"width": 120,
"title": "制表人",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "1",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 289,
"top": 551.5,
"height": 13.5,
"width": 120,
"title": "金额",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
"qrCodeLevel": 0,
"field": "medTotalAmount",
"fixed": true
},
"printElementType": {
"title": "文本",
"type": "text"
}
}
],
"paperNumberLeft": 236,
"paperNumberTop": 573
}
]
}

View File

@@ -0,0 +1,14 @@
处方签 Prescription.json
处置单 Disposal.json
门诊日结 DailyOutpatientSettlement.json
门诊挂号 OutpatientRegistration.json
门诊收费 OutpatientBilling.json
门诊病历 OutpatientMedicalRecord.json
手术记录 OperativeRecord.json
门诊输液贴 OutpatientInfusion.json
药房打印 Pharmacy.json
红旗门诊病历 HQOutpatientMedicalRecord.json
预交金 AdvancePayment.json
中药药房处方单 ChineseMedicinePrescription.json
中药医生处方单 DocChineseMedicinePrescription.json

View File

@@ -0,0 +1,90 @@
const KEY_DELTA_MAP = {
ArrowLeft: -1,
ArrowUp: -1,
ArrowRight: 1,
ArrowDown: 1,
}
const FOCUSABLE_SELECTORS = [
'input:not([type="hidden"]):not([disabled])',
'textarea:not([disabled])',
'select:not([disabled])',
'.el-input__inner',
'.el-input-number',
'.el-select',
'.el-tree-select',
'[tabindex]:not([tabindex="-1"])',
]
function focusControl(container) {
if (!container) return
const focus = (el) => {
if (!el) return
el.focus?.()
if (el.select && !el.readOnly) {
el.select()
}
}
if (container.matches?.('input, textarea, select')) {
focus(container)
return
}
const directTarget = container.querySelector(FOCUSABLE_SELECTORS.join(', '))
if (directTarget) {
focusControl(directTarget)
return
}
focus(container)
}
function getFormItems(root) {
const propItems = Array.from(root.querySelectorAll('[data-prop]'))
if (propItems.length) {
return propItems
}
return Array.from(root.querySelectorAll('.el-form-item'))
}
function createHandler(root) {
return function handleKeyDown(event) {
const delta = KEY_DELTA_MAP[event.key]
if (!delta) return
const currentItem = event.target.closest('[data-prop], .el-form-item')
if (!currentItem || !root.contains(currentItem)) return
const items = getFormItems(root)
if (!items.length) return
const currentIndex = items.indexOf(currentItem)
if (currentIndex === -1) return
event.preventDefault()
event.stopPropagation()
const nextIndex = (currentIndex + delta + items.length) % items.length
const targetItem = items[nextIndex]
if (targetItem) {
focusControl(targetItem)
}
}
}
export default {
mounted(el) {
const handler = createHandler(el)
el.__arrowNavigateHandler = handler
el.addEventListener('keydown', handler, true)
},
beforeUnmount(el) {
if (el.__arrowNavigateHandler) {
el.removeEventListener('keydown', el.__arrowNavigateHandler, true)
delete el.__arrowNavigateHandler
}
},
}

View File

@@ -3,6 +3,7 @@ import hasPermi from './permission/hasPermi'
import copyText from './common/copyText'
import horizontalScroll from './common/horizontalScroll'
import clickOutsideRow from './common/clickOutsideRow'
import arrowNavigate from './common/arrowNavigate'
export default function directive(app){
app.directive('hasRole', hasRole)
@@ -10,4 +11,5 @@ export default function directive(app){
app.directive('copyText', copyText)
app.directive('horizontal-scroll', horizontalScroll)
app.directive('click-outside-row', clickOutsideRow)
app.directive('arrow-navigate', arrowNavigate)
}

View File

@@ -1,98 +1,109 @@
import { createApp } from 'vue'
import { createApp } from 'vue';
import Cookies from 'js-cookie'
import Cookies from 'js-cookie';
import ElementPlus from 'element-plus'
import zhCn from 'element-plus/es/locale/lang/zh-cn'
import 'element-plus/dist/index.css'
import locale from 'element-plus/es/locale/lang/zh-cn'
// 导入 hiprint 并挂载到全局 window 对象
import { hiprint } from 'vue-plugin-hiprint';
window.hiprint = hiprint;
import '@/assets/styles/index.scss' // global css
import ElementPlus from 'element-plus';
import zhCn from 'element-plus/es/locale/lang/zh-cn';
import 'element-plus/dist/index.css';
import locale from 'element-plus/es/locale/lang/zh-cn';
import App from './App'
import store from './store'
import router from './router'
import directive from './directive' // directive
import '@/assets/styles/index.scss'; // global css
import App from './App';
import store from './store';
import router from './router';
import directive from './directive'; // directive
// 注册指令
import plugins from './plugins' // plugins
import { download, downloadGet } from '@/utils/request'
import plugins from './plugins'; // plugins
import { download, downloadGet } from '@/utils/request';
// svg图标
import 'virtual:svg-icons-register'
import SvgIcon from '@/components/SvgIcon'
import elementIcons from '@/components/SvgIcon/svgicon'
import 'virtual:svg-icons-register';
import SvgIcon from '@/components/SvgIcon';
import elementIcons from '@/components/SvgIcon/svgicon';
import './permission' // permission control
import './permission'; // permission control
import { useDict } from '@/utils/dict'
import { parseTime, resetForm, addDateRange, handleTree, selectDictLabel, selectDictLabels} from '@/utils/openhis'
import { useDict } from '@/utils/dict';
import {
parseTime,
resetForm,
addDateRange,
handleTree,
selectDictLabel,
selectDictLabels,
} from '@/utils/openhis';
import { formatDateStr } from '@/utils/index';
// 分页组件
import Pagination from '@/components/Pagination'
import Pagination from '@/components/Pagination';
// 自定义表格工具组件
import RightToolbar from '@/components/RightToolbar'
import RightToolbar from '@/components/RightToolbar';
// 富文本组件
import Editor from "@/components/Editor"
import Editor from '@/components/Editor';
// 文件上传组件
import FileUpload from "@/components/FileUpload"
import FileUpload from '@/components/FileUpload';
// 图片上传组件
import ImageUpload from "@/components/ImageUpload"
import ImageUpload from '@/components/ImageUpload';
// 图片预览组件
import ImagePreview from "@/components/ImagePreview"
import ImagePreview from '@/components/ImagePreview';
// 自定义树选择组件
import TreeSelect from '@/components/TreeSelect'
import TreeSelect from '@/components/TreeSelect';
// 字典标签组件
import DictTag from '@/components/DictTag'
import DictTag from '@/components/DictTag';
import { ElDialog, ElMessage } from 'element-plus';
import {registerComponents} from './template';
import { registerComponents } from './template';
const app = createApp(App);
if(chrome.webview !== undefined) {
if (chrome.webview !== undefined) {
// 如果是webview环境挂载CSharpAccessor对象到vue实例上
const csAccessor = chrome.webview.hostObjects.CSharpAccessor;
app.config.globalProperties.csAccessor = csAccessor;
}
// 全局方法挂载
app.config.globalProperties.useDict = useDict
app.config.globalProperties.download = download
app.config.globalProperties.downloadGet = downloadGet
app.config.globalProperties.parseTime = parseTime
app.config.globalProperties.resetForm = resetForm
app.config.globalProperties.handleTree = handleTree
app.config.globalProperties.addDateRange = addDateRange
app.config.globalProperties.selectDictLabel = selectDictLabel
app.config.globalProperties.selectDictLabels = selectDictLabels
app.config.globalProperties.formatDateStr = formatDateStr
app.config.globalProperties.useDict = useDict;
app.config.globalProperties.download = download;
app.config.globalProperties.downloadGet = downloadGet;
app.config.globalProperties.parseTime = parseTime;
app.config.globalProperties.resetForm = resetForm;
app.config.globalProperties.handleTree = handleTree;
app.config.globalProperties.addDateRange = addDateRange;
app.config.globalProperties.selectDictLabel = selectDictLabel;
app.config.globalProperties.selectDictLabels = selectDictLabels;
app.config.globalProperties.formatDateStr = formatDateStr;
// 全局组件挂载
app.component('DictTag', DictTag)
app.component('Pagination', Pagination)
app.component('TreeSelect', TreeSelect)
app.component('FileUpload', FileUpload)
app.component('ImageUpload', ImageUpload)
app.component('ImagePreview', ImagePreview)
app.component('RightToolbar', RightToolbar)
app.component('Editor', Editor)
app.use(registerComponents)
app.use(ElMessage)
app.use(router)
app.use(store)
app.use(plugins)
app.use(elementIcons)
app.component('svg-icon', SvgIcon)
directive(app)
app.component('DictTag', DictTag);
app.component('Pagination', Pagination);
app.component('TreeSelect', TreeSelect);
app.component('FileUpload', FileUpload);
app.component('ImageUpload', ImageUpload);
app.component('ImagePreview', ImagePreview);
app.component('RightToolbar', RightToolbar);
app.component('Editor', Editor);
app.use(registerComponents);
app.use(ElMessage);
app.use(router);
app.use(store);
app.use(plugins);
app.use(elementIcons);
app.component('svg-icon', SvgIcon);
directive(app);
// 全局禁止点击遮罩层关闭弹窗
ElDialog.props.closeOnClickModal.default = false;
// 使用element-plus 并且设置全局的大小
app.use(ElementPlus, {
locale: zhCn,
// 支持 large、default、small
size: Cookies.get('size') || 'default'
})
size: Cookies.get('size') || 'default',
});
app.mount('#app')
app.mount('#app');

View File

@@ -1,6 +1,7 @@
import { createWebHistory, createRouter } from 'vue-router';
/* Layout */
import Layout from '@/layout';
import { path } from 'd3';
/**
* Note: 路由配置项
@@ -85,6 +86,10 @@ export const constantRoutes = [
},
],
},
{
path: '/tpr',
component: () => import('@/views/inpatientNurse/tprSheet/index.vue'),
},
];
// 动态路由,基于用户权限动态去加载

View File

@@ -0,0 +1,422 @@
<template>
<div class="medical-form">
<div class="patient-name">
患者姓名{{ patient?.patientName || '未知' }} &nbsp;&nbsp; 病历号{{
patient?.busNo || '未知'
}}
</div>
<h2 style="text-align: center">长春市朝阳区中医院</h2>
<h2 style="text-align: center">出院诊断病历</h2>
<!-- 滚动内容区域 -->
<div class="form-scroll-container">
<el-form
ref="formRef"
:model="formData"
:rules="rules"
label-width="100px"
label-align="left"
class="medical-full-form"
>
<h4 class="section-title">基础信息</h4>
<!-- 1. 基础信息单行自适应排列 -->
<el-form-item class="form-section">
<div class="single-row-layout">
<el-form-item label="姓名" prop="patientName" class="row-item">
<div class="input-with-unit">
<el-input v-model="formData.patientName" type="text" placeholder="请输入" />
</div>
</el-form-item>
<el-form-item label="年龄" prop="age" class="row-item">
<div class="input-with-unit">
<el-input v-model="formData.age" type="text" placeholder="请输入" />
</div>
</el-form-item>
<el-form-item label="性别" prop="gender" class="row-item">
<div class="input-with-unit">
<el-input v-model="formData.gender" type="text" placeholder="请输入" />
</div>
</el-form-item>
<el-form-item label="住院号" prop="busNo" class="row-item">
<div class="input-with-unit">
<el-input v-model="formData.busNo" type="text" placeholder="请输入" />
</div>
</el-form-item>
<el-form-item label="职业" prop="temperature" class="row-item">
<div class="input-with-unit">
<el-input v-model="formData.temperature" type="text" placeholder="请输入" />
</div>
</el-form-item>
<el-form-item label="入院日期" prop="admissionDate" class="row-item">
<el-date-picker
v-model="formData.admissionDate"
type="date"
placeholder="选择入院日期"
value-format="YYYY-MM-DD"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="出院日期" prop="dischargeDate" class="row-item">
<el-date-picker
v-model="formData.dischargeDate"
type="date"
placeholder="选择出院日期"
value-format="YYYY-MM-DD"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="住院天数" prop="hospitalDays" class="row-item">
<div class="input-with-unit">
<el-input v-model="formData.hospitalDays" type="number" placeholder="请输入" />
</div>
</el-form-item>
</div>
</el-form-item>
<h4 class="section-title">诊断</h4>
<!-- 3. 出院诊断必填 -->
<el-form-item label="出院诊断" prop="DischargeDiagnosis" class="required form-item-single">
<el-input
v-model="formData.DischargeDiagnosis"
type="textarea"
placeholder="请输入出院诊断"
:rows="4"
style="resize: none; padding-right: 10px"
/>
</el-form-item>
<!-- 4. 出院病情摘要及诊疗经过 -->
<el-form-item
label="出院病情摘要及诊疗经过"
prop="SummaryAndDiagnosisAndTreatmentProcess"
class="form-item-single"
>
<el-input
v-model="formData.SummaryAndDiagnosisAndTreatmentProcess"
type="textarea"
placeholder="请输入出院病情摘要及诊疗经过"
:rows="4"
style="resize: none; padding-right: 10px"
/>
</el-form-item>
<el-form-item
label="出院后要求及注意事项"
prop="RequirementsAndPrecautionsAfterDischarge"
class="form-item-single"
>
<el-input
v-model="formData.RequirementsAndPrecautionsAfterDischarge"
type="textarea"
placeholder="请输入出院后要求及注意事项"
:rows="4"
style="resize: none; padding-right: 10px"
/>
</el-form-item>
<el-form-item
label="中医调护"
prop="TraditionalChineseMedicineNursing"
class="form-item-single"
>
<el-input
v-model="formData.TraditionalChineseMedicineNursing"
type="textarea"
placeholder="请输入中医调护"
:rows="4"
style="resize: none; padding-right: 10px"
/>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script setup>
import { reactive, ref, onMounted, watch } from 'vue';
import { ElMessage } from 'element-plus';
import { patientInfo } from '../views/doctorstation/components/store/patient';
defineOptions({
name: 'DischargeDiagnosisCertificate',
});
// Props与事件
const props = defineProps({
patientInfo: {
type: Object,
required: true,
},
});
const patient = props.patientInfo;
// const props = defineProps({});
const emits = defineEmits(['submitOk']);
// 数据初始化
// const patient = ref(null);
// 表单数据
const formData = reactive({
patientName: '', // 姓名
age: '', // 年龄
gender: '', // 性别
busNo: '', // 住院号
admissionDate: '', // 入院日期
dischargeDate: '', // 出院日期
hospitalDays: '', // 住院天数
DischargeDiagnosis: '', // 出院诊断
SummaryAndDiagnosisAndTreatmentProcess: '', // 出院病情摘要及诊疗经过
RequirementsAndPrecautionsAfterDischarge: '', // 出院后要求及注意事项
TraditionalChineseMedicineNursing: '', // 中医调护
});
// 表单校验规则
const rules = reactive({
dischargeDiagnosis: [
{
required: true,
message: '请填写出院诊断',
trigger: ['blur', 'submit'],
},
],
});
// 提交函数
const submit = () => {
emits('submitOk', formData);
};
// 表单数据赋值
const setFormData = (data) => {
if (data) {
Object.assign(formData, data);
}
};
// 生命周期
onMounted(() => {
// patient.value = patientInfo.value;
// 组件挂载时自动填充患者信息
// fillPatientInfo(patientInfo.value);
if (!formData.patientName) {
formData.patientName = patient?.patientName || '';
}
if (!formData.gender) {
formData.gender = patient?.genderEnum_enumText || '';
}
if (!formData.age) {
formData.age = patient?.age || '';
}
if (!formData.department) {
formData.department = patient?.inHospitalOrgName || '';
}
if (!formData.bedNo) {
formData.bedNo = patient?.houseName + '-' + patient?.bedName;
}
if (!formData.busNo) {
formData.busNo = patient?.busNo || '';
}
if (!formData.admissionDate) {
formData.admissionDate = patient?.inHospitalTime || '';
}
});
// 监听患者信息变化,实现联动显示和自动填充
// watch(
// () => patientInfo.value,
// (newPatientInfo) => {
// patient.value = newPatientInfo;
// // 患者信息变化时自动填充
// fillPatientInfo(newPatientInfo);
// },
// { deep: true }
// );
// 自动填充患者信息到表单
const fillPatientInfo = (patientData) => {
if (!patientData) {
ElMessage.warning('未获取到患者信息,请确保已选择患者');
return;
}
try {
// 填充基本信息,处理可能的数据缺失情况
formData.patientName = patientData.patientName || '';
formData.age = patientData.age || '';
formData.gender = patientData.genderEnum_enumText || '';
formData.busNo = patientData.busNo || '';
} catch (error) {
console.error('填充患者信息时发生错误:', error);
ElMessage.error('自动填充患者信息失败,请检查数据源格式');
}
};
// 暴露接口
defineExpose({ formData, submit, setFormData, fillPatientInfo });
</script>
<style scoped>
/* 表单外层容器 */
.medical-form {
max-width: 1200px;
width: 100%;
min-height: 800px;
height: auto;
margin: 15px auto;
padding: 15px;
border: 1px solid #ddd;
border-radius: 8px;
font-family: Arial, sans-serif;
box-sizing: border-box;
overflow: hidden; /* 防止内部内容溢出 */
position: relative;
}
/* 顶部姓名样式 */
.patient-name {
display: inline-block;
margin-bottom: 15px;
font-size: 14px;
color: #333;
font-weight: 500;
}
/* 滚动内容容器 */
.form-scroll-container {
width: 100%;
max-height: 55vh;
overflow-y: auto;
overflow-x: hidden;
scrollbar-width: thin;
scrollbar-color: #ccc #f5f5f5;
position: relative;
}
.form-scroll-container::-webkit-scrollbar {
width: 6px;
}
.form-scroll-container::-webkit-scrollbar-thumb {
background-color: #ccc;
border-radius: 3px;
}
.form-scroll-container::-webkit-scrollbar-track {
background-color: #f5f5f5;
}
/* 完整表单容器 */
.medical-full-form {
width: 100%;
min-width: 0; /* 防止内容强制拉伸容器 */
box-sizing: border-box;
}
/* 区域通用样式 */
.form-section {
margin-bottom: 20px;
}
.section-title {
margin: 0 0 12px;
padding-bottom: 6px;
border-bottom: 1px solid #f0f0f0;
color: #333;
font-size: 16px;
font-weight: bold;
}
/* 通用单行自适应布局(基础信息+病史信息共用) */
.single-row-layout {
display: flex;
flex-wrap: wrap; /* 自动换行 */
align-items: flex-start; /* 顶部对齐,适配文本域高度 */
gap: 15px; /* 统一元素间距 */
width: 100%;
box-sizing: border-box;
}
.row-item {
margin-bottom: 0; /* 取消底部间距,避免换行重叠 */
display: flex;
flex-direction: column;
}
/* 基础信息项:适配短输入框 */
.row-item:not(.history-item) {
min-width: 160px; /* 基础信息项最小宽度 */
}
/* 带单位的输入框样式 */
.input-with-unit {
display: flex;
align-items: center;
gap: 8px;
width: 100%;
}
.input-with-unit .el-input {
flex: 1;
}
.unit {
font-weight: 500;
color: #333;
white-space: nowrap;
font-size: 14px;
}
/* 单行表单项样式(主诉、查体等) */
.form-item-single {
margin: 18px 0;
}
/* 必填项红色星号 */
.required .el-form-item__label::before {
content: '* ';
color: #ff4d4f;
}
/* 输入框统一样式 */
.el-form-item .el-input,
.el-form-item .el-input__wrapper {
width: 100%;
box-sizing: border-box;
}
.el-form-item .el-input__inner {
font-size: 14px;
padding: 8px 12px;
}
/* 确保textarea的rows属性生效 */
.el-textarea__inner {
min-height: auto !important;
height: auto !important;
resize: none;
}
/* 根据rows属性设置高度 */
.el-input--textarea {
height: auto;
}
/* 响应式调整 */
@media (max-width: 768px) {
.medical-form {
height: 80vh;
padding: 10px;
overflow: hidden;
}
.form-scroll-container {
height: calc(100% - 35px);
max-height: none;
}
.el-form {
label-width: 70px !important;
}
.row-item:not(.history-item) {
min-width: 130px;
}
.history-item {
min-width: 100%; /* 移动端病史信息全屏宽度,单行显示 */
}
.form-item-single,
.form-section {
margin-bottom: 15px;
}
}
</style>

View File

@@ -1,7 +1,7 @@
<template>
<div>
<div class="business">
<el-table
<!-- <el-table
:data="tableDataSource"
border
stripe
@@ -30,11 +30,11 @@
@click="handleDelete(scope.row)"
:disabled="admissionDataForm !== undefined"
>
删除
删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-table> -->
<div name="跌倒/坠床评估护理记录单" class="changeMajor" style="width: 99.9%">
<div>
@@ -202,9 +202,17 @@ defineOptions({
});
import { ref, reactive, computed, onMounted } from 'vue';
import { ElMessage } from 'element-plus';
import { useRoute, useRouter } from 'vue-router';
import { patientInfo } from '../views/doctorstation/components/store/patient';
// import { webapp_ws_ajax_run, urlAddRandomNo } from '@/utils/grwebapp';
// import { useRoute, useRouter } from 'vue-router';
// 定义props和emits
const props = defineProps({
patientInfo: {
type: Object,
default: () => ({}),
},
});
const emits = defineEmits(['submitOk']);
// 响应式数据
const route = useRoute();
@@ -515,29 +523,48 @@ const onSubmit = async () => {
if (isFormEmpty.value) {
ElMessage.error('请填写跌倒/坠床评估护理记录单后再进行操作');
} else {
form.totalScore = totalScore.value;
return;
}
// 模拟保存数据不再调用后端API
console.log('保存的数据:', form);
// 表单验证通过,收集数据
form.totalScore = totalScore.value;
try {
// 准备保存的数据
const saveData = {
...form,
// 添加患者相关信息
patientId: patientId.value,
visitId: visitId.value,
wardCode: wardCode.value,
// 确保选中项数组存在
bedFallRiskAssessmentList: form.bedFallRiskAssessmentList || [],
patientCareSessionsCheckedList: form.patientCareSessionsCheckedList || [],
};
// 提交表单数据
console.log('提交保存的数据:', saveData);
emits('submitOk', saveData);
// 更新本地数据
if (updateFlag.value) {
// 模拟更新操作
// 更新操作
const updatedIndex = tableDataSource.value.findIndex((item) => item.id === updateId.value);
if (updatedIndex !== -1) {
tableDataSource.value[updatedIndex].content = { ...form };
}
ElMessage.success('模拟更新成功');
ElMessage.success('更新成功');
} else {
// 模拟新增操作
// 新增操作
const newRecord = {
id: Date.now().toString(),
content: { ...form },
};
tableDataSource.value.unshift(newRecord);
ElMessage.success('模拟新增成功');
ElMessage.success('保存成功');
}
// 处理返回逻辑
if (admissionDataForm.value !== undefined) {
const admissionDataBack = JSON.parse(admissionDataForm.value);
admissionDataBack.project2 = totalScore.value;
@@ -558,7 +585,11 @@ const onSubmit = async () => {
}
}
// 重置表单
reset();
} catch (error) {
console.error('保存失败:', error);
ElMessage.error('保存失败,请重试');
}
};
@@ -815,7 +846,13 @@ onMounted(() => {
wardCode.value = window.localStorage.getItem('wardInfo') || '';
admissionDataForm.value = route.params.admissionData;
// 自动初始化表格数据不再依赖患者ID参数
// 获取患者信息
if (patientInfo.value) {
patientId.value = patientInfo.value.patientId || '';
visitId.value = patientInfo.value.visitId || '';
}
// 自动初始化表格数据
// 延迟执行,确保所有数据都已初始化
setTimeout(() => {
init();
@@ -828,6 +865,9 @@ onMounted(() => {
}, 100);
}
});
// 暴露接口
defineExpose({ form, submit: onSubmit, reset });
</script>
<style scoped>
@@ -835,7 +875,7 @@ onMounted(() => {
background: white;
border-radius: 5px;
padding: 10px 16px;
height: calc(100vh - var(--barHeight) * 1px - 50px);
height: calc(100vh - 250px);
overflow: auto;
display: grid;
grid-row-gap: 16px;

View File

@@ -2,13 +2,23 @@
<div class="hospital-record-form">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="病案首页(一)" name="first">
<medicalRecordFirst :formData="formData"></medicalRecordFirst>
<medicalRecordFirst
ref="firstRef"
:formData="formData"
@onCaseFirst="updateCaseFirstDatas"
></medicalRecordFirst>
</el-tab-pane>
<el-tab-pane label="病案首页(二)" name="second">
<medicalRecordSecond :formData="formData"></medicalRecordSecond>
<medicalRecordSecond
:formData="formData"
@onCaseSecond="updateCaseFirstDatas"
></medicalRecordSecond>
</el-tab-pane>
<el-tab-pane label="病案附页(一)" name="third">
<medicalRecordThird :formData="formData"></medicalRecordThird>
<medicalRecordThird
:formData="formData"
@onCaseThird="updateCaseFirstDatas"
></medicalRecordThird>
</el-tab-pane>
</el-tabs>
@@ -24,6 +34,7 @@ defineOptions({
name: 'HospitalRecordForm',
});
import { ref, reactive } from 'vue';
import { ElMessage } from 'element-plus';
// import medicalRecordFirst from './components/medicalRecordFirst.vue';
import medicalRecordFirst from '@/views/hospitalRecord/components/medicalRecordFirst.vue';
import medicalRecordSecond from '@/views/hospitalRecord/components/medicalRecordSecond.vue';
@@ -31,66 +42,266 @@ import medicalRecordThird from '@/views/hospitalRecord/components/medicalRecordT
import medicalRecordFirstPrint from '@/views/hospitalRecord/components/medicalRecordFirstPrint.json';
import medicalRecordSecondPrint from '@/views/hospitalRecord/components/medicalRecordSecondPrint.json';
import medicalRecordThirdPrint from '@/views/hospitalRecord/components/medicalRecordThirdPrint.json';
import formDataJs from '../views/doctorstation/components/store/medicalpage';
import { cloneDeep } from 'lodash';
const firstRef = ref();
const commpoentType = 'medicalRecord';
const emit = defineEmits(['submitOk']);
// 表单数据
const formData = reactive({
hospital: {
orgCode: '41275054-7',
paymentMethod: '城乡居民基本医疗保险'
//医院信息
hospitalInfo: {
//组织机构代码
orgCode: '41275054-700000',
//医疗付款方式
medicalPaymentCode: '',
},
patient: {
//患者信息
patientInfo: {
// 健康卡号
healthCardNo: '',
name: '',
// 患者姓名
patientName: '',
// 患者性别
gender: '',
// 出生日期
birthDate: '',
// 年龄
age: '',
// 国籍
nationality: '中国',
// 籍贯
nativePlace: '',
// 民族
ethnicity: '汉族',
// 身份证号
idCardNo: '',
// 户口住址
householdAddress: '',
workUnit: '',
// 工作单位地址
workUnitAddress: '',
// 联系人姓名
contactName: '',
// 关系
contactRelation: '',
// 联系人地址
contactAddress: '',
contactPhone: ''
// 联系人电话
contactPhone: '',
},
// 住院信息
admission: {
// 第几次住院
times: 1,
// 住院号
hospitalNo: '',
recordNo: '',
channel: '',
// 病案号
medicalRecordNo: '',
// 入院途径
admissionRoute: '',
// 入院时间
admitTime: '',
// 入院科室
department: '',
// 病房
ward: '',
// 确诊日期
confirmDate: '',
// 出院时间
dischargeTime: '',
// 出院科室
dischargeDepartment: '',
// 病房
dischargeWard: '',
hospitalDays: ''
// 实际住院天数
hospitalDays: '',
},
// 诊断信息
diagnosis: {
// 主要诊断
mainDiagnosis: '',
otherDiagnosis: ''
// 其他诊断
otherDiagnosis: '',
},
// 医疗信息
medicalInfo: {
// 是否输血
bloodTransfusion: '2',
// 血型
bloodType: '',
// rh类型
rhType: '',
drugAllergy: '1'
// 药物过敏史
drugAllergy: '1',
},
// 医师信息
doctorInfo: {
// 科主任
departmentDirector: '',
// 副主任
chiefPhysician: '',
// 主治医师
attendingPhysician: '',
// 住院医师
residentPhysician: '',
// 责任护士
chargeNurse: '',
// 住院总医师
chiefResident: '',
// 实习医师
intern: '',
// 病案质量
recordQuality: '1',
// 编码员
coder: '',
qualityControlDate: ''
}
// 控制日期
qualityControlDate: '',
},
// 病案首页2
medicalSecond: {
// 手术方式
surgeryType: '',
// 离院方式
leaveType: '',
// 是否计划出院
isPlan: '',
// 目的
purpose: '',
//昏迷时间---入院前
comaDurationTime_before: '',
//昏迷时间---入院后
comaDurationTime_after: '',
// 肿瘤分期
tumorStaging: '',
// T
tumor_T: '',
// N
tumor_N: '',
// M
tumor_M: '',
// 判断依据
judgmentBase: '',
// 分化程度
degreeDifferentiation: '',
// 临床路径
enterPath: '',
// 变异
mutation: '',
// 退出路径
outPath: '',
// 特级护理
nursingLevel_spec: '',
// 1级护理
nursingLevel_1: '',
// 2级护理
nursingLevel_2: '',
// 3级护理
nursingLevel_3: '',
// 呼吸机使用
ventilatorUse: '',
// 有创呼吸机使用小时
ventilatorUseTime: '',
// 手术表
tableData_top: [],
},
// 病案首页3
// 住院费用
hospitalization: {
// 总费用
hosCharges: '',
// 自付金额
hosCharges_self: '',
},
// 综合医疗服务类
medicalServices: {
// 一般医疗服务类
medicalServices_1: '',
// 一般治疗操作费
medicalServices_2: '',
// 护理费
medicalServices_3: '',
// 其他费用
medicalServices_4: '',
},
// 诊断类
diagnosisClass: {
// 病理诊断
diagnosis_5: '',
// 实验室诊断
diagnosis_6: '',
// 影像学诊断
diagnosis_7: '',
// 临床诊断
diagnosis_8: '',
},
// 治疗类
treatmentClass: {
// 非手术治疗项目费
treatment_9: '',
// 临床物理治疗
treatment_9_1: '',
// 手术治疗费
treatment_10: '',
// 麻醉费
treatment_10_1: '',
// 手术费
treatment_10_2: '',
},
// 康复类
recoveryClass: {
// 康复费
recovery_11: '',
},
// 中医类
TCMClass: {
// 中医治疗费
TCM_12: '',
},
// 西药类
WesternClass: {
// 西药费
Western_13: '',
// 抗菌药物费
Western_13_1: '',
},
// 中药类
chineseClass: {
//中成药
chinese_14: '',
// 中草药
chinese_15: '',
},
// 血液和血液制品类
bloodClass: {
// 血费
blood_16: '',
// 蛋白类制品费
blood_17: '',
// 球蛋白制品费
blood_18: '',
// 凝血因子制品费
blood_19: '',
// 细胞因子制品费
blood_20: '',
},
// 耗材类
consumablesClass: {
// 检查用一次性医用材料费
consumables_21: '',
// 治疗用一次性医用材料费
consumables_22: '',
// 手术用一次性医用材料费
consumables_23: '',
},
// 其他类
otherClass: {
// 其他费用
other_24: '',
},
// 其他诊断及手术附加页
tableData_sub: [],
// 手术操作数组
tableData_top: [],
});
const activeName = ref('first');
@@ -99,13 +310,13 @@ const activeName = ref('first');
const printForm = () => {
// 创建一个新的打印窗口
const printWindow = window.open('', '_blank');
let printContent
let printContent;
// 获取模板字符串并替换转义的插值标记
if(activeName.value == 'first') {
if (activeName.value == 'first') {
printContent = medicalRecordFirstPrint.printContent;
}else if(activeName.value == 'second') {
} else if (activeName.value == 'second') {
printContent = medicalRecordSecondPrint.printContent;
}else {
} else {
printContent = medicalRecordThirdPrint.printContent;
}
// 这里可以进行实际的数据替换操作
@@ -116,34 +327,266 @@ const printForm = () => {
// 将内容写入打印窗口并打印
printWindow.document.write(printContent);
printWindow.document.close();
}
};
function handleClick() {
console.log('112313413');
}
// 重置表单
const resetForm = () => {
Object.keys(formData).forEach(key => {
if (typeof formData[key] === 'object') {
Object.keys(formData[key]).forEach(subKey => {
formData[key][subKey] = '';
});
const resetFun = (data) => {
Object.keys(data).forEach((key) => {
if (data[key] instanceof Array) {
data[key].length = 0;
} else {
formData[key] = '';
data[key] = '';
}
});
// 重置默认值
formData.hospital.orgCode = '41275054-7';
formData.hospital.paymentMethod = '城乡居民基本医疗保险';
formData.patient.nationality = '中国';
formData.patient.ethnicity = '汉族';
formData.admission.times = 1;
formData.medicalInfo.bloodTransfusion = '2';
formData.medicalInfo.drugAllergy = '1';
formData.doctorInfo.recordQuality = '1';
};
// 重置表单
const resetForm = () => {
if (activeName.value == 'first') {
resetFun(firstRef.value.formData.hospitalInfo);
resetFun(firstRef.value.formData.patientInfo);
resetFun(firstRef.value.formData.admission);
resetFun(firstRef.value.formData.diagnosis);
resetFun(firstRef.value.formData.medicalInfo);
resetFun(firstRef.value.formData.doctorInfo);
} else if (activeName.value == 'second') {
resetFun(firstRef.value.formData.medicalSecond);
} else {
resetFun(firstRef.value.formData.hospitalization);
resetFun(firstRef.value.formData.medicalServices);
resetFun(firstRef.value.formData.diagnosisClass);
resetFun(firstRef.value.formData.treatmentClass);
resetFun(firstRef.value.formData.recoveryClass);
resetFun(firstRef.value.formData.TCMClass);
resetFun(firstRef.value.formData.WesternClass);
resetFun(firstRef.value.formData.chineseClass);
resetFun(firstRef.value.formData.bloodClass);
resetFun(firstRef.value.formData.consumablesClass);
resetFun(firstRef.value.formData.otherClass);
firstRef.value.formData.tableData_sub.length = 0;
firstRef.value.formData.tableData_top.length = 0;
}
};
//自定义事件更新主数据
const updateCaseFirstDatas = (newDatas) => {
Object.assign(formData, newDatas);
};
// 点击历史数据回传布局
const setFormData = (data) => {
Object.assign(firstRef.value.formData, data);
};
//保存数据方法
const submit = () => {
/*
{
"encounterId": "1987758365116919809",
"statusEnum": 5,
"busNo": "ZY202511100001",
"inHospitalTime": "2025-11-10 13:47:08",
"outHospitalTime": null,
"patientId": "1981311362744872962",
"patientName": "王海明",
"genderEnum": 0,
"genderEnum_enumText": "男性",
"birthDate": "1999-06-18 00:00:00",
"age": "26岁",
"wardName": "内科病区1",
"houseName": "内科病房2",
"bedName": "002",
"inOrgTime": "2025-11-10 19:36:28",
"inHospitalDays": 2,
"inHospitalOrgId": "1950367917287616513",
"inHospitalOrgName": "住院内科",
"contractNo": "0000",
"contractName": "自费",
"regDiagnosisName": "感冒",
"accountId": "1987759000528809985"
}
*/
// const isOk = verifyMethod(formDataJs);
if (1) {
const cloneParams = cloneDeep(formDataJs);
// 病例二表
const medicalSecondTable = cloneParams.medicalSecond.surgery_tableData.filter((obj) => {
return obj.isChoose;
});
// 病例三表第一张表
const other_tableData = cloneParams.other_tableData.filter((obj) => {
return obj.isChoose;
});
// 病例三表第二张表
const surgery_tableData = cloneParams.surgery_tableData.filter((obj) => {
return obj.isChoose;
});
// 数据整理
let params = {
...cloneParams,
other_tableData,
surgery_tableData,
};
params.medicalSecond.surgery_tableData = medicalSecondTable;
console.log('cloneParams========>', JSON.stringify(params));
emit('submitOk', params);
}
};
// 公共校验方法
const verifyMethod = (data) => {
let message = '';
if (!data) return false;
if (!data.hospitalInfo.orgCode) {
message = '请填写组织机构代码';
} else if (!data.hospitalInfo.medicalPaymentCode) {
message = '请选择医疗付费方式';
} else if (!data.patientInfo.healthCardNo) {
message = '请填写健康卡号';
} else if (!data.patientInfo.patientName) {
message = '请填患者姓名';
} else if (!data.patientInfo.gender) {
message = '请选择患者性别';
} else if (!data.patientInfo.birthDate) {
message = '请选择出生日期';
} else if (!data.patientInfo.age) {
message = '请填写患者年龄';
} else if (!data.patientInfo.nationality) {
message = '请填写国籍';
} else if (!data.patientInfo.nativePlace) {
message = '请填写籍贯';
} else if (!data.patientInfo.ethnicity) {
message = '请填写民族';
} else if (!data.patientInfo.idCardNo) {
message = '请填写身份证号';
} else if (!data.patientInfo.householdAddress) {
message = '请填写户口地址';
} else if (!data.patientInfo.workUnitAddress) {
message = '请填写工作单位及地址';
} else if (!data.patientInfo.contactName) {
message = '请填写联系人姓名';
} else if (!data.patientInfo.contactRelation) {
message = '请填写与联系人关系';
} else if (!data.patientInfo.contactAddress) {
message = '请填写地址';
} else if (!data.patientInfo.contactPhone) {
message = '请填写电话';
} else if (!data.admission.times) {
message = '请填写第几次住院';
} else if (!data.admission.hospitalNo) {
message = '请填写住院号';
} else if (!data.admission.medicalRecordNo) {
message = '请填写病案号';
} else if (!data.admission.admissionRoute) {
message = '请填写入院途径';
} else if (!data.admission.admitTime) {
message = '请填写入院时间';
} else if (!data.admission.department) {
message = '请填写入院科室';
} else if (!data.admission.ward) {
message = '请填写病房';
} else if (!data.admission.confirmDate) {
message = '请填写确诊日期';
} else if (!data.admission.dischargeTime) {
message = '请填写出院时间';
} else if (!data.admission.dischargeDepartment) {
message = '请填写出院科室';
} else if (!data.admission.dischargeWard) {
message = '请填写病房';
} else if (!data.admission.hospitalDays) {
message = '请填写实际住院天数';
} else if (!data.diagnosis.mainDiagnosis) {
message = '请填写主要诊断';
} else if (!data.diagnosis.otherDiagnosis) {
message = '请填写其他诊断';
} else if (!data.medicalInfo.bloodTransfusion) {
message = '请选择是否输血';
} else if (!data.medicalInfo.bloodType) {
message = '请选择血型';
} else if (!data.medicalInfo.rhType) {
message = '请选择rh类型';
} else if (!data.medicalInfo.drugAllergy) {
message = '请选择药物过敏史';
} else if (!data.doctorInfo.departmentDirector) {
message = '请填写科主任';
} else if (!data.doctorInfo.chiefPhysician) {
message = '请填写主任(副主任)医师';
} else if (!data.doctorInfo.attendingPhysician) {
message = '请填写主治医师';
} else if (!data.doctorInfo.residentPhysician) {
message = '请填写住院医师';
} else if (!data.doctorInfo.chargeNurse) {
message = '请填写责任护士';
} else if (!data.doctorInfo.chiefResident) {
message = '请填写住院总医师';
} else if (!data.doctorInfo.intern) {
message = '请填写实习医师';
} else if (!data.doctorInfo.recordQuality) {
message = '请填写病案质量';
} else if (!data.doctorInfo.coder) {
message = '请填写编码员';
} else if (!data.doctorInfo.qualityControlDate) {
message = '请选择质控日期';
} else if (!data.medicalSecond.tableData_top) {
message = '请添加手术操作表';
} else if (!data.medicalSecond.surgeryType) {
message = '请填写手术方式';
} else if (!data.medicalSecond.leaveType) {
message = '请选择离院方式';
} else if (!data.medicalSecond.isPlan) {
message = '请选择是否有出院31天内再住院计划';
} else if (!data.medicalSecond.purpose) {
message = '请填写目的';
} else if (!data.medicalSecond.comaDurationTime_before) {
message = '请选择颅脑损伤患者昏迷时间-入院前';
} else if (!data.medicalSecond.comaDurationTime_after) {
message = '请选择颅脑损伤患者昏迷时间-入院后';
} else if (!data.medicalSecond.tumorStaging) {
message = '请填写肿瘤分期';
} else if (!data.medicalSecond.tumor_T) {
message = '请填写T';
} else if (!data.medicalSecond.tumor_N) {
message = '请填写N';
} else if (!data.medicalSecond.tumor_M) {
message = '请填写M';
} else if (!data.medicalSecond.judgmentBase) {
message = '请填写判断依据';
} else if (!data.medicalSecond.degreeDifferentiation) {
message = '请选择分化程度';
} else if (!data.medicalSecond.enterPath) {
message = '请填写临床路径-进入路径';
} else if (!data.medicalSecond.mutation) {
message = '请选择是否变异';
} else if (!data.medicalSecond.outPath) {
message = '请选择退出路径';
} else if (!data.medicalSecond.nursingLevel_spec) {
message = '请填写特级护理';
} else if (!data.medicalSecond.nursingLevel_1) {
message = '请填写1级护理';
} else if (!data.medicalSecond.nursingLevel_2) {
message = '请填写2级护理';
} else if (!data.medicalSecond.nursingLevel_3) {
message = '请填写3级护理';
} else if (!data.medicalSecond.ventilatorUse) {
message = '请选择是否使用呼吸机使用';
} else if (!data.medicalSecond.ventilatorUseTime) {
message = '请填写有创呼吸机使用时间(小时)';
}
if (message.length > 0) {
ElMessage({
message,
type: 'error',
});
return false;
}
return true;
};
defineExpose({
submit,
commpoentType,
setFormData,
});
</script>
<style scoped>
@@ -213,7 +656,9 @@ label {
font-size: 14px;
}
input, select, textarea {
input,
select,
textarea {
width: 100%;
padding: 8px;
border: 1px solid #ccc;
@@ -234,7 +679,8 @@ textarea {
margin-top: 30px;
}
.print-btn, .reset-btn {
.print-btn,
.reset-btn {
padding: 10px 20px;
margin: 0 10px;
border: none;
@@ -244,7 +690,7 @@ textarea {
}
.print-btn {
background-color: #4CAF50;
background-color: #4caf50;
color: white;
}
@@ -275,4 +721,4 @@ textarea {
margin: 2cm;
}
}
</style>
</style>

View File

@@ -0,0 +1,393 @@
<script lang="ts" setup>
import { ref } from 'vue';
// 1. 基础信息(复用已有变量,补充一致性格式)
const patientInfo = ref({
name: '',
department: '',
bed: '',
inpatientNo: '',
});
defineOptions({
name: 'ProgressNoteform',
});
// 2. 首次病程记录(复用已有变量,补充文本格式)
const firstRecordTime = ref('');
const firstRecordIntro = ref(
''
);
const caseFeatures =
ref('');
const chinaDiscussion = ref('');
const westDiscussion = ref('');
const preliminaryDiagnosis = ref('');
const treatmentPlan = ref(''); // 添加缺失的变量
// 3. 后续查房/会诊记录新增还原PDF所有章节
const roundRecords = ref([
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '主治医师签名:' }, // 区分普通医师和主治医师签名
},
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '副主任医师签名:' },
},
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '' },
},
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '' },
},
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '' },
},
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '' },
},
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '' },
},
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '' },
},
]);
// 4. 签名变量(支持所有记录的签名输入)
interface Signatures {
firstDoctor: string;
[key: string]: string;
}
const signatures = ref<Signatures>({
firstDoctor: '', // 首次病程记录医师签名
...roundRecords.value.reduce((acc, record, index) => {
acc[`round${index}Doctor`] = '';
acc[`round${index}Physician`] = '';
return acc;
}, {} as Record<string, string>),
});
// 5. 打印功能:控制打印范围+样式
const handlePrint = () => {
// 1. 触发浏览器打印
window.print();
};
// 暴露接口
defineExpose({ patientInfo, firstRecordTime, firstRecordIntro, caseFeatures, chinaDiscussion, westDiscussion, preliminaryDiagnosis, treatmentPlan, roundRecords, signatures });
</script>
<template>
<div class="medical-record-container">
<!-- 打印按钮固定在顶部非打印内容 -->
<div class="print-btn-container no-print">
<el-button type="primary" @click="handlePrint">打印病历</el-button>
</div>
<!-- 病历主体打印核心内容 -->
<div class="medical-record">
<!-- 1. 医院头部每一页PDF均包含复用已有样式 -->
<div class="hospital-header">
<img src="./imgs/logo.png" alt="长春市朝阳区中医院Logo" class="header-logo" />
<h1 class="hospital-name">长春市朝阳区中医院</h1>
</div>
<!-- 2. 患者信息栏每一页PDF均包含下划线样式 -->
<div class="patient-info">
<span class="info-item">姓名:{{ patientInfo.name }}</span>
<span class="info-item">科室:{{ patientInfo.department }}</span>
<span class="info-item">床号:{{ patientInfo.bed }}</span>
<span class="info-item">住院号:{{ patientInfo.inpatientNo }}</span>
</div>
<!-- 3. 首次病程记录 -->
<div class="record-section">
<h2 class="section-main-title"> </h2>
<div class="record-time">{{ firstRecordTime }}</div>
<el-input v-model="firstRecordIntro" autosize type="textarea" class="clean-textarea" />
<!-- 病例特点 -->
<h3 class="section-sub-title">病例特点</h3>
<el-input v-model="caseFeatures" autosize type="textarea" class="clean-textarea" />
<!-- 拟诊讨论 -->
<h3 class="section-sub-title">拟诊讨论</h3>
<el-input v-model="chinaDiscussion" autosize type="textarea" class="clean-textarea" />
<el-input v-model="westDiscussion" autosize type="textarea" class="clean-textarea" />
<!-- 初步诊断 -->
<el-input v-model="preliminaryDiagnosis" autosize type="textarea" class="clean-textarea" />
<!-- 诊疗计划 -->
<el-input v-model="treatmentPlan" autosize type="textarea" class="clean-textarea" />
<!-- 首次病程记录签名 -->
<div class="signature-group">
<span class="signature-label">医师签名:</span>
<el-input v-model="signatures.firstDoctor" autosize type="textarea" class="clean-textarea signature-input"
:rows="1" />
</div>
</div>
<!-- 4. 分页分隔线模拟PDF分页打印时自动分页 -->
<div class="page-break"></div>
<!-- 5. 后续查房/会诊记录按时间顺序 -->
<div v-for="(record, index) in roundRecords" :key="index" class="record-section">
<!-- 重复患者信息与PDF一致 -->
<div class="patient-info page-repeated-info">
<span class="info-item">姓名:{{ patientInfo.name }}</span>
<span class="info-item">科室:{{ patientInfo.department }}</span>
<span class="info-item">床号:{{ patientInfo.bed }}</span>
<span class="info-item">住院号:{{ patientInfo.inpatientNo }}</span>
</div>
<!-- 查房标题+时间 -->
<h2 class="section-main-title">{{ record.title }}</h2>
<div class="record-time">{{ record.time }}</div>
<!-- 查房内容 -->
<el-input v-model="record.content" autosize type="textarea" class="clean-textarea" />
<!-- 查房签名区分普通医师/上级医师 -->
<div class="signature-group">
<span class="signature-label">医师签名:</span>
<el-input v-model="signatures[`round${index}Doctor`]" autosize type="textarea"
class="clean-textarea signature-input" :rows="1" />
<span v-if="record.signature.physician" class="signature-label ml-20">
{{ record.signature.physician }}
</span>
<el-input v-if="record.signature.physician" v-model="signatures[`round${index}Physician`]" autosize
type="textarea" class="clean-textarea signature-input" :rows="1" />
</div>
<!-- 分页分隔线最后一条记录无需分页 -->
<div v-if="index !== roundRecords.length - 1" class="page-break"></div>
</div>
</div>
</div>
</template>
<style scoped>
/* 1. 容器基础样式 */
.medical-record-container {
padding: 20px;
background-color: #f9f9f9;
}
.print-btn-container {
margin-bottom: 20px;
text-align: right;
}
/* 2. 病历主体样式模拟A4纸 */
.medical-record {
max-width: 210mm;
/* A4宽度 */
min-height: 297mm;
/* A4高度 */
margin: 0 auto;
padding: 20mm;
/* A4页边距 */
background-color: #fff;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
font-family: 'SimSun', '宋体', serif;
/* 病历标准字体 */
}
/* 3. 医院头部样式 */
.hospital-header {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 15px;
}
.header-logo {
width: 60px;
height: 60px;
margin-right: 15px;
}
.hospital-name {
font-size: 24px;
font-weight: bold;
color: #000;
margin: 0;
}
/* 4. 患者信息样式 */
.patient-info {
border-bottom: 1px solid #000;
padding: 5px 0;
margin-bottom: 15px;
font-size: 16px;
line-height: 1.5;
}
.info-item {
margin-right: 30px;
white-space: nowrap;
}
/* 5. 记录章节样式 */
.record-section {
margin-bottom: 30px;
}
.section-main-title {
text-align: center;
font-size: 22px;
font-weight: bold;
margin: 15px 0;
}
.section-sub-title {
font-size: 18px;
font-weight: bold;
margin: 10px 0;
}
.record-time {
font-size: 14px;
margin-bottom: 15px;
color: #666;
}
/* 6. 签名区域样式 */
.signature-group {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 20px;
gap: 10px;
flex-wrap: wrap;
width: 100%;
}
.signature-label {
font-size: 16px;
font-weight: bold;
white-space: nowrap;
}
.signature-input {
width: 200px;
flex-shrink: 0;
}
.ml-20 {
margin-left: 20px;
}
/* 7. 分页分隔线模拟PDF分页 */
.page-break {
height: 1px;
background-color: #eee;
margin: 30px 0;
page-break-after: always;
/* 打印时强制分页 */
}
/* 8. 重复信息样式(后续页面的患者信息) */
.page-repeated-info {
margin-top: 20px;
}
/* 9. 清洁输入框样式(复用已有,确保无边框) */
:deep(.clean-textarea .el-textarea__wrapper) {
background-color: transparent;
padding: 0;
border: none;
}
:deep(.clean-textarea .el-textarea__inner) {
border: none;
background-color: transparent;
padding: 0;
resize: none;
word-break: break-word;
white-space: pre-wrap;
overflow-wrap: break-word;
font-family: inherit;
font-size: 16px;
line-height: 1.8;
/* 病历标准行高 */
color: #000;
}
:deep(.clean-textarea .el-textarea__inner:focus) {
outline: none;
box-shadow: none;
}
/* 10. 打印专属样式:控制打印效果 */
@media print {
/* 隐藏非打印内容(如打印按钮) */
.no-print {
display: none !important;
}
/* 强制A4尺寸+无边距 */
@page {
size: A4;
margin: 15mm;
/* 打印页边距匹配PDF */
}
/* 确保背景色打印(部分浏览器默认不打印背景) */
body {
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
background-color: #fff;
}
/* 病历主体无边框阴影,仅打印内容 */
.medical-record {
box-shadow: none;
padding: 0;
margin: 0;
}
/* 文本不换行优化 */
.info-item {
margin-right: 20px;
}
/* 确保输入框内容正常打印 */
:deep(.el-textarea__inner) {
border: none !important;
}
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,351 @@
<template>
<div class="assessment-page">
<div class="page-container">
<!-- 医院头部 -->
<div class="hospital-header">
<h1 class="hospital-name">
<span class="hospital-text">长春市朝阳区中医院</span>
</h1>
</div>
<!-- 页面标题 -->
<h2 class="form-title">住院病人风险评估表</h2>
<!-- 表单卡片 -->
<el-card class="form-card">
<el-form :model="formData" label-width="100px">
<!-- 第一行科室床号住院号 -->
<el-row :gutter="16">
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="科室">
<el-input
v-model="formData.department"
readonly="true"
type="textarea"
:autosize="{ minRows: 1 }"
class="auto-resize-input"
></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="床号">
<el-input
v-model="formData.bedNo"
readonly="true"
type="textarea"
:autosize="{ minRows: 1 }"
class="auto-resize-input"
></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="住院号">
<el-input
v-model="formData.busNo"
readonly="true"
type="textarea"
:autosize="{ minRows: 1 }"
class="auto-resize-input"
></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 第二行姓名性别年龄 -->
<el-row :gutter="16">
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="姓名">
<el-input
v-model="formData.patientName"
readonly="true"
type="textarea"
:autosize="{ minRows: 1 }"
class="auto-resize-input"
></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="性别">
<el-input
v-model="formData.gender"
readonly="true"
type="textarea"
:autosize="{ minRows: 1 }"
class="auto-resize-input"
></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="年龄">
<el-input
v-model="formData.age"
readonly="true"
type="textarea"
:autosize="{ minRows: 1 }"
class="auto-resize-input"
></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 病情简介 -->
<el-form-item label="病情简介">
<el-input
type="textarea"
v-model="formData.adm_cond"
:autosize="{ minRows: 4, maxRows: 10 }"
class="full-width-textarea"
></el-input>
</el-form-item>
<!-- 不良后果及预后 -->
<el-form-item label="可能发生的不良后果及预后">
<el-input
type="textarea"
v-model="formData.effectless"
:autosize="{ minRows: 1, maxRows: 5 }"
class="full-width-textarea"
></el-input>
</el-form-item>
<!-- 评估等级 -->
<el-form-item label="评估等级">
<el-radio-group v-model="formData.evalLevel">
<el-radio label="一般">一般</el-radio>
<el-radio label="病重">病重</el-radio>
<el-radio label="病危">病危</el-radio>
</el-radio-group>
</el-form-item>
<!-- 护理等级 -->
<el-form-item label="护理等级">
<el-radio-group v-model="formData.nurseLevel">
<el-radio label="特级护理">特级护理</el-radio>
<el-radio label="一级护理">一级护理</el-radio>
<el-radio label="二级护理">二级护理</el-radio>
<el-radio label="三级护理">三级护理</el-radio>
</el-radio-group>
</el-form-item>
<!-- 收集资料时间 -->
<el-form-item label="收集资料时间">
<span class="date-display">{{ currentDate }}</span>
</el-form-item>
<!-- 医师签名 -->
<el-row :gutter="16">
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="评估医师签名">
<el-input
v-model="formData.sign_doc"
type="textarea"
:autosize="{ minRows: 1 }"
class="auto-resize-input"
></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="主治医师签名">
<el-input
v-model="formData.sign_maindoc"
type="textarea"
:autosize="{ minRows: 1 }"
class="auto-resize-input"
></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="科主任签名">
<el-input
v-model="formData.sign_leader"
type="textarea"
:autosize="{ minRows: 1 }"
class="auto-resize-input"
></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</div>
</div>
</template>
<script setup>
import { computed, onMounted, nextTick, reactive, ref } from 'vue';
defineOptions({
name: 'InHospitalCaseForm',
});
const props = defineProps({
patientInfo: {
type: Object,
required: true,
},
});
const patient = props.patientInfo;
// 表单数据 - 修复:将 formData 定义移到 patient 之后
const formData = reactive({
department: patient?.department || '',
bedNo: patient?.bedNo || '',
busNo: patient?.busNo || '',
patientName: patient?.patientName || '',
gender: patient?.sex || '',
age: patient?.age || '',
adm_cond: '',
effectless: '',
evalLevel: '',
nurseLevel: '',
sign_doc: '',
sign_maindoc: '',
sign_leader: '',
});
// 当前日期YYYY-MM-DD
const currentDate = computed(() => {
const d = new Date();
const yyyy = d.getFullYear();
const mm = String(d.getMonth() + 1).padStart(2, '0');
const dd = String(d.getDate()).padStart(2, '0');
return `${yyyy}-${mm}-${dd}`;
});
//表单引用
const formRef = ref(null);
//提交表单
const submit = () => {
// 如果需要表单验证,可以使用以下代码
// formRef.value.validate((valid) => {
// if (valid) {
// emits('submitOk', formData);
// }
// });
// 简化版本:
emits('submitOk', formData);
};
//表单数据赋值
const setFormData = (data) => {
if (data) {
Object.assign(formData, data);
}
};
// 定义 emits
const emits = defineEmits(['submitOk']);
onMounted(() => {
// 页面加载完成后触发一次 resize 事件,确保输入框高度正确
setTimeout(() => {
window.dispatchEvent(new Event('resize'));
}, 100);
});
//暴露接口
defineExpose({ formData, submit, setFormData });
</script>
<style scoped>
/* ===== 页面容器与背景 ===== */
.assessment-page {
font-family: 'Microsoft YaHei', 宋体, sans-serif;
background-color: #f3f4f6;
padding: 1.25rem;
min-height: 100vh;
}
.page-container {
max-width: 48rem;
margin: 0 auto;
background-color: #ffffff;
padding: 1.5rem;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
border-radius: 4px;
}
/* ===== 医院头部 ===== */
.hospital-header {
display: flex;
align-items: center;
justify-content: center;
gap: 1rem;
margin-bottom: 1rem;
}
.hospital-name {
display: inline-flex;
align-items: center;
gap: 0.5rem;
font-size: 1.5rem;
font-weight: 700;
color: #1f2937;
margin: 0;
}
.hospital-text {
line-height: 1;
}
/* ===== 表单标题与操作 ===== */
.form-title {
font-size: 1.25rem;
font-weight: 600;
text-align: center;
margin: 1.25rem 0;
color: #1f2937;
}
/* ===== 表单卡片 ===== */
.form-card {
border: 1px solid #e5e7eb;
border-radius: 4px;
}
:deep(.el-card.form-card) {
box-shadow: none !important;
}
/* ===== 自动调整大小的输入框样式 ===== */
.auto-resize-input {
width: 100%;
}
:deep(.auto-resize-input .el-textarea__inner) {
overflow: hidden;
resize: none;
min-height: 32px !important;
padding: 5px 12px;
}
/* ===== Textarea 自动扩展样式 ===== */
.full-width-textarea {
width: 100%;
}
:deep(.full-width-textarea textarea) {
overflow: hidden;
resize: none;
min-height: auto;
}
/* ===== 日期显示 ===== */
.date-display {
font-size: 0.95rem;
color: #666;
}
/* ===== 响应式调整 ===== */
@media (max-width: 768px) {
.page-container {
padding: 1rem;
}
.hospital-name {
font-size: 1.25rem;
}
}
</style>

View File

@@ -14,7 +14,7 @@
label-width="120px"
label-align="left"
class="doc-content"
style="height: 60vh; overflow: scroll;"
style="height: 60vh; overflow: scroll"
>
<!-- 患者与手术基础信息 -->
<section class="doc-section">
@@ -23,29 +23,29 @@
<el-form-item label="患者姓名" prop="patientName" class="grid-item required">
<el-input v-model="formData.patientName" placeholder="请输入患者姓名" clearable />
</el-form-item>
<el-form-item label="性别" prop="gender" class="grid-item required">
<el-select v-model="formData.gender" placeholder="请选择性别">
<el-option label="男" value="男" />
<el-option label="女" value="女" />
</el-select>
</el-form-item>
<el-form-item label="年龄" prop="age" class="grid-item required">
<div class="input-with-unit">
<el-input v-model.number="formData.age" type="number" placeholder="请输入年龄" />
<el-input v-model.number="formData.age" placeholder="请输入年龄" />
<span class="unit"></span>
</div>
</el-form-item>
<el-form-item label="科室" prop="department" class="grid-item required">
<el-input v-model="formData.department" placeholder="如:普外科" clearable />
</el-form-item>
<el-form-item label="病房/床号" prop="bedNo" class="grid-item required">
<el-input v-model="formData.bedNo" placeholder="如502-03" clearable />
</el-form-item>
<el-form-item label="手术日期/时间" prop="operationDateTime" class="grid-item required">
<el-date-picker
v-model="formData.operationDateTime"
@@ -64,23 +64,23 @@
<el-form-item label="手术者" prop="surgeon" class="grid-item required">
<el-input v-model="formData.surgeon" placeholder="主刀医师姓名" clearable />
</el-form-item>
<el-form-item label="第一助手" prop="firstAssistant" class="grid-item required">
<el-input v-model="formData.firstAssistant" placeholder="第一助手姓名" clearable />
</el-form-item>
<el-form-item label="第二助手" prop="secondAssistant" class="grid-item">
<el-input v-model="formData.secondAssistant" placeholder="第二助手姓名" clearable />
</el-form-item>
<el-form-item label="麻醉医师" prop="anesthesiologist" class="grid-item required">
<el-input v-model="formData.anesthesiologist" placeholder="麻醉医师姓名" clearable />
</el-form-item>
<el-form-item label="巡回护士" prop="circulatingNurse" class="grid-item required">
<el-input v-model="formData.circulatingNurse" placeholder="巡回护士姓名" clearable />
</el-form-item>
<el-form-item label="器械护士" prop="scrubNurse" class="grid-item required">
<el-input v-model="formData.scrubNurse" placeholder="器械护士姓名" clearable />
</el-form-item>
@@ -90,11 +90,15 @@
<!-- 手术详情 -->
<section class="doc-section">
<h2 class="section-title">手术详情</h2>
<el-form-item label="手术名称" prop="operationName" class="full-width-item required">
<el-input v-model="formData.operationName" placeholder="规范手术名称(如:腹腔镜下胆囊切除术)" clearable />
<el-input
v-model="formData.operationName"
placeholder="规范手术名称(如:腹腔镜下胆囊切除术)"
clearable
/>
</el-form-item>
<el-form-item label="手术方式" prop="operationMethod" class="full-width-item required">
<el-select v-model="formData.operationMethod" placeholder="选择手术方式">
<el-option label="开放手术" value="开放手术" />
@@ -102,12 +106,20 @@
<el-option label="介入手术" value="介入手术" />
</el-select>
</el-form-item>
<el-form-item label="手术入路" prop="surgicalApproach" class="full-width-item required">
<el-input v-model="formData.surgicalApproach" placeholder="如:右上腹经腹直肌切口" clearable />
<el-input
v-model="formData.surgicalApproach"
placeholder="如:右上腹经腹直肌切口"
clearable
/>
</el-form-item>
<el-form-item label="术中发现" prop="intraoperativeFindings" class="full-width-item required">
<el-form-item
label="术中发现"
prop="intraoperativeFindings"
class="full-width-item required"
>
<el-input
v-model="formData.intraoperativeFindings"
type="textarea"
@@ -117,7 +129,7 @@
show-word-limit
/>
</el-form-item>
<el-form-item label="手术过程" prop="operationProcess" class="full-width-item required">
<el-input
v-model="formData.operationProcess"
@@ -136,26 +148,34 @@
<div class="adaptive-grid">
<el-form-item label="术中出血量" prop="bloodLoss" class="grid-item required">
<div class="input-with-unit">
<el-input v-model.number="formData.bloodLoss" type="number" placeholder="请输入出血量" />
<el-input
v-model.number="formData.bloodLoss"
type="number"
placeholder="请输入出血量"
/>
<span class="unit">ml</span>
</div>
</el-form-item>
<el-form-item label="输血情况" prop="bloodTransfusion" class="grid-item">
<el-select v-model="formData.bloodTransfusion" placeholder="是否输血">
<el-option label="是" value="是" />
<el-option label="否" value="否" />
</el-select>
</el-form-item>
<el-form-item label="引流管放置" prop="drainageTube" class="grid-item">
<el-input v-model="formData.drainageTube" placeholder="如腹腔引流管1根" clearable />
</el-form-item>
<el-form-item label="标本处理" prop="specimenDisposal" class="grid-item required">
<el-input v-model="formData.specimenDisposal" placeholder="如:胆囊标本送病理检查" clearable />
<el-input
v-model="formData.specimenDisposal"
placeholder="如:胆囊标本送病理检查"
clearable
/>
</el-form-item>
<el-form-item label="手术结束时间" prop="operationEndTime" class="grid-item required">
<el-date-picker
v-model="formData.operationEndTime"
@@ -164,7 +184,7 @@
value-format="YYYY-MM-DD HH:mm"
/>
</el-form-item>
<el-form-item label="患者去向" prop="patientDestination" class="grid-item required">
<el-select v-model="formData.patientDestination" placeholder="选择去向">
<el-option label="ICU" value="ICU" />
@@ -177,24 +197,27 @@
<!-- 签署区域 -->
<section class="doc-section">
<h2 class="section-title">签署确认</h2>
<div class="adaptive-grid signature-area" style="grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));">
<div
class="adaptive-grid signature-area"
style="grid-template-columns: repeat(auto-fit, minmax(240px, 1fr))"
>
<el-form-item label="手术者签名" prop="surgeonSignature" class="grid-item required">
<el-input v-model="formData.surgeonSignature" placeholder="主刀医师签字" clearable />
<div class="signature-tip">请手术者亲笔签名</div>
</el-form-item>
<el-form-item label="记录者签名" prop="recorderSignature" class="grid-item required">
<el-input v-model="formData.recorderSignature" placeholder="记录者签字" clearable />
<div class="signature-tip">请记录者如第一助手签字</div>
</el-form-item>
<el-form-item label="记录日期" prop="recordDate" class="grid-item required">
<el-date-picker
v-model="formData.recordDate"
type="date"
placeholder="选择记录日期"
value-format="YYYY-MM-DD"
style="width: 100%;"
style="width: 100%"
/>
</el-form-item>
</div>
@@ -212,12 +235,21 @@
<script setup>
import { ref, reactive, onMounted } from 'vue';
import { ElMessage, ElMessageBox, ElForm, ElFormItem, ElInput, ElSelect, ElOption, ElDatePicker, ElButton } from 'element-plus';
import {
ElMessage,
ElMessageBox,
ElForm,
ElFormItem,
ElInput,
ElSelect,
ElOption,
ElDatePicker,
ElButton,
} from 'element-plus';
// 医院名称
const hospitalName = '长春市朝阳区中医院';
defineOptions({
name: 'iInHospitalSurgicalRecord'
name: 'iInHospitalSurgicalRecord',
});
// 表单引用
const formRef = ref(null);
@@ -231,113 +263,93 @@ const formData = reactive({
age: '',
department: '',
bedNo: '',
operationDateTime: '',// 手术日期时间
operationDateTime: '', // 手术日期时间
// 手术团队信息
surgeon: '',// 主刀医师
firstAssistant: '',// 第一助手
secondAssistant: '',// 第二助手
anesthesiologist: '',// 麻醉医师
circulatingNurse: '',// 巡回护士
scrubNurse: '',// 器械护士
surgeon: '', // 主刀医师
firstAssistant: '', // 第一助手
secondAssistant: '', // 第二助手
anesthesiologist: '', // 麻醉医师
circulatingNurse: '', // 巡回护士
scrubNurse: '', // 器械护士
// 手术详情
operationName: '',// 规范手术名称
operationMethod: '',// 手术方式
surgicalApproach: '',// 手术入路
intraoperativeFindings: '',// 术中发现
operationProcess: '',// 手术过程
operationName: '', // 规范手术名称
operationMethod: '', // 手术方式
surgicalApproach: '', // 手术入路
intraoperativeFindings: '', // 术中发现
operationProcess: '', // 手术过程
// 术后情况
bloodLoss: '',// 术中出血量
bloodTransfusion: '',// 输血情况
drainageTube: '',// 引流管放置
specimenDisposal: '',// 标本处理
operationEndTime: '',// 手术结束时间
patientDestination: '',// 患者去向
bloodLoss: '', // 术中出血量
bloodTransfusion: '', // 输血情况
drainageTube: '', // 引流管放置
specimenDisposal: '', // 标本处理
operationEndTime: '', // 手术结束时间
patientDestination: '', // 患者去向
// 签署信息
surgeonSignature: '',// 手术者签名
recorderSignature: '',// 记录者签名
recordDate: ''// 记录日期
surgeonSignature: '', // 手术者签名
recorderSignature: '', // 记录者签名
recordDate: '', // 记录日期
});
// Props与事件
const props = defineProps({
patientInfo: {
type: Object,
required: true,
},
});
const patient = props.patientInfo;
// 表单验证规则
const rules = reactive({
busNo: [
{ required: true, message: '请填写住院号', trigger: ['blur', 'submit'] }
],
patientName: [
{ required: true, message: '请填写患者姓名', trigger: ['blur', 'submit'] }
],
gender: [
{ required: true, message: '请选择性别', trigger: ['change', 'submit'] }
],
busNo: [{ required: true, message: '请填写住院号', trigger: ['blur', 'submit'] }],
patientName: [{ required: true, message: '请填写患者姓名', trigger: ['blur', 'submit'] }],
gender: [{ required: true, message: '请选择性别', trigger: ['change', 'submit'] }],
age: [
{ required: true, message: '请填写年龄', trigger: ['blur', 'submit'] },
{ type: 'number', min: 0, max: 150, message: '年龄需在0-150之间', trigger: ['blur', 'submit'] }
],
department: [
{ required: true, message: '请填写科室', trigger: ['blur', 'submit'] }
],
bedNo: [
{ required: true, message: '请填写病房/床号', trigger: ['blur', 'submit'] }
{ type: 'number', min: 0, max: 150, message: '年龄需在0-150之间', trigger: ['blur', 'submit'] },
],
department: [{ required: true, message: '请填写科室', trigger: ['blur', 'submit'] }],
bedNo: [{ required: true, message: '请填写病房/床号', trigger: ['blur', 'submit'] }],
operationDateTime: [
{ required: true, message: '请选择手术日期时间', trigger: ['change', 'submit'] }
],
surgeon: [
{ required: true, message: '请填写手术者姓名', trigger: ['blur', 'submit'] }
],
firstAssistant: [
{ required: true, message: '请填写第一助手姓名', trigger: ['blur', 'submit'] }
{ required: true, message: '请选择手术日期时间', trigger: ['change', 'submit'] },
],
surgeon: [{ required: true, message: '请填写手术者姓名', trigger: ['blur', 'submit'] }],
firstAssistant: [{ required: true, message: '请填写第一助手姓名', trigger: ['blur', 'submit'] }],
anesthesiologist: [
{ required: true, message: '请填写麻醉医师姓名', trigger: ['blur', 'submit'] }
{ required: true, message: '请填写麻醉医师姓名', trigger: ['blur', 'submit'] },
],
circulatingNurse: [
{ required: true, message: '请填写巡回护士姓名', trigger: ['blur', 'submit'] }
],
scrubNurse: [
{ required: true, message: '请填写器械护士姓名', trigger: ['blur', 'submit'] }
],
operationName: [
{ required: true, message: '请填写手术名称', trigger: ['blur', 'submit'] }
],
operationMethod: [
{ required: true, message: '请选择手术方式', trigger: ['change', 'submit'] }
],
surgicalApproach: [
{ required: true, message: '请填写手术入路', trigger: ['blur', 'submit'] }
{ required: true, message: '请填写巡回护士姓名', trigger: ['blur', 'submit'] },
],
scrubNurse: [{ required: true, message: '请填写器械护士姓名', trigger: ['blur', 'submit'] }],
operationName: [{ required: true, message: '请填写手术名称', trigger: ['blur', 'submit'] }],
operationMethod: [{ required: true, message: '请选择手术方式', trigger: ['change', 'submit'] }],
surgicalApproach: [{ required: true, message: '请填写手术入路', trigger: ['blur', 'submit'] }],
intraoperativeFindings: [
{ required: true, message: '请描述术中发现', trigger: ['blur', 'submit'] }
],
operationProcess: [
{ required: true, message: '请描述手术过程', trigger: ['blur', 'submit'] }
{ required: true, message: '请描述术中发现', trigger: ['blur', 'submit'] },
],
operationProcess: [{ required: true, message: '请描述手术过程', trigger: ['blur', 'submit'] }],
bloodLoss: [
{ required: true, message: '请填写术中出血量', trigger: ['blur', 'submit'] },
{ type: 'number', min: 0, message: '出血量不能为负数', trigger: ['blur', 'submit'] }
{ type: 'number', min: 0, message: '出血量不能为负数', trigger: ['blur', 'submit'] },
],
specimenDisposal: [
{ required: true, message: '请填写标本处理方式', trigger: ['blur', 'submit'] }
{ required: true, message: '请填写标本处理方式', trigger: ['blur', 'submit'] },
],
operationEndTime: [
{ required: true, message: '请选择手术结束时间', trigger: ['change', 'submit'] }
{ required: true, message: '请选择手术结束时间', trigger: ['change', 'submit'] },
],
patientDestination: [
{ required: true, message: '请选择患者去向', trigger: ['change', 'submit'] }
{ required: true, message: '请选择患者去向', trigger: ['change', 'submit'] },
],
surgeonSignature: [
{ required: true, message: '请手术者签名', trigger: ['blur', 'submit'] }
],
recorderSignature: [
{ required: true, message: '请记录者签名', trigger: ['blur', 'submit'] }
],
recordDate: [
{ required: true, message: '请选择记录日期', trigger: ['change', 'submit'] }
]
surgeonSignature: [{ required: true, message: '请手术者签名', trigger: ['blur', 'submit'] }],
recorderSignature: [{ required: true, message: '请记录者签名', trigger: ['blur', 'submit'] }],
recordDate: [{ required: true, message: '请选择记录日期', trigger: ['change', 'submit'] }],
});
// 生命周期
@@ -347,18 +359,43 @@ onMounted(() => {
formData.operationDateTime = formatDateTime(today);
formData.operationEndTime = formatDateTime(today);
formData.recordDate = formatDate(today);
if (!formData.patientName) {
formData.patientName = patient?.patientName || '';
}
if (!formData.gender) {
formData.gender = patient?.genderEnum_enumText || '';
}
if (!formData.age) {
formData.age = patient?.age || '';
}
if (!formData.department) {
formData.department = patient?.inHospitalOrgName || '';
}
if (!formData.bedNo) {
formData.bedNo = patient?.houseName + '-' + patient?.bedName;
}
});
const emits = defineEmits(['submitOk']);
// 提交表单
const submit = () => {
formRef.value.validate((valid) => {
if (valid) {
ElMessage.success('手术记录保存成功');
console.log('手术记录数据:', formData);
emits('submitOk', formData);
}
});
};
// 表单数据赋值
const setFormData = (data) => {
if (data) {
Object.assign(formData, data);
}
};
// 打印功能
const handlePrint = () => {
formRef.value.validate((valid) => {
@@ -372,15 +409,11 @@ const handlePrint = () => {
// 重置表单
const handleReset = () => {
ElMessageBox.confirm(
'确定要重置表单吗?所有已填写内容将被清空',
'确认重置',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
ElMessageBox.confirm('确定要重置表单吗?所有已填写内容将被清空', '确认重置', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
formRef.value.resetFields();
const today = new Date();
formData.operationDateTime = formatDateTime(today);
@@ -406,6 +439,7 @@ const formatDateTime = (date) => {
const minute = String(date.getMinutes()).padStart(2, '0');
return `${year}-${month}-${day} ${hour}:${minute}`;
};
defineExpose({ submit, setFormData });
</script>
<style scoped>
@@ -517,15 +551,15 @@ const formatDateTime = (date) => {
.medical-document {
padding: 15px;
}
.adaptive-grid {
grid-template-columns: 1fr;
}
.doc-title {
font-size: 18px;
}
.section-title {
font-size: 16px;
}
@@ -535,21 +569,23 @@ const formatDateTime = (date) => {
.btn-group {
display: none;
}
.medical-document {
box-shadow: none;
margin: 0;
padding: 0;
}
.el-input__inner, .el-select__input, .el-textarea__inner {
.el-input__inner,
.el-select__input,
.el-textarea__inner {
border: none !important;
box-shadow: none !important;
background: transparent !important;
}
.el-form-item__label {
font-weight: bold !important;
}
}
</style>
</style>

View File

@@ -22,29 +22,29 @@
<el-form-item label="姓名" prop="patientName" class="grid-item required">
<el-input v-model="formData.patientName" placeholder="请输入患者姓名" clearable />
</el-form-item>
<el-form-item label="性别" prop="gender" class="grid-item required">
<el-select v-model="formData.gender" placeholder="请选择性别">
<el-option label="男" value="男" />
<el-option label="女" value="女" />
</el-select>
</el-form-item>
<el-form-item label="年龄" prop="age" class="grid-item required">
<div class="input-with-unit">
<el-input v-model.number="formData.age" type="number" placeholder="请输入年龄" />
<el-input v-model.number="formData.age" placeholder="请输入年龄" clearable />
<span class="unit"></span>
</div>
</el-form-item>
<el-form-item label="科室/病区" prop="department" class="grid-item required">
<el-input v-model="formData.department" placeholder="如:内科疗区" clearable />
</el-form-item>
<el-form-item label="病房/床号" prop="bedNo" class="grid-item required">
<el-input v-model="formData.bedNo" placeholder="如307-12" clearable />
</el-form-item>
<el-form-item label="入院日期" prop="admissionDate" class="grid-item required">
<el-date-picker
v-model="formData.admissionDate"
@@ -63,11 +63,11 @@
<el-form-item label="经治医师" prop="treatingDoctor" class="grid-item required">
<el-input v-model="formData.treatingDoctor" placeholder="请输入医师姓名" clearable />
</el-form-item>
<el-form-item label="主治医师" prop="attendingDoctor" class="grid-item required">
<el-input v-model="formData.attendingDoctor" placeholder="请输入医师姓名" clearable />
</el-form-item>
<el-form-item label="科主任" prop="departmentHead" class="grid-item required">
<el-input v-model="formData.departmentHead" placeholder="请输入主任姓名" clearable />
</el-form-item>
@@ -77,7 +77,7 @@
<!-- 病情与诊断 -->
<section class="doc-section">
<h2 class="section-title">病情与诊断</h2>
<el-form-item label="病情状况" prop="condition" class="full-width-item required">
<el-input
v-model="formData.condition"
@@ -88,7 +88,7 @@
show-word-limit
/>
</el-form-item>
<div class="diagnosis-container">
<el-form-item label="中医诊断" prop="tcmDiagnosis" class="diagnosis-item">
<el-input
@@ -100,7 +100,7 @@
show-word-limit
/>
</el-form-item>
<el-form-item label="西医诊断" prop="westernDiagnosis" class="diagnosis-item">
<el-input
v-model="formData.westernDiagnosis"
@@ -117,7 +117,7 @@
<!-- 治疗与检查计划 -->
<section class="doc-section">
<h2 class="section-title">治疗与检查计划</h2>
<el-form-item label="治疗方案" prop="treatmentPlan" class="full-width-item required">
<el-input
v-model="formData.treatmentPlan"
@@ -128,8 +128,12 @@
show-word-limit
/>
</el-form-item>
<el-form-item label="进一步检查项目" prop="examinationItems" class="full-width-item required">
<el-form-item
label="进一步检查项目"
prop="examinationItems"
class="full-width-item required"
>
<el-input
v-model="formData.examinationItems"
type="textarea"
@@ -159,38 +163,45 @@
<!-- 签署区域优化后三列自适应+细节样式 -->
<section class="doc-section">
<h2 class="section-title">签署确认</h2>
<div class="adaptive-grid signature-area" style="grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));">
<div
class="adaptive-grid signature-area"
style="grid-template-columns: repeat(auto-fit, minmax(240px, 1fr))"
>
<el-form-item label="患者或家属签字" prop="patientSignature" class="grid-item required">
<el-input v-model="formData.patientSignature" placeholder="请签字" clearable />
<div class="signature-tip">请填写患者或家属签字</div>
</el-form-item>
<el-form-item label="与患者关系" prop="relationship" class="grid-item">
<el-input v-model="formData.relationship" placeholder="如:本人、配偶、子女" clearable />
<el-input
v-model="formData.relationship"
placeholder="如:本人、配偶、子女"
clearable
/>
</el-form-item>
<el-form-item label="签字日期" prop="signatureDate" class="grid-item required">
<el-date-picker
v-model="formData.signatureDate"
type="date"
placeholder="选择签字日期"
value-format="YYYY-MM-DD"
style="width: 100%;"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="沟通医师签字" prop="doctorSignature" class="grid-item required">
<el-input v-model="formData.doctorSignature" placeholder="请签字" clearable />
<div class="signature-tip">请填写沟通医师签字</div>
</el-form-item>
<el-form-item label="沟通日期" prop="communicationDate" class="grid-item required">
<el-date-picker
v-model="formData.communicationDate"
type="datetime"
placeholder="选择沟通日期时间"
value-format="YYYY-MM-DD HH:mm"
style="width: 100%;"
style="width: 100%"
/>
</el-form-item>
</div>
@@ -208,13 +219,53 @@
<script setup>
import { ref, reactive, onMounted } from 'vue';
import { ElMessage, ElMessageBox, ElForm, ElFormItem, ElInput, ElSelect, ElOption, ElDatePicker, ElButton } from 'element-plus';
import {
ElMessage,
ElMessageBox,
ElForm,
ElFormItem,
ElInput,
ElSelect,
ElOption,
ElDatePicker,
ElButton,
} from 'element-plus';
// 医院名称
const hospitalName = '长春市朝阳区中医院';
defineOptions({
name: 'InHospitalCommunicate'
name: 'InHospitalCommunicate',
});
// Props与事件
const props = defineProps({
patientInfo: {
type: Object,
required: true,
},
});
// 生命周期
onMounted(() => {
if (!formData.patientName) {
formData.patientName = patient?.patientName || '';
}
if (!formData.gender) {
formData.gender = patient?.genderEnum_enumText || '';
}
if (!formData.age) {
formData.age = patient?.age || '';
}
if (!formData.hospitalNo) {
formData.hospitalNo = patient?.busNo || '';
}
if (!formData.department) {
formData.department = patient?.inHospitalOrgName || '';
}
if (!formData.bedNo) {
formData.bedNo = patient?.houseName + '-' + patient?.bedName;
}
});
const patient = props.patientInfo;
console.log('patient1111=======>', JSON.stringify(patient));
// 表单引用
const formRef = ref(null);
@@ -228,89 +279,59 @@ const formData = reactive({
department: '',
bedNo: '',
admissionDate: '',
// 医疗团队
treatingDoctor: '',
attendingDoctor: '',
departmentHead: '',
// 病情诊断
condition: '',
tcmDiagnosis: '',
westernDiagnosis: '',
// 治疗检查
treatmentPlan: '',
examinationItems: '',
// 风险告知
riskNotification: '',
// 签署信息
patientSignature: '',
relationship: '',
signatureDate: '',
doctorSignature: '',
communicationDate: ''
communicationDate: '',
});
// 表单验证规则
const rules = reactive({
hospitalNo: [
{ required: true, message: '请填写住院号', trigger: ['blur', 'submit'] }
],
patientName: [
{ required: true, message: '请填写患者姓名', trigger: ['blur', 'submit'] }
],
gender: [
{ required: true, message: '请选择性别', trigger: ['change', 'submit'] }
],
hospitalNo: [{ required: true, message: '请填写住院号', trigger: ['blur', 'submit'] }],
patientName: [{ required: true, message: '请填写患者姓名', trigger: ['blur', 'submit'] }],
gender: [{ required: true, message: '请选择性别', trigger: ['change', 'submit'] }],
age: [
{ required: true, message: '请填写年龄', trigger: ['blur', 'submit'] },
{ type: 'number', min: 0, max: 150, message: '年龄需在0-150之间', trigger: ['blur', 'submit'] }
],
department: [
{ required: true, message: '请填写科室/病区', trigger: ['blur', 'submit'] }
],
bedNo: [
{ required: true, message: '请填写病房/床号', trigger: ['blur', 'submit'] }
],
admissionDate: [
{ required: true, message: '请选择入院日期', trigger: ['change', 'submit'] }
],
treatingDoctor: [
{ required: true, message: '请填写经治医师', trigger: ['blur', 'submit'] }
],
attendingDoctor: [
{ required: true, message: '请填写主治医师', trigger: ['blur', 'submit'] }
],
departmentHead: [
{ required: true, message: '请填写科主任', trigger: ['blur', 'submit'] }
],
condition: [
{ required: true, message: '请描述病情状况', trigger: ['blur', 'submit'] }
],
treatmentPlan: [
{ required: true, message: '请填写治疗方案', trigger: ['blur', 'submit'] }
],
examinationItems: [
{ required: true, message: '请填写检查项目', trigger: ['blur', 'submit'] }
{ type: 'number', min: 0, max: 150, message: '年龄需在0-150之间', trigger: ['blur', 'submit'] },
],
department: [{ required: true, message: '请填写科室/病区', trigger: ['blur', 'submit'] }],
bedNo: [{ required: true, message: '请填写病房/床号', trigger: ['blur', 'submit'] }],
admissionDate: [{ required: true, message: '请选择入院日期', trigger: ['change', 'submit'] }],
treatingDoctor: [{ required: true, message: '请填写经治医师', trigger: ['blur', 'submit'] }],
attendingDoctor: [{ required: true, message: '请填写主治医师', trigger: ['blur', 'submit'] }],
departmentHead: [{ required: true, message: '请填写科主任', trigger: ['blur', 'submit'] }],
condition: [{ required: true, message: '请描述病情状况', trigger: ['blur', 'submit'] }],
treatmentPlan: [{ required: true, message: '请填写治疗方案', trigger: ['blur', 'submit'] }],
examinationItems: [{ required: true, message: '请填写检查项目', trigger: ['blur', 'submit'] }],
riskNotification: [
{ required: true, message: '请填写风险告知内容', trigger: ['blur', 'submit'] }
{ required: true, message: '请填写风险告知内容', trigger: ['blur', 'submit'] },
],
patientSignature: [
{ required: true, message: '请填写患者或家属签字', trigger: ['blur', 'submit'] }
{ required: true, message: '请填写患者或家属签字', trigger: ['blur', 'submit'] },
],
signatureDate: [
{ required: true, message: '请选择签字日期', trigger: ['change', 'submit'] }
],
doctorSignature: [
{ required: true, message: '请填写医师签字', trigger: ['blur', 'submit'] }
],
communicationDate: [
{ required: true, message: '请选择沟通日期', trigger: ['change', 'submit'] }
]
signatureDate: [{ required: true, message: '请选择签字日期', trigger: ['change', 'submit'] }],
doctorSignature: [{ required: true, message: '请填写医师签字', trigger: ['blur', 'submit'] }],
communicationDate: [{ required: true, message: '请选择沟通日期', trigger: ['change', 'submit'] }],
});
// 生命周期
@@ -322,16 +343,26 @@ onMounted(() => {
formData.communicationDate = formatDateTime(today);
});
const emits = defineEmits(['submitOk']);
// 提交表单
const submit = () => {
formRef.value.validate((valid) => {
if (valid) {
ElMessage.success('记录保存成功');
console.log('表单数据:', formData);
emits('submitOk', formData);
}
});
};
// 表单数据赋值
const setFormData = (data) => {
if (data) {
Object.assign(formData, data);
}
};
// 打印功能
const handlePrint = () => {
formRef.value.validate((valid) => {
@@ -345,15 +376,11 @@ const handlePrint = () => {
// 重置表单
const handleReset = () => {
ElMessageBox.confirm(
'确定要重置表单吗?所有已填写内容将被清空',
'确认重置',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
ElMessageBox.confirm('确定要重置表单吗?所有已填写内容将被清空', '确认重置', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
formRef.value.resetFields();
const today = new Date();
formData.admissionDate = formatDate(today);
@@ -379,6 +406,8 @@ const formatDateTime = (date) => {
const minute = String(date.getMinutes()).padStart(2, '0');
return `${year}-${month}-${day} ${hour}:${minute}`;
};
defineExpose({ submit, setFormData });
</script>
<style scoped>
@@ -510,19 +539,19 @@ const formatDateTime = (date) => {
.medical-document {
padding: 15px;
}
.diagnosis-container {
grid-template-columns: 1fr;
}
.adaptive-grid {
grid-template-columns: 1fr;
}
.doc-title {
font-size: 18px;
}
.section-title {
font-size: 16px;
}
@@ -533,21 +562,23 @@ const formatDateTime = (date) => {
.btn-group {
display: none;
}
.medical-document {
box-shadow: none;
margin: 0;
padding: 0;
}
.el-input__inner, .el-select__input, .el-textarea__inner {
.el-input__inner,
.el-select__input,
.el-textarea__inner {
border: none !important;
box-shadow: none !important;
background: transparent !important;
}
.el-form-item__label {
font-weight: bold !important;
}
}
</style>
</style>

View File

@@ -6,7 +6,7 @@
<template>
<div class="container">
<div class="header">
<h2 class="title">乾安县人民医院</h2>
<h2 class="title">长春市朝阳区中医院</h2>
<h3 class="subtitle">患者护理记录单</h3>
</div>

View File

@@ -157,7 +157,7 @@ defineOptions({
components: { ElInput, ElMessage, ElForm, ElFormItem },
});
// // Props与事件,去掉props.patientInfo改为直接从store获取
// // Props与事件, 去掉props.patientInfo改为直接从store获取
// const props = defineProps({
// patientInfo: {
// type: Object,
@@ -206,7 +206,6 @@ const submit = () => {
formRef.value.validate((isValid) => {
if (isValid) {
emits('submitOk', formData);
ElMessage.success('提交成功');
}
});
};
@@ -256,14 +255,15 @@ defineExpose({ formData, submit, setFormData });
max-width: 1200px;
width: 100%;
min-height: 800px;
height: 900px;
height: auto;
margin: 15px auto;
padding: 15px;
border: 1px solid #ddd;
border-radius: 8px;
font-family: Arial, sans-serif;
box-sizing: border-box;
overflow: visible;
overflow: hidden; /* 防止内部内容溢出 */
position: relative;
}
/* 顶部姓名样式 */
@@ -278,11 +278,12 @@ defineExpose({ formData, submit, setFormData });
/* 滚动内容容器 */
.form-scroll-container {
width: 100%;
max-height: 80vh;
max-height: 55vh;
overflow-y: auto;
overflow-x: hidden;
scrollbar-width: thin;
scrollbar-color: #ccc #f5f5f5;
position: relative;
}
.form-scroll-container::-webkit-scrollbar {
width: 6px;
@@ -298,6 +299,8 @@ defineExpose({ formData, submit, setFormData });
/* 完整表单容器 */
.medical-full-form {
width: 100%;
min-width: 0; /* 防止内容强制拉伸容器 */
box-sizing: border-box;
}
/* 区域通用样式 */
@@ -319,6 +322,8 @@ defineExpose({ formData, submit, setFormData });
flex-wrap: wrap; /* 自动换行 */
align-items: flex-start; /* 顶部对齐,适配文本域高度 */
gap: 15px; /* 统一元素间距 */
width: 100%;
box-sizing: border-box;
}
.row-item {
margin-bottom: 0; /* 取消底部间距,避免换行重叠 */
@@ -389,9 +394,11 @@ defineExpose({ formData, submit, setFormData });
.medical-form {
height: 80vh;
padding: 10px;
overflow: hidden;
}
.form-scroll-container {
height: calc(100% - 35px);
max-height: none;
}
.el-form {
label-width: 70px !important;

View File

@@ -0,0 +1,455 @@
<template>
<div class="medical-form">
<div class="patient-name">
患者姓名{{ patient?.patientName || '未知' }} &nbsp;&nbsp; 病历号{{
patient?.busNo || '未知'
}}
</div>
<h2 style="text-align: center">{{ userStore.hospitalName || '长春市朝阳区中医院' }}</h2>
<h2 style="text-align: center">门诊病历</h2>
<!-- 滚动内容区域 -->
<div class="form-scroll-container">
<el-form
ref="formRef"
:model="formData"
:rules="rules"
label-width="100px"
label-align="left"
class="medical-full-form"
>
<h4 class="section-title">基础信息</h4>
<!-- 1. 基础信息单行自适应排列 -->
<el-form-item class="form-section">
<div class="single-row-layout">
<el-form-item label="呼吸" prop="breathe" class="row-item">
<div class="input-with-unit">
<el-input v-model="formData.breathe" type="text" placeholder="请输入" />
<span class="unit">/</span>
</div>
</el-form-item>
<!-- <el-form-item label="血压" prop="blood" class="row-item">
<div class="input-with-unit">
<el-input v-model="formData.blood" type="text" placeholder="请输入" />
<span class="unit">mmHg</span>
</div>
</el-form-item> -->
<el-form-item label="血压" prop="blood" class="row-item">
<div class="input-with-unit blood-input-group">
<el-input
v-model="formData.bloodHigh"
type="text"
placeholder="高压"
style="width: 80px"
/>
<span class="divider">/</span>
<el-input
v-model="formData.bloodLow"
type="text"
placeholder="低压"
style="width: 80px"
/>
<span class="unit">(/)mmHg</span>
</div>
</el-form-item>
<el-form-item label="体温" prop="temperature" class="row-item">
<div class="input-with-unit">
<el-input v-model="formData.temperature" type="text" placeholder="请输入" />
<span class="unit"></span>
</div>
</el-form-item>
<el-form-item label="脉搏" prop="pulse" class="row-item">
<div class="input-with-unit">
<el-input v-model="formData.pulse" type="text" placeholder="请输入" />
<span class="unit">/</span>
</div>
</el-form-item>
<el-form-item label="就诊日期" prop="onsetDate" class="row-item">
<el-date-picker
v-model="formData.onsetDate"
type="date"
placeholder="选择就诊日期"
value-format="YYYY-MM-DD"
style="width: 100%"
/>
<!-- <el-input v-model="formData.onsetDate" type="date" /> -->
</el-form-item>
</div>
</el-form-item>
<h4 class="section-title">病史信息</h4>
<!-- 2. 病史信息单行自适应排列新增调整 -->
<el-form-item class="form-section">
<div class="single-row-layout">
<el-form-item label="现病史" prop="presentIllness" class="row-item history-item">
<el-input
v-model="formData.presentIllness"
type="textarea"
placeholder="无"
autosize
/>
</el-form-item>
<el-form-item label="既往史" prop="pastIllness" class="row-item history-item">
<el-input v-model="formData.pastIllness" type="textarea" placeholder="无" autosize />
</el-form-item>
<el-form-item label="个人史" prop="personalHistory" class="row-item history-item">
<el-input
v-model="formData.personalHistory"
type="textarea"
placeholder="无"
autosize
/>
</el-form-item>
<el-form-item label="过敏史" prop="allergyHistory" class="row-item history-item">
<el-input
v-model="formData.allergyHistory"
type="textarea"
placeholder="无"
autosize
/>
</el-form-item>
<el-form-item label="家族史" prop="familyHistory" class="row-item history-item">
<el-input
v-model="formData.familyHistory"
type="textarea"
placeholder="无"
autosize
/>
</el-form-item>
</div>
</el-form-item>
<h4 class="section-title">主诉处置辅助检查</h4>
<!-- 3. 主诉必填 -->
<el-form-item label="主诉" prop="complaint" class="required form-item-single">
<el-input
v-model="formData.complaint"
type="textarea"
placeholder="请输入主诉"
class="tall-textarea"
autosize
/>
</el-form-item>
<!-- 4. 查体处理辅助检查 -->
<!-- <el-form-item label="查体(治疗)" prop="physicalExam" class="form-item-single">
<el-input
v-model="formData.physicalExam"
type="textarea"
placeholder="请输入查体结果"
class="tall-textarea"
autosize
/>
</el-form-item> -->
<el-form-item label="处置" prop="treatment" class="form-item-single">
<el-input
v-model="formData.treatment"
type="textarea"
placeholder="请输入处理方案"
class="tall-textarea"
autosize
/>
</el-form-item>
<el-form-item label="辅助检查" prop="auxiliaryExam" class="form-item-single">
<el-input
v-model="formData.auxiliaryExam"
type="textarea"
placeholder="请输入辅助检查结果"
class="tall-textarea"
autosize
/>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script setup>
import { reactive, ref, onBeforeMount, onMounted, watch } from 'vue';
import useUserStore from '../store/modules/user';
import { ElInput, ElMessage, ElForm, ElFormItem } from 'element-plus';
import { patientInfo } from '../views/doctorstation/components/store/patient';
import { pa } from 'element-plus/es/locales.mjs';
defineOptions({
name: 'OutpatientMedicalRecord1.1',
components: { ElInput, ElMessage, ElForm, ElFormItem },
});
// // Props与事件,去掉props.patientInfo改为直接从store获取
// const props = defineProps({
// patientInfo: {
// type: Object,
// required: true,
// },
// });
const props = defineProps({});
const emits = defineEmits(['submitOk']);
// 数据初始化
const userStore = useUserStore();
const patient = ref(null);
const formRef = ref(null);
// 表单数据(全部字符类型)
const formData = reactive({
breathe: '', // 呼吸
bloodHigh: '', //高压
bloodLow: '', //低压
temperature: '', // 体温
pulse: '', // 脉搏
onsetDate: '', // 就诊日期
complaint: '', // 主诉(必填)
presentIllness: '', // 现病史
pastIllness: '', // 既往史
personalHistory: '', // 个人史
allergyHistory: '', // 过敏史
physicalExam: '', // 查体
treatment: '', // 处理
auxiliaryExam: '', // 辅助检查
familyHistory: '', // 家族史
});
// 表单校验规则
const rules = reactive({
complaint: [
{
required: true,
message: '请填写主诉',
trigger: ['blur', 'submit'],
},
],
});
// 提交函数
const submit = () => {
formRef.value.validate((isValid) => {
if (isValid) {
emits('submitOk', formData);
}
});
};
// 日期格式化工具
const formatDateTime = (date) => {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hour = String(date.getHours()).padStart(2, '0');
const minute = String(date.getMinutes()).padStart(2, '0');
return `${year}-${month}-${day} ${hour}:${minute}`;
};
// 表单数据赋值
const setFormData = (data) => {
if (data) {
Object.assign(formData, data);
}
};
// 生命周期
onBeforeMount(() => {});
onMounted(() => {
console.log('当前患者信息:', patientInfo);
patient.value = patientInfo.value;
// 初始化发病日期为当前时间
if (!formData.onsetDate) {
formData.onsetDate = formatDateTime(new Date());
}
});
// 监听患者信息变化,实现联动显示
watch(
() => patientInfo.value,
(newPatientInfo) => {
patient.value = newPatientInfo;
},
{ deep: true }
);
// 暴露接口
defineExpose({ formData, submit, setFormData });
</script>
<style scoped>
/* 表单外层容器 */
.medical-form {
max-width: 1200px;
width: 100%;
min-height: 800px;
height: 900px;
margin: 15px auto;
padding: 15px;
border: 1px solid #ddd;
border-radius: 8px;
font-family: Arial, sans-serif;
box-sizing: border-box;
overflow: visible;
}
/* 顶部姓名样式 */
.patient-name {
display: inline-block;
margin-bottom: 15px;
font-size: 14px;
color: #333;
font-weight: 500;
}
/* 滚动内容容器 */
.form-scroll-container {
width: 100%;
max-height: 80vh;
overflow-y: auto;
overflow-x: hidden;
scrollbar-width: thin;
scrollbar-color: #ccc #f5f5f5;
}
.form-scroll-container::-webkit-scrollbar {
width: 6px;
}
.form-scroll-container::-webkit-scrollbar-thumb {
background-color: #ccc;
border-radius: 3px;
}
.form-scroll-container::-webkit-scrollbar-track {
background-color: #f5f5f5;
}
/* 完整表单容器 */
.medical-full-form {
width: 100%;
}
/* 区域通用样式 */
.form-section {
margin-bottom: 20px;
}
.section-title {
margin: 0 0 12px;
padding-bottom: 6px;
border-bottom: 1px solid #f0f0f0;
color: #333;
font-size: 16px;
font-weight: bold;
}
/* 通用单行自适应布局(基础信息+病史信息共用) */
.single-row-layout {
display: flex;
flex-wrap: wrap; /* 自动换行 */
align-items: flex-start; /* 顶部对齐,适配文本域高度 */
gap: 15px; /* 统一元素间距 */
}
.row-item {
margin-bottom: 0; /* 取消底部间距,避免换行重叠 */
display: flex;
flex-direction: column;
}
.blood-input-group {
display: flex;
align-items: center;
gap: 8px;
width: 100%;
}
.blood-input-group .el-input {
flex: none;
}
.divider {
font-weight: bold;
color: #333;
font-size: 14px;
}
.unit {
font-weight: 500;
color: #333;
white-space: nowrap;
font-size: 14px;
}
/* 基础信息项:适配短输入框 */
.row-item:not(.history-item) {
min-width: 160px; /* 基础信息项最小宽度 */
}
/* 病史信息项:适配文本域,设置更大最小宽度 */
.history-item {
min-width: 220px; /* 确保文本域有足够宽度 */
}
/* 带单位的输入框样式 */
.input-with-unit {
display: flex;
align-items: center;
gap: 8px;
width: 100%;
}
.input-with-unit .el-input {
flex: 1;
}
.unit {
font-weight: 500;
color: #333;
white-space: nowrap;
font-size: 14px;
}
/* 单行表单项样式(主诉、查体等) */
.form-item-single {
margin-bottom: 18px;
}
/* 文本域高度控制 */
.tall-textarea {
--el-input-textarea-min-height: 100px;
}
/* 病史信息文本域:适当降低高度,适配单行布局 */
.history-item .el-input__inner {
--el-input-textarea-min-height: 60px;
}
/* 必填项红色星号 */
.required .el-form-item__label::before {
content: '* ';
color: #ff4d4f;
}
/* 输入框统一样式 */
.el-form-item .el-input,
.el-form-item .el-input__wrapper {
width: 100%;
box-sizing: border-box;
}
.el-form-item .el-input__inner {
font-size: 14px;
padding: 8px 12px;
}
/* 响应式调整 */
@media (max-width: 768px) {
.medical-form {
height: 80vh;
padding: 10px;
}
.form-scroll-container {
height: calc(100% - 35px);
}
.el-form {
label-width: 70px !important;
}
.row-item:not(.history-item) {
min-width: 130px;
}
.history-item {
min-width: 100%; /* 移动端病史信息全屏宽度,单行显示 */
}
.form-item-single,
.form-section {
margin-bottom: 15px;
}
.tall-textarea {
--el-input-textarea-min-height: 80px;
}
}
</style>

View File

@@ -7,7 +7,7 @@
<div class="surgicalPatientHandover-container">
<div class="handover-form">
<div class="form-header">
<h1 class="hospital-name">**医院</h1>
<h1 class="hospital-name">长春市朝阳区中医院</h1>
<h2 class="form-title">手术患者交接单</h2>
</div>

View File

@@ -501,4 +501,33 @@ export function getGroupMarkers(tableData) {
}
});
return tableData;
}
/**
* 格式化库存数量显示(大单位情况) 示例 1盒5片
* @param quantity 小单位库存数量
* @param partPercent 拆零比
* @param unitCode 大单位label
* @param minUnitCode 小单位label
*/
export function formatInventory(quantity, partPercent, unitCode, minUnitCode) {
// 处理负数情况
const isNegative = quantity < 0;
const absQuantity = Math.abs(quantity);
if (absQuantity % partPercent !== 0) {
const integerPart = Math.floor(absQuantity / partPercent);
const decimalPart = absQuantity % partPercent;
let result = integerPart.toString() + ' ' + unitCode;
if (decimalPart > 0) {
result += decimalPart.toString() + ' ' + minUnitCode;
}
return isNegative ? '-' + result : result;
}
// 整除情况
const result = absQuantity / partPercent;
return isNegative ? '-' + result : result + ' ' + unitCode;
}

View File

@@ -3,7 +3,7 @@
* 集中管理所有打印相关功能
*/
// 打印模板映射表
// 打印模板映射表 .
const TEMPLATE_MAP = {
// CLINIC_CHARGE: () => import('@/views/charge/cliniccharge/components/template.json'),
// DISPOSAL: () => import('@/views/clinicmanagement/disposal/components/disposalTemplate.json'),
@@ -21,6 +21,25 @@ const TEMPLATE_MAP = {
OUTPATIENT_REGISTRATION: () => import('@/components/Print/OutpatientRegistration.json'),
//门诊收费
OUTPATIENT_CHARGE: () => import('@/components/Print/OutpatientBilling.json'),
//门诊病历
OUTPATIENT_MEDICAL_RECORD: () => import('@/components/Print/OutpatientMedicalRecord.json'),
//门诊输液贴
OUTPATIENT_INFUSION: () => import('@/components/Print/OutpatientInfusion.json'),
//手术记录
OPERATIVE_RECORD: () => import('@/components/Print/OperativeRecord.json'),
//红旗门诊病历
HQOUTPATIENT_MEDICAL_RECORD: () => import('@/components/Print/HQOutpatientMedicalRecord.json'),
//预交金
ADVANCE_PAYMENT: () => import('@/components/Print/AdvancePayment.json'),
//中药处方单
CHINESE_MEDICINE_PRESCRIPTION: () =>
import('@/components/Print/ChineseMedicinePrescription.json'),
//药房处方单
PHARMACY_PRESCRIPTION: () => import('@/components/Print/Pharmacy.json'),
//中药医生处方单
DOC_CHINESE_MEDICINE_PRESCRIPTION: () =>
import('@/components/Print/DocChineseMedicinePrescription.json'),
};
/**
@@ -108,6 +127,22 @@ export const PRINT_TEMPLATE = {
PRESCRIPTION: 'PRESCRIPTION',
//处置单
DISPOSAL: 'DISPOSAL',
//门诊病历
OUTPATIENT_MEDICAL_RECORD: 'OUTPATIENT_MEDICAL_RECORD',
//门诊输液贴
OUTPATIENT_INFUSION: 'OUTPATIENT_INFUSION',
//手术记录
OPERATIVE_RECORD: 'OPERATIVE_RECORD',
//红旗门诊病历
HQOUTPATIENT_MEDICAL_RECORD: 'HQOUTPATIENT_MEDICAL_RECORD',
//预交金
ADVANCE_PAYMENT: 'ADVANCE_PAYMENT',
//中药处方单
CHINESE_MEDICINE_PRESCRIPTION: 'CHINESE_MEDICINE_PRESCRIPTION',
//药房处方单
PHARMACY_PRESCRIPTION: 'PHARMACY_PRESCRIPTION',
//中药医生处方单
DOC_CHINESE_MEDICINE_PRESCRIPTION: 'DOC_CHINESE_MEDICINE_PRESCRIPTION',
};
/**

View File

@@ -79,6 +79,9 @@
</el-form-item>
<el-form-item label="属性代码" prop="code">
<el-input v-model="form.code" placeholder="请输入属性代码" />
</el-form-item>
<el-form-item label="体温单类型编码" prop="typeCode">
<el-input v-model="form.typeCode" placeholder="请输入体温单属性编码" />
</el-form-item>
<el-form-item label="岗位顺序" prop="displayOrder">
<el-input-number v-model="form.displayOrder" controls-position="right" :min="0" />
@@ -197,6 +200,7 @@ function reset() {
displayOrder: 0, // 显示顺序
dictName: '', //字典名称
dictType: '', //字典类型
typeCode:'',//体温单类型编码
};
proxy.resetForm('statisticsRef');
}

View File

@@ -40,7 +40,7 @@
>
<!-- <el-table-column type="selection" width="50" align="center" /> -->
<el-table-column
label="取药科室"
label="开立科室"
align="center"
key="name"
prop="name"
@@ -64,6 +64,29 @@
</div>
</template>
</el-table-column>
<el-table-column
label="项目类型"
align="center"
key="itemCode"
prop="itemCode"
:show-overflow-tooltip="true"
width="300"
>
<template #default="scope">
<div style="display: flex; align-items: center; justify-content: center">
<el-select
v-model="scope.row.itemCode"
placeholder="项目类型"
clearable
style="width: 100px"
:class="{ 'error-border': scope.row.error }"
>
<el-option label="药品" value="1" />
<el-option label="耗材" value="2" />
</el-select>
</div>
</template>
</el-table-column>
<el-table-column
label="药品类别"
align="center"
@@ -81,12 +104,22 @@
style="width: 200px"
:class="{ 'error-border': scope.row.error }"
>
<el-option
v-for="dict in distribution_category_code"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
<template v-if="scope.row.itemCode == '1'">
<el-option
v-for="dict in med_category_code"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</template>
<template v-if="scope.row.itemCode == '2'">
<el-option
v-for="dict in device_category_code"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</template>
</el-select>
</div>
</template>
@@ -184,7 +217,11 @@ import {
deletePharmacyDepartment,
} from './components/pharmacyDepartment';
const { proxy } = getCurrentInstance();
const { distribution_category_code } = proxy.useDict('distribution_category_code');
const { distribution_category_code, med_category_code, device_category_code } = proxy.useDict(
'distribution_category_code',
'med_category_code',
'device_category_code'
);
import { nextTick } from 'vue';
const diagnosisTreatmentList = ref([]);
@@ -293,10 +330,6 @@ function handleSelectionChange(selection) {
}
function openAddPharmacyDepartment() {
if (data.isAdding) {
proxy.$message.warning('请先保存当前行后再新增!');
return;
}
const newRow = {
id: '',
organizationId: '',

View File

@@ -36,7 +36,8 @@ export function updateWarehouse(data) {
// 删除
export function deleteWarehouse(data) {
return request({
url: '/base-data-manage/location/location?locationId=' + data.locationId,
// url: '/base-data-manage/location/location?locationId=' + data.locationId,
url: '/base-data-manage/location/location?busNo=' + data.busNo,
method: 'delete',
})
}

View File

@@ -295,7 +295,8 @@ function submitForm() {
// 删除
function handelDelete(data) {
loading.value = true;
deleteWarehouse({ locationId: data.id }).then((res) => {
console.log(data, 'data');
deleteWarehouse({ busNo: data.busNo }).then((res) => {
proxy.$modal.msgSuccess('操作成功');
loading.value = false;
getPageList();

View File

@@ -160,6 +160,7 @@
@click="
() => {
form.ybNo = item.ybNo;
form.busNo = item.busNo;
form.price = item.retailPrice;
}
"
@@ -679,6 +680,7 @@ const transformFormData = (form) => {
ybNo,
title,
comment,
busNo,
} = form.value;
return {
@@ -696,6 +698,7 @@ const transformFormData = (form) => {
appointmentRequiredFlag,
extraDetails,
comment,
busNo,
},
chargeItemDefinitionFormData: {
id,
@@ -734,6 +737,7 @@ const transformFormEditData = (form) => {
ybNo,
title,
comment,
busNo,
} = form.value;
return {
@@ -751,6 +755,7 @@ const transformFormEditData = (form) => {
appointmentRequiredFlag,
extraDetails,
comment,
busNo,
},
};
};

View File

@@ -261,7 +261,7 @@
clearable
filterable
style="width: 240px"
:disabled="form.isEditInfoDisable === 1"
:disabled="form.isEditInfoDisable === 1 || form.isEditInfoDisable === 2"
>
<el-option
v-for="dict in med_chrgitm_type"

View File

@@ -111,7 +111,7 @@
key="busNo"
prop="busNo"
:show-overflow-tooltip="true"
width="200"
width="150"
/>
<el-table-column
label="器材名称"
@@ -119,7 +119,15 @@
key="name"
prop="name"
:show-overflow-tooltip="true"
width="200"
width="100"
/>
<el-table-column
label="包装规格"
align="center"
key="size"
prop="size"
width="100"
:show-overflow-tooltip="true"
/>
<!-- <el-table-column
label="拼音"
@@ -152,14 +160,6 @@
:show-overflow-tooltip="true"
width="100"
/>
<el-table-column
label="包装规格"
align="center"
key="size"
prop="size"
width="200"
:show-overflow-tooltip="true"
/>
<el-table-column
label="拆零比"
align="center"
@@ -182,7 +182,7 @@
key="minUnitCode_dictText"
prop="minUnitCode_dictText"
:show-overflow-tooltip="true"
width="120"
width="100"
/>
<!-- <el-table-column
label="所属科室"

View File

@@ -124,7 +124,7 @@
clearable
filterable
style="width: 240px"
:disabled="form.isEditInfoDisable === 1"
:disabled="form.isEditInfoDisable === 1 || form.isEditInfoDisable === 2"
>
<el-option
v-for="dict in med_chrgitm_type"
@@ -201,12 +201,9 @@
</el-col>
<el-col :span="8">
<el-form-item label="财务类型" prop="itemTypeCode">
<el-select
v-model="form.itemTypeCode"
clearable
filterable
:disabled="form.isEditInfoDisable === 1"
>
<el-select v-model="form.itemTypeCode" clearable filterable>
<!-- :disabled="form.isEditInfoDisable === 1" -->
<el-option
v-for="category in fin_type_code"
:key="category.value"
@@ -248,8 +245,13 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item label="诊疗子项">
<div v-if="form.isEditInfoDisable === 0" style="position: relative">
<PopoverList @search="handleSearch" :width="1000" :modelValue="item.name">
<div style="position: relative">
<PopoverList
@search="handleSearch"
:width="1000"
:modelValue="item.name"
@focus="popoverListhandleFocus(item.name)"
>
<template #popover-content="{}">
<medicineList
@selectRow="(row) => selectRow(row, index)"
@@ -275,7 +277,7 @@
"
/>
</div>
<span v-else>{{ item.name || '' }}</span>
<!-- <span v-else>{{ item.name || '' }}</span> -->
</el-form-item>
</el-col>
<el-col :span="8">
@@ -364,6 +366,7 @@ const { unit_code, med_chrgitm_type, fin_type_code, activity_category_code, chrg
'chrgitm_lv'
);
const isTemplateActive = ref(true);
const title = ref('');
const visible = ref(false);
const emits = defineEmits(['submit']); // 声明自定义事件
@@ -420,6 +423,10 @@ const props = defineProps({
type: Object,
required: false,
},
isEditInfoDisable: {
type: Number,
required: false,
},
});
// 表单数组,初始一条记录
@@ -484,6 +491,7 @@ function show() {
exeOrganizations.value = props.exeOrganizations;
typeEnumOptions.value = props.typeEnumOptions;
form.value.categoryCode = props.currentCategoryEnum;
form.value.isEditInfoDisable = props.isEditInfoDisable;
visible.value = true;
}
@@ -638,10 +646,20 @@ function handleSearch(value) {
medicineSearchKey.value = value;
}
function popoverListhandleFocus(value) {
// debugger;
console.log(value);
if (value === '') {
return;
}
medicineSearchKey.value = value;
}
function selectRow(row, index) {
treatmentItems.value[index].name = row.name;
treatmentItems.value[index].adviceDefinitionId = row.id;
treatmentItems.value[index].retailPrice = row.retailPrice || 0;
medicineSearchKey.value = '';
calculateTotalPrice();
}

View File

@@ -217,6 +217,7 @@
:statusFlagOptions="statusFlagOptions"
:exeOrganizations="exeOrganizations"
:typeEnumOptions="typeEnumOptions"
:isEditInfoDisable="isEditInfoDisable"
:title="title"
:item="currentData"
@submit="getList()"

View File

@@ -114,11 +114,7 @@
</el-col>
<el-col :span="6">
<el-form-item label="规格" prop="totalVolume">
<el-input
v-model="form.totalVolume"
placeholder=""
clearable
/>
<el-input v-model="form.totalVolume" placeholder="" clearable />
</el-form-item>
</el-col>
<el-col :span="6">
@@ -453,7 +449,7 @@
clearable
filterable
style="width: 240px"
:disabled="form.isEditInfoDisable === 1"
:disabled="form.isEditInfoDisable === 1 || form.isEditInfoDisable === 2"
>
<el-option
v-for="dict in med_chrgitm_type"
@@ -970,7 +966,6 @@ function reset() {
}
/** 提交按钮 */
function submitForm() {
form.value.activeFlag == true ? (form.value.activeFlag = 1) : (form.value.activeFlag = 0); //是否为活性
form.value.ybMatchFlag == true ? (form.value.ybMatchFlag = 1) : (form.value.ybMatchFlag = 0); //医保是否对码
form.value.skinTestFlag == true ? (form.value.skinTestFlag = 1) : (form.value.skinTestFlag = 0); //是否皮试

View File

@@ -155,6 +155,8 @@
:show-overflow-tooltip="true"
min-width="110"
width="200px"
sortable
:sort-by="(row) => getPinyinFirstLetter(row)"
/>
<el-table-column
label="规格"
@@ -588,6 +590,13 @@ function submitForm(formData) {
getMedicationCategoryList();
getList();
// 药品名称按照第一个汉字首字母排序
function getPinyinFirstLetter(row){
const firstChar = row.merchandisePyStr.charAt(0);
return firstChar.toUpperCase();
};
</script>
<style scoped>
.el-form--inline .el-form-item {

View File

@@ -129,4 +129,25 @@ export function getChargeInfo(param) {
method: 'get',
params: param
})
}
}
/**
* 微信支付
*/
export function wxPay (data) {
return request ({
url: '/three-part/pay/pay-for',
method: 'post',
data: data,
});
}
/**
* 微信支付
*/
export function WxPayResult (data) {
return request ({
url: '/three-part/pay/pay-query'+data.paymentId,
method: 'get',
});
}

View File

@@ -35,14 +35,14 @@
v-model="item.payEnum"
placeholder="选择支付方式"
style="width: 160px"
@change="clearAmount(index)"
@change="(value) => clearAmount(index, value)"
>
<el-option
v-for="payEnum in selfPayMethods"
:key="payEnum.value"
:label="payEnum.label"
:value="payEnum.value"
:disabled="isMethodDisabled(payEnum.value)"
:disabled="isMethodDisabled(payEnum)"
/>
</el-select>
<span>支付金额</span>
@@ -94,6 +94,17 @@
</el-radio-group>
</div>
</div>
<div class="payment-item">
<span>{{ payTypeText }}支付</span>
<el-input
ref="txtCodeRef"
v-model="txtCode"
style="width: 300px"
:placeholder="payTypePlaceholder"
/>
<el-button link type="primary" @click="handleWxPay()">扫码支付</el-button>
<el-button link type="primary" @click="getWxPayResult()">查看结果</el-button>
</div>
<div>
<el-table :data="props.details" max-height="200" border>
<el-table-column prop="payEnumText" label="支付类型" align="center" />
@@ -137,13 +148,22 @@
</template>
<script setup>
import { savePayment, unprecharge, dispenseMedicalConsumables, getChargeInfo } from './api';
import {
savePayment,
unprecharge,
dispenseMedicalConsumables,
wxPay,
WxPayResult,
getChargeInfo,
} from './api';
import { computed, watch, reactive, ref, getCurrentInstance, nextTick } from 'vue';
import { Delete } from '@element-plus/icons-vue';
import { debounce } from 'lodash-es';
import useUserStore from '@/store/modules/user';
import { hiprint } from 'vue-plugin-hiprint';
import templateJson from './template.json';
import { pa } from 'element-plus/es/locales.mjs';
import printUtils, { PRINT_TEMPLATE } from '@/utils/printUtils';
const props = defineProps({
open: {
@@ -168,34 +188,37 @@ const props = defineProps({
default: undefined,
},
chargeItemIds: {
type: [],
default: [],
type: Array,
default: () => [],
},
consumablesIdList: {
type: [],
default: [],
type: Array,
default: () => [],
},
chrgBchnoList: {
type: [],
default: [],
type: Array,
default: () => [],
},
details: {
type: Object,
default: undefined,
},
chargedItems: {
type: [],
default: [],
type: Array,
default: () => [],
},
});
const { proxy } = getCurrentInstance();
const { charge_discount } = proxy.useDict('charge_discount');
// 单位字典
const { unit_code } = proxy.useDict('unit_code');
const userStore = useUserStore();
const discountRadio = ref(undefined);
const discountRadio = ref();
const discountAmount = ref(0);
const txtCode = ref('');
const formData = reactive({
totalAmount: 0,
@@ -211,6 +234,7 @@ const dialogLoading = ref(false);
watch(
() => props.totalAmount,
(newValue) => {
nextTick(() => {});
formData.totalAmount = newValue;
formData.selfPay[0].amount = newValue;
}
@@ -219,121 +243,363 @@ watch(
const emit = defineEmits(['close']);
let displayAmountTemp = 0;
// 打印小票
function printReceipt(param) {
let total = 0;
props.chargedItems.forEach((item) => {
total += item.totalPrice || 0;
});
// 构造一个新的对象,添加头 "data"
const result = {
data: [
{
...param,
// 基础支付类型
YB_FUND_PAY:
param.detail?.find((t) => t.payEnum === 100000)?.amount.toFixed(2) + ' 元' ?? 0, // 基金支付总额
SELF_PAY: param.detail?.find((t) => t.payEnum === 200000)?.amount.toFixed(2) + ' 元' ?? 0, // 个人负担总金额
OTHER_PAY: param.detail?.find((t) => t.payEnum === 300000)?.amount ?? 0, // 其他(如医院负担金额)
// 获取单位字典数据的方法
const getUnitLabel = (unitCode) => {
if (!unitCode) return '';
// 基本医保统筹基金支出
YB_TC_FUND_AMOUNT:
param.detail?.find((t) => t.payEnum === 110000)?.amount.toFixed(2) + ' 元' ?? 0, // 基本医保统筹基金支出
YB_BC_FUND_AMOUNT:
param.detail?.find((t) => t.payEnum === 120000)?.amount.toFixed(2) + ' 元' ?? 0, // 补充医疗保险基金支出
YB_JZ_FUND_AMOUNT:
param.detail?.find((t) => t.payEnum === 130000)?.amount.toFixed(2) + ' 元' ?? 0, // 医疗救助基金支出
// YB_OTHER_AMOUNT: param.detail.find((t) => t.payEnum === 140000)?.amount ?? 0, // 其他支出
// 从已加载的 unit_code 字典中查找对应项
const unit = unit_code.value?.find((item) => item.value === unitCode);
return unit ? unit.label : ''; // 如果找不到则返回空字符串
};
// 职工基本医疗保险
// YB_TC_ZG_FUND_VALUE: param.detail.find((t) => t.payEnum === 110100)?.amount ?? 0, // 职工基本医疗保险
// YB_TC_JM_FUND_VALUE: param.detail.find((t) => t.payEnum === 110200)?.amount ?? 0, // 居民基本医疗保险(修正原错误注释)
async function printReceipt(param) {
// 打印收费小票数据
console.log('打印收费小票数据:', param.chargeItem);
// console.log('!!!!!!!!!选中的收费项目:', param.chargedItems);
console.log('患者信息:', props.patientInfo);
// formData.totalAmount = props.totalAmount;
// 确保第一个支付方式的金额与总金额一致;
if (formData.selfPay.length > 0) {
formData.selfPay[0].amount = props.totalAmount;
}
formData.selfPay = [
{
payEnum: 220100, // 现金支付
amount: props.totalAmount,
payLevelEnum: 2,
},
];
// 补充医疗保险基金支出细分
// YB_BC_JM_DB_VALUE: param.detail.find((t) => t.payEnum === 120100)?.amount ?? 0, // 全体参保人的居民大病保险
// YB_BC_DE_BZ_VALUE: param.detail.find((t) => t.payEnum === 120200)?.amount ?? 0, // 大额医疗费用补助
// YB_BC_ZG_DE_BZ_VALUE: param.detail.find((t) => t.payEnum === 120300)?.amount ?? 0, // 企业职工大额医疗费用补助
// YB_BC_GWY_BZ_VALUE: param.detail.find((t) => t.payEnum === 120400)?.amount ?? 0, // 公务员医疗补助
try {
// 处理param.chargedItems添加quantityWithUnit字段
const processedChargeItems = (param.chargeItem || []).map((item) => {
// 获取单位标签
const unitLabel = getUnitLabel(item.quantityUnit);
// 拼接数量和单位
const quantityWithUnit = unitLabel
? `${item.quantityValue} ${unitLabel}`
: item.quantityValue;
// 其他支出细分
// OTHER_PAY_DD_FUND_VALUE: param.detail.find((t) => t.payEnum === 300001)?.amount ?? 0, // 兜底基金支出
// OTHER_PAY_YW_SH_FUND_VALUE: param.detail.find((t) => t.payEnum === 300002)?.amount ?? 0, // 意外伤害基金支出
// OTHER_PAY_LX_YL_FUND_VALUE: param.detail.find((t) => t.payEnum === 300003)?.amount ?? 0, // 离休人员医疗保障金支出
// OTHER_PAY_LX_YH_FUND_VALUE: param.detail.find((t) => t.payEnum === 300004)?.amount ?? 0, // 离休人员优惠金支出
// OTHER_PAY_CZ_FUND_VALUE: param.detail.find((t) => t.payEnum === 300005)?.amount ?? 0, // 财政基金支出
// OTHER_PAY_CZ_YZ_FUND_VALUE: param.detail.find((t) => t.payEnum === 300006)?.amount ?? 0, // 财政预支支出
// OTHER_PAY_ZG_DB_FUND_VALUE: param.detail.find((t) => t.payEnum === 300007)?.amount ?? 0, // 职工大病基金支出
// OTHER_PAY_EY_FUND_VALUE: param.detail.find((t) => t.payEnum === 300008)?.amount ?? 0, // 二乙基金支出
// OTHER_PAY_QX_JZ_FUND_VALUE: param.detail.find((t) => t.payEnum === 300009)?.amount ?? 0, // 倾斜救助支出
// OTHER_PAY_YL_JZ_FUND_VALUE: param.detail.find((t) => t.payEnum === 300010)?.amount ?? 0, // 医疗救助再救助基金
// HOSP_PART_AMT: param.detail.find((t) => t.payEnum === 300011)?.amount ?? 0, // 医院负担金额
return {
...item,
quantityWithUnit, // 添加带单位的数量字段供打印使用
};
});
// 医保结算返回值
FULAMT_OWNPAY_AMT:
param.detail?.find((t) => t.payEnum === 1)?.amount.toFixed(2) + ' 元' ?? 0, // 全自费金额
// OVERLMT_SELFPAY: param.detail.find((t) => t.payEnum === 3)?.amount ?? 0, // 超限价自费费用
// PRESELFPAY_AMT: param.detail.find((t) => t.payEnum === 4)?.amount ?? 0, // 先行自付金额
INSCP_SCP_AMT: param.detail?.find((t) => t.payEnum === 5)?.amount.toFixed(2) + ' 元' ?? 0, // 符合政策范围金额
// ACT_PAY_DEDC: param.detail.find((t) => t.payEnum === 6)?.amount ?? 0, // 实际支付起付线
// POOL_PROP_SELFPAY: param.detail.find((t) => t.payEnum === 7)?.amount ?? 0, // 基本医疗保险统筹基金支付比例
// BALC: param.detail.find((t) => t.payEnum === 8)?.amount ?? 0, // 余额
// 构造打印数据,整合选中行信息
const printData = {
data: [
{
...param,
// 特殊支付方式
SELF_YB_ZH_PAY:
param.detail?.find((t) => t.payEnum === 210000)?.amount.toFixed(2) + ' 元' ?? 0, // 个人医保账户支付
// SELF_YB_ZH_GJ_VALUE: param.detail.find((t) => t.payEnum === 210100)?.amount ?? 0, // 账户共济支付金额
// SELF_CASH_PAY: param.detail.find((t) => t.payEnum === 220000)?.amount ?? 0, // 个人现金支付金额
// SELF_VX_PAY: param.detail.find((t) => t.payEnum === 230000)?.amount ?? 0, // 微信支付金额
// SELF_ALI_PAY: param.detail.find((t) => t.payEnum === 240000)?.amount ?? 0, // 阿里支付金额
// 收费项目列表
chargeItemsList: processedChargeItems,
// chargeItemsList: param.chargeItem,
// 现金支付细分
// SELF_CASH_VALUE: param.detail.find((t) => t.payEnum === 220400)?.amount ?? 0, // 个人现金支付金额(现金)
// SELF_CASH_VX_VALUE: param.detail.find((t) => t.payEnum === 220100)?.amount ?? 0, // 个人现金支付金额(微信)
// SELF_CASH_ALI_VALUE: param.detail.find((t) => t.payEnum === 220200)?.amount ?? 0, // 个人现金支付金额(支付宝)
// SELF_CASH_UNION_VALUE: param.detail.find((t) => t.payEnum === 220300)?.amount ?? 0, // 个人现金支付金额(银联)
// 基础支付类型
// 基金类型(扩展)
// BIRTH_FUND: param.detail.find((t) => t.payEnum === 510100)?.amount ?? 0, // 生育基金
// RETIREE_MEDICAL: param.detail.find((t) => t.payEnum === 340100)?.amount ?? 0, // 离休人员医疗保障基金
// URBAN_BASIC_MEDICAL: param.detail.find((t) => t.payEnum === 390100)?.amount ?? 0, // 城乡居民基本医疗保险基金
// URBAN_SERIOUS_ILLNESS: param.detail.find((t) => t.payEnum === 390200)?.amount ?? 0, // 城乡居民大病医疗保险基金
// MEDICAL_ASSISTANCE: param.detail.find((t) => t.payEnum === 610100)?.amount ?? 0, // 医疗救助基金
// GOVERNMENT_SUBSIDY: param.detail.find((t) => t.payEnum === 640100)?.amount ?? 0, // 政府兜底基金
// ACCIDENT_INSURANCE: param.detail.find((t) => t.payEnum === 390400)?.amount ?? 0, // 意外伤害基金
// CARE_INSURANCE: param.detail.find((t) => t.payEnum === 620100)?.amount ?? 0, // 照护保险基金
// FINANCIAL_FUND: param.detail.find((t) => t.payEnum === 360100)?.amount ?? 0, // 财政基金
// HOSPITAL_ADVANCE: param.detail.find((t) => t.payEnum === 999900)?.amount ?? 0, // 医院垫付
// SUPPLEMENTARY_INSURANCE: param.detail.find((t) => t.payEnum === 390300)?.amount ?? 0, // 城乡居民大病补充保险基金
// HEALTHCARE_PREPAYMENT: param.detail.find((t) => t.payEnum === 360300)?.amount ?? 0, // 保健预支基金
Mr_QR_Code: param.regNo,
sex: props.patientInfo.genderEnum_enumText,
age: props.patientInfo.age,
personType: '职工医保',
fixmedinsName: param.fixmedinsName + '门诊收费明细',
name: props.patientInfo.patientName, // 姓名
gender: props.patientInfo.genderEnum_enumText, // 性别
age: props.patientInfo.age, // 年龄
encounterBusNo: props.patientInfo.encounterBusNo, // 病例号
currentDate: currentDate.value, // 收费日期
chargedItems: props.chargedItems, // 收费项目
totalAmount: props.totalAmount.toFixed(2) + ' 元', // 应收金额
itemTotalAmount: total.toFixed(2) + ' 元', // 应收金额
displayAmount: displayAmountTemp + ' 元', // 实收金额
returnedAmount: returnedAmount.value + ' 元', // 应找零
userName: userStore.nickName,
},
],
};
const printElements = templateJson;
var hiprintTemplate = new hiprint.PrintTemplate({ template: printElements }); // 定义模板
// 金额大于0时显示金额和单位等于0时不显示单位
YB_FUND_PAY: (() => {
const amount = param.detail.find((t) => t.payEnum === 100000)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 基金支付总额
SELF_PAY: (() => {
const amount = param.detail.find((t) => t.payEnum === 200000)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 个人负担总金额
OTHER_PAY: (() => {
const amount = param.detail.find((t) => t.payEnum === 300000)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 其他(如医院负担金额)
hiprintTemplate.print2(result.data[0], {
printer: 'xp',
title: '门诊收费结算单',
// 基本医保统筹基金支出
YB_TC_FUND_AMOUNT: (() => {
const amount = param.detail.find((t) => t.payEnum === 110000)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 基本医保统筹基金支出
YB_BC_FUND_AMOUNT: (() => {
const amount = param.detail.find((t) => t.payEnum === 120000)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 补充医疗保险基金支出
YB_JZ_FUND_AMOUNT: (() => {
const amount = param.detail.find((t) => t.payEnum === 130000)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 医疗救助基金支出
YB_OTHER_AMOUNT: (() => {
const amount = param.detail.find((t) => t.payEnum === 140000)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 其他支出
// 职工基本医疗保险
YB_TC_ZG_FUND_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 110100)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 职工基本医疗保险
YB_TC_JM_FUND_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 110200)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 居民基本医疗保险
// 补充医疗保险基金支出细分
YB_BC_JM_DB_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 120100)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 全体参保人的居民大病保险
YB_BC_DE_BZ_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 120200)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 大额医疗费用补助
YB_BC_ZG_DE_BZ_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 120300)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 企业职工大额医疗费用补助
YB_BC_GWY_BZ_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 120400)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 公务员医疗补助
// 其他支出细分
OTHER_PAY_DD_FUND_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 300001)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 兜底基金支出
OTHER_PAY_YW_SH_FUND_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 300002)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 意外伤害基金支出
OTHER_PAY_LX_YL_FUND_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 300003)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 离休人员医疗保障金支出
OTHER_PAY_LX_YH_FUND_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 300004)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 离休人员优惠金支出
OTHER_PAY_CZ_FUND_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 300005)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 财政基金支出
OTHER_PAY_CZ_YZ_FUND_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 300006)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 财政预支支出
OTHER_PAY_ZG_DB_FUND_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 300007)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 职工大病基金支出
OTHER_PAY_EY_FUND_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 300008)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 二乙基金支出
OTHER_PAY_QX_JZ_FUND_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 300009)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 倾斜救助支出
OTHER_PAY_YL_JZ_FUND_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 300010)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 医疗救助再救助基金
HOSP_PART_AMT: (() => {
const amount = param.detail.find((t) => t.payEnum === 300011)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 医院负担金额
// 医保结算返回值
FULAMT_OWNPAY_AMT: (() => {
const amount = param.detail.find((t) => t.payEnum === 1)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 全自费金额
OVERLMT_SELFPAY: (() => {
const amount = param.detail.find((t) => t.payEnum === 3)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 超限价自费费用
PRESELFPAY_AMT: (() => {
const amount = param.detail.find((t) => t.payEnum === 4)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 先行自付金额
INSCP_SCP_AMT: (() => {
const amount = param.detail.find((t) => t.payEnum === 5)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 符合政策范围金额
ACT_PAY_DEDC: (() => {
const amount = param.detail.find((t) => t.payEnum === 6)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 实际支付起付线
POOL_PROP_SELFPAY: (() => {
const amount = param.detail.find((t) => t.payEnum === 7)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 基本医疗保险统筹基金支付比例
BALC: (() => {
const amount = param.detail.find((t) => t.payEnum === 8)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 余额
// 特殊支付方式
SELF_YB_ZH_PAY: (() => {
const amount = param.detail.find((t) => t.payEnum === 210000)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 个人医保账户支付
SELF_YB_ZH_GJ_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 210100)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 账户共济支付金额
SELF_CASH_PAY: (() => {
const amount = param.detail.find((t) => t.payEnum === 220000)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 个人现金支付金额
SELF_VX_PAY: (() => {
const amount = param.detail.find((t) => t.payEnum === 230000)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 微信支付金额
SELF_ALI_PAY: (() => {
const amount = param.detail.find((t) => t.payEnum === 240000)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 阿里支付金额
// 现金支付细分
SELF_CASH_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 220400)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 个人现金支付金额(现金)
SELF_CASH_VX_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 220100)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 个人现金支付金额(微信)
SELF_CASH_ALI_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 220200)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 个人现金支付金额(支付宝)
SELF_CASH_UNION_VALUE: (() => {
const amount = param.detail.find((t) => t.payEnum === 220300)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 个人现金支付金额(银联)
// 基金类型(扩展)
BIRTH_FUND: (() => {
const amount = param.detail.find((t) => t.payEnum === 510100)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 生育基金
RETIREE_MEDICAL: (() => {
const amount = param.detail.find((t) => t.payEnum === 340100)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 离休人员医疗保障基金
URBAN_BASIC_MEDICAL: (() => {
const amount = param.detail.find((t) => t.payEnum === 390100)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 城乡居民基本医疗保险基金
URBAN_SERIOUS_ILLNESS: (() => {
const amount = param.detail.find((t) => t.payEnum === 390200)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 城乡居民大病医疗保险基金
MEDICAL_ASSISTANCE: (() => {
const amount = param.detail.find((t) => t.payEnum === 610100)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 医疗救助基金
GOVERNMENT_SUBSIDY: (() => {
const amount = param.detail.find((t) => t.payEnum === 640100)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 政府兜底基金
ACCIDENT_INSURANCE: (() => {
const amount = param.detail.find((t) => t.payEnum === 390400)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 意外伤害基金
CARE_INSURANCE: (() => {
const amount = param.detail.find((t) => t.payEnum === 620100)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 照护保险基金
FINANCIAL_FUND: (() => {
const amount = param.detail.find((t) => t.payEnum === 360100)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 财政基金
HOSPITAL_ADVANCE: (() => {
const amount = param.detail.find((t) => t.payEnum === 999900)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 医院垫付
SUPPLEMENTARY_INSURANCE: (() => {
const amount = param.detail.find((t) => t.payEnum === 390300)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 城乡居民大病补充保险基金
HEALTHCARE_PREPAYMENT: (() => {
const amount = param.detail.find((t) => t.payEnum === 360300)?.amount ?? 0;
return amount > 0 ? amount + ' 元' : amount;
})(), // 保健预支基金
//微信刷卡支付
SELF_CASH_VX_VALUE: (() => {
// const cashValue = param.detail.find((t) => t.payEnum === 220400)?.amount ?? 0;
const vxValue = param.detail.find((t) => t.payEnum === 220100)?.amount ?? 0;
const unionValue = param.detail.find((t) => t.payEnum === 220300)?.amount ?? 0;
const aliValue = param.detail.find((t) => t.payEnum === 220200)?.amount ?? 0;
return vxValue + unionValue + aliValue + ' 元';
})(),
Mr_QR_Code: param.regNo,
sex: props.patientInfo?.genderEnum_enumText || '',
age: props.patientInfo?.age || '',
personType: param.contractName,
fixmedinsName: param.fixmedinsName + '门诊收费明细',
//电子收据二维码
pictureUrl: param.pictureUrl || 'https://chinaebill.com/img/xiaochengxu.png',
// 添加本地患者信息,注意安全访问
name: props.patientInfo?.patientName || '',
gender: props.patientInfo?.genderEnum_enumText || '',
encounterBusNo: props.patientInfo?.encounterBusNo || '',
currentDate: currentDate.value,
// chargedItems: props.chargedItems,
// 优先使用选中行的金额字段值(从图片中获取)
totalAmount:
(param.selectedRow?.receivableAmount
? param.selectedRow.receivableAmount.toFixed(2)
: props.totalAmount.toFixed(2)) + ' 元',
displayAmount:
(param.selectedRow?.receivedAmount
? param.selectedRow.receivedAmount.toFixed(2)
: displayAmount.value) + ' 元',
returnedAmount: returnedAmount.value + ' 元',
userName: userStore.nickName,
},
],
};
// 使用printUtils进行打印
// 选择门诊收费打印模板并传递正确的数据格式
console.log('789797987897', printData.data[0]);
await printUtils.print(PRINT_TEMPLATE.OUTPATIENT_CHARGE, printData.data[0]);
console.log('打印成功');
} catch (error) {
console.error('打印失败:', error);
proxy.$modal.msgError('打印失败: ' + error.message);
}
}
const throttledGetList = debounce(submit, 300);
function handleWxPay() {
wxPay({
txtCode: txtCode.value,
chargeItemIds: props.chargeItemIds,
encounterId: props.patientInfo.encounterId,
id: props.paymentId,
paymentDetails: formData.selfPay,
ybMdtrtCertType: props.userCardInfo.psnCertType,
busiCardInfo: props.userCardInfo.busiCardInfo,
});
}
const throttledGetList = debounce(submit, 300);
function getWxPayResult() {
WxPayResult({
txtCode: txtCode.value,
chargeItemIds: props.chargeItemIds,
encounterId: props.patientInfo.encounterId,
id: props.paymentId,
paymentDetails: formData.selfPay,
ybMdtrtCertType: props.userCardInfo.psnCertType,
busiCardInfo: props.userCardInfo.busiCardInfo,
});
}
function handleOpen() {
formData.totalAmount = props.totalAmount;
@@ -342,8 +608,6 @@ function handleOpen() {
async function submit() {
displayAmountTemp = displayAmount.value;
console.log(parseFloat(displayAmount.value), 'parseFloat(displayAmount.value)');
console.log(formData.totalAmount, 'formData.totalAmount');
let amount = formData.selfPay
.reduce((sum, item) => {
@@ -366,12 +630,13 @@ async function submit() {
.then((res) => {
if (res.code == 200) {
getChargeInfo({ paymentId: props.paymentId }).then((res) => {
printReceipt(res.data);
// 传递完整的选中数据信息到打印方法
printReceipt({ ...res.data, chargedItems: props.chargedItems });
});
formData.selfPay = [{ payEnum: 220100, amount: 0.0, payLevelEnum: 2 }];
emit('close', 'success', res.msg);
emit('refresh'); // 发送刷新事件给父组件
// 长春大学自动发耗材
// 长春市朝阳区中医院自动发耗材
if (userStore.fixmedinsCode == 'H22010200672' && props.consumablesIdList.length > 0) {
dispenseMedicalConsumables(props.consumablesIdList);
}
@@ -422,11 +687,11 @@ async function print() {
const currentDate = ref(new Date().toLocaleString());
const selfPayMethods = [
{ label: '现金', value: 220400 },
{ label: '微信', value: 220100 },
{ label: '支付宝', value: 220200 },
{ label: '银联', value: 220300 },
{ label: '优惠', value: 220500 },
{ label: '现金', value: 220400, isWebPay: false },
{ label: '微信', value: 220100, isWebPay: true },
{ label: '支付宝', value: 220200, isWebPay: true },
{ label: '银联', value: 220300, isWebPay: true },
{ label: '优惠', value: 220500, isWebPay: false },
];
// 计算剩余可输入金额
@@ -459,8 +724,25 @@ function handleDiscountChange(value) {
}
// 检查支付方式是否已使用
const isMethodDisabled = (payEnum) => {
return formData.selfPay.some((item) => item.payEnum === payEnum);
const isMethodDisabled = (option) => {
if (formData.selfPay.length > 1) {
// 禁用已被选择的相同方式,避免重复选择
const selectedEnums = formData.selfPay.map((item) => item.payEnum);
if (selectedEnums.includes(option.value)) {
return true;
}
// 若已经选择了任一线上支付方式,则其他线上方式不可再选,仅允许现金等线下方式
const hasSelectedWebPay = selectedEnums.some((val) => {
const found = selfPayMethods.find((m) => m.value === val);
return found ? found.isWebPay === true : false;
});
if (hasSelectedWebPay && option.isWebPay) {
return true;
}
return false;
} else {
return false;
}
};
const handleAmountChange = () => {
@@ -478,8 +760,18 @@ const removePayment = (index) => {
formData.selfPay.splice(index, 1);
};
const clearAmount = (index) => {
// formData.selfPay[index].amount = 0;
const payTypeText = ref('微信');
const payTypePlaceholder = computed(() => {
if (payTypeText.value === '现金') {
return '请输入现金金额';
}
return payTypeText.value + '支付二维码';
});
const clearAmount = (index, value) => {
const selectedOption = selfPayMethods.find((item) => item.value === value);
if (selectedOption) {
payTypeText.value = selectedOption.label;
}
};
// 计算属性

View File

@@ -1,31 +1,63 @@
<template>
<div style="display: flex; justify-content: space-between" class="app-container" v-loading="readCardLoading"
:element-loading-text="loadingText">
<div
style="display: flex; justify-content: space-between"
class="app-container"
v-loading="readCardLoading"
:element-loading-text="loadingText"
>
<el-card style="width: 30%">
<template #header>
<span style="vertical-align: middle">患者列表</span>
</template>
<div style="width: 100%">
<el-input v-model="queryParams.searchKey" placeholder="请输入患者名/病历号" clearable
style="width: 48%; margin-bottom: 10px; margin-right: 10px" @keyup.enter="getPatientList">
<el-input
v-model="queryParams.searchKey"
placeholder="请输入患者名/病历号"
clearable
style="width: 48%; margin-bottom: 10px; margin-right: 10px"
@keyup.enter="getPatientList"
>
<template #append>
<el-button icon="Search" @click="getPatientList" />
</template>
</el-input>
<el-select v-model="queryParams.statusEnum" style="width: 48%; margin-bottom: 10px; margin-right: 10px"
placeholder="收费状态" @change="getPatientList">
<el-option v-for="item in chargeStatusOptions" :key="item.value" :label="item.label" :value="item.value" />
<el-select
v-model="queryParams.statusEnum"
style="width: 48%; margin-bottom: 10px; margin-right: 10px"
placeholder="收费状态"
@change="getPatientList"
>
<el-option
v-for="item in chargeStatusOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<div style="width: 100%">
<el-date-picker v-model="receptionTime" type="daterange" range-separator="~" start-placeholder="开始时间"
end-placeholder="结束时间" placement="bottom" value-format="YYYY-MM-DD"
style="width: 84%; margin-bottom: 10px; margin-right: 10px" @change="getPatientList" />
<el-date-picker
v-model="receptionTime"
type="daterange"
range-separator="~"
start-placeholder="开始时间"
end-placeholder="结束时间"
placement="bottom"
value-format="YYYY-MM-DD"
style="width: 84%; margin-bottom: 10px; margin-right: 10px"
@change="getPatientList"
/>
<el-button type="primary" style="margin-bottom: 10px" @click="getPatientList">
搜索
</el-button>
</div>
<el-table ref="patientListRef" height="620" :data="patientList" row-key="encounterId" @cell-click="clickRow"
highlight-current-row>
<el-table
ref="patientListRef"
height="620"
:data="patientList"
row-key="encounterId"
@cell-click="clickRow"
highlight-current-row
>
<el-table-column label="病历号" align="center" prop="encounterBusNo" />
<el-table-column label="姓名" align="center" prop="patientName" />
<!-- <el-table-column label="时间" align="center" prop="receptionTime" width="160">
@@ -70,31 +102,64 @@
<el-button type="primary" plain @click="handleReadCard('01')" style="width: 65px">
电子凭证
</el-button>
<el-button type="primary" plain @click="handleReadCard('02')" style="width: 65px" :disabled="true">
<el-button
type="primary"
plain
@click="handleReadCard('02')"
style="width: 65px"
:disabled="true"
>
身份证
</el-button>
<el-button type="primary" plain @click="handleReadCard('03')" style="width: 65px">
医保卡
</el-button>
<el-button type="primary" @click="payToSelt()" style="margin-left: 20px" :disabled="buttonDisabled">
<el-button
type="primary"
@click="payToSelt()"
style="margin-left: 20px"
:disabled="buttonDisabled"
>
医保转自费
</el-button>
<el-button type="primary" @click="patToMedicalInsurance()" style="margin-left: 20px"
:disabled="buttonDisabled">
<el-button
type="primary"
@click="patToMedicalInsurance()"
style="margin-left: 20px"
:disabled="buttonDisabled"
>
自费转医保
</el-button>
<el-button type="primary" @click="studentPayTosStudentSelf()" style="margin-left: 20px"
:disabled="buttonDisabled">
<el-button
type="primary"
@click="studentPayTosStudentSelf()"
style="margin-left: 20px"
:disabled="buttonDisabled"
>
学生医保转学生自费
</el-button>
<el-button type="primary" @click="studentSelfToStudentPay()" style="margin-left: 20px"
:disabled="buttonDisabled">
<el-button
type="primary"
@click="studentSelfToStudentPay()"
style="margin-left: 20px"
:disabled="buttonDisabled"
>
学生自费转学生医保
</el-button>
<span style="float: right">合计金额{{ totalAmounts ? totalAmounts.toFixed(2) : 0 }}</span>
<span style="float: right"
>合计金额{{ totalAmounts ? totalAmounts.toFixed(2) : 0 }}</span
>
</div>
<el-table ref="chargeListRef" height="530" :data="chargeList" row-key="id"
@selection-change="handleSelectionChange" v-loading="chargeLoading" :span-method="objectSpanMethod" border>
<el-table
ref="chargeListRef"
height="530"
:data="chargeList"
row-key="id"
@selection-change="handleSelectionChange"
v-loading="chargeLoading"
:span-method="objectSpanMethod"
border
>
<el-table-column type="selection" :selectable="checkSelectable" width="55" />
<el-table-column label="单据号" align="center" prop="busNo" width="180" />
<el-table-column label="收费项目" align="center" prop="itemName" width="200" />
@@ -104,7 +169,16 @@
<el-table-column label="费用性质" align="center" prop="contractName" />
<el-table-column label="收费状态" align="center" prop="statusEnum_enumText" width="150">
<template #default="scope">
<el-tag :type="scope.row.statusEnum === 1 ? 'default' : 'success'" disable-transitions>
<el-tag v-if="scope.row.statusEnum === 1" disable-transitions>
{{ scope.row.statusEnum_enumText }}
</el-tag>
<el-tag v-else-if="scope.row.statusEnum === 5" type="success" disable-transitions>
{{ scope.row.statusEnum_enumText }}
</el-tag>
<el-tag v-else-if="scope.row.statusEnum === 8" type="danger" disable-transitions>
{{ scope.row.statusEnum_enumText }}
</el-tag>
<el-tag v-else type="warning" disable-transitions>
{{ scope.row.statusEnum_enumText }}
</el-tag>
</template>
@@ -115,9 +189,20 @@
</template>
</el-table-column>
<el-table-column label="收款人" align="center" prop="entererId_dictText" />
<el-table-column label="操作" align="center" fixed="right" header-align="center" class-name="no-hover-column">
<el-table-column
label="操作"
align="center"
fixed="right"
header-align="center"
class-name="no-hover-column"
>
<template #default="scope">
<el-button :disabled="!scope.row.paymentId" link type="primary" @click="printCharge(scope.row)">
<el-button
:disabled="!scope.row.paymentId"
link
type="primary"
@click="printCharge(scope.row)"
>
打印
</el-button>
</template>
@@ -125,10 +210,22 @@
</el-table>
</el-card>
</div>
<ChargeDialog ref="chargeDialogRef" :open="openDialog" @close="handleClose" :category="patientInfo.categoryEnum"
:totalAmount="totalAmount" :patientInfo="patientInfo" :chargeItemIds="chargeItemIdList"
:consumablesIdList="consumablesIdList" :chrgBchnoList="chrgBchnoList" :userCardInfo="userCardInfo"
:paymentId="paymentId" :details="details" :chargedItems="chargedItems" @refresh="getPatientList" />
<ChargeDialog
ref="chargeDialogRef"
:open="openDialog"
@close="handleClose"
:category="patientInfo.categoryEnum"
:totalAmount="totalAmount"
:patientInfo="patientInfo"
:chargeItemIds="chargeItemIdList"
:consumablesIdList="consumablesIdList"
:chrgBchnoList="chrgBchnoList"
:userCardInfo="userCardInfo"
:paymentId="paymentId"
:details="details"
:chargedItems="chargedItems"
@refresh="getPatientList"
/>
</div>
</template>
@@ -212,7 +309,6 @@ function handleTotalAmount() {
totalAmounts.value = chargeList.value.reduce((accumulator, currentRow) => {
return new Decimal(accumulator).add(currentRow.totalPrice.toFixed(2) || 0);
}, new Decimal(0));
} else {
totalAmounts.value = selectedRows.value.reduce((accumulator, currentRow) => {
return new Decimal(accumulator).add(currentRow.totalPrice.toFixed(2) || 0);
@@ -282,7 +378,6 @@ const consumablesIdList = ref([]);
// 确认收费
function confirmCharge() {
let selectRows = chargeListRef.value.getSelectionRows();
console.log('selectRows:', selectRows);
if (selectRows.length == 0) {
proxy.$modal.msgWarning('请选择一条收费项目');
return;
@@ -299,6 +394,9 @@ function confirmCharge() {
});
chargedItems.value = selectRows;
// 将选中的行数据赋值给chargedItems
chargedItems.value = selectRows;
// totalAmount.value = selectRows.reduce((accumulator, currentRow) => {
// return accumulator + (currentRow.totalPrice || 0);
// }, 0);
@@ -567,6 +665,19 @@ function objectSpanMethod({ row, column, rowIndex, columnIndex }) {
return [1, 1];
}
// function printCharge(row) {
// // 打印功能实现
// let rows = [];
// chargeList.value.forEach((item, index) => {
// if (item.paymentId === row.paymentId) {
// rows.push(item);
// }
// });
// chargedItems.value = rows;
// getChargeInfo({ paymentId: row.paymentId }).then((res) => {
// proxy.$refs['chargeDialogRef'].printReceipt(res.data);
// });
// }
function printCharge(row) {
// 打印功能实现
let rows = [];
@@ -577,7 +688,37 @@ function printCharge(row) {
});
chargedItems.value = rows;
getChargeInfo({ paymentId: row.paymentId }).then((res) => {
proxy.$refs['chargeDialogRef'].printReceipt(res.data);
// 设置实收金额
if (res.data && res.data.detail) {
const amountDetail = res.data.detail.find((item) => item.payEnum == 220000);
if (amountDetail) {
totalAmount.value = amountDetail.amount;
// 为合并的行设置金额相关字段值
rows.forEach((item) => {
if (item.actualPrice === undefined || item.actualPrice === null) {
item.actualPrice = 0;
}
if (item.discountAmount === undefined || item.discountAmount === null) {
item.discountAmount = 0;
}
if (item.discountRate === undefined || item.discountRate === null) {
item.discountRate = 100;
}
});
}
// 增强打印数据,包含选中行的完整信息
const enhancedPrintData = {
...res.data,
selectedRow: row, // 添加选中行的完整数据
chargedItems: rows, // 添加所有相关的收费项目
};
// 通知子组件更新内部状态
// 通过 nextTick 确保 DOM 更新后再调用打印
nextTick(() => {
proxy.$refs['chargeDialogRef'].printReceipt(enhancedPrintData);
});
}
});
}
</script>
@@ -589,4 +730,4 @@ function printCharge(row) {
:deep(.el-table__body) tr:hover td.no-hover-column {
background-color: inherit !important;
}
</style>
</style>

View File

@@ -189,8 +189,15 @@ const emit = defineEmits(['close']);
function submit() {
console.log(props.chargeItemIds);
if (parseFloat(displayAmount.value) < formData.totalAmount) {
console.log(
displayAmount.value,
parseFloat(displayAmount.value),
formData.totalAmount,
formData,
'feeRefund'
);
//比较时,将金额都转换为两位小数的字符串再转换为浮点数,避免浮点数精度问题
if (parseFloat(displayAmount.value) < parseFloat(formData.totalAmount.toFixed(2))) {
proxy.$modal.msgError('请输入正确的金额');
return;
}
@@ -247,7 +254,7 @@ function submit() {
// returnedAmount: parseFloat(returnedAmount.value),
}).then((res) => {
if (res.code == 200) {
// 长春大学自动退耗材
// 长春市朝阳区中医院自动退耗材
emit('close', 'success');
}
@@ -432,4 +439,4 @@ function close() {
.amount-input .el-input__inner {
padding-right: 30px !important;
}
</style>
</style>

View File

@@ -139,16 +139,6 @@
prop="chargeStatus_enumText"
width="100"
/>
<!-- <el-table-column
label="发药/执行状态"
align="center"
prop="dispenseStatus_enumText"
width="130"
>
<template #default="scope">
{{ scope.row.dispenseStatus_enumText || scope.row.serviceStatus_enumText }}
</template>
</el-table-column> -->
<el-table-column label="数量" align="center" width="100">
<template #default="scope">
{{ scope.row.quantityValue + ' ' + scope.row.quantityUnit_dictText }}

View File

@@ -1,5 +1,12 @@
<template>
<el-dialog title="确认收费" v-model="props.open" width="700px" append-to-body destroy-on-close>
<el-dialog
title="确认收费"
v-model="props.open"
@close="close"
width="700px"
append-to-body
destroy-on-close
>
<div v-loading="dialogLoading">
<el-text size="large" style="display: block; margin-bottom: 15px">
收费日期{{ currentDate }}
@@ -27,7 +34,7 @@
:key="payEnum.value"
:label="payEnum.label"
:value="payEnum.value"
:disabled="isMethodDisabled(payEnum.value)"
:disabled="isMethodDisabled(payEnum)"
/>
</el-select>
<span>支付金额</span>
@@ -66,6 +73,17 @@
</el-text>
</div>
</div>
<div class="payment-item">
<span>{{ payTypeText }}支付</span>
<el-input
ref="txtCodeRef"
v-model="txtCode"
style="width: 300px"
:placeholder="payTypePlaceholder"
/>
<el-button link type="primary" @click="handleWxPay()">扫码支付</el-button>
<el-button link type="primary" @click="getWxPayResult()">查看结果</el-button>
</div>
<!-- 金额汇总 -->
<div class="summary">
<el-space :size="30">
@@ -90,12 +108,13 @@
</template>
</el-dialog>
</template>
<script setup>
import { savePayment } from './outpatientregistration';
import { savePayment, wxPay, WxPayResult } from './outpatientregistration';
import { computed, watch, reactive, ref, getCurrentInstance, nextTick } from 'vue';
import { Delete } from '@element-plus/icons-vue';
import { debounce } from 'lodash-es';
import printUtils, { PRINT_TEMPLATE } from '@/utils/printUtils';
const props = defineProps({
open: {
@@ -130,10 +149,19 @@ const props = defineProps({
type: Object,
default: undefined,
},
orgId: {
type: String,
default: '',
},
orgName: {
type: String,
default: '',
},
});
const { proxy } = getCurrentInstance();
const dialogLoading = ref(false);
const txtCode = ref('');
const throttledGetList = debounce(submit, 300);
const formData = reactive({
totalAmount: 0,
@@ -157,114 +185,229 @@ watch(
const emit = defineEmits(['close']);
// 根据printUtils实现的打印方法
async function printReceipt(param) {
console.log(param, 'param');
console.log(props.patientInfo, 'props.patientInfo');
console.log('打印收费小票数据:', param);
console.log('患者信息:', props.patientInfo);
// 构造一个新的对象,添加头 "data"
const result = {
data: [
{
...param,
// 基础支付类型
YB_FUND_PAY: param.detail.find((t) => t.payEnum === 100000)?.amount ?? 0, // 基支付总额
SELF_PAY: param.detail.find((t) => t.payEnum === 200000)?.amount ?? 0, // 个人负担总金
OTHER_PAY: param.detail.find((t) => t.payEnum === 300000)?.amount ?? 0, // 其他(如医院负担金额
try {
// 构造打印数据
const printData = {
data: [
{
...param,
// 基支付类型
YB_FUND_PAY: param.detail.find((t) => t.payEnum === 100000)?.amount ?? 0, // 基金支付总
SELF_PAY: param.detail.find((t) => t.payEnum === 200000)?.amount ?? 0, // 个人负担金额
OTHER_PAY: param.detail.find((t) => t.payEnum === 300000)?.amount ?? 0, // 其他(如医院负担金额)
// 基本医保统筹基金支出
YB_TC_FUND_AMOUNT: param.detail.find((t) => t.payEnum === 110000)?.amount ?? 0, // 基本医保统筹基金支出
YB_BC_FUND_AMOUNT: param.detail.find((t) => t.payEnum === 120000)?.amount ?? 0, // 补充医疗保险基金支出
YB_JZ_FUND_AMOUNT: param.detail.find((t) => t.payEnum === 130000)?.amount ?? 0, // 医疗救助基金支出
YB_OTHER_AMOUNT: param.detail.find((t) => t.payEnum === 140000)?.amount ?? 0, // 其他支出
// 基本医保统筹基金支出
YB_TC_FUND_AMOUNT: param.detail.find((t) => t.payEnum === 110000)?.amount ?? 0, // 基本医保统筹基金支出
YB_BC_FUND_AMOUNT: param.detail.find((t) => t.payEnum === 120000)?.amount ?? 0, // 补充医疗保险基金支出
YB_JZ_FUND_AMOUNT: param.detail.find((t) => t.payEnum === 130000)?.amount ?? 0, // 医疗救助基金支出
YB_OTHER_AMOUNT: param.detail.find((t) => t.payEnum === 140000)?.amount ?? 0, // 其他支出
// 职工基本医疗保险
YB_TC_ZG_FUND_VALUE: param.detail.find((t) => t.payEnum === 110100)?.amount ?? 0, // 职工基本医疗保险
YB_TC_JM_FUND_VALUE: param.detail.find((t) => t.payEnum === 110200)?.amount ?? 0, // 居民基本医疗保险(修正原错误注释)
// 职工基本医疗保险
YB_TC_ZG_FUND_VALUE: param.detail.find((t) => t.payEnum === 110100)?.amount ?? 0, // 职工基本医疗保险
YB_TC_JM_FUND_VALUE: param.detail.find((t) => t.payEnum === 110200)?.amount ?? 0, // 居民基本医疗保险
// 补充医疗保险基金支出细分
YB_BC_JM_DB_VALUE: param.detail.find((t) => t.payEnum === 120100)?.amount ?? 0, // 全体参保人的居民大病保险
YB_BC_DE_BZ_VALUE: param.detail.find((t) => t.payEnum === 120200)?.amount ?? 0, // 大额医疗费用补助
YB_BC_ZG_DE_BZ_VALUE: param.detail.find((t) => t.payEnum === 120300)?.amount ?? 0, // 企业职工大额医疗费用补助
YB_BC_GWY_BZ_VALUE: param.detail.find((t) => t.payEnum === 120400)?.amount ?? 0, // 公务员医疗补助
// 补充医疗保险基金支出细分
YB_BC_JM_DB_VALUE: param.detail.find((t) => t.payEnum === 120100)?.amount ?? 0, // 全体参保人的居民大病保险
YB_BC_DE_BZ_VALUE: param.detail.find((t) => t.payEnum === 120200)?.amount ?? 0, // 大额医疗费用补助
YB_BC_ZG_DE_BZ_VALUE: param.detail.find((t) => t.payEnum === 120300)?.amount ?? 0, // 企业职工大额医疗费用补助
YB_BC_GWY_BZ_VALUE: param.detail.find((t) => t.payEnum === 120400)?.amount ?? 0, // 公务员医疗补助
// 其他支出细分
OTHER_PAY_DD_FUND_VALUE: param.detail.find((t) => t.payEnum === 300001)?.amount ?? 0, // 兜底基金支出
OTHER_PAY_YW_SH_FUND_VALUE: param.detail.find((t) => t.payEnum === 300002)?.amount ?? 0, // 意外伤害基金支出
OTHER_PAY_LX_YL_FUND_VALUE: param.detail.find((t) => t.payEnum === 300003)?.amount ?? 0, // 离休人员医疗保障金支出
OTHER_PAY_LX_YH_FUND_VALUE: param.detail.find((t) => t.payEnum === 300004)?.amount ?? 0, // 离休人员优惠金支出
OTHER_PAY_CZ_FUND_VALUE: param.detail.find((t) => t.payEnum === 300005)?.amount ?? 0, // 财政基金支出
OTHER_PAY_CZ_YZ_FUND_VALUE: param.detail.find((t) => t.payEnum === 300006)?.amount ?? 0, // 财政预支支出
OTHER_PAY_ZG_DB_FUND_VALUE: param.detail.find((t) => t.payEnum === 300007)?.amount ?? 0, // 职工大病基金支出
OTHER_PAY_EY_FUND_VALUE: param.detail.find((t) => t.payEnum === 300008)?.amount ?? 0, // 二乙基金支出
OTHER_PAY_QX_JZ_FUND_VALUE: param.detail.find((t) => t.payEnum === 300009)?.amount ?? 0, // 倾斜救助支出
OTHER_PAY_YL_JZ_FUND_VALUE: param.detail.find((t) => t.payEnum === 300010)?.amount ?? 0, // 医疗救助再救助基金
HOSP_PART_AMT: param.detail.find((t) => t.payEnum === 300011)?.amount ?? 0, // 医院负担金额
// 其他支出细分
OTHER_PAY_DD_FUND_VALUE: param.detail.find((t) => t.payEnum === 300001)?.amount ?? 0, // 兜底基金支出
OTHER_PAY_YW_SH_FUND_VALUE: param.detail.find((t) => t.payEnum === 300002)?.amount ?? 0, // 意外伤害基金支出
OTHER_PAY_LX_YL_FUND_VALUE: param.detail.find((t) => t.payEnum === 300003)?.amount ?? 0, // 离休人员医疗保障金支出
OTHER_PAY_LX_YH_FUND_VALUE: param.detail.find((t) => t.payEnum === 300004)?.amount ?? 0, // 离休人员优惠金支出
OTHER_PAY_CZ_FUND_VALUE: param.detail.find((t) => t.payEnum === 300005)?.amount ?? 0, // 财政基金支出
OTHER_PAY_CZ_YZ_FUND_VALUE: param.detail.find((t) => t.payEnum === 300006)?.amount ?? 0, // 财政预支支出
OTHER_PAY_ZG_DB_FUND_VALUE: param.detail.find((t) => t.payEnum === 300007)?.amount ?? 0, // 职工大病基金支出
OTHER_PAY_EY_FUND_VALUE: param.detail.find((t) => t.payEnum === 300008)?.amount ?? 0, // 二乙基金支出
OTHER_PAY_QX_JZ_FUND_VALUE: param.detail.find((t) => t.payEnum === 300009)?.amount ?? 0, // 倾斜救助支出
OTHER_PAY_YL_JZ_FUND_VALUE: param.detail.find((t) => t.payEnum === 300010)?.amount ?? 0, // 医疗救助再救助基金
HOSP_PART_AMT: param.detail.find((t) => t.payEnum === 300011)?.amount ?? 0, // 医院负担金额
// 医保结算返回值
FULAMT_OWNPAY_AMT: param.detail.find((t) => t.payEnum === 1)?.amount ?? 0, // 全自费金额
OVERLMT_SELFPAY: param.detail.find((t) => t.payEnum === 3)?.amount ?? 0, // 超限价自费费用
PRESELFPAY_AMT: param.detail.find((t) => t.payEnum === 4)?.amount ?? 0, // 先行自付金额
INSCP_SCP_AMT: param.detail.find((t) => t.payEnum === 5)?.amount ?? 0, // 符合政策范围金额
ACT_PAY_DEDC: param.detail.find((t) => t.payEnum === 6)?.amount ?? 0, // 实际支付起付线
POOL_PROP_SELFPAY: param.detail.find((t) => t.payEnum === 7)?.amount ?? 0, // 基本医疗保险统筹基金支付比例
BALC: param.detail.find((t) => t.payEnum === 8)?.amount ?? 0, // 余额
// 医保结算返回值 - 修复运算符优先级问题,添加括号确保正确拼接'元'
FULAMT_OWNPAY_AMT: (param.detail?.find((t) => t.payEnum === 1)?.amount ?? 0) + '元', // 全自费金额
OVERLMT_SELFPAY: (param.detail?.find((t) => t.payEnum === 3)?.amount ?? 0) + '元', // 超限价自费费用
PRESELFPAY_AMT: (param.detail?.find((t) => t.payEnum === 4)?.amount ?? 0) + '元', // 先行自付金额
INSCP_SCP_AMT: (param.detail?.find((t) => t.payEnum === 5)?.amount ?? 0) + '元', // 符合政策范围金额
ACT_PAY_DEDC: (param.detail?.find((t) => t.payEnum === 6)?.amount ?? 0) + '元', // 实际支付起付线
POOL_PROP_SELFPAY: (param.detail?.find((t) => t.payEnum === 7)?.amount ?? 0) + '元', // 基本医疗保险统筹基金支付比例
BALC: (param.detail?.find((t) => t.payEnum === 8)?.amount ?? 0) + '元', // 余额
// 特殊支付方式
SELF_YB_ZH_PAY: param.detail.find((t) => t.payEnum === 210000)?.amount ?? 0, // 个人医保账户支付
SELF_YB_ZH_GJ_VALUE: param.detail.find((t) => t.payEnum === 210100)?.amount ?? 0, // 账户共济支付金额
SELF_CASH_PAY: param.detail.find((t) => t.payEnum === 220000)?.amount ?? 0, // 个人现金支付金额
SELF_VX_PAY: param.detail.find((t) => t.payEnum === 230000)?.amount ?? 0, // 微信支付金额
SELF_ALI_PAY: param.detail.find((t) => t.payEnum === 240000)?.amount ?? 0, // 阿里支付金额
// 特殊支付方式
SELF_YB_ZH_PAY:
(param.detail?.find((t) => t.payEnum === 210000)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 210000)?.amount ?? 0) + '元'
: '', // 个人医保账户支付
SELF_YB_ZH_GJ_VALUE:
(param.detail?.find((t) => t.payEnum === 210100)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 210100)?.amount ?? 0) + '元'
: '', // 账户共济支付金额
SELF_CASH_PAY:
(param.detail?.find((t) => t.payEnum === 220000)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 220000)?.amount ?? 0) + '元'
: '', // 个人现金支付金额
SELF_VX_PAY:
(param.detail?.find((t) => t.payEnum === 230000)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 230000)?.amount ?? 0) + '元'
: '', // 微信支付金额
SELF_ALI_PAY:
(param.detail?.find((t) => t.payEnum === 240000)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 240000)?.amount ?? 0) + '元'
: '', // 阿里支付金额
// 现金支付细分
SELF_CASH_VALUE: param.detail.find((t) => t.payEnum === 220400)?.amount ?? 0, // 个人现金支付金额(现金)
SELF_CASH_VX_VALUE: param.detail.find((t) => t.payEnum === 220100)?.amount ?? 0, // 个人现金支付金额(微信)
SELF_CASH_ALI_VALUE: param.detail.find((t) => t.payEnum === 220200)?.amount ?? 0, // 个人现金支付金额(支付宝)
SELF_CASH_UNION_VALUE: param.detail.find((t) => t.payEnum === 220300)?.amount ?? 0, // 个人现金支付金额(银联)
// 现金支付细分
SELF_CASH_VALUE:
(param.detail?.find((t) => t.payEnum === 220400)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 220400)?.amount ?? 0) + '元'
: '', // 个人现金支付金额(现金)
SELF_CASH_VX_VALUE:
(param.detail?.find((t) => t.payEnum === 220100)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 220100)?.amount ?? 0) + '元'
: '', // 个人现金支付金额(微信)
SELF_CASH_ALI_VALUE:
(param.detail?.find((t) => t.payEnum === 220200)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 220200)?.amount ?? 0) + '元'
: '', // 个人现金支付金额(支付宝)
SELF_CASH_UNION_VALUE:
(param.detail?.find((t) => t.payEnum === 220300)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 220300)?.amount ?? 0) + '元'
: '', // 个人现金支付金额(银联)
// 基金类型(扩展)
BIRTH_FUND: param.detail.find((t) => t.payEnum === 510100)?.amount ?? 0, // 生育基金
RETIREE_MEDICAL: param.detail.find((t) => t.payEnum === 340100)?.amount ?? 0, // 离休人员医疗保障基金
URBAN_BASIC_MEDICAL: param.detail.find((t) => t.payEnum === 390100)?.amount ?? 0, // 城乡居民基本医疗保险基金
URBAN_SERIOUS_ILLNESS: param.detail.find((t) => t.payEnum === 390200)?.amount ?? 0, // 城乡居民大病医疗保险基金
MEDICAL_ASSISTANCE: param.detail.find((t) => t.payEnum === 610100)?.amount ?? 0, // 医疗救助基金
GOVERNMENT_SUBSIDY: param.detail.find((t) => t.payEnum === 640100)?.amount ?? 0, // 政府兜底基金
ACCIDENT_INSURANCE: param.detail.find((t) => t.payEnum === 390400)?.amount ?? 0, // 意外伤害基金
CARE_INSURANCE: param.detail.find((t) => t.payEnum === 620100)?.amount ?? 0, // 照护保险基金
FINANCIAL_FUND: param.detail.find((t) => t.payEnum === 360100)?.amount ?? 0, // 财政基金
HOSPITAL_ADVANCE: param.detail.find((t) => t.payEnum === 999900)?.amount ?? 0, // 医院垫付
SUPPLEMENTARY_INSURANCE: param.detail.find((t) => t.payEnum === 390300)?.amount ?? 0, // 城乡居民大病补充保险基金
HEALTHCARE_PREPAYMENT: param.detail.find((t) => t.payEnum === 360300)?.amount ?? 0, // 保健预支基金
Mr_QR_Code: param.regNo,
sex: props.patientInfo.genderEnum_enumText,
age: props.patientInfo.age,
personType: '职工医保',
fixmedinsName: param.fixmedinsName + '门诊收费明细',
},
],
// feeDetial: param.detail, //收费项目,后端还未返回
};
// 将对象转换为 JSON 字符串
let jsonString = JSON.stringify(result, null, 2);
console.log(jsonString, 'jsonString');
await CefSharp.BindObjectAsync('boundAsync');
await boundAsync.printReport(
'门诊收费明细单.grf',
jsonString
)
// 基金类型(扩展)
BIRTH_FUND:
(param.detail?.find((t) => t.payEnum === 510100)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 510100)?.amount ?? 0) + '元'
: '', // 生育基金
RETIREE_MEDICAL:
(param.detail?.find((t) => t.payEnum === 340100)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 340100)?.amount ?? 0) + '元'
: '', // 离休人员医疗保障基金
URBAN_BASIC_MEDICAL:
(param.detail?.find((t) => t.payEnum === 390100)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 390100)?.amount ?? 0) + '元'
: '', // 城乡居民基本医疗保险基金
URBAN_SERIOUS_ILLNESS:
(param.detail?.find((t) => t.payEnum === 390200)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 390200)?.amount ?? 0) + '元'
: '', // 城乡居民大病医疗保险基金
MEDICAL_ASSISTANCE:
(param.detail?.find((t) => t.payEnum === 610100)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 610100)?.amount ?? 0) + '元'
: '', // 医疗救助基金
GOVERNMENT_SUBSIDY:
(param.detail?.find((t) => t.payEnum === 640100)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 640100)?.amount ?? 0) + '元'
: '', // 政府兜底基金
ACCIDENT_INSURANCE:
(param.detail?.find((t) => t.payEnum === 390400)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 390400)?.amount ?? 0) + '元'
: '', // 意外伤害基金
CARE_INSURANCE:
(param.detail?.find((t) => t.payEnum === 620100)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 620100)?.amount ?? 0) + '元'
: '', // 照护保险基金
FINANCIAL_FUND:
(param.detail?.find((t) => t.payEnum === 360100)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 360100)?.amount ?? 0) + '元'
: '', // 财政基金
HOSPITAL_ADVANCE:
(param.detail?.find((t) => t.payEnum === 999900)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 999900)?.amount ?? 0) + '元'
: '', // 医院垫付
SUPPLEMENTARY_INSURANCE:
(param.detail?.find((t) => t.payEnum === 390300)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 390300)?.amount ?? 0) + '元'
: '', // 城乡居民大病补充保险基金
HEALTHCARE_PREPAYMENT:
(param.detail?.find((t) => t.payEnum === 360300)?.amount ?? 0) > 0
? (param.detail?.find((t) => t.payEnum === 360300)?.amount ?? 0) + '元'
: '', // 保健预支基金
//微信刷卡支付
SELF_CASH_VX_VALUE: (() => {
// const cashValue = param.detail.find((t) => t.payEnum === 220400)?.amount ?? 0;
const vxValue = param.detail.find((t) => t.payEnum === 220100)?.amount ?? 0;
const unionValue = param.detail.find((t) => t.payEnum === 220300)?.amount ?? 0;
const aliValue = param.detail.find((t) => t.payEnum === 220200)?.amount ?? 0;
return vxValue + unionValue + aliValue + '元';
})(),
// 患者信息
patientName: param.patientName || '',
sex: param.sex === 1 ? '女' : param.sex === 0 ? '男' : param.sex || '',
age: param.age ? param.age + '岁' : '',
personType: param.contractName, //病人类型
// 挂号和就诊信息
encounterId: props.patientInfo?.encounterId || '',
busNo: props.patientInfo?.busNo || '',
Mr_QR_Code: param.regNo || props.registerBusNo,
// 科室和医生信息
organizationName: props.orgName || props.patientInfo?.organizationName || '',
practitionerName: props.patientInfo?.practitionerName || '',
healthcareName: props.patientInfo?.healthcareName || '',
// 费用信息
fixmedinsName: param.fixmedinsName
? param.fixmedinsName + '门诊收费明细'
: '门诊收费明细',
// 收费员
cashier: param.paymentEmployee,
// 收费时间
chargeTime: new Date().toLocaleString(),
},
],
};
// 选择门诊挂号打印模板
console.log('printDataprintDataprintDataprintDataprintData', printData.data[0]);
await printUtils.print(PRINT_TEMPLATE.OUTPATIENT_REGISTRATION, printData.data[0]);
console.log('打印成功');
} catch (error) {
console.error('打印失败:', error);
proxy.$modal.msgError('打印失败: ' + error.message);
}
}
function handleWxPay() {
console.log('开始微信支付,当前支付详情:', formData.selfPay);
console.log(
'支付金额详情:',
formData.selfPay.map((item) => ({ payEnum: item.payEnum, amount: item.amount }))
);
wxPay({
txtCode: txtCode.value,
//chargeItemIds: props.chargeItemIds,
//encounterId: props.patientInfo.encounterId,
id: props.paymentId,
paymentDetails: formData.selfPay,
// ybMdtrtCertType: props.userCardInfo.psnCertType,
// busiCardInfo: props.userCardInfo.busiCardInfo,
})
.then((response) => {
//返回结果是jsonString可判断其调用是否成功
console.log(response, 'response');
var res = JSON.parse(response);
if (!res.IsSuccess) {
proxy.$modal.msgError('调用打印插件失败:' + res.ErrorMessage);
}
console.log('微信支付请求成功:', response);
})
.catch((error) => {
proxy.$modal.msgError('调用打印插件失败:' + error);
console.error('微信支付请求失败:', error);
});
}
function getWxPayResult() {
WxPayResult({
txtCode: txtCode.value,
chargeItemIds: props.chargeItemIds,
encounterId: props.patientInfo.encounterId,
id: props.paymentId,
paymentDetails: formData.selfPay,
ybMdtrtCertType: props.userCardInfo.psnCertType,
busiCardInfo: props.userCardInfo.busiCardInfo,
});
}
function submit() {
if (parseFloat(displayAmount.value) < formData.totalAmount) {
proxy.$modal.msgError('请输入正确的结算金额');
@@ -288,8 +431,8 @@ function submit() {
.then((res) => {
if (res.code == 200) {
printReceipt(res.data);
(formData.selfPay = [{ payEnum: 220100, amount: 0.0, payLevelEnum: 2 }]),
emit('close', 'success');
formData.selfPay = [{ payEnum: 220100, amount: 0.0, payLevelEnum: 2 }];
emit('close', 'success');
}
})
.finally(() => {
@@ -300,10 +443,10 @@ function submit() {
const currentDate = ref(new Date().toLocaleString());
const selfPayMethods = [
{ label: '现金', value: 220400 },
{ label: '微信', value: 220100 },
{ label: '支付宝', value: 220200 },
{ label: '银联', value: 220300 },
{ label: '现金', value: 220400, isWebPay: false },
{ label: '微信', value: 220100, isWebPay: true },
{ label: '支付宝', value: 220200, isWebPay: true },
{ label: '银联', value: 220300, isWebPay: true },
];
// 计算剩余可输入金额
@@ -326,10 +469,27 @@ const getMax = (index) => {
};
// 检查支付方式是否已使用
const isMethodDisabled = (payEnum) => {
return formData.selfPay.some((item) => item.payEnum === payEnum);
const isMethodDisabled = (option) => {
if (formData.selfPay.length > 1) {
// 禁用已被选择的相同方式,避免重复选择
const selectedEnums = formData.selfPay.map((item) => item.payEnum);
debugger;
if (selectedEnums.includes(option.value)) {
return true;
}
// 若已经选择了任一线上支付方式,则其他线上方式不可再选,仅允许现金等线下方式
const hasSelectedWebPay = selectedEnums.some((val) => {
const found = selfPayMethods.find((m) => m.value === val);
return found ? found.isWebPay === true : false;
});
if (hasSelectedWebPay && option.isWebPay) {
return true;
}
return false;
} else {
return false;
}
};
const handleAmountChange = () => {
// 不需要在这里直接设置 returnedAmount依赖 computed 属性
};
@@ -344,9 +504,21 @@ const addPayment = () => {
const removePayment = (index) => {
formData.selfPay.splice(index, 1);
};
const payTypeText = ref('微信');
const payTypePlaceholder = computed(() => {
if (payTypeText.value === '现金') {
return '请输入现金金额';
}
return payTypeText.value + '支付二维码';
});
const clearAmount = (index) => {
// formData.selfPay[index].amount = 0;
const selectedOption = selfPayMethods.find(
(item) => item.value === formData.selfPay[index].payEnum
);
if (selectedOption) {
payTypeText.value = selectedOption.label;
}
};
// 计算属性
@@ -364,6 +536,8 @@ const returnedAmount = computed(() => {
});
function close() {
//清空表单数据
txtCode.value = '';
emit('close', 'cancel');
}
</script>
@@ -463,4 +637,4 @@ function close() {
color: #999;
pointer-events: none; /* 避免点击干扰 */
}
</style>
</style>

View File

@@ -1,12 +1,12 @@
import request from '@/utils/request'
import { parseStrEmpty } from "@/utils/openhis";
import request from '@/utils/request';
import { parseStrEmpty } from '@/utils/openhis';
// 查询初期所需数据
export function getInit() {
return request({
url: '/charge-manage/register/init',
method: 'get'
})
method: 'get',
});
}
// 查询患者信息
@@ -14,16 +14,16 @@ export function getOutpatientRegistrationList(query) {
return request({
url: '/charge-manage/register/patient-metadata',
method: 'get',
params: query
})
params: query,
});
}
// 查询费用性质
export function getContractList() {
return request({
url: '/app-common/contract-list',
method: 'get'
})
method: 'get',
});
}
// 查询诊断信息
@@ -31,8 +31,8 @@ export function getConditionDefinitionMetadata(query) {
return request({
url: '/charge-manage/register/condition-definition-metadata',
method: 'get',
params: query
})
params: query,
});
}
// // 查询就诊位置
@@ -49,8 +49,8 @@ export function getLocationTree(query) {
return request({
url: '/charge-manage/register/org-list',
method: 'get',
params: query
})
params: query,
});
}
// 根据位置id筛选医生
@@ -58,8 +58,8 @@ export function getPractitionerMetadata(query) {
return request({
url: '/charge-manage/register/practitioner-metadata',
method: 'get',
params: query
})
params: query,
});
}
// 根据机构id筛选服务项目
@@ -67,8 +67,8 @@ export function getHealthcareMetadata(query) {
return request({
url: '/charge-manage/register/healthcare-metadata',
method: 'get',
params: query
})
params: query,
});
}
// 门诊挂号查询
@@ -76,8 +76,8 @@ export function getOutpatientRegistrationCurrent(query) {
return request({
url: '/charge-manage/register/current-day-encounter',
method: 'get',
params: query
})
params: query,
});
}
// 新增门诊挂号信息
@@ -85,8 +85,8 @@ export function addOutpatientRegistration(data) {
return request({
url: '/payment/payment/reg-pre-pay',
method: 'post',
data: data
})
data: data,
});
}
// 新增病人信息
@@ -94,83 +94,79 @@ export function addPatient(data) {
return request({
url: '/patient-manage/information/patient-information',
method: 'post',
data: data
})
data: data,
});
}
export function listmaritalstatus() {
return request({
url: '/patientmanage/information/list-maritalstatus',
method: 'get',
})
});
}
export function listoccupationtype() {
return request({
url: '/patientmanage/information/list-occupationtype',
method: 'get',
})
});
}
export function lisadministrativegender() {
return request({
url: '/patientmanage/information/list-administrativegender',
method: 'get',
})
});
}
export function listbloodtypeabo() {
return request({
url: '/patientmanage/information/list-bloodtypeabo',
method: 'get',
})
});
}
export function listbloodtypearh() {
return request({
url: '/patientmanage/information/list-bloodtypearh',
method: 'get',
})
});
}
export function listfamilyrelationshiptype() {
return request({
url: '/patientmanage/information/list-familyrelationshiptype',
method: 'get',
})
}
return request({
url: '/patientmanage/information/list-familyrelationshiptype',
method: 'get',
});
}
// 查询患者相关
export function patientlLists() {
return request({
url: '/patient-manage/information/init',
method: 'get',
});
}
// 查询患者相关
export function patientlLists() {
return request({
url: '/patient-manage/information/init',
method: 'get'
})
}
// 患者退号
export function returnRegister(encounterId) {
return request({
url: '/charge-manage/register/return?encounterId=' + encounterId,
method: 'put',
});
}
// 患者退号
export function returnRegister(encounterId) {
return request({
url: '/charge-manage/register/return?encounterId=' + encounterId,
method: 'put'
})
}
/**
* 收费
*/
export function savePayment(data) {
return request({
url: '/payment/payment/reg-pay',
method: 'post',
data: data,
});
}
/**
* 收费
*/
export function savePayment(data) {
return request({
url: '/payment/payment/reg-pay',
method: 'post',
data: data
})
}
/**
* 收费预结算
*/
@@ -178,8 +174,8 @@ export function precharge(data) {
return request({
url: '/payment/payment/precharge',
method: 'post',
data: data
})
data: data,
});
}
/**
@@ -189,8 +185,20 @@ export function refund(data) {
return request({
url: '/payment/payment/uncharge',
method: 'post',
data: data
})
data: data,
});
}
/**
* 退费预检(挂号预取消)
* GET /payment/payment/pre-cancel-reg?encounterId=xxx
*/
export function preCancelReg(encounterId) {
return request({
url: '/payment/payment/pre-cancel-reg',
method: 'get',
params: { encounterId },
});
}
/**
@@ -200,8 +208,8 @@ export function cancelRegister(data) {
return request({
url: '/charge-manage/register/return',
method: 'put',
data: data
})
data: data,
});
}
/**
@@ -211,6 +219,28 @@ export function gerPreInfo(userMaessage) {
return request({
url: '/yb-request/per-info',
method: 'post',
params: userMaessage
})
}
params: userMaessage,
});
}
/**
* 微信支付
*/
export function wxPay(data) {
return request({
url: '/three-part/pay/pay-for',
method: 'post',
data: data,
});
}
/**
* 微信支付
*/
export function WxPayResult(data) {
return request({
url: '/three-part/pay/pay-query',
method: 'get',
data: data,
});
}

View File

@@ -7,57 +7,40 @@
destroy-on-close
@close="close"
>
<div>
<div v-loading="loading">
<el-text size="large" style="display: block; margin-bottom: 15px">
退费日期{{ currentDate }}
</el-text>
<el-text size="large">费用性质{{ '自费' }}</el-text>
<el-text size="large">费用性质{{ props.category || '自费' }}</el-text>
<div class="amount-row">
<el-text size="large">应退金额</el-text>
<el-text size="large" type="primary" class="amount">
{{ props.totalAmount.toFixed(2) + ' 元' }}
{{ (calculatedTotalAmount || 0) + ' 元' }}
</el-text>
</div>
<div class="amount-row" v-if="calculatedReturnAmount > 0">
<el-text size="large">退费金额</el-text>
<el-text size="large" type="primary" class="amount">
{{ (calculatedReturnAmount || 0) + ' 元' }}
</el-text>
</div>
<!-- 自费支付 -->
<!-- 退费方式列表从接口数据中筛选 -->
<div class="payment-container">
<div v-for="(item, index) in formData.selfPay" :key="index" class="payment-item">
<div v-for="(item, index) in refundMethodsFromApi" :key="index" class="payment-item">
<span>退费方式</span>
<el-select
v-model="item.payEnum"
placeholder="选择退费方式"
style="width: 160px"
@change="clearAmount(index)"
>
<el-option
v-for="payEnum in selfPayMethods"
:key="payEnum.value"
:label="payEnum.label"
:value="payEnum.value"
:disabled="isMethodDisabled(payEnum.value)"
/>
</el-select>
<el-input :value="getPayMethodLabel(item.payEnum)" readonly style="width: 160px" />
<span>退费金额</span>
<div class="suffix-wrapper">
<el-input-number
v-model="item.amount"
:model-value="(Number(item.amount) || 0) - (Number(item.returnAmount) || 0)"
:precision="2"
:min="0"
:max="getMax(index)"
:controls="false"
placeholder="金额"
disabled
class="amount-input"
@change="handleAmountChange"
/>
<span class="suffix-text"></span>
</div>
<el-button
type="danger"
circle
:icon="Delete"
@click="removePayment(index)"
v-if="index > 0"
/>
</div>
<div class="payment-container" style="position: relative">
<span style="position: absolute; top: 5px">退费原因</span>
@@ -67,29 +50,26 @@
v-model="reason"
placeholder="退费原因"
class="reason-textarea"
@change="handleAmountChange"
/>
</div>
<div class="add-payment">
<el-button
type="primary"
plain
@click="addPayment"
:disabled="formData.selfPay.length >= 4 || remainingAmount <= 0"
>
<!-- 添加退费方式功能暂时注释 -->
<!-- <div class="add-payment">
<el-button type="primary" plain @click="addPayment" :disabled="canAddPayment">
添加退费方式
</el-button>
<el-text v-if="remainingAmount <= 0" type="danger" class="tip">
金额已满足应退不可继续添加
<el-text v-if="canAddPayment" type="danger" class="tip">
退费金额已等于应退金额不可继续添加
</el-text>
</div>
</div> -->
</div>
<!-- 金额汇总 -->
<div class="summary">
<el-space :size="30">
<div class="summary-item">
<el-text type="info">实退合计</el-text>
<el-text type="success">{{ displayAmount + ' 元' }}</el-text>
<el-text type="success">{{
displayAmount > 0 ? displayAmount + ' 元' : props.totalAmount + ' 元'
}}</el-text>
</div>
<!-- <div class="summary-item">
<el-text type="info">应找零</el-text>
@@ -97,6 +77,28 @@
</div> -->
</el-space>
</div>
<!-- 退费明细表格 -->
<div v-if="preCancelData && preCancelData.length > 0" class="pre-cancel-table-wrapper">
<el-table :data="preCancelData" border stripe max-height="300" style="width: 100%">
<el-table-column prop="payEnum_dictText" label="支付方式" min-width="200" />
<el-table-column prop="amount" label="金额" width="120" align="right">
<template #default="{ row }">
{{ row.amount ? Number(row.amount) : '0.00' }}
</template>
</el-table-column>
<el-table-column prop="returnAmount" label="退费金额" width="120" align="right">
<template #default="{ row }">
{{ row.returnAmount ? Number(row.returnAmount) : '0.00' }}
</template>
</el-table-column>
<el-table-column prop="chargeAmount" label="收费金额" min-width="120" align="right">
<template #default="{ row }">
{{ row.chargeAmount ? Number(row.chargeAmount) : '0.00' }}
</template>
</el-table-column>
</el-table>
</div>
</div>
<template #footer>
<div class="dialog-footer">
@@ -108,7 +110,7 @@
</template>
<script setup>
import { cancelRegister } from './outpatientregistration';
import { cancelRegister, preCancelReg } from './outpatientregistration';
import { computed, watch, reactive, ref, getCurrentInstance } from 'vue';
import { Delete } from '@element-plus/icons-vue';
@@ -139,6 +141,8 @@ const props = defineProps({
const { proxy } = getCurrentInstance();
const reason = ref('');
const preCancelData = ref([]);
const loading = ref(false);
const formData = reactive({
totalAmount: 0,
@@ -160,13 +164,51 @@ watch(
const emit = defineEmits(['close']);
watch(
() => props.open,
async (val) => {
if (val && props.patientInfo && props.patientInfo.encounterId) {
loading.value = true;
try {
const res = await preCancelReg(props.patientInfo.encounterId);
if (res && res.code === 200 && res.data) {
preCancelData.value = res.data;
// 计算应退金额并更新表单数据
const targetPayEnums = [220500, 220400, 220100, 220200, 220300];
const sum = res.data
.filter((item) => targetPayEnums.includes(item.payEnum))
.reduce((total, item) => total + (Number(item.amount) || 0), 0);
if (sum > 0) {
formData.totalAmount = sum;
// 如果第一个退费方式的金额为0或等于原来的totalAmount则自动填充
if (
formData.selfPay[0].amount === 0 ||
formData.selfPay[0].amount === props.totalAmount
) {
formData.selfPay[0].amount = sum;
}
}
}
} catch (err) {
console.error('pre-cancel-reg error', err);
preCancelData.value = [];
} finally {
loading.value = false;
}
} else {
preCancelData.value = [];
loading.value = false;
}
}
);
function submit() {
console.log(props.chargeItemIds);
if (parseFloat(displayAmount.value) < formData.totalAmount) {
proxy.$modal.msgError('请输入正确的金额');
return;
}
// if (parseFloat(displayAmount.value) < formData.totalAmount) {
// proxy.$modal.msgError('请输入正确的金额');
// return;
// }
cancelRegister({
paymentEnum: 0,
kindEnum: 1,
@@ -195,23 +237,16 @@ const selfPayMethods = [
{ label: '银联', value: 220300 },
];
// 计算剩余可输入金额
const remainingAmount = computed(() => {
return (
formData.totalAmount - formData.selfPay.reduce((sum, item) => sum + Number(item.amount), 0)
);
});
// 获取单个支付方式的最大可输入金额
const getMax = (index) => {
const otherSum = formData.selfPay.reduce(
(sum, item, i) => (i !== index ? sum + Number(item.amount) : sum),
(sum, item, i) => (i !== index ? sum + (Number(item.amount) || 0) : sum),
0
);
const maxAmount = calculatedTotalAmount.value - otherSum;
if (formData.selfPay[index].payEnum == 220400) {
return formData.totalAmount + 100 - otherSum;
return maxAmount + 100;
}
return formData.totalAmount - otherSum;
return maxAmount;
};
// 检查支付方式是否已使用
@@ -224,10 +259,11 @@ const handleAmountChange = () => {
};
const addPayment = () => {
if (remainingAmount.value <= 0) {
if (canAddPayment.value) {
return;
}
formData.selfPay.push({ payEnum: '', amount: remainingAmount.value });
// 添加新的退费方式初始金额为0由用户输入
formData.selfPay.push({ payEnum: '', amount: 0 });
};
const removePayment = (index) => {
@@ -238,9 +274,16 @@ const clearAmount = (index) => {
// formData.selfPay[index].amount = 0;
};
// 计算属性
// 计算属性 - 实退合计(使用接口返回的退费方式数据)
const displayAmount = computed(() => {
return formData.selfPay.reduce((sum, item) => sum + (Number(item.amount) || 0), 0).toFixed(2);
if (!preCancelData.value || preCancelData.value.length === 0) {
return '0.00';
}
const targetPayEnums = [220500, 220400, 220100, 220200, 220300];
const sum = preCancelData.value
.filter((item) => targetPayEnums.includes(item.payEnum))
.reduce((sum, item) => sum + (Number(item.amount) || 0), 0);
return sum.toFixed(2);
});
const returnedAmount = computed(() => {
@@ -252,6 +295,72 @@ const returnedAmount = computed(() => {
return returned >= 0 ? returned.toFixed(2) : '0.00';
});
const calculatedTotalAmount = computed(() => {
if (!preCancelData.value || preCancelData.value.length === 0) {
return props.totalAmount || 0;
}
const targetPayEnums = [220500, 220400, 220100, 220200, 220300];
// 应退金额 = (amount - returnAmount) 的总和,即剩余应退金额
const sum = preCancelData.value
.filter((item) => targetPayEnums.includes(item.payEnum))
.reduce(
(total, item) => total + ((Number(item.amount) || 0) - (Number(item.returnAmount) || 0)),
0
);
return sum > 0 ? sum : props.totalAmount || 0;
});
const calculatedReturnAmount = computed(() => {
if (!preCancelData.value || preCancelData.value.length === 0) {
return 0;
}
const targetPayEnums = [220500, 220400, 220100, 220200, 220300];
const sum = preCancelData.value
.filter((item) => targetPayEnums.includes(item.payEnum))
.reduce((total, item) => total + (Number(item.returnAmount) || 0), 0);
return sum || 0;
});
// 从接口数据中筛选符合条件的退费方式
const refundMethodsFromApi = computed(() => {
if (!preCancelData.value || preCancelData.value.length === 0) {
return [];
}
const targetPayEnums = [220500, 220400, 220100, 220200, 220300];
return preCancelData.value.filter(
(item) =>
targetPayEnums.includes(item.payEnum) &&
item.payEnum_dictText &&
item.payEnum_dictText.trim() !== ''
);
});
// 根据 payEnum 获取支付方式标签
const getPayMethodLabel = (payEnum) => {
const method = selfPayMethods.find((m) => m.value === payEnum);
if (method) {
return method.label;
}
// 如果找不到,尝试从接口返回的 dictText 中获取
const apiItem = preCancelData.value?.find((item) => item.payEnum === payEnum);
return apiItem?.payEnum_dictText || `支付方式${payEnum}`;
};
// 计算所有退费方式的总和
const totalRefundAmount = computed(() => {
return refundMethodsFromApi.value.reduce((sum, item) => sum + (Number(item.amount) || 0), 0);
});
// 计算剩余可输入金额(应退金额 - 已输入的退费金额总和)
const remainingAmount = computed(() => {
return calculatedTotalAmount.value - totalRefundAmount.value;
});
// 判断是否可以添加退费方式:退费金额总和等于或大于应退金额时不能添加
const canAddPayment = computed(() => {
return totalRefundAmount.value >= calculatedTotalAmount.value || formData.selfPay.length >= 10;
});
function close() {
emit('close');
}
@@ -361,4 +470,21 @@ function close() {
.amount-input .el-input__inner {
padding-right: 30px !important;
}
</style>
.pre-cancel-table-wrapper {
margin-top: 20px;
width: 100%;
border: 1px solid #dcdfe6;
border-radius: 4px;
overflow: hidden;
:deep(.el-table) {
width: 100%;
.el-table__body-wrapper {
max-height: 300px;
overflow-y: auto;
}
}
}
</style>

View File

@@ -730,9 +730,9 @@ const data = reactive({
serviceTypeId: [{ required: true, message: '挂号类型不能为空', trigger: 'blur' }],
organizationId: [{ required: true, message: '优先级不能为空', trigger: 'blur' }],
orgId: [{ required: true, message: '就诊科室不能为空', trigger: 'blur' }],
// practitionerId: [
// { required: true, message: "医生不能为空", trigger: "blur" },
// ],
practitionerId: [
{ required: true, message: "医生不能为空", trigger: "blur" },
],
typeCode: [{ required: true, message: '账户类型不能为空', trigger: 'blur' }],
definitionId: [{ required: true, message: '费用定价不能为空', trigger: 'blur' }],
// totalPrice: [{ required: true, message: "总价不能为空", trigger: "blur" }],
@@ -1146,7 +1146,23 @@ function handleAdd() {
transformedData.value = transformFormData(form.value);
console.log(transformedData, 'transformedData门诊挂号');
chargeItemIdList.value = [];
patientInfo.value.patientId = form.value.patientId;
// patientInfo.value.patientId = form.value.patientId;
patientInfo.value = {
patientId: form.value.patientId,
patientName: form.value.name,
genderEnum_enumText: form.value.genderEnum_enumText,
age: form.value.age,
contractName: form.value.contractNo
? contractList.value.find((item) => item.busNo === form.value.contractNo)?.contractName ||
'自费'
: '自费',
idCard: form.value.idCard,
phone: form.value.phone,
categoryEnum: form.value.categoryEnum || '门诊',
organizationName: form.value.locationId_dictText || '',
practitionerName: form.value.doctorName || '',
healthcareName: '', // 可根据实际情况补充
};
proxy.$refs['outpatientRegistrationRef'].validate((valid) => {
if (valid) {
readCardLoading.value = true;
@@ -1157,10 +1173,13 @@ function handleAdd() {
addOutpatientRegistration(transformedData.value)
.then((res) => {
if (res.code == 200) {
console.log('78989798', 'res', res);
// proxy.$modal.msgSuccess('挂号成功');
chrgBchno.value = res.data.chrgBchno;
registerBusNo.value = res.data.busNo;
totalAmount.value = res.data.psnCashPay;
patientInfo.value.encounterId = res.data.encounterId || '';
patientInfo.value.busNo = res.data.busNo || '';
readCardLoading.value = false;
openDialog.value = true;
// chargeItemIdList.value = res.data;

View File

@@ -0,0 +1,39 @@
import request from '@/utils/request';
import { dateEquals } from 'element-plus';
// 获取网银支付参数列表
export function getList (data) {
return request ({
url: '/three-part/pay/page',
method: 'get',
params:data,
});
}
export function getPayinfo (data) {
return request ({
url: '/three-part/pay/pay-query?paymentId='+data.paymentId,
method: 'get',
});
}
export function returnfee (data) {
return request ({
url: '/three-part/pay/return-bill?paymentId='+data.paymentId,
method: 'get',
});
}
export function returnFeednext (data) {
return request ({
url: '/three-part/pay/return-goods?paymentId='+data.paymentId,
method: 'get',
});
}
export function returnResult (data) {
return request ({
url: '/three-part/pay/return-query?id='+data.id,
method: 'get',
});
}

View File

@@ -0,0 +1,119 @@
<template>
<div class="app-continer">
<el-form :model="queryParams" ref="queryRef" :inline="true">
<el-form-item label="患者姓名" prop="patientName">
<el-input v-model="queryParams.searchKey" placeholder="请输入患者姓名" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-table :data="recordList" v-loading="loading" border ref="tableRef">
<el-table-column label="患者姓名" align="center" prop="patientName" :show-overflow-tooltip="true" />
<el-table-column label="支付单号" align="center" prop="paymentBusNo" :show-overflow-tooltip="true" />
<el-table-column label="交易金额(元)" align="right" prop="txnAmt" header-align="center" width="100"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column label="交易类型" align="center" prop="tranType" :show-overflow-tooltip="true" />
<el-table-column label="支付方式" align="center" prop="payType" :show-overflow-tooltip="true" />
<el-table-column label="交易时间" align="center" prop="txnTime" :show-overflow-tooltip="true">
<template #default="scope">
<span>{{ parseTime(scope.row.txnTime) }}</span>
</template>
</el-table-column>
<el-table-column label="原交易类型" align="center" prop="orgTranType" :show-overflow-tooltip="true" />
<el-table-column label="原交易类型" align="center" prop="orgTranType" :show-overflow-tooltip="true" />
<el-table-column label="第三方优惠说明" align="center" prop="otherMsg" :show-overflow-tooltip="true" />
<el-table-column label="错误信息" align="center" prop="errMsg" :show-overflow-tooltip="true" />
<el-table-column label="查询结果" align="center" prop="queryResult" :show-overflow-tooltip="true" />
<el-table-column label="查询结果说明" align="center" prop="queryResultMsg" :show-overflow-tooltip="true" />
<el-table-column label="操作" align="center" prop="paymentEnum_enumText" width="340">
<template #default="scope">
<el-button type="primary" link :disabled="!scope.row.paymentId"
@click="getPayInfo(scope.row.paymentId)">支付结果查询</el-button>
<el-button type="warning" link :disabled="!scope.row.paymentId"
@click="returnFee(scope.row.paymentId)">退费</el-button>
<el-button type="danger" link auto-insert-space :disabled="!scope.row.paymentId"
@click="returnFeeNext(scope.row.paymentId)">隔天退费</el-button>
<el-button type="success" link @click="returnFeeResultQuery(scope.row.id)">退费结果查询</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getLists" />
</div>
</template>
<script setup name="ClinicRecord">
const { proxy } = getCurrentInstance();
import { getList, getPayinfo, returnfee, returnFeednext, returnResult } from './components/api.js';
const total = ref(0);
const queryParams = ref({
pageNo: 1,
pageSize: 100,
searchKey: '',
});
const recordList = ref([]);
const loading = ref(false);
const getPayInfo = (paymentId) => {
console
getPayinfo({ paymentId }).then((res) => {
proxy.$message.success('支付结果查询成功');
console.log(res);
});
};
const returnFee = (paymentId) => {
returnfee({ paymentId }).then((res) => {
proxy.$message.success('退费成功');
console.log(res);
});
};
const returnFeeNext = (paymentId) => {
returnFeednext({ paymentId }).then((res) => {
proxy.$message.success('隔天退费成功');
console.log(res);
});
};
const returnFeeResultQuery = (id) => {
returnResult({ id }).then((res) => {
proxy.$message.success(res.data);
console.log(res);
});
};
const handleQuery = () => {
//queryParams.value.pageNum = 1;
getList(queryParams.value);
};
const resetQuery = () => {
proxy.resetForm('queryRef');
handleQuery();
};
const getLists = async () => {
loading.value = true;
getList(queryParams.value).then((res) => {
loading.value = false;
recordList.value = res.data.records;
total.value = res.data.total;
});
};
getLists();
</script>
<style scoped>
.app-continer {
padding: 20px;
}
.el-dialog {
height: 90vh !important;
}
.dialog-footer {
text-align: right;
}
.el-textarea__inner {
resize: none;
}
</style>

View File

@@ -357,7 +357,7 @@ async function print() {
...reportValue.value, // 将 reportValue.value 中的所有属性展开到 result 中
nickName: userStore.nickName,
orgName: userStore.orgName,
fixmedinsName: '长春大学医院',
fixmedinsName: '长春市朝阳区中医院医院',
queryTime: queryTime.value[0] + '~' + queryTime.value[1],
zfAmount: new Decimal(reportValue.value.zhSum || 0).add(reportValue.value.fundSum || 0),
feeAmount: new Decimal(reportValue.value.DIAGNOSTIC_FEE || 0)
@@ -433,4 +433,4 @@ getPharmacyCabinetLists();
.el-col {
margin-right: 50px;
}
</style>
</style>

View File

@@ -218,13 +218,13 @@
<el-col :span="5">
<span class="label">省医保人次</span>
<span class="value">
{{ reportValue['229900reg'] ? reportValue['229900reg'] + ' 人' : '0 人' }}
{{ reportValue['229900reg'] ? reportValue['229900reg'] + '人' : '0 人' }}
</span>
</el-col>
<el-col :span="5">
<span class="label">市医保人次</span>
<span class="value">
{{ reportValue['220100reg'] ? reportValue['220100reg'] + ' 人' : '0 人' }}
{{ (reportValue['220100reg'] || 0) + (reportValue['220199reg'] || 0) + ' 人' }}
</span>
</el-col>
<!-- <el-col :span="5">
@@ -273,19 +273,27 @@
>
<el-col :span="5">
<span class="label">市医保现金</span>
<span class="value">{{ formatValue(reportValue['220100cash']) }}</span>
<span class="value">{{
formatValue((reportValue['220100cash'] || 0) + (reportValue['220199cash'] || 0))
}}</span>
</el-col>
<el-col :span="5">
<span class="label">市医保统筹</span>
<span class="value">{{ formatValue(reportValue['220100tcSum']) }}</span>
<span class="value">{{
formatValue((reportValue['220100tcSum'] || 0) + (reportValue['220199tcSum'] || 0))
}}</span>
</el-col>
<el-col :span="5">
<span class="label">市医保账户</span>
<span class="value">{{ formatValue(reportValue['220100zhSum']) }}</span>
<span class="value">{{
formatValue((reportValue['220100zhSum'] || 0) + (reportValue['220199zhSum'] || 0))
}}</span>
</el-col>
<el-col :span="5">
<span class="label">市医保基金</span>
<span class="value">{{ formatValue(reportValue['220100fundSum']) }}</span>
<span class="value">{{
formatValue((reportValue['220100fundSum'] || 0) + (reportValue['220199fundSum'] || 0))
}}</span>
</el-col>
</el-row>
<el-row
@@ -329,6 +337,7 @@
{{
formatValue(
(reportValue['220100cash'] || 0) +
(reportValue['220199cash'] || 0) +
(reportValue['229900cash'] || 0) +
(reportValue['0000cash'] || 0)
)
@@ -443,16 +452,33 @@ function processObjectWithFinType(obj) {
async function print() {
// const selectedRows = proxy.$refs['tableRef'].getSelectionRows();
console.log(reportValue.value, '==reportValue.value==');
// 计算市医保相关字段
const municipalYbReg =
(reportValue.value['220100reg'] || 0) + (reportValue.value['220199reg'] || 0);
const municipalYbCash =
(reportValue.value['220100cash'] || 0) + (reportValue.value['220199cash'] || 0);
const municipalYbTcSum =
(reportValue.value['220100tcSum'] || 0) + (reportValue.value['220199tcSum'] || 0);
const municipalYbZhSum =
(reportValue.value['220100zhSum'] || 0) + (reportValue.value['220199zhSum'] || 0);
const municipalYbFundSum =
(reportValue.value['220100fundSum'] || 0) + (reportValue.value['220199fundSum'] || 0);
const municipalYbTotal = municipalYbZhSum + municipalYbFundSum;
const totalCash =
municipalYbCash + (reportValue.value['229900cash'] || 0) + (reportValue.value['0000cash'] || 0);
const result = {
data: [
{
...reportValue.value, // 将 reportValue.value 中的所有属性展开到 result 中
nickName: userStore.nickName,
orgName: userStore.orgName,
fixmedinsName: userStore.hospitalName,
fixmedinsName: userStore.hospitalName,
createTime: formatDateStr(new Date(), 'YYYY-MM-DD HH:mm:ss'),
scheduler: userStore.nickName,
timeRange: queryTime.value[0] + '~' + queryTime.value[1],
// 计算字段
zfAmount: new Decimal(reportValue.value.zhSum || 0).add(reportValue.value.fundSum || 0),
feeAmount: new Decimal(reportValue.value.DIAGNOSTIC_FEE || 0)
.add(reportValue.value.CHECK_FEE || 0)
@@ -465,14 +491,23 @@ async function print() {
.add(reportValue.value.REGISTRATION_FEE || 0)
.add(reportValue.value.OTHER_FEE || 0)
.add(reportValue.value.SANITARY_MATERIALS_FEE || 0),
// 省医保相关
provinceYbTotal:
(reportValue.value['229900zhSum'] || 0) + (reportValue.value['229900fundSum'] || 0),
municipalYbTotal:
(reportValue.value['220100zhSum'] || 0) + (reportValue.value['220100fundSum'] || 0),
totalCash:
(reportValue.value['220100cash'] || 0) +
(reportValue.value['229900cash'] || 0) +
(reportValue.value['0000cash'] || 0),
(reportValue.value['229900fundSum'] || 0) + (reportValue.value['229900zhSum'] || 0),
// 市医保相关220100和220199
municipalYbReg,
municipalYbCash,
municipalYbTcSum,
municipalYbZhSum,
municipalYbFundSum,
municipalYbTotal,
// 现金收入总额
totalCash,
// 体检人次
physicalExaminationCount: getPhysicalExaminationCount(),
},
],
@@ -546,4 +581,4 @@ function formatValue(value) {
background-color: #000;
margin: 20px 0;
}
</style>
</style>

View File

@@ -92,3 +92,15 @@ export function printBloodCode (query) {
params: query,
});
}
/**
* 获取本次就诊处方单
*/
export function getEnPrescriptionInfo(data) {
return request({
url: '/doctor-station/main/prescription-page-info',
method: 'get',
params: data,
});
}

View File

@@ -6,8 +6,11 @@
"paperType": "A5",
"height": 210,
"width": 148,
"paperHeader": 0,
"paperFooter": 592.4409448818898,
"paperNumberDisabled": true,
"paperNumberContinue": true,
"expandCss": "",
"overPrintOptions": {
"content": "",
"opacity": 0.7,
@@ -24,20 +27,19 @@
"format": "YYYY-MM-DD HH:mm"
},
"panelLayoutOptions": {},
"paperHeader": 0,
"paperFooter": 841.8897637795277,
"printElements": [
{
"options": {
"left": 169.5,
"left": 0,
"top": 22.5,
"height": 12,
"width": 88.5,
"title": "长春大学医院",
"width": 420,
"title": "长春市朝阳区中医院医院",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 13.5,
"qrCodeLevel": 0
"qrCodeLevel": 0,
"textAlign": "center"
},
"printElementType": {
"title": "文本",
@@ -46,15 +48,16 @@
},
{
"options": {
"left": 189,
"left": 0,
"top": 45,
"height": 9.75,
"width": 42,
"width": 420,
"title": "处置单",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 11.25,
"qrCodeLevel": 0
"qrCodeLevel": 0,
"textAlign": "center"
},
"printElementType": {
"title": "文本",
@@ -331,4 +334,4 @@
]
}
]
}
}

View File

@@ -8,7 +8,7 @@
@close="close"
>
<el-table :data="recordList" highlight-current-row max-height="650" style="width: 100%" border>
<el-table-column prop="occurrenceTime" label="执行时间" align="center" />
<el-table-column prop="recordTime" label="执行时间" align="center" />
<el-table-column prop="statusEnum_enumText" label="执行状态" align="center" />
<el-table-column prop="orgName" label="执行科室" align="center" />
<el-table-column prop="practitionerName" label="执行人" align="center" />

View File

@@ -37,7 +37,7 @@
"top": 16.5,
"height": 22.5,
"width": 120,
"title": "长春大学医院",
"title": "长春市朝阳区中医院医院",
"coordinateSync": false,
"widthHeightSync": false,
"fontFamily": "Microsoft YaHei",
@@ -637,4 +637,4 @@
]
}
]
}
}

View File

@@ -50,8 +50,9 @@
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
layout="total, sizes, prev, pager, next"
@pagination="getPatientList"
:pager-count="1"
:layout="'total, prev, pager, next'"
/>
</el-col>
</el-row>
@@ -96,6 +97,13 @@
>
打印处置单
</el-button>
<el-button
type="primary"
plain
@click.stop="getEnPrescription()"
>
处方单
</el-button>
</el-col>
<el-col :xs="24" :sm="12" :md="6">
<el-form
@@ -301,6 +309,11 @@
</el-col>
</el-row>
<PerformRecordDialog :open="openDialog" :recordList="recordList" @close="openDialog = false" />
<PrescriptionInfo
:open="openPrescriptionDialog"
:precriptionInfo="prescriptionInfo"
@close="openPrescriptionDialog = false"
/>
</div>
</template>
@@ -311,20 +324,24 @@ import {
getDisposalList,
execute,
cancel,
getEnPrescriptionInfo,
getPerformRecord,
listWesternmedicine,
printBloodCode,
} from './components/api';
import PerformRecordDialog from './components/performRecordDialog';
import PrescriptionInfo from '../../doctorstation/components/prescription/prescriptionInfo.vue';
import templateJson from './components/template.json';
import prescriptionTemplate from './components/prescriptionTemplate.json';
import bloodTemplate from './components/bloodTemplate.json';
import disposalTemplate from './components/disposalTemplate.json';
import { advicePrint, getAdjustPriceSwitchState, lotNumberMatch } from '@/api/public';
import { formatDateStr } from '@/utils';
import { hiprint } from 'vue-plugin-hiprint';
import { advicePrint } from '@/api/public';
import useUserStore from '@/store/modules/user';
import { getGroupMarkers } from '@/utils/his';
import { simplePrint, PRINT_TEMPLATE } from '@/utils/printUtils.js';
// 患者搜索
const queryParams = ref({
pageNo: 1,
@@ -334,6 +351,10 @@ const receptionTime = ref([
formatDateStr(new Date(), 'YYYY-MM-DD'),
formatDateStr(new Date(), 'YYYY-MM-DD'),
]);
const openPrescriptionDialog = ref(false);
const prescriptionInfo = ref([]);
const total = ref(0);
// 患者数据
const patientList = ref([]);
@@ -424,6 +445,18 @@ function handleServiceCategoryChange(value) {
function handlePatientSelect(row) {
loading.value = true;
currentPatient.value = row;
getAdjustPriceSwitchState().then((res) => {
if (res.data) {
lotNumberMatch({ encounterIdList: row.encounterId }).then(() => {
getAllList(row);
});
} else {
getAllList(row);
}
});
}
function getAllList(row) {
getDisposalList(row.encounterId).then((res) => {
deviceList.value = res.data.records.filter((item) => {
return item.requestTable == 'wor_device_request';
@@ -440,6 +473,7 @@ function handlePatientSelect(row) {
loading.value = false;
});
}
// 批量操作校验
function handleBatchValidate(type) {
let params = [];
@@ -642,6 +676,23 @@ function printPrescription() {
}); //开始打印
});
}
// 查看本次就诊处方单
function getEnPrescription() {
getEnPrescriptionInfo({ encounterId: currentPatient.value.encounterId }).then((res) => {
console.log('处方单 res', res);
let dataArr = res.data.records || [];
if (dataArr.length <= 0) {
ElMessage({
type: 'error',
message: '暂无处方单',
});
return;
}
prescriptionInfo.value = res.data.records;
openPrescriptionDialog.value = true;
});
}
// 打印处置单
function printDisposal() {
let requestIds = deviceActivityList.value
@@ -749,7 +800,100 @@ function handleCancel(row) {
});
}
// 打印瓶贴
function printBottleLabel() {
// function printBottleLabel() {
// let result = [];
// // 过滤出全部输液药品
// let selectRows = activityListRef.value.getSelectionRows();
// let printLiist = [];
// // 有选中的优先打印选中行,没有的话打印全部的输液药品
// if (selectRows.length > 0) {
// printLiist = selectRows.filter((item) => {
// return item.medCategory == '2' || item.medCategory == '1';
// });
// } else {
// printLiist = activityList.value.filter((item) => {
// return item.medCategory == '2' || item.medCategory == '1';
// });
// }
// // 按照groupId分组但将多天的项目展开为独立项目
// let expandedList = [];
// printLiist.forEach((item) => {
// // 如果用药天数大于1则创建多个项目
// if (item.dispensePerDuration && item.dispensePerDuration > 1) {
// // 为每一天创建一个项目
// for (let i = 0; i < item.dispensePerDuration; i++) {
// // 克隆项目并调整数量
// const clonedItem = {
// ...item,
// // 数量除以天数
// quantity: item.quantity ? item.quantity / item.dispensePerDuration : item.quantity,
// // 可以添加一个字段表示是第几天
// dayIndex: i + 1,
// totalDays: item.dispensePerDuration,
// data: item.itemName + ' ' + item.size + ' ' + item.methodCode_dictText,
// };
// // 获取当前时间做执行日期如果用药天数大于1依次累加
// const date = new Date();
// date.setDate(date.getDate() + i);
// clonedItem.performDateTime = formatDateStr(date, 'YYYY-MM-DD');
// // 将克隆的项目添加到展开列表中不按groupId分组
// expandedList.push(clonedItem);
// }
// } else {
// // 天数为1或没有设置天数直接使用原项目
// item.data = item.itemName + ' ' + item.size + ' ' + item.methodCode_dictText;
// expandedList.push(item);
// }
// });
// // 重新按groupId分组但每个展开的项目都是独立的
// const groupedByGroupId = expandedList.reduce((acc, item) => {
// // 为展开的项目生成新的唯一groupId
// const groupId = item.dayIndex
// ? `${item.groupId || item.requestId}_day${item.dayIndex}`
// : item.groupId || item.requestId;
// if (!acc[groupId]) {
// acc[groupId] = [];
// }
// acc[groupId].push(item);
// return acc;
// }, {});
// const resultList = Object.values(groupedByGroupId);
// console.log(resultList, '23456789');
// result = resultList.map((item) => {
// return {
// patientName: currentPatient.value.patientName,
// prepareName: userStore.nickName,
// genderEnum_enumText: currentPatient.value.genderEnum_enumText,
// age: currentPatient.value.age,
// date: item[0].performDateTime,
// infuseData: item,
// };
// });
// const printElements = templateJson;
// var hiprintTemplate = new hiprint.PrintTemplate({ template: printElements }); // 定义模板
// console.log(result, '打印机列表');
// hiprintTemplate.print2(result, {
// // printer: 'Xprinter XP-365B',
// height: 210,
// width: 148,
// });
// // 直接打印回调
// // 发送任务到打印机成功
// hiprintTemplate.on('printSuccess', function (e) {
// console.log('打印成功');
// });
// // 发送任务到打印机失败
// hiprintTemplate.on('printError', function (e) {
// console.log('打印失败');
// });
// }
async function printBottleLabel() {
let result = [];
// 过滤出全部输液药品
let selectRows = activityListRef.value.getSelectionRows();
@@ -795,6 +939,9 @@ function printBottleLabel() {
// 天数为1或没有设置天数直接使用原项目
item.data = item.itemName + ' ' + item.size + ' ' + item.methodCode_dictText;
expandedList.push(item);
//将当前时间传到expandedList中
const date = new Date();
item.performDateTime = formatDateStr(date, 'YYYY-MM-DD');
}
});
@@ -815,6 +962,7 @@ function printBottleLabel() {
console.log(resultList, '23456789');
result = resultList.map((item) => {
console.log(item, '111323item');
return {
patientName: currentPatient.value.patientName,
prepareName: userStore.nickName,
@@ -824,23 +972,25 @@ function printBottleLabel() {
infuseData: item,
};
});
const printElements = templateJson;
var hiprintTemplate = new hiprint.PrintTemplate({ template: printElements }); // 定义模板
console.log(result, '打印机列表');
hiprintTemplate.print2(result, {
// printer: 'Xprinter XP-365B',
height: 210,
width: 148,
});
console.log(result, '打印数据');
await simplePrint(PRINT_TEMPLATE.OUTPATIENT_INFUSION, result);
// console.log('打印成功');
// const printElements = templateJson;
// var hiprintTemplate = new hiprint.PrintTemplate({ template: printElements }); // 定义模板
// console.log(result, '打印机列表');
// hiprintTemplate.print2(result, {
// height: 210,
// width: 148,
// });
// 直接打印回调
// 发送任务到打印机成功
hiprintTemplate.on('printSuccess', function (e) {
console.log('打印成功');
});
// 发送任务到打印机失败
hiprintTemplate.on('printError', function (e) {
console.log('打印失败');
});
// hiprintTemplate.on('printSuccess', function (e) {
// console.log('打印成功');
// });
// // 发送任务到打印机失败
// hiprintTemplate.on('printError', function (e) {
// console.log('打印失败');
// });
}
// 选择框改变时的处理
@@ -1039,4 +1189,4 @@ function getRecord(row) {
:deep(.el-table__body) tr:hover td.no-hover-column {
background-color: inherit !important;
}
</style>
</style>

View File

@@ -12,6 +12,16 @@
width="100"
/>
<el-table-column label="门诊号" align="center" prop="iptOtpNo" />
<el-table-column label="患者姓名" align="center" prop="patnName" />
<el-table-column label="身份证号" align="center" prop="certno" />
<el-table-column label="诊断名" align="center" prop="conditionName" />
<el-table-column
label="慢性诊断名"
align="center"
prop="specialConditionName"
width="180"
/>
<el-table-column label="请求数量" align="center" prop="quantity" />
<el-table-column label="请求单位" align="center" prop="unitCode" />
<el-table-column label="审核状态" align="center" prop="statusEnum_enumText" />
@@ -38,8 +48,7 @@
<el-table-column label="给药间隔" align="center" prop="dispenseInterval" />
<el-table-column label="单次发药数" align="center" prop="dispensePerQuantity" />
<el-table-column label="每次发药供应天数" align="center" prop="dispensePerDuration" />
<el-table-column label="患者姓名" align="center" prop="patnName" />
<el-table-column label="身份证号" align="center" prop="certno" />
<el-table-column label="开方医生名" align="center" prop="practitionerName" />
<el-table-column label="挂号科室" align="center" prop="mdtrtDeptName" />
<el-table-column label="开单科室" align="center" prop="prscDeptName" />
@@ -53,7 +62,6 @@
{{ formatDate(scope.row.prscTime) }}
</template>
</el-table-column>
<el-table-column label="诊断名" align="center" prop="conditionName" />
</el-table>
<!-- <pagination
v-show="total > 0"

View File

@@ -27,7 +27,7 @@
<span>CF0000000001</span>
</div>
<div style="text-align: center">
<h2>长春大学医院</h2>
<h2>长春市朝阳区中医院医院</h2>
</div>
<div style="text-align: center">
<h3>处方单</h3>
@@ -235,4 +235,4 @@ getList();
width: 80px;
display: inline-block;
}
</style>
</style>

View File

@@ -8,32 +8,73 @@
</div>
</template>
<div style="width: 100%">
<el-input v-model="queryParams.searchKey" placeholder="搜索患者"
style="width: 48%; margin-bottom: 10px; margin-right: 15px" @keyup.enter="getEncounterList">
<el-input
v-model="queryParams.searchKey"
placeholder="搜索患者"
style="width: 48%; margin-bottom: 10px; margin-right: 15px"
@keyup.enter="getEncounterList"
>
<template #append>
<el-button icon="Search" @click="getEncounterList" />
</template>
</el-input>
<el-select v-model="queryParams.refundEnum" style="width: 48%; margin-bottom: 10px" placeholder="收费状态"
@change="getEncounterList">
<el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
<el-select
v-model="queryParams.refundEnum"
style="width: 48%; margin-bottom: 10px"
placeholder="收费状态"
@change="getEncounterList"
>
<el-option
v-for="item in statusOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-date-picker v-model="dateRange" type="daterange" start-placeholder="开始日期" end-placeholder="结束日期"
style="width: 85%; margin-bottom: 10px" value-format="YYYY-MM-DD" placement="bottom"
@change="getEncounterList" />
<el-button type="primary" @click="getEncounterList" style="margin-bottom: 10px; margin-left: 18px">
<el-date-picker
v-model="dateRange"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width: 85%; margin-bottom: 10px"
value-format="YYYY-MM-DD"
placement="bottom"
@change="getEncounterList"
/>
<el-button
type="primary"
@click="getEncounterList"
style="margin-bottom: 10px; margin-left: 18px"
>
搜索
</el-button>
</div>
<el-table :data="encounterList" border style="width: 100%" height="calc(100vh - 300px)" highlight-current-row
@cell-click="handleGetReturnDrugList">
<el-table-column prop="patientName" align="center" label="姓名" width="130" show-overflow-tooltip />
<el-table-column prop="genderEnum_enumText" align="center" label="性别" show-overflow-tooltip />
<el-table
:data="encounterList"
border
style="width: 100%"
height="calc(100vh - 300px)"
highlight-current-row
@cell-click="handleGetReturnDrugList"
>
<el-table-column
prop="patientName"
align="center"
label="姓名"
width="130"
show-overflow-tooltip
/>
<el-table-column
prop="genderEnum_enumText"
align="center"
label="性别"
show-overflow-tooltip
/>
<el-table-column align="center" width="140" label="就诊日期" show-overflow-tooltip>
<template #default="scope">
{{
scope.row.receptionTime ? formatDateStr(scope.row.receptionTime, 'YYYY-MM-DD') : '-'
}}
scope.row.receptionTime ? formatDateStr(scope.row.receptionTime, 'YYYY-MM-DD') : '-'
}}
</template>
</el-table-column>
<!-- <el-table-column label="状态" align="center" prop="refundEnum_enumText" /> -->
@@ -52,16 +93,35 @@
</div>
</template>
<el-button type="primary" :disabled="!selectedMedicines.length" @click="handleReturnDrug(undefined)"
style="margin-bottom: 10px">
<el-button
type="primary"
:disabled="!selectedMedicines.length"
@click="handleReturnDrug(undefined)"
style="margin-bottom: 10px"
>
确认退药
</el-button>
<el-button type="primary" @click="handleScan()" style="margin-bottom: 10px"> 扫码 </el-button>
<el-table ref="returnDrugRef" :data="returDrugList" style="width: 100%" height="calc(100vh - 300px)" border
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table
ref="returnDrugRef"
:data="returDrugList"
style="width: 100%"
height="calc(100vh - 300px)"
border
@select="handleSelection"
@selection-change="handelSelectRows"
:span-method="handelSpanMethod"
class="no-hover-table"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column prop="itemName" label="药品名称" show-overflow-tooltip align="center" />
<el-table-column prop="totalPrice" label="总价" width="100" align="right" header-align="center">
<el-table-column
prop="totalPrice"
label="总价"
width="100"
align="right"
header-align="center"
>
<template #default="scope">
{{ scope.row.totalPrice ? scope.row.totalPrice.toFixed(2) + ' 元' : '-' }}
</template>
@@ -74,29 +134,30 @@
</el-table-column>
<el-table-column prop="reqStatus_enumText" label="退药状态" width="100" align="center">
<template #default="scope">
{{
scope.row.reqStatus_enumText == null
? scope.row.refundEnum_enumText
: scope.row.reqStatus_enumText
}}
{{ scope.row.refundEnum_enumText }}
</template>
</el-table-column>
<el-table-column prop="waitingQuantity" label="退药数量" width="100" align="center">
<template #default="scope">
<span>{{
scope.row.quantity
? Math.abs(scope.row.quantity)
: '0' + ' ' + scope.row.unitCode_dictText
}}</span>
scope.row.quantity
? Math.abs(scope.row.quantity) + ' ' + scope.row.unitCode_dictText
: '0' + ' ' + scope.row.unitCode_dictText
}}</span>
</template>
</el-table-column>
<el-table-column prop="doctorName" label="开单医生" align="center" width="180" />
<el-table-column label="操作" width="100" align="center" fixed="right">
<template #default="scope">
<el-popconfirm width="150" hide-after="10" title="操作确认" placement="top-start"
@confirm="handleReturnDrug(scope.row)">
<el-popconfirm
width="150"
hide-after="10"
title="操作确认"
placement="top-start"
@confirm="handleReturnDrug(scope.row)"
>
<template #reference>
<el-button type="primary" link :disabled="scope.row.reqStatus != 11">
<el-button type="primary" link :disabled="scope.row.refundEnum != 16">
退药
</el-button>
</template>
@@ -113,13 +174,17 @@
</div>
</div>
</el-card>
<TraceNoDialog :ypName="ypName" :openDialog="openTraceNoDialog" @submit="submit"
@cancel="openTraceNoDialog = false" />
<TraceNoDialog
:ypName="ypName"
:openDialog="openTraceNoDialog"
@submit="submit"
@cancel="openTraceNoDialog = false"
/>
</div>
</template>
<script setup name="ReturnDrug">
import { getCurrentInstance } from 'vue';
import { getCurrentInstance, nextTick } from 'vue';
import { getList, getReturnDrugList, returnDrug, init, itemTraceNo } from './components/api';
import { formatDateStr } from '@/utils/index';
import { debounce } from 'lodash-es';
@@ -128,7 +193,7 @@ import TraceNoDialog from '@/components/OpenHis/TraceNoDialog/index.vue';
const queryParams = ref({
pageSize: 50,
pageNum: 1,
refundEnum: 5,
refundEnum: 16,
});
const openTraceNo = ref(false);
const traceNoList = ref([]);
@@ -138,8 +203,10 @@ const encounterId = ref('');
const returDrugList = ref([]);
const selectedMedicines = ref([]);
const statusOptions = ref([]);
const dateRange = ref([formatDateStr(new Date(), 'YYYY-MM-DD'),
formatDateStr(new Date(), 'YYYY-MM-DD'),]);
const dateRange = ref([
formatDateStr(new Date(), 'YYYY-MM-DD'),
formatDateStr(new Date(), 'YYYY-MM-DD'),
]);
const traceNoTemp = ref('');
const traceNoTempRef = ref();
const totalAmount = ref(0);
@@ -226,14 +293,16 @@ function handleReturnDrug(row) {
console.log(row);
let saveList = [];
if (row) {
saveList = [
{
requestId: row.requestId,
dispenseId: row.dispenseId,
tableName: row.serviceTable,
traceNo: row.traceNo,
},
];
saveList = returDrugList.value
.filter((item) => item.requestId == row.requestId)
.map((item) => {
return {
requestId: item.requestId,
dispenseId: item.dispenseId,
tableName: item.serviceTable,
traceNo: item.traceNo,
};
});
} else {
saveList = proxy.$refs.returnDrugRef.getSelectionRows().map((item) => {
return {
@@ -248,7 +317,7 @@ function handleReturnDrug(row) {
returnDrug(saveList).then((res) => {
if (res.code === 200) {
proxy.$modal.msgSuccess('退药成功');
getEncounterList()
getEncounterList();
getReturnDrugList({
encounterId: encounterId.value,
refundStatus: queryParams.value.refundEnum,
@@ -259,12 +328,79 @@ function handleReturnDrug(row) {
});
}
function handleSelectionChange(selectRows) {
selectedMedicines.value = selectRows;
totalAmount.value = selectRows.reduce((accumulator, currentRow) => {
// 选择框改变时的处理
function handleSelection(selection, row) {
const isSelected = selection.some((item) => item.dispenseId === row.dispenseId);
returDrugList.value
.filter((item) => {
return item.requestId == row.requestId;
})
.forEach((row) => {
proxy.$refs['returnDrugRef'].toggleRowSelection(row, isSelected);
});
nextTick(() => {
selectedMedicines.value = proxy.$refs['returnDrugRef'].getSelectionRows();
totalAmount.value = selectedMedicines.value.reduce((accumulator, currentRow) => {
return accumulator + (currentRow.totalPrice || 0);
}, 0);
});
}
function handelSelectRows(selection) {
selectedMedicines.value = selection;
totalAmount.value = selectedMedicines.value.reduce((accumulator, currentRow) => {
return accumulator + (currentRow.totalPrice || 0);
}, 0);
}
// 根据 requestId 合并相同行的方法(只合并药品名称和总价列)
function handelSpanMethod({ row, column, rowIndex, columnIndex }) {
// 定义需要合并的列索引
// 1: 药品名称列, 2: 总价列
const mergeColumns = [1, 2, 5, 7, 8];
// 检查当前列是否需要合并
if (!mergeColumns.includes(columnIndex)) {
return [1, 1];
}
// 获取当前行的 requestId
const currentRequestId = row.requestId;
// 如果没有 requestId不进行合并
if (!currentRequestId) {
return [1, 1];
}
// 查找具有相同 requestId 的连续行
let rowspan = 1;
let colspan = 1;
// 向上查找相同 requestId 的行
let startIndex = rowIndex;
while (startIndex > 0 && returDrugList.value[startIndex - 1].requestId === currentRequestId) {
startIndex--;
rowspan++;
}
// 如果当前行不是合并组的第一行,则不显示
if (startIndex !== rowIndex) {
return [0, 0];
}
// 向下查找相同 requestId 的行
let endIndex = rowIndex;
while (
endIndex < returDrugList.value.length - 1 &&
returDrugList.value[endIndex + 1].requestId === currentRequestId
) {
endIndex++;
rowspan++;
}
// 只有当 rowspan > 1 时才进行合并
return rowspan > 1 ? [rowspan, colspan] : [1, 1];
}
</script>
<style lang="scss" scoped>
@@ -339,4 +475,8 @@ function handleSelectionChange(selectRows) {
::v-deep.el-textarea .el-textarea__inner {
resize: none !important;
}
:deep(.no-hover-table) .el-table__body tr:hover > td {
background: inherit !important;
}
</style>

View File

@@ -1,34 +1,77 @@
import request from '@/utils/request'
import request from '@/utils/request';
export function listSkinRecord(query) {
/**
* 获取患者列表
*/
export function getList(queryParams) {
return request({
url: '/outpatient-manage/skin-test/outpatient-record-page',
url: '/outpatient-manage/treatment/encounter-list',
method: 'get',
params: query
})
params: queryParams,
});
}
/**
* 获取皮试记录列表
*/
export function listSkinRecord(queryParams) {
return request({
url: '/outpatient-manage/skin-test/record-info',
method: 'get',
params: queryParams,
});
}
/**后台没有对应接口,暂无
* 更新护士签名
*/
export function updateNurseSign(data) {
return request({
url: '/outpatient-manage/skin-test/nurse-sign',
method: 'put',
data: data,
});
}
/**
* 更新皮试记录
*/
export function updateSkinTestRecord(data) {
return request({
url: '/outpatient-manage/skin-test/save-record-info',
method: 'post',
data: data,
});
}
/**
* 初始化选项
*/
export function lists() {
return request({
url: '/outpatient-manage/skin-test/init',
method: 'get',
})
});
}
/**
* 获取护士列表
*/
export function getNurseList(queryParams) {
return request({
url: '/app-common/nurse-list',
method: 'get',
params: queryParams,
});
}
export function updateSkinTestRecord(data) {
return request({
url: '/outpatient-manage/skin-test/outpatient-record-skin-test',
method: 'put',
data: data
})
}
export function updateNurseSign(data) {
return request({
url: '/outpatient-manage/skin-test/outpatient-record-sign-check',
method: 'put',
data: data
})
}
/**
* 新增皮试记录
*/
export function addSkinTestRecord(data) {
return request({
url: '/outpatient-manage/skin-test/save-record-info',
method: 'post',
data: data,
});
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
import request from '@/utils/request'
import request from '@/utils/request';
// 病历相关接口
/**
* 获取患者列表
@@ -7,8 +7,8 @@ export function getList(queryParams) {
return request({
url: '/doctor-station/main/patient-info',
method: 'get',
params: queryParams
})
params: queryParams,
});
}
/**
@@ -18,8 +18,8 @@ export function getEmrHistoryList(queryParams) {
return request({
url: '/doctor-station/emr/emr-page',
method: 'get',
params: queryParams
})
params: queryParams,
});
}
/**
@@ -29,8 +29,8 @@ export function getEmrTemplateList(queryParams) {
return request({
url: '/doctor-station/emr/emr-template-page',
method: 'get',
params: queryParams
})
params: queryParams,
});
}
/**
@@ -40,7 +40,7 @@ export function receiveEncounter(encounterId) {
return request({
url: '/doctor-station/main/receive-encounter?encounterId=' + encounterId,
method: 'get',
})
});
}
/**
@@ -50,7 +50,7 @@ export function leaveEncounter(encounterId) {
return request({
url: '/doctor-station/main/leave-encounter?encounterId=' + encounterId,
method: 'get',
})
});
}
/**
@@ -60,7 +60,7 @@ export function completeEncounter(encounterId) {
return request({
url: '/doctor-station/main/complete-encounter?encounterId=' + encounterId,
method: 'get',
})
});
}
/**
@@ -70,39 +70,39 @@ export function saveEmr(data) {
return request({
url: '/doctor-station/emr/emr',
method: 'post',
data: data
})
data: data,
});
}
/**
* 删除病历模板
*/
export function deleteEmrTemplate(id){
export function deleteEmrTemplate(id) {
return request({
url: '/doctor-station/emr/emr-template?id=' + id,
method: 'delete',
})
});
}
/**
* 获取病历详情
*/
export function getEmrDetail(encounterId){
export function getEmrDetail(encounterId) {
return request({
url: '/doctor-station/emr/emr-detail?encounterId=' + encounterId,
method: 'get',
})
});
}
/**
* 保存病历模板
*/
export function saveEmrTemplate(data){
export function saveEmrTemplate(data) {
return request({
url: '/doctor-station/emr/emr-template',
method: 'post',
data: data
})
data: data,
});
}
// 诊断相关接口
@@ -111,10 +111,10 @@ export function saveEmrTemplate(data){
*/
export function saveDiagnosis(data) {
return request({
url: '/doctor-station/diagnosis/save-doctor-diagnosis',
url: '/doctor-station/diagnosis/save-doctor-diagnosisnew',
method: 'post',
data: data
})
data: data,
});
}
/**
@@ -124,8 +124,8 @@ export function saveDiagnosisBind(data) {
return request({
url: '/doctor-station/diagnosis/diagnosis-belong-binding',
method: 'post',
data: data
})
data: data,
});
}
/**
* 删除诊断绑定
@@ -134,7 +134,7 @@ export function deleteDiagnosisBind(id) {
return request({
url: '/doctor-station/diagnosis/diagnosis-belong-binding?id=' + id,
method: 'delete',
})
});
}
/**
@@ -144,8 +144,8 @@ export function getDiagnosisDefinitionList(queryParams) {
return request({
url: '/doctor-station/diagnosis/condition-definition-metadata',
method: 'get',
params: queryParams
})
params: queryParams,
});
}
/**
@@ -155,7 +155,7 @@ export function getConditionDefinitionInfo(patientId) {
return request({
url: '/doctor-station/diagnosis/get-condition-definition-class?patientId=' + patientId,
method: 'get',
})
});
}
/**
@@ -165,40 +165,51 @@ export function diagnosisInit() {
return request({
url: '/doctor-station/diagnosis/init',
method: 'get',
})
});
}
/**
*
*
* 获取诊断回显数据
*/
export function getEncounterDiagnosis(encounterId) {
return request({
url: '/doctor-station/diagnosis/get-encounter-diagnosis?encounterId=' + encounterId,
method: 'get',
})
});
}
/**
*
*
* 获取诊断集合数据
*/
export function getDiagnosisListEle(searchKey,encounterId) {
return request({
url: '/doctor-station/diagnosis/get-encounter-diagnosis-ele?searchKey=' + searchKey+'&encounterId='+encounterId,
method: 'get',
});
}
/**
*
* 获取诊断集合数据
*/
export function getDiagnosisList(searchKey) {
return request({
url: '/doctor-station/diagnosis/get-diagnosis-list?searchKey=' + searchKey,
method: 'get',
})
return request({
url: '/doctor-station/diagnosis/get-diagnosis-list?searchKey=' + searchKey,
method: 'get',
});
}
/**
*
*
* 删除就诊诊断
*/
export function delEncounterDiagnosis(conditionId) {
return request({
url: '/doctor-station/diagnosis/encounter-diagnosis?conditionId=' + conditionId,
method: 'delete',
})
});
}
// 处方相关接口
@@ -209,8 +220,8 @@ export function getAdviceBaseInfo(queryParams) {
return request({
url: '/doctor-station/advice/advice-base-info',
method: 'get',
params: queryParams
})
params: queryParams,
});
}
/**
* 保存处方(单条)
@@ -219,8 +230,8 @@ export function savePrescription(data) {
return request({
url: '/doctor-station/advice/save-advice',
method: 'post',
data: data
})
data: data,
});
}
/**
* 签发处方
@@ -229,8 +240,8 @@ export function savePrescriptionSign(data) {
return request({
url: '/doctor-station/advice/sign-advice',
method: 'post',
data: data
})
data: data,
});
}
/**
* 处方签退
@@ -239,8 +250,8 @@ export function singOut(data) {
return request({
url: '/doctor-station/advice/sign-off',
method: 'post',
data: data
})
data: data,
});
}
/**
* 获取患者本次就诊处方
@@ -249,7 +260,7 @@ export function getPrescriptionList(encounterId) {
return request({
url: '/doctor-station/advice/request-base-info?encounterId=' + encounterId,
method: 'get',
})
});
}
/**
* 获取科室列表
@@ -258,7 +269,7 @@ export function getOrgTree() {
return request({
url: '/base-data-manage/organization/organization',
method: 'get',
})
});
}
/**
* 获取退费账单
@@ -267,7 +278,7 @@ export function getEncounterPatientPayment(encounterId) {
return request({
url: '/charge-manage/refund/patient-payment?encounterId=' + encounterId,
method: 'get',
})
});
}
/**
* 申请退费
@@ -276,11 +287,10 @@ export function refundPayment(data) {
return request({
url: '/charge-manage/refund/refund-payment',
method: 'post',
data: data
})
data: data,
});
}
// 电子处方相关接口
/**
* 电子处方查询
@@ -289,8 +299,8 @@ export function getVeriPrescriptionInfo(queryParams) {
return request({
url: '/ybelep-request/get-PrescriptionInfo',
method: 'get',
params: queryParams
})
params: queryParams,
});
}
// 处方开立相关接口
@@ -301,16 +311,16 @@ export function getAllMedicationInfo(queryParams) {
return request({
url: '/doctor-station/elep/get-allMedicationInfo',
method: 'get',
params: queryParams
})
params: queryParams,
});
}
// 当返回的list为空时在调用get-allMedicationInfo
export function getAllMedicationUsualInfo(queryParams) {
return request({
url: '/doctor-station/elep/get-allMedicationUsualInfo',
method: 'get',
params: queryParams
})
params: queryParams,
});
}
/**
* 电子处方下拉框
@@ -318,8 +328,8 @@ export function getAllMedicationUsualInfo(queryParams) {
export function elepPrescriptionInit() {
return request({
url: '/doctor-station/elep/init',
method: 'get'
})
method: 'get',
});
}
/**
@@ -329,8 +339,8 @@ export function getPrescriptionInfo(queryParams) {
return request({
url: '/doctor-station/elep/get-prescriptionInfo',
method: 'get',
params: queryParams
})
params: queryParams,
});
}
/**
@@ -340,8 +350,8 @@ export function getMedicationInfo(queryParams) {
return request({
url: '/doctor-station/elep/get-medicationInfo',
method: 'get',
params: queryParams
})
params: queryParams,
});
}
/**
@@ -350,8 +360,8 @@ export function getMedicationInfo(queryParams) {
export function prescriptionNoInit() {
return request({
url: '/doctor-station/elep/prescriptionNoInit',
method: 'get'
})
method: 'get',
});
}
/**
@@ -361,8 +371,8 @@ export function savePrescriptionInfo(data) {
return request({
url: '/doctor-station/elep/save-prescriptionInfo',
method: 'post',
data: data
})
data: data,
});
}
/**
@@ -372,8 +382,8 @@ export function updatePrescriptionInfo(data) {
return request({
url: '/doctor-station/elep/update-prescriptionInfo',
method: 'post',
data: data
})
data: data,
});
}
/**
@@ -383,8 +393,8 @@ export function deletePrescriptionInfo(data) {
return request({
url: '/doctor-station/elep/delete-prescriptionInfo',
method: 'post',
data: data
})
data: data,
});
}
/**
@@ -394,8 +404,8 @@ export function issuancePrescription(prescriptionNoList) {
return request({
url: '/doctor-station/elep/issuance-prescription',
method: 'post',
data: prescriptionNoList
})
data: prescriptionNoList,
});
}
/**
@@ -405,8 +415,8 @@ export function getAdviceHistoryInfo(params) {
return request({
url: '/doctor-station/advice/request-history-info',
method: 'get',
params: params
})
params: params,
});
}
/**
@@ -416,8 +426,8 @@ export function updateGroupId(data) {
return request({
url: '/doctor-station/advice/update-groupid',
method: 'put',
data: data
})
data: data,
});
}
/**
@@ -427,8 +437,8 @@ export function getOrderGroupList(params) {
return request({
url: '/personalization/order-group/order-group',
method: 'get',
params: params
})
params: params,
});
}
/**
@@ -438,11 +448,10 @@ export function getContract(params) {
return request({
url: '/doctor-station/advice/get-encounter-contract',
method: 'get',
params: params
})
params: params,
});
}
/**
* 取得药品最新数据
*/
@@ -450,8 +459,8 @@ export function queryYbCatalogue(params) {
return request({
url: '/yb-request/query-yb-catalogue',
method: 'post',
params: params
})
params: params,
});
}
/**
@@ -461,8 +470,8 @@ export function getChronicDisease(params) {
return request({
url: '/yb-request/getConditionDefinition',
method: 'get',
params: params
})
params: params,
});
}
/**
@@ -472,8 +481,8 @@ export function getTcmMedicine(params) {
return request({
url: '/doctor-station/chinese-medical/tcm-advice-base-info',
method: 'get',
params: params
})
params: params,
});
}
/**
@@ -483,8 +492,8 @@ export function getTcmCondition(params) {
return request({
url: '/doctor-station/chinese-medical/condition-info',
method: 'get',
params: params
})
params: params,
});
}
/**
@@ -494,8 +503,8 @@ export function getTcmSyndrome(params) {
return request({
url: '/doctor-station/chinese-medical/syndrome-info',
method: 'get',
params: params
})
params: params,
});
}
/**
@@ -505,8 +514,8 @@ export function getTcmDiagnosis(params) {
return request({
url: '/doctor-station/chinese-medical/get-tcm-encounter-diagnosis',
method: 'get',
params: params
})
params: params,
});
}
/**
@@ -516,8 +525,20 @@ export function saveTcmDiagnosis(data) {
return request({
url: '/doctor-station/chinese-medical/save-tcm-diagnosis',
method: 'post',
data: data
})
data: data,
});
}
/**
* 保存中医诊断
*/
export function updateTcmDiagnosis(data) {
return request({
url: '/doctor-station/chinese-medical/update-tcm-diagnosis',
method: 'post',
data: data,
});
}
/**
@@ -527,7 +548,7 @@ export function deleteTcmDiagnosis(syndromeGroupNo) {
return request({
url: '/doctor-station/chinese-medical/tcm-diagnosis?syndromeGroupNo=' + syndromeGroupNo,
method: 'delete',
})
});
}
/**
@@ -537,8 +558,8 @@ export function saveTcmAdvice(data) {
return request({
url: '/doctor-station/chinese-medical/save-tcm-advice',
method: 'post',
data: data
})
data: data,
});
}
/**
@@ -548,8 +569,8 @@ export function signTcmAdvice(data) {
return request({
url: '/doctor-station/chinese-medical/sign-tcm-advice',
method: 'post',
data: data
})
data: data,
});
}
/**
@@ -559,8 +580,8 @@ export function signOutTcmAdvice(data) {
return request({
url: '/doctor-station/chinese-medical/sign-tcm-off',
method: 'post',
data: data
})
data: data,
});
}
/**
@@ -570,11 +591,10 @@ export function getTcmAdviceList(params) {
return request({
url: '/doctor-station/chinese-medical/tcm-request-base-info',
method: 'get',
params: params
})
params: params,
});
}
/**
* 获取预约记录
*/
@@ -582,8 +602,8 @@ export function getReservationInfo(params) {
return request({
url: '/doctor-station/reservation-record/reservation-info',
method: 'get',
params: params
})
params: params,
});
}
/**
@@ -593,8 +613,8 @@ export function addReservationInfo(data) {
return request({
url: '/doctor-station/reservation-record/save-reservation',
method: 'post',
data: data
})
data: data,
});
}
/**
@@ -604,8 +624,8 @@ export function editReservationInfo(data) {
return request({
url: '/doctor-station/reservation-record/edit-reservation',
method: 'put',
data: data
})
data: data,
});
}
/**
@@ -615,17 +635,16 @@ export function delReservationInfo(id) {
return request({
url: '/doctor-station/reservation-record/del-reservation',
method: 'delete',
params: id
})
params: id,
});
}
// 查询初期所需数据
export function getInit() {
return request({
url: '/charge-manage/register/init',
method: 'get'
})
method: 'get',
});
}
/**
@@ -635,8 +654,8 @@ export function queryParticipantList(params) {
return request({
url: '/app-common/practitioner-list',
method: 'get',
params: params
})
params: params,
});
}
/**
@@ -646,7 +665,7 @@ export function getOrgList() {
return request({
url: '/base-data-manage/organization/organization',
method: 'get',
})
});
}
/**
@@ -656,8 +675,8 @@ export function wardList(params) {
return request({
url: '/app-common/ward-list',
method: 'get',
params: params
})
params: params,
});
}
/**
@@ -667,8 +686,8 @@ export function handleHospitalization(data) {
return request({
url: '/inhospital-charge/register/by-doctor',
method: 'post',
data: data
})
data: data,
});
}
/**
@@ -678,8 +697,8 @@ export function getEnPrescriptionInfo(data) {
return request({
url: '/doctor-station/main/prescription-page-info',
method: 'get',
params: data
})
params: data,
});
}
/**
@@ -689,8 +708,8 @@ export function getOrderGroup(data) {
return request({
url: '/personalization/orders-group-package/group-package-for-order',
method: 'get',
params: data
})
params: data,
});
}
/**
@@ -700,8 +719,8 @@ export function getBindDevice(data) {
return request({
url: '/doctor-station/advice/order-bind-info',
method: 'get',
params: data
})
params: data,
});
}
/**
@@ -711,6 +730,46 @@ export function isFoodDiseasesNew(params) {
return request({
url: '/external-integration/foodborne-acquisition/is-food-diseases-new',
method: 'get',
params: params
})
params: params,
});
}
// 是否入院登记
export function isHospitalization(params) {
return request({
url: '/inhospital-charge/register/isRegister',
method: 'get',
params: params,
});
}
// 校验三十天内是否开过相同检查检验项目
export function checkServicesHistory(params) {
return request({
url: '/doctor-station/advice/proof-test-history',
method: 'get',
params: params,
});
}
/**
* 查询检验报告 url
*/
export function getProofResult(queryParams) {
return request({
url: '/doctor-station/advice/proof-result',
method: 'get',
params: queryParams,
});
}
/**
* 查询检查报告 url
*/
export function getTestResult(queryParams) {
return request({
url: '/doctor-station/advice/test-result',
method: 'get',
params: queryParams,
});
}

View File

@@ -91,7 +91,9 @@ import {
getTcmCondition,
getTcmSyndrome,
saveTcmDiagnosis,
updateTcmDiagnosis,
} from '@/views/doctorstation/components/api';
import { update } from 'lodash';
const props = defineProps({
openAddDiagnosisDialog: {
@@ -102,6 +104,10 @@ const props = defineProps({
type: Object,
required: true,
},
updateZy: {
type: Object,
required: true,
},
});
const conditionList = ref([]);
@@ -118,64 +124,183 @@ function handleOpen() {
getTcmCondition().then((res) => {
conditionList.value = res.data.records;
});
}
// 点击诊断列表处理,点击以后才显示证候列表
function handleClickRow(row) {
if (syndromeSelected.value || tcmDiagonsisList.value == 0) {
selectedDisease.value = true;
syndromeSelected.value = false;
timestamp.value = Date.now();
getTcmSyndrome().then((res) => {
syndromeList.value = res.data.records;
});
tcmDiagonsisSaveList.value.push({
definitionId: row.id,
ybNo: row.ybNo,
syndromeGroupNo: timestamp.value,
verificationStatusEnum: 4,
medTypeCode: '11',
});
tcmDiagonsisList.value.push({
conditionName: row.name,
syndromeGroupNo: timestamp.value,
tcmDiagonsisSaveList.value=[];
tcmDiagonsisList.value=[];
debugger;
if (props.updateZy.length>0) {
props.updateZy.forEach((item) => {
let updateIds=item.updateId.split("-");
let name=item.name.split("-");
tcmDiagonsisSaveList.value.push({
conditionId: updateIds[0],
definitionId: item.illnessDefinitionId,
ybNo: item.ybNo,
syndromeGroupNo: item.syndromeGroupNo,
verificationStatusEnum: 4,
medTypeCode: '11',
diagSrtNo:item.diagSrtNo,
});
tcmDiagonsisList.value.push({
conditionName: name[0],
syndromeGroupNo: item.syndromeGroupNo,
});
tcmDiagonsisSaveList.value.push({
conditionId: updateIds[1],
definitionId: item.symptomDefinitionId,
ybNo: item.symptomYbNo,
syndromeGroupNo: item.syndromeGroupNo,
diagSrtNo:item.diagSrtNo,
});
tcmDiagonsisList.value[tcmDiagonsisList.value.length - 1].syndromeName = name[1];
console.log("这是修改时带入的数据");
console.log(tcmDiagonsisList.value);
console.log(tcmDiagonsisSaveList.value);
syndromeSelected.value = true;
});
}
}
// 点击诊断列表处理,点击以后才显示证候列表
function handleClickRow(row) {
if (syndromeSelected.value || tcmDiagonsisList.value.length == 0) {
syndromeSelected.value = false;
selectedDisease.value = true;
timestamp.value = Date.now();
getTcmSyndrome().then((res) => {
syndromeList.value = res.data.records;
});
if (props.updateZy.length>0) {
props.updateZy.forEach((item) => {
let updateIds=item.updateId.split("-");
tcmDiagonsisSaveList.value.push({
updateId:updateIds[0],
conditionId: updateIds[0],
definitionId: row.id,
ybNo: row.ybNo,
syndromeGroupNo: timestamp.value,
verificationStatusEnum: 4,
medTypeCode: '11',
diagSrtNo:item.diagSrtNo,
});
debugger;
if(tcmDiagonsisList.value.length>0){
tcmDiagonsisList.value[tcmDiagonsisList.value.length - 1].conditionName = row.name;
}else{
tcmDiagonsisList.value.push({
conditionName: row.name,
syndromeGroupNo: timestamp.value,
});
}
});
}else{
tcmDiagonsisSaveList.value.push({
definitionId: row.id,
ybNo: row.ybNo,
syndromeGroupNo: timestamp.value,
verificationStatusEnum: 4,
medTypeCode: '11',
});
tcmDiagonsisList.value.push({
conditionName: row.name,
syndromeGroupNo: timestamp.value,
});
}
}
// tcmDiagonsisList.value.push({
// conditionName: row.name,
// syndromeGroupNo: timestamp.value,
// });
}
function clickSyndromeRow(row) {
tcmDiagonsisSaveList.value.push({
definitionId: row.id,
ybNo: row.ybNo,
syndromeGroupNo: timestamp.value,
debugger;
let flag=true;
tcmDiagonsisList.value.forEach( item => {
if(tcmDiagonsisList.value[tcmDiagonsisList.value.length - 1].conditionName==item.conditionName){
if(item.syndromeName==row.name ){
proxy.$modal.msgWarning('不能存在完全相同的诊断和证侯');
flag=false;
}
}
});
tcmDiagonsisList.value[tcmDiagonsisList.value.length - 1].syndromeName = row.name;
syndromeSelected.value = true;
if(flag){
if(props.updateZy.length>0){
props.updateZy.forEach((item) => {
let updateIds=item.updateId.split("-");
tcmDiagonsisSaveList.value.push({
updateId:updateIds[1],
conditionId: updateIds[1],
definitionId: row.id,
ybNo: row.ybNo,
syndromeGroupNo: timestamp.value,
});
tcmDiagonsisList.value[tcmDiagonsisList.value.length - 1].syndromeName = row.name;
syndromeSelected.value = true;
});
}else{
tcmDiagonsisSaveList.value.push({
definitionId: row.id,
ybNo: row.ybNo,
syndromeGroupNo: timestamp.value,
});
tcmDiagonsisList.value[tcmDiagonsisList.value.length - 1].syndromeName = row.name;
syndromeSelected.value = true;
}
// tcmDiagonsisList.value[tcmDiagonsisList.value.length - 1].syndromeName = row.name;
// syndromeSelected.value = true;
}
}
// 删除诊断
function removeDiagnosis(row, index) {
tcmDiagonsisList.value.splice(index, 1);
tcmDiagonsisSaveList.value = tcmDiagonsisSaveList.filter((item) => {
tcmDiagonsisSaveList.value = tcmDiagonsisSaveList.value.filter((item) => {
return item.syndromeGroupNo !== row.syndromeGroupNo;
});
}
function save() {
saveTcmDiagnosis({
patientId: props.patientInfo.patientId,
encounterId: props.patientInfo.encounterId,
diagnosisChildList: tcmDiagonsisSaveList.value,
}).then((res) => {
if (res.code == 200) {
emit('close');
proxy.$modal.msgSuccess('诊断已保存');
}
});
if(props.updateZy.length>0){
updateTcmDiagnosis({
patientId: props.patientInfo.patientId,
encounterId: props.patientInfo.encounterId,
diagnosisChildList: tcmDiagonsisSaveList.value,
}).then((res) => {
if (res.code == 200) {
emit('close');
proxy.$modal.msgSuccess('诊断已保存');
}
});
}else{
saveTcmDiagnosis({
patientId: props.patientInfo.patientId,
encounterId: props.patientInfo.encounterId,
diagnosisChildList: tcmDiagonsisSaveList.value,
}).then((res) => {
if (res.code == 200) {
emit('close');
proxy.$modal.msgSuccess('诊断已保存');
}
});
}
}
function submit() {
if (tcmDiagonsisSaveList.value.length > 0 && syndromeSelected.value) {
debugger;
if (
tcmDiagonsisSaveList.value.length > 0 &&
(syndromeSelected.value || tcmDiagonsisSaveList.value.length % 2 == 0)
) {
save();
} else {
proxy.$modal.msgWarning('请选择证候');

View File

@@ -2,33 +2,64 @@
<div>
<el-row :gutter="24">
<el-col :span="4" :xs="24">
<el-input v-model="diagnosis" placeholder="诊断名称" clearable style="width: 100%; margin-bottom: 10px"
@keyup.enter="queryDiagnosisUse">
<el-input
v-model="diagnosis"
placeholder="诊断名称"
clearable
style="width: 100%; margin-bottom: 10px"
@keyup.enter="queryDiagnosisUse"
>
<template #append>
<el-button icon="Search" @click="queryDiagnosisUse" />
</template>
</el-input>
<el-tree ref="treeRef" :data="tree" node-key="id" :props="{ label: 'name', children: 'children' }"
highlight-current default-expand-all :filter-node-method="filterNode" @node-click="handleNodeClick">
<el-tree
ref="treeRef"
:data="tree"
node-key="id"
:props="{ label: 'name', children: 'children' }"
highlight-current
default-expand-all
:filter-node-method="filterNode"
class="tree-with-scrollbar"
@node-click="handleNodeClick"
max-height="650"
>
<template #default="{ node, data }">
<div class="custom-tree-node">
<span>{{ node.label }}</span>
<span class="tree-node-actions">
<template v-if="node.level === 1 && data.name != '常用' && data.name != '历史'">
<el-button style="color: #000000" type="text" size="small" @click.stop="addChild(data)">
<el-button
style="color: #000000"
type="text"
size="small"
@click.stop="addChild(data)"
>
<el-icon>
<Plus />
</el-icon>
</el-button>
</template>
<el-popconfirm width="200" :hide-after="10" title="确认删除此常用诊断吗" placement="top-start"
@confirm="deleteChild(data)">
<el-popconfirm
width="200"
:hide-after="10"
title="确认删除此常用诊断吗"
placement="top-start"
@confirm="deleteChild(data)"
>
<template #reference>
<el-button style="color: #000000" v-if="
node.level === 2 &&
node.parent.data.name != '常用' &&
node.parent.data.name != '历史'
" type="text" size="small" @click.stop="">
<el-button
style="color: #000000"
v-if="
node.level === 2 &&
node.parent.data.name != '常用' &&
node.parent.data.name != '历史'
"
type="text"
size="small"
@click.stop=""
>
<el-icon>
<Minus />
</el-icon>
@@ -46,6 +77,9 @@
<el-button type="primary" plain @click="handleSaveDiagnosis()"> 保存诊断 </el-button>
<el-button type="primary" plain @click="handleAddTcmDiagonsis()"> 中医诊断 </el-button>
<el-button type="primary" plain @click="handleImport()"> 导入慢性病诊断 </el-button>
<span style="font-size: 12px; margin-left: 10px"
>注意 : 若使用电子处方,请不要导入慢性病诊断</span
>
</div>
<el-form :model="form" :rules="rules" ref="formRef">
@@ -53,17 +87,32 @@
<el-table-column label="序号" type="index" width="50" />
<el-table-column label="诊断排序" align="center" prop="diagSrtNo" width="180">
<template #default="scope">
<el-form-item :prop="`diagnosisList.${scope.$index}.diagSrtNo`" :rules="rules.diagSrtNo">
<el-input-number v-model="scope.row.diagSrtNo" controls-position="right" :controls="false"
style="width: 80px" />
<el-form-item
:prop="`diagnosisList.${scope.$index}.diagSrtNo`"
:rules="rules.diagSrtNo"
>
<el-input-number
v-model="scope.row.diagSrtNo"
controls-position="right"
:controls="false"
style="width: 80px"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="诊断类别" align="center" prop="diagSrtNo" width="180">
<template #default="scope">
<el-form-item :prop="`diagnosisList.${scope.$index}.medTypeCode`" :rules="rules.medTypeCode">
<el-form-item
:prop="`diagnosisList.${scope.$index}.medTypeCode`"
:rules="rules.medTypeCode"
>
<el-select v-model="scope.row.medTypeCode" placeholder=" " style="width: 150px">
<el-option v-for="item in med_type" :key="item.value" :label="item.label" :value="item.value" />
<el-option
v-for="item in med_type"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</template>
@@ -71,12 +120,26 @@
<el-table-column label="诊断名称" align="center" prop="name">
<template #default="scope">
<el-form-item :prop="`diagnosisList.${scope.$index}.name`" :rules="rules.name">
<el-popover :popper-style="{ padding: '0' }" placement="bottom-start" :visible="scope.row.showPopover"
trigger="manual" :width="800">
<diagnosislist :diagnosisSearchkey="diagnosisSearchkey" @selectDiagnosis="handleSelsectDiagnosis" />
<el-popover
:popper-style="{ padding: '0' }"
placement="bottom-start"
:visible="scope.row.showPopover"
trigger="manual"
:width="800"
>
<diagnosislist
:diagnosisSearchkey="diagnosisSearchkey"
@selectDiagnosis="handleSelsectDiagnosis"
/>
<template #reference>
<el-input v-model="scope.row.name" placeholder="请选择诊断" @input="handleChange"
@focus="handleFocus(scope.row, scope.$index)" @blur="handleBlur(scope.row)" />
<el-input
v-model="scope.row.name"
placeholder="请选择诊断"
@input="handleChange"
@focus="handleFocus(scope.row, scope.$index)"
@blur="handleBlur(scope.row)"
/>
</template>
</el-popover>
</el-form-item>
@@ -86,18 +149,37 @@
<el-table-column label="类别" align="center" prop="typeName" width="100" />
<el-table-column label="诊断类型" align="center" prop="maindiseFlag">
<template #default="scope">
<el-checkbox label="主诊断" :trueLabel="1" :falseLabel="0" v-model="scope.row.maindiseFlag" border
size="small" @change="(value) => handleMaindise(value, scope.$index)" />
<el-select v-model="scope.row.verificationStatusEnum" placeholder=" "
style="width: 40%; padding-bottom: 5px; padding-left: 10px" size="small">
<el-option v-for="item in diagnosisOptions" :key="item.value" :label="item.label"
:value="item.value" />
<el-checkbox
label="主诊断"
:trueLabel="1"
:falseLabel="0"
v-model="scope.row.maindiseFlag"
border
size="small"
@change="(value) => handleMaindise(value, scope.$index)"
/>
<el-select
v-model="scope.row.verificationStatusEnum"
placeholder=" "
style="width: 40%; padding-bottom: 5px; padding-left: 10px"
size="small"
>
<el-option
v-for="item in diagnosisOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="130">
<template #default="scope">
<el-button link type="primary" @click="handleDeleteDiagnosis(scope.row, scope.$index)">
<el-button
link
type="primary"
@click="handleDeleteDiagnosis(scope.row, scope.$index)"
>
删除
</el-button>
</template>
@@ -106,9 +188,17 @@
</el-form>
</el-col>
</el-row>
<diagnosisdialog :openDiagnosis="openDiagnosis" @close="closeDiagnosisDialog" :radio="orgOrUser" />
<AddDiagnosisDialog :openAddDiagnosisDialog="openAddDiagnosisDialog" :patientInfo="props.patientInfo"
@close="closeDiagnosisDialog" />
<diagnosisdialog
:openDiagnosis="openDiagnosis"
@close="closeDiagnosisDialog"
:radio="orgOrUser"
/>
<AddDiagnosisDialog
:openAddDiagnosisDialog="openAddDiagnosisDialog"
:updateZy="updateZy"
:patientInfo="props.patientInfo"
@close="closeDiagnosisDialog"
/>
</div>
</template>
@@ -130,10 +220,12 @@ import {
import diagnosisdialog from '../diagnosis/diagnosisdialog.vue';
import AddDiagnosisDialog from './addDiagnosisDialog.vue';
import diagnosislist from '../diagnosis/diagnosislist.vue';
import { onMounted, onBeforeUnmount } from 'vue';
// const diagnosisList = ref([]);
const allowAdd = ref(false);
const tree = ref([]);
const openDiagnosis = ref(false);
const updateZy = ref([]);
const openAddDiagnosisDialog = ref(false);
const diagnosisSearchkey = ref('');
const diagnosisOptions = ref([]);
@@ -142,6 +234,7 @@ const diagnosis = ref();
const orgOrUser = ref();
const form = ref({
diagnosisList: [],
isDataLoaded: false,
});
const props = defineProps({
patientInfo: {
@@ -172,29 +265,46 @@ function getDetail(encounterId) {
});
}
function refreshData() {
getList();
}
let maxNo = 99;
function getList() {
getEncounterDiagnosis(props.patientInfo.encounterId).then((res) => {
if (res.code == 200) {
form.value.diagnosisList = res.data;
emits('diagnosisSave', false);
}
});
getTcmDiagnosis({ encounterId: props.patientInfo.encounterId }).then((res) => {
if (res.code == 200) {
if (res.data.illness.length > 0) {
res.data.illness.forEach((item, index) => {
form.value.diagnosisList.push({
name: item.name + '-' + res.data.symptom[index].name,
ybNo: item.ybNo,
medTypeCode: item.medTypeCode,
syndromeGroupNo: item.syndromeGroupNo,
typeName: '中医诊断',
});
});
getEncounterDiagnosis(props.patientInfo.encounterId)
.then((res) => {
if (res.code == 200) {
form.value.diagnosisList = res.data;
emits('diagnosisSave', false);
}
emits('diagnosisSave', false);
}
});
maxNo = form.value.diagnosisList.length;
})
.then(() => {
getTcmDiagnosis({ encounterId: props.patientInfo.encounterId }).then((res) => {
if (res.code == 200) {
if (res.data.illness.length > 0) {
res.data.illness.forEach((item, index) => {
if (item.diagSrtNo <= maxNo) {
return;
}
form.value.diagnosisList.push({
name: item.name + '-' + res.data.symptom[index].name,
diagSrtNo: item.diagSrtNo,
ybNo: item.ybNo,
medTypeCode: item.medTypeCode,
syndromeGroupNo: item.syndromeGroupNo,
typeName: '中医诊断',
updateId:item.encounterDiagnosisId+'-'+res.data.symptom[index].encounterDiagnosisId,
illnessDefinitionId : item.definitionId,
symptomDefinitionId : res.data.symptom[index].definitionId,
symptomYbNo: res.data.symptom[index].ybNo,
});
maxNo = item.diagSrtNo;
});
}
emits('diagnosisSave', false);
}
});
});
getTree();
}
@@ -302,10 +412,10 @@ function getTree() {
function handleAddDiagnosis() {
proxy.$refs.formRef.validate((valid) => {
if (valid) {
if (!allowAdd.value) {
proxy.$modal.msgWarning('请先填写病历');
return;
}
// if (!allowAdd.value) {
// proxy.$modal.msgWarning('请先填写病历');
// return;
// }
form.value.diagnosisList.push({
showPopover: false,
name: undefined,
@@ -324,6 +434,7 @@ function handleAddDiagnosis() {
// 添加中医诊断
function handleAddTcmDiagonsis() {
updateZy.value = [];
openAddDiagnosisDialog.value = true;
}
@@ -410,13 +521,13 @@ function closeDiagnosisDialog(str) {
if (str === 'success') {
proxy.$modal.msgSuccess('操作成功');
}
openAddDiagnosisDialog.value = false;
openDiagnosis.value = false;
getList();
getTree();
}
function queryDiagnosisUse(value) { }
function queryDiagnosisUse(value) {}
function handleChange(value) {
diagnosisSearchkey.value = value;
@@ -432,8 +543,24 @@ function handleSelsectDiagnosis(row) {
}
/**获取焦点时 打开列表 */
function handleFocus(row, index) {
rowIndex.value = index;
row.showPopover = true;
if(row.typeName==='中医诊断'){
updateZy.value = [];
updateZy.value.push({
illnessDefinitionId: row.illnessDefinitionId,
symptomDefinitionId: row.symptomDefinitionId,
syndromeGroupNo: row.syndromeGroupNo,
symptomYbNo:row.symptomYbNo,
ybNo:row.ybNo,
updateId: row.updateId,
diagSrtNo: row.diagSrtNo,
name:row.name,
});
openAddDiagnosisDialog.value = true;
}else{
rowIndex.value = index;
row.showPopover = true;
}
}
/**失去焦点时 关闭列表 */
function handleBlur(row) {
@@ -447,10 +574,10 @@ function handleNodeClick(data) {
// 如果是根节点,不执行任何操作
return;
}
if (!allowAdd.value) {
proxy.$modal.msgWarning('请先填写病历');
return;
}
// if (!allowAdd.value) {
// proxy.$modal.msgWarning('请先填写病历');
// return;
// }
const isDuplicate = form.value.diagnosisList.some(
(diagnosis) => diagnosis.ybNo === data.ybNo || diagnosis.name === data.name
);
@@ -478,7 +605,10 @@ defineExpose({ getList, getDetail, handleSaveDiagnosis });
.el-checkbox.is-bordered.el-checkbox--small {
background-color: #ffffff;
}
.tree-with-scrollbar {
max-height: 650px;
overflow-y: auto;
}
.custom-tree-node {
display: flex;
align-items: center;

View File

@@ -1,28 +1,27 @@
<template>
<div>
<el-scrollbar height="200px">
<el-table
ref="emrTemplateRef"
:data="emrTemplate"
row-key="id"
highlight-current-row
@cell-click="clickRow"
>
<el-table-column label="模板名称" align="center" prop="templateName" />
<!-- <el-table-column label="使用范围" align="center" prop="useScopeCode" /> -->
<el-table-column label="操作" align="center" width="100">
<template #default="scope">
<el-button link type="primary" @click.stop="handelDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-scrollbar>
<el-table
ref="emrTemplateRef"
:data="emrTemplate"
row-key="id"
highlight-current-row
max-height="400"
@cell-click="clickRow"
>
<el-table-column label="模板名称" align="center" prop="templateName" />
<!-- <el-table-column label="使用范围" align="center" prop="useScopeCode" /> -->
<el-table-column label="操作" align="center" width="100">
<template #default="scope">
<el-button link type="primary" @click.stop="handelDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
layout="prev, pager, next"
@pagination="getList"
/>
</div>
@@ -31,9 +30,13 @@
<script setup>
import { getEmrTemplateList, deleteEmrTemplate } from '../api';
const queryParams = ref({});
const queryParams = ref({
pageSize: 10,
pageNo: 1,
});
const emrTemplate = ref([]);
const emrTemplateRef = ref();
const total = ref(0);
const emits = defineEmits(['selectRow']);
const { proxy } = getCurrentInstance();
const selectRow = ref({});
@@ -47,6 +50,7 @@ getList();
function getList() {
queryParams.value.useScopeCode = 1;
getEmrTemplateList(queryParams.value).then((res) => {
total.value = res.data.total;
emrTemplate.value = res.data.records;
console.log(emrTemplate.value, 'emrTemplate.value');
});

View File

@@ -101,9 +101,9 @@
>
<el-option
v-for="item in diagnosisListOption"
:key="item.id"
:label="item.name"
:value="item.id"
:key="item.definitionId"
:label="item.name + '--' + item.ybNo"
:value="item.definitionId"
/>
</el-select>
</el-form-item>
@@ -432,7 +432,7 @@ import { computed, onMounted, ref } from 'vue';
import { reactive } from 'vue';
// import { useModal, useDict } from '@/hooks';
import { parseTime, formatNumber } from '@/utils/his';
import { queryYbCatalogue, getDiagnosisList } from './api';
import { queryYbCatalogue, getDiagnosisListEle } from './api';
import { debounce } from 'lodash-es';
import {
@@ -565,7 +565,7 @@ const unitMap = ref({
function getInit(searchKey) {
if(searchKey) {
getDiagnosisList(searchKey).then(res => {
getDiagnosisListEle(searchKey,infoForm.encounterId).then(res => {
diagnosisListOption.value = res.data
})
}

View File

@@ -150,12 +150,12 @@
</el-col>
<el-col :span="12">
<el-form-item label="入院诊断" prop="diagnosisDefinitionId">
<el-select
<!-- <el-select
v-model="submitForm.diagnosisDefinitionId"
placeholder="诊断"
clearable
filterable
remote
remote
:remote-method="getDiagnosisInfo"
style="width: 400px"
>
@@ -166,7 +166,10 @@
:value="item.id"
@click="handleDiagnosisChange(item)"
/>
</el-select>
</el-select> -->
<el-input v-model="props.mainDiagnosis.name" disabled style="width: 400px" />
<!-- 隐藏存储ID的字段 -->
<input type="hidden" v-model="submitForm.diagnosisDefinitionId" />
</el-form-item>
</el-col>
</el-row>
@@ -179,7 +182,7 @@
</template>
</el-dialog>
</template>
<script setup>
import {
getInit,
@@ -201,6 +204,7 @@ const props = defineProps({
patientInfo: {
type: Object,
},
mainDiagnosis: { type: Object, default: null },
});
const emit = defineEmits(['close']);
@@ -239,9 +243,17 @@ const rules = reactive({
});
function openDialog() {
console.log('orgId==========>', props.patientInfo.orgId);
getOrgList().then((res) => {
organization.value = res.data.records;
// organization.value = res.data.records;
organization.value = res.data.records[0].children.filter(
(record) => record.typeEnum === 2 && record.classEnum === 2
);
console.log('organization==========>', organization.value);
submitForm.inHospitalOrgId =
organization.value.find((item) => item.id === props.patientInfo.orgId)?.id || '';
});
// wardList().then((res) => {
// wardListOptions.value = res.data;
// });
@@ -251,6 +263,14 @@ function openDialog() {
});
console.log(props.patientInfo, 'patientInfo');
getDiagnosisInfo(undefined);
console.log(props.mainDiagnosis, 'mainDiagnosis');
if (props.mainDiagnosis) {
submitForm.diagnosisDefinitionId = props.mainDiagnosis.definitionId;
diagnosisDefinitionId = props.mainDiagnosis.definitionId;
diagnosisYbNo = props.mainDiagnosis.ybNo || '';
submitForm.medTypeCode = props.mainDiagnosis.medTypeCode;
diagnosisDefinitionList.value = [props.mainDiagnosis];
}
}
function getDiagnosisInfo(value) {
@@ -320,4 +340,4 @@ function close() {
.patInfo-value {
width: 100px;
}
</style>
</style>

View File

@@ -1,34 +1,76 @@
/*
* @Author: sjjh
* @Date: 2025-09-20 17:02:37
* @Description:
* @Description:
*/
import request from '@/utils/request'
import request from '@/utils/request';
// ====== 文书记录
// 保存或更新记录
export function saveOrUpdateRecord(data) {
return request({
url: '/document/record/saveOrUpdateRecord',
method: 'post',
data,
});
}
// 新增记录
export function addRecord(data) {
return request({
url: '/document/record/addRecord',
method: 'post',
data
})
data,
});
}
// 修改记录
export function updateRecord(data) {
return request({
url: '/document/record/updateRecord',
method: 'post',
data,
});
}
// 删除历史记录
export function deleteRecord(ids) {
return request({
url: '/document/record/deleteRecord',
method: 'delete',
data: ids,
});
}
// 记录打印次数
export function recordPrint(recordId) {
return request({
url: '/document/record/record-print',
method: 'get',
params: { recordId },
});
}
//删除模板
export function deleteTemplate(id) {
return request({
url: `/document/template/delete`,
method: 'delete',
params: { id },
});
}
// 根据患者ID或就诊ID获取文书记录列表,只针对不需返回患者具体信息的列表,体温单除外,单独处理
export function getRecordByEncounterIdList(params) {
return request({
url: '/document/record/getRecordByEncounterIdList',
method: 'get',
params
})
params,
});
}
// 初始化文书定义
export function init() {
return request({
url: '/document/record/init',
method: 'get',
})
});
}
// ====== 文书模板
@@ -37,24 +79,22 @@ export function addTemplate(data) {
return request({
url: '/document/template/add',
method: 'post',
data
})
data,
});
}
//
export function getListByDefinitionId(definitionId) {
return request({
url: '/document/template/getListByDefinitionId',
method: 'get',
params: {definitionId}
})
params: { definitionId },
});
}
// 更新模板
export function updateTemplate(data) {
return request({
url: '/document/template/update',
method: 'put',
data
})
data,
});
}

View File

@@ -7,11 +7,29 @@
</template>
</el-input>
</div>
<el-scrollbar class="emr-history-scrollbar-container" style="width: 100%">
<div v-for="item in historyData" :key="item.id" class="scrollbar-item">
<el-scrollbar
class="emr-history-scrollbar-container"
style="width: 100%; height: calc(100vh - 300px)"
>
<div
v-for="item in historyData"
:key="item.id"
class="scrollbar-item"
:class="{ 'selected-history-item': item.id === props.selectedRecordId }"
>
<el-tooltip effect="dark" :content="`${item.name}(${item.recordTime})`" placement="bottom">
<el-text class="w-150px mb-2" truncated @click="handleNodeClick(item)">
{{ item.name }}({{ item.recordTime }})
<el-icon
class="ml-2"
style="margin-left: 26px; cursor: pointer"
:disabled="item.printCount && item.printCount > 0"
:class="{ 'disabled-icon': item.printCount && item.printCount > 0 }"
@click.stop="handleDelete(item)"
>
<Delete />
</el-icon>
</el-text>
</el-tooltip>
</div>
@@ -20,8 +38,8 @@
</template>
<script setup>
import { ref, reactive, defineEmits, unref } from 'vue';
import { getRecordByEncounterIdList } from '../api';
import { ref, reactive, defineEmits, unref, nextTick } from 'vue';
import { getRecordByEncounterIdList, deleteRecord } from '../api';
import { ElTree } from 'element-plus';
import { ElMessageBox, ElMessage, ElLoading } from 'element-plus';
import { patientInfo } from '../../store/patient.js';
@@ -31,6 +49,10 @@ const props = defineProps({
type: String,
default: '',
},
selectedRecordId: {
type: String,
default: '',
},
});
const definitionId = defineModel('definitionId', {
type: String,
@@ -59,14 +81,30 @@ const queryList = async () => {
historyData.value = [];
}
} catch (error) {
// ElMessage.error('获取模板树失败');
// ElMessage.error(' 获取模板树失败 ');
historyData.value = [];
}
};
const handleNodeClick = (data) => {
emits('historyClick', data);
};
const currentSelectTemplate = ref({});
// 删除历史记录
const handleDelete = async (item) => {
try {
// 检查是否已打印
if (item.printCount && item.printCount > 0) {
ElMessage.warning('已打印的记录不允许删除');
return;
}
await deleteRecord([item.id]);
ElMessage.success('删除成功');
queryList();
} catch (error) {
ElMessage.error('删除失败');
}
};
defineExpose({ queryList });
</script>
@@ -90,6 +128,16 @@ defineExpose({ queryList });
& + .scrollbar-item {
margin-top: 8px;
}
transition: all 0.3s ease;
}
.selected-history-item {
background-color: rgb(194, 231, 255);
}
.disabled-icon {
color: #d9d9d9;
cursor: not-allowed;
opacity: 0.6;
}
}
}

View File

@@ -9,17 +9,15 @@
</div> -->
<el-scrollbar class="emr-template-scrollbar-container" style="width: 100%">
<div v-for="item in templateData" :key="item.id" class="scrollbar-item">
<el-tooltip
effect="dark"
:content="`${item.name}`"
placement="bottom"
>
<el-tooltip effect="dark" :content="`${item.name}`" placement="bottom">
<el-text class="2" truncated @click="handleNodeClick(item)">
<div class="template-item">{{ item.name }}
<el-space>
<el-icon><Edit @click="handleEdit(item)" /></el-icon>
</el-space></div>
<div class="template-item">
{{ item.name }}
<el-space>
<el-icon><Edit @click="handleEdit(item)" /></el-icon>
<el-icon><Delete @click="handleDelete(item)" /></el-icon>
</el-space>
</div>
</el-text>
</el-tooltip>
</div>
@@ -29,11 +27,11 @@
<script setup>
import { ref, reactive, defineEmits, unref } from 'vue';
import { getListByDefinitionId } from '../api';
import { getListByDefinitionId, deleteTemplate } from '../api';
import { ElTree } from 'element-plus';
import { ElMessageBox, ElMessage, ElLoading } from 'element-plus';
import { patientInfo } from '../../store/patient.js';
const emits = defineEmits(['templateClick','edit']);
const emits = defineEmits(['templateClick', 'edit']);
const props = defineProps({
definitionId: {
type: String,
@@ -53,15 +51,24 @@ const queryParams = ref({
isPage: 0,
});
const templateData = ref([]);
// 删除模板
const handleDelete = async (item) => {
try {
await deleteTemplate(item.id);
ElMessage.success('删除成功');
queryList();
} catch (error) {
ElMessage.error('删除失败');
}
};
const queryList = async () => {
try {
if ( unref(definitionId)&&unref(definitionId) !== '') {
if (unref(definitionId) && unref(definitionId) !== '') {
const res = await getListByDefinitionId(unref(definitionId));
templateData.value = res.data || [];
}else{
} else {
templateData.value = [];
}
} catch (error) {
ElMessage.error('获取模板失败');
templateData.value = [];
@@ -79,34 +86,33 @@ defineExpose({ queryList });
<style lang="scss" scoped>
.emr-template-container {
height: 100%;
// padding: 8px;
.emr-template-scrollbar-container{
height: 100%;
// padding: 8px;
.emr-template-scrollbar-container {
padding: 8px;
height: 100%;
.scrollbar-item {
height: 40px;
line-height: 40px;
border-radius: 4px;
cursor: pointer;
background: var(--el-color-primary-light-9);
& + .scrollbar-item {
margin-top: 8px;
}
.el-text{
width: calc(100% - 0px);
display: flex;
justify-content: space-between;
padding: 0 8px;
}
.template-item{
width: 100%;
display: flex;
justify-content: space-between;
.scrollbar-item {
height: 40px;
line-height: 40px;
border-radius: 4px;
cursor: pointer;
background: var(--el-color-primary-light-9);
& + .scrollbar-item {
margin-top: 8px;
}
.el-text {
width: calc(100% - 0px);
display: flex;
justify-content: space-between;
padding: 0 8px;
}
.template-item {
width: 100%;
display: flex;
justify-content: space-between;
}
}
}
}
}
</style>

View File

@@ -1,8 +1,3 @@
<!--
* @Author: sjjh
* @Date: 2025-09-18 15:41:10
* @Description: 门诊病历组件
-->
<template>
<div class="emr-use-container">
<div
@@ -48,18 +43,21 @@
<!-- <el-button type="primary" @click="newEmr">新建</el-button> -->
<el-button type="primary" @click="saveAsModel">存为模版</el-button>
<el-button @click="refresh">刷新</el-button>
<el-button @click="resetForm">重置</el-button>
<el-button type="primary" @click="save">保存</el-button>
<!-- <el-button type="primary" @click="print">打印</el-button> -->
<el-button type="primary" @click="print">打印</el-button>
</el-space>
</div>
<div class="operate-main">
<el-scrollbar class="template-tree-scrollbar">
<component
:is="currentComponent"
ref="emrComponentRef"
:patientInfo="props.patientInfo"
@submitOk="handleSubmitOk"
/>
<div v-loading="loading" class="loading-container">
<component
:is="currentComponent"
ref="emrComponentRef"
:patientInfo="props.patientInfo"
@submitOk="handleSubmitOk"
/>
</div>
</el-scrollbar>
</div>
</div>
@@ -72,6 +70,7 @@
@historyClick="handleHistoryClick"
ref="historyRef"
v-model:definitionId="currentSelectTemplate.id"
:selectedRecordId="selectedHistoryRecordId"
/>
</el-tab-pane>
<el-tab-pane label="模版" name="model">
@@ -95,18 +94,19 @@
</div>
</template>
<script setup>
import { getCurrentInstance, nextTick, onBeforeMount, onMounted, reactive, ref } from 'vue';
import { ElMessageBox, ElMessage, ElLoading } from 'element-plus';
import { nextTick, onMounted, ref, watch } from 'vue';
import { ElMessage } from 'element-plus';
import { getTreeList } from '@/views/basicmanage/caseTemplates/api';
import { addRecord, addTemplate } from './api';
import { saveOrUpdateRecord, addTemplate, getRecordByEncounterIdList, recordPrint } from './api';
import { patientInfo } from '../store/patient.js';
import dayjs from 'dayjs';
// 打印工具
// import { simplePrint, PRINT_TEMPLATE } from '@/utils/printUtils.js';
import { simplePrint, PRINT_TEMPLATE } from '@/utils/printUtils.js';
import { getEncounterDiagnosis } from '../api';
const { proxy } = getCurrentInstance();
const emits = defineEmits(['emrSaved']);
const emits = defineEmits([]);
const props = defineProps({
/** 患者信息 doctorStation 传递信息*/
/** 患者信息 doctorStation 传递信息*/
patientInfo: {
type: Object,
required: true,
@@ -129,6 +129,7 @@ const queryParams = ref({
useRanges: [1, 2], // 0 暂不使用 1 全院 2 科室 3 个人
organizationId: userStore.orgId,
});
const loading = ref(false); // 数据加载状态
const currentSelectTemplate = ref({
id: '',
@@ -138,6 +139,7 @@ const emrComponentRef = ref(null);
const quicklyactiveName = ref('history');
const leftShow = ref(true);
const rightShow = ref(true);
const templateTree = ref(null);
// 树配置(模板树)
const defaultProps = {
@@ -150,6 +152,9 @@ const queryTemplateTree = async () => {
try {
const res = await getTreeList(queryParams.value);
templateData.value = res.data || [];
// 组件挂载后患者信息变化时会自动调用selectDefaultTemplate
// 这里不再重复调用,避免重复操作
} catch (error) {
// ElMessage.error('获取模板树失败');
templateData.value = [];
@@ -169,7 +174,20 @@ const handleNodeClick = (data, node) => {
};
// currentComponent.value = null;
}
historyRef.value?.queryList();
// 确保组件状态更新后再查询历史记录
nextTick(() => {
setTimeout(() => {
historyRef.value?.queryList();
templateRef.value?.queryList();
// 选择任何病历模板后,都加载该病历类型的最新历史记录
if (node.isLeaf && props.patientInfo && props.patientInfo.patientId) {
loadLatestMedicalRecord();
}
}, 100);
});
templateRef.value?.queryList();
};
@@ -229,19 +247,24 @@ const handleSubmitOk = async (data) => {
editForm.value.encounterId = patientInfo.value.encounterId;
editForm.value.patientId = patientInfo.value.patientId;
editForm.value.recordTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
await addRecord(editForm.value);
ElMessage.success('病历保存成功');
// 提交病历
await saveOrUpdateRecord(editForm.value);
ElMessage.success('保存成功');
// 刷新历史记录列表
historyRef.value?.queryList();
templateRef.value?.queryList();
// 通知父组件病历保存成功
emits('emrSaved', true);
// 等待历史记录列表更新后,重新加载最新病历并更新选中状态
setTimeout(() => {
loadLatestMedicalRecord();
}, 100);
} catch (error) {
ElMessage.error('提交失败');
console.log(error);
}
} else if (currentOperate.value === 'addTemplate') {
// 新增或者编辑模板
// editTemplateForm.value.id=
// 新增或修改模板
editTemplateForm.value.name =
currentSelectTemplate.value.name + dayjs().format('YYYY/MM/DD HH:mm');
editTemplateForm.value.contextJson = JSON.stringify(data);
@@ -256,17 +279,12 @@ const refresh = () => {
templateRef.value?.queryList();
};
const deleteEmr = async () => {
try {
// 这里应该添加实际的删除逻辑
ElMessage.success('删除成功!');
} catch (error) {
ElMessage.error('删除失败');
}
};
const save = async () => {
try {
if (editForm.value && editForm.value.printCount && editForm.value.printCount > 0) {
ElMessage.warning('该病历已打印,不允许修改');
return;
}
currentOperate.value = 'add';
await emrComponentRef.value?.submit();
} catch (error) {
@@ -274,6 +292,50 @@ const save = async () => {
}
};
// 重置表单数据
const resetForm = async () => {
try {
// 重置editForm为初始值
editForm.value = {
id: '',
definitionId: '',
definitionBusNo: '',
contentJson: '',
statusEnum: 1,
organizationId: 0,
encounterId: '',
patientId: '',
recordTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
createBy: '',
source: '',
};
// 先将组件设置为空,强制卸载
const currentComponentName = currentComponent.value;
if (currentComponentName) {
currentComponent.value = '';
// 等待DOM更新
await nextTick();
// 重新加载组件
currentComponent.value = currentComponentName;
// 再次等待DOM更新后设置空数据
await nextTick();
}
// 重置动态组件表单数据
if (emrComponentRef.value && emrComponentRef.value.setFormData) {
emrComponentRef.value.setFormData({});
}
ElMessage.success('表单已重置');
} catch (error) {
ElMessage.error('重置表单失败');
}
};
const historyRef = ref(null);
const handleHistoryClick = (data) => {
newEmr();
@@ -282,6 +344,108 @@ const handleHistoryClick = (data) => {
emrComponentRef.value?.setFormData(JSON.parse(editForm.value.contentJson));
});
};
// 默认选中门诊病历模板
const selectOutpatientMedicalRecordTemplate = async () => {
if (!templateData.value || templateData.value.length === 0) {
await queryTemplateTree();
}
// 查找门诊病历模板
const findOutpatientTemplate = (nodes) => {
for (const node of nodes) {
if (node.children && node.children.length > 0) {
const found = findOutpatientTemplate(node.children);
if (found) return found;
}
if (
node.document &&
node.document.name &&
(node.document.name.includes('门诊病历') ||
node.document.name === '门诊病历 (1.0.0)' ||
node.document.name === '门诊病历(1.0.0)')
) {
return node;
}
}
return null;
};
const outpatientTemplateNode = findOutpatientTemplate(templateData.value);
if (outpatientTemplateNode) {
//选中节点
nextTick(() => {
if (templateTree.value && outpatientTemplateNode.id) {
templateTree.value.setCurrentKey(outpatientTemplateNode.id);
}
// 选中门诊病历模板
handleNodeClick(outpatientTemplateNode, {
isLeaf: true,
data: outpatientTemplateNode,
});
// 等待模板加载完成,然后获取并回显最新病历数据
setTimeout(() => {
historyRef.value?.queryList();
loadLatestMedicalRecord();
}, 500);
});
} else {
ElMessage.info('未找到门诊病历模板');
}
};
// 当前选中的历史病历ID用于在History组件中高亮显示
const selectedHistoryRecordId = ref('');
// 加载最新的病历数据并回显
const loadLatestMedicalRecord = async () => {
if (!patientInfo.value.encounterId || !currentSelectTemplate.value.id) return;
loading.value = true;
try {
// 获取患者的历史病历记录
const res = await getRecordByEncounterIdList({
isPage: 0,
encounterId: patientInfo.value.encounterId,
patientId: patientInfo.value.patientId,
definitionId: currentSelectTemplate.value.id,
});
const historyRecords = res.data || [];
if (historyRecords.length > 0) {
// 按时间排序,获取最新的病历记录
historyRecords.sort((a, b) => new Date(b.recordTime) - new Date(a.recordTime));
const latestRecord = historyRecords[0];
// 保存最新病历ID用于在History组件中高亮显示
selectedHistoryRecordId.value = latestRecord.id;
// 自动回显最新病历数据到模板
editForm.value = latestRecord;
nextTick(() => {
if (emrComponentRef.value && latestRecord.contentJson) {
emrComponentRef.value.setFormData(JSON.parse(latestRecord.contentJson));
}
// 通知History组件更新选中状态
if (historyRef.value && typeof historyRef.value.updateSelectedRecord === 'function') {
historyRef.value.updateSelectedRecord(latestRecord.id);
}
});
} else {
// 清空选中状态
selectedHistoryRecordId.value = '';
}
} catch (error) {
ElMessage.error('加载最新病历数据失败');
// 出错时也清空选中状态
selectedHistoryRecordId.value = '';
} finally {
loading.value = false;
}
};
const templateRef = ref(null);
const handleTemplateClick = (data) => {
@@ -299,39 +463,77 @@ const templateEdit = (data) => {
const templateEditVisible = ref(false);
// const templateEditSubmitOk = () => {};
// 打印方法实现
// 定义病历模板类型与打印模板的映射关系
const templateToPrintTemplateMap = {
// 手术记录相关模板
手术记录: PRINT_TEMPLATE.OPERATIVE_RECORD,
'手术记录(1.0.0)': PRINT_TEMPLATE.OPERATIVE_RECORD,
tySurgicalRecord: PRINT_TEMPLATE.OPERATIVE_RECORD,
// 门诊病历相关模板
门诊病历: PRINT_TEMPLATE.HQOUTPATIENT_MEDICAL_RECORD,
'门诊病历(1.0.0)': PRINT_TEMPLATE.HQOUTPATIENT_MEDICAL_RECORD,
测试新增: PRINT_TEMPLATE.HQOUTPATIENT_MEDICAL_RECORD,
};
// 根据模板名称获取对应的打印模板
const getPrintTemplateByTemplateName = (templateName) => {
// 默认使用门诊病历模板
let printTemplate = PRINT_TEMPLATE.OUTPATIENT_MEDICAL_RECORD;
if (templateName) {
for (const [key, value] of Object.entries(templateToPrintTemplateMap)) {
if (templateName.includes(key)) {
printTemplate = value;
break;
}
}
}
return printTemplate;
};
// 打印
const print = async () => {
try {
// 检查是否有选中的病历模板
if (!currentSelectTemplate.value || !currentSelectTemplate.value.id) {
ElMessage.warning('请先选择病历模板');
return;
}
// 检查是否已保存
if (!editForm.value.id || editForm.value.id === '') {
ElMessage.warning('请先保存病历后再进行打印');
return;
}
// 获取当前病历组件的表单数据
const formData = emrComponentRef.value?.formData || {};
// 准备打印数据不依赖子组件的getPrintData方法
// const printData = {
// // 使用当前选中的模板信息
// templateInfo: currentSelectTemplate.value,
// // 添加患者信息
// patientInfo: props.patientInfo,
// // 添加打印时间
// printTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
// // 添加基本病历信息
// emrInfo: {
// documentName: currentSelectTemplate.value.name || '住院病历',
// documentId: currentSelectTemplate.value.id || '',
// encounterId: props.patientInfo.encounterId || '',
// patientId: props.patientInfo.patientId || '',
// recordTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
// },
// // 添加病历表单数据(包含红框内的所有字段)
// formData: formData,
// doctorName: userStore.nickName,
// };
// 获取诊断数据
let diagnosisList = [];
let diagnosisText = '';
if (props.patientInfo && props.patientInfo.encounterId) {
try {
const diagnosisRes = await getEncounterDiagnosis(props.patientInfo.encounterId);
diagnosisList = diagnosisRes.data || [];
// 格式化诊断文本,区分主诊断和其他诊断
diagnosisText = diagnosisList
.map((item) => {
const prefix = item.maindiseFlag === 1 ? '[主]' : '';
return `${prefix}${item.name || ''}`;
})
.join('');
} catch (error) {
ElMessage.error('获取诊断数据失败');
}
}
// 获取当前模板名称
const templateName = currentSelectTemplate.value.name || '';
// 根据模板名称获取对应的打印模板
const selectedPrintTemplate = getPrintTemplateByTemplateName(templateName);
// 打印数据
const printData = {
// 模板信息
templateName: currentSelectTemplate.value.name || '住院病历',
@@ -355,21 +557,42 @@ const print = async () => {
department: props.patientInfo.department || '',
attendingDoctor: props.patientInfo.attendingDoctor || '',
// 诊断信息
diagnosisList: JSON.stringify(diagnosisList),
diagnosisText: diagnosisText,
// 病历信息
documentName: currentSelectTemplate.value.name || '住院病历',
documentId: currentSelectTemplate.value.id || '',
recordTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
printTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
//病历号
busNo: props.patientInfo.busNo || '',
//费用类型
contractName: props.patientInfo.contractName || '',
// 表单数据 - 需要将嵌套结构展开
...flattenObject(formData),
};
console.log('打印数据:', printData);
// 执行打印,使用根据模板类型选择的打印模板
await simplePrint(selectedPrintTemplate, printData);
// 调用打印记录接口
try {
await recordPrint(editForm.value.id);
// 刷新历史记录列表确保删除按钮状态根据最新的printCount值更新
historyRef.value?.queryList();
} catch (printLogError) {
ElMessage.error('保存打印记录失败');
// 打印记录失败不影响打印成功提示
}
// 执行打印
await simplePrint(PRINT_TEMPLATE.OUTPATIENT_MEDICAL_RECORD, printData);
ElMessage.success('打印成功');
} catch (error) {
console.error('打印失败:', error);
ElMessage.error('打印失败: ' + (error.message || '未知错误'));
}
};
@@ -403,44 +626,100 @@ const templateEditSubmitOk = () => {
historyRef.value?.queryList();
templateRef.value?.queryList();
};
// onBeforeMount(() => {});
// 刚进页面默认显示门诊病历
// 选择默认模板 - 获取门诊病历分类下的第一个模板
const selectDefaultTemplate = () => {
nextTick(() => {
// 查找门诊病历(1.0.0)节点
const findTemplate = (nodes) => {
if (!templateData.value || templateData.value.length === 0) {
console.log('模板数据为空,无法选择默认模板');
return;
}
// 查找门诊病历分类节点,然后获取其下的第一个模板
const findOutpatientRecordCategoryAndFirstTemplate = (nodes) => {
for (const node of nodes) {
// 检查是否是门诊病历分类节点
if (!node.document && node.name && node.name.includes('门诊病历')) {
// 这是一个分类节点,检查是否有子节点
if (node.children && node.children.length > 0) {
// 返回第一个有document属性的子节点即第一个模板
for (const child of node.children) {
if (child.document) {
return child;
}
}
}
}
// 递归查找子节点
if (node.children && node.children.length > 0) {
const found = findTemplate(node.children);
const found = findOutpatientRecordCategoryAndFirstTemplate(node.children);
if (found) {
return found;
}
}
// 根据ID查找门诊病历模板
if (node.document && node.document.id === '1963474077201162242') {
return node;
}
}
return null;
};
const defaultTemplate = findTemplate(templateData.value);
const defaultTemplate = findOutpatientRecordCategoryAndFirstTemplate(templateData.value);
if (defaultTemplate) {
// 模拟点击节点
const mockNode = {
isLeaf: true,
};
handleNodeClick(defaultTemplate, mockNode);
nextTick(() => {
templateTree.value?.setCurrentKey(defaultTemplate.id);
// 模拟点击节点
const mockNode = {
isLeaf: true,
};
handleNodeClick(defaultTemplate, mockNode);
// 直接加载最新病历数据不再使用额外的setTimeout延迟
// 因为handleNodeClick中已经有nextTick和setTimeout处理组件渲染
loadLatestMedicalRecord();
});
} else {
console.log('未找到门诊病历模板');
}
});
};
// 监听患者信息变化,实现联动显示
watch(
() => props.patientInfo,
(newPatientInfo) => {
// 当患者信息变化时,默认选中门诊病历模板并加载最新病历数据
if (newPatientInfo && newPatientInfo.patientId && Object.keys(newPatientInfo).length > 0) {
// 确保模板树已经加载
if (templateData.value && templateData.value.length > 0) {
// 优先尝试使用更精确的selectDefaultTemplate函数
selectDefaultTemplate();
} else {
// 重新加载模板树
queryTemplateTree().then(() => {
// 使用nextTick确保DOM更新移除setTimeout避免多次渲染
nextTick(() => {
selectDefaultTemplate();
});
});
}
}
},
{ deep: true, immediate: true }
);
onMounted(async () => {
console.log('hospitalizationEmr mounted', userStore);
await queryTemplateTree();
selectDefaultTemplate();
// 组件挂载完成后,如果已有患者信息,默认选中门诊病历模板
if (
props.patientInfo &&
props.patientInfo.patientId &&
Object.keys(props.patientInfo).length > 0
) {
// 使用nextTick确保模板树数据已更新
nextTick(() => {
selectDefaultTemplate();
});
}
});
defineExpose({ state });
// defineExpose({ state }); // state未使用
const disNode = () => {
leftShow.value = !leftShow.value;
@@ -554,12 +833,29 @@ const disNode_R = () => {
}
.operate-main {
height: calc(100vh - 150px);
flex: auto;
flex: 1;
min-height: 0; /* 允许flex子项高度收缩 */
display: flex;
flex-direction: column;
}
.operate-main .template-tree-scrollbar {
height: 100%;
flex: 1;
overflow-y: auto;
min-height: 0;
/* 确保滚动条样式正常 */
-ms-overflow-style: auto;
scrollbar-width: auto;
}
/* 确保动态加载的组件不会破坏布局 */
.operate-main .template-tree-scrollbar > .loading-container {
width: 100%;
min-height: 100%;
box-sizing: border-box;
}
/* 确保组件内部内容不会溢出 */
.operate-main .template-tree-scrollbar > * {
max-width: 100%;
box-sizing: border-box;
}
}
@@ -581,4 +877,10 @@ const disNode_R = () => {
transition-duration: 300ms;
}
}
/* 加载状态样式 */
.loading-container {
min-height: 400px;
position: relative;
}
</style>

View File

@@ -19,7 +19,7 @@
<span>{{ item.prescriptionNo }}</span>
</div>
<div style="text-align: center">
<h2>长春大学医院</h2>
<h2>长春市朝阳区中医院医院</h2>
</div>
<div style="text-align: center">
<h3>处方单</h3>

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