This commit is contained in:
wyuu 2025-11-13 18:32:03 +08:00
parent 2585c6bc76
commit 62eaf32b75
22 changed files with 4009 additions and 57 deletions

View File

@ -33,3 +33,19 @@ export function querySampleSignBack(query?: Object) {
params: query params: query
}) })
} }
// 标本报表
export function sampleTypeCount(query?: Object) {
return request({
url: '/transitReport/sampleTypeCount',
method: 'get',
params: query
})
}
// 标本报表费用
export function sampleitemCount(query?: Object) {
return request({
url: '/transitReport/itemCount',
method: 'get',
params: query
})
}

View File

@ -9,11 +9,11 @@
value-format="YYYY-MM-DD HH:mm:ss" @change="handletime" style="width: 25rem;" /> value-format="YYYY-MM-DD HH:mm:ss" @change="handletime" style="width: 25rem;" />
</el-form-item> </el-form-item>
<el-form-item label="医疗机构:" prop="yljg"> <!-- <el-form-item label="医疗机构:" prop="yljg">
<el-select v-model="queryParams.yljg" placeholder="请选择" style="width: 9.37rem;"> <el-select v-model="queryParams.yljg" placeholder="请选择" style="width: 9.37rem;">
<el-option v-for="item in dictData.HOS" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in dictData.HOS" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item> -->
<el-form-item label="条码状态:" prop="zt"> <el-form-item label="条码状态:" prop="zt">
<el-select v-model="queryParams.zt" placeholder="请选择" style="width: 6.25rem;"> <el-select v-model="queryParams.zt" placeholder="请选择" style="width: 6.25rem;">
<el-option v-for="item in dictData.ST" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in dictData.ST" :key="item.value" :label="item.label" :value="item.value" />

View File

