条形码打印提示

This commit is contained in:
Euni4U 2025-04-23 10:59:20 +08:00
parent 35ac5ca7ef
commit 8705e536f5
3 changed files with 245 additions and 123 deletions

View File

@ -31,6 +31,7 @@ export interface PatientVO {
shqx: string // 生化编号 shqx: string // 生化编号
isprint: number // 是否打印 isprint: number // 是否打印
printtime: Date // 打印时间 printtime: Date // 打印时间
barcodetime: Date // 条形码时间
chiefinspectorid: string // 总检医生ID chiefinspectorid: string // 总检医生ID
chiefinspector: string // 总检医生 chiefinspector: string // 总检医生
} }
@ -165,5 +166,11 @@ export const PatientApi = {
//更新患者补充信息 //更新患者补充信息
updatePatientSupplement: async (medicalSn: string,idCard: string) => { updatePatientSupplement: async (medicalSn: string,idCard: string) => {
return await request.get({ url: `/inspect/patient/updatePatientSupplement?medicalSn=` + medicalSn + `&idCard=` + idCard}) return await request.get({ url: `/inspect/patient/updatePatientSupplement?medicalSn=` + medicalSn + `&idCard=` + idCard})
},
//更新条形码打印时间
updateBarcodeTime: async (medicalSn: string, barcodetime: Date) => {
return await request.put({
url: `/inspect/patient/updateBarcodeTime?medicalSn=${medicalSn}&barcodetime=${barcodetime.toISOString()}`
})
} }
} }

View File

