Compare commits

..

No commits in common. "dfb3d478f020933922a9ae053f0e7389bde161b0" and "4bdd7e47f1a9fb03415aafff7a12aa947bbb3da5" have entirely different histories.

11 changed files with 979 additions and 576 deletions

View File

@ -132,11 +132,3 @@ export function getmediumList(data?: Object) {
params: data params: data
}) })
} }
//微生物报告审核
export function cbebCheck(data?: Object) {
return request({
url: '/lisworkgerm/check',
method: 'get',
params: data
})
}

View File

@ -287,20 +287,3 @@ aside {
} }
} }
} }
.next_box {
display: flex;
align-items: center;
justify-content: space-between;
.jtIcon {
width: 2.5rem;
height: 2rem;
line-height: 2rem;
font-size: 1rem;
text-align: center;
background-color: #1f6dd3;
color: #fff;
cursor: pointer;
}
}

View File

@ -7,20 +7,8 @@
class="compact-form"> class="compact-form">
<el-row :gutter="5"> <el-row :gutter="5">
<el-col :span="6"> <el-col :span="6">
<el-form-item label="" prop="ybh"> <el-form-item label="样本号:" prop="ybh">
<div class="next_box"> <el-input v-model="labInfo.ybh" placeholder="样本编号" @keyup.enter="handleQuery" style="width:100%" />
<div class="jtIcon" @click="handlePrev">
<el-icon>
<ArrowUpBold />
</el-icon>
</div>
<el-input v-model="labInfo.ybh" placeholder="样本编号" @keyup.enter="handleQuery" style="width:100%" />
<div class="jtIcon" @click="handleNext">
<el-icon>
<ArrowDownBold />
</el-icon>
</div>
</div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@ -63,14 +51,13 @@
<el-col :span="16"> <el-col :span="16">
<el-tabs v-model="activeName" type="card" class="demo-tabs"> <el-tabs v-model="activeName" type="card" class="demo-tabs">
<el-tab-pane label="鉴定(终报)结果" name="first"> <el-tab-pane label="鉴定(终报)结果" name="first">
<ZbReport ref="labResultRef" v-model:labPat="labInfo" :labPatKey="queryParams" <ZbReport ref="labResultRef" v-model:labPat="labInfo" :labPatKey="queryParams" :dictData="dictData"
@update:labPatKey="queryParams = $event" :dictData="dictData" :labResutsData="zbLabResuts" :labResutsData="zbLabResuts" @fetchLabResults="resultsHandle" @changeStatus="changeStatus"
@fetchLabResults="resultsHandle" @changeStatus="changeStatus" @previewHandle="previewHandle" /> @previewHandle="previewHandle" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="初级和二级报告" name="second"> <el-tab-pane label="初级和二级报告" name="second">
<CbReport v-model:labPat="labInfo" :labPatKey="queryParams" @update:labPatKey="queryParams = $event" <CbReport v-model:labPat="labInfo" :labPatKey="queryParams" :instrdComOpt="instrdComOpt"
:instrdComOpt="instrdComOpt" :dictData="dictData" @changeStatus="changeStatus" :userList="userList" :dictData="dictData" @changeStatus="changeStatus" @previewHandle="previewHandle" />
@previewHandle="previewHandle" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="培养基接种" name="third"> <el-tab-pane label="培养基接种" name="third">
<Byj :labPat="labInfo" :labPatKey="queryParams" /> <Byj :labPat="labInfo" :labPatKey="queryParams" />
@ -203,8 +190,7 @@ const queryParams = ref({
problemId: 0, problemId: 0,
days: -1, days: -1,
pageSize: 600, pageSize: 600,
pageNum: 1, pageNum: 1
yhdh: ''
}) })
@ -771,8 +757,6 @@ const sendMessage = () => {
background: #F0F3F8; background: #F0F3F8;
} }
:deep(.el-tabs--card>.el-tabs__header) { :deep(.el-tabs--card>.el-tabs__header) {
height: 1.875rem !important; height: 1.875rem !important;
margin-bottom: 0px; margin-bottom: 0px;

View File

@ -1,21 +1,18 @@
<template> <template>
<div> <div>
<div class="top-btns"> <div class="mb5">
<el-button type="primary" plain size="small" @click="printHandle">打印培养基条码</el-button> &nbsp; <el-button type="primary" plain size="small">打印培养基条码</el-button> &nbsp;
<el-checkbox v-model="checked">自动打印培养基条码</el-checkbox> <el-checkbox v-model="checked">自动打印培养基条码</el-checkbox>
</div> </div>
<CustomTable ref="tableRef" :data="tableData" :columns="columns" :config="tableConfig" :enable-column-drag="true" <CustomTable ref="tableRef" :data="tableData" :columns="columns" :config="tableConfig" :enable-column-drag="true"
@column-drag-end="handleColumnDragEnd" @selection-change="handleSelectionChange"> @column-drag-end="handleColumnDragEnd">
<template #mediumname="{ column }">
培养基 {{ tableData.length }}个
</template>
</CustomTable> </CustomTable>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import CustomTable from '@/components/elTable/index.vue'; import CustomTable from '@/components/elTable/index.vue';
import { getmediumList } from '@/api/liswork/micro/index'; import { getmediumList } from '@/api/liswork/micro/index'
const props = defineProps({ const props = defineProps({
labPat: { labPat: {
@ -35,32 +32,22 @@ const checked = ref(false);
const tableRef = ref(); const tableRef = ref();
const tableData = ref([]); const tableData = ref([]);
const columns = ref([ const columns = ref([
{ type: "selection", width: 40, align: 'center', visible: true }, { label: "培养基", prop: "zhxmdh", align: 'center', visible: true, headerSlot: 'xmdh', width: 100 },
{ label: "培养基", prop: "mediumname", align: 'center', visible: true, width: 80, headerSlot: 'mediumname' }, { label: "接种时间", prop: "zhxmdh", align: 'center', visible: true, width: 100 },
{ label: "接种时间", prop: "sheetdate", align: 'center', visible: true, width: 120 }, { label: "培养基结果", prop: "zhxmdh", align: 'center', visible: true, width: 100 },
{ label: "接种人", prop: "sheetuser", align: 'center', visible: true, width: 60 }, { label: "转种类型", prop: "zhxmdh", align: 'center', visible: true, width: 100 },
{ label: "培养基结果", prop: "mediu", align: 'center', visible: true, }, { label: "培养周期(小时)", prop: "zhxmdh", align: 'center', visible: true, width: 100 },
{ label: "转种类型", prop: "comments", align: 'center', visible: true, }, { label: "观察间隔(小时)", prop: "zhxmdh", align: 'center', visible: true, width: 100 },
{ label: "培养周期(小时)", prop: "conidtions", align: 'center', visible: true, width: 100 },
{ label: "观察间隔(小时)", prop: "watchinterval", align: 'center', visible: true, width: 100 },
]); ]);
const tableConfig = ref({ const tableConfig = ref({
border: true, border: true,
height: '74vh', height: '100%',
}) })
const handleColumnDragEnd = (data: any) => { const handleColumnDragEnd = (data: any) => {
columns.value = data.columns; columns.value = data.columns;
} }
const handleSelectionChange = (selection: any) => {
console.log(selection);
}
const printHandle = () => {
console.log('打印培养基条码');
}
const getbyjList = () => { const getbyjList = () => {
const data = { const data = {
jyrq: labPat.value.jyrq, jyrq: labPat.value.jyrq,
@ -83,10 +70,4 @@ watch(() => props.labPat, (newValue) => {
</script> </script>
<style scoped lang="scss"> <style scoped></style>
.top-btns {
margin-bottom: .3125rem;
display: flex;
align-items: center;
}
</style>

View File

@ -2,26 +2,24 @@
<div> <div>
<div class="title"> <div class="title">
<div> <div>
<span>初报人:</span>{{ formatUser(cbInfo?.confirmer) }} &nbsp;&nbsp; <span>报告时间:</span>{{ cbInfo?.confirmdt <span>初报人:</span>{{ cbInfo?.confirmer }} &nbsp;&nbsp; <span>报告时间:</span>{{ cbInfo?.confirmdt }}&nbsp;&nbsp;
}}&nbsp;&nbsp;
</div> </div>
<div><span>{{ cbInfo?.jgbz == '2' ? '已初报' : '' }}</span></div> <div><span>{{ cbInfo?.jgbz == '2' ? '已初报' : '' }}</span></div>
</div> </div>
<div> <div>
<el-button class="btn_green btns_box" :size="autoSize" v-if="cbInfo?.jgbz != 2" <el-button class="btn_green btns_box" :size="autoSize" v-if="cbInfo?.jgbz != 2"
@click="handleCheck(3)">初报审核</el-button> @click="handleCheck(1, 'cb')">初报审核</el-button>
<el-button class="btns_box" :size="autoSize" v-if="cbInfo?.jgbz == 2" @click="handleCheck(-3)">取消审核</el-button> <el-button class="btns_box" :size="autoSize" v-if="cbInfo?.jgbz == 2"
@click="handleCheck(2, 'cb')">取消审核</el-button>
<el-button class="btns_box" type="primary" :size="autoSize" plain :disabled="cbInfo?.jgbz == '2'" <el-button class="btns_box" type="primary" :size="autoSize" plain :disabled="cbInfo?.jgbz == '2'"
@click="openItemDictDialog(1)">新增</el-button> @click="openItemDictDialog(1)">新增</el-button>
<el-button class="btns_box" type="danger" :size="autoSize" :disabled="cbInfo?.jgbz == '2'" plain <el-button class="btns_box" type="danger" :size="autoSize" :disabled="cbInfo?.jgbz == '2'" plain
@click="handleBatchDelete(1)">删除</el-button> @click="handleBatchDelete(1)">删除</el-button>
<el-button class="btn_green btns_box" :size="autoSize" :disabled="cbInfo?.jgbz == '2'" <el-button class="btn_green btns_box" :size="autoSize" :disabled="cbInfo?.jgbz == '2'"
@click="zhHandel(1)">组合项目</el-button> @click="zhHandel(1)">组合项目</el-button>
<el-button type="primary" plain class=" btns_box" @click="printHandle(1)">打印</el-button>
<el-button type="primary" plain class=" btns_box" @click="previewHandle(2)">预览</el-button>
</div> </div>
<CustomTable :data="tableData" :columns="columns" :config="tableConfig" :enable-column-drag="true" <CustomTable :data="tableData" :columns="columns" :config="tableConfig" :enable-column-drag="true"
@column-drag-end="handleColumnDragEnd" @row-click="cbRowClick"> @column-drag-end="handleColumnDragEnd">
<template #xmdh="{ column }"> <template #xmdh="{ column }">
细菌/结果({{ tableData.length }})项 细菌/结果({{ tableData.length }})项
</template> </template>
@ -64,26 +62,24 @@
<div class="title ertext"> <div class="title ertext">
<div> <div>
<span>二报人:</span>{{ formatUser(erInfo?.confirmer) }} &nbsp;&nbsp; <span>报告时间:</span>{{ erInfo?.confirmdt <span>二报人:</span>{{ erInfo?.confirmer }} &nbsp;&nbsp; <span>报告时间:</span>{{ erInfo?.confirmdt }}&nbsp;&nbsp;
}}&nbsp;&nbsp;
</div> </div>
<div><span>{{ erInfo?.jgbz == '2' ? '已二报' : '' }}</span></div> <div><span>{{ erInfo?.jgbz == '2' ? '已二报' : '' }}</span></div>
</div> </div>
<div> <div>
<el-button class="btn_green btns_box" :size="autoSize" v-if="erInfo?.jgbz != 2" <el-button class="btn_green btns_box" :size="autoSize" v-if="erInfo?.jgbz != 2"
@click="handleCheck(4)">二报审核</el-button> @click="handleCheck(1, 'erb')">二报审核</el-button>
<el-button class="btns_box" :size="autoSize" v-if="erInfo?.jgbz == 2" @click="handleCheck(-4)">取消审核</el-button> <el-button class="btns_box" :size="autoSize" v-if="erInfo?.jgbz == 2"
@click="handleCheck(2, 'erb')">取消审核</el-button>
<el-button class="btns_box" type="primary" :size="autoSize" plain :disabled="erInfo?.jgbz == '2'" <el-button class="btns_box" type="primary" :size="autoSize" plain :disabled="erInfo?.jgbz == '2'"
@click="openItemDictDialog(2)">新增</el-button> @click="openItemDictDialog(2)">新增</el-button>
<el-button class="btns_box" type="danger" :size="autoSize" :disabled="erInfo?.jgbz == '2'" plain <el-button class="btns_box" type="danger" :size="autoSize" :disabled="erInfo?.jgbz == '2'" plain
@click="handleBatchDelete(2)">删除</el-button> @click="handleBatchDelete(2)">删除</el-button>
<el-button class="btn_green btns_box" :size="autoSize" :disabled="erInfo?.jgbz == '2'" <el-button class="btn_green btns_box" :size="autoSize" :disabled="erInfo?.jgbz == '2'"
@click="zhHandel(2)">组合项目</el-button> @click="zhHandel(2)">组合项目</el-button>
<el-button type="primary" plain class=" btns_box" @click="printHandle(2)">打印</el-button>
<el-button type="primary" plain class=" btns_box" @click="previewHandle(2)">预览</el-button>
</div> </div>
<CustomTable :data="tableData2" :columns="columns" :config="tableConfig" :enable-column-drag="true" <CustomTable :data="tableData2" :columns="columns" :config="tableConfig" :enable-column-drag="true"
@column-drag-end="handleColumnDragEnd" @row-click="erbRowClick"> @column-drag-end="handleColumnDragEnd">
<template #xmdh="{ column }"> <template #xmdh="{ column }">
细菌/结果({{ tableData2.length }})项 细菌/结果({{ tableData2.length }})项
</template> </template>
@ -133,34 +129,25 @@
<!-- 组合项目 --> <!-- 组合项目 -->
<Combined ref="combinedRef" :queryParams="labPatKey" @dbMbHandle="combinedHandel" /> <Combined ref="combinedRef" :queryParams="labPatKey" @dbMbHandle="combinedHandel" />
<!-- 校验用户 -->
<CheckUser ref="checkUserRef" :title="checktitle" @onConfirm="handleCheckUserConfirm" />
<!-- 取消审核操作原因 -->
<Unconfirmlog ref="unconfirmlogRef" :reasonText="reasonText" :tableKey="labPatKey" @onConfirm="proceedCheck" />
<!-- 危急值结果上报 -->
<UploadWarning ref="uploadwarningRef" :warningMsgdata="warningMsgdata" :tableKey="labPatKey"
@onupload="proceedCheck" />
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import CustomTable from '@/components/elTable/index.vue' import CustomTable from '@/components/elTable/index.vue'
import { LabResultItem } from '@/types/index'; import { LabResultItem, ymTableDataItem } from '@/types/index';
import { changeresult, saveresult, newresult, sampleMedInfo, cbebCheck } from '@/api/liswork/micro/index'; import { changeresult, saveresult, newresult, sampleMedInfo } from '@/api/liswork/micro/index';
import { deleteresult, queryXmVal, setinputmdl, queryLabPat, checkuser, printListwork } from "@/api/liswork/work/LisWork"; import {
import CheckUser from "../../work/components/CheckUser.vue"; check1, check2, uncheck2, unconfirmlog, checkuser, reglimit, deleteresult, allPatquery, emrquery, datalink, changeLinkList,
import Unconfirmlog from "../../work/components/unconfirmlog.vue"; viewBackup, queryXmVal, printListwork, getresultchangelog, setinputmdl, lockSample, unLockSample, clearnotComplete, clearPrintflag,
import UploadWarning from "../../work/components/uploadwarning.vue"; noiteMresult, queryXmInfo, setitemInter, queryLabPat
} from "@/api/liswork/work/LisWork";
// @ts-ignore // @ts-ignore
import ProjectDetails from "@/components/projectDetails/index.vue"; import ProjectDetails from "@/components/projectDetails/index.vue";
import projectsJg from "@/components/projectsjg/index.vue"; import projectsJg from "@/components/projectsjg/index.vue";
// @ts-ignore // @ts-ignore
import Combined from "./components/combinedDialog.vue"; import Combined from "./components/combinedDialog.vue";
import emitter from '@/utils/mitt'; import emitter from '@/utils/mitt';
import { ElMessage, ElMessageBox } from 'element-plus'; import { ElMessage } from 'element-plus';
import { useCommonStore } from "@/store/modules/commonStore"; import { useCommonStore } from "@/store/modules/commonStore";
import { classCom } from '@/utils/classCom'; import { classCom } from '@/utils/classCom';
const autoSize = classCom.useAutoSize(); const autoSize = classCom.useAutoSize();
@ -183,14 +170,10 @@ const props = defineProps({
dictData: { dictData: {
type: Object, type: Object,
default: () => { } default: () => { }
}, }
userList: {
type: Array as () => Array<any>,
default: () => []
},
}) })
const { labPat, labPatKey, instrdComOpt, userList } = toRefs(props); const { labPat, labPatKey, instrdComOpt } = toRefs(props);
const tableData = ref<LabResultItem[]>([]) const tableData = ref<LabResultItem[]>([])
const tableData2 = ref<LabResultItem[]>([]) const tableData2 = ref<LabResultItem[]>([])
@ -283,13 +266,12 @@ const mbList = (type: number) => {
const emits = defineEmits([ const emits = defineEmits([
'fetchLabResults', 'fetchLabResults',
'changeStatus', 'changeStatus',
'previewHandle', 'previewHandle'
'update:labPatKey'
]); ]);
const columns = ref([ const columns = ref([
{ label: "细菌/结果", prop: "zhxmdh", visible: true, headerSlot: 'xmdh', width: 150 }, { label: "细菌/结果", prop: "zhxmdh", align: 'center', visible: true, headerSlot: 'xmdh', width: 150 },
{ label: "菌落计数", prop: "od", align: 'center', visible: true, slot: 'od' }, { label: "菌落计数", prop: "od", align: 'center', visible: true, slot: 'od' },
{ label: "检验结果", prop: "csjg", align: 'center', visible: true, slot: 'csjg' }, { label: "检验结果", prop: "csjg", align: 'center', visible: true, slot: 'csjg' },
{ label: "阴阳性", prop: "jgbz", align: 'center', visible: true, slot: 'jgbz', showOverflowTooltip: false }, { label: "阴阳性", prop: "jgbz", align: 'center', visible: true, slot: 'jgbz', showOverflowTooltip: false },
@ -343,7 +325,7 @@ const CellStyleHd = ({ row, column, rowIndex, columnIndex }: {
const tableConfig = ref({ const tableConfig = ref({
height: '32vh', height: '32vh',
border: true, border: true,
highlightCurrentRow: true, // highlightCurrentRow: true,
cellStyle: CellStyleHd cellStyle: CellStyleHd
}); });
@ -351,94 +333,62 @@ const handleColumnDragEnd = (data: any) => {
columns.value = data.columns; columns.value = data.columns;
} }
const checktitle = ref('');
const shType = ref('') // 审核类型 cb初报 erb二报 const shType = ref('') // 审核类型 cb初报 erb二报
const bgType = ref(1) // 报告类型 1初报 2二报 const bgType = ref(1) // 报告类型 1初报 2二报
const checkUserRef = ref();
const unconfirmlogRef = ref(); const handleCheck = (checkType: number, shtype: string) => {
const uploadwarningRef = ref(); shType.value = shtype
const runnextstepname = ref(-1); // yhdh = checkuserid.value
const reasonText = ref(''); switch (checkType) {
const warningMsgdata = ref(''); // case 1: // 初审
const handleCheck = (checkType: number,) => { // check1({ ...labPatKey.value, jyrq: labPat.value.jyrq, yhdh: props.labPat.yhdh }).then((res: any) => {
runnextstepname.value = checkType // emits("changeStatus", props.labPat);
labPatKey.value.problemId = 0; // })
if (!labPatKey.value.yhdh) { // break;
checktitle.value = '审核人工号密码验证' case 1: // 审核
checkUserRef.value.open() labPatKey.value.problemId = 0
} else { shHandleCheck()
proceedCheck() break;
case 2: // 取消审核
labPatKey.value.problemId = 0
unShHandle()
break;
default:
break;
} }
}; };
const handleCheckUserConfirm = (info: { yhdh: string, mm: string }) => { const unCheckshow = ref(false);
checkuser({ yhdh: info.yhdh, mm: info.mm }).then((response: any) => { const reasonText = ref('');
if (response.code == 0) { const warningMsgdata = ref('');
emits('update:labPatKey', { const showuploadwarning = ref(false);
...labPatKey.value,
yhdh: info.yhdh
});
proceedCheck()
}
})
}
const proceedCheck = () => { const shHandleCheck = () => {
const data = { check2({ ...labPatKey.value, jyrq: labPat.value.jyrq, yhdh: labPat.value.yhdh, yq: labPat.value.yq }).then((res: any) => {
yq: labPat.value.yq,
yhdh: labPat.value.yhdh,
ybh: labPat.value.ybh,
jyrq: labPat.value.jyrq,
jgbz: runnextstepname.value,
}
cbebCheck(data).then((res: any) => {
if (res.code == "4" && res.problemId === 4) { if (res.code == "4" && res.problemId === 4) {
labPatKey.value.problemId = res.problemId; labPatKey.value.problemId = res.problemId;
warningMsgdata.value = res.msg; warningMsgdata.value = res.msg;
uploadwarningRef.value.open(); showuploadwarning.value = true;
} }
getLabPatInfo()
})
};
const unShHandle = () => {
uncheck2({ ...labPatKey.value, jyrq: labPat.value.jyrq, yhdh: labPat.value.yhdh, yq: labPat.value.yq }).then((res: any) => {
if (res.code == "4") { if (res.code == "4") {
labPatKey.value.problemId = res.problemId; labPatKey.value.problemId = res.problemId;
reasonText.value = res.msg; reasonText.value = res.msg;
unconfirmlogRef.value.open(); unCheckshow.value = true;
} }
emits("changeStatus", labPat.value); getLabPatInfo()
}) })
}; };
const selectedRows = ref<LabResultItem[]>([])
const erbRowClick = (row: LabResultItem) => {
bgType.value = 2
selectedRows.value = [row];
}
const cbRowClick = (row: LabResultItem) => {
bgType.value = 1
selectedRows.value = [row];
}
const handleBatchDelete = (type: number) => { const handleBatchDelete = (type: number) => {
if (selectedRows.value.length === 0) return ElMessage.warning("请先选择要删除的记录"); bgType.value = type
ElMessageBox.confirm(
`确定要删除选中的 ${selectedRows.value.length} 条记录吗?`,
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
deleteresult(selectedRows.value).then((res: any) => {
if (res.code == 0) {
ElMessage.success('删除成功');
getResultList()
selectedRows.value = []
}
})
}).catch(() => {
});
} }
// 项目结果保存 // 项目结果保存
@ -478,35 +428,7 @@ const handleCsjgEnter = async (row: any, type: number) => {
// if (input?.tagName === "INPUT") input?.blur(); // if (input?.tagName === "INPUT") input?.blur();
// }); // });
} }
};
const printHandle = (type: number) => {
const yq = type === 1 ? instrdComOpt.value.yq1 : instrdComOpt.value.yq2
const data = {
jyrq: labPat.value.jyrq,
yq: yq,
ybh: labPat.value.ybh,
sqh: labPat.value.sqh
}
printListwork(data).then((res: any) => {
if (res.code == 0) {
classCom.printBase64PDF(res.data)
}
})
};
const previewHandle = (type: number) => {
const yq = type === 1 ? instrdComOpt.value.yq1 : instrdComOpt.value.yq2
const data = {
jyrq: labPat.value.jyrq,
yq: yq,
ybh: labPat.value.ybh,
sqh: labPat.value.sqh
}
printListwork(data).then((res: any) => {
if (res.code == 0) {
emits('previewHandle', res.data);
}
})
}; };
const itemDictRef = ref(); const itemDictRef = ref();
const openItemDictDialog = (type: number) => { const openItemDictDialog = (type: number) => {
@ -593,7 +515,6 @@ const zhHandel = (type: number) => {
const combinedHandel = (row: any) => { const combinedHandel = (row: any) => {
const targetTable = bgType.value === 1 ? tableData.value : tableData2.value; const targetTable = bgType.value === 1 ? tableData.value : tableData2.value;
const yq = bgType.value === 1 ? instrdComOpt.value.yq1 : instrdComOpt.value.yq2;
const data = { const data = {
...labPatKey.value, ...labPatKey.value,
mbmc: row.mbmc, mbmc: row.mbmc,
@ -603,7 +524,7 @@ const combinedHandel = (row: any) => {
const existingNames = new Set(targetTable.map((item: any) => item.xmdh)) const existingNames = new Set(targetTable.map((item: any) => item.xmdh))
res.data?.forEach((item: any) => { res.data?.forEach((item: any) => {
if (!existingNames.has(item.xmdh)) { if (!existingNames.has(item.xmdh)) {
targetTable.push({ ...item, jyrq: labPat.value.jyrq, zhxmdh: item.xmdh + ' ' + item.xmmc, yq }) targetTable.push({ ...item, jyrq: labPat.value.jyrq, zhxmdh: item.xmdh + ' ' + item.xmmc })
existingNames.add(item.xmdh) existingNames.add(item.xmdh)
} }
}) })
@ -620,9 +541,6 @@ const formatDict = (v: string, dictType: string) => {
const formatJgbz = (v: string) => { const formatJgbz = (v: string) => {
return v == 'H' ? '高' : v == 'L' ? '低' : v == 'N' ? '阴性' : v == 'P' ? '阳性' : v == 'Q' ? '弱阳性' : v == 'M' ? '正常' : '' return v == 'H' ? '高' : v == 'L' ? '低' : v == 'N' ? '阴性' : v == 'P' ? '阳性' : v == 'Q' ? '弱阳性' : v == 'M' ? '正常' : ''
} }
const formatUser = (yhdh: string) => {
return userList.value.find((item: any) => item.userName == yhdh)?.nickName || yhdh
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@ -127,6 +127,7 @@
</div> </div>
</div> </div>
<!-- 新增明细 --> <!-- 新增明细 -->
<ProjectDetails ref="itemDictRef" :dialog-title="'选择检验项目'" :tableKey="labPatKey" @select="handleItemSelect" /> <ProjectDetails ref="itemDictRef" :dialog-title="'选择检验项目'" :tableKey="labPatKey" @select="handleItemSelect" />
@ -143,15 +144,34 @@
<!-- 抗生素组模板 --> <!-- 抗生素组模板 -->
<kssMb ref="kssMbRef" :dialog-title="'抗生素组选择'" :tableKey="labPatKey" @select="kssSelect" /> <kssMb ref="kssMbRef" :dialog-title="'抗生素组选择'" :tableKey="labPatKey" @select="kssSelect" />
<!-- 校验用户 --> <!-- 操作原因 -->
<CheckUser ref="checkUserRef" :title="checktitle" @onConfirm="handleCheckUserConfirm" /> <el-dialog v-model="unCheckshow" title="操作原因" width="500" :close-on-click-modal="false" :draggable="true"
@close="unconfirmlogCancel">
<div class="dialog-body mb10">
<p class="reason-text mb5">{{ reasonText }} </p>
<el-form ref="uncheckFormRef" style="max-width: 600px" :model="uncheckForm" :rules="rules" label-width="auto">
<template v-if="labPatKey.problemId == 4">
<el-input type="textarea" v-model="uncheckForm.reason" class="reason-input" placeholder="请输入操作原因..."
:rows="4"></el-input>
</template>
<template v-if="labPatKey.problemId == 6">
<el-form-item label="用户工号:" prop="yhdh">
<el-input v-model.trim="uncheckForm.yhdh" placeholder="请输入用户工号" maxlength="20"
@keyup.enter="submitForm" />
</el-form-item>
<el-form-item label="密码:" prop="mm">
<el-input v-model.trim="uncheckForm.mm" placeholder="请输入密码" type="mm" maxlength="20" show-password
@keyup.enter="submitForm" />
</el-form-item>
</template>
</el-form>
</div>
<!-- 取消审核操作原因 --> <div style="text-align: center; width: 100%;">
<Unconfirmlog ref="unconfirmlogRef" :reasonText="reasonText" :tableKey="labPatKey" @onConfirm="unShHandle" /> <el-button type="primary" @click="unconfirmlogConfirm()"> 确认 </el-button>
<el-button @click="unconfirmlogCancel">取消</el-button>
<!-- 危急值结果上报 --> </div>
<UploadWarning ref="uploadwarningRef" :warningMsgdata="warningMsgdata" :tableKey="labPatKey" </el-dialog>
@onupload="shHandleCheck" />
</div> </div>
</template> </template>
@ -164,9 +184,6 @@ import {
} from '@/api/liswork/micro/index'; } from '@/api/liswork/micro/index';
import { check2, uncheck2, unconfirmlog, checkuser, deleteresult, queryXmVal, setinputmdl, } from "@/api/liswork/work/LisWork"; import { check2, uncheck2, unconfirmlog, checkuser, deleteresult, queryXmVal, setinputmdl, } from "@/api/liswork/work/LisWork";
import { useCommonStore } from "@/store/modules/commonStore"; import { useCommonStore } from "@/store/modules/commonStore";
import CheckUser from "../../work/components/CheckUser.vue";
import Unconfirmlog from "../../work/components/unconfirmlog.vue";
import UploadWarning from "../../work/components/uploadwarning.vue";
// @ts-ignore // @ts-ignore
import ProjectDetails from "@/components/projectDetails/index.vue"; import ProjectDetails from "@/components/projectDetails/index.vue";
import projectsJg from "@/components/projectsjg/index.vue"; import projectsJg from "@/components/projectsjg/index.vue";
@ -206,15 +223,14 @@ const { labPat, labPatKey, labResutsData, dictData } = toRefs(props);
const emits = defineEmits([ const emits = defineEmits([
'fetchLabResults', 'fetchLabResults',
'changeStatus', 'changeStatus',
'previewHandle', 'previewHandle'
'update:labPatKey'
]); ]);
const activeName2 = ref('first') const activeName2 = ref('first')
const textarea = ref('') const textarea = ref('')
const columns = ref([ const columns = ref([
{ label: "细菌/结果", prop: "zhxmdh", visible: true, headerSlot: 'xmdh', width: 150 }, { label: "细菌/结果", prop: "zhxmdh", align: 'center', visible: true, headerSlot: 'xmdh', width: 150 },
{ label: "菌落计数", prop: "od", align: 'center', visible: true, slot: 'od' }, { label: "菌落计数", prop: "od", align: 'center', visible: true, slot: 'od' },
{ label: "检验结果", prop: "csjg", align: 'center', visible: true, slot: 'csjg' }, { label: "检验结果", prop: "csjg", align: 'center', visible: true, slot: 'csjg' },
{ label: "阴阳性", prop: "jgbz", align: 'center', visible: true, slot: 'jgbz', showOverflowTooltip: false }, { label: "阴阳性", prop: "jgbz", align: 'center', visible: true, slot: 'jgbz', showOverflowTooltip: false },
@ -276,36 +292,18 @@ const handleColumnDragEnd = (data: any) => {
columns.value = data.columns; columns.value = data.columns;
} }
const unCheckshow = ref(false);
const reasonText = ref(''); const reasonText = ref('');
const warningMsgdata = ref(''); const warningMsgdata = ref('');
const checktitle = ref(''); const showuploadwarning = ref(false);
const checkUserRef = ref();
const runnextstepname = ref(-1);
const handleCheck = (checkType: number) => { const handleCheck = (checkType: number) => {
runnextstepname.value = checkType // yhdh = checkuserid.value
labPatKey.value.problemId = 0; switch (checkType) {
if (!labPatKey.value.yhdh) { // case 1: // 初审
checktitle.value = '审核人工号密码验证' // check1({ ...labPatKey.value, jyrq: labPat.value.jyrq, yhdh: props.labPat.yhdh }).then((res: any) => {
checkUserRef.value.open() // emits("changeStatus", props.labPat);
} else { // })
proceedCheck(checkType) // break;
}
};
const handleCheckUserConfirm = (info: { yhdh: string, mm: string }) => {
checkuser({ yhdh: info.yhdh, mm: info.mm }).then((response: any) => {
if (response.code == 0) {
emits('update:labPatKey', {
...labPatKey.value,
yhdh: info.yhdh
});
proceedCheck(runnextstepname.value)
}
})
}
const proceedCheck = (type: number) => {
switch (type) {
case 2: // 审核 case 2: // 审核
labPatKey.value.problemId = 0 labPatKey.value.problemId = 0
shHandleCheck() shHandleCheck()
@ -317,34 +315,96 @@ const proceedCheck = (type: number) => {
default: default:
break; break;
} }
} };
const uploadwarningRef = ref();
const shHandleCheck = () => { const shHandleCheck = () => {
check2({ ...labPatKey.value, jyrq: labPat.value.jyrq, yhdh: props.labPat.yhdh }).then((res: any) => { check2({ ...labPatKey.value, jyrq: labPat.value.jyrq, yhdh: props.labPat.yhdh }).then((res: any) => {
emits("changeStatus", props.labPat); emits("changeStatus", props.labPat);
if (res.code == "4" && res.problemId === 4) { if (res.code == "4" && res.problemId === 4) {
labPatKey.value.problemId = res.problemId; labPatKey.value.problemId = res.problemId;
warningMsgdata.value = res.msg; warningMsgdata.value = res.msg;
uploadwarningRef.value.open(); showuploadwarning.value = true;
} }
}) })
}; };
const unconfirmlogRef = ref();
const unShHandle = () => { const unShHandle = () => {
uncheck2({ ...labPatKey.value, jyrq: labPat.value.jyrq, yhdh: props.labPat.yhdh }).then((res: any) => { uncheck2({ ...labPatKey.value, jyrq: labPat.value.jyrq, yhdh: props.labPat.yhdh }).then((res: any) => {
if (res.code == "4") { if (res.code == "4") {
labPatKey.value.problemId = res.problemId; labPatKey.value.problemId = res.problemId;
reasonText.value = res.msg; reasonText.value = res.msg;
unconfirmlogRef.value.open(); unCheckshow.value = true;
} }
emits("changeStatus", props.labPat); emits("changeStatus", props.labPat);
}) })
}; };
const uncheckFormRef = ref();
const uncheckForm = ref({
reason: '',
yhdh: '',
mm: '',
})
// 取消审核原因
const unconfirmlogConfirm = async () => {
if (labPatKey.value.problemId == 4) {
// if (!uncheckForm.value.inputValue) return ElMessage.warning("请输入操作原因")
} else if (labPatKey.value.problemId == 6) {
const valid = await uncheckFormRef.value.validate().catch(() => { });
if (!valid) return false;
}
unconfirmlog({ ...labPatKey.value, jyrq: labPat.value.jyrq, ...uncheckForm.value }).then((response: any) => {
if (response.code == "0") {
unCheckshow.value = false;
unShHandle();
}
})
};
const checkuserid = ref()
const checkShow = ref(false);
const ruleForm = ref({
yhdh: '',
mm: ''
});
const rules = ref(
{
yhdh: [{ required: true, message: "请输入用户工号", trigger: "blur" },
{ min: 3, max: 20, message: "长度在 3 到 20 个字符", trigger: "blur" }
],
mm: [{ required: true, message: "请输入密码", trigger: "blur" },
{ min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" }
]
}
);
const unconfirmlogCancel = () => {
unCheckshow.value = false;
uncheckForm.value.reason = '';
uncheckForm.value.yhdh = '';
uncheckForm.value.mm = '';
uncheckFormRef.value.resetFields();
}
const ruleFormRef = ref();
const submitForm = () => {
ruleFormRef.value.validate((valid: boolean) => {
if (valid) {
checkuser(ruleForm.value).then((res: any) => {
if (res.code == 0) {
checkuserid.value = ruleForm.value.yhdh
checkShow.value = false;
ElMessage.success("验证成功");
}
})
} else {
return false;
}
});
}
const itemDictRef = ref(); const itemDictRef = ref();
const openItemDictDialog = () => { const openItemDictDialog = () => {

View File

@ -1,33 +1,89 @@
<template> <template>
<div> <!-- 遮罩层 -->
<el-dialog v-model="checkShow" :title="title" width="500" :close-on-click-modal="false" :draggable="true" <div
@close="handleCancel"> v-if="visible"
<el-form ref="ruleFormRef" style="max-width: 600px" :model="ruleForm" :rules="rules" label-width="auto"> class="dialog-mask"
<el-form-item label="用户工号:" prop="yhdh"> @click="handleCancel"
<el-input ref="yhdhRef" v-model.trim="ruleForm.yhdh" placeholder="请输入用户工号" maxlength="20" ></div>
@keyup.enter="handleConfirm" />
</el-form-item> <!-- 弹窗主体 -->
<el-form-item label="密码:" prop="mm"> <div
<el-input v-model.trim="ruleForm.mm" placeholder="请输入密码" type="mm" maxlength="20" show-password v-if="visible"
@keyup.enter="handleConfirm" /> class="dialog-container"
</el-form-item> >
<el-form-item> <div class="dialog-box">
<div style="text-align: center; width: 100%;"> <!-- 标题区域 -->
<el-button type="primary" @click="handleConfirm()"> 确认 </el-button> <div class="dialog-header">
<el-button @click="handleCancel">取消</el-button> <h3 class="dialog-title">{{ title }}</h3>
</div> <button
</el-form-item> class="dialog-close"
</el-form> @click="handleCancel"
</el-dialog> aria-label="关闭"
>
<span>×</span>
</button>
</div>
<!-- 内容区域 -->
<div class="dialog-body">
<!-- 工号输入 -->
<div class="form-item">
<label class="form-label">用户工号</label>
<input
type="text"
v-model.trim="userId"
class="form-input"
placeholder="请输入用户工号"
@keyup.enter="handleConfirm"
>
</div>
<!-- 密码输入 -->
<div class="form-item">
<label class="form-label">密码</label>
<input
type="password"
v-model="password"
class="form-input"
placeholder="请输入密码"
@keyup.enter="handleConfirm"
>
</div>
<!-- 错误提示 -->
<p v-if="errorMsg" class="error-message">{{ errorMsg }}</p>
</div>
<!-- 按钮区域 -->
<div class="dialog-footer">
<button
class="btn btn-cancel"
@click="handleCancel"
>
取消
</button>
<button
class="btn btn-confirm"
@click="handleConfirm"
:disabled="!userId || !password"
>
确认验证
</button>
</div>
</div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup>
import { set } from '@vueuse/core';
import { defineProps, defineEmits, ref, watch } from 'vue'; import { defineProps, defineEmits, ref, watch } from 'vue';
// 组件属性 // 组件属性
const props = defineProps({ const props = defineProps({
// 控制弹窗显示/隐藏
visible: {
type: Boolean,
default: false
},
// 弹窗标题(由外部参数控制) // 弹窗标题(由外部参数控制)
title: { title: {
type: String, type: String,
@ -47,59 +103,221 @@ const props = defineProps({
// 组件事件 // 组件事件
const emit = defineEmits([ const emit = defineEmits([
'update:visible', // 控制弹窗显示状态
'onConfirm', // 验证成功回调 'onConfirm', // 验证成功回调
'onCancel' // 取消验证回调
]); ]);
// 表单数据 // 表单数据
const ruleForm = ref({ const userId = ref('');
yhdh: '', const password = ref('');
mm: '', const errorMsg = ref('');
});
const rules = ref( // 监听弹窗显示状态,重置表单
{ watch(
yhdh: [{ required: true, message: "请输入用户工号", trigger: "blur" }, () => props.visible,
{ min: 3, max: 20, message: "长度在 3 到 20 个字符", trigger: "blur" } (newVal) => {
], if (newVal) {
mm: [{ required: true, message: "请输入密码", trigger: "blur" }, // 打开弹窗时重置表单
{ min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" } userId.value = '';
] password.value = '';
} errorMsg.value = '';
}
}
); );
const yhdhRef = ref();
const open = () => {
checkShow.value = true;
nextTick(() => {
setTimeout(() => {
yhdhRef.value.focus();
}, 100);
});
};
const checkShow = ref(false);
const ruleFormRef = ref();
// 处理确认验证 // 处理确认验证
const handleConfirm = () => { const handleConfirm = () => {
ruleFormRef.value.validate((valid: boolean) => { // 基础验证
if (valid) { if (!userId.value) {
emit('onConfirm', { yhdh: ruleForm.value.yhdh, mm: ruleForm.value.mm }); errorMsg.value = '请输入用户工号';
checkShow.value = false; return;
} else { }
return false;
} if (!password.value) {
errorMsg.value = '请输入密码';
return;
}
// 应用外部传入的验证规则
if (userId.value.length < props.validationRules.userIdMinLength) {
errorMsg.value = `工号长度不能少于${props.validationRules.userIdMinLength}位`;
return;
}
if (password.value.length < props.validationRules.passwordMinLength) {
errorMsg.value = `密码长度不能少于${props.validationRules.passwordMinLength}位`;
return;
}
// 验证通过,返回用户工号
emit('onConfirm', {
userId: userId.value,
password: password.value
}); });
// 关闭弹窗
emit('update:visible', false);
}; };
// 处理取消
const handleCancel = () => { const handleCancel = () => {
checkShow.value = false; emit('onCancel');
ruleForm.value.yhdh = ''; emit('update:visible', false);
ruleForm.value.mm = '';
ruleFormRef.value.resetFields();
}; };
defineExpose({
open,
});
</script> </script>
<style scoped lang="scss"></style> <style scoped>
/* 遮罩层 */
.dialog-mask {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
z-index: 1000;
transition: opacity 0.3s;
}
/* 弹窗容器 */
.dialog-container {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1001;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
}
/* 弹窗主体 */
.dialog-box {
width: 100%;
max-width: 400px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
overflow: hidden;
}
/* 标题区域 */
.dialog-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 20px;
border-bottom: 1px solid #f0f0f0;
background-color: #f9fafb;
}
.dialog-title {
margin: 0;
font-size: 16px;
font-weight: 600;
color: #333;
}
.dialog-close {
padding: 0;
background: transparent;
border: none;
font-size: 20px;
color: #999;
cursor: pointer;
transition: color 0.2s;
}
.dialog-close:hover {
color: #333;
}
/* 内容区域 */
.dialog-body {
padding: 24px 20px;
}
.form-item {
margin-bottom: 16px;
}
.form-label {
display: block;
margin-bottom: 8px;
font-size: 14px;
color: #666;
}
.form-input {
width: 100%;
padding: 10px 12px;
border: 1px solid #dcdfe6;
border-radius: 4px;
font-size: 14px;
box-sizing: border-box;
transition: border-color 0.2s;
}
.form-input:focus {
outline: none;
border-color: #4096ff;
box-shadow: 0 0 0 2px rgba(64, 150, 255, 0.2);
}
.error-message {
margin: 8px 0 0;
color: #f56c6c;
font-size: 12px;
line-height: 1.5;
}
/* 按钮区域 */
.dialog-footer {
display: flex;
justify-content: flex-end;
padding: 12px 20px;
border-top: 1px solid #f0f0f0;
background-color: #f9fafb;
}
.btn {
padding: 8px 16px;
border-radius: 4px;
font-size: 14px;
cursor: pointer;
transition: all 0.2s;
}
.btn-cancel {
margin-right: 10px;
border: 1px solid #dcdfe6;
background-color: #fff;
color: #606266;
}
.btn-cancel:hover {
background-color: #f5f7fa;
border-color: #c0c4cc;
}
.btn-confirm {
border: 1px solid #4096ff;
background-color: #4096ff;
color: #fff;
}
.btn-confirm:hover {
background-color: #66b1ff;
border-color: #66b1ff;
}
.btn-confirm:disabled {
opacity: 0.6;
cursor: not-allowed;
background-color: #4096ff;
border-color: #4096ff;
}
</style>

View File

@ -76,13 +76,82 @@
<ProjectDetails ref="itemDictRef" :dialog-title="'选择检验项目'" :tableKey="tableKey" @select="handleItemSelect" /> <ProjectDetails ref="itemDictRef" :dialog-title="'选择检验项目'" :tableKey="tableKey" @select="handleItemSelect" />
<!-- 校验用户 --> <!-- 校验用户 -->
<CheckUser ref="checkUserRef" :title="checktitle" @onConfirm="handleCheckUserConfirm" /> <el-dialog v-model="checkShow" title="用户身份验证" width="500" :close-on-click-modal="false" :draggable="true"
<!-- 危急值结果上报 --> @close="resetForm">
<UploadWarning ref="uploadwarningRef" :warningMsgdata="warningMsgdata" :tableKey="tableKey" <el-form ref="ruleFormRef" style="max-width: 600px" :model="ruleForm" :rules="rules" label-width="auto">
@onupload="shHandleCheck" /> <el-form-item label="用户工号:" prop="yhdh">
<!-- 操作原因 --> <el-input v-model.trim="ruleForm.yhdh" placeholder="请输入用户工号" maxlength="20" @keyup.enter="submitForm" />
<Unconfirmlog ref="unconfirmlogRef" :reasonText="reasonText" :tableKey="tableKey" @onConfirm="unShHandle" /> </el-form-item>
<el-form-item label="密码:" prop="mm">
<el-input v-model.trim="ruleForm.mm" placeholder="请输入密码" type="mm" maxlength="20" show-password
@keyup.enter="submitForm" />
</el-form-item>
<el-form-item>
<div style="text-align: center; width: 100%;">
<el-button type="primary" @click="submitForm()"> 确认 </el-button>
<el-button @click="resetForm">取消</el-button>
</div>
</el-form-item>
</el-form>
</el-dialog>
<!-- 危急值结果上报 -->
<el-dialog v-model="showuploadwarning" title="危急值结果上报" width="500" :close-on-click-modal="false" :draggable="true"
@close="warningResetForm">
<div class="red-static-text">{{ warningMsgdata }}</div>
<el-form ref="warningFormRef" style="max-width: 600px" :model="warningForm" :rules="wrules" label-width="auto">
<el-form-item label="上报方式:" prop="uploadTp">
<el-radio-group v-model="warningForm.uploadTp" size="default">
<el-radio value="1">系统通知</el-radio>
<el-radio value="2">电话通知</el-radio>
</el-radio-group>
</el-form-item>
<template v-if="warningForm.uploadTp == 2">
<el-form-item label="电话通知人:" prop="userId">
<el-input v-model.trim="warningForm.userId" class="form-input" placeholder="请输入医生工号" @keyup.enter=" " />
</el-form-item>
<el-form-item label="联系电话:" prop="phone">
<el-input v-model="warningForm.phone" class="form-input" placeholder="请输入联系电话" @keyup.enter=" " />
</el-form-item>
</template>
<el-form-item>
<div style="text-align: center; width: 100%;">
<el-button type="primary" @click="handleWarningSuccess()"> 确认 </el-button>
<el-button @click="warningResetForm">取消</el-button>
</div>
</el-form-item>
</el-form>
</el-dialog>
<!-- 操作原因 -->
<el-dialog v-model="unCheckshow" title="操作原因" width="500" :close-on-click-modal="false" :draggable="true"
@close="unconfirmlogCancel">
<div class="dialog-body mb10">
<p class="reason-text mb5">{{ reasonText }} </p>
<el-form ref="uncheckFormRef" style="max-width: 600px" :model="uncheckForm" :rules="rules" label-width="auto">
<template v-if="tableKey.problemId == 4">
<el-input type="textarea" v-model="uncheckForm.reason" class="reason-input" placeholder="请输入操作原因..."
:rows="4"></el-input>
</template>
<template v-if="tableKey.problemId == 6">
<el-form-item label="用户工号:" prop="yhdh">
<el-input v-model.trim="uncheckForm.yhdh" placeholder="请输入用户工号" maxlength="20"
@keyup.enter="submitForm" />
</el-form-item>
<el-form-item label="密码:" prop="mm">
<el-input v-model.trim="uncheckForm.mm" placeholder="请输入密码" type="mm" maxlength="20" show-password
@keyup.enter="submitForm" />
</el-form-item>
</template>
</el-form>
</div>
<div style="text-align: center; width: 100%;">
<el-button type="primary" @click="unconfirmlogConfirm()"> 确认 </el-button>
<el-button @click="unconfirmlogCancel">取消</el-button>
</div>
</el-dialog>
<!-- 合并当前病人其他结果 --> <!-- 合并当前病人其他结果 -->
@ -192,6 +261,7 @@
</el-col> </el-col>
</el-row> </el-row>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
@ -210,9 +280,6 @@ import { classCom } from '@/utils/classCom'
import CustomTable from '@/components/elTable/index.vue' import CustomTable from '@/components/elTable/index.vue'
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import emitter from "@/utils/mitt"; import emitter from "@/utils/mitt";
import CheckUser from "./CheckUser.vue";
import Unconfirmlog from './unconfirmlog.vue';
import UploadWarning from "./uploadwarning.vue";
import { useCommonStore } from "@/store/modules/commonStore"; import { useCommonStore } from "@/store/modules/commonStore";
import ContextMenu from "@/components/contextMenu/index.vue"; import ContextMenu from "@/components/contextMenu/index.vue";
import ViewBackup from "./viewBackup.vue"; import ViewBackup from "./viewBackup.vue";
@ -718,12 +785,53 @@ const beforeEnter = (row) => {
lastResult.value = res.data || {} lastResult.value = res.data || {}
}) })
}; };
const warningForm = ref({
userId: '',
phone: '',
uploadTp: '1'
})
const uncheckForm = ref({
reason: '',
yhdh: '',
mm: '',
})
const wrules = ref({
userId: [{ required: true, message: "请输入用户工号", trigger: "blur" },
{ min: 3, max: 20, message: "长度在 3 到 20 个字符", trigger: "blur" }
],
phone: [{ required: true, message: "请输入联系电话", trigger: "blur" },
{ min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" }
]
})
const unCheckshow = ref(false);
const inputValue = ref('');
const reasonText = ref(''); const reasonText = ref('');
const warningMsgdata = ref(''); const warningMsgdata = ref('');
const showuploadwarning = ref(false);
const checkuserid = ref() const checkuserid = ref()
const checkShow = ref(false); const checkShow = ref(false);
const checktitle = ref(''); const ruleForm = ref({
const checkUserRef = ref(); yhdh: '',
mm: ''
});
const rules = ref(
{
yhdh: [{ required: true, message: "请输入用户工号", trigger: "blur" },
{ min: 3, max: 20, message: "长度在 3 到 20 个字符", trigger: "blur" }
],
mm: [{ required: true, message: "请输入密码", trigger: "blur" },
{ min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" }
]
}
);
const csjgRef = ref(); const csjgRef = ref();
@ -731,32 +839,9 @@ const itemDictRef = ref(); // DictInput组件引用
const tableRef = ref(); const tableRef = ref();
const runnextstepname = ref(-1)
const handleCheck = (checkType) => { const handleCheck = (checkType) => {
runnextstepname.value = checkType // yhdh = checkuserid.value
tableKey.value.problemId = 0;
// tableKey.value.yhdh = checkuserid.value
if (!tableKey.value.yhdh) {
checktitle.value = '审核人工号密码验证'
checkUserRef.value.open()
} else {
proceedCheck(checkType)
}
};
const handleCheckUserConfirm = (info) => {
checkuser({ yhdh: info.yhdh, mm: info.mm }).then(response => {
if (response.code == 0) {
emits('update:tableKey', {
...tableKey.value,
yhdh: info.yhdh
});
proceedCheck(runnextstepname.value)
}
})
}
const proceedCheck = (checkType) => {
switch (checkType) { switch (checkType) {
case 1: // 初审 case 1: // 初审
check1({ ...tableKey.value, yhdh: props.labPat.yhdh }).then(res => { check1({ ...tableKey.value, yhdh: props.labPat.yhdh }).then(res => {
@ -774,33 +859,89 @@ const proceedCheck = (checkType) => {
default: default:
break; break;
} }
} };
const uploadwarningRef = ref();
const shHandleCheck = () => { const shHandleCheck = () => {
check2({ ...props.tableKey, yhdh: props.labPat.yhdh }).then(res => { check2({ ...props.tableKey, yhdh: props.labPat.yhdh }).then(res => {
emits("changeStatus", props.labPat); emits("changeStatus", props.labPat);
if (res.code == "4" && res.problemId === 4) { if (res.code == "4" && res.problemId === 4) {
tableKey.value.problemId = res.problemId; tableKey.value.problemId = res.problemId;
warningMsgdata.value = res.msg; warningMsgdata.value = res.msg;
uploadwarningRef.value.open(); showuploadwarning.value = true;
} }
}) })
}; };
const warningFormRef = ref(null);
const warningResetForm = () => {
warningForm.value.userId = '';
warningForm.value.phone = '';
warningForm.value.uploadTp = '1';
warningFormRef.value.resetFields();
showuploadwarning.value = false;
};
// 处理危急值登记
const handleWarningSuccess = async () => {
if (warningForm.value.uploadTp == 2) {
const valid = await warningFormRef.value.validate().catch(() => { });
if (!valid) return false;
}
reglimit({ ...tableKey.value, qrr: warningForm.value.userId, tzfs: warningForm.value.uploadTp, phone: warningForm.value.phone }).then(response => {
showuploadwarning.value = false;
if (response.code == 0) {
shHandleCheck();
}
if (response.code == 4) {
ElMessageBox.confirm(response.msg, '系统提示', { confirmButtonText: '是', cancelButtonText: '否', type: 'warning' }).then(() => {
tableKey.value.problemId = tableKey.value.problemId + 1;
handleWarningSuccess();
}).catch(() => {
shHandleCheck();
});
}
})
};
const unconfirmlogRef = ref();
const unShHandle = () => { const unShHandle = () => {
uncheck2({ ...tableKey.value, yhdh: props.labPat.yhdh }).then(res => { uncheck2({ ...tableKey.value, yhdh: props.labPat.yhdh }).then(res => {
if (res.code == "4") { if (res.code == "4") {
tableKey.value.problemId = res.problemId; tableKey.value.problemId = res.problemId;
reasonText.value = res.msg; reasonText.value = res.msg;
unconfirmlogRef.value.open(); unCheckshow.value = true;
} }
emits("changeStatus", props.labPat); emits("changeStatus", props.labPat);
}) })
}; };
const uncheckFormRef = ref();
// 取消审核原因
const unconfirmlogConfirm = async () => {
if (tableKey.value.problemId == 4) {
if (!uncheckForm.value.inputValue) return ElMessage.warning("请输入操作原因")
} else if (tableKey.value.problemId == 6) {
const valid = await uncheckFormRef.value.validate().catch(() => { });
if (!valid) return false;
}
unconfirmlog({ ...tableKey.value, ...uncheckForm.value }).then(response => {
if (response.code == "0") {
unCheckshow.value = false;
unShHandle();
}
})
};
const unconfirmlogCancel = () => {
unCheckshow.value = false;
uncheckForm.value.reason = '';
uncheckForm.value.yhdh = '';
uncheckForm.value.mm = '';
uncheckFormRef.value.resetFields();
}
const ruleFormRef = ref(null); const ruleFormRef = ref(null);
@ -822,7 +963,12 @@ const submitForm = () => {
} }
const resetForm = () => {
checkShow.value = false;
ruleForm.value.userId = '';
ruleForm.value.mm = '';
ruleFormRef.value.resetFields();
};
// 2. 打开项目选择弹窗 // 2. 打开项目选择弹窗
const openItemDictDialog = () => { const openItemDictDialog = () => {
itemDictRef.value.openDictSelector(); itemDictRef.value.openDictSelector();
@ -876,8 +1022,7 @@ const addRowFromDict = async (rowData) => {
const emits = defineEmits([ const emits = defineEmits([
'fetchLabResults', 'fetchLabResults',
'changeStatus', 'changeStatus',
'previewHandle', 'previewHandle'
'update:tableKey'
]); ]);
const csjgTableData = ref([]); const csjgTableData = ref([]);

View File

@ -1,113 +1,186 @@
<template> <template>
<div> <!-- 遮罩层 -->
<el-dialog v-model="unCheckshow" title="操作原因" width="500" :close-on-click-modal="false" :draggable="true" <div
@close="unconfirmlogCancel"> v-if="visible"
<div class="dialog-body mb10"> class="dialog-mask"
<p class="reason-text mb5">{{ reasonText }} </p> @click="handleMaskClick"
<el-form ref="uncheckFormRef" style="max-width: 600px" :model="uncheckForm" :rules="rules" label-width="auto"> ></div>
<template v-if="tableKey.problemId == 4">
<el-input type="textarea" v-model="uncheckForm.reason" class="reason-input" placeholder="请输入操作原因..." <!-- 弹窗主体 -->
:rows="4"></el-input> <div
</template> v-if="visible"
<template v-if="tableKey.problemId == 6"> class="dialog-wrapper"
<el-form-item label="用户工号:" prop="yhdh"> >
<el-input v-model.trim="uncheckForm.yhdh" placeholder="请输入用户工号" maxlength="20" <div class="dialog-container">
@keyup.enter="unconfirmlogConfirm" /> <!-- 标题 -->
</el-form-item> <div class="dialog-header">
<el-form-item label="密码:" prop="mm"> <h3>操作原因</h3>
<el-input v-model.trim="uncheckForm.mm" placeholder="请输入密码" type="mm" maxlength="20" show-password <button class="close-btn" @click="handleCancel">×</button>
@keyup.enter="unconfirmlogConfirm" />
</el-form-item>
</template>
</el-form>
</div> </div>
<div style="text-align: center; width: 100%;"> <!-- 内容区 -->
<el-button type="primary" @click="unconfirmlogConfirm()"> 确认 </el-button> <div class="dialog-body">
<el-button @click="unconfirmlogCancel">取消</el-button> <p class="reason-text">{{ reasonText }}</p>
<textarea
v-model="inputValue"
class="reason-input"
placeholder="请输入操作原因..."
rows="4"
></textarea>
</div> </div>
</el-dialog>
<!-- 按钮区 -->
<div class="dialog-footer">
<button class="btn cancel" @click="handleCancel">取消</button>
<button class="btn confirm" @click="handleConfirm">确认</button>
</div>
</div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup>
import { ElMessage } from 'element-plus'; import { defineProps, defineEmits, ref } from 'vue';
import { unconfirmlog } from "@/api/liswork/work/LisWork";
// 组件属性 // 组件属性
const props = defineProps({ const props = defineProps({
visible: {
type: Boolean,
default: false
},
reasonText: { reasonText: {
type: String, type: String,
default: '请填写操作原因' default: '请填写操作原因'
},
tableKey: {
type: Object,
required: true
} }
}); });
const { tableKey } = toRefs(props);
// 组件事件 // 组件事件
const emit = defineEmits(['onConfirm']); const emit = defineEmits(['update:visible', 'onConfirm', 'onCancel']);
const uncheckForm = ref({
reason: '',
yhdh: '',
mm: '',
})
const rules = ref({
yhdh: [{ required: true, message: "请输入用户工号", trigger: "blur" },
{ min: 3, max: 20, message: "长度在 3 到 20 个字符", trigger: "blur" }
],
mm: [{ required: true, message: "请输入联系电话", trigger: "blur" },
{ min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" }
]
})
// 输入框内容 // 输入框内容
const inputValue = ref(''); const inputValue = ref('');
const unCheckshow = ref(false);
const open = () => { // 确认按钮点击
unCheckshow.value = true; const handleConfirm = () => {
emit('onConfirm', inputValue.value); // 传递输入值
emit('update:visible', false);
inputValue.value = ''; // 重置输入
}; };
// 取消按钮点击
const uncheckFormRef = ref(); const handleCancel = () => {
// 取消审核原因 emit('onCancel');
const unconfirmlogConfirm = async () => { emit('update:visible', false);
if (tableKey.value.problemId == 4) { inputValue.value = ''; // 重置输入
if (!uncheckForm.value.reason) return ElMessage.warning("请输入操作原因")
} else if (tableKey.value.problemId == 6) {
const valid = await uncheckFormRef.value.validate().catch(() => { });
if (!valid) return false;
}
unconfirmlog({ ...tableKey.value, ...uncheckForm.value }).then((response: any) => {
if (response.code == "0") {
emit('onConfirm');
unCheckshow.value = false;
}
})
}; };
const unconfirmlogCancel = () => { // 遮罩层点击
unCheckshow.value = false; const handleMaskClick = () => {
uncheckForm.value.reason = ''; handleCancel();
uncheckForm.value.yhdh = ''; };
uncheckForm.value.mm = '';
uncheckFormRef.value.resetFields();
}
defineExpose({
open,
});
</script> </script>
<style scoped></style> <style scoped>
/* 基础样式与之前保持一致,确保按钮边框和输入框正常 */
.dialog-mask {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 1000;
}
.dialog-wrapper {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1001;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
}
.dialog-container {
width: 100%;
max-width: 500px;
background: #fff;
border: 1px solid #ddd;
border-radius: 8px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
}
.dialog-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px 20px;
border-bottom: 1px solid #eee;
}
.dialog-header h3 {
margin: 0;
font-size: 16px;
color: #333;
}
.close-btn {
background: none;
border: none;
font-size: 20px;
color: #999;
cursor: pointer;
}
.dialog-body {
padding: 20px;
}
.reason-text {
margin: 0 0 15px 0;
color: #666;
}
.reason-input {
width: 100%;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px;
resize: vertical;
box-sizing: border-box;
}
.reason-input:focus {
outline: none;
border-color: #4096ff;
}
.dialog-footer {
padding: 15px 20px;
border-top: 1px solid #eee;
text-align: right;
}
.btn {
padding: 6px 16px;
border-radius: 4px;
font-size: 14px;
cursor: pointer;
}
.cancel {
margin-right: 10px;
border: 1px solid #ddd;
background: #fff;
color: #666;
}
.confirm {
border: 1px solid #4096ff;
background: #4096ff;
color: #fff;
}
</style>

View File

@ -1,113 +1,179 @@
<template> <template>
<div> <!-- 遮罩层 -->
<el-dialog v-model="showuploadwarning" title="危急值结果上报" width="500" :close-on-click-modal="false" :draggable="true" <div
@close="warningResetForm"> v-if="visible"
<div class="red-static-text">{{ warningMsgdata }}</div> class="dialog-mask"
<el-form ref="warningFormRef" style="max-width: 600px" :model="warningForm" :rules="wrules" label-width="auto"> @click="handleCancel"
<el-form-item label="上报方式:" prop="uploadTp"> ></div>
<el-radio-group v-model="warningForm.uploadTp" size="default">
<el-radio value="1">系统通知</el-radio>
<el-radio value="2">电话通知</el-radio>
</el-radio-group>
</el-form-item>
<template v-if="warningForm.uploadTp == '2'">
<el-form-item label="电话通知人:" prop="userId">
<el-input v-model.trim="warningForm.userId" class="form-input" placeholder="请输入医生工号" @keyup.enter=" " />
</el-form-item>
<el-form-item label="联系电话:" prop="phone">
<el-input v-model="warningForm.phone" class="form-input" placeholder="请输入联系电话" @keyup.enter=" " />
</el-form-item>
</template>
<el-form-item> <!-- 弹窗主体 -->
<div style="text-align: center; width: 100%;"> <div
<el-button type="primary" @click="handleWarningSuccess()"> 确认 </el-button> v-if="visible"
<el-button @click="warningResetForm">取消</el-button> class="dialog-container"
</div> >
</el-form-item> <div class="dialog-box">
</el-form> <!-- 标题区域 -->
</el-dialog> <div class="dialog-header">
<h3 class="dialog-title">危急值结果上报</h3>
<button
class="dialog-close"
@click="handleCancel"
aria-label="关闭"
>
<span>×</span>
</button>
</div>
<!-- 内容区域 -->
<div class="dialog-body">
<div class="red-static-text">{{ msgdata }}</div>
<el-col :span="1">
<el-form-item label="上报方式" prop="uploadTp">
<el-radio-group v-model="uploadTp" size="default">
<el-radio v-for="(item, index) in uploadtypeptions" :key="index" :label="item.value"
:disabled="item.disabled">{{item.label}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<div class="form-item" v-if="uploadTp === 2">
<label class="form-label">电话通知人</label>
<input
type="text"
v-model.trim="userId"
class="form-input"
placeholder="请输入医生工号"
@keyup.enter="handleupload"
>
</div>
<div class="form-item" v-if="uploadTp === 2">
<label class="form-label">联系电话</label>
<input
type="text"
v-model="phone"
class="form-input"
placeholder="请输入联系电话"
@keyup.enter="handleupload"
>
</div>
<!-- 错误提示 -->
<p v-if="errorMsg" class="error-message">{{ errorMsg }}</p>
</div>
<!-- 按钮区域 -->
<div class="dialog-footer">
<button
class="btn btn-cancel"
@click="handleCancel"
>
取消
</button>
<button
class="btn btn-upload"
@click="handleupload"
:disabled="isSubmitDisabled"
>
确认上报
</button>
</div>
</div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup>
import { reglimit } from "@/api/liswork/work/LisWork"; import { defineProps, defineEmits, ref, watch } from 'vue';
import { ElMessageBox } from "element-plus"; const uploadtypeptions = ref([{
"label": "系统通知",
"value": 1
}, {
"label": "电话通知",
"value": 2
}])
// 组件属性 // 组件属性
const props = defineProps({ const props = defineProps({
tableKey: { // 控制弹窗显示/隐藏
type: Object, visible: {
required: true type: Boolean,
default: false
}, },
// 弹窗内容
warningMsgdata: { msgdata: {
type: String, type: String,
default: '' default: ''
},
// 显示规则
showRules: {
type: Number,
default:1
} }
}); });
const { tableKey, warningMsgdata } = toRefs(props);
// 组件事件 // 组件事件
const emits = defineEmits(['onupload',]); const emit = defineEmits([
const showuploadwarning = ref(false); 'update:visible', // 控制弹窗显示状态
'onupload', // 验证成功回调
'onCancel' // 取消验证回调
]);
// 表单数据
const uploadTp = ref('1');
const userId = ref('');
const phone = ref('');
const errorMsg = ref('');
// 监听弹窗显示状态,重置表单
const warningForm = ref({ watch(
userId: '', () => props.visible,
phone: '', (newVal) => {
uploadTp: '1' if (newVal) {
}) // 打开弹窗时重置表单
uploadTp.value = 1; // 打开弹窗时默认选中1
const wrules = ref({ userId.value = '';
userId: [{ required: true, message: "请输入用户工号", trigger: "blur" }, phone.value = '';
{ min: 3, max: 20, message: "长度在 3 到 20 个字符", trigger: "blur" } errorMsg.value = '';
], }
phone: [{ required: true, message: "请输入联系电话", trigger: "blur" }, }
{ min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" } );
] const isSubmitDisabled = computed(() => {
}) // 系统通知(1):无需其他字段,直接可提交
const open = () => { if (uploadTp.value === 1) {
showuploadwarning.value = true; return false;
}
const warningFormRef = ref();
const warningResetForm = () => {
warningForm.value.userId = '';
warningForm.value.phone = '';
warningForm.value.uploadTp = '1';
warningFormRef.value.resetFields();
showuploadwarning.value = false;
};
// 处理危急值登记
const handleWarningSuccess = async () => {
if (warningForm.value.uploadTp == '2') {
const valid = await warningFormRef.value.validate().catch(() => { });
if (!valid) return false;
} }
reglimit({ ...tableKey.value, qrr: warningForm.value.userId, tzfs: warningForm.value.uploadTp, phone: warningForm.value.phone }).then((response: any) => { // 电话通知(2):需填写通知人和电话
showuploadwarning.value = false; return !userId.value || !phone.value;
if (response.code == 0) { });
emits('onupload'); // 处理确认验证
const handleupload = () => {
errorMsg.value = ''; // 清空之前的错误提示
// 基础验证
if(uploadTp.value===2) {
if (!userId.value) {
errorMsg.value = '请输入用户工号';
return;
} }
if (response.code == 4) { if(props.showRules===3) {
ElMessageBox.confirm(response.msg, '系统提示', { confirmButtonText: '是', cancelButtonText: '否', type: 'warning' }).then(() => { if (!phone.value) {
tableKey.value.problemId = tableKey.value.problemId + 1; errorMsg.value = '请输入电话';
handleWarningSuccess(); return;
}).catch(() => { }
emits('onupload');
});
} }
}) }
// 验证通过,返回用户工号
emit('onupload', {
userId: userId.value,
phone: phone.value,
uploadTp:uploadTp.value
});
// 关闭弹窗
emit('update:visible', false);
}; };
defineExpose({ // 处理取消
open const handleCancel = () => {
}); emit('onCancel');
emit('update:visible', false);
};
</script> </script>
<style scoped> <style scoped>
@ -263,14 +329,10 @@ defineExpose({
background-color: #4096ff; background-color: #4096ff;
border-color: #4096ff; border-color: #4096ff;
} }
.red-static-text { .red-static-text {
color: red; color: red; /* 字体颜色设为红色 */
/* 字体颜色设为红色 */ white-space: pre-wrap; /* 保留空格和换行(可选,配合 pre 标签或手动换行时使用) */
white-space: pre-wrap; line-height: 1.6; /* 行高,增强多行可读性 */
/* 保留空格和换行(可选,配合 pre 标签或手动换行时使用) */
line-height: 1.6;
/* 行高,增强多行可读性 */
/* 可选:添加其他样式 */ /* 可选:添加其他样式 */
font-size: 14px; font-size: 14px;
margin: 10px 0; margin: 10px 0;

View File

@ -7,21 +7,9 @@
class="compact-form"> class="compact-form">
<el-row :gutter="5"> <el-row :gutter="5">
<el-col :span="6"> <el-col :span="6">
<el-form-item label="" prop="ybh"> <el-form-item label="样本号:" prop="ybh">
<div class="next_box"> <el-input v-model="queryParams.ybh" placeholder="样本编号" @keyup.enter="handleQuery"
<div class="jtIcon" @click="handlePrev"> style="width:100%" />
<el-icon>
<ArrowUpBold />
</el-icon>
</div>
<el-input v-model="queryParams.ybh" placeholder="样本编号" @keyup.enter="handleQuery"
style="width:100%" />
<div class="jtIcon" @click="handleNext">
<el-icon>
<ArrowDownBold />
</el-icon>
</div>
</div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@ -64,9 +52,8 @@
</el-col> </el-col>
<el-col :span="16"> <el-col :span="16">
<LabResult ref="labResultRef" :labPat="labPat" :tableData="labResuts" :tableKey="queryParams" <LabResult ref="labResultRef" :labPat="labPat" :tableData="labResuts" :tableKey="queryParams"
@update:tableKey="queryParams = $event" :userList="userList" :resultSysList="resultConfig" :userList="userList" :resultSysList="resultConfig" @fetchLabResults="resultsHandle" :dictData="dictData"
@fetchLabResults="resultsHandle" :dictData="dictData" @changeStatus="changeStatus" @changeStatus="changeStatus" @previewHandle="previewHandle" />
@previewHandle="previewHandle" />
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
@ -164,7 +151,6 @@ const queryParams = ref({
instrGroup: '02', instrGroup: '02',
problemId: 0, problemId: 0,
days: 0, days: 0,
yhdh: ''
}) })
const ybs = ref(0) const ybs = ref(0)
const ws = ref(0) const ws = ref(0)
@ -665,7 +651,8 @@ onMounted(async () => {
const initSocket = () => { const initSocket = () => {
initWebSocket({ initWebSocket({
fullUrl: `ws://47.97.125.165:8904/ws/instr/${mbStore.fingerprint}`, // fullUrl: `ws://47.97.125.165:8904/ws/instr/${mbStore.fingerprint}`,
fullUrl: `ws://192.168.1.151:9801/ws/instr/${mbStore.fingerprint}`,
onOpen: () => { onOpen: () => {
console.log('WebSocket连接成功'); console.log('WebSocket连接成功');
}, },