版本更新
This commit is contained in:
@@ -0,0 +1,919 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<div class="left">
|
||||
<div class="form">
|
||||
<el-form
|
||||
:model="queryParams"
|
||||
ref="queryRef"
|
||||
:inline="true"
|
||||
v-show="showSearch"
|
||||
label-position="right"
|
||||
style="min-width: 500px"
|
||||
>
|
||||
<el-form-item label="患者信息" prop="condition">
|
||||
<el-input
|
||||
v-model="queryParams.condition"
|
||||
placeholder="请输入姓名/证件号"
|
||||
clearable
|
||||
style="width: 160px"
|
||||
@keyup.enter="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="发药状态" prop="departmentId" style="margin-left: 10px">
|
||||
<el-select
|
||||
v-model="queryParams.statusEnum"
|
||||
placeholder="请选择发药状态"
|
||||
clearable
|
||||
style="width: 160px"
|
||||
@change="handleQuery"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in dispenseStatusOptions"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="就诊日期">
|
||||
<el-date-picker
|
||||
v-model="dateRange"
|
||||
type="daterange"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
style="width: 250px"
|
||||
value-format="YYYY-MM-DD"
|
||||
@change="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="科室" prop="departmentId">
|
||||
<el-select
|
||||
v-model="queryParams.departmentId"
|
||||
placeholder="请选择科室"
|
||||
clearable
|
||||
style="width: 160px"
|
||||
@change="handleQuery"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in departmentList"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item> -->
|
||||
<el-form-item style="margin-left: 15px">
|
||||
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
||||
<el-button @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
<el-table
|
||||
:data="patientList"
|
||||
border
|
||||
style="width: 100%; height: 60vh"
|
||||
highlight-current-row
|
||||
@row-click="handleCurrentChange"
|
||||
>
|
||||
<el-table-column prop="patientName" label="姓名" width="130" align="center" />
|
||||
<el-table-column prop="genderEnum_enumText" label="性别" width="80" align="center" />
|
||||
<el-table-column prop="receptionTime" label="就诊日期" align="center">
|
||||
<template #default="scope">
|
||||
{{ scope.row.receptionTime ? formatDate(scope.row.receptionTime) : '-' }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination
|
||||
v-show="total > 0"
|
||||
:total="total"
|
||||
v-model:page="queryParams.pageNo"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="right">
|
||||
<!-- <div class="select_wrapper_div">
|
||||
<p style="margin-right: 60px; font-size: 19px">患者基本信息</p> -->
|
||||
|
||||
<!-- <el-button type="success" plain @click="print" icon="Printer" style="margin-left: 30px;">打印</el-button> -->
|
||||
<!-- </div> -->
|
||||
<div class="top">
|
||||
<el-descriptions :column="4" title="患者基本信息">
|
||||
<el-descriptions-item label="姓名:">{{ personInfo.patientName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="性别:">
|
||||
{{ personInfo.genderEnum_enumText }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="年龄:">{{ personInfo.age }}</el-descriptions-item>
|
||||
<el-descriptions-item label="合同类型:">
|
||||
{{ personInfo.categoryEnum_enumText }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="就诊科室:">
|
||||
{{ personInfo.organizationName }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="就诊日期:">
|
||||
{{ personInfo.encounterDate }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="证件号:">{{ personInfo.idCard }}</el-descriptions-item>
|
||||
<el-descriptions-item label="总金额:">
|
||||
{{ personInfo.totalPrice ? personInfo.totalPrice.toFixed(2) : '0.00' }}元
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<!-- <el-row>
|
||||
<el-col :span="4">姓名:{{ personInfo.patientName }}</el-col>
|
||||
<el-col :span="3">性别:{{ personInfo.genderEnum_enumText }}</el-col>
|
||||
<el-col :span="3">年龄:{{ personInfo.age }}</el-col>
|
||||
<el-col :span="5">合同类型:{{ personInfo.categoryEnum_enumText }}</el-col> </el-row
|
||||
><br />
|
||||
<el-row>
|
||||
<el-col :span="5">就诊科室:{{ personInfo.organizationName }}</el-col>
|
||||
<el-col :span="5">就诊日期:{{ personInfo.encounterDate }}</el-col>
|
||||
<el-col :span="7">证件号:{{ personInfo.idCard }}</el-col>
|
||||
|
||||
</el-row
|
||||
><br />
|
||||
<el-row>
|
||||
<el-col :span="4"
|
||||
>总金额:{{
|
||||
personInfo.totalPrice ? personInfo.totalPrice.toFixed(2) : '0.00'
|
||||
}}元</el-col
|
||||
>
|
||||
</el-row> -->
|
||||
<span style="color: #606266; font-size: 14px; font-weight: 700; margin-right: 15px">
|
||||
调配药师
|
||||
</span>
|
||||
<el-select v-model="preparerDoctor" placeholder="调配药师" style="width: 160px">
|
||||
<el-option
|
||||
v-for="item in preparerDoctorOptions"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
<span style="color: #606266; font-size: 14px; font-weight: 700; margin-right: 15px">
|
||||
药品分类
|
||||
</span>
|
||||
<el-select
|
||||
v-model="tcmFlag"
|
||||
placeholder="药品分类"
|
||||
style="width: 160px"
|
||||
@change="
|
||||
() => {
|
||||
if (currentRow.encounterId) {
|
||||
getMedicineList(currentRow.encounterId);
|
||||
}
|
||||
}
|
||||
"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in medCategoryCode"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
<el-button
|
||||
:disabled="medicineInfoList && medicineInfoList.length == 0"
|
||||
type="primary"
|
||||
@click="handleBatch()"
|
||||
style="margin-left: 30px"
|
||||
>
|
||||
批量发药
|
||||
</el-button>
|
||||
<el-button type="primary" @click="handleScan()" style="margin-left: 30px"> 扫码 </el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="printPrescription()"
|
||||
style="margin-left: 30px"
|
||||
>
|
||||
处方打印
|
||||
</el-button>
|
||||
</div>
|
||||
<el-table
|
||||
:data="medicineInfoList"
|
||||
border
|
||||
style="width: 100%; height: 65vh; margin-top: 10px"
|
||||
:row-style="rowStyle"
|
||||
:span-method="spanMethod"
|
||||
@select="handleSelectionChange"
|
||||
ref="tableRef"
|
||||
>
|
||||
<el-table-column type="selection" width="55" align="center" fixed="left" />
|
||||
<el-table-column prop="prescriptionNo" label="处方号" width="140" align="center" />
|
||||
<el-table-column prop="medicineName" label="药品名称" width="180" align="center" />
|
||||
<el-table-column prop="statusEnum_enumText" label="发药状态" width="100" align="center">
|
||||
<template #default="scope">
|
||||
<el-tag :type="tagType(scope.row.statusEnum)">
|
||||
{{ scope.row.statusEnum_enumText }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="quantity" label="发药数量" width="100" align="center">
|
||||
<template #default="scope">
|
||||
{{ scope.row.quantity }}{{ scope.row.unitCode_dictText }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- <el-table-column prop="flag" label="组合" width="60" align="center" /> -->
|
||||
<!-- <el-table-column prop="quantity" label="发药数量" width="100" align="center" /> -->
|
||||
<el-table-column prop="totalVolume" label="规格" width="100" align="center" />
|
||||
<!-- <el-table-column prop="unitCode_dictText" label="单位" width="100" align="center" /> -->
|
||||
<el-table-column
|
||||
prop="doseUnitCode_dictText"
|
||||
label="单次剂量"
|
||||
width="100"
|
||||
align="center"
|
||||
v-if="tcmFlag == '0'"
|
||||
>
|
||||
<template #default="scope">
|
||||
{{ scope.row.dose }}{{ scope.row.doseUnitCode_dictText }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="traceNo"
|
||||
label="追溯码"
|
||||
width="180"
|
||||
align="center"
|
||||
v-if="tcmFlag == '0'"
|
||||
>
|
||||
<template #default="scope">
|
||||
<el-tooltip
|
||||
:content="formatContent(scope.row.traceNo)"
|
||||
placement="top"
|
||||
popper-class="custom-tooltip"
|
||||
>
|
||||
<el-input
|
||||
:ref="'traceNoRef' + scope.$index"
|
||||
@input="handleTraceNoInput(scope.row, scope.$index)"
|
||||
v-model="scope.row.traceNo"
|
||||
placeholder="请输入追溯码"
|
||||
/>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="lotNumber" label="批次号" width="120" align="center" />
|
||||
<el-table-column
|
||||
prop="totalPrice"
|
||||
label="金额"
|
||||
width="100"
|
||||
:formatter="formatPrice"
|
||||
align="right"
|
||||
header-align="center"
|
||||
/>
|
||||
<el-table-column prop="departmentName" label="科室" width="90" align="center" />
|
||||
<el-table-column prop="doctorName" label="开单医生" width="100" align="center" />
|
||||
<el-table-column prop="conditionName" label="诊断" width="120" align="center" />
|
||||
<!-- <el-table-column prop="dose" label="剂量" width="100" align="center" /> -->
|
||||
<el-table-column prop="rateCode" label="频次" width="100" align="center" />
|
||||
<el-table-column prop="methodCode_dictText" label="用法" width="100" align="center" />
|
||||
<el-table-column prop="dispensePerDuration" label="天数" width="80" align="center" />
|
||||
<el-table-column
|
||||
label="操作"
|
||||
align="center"
|
||||
width="160"
|
||||
fixed="right"
|
||||
class-name="small-padding fixed-width"
|
||||
>
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
link
|
||||
type="primary"
|
||||
:disabled="scope.row.statusEnum != 2"
|
||||
icon="SuccessFilled"
|
||||
@click="handleBatch(scope.row)"
|
||||
>
|
||||
发药
|
||||
</el-button>
|
||||
<el-button
|
||||
link
|
||||
type="primary"
|
||||
:disabled="scope.row.statusEnum != 2"
|
||||
@click="backMedicine(scope.row)"
|
||||
icon="CircleClose"
|
||||
>
|
||||
作废
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- <el-table-column prop="performOrg_dictText" label="是否拆零" width="120">
|
||||
<template #default="scope">
|
||||
<el-select v-model="scope.row.performOrg_dictText" placeholder="请选择"
|
||||
@change="handleSelectChange(scope.row)">
|
||||
<el-option v-for="option in options" :key="option.value" :label="option.label"
|
||||
:value="option.value"></el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
<!-- <el-table-column prop="medicationStatusEnum_enumText" label="追溯码" width="100" /> -->
|
||||
<!-- <el-table-column
|
||||
prop="unitPrice"
|
||||
label="单价"
|
||||
width="100"
|
||||
:formatter="formatPrice"
|
||||
align="right"
|
||||
header-align="center"
|
||||
/> -->
|
||||
</el-table>
|
||||
</div>
|
||||
<el-dialog title="选择作废原因" v-model="showDialog" width="30%">
|
||||
<!-- 下拉选择框 -->
|
||||
<el-select v-model="notPerformedReasonEnum" placeholder="请选择作废原因">
|
||||
<el-option
|
||||
v-for="item in backReason"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
|
||||
<!-- 弹窗底部按钮 -->
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button type="primary" @click="handleConfirm">确 定</el-button>
|
||||
<el-button @click="handleCancel">取 消</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<TraceNoDialog
|
||||
:ypName="ypName"
|
||||
:openDialog="openTraceNoDialog"
|
||||
@submit="submit"
|
||||
@cancel="openTraceNoDialog = false"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup name="westernmedicine">
|
||||
import { ref, computed, onMounted, onBeforeMount } from 'vue';
|
||||
import { ElMessage } from 'element-plus';
|
||||
import {
|
||||
listWesternmedicine,
|
||||
listPatient,
|
||||
updateMedicion,
|
||||
listInit,
|
||||
backMedicion,
|
||||
prepareMedicion,
|
||||
itemTraceNo,
|
||||
} from './components/api';
|
||||
import { formatDate, formatDateStr } from '@/utils/index';
|
||||
import { debounce } from 'lodash-es';
|
||||
import TraceNoDialog from '@/components/OpenHis/TraceNoDialog/index.vue';
|
||||
import { hiprint } from 'vue-plugin-hiprint';
|
||||
import templateJson from './components/templateJson.json';
|
||||
|
||||
const showSearch = ref(true);
|
||||
const total = ref(0);
|
||||
const markers = ref([]);
|
||||
const patientList = ref([]);
|
||||
const medicineInfoList = ref([]);
|
||||
const departmentList = ref([]);
|
||||
const dateRange = ref([]);
|
||||
const personInfo = ref([]);
|
||||
const dispenseStatusOptions = ref([]);
|
||||
const preparerDoctorOptions = ref([]);
|
||||
const diagnoses = ref('');
|
||||
const preparerDoctor = ref();
|
||||
const backReason = ref([]);
|
||||
const selectedPrescriptionNo = ref('');
|
||||
const showDialog = ref(false);
|
||||
const notPerformedReasonEnum = ref();
|
||||
const currentRow = ref(null);
|
||||
const tableRef = ref(null);
|
||||
const selectedGroupIds = ref(new Set());
|
||||
const selectedItems = ref(new Set());
|
||||
const traceNoList = ref([]);
|
||||
const traceNo = ref('');
|
||||
const traceNoTemp = ref('');
|
||||
const tcmFlag = ref('0');
|
||||
const openTraceNo = ref(false);
|
||||
const isManualSelection = ref(false);
|
||||
const groups = ref({});
|
||||
const openTraceNoDialog = ref(false);
|
||||
const ypName = ref('');
|
||||
|
||||
const { proxy } = getCurrentInstance();
|
||||
const medCategoryCode = ref([
|
||||
{
|
||||
label: '西药中成药',
|
||||
value: '0',
|
||||
},
|
||||
{
|
||||
label: '中药',
|
||||
value: '1',
|
||||
},
|
||||
]);
|
||||
|
||||
const data = reactive({
|
||||
form: {},
|
||||
queryParams: {
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
condition: null,
|
||||
departmentId: null,
|
||||
statusEnum: 3,
|
||||
},
|
||||
});
|
||||
const { queryParams } = toRefs(data);
|
||||
|
||||
// 在组件挂载后调用 getList
|
||||
onMounted(() => {
|
||||
setDefaultDateRange();
|
||||
getList();
|
||||
});
|
||||
function handleScan() {
|
||||
openTraceNoDialog.value = true;
|
||||
}
|
||||
function submit(value) {
|
||||
let list = [];
|
||||
if (value) {
|
||||
list = value.split(',');
|
||||
}
|
||||
itemTraceNo(list).then((res) => {
|
||||
if (res.code === 200) {
|
||||
if (!res.data) {
|
||||
proxy.$modal.msgWarning('未在库存中匹配到追溯码,请在发药列表中单独扫描');
|
||||
openTraceNoDialog.value = false;
|
||||
proxy.$refs['traceNoRef0'].focus();
|
||||
return;
|
||||
}
|
||||
medicineInfoList.value.forEach((item, index) => {
|
||||
if (res.data[item.medicineId] && res.data[item.medicineId].split(',') > item.quantity) {
|
||||
proxy.$modal.msgWarning('操作失败');
|
||||
return;
|
||||
}
|
||||
medicineInfoList.value[index].traceNo = res.data[item.medicineId];
|
||||
});
|
||||
openTraceNoDialog.value = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
// 设置默认日期范围为当天
|
||||
function setDefaultDateRange() {
|
||||
const today = new Date();
|
||||
const year = today.getFullYear();
|
||||
const month = String(today.getMonth() + 1).padStart(2, '0');
|
||||
const day = String(today.getDate()).padStart(2, '0');
|
||||
const formattedDate = `${year}-${month}-${day}`;
|
||||
dateRange.value = [formattedDate, formattedDate];
|
||||
console.log('222', dateRange.value);
|
||||
}
|
||||
|
||||
function getList() {
|
||||
console.log('224555552', dateRange.value);
|
||||
queryParams.value.receptionTimeSTime = dateRange.value[0] + ' 00:00:00';
|
||||
queryParams.value.receptionTimeETime = dateRange.value[1] + ' 23:59:59';
|
||||
|
||||
console.log('222', queryParams.value);
|
||||
listPatient(queryParams.value).then((response) => {
|
||||
console.log('Full response1:', response);
|
||||
patientList.value = response.data.records;
|
||||
total.value = response.data.total;
|
||||
});
|
||||
listInit().then((response) => {
|
||||
console.log('Full response2:', response);
|
||||
departmentList.value = [{ value: null, label: '全部' }, ...response.data.departmentOptions];
|
||||
backReason.value = response.data.notPerformedReasonOptions;
|
||||
dispenseStatusOptions.value = response.data.dispenseStatusOptions;
|
||||
preparerDoctorOptions.value = response.data.preparerDoctorOptions;
|
||||
preparerDoctor.value = preparerDoctorOptions.value[1].value;
|
||||
});
|
||||
}
|
||||
//打印中西药处方
|
||||
async function printPrescription() {
|
||||
const selectedRows = tableRef.value.getSelectionRows();
|
||||
if (selectedRows.length === 0) {
|
||||
proxy.$modal.msgWarning('未选择要打印的项目,请重新选择,打印失败');
|
||||
return;
|
||||
}
|
||||
console.log(selectedRows, personInfo, 'selectedRows');
|
||||
// 计算总价
|
||||
// const result = {
|
||||
// data: selectedRows.map((item) => ({
|
||||
// ...item,
|
||||
// patientName: personInfo.value.patientName,
|
||||
// genderEnum_enumText: personInfo.value.genderEnum_enumText,
|
||||
// age: personInfo.value.age,
|
||||
// phone: personInfo.value.phone,
|
||||
// hospitalName: personInfo.value.hospitalName,
|
||||
// patientBusNo: personInfo.value.patientBusNo,
|
||||
// quantity: item.quantity,
|
||||
// unitCode_dictText: item.unitCode_dictText,
|
||||
// organizationName: personInfo.value.organizationName,
|
||||
// })),
|
||||
// };
|
||||
// 按 prescriptionNo 分组
|
||||
const groupedRows = {};
|
||||
selectedRows.forEach(row => {
|
||||
const prescriptionNo = row.prescriptionNo;
|
||||
if (!groupedRows[prescriptionNo]) {
|
||||
groupedRows[prescriptionNo] = [];
|
||||
}
|
||||
groupedRows[prescriptionNo].push(row);
|
||||
});
|
||||
|
||||
console.log('按处方号分组的结果:', groupedRows);
|
||||
|
||||
// 如果您需要将分组后的数据转换为数组形式
|
||||
const groupedArray = Object.values(groupedRows);
|
||||
console.log('分组后的数组形式:', groupedArray);
|
||||
|
||||
const result = [];
|
||||
groupedArray.forEach((item, index) => {
|
||||
result.push({
|
||||
...personInfo.value,
|
||||
prescriptionNo: item[0].prescriptionNo,
|
||||
reqAuthoredTime: item[0].reqAuthoredTime,
|
||||
prescriptionList: item,
|
||||
})
|
||||
})
|
||||
|
||||
// 将对象转换为 JSON 字符串
|
||||
// let jsonString = JSON.stringify(result, null, 2);
|
||||
console.log(result, 'result');
|
||||
// 模板对象获取
|
||||
|
||||
const printElements = templateJson;
|
||||
var hiprintTemplate = new hiprint.PrintTemplate({ template: printElements }); // 定义模板
|
||||
const printerList = hiprintTemplate.getPrinterList();
|
||||
console.log(hiprintTemplate, '打印机列表');
|
||||
hiprintTemplate.print2(result, {
|
||||
printer: 'Microsoft Print to PDF',
|
||||
title: '打印标题',
|
||||
height: 210,
|
||||
width: 148,
|
||||
}); //开始打印
|
||||
// 直接打印回调
|
||||
// 发送任务到打印机成功
|
||||
hiprintTemplate.on('printSuccess', function (e) {
|
||||
console.log('打印成功');
|
||||
})
|
||||
// 发送任务到打印机失败
|
||||
hiprintTemplate.on('printError', function (e) {
|
||||
console.log('打印失败');
|
||||
})
|
||||
|
||||
// await CefSharp.BindObjectAsync('boundAsync');
|
||||
// await boundAsync
|
||||
// .printReport('西药(中成药)处方笺.grf', jsonString)
|
||||
// .then((response) => {
|
||||
// //返回结果是jsonString,可判断其调用是否成功
|
||||
// console.log(response, 'response');
|
||||
// var res = JSON.parse(response);
|
||||
// if (!res.IsSuccess) {
|
||||
// proxy.$modal.msgError('调用打印插件失败:' + res.ErrorMessage);
|
||||
// }
|
||||
// })
|
||||
// .catch((error) => {
|
||||
// proxy.$modal.msgError('调用打印插件失败:' + error);
|
||||
// });
|
||||
}
|
||||
|
||||
/** 重置按钮操作 */
|
||||
function resetQuery() {
|
||||
setDefaultDateRange();
|
||||
medicineInfoList.value = [];
|
||||
personInfo.value = [];
|
||||
proxy.resetForm('queryRef');
|
||||
getList();
|
||||
}
|
||||
/** 搜索按钮操作 */
|
||||
function handleQuery() {
|
||||
if (dateRange.value) {
|
||||
queryParams.value.receptionTimeSTime = dateRange.value[0] + ' 00:00:00';
|
||||
queryParams.value.receptionTimeETime = dateRange.value[1] + ' 23:59:59';
|
||||
} else {
|
||||
queryParams.value.receptionTimeSTime = null;
|
||||
queryParams.value.receptionTimeETime = null;
|
||||
}
|
||||
queryParams.value.pageNo = 1;
|
||||
console.log('************', queryParams.value);
|
||||
listPatient(queryParams.value).then((response) => {
|
||||
patientList.value = response.data.records;
|
||||
total.value = response.data.total;
|
||||
});
|
||||
}
|
||||
|
||||
function countGroupRows(data) {
|
||||
const groupCounts = new Map();
|
||||
data.forEach((item, index) => {
|
||||
if (!groupCounts.has(item.prescriptionNo)) {
|
||||
groupCounts.set(item.prescriptionNo, { count: 0, indices: [] });
|
||||
}
|
||||
const groupInfo = groupCounts.get(item.prescriptionNo);
|
||||
groupInfo.count++;
|
||||
groupInfo.indices.push(index);
|
||||
});
|
||||
return groupCounts;
|
||||
}
|
||||
function getRowMarkers(groupCounts, data) {
|
||||
const markers = new Array(data.length).fill('');
|
||||
|
||||
groupCounts.forEach((groupInfo, prescriptionNo) => {
|
||||
const { count, indices } = groupInfo;
|
||||
if (count === 1) {
|
||||
// 如果只有一行,不显示标记
|
||||
return;
|
||||
} else if (count === 2) {
|
||||
// 如果有两行,分别显示左右括号
|
||||
markers[indices[0]] = '┏';
|
||||
markers[indices[1]] = '┗ ';
|
||||
} else {
|
||||
// 如果有两行以上,第一条显示左括号,中间用竖线,最后一条显示右括号
|
||||
markers[indices[0]] = '┏';
|
||||
for (let i = 1; i < indices.length - 1; i++) {
|
||||
markers[indices[i]] = '┃';
|
||||
}
|
||||
markers[indices[indices.length - 1]] = '┗ ';
|
||||
}
|
||||
});
|
||||
return markers;
|
||||
}
|
||||
|
||||
function spanMethod({ row, column, rowIndex, columnIndex }) {
|
||||
// 定义需要合并的列范围(前6列,包括selection列)
|
||||
const columnsToMerge = [1, 16]; // 假设selection列是第0列,其他列依次是1, 2, 3, 4, 5
|
||||
|
||||
// 检查当前列是否在需要合并的列范围内
|
||||
if (columnsToMerge.includes(columnIndex)) {
|
||||
const prescriptionNo = row.prescriptionNo;
|
||||
|
||||
// 查找当前处方号在列表中第一次出现的索引
|
||||
const firstRowIndex = medicineInfoList.value.findIndex(
|
||||
(item) => item.prescriptionNo === prescriptionNo
|
||||
);
|
||||
|
||||
// 如果当前行是该处方号的首行,则合并count行
|
||||
if (rowIndex === firstRowIndex) {
|
||||
// 计算该处方号的总行数
|
||||
const count = medicineInfoList.value.filter(
|
||||
(item) => item.prescriptionNo === prescriptionNo
|
||||
).length;
|
||||
return [count, 1]; // 合并count行,1列
|
||||
} else {
|
||||
return [0, 0]; // 其他行不显示
|
||||
}
|
||||
}
|
||||
|
||||
// 其他列不进行合并
|
||||
return [1, 1];
|
||||
}
|
||||
|
||||
function handleSelectionChange(selectedRows, currentRow) {
|
||||
medicineInfoList.value
|
||||
.filter((item) => {
|
||||
return item.prescriptionNo == currentRow.prescriptionNo;
|
||||
})
|
||||
.forEach((item, index) => {
|
||||
tableRef.value.toggleRowSelection(item, selectedRows.includes(currentRow));
|
||||
});
|
||||
}
|
||||
|
||||
function formatPrice(row, column, cellValue) {
|
||||
if (cellValue === null || cellValue === undefined) {
|
||||
return '0.00 元'; // 如果值为空,返回0.00
|
||||
}
|
||||
return cellValue.toFixed(2) + ' 元'; // 保留两位小数
|
||||
}
|
||||
|
||||
function tagType(statusEnum) {
|
||||
if (statusEnum == 2 || statusEnum == 2) {
|
||||
return 'default';
|
||||
} else if (statusEnum == 4) {
|
||||
return 'success';
|
||||
} else if (statusEnum == 5 || statusEnum == 6 || statusEnum == 7) {
|
||||
return 'warning';
|
||||
} else if (statusEnum == 12) {
|
||||
return 'info';
|
||||
}
|
||||
}
|
||||
|
||||
function handleCurrentChange(row) {
|
||||
currentRow.value = row; // 更新当前选中行的数据
|
||||
console.log('当前选中行的数据:', currentRow.value);
|
||||
currentRow.value.statusEnum = undefined;
|
||||
currentRow.value.dispenseStatus = queryParams.value.statusEnum;
|
||||
getMedicineList(row.encounterId);
|
||||
}
|
||||
|
||||
function getMedicineList(encounterId) {
|
||||
listWesternmedicine({
|
||||
encounterId: encounterId,
|
||||
statusEnum: queryParams.value.statusEnum,
|
||||
tcmFlag: tcmFlag.value,
|
||||
}).then((response) => {
|
||||
console.log('121212', response);
|
||||
personInfo.value = response.data.prescriptionPatientInfoDto;
|
||||
medicineInfoList.value = Array.isArray(response.data.prescriptionMedicineInfoDtoList)
|
||||
? response.data.prescriptionMedicineInfoDtoList
|
||||
: [response.data.prescriptionMedicineInfoDtoList];
|
||||
// 创建分组映射表
|
||||
const groupMap = {};
|
||||
medicineInfoList.value.forEach((item) => {
|
||||
const groupId = item.groupId; // 确保属性名一致
|
||||
if (groupId != null) {
|
||||
// 过滤掉null/undefined
|
||||
groupMap[groupId] = groupMap[groupId] || [];
|
||||
groupMap[groupId].push(item);
|
||||
}
|
||||
});
|
||||
|
||||
// 处理每个分组
|
||||
Object.values(groupMap).forEach((group) => {
|
||||
const count = group.length;
|
||||
if (count === 2) {
|
||||
group[0].flag = '┓';
|
||||
group[1].flag = '┛';
|
||||
} else if (count > 2) {
|
||||
group[0].flag = '┓';
|
||||
group.slice(1, -1).forEach((item) => (item.flag = '┃')); // 中间元素
|
||||
group[group.length - 1].flag = '┛';
|
||||
}
|
||||
});
|
||||
|
||||
// 处理没有分组的项
|
||||
medicineInfoList.value.forEach((item) => {
|
||||
if (item.groupId == null) {
|
||||
// 确保属性名一致
|
||||
item.flag = '';
|
||||
} else if (!item.flag) {
|
||||
// 确保所有项都有flag属性
|
||||
item.flag = '';
|
||||
}
|
||||
});
|
||||
|
||||
diagnoses.value = medicineInfoList.value.map((item) => item.诊断 || '无').join(', ');
|
||||
});
|
||||
}
|
||||
|
||||
function submitMedicine(saveList) {
|
||||
prepareMedicion(saveList).then((res) => {
|
||||
if (res.code == 200) {
|
||||
updateMedicion(saveList).then((response) => {
|
||||
proxy.$modal.msgSuccess('发药成功');
|
||||
listWesternmedicine({
|
||||
encounterId: currentRow.value.encounterId,
|
||||
statusEnum: queryParams.value.statusEnum,
|
||||
tcmFlag: tcmFlag.value,
|
||||
}).then((response) => {
|
||||
medicineInfoList.value = Array.isArray(response.data.prescriptionMedicineInfoDtoList)
|
||||
? response.data.prescriptionMedicineInfoDtoList
|
||||
: [response.data.prescriptionMedicineInfoDtoList];
|
||||
// 统计每个 prescriptionNo 的行数
|
||||
const groupCounts = countGroupRows(medicineInfoList.value);
|
||||
// 设置每行的标记
|
||||
markers.value = getRowMarkers(groupCounts, medicineInfoList.value);
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
const throttledGetList = debounce(handelTraceNo, 500);
|
||||
const traceNoInput = debounce(handleTraceNoInput, 500);
|
||||
|
||||
function formatContent(value) {
|
||||
let content = '';
|
||||
if (value && value.endsWith(',')) {
|
||||
value = value.slice(0, -1);
|
||||
}
|
||||
if (value) {
|
||||
value.split(',').forEach((item, index) => {
|
||||
content += `[${index + 1}] ${item}\n`;
|
||||
});
|
||||
return content;
|
||||
}
|
||||
}
|
||||
function handleTraceNoInput(row, index) {
|
||||
if (row.traceNo) {
|
||||
// 先移除所有逗号
|
||||
let cleanStr = row.traceNo.replace(/,/g, '');
|
||||
// 每20个字符插入一个逗号
|
||||
let formattedStr = cleanStr.replace(/(.{20})/g, '$1,');
|
||||
// 如果最后一个字符是逗号则移除
|
||||
formattedStr = formattedStr.replace(/,$/, '');
|
||||
row.traceNo = formattedStr;
|
||||
|
||||
// 保持输入焦点
|
||||
proxy.$refs['traceNoRef' + index].focus();
|
||||
}
|
||||
}
|
||||
|
||||
let inputValue = '';
|
||||
function handelTraceNo(value) {
|
||||
traceNoList.value.push(value);
|
||||
traceNo.value = traceNo.value + '[' + traceNoList.value.length + ']' + ' ' + value + '\n';
|
||||
traceNoTemp.value = '';
|
||||
// let saveValue = value.substring(inputValue.length + 5, value.length);
|
||||
// inputValue = value;
|
||||
// console.log(value);
|
||||
// console.log(saveValue);
|
||||
// traceNoList.value.push(saveValue);
|
||||
// traceNo.value = value + '[' + (traceNoList.value.length + 1) + ']' + ' ';
|
||||
}
|
||||
|
||||
function handleBatch(row) {
|
||||
let saveList = [];
|
||||
if (row) {
|
||||
saveList = medicineInfoList.value
|
||||
.filter((item) => {
|
||||
return item.prescriptionNo === row.prescriptionNo;
|
||||
})
|
||||
.map((item) => {
|
||||
return {
|
||||
requestId: item.requestId,
|
||||
dispenseId: item.dispenseId,
|
||||
traceNo: item.traceNo,
|
||||
prescriptionNo: item.prescriptionNo,
|
||||
preparerId: preparerDoctor.value,
|
||||
};
|
||||
});
|
||||
} else {
|
||||
if (tableRef.value.getSelectionRows().length > 0) {
|
||||
saveList = tableRef.value.getSelectionRows().map((item) => {
|
||||
return {
|
||||
requestId: item.requestId,
|
||||
dispenseId: item.dispenseId,
|
||||
traceNo: item.traceNo,
|
||||
prescriptionNo: item.prescriptionNo,
|
||||
preparerId: preparerDoctor.value,
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
console.log(saveList);
|
||||
|
||||
submitMedicine(saveList);
|
||||
}
|
||||
|
||||
function backMedicine(row) {
|
||||
showDialog.value = true;
|
||||
selectedPrescriptionNo.value = row.prescriptionNo;
|
||||
console.log('作废原因:', selectedPrescriptionNo.value, row.prescriptionNo);
|
||||
}
|
||||
|
||||
function handleConfirm() {
|
||||
if (!notPerformedReasonEnum.value) {
|
||||
ElMessage.error('请选择作废原因');
|
||||
return;
|
||||
}
|
||||
backMedicion(selectedPrescriptionNo.value, notPerformedReasonEnum.value).then((response) => {
|
||||
proxy.$modal.msgSuccess('作废成功');
|
||||
});
|
||||
listWesternmedicine({
|
||||
encounterId: currentRow.value.encounterId,
|
||||
statusEnum: queryParams.value.statusEnum,
|
||||
tcmFlag: tcmFlag.value,
|
||||
}).then((response) => {
|
||||
console.log('1212*******12', response);
|
||||
medicineInfoList.value = Array.isArray(response.data.prescriptionMedicineInfoDtoList)
|
||||
? response.data.prescriptionMedicineInfoDtoList
|
||||
: [response.data.prescriptionMedicineInfoDtoList];
|
||||
// medicineInfoList.value = response.data;
|
||||
// 统计每个 prescriptionNo 的行数
|
||||
const groupCounts = countGroupRows(medicineInfoList.value);
|
||||
// 设置每行的标记
|
||||
markers.value = getRowMarkers(groupCounts, medicineInfoList.value);
|
||||
});
|
||||
showDialog.value = false;
|
||||
notPerformedReasonEnum.value = ''; // 清空选择
|
||||
}
|
||||
|
||||
function handleCancel() {
|
||||
showDialog.value = false;
|
||||
notPerformedReasonEnum.value = ''; // 清空选择
|
||||
}
|
||||
|
||||
// getList();
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.app-container {
|
||||
padding: 20px;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.left {
|
||||
width: 25%;
|
||||
|
||||
.form {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
}
|
||||
|
||||
.right {
|
||||
margin-left: 2%;
|
||||
width: 74%;
|
||||
}
|
||||
|
||||
:deep(.el-table tbody tr:hover > td) {
|
||||
background-color: inherit !important;
|
||||
}
|
||||
|
||||
.el-form--inline .el-form-item {
|
||||
margin-right: 0px;
|
||||
}
|
||||
::v-deep.el-textarea .el-textarea__inner {
|
||||
resize: none !important;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user