@ -347,8 +347,56 @@ const createPrint = async (medicalSn) => {
/** 打印条形码 */ /** 打印条形码 */
const handlePrintBarcode = async (row: PatientVO) => { const handlePrintBarcode = async (row: PatientVO) => {
try { try {
//
const patientInfo = await PatientApi.getPatientInfo(row.medicalSn)
console.log('患者信息:', patientInfo)
//
if(patientInfo.barcodetime){
//
const date = new Date(patientInfo.barcodetime)
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
const lastPrintTime = `${year}${month}${day}`
//
let reportPrintTime = ''
if (patientInfo.medicalDateTime && patientInfo.status == 1) {
const reportDate = new Date(patientInfo.medicalDateTime)
const reportYear = reportDate.getFullYear()
const reportMonth = String(reportDate.getMonth() + 1).padStart(2, '0')
const reportDay = String(reportDate.getDate()).padStart(2, '0')
reportPrintTime = `${reportYear}${reportMonth}${reportDay}`
}
try {
//
await ElMessageBox.alert(
`<div style="margin-bottom: 10px">该条形码已于 <span style="color: #f56c6c; font-weight: bold;">${lastPrintTime}</span> 打印。</div>` +
(reportPrintTime ? `<div>该患者报告于 <span style="color: #f56c6c; font-weight: bold;">${reportPrintTime}</span> 打印。</div>` : ''),
'提示',
{
confirmButtonText: '确定',
type: 'warning',
dangerouslyUseHTMLString: true
}
)
} catch (error) {
//
console.log('用户确认重新打印')
}
}
// //
const databarcodePrint = await PatientApi.GetbarcodeInfo(row.medicalSn) const databarcodePrint = await PatientApi.GetbarcodeInfo(row.medicalSn)
//
if (!databarcodePrint || !databarcodePrint.barcodes || databarcodePrint.barcodes.length === 0) {
message.warning('条形码不存在,无法打印')
return
}
// - // -
const baseData = { const baseData = {
patientName: databarcodePrint.name || row.pname, patientName: databarcodePrint.name || row.pname,
@ -449,6 +497,13 @@ const handlePrintBarcode = async (row: PatientVO) => {
// - // -
hiprintTemplate.print(batchPrintData, options, ext); hiprintTemplate.print(batchPrintData, options, ext);
//
await PatientApi.updateBarcodeTime(row.medicalSn, new Date())
//
await getList()
message.success('打印成功')
} catch (error: any) { } catch (error: any) {
console.error('打印条形码失败,详细错误:', error); console.error('打印条形码失败,详细错误:', error);
message.error(`打印条形码失败: ${error.message || '未知错误'}`); message.error(`打印条形码失败: ${error.message || '未知错误'}`);

View File

@ -3,10 +3,12 @@
<el-row> <el-row>
<el-form-item label="统计时间"> <el-form-item label="统计时间">
<el-radio-group v-model="radioType" @change="changeRadio"> <el-radio-group v-model="radioType" @change="changeRadio">
<el-radio v-for="item in radioSelector" :value="item.value" :key="item.value">{{item.label}}</el-radio> <el-radio v-for="item in radioSelector" :value="item.value" :key="item.value">{{
item.label
}}</el-radio>
</el-radio-group> </el-radio-group>
<el-date-picker <el-date-picker
style="margin-left: 10px;" style="margin-left: 10px"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
v-model="time" v-model="time"
type="daterange" type="daterange"
@ -18,26 +20,33 @@
size="big" size="big"
@change="changeDatePick" @change="changeDatePick"
/> />
<el-button type="primary" @click="getList" style="margin-left: 20px;"> <el-button type="primary" @click="getList" style="margin-left: 20px">
<Icon icon="ep:search" class="mr-5px" /> 查询 <Icon icon="ep:search" class="mr-5px" /> 查询
</el-button> </el-button>
<el-button type="primary" @click="printData" style="margin-left: 20px;"> <el-button type="primary" @click="printData" style="margin-left: 20px">
<Icon icon="ep:printer" class="mr-5px" /> 打印 <Icon icon="ep:printer" class="mr-5px" /> 打印
</el-button> </el-button>
<el-button type="primary" @click="exportExcel" style="margin-left: 20px;" <el-button
:loading="exportLoading"> type="primary"
<Icon icon="ep:search" class="mr-5px" /> 导出excel @click="exportExcel"
style="margin-left: 20px"
:loading="exportLoading"
>
<Icon icon="ep:download" class="mr-5px" /> 导出excel
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-row> </el-row>
</ContentWrap> </ContentWrap>
<ContentWrap> <ContentWrap>
<el-table <el-table
:data="data1" show-summary max-height="650" :data="data1"
show-summary
max-height="650"
default-expand-all default-expand-all
row-key="orgname" row-key="orgname"
:tree-props="{ children: 'children' }" :tree-props="{ children: 'children' }"
:default-sort="{ prop: 'sum', order: 'descending' }"> :default-sort="{ prop: 'sum', order: 'descending' }"
>
<el-table-column label="卫生院" align="left" prop="orgname" min-width="180" /> <el-table-column label="卫生院" align="left" prop="orgname" min-width="180" />
<el-table-column label="行政村" align="center" prop="districtname" min-width="160" /> <el-table-column label="行政村" align="center" prop="districtname" min-width="160" />
<el-table-column label="体检数" align="center"> <el-table-column label="体检数" align="center">
@ -53,27 +62,88 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import dayjs from 'dayjs'
import {StatisticsApi} from "@/api/inspect/statistics"; import { PatientApi } from '@/api/inspect/inspectpatient'
import dayjs from "dayjs"; import { formatDate } from '@/utils/formatTime'
import {PatientApi} from "@/api/inspect/inspectpatient"; import workload from './workload'
import {formatDate} from "@/utils/formatTime"; import { hiprint } from 'vue-plugin-hiprint'
import workload from './workload'; import { newHiprintPrintTemplate, preparePrintData } from './printHelper'
import { hiprint } from "vue-plugin-hiprint"; import download from '@/utils/download'
import { newHiprintPrintTemplate, preparePrintData } from './printHelper';
import download from "@/utils/download";
const message = useMessage() // const message = useMessage() //
const { t } = useI18n() // const { t } = useI18n() //
const loading = ref(true) // const loading = ref(true) //
const time = ref() // const time = ref() //
const data = ref([ const data = ref([
{orgname: '北京', districtname:'A村',oldmanflag:1 ,htnflag :2 ,diaflag:1, smiflag:1 ,pulflag:1 ,sum : 6}, {
{orgname: '北京', districtname:'B村',oldmanflag:2 ,htnflag :1 ,diaflag:1, smiflag:1 ,pulflag:1 ,sum :6}, orgname: '北京',
{orgname: '天津', districtname:'C村',oldmanflag:1 ,htnflag :4 ,diaflag:1, smiflag:1 ,pulflag:1 ,sum : 8}, districtname: 'A村',
{orgname: '天津', districtname:'D村',oldmanflag:3 ,htnflag :1 ,diaflag:1, smiflag:1 ,pulflag:1 ,sum :7}, oldmanflag: 1,
{orgname: '安徽', districtname:'E村',oldmanflag:4 ,htnflag :3 ,diaflag:1, smiflag:1 ,pulflag:1 ,sum: 10}, htnflag: 2,
{orgname: '安徽', districtname:'F村',oldmanflag:4 ,htnflag :3 ,diaflag:1, smiflag:1 ,pulflag:1 ,sum: 10}, diaflag: 1,
{orgname: '安徽', districtname:'G村',oldmanflag:4 ,htnflag :3 ,diaflag:1, smiflag:1 ,pulflag:1 ,sum: 10}, smiflag: 1,
pulflag: 1,
sum: 6
},
{
orgname: '北京',
districtname: 'B村',
oldmanflag: 2,
htnflag: 1,
diaflag: 1,
smiflag: 1,
pulflag: 1,
sum: 6
},
{
orgname: '天津',
districtname: 'C村',
oldmanflag: 1,
htnflag: 4,
diaflag: 1,
smiflag: 1,
pulflag: 1,
sum: 8
},
{
orgname: '天津',
districtname: 'D村',
oldmanflag: 3,
htnflag: 1,
diaflag: 1,
smiflag: 1,
pulflag: 1,
sum: 7
},
{
orgname: '安徽',
districtname: 'E村',
oldmanflag: 4,
htnflag: 3,
diaflag: 1,
smiflag: 1,
pulflag: 1,
sum: 10
},
{
orgname: '安徽',
districtname: 'F村',
oldmanflag: 4,
htnflag: 3,
diaflag: 1,
smiflag: 1,
pulflag: 1,
sum: 10
},
{
orgname: '安徽',
districtname: 'G村',
oldmanflag: 4,
htnflag: 3,
diaflag: 1,
smiflag: 1,
pulflag: 1,
sum: 10
}
]) // ]) //
/*const data1=ref([ /*const data1=ref([
{ {
@ -95,7 +165,7 @@ const data1 = ref([])
const radioSelector = ref([ const radioSelector = ref([
{ value: 2, label: '今天' }, { value: 2, label: '今天' },
{ value: 3, label: '最近一周' }, { value: 3, label: '最近一周' },
{value:4,label:'最近一个月'}, { value: 4, label: '最近一个月' }
]) ])
const radioType = ref(3) // const radioType = ref(3) //
const shortcuts = [ const shortcuts = [
@ -106,7 +176,7 @@ const shortcuts = [
const start = new Date() const start = new Date()
start.setDate(start.getDate() - 7) start.setDate(start.getDate() - 7)
return [start, end] return [start, end]
}, }
}, },
{ {
text: '最近一个月', text: '最近一个月',
@ -115,7 +185,7 @@ const shortcuts = [
const start = new Date() const start = new Date()
start.setMonth(start.getMonth() - 1) start.setMonth(start.getMonth() - 1)
return [start, end] return [start, end]
}, }
}, },
{ {
text: '今日', text: '今日',
@ -123,8 +193,8 @@ const shortcuts = [
const end = new Date() const end = new Date()
const start = new Date() const start = new Date()
return [start, end] return [start, end]
}, }
}, }
] ]
/** /**
* 改变单选框 * 改变单选框
@ -166,10 +236,7 @@ const getList = async ()=>{
data1.value = [] data1.value = []
const params = { const params = {
dates: [ dates: [dayjs(time.value[0]).format('YYYY-MM-DD'), dayjs(time.value[1]).format('YYYY-MM-DD')]
dayjs(time.value[0]).format('YYYY-MM-DD'),
dayjs(time.value[1]).format('YYYY-MM-DD')
]
} }
try { try {
let resp = await PatientApi.getData(params) let resp = await PatientApi.getData(params)
@ -186,7 +253,7 @@ const getList = async ()=>{
*/ */
const dataProcessing = (data) => { const dataProcessing = (data) => {
const result = data.reduce((acc, current) => { const result = data.reduce((acc, current) => {
const key = current.orgname; const key = current.orgname
// //
if (!acc[key]) { if (!acc[key]) {
acc[key] = { acc[key] = {
@ -198,26 +265,26 @@ const dataProcessing = (data) => {
pulflag: 0, pulflag: 0,
sum: 0, sum: 0,
children: [] children: []
}; }
} }
// //
acc[key].oldmanflag += current.oldmanflag; acc[key].oldmanflag += current.oldmanflag
acc[key].htnflag += current.htnflag; acc[key].htnflag += current.htnflag
acc[key].diaflag += current.diaflag; acc[key].diaflag += current.diaflag
acc[key].smiflag += current.smiflag; acc[key].smiflag += current.smiflag
acc[key].pulflag += current.pulflag; acc[key].pulflag += current.pulflag
acc[key].sum += current.sum; acc[key].sum += current.sum
// children orgname // children orgname
const child = { ...current }; const child = { ...current }
delete child.orgname; delete child.orgname
acc[key].children.push(child); acc[key].children.push(child)
acc[key].children.sort((a, b) => b.sum - a.sum); acc[key].children.sort((a, b) => b.sum - a.sum)
return acc; return acc
}, {}); }, {})
let value = Object.values(result) let value = Object.values(result)
value.sort((a, b) => b.sum - a.sum); value.sort((a, b) => b.sum - a.sum)
return value; return value
} }
const exportLoading = ref(false) // const exportLoading = ref(false) //
const exportExcel = async () => { const exportExcel = async () => {
@ -229,7 +296,6 @@ const exportExcel =async () => {
const data = await PatientApi.exportData({ dates: time.value }) const data = await PatientApi.exportData({ dates: time.value })
download.excel(data, '统计.xls') download.excel(data, '统计.xls')
} catch (e) { } catch (e) {
} finally { } finally {
exportLoading.value = false exportLoading.value = false
} }
@ -240,15 +306,12 @@ const exportExcel =async () => {
const printData = () => { const printData = () => {
try { try {
// //
const hiprintTemplate = newHiprintPrintTemplate("workload", { const hiprintTemplate = newHiprintPrintTemplate('workload', {
template: workload, template: workload,
settingContainer: "#workloadPrintElementOptionSetting", settingContainer: '#workloadPrintElementOptionSetting'
}); })
// //
const printData = preparePrintData(data1.value, time.value); const printData = preparePrintData(data1.value, time.value)
console.log('打印数据:', printData); //
// //
const options = { const options = {
leftOffset: 0, leftOffset: 0,
@ -267,21 +330,20 @@ const printData = () => {
printPanelIndex: 0, printPanelIndex: 0,
noRepeatPrint: false, noRepeatPrint: false,
disableHeaderRepeat: false disableHeaderRepeat: false
}; }
// //
const ext = { const ext = {
callback: () => { callback: () => {
console.log("打印窗口已打开"); console.log('打印窗口已打开')
// //
setTimeout(() => { setTimeout(() => {
const table = document.querySelector('.hiprint-printPanel table'); const table = document.querySelector('.hiprint-printPanel table')
if (table) { if (table) {
const ths = table.querySelectorAll('th'); const ths = table.querySelectorAll('th')
ths.forEach((th, index) => { ths.forEach((th, index) => {})
});
} }
}, 100); }, 100)
}, },
styleHandler: () => { styleHandler: () => {
return `<style> return `<style>
@ -322,16 +384,16 @@ const printData = () => {
display: none !important; display: none !important;
} }
} }
</style>`; </style>`
}, }
}; }
// //
hiprintTemplate.print(printData, options, ext); hiprintTemplate.print(printData, options, ext)
console.log('打印成功'); console.log('打印成功')
} catch (error) { } catch (error) {
console.error('打印失败:', error); console.error('打印失败:', error)
} }
} }
onMounted(() => { onMounted(() => {
@ -340,6 +402,4 @@ onMounted(()=>{
}) })
</script> </script>
<style scoped> <style scoped></style>
</style>