@ -5,7 +5,7 @@
<el-row :gutter="10"> <el-row :gutter="10">
<el-col :span="4"> <el-col :span="4">
<el-form-item label="委托机构:" prop="SrcHospName"> <el-form-item label="委托机构:" prop="SrcHospName">
<SelectTable v-model:data="queryParams.srcHospName" :fields="ksdhFields" :tableData="hosList" <SelectTable v-model:data="queryParams.SrcHospName" :fields="ksdhFields" :tableData="hosList"
label="label" :size="aotuSize" value="label" objKey="label" :border="true" placeholder="请选择委托机构" /> label="label" :size="aotuSize" value="label" objKey="label" :border="true" placeholder="请选择委托机构" />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -18,12 +18,12 @@
<el-col :span="4"> <el-col :span="4">
<el-form-item label="条码号:" prop="Barcode"> <el-form-item label="条码号:" prop="Barcode">
<el-input v-model="queryParams.barcode" placeholder="请输入条码号" clearable /> <el-input v-model="queryParams.Barcode" placeholder="请输入条码号" clearable />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="4"> <el-col :span="4">
<el-form-item label="姓名:" prop="PatName"> <el-form-item label="姓名:" prop="PatName">
<el-input v-model="queryParams.patName" placeholder="请输入姓名" clearable /> <el-input v-model="queryParams.PatName" placeholder="请输入姓名" clearable />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="4"> <el-col :span="4">
@ -39,13 +39,13 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="4"> <el-col :span="4">
<el-form-item label="采样人:" prop="affirmUserName"> <el-form-item label="采样人:" prop="AffirmUserName">
<el-input v-model="queryParams.affirmUserName" placeholder="请输入采样人" clearable /> <el-input v-model="queryParams.AffirmUserName" placeholder="请输入采样人" clearable />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="4"> <el-col :span="4">
<el-form-item label="签收人:" prop="signInUserName"> <el-form-item label="签收人:" prop="SignInUserName">
<el-input v-model="queryParams.signInUserName" placeholder="请输入签收人" clearable /> <el-input v-model="queryParams.SignInUserName" placeholder="请输入签收人" clearable />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="4"> <el-col :span="4">
@ -129,7 +129,7 @@ const columns: any = ref([
{ prop: 'sampleTypeName', label: '标本类型', align: 'center', visible: true, }, { prop: 'sampleTypeName', label: '标本类型', align: 'center', visible: true, },
{ prop: 'tubeName', label: '采集容器', align: 'center', visible: true, }, { prop: 'tubeName', label: '采集容器', align: 'center', visible: true, },
{ prop: 'status', label: '标本状态', align: 'center', visible: true, slot: "status" }, { prop: 'status', label: '标本状态', align: 'center', visible: true, slot: "status" },
{ prop: 'moveStateName', label: '流转状态', align: 'center', visible: true, }, // { prop: 'moveStateName', label: '流转状态', align: 'center', visible: true, },
{ prop: 'affirmUserName', label: '采样人', align: 'center', visible: true, }, { prop: 'affirmUserName', label: '采样人', align: 'center', visible: true, },
{ prop: 'affirmTime', label: '采样时间', align: 'center', visible: true, width: 150 }, { prop: 'affirmTime', label: '采样时间', align: 'center', visible: true, width: 150 },
{ prop: 'signInUserName', label: '签收人', align: 'center', visible: true, }, { prop: 'signInUserName', label: '签收人', align: 'center', visible: true, },

View File

@ -5,7 +5,7 @@
<el-row :gutter="10"> <el-row :gutter="10">
<el-col :span="5"> <el-col :span="5">
<el-form-item label="委托机构:" prop="SrcHospName"> <el-form-item label="委托机构:" prop="SrcHospName">
<SelectTable v-model:data="queryParams.srcHospName" :fields="ksdhFields" :tableData="hosList" <SelectTable v-model:data="queryParams.SrcHospName" :fields="ksdhFields" :tableData="hosList"
label="label" :size="aotuSize" value="value" objKey="value" :border="true" placeholder="请选择委托机构" /> label="label" :size="aotuSize" value="value" objKey="value" :border="true" placeholder="请选择委托机构" />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -17,12 +17,12 @@
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
<el-form-item label="条码号:" prop="Barcode"> <el-form-item label="条码号:" prop="Barcode">
<el-input v-model="queryParams.barcode" placeholder="请输入条码号" clearable /> <el-input v-model="queryParams.Barcode" placeholder="请输入条码号" clearable />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
<el-form-item label="姓名:" prop="PatName"> <el-form-item label="姓名:" prop="PatName">
<el-input v-model="queryParams.patName" placeholder="请输入姓名" clearable /> <el-input v-model="queryParams.PatName" placeholder="请输入姓名" clearable />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
@ -58,7 +58,7 @@
<div class="mb10"> <div class="mb10">
<el-button type="primary" @click="qsHandle(50)">标本签收</el-button> <el-button type="primary" @click="qsHandle(50)">标本签收</el-button>
<el-button type="primary" @click="qsHandle(110)">标本拒签</el-button> <el-button type="primary" @click="qsHandle(110)">标本拒签</el-button>
<el-button type="primary" plain @click="qsHandle(100)">标本退回</el-button> <el-button type="primary" plain @click="bbThHandle">标本退回</el-button>
</div> </div>
<CustomTable ref="tableRefs" :data="tableData" :columns="columns" :config="tableConfig" :pagination="pagination" <CustomTable ref="tableRefs" :data="tableData" :columns="columns" :config="tableConfig" :pagination="pagination"
@ -86,7 +86,7 @@ import { listhospital } from "@/api/regional/dict/hospital.js";
// @ts-ignore // @ts-ignore
import { listregdict } from "@/api/regional/dict/regdict.js"; import { listregdict } from "@/api/regional/dict/regdict.js";
import { classCom } from '@/utils/classCom'; import { classCom } from '@/utils/classCom';
import { ElMessage } from 'element-plus'; import { ElMessage, ElMessageBox } from 'element-plus';
const aotuSize = classCom.useAutoSize(); const aotuSize = classCom.useAutoSize();
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
const router = useRouter() const router = useRouter()
@ -98,15 +98,15 @@ const tableData: any = ref([])
const columns: any = ref([ const columns: any = ref([
{ type: 'selection', align: 'center', visible: true, width: 40 }, { type: 'selection', align: 'center', visible: true, width: 40 },
{ prop: 'barcode', label: '条码号', align: 'center', visible: true, width: 150 }, { prop: 'barcode', label: '条码号', align: 'center', visible: true, width: 150 },
{ prop: 'srcHospName', label: '委托机构', align: 'center', visible: true, width: 200 }, { prop: 'srcHospName', label: '委托机构', align: 'center', visible: true, width: 250 },
{ prop: 'patName', label: '姓名', align: 'center', visible: true, width: 70 }, { prop: 'patName', label: '姓名', align: 'center', visible: true, width: 70 },
{ prop: 'patSex', label: '性别', align: 'center', visible: true, width: 60, slot: "patSex" }, { prop: 'patSex', label: '性别', align: 'center', visible: true, width: 60, slot: "patSex" },
{ prop: 'patAge', label: '年龄', align: 'center', visible: true, slot: "patAge", width: 60 }, { prop: 'patAge', label: '年龄', align: 'center', visible: true, slot: "patAge", width: 60 },
{ prop: 'checkPUR', label: '申请项目', align: 'center', visible: true, width: 200 }, { prop: 'checkPUR', label: '申请项目', align: 'center', visible: true, width: 250 },
{ prop: 'sampleTypeName', label: '标本类型', align: 'center', visible: true, }, { prop: 'sampleTypeName', label: '标本类型', align: 'center', visible: true, },
{ prop: 'tubeName', label: '采集容器', align: 'center', visible: true, }, { prop: 'tubeName', label: '采集容器', align: 'center', visible: true, },
{ prop: 'status', label: '标本状态', align: 'center', visible: true, slot: "status" }, { prop: 'status', label: '标本状态', align: 'center', visible: true, slot: "status" },
{ prop: 'moveStateName', label: '流转状态', align: 'center', visible: true, }, // { prop: 'moveStateName', label: '流转状态', align: 'center', visible: true, },
{ prop: 'affirmUserName', label: '采样人', align: 'center', visible: true, }, { prop: 'affirmUserName', label: '采样人', align: 'center', visible: true, },
{ prop: 'affirmTime', label: '采样时间', align: 'center', visible: true, width: 150 }, { prop: 'affirmTime', label: '采样时间', align: 'center', visible: true, width: 150 },
{ prop: 'dstHospName', label: '检测机构名称', align: 'center', visible: true, width: 150 }, { prop: 'dstHospName', label: '检测机构名称', align: 'center', visible: true, width: 150 },
@ -134,12 +134,29 @@ const tableRefs = ref(null)
const handleSelectionChange = (val: any) => { const handleSelectionChange = (val: any) => {
barcodes.value = val.map((item: any) => item.barcode) barcodes.value = val.map((item: any) => item.barcode)
} }
const backReasons = ref('')
const bbThHandle = () => {
if (!barcodes.value.length) return ElMessage.warning('请选择数据!')
ElMessageBox.prompt('请输入退回理由:', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
inputPattern: /\S+/,
inputErrorMessage: '请输入退回理由',
})
.then(({ value }) => {
backReasons.value = value
qsHandle(100)
}).catch(() => {
backReasons.value = ''
});
}
//标本签收 //标本签收
const qsHandle = (val: number) => { const qsHandle = (val: number) => {
if (!barcodes.value.length) return ElMessage.warning('请选择数据!') if (!barcodes.value.length) return ElMessage.warning('请选择数据!')
sampleSign({ status: val, barcode: barcodes.value }).then((res: any) => { sampleSign({ status: val, barcode: barcodes.value, backReasons: backReasons.value }).then((res: any) => {
if (res.code == 0) { if (res.code == 0) {
ElMessage.success(res.msg) ElMessage.success('操作成功!')
backReasons.value = ''
handleQuery() handleQuery()
} }
}) })

View File

@ -5,7 +5,7 @@
<el-row :gutter="10"> <el-row :gutter="10">
<el-col :span="5"> <el-col :span="5">
<el-form-item label="委托机构:" prop="SrcHospName"> <el-form-item label="委托机构:" prop="SrcHospName">
<SelectTable v-model:data="queryParams.srcHospName" :fields="ksdhFields" :tableData="hosList" <SelectTable v-model:data="queryParams.SrcHospName" :fields="ksdhFields" :tableData="hosList"
label="label" :size="aotuSize" value="value" objKey="value" :border="true" placeholder="请选择委托机构" /> label="label" :size="aotuSize" value="value" objKey="value" :border="true" placeholder="请选择委托机构" />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -17,12 +17,12 @@
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
<el-form-item label="条码号:" prop="Barcode"> <el-form-item label="条码号:" prop="Barcode">
<el-input v-model="queryParams.barcode" placeholder="请输入条码号" clearable /> <el-input v-model="queryParams.Barcode" placeholder="请输入条码号" clearable />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
<el-form-item label="姓名:" prop="PatName"> <el-form-item label="姓名:" prop="PatName">
<el-input v-model="queryParams.patName" placeholder="请输入姓名" clearable /> <el-input v-model="queryParams.PatName" placeholder="请输入姓名" clearable />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
@ -93,21 +93,19 @@ const queryParams: any = ref({
}) })
const tableData: any = ref([]) const tableData: any = ref([])
const columns: any = ref([ const columns: any = ref([
{ type: 'selection', align: 'center', visible: true, }, { type: 'selection', align: 'center', visible: true, width: 40 },
{ prop: 'barcode', label: '处理状态', align: 'center', visible: true, },
{ prop: 'barcode', label: '条码号', align: 'center', visible: true, }, { prop: 'barcode', label: '条码号', align: 'center', visible: true, },
{ prop: 'patName', label: '姓名', align: 'center', visible: true, }, { prop: 'patName', label: '姓名', align: 'center', visible: true, width: 60 },
{ prop: 'patSex', label: '性别', align: 'center', visible: true, width: 60, slot: "patSex" }, { prop: 'patSex', label: '性别', align: 'center', visible: true, width: 60, slot: "patSex" },
{ prop: 'patAge', label: '年龄', align: 'center', visible: true, slot: "patAge", width: 60 }, { prop: 'patAge', label: '年龄', align: 'center', visible: true, slot: "patAge", width: 60 },
{ prop: 'checkPUR', label: '申请项目', align: 'center', visible: true, }, { prop: 'checkPUR', label: '申请项目', align: 'center', visible: true, width: 200 },
{ prop: 'srcHospName', label: '委托机构', align: 'center', visible: true, }, { prop: 'srcHospName', label: '委托机构', align: 'center', visible: true, width: 200 },
{ prop: 'srcHospName', label: '检测机构', align: 'center', visible: true, }, { prop: 'srcHospName', label: '检测机构', align: 'center', visible: true, width: 200 },
{ prop: 'Status', label: '标本状态', align: 'center', visible: true, slot: "status" }, { prop: 'Status', label: '标本状态', align: 'center', visible: true, slot: "status" },
{ prop: '', label: '退回理由', align: 'center', visible: true, }, { prop: 'backReasons', label: '退回理由', align: 'center', visible: true, width: 150 },
{ prop: 'affirmTime', label: '采样时间', align: 'center', visible: true, }, { prop: 'affirmTime', label: '采样时间', align: 'center', visible: true, width: 150 },
{ prop: 'signInUserName', label: '操作人', align: 'center', visible: true, }, { prop: 'backUserName', label: '操作人', align: 'center', visible: true, },
{ prop: 'signInTime', label: '操作时间', align: 'center', visible: true, }, { prop: 'backTime', label: '操作时间', align: 'center', visible: true, width: 150 },
{ prop: 'bz', label: '备注', align: 'center', visible: true, },
]) ])
const tableConfig = ref({ const tableConfig = ref({
border: true, // 边框 border: true, // 边框
@ -134,7 +132,7 @@ const thHandle = (val: number) => {
if (!barcodes.value.length) return ElMessage.warning('请选择数据!') if (!barcodes.value.length) return ElMessage.warning('请选择数据!')
sampleSign({ status: val, barcode: barcodes.value }).then((res: any) => { sampleSign({ status: val, barcode: barcodes.value }).then((res: any) => {
if (res.code == 0) { if (res.code == 0) {
ElMessage.success('标本签收成功!') ElMessage.success('操作成功!')
handleQuery() handleQuery()
} }
}) })

View File

@ -5,7 +5,7 @@
<el-row :gutter="10"> <el-row :gutter="10">
<el-col :span="5"> <el-col :span="5">
<el-form-item label="委托机构:" prop="SrcHospName"> <el-form-item label="委托机构:" prop="SrcHospName">
<SelectTable v-model:data="queryParams.srcHospName" :fields="ksdhFields" :tableData="hosList" <SelectTable v-model:data="queryParams.SrcHospName" :fields="ksdhFields" :tableData="hosList"
label="label" :size="aotuSize" value="value" objKey="value" :border="true" placeholder="请选择委托机构" /> label="label" :size="aotuSize" value="value" objKey="value" :border="true" placeholder="请选择委托机构" />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -19,12 +19,12 @@
<el-col :span="5"> <el-col :span="5">
<el-form-item label="条码号:" prop="Barcode"> <el-form-item label="条码号:" prop="Barcode">
<el-input v-model="queryParams.barcode" placeholder="请输入条码号" clearable @change="handleQuery" /> <el-input v-model="queryParams.Barcode" placeholder="请输入条码号" clearable @change="handleQuery" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
<el-form-item label="姓名:" prop="PatName"> <el-form-item label="姓名:" prop="PatName">
<el-input v-model="queryParams.patName" placeholder="请输入姓名" clearable @change="handleQuery" /> <el-input v-model="queryParams.PatName" placeholder="请输入姓名" clearable @change="handleQuery" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
@ -61,16 +61,17 @@
<div class="cz_box"> <div class="cz_box">
<el-row :gutter="10"> <el-row :gutter="10">
<el-col :span="1.5"> 送检医院:</el-col> <el-col :span="1.5"> 送检医院:</el-col>
<el-col :span="3"> <el-col :span="4">
<SelectTable v-model:data="queryParams.DstHospName" :fields="ksdhFields" :tableData="hosList" label="label" <SelectTable v-model:data="dstHospCode" :fields="ksdhFields" :tableData="hosList" label="label"
:size="aotuSize" value="label" objKey="label" :border="true" placeholder="请选择" /> :size="aotuSize" value="value" objKey="value" :border="true" placeholder="请选择" @get-data-value="getValue" />
</el-col> </el-col>
<el-col :span="1.5"> <el-button type="primary">标本送检</el-button></el-col> <el-col :span="1.5"> <el-button type="primary" :size="aotuSize" @click="sjHandle(30)">标本送检</el-button></el-col>
<el-col :span="1.5"> <el-button type="primary">取消送检</el-button></el-col> <el-col :span="1.5"> <el-button type="primary" :size="aotuSize" @click="sjHandle(20)">取消送检</el-button></el-col>
</el-row> </el-row>
</div> </div>
<CustomTable ref="tableRefs" :data="tableData" :columns="columns" :config="tableConfig" :pagination="pagination"> <CustomTable ref="tableRefs" :data="tableData" :columns="columns" :config="tableConfig" :pagination="pagination"
@selection-change="handleSelectionChange" @size-change="sizeChange" @page-change="currentChange">
<template #patAge="{ row }"> <template #patAge="{ row }">
{{ row.patAge }}{{ row.ageUnit }} {{ row.patAge }}{{ row.ageUnit }}
</template> </template>
@ -87,13 +88,14 @@
<script setup lang="ts"> <script setup lang="ts">
import CustomTable from '@/components/elTable/index.vue' import CustomTable from '@/components/elTable/index.vue'
import { querySample } from '@/api/regional/index' import { querySample, sampleSign } from '@/api/regional/index'
// @ts-ignore // @ts-ignore
import { listhospital } from "@/api/regional/dict/hospital.js"; import { listhospital } from "@/api/regional/dict/hospital.js";
// @ts-ignore // @ts-ignore
import { listregdict } from "@/api/regional/dict/regdict.js"; import { listregdict } from "@/api/regional/dict/regdict.js";
import SelectTable from '@/components/SelectTable/index.vue'; import SelectTable from '@/components/SelectTable/index.vue';
import { classCom } from '@/utils/classCom'; import { classCom } from '@/utils/classCom';
import { ElMessage } from 'element-plus';
const aotuSize = classCom.useAutoSize(); const aotuSize = classCom.useAutoSize();
const queryParams: any = ref({ const queryParams: any = ref({
@ -103,14 +105,14 @@ const queryParams: any = ref({
}) })
const tableData: any = ref([]) const tableData: any = ref([])
const columns: any = ref([ const columns: any = ref([
{ type: 'selection', align: 'center', visible: true, }, { type: 'selection', align: 'center', visible: true, width: 40 },
{ prop: 'barcode', label: '条码号', align: 'center', visible: true, }, { prop: 'barcode', label: '条码号', align: 'center', visible: true, },
{ prop: 'srcHospName', label: '委托机构', align: 'center', visible: true, width: 200 }, { prop: 'srcHospName', label: '委托机构', align: 'center', visible: true, width: 250 },
{ prop: 'patName', label: '姓名', align: 'center', visible: true, width: 60 }, { prop: 'patName', label: '姓名', align: 'center', visible: true, width: 60 },
{ prop: 'patSex', label: '性别', align: 'center', visible: true, width: 60, slot: "patSex" }, { prop: 'patSex', label: '性别', align: 'center', visible: true, width: 60, slot: "patSex" },
{ prop: 'patAge', label: '年龄', align: 'center', visible: true, slot: "patAge", width: 60 }, { prop: 'patAge', label: '年龄', align: 'center', visible: true, slot: "patAge", width: 60 },
{ prop: 'checkPUR', label: '申请项目', align: 'center', visible: true, width: 200 }, { prop: 'checkPUR', label: '申请项目', align: 'center', visible: true, width: 250 },
{ prop: 'sampleTypeName', label: '标本类型名称', align: 'center', visible: true, }, { prop: 'sampleTypeName', label: '标本类型', align: 'center', visible: true, },
{ prop: 'status', label: '标本状态', align: 'center', visible: true, slot: "status" }, { prop: 'status', label: '标本状态', align: 'center', visible: true, slot: "status" },
{ prop: 'affirmUserName', label: '采样人', align: 'center', visible: true, }, { prop: 'affirmUserName', label: '采样人', align: 'center', visible: true, },
{ prop: 'affirmTime', label: '采样时间', align: 'center', visible: true, width: 150 }, { prop: 'affirmTime', label: '采样时间', align: 'center', visible: true, width: 150 },
@ -132,15 +134,41 @@ const pagination = ref({
}) })
const ksdhFields = ref([ const ksdhFields = ref([
{ prop: 'label', label: '名称', enablePinyinSearch: true }, { prop: 'label', label: '名称', width: 150, enablePinyinSearch: true },
{ prop: 'value', label: '代号', width: 80, enablePinyinSearch: true }, { prop: 'value', label: '代号', width: 120, enablePinyinSearch: true },
]) ])
const dstHospName = ref('')
const dstHospCode = ref('')
const barcodes = ref([]) const barcodes = ref([])
const handleSelectionChange = (val: any) => { const handleSelectionChange = (val: any) => {
barcodes.value = val.map((item: any) => item.barcode) barcodes.value = val.map((item: any) => item.barcode)
} }
const getValue = (val: any) => {
console.log('val==>', val);
dstHospName.value = val.label
}
const sjHandle = (val: number) => {
if (!barcodes.value.length) return ElMessage.warning('请选择数据!')
if (!dstHospCode.value) return ElMessage.warning('请选择送检医院!')
const params = {
barcode: barcodes.value,
dstHospName: dstHospName.value,
dstHospCode: dstHospCode.value,
status: val
}
sampleSign(params).then((res: any) => {
if (res.code == 0) {
ElMessage.success('操作成功!')
handleQuery()
dstHospCode.value = ''
}
})
}
const currentChange = (page: { currentPage: number, pageSize: number }) => { const currentChange = (page: { currentPage: number, pageSize: number }) => {
queryParams.value.pageNum = page.currentPage queryParams.value.pageNum = page.currentPage
handleQuery() handleQuery()

View File

@ -9,10 +9,9 @@
value-format="YYYY-MM-DD HH:mm:ss" @change="handletime" style="width: 25rem;" /> value-format="YYYY-MM-DD HH:mm:ss" @change="handletime" style="width: 25rem;" />
</el-form-item> </el-form-item>
<el-form-item label="医疗机构:" prop="yljg"> <el-form-item label="委托机构:" prop="SrcHospName">
<el-select v-model="queryParams.yljg" placeholder="请选择" style="width: 9.37rem;"> <SelectTable v-model:data="queryParams.SrcHospName" :fields="ksdhFields" :tableData="hosList" label="label"
<el-option v-for="item in dictData.HOS" :key="item.value" :label="item.label" :value="item.value" /> width="12.5rem" :size="aotuSize" value="label" objKey="label" :border="true" placeholder="请选择委托机构" />
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="条码状态:" prop="zt"> <el-form-item label="条码状态:" prop="zt">
<el-select v-model="queryParams.zt" placeholder="请选择" style="width: 6.25rem;"> <el-select v-model="queryParams.zt" placeholder="请选择" style="width: 6.25rem;">
@ -166,9 +165,12 @@ import CustomTable from '@/components/elTable/index.vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { usePrintStore } from '@/store/modules/printStore' import { usePrintStore } from '@/store/modules/printStore'
import { fetchCodeList, addObj, fetchCodeDetail, fetchCodeExec, fetchCodeReqmain } from '@/api/checkCode/index' import { fetchCodeList, addObj, fetchCodeDetail, fetchCodeExec, fetchCodeReqmain } from '@/api/checkCode/index'
// @ts-ignore
import { listhospital } from "@/api/regional/dict/hospital.js";
const aotuSize = classCom.useAutoSize(); const aotuSize = classCom.useAutoSize();
//@ts-ignore //@ts-ignore
import { comDict } from '@/utils/dict' import { comDict } from '@/utils/dict'
import SelectTable from '@/components/SelectTable/index.vue';
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
const router = useRouter() const router = useRouter()
const printStore = usePrintStore(); const printStore = usePrintStore();
@ -184,6 +186,7 @@ interface QueryParams {
zt: string; zt: string;
failed4: string; failed4: string;
failed5: string; failed5: string;
SrcHospName: string;
} }
// 提交表单数据 // 提交表单数据
const queryParams = reactive<QueryParams>({ const queryParams = reactive<QueryParams>({
@ -191,6 +194,7 @@ const queryParams = reactive<QueryParams>({
// times: [], // times: [],
yljg: '1', yljg: '1',
zt: '', zt: '',
SrcHospName: '',
failed4: '', failed4: '',
failed5: '', failed5: '',
}); });
@ -248,7 +252,7 @@ const loading = ref(true);
const tableData = ref([]) const tableData = ref([])
// 配置项 // 配置项
const columns = ref([ const columns = ref([
{ type: 'selection', visible: true, align: 'center', width: 35, label: '多选框' }, { type: 'selection', visible: true, align: 'center', width: 40, label: '多选框' },
{ prop: 'srcHospName', label: '委托机构', visible: true, align: 'center', width: 200, slot: 'srcHospName' }, { prop: 'srcHospName', label: '委托机构', visible: true, align: 'center', width: 200, slot: 'srcHospName' },
{ prop: 'zt', label: '打印', visible: true, align: 'center', slot: 'dy', width: 40 }, { prop: 'zt', label: '打印', visible: true, align: 'center', slot: 'dy', width: 40 },
{ prop: 'jzbz', label: '急', align: 'center', visible: true, slot: 'jzbz', width: 30 }, { prop: 'jzbz', label: '急', align: 'center', visible: true, slot: 'jzbz', width: 30 },
@ -297,6 +301,10 @@ const cellStyleHd = ({ row, column, rowIndex, columnIndex }: {
} }
}; };
const ksdhFields = ref([
{ prop: 'label', label: '名称', width: 150, enablePinyinSearch: true },
{ prop: 'value', label: '代号', width: 120, enablePinyinSearch: true },
])
const rowClassNameHd = ({ row, rowIndex }: { const rowClassNameHd = ({ row, rowIndex }: {
row: any; row: any;
@ -535,6 +543,7 @@ const cancelHandle = () => {
} }
const hosList = ref([])
onMounted(async () => { onMounted(async () => {
// 初始化3天区间(今天-前两天) // 初始化3天区间(今天-前两天)
// const end = dayjs().format('YYYY-MM-DD HH:mm:ss'); // const end = dayjs().format('YYYY-MM-DD HH:mm:ss');
@ -552,7 +561,17 @@ onMounted(async () => {
HOS: toRaw(dictRefs.HOS.value) || [], HOS: toRaw(dictRefs.HOS.value) || [],
ST: toRaw(dictRefs.ST.value) || [], ST: toRaw(dictRefs.ST.value) || [],
}; };
});
listhospital().then((res: any) => {
hosList.value = res.rows.map((item: any) => {
return {
label: item.hospitalName,
value: item.hospitalCode
}
})
});
})
// 字典格式化方法 // 字典格式化方法
const formatDict = (v: string, dictType: string) => { const formatDict = (v: string, dictType: string) => {

View File

@ -0,0 +1,238 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-form-item label="参数代号" prop="dictCode">
<el-input v-model="queryParams.dictCode" placeholder="请输入" clearable style="width: 200px"
@keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="参数名称" prop="dictName">
<el-input v-model="queryParams.dictName" placeholder="请输入" clearable style="width: 200px"
@keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="状态" clearable style="width: 200px">
<el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="regdictList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="参数代号" align="center" prop="dictCode" />
<el-table-column label="参数名称" align="center" prop="dictName" />
<el-table-column label="参数值" align="center" prop="remark" />
<el-table-column label="排序" align="center" prop="dictSort" />
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="180" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
</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" />
<!-- 添加或修改字典对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="regdictRef" :model="form" :rules="rules" label-width="150px">
<el-form-item label="参数代号" prop="dictCode">
<el-input v-model="form.dictCode" placeholder="请输入参数代号" />
</el-form-item>
<el-form-item label="参数名称" prop="dictName">
<el-input v-model="form.dictName" placeholder="请输入参数名称" />
</el-form-item>
<el-form-item label="顺序" prop="dictSort">
<el-input-number v-model="form.dictSort" controls-position="right" :min="0" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label
}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="参数值" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="regdict">
import { listregdict, addregdict, delregdict, getregdict, updateregdict } from "@/api/regional/dict/regdict.js";
const { proxy } = getCurrentInstance();
const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
const route = useRoute();
const regdictList = ref([]);
const open = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
const menuname = ref("字典");
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 15,
dictCode: undefined,
dictName: undefined,
dictType: undefined,
status: undefined
},
rules: {
dictName: [{ required: true, message: "参数名称不能为空", trigger: "blur" }],
dictCode: [{ required: true, message: "参数代号不能为空", trigger: "blur" }],
dictSort: [{ required: true, message: "顺序不能为空", trigger: "blur" }],
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询字典列表 */
function getList() {
loading.value = true;
listregdict(queryParams.value).then(response => {
regdictList.value = response.rows;
total.value = response.total;
loading.value = false;
});
}
/** 取消按钮 */
function cancel() {
open.value = false;
reset();
}
/** 表单重置 */
function reset() {
form.value = {
dictId: undefined,
dictCode: undefined,
dictName: undefined,
dictType: queryParams.value.dictType,
dictSort: 0,
status: "0",
remark: undefined
};
proxy.resetForm("regdictRef");
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
function resetQuery() {
proxy.resetForm("queryRef");
handleQuery();
}
/** 多选框选中数据 */
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.dictId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
function handleAdd() {
reset();
open.value = true;
title.value = "添加参数"
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset();
const dictId = row.dictId || ids.value;
getregdict(dictId).then(response => {
form.value = response.data;
open.value = true;
title.value = "修改参数"
});
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["regdictRef"].validate(valid => {
if (valid) {
if (form.value.dictId != undefined) {
updateregdict(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
addregdict(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
}
}
});
}
/** 删除按钮操作 */
function handleDelete(row) {
const dictIds = row.dictId || ids.value;
proxy.$modal.confirm('是否确认删除参数编号为' + dictIds + '"的数据项?').then(function () {
return delregdict(dictIds);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => { });
}
/** 导出按钮操作 */
function handleExport() {
proxy.download("system/regdict/export", {
...queryParams.value
}, `dict_${new Date().getTime()}.xlsx`);
}
getTypes(route.query && route.query.dictType, route.query && route.query.typeName);
/** 查询字典类型详细 */
function getTypes(dictType, typeName) {
queryParams.value.dictType = dictType;
menuname.value = typeName;
getList();
}
</script>

View File

@ -0,0 +1,172 @@
<template>
<div class="app-container">
<div class="compact-form">
<el-form :model="queryParams" ref="queryRef" label-width="5rem" style="width: 100%;" :size="aotuSize">
<el-row :gutter="10">
<el-col :span="5">
<el-form-item label="所属医院:" prop="DstHospName">
<SelectTable v-model:data="queryParams.DstHospName" :fields="ksdhFields" :tableData="hosList"
label="label" :size="aotuSize" value="label" objKey="label" :border="true" placeholder="请选择" />
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="标本类型:" prop="SampleTypeName">
<el-select v-model="queryParams.SampleTypeName" placeholder="请选择" clearable>
<el-option v-for="item in regdictList" :label="item.dictName" :value="item.dictCode" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="开单时间:" prop="times">
<el-date-picker v-model="queryParams.times" type="daterange" range-separator="-" start-placeholder="开始时间"
end-placeholder="结束时间" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-button type="primary" @click="handleQuery">查询</el-button>
<el-button @click="resetHandle">重置</el-button>
</el-col>
</el-row>
</el-form>
</div>
<div class="mb10">
<!-- <el-button type="primary" @click="thHandle(20)">重新采集</el-button>
<el-button type="primary" @click="thHandle(50)">撤销退回</el-button>
<el-button type="primary" @click="thHandle(90)">申请作废</el-button> -->
</div>
<CustomTable ref="tableRefs" :data="tableData" :columns="columns" :config="tableConfig" :pagination="pagination"
@size-change="sizeChange" @page-change="currentChange">
</CustomTable>
</div>
</template>
<script setup lang="ts">
import CustomTable from '@/components/elTable/index.vue'
import { sampleTypeCount } from '@/api/regional/index'
import SelectTable from '@/components/SelectTable/index.vue';
import { classCom } from '@/utils/classCom';
// @ts-ignore
import { listhospital } from "@/api/regional/dict/hospital.js";
// @ts-ignore
import { listregdict } from "@/api/regional/dict/regdict.js";
import { ElMessage } from 'element-plus';
const aotuSize = classCom.useAutoSize();
const queryParams: any = ref({
pageSize: 50,
pageNum: 1,
})
const tableData: any = ref([])
const columns: any = ref([
{ prop: 'srchospname', label: '所属医院', align: 'center', visible: true, },
{ prop: 'sampletypecode', label: '标本代码', align: 'center', visible: true, },
{ prop: 'sampletypename', label: '标本类别', align: 'center', visible: true, },
{ prop: 'sl', label: '数量(份)', align: 'center', visible: true, },
{ prop: 'OrderTime', label: '开单时间', align: 'center', visible: true, },
])
const tableConfig = ref({
border: true, // 边框
height: '75vh', // 高度
highlightCurrentRow: true, // 高亮当前行
summary: true,
summaryField: ['sl'],//计算列总和
sumText: '合计'
})
const pagination = ref({
show: true,
total: 0,
pageSize: 50,
currentPage: 1,
})
const ksdhFields = ref([
{ prop: 'label', label: '名称', width: 150, enablePinyinSearch: true },
{ prop: 'value', label: '代号', width: 120, enablePinyinSearch: true },
])
const barcodes = ref([])
const tableRefs = ref(null)
const handleSelectionChange = (val: any) => {
barcodes.value = val.map((item: any) => item.barcode)
}
const currentChange = (page: { currentPage: number, pageSize: number }) => {
queryParams.value.pageNum = page.currentPage
handleQuery()
}
const sizeChange = (page: { currentPage: number, pageSize: number }) => {
queryParams.value.pageSize = page.pageSize
handleQuery()
}
const handleQuery = () => {
if (queryParams.value.times && queryParams.value.times.length > 0) {
queryParams.value.DateStart = queryParams.value.times[0]
queryParams.value.DateEnd = queryParams.value.times[1]
} else {
queryParams.value.DateStart = ''
queryParams.value.DateEnd = ''
}
getList()
}
const resetHandle = () => {
queryParams.value = {
pageSize: 50,
pageNum: 1,
}
handleQuery()
}
const getList = () => {
sampleTypeCount(queryParams.value).then((res: any) => {
tableData.value = res.rows
pagination.value.total = res.total
})
}
const hosList = ref([])
const regdictList: any = ref([])
onMounted(() => {
getList()
listhospital().then((res: any) => {
hosList.value = res.rows.map((item: any) => {
return {
label: item.hospitalName,
value: item.hospitalCode
}
})
})
listregdict({ pageSize: 100, pageNum: 1, dictType: 'BT' }).then((res: any) => {
regdictList.value = res.rows
})
})
const formatDict = (v: string, arr: Array<any>) => {
return arr.find((item: any) => item.dictCode == v)?.dictName || v;
};
</script>
<style scoped lang="scss">
.compact-form {
.el-form-item {
margin-bottom: 5px;
}
}
.btns {
display: flex;
flex-direction: column;
justify-content: space-around;
&>button {
width: 100%;
margin-left: 0;
margin-bottom: 5px;
}
}
</style>

View File

@ -0,0 +1,181 @@
<template>
<div class="app-container">
<div class="compact-form">
<el-form :model="queryParams" ref="queryRef" label-width="5rem" style="width: 100%;" :size="aotuSize">
<el-row :gutter="10">
<el-col :span="5">
<el-form-item label="就诊医院:" prop="SrcHospName">
<SelectTable v-model:data="queryParams.SrcHospName" :fields="ksdhFields" :tableData="hosList"
label="label" :size="aotuSize" value="value" objKey="value" :border="true" placeholder="请选择委托机构" />
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="检测医院:" prop="DstHospName">
<SelectTable v-model:data="queryParams.DstHospName" :fields="ksdhFields" :tableData="hosList"
label="label" :size="aotuSize" value="label" objKey="label" :border="true" placeholder="请选择" />
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="日期:" prop="times">
<el-date-picker v-model="queryParams.times" type="daterange" range-separator="-" start-placeholder="开始时间"
end-placeholder="结束时间" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-button type="primary" @click="handleQuery">查询</el-button>
<el-button @click="resetHandle">重置</el-button>
</el-col>
</el-row>
</el-form>
</div>
<div class="mb10">
<!-- <el-button type="primary" @click="thHandle(20)">重新采集</el-button>
<el-button type="primary" @click="thHandle(50)">撤销退回</el-button>
<el-button type="primary" @click="thHandle(90)">申请作废</el-button> -->
</div>
<CustomTable ref="tableRefs" :data="tableData" :columns="columns" :config="tableConfig" :pagination="pagination"
@size-change="sizeChange" @page-change="currentChange">
</CustomTable>
</div>
</template>
<script setup lang="ts">
import CustomTable from '@/components/elTable/index.vue'
import { sampleitemCount, sampleSign } from '@/api/regional/index'
import SelectTable from '@/components/SelectTable/index.vue';
import { classCom } from '@/utils/classCom';
// @ts-ignore
import { listhospital } from "@/api/regional/dict/hospital.js";
// @ts-ignore
import { listregdict } from "@/api/regional/dict/regdict.js";
import { ElMessage } from 'element-plus';
const aotuSize = classCom.useAutoSize();
const queryParams: any = ref({
pageSize: 50,
pageNum: 1,
})
const tableData: any = ref([])
const columns: any = ref([
{ prop: 'SrcHospName', label: '就诊医院', align: 'center', visible: true, },
{ prop: 'SrcOrderItemCode', label: '组合编码', align: 'center', visible: true, },
{ prop: 'SrcOrderItemName', label: '组合名称', align: 'center', visible: true, },
{ prop: 'sl', label: '数量(份)', align: 'center', visible: true, },
{ prop: 'cost', label: '费用', align: 'center', visible: true, },
{ prop: 'DstHospName', label: '检测医院', align: 'center', visible: true, },
])
const tableConfig = ref({
border: true, // 边框
height: '75vh', // 高度
highlightCurrentRow: true, // 高亮当前行
summary: true,
summaryField: ['sl', 'cost'],//计算列总和
sumText: '合计'
})
const pagination = ref({
show: true,
total: 0,
pageSize: 50,
currentPage: 1,
})
const ksdhFields = ref([
{ prop: 'label', label: '名称', width: 150, enablePinyinSearch: true },
{ prop: 'value', label: '代号', width: 120, enablePinyinSearch: true },
])
const barcodes = ref([])
const tableRefs = ref(null)
const thHandle = (val: number) => {
if (!barcodes.value.length) return ElMessage.warning('请选择数据!')
sampleSign({ status: val, barcode: barcodes.value }).then((res: any) => {
if (res.code == 0) {
ElMessage.success('操作成功!')
handleQuery()
}
})
}
const handleSelectionChange = (val: any) => {
barcodes.value = val.map((item: any) => item.barcode)
}
const currentChange = (page: { currentPage: number, pageSize: number }) => {
queryParams.value.pageNum = page.currentPage
handleQuery()
}
const sizeChange = (page: { currentPage: number, pageSize: number }) => {
queryParams.value.pageSize = page.pageSize
handleQuery()
}
const handleQuery = () => {
if (queryParams.value.times && queryParams.value.times.length > 0) {
queryParams.value.DateStart = queryParams.value.times[0]
queryParams.value.DateEnd = queryParams.value.times[1]
} else {
queryParams.value.DateStart = ''
queryParams.value.DateEnd = ''
}
getList()
}
const resetHandle = () => {
queryParams.value = {
pageSize: 50,
pageNum: 1,
}
handleQuery()
}
const getList = () => {
sampleitemCount(queryParams.value).then((res: any) => {
tableData.value = res.rows
pagination.value.total = res.total
})
}
const hosList = ref([])
const regdictList: any = ref([])
onMounted(() => {
getList()
listhospital().then((res: any) => {
hosList.value = res.rows.map((item: any) => {
return {
label: item.hospitalName,
value: item.hospitalCode
}
})
})
listregdict({ pageSize: 100, pageNum: 1, dictType: 'ZT' }).then((res: any) => {
regdictList.value = res.rows;
})
})
const formatDict = (v: string, arr: Array<any>) => {
return arr.find((item: any) => item.dictCode == v)?.dictName || v;
};
</script>
<style scoped lang="scss">
.compact-form {
.el-form-item {
margin-bottom: 5px;
}
}
.btns {
display: flex;
flex-direction: column;
justify-content: space-around;
&>button {
width: 100%;
margin-left: 0;
margin-bottom: 5px;
}
}
</style>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,489 @@
@charset "UTF-8";
/* CSS Document */
.bg {
margin: 0 auto;
width: 100%;
min-height: 100vh;
background: url(../images/bg2.jpg) no-repeat;
background-size: cover;
padding-top: 0rem;
padding: 0rem 3.125rem;
}
/*.conIn{
display:flex;
display: -webkit-flex;}*/
.title {
width: 100%;
font-size: 1.875rem;
line-height: 4.6875rem;
color: rgba(14, 253, 255, 1);
text-align: center;
font-weight: bold;
}
.border_bg_leftTop {
position: absolute;
left: -0.125rem;
top: -0.625rem;
width: 5.78125rem;
height: 0.78125rem;
display: block;
background: #01279d url(../images/title_left_bg.png) no-repeat;
background-size: cover;
}
.border_bg_rightTop {
position: absolute;
right: -0.15625rem;
top: -0.15625rem;
width: 1.5625rem;
height: 1.5625rem;
display: block;
background: url(../images/border_bg.jpg) no-repeat;
background-size: cover;
}
.border_bg_leftBottom {
position: absolute;
left: -0.125rem;
bottom: -0.125rem;
width: 1.5625rem;
height: 1.5625rem;
display: block;
background: url(../images/border_bg.jpg) no-repeat;
background-size: cover;
}
.border_bg_rightBottom {
position: absolute;
right: -0.15625rem;
bottom: -0.15625rem;
width: 1.25rem;
height: 1.25rem;
display: block;
background: url(../images/title_right_bg.png) no-repeat;
background-size: cover;
}
.leftMain {
width: 75%;
float: left;
padding-right: 1.5625rem;
padding-top: 1.5625rem;
}
.rightMain {
width: 25%;
float: left;
padding-top: 1.5625rem;
}
.leftMain_top {
width: 100%;
padding-bottom: 1.5625rem;
}
.leftMain_top ul {
display: flex;
display: -webkit-flex;
}
.leftMain_top ul li {
float: left;
width: 25%;
padding-right: 1.5625rem;
}
.leftMain_top ul li:last-child {
padding: 0;
}
.leftMain_top ul li .liIn {
border: 0.125rem solid rgba(14, 253, 255, 0.5);
width: 100%;
min-height: 3.75rem;
position: relative;
padding: .625rem 1.5625rem;
}
.leftMain_top ul li .liIn h3 {
font-size: 1.25rem;
font-weight: 700;
color: #fff;
}
.leftMain_top ul li .liIn .shu {
font-size: 1.875rem;
color: rgba(14, 253, 255, 1);
font-family: dig;
margin-bottom: 0.3125rem;
}
.leftMain_top ul li .liIn .shu i {
font-size: 1rem;
margin-left: 0.9375rem;
font-style: normal;
}
.leftMain_top ul li .liIn .zi {
font-size: 0.625rem;
color: #fff;
position: relative;
z-index: 10;
}
.leftMain_top ul li .liIn .zi .span1 {
margin-right: 1.5625rem;
}
.leftMain_middle {
width: 100%;
padding-bottom: 1.5625rem;
display: flex;
display: -webkit-flex;
}
.leftMain_middle .leftMain_middle_left {
width: 60%;
padding-right: 1.5625rem;
}
.leftMain_middle .leftMain_middle_left .leftMain_middle_leftIn {
border: 0.125rem solid rgba(14, 253, 255, 0.5);
width: 100%;
min-height: 3.75rem;
position: relative;
padding: 1.25rem 0.78125rem;
}
.leftMain_middle .leftMain_middle_left .leftMain_middle_leftIn h3 {
font-size: 1.25rem;
color: #fff;
font-weight: 700;
margin-bottom: 0.78125rem;
}
.leftMain_middle .leftMain_middle_left .leftMain_middle_leftIn .biaoge {
min-height: 12.5rem;
}
.leftMain_middle .leftMain_middle_right {
width: 40%;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn {
border: 0.125rem solid rgba(14, 253, 255, 0.5);
width: 100%;
min-height: 3.75rem;
position: relative;
padding: 1.25rem 0.78125rem;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn h3 {
font-size: 1.25rem;
color: #fff;
font-weight: 700;
margin-bottom: 0.78125rem;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge {
min-height: 12.5rem;
}
/*左边中间部分排行榜*/
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai {
width: 100%;
overflow: hidden;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn {
display: flex;
display: -webkit-flex;
align-items: center;
color: #fff;
font-size: 0.9375rem;
height: 2.8125rem;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn .liIn_left {
width: 25%;
position: relative;
padding-left: 2.1875rem;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn .liIn_left .bot {
width: 1.25rem;
height: 1.25rem;
background: #f78cf3;
border-radius: 62.5rem;
display: block;
position: absolute;
left: 0.3125rem;
top: 0;
bottom: 0;
margin: auto 0;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn2 .liIn_left .bot {
background: #e7feb8;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn3 .liIn_left .bot {
background: #fdea8a;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn4 .liIn_left .bot {
background: #8ff9f8;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn5 .liIn_left .bot {
background: #d890fa;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn6 .liIn_left .bot {
background: #05d1fc;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn .liIn_left zi {}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn .liIn_line {
width: 58%;
height: 1.25rem;
background: rgba(255, 255, 255, 0.5);
border-radius: 125rem;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn .liIn_line .line_lineIn {
width: 100%;
height: 1.25rem;
background: #f78cf3;
border-radius: 6.25rem;
-webkit-animation: widthMove1 2s ease-in-out;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn2 .liIn_line .line_lineIn {
background: #e7feb8;
-webkit-animation: widthMove2 2s ease-in-out;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn3 .liIn_line .line_lineIn {
background: #fdea8a;
-webkit-animation: widthMove3 2s ease-in-out;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn4 .liIn_line .line_lineIn {
background: #8ff9f8;
-webkit-animation: widthMove4 2s ease-in-out;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn5 .liIn_line .line_lineIn {
background: #d890fa;
-webkit-animation: widthMove5 2s ease-in-out;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn6 .liIn_line .line_lineIn {
background: #05d1fc;
-webkit-animation: widthMove6 2s ease-in-out;
}
@-webkit-keyframes widthMove1 {
0% {
width: 0%;
}
100% {
width: 98.5%;
}
}
@-webkit-keyframes widthMove2 {
0% {
width: 0%;
}
100% {
width: 88.5%;
}
}
@-webkit-keyframes widthMove3 {
0% {
width: 0%;
}
100% {
width: 68.5%;
}
}
@-webkit-keyframes widthMove4 {
0% {
width: 0%;
}
100% {
width: 40.5%;
}
}
@-webkit-keyframes widthMove5 {
0% {
width: 0%;
}
100% {
width: 22.5%;
}
}
@-webkit-keyframes widthMove6 {
0% {
width: 0%;
}
100% {
width: 10.5%;
}
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_pai ul li .liIn .num {
width: 17%;
font-family: dig;
padding-left: 0.3125rem;
}
/*左边底部*/
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_bi ul {
display: flex;
display: -webkit-flex;
flex-wrap: wrap;
width: 100%;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_bi ul li {
width: 33.3%;
text-align: center;
margin-bottom: 0.78125rem;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_bi ul li .shu {
font-size: 2.1875rem;
color: rgba(14, 253, 255, 1);
font-family: dig;
padding: 1.875rem 0 0.3125rem;
font-weight: normal;
}
.leftMain_middle .leftMain_middle_right .leftMain_middle_rightIn .biaoge_bi ul li .zi {
font-size: 0.9375rem;
color: #fff;
}
/*右边部分*/
.rightMain .rightMain_top {
width: 100%;
padding-bottom: 1.5625rem;
}
.rightMain .rightMain_topIn {
border: 0.125rem solid rgba(14, 253, 255, 0.5);
width: 100%;
min-height: 3.75rem;
position: relative;
padding: 1.25rem 0.78125rem;
}
.rightMain .rightMain_topIn h3 {
font-size: 1.25rem;
color: #fff;
margin-bottom: 0.78125rem;
}
.rightMain .rightMain_topIn .biaoge {
min-height: 12.5rem;
}
.rightMain .rightMain_bottom {
width: 100%;
}
.rightMain .rightMain_bottomIn {
border: 0.125rem solid rgba(14, 253, 255, 0.5);
width: 100%;
min-height: 3.75rem;
position: relative;
padding: 1.25rem 0.78125rem;
}
.rightMain .rightMain_bottomIn h3 {
font-size: 1.25rem;
color: #fff;
margin-bottom: 0.78125rem;
}
/*右下角表格*/
.rightMain .rightMain_bottomIn .biaoge {
min-height: 12.5rem;
}
.rightMain .rightMain_bottomIn .biaoge_list {
overflow: hidden;
position: relative;
}
.rightMain .rightMain_bottomIn .biaoge_list .biaoge_listIn .ul_list {
overflow: hidden;
position: relative;
}
.rightMain .rightMain_bottomIn .biaoge_list .biaoge_listIn .ul_listIn {
-webkit-animation: 14s gundong linear infinite normal;
animation: 14s gundong linear infinite normal;
position: relative;
}
@keyframes gundong {
0% {
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
100% {
-webkit-transform: translate3d(0, -30vh, 0);
transform: translate3d(0, -30vh, 0);
}
}
.rightMain .rightMain_bottomIn .biaoge_list ul {
display: flex;
display: -webkit-flex;
width: 100%;
}
.rightMain .rightMain_bottomIn .biaoge_list .ul_title {
background: linear-gradient(left, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0.1));
background: -ms-linear-gradient(left, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0.1));
background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0.1));
background: -moz-linear-gradient(left, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0.1));
}
.rightMain .rightMain_bottomIn .biaoge_list .ul_con {
border-bottom: 0.125rem solid rgba(14, 253, 255, 0.5);
}
.rightMain .rightMain_bottomIn .biaoge_list ul li {
width: 20%;
text-align: center;
color: #fff;
font-size: 0.9375rem;
height: 3.125rem;
line-height: 3.125rem;
}
.rightMain .rightMain_bottomIn .biaoge_list ul li:frist-child {
text-align: left;
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1,506 @@
<template>
<div class="bg">
<div class="title">智能大屏数据中心</div>
<div class="leftMain">
<div class="leftMain_top">
<div class="leftMain_topIn">
<ul>
<li>
<div class="liIn">
<h3>区域机构</h3>
<p class="shu"><span class="shu1">69</span><i>家</i></p>
<span class="border_bg_leftTop"></span>
<span class="border_bg_rightTop"></span>
<span class="border_bg_leftBottom"></span>
<span class="border_bg_rightBottom"></span>
</div>
</li>
<li>
<div class="liIn">
<h3>检验人数</h3>
<p class="shu"><span class="shu2">609</span><i>人</i></p>
<span class="border_bg_leftTop"></span>
<span class="border_bg_rightTop"></span>
<span class="border_bg_leftBottom"></span>
<span class="border_bg_rightBottom"></span>
</div>
</li>
<li>
<div class="liIn">
<h3>检验管数</h3>
<p class="shu"><span class="shu2">609</span><i>个</i></p>
<span class="border_bg_leftTop"></span>
<span class="border_bg_rightTop"></span>
<span class="border_bg_leftBottom"></span>
<span class="border_bg_rightBottom"></span>
</div>
</li>
<li>
<div class="liIn">
<h3>检验报告数</h3>
<p class="shu"><span class="shu3">289</span><i>份</i></p>
<span class="border_bg_leftTop"></span>
<span class="border_bg_rightTop"></span>
<span class="border_bg_leftBottom"></span>
<span class="border_bg_rightBottom"></span>
</div>
</li>
<li>
<div class="liIn">
<h3>检验项目数</h3>
<p class="shu"><span class="shu4">759</span><i>个</i></p>
<span class="border_bg_leftTop"></span>
<span class="border_bg_rightTop"></span>
<span class="border_bg_leftBottom"></span>
<span class="border_bg_rightBottom"></span>
</div>
</li>
</ul>
</div>
</div>
<div class="leftMain_middle">
<div class="leftMain_middle_left">
<div class="leftMain_middle_leftIn">
<h3>委托机构当月送检标本数量</h3>
<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
<div class="biaoge" style="width:100%; height:26vh" ref="chartmain" id="chartmain"></div>
<span class="border_bg_leftTop"></span>
<span class="border_bg_rightTop"></span>
<span class="border_bg_leftBottom"></span>
<span class="border_bg_rightBottom"></span>
</div>
</div>
<div class="leftMain_middle_right">
<div class="leftMain_middle_rightIn">
<h3>当日送检样本情况</h3>
<div class="biaoge biaoge_pai" ref="biaoge_pai" style="width:100%; height:26vh">
</div>
<span class="border_bg_leftTop"></span>
<span class="border_bg_rightTop"></span>
<span class="border_bg_leftBottom"></span>
<span class="border_bg_rightBottom"></span>
</div>
</div>
</div>
<div class="leftMain_middle">
<div class="leftMain_middle_left">
<div class="leftMain_middle_leftIn">
<h3>近一个月送检标本数量趋势图</h3>
<div class="biaoge" style="width:100%; height:28vh" ref="chartmain_zhe" id="chartmain_zhe"></div>
<span class="border_bg_leftTop"></span>
<span class="border_bg_rightTop"></span>
<span class="border_bg_leftBottom"></span>
<span class="border_bg_rightBottom"></span>
</div>
</div>
<div class="leftMain_middle_right">
<div class="leftMain_middle_rightIn">
<h3>送检项目分类占比</h3>
<div class="biaoge biaoge_bi" ref="sxEhart" style="width:100%; height:28vh">
</div>
<span class="border_bg_leftTop"></span>
<span class="border_bg_rightTop"></span>
<span class="border_bg_leftBottom"></span>
<span class="border_bg_rightBottom"></span>
</div>
</div>
</div>
</div>
<div class="rightMain">
<div class="rightMain_top">
<div class="rightMain_topIn">
<h3>这里是标题</h3>
<div class="biaoge" style="width:100%; height:30vh" id="chartmain_bing"></div>
<span class="border_bg_leftTop"></span>
<span class="border_bg_rightTop"></span>
<span class="border_bg_leftBottom"></span>
<span class="border_bg_rightBottom"></span>
</div>
</div>
<div class="rightMain_bottom">
<div class="rightMain_bottomIn">
<h3>这里是标题</h3>
<div class="biaoge biaoge_list" style="width:100%; height:36vh">
</div>
<span class="border_bg_leftTop"></span>
<span class="border_bg_rightTop"></span>
<span class="border_bg_leftBottom"></span>
<span class="border_bg_rightBottom"></span>
</div>
</div>
</div>
<div style="clear:both;"></div>
</div>
</template>
<script setup lang="ts">
import * as echarts from 'echarts';
//@ts-ignore
const chartmain = ref()
const getEcharts1 = () => {
const Intance = echarts.init(chartmain.value);
var dataAxis = ['1日', '2日', '3日', '4日', '5日', '6日', '7日', '8日', '9日', '10日', '11日', '12日', '13日', '14日', '15日'];
var data = [220, 182, 191, 234, 290, 330, 310, 123, 442, 321, 90, 149, 210, 122, 200];
const option = {
title: {
text: '',
subtext: ''
},
grid: {
x: 40,
y: 40,
x2: 20,
y2: 20,
},
tooltip: {
trigger: 'axis'
},
xAxis: {
data: dataAxis,
axisLabel: {
/*inside: true,*/
interval: 0,
textStyle: {
color: '#fff',
fontSize: 12
},
},
axisTick: {
show: false,
},
axisLine: {
show: true,
symbol: ['none', 'arrow'],
symbolOffset: 12,
lineStyle: {
color: '#fff',
}
},
z: 10
},
yAxis: {
type: 'value',
name: '单位:个',
axisLine: {
show: true,
symbol: ['none', 'arrow'],
symbolOffset: 12,
lineStyle: {
color: '#fff',
}
},
axisTick: {
show: false
},
axisLabel: {
textStyle: {
color: '#fff',
fontSize: 12
}
}
},
dataZoom: [
{
type: 'inside'
}
],
series: [
{
type: 'bar',
itemStyle: {
color: new echarts.graphic.LinearGradient(
0, 0, 0, 1,
[
{ offset: 0, color: '#0efdff' },
{ offset: 0.5, color: '#188df0' },
{ offset: 1, color: '#188df0' }
]
)
},
emphasis: {
itemStyle: {
color: new echarts.graphic.LinearGradient(
0, 0, 0, 1,
[
{ offset: 0, color: '#2378f7' },
{ offset: 0.7, color: '#2378f7' },
{ offset: 1, color: '#0efdff' }
]
)
}
},
data: data
}
]
};
Intance.setOption(option);
}
const biaoge_pai = ref()
const getEcharts2 = () => {
const Intance = echarts.init(biaoge_pai.value);
const option = {
title: {
text: '数据情况统计',
subtext: '',
left: 'right',
textStyle: {
color: '#fff',
fontSize: 12
}
},
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b} : {c} ({d}%)'
},
legend: {
// orient: 'vertical',
// top: 'middle',
type: 'scroll',
orient: 'vertical',
right: 10,
top: 40,
bottom: 20,
left: 'right',
data: ['已审核', '已采样', '已送检', '已接收', '已报告'],
textStyle: {
color: '#fff',
fontSize: 12
}
},
grid: {
x: '-10%',
y: 40,
x2: 20,
y2: 20,
},
color: ['#09d0fb', '#f88cfb', '#95f8fe', '#f9f390', '#ecfeb7'],
series: [
{
type: 'pie',
radius: '65%',
center: ['50%', '50%'],
selectedMode: 'single',
data: [
{
value: 1548, name: '已报告',
},
{ value: 535, name: '已接收' },
{ value: 510, name: '已送检' },
{ value: 634, name: '已采样' },
{ value: 735, name: '已审核' }
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
Intance.setOption(option);
}
const chartmain_zhe = ref()
const getEcharts3 = () => {
const Intance = echarts.init(chartmain_zhe.value);
const option = {
title: {
text: ''
},
tooltip: {
trigger: 'axis'
},
legend: {
textStyle: {
color: '#fff',
fontSize: 12,
},
right: '10%',
data: ['折线一', '折线二']
},
grid: {
x: 40,
y: 40,
x2: 20,
y2: 20,
},
toolbox: {
feature: {
//saveAsImage: {}
}
},
xAxis: {
type: 'category',
boundaryGap: false,
axisLabel: {
/*inside: true,*/
interval: 0,
textStyle: {
color: '#fff',
fontSize: 12
}
},
axisTick: {
show: false,
},
axisLine: {
show: true,
symbol: ['none', 'arrow'],
symbolOffset: 12,
lineStyle: {
color: '#fff',
}
},
data: ['1日', '2日', '3日', '4日', '5日', '6日', '7日', '8日', '9日', '10日', '11日', '12日', '13日', '14日', '15日']
},
yAxis: {
type: 'value',
axisLine: {
show: true,
symbol: ['none', 'arrow'],
symbolOffset: 12,
lineStyle: {
color: '#fff',
}
},
axisTick: {
show: false
},
axisLabel: {
textStyle: {
color: '#fff',
fontSize: 12
}
}
},
series: [
{
name: '折线一',
type: 'line',
stack: '总量',
data: [280, 102, 191, 134, 390, 230, 210],
itemStyle: {
normal: {
color: "#0efdff",//折线点的颜色
lineStyle: {
color: "#0efdff",//折线的颜色
width: 2,
}
},
}
},
{
name: '折线二',
type: 'line',
stack: '总量',
data: [100, 132, 131, 234, 290, 330, 110]
},
]
};
Intance.setOption(option);
}
const sxEhart = ref()
const getEcharts4 = () => {
const Intance = echarts.init(sxEhart.value);
const option = {
title: {
text: '数据情况统计',
subtext: '',
left: 'right',
textStyle: {
color: '#fff',
fontSize: 12
}
},
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b} : {c} ({d}%)'
},
legend: {
// orient: 'vertical',
// top: 'middle',
type: 'scroll',
orient: 'vertical',
right: 10,
top: 40,
bottom: 20,
left: 'right',
data: ['全血', '血液', '血浆', '尿液', '其他',],
textStyle: {
color: '#fff',
fontSize: 12
}
},
grid: {
x: '-10%',
y: 40,
x2: 20,
y2: 20,
},
color: ['#09d0fb', '#f88cfb', '#95f8fe', '#f9f390', '#ecfeb7'],
series: [
{
type: 'pie',
radius: '65%',
center: ['50%', '50%'],
selectedMode: 'single',
data: [
{ value: 156, name: '尿液' },
{ value: 256, name: '血浆' },
{ value: 335, name: '血液' },
{ value: 235, name: '全血' },
{ value: 877, name: '其他' }
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
Intance.setOption(option);
}
onMounted(() => {
getEcharts1()
getEcharts2()
getEcharts3()
getEcharts4()
})
</script>
<style scoped>
@import './css/icon.css';
@import './css/index.css';
@import './css/public.css';
</style>