2025-08-22 19:48:04 +08:00
|
|
|
|
<template>
|
|
|
|
|
|
<div class="app-container ">
|
|
|
|
|
|
<div ref="compactForm">
|
|
|
|
|
|
<el-row :gutter="10" class="compact-form" v-show="showSearch">
|
2025-10-31 09:50:50 +08:00
|
|
|
|
<el-form :model="queryParams" ref="queryRef" :inline="true" :size="aotuSize" :rules="queryRules">
|
2025-08-22 19:48:04 +08:00
|
|
|
|
<el-form-item label="日期:" prop="failed1">
|
2025-08-29 17:40:32 +08:00
|
|
|
|
<el-date-picker v-model="queryParams.times" type="datetimerange" range-separator="-"
|
2025-08-28 17:47:20 +08:00
|
|
|
|
start-placeholder="开始时间" end-placeholder="结束时间" format="YYYY-MM-DD HH:mm:ss"
|
2025-10-31 09:50:50 +08:00
|
|
|
|
value-format="YYYY-MM-DD HH:mm:ss" @change="handletime" style="width: 25rem;" />
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
2025-11-13 18:32:03 +08:00
|
|
|
|
<!-- <el-form-item label="医疗机构:" prop="yljg">
|
2025-10-31 09:50:50 +08:00
|
|
|
|
<el-select v-model="queryParams.yljg" placeholder="请选择" style="width: 9.37rem;">
|
2025-08-28 17:47:20 +08:00
|
|
|
|
<el-option v-for="item in dictData.HOS" :key="item.value" :label="item.label" :value="item.value" />
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-select>
|
2025-11-13 18:32:03 +08:00
|
|
|
|
</el-form-item> -->
|
2025-08-28 17:47:20 +08:00
|
|
|
|
<el-form-item label="条码状态:" prop="zt">
|
2025-11-17 18:04:00 +08:00
|
|
|
|
<el-select v-model="queryParams.zt" placeholder="请选择" style="width: 8rem;">
|
2025-08-28 17:47:20 +08:00
|
|
|
|
<el-option v-for="item in dictData.ST" :key="item.value" :label="item.label" :value="item.value" />
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-select>
|
|
|
|
|
|
</el-form-item>
|
2025-11-17 18:04:00 +08:00
|
|
|
|
<el-form-item label="" prop="queryType">
|
|
|
|
|
|
<el-select v-model="queryParams.queryType" placeholder="请选择" style="width:10rem">
|
2025-08-22 19:48:04 +08:00
|
|
|
|
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
|
|
|
</el-select>
|
|
|
|
|
|
</el-form-item>
|
2025-11-17 18:04:00 +08:00
|
|
|
|
<el-form-item label="" prop="queryValue">
|
2025-11-18 18:12:34 +08:00
|
|
|
|
<el-input v-model="queryParams.queryValue" clearable placeholder="条件搜索" @keyup.enter="handleQuery" />
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
|
|
|
|
<el-form-item label="">
|
2025-10-31 09:50:50 +08:00
|
|
|
|
<el-button icon="search" type="primary" @click="handleQuery" :size="aotuSize"> 搜索 </el-button>
|
|
|
|
|
|
<el-button icon="Refresh" @click="resetQuery" :size="aotuSize">重置</el-button>
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-form-item>
|
|
|
|
|
|
</el-form>
|
|
|
|
|
|
</el-row>
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<el-row :gutter="10">
|
|
|
|
|
|
<el-col :span="16" class="right-table">
|
|
|
|
|
|
<el-row :gutter="10" class="mb8">
|
|
|
|
|
|
<el-col :span="1.5">
|
2025-10-31 09:50:50 +08:00
|
|
|
|
<el-button type="primary" :size="aotuSize" plain icon="Plus" @click="printHandle">生成条码</el-button>
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="1.5">
|
2025-10-31 09:50:50 +08:00
|
|
|
|
<el-button type="danger" :size="aotuSize" plain icon="Edit" @click="selectStatusRows">选中所有未打印</el-button>
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="1.5">
|
2025-10-31 09:50:50 +08:00
|
|
|
|
<el-button type="success" :size="aotuSize" plain @click="printPdf">打印</el-button>
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="1.5">
|
2025-10-31 09:50:50 +08:00
|
|
|
|
<el-button type="info" :size="aotuSize" plain icon="Upload" @click="openBlock('采样登记')">采样登记</el-button>
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="1.5">
|
2025-10-31 09:50:50 +08:00
|
|
|
|
<el-button type="warning" :size="aotuSize" plain @click="openBlock('送检登记')">送检登记</el-button>
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="1.5">
|
2025-10-31 09:50:50 +08:00
|
|
|
|
<el-button type="warning" :size="aotuSize" plain @click="goReport">报告查询</el-button>
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="1.5">
|
2025-10-31 09:50:50 +08:00
|
|
|
|
<el-button type="warning" :size="aotuSize" plain @click="cancelHandle">条码作废</el-button>
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="1.5">
|
2025-10-31 09:50:50 +08:00
|
|
|
|
<el-button type="warning" :size="aotuSize" plain>打印机设置</el-button>
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="1.5">
|
2025-10-31 09:50:50 +08:00
|
|
|
|
<el-button type="warning" :size="aotuSize" plain>清单打印</el-button>
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-col>
|
2025-10-22 17:36:25 +08:00
|
|
|
|
<!-- <right-toolbar v-model:showSearch="showSearch" @updateColumns="updateColumns" @queryTable="handleQuery"
|
|
|
|
|
|
:columns="columns"></right-toolbar> -->
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-row>
|
|
|
|
|
|
|
2025-11-18 18:12:34 +08:00
|
|
|
|
<VxeTable :table-data="tableData" :loading="loading" :columns="columns"
|
|
|
|
|
|
:row-config="{ isHover: true, keyField: 'ybh' }" @current-change="rowHandle" size="small"
|
|
|
|
|
|
:row-style="rowClassNameHd" :cell-style="cellStyleHd" class="mytable-style" ref="tableRef"
|
|
|
|
|
|
@selection-change="selectionChange" :config="tableConfig" :enable-column-drag="true"
|
2025-09-29 17:30:02 +08:00
|
|
|
|
@column-drag-end="handleColumnDragEnd">
|
2025-09-12 11:06:51 +08:00
|
|
|
|
<template #dy="{ row }">
|
2025-10-21 09:55:56 +08:00
|
|
|
|
<svg-icon v-if="row.zt != 1" icon-class="lvgou" />
|
2025-09-12 11:06:51 +08:00
|
|
|
|
</template>
|
2025-08-28 17:47:20 +08:00
|
|
|
|
<template #jzbz="{ row }">
|
2025-10-24 15:23:13 +08:00
|
|
|
|
{{ row.jzbz == '1' ? '急' : '' }}
|
2025-08-28 17:47:20 +08:00
|
|
|
|
</template>
|
|
|
|
|
|
<template #jjzt="{ row }">
|
|
|
|
|
|
{{ row.jjzt == '1' ? '计价' : '无' }}
|
|
|
|
|
|
</template>
|
|
|
|
|
|
<template #brly="{ row }">
|
|
|
|
|
|
{{ formatDict(row.brly, 'PT') }}
|
|
|
|
|
|
</template>
|
|
|
|
|
|
<template #zt="{ row }">
|
2025-08-29 17:40:32 +08:00
|
|
|
|
{{ formatDict(row.zt.trim(), 'ST') }}
|
2025-08-28 17:47:20 +08:00
|
|
|
|
</template>
|
|
|
|
|
|
<template #yljg="{ row }">
|
|
|
|
|
|
{{ formatDict(row.yljg, 'HOS') }}
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</template>
|
2025-11-18 18:12:34 +08:00
|
|
|
|
</VxeTable>
|
2025-08-22 19:48:04 +08:00
|
|
|
|
|
|
|
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="8" class="right-table">
|
2025-11-17 18:04:00 +08:00
|
|
|
|
<div class="mb8" style="height:2rem"> </div>
|
|
|
|
|
|
<!-- <el-button type="primary" plain class="mb8" :size="aotuSize">拆分选中项目</el-button> -->
|
2025-08-28 17:47:20 +08:00
|
|
|
|
<CustomTable :data="rightTableData" :columns="rightColumns" :config="rightTableConfig">
|
|
|
|
|
|
<template #jjzt="{ row }">
|
|
|
|
|
|
{{ row.jjzt == '1' ? '计价' : '无' }}
|
|
|
|
|
|
</template>
|
|
|
|
|
|
<template #zt="{ row }">
|
|
|
|
|
|
{{ formatDict(row.zt, 'ST') }}
|
|
|
|
|
|
</template>
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</CustomTable>
|
|
|
|
|
|
</el-col>
|
|
|
|
|
|
</el-row>
|
|
|
|
|
|
|
2025-10-22 17:36:25 +08:00
|
|
|
|
<!-- 样本流程 -->
|
|
|
|
|
|
<div class="time-line-box">
|
|
|
|
|
|
<div v-for="(item, i) in timelineItems" :key="i" class="time-line-item">
|
2025-11-11 18:17:47 +08:00
|
|
|
|
<div v-if="i != 0" class="timeline-connector">
|
2025-10-22 17:36:25 +08:00
|
|
|
|
<img class="timg" src="@/assets/images/yjt.png" alt="">
|
|
|
|
|
|
</div>
|
2025-11-11 18:17:47 +08:00
|
|
|
|
<div :class="['timeline-content', i > lastTimeIndex ? 'no_active' : '']">
|
2025-10-22 17:36:25 +08:00
|
|
|
|
<div :class="['index', lastTimeIndex == i ? 'active' : '']">{{ i + 1 }}</div>
|
|
|
|
|
|
<div class="timeline-title">{{ item.title }}</div>
|
|
|
|
|
|
<div class="timeline-time">{{ item.time }}</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2025-08-22 19:48:04 +08:00
|
|
|
|
|
|
|
|
|
|
<!-- 采样登记 -->
|
2025-08-29 17:40:32 +08:00
|
|
|
|
<el-dialog v-model="dialogVisible" :title="title" draggable :close-on-click-modal="false" width="70vw"
|
|
|
|
|
|
@close="closeDialog">
|
2025-08-22 19:48:04 +08:00
|
|
|
|
<div class="flex-between">
|
|
|
|
|
|
<el-row :gutter="10" class="mb8">
|
|
|
|
|
|
<el-col :span="1.5">
|
2025-08-29 17:40:32 +08:00
|
|
|
|
<el-input v-model="sqhText" clearable placeholder="条形码" @keyup.enter="sqdQuery" @clear="sqdQuery" />
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="1.5">
|
2025-08-29 17:40:32 +08:00
|
|
|
|
<el-button type="primary" @click="sqdQuery" plain>读取</el-button>
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="1.5">
|
|
|
|
|
|
<el-button type="danger" plain icon="delete">删除选中行</el-button>
|
|
|
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="1.5">
|
|
|
|
|
|
<el-button type="info" plain>打印</el-button>
|
|
|
|
|
|
</el-col>
|
|
|
|
|
|
</el-row>
|
2025-08-29 17:40:32 +08:00
|
|
|
|
<!-- <el-button type="primary" plain>保存</el-button> -->
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</div>
|
2025-08-29 17:40:32 +08:00
|
|
|
|
<CustomTable :data="cyTableData" :columns="cyColumns" :config="cyTableConfig">
|
|
|
|
|
|
<template #zt="{ row }">
|
|
|
|
|
|
{{ formatDict(row.zt, 'ST') }}
|
|
|
|
|
|
</template>
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</CustomTable>
|
|
|
|
|
|
</el-dialog>
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
2025-08-28 17:47:20 +08:00
|
|
|
|
import { ref, reactive, toRaw, computed, watch, nextTick, onMounted, } from 'vue';
|
|
|
|
|
|
import { HiprintPrinter } from '@/utils/hiprintPrinter';
|
|
|
|
|
|
import { classCom } from '@/utils/classCom';
|
2025-10-10 17:35:28 +08:00
|
|
|
|
import CustomTable from '@/components/elTable/index.vue'
|
2025-11-18 18:12:34 +08:00
|
|
|
|
import VxeTable from '@/components/vxeTable/index.vue'
|
2025-11-17 18:04:00 +08:00
|
|
|
|
import { useRouter, useRoute } from 'vue-router'
|
2025-08-28 17:47:20 +08:00
|
|
|
|
import { usePrintStore } from '@/store/modules/printStore'
|
2025-08-29 17:40:32 +08:00
|
|
|
|
import { fetchCodeList, addObj, fetchCodeDetail, fetchCodeExec, fetchCodeReqmain } from '@/api/checkCode/index'
|
2025-10-31 09:50:50 +08:00
|
|
|
|
const aotuSize = classCom.useAutoSize();
|
2025-08-28 17:47:20 +08:00
|
|
|
|
//@ts-ignore
|
2025-11-14 18:13:45 +08:00
|
|
|
|
import useUserStore from '@/store/modules/user'
|
|
|
|
|
|
//@ts-ignore
|
2025-08-28 17:47:20 +08:00
|
|
|
|
import { comDict } from '@/utils/dict'
|
2025-08-26 17:31:31 +08:00
|
|
|
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
2025-11-17 18:04:00 +08:00
|
|
|
|
import dayjs from 'dayjs';
|
2025-08-22 19:48:04 +08:00
|
|
|
|
const router = useRouter()
|
2025-11-17 18:04:00 +08:00
|
|
|
|
const route = useRoute()
|
2025-11-14 18:13:45 +08:00
|
|
|
|
const userStore = useUserStore()
|
2025-08-26 17:31:31 +08:00
|
|
|
|
const printStore = usePrintStore();
|
2025-08-22 19:48:04 +08:00
|
|
|
|
const compactForm = ref<HTMLElement | null>(null);
|
|
|
|
|
|
const heightForm = ref(90);
|
|
|
|
|
|
const dialogVisible = ref(false)
|
2025-08-29 17:40:32 +08:00
|
|
|
|
const title = ref('采样登记')
|
|
|
|
|
|
const sqhText = ref('')
|
2025-09-01 17:48:41 +08:00
|
|
|
|
const tableRef = ref()
|
2025-08-29 17:40:32 +08:00
|
|
|
|
interface QueryParams {
|
|
|
|
|
|
times: string[]; // 明确类型为字符串元组
|
|
|
|
|
|
yljg: string;
|
|
|
|
|
|
zt: string;
|
2025-11-17 18:04:00 +08:00
|
|
|
|
queryType: string;
|
|
|
|
|
|
queryValue: string;
|
|
|
|
|
|
ksdh: string;
|
|
|
|
|
|
userid: string;
|
2025-08-22 19:48:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
// 提交表单数据
|
2025-08-29 17:40:32 +08:00
|
|
|
|
const queryParams = reactive<QueryParams>({
|
|
|
|
|
|
times: ['2025-07-18 00:00:00', '2025-07-18 23:59:59'],
|
|
|
|
|
|
// times: [],
|
2025-08-28 17:47:20 +08:00
|
|
|
|
yljg: '1',
|
|
|
|
|
|
zt: '',
|
2025-11-17 18:04:00 +08:00
|
|
|
|
queryType: '',
|
|
|
|
|
|
queryValue: '',
|
|
|
|
|
|
ksdh: '',
|
|
|
|
|
|
userid: ''
|
2025-08-22 19:48:04 +08:00
|
|
|
|
});
|
|
|
|
|
|
const showSearch = ref(true);
|
|
|
|
|
|
const queryRef = ref()
|
|
|
|
|
|
// 定义校验规则
|
|
|
|
|
|
const queryRules = ref({
|
|
|
|
|
|
// clientId: [
|
|
|
|
|
|
// { required: true, message: '编号不能为空', trigger: 'blur' },
|
|
|
|
|
|
|
|
|
|
|
|
// ],
|
|
|
|
|
|
|
|
|
|
|
|
// failed3: [
|
|
|
|
|
|
// { required: true, message: '条码状态不能为空', trigger: 'change' },
|
|
|
|
|
|
// ],
|
|
|
|
|
|
})
|
|
|
|
|
|
const options = [
|
|
|
|
|
|
{
|
2025-11-17 18:04:00 +08:00
|
|
|
|
value: 'brxm',
|
2025-08-29 17:40:32 +08:00
|
|
|
|
label: '通过姓名搜索',
|
2025-08-22 19:48:04 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
2025-11-17 18:04:00 +08:00
|
|
|
|
value: 'brdh',
|
2025-08-29 17:40:32 +08:00
|
|
|
|
label: '通过病人号搜索',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
2025-11-17 18:04:00 +08:00
|
|
|
|
value: 'ch',
|
2025-08-29 17:40:32 +08:00
|
|
|
|
label: '通过床号搜索',
|
2025-08-22 19:48:04 +08:00
|
|
|
|
},
|
|
|
|
|
|
]
|
2025-08-28 17:47:20 +08:00
|
|
|
|
interface DictData {
|
|
|
|
|
|
SX?: Array<any>;
|
|
|
|
|
|
HOS?: Array<any>;
|
|
|
|
|
|
[key: string]: any[] | undefined; // 添加索引签名以支持动态访问
|
|
|
|
|
|
}
|
|
|
|
|
|
// 字典数据存储
|
|
|
|
|
|
const dictData = ref<DictData>({});
|
2025-08-22 19:48:04 +08:00
|
|
|
|
const handleQuery = async () => {
|
|
|
|
|
|
const valid = await queryRef.value.validate().catch(() => { });
|
|
|
|
|
|
if (!valid) return false;
|
2025-08-28 17:47:20 +08:00
|
|
|
|
getList()
|
2025-08-22 19:48:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
// 重置
|
|
|
|
|
|
const resetQuery = () => {
|
|
|
|
|
|
queryRef.value?.resetFields();
|
2025-11-17 18:04:00 +08:00
|
|
|
|
queryParams.zt = ''
|
|
|
|
|
|
queryParams.queryType = ''
|
|
|
|
|
|
queryParams.queryValue = ''
|
2025-08-28 17:47:20 +08:00
|
|
|
|
getList()
|
2025-08-22 19:48:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-17 18:04:00 +08:00
|
|
|
|
const loading = ref(false);
|
2025-08-22 19:48:04 +08:00
|
|
|
|
|
|
|
|
|
|
// 数据源
|
2025-08-28 17:47:20 +08:00
|
|
|
|
const tableData = ref([])
|
2025-08-22 19:48:04 +08:00
|
|
|
|
// 配置项
|
|
|
|
|
|
const columns = ref([
|
2025-11-18 18:12:34 +08:00
|
|
|
|
{ type: 'selection', field: '', title: '', resizable: true, align: 'center', width: 40 },
|
|
|
|
|
|
{ field: 'zt', title: '打印', resizable: true, align: 'center', slotName: 'dy', width: 40 },
|
|
|
|
|
|
{ field: 'jzbz', title: '急', align: 'center', resizable: true, slotName: 'jzbz', width: 30 },
|
|
|
|
|
|
{ field: 'ch', title: '床号', resizable: true, align: 'center', width: 40 },//sortable: true,
|
|
|
|
|
|
{ field: 'brxm', title: '姓名', align: 'center', resizable: true, width: 50 },
|
|
|
|
|
|
{ field: 'brxbname', title: '性别', align: 'center', resizable: true, width: 30 },
|
|
|
|
|
|
{ field: 'jymd', title: '项目名称', resizable: true, width: 130 },
|
|
|
|
|
|
{ field: 'bgddhname', title: '类别', align: 'center', resizable: true, width: 80 },
|
|
|
|
|
|
{ field: 'sampletips', title: '采样提示', align: 'center', resizable: true, width: 60 },
|
|
|
|
|
|
{ field: 'yblx', title: '样本类型', align: 'center', resizable: true, width: 60 },
|
|
|
|
|
|
{ field: 'brdh', title: '病人号', align: 'center', resizable: true, width: 90 },
|
|
|
|
|
|
{ field: 'ksname', title: '科室名称', align: 'center', resizable: true, width: 100 },
|
|
|
|
|
|
{ field: 'sqh', title: '申请号/条码', align: 'center', resizable: true, width: 100 },
|
|
|
|
|
|
{ field: 'zt', title: '状态', align: 'center', resizable: true, slotName: 'zt', width: 40 },
|
|
|
|
|
|
{ field: 'brly', title: '病人来源', align: 'center', resizable: true, slotName: 'brly', width: 60 },
|
|
|
|
|
|
{ field: 'sqysname', title: '申请医生', align: 'center', resizable: true, width: 60 },
|
|
|
|
|
|
{ field: 'sqsj', title: '申请时间', align: 'center', resizable: true, width: 150 },
|
|
|
|
|
|
{ field: 'jjzt', title: '计价标志', align: 'center', resizable: true, slotName: 'jjzt', width: 60 },
|
|
|
|
|
|
{ field: 'zxysname', title: '执行医生', align: 'center', resizable: true, width: 60 },
|
|
|
|
|
|
{ field: 'bbsjrname', title: '送检人', align: 'center', resizable: true, width: 50 },
|
|
|
|
|
|
{ field: 'yljg', title: '医疗机构', align: 'center', resizable: true, slotName: 'yljg', width: 150 },
|
2025-08-22 19:48:04 +08:00
|
|
|
|
])
|
|
|
|
|
|
|
2025-08-29 17:40:32 +08:00
|
|
|
|
const single = ref(true);
|
|
|
|
|
|
const multiple = ref(true);
|
|
|
|
|
|
const sqhs = ref([]);
|
2025-08-22 19:48:04 +08:00
|
|
|
|
// 单元格样式
|
|
|
|
|
|
const cellStyleHd = ({ row, column, rowIndex, columnIndex }: {
|
|
|
|
|
|
row: any;
|
|
|
|
|
|
column: any;
|
|
|
|
|
|
rowIndex: number;
|
|
|
|
|
|
columnIndex: number;
|
|
|
|
|
|
}) => {
|
|
|
|
|
|
// console.log(row, column, rowIndex, columnIndex);
|
2025-11-18 18:12:34 +08:00
|
|
|
|
if (column.title == "急" && row.jzbz == "1") {
|
2025-11-04 17:58:12 +08:00
|
|
|
|
return { color: '#f00' };
|
2025-08-22 19:48:04 +08:00
|
|
|
|
}
|
2025-08-28 17:47:20 +08:00
|
|
|
|
|
2025-11-18 18:12:34 +08:00
|
|
|
|
if (column.title == "类别") {
|
2025-08-28 17:47:20 +08:00
|
|
|
|
const bgColor = classCom.decimalToHexColor(row.bkcolor);
|
|
|
|
|
|
const textColor = classCom.getContrastTextColor(bgColor);
|
|
|
|
|
|
return {
|
|
|
|
|
|
backgroundColor: `${bgColor} !important`,
|
|
|
|
|
|
color: textColor,
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
2025-08-22 19:48:04 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
2025-08-28 17:47:20 +08:00
|
|
|
|
|
2025-08-22 19:48:04 +08:00
|
|
|
|
const rowClassNameHd = ({ row, rowIndex }: {
|
|
|
|
|
|
row: any;
|
|
|
|
|
|
rowIndex: number;
|
|
|
|
|
|
}) => {
|
|
|
|
|
|
return 'custom-row-class'; // 返回自定义类名
|
|
|
|
|
|
};
|
2025-10-22 17:36:25 +08:00
|
|
|
|
|
|
|
|
|
|
// 时间线数据
|
|
|
|
|
|
const timelineItems = ref(
|
|
|
|
|
|
[
|
|
|
|
|
|
{ title: '检验申请', time: '' },
|
|
|
|
|
|
{ title: '标本采集', time: '' },
|
|
|
|
|
|
{ title: '上机检验', time: '' },
|
|
|
|
|
|
{ title: '标本送检', time: '' },
|
|
|
|
|
|
// { title: '检验接收', time: '' },
|
|
|
|
|
|
{ title: '标本签收', time: '' },
|
|
|
|
|
|
{ title: '结果审核', time: '' },
|
|
|
|
|
|
]
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// 计算最后一个有时间的节点索引
|
|
|
|
|
|
const lastTimeIndex = computed(() => {
|
|
|
|
|
|
|
|
|
|
|
|
const lastIndex = timelineItems.value.findLastIndex(item => item.time);
|
|
|
|
|
|
if (lastIndex === -1) {
|
|
|
|
|
|
return -1
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return lastIndex;
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2025-11-17 18:04:00 +08:00
|
|
|
|
const Info: any = ref({})
|
2025-08-28 17:47:20 +08:00
|
|
|
|
// 点击行
|
2025-10-22 17:36:25 +08:00
|
|
|
|
const rowHandle = (row: any) => {
|
|
|
|
|
|
timelineItems.value =
|
|
|
|
|
|
[
|
|
|
|
|
|
{ title: '检验申请', time: row.sqsj },
|
|
|
|
|
|
{ title: '标本采集', time: row.cysj },
|
|
|
|
|
|
{ title: '上机检验', time: row.zxsj },
|
|
|
|
|
|
{ title: '标本送检', time: row.bbsjsj },
|
|
|
|
|
|
// { title: '检验接收', time: row.jssj},
|
|
|
|
|
|
{ title: '标本签收', time: row.jssj },
|
|
|
|
|
|
{ title: '结果审核', time: row.confirmtime },
|
|
|
|
|
|
]
|
2025-11-17 18:04:00 +08:00
|
|
|
|
Info.value = row
|
2025-08-28 17:47:20 +08:00
|
|
|
|
getRightTable(row)
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2025-08-29 17:40:32 +08:00
|
|
|
|
const selectionChange = (selection: any) => {
|
|
|
|
|
|
sqhs.value = selection;
|
|
|
|
|
|
single.value = selection.length != 1;
|
|
|
|
|
|
multiple.value = !selection.length;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-29 17:30:02 +08:00
|
|
|
|
const handleColumnDragEnd = (data: any) => {
|
2025-11-18 18:12:34 +08:00
|
|
|
|
// 先清空再赋值,强制触发重新渲染
|
|
|
|
|
|
columns.value = [];
|
|
|
|
|
|
// 使用nextTick确保DOM更新后再设置新值
|
|
|
|
|
|
nextTick(() => {
|
|
|
|
|
|
columns.value = [...data.columns];
|
|
|
|
|
|
});
|
2025-09-29 17:30:02 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
2025-08-28 17:47:20 +08:00
|
|
|
|
// 左侧表格配置
|
2025-08-22 19:48:04 +08:00
|
|
|
|
const tableConfig = ref({
|
2025-11-18 18:12:34 +08:00
|
|
|
|
height: '76.5vh', // 高度
|
|
|
|
|
|
// 复选框配置
|
|
|
|
|
|
checkboxConfig: {
|
|
|
|
|
|
// 可选配置项
|
|
|
|
|
|
checkField: 'checked', // 绑定数据中的字段(默认:checked)
|
|
|
|
|
|
range: false, // 是否支持范围选择(按住 Shift 连续选择)
|
|
|
|
|
|
disabled: false, // 是否禁用全部复选框
|
|
|
|
|
|
reserve: false, // 是否保留勾选状态(分页/筛选时)
|
|
|
|
|
|
highlight: false // 是否高亮选中行
|
|
|
|
|
|
}
|
2025-08-22 19:48:04 +08:00
|
|
|
|
})
|
2025-08-28 17:47:20 +08:00
|
|
|
|
// 右侧数据源
|
|
|
|
|
|
const rightTableData = ref([])
|
|
|
|
|
|
// 配置项
|
|
|
|
|
|
const rightColumns = ref([
|
2025-09-29 17:30:02 +08:00
|
|
|
|
{ prop: 'sqxmdh', label: '项目代号', visible: true, sortable: true, width: '110px' },
|
|
|
|
|
|
{ prop: 'sqxmmc', label: '项目名称', visible: true, width: '120px' },
|
|
|
|
|
|
{ prop: 'dj', label: '单价', align: 'center', visible: true, },
|
|
|
|
|
|
{ prop: 'sl', label: '数量', align: 'center', visible: true, },
|
|
|
|
|
|
{ prop: 'zt', label: '状态', align: 'center', visible: true, slot: 'zt', },
|
|
|
|
|
|
{ prop: 'jjzt', label: '计价标志', align: 'center', visible: true, slot: 'jjzt', },
|
2025-08-22 19:48:04 +08:00
|
|
|
|
|
2025-08-28 17:47:20 +08:00
|
|
|
|
])
|
|
|
|
|
|
// 表格配置
|
|
|
|
|
|
const rightTableConfig = ref({
|
|
|
|
|
|
// stripe: true, // 斑马纹
|
2025-10-22 17:36:25 +08:00
|
|
|
|
border: true, // 边框
|
2025-09-12 11:06:51 +08:00
|
|
|
|
height: '', // 高度
|
2025-08-28 17:47:20 +08:00
|
|
|
|
highlightCurrentRow: true, // 高亮当前行
|
|
|
|
|
|
})
|
2025-08-22 19:48:04 +08:00
|
|
|
|
|
2025-08-29 17:40:32 +08:00
|
|
|
|
// 采样数据源
|
|
|
|
|
|
const cyTableData = ref([])
|
|
|
|
|
|
// 配置项
|
|
|
|
|
|
const cyColumns = ref([
|
2025-09-29 17:30:02 +08:00
|
|
|
|
{ prop: 'sqh', label: '申请号/条形码', align: 'center', visible: true, sortable: true, width: 140 },
|
|
|
|
|
|
{ prop: 'ksdh', label: '科室病区', align: 'center', visible: true, width: 120 },
|
|
|
|
|
|
{ prop: 'ch', label: '床号', align: 'center', visible: true, sortable: true, },
|
|
|
|
|
|
{ prop: 'brxm', label: '姓名', align: 'center', visible: true, },
|
|
|
|
|
|
{ prop: 'brdh', label: '病人号', align: 'center', visible: true, },
|
|
|
|
|
|
{ prop: 'brxb', label: '性别', align: 'center', visible: true, },
|
|
|
|
|
|
{ prop: 'yblx', label: '样本类型', align: 'center', visible: true, },
|
|
|
|
|
|
{ prop: 'zt', label: '状态', align: 'center', visible: true, slot: 'zt', },
|
|
|
|
|
|
{ prop: 'jzbz', label: '急诊', align: 'center', visible: true, },
|
|
|
|
|
|
{ prop: 'jjzt', label: '采样人', align: 'center', visible: true, },
|
|
|
|
|
|
{ prop: 'cysj', label: '采样时间', align: 'center', visible: true, },
|
|
|
|
|
|
{ prop: 'zxysname', label: '执行医生', align: 'center', visible: true, },
|
|
|
|
|
|
{ prop: 'zxsj', label: '执行时间', align: 'center', visible: true, },
|
2025-08-29 17:40:32 +08:00
|
|
|
|
])
|
|
|
|
|
|
// 表格配置
|
|
|
|
|
|
const cyTableConfig = ref({
|
2025-10-22 17:36:25 +08:00
|
|
|
|
border: true, // 边框
|
2025-08-29 17:40:32 +08:00
|
|
|
|
height: '100%', // 高度
|
|
|
|
|
|
highlightCurrentRow: true, // 高亮当前行
|
|
|
|
|
|
})
|
|
|
|
|
|
|
2025-10-22 17:36:25 +08:00
|
|
|
|
|
|
|
|
|
|
|
2025-08-29 17:40:32 +08:00
|
|
|
|
// 采样登记
|
2025-09-16 17:23:13 +08:00
|
|
|
|
const openBlock = (value: string) => {
|
2025-11-18 18:12:34 +08:00
|
|
|
|
const selections = tableRef.value.allSelection()
|
|
|
|
|
|
if (selections.length > 0) {
|
2025-09-16 17:23:13 +08:00
|
|
|
|
ElMessageBox.confirm(`确定操作选中的数据吗?`, "提示", {
|
|
|
|
|
|
confirmButtonText: "确认",
|
|
|
|
|
|
cancelButtonText: "取消",
|
|
|
|
|
|
beforeClose: async (action, instance, done) => {
|
|
|
|
|
|
if (action === "confirm") {
|
|
|
|
|
|
// 生成请求Promise数组
|
2025-11-18 18:12:34 +08:00
|
|
|
|
const requests = selections.map((item: any) => { return item.sqh });
|
2025-09-16 17:23:13 +08:00
|
|
|
|
fetchCodeExec({
|
|
|
|
|
|
sqh: requests.join(','),
|
2025-11-17 18:04:00 +08:00
|
|
|
|
userid: queryParams.userid,
|
2025-09-16 17:23:13 +08:00
|
|
|
|
status: value == '采样登记' ? 12 : 13,
|
2025-11-17 18:04:00 +08:00
|
|
|
|
yljg: queryParams.yljg
|
2025-09-16 17:23:13 +08:00
|
|
|
|
}).then((res: any) => {
|
|
|
|
|
|
if (res.code == 0) {
|
|
|
|
|
|
ElMessage.success('调用成功');
|
|
|
|
|
|
done();
|
|
|
|
|
|
getList()
|
|
|
|
|
|
} else {
|
|
|
|
|
|
ElMessage.error('调用失败');
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
} else {
|
|
|
|
|
|
done();
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
}).catch(() => { });
|
2025-08-29 17:40:32 +08:00
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
title.value = value
|
|
|
|
|
|
dialogVisible.value = true
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 采样读取
|
|
|
|
|
|
const sqdQuery = () => {
|
|
|
|
|
|
const index = cyTableData.value.findIndex((item: any) => item.sqh == sqhText.value)
|
|
|
|
|
|
if (index !== -1) return ElMessage.warning('该申请单数据已存在!')
|
|
|
|
|
|
|
|
|
|
|
|
fetchCodeReqmain({ sqh: sqhText.value }).then((res: any) => {
|
|
|
|
|
|
if (res.code == 0 && res.data.sqh) {
|
|
|
|
|
|
fetchCodeExec({
|
|
|
|
|
|
sqh: res.data.sqh,
|
2025-11-17 18:04:00 +08:00
|
|
|
|
userid: queryParams.userid,
|
2025-08-29 17:40:32 +08:00
|
|
|
|
status: 12,
|
2025-11-17 18:04:00 +08:00
|
|
|
|
yljg: queryParams.yljg
|
2025-08-29 17:40:32 +08:00
|
|
|
|
})
|
|
|
|
|
|
cyTableData.value = cyTableData.value.concat(res.data)
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
// 关闭弹窗清空
|
|
|
|
|
|
const closeDialog = () => {
|
|
|
|
|
|
cyTableData.value = []
|
|
|
|
|
|
sqhText.value = ''
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-22 19:48:04 +08:00
|
|
|
|
interface ColumnItem {
|
|
|
|
|
|
prop: string;
|
|
|
|
|
|
label: string;
|
|
|
|
|
|
visible: boolean;
|
|
|
|
|
|
key: number;
|
|
|
|
|
|
align: string;
|
|
|
|
|
|
slot: string;
|
|
|
|
|
|
width: string;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 更新列
|
2025-10-24 15:23:13 +08:00
|
|
|
|
// const updateColumns = (arr: Array<ColumnItem>) => {
|
|
|
|
|
|
// columns.value = arr
|
|
|
|
|
|
// };
|
2025-08-22 19:48:04 +08:00
|
|
|
|
|
2025-08-28 17:47:20 +08:00
|
|
|
|
const getRightTable = (row: any) => {
|
|
|
|
|
|
fetchCodeDetail({ sqh: row.sqh }).then((res: any) => {
|
|
|
|
|
|
if (res.code == 0) {
|
|
|
|
|
|
rightTableData.value = res.data
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2025-08-22 19:48:04 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const goReport = () => {
|
|
|
|
|
|
// 跳转到报告查询页面
|
2025-11-17 18:04:00 +08:00
|
|
|
|
router.push(`/report?yljg=${Info.value.yljg ? Info.value.yljg : queryParams.yljg}&deptcode=${Info.value.ksdh ? Info.value.ksdh : queryParams.ksdh}&userid=${queryParams.userid}&brdh=${Info.value.brdh ? Info.value.brdh : ''}`)
|
|
|
|
|
|
// router.push('/report?startdate=2025-08-19&endate=2025-08-19&deptcode=0210&userid=00910&brdh=')
|
|
|
|
|
|
|
2025-08-22 19:48:04 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
2025-09-16 17:23:13 +08:00
|
|
|
|
const cancelHandle = () => {
|
2025-11-18 18:12:34 +08:00
|
|
|
|
const selections = tableRef.value.allSelection()
|
|
|
|
|
|
if (selections.length <= 0) return ElMessage.warning('请选择数据!')
|
2025-09-16 17:23:13 +08:00
|
|
|
|
ElMessageBox.confirm(`确定作废选中的数据吗?`, "提示", {
|
|
|
|
|
|
confirmButtonText: "确认",
|
|
|
|
|
|
cancelButtonText: "取消",
|
|
|
|
|
|
beforeClose: async (action, instance, done) => {
|
|
|
|
|
|
if (action === "confirm") {
|
2025-11-18 18:12:34 +08:00
|
|
|
|
const requests = selections.map((item: any) => { return item.sqh });
|
2025-09-16 17:23:13 +08:00
|
|
|
|
fetchCodeExec({
|
|
|
|
|
|
sqh: requests.join(','),
|
2025-11-17 18:04:00 +08:00
|
|
|
|
userid: queryParams.userid,
|
2025-09-16 17:23:13 +08:00
|
|
|
|
status: 9,
|
2025-11-17 18:04:00 +08:00
|
|
|
|
yljg: queryParams.yljg
|
2025-09-16 17:23:13 +08:00
|
|
|
|
}).then((res: any) => {
|
|
|
|
|
|
if (res.code == 0) {
|
|
|
|
|
|
ElMessage.success('调用成功');
|
|
|
|
|
|
done();
|
|
|
|
|
|
getList()
|
|
|
|
|
|
} else {
|
|
|
|
|
|
ElMessage.error('调用失败');
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
} else {
|
|
|
|
|
|
done();
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
}).catch(() => { });
|
|
|
|
|
|
|
2025-11-17 18:04:00 +08:00
|
|
|
|
}
|
2025-09-16 17:23:13 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-28 17:47:20 +08:00
|
|
|
|
onMounted(async () => {
|
2025-11-18 18:12:34 +08:00
|
|
|
|
// 获取当前日期(当天)
|
|
|
|
|
|
const today = dayjs();
|
|
|
|
|
|
|
|
|
|
|
|
// 计算前6天的日期(当天 + 前6天 = 7天)
|
|
|
|
|
|
const startOfWeek = today.subtract(6, 'day');
|
|
|
|
|
|
|
|
|
|
|
|
const startDate = route.query.startdate ? String(route.query.startdate) : startOfWeek.format('YYYY-MM-DD HH:mm:ss');
|
|
|
|
|
|
const endDate = route.query.endate ? String(route.query.endate) : today.format('YYYY-MM-DD HH:mm:ss');
|
|
|
|
|
|
|
|
|
|
|
|
queryParams.times = [startDate, endDate];
|
|
|
|
|
|
queryParams.ksdh = (route.query.deptcode as string) ? (route.query.deptcode as string) : '';
|
|
|
|
|
|
queryParams.userid = (route.query.userid as string) ? (route.query.userid as string) : '';
|
|
|
|
|
|
queryParams.yljg = (route.query.yljg as string) ? (route.query.yljg as string) : '1';
|
2025-11-14 18:13:45 +08:00
|
|
|
|
// 进入页面单点登录
|
2025-11-18 18:12:34 +08:00
|
|
|
|
const result = await userStore.loginAnonymous({ name: 'admin', yljg: queryParams.yljg })
|
2025-11-14 18:13:45 +08:00
|
|
|
|
if (result) {
|
|
|
|
|
|
getList()
|
|
|
|
|
|
}
|
2025-11-17 18:04:00 +08:00
|
|
|
|
|
2025-11-14 18:13:45 +08:00
|
|
|
|
|
2025-08-29 17:40:32 +08:00
|
|
|
|
adjustTableHeight();
|
2025-08-28 17:47:20 +08:00
|
|
|
|
// 加载病人来源字典
|
|
|
|
|
|
const dictRefs = await comDict('PT', 'HOS', 'ST');
|
|
|
|
|
|
|
|
|
|
|
|
// 从 ref 中获取实际数据
|
|
|
|
|
|
dictData.value = {
|
|
|
|
|
|
PT: toRaw(dictRefs.PT.value) || [],
|
|
|
|
|
|
HOS: toRaw(dictRefs.HOS.value) || [],
|
|
|
|
|
|
ST: toRaw(dictRefs.ST.value) || [],
|
|
|
|
|
|
};
|
2025-08-22 19:48:04 +08:00
|
|
|
|
});
|
|
|
|
|
|
|
2025-08-28 17:47:20 +08:00
|
|
|
|
// 字典格式化方法
|
|
|
|
|
|
const formatDict = (v: string, dictType: string) => {
|
2025-10-28 17:22:53 +08:00
|
|
|
|
return dictData.value[dictType]?.find((item: any) => item.value == v)?.label || v;
|
2025-08-28 17:47:20 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
2025-08-22 19:48:04 +08:00
|
|
|
|
// 计算table高度
|
|
|
|
|
|
watch(showSearch, () => {
|
|
|
|
|
|
nextTick(() => {
|
|
|
|
|
|
adjustTableHeight();
|
|
|
|
|
|
})
|
|
|
|
|
|
}, { immediate: true });
|
|
|
|
|
|
|
|
|
|
|
|
function adjustTableHeight() {
|
|
|
|
|
|
if (compactForm.value) {
|
|
|
|
|
|
// 获取高度
|
|
|
|
|
|
heightForm.value = compactForm.value.offsetHeight;
|
2025-11-14 18:13:45 +08:00
|
|
|
|
tableConfig.value.height = `calc(80vh - ${heightForm.value}px)`; // 设置表格容器的高度
|
|
|
|
|
|
rightTableConfig.value.height = `calc(80vh - ${heightForm.value}px)`;
|
2025-08-22 19:48:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-08-26 17:31:31 +08:00
|
|
|
|
|
2025-08-28 17:47:20 +08:00
|
|
|
|
const handletime = (val: Array<string>) => {
|
2025-09-12 11:06:51 +08:00
|
|
|
|
// console.log('时间', val);
|
2025-11-17 18:04:00 +08:00
|
|
|
|
// 校验日期格式
|
|
|
|
|
|
const dayDiff = getDayDiff(val[0], val[1]);
|
|
|
|
|
|
if (dayDiff === -1) return ElMessage.warning('请选择有效的日期范围');
|
|
|
|
|
|
//校验是否超过7天
|
|
|
|
|
|
if (dayDiff > 7) return ElMessage.warning('查询时间范围不能超过7天,请重新选择');
|
2025-08-28 17:47:20 +08:00
|
|
|
|
}
|
2025-08-26 17:31:31 +08:00
|
|
|
|
|
2025-08-27 15:27:45 +08:00
|
|
|
|
// 生成条码
|
2025-08-26 17:31:31 +08:00
|
|
|
|
const printHandle = () => {
|
2025-08-27 15:27:45 +08:00
|
|
|
|
const data = {
|
2025-11-17 18:04:00 +08:00
|
|
|
|
dept: queryParams.ksdh,
|
|
|
|
|
|
userid: queryParams.userid,
|
2025-09-04 10:31:08 +08:00
|
|
|
|
st: '',
|
|
|
|
|
|
et: '',
|
2025-08-28 17:47:20 +08:00
|
|
|
|
yljg: queryParams.yljg
|
2025-08-27 15:27:45 +08:00
|
|
|
|
}
|
2025-09-04 10:31:08 +08:00
|
|
|
|
if (queryParams.times && queryParams.times.length) {
|
|
|
|
|
|
data.st = queryParams.times[0]
|
|
|
|
|
|
data.et = queryParams.times[1]
|
2025-11-17 18:04:00 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
data.st = ''
|
|
|
|
|
|
data.et = ''
|
2025-09-04 10:31:08 +08:00
|
|
|
|
}
|
2025-08-27 15:27:45 +08:00
|
|
|
|
addObj(data).then((res: any) => {
|
|
|
|
|
|
if (res.code == 0) {
|
|
|
|
|
|
getList()
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
2025-08-26 17:31:31 +08:00
|
|
|
|
}
|
2025-11-17 18:04:00 +08:00
|
|
|
|
// 计算两个日期的天数差(支持带时分秒)
|
|
|
|
|
|
const getDayDiff = (start: string, end: string): number => {
|
|
|
|
|
|
const startTime = new Date(start).getTime();
|
|
|
|
|
|
const endTime = new Date(end).getTime();
|
|
|
|
|
|
|
|
|
|
|
|
// 校验日期有效性
|
|
|
|
|
|
if (isNaN(startTime) || isNaN(endTime)) {
|
|
|
|
|
|
return -1; // 无效日期
|
|
|
|
|
|
}
|
2025-08-27 15:27:45 +08:00
|
|
|
|
|
2025-11-17 18:04:00 +08:00
|
|
|
|
// 计算毫秒差 → 转换为天数(向上取整,避免因时分秒导致的误差)
|
|
|
|
|
|
return Math.ceil((endTime - startTime) / (24 * 60 * 60 * 1000));
|
|
|
|
|
|
};
|
2025-08-27 15:27:45 +08:00
|
|
|
|
// 查询申请单
|
|
|
|
|
|
const getList = () => {
|
2025-08-28 17:47:20 +08:00
|
|
|
|
const data = {
|
2025-11-17 18:04:00 +08:00
|
|
|
|
dept: queryParams.ksdh,
|
|
|
|
|
|
userid: queryParams.userid,
|
2025-08-29 17:40:32 +08:00
|
|
|
|
st: queryParams.times[0],
|
|
|
|
|
|
et: queryParams.times[1],
|
2025-11-18 18:12:34 +08:00
|
|
|
|
yljg: queryParams.yljg,
|
|
|
|
|
|
queryType: queryParams.queryType,
|
|
|
|
|
|
queryValue: queryParams.queryValue
|
2025-08-28 17:47:20 +08:00
|
|
|
|
}
|
2025-11-17 18:04:00 +08:00
|
|
|
|
|
|
|
|
|
|
if (!data.yljg) return ElMessage.warning('医疗机构不能为空!')
|
|
|
|
|
|
if (!data.dept) return ElMessage.warning('科室代号不能为空!')
|
|
|
|
|
|
if (!data.userid) return ElMessage.warning('用户userid不能为空!')
|
|
|
|
|
|
|
|
|
|
|
|
// 校验日期格式
|
|
|
|
|
|
const dayDiff = getDayDiff(queryParams.times[0], queryParams.times[1]);
|
|
|
|
|
|
if (dayDiff === -1) return ElMessage.warning('请选择有效的日期范围');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//校验是否超过7天
|
|
|
|
|
|
if (dayDiff > 7) return ElMessage.warning('查询时间范围不能超过7天,请重新选择');
|
|
|
|
|
|
if (queryParams.times && queryParams.times.length > 0) {
|
|
|
|
|
|
data.st = queryParams.times[0]
|
|
|
|
|
|
data.et = queryParams.times[1]
|
|
|
|
|
|
} else {
|
|
|
|
|
|
data.st = ''
|
|
|
|
|
|
data.et = ''
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
loading.value = true;
|
2025-08-28 17:47:20 +08:00
|
|
|
|
fetchCodeList(data).then((response: any) => {
|
2025-08-27 15:27:45 +08:00
|
|
|
|
if (response.code == 0) {
|
2025-08-28 17:47:20 +08:00
|
|
|
|
loading.value = false;
|
|
|
|
|
|
tableData.value = response.data
|
2025-10-22 17:36:25 +08:00
|
|
|
|
if (tableData.value.length > 0) {
|
|
|
|
|
|
rowHandle(response.data[0])
|
|
|
|
|
|
getRightTable(response.data[0])
|
|
|
|
|
|
tableRef.value.setCurrentRow(response.data[0])
|
|
|
|
|
|
}
|
2025-08-27 15:27:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2025-09-12 11:06:51 +08:00
|
|
|
|
|
|
|
|
|
|
const selectStatusRows = () => {
|
|
|
|
|
|
tableData.value.forEach((item: any) => {
|
|
|
|
|
|
if (item.zt == 1) {
|
|
|
|
|
|
tableRef.value.toggleRowSelection(item, true)
|
2025-11-18 18:12:34 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
tableRef.value.toggleRowSelection(item, false)
|
2025-09-12 11:06:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2025-08-26 17:31:31 +08:00
|
|
|
|
|
2025-09-16 17:23:13 +08:00
|
|
|
|
// 打印pdf
|
|
|
|
|
|
const printPdf = () => {
|
2025-11-18 18:12:34 +08:00
|
|
|
|
const selections = tableRef.value.allSelection()
|
|
|
|
|
|
if (selections.length <= 0) return ElMessage.warning('请选择数据!')
|
2025-09-16 17:23:13 +08:00
|
|
|
|
ElMessageBox.confirm(`确定打印选中的数据吗?`, "提示", {
|
|
|
|
|
|
confirmButtonText: "确认",
|
|
|
|
|
|
cancelButtonText: "取消",
|
|
|
|
|
|
beforeClose: async (action, instance, done) => {
|
|
|
|
|
|
if (action === "confirm") {
|
2025-11-18 18:12:34 +08:00
|
|
|
|
const requests = selections.map((item: any) => { return item.sqh });
|
2025-09-16 17:23:13 +08:00
|
|
|
|
fetchCodeExec({
|
|
|
|
|
|
sqh: requests.join(','),
|
2025-11-17 18:04:00 +08:00
|
|
|
|
userid: queryParams.userid,
|
2025-09-16 17:23:13 +08:00
|
|
|
|
status: 11,
|
2025-11-17 18:04:00 +08:00
|
|
|
|
yljg: queryParams.yljg
|
2025-09-16 17:23:13 +08:00
|
|
|
|
}).then((res: any) => {
|
|
|
|
|
|
if (res.code == 0) {
|
|
|
|
|
|
done();
|
|
|
|
|
|
getList()
|
|
|
|
|
|
HiprintPrinter.silentPrint(res.data);
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
} else {
|
|
|
|
|
|
done();
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
}).catch(() => { });
|
2025-08-26 17:31:31 +08:00
|
|
|
|
}
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
2025-11-18 18:12:34 +08:00
|
|
|
|
.mytable-style {
|
|
|
|
|
|
height: 76.5vh;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-22 19:48:04 +08:00
|
|
|
|
.custom-row-class {
|
|
|
|
|
|
background-color: #c6c3ff !important;
|
|
|
|
|
|
/* 设置行背景色 */
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.right-table {
|
2025-11-14 18:13:45 +08:00
|
|
|
|
margin-top: .625rem;
|
2025-10-22 17:36:25 +08:00
|
|
|
|
border: 1px solid #E1E9F7;
|
2025-10-31 09:50:50 +08:00
|
|
|
|
padding-top: .3125rem;
|
2025-08-22 19:48:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.title {
|
2025-10-22 17:36:25 +08:00
|
|
|
|
border-bottom: 1px solid #E1E9F7;
|
2025-10-31 09:50:50 +08:00
|
|
|
|
margin-bottom: .625rem;
|
|
|
|
|
|
padding: .625rem;
|
2025-08-22 19:48:04 +08:00
|
|
|
|
font-weight: 700;
|
|
|
|
|
|
}
|
2025-10-22 17:36:25 +08:00
|
|
|
|
|
|
|
|
|
|
.time-line-box {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
justify-content: space-around;
|
|
|
|
|
|
align-items: center;
|
2025-11-04 17:58:12 +08:00
|
|
|
|
margin-top: .35rem;
|
2025-10-22 17:36:25 +08:00
|
|
|
|
background-color: #f0f3f8;
|
2025-11-04 17:58:12 +08:00
|
|
|
|
padding: .3rem 2.5rem;
|
2025-11-14 18:13:45 +08:00
|
|
|
|
margin-top: .625rem;
|
2025-10-22 17:36:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.time-line-item {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: space-around;
|
|
|
|
|
|
width: 16.6%;
|
2025-11-14 18:13:45 +08:00
|
|
|
|
|
2025-10-22 17:36:25 +08:00
|
|
|
|
// padding: 0 30px;
|
|
|
|
|
|
|
|
|
|
|
|
.timeline-content {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
|
|
|
|
|
|
.index {
|
2025-11-04 17:58:12 +08:00
|
|
|
|
width: 1.875rem;
|
|
|
|
|
|
height: 1.875rem;
|
|
|
|
|
|
line-height: 1.875rem;
|
2025-10-22 17:36:25 +08:00
|
|
|
|
background: #E1E9F7;
|
|
|
|
|
|
border-radius: 50%;
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
font-family: SourceHanSansCN, SourceHanSansCN;
|
|
|
|
|
|
font-weight: 500;
|
2025-10-31 09:50:50 +08:00
|
|
|
|
font-size: 1.125rem;
|
2025-10-22 17:36:25 +08:00
|
|
|
|
color: #4767A3;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.active {
|
|
|
|
|
|
background-color: #4096ff;
|
2025-10-31 09:50:50 +08:00
|
|
|
|
box-shadow: 0 0 0 .25rem rgba(64, 150, 255, 0.2);
|
2025-10-22 17:36:25 +08:00
|
|
|
|
color: #FFF;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.timeline-title {
|
|
|
|
|
|
font-family: SourceHanSansCN, SourceHanSansCN;
|
|
|
|
|
|
font-weight: 500;
|
2025-10-31 09:50:50 +08:00
|
|
|
|
font-size: 1rem;
|
2025-10-22 17:36:25 +08:00
|
|
|
|
color: #4767A3;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.timeline-time {
|
|
|
|
|
|
font-family: SourceHanSansCN, SourceHanSansCN;
|
|
|
|
|
|
font-weight: 400;
|
2025-10-31 09:50:50 +08:00
|
|
|
|
font-size: .875rem;
|
2025-10-22 17:36:25 +08:00
|
|
|
|
color: #4767A3;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.timg {
|
2025-10-31 09:50:50 +08:00
|
|
|
|
width: 3.125rem;
|
2025-10-22 17:36:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-08-22 19:48:04 +08:00
|
|
|
|
</style>
|