统计查询
This commit is contained in:
parent
20c663592d
commit
a3a75276ca
@ -340,6 +340,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.mytable-style {
|
.mytable-style {
|
||||||
|
|
||||||
.vxe-header--column {
|
.vxe-header--column {
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
background-color: #1F6DD3 !important;
|
background-color: #1F6DD3 !important;
|
||||||
@ -359,7 +360,9 @@
|
|||||||
padding: 0 !important;
|
padding: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.vxe-table--render-default .vxe-body--column {
|
.vxe-table--render-default .vxe-body--column,
|
||||||
|
.vxe-footer--column,
|
||||||
|
.col--ellipsis {
|
||||||
height: 1.875rem !important;
|
height: 1.875rem !important;
|
||||||
line-height: 1.875rem !important;
|
line-height: 1.875rem !important;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -58,6 +58,7 @@ import { ElEmpty } from 'element-plus';
|
|||||||
import { comDict } from '@/utils/dict'
|
import { comDict } from '@/utils/dict'
|
||||||
import { getoptionselect } from '@/api/liswork/xtwh/localconfigApi'
|
import { getoptionselect } from '@/api/liswork/xtwh/localconfigApi'
|
||||||
import { Emits, Props } from '@/types';
|
import { Emits, Props } from '@/types';
|
||||||
|
import { getOptionSelect } from '@/hooks'
|
||||||
|
|
||||||
const props = withDefaults(defineProps<Props>(), {
|
const props = withDefaults(defineProps<Props>(), {
|
||||||
placeholder: "请选择",
|
placeholder: "请选择",
|
||||||
@ -175,6 +176,8 @@ const initData = async () => {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
dictRefs[props.dictType] = { value: dictList };
|
dictRefs[props.dictType] = { value: dictList };
|
||||||
|
|
||||||
|
getOptionSelect(props.dictType, dictList);
|
||||||
} else {
|
} else {
|
||||||
dictRefs = await comDict(props.dictType);
|
dictRefs = await comDict(props.dictType);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,6 +39,11 @@ export const formatDict = (v: string, dictType: string) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 通用接口获取的字典数据赋值方法
|
||||||
|
export const getOptionSelect = (dictType: string, list: any[]) => {
|
||||||
|
dictData.value[dictType] = list || [];
|
||||||
|
};
|
||||||
|
|
||||||
//仪器格式化方法
|
//仪器格式化方法
|
||||||
export const formatInstr = (v: string) => {
|
export const formatInstr = (v: string) => {
|
||||||
return instrOptions.value.find((item: any) => item.yq == v.trim())?.yqmc || v;
|
return instrOptions.value.find((item: any) => item.yq == v.trim())?.yqmc || v;
|
||||||
|
|||||||
304
src/views/liswork/Issueorder/components/info.vue
Normal file
304
src/views/liswork/Issueorder/components/info.vue
Normal file
@ -0,0 +1,304 @@
|
|||||||
|
<template>
|
||||||
|
<div class="labpat_box">
|
||||||
|
<el-form :model="labPat" label-width="70px" class="compact-form" label-position="right">
|
||||||
|
<el-form-item label="病人来源">
|
||||||
|
<el-col :span="14">
|
||||||
|
<SelectTable v-model:data="labPat.brly" :fields="brlyFields" dict-type="PT" placeholder="请选择" size="small"
|
||||||
|
@getDataValue="handleFieldChange" />
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="10">
|
||||||
|
<el-switch v-model="labPat.jzbz" active-text="急诊" active-color="#FD0101" active-value="1" inactive-value="0"
|
||||||
|
@change="handleFieldChange"></el-switch>
|
||||||
|
</el-col>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="病 历 号">
|
||||||
|
<el-input v-model="labPat.brdh" placeholder="请输入病历号" @change="handleFieldChange" size="small" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="姓 名">
|
||||||
|
<el-input v-model="labPat.brxm" placeholder="请输入姓名" @change="handleFieldChange" size="small" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="性 别">
|
||||||
|
<SelectTable v-model:data="labPat.brxb" dict-type="SX" placeholder="请选择" size="small"
|
||||||
|
@getDataValue="handleFieldChange" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="年龄">
|
||||||
|
<el-row :gutter="5">
|
||||||
|
<el-col :span="14">
|
||||||
|
<el-input v-model="labPat.nl" placeholder="年龄" @change="handleFieldChange" style="width:100%"
|
||||||
|
size="small" />
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="10">
|
||||||
|
<SelectTable v-model:data="labPat.nldw" dict-type="AU" placeholder="请选择" size="small"
|
||||||
|
@getDataValue="handleFieldChange" />
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="送检科室">
|
||||||
|
<SelectTable v-model:data="labPat.ksdh" dict-type="DP" placeholder="请选择" size="small"
|
||||||
|
@getDataValue="handleFieldChange" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="床 号">
|
||||||
|
<el-input v-model="labPat.ch" placeholder="请输入床号" @change="handleFieldChange" size="small" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="样本类型">
|
||||||
|
<SelectTable v-model:data="labPat.yblx" dict-type="BT" placeholder="请选择" size="small"
|
||||||
|
@getDataValue="handleFieldChange" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="申请医生">
|
||||||
|
<SelectTable v-model:data="labPat.sjys" dict-type="SRD" placeholder="请选择" size="small"
|
||||||
|
@getDataValue="handleFieldChange" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="上机时间">
|
||||||
|
<el-date-picker v-model="labPat.sqsj" type="datetime" placeholder="上机时间" format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss" @change="handleFieldChange" size="small" style="width: 100%;" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="采样时间">
|
||||||
|
<el-date-picker v-model="labPat.cyrq" type="datetime" placeholder="采样时间" format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss" @change="handleFieldChange" size="small" style="width: 100%;" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="报告时间">
|
||||||
|
<el-date-picker v-model="labPat.dysj" type="datetime" placeholder="报告时间" format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss" @change="handleFieldChange" size="small" style="width: 100%;" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="临床诊断">
|
||||||
|
<el-input v-model="labPat.zd" placeholder="请输入临床诊断" @change="handleFieldChange" size="small" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="备 注">
|
||||||
|
<el-input v-model="labPat.bz" placeholder="请输入备注" @change="handleFieldChange" size="small" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="检验医生">
|
||||||
|
<SelectTable v-model:data="labPat.yhdh" :fields="ysFields" :tableData="userList || []" label="nickName"
|
||||||
|
value="userName" objKey="userName" :border="true" placeholder="请选择" size="small"
|
||||||
|
@getDataValue="handleFieldChange" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="审核医生">
|
||||||
|
<SelectTable v-model:data="labPat.hdys" :fields="ysFields" :tableData="userList || []" label="nickName"
|
||||||
|
value="userName" objKey="userName" :border="true" placeholder="请选择" size="small"
|
||||||
|
@getDataValue="handleFieldChange" />
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, reactive, watch, toRaw, computed, onMounted } from 'vue';
|
||||||
|
import { changepatcolumn, updateLabPat } from "@/api/liswork/work/LisWork";
|
||||||
|
import SelectTable from '@/components/SelectTable/index.vue';
|
||||||
|
// @ts-ignore
|
||||||
|
import { listUser } from '@/api/system/user.js'
|
||||||
|
const props = defineProps({
|
||||||
|
labPat: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
//结果主键
|
||||||
|
labPatKey: {
|
||||||
|
type: Object,
|
||||||
|
default: () => { }
|
||||||
|
},
|
||||||
|
dictData: {
|
||||||
|
type: Object,
|
||||||
|
default: () => { }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const lastJgbz = ref();
|
||||||
|
watch(() => props.labPat, (newVal) => {
|
||||||
|
lastValue.value = JSON.stringify(newVal);
|
||||||
|
lastJgbz.value = newVal.jgbz;
|
||||||
|
})
|
||||||
|
|
||||||
|
const emit = defineEmits(['update:labPat']);
|
||||||
|
const lastValue = ref('');
|
||||||
|
|
||||||
|
const brlyFields = ref([
|
||||||
|
{ prop: 'value', label: '代号', width: 80, enablePinyinSearch: true },
|
||||||
|
{ prop: 'label', label: '名称', width: 120, enablePinyinSearch: true },
|
||||||
|
])
|
||||||
|
|
||||||
|
const ksdhFields = ref([
|
||||||
|
{ prop: 'value', label: '代号', width: 80, enablePinyinSearch: true },
|
||||||
|
{ prop: 'label', label: '名称', width: 150, enablePinyinSearch: true },
|
||||||
|
])
|
||||||
|
const ysFields = ref([
|
||||||
|
{ prop: 'userName', label: '用户代号', width: 80, enablePinyinSearch: true },
|
||||||
|
{ prop: 'nickName', label: '用户姓名', width: 150, enablePinyinSearch: true },
|
||||||
|
])
|
||||||
|
/**
|
||||||
|
* 通用字段变化处理(失焦、回车触发)
|
||||||
|
*/
|
||||||
|
const handleFieldChange = async () => {
|
||||||
|
// 将当前labPat转为字符串用于比较
|
||||||
|
const currentValue = JSON.stringify(props.labPat);
|
||||||
|
// 对比与上一次保存的值是否有变化
|
||||||
|
if (currentValue !== lastValue.value) {
|
||||||
|
// 找出变化的字段
|
||||||
|
const oldObj = JSON.parse(lastValue.value);
|
||||||
|
const newObj = props.labPat;
|
||||||
|
const changedField = getChangedField(oldObj, newObj);
|
||||||
|
if (changedField) {
|
||||||
|
// 这里可以添加实际的更新逻辑,比如调用接口
|
||||||
|
try {
|
||||||
|
// if (props.labPat.id) {
|
||||||
|
// updateLabPat({ ...props.labPatKey, column: changedField?.field, value: changedField?.newValue }).then((res: any) => {
|
||||||
|
// if (res.code == 0) {
|
||||||
|
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// } else {
|
||||||
|
// changepatcolumn({ ...props.labPatKey, column: changedField?.field, value: changedField?.newValue })
|
||||||
|
// }
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error('更新失败:', error);
|
||||||
|
// 失败时可以恢复旧值
|
||||||
|
emit('update:labPat', oldObj);
|
||||||
|
lastValue.value = JSON.stringify(oldObj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 完善字段变化检测方法
|
||||||
|
const getChangedField = (oldObj: { [key: string]: any }, newObj: { [key: string]: any }) => {
|
||||||
|
const oldKeys = Object.keys(oldObj);
|
||||||
|
for (const key of oldKeys) {
|
||||||
|
const oldVal = oldObj[key];
|
||||||
|
const newVal = newObj[key];
|
||||||
|
|
||||||
|
if (oldVal instanceof Date && newVal instanceof Date) {
|
||||||
|
if (oldVal.getTime() !== newVal.getTime()) {
|
||||||
|
return { field: key, oldValue: oldVal, newValue: newVal };
|
||||||
|
}
|
||||||
|
} else if (oldVal !== newVal) {
|
||||||
|
return { field: key, oldValue: oldVal, newValue: newVal };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const newKeys = Object.keys(newObj);
|
||||||
|
for (const key of newKeys) {
|
||||||
|
if (!(key in oldObj)) {
|
||||||
|
return { field: key, oldValue: undefined, newValue: newObj[key] };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const userList = ref([]);
|
||||||
|
onMounted(() => {
|
||||||
|
const data = { status: 0, del_flag: 0, pageSize: 1000, pageNum: 1 }
|
||||||
|
listUser(data).then((res: any) => {
|
||||||
|
userList.value = res.rows;
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.labpat_box {
|
||||||
|
height: calc(90vh - 20px);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.check_box {
|
||||||
|
:deep(.el-checkbox__input.is-checked+.el-checkbox__label) {
|
||||||
|
color: #f00 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-input__wrapper) {
|
||||||
|
box-shadow: 0 0 0 1px #96B8D9 inset;
|
||||||
|
background-color: rgba(236, 244, 251, 0.5);
|
||||||
|
color: #08355E;
|
||||||
|
|
||||||
|
|
||||||
|
.is-focus {
|
||||||
|
box-shadow: 0 0 0 1px #1f6dd3 inset !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
box-shadow: 0 0 0 1px #1f6dd3 inset !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
// .el-input__placeholder {
|
||||||
|
// color: none !important;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-select__wrapper) {
|
||||||
|
box-shadow: 0 0 0 1px #96B8D9 inset;
|
||||||
|
background-color: rgba(236, 244, 251, 0.5);
|
||||||
|
color: #08355E;
|
||||||
|
|
||||||
|
|
||||||
|
.is-focus {
|
||||||
|
box-shadow: 0 0 0 1px #1f6dd3 inset !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
box-shadow: 0 0 0 1px #1f6dd3 inset !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-select__placeholder {
|
||||||
|
color: #08355E !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-input__inner) {
|
||||||
|
color: #08355E !important;
|
||||||
|
-webkit-text-fill-color: #08355E;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
:deep(.el-select__input) {
|
||||||
|
color: #08355E !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.compact-form {
|
||||||
|
flex: 1;
|
||||||
|
position: relative;
|
||||||
|
height: 100%;
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
|
||||||
|
|
||||||
|
.el-form-item {
|
||||||
|
margin-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-form-item__label {
|
||||||
|
padding-bottom: 0px;
|
||||||
|
color: #08355E;
|
||||||
|
font-size: 12px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-form-item--default .el-form-item__label) {
|
||||||
|
height: 27px !important;
|
||||||
|
line-height: 27px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-form-item--default .el-form-item__content) {
|
||||||
|
line-height: 27px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
// pointer-events: none;
|
||||||
|
|
||||||
|
:deep(.el-radio__label) {
|
||||||
|
color: #08355E;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
:deep(.el-switch__label) {
|
||||||
|
color: #08355E;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
144
src/views/liswork/Issueorder/index.vue
Normal file
144
src/views/liswork/Issueorder/index.vue
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
/**
|
||||||
|
* @file index.vue 科内开单
|
||||||
|
* @author: w
|
||||||
|
* @since: 2026-03-02
|
||||||
|
*/
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<el-row :gutter="10" class="row-box">
|
||||||
|
<el-col :span="13" style="height: 100%;">
|
||||||
|
<div class="box-shadow">
|
||||||
|
<el-row :gutter="5">
|
||||||
|
<el-col :span="8">
|
||||||
|
<Info :lab-pat="labpat" :dict-data="dictData" />
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="16">
|
||||||
|
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="11" style="height: 100%;">
|
||||||
|
<div class="box-shadow">
|
||||||
|
<el-form :model="queryParams" inline size="small" label-width="5.5rem">
|
||||||
|
|
||||||
|
<el-form-item label="姓名:" prop="brxm">
|
||||||
|
<el-input v-model="queryParams.brxm" style="width: 9rem;" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="条码号:" prop="sqh">
|
||||||
|
<el-input v-model="queryParams.sqh" style="width: 9rem;" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="状态:" prop="zt">
|
||||||
|
<el-select v-model="queryParams.zt" placeholder="请选择" style="width: 9rem;" clearable>
|
||||||
|
<el-option label="已申请未打印" value="1" />
|
||||||
|
<el-option label="显示所有" value="0" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="登记时间:" prop="st">
|
||||||
|
<el-date-picker v-model="queryParams.st" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
|
||||||
|
style="width: 7.5rem;" /> -
|
||||||
|
<el-date-picker v-model="queryParams.et" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
|
||||||
|
style="width: 7.5rem;" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="">
|
||||||
|
<el-button type="primary" @click="handleQuery"> 查询 </el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div class="table-box">
|
||||||
|
<CustomVxeTable :table-data="labPatList" :loading="loading" :columns="tableColumns"
|
||||||
|
@current-change="handleRowClick" size="small"
|
||||||
|
:scrollYConfig="{ enabled: true, rSize: 30, height: '100%', }" :row-style="rowStyle"
|
||||||
|
:cell-style="cellStyle" class="mytable-style" ref="tableRef" :enable-column-drag="true"
|
||||||
|
@column-drag-end="handleColumnDragEnd">
|
||||||
|
</CustomVxeTable>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { templateRef } from '@vueuse/core'
|
||||||
|
import Info from './components/info.vue'
|
||||||
|
import { getDictData, formatDict, dictData } from '@/hooks'
|
||||||
|
import dayjs from 'dayjs'
|
||||||
|
const labpat = ref({})
|
||||||
|
|
||||||
|
const loading = ref(false)
|
||||||
|
const tableRef = templateRef('tableRef')
|
||||||
|
const labPatList = ref([])
|
||||||
|
const queryParams = ref({})
|
||||||
|
const tableColumns = ref([
|
||||||
|
{ field: 'brdh', title: '病历号', width: 80, align: 'center', resizable: true },
|
||||||
|
{ field: 'brxm', title: '姓名', width: 40, align: 'center', resizable: true, slotName: 'brxm' },
|
||||||
|
{ field: 'brxb', title: '性别', width: 30, align: 'center', slotName: 'brxb', resizable: true },
|
||||||
|
{ field: 'sqh', title: '条码号', width: 100, align: 'center', resizable: true, },
|
||||||
|
{ field: 'zt', title: '状态', width: 40, align: 'center', resizable: true, },
|
||||||
|
{ field: 'nl', title: '年', width: 30, align: 'center', resizable: true },
|
||||||
|
{ field: 'nldw', title: '龄', width: 20, align: 'center', slotName: 'nldw', resizable: true },
|
||||||
|
{ field: 'yblx', title: '标本', width: 50, align: 'center', resizable: true, slotName: 'yblx' },
|
||||||
|
{ field: 'yhdh', title: '检验医生', width: 60, align: 'center', resizable: true, slotName: 'yhdh' },
|
||||||
|
{ field: 'ksdh', title: '科室', width: 80, align: 'center', slotName: 'ksdh', resizable: true },
|
||||||
|
{ field: 'time', title: '登记时间', width: 80, align: 'center', resizable: true },
|
||||||
|
{ field: 'brly', title: '病人来源', width: 90, align: 'center', slotName: 'brly', resizable: true },
|
||||||
|
{ field: 'xmdh', title: '项目', width: 90, align: 'center', resizable: true },
|
||||||
|
])
|
||||||
|
|
||||||
|
const rowStyle = ({ row }) => {
|
||||||
|
}
|
||||||
|
|
||||||
|
const cellStyle = ({ row, column }) => {
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleRowClick = (row) => {
|
||||||
|
labpat.value = row
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新列配置
|
||||||
|
const handleColumnDragEnd = (data) => {
|
||||||
|
|
||||||
|
tableColumns.value = [];
|
||||||
|
|
||||||
|
nextTick(() => {
|
||||||
|
tableColumns.value = [...data.columns];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
queryParams.value.st = dayjs().format('YYYY-MM-DD')
|
||||||
|
queryParams.value.et = dayjs().format('YYYY-MM-DD')
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.app-container {
|
||||||
|
background: #F0F3F8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box-shadow {
|
||||||
|
height: 100%;
|
||||||
|
box-shadow: 2px 2px 4px 0px rgba(206, 217, 234, 0.7);
|
||||||
|
border-radius: .75rem;
|
||||||
|
padding: .5rem;
|
||||||
|
background-color: #fff;
|
||||||
|
|
||||||
|
.flex-between {
|
||||||
|
margin-bottom: .5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.row-box {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-box {
|
||||||
|
height: calc(100% - 60px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-form-item {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -46,20 +46,22 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</el-form>
|
</el-form>
|
||||||
|
|
||||||
<div class="print_box">
|
<div class="print_box">
|
||||||
<div class="title">{{ formatDict(userStore.sysLoginParam.loginYLJG, 'HOS') }}</div>
|
<div class="title">{{ formatDict(userStore.sysLoginParam.loginYLJG, 'HOS') }}</div>
|
||||||
<div class="content">{{ statsTitle }}</div>
|
<div class="content">{{ statsTitle }}</div>
|
||||||
<div class="table-container">
|
<div class="table-container">
|
||||||
<el-table :data="tableData" height="100%" border highlight-current-row v-loading="loading">
|
<vxe-table :data="tableData" border v-loading="loading" height="100%" class="mytable-style"
|
||||||
<el-table-column v-for="col in tableColumns" :key="col.prop" :label="col.label" :prop="col.prop"
|
:tooltip-config="{ appendToBody: true, zIndex: 3000 }" show-footer :footer-method="getSummaries"
|
||||||
width="100" />
|
:scroll-y="{ enabled: true, rSize: 30, height: '100%', }">
|
||||||
</el-table>
|
<vxe-column v-for="col in tableColumns" :key="col.prop" :title="col.label" :field="col.prop" width="100"
|
||||||
|
show-overflow align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
{{ col.dictType ? formatDict(scope.row[col.prop], col.dictType) : scope.row[col.prop] }}
|
||||||
|
</template>
|
||||||
|
</vxe-column>
|
||||||
|
</vxe-table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -118,9 +120,33 @@ const handletime = () => {
|
|||||||
// if (dayDiff === -1 || dayDiff === -2) return ElMessage.warning('请选择有效的日期范围');
|
// if (dayDiff === -1 || dayDiff === -2) return ElMessage.warning('请选择有效的日期范围');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const getSummaries = ({ columns, data }) => {
|
||||||
|
|
||||||
|
const sumSamplecnt = tableData.value.reduce((sum, item) => sum + item.cp_samplecnt, 0)
|
||||||
|
const sumCnt = tableData.value.reduce((sum, item) => sum + item.cp_cnt, 0)
|
||||||
|
const sumAmt = tableData.value.reduce((sum, item) => sum + item.cp_amt, 0).toFixed(2)
|
||||||
|
|
||||||
|
// 2. 定义合计行每一列的内容
|
||||||
|
const footerData = columns.map((column, index) => {
|
||||||
|
switch (column.field) {
|
||||||
|
case tableColumns.value[0].prop: // 第一列显示“合计”
|
||||||
|
return '合计'
|
||||||
|
case 'cp_samplecnt':
|
||||||
|
return sumSamplecnt
|
||||||
|
case 'cp_cnt':
|
||||||
|
return sumCnt
|
||||||
|
case 'cp_amt':
|
||||||
|
return sumAmt
|
||||||
|
default:
|
||||||
|
return '' // 其他列空值
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return [footerData]
|
||||||
|
};
|
||||||
|
|
||||||
const search = () => {
|
const search = () => {
|
||||||
const checkedCols = [...coloums.value, ...checkBoxs.value];
|
const checkedCols = [...coloums.value, ...checkBoxs.value];
|
||||||
console.log('checkedCols==>', checkedCols);
|
|
||||||
const arr = [];
|
const arr = [];
|
||||||
|
|
||||||
tableColumns.value.forEach((tableItem, tableIndex) => {
|
tableColumns.value.forEach((tableItem, tableIndex) => {
|
||||||
@ -130,7 +156,7 @@ const search = () => {
|
|||||||
if (matchItem) {
|
if (matchItem) {
|
||||||
arr.push({
|
arr.push({
|
||||||
...matchItem,
|
...matchItem,
|
||||||
paramSort: tableIndex,
|
paramSequence: matchItem.paramSequence ? matchItem.paramSequence : tableIndex + 1,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -140,10 +166,7 @@ const search = () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
unmatchedItems.forEach((item, unmatchIndex) => {
|
unmatchedItems.forEach((item, unmatchIndex) => {
|
||||||
arr.push({
|
arr.push({ ...item, });
|
||||||
...item,
|
|
||||||
paramSort: tableColumns.value.length + unmatchIndex,
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const data = {
|
const data = {
|
||||||
@ -151,9 +174,11 @@ const search = () => {
|
|||||||
Column: arr,
|
Column: arr,
|
||||||
Template: Template.value
|
Template: Template.value
|
||||||
};
|
};
|
||||||
console.log('data==>', data);
|
loading.value = true;
|
||||||
getstatsQuery(data).then(res => {
|
getstatsQuery(data).then(res => {
|
||||||
tableData.value = res.data
|
tableData.value = res.data
|
||||||
|
}).finally(() => {
|
||||||
|
loading.value = false;
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -164,16 +189,15 @@ const handleCheckBoxChange = (val) => {
|
|||||||
|
|
||||||
const checkedCols = val.map(paramCode => {
|
const checkedCols = val.map(paramCode => {
|
||||||
const matchItem = checkBoxs.value.find(item => item.paramCode === paramCode);
|
const matchItem = checkBoxs.value.find(item => item.paramCode === paramCode);
|
||||||
return matchItem ? { label: matchItem.paramName, prop: matchItem.paramCode } : null;
|
return matchItem ? { label: matchItem.paramName, prop: matchItem.paramCode, dictType: matchItem.remark } : null;
|
||||||
}).filter(Boolean); // 过滤null
|
}).filter(Boolean); // 过滤null
|
||||||
|
|
||||||
|
|
||||||
const fixedCols = coloums.value.map(item => ({
|
const fixedCols = coloums.value.map(item => ({
|
||||||
label: item.paramName,
|
label: item.paramName,
|
||||||
prop: item.paramCode,
|
prop: item.paramCode,
|
||||||
|
dictType: item.remark,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
||||||
tableColumns.value = [...checkedCols, ...fixedCols];
|
tableColumns.value = [...checkedCols, ...fixedCols];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,6 +210,7 @@ const getParams = () => {
|
|||||||
key: item.paramCode,
|
key: item.paramCode,
|
||||||
label: item.paramName,
|
label: item.paramName,
|
||||||
prop: item.paramCode,
|
prop: item.paramCode,
|
||||||
|
dictType: item.remark,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -229,7 +254,7 @@ onMounted(() => {
|
|||||||
|
|
||||||
.table-container {
|
.table-container {
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
height: calc(100% - 80px);
|
height: calc(100% - 100px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.tips {
|
.tips {
|
||||||
@ -237,4 +262,59 @@ onMounted(() => {
|
|||||||
color: #3282F6;
|
color: #3282F6;
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:deep(.el-table__footer-wrapper tfoot td.el-table__cell) {
|
||||||
|
color: #1f6dd3 !important;
|
||||||
|
font-weight: 700;
|
||||||
|
/* 可替换为任意颜色值 */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
:deep(.vxe-header--row th) {
|
||||||
|
border-color: #1F6DD3;
|
||||||
|
background-color: #1F6DD3;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.vxe-body--row td) {
|
||||||
|
border-color: #1F6DD3;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.vxe-table--row-hover) {
|
||||||
|
background-color: #1F6DD3;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.vxe-table--current-row) {
|
||||||
|
background-color: #1F6DD3;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-table-header-cell) {
|
||||||
|
cursor: move;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 表格边框
|
||||||
|
:deep(.vxe-table--render-default.border--full .vxe-body--column) {
|
||||||
|
background-image: linear-gradient(#96B8D9, #96B8D9), linear-gradient(#96B8D9, #96B8D9) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 表头边框
|
||||||
|
:deep(.vxe-table--render-default.border--full .vxe-header--column) {
|
||||||
|
background-image: linear-gradient(#1F6DD3, #1F6DD3), linear-gradient(#1F6DD3, #1F6DD3) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.vxe-table--render-default.is--padding .vxe-body--column:not(.col--ellipsis)) {
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.vxe-table--render-default .vxe-footer--column:not(.col--ellipsis)) {
|
||||||
|
padding: 0 !important;
|
||||||
|
color: #1f6dd3 !important;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.vxe-header--gutter),
|
||||||
|
:deep(.col--gutter) {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
Loading…
x
Reference in New Issue
Block a user