|
@@ -1,43 +1,56 @@
|
|
|
<template>
|
|
|
<div class="p-2">
|
|
|
- <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
|
|
+ <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
|
|
|
+ :leave-active-class="proxy?.animate.searchAnimate.leave">
|
|
|
<div v-show="showSearch" class="mb-[10px]">
|
|
|
<el-card shadow="hover">
|
|
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true" :label-width="85">
|
|
|
<el-form-item label="开单时间:" prop="orderTime">
|
|
|
- <el-date-picker v-model="orderTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
|
|
|
+ <el-date-picker v-model="orderTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
|
|
|
+ range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
|
|
|
+ :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="付款时间:" prop="createTime">
|
|
|
- <el-date-picker v-model="createTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
|
|
|
+ <el-date-picker v-model="createTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
|
|
|
+ range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
|
|
|
+ :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="退费时间:" prop="refundTime">
|
|
|
- <el-date-picker v-model="refundTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
|
|
|
+ <el-date-picker v-model="refundTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
|
|
|
+ range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
|
|
|
+ :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="收费类型:" prop="chargeType">
|
|
|
<el-select v-model="queryParams.chargeType">
|
|
|
- <el-option v-for="dict in fee_type" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
+ <el-option v-for="dict in fee_type" :key="dict.value" :label="dict.label"
|
|
|
+ :value="dict.value" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="患者科室" prop="doorId">
|
|
|
- <el-tree-select v-model="queryParams.doorId" :data="treeData" :props="treeProps" placeholder="请选择" check-strictly node-key="id" @keyup.enter="handleQuery" />
|
|
|
+ <el-tree-select v-model="queryParams.doorId" :data="treeData" :props="treeProps"
|
|
|
+ placeholder="请选择" check-strictly node-key="id" @keyup.enter="handleQuery" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="看诊类型:">
|
|
|
<el-select v-model="queryParams.visitType">
|
|
|
- <el-option v-for="dict in treatment_user_type" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
+ <el-option v-for="dict in treatment_user_type" :key="dict.value" :label="dict.label"
|
|
|
+ :value="dict.value" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="支付方式:">
|
|
|
<el-select v-model="queryParams.paymentMethod">
|
|
|
- <el-option v-for="dict in charge_way" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
+ <el-option v-for="dict in charge_way" :key="dict.value" :label="dict.label"
|
|
|
+ :value="dict.value" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="支付状态:">
|
|
|
<el-select v-model="queryParams.paymentStatus">
|
|
|
- <el-option v-for="dict in payment_status" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
+ <el-option v-for="dict in payment_status" :key="dict.value" :label="dict.label"
|
|
|
+ :value="dict.value" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
<el-form-item>
|
|
|
- <el-input v-model="queryParams.searchValue" placeholder="医生姓名/门诊号/住院号" style="width: 240px; " clearable />
|
|
|
+ <el-input v-model="queryParams.searchValue" placeholder="医生姓名/门诊号/住院号"
|
|
|
+ style="width: 240px; " clearable />
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
@@ -85,12 +98,12 @@
|
|
|
</el-table-column>
|
|
|
<el-table-column label="看诊类型" align="center" prop="visitType">
|
|
|
<template #default="scope">
|
|
|
- <span>{{getDictLabel(treatment_user_type,scope.row.visitType)||'--' }}</span>
|
|
|
+ <span>{{ getDictLabel(treatment_user_type, scope.row.visitType) || '--' }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column label="收费类型" align="center" prop="chargeType">
|
|
|
<template #default="scope">
|
|
|
- <span>{{getDictLabel(fee_type,scope.row.chargeType)||'--' }}</span>
|
|
|
+ <span>{{ getDictLabel(fee_type, scope.row.chargeType) || '--' }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column label="患者姓名" align="center" prop="patientName" />
|
|
@@ -102,37 +115,39 @@
|
|
|
<el-table-column label="实收金额(元)" align="center" prop="fundsReceived" />
|
|
|
<el-table-column label="退费金额(元)" align="center" prop="refundAmount">
|
|
|
<template #default="scope">
|
|
|
- <span>{{ scope.row.refundAmount||'--' }}</span>
|
|
|
+ <span>{{ scope.row.refundAmount || '--' }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column label="支付状态" align="center" prop="paymentStatus">
|
|
|
<template #default="scope">
|
|
|
- <span>{{getDictLabel(payment_status,scope.row.paymentStatus)||'--' }}</span>
|
|
|
+ <span>{{ getDictLabel(payment_status, scope.row.paymentStatus) || '--' }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column label="支付方式" align="center" prop="paymentMethod">
|
|
|
<template #default="scope">
|
|
|
- <span>{{getDictLabel(charge_way,scope.row.paymentMethod)||'--' }}</span>
|
|
|
+ <span>{{ getDictLabel(charge_way, scope.row.paymentMethod) || '--' }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column label="退费时间" align="center" prop="refundTime" width="180">
|
|
|
<template #default="scope">
|
|
|
- <span>{{ scope.row.refundTime||'--' }}</span>
|
|
|
+ <span>{{ scope.row.refundTime || '--' }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
|
|
|
<template #default="scope">
|
|
|
<el-tooltip content="详情" placement="top">
|
|
|
- <el-button link type="primary" icon="Edit" @click="handleDetail(scope.row)" v-hasPermi="['settlement:chargeRecord:edit']">详情</el-button>
|
|
|
+ <el-button link type="primary" icon="Edit" @click="handleDetail(scope.row)"
|
|
|
+ v-hasPermi="['settlement:chargeRecord:edit']">详情</el-button>
|
|
|
</el-tooltip>
|
|
|
<el-tooltip content="删除" placement="top">
|
|
|
- <el-button link type="primary" icon="Delete" >打印</el-button>
|
|
|
+ <el-button link type="primary" icon="Delete">打印</el-button>
|
|
|
</el-tooltip>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
|
|
|
- <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
|
|
+ <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
|
|
|
+ v-model:limit="queryParams.pageSize" @pagination="getList" />
|
|
|
</el-card>
|
|
|
<!-- 详情对话框 -->
|
|
|
<el-dialog :title="dialog.title" v-model="dialog.visible" width="65%" append-to-body>
|
|
@@ -200,7 +215,7 @@
|
|
|
<el-col :span="5">
|
|
|
<div class="info-item">
|
|
|
<span class="label">处方Id:</span>
|
|
|
- <span class="value">{{ rowData.id || '' }}</span>
|
|
|
+ <span class="value">{{ rowData.id || '' }}</span>
|
|
|
</div>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
@@ -257,7 +272,7 @@
|
|
|
</thead>
|
|
|
<tbody>
|
|
|
<tr v-for="(item, index) in screeningData" :key="index">
|
|
|
- <td>{{ getDictLabel(fee_type,rowData.chargeType) || '--' }}</td>
|
|
|
+ <td>{{ getDictLabel(fee_type, rowData.chargeType) || '--' }}</td>
|
|
|
<td>次</td>
|
|
|
<td>{{ rowData.receivableAmount || '--' }}</td>
|
|
|
<td>1</td>
|
|
@@ -281,7 +296,7 @@
|
|
|
</thead>
|
|
|
<tbody>
|
|
|
<tr v-for="(item, index) in evaluationData" :key="index">
|
|
|
- <td>{{ getDictLabel(fee_type,rowData.chargeType) || '--' }}</td>
|
|
|
+ <td>{{ getDictLabel(fee_type, rowData.chargeType) || '--' }}</td>
|
|
|
<td>次</td>
|
|
|
<td>{{ rowData.receivableAmount || '--' }}</td>
|
|
|
<td>1</td>
|
|
@@ -292,34 +307,43 @@
|
|
|
</table>
|
|
|
|
|
|
<!-- 无数据提示 -->
|
|
|
- <div v-if="recipeDetailData.length === 0 && screeningData.length === 0 && evaluationData.length === 0" style="text-align: center; color: #909399; padding: 40px 0;">
|
|
|
+ <div v-if="recipeDetailData.length === 0 && screeningData.length === 0 && evaluationData.length === 0"
|
|
|
+ style="text-align: center; color: #909399; padding: 40px 0;">
|
|
|
暂无数据
|
|
|
</div>
|
|
|
|
|
|
<!-- 金额统计 -->
|
|
|
- <div style="margin-top:10px;" v-if="rowData.chargeType=='0'||rowData.chargeType=='1'">
|
|
|
+ <div style="margin-top:10px;" v-if="rowData.chargeType == '0' || rowData.chargeType == '1'">
|
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="4">
|
|
|
- <span>项目总金额:<span style="color: #f56c6c;">¥{{rowData.receivableAmount}}</span></span>
|
|
|
+ <span>项目总金额:<span style="color: #f56c6c;">¥{{ rowData.receivableAmount }}</span></span>
|
|
|
</el-col>
|
|
|
<el-col :span="4">
|
|
|
- <span>实收金额:<span style="color: #f56c6c;">¥{{rowData.fundsReceived}}</span></span><span style="margin-left:5px"> 退费金额:<span style="color: #f56c6c;">¥{{ rowData.refundAmount||'0.00' }}</span></span>
|
|
|
+ <span>实收金额:<span style="color: #f56c6c;">¥{{ rowData.fundsReceived }}</span></span><span
|
|
|
+ style="margin-left:5px"> 退费金额:<span style="color: #f56c6c;">¥{{
|
|
|
+ rowData.refundAmount || '0.00'
|
|
|
+ }}</span></span>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
</div>
|
|
|
<div style="margin-top:10px;" v-else>
|
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="6">
|
|
|
- <span>处方总金额:<span style="color: #f56c6c;">¥{{rowData.receivableAmount}}</span></span><span>(营养配置费:<span>¥{{ prescriptionFee||'0' }}</span>)</span>
|
|
|
+ <span>处方总金额:<span style="color: #f56c6c;">¥{{ rowData.receivableAmount
|
|
|
+ }}</span></span><span>(营养配置费:<span>¥{{
|
|
|
+ prescriptionFee || '0' }}</span>)</span>
|
|
|
</el-col>
|
|
|
<el-col :span="4">
|
|
|
- <span>实收金额:<span style="color: #f56c6c;">¥{{rowData.fundsReceived}}</span></span><span style="margin-left:5px"> 退费金额:<span style="color: #f56c6c;">¥{{ rowData.refundAmount||'0.00' }}</span></span>
|
|
|
+ <span>实收金额:<span style="color: #f56c6c;">¥{{ rowData.fundsReceived }}</span></span><span
|
|
|
+ style="margin-left:5px"> 退费金额:<span style="color: #f56c6c;">¥{{
|
|
|
+ rowData.refundAmount || '0.00'
|
|
|
+ }}</span></span>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
</div>
|
|
|
-
|
|
|
- <!-- 筛查数据表格 -->
|
|
|
- <span>操作记录</span>
|
|
|
+
|
|
|
+ <!-- 筛查数据表格 -->
|
|
|
+ <span>操作记录</span>
|
|
|
<table v-if="recordLogData.length > 0" class="prescription-table" style="margin-top: 10px;">
|
|
|
<thead>
|
|
|
<tr>
|
|
@@ -336,11 +360,11 @@
|
|
|
<tbody>
|
|
|
<tr v-for="(item, index) in recordLogData" :key="index">
|
|
|
<td>{{ item.createTime || '--' }}</td>
|
|
|
- <td>{{item.settlementId}}</td>
|
|
|
- <td>{{ item.productName || '--' }}</td>
|
|
|
- <td>{{getDictLabel(charge_way,item.paymentMethod) || '--' }}</td>
|
|
|
+ <td>{{ item.settlementId }}</td>
|
|
|
+ <td>{{ item.productName || '--' }}</td>
|
|
|
+ <td>{{ getDictLabel(charge_way, item.paymentMethod) || '--' }}</td>
|
|
|
<td>{{ rowData.receivableAmount || '--' }}</td>
|
|
|
- <td>{{getDictLabel(action_status,item.status) || '--' }}</td>
|
|
|
+ <td>{{ getDictLabel(action_status, item.status) || '--' }}</td>
|
|
|
<td>{{ rowData.remark || '--' }}</td>
|
|
|
<td>{{ item.createByName || '--' }}</td>
|
|
|
</tr>
|
|
@@ -359,395 +383,394 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup name="Record" lang="ts">
|
|
|
- import { listRecord, getRecord, delRecord, addRecord, updateRecord } from '@/api/settlement/chargeRecord';
|
|
|
- import { ChrageRecordVO, ChrageRecordQuery, ChrageRecordForm } from '@/api/settlement/chargeRecord/types';
|
|
|
- import { listDept } from '@/api/system/dept'; // 部门列表
|
|
|
- const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
- const { treatment_user_type, check_status, recipe_type, fee_type, charge_way, payment_status,action_status } = toRefs < any > (proxy ?.useDict('treatment_user_type', 'check_status', 'recipe_type', 'fee_type', 'charge_way', 'payment_status','action_status'));
|
|
|
-
|
|
|
- const orderTime = ref < [DateModelType, DateModelType] > (['', '']);
|
|
|
- const createTime = ref < [DateModelType, DateModelType] > (['', '']);
|
|
|
- const refundTime = ref < [DateModelType, DateModelType] > (['', '']);
|
|
|
- const recordList = ref < ChrageRecordVO[] > ([]);
|
|
|
- const buttonLoading = ref(false);
|
|
|
- const loading = ref(true);
|
|
|
- const showSearch = ref(true);
|
|
|
- const ids = ref < Array < string | number >> ([]);
|
|
|
- const single = ref(true);
|
|
|
- const multiple = ref(true);
|
|
|
- const total = ref(0);
|
|
|
- // 处方明细数据
|
|
|
- const recipeDetailData = ref([]);
|
|
|
- const evaluationData = ref([]);
|
|
|
- const screeningData = ref([]);
|
|
|
- const recordLogData = ref([]);
|
|
|
- const prescriptionFee = ref(0)
|
|
|
- const queryFormRef = ref < ElFormInstance > ();
|
|
|
- const ChrageRecordFormRef = ref < ElFormInstance > ();
|
|
|
- const treeData = ref([]); // 定义 treeData
|
|
|
- const treeProps = ref({
|
|
|
- value: 'deptId', // 对应部门的 deptId
|
|
|
- label: 'deptName', // 对应部门的 deptName
|
|
|
- children: 'children' // 保持原有的父子结构
|
|
|
- });
|
|
|
- const dialog = reactive < DialogOption > ({
|
|
|
- visible: false,
|
|
|
- title: ''
|
|
|
+import { listRecord, getRecord, delRecord, addRecord, updateRecord } from '@/api/settlement/chargeRecord';
|
|
|
+import { ChrageRecordVO, ChrageRecordQuery, ChrageRecordForm } from '@/api/settlement/chargeRecord/types';
|
|
|
+import { listDept } from '@/api/system/dept'; // 部门列表
|
|
|
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
+const { treatment_user_type, check_status, recipe_type, fee_type, charge_way, payment_status, action_status } = toRefs<any>(proxy?.useDict('treatment_user_type', 'check_status', 'recipe_type', 'fee_type', 'charge_way', 'payment_status', 'action_status'));
|
|
|
+
|
|
|
+const orderTime = ref<[DateModelType, DateModelType]>(['', '']);
|
|
|
+const createTime = ref<[DateModelType, DateModelType]>(['', '']);
|
|
|
+const refundTime = ref<[DateModelType, DateModelType]>(['', '']);
|
|
|
+const recordList = ref<ChrageRecordVO[]>([]);
|
|
|
+const buttonLoading = ref(false);
|
|
|
+const loading = ref(true);
|
|
|
+const showSearch = ref(true);
|
|
|
+const ids = ref<Array<string | number>>([]);
|
|
|
+const single = ref(true);
|
|
|
+const multiple = ref(true);
|
|
|
+const total = ref(0);
|
|
|
+// 处方明细数据
|
|
|
+const recipeDetailData = ref([]);
|
|
|
+const evaluationData = ref([]);
|
|
|
+const screeningData = ref([]);
|
|
|
+const recordLogData = ref([]);
|
|
|
+const prescriptionFee = ref(0)
|
|
|
+const queryFormRef = ref<ElFormInstance>();
|
|
|
+const ChrageRecordFormRef = ref<ElFormInstance>();
|
|
|
+const treeData = ref([]); // 定义 treeData
|
|
|
+const treeProps = ref({
|
|
|
+ value: 'deptId', // 对应部门的 deptId
|
|
|
+ label: 'deptName', // 对应部门的 deptName
|
|
|
+ children: 'children' // 保持原有的父子结构
|
|
|
+});
|
|
|
+const dialog = reactive<DialogOption>({
|
|
|
+ visible: false,
|
|
|
+ title: ''
|
|
|
+});
|
|
|
+const rowData = ref<ChrageRecordVO>({})
|
|
|
+const initFormData: ChrageRecordForm = {
|
|
|
+ id: undefined,
|
|
|
+ settlementId: undefined,
|
|
|
+ orderTime: undefined,
|
|
|
+ visitType: undefined,
|
|
|
+ chargeType: undefined,
|
|
|
+ patientId: undefined,
|
|
|
+ patientName: undefined,
|
|
|
+ doorId: undefined,
|
|
|
+ patientNo: undefined,
|
|
|
+ phone: undefined,
|
|
|
+ idCard: undefined,
|
|
|
+ receivableAmount: undefined,
|
|
|
+ fundsReceived: undefined,
|
|
|
+ refundAmount: undefined,
|
|
|
+ paymentStatus: undefined,
|
|
|
+ paymentMethod: undefined,
|
|
|
+ bedNo: undefined,
|
|
|
+ refundTime: undefined,
|
|
|
+ status: undefined,
|
|
|
+ wardId: undefined,
|
|
|
+ wardName: undefined,
|
|
|
+ treatNum: undefined,
|
|
|
+ remark: undefined,
|
|
|
+}
|
|
|
+const data = reactive<PageData<ChrageRecordForm,
|
|
|
+ ChrageRecordQuery>>({
|
|
|
+ form: { ...initFormData },
|
|
|
+ queryParams: {
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ orderTime: undefined,
|
|
|
+ createTime: undefined,
|
|
|
+ visitType: undefined,
|
|
|
+ chargeType: undefined,
|
|
|
+ doorId: undefined,
|
|
|
+ patientId: undefined,
|
|
|
+ patientNo: undefined,
|
|
|
+ receivableAmount: undefined,
|
|
|
+ fundsReceived: undefined,
|
|
|
+ refundAmount: undefined,
|
|
|
+ paymentStatus: undefined,
|
|
|
+ paymentMethod: undefined,
|
|
|
+ refundTime: undefined,
|
|
|
+ searchValue: undefined,
|
|
|
+ params: {}
|
|
|
+ },
|
|
|
+ rules: {
|
|
|
+ id: [
|
|
|
+ { required: true, message: "主键ID不能为空", trigger: "blur" }
|
|
|
+ ],
|
|
|
+ settlementId: [
|
|
|
+ { required: true, message: "处方id不能为空", trigger: "blur" }
|
|
|
+ ],
|
|
|
+ }
|
|
|
});
|
|
|
- const rowData = ref < ChrageRecordVO > ({})
|
|
|
- const initFormData: ChrageRecordForm = {
|
|
|
- id: undefined,
|
|
|
- settlementId: undefined,
|
|
|
- orderTime: undefined,
|
|
|
- visitType: undefined,
|
|
|
- chargeType: undefined,
|
|
|
- patientId: undefined,
|
|
|
- patientName: undefined,
|
|
|
- doorId: undefined,
|
|
|
- patientNo: undefined,
|
|
|
- phone: undefined,
|
|
|
- idCard: undefined,
|
|
|
- receivableAmount: undefined,
|
|
|
- fundsReceived: undefined,
|
|
|
- refundAmount: undefined,
|
|
|
- paymentStatus: undefined,
|
|
|
- paymentMethod: undefined,
|
|
|
- bedNo: undefined,
|
|
|
- refundTime: undefined,
|
|
|
- status: undefined,
|
|
|
- wardId: undefined,
|
|
|
- wardName: undefined,
|
|
|
- treatNum: undefined,
|
|
|
- remark: undefined,
|
|
|
- }
|
|
|
- const data = reactive < PageData < ChrageRecordForm,
|
|
|
- ChrageRecordQuery >> ({
|
|
|
- form: { ...initFormData },
|
|
|
- queryParams: {
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 10,
|
|
|
- orderTime: undefined,
|
|
|
- createTime: undefined,
|
|
|
- visitType: undefined,
|
|
|
- chargeType: undefined,
|
|
|
- doorId: undefined,
|
|
|
- patientId:undefined,
|
|
|
- patientNo: undefined,
|
|
|
- receivableAmount: undefined,
|
|
|
- fundsReceived: undefined,
|
|
|
- refundAmount: undefined,
|
|
|
- paymentStatus: undefined,
|
|
|
- paymentMethod: undefined,
|
|
|
- refundTime: undefined,
|
|
|
- searchValue: undefined,
|
|
|
- params: {}
|
|
|
- },
|
|
|
- rules: {
|
|
|
- id: [
|
|
|
- { required: true, message: "主键ID不能为空", trigger: "blur" }
|
|
|
- ],
|
|
|
- settlementId: [
|
|
|
- { required: true, message: "处方id不能为空", trigger: "blur" }
|
|
|
- ],
|
|
|
- }
|
|
|
- });
|
|
|
|
|
|
- const { queryParams, form, rules } = toRefs(data);
|
|
|
+const { queryParams, form, rules } = toRefs(data);
|
|
|
+
|
|
|
+// 字典label工具
|
|
|
+function getDictLabel(dictList: any[], value: string) {
|
|
|
+ if (!dictList || !Array.isArray(dictList)) return value || '--';
|
|
|
+ const found = dictList.find((item) => item.value === value);
|
|
|
+ return found ? found.label : value || '--';
|
|
|
+}
|
|
|
+
|
|
|
+/** 添加多个日期范围 */
|
|
|
+const addMultipleDateRanges = (params: any, dateRanges: {
|
|
|
+ [key: string]: any[]
|
|
|
+}) => {
|
|
|
+ const search = { ...params };
|
|
|
+ search.params = typeof search.params === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
|
|
|
+
|
|
|
+ // 添加各个时间范围
|
|
|
+ Object.keys(dateRanges).forEach(propName => {
|
|
|
+ const dateRange = Array.isArray(dateRanges[propName]) ? dateRanges[propName] : [];
|
|
|
+ if (dateRange.length >= 2 && dateRange[0] && dateRange[1]) {
|
|
|
+ search.params['beginTime'] = dateRange[0];
|
|
|
+ search.params['endTime'] = dateRange[1];
|
|
|
+ }
|
|
|
+ });
|
|
|
|
|
|
- // 字典label工具
|
|
|
- function getDictLabel(dictList: any[], value: string) {
|
|
|
- if (!dictList || !Array.isArray(dictList)) return value || '--';
|
|
|
- const found = dictList.find((item) => item.value === value);
|
|
|
- return found ? found.label : value || '--';
|
|
|
- }
|
|
|
+ return search;
|
|
|
+};
|
|
|
|
|
|
- /** 添加多个日期范围 */
|
|
|
- const addMultipleDateRanges = (params: any, dateRanges: {
|
|
|
- [key: string]: any[]
|
|
|
- }) => {
|
|
|
- const search = { ...params };
|
|
|
- search.params = typeof search.params === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
|
|
|
-
|
|
|
- // 添加各个时间范围
|
|
|
- Object.keys(dateRanges).forEach(propName => {
|
|
|
- const dateRange = Array.isArray(dateRanges[propName]) ? dateRanges[propName] : [];
|
|
|
- if (dateRange.length >= 2 && dateRange[0] && dateRange[1]) {
|
|
|
- search.params['beginTime'] = dateRange[0];
|
|
|
- search.params['endTime'] = dateRange[1];
|
|
|
- }
|
|
|
- });
|
|
|
+/** 查询收费记录列表 */
|
|
|
+const getList = async () => {
|
|
|
+ loading.value = true;
|
|
|
|
|
|
- return search;
|
|
|
+ // 构建多个时间范围参数
|
|
|
+ const dateRanges = {
|
|
|
+ OrderTime: orderTime.value,
|
|
|
+ CreateTime: createTime.value,
|
|
|
+ RefundTime: refundTime.value
|
|
|
};
|
|
|
|
|
|
- /** 查询收费记录列表 */
|
|
|
- const getList = async () => {
|
|
|
- loading.value = true;
|
|
|
-
|
|
|
- // 构建多个时间范围参数
|
|
|
- const dateRanges = {
|
|
|
- OrderTime: orderTime.value,
|
|
|
- CreateTime: createTime.value,
|
|
|
- RefundTime: refundTime.value
|
|
|
- };
|
|
|
-
|
|
|
- const res = await listRecord(addMultipleDateRanges(queryParams.value, dateRanges));
|
|
|
- recordList.value = res.rows;
|
|
|
- total.value = res.total;
|
|
|
- loading.value = false;
|
|
|
- }
|
|
|
- const getDeptList = async () => {
|
|
|
- loading.value = true;
|
|
|
- try {
|
|
|
- const res = await listDept({ pageNum: 1, pageSize: 999 });
|
|
|
- if (!res.data) {
|
|
|
- console.warn("部门数据为空");
|
|
|
- treeData.value = [];
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- // 处理树形数据
|
|
|
- const processedData = proxy ?.handleTree(res.data, 'deptId');
|
|
|
- if (!processedData) {
|
|
|
- console.warn("树形数据处理失败");
|
|
|
- treeData.value = [];
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- treeData.value = processedData;
|
|
|
-
|
|
|
- } catch (error) {
|
|
|
- console.error('获取部门列表失败:', error);
|
|
|
+ const res = await listRecord(addMultipleDateRanges(queryParams.value, dateRanges));
|
|
|
+ recordList.value = res.rows;
|
|
|
+ total.value = res.total;
|
|
|
+ loading.value = false;
|
|
|
+}
|
|
|
+const getDeptList = async () => {
|
|
|
+ loading.value = true;
|
|
|
+ try {
|
|
|
+ const res = await listDept({ pageNum: 1, pageSize: 999 });
|
|
|
+ if (!res.data) {
|
|
|
+ console.warn("部门数据为空");
|
|
|
treeData.value = [];
|
|
|
- } finally {
|
|
|
- loading.value = false;
|
|
|
+ return;
|
|
|
}
|
|
|
- };
|
|
|
-
|
|
|
- /** 取消按钮 */
|
|
|
- const cancel = () => {
|
|
|
- reset();
|
|
|
- dialog.visible = false;
|
|
|
- }
|
|
|
-
|
|
|
- /** 表单重置 */
|
|
|
- const reset = () => {
|
|
|
- form.value = { ...initFormData };
|
|
|
- ChrageRecordFormRef.value ?.resetFields();
|
|
|
- }
|
|
|
|
|
|
- /** 搜索按钮操作 */
|
|
|
- const handleQuery = () => {
|
|
|
- queryParams.value.pageNum = 1;
|
|
|
- getList();
|
|
|
- }
|
|
|
-
|
|
|
- /** 重置按钮操作 */
|
|
|
- const resetQuery = () => {
|
|
|
- queryFormRef.value ?.resetFields();
|
|
|
- queryParams.value.searchValue = undefined;
|
|
|
- queryParams.value.visitType = undefined;
|
|
|
- queryParams.value.chargeType = undefined;
|
|
|
- queryParams.value.doorId = undefined;
|
|
|
- queryParams.value.paymentMethod = undefined;
|
|
|
- queryParams.value.paymentStatus = undefined;
|
|
|
- handleQuery();
|
|
|
- }
|
|
|
-
|
|
|
- /** 多选框选中数据 */
|
|
|
- const handleSelectionChange = (selection: ChrageRecordVO[]) => {
|
|
|
- ids.value = selection.map(item => item.id);
|
|
|
- single.value = selection.length != 1;
|
|
|
- multiple.value = !selection.length;
|
|
|
- }
|
|
|
+ // 处理树形数据
|
|
|
+ const processedData = proxy?.handleTree(res.data, 'deptId');
|
|
|
+ if (!processedData) {
|
|
|
+ console.warn("树形数据处理失败");
|
|
|
+ treeData.value = [];
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- /** 新增按钮操作 */
|
|
|
- const handleAdd = () => {
|
|
|
- reset();
|
|
|
- dialog.visible = true;
|
|
|
- dialog.title = "添加收费记录";
|
|
|
- }
|
|
|
+ treeData.value = processedData;
|
|
|
|
|
|
- /** 修改按钮操作 */
|
|
|
- const handleDetail = async (row ? : ChrageRecordVO) => {
|
|
|
- reset();
|
|
|
- rowData.value = row || {} as ChrageRecordVO;
|
|
|
- console.log(JSON.stringify(row));
|
|
|
- const _id = row ?.id
|
|
|
- const res = await getRecord(_id);
|
|
|
- recipeDetailData.value = res.data.enteralNutritionList
|
|
|
- evaluationData.value = res.data.nutritionEvaluationList
|
|
|
- screeningData.value = res.data.nutritionScreeningList
|
|
|
- recordLogData.value = res.data.recordLogList
|
|
|
-
|
|
|
- prescriptionFee.value = res.data.prescriptionFee
|
|
|
- Object.assign(form.value, res.data);
|
|
|
- dialog.visible = true;
|
|
|
- dialog.title = "收费详情";
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取部门列表失败:', error);
|
|
|
+ treeData.value = [];
|
|
|
+ } finally {
|
|
|
+ loading.value = false;
|
|
|
}
|
|
|
-
|
|
|
- /** 提交按钮 */
|
|
|
- const submitForm = () => {
|
|
|
- ChrageRecordFormRef.value ?.validate(async (valid: boolean) => {
|
|
|
- if (valid) {
|
|
|
- buttonLoading.value = true;
|
|
|
- if (form.value.id) {
|
|
|
- await updateRecord(form.value).finally(() => buttonLoading.value = false);
|
|
|
- } else {
|
|
|
- await addRecord(form.value).finally(() => buttonLoading.value = false);
|
|
|
- }
|
|
|
- proxy ?.$modal.msgSuccess("操作成功");
|
|
|
- dialog.visible = false;
|
|
|
- await getList();
|
|
|
+};
|
|
|
+
|
|
|
+/** 取消按钮 */
|
|
|
+const cancel = () => {
|
|
|
+ reset();
|
|
|
+ dialog.visible = false;
|
|
|
+}
|
|
|
+
|
|
|
+/** 表单重置 */
|
|
|
+const reset = () => {
|
|
|
+ form.value = { ...initFormData };
|
|
|
+ ChrageRecordFormRef.value?.resetFields();
|
|
|
+}
|
|
|
+
|
|
|
+/** 搜索按钮操作 */
|
|
|
+const handleQuery = () => {
|
|
|
+ queryParams.value.pageNum = 1;
|
|
|
+ getList();
|
|
|
+}
|
|
|
+
|
|
|
+/** 重置按钮操作 */
|
|
|
+const resetQuery = () => {
|
|
|
+ queryFormRef.value?.resetFields();
|
|
|
+ queryParams.value.searchValue = undefined;
|
|
|
+ queryParams.value.visitType = undefined;
|
|
|
+ queryParams.value.chargeType = undefined;
|
|
|
+ queryParams.value.doorId = undefined;
|
|
|
+ queryParams.value.paymentMethod = undefined;
|
|
|
+ queryParams.value.paymentStatus = undefined;
|
|
|
+ handleQuery();
|
|
|
+}
|
|
|
+
|
|
|
+/** 多选框选中数据 */
|
|
|
+const handleSelectionChange = (selection: ChrageRecordVO[]) => {
|
|
|
+ ids.value = selection.map(item => item.id);
|
|
|
+ single.value = selection.length != 1;
|
|
|
+ multiple.value = !selection.length;
|
|
|
+}
|
|
|
+
|
|
|
+/** 新增按钮操作 */
|
|
|
+const handleAdd = () => {
|
|
|
+ reset();
|
|
|
+ dialog.visible = true;
|
|
|
+ dialog.title = "添加收费记录";
|
|
|
+}
|
|
|
+
|
|
|
+/** 修改按钮操作 */
|
|
|
+const handleDetail = async (row?: ChrageRecordVO) => {
|
|
|
+ reset();
|
|
|
+ rowData.value = row || {} as ChrageRecordVO;
|
|
|
+ console.log(JSON.stringify(row));
|
|
|
+ const _id = row?.id
|
|
|
+ const res = await getRecord(_id);
|
|
|
+ recipeDetailData.value = res.data.enteralNutritionList
|
|
|
+ evaluationData.value = res.data.nutritionEvaluationList
|
|
|
+ screeningData.value = res.data.nutritionScreeningList
|
|
|
+ recordLogData.value = res.data.recordLogList
|
|
|
+
|
|
|
+ prescriptionFee.value = res.data.prescriptionFee
|
|
|
+ Object.assign(form.value, res.data);
|
|
|
+ dialog.visible = true;
|
|
|
+ dialog.title = "收费详情";
|
|
|
+}
|
|
|
+
|
|
|
+/** 提交按钮 */
|
|
|
+const submitForm = () => {
|
|
|
+ ChrageRecordFormRef.value?.validate(async (valid: boolean) => {
|
|
|
+ if (valid) {
|
|
|
+ buttonLoading.value = true;
|
|
|
+ if (form.value.id) {
|
|
|
+ await updateRecord(form.value).finally(() => buttonLoading.value = false);
|
|
|
+ } else {
|
|
|
+ await addRecord(form.value).finally(() => buttonLoading.value = false);
|
|
|
}
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- /** 删除按钮操作 */
|
|
|
- const handleDelete = async (row ? : ChrageRecordVO) => {
|
|
|
- const _ids = row ?.id || ids.value;
|
|
|
- await proxy ?.$modal.confirm('是否确认删除收费记录编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
|
|
|
- await delRecord(_ids);
|
|
|
- proxy ?.$modal.msgSuccess("删除成功");
|
|
|
- await getList();
|
|
|
- }
|
|
|
-
|
|
|
- /** 导出按钮操作 */
|
|
|
- const handleExport = () => {
|
|
|
- proxy ?.download('system/record/export', {
|
|
|
- ...queryParams.value
|
|
|
- }, `record_${new Date().getTime()}.xlsx`)
|
|
|
- }
|
|
|
-
|
|
|
- function formatDate(date) {
|
|
|
- const pad = (n) => (n < 10 ? '0' + n : n);
|
|
|
- return date.getFullYear() + '-' + pad(date.getMonth() + 1) + '-' + pad(date.getDate());
|
|
|
- }
|
|
|
-
|
|
|
- onMounted(() => {
|
|
|
- getList();
|
|
|
- getDeptList()
|
|
|
- let now = new Date();
|
|
|
- let start = formatDate(now);
|
|
|
- let end = formatDate(new Date(now.getTime() - 24 * 60 * 60 * 1000 * 30));
|
|
|
- // orderTime.value = [end + ' 00:00:00', start + ' 23:59:59'];
|
|
|
- // createTime.value = [end + ' 00:00:00', start + ' 23:59:59'];
|
|
|
+ proxy?.$modal.msgSuccess("操作成功");
|
|
|
+ dialog.visible = false;
|
|
|
+ await getList();
|
|
|
+ }
|
|
|
});
|
|
|
+}
|
|
|
+
|
|
|
+/** 删除按钮操作 */
|
|
|
+const handleDelete = async (row?: ChrageRecordVO) => {
|
|
|
+ const _ids = row?.id || ids.value;
|
|
|
+ await proxy?.$modal.confirm('是否确认删除收费记录编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
|
|
|
+ await delRecord(_ids);
|
|
|
+ proxy?.$modal.msgSuccess("删除成功");
|
|
|
+ await getList();
|
|
|
+}
|
|
|
+
|
|
|
+/** 导出按钮操作 */
|
|
|
+const handleExport = () => {
|
|
|
+ proxy?.download('system/record/export', {
|
|
|
+ ...queryParams.value
|
|
|
+ }, `record_${new Date().getTime()}.xlsx`)
|
|
|
+}
|
|
|
+
|
|
|
+function formatDate(date) {
|
|
|
+ const pad = (n) => (n < 10 ? '0' + n : n);
|
|
|
+ return date.getFullYear() + '-' + pad(date.getMonth() + 1) + '-' + pad(date.getDate());
|
|
|
+}
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ getList();
|
|
|
+ getDeptList()
|
|
|
+ let now = new Date();
|
|
|
+ let start = formatDate(now);
|
|
|
+ let end = formatDate(new Date(now.getTime() - 24 * 60 * 60 * 1000 * 30));
|
|
|
+ // orderTime.value = [end + ' 00:00:00', start + ' 23:59:59'];
|
|
|
+ // createTime.value = [end + ' 00:00:00', start + ' 23:59:59'];
|
|
|
+});
|
|
|
</script>
|
|
|
<style lang="scss" scoped>
|
|
|
- .patient-info {
|
|
|
- background-color: #f5f7fa;
|
|
|
- padding: 16px;
|
|
|
- border-radius: 4px;
|
|
|
- margin-bottom: 20px;
|
|
|
- }
|
|
|
-
|
|
|
- .info-item {
|
|
|
- display: flex;
|
|
|
- margin-bottom: 12px;
|
|
|
- }
|
|
|
-
|
|
|
- .info-item .label {
|
|
|
- font-weight: bold;
|
|
|
- color: #606266;
|
|
|
- min-width: 100px;
|
|
|
- flex-shrink: 0;
|
|
|
- }
|
|
|
-
|
|
|
- .info-item .value {
|
|
|
- color: #303133;
|
|
|
- flex: 1;
|
|
|
- }
|
|
|
-
|
|
|
- .recipe-detail {
|
|
|
- margin-top: 20px;
|
|
|
- }
|
|
|
-
|
|
|
- .dialog-footer {
|
|
|
- text-align: center;
|
|
|
- }
|
|
|
-
|
|
|
- .dialog-footer .el-button {
|
|
|
- margin: 0 10px;
|
|
|
- }
|
|
|
-
|
|
|
- .prescription-table-wrapper {
|
|
|
- overflow-x: auto;
|
|
|
-
|
|
|
- .prescription-table {
|
|
|
- width: 100%;
|
|
|
- border-collapse: collapse;
|
|
|
+.patient-info {
|
|
|
+ background-color: #f5f7fa;
|
|
|
+ padding: 16px;
|
|
|
+ border-radius: 4px;
|
|
|
+ margin-bottom: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.info-item {
|
|
|
+ display: flex;
|
|
|
+ margin-bottom: 12px;
|
|
|
+}
|
|
|
+
|
|
|
+.info-item .label {
|
|
|
+ font-weight: bold;
|
|
|
+ color: #606266;
|
|
|
+ min-width: 100px;
|
|
|
+ flex-shrink: 0;
|
|
|
+}
|
|
|
+
|
|
|
+.info-item .value {
|
|
|
+ color: #303133;
|
|
|
+ flex: 1;
|
|
|
+}
|
|
|
+
|
|
|
+.recipe-detail {
|
|
|
+ margin-top: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog-footer {
|
|
|
+ text-align: center;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog-footer .el-button {
|
|
|
+ margin: 0 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.prescription-table-wrapper {
|
|
|
+ overflow-x: auto;
|
|
|
+
|
|
|
+ .prescription-table {
|
|
|
+ width: 100%;
|
|
|
+ border-collapse: collapse;
|
|
|
+ border: 1px solid #ddd;
|
|
|
+ background: white;
|
|
|
+ font-size: 14px;
|
|
|
+
|
|
|
+ th,
|
|
|
+ td {
|
|
|
border: 1px solid #ddd;
|
|
|
- background: white;
|
|
|
- font-size: 14px;
|
|
|
-
|
|
|
- th,
|
|
|
- td {
|
|
|
- border: 1px solid #ddd;
|
|
|
- padding: 10px 12px;
|
|
|
- text-align: center;
|
|
|
- vertical-align: middle;
|
|
|
- min-width: 90px;
|
|
|
- white-space: nowrap;
|
|
|
- overflow: hidden;
|
|
|
- text-overflow: ellipsis;
|
|
|
- }
|
|
|
+ padding: 10px 12px;
|
|
|
+ text-align: center;
|
|
|
+ vertical-align: middle;
|
|
|
+ min-width: 90px;
|
|
|
+ white-space: nowrap;
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ }
|
|
|
|
|
|
- th {
|
|
|
- background: #e8f4fd !important;
|
|
|
- color: #303133 !important;
|
|
|
- font-weight: 600 !important;
|
|
|
- font-size: 14px !important;
|
|
|
- height: 40px !important;
|
|
|
- }
|
|
|
+ th {
|
|
|
+ background: #e8f4fd !important;
|
|
|
+ color: #303133 !important;
|
|
|
+ font-weight: 600 !important;
|
|
|
+ font-size: 14px !important;
|
|
|
+ height: 40px !important;
|
|
|
+ }
|
|
|
|
|
|
- td {
|
|
|
- color: #303133;
|
|
|
- font-size: 14px;
|
|
|
- height: 36px;
|
|
|
+ td {
|
|
|
+ color: #303133;
|
|
|
+ font-size: 14px;
|
|
|
+ height: 36px;
|
|
|
|
|
|
- &:first-child {
|
|
|
- font-weight: 500;
|
|
|
- }
|
|
|
+ &:first-child {
|
|
|
+ font-weight: 500;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- // 斑马纹
|
|
|
- tbody tr:nth-child(even) {
|
|
|
- background: #fafbfc;
|
|
|
- }
|
|
|
+ // 斑马纹
|
|
|
+ tbody tr:nth-child(even) {
|
|
|
+ background: #fafbfc;
|
|
|
+ }
|
|
|
|
|
|
- // 悬停效果
|
|
|
- tbody tr:hover {
|
|
|
- background: #f0f9ff;
|
|
|
- }
|
|
|
+ // 悬停效果
|
|
|
+ tbody tr:hover {
|
|
|
+ background: #f0f9ff;
|
|
|
}
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- .setting-group {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- margin-bottom: 20px;
|
|
|
+.setting-group {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ margin-bottom: 20px;
|
|
|
|
|
|
- .setting-label {
|
|
|
- width: 180px;
|
|
|
- color: #606266;
|
|
|
- font-size: 14px;
|
|
|
- flex-shrink: 0;
|
|
|
- text-align: right;
|
|
|
-
|
|
|
- .required {
|
|
|
- color: #f56c6c;
|
|
|
- margin-right: 4px;
|
|
|
- }
|
|
|
- }
|
|
|
+ .setting-label {
|
|
|
+ width: 180px;
|
|
|
+ color: #606266;
|
|
|
+ font-size: 14px;
|
|
|
+ flex-shrink: 0;
|
|
|
+ text-align: right;
|
|
|
|
|
|
- .amount-value {
|
|
|
- color: #303133;
|
|
|
- font-size: 14px;
|
|
|
- font-weight: 500;
|
|
|
- min-width: 80px;
|
|
|
- text-align: left;
|
|
|
+ .required {
|
|
|
+ color: #f56c6c;
|
|
|
+ margin-right: 4px;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ .amount-value {
|
|
|
+ color: #303133;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: 500;
|
|
|
+ min-width: 80px;
|
|
|
+ text-align: left;
|
|
|
+ }
|
|
|
+}
|
|
|
</style>
|