Merge branch 'main' of ssh://git.jizhiweb.cn:2222/clinic-v2/web

This commit is contained in:
LiJianZhao 2025-05-15 11:29:34 +08:00
commit 5ccb88f4fc
16 changed files with 276 additions and 213 deletions

View File

@ -1,13 +1,14 @@
<!DOCTYPE html>
<html lang="">
<head>
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<link rel="stylesheet" href="@/assets/iconfont/iconfont.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>药慧精灵智慧诊所</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

View File

@ -0,0 +1,22 @@
@font-face {
font-family: "iconfont"; /* Project id 4921806 */
src: url('iconfont.woff?t=1747274949107') format('woff'),
url('iconfont.ttf?t=1747274949107') format('truetype');
}
.iconfont {
font-family: "iconfont", serif !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-RectangleCopy:before {
content: "\e6a2";
}
.icon-RectangleCopy1:before {
content: "\e6a4";
}

Binary file not shown.

Binary file not shown.

View File

@ -17,7 +17,7 @@ $border-color-lighter: #EBEEF5;
$border-color-extra-light: #F2F6FC;
// 背景颜色
$background-color-base: #eee;
$background-color-base: #F1F5FB;
$background-color-main: #4D6DE4;
// 边框圆角

View File

@ -35,7 +35,7 @@ html {
}
body {
background-color: #EEEEEEFF;
background-color: base.$background-color-base;
}
.center-wrapper {
@ -96,8 +96,8 @@ body {
padding: 0 !important;
//border: 1px solid #4D6DE4 !important;
}
$btn-color: #4d99e4;
$lighter-color: #6eaeed;
$btn-color: #4D6DE4;
$lighter-color: #7c91e3;
.default-btn{
cursor: pointer;
width: 120px;
@ -106,7 +106,7 @@ $lighter-color: #6eaeed;
background: $btn-color;
border-radius: 6px;
color: #FFF;
font-size: 15px;
font-size: 16px;
text-align: center;
&:hover{
background: $lighter-color;

View File

@ -3,6 +3,7 @@ import './assets/scss/main.scss'
import {createApp} from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import '../src/assets/iconfont/iconfont.css'
import {createPinia} from 'pinia'
import App from './App.vue'

View File

@ -1,56 +1,83 @@
<template>
<div class="layout-container">
<Header class="header"/>
<header>
<div class="center-wrapper">
<div class="childMenu">
<router-link :to="item.path" class="child-item" v-for="(item,index) in childMenuList" :key="index">
{{ item.name }}
</router-link>
<div class="body">
<header style="height: 50px">
<div class="center-wrapper">
<div class="childMenu">
<router-link :to="item.path" class="child-item" v-for="(item,index) in childMenuList" :key="index">
{{ item.name }}
</router-link>
</div>
</div>
</div>
</header>
<div class="space"></div>
<main class="layout-main">
<router-view/>
</main>
<div class="space"></div>
</header>
<main class="layout-main" style="margin-top: 24px">
<router-view/>
</main>
</div>
<Footer class="footer"/>
</div>
</template>
<style scoped lang="scss">
.body{
height: 100%;
padding: 24px;
display: flex;
flex-direction: column;
}
.childMenu {
width: 100%;
height: 60px;
height: 50px;
background: #fff;
display: flex;
align-items: center;
border-radius: 8px;
.child-item {
width: 136px;
display: inline-block;
color: #151515;
outline: none;
text-decoration: none;
font-size: 18px;
margin-left: 10px;
margin-right: 10px;
height: 35px;
height: 50px;
position: relative;
line-height: 50px;
text-align: center;
&::before{
content: '';
position: absolute;
right: 0;
top:50%;
display: block;
width: 2px;
height: 16px;
background: #D8D8D8;
border-radius: 1px;
transform: translate(0 ,-50%);
}
&:last-child::before{
display: none;
}
}
.router-link-active:after {
content: '';
display: block;
width: 100%;
height: 2px;
background-color: #151515; // 线
width: 80px;
height: 4px;
background-color: #4D6DE4; // 线
position: absolute;
bottom: -5px; // 线
left: 0;
bottom: 0; // 线
left: 50%;
transform: translateX(-50%);
border-radius: 2px;
}
}
a.router-link-active.router-link-exact-active.child-item{
color: #4D6DE4;
}
</style>

View File

@ -1,56 +1,84 @@
<template>
<div class="layout-container">
<Header class="header"/>
<header>
<div class="center-wrapper">
<div class="childMenu">
<router-link :to="item.path" class="child-item" v-for="(item,index) in childMenuList" :key="index">
{{ item.name }}
</router-link>
<div class="body">
<header style="height: 50px">
<div class="center-wrapper">
<div class="childMenu">
<router-link :to="item.path" class="child-item" v-for="(item,index) in childMenuList" :key="index">
{{ item.name }}
</router-link>
</div>
</div>
</div>
</header>
<div class="space"></div>
<main class="layout-main">
<router-view/>
</main>
<div class="space"></div>
</header>
<main class="layout-main" style="margin-top: 24px">
<router-view/>
</main>
</div>
<Footer class="footer"/>
</div>
</template>
<style scoped lang="scss">
.body{
height: 100%;
padding: 24px;
display: flex;
flex-direction: column;
}
.childMenu {
height: 60px;
width: 100%;
height: 50px;
background: #fff;
display: flex;
align-items: center;
border-radius: 8px;
.child-item {
width: 136px;
display: inline-block;
color: #151515;
outline: none;
text-decoration: none;
font-size: 18px;
margin-left: 10px;
margin-right: 10px;
height: 35px;
height: 50px;
position: relative;
line-height: 50px;
text-align: center;
&::before{
content: '';
position: absolute;
right: 0;
top:50%;
display: block;
width: 2px;
height: 16px;
background: #D8D8D8;
border-radius: 1px;
transform: translate(0 ,-50%);
}
&:last-child::before{
display: none;
}
}
.router-link-active:after {
content: '';
display: block;
width: 100%;
height: 2px;
background-color: #151515; // 线
width: 80px;
height: 4px;
background-color: #4D6DE4; // 线
position: absolute;
bottom: -5px; // 线
left: 0;
bottom: 0; // 线
left: 50%;
transform: translateX(-50%);
border-radius: 2px;
}
}
a.router-link-active.router-link-exact-active.child-item{
color: #4D6DE4;
}
</style>

View File

@ -17,16 +17,12 @@
</el-form>
</div>
<div class="right">
<div class="btn" @click="resetSearch">
<el-icon style="margin-right: 10px">
<Refresh/>
</el-icon>
<div class="default-btn" @click="resetSearch">
<span class="iconfont icon-RectangleCopy1"></span>
重置
</div>
<div class="btn" @click="getList">
<el-icon style="margin-right: 10px">
<Search/>
</el-icon>
<div class="default-btn" @click="getList" style="margin-left: 24px">
<span class="iconfont icon-RectangleCopy"></span>
搜索
</div>
</div>
@ -36,7 +32,7 @@
</div>
</div>
<div class="content">
<el-table :data="dataList" style="width: 100%" @row-click="rowClick">
<el-table :data="dataList" style="width: 100%;height: 100%" @row-click="rowClick">
<el-table-column prop="useCode" label="单号" width="180"></el-table-column>
<el-table-column prop="status" label="状态" width="180"></el-table-column>
<el-table-column prop="useUserId" label="领用人" width="180"></el-table-column>

View File

@ -17,16 +17,12 @@
</el-form>
</div>
<div class="right">
<div class="btn" @click="resetSearch">
<el-icon style="margin-right: 10px">
<Refresh/>
</el-icon>
<div class="default-btn" @click="resetSearch">
<span class="iconfont icon-RectangleCopy1"></span>
重置
</div>
<div class="btn" @click="getCheck">
<el-icon style="margin-right: 10px">
<Search/>
</el-icon>
<div class="default-btn" @click="getCheck" style="margin-left: 24px">
<span class="iconfont icon-RectangleCopy"></span>
搜索
</div>
</div>
@ -37,7 +33,7 @@
</div>
<div class="content_list">
<el-scrollbar>
<el-table :data="tableData" @cell-click="editCheck">
<el-table :data="tableData" @cell-click="editCheck" style="height: 100%">
<el-table-column label="订单号" prop="code" width="250">
</el-table-column>
<el-table-column label="状态" prop="state" width="250"></el-table-column>

View File

@ -65,16 +65,12 @@
<el-checkbox v-model="inventoryNumber" label="不看0库存" size="large" @change="searchGoods"/>
<el-checkbox v-model="status" label="不看已停用" size="large" @change="searchGoods"/>
</div>
<div class="btn" @click="resetSearch">
<el-icon style="margin-right: 10px">
<Refresh/>
</el-icon>
<div class="default-btn" @click="resetSearch">
<span class="iconfont icon-RectangleCopy1"></span>
重置
</div>
<div class="btn" @click="searchGoods">
<el-icon style="margin-right: 10px">
<Search/>
</el-icon>
<div class="default-btn" @click="searchGoods" style="margin-left: 24px">
<span class="iconfont icon-RectangleCopy"></span>
搜索
</div>
</div>

View File

@ -66,16 +66,12 @@
</el-form>
</div>
<div class="right">
<div class="btn" @click="resetSearch">
<el-icon style="margin-right: 10px">
<Refresh/>
</el-icon>
<div class="default-btn" @click="resetSearch">
<span class="iconfont icon-RectangleCopy1"></span>
重置
</div>
<div class="btn" @click="init">
<el-icon style="margin-right: 10px">
<Search/>
</el-icon>
<div class="default-btn" @click="init" style="margin-left: 24px">
<span class="iconfont icon-RectangleCopy"></span>
搜索
</div>
</div>
@ -86,7 +82,7 @@
</div>
<div class="content_list">
<el-scrollbar>
<el-table :data="tableData" style="width: 100%" @row-click="open_edit"
<el-table :data="tableData" style="width: 100%;height: 100%" @row-click="open_edit"
:header-cell-style="{ backgroundColor: '#F1F5FB' }">
<el-table-column fixed label="采购单号" show-overflow-tooltip>
<template #default="scope">

View File

@ -13,16 +13,12 @@
</el-form>
</div>
<div class="right">
<div class="btn" @click="resetSearch">
<el-icon style="margin-right: 10px">
<Refresh/>
</el-icon>
<div class="default-btn" @click="resetSearch">
<span class="iconfont icon-RectangleCopy1"></span>
重置
</div>
<div class="btn" @click="getSupplier">
<el-icon style="margin-right: 10px">
<Search/>
</el-icon>
<div class="default-btn" @click="getSupplier" style="margin-left: 24px">
<span class="iconfont icon-RectangleCopy"></span>
搜索
</div>
</div>

View File

@ -73,12 +73,17 @@
formatListTime(listItem.lastVisitTime) || "-"
}}
</el-descriptions-item>
<el-descriptions-item label="证件类型">{{certTypeList.find((item:any)=>item.id==listItem.certType)?.name}}</el-descriptions-item>>
<el-descriptions-item label="证件类型">
{{ certTypeList.find((item: any) => item.id == listItem.certType)?.name }}
</el-descriptions-item>
>
<el-descriptions-item label="证件号码">{{ listItem.certNo || "-" }}</el-descriptions-item>
<el-descriptions-item label="积分"><span>{{ listItem.integralBalance }}</span>
</el-descriptions-item>
<el-descriptions-item label="地址">{{ areaName}}{{areaName?'/'+listItem.address : listItem.address || "-" }}</el-descriptions-item>
<el-descriptions-item label="既往史" >{{ listItem.beforeMedicalHistory || "-" }}</el-descriptions-item>
<el-descriptions-item label="地址">
{{ areaName }}{{ areaName ? '/' + listItem.address : listItem.address || "-" }}
</el-descriptions-item>
<el-descriptions-item label="既往史">{{ listItem.beforeMedicalHistory || "-" }}</el-descriptions-item>
<el-descriptions-item label="过敏史">{{ listItem.allergyHistory || "-" }}</el-descriptions-item>
<el-descriptions-item label="备注">{{ listItem.remark || "-" }}</el-descriptions-item>
@ -86,60 +91,63 @@
</div>
</div>
</Panel>
<Panel title="消费记录" class="right-list">
<div class="list-content">
<div class="list">
<el-table :data="tableData" :header-cell-style="{ backgroundColor: '#F1F5FB' }" style="width: 100%"
@cell-click="openDetail">
<el-table-column label="单号" prop="code" show-overflow-tooltip>
</el-table-column>
<el-table-column label="创建时间" prop="createDatetime">
<template #default="scope">
{{ formatDate(scope.row.createDatetime) }}
</template>
</el-table-column>
<!-- <el-table-column label="应收" prop="preTotalPrice" width="80">-->
<!-- <template #default="scope">-->
<!-- {{ scope.row.preTotalPrice }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="实收" prop="totalPrice" width="80">
<template #default="scope">
{{ scope.row.totalPrice }}
</template>
</el-table-column>
<el-table-column label="支付方式" width="100">
<template #default="scope">
{{ scope.row.payType ? getPayTypeStr(scope.row.payType) : "" }}
</template>
</el-table-column>
<el-table-column label="状态" width="100">
<template #default="scope">
<el-tag v-if="scope.row.status==0" type="info">{{ getStatusStr(scope.row.status) }}</el-tag>
<el-tag v-if="scope.row.status==1" type="success">{{ getStatusStr(scope.row.status) }}</el-tag>
</template>
</el-table-column>
<el-table-column label="支付时间" prop="payTime">
<template #default="scope">
{{ formatDate(scope.row.payTime) }}
</template>
</el-table-column>
</el-table>
</div>
<div class="bottom">
<div class="page_btn_list">
<el-pagination
background
layout="prev, pager, next"
:total="total"
:page-size="pageSize"
@current-change="handleCurrentChange"
>
</el-pagination>
<div class="right-list">
<Panel title="消费记录">
<div class="panel-content" style="display: flex;flex-direction: column;height: 100%;padding: 0 24px;">
<div class="list">
<el-table :data="tableData" :header-cell-style="{ backgroundColor: '#F1F5FB' }"
style="width: 100%;height: 100%"
@cell-click="openDetail">
<el-table-column label="单号" prop="code" show-overflow-tooltip>
</el-table-column>
<el-table-column label="创建时间" prop="createDatetime">
<template #default="scope">
{{ formatDate(scope.row.createDatetime) }}
</template>
</el-table-column>
<!-- <el-table-column label="应收" prop="preTotalPrice" width="80">-->
<!-- <template #default="scope">-->
<!-- {{ scope.row.preTotalPrice }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="实收" prop="totalPrice" width="80">
<template #default="scope">
{{ scope.row.totalPrice }}
</template>
</el-table-column>
<el-table-column label="支付方式" width="100">
<template #default="scope">
{{ scope.row.payType ? getPayTypeStr(scope.row.payType) : "" }}
</template>
</el-table-column>
<el-table-column label="状态" width="100">
<template #default="scope">
<el-tag v-if="scope.row.status==0" type="info">{{ getStatusStr(scope.row.status) }}</el-tag>
<el-tag v-if="scope.row.status==1" type="success">{{ getStatusStr(scope.row.status) }}</el-tag>
</template>
</el-table-column>
<el-table-column label="支付时间" prop="payTime">
<template #default="scope">
{{ formatDate(scope.row.payTime) }}
</template>
</el-table-column>
</el-table>
</div>
<div class="bottom">
<div class="page_btn_list">
<el-pagination
background
layout="prev, pager, next"
:total="total"
:page-size="pageSize"
@current-change="handleCurrentChange"
>
</el-pagination>
</div>
</div>
</div>
</div>
</Panel>
</Panel>
</div>
</div>
</div>
<VipEdit ref="refEdit" @close="init"></VipEdit>
@ -274,7 +282,7 @@ const findAreaName = (code: string | null): string => {
// code
return code;
};
const areaName=ref<any>('')
const areaName = ref<any>('')
//
const btn = (item: any, i: number) => {
index.value = i
@ -290,8 +298,8 @@ const btn = (item: any, i: number) => {
} catch (error) {
areaData = null; //
}
if (areaData != null){
areaName.value=findAreaName(areaData[areaData?.length-1])
if (areaData != null) {
areaName.value = findAreaName(areaData[areaData?.length - 1])
}
getChargeList(listItem.value.id)
@ -372,7 +380,7 @@ const handleCurrentChange = (val: number) => {
};
const levelEditRef = ref();
const antysList = ref<any>(Object.entries(antys).map(([id, name]) => ({id, name})))
const certTypeList=ref<any>(Object.entries(psnCertTypes).map(([id,name])=>({id,name})))
const certTypeList = ref<any>(Object.entries(psnCertTypes).map(([id, name]) => ({id, name})))
</script>
<style scoped lang="scss">
@ -596,34 +604,19 @@ const certTypeList=ref<any>(Object.entries(psnCertTypes).map(([id,name])=>({id,n
display: flex;
flex-direction: column;
min-height: 0;
.list-content {
.list {
flex: 1;
min-height: 0;
}
.bottom {
width: 100%;
height: 60px;
background-color: #FFF;
box-sizing: border-box;
padding: 10px;
border-top: 1px solid #EEE;
display: flex;
flex-direction: column;
padding: 0 24px;
height: 100%;
.list {
flex: 1;
display: flex;
flex-direction: column;
}
.bottom {
width: 100%;
height: 60px;
background-color: #FFF;
box-sizing: border-box;
padding: 10px;
position: relative;
border-top: 1px solid #EEE;
.page_btn_list {
position: absolute;
left: 0;
top: 10px;
}
}
justify-content: flex-end;
}
}
}

View File

@ -13,12 +13,17 @@
</div>
<div class="tip">
<div class="search_input">
<el-input v-model="search_keyword" placeholder="名称/编号" :suffix-icon="Search" size="large" clearable @change="change_search"/>
<el-input v-model="search_keyword" placeholder="名称/编号" :suffix-icon="Search" size="large" clearable
@change="change_search"/>
</div>
<div class="search_btn"><div class="default-btn" @click="change_search">搜索</div></div>
<div class="search_btn">
<div class="default-btn" @click="change_search">
<span class="iconfont icon-RectangleCopy"></span>
搜索
</div>
</div>
<div class="middel">
</div>
<div class="op_btn">
<el-dropdown placement="bottom">
@ -55,7 +60,7 @@
</div>
</Mask>
<Mask :is-show="isUpdate1312" :width="600" :height="300" title="有效期更新" @close="isUpdate1312=false">
<Mask :is-show="isUpdate1312" :width="600" :height="300" title="有效期更新" @close="isUpdate1312=false">
<div class="update_box">
<el-date-picker
v-model="updt_time"
@ -64,7 +69,7 @@
size="default"
/>
<div class="btn" @click="update1312(1)">开始更新</div>
<div class="tip">{{tip}}</div>
<div class="tip">{{ tip }}</div>
</div>
</Mask>
@ -77,9 +82,10 @@ import {ElNotification, type TabsPaneContext} from 'element-plus'
import {post} from '@/utils/request.ts'
import {Search} from '@element-plus/icons-vue'
import Mask from "@/components/common/Mask.vue";
let isUpdate1312=ref(false)
let isUpdate1318=ref(false)
let isUpdate1319=ref(false)
let isUpdate1312 = ref(false)
let isUpdate1318 = ref(false)
let isUpdate1319 = ref(false)
let updt_time = ref(new Date())
let current_page = ref(1);
let total_page = ref(0)
@ -87,7 +93,7 @@ let current_tab = ref(1301);
let column_list = ref([]);
let search_keyword = ref("");
let isDownLoading = ref(false);
let tip=ref("")
let tip = ref("")
const tabs = [
{label: '中西成药', name: 1301},
{label: '中药饮片', name: 1302},
@ -103,43 +109,43 @@ const tabs = [
];
let tableData: any = ref([])
let content: any = ref(null);
let update1312 = (current_page:number) => {
if(current_page==1){
tip.value="开始更新第1页"
let update1312 = (current_page: number) => {
if (current_page == 1) {
tip.value = "开始更新第1页"
}
post("social/directory_upinfo/get_page", {
updt_time: updt_time.value,
page:current_page
page: current_page
}, {catch_error: true}).then((res: any) => {
let pages = res.pages;
let number = res.number;
if (current_page < pages&&isUpdate1312.value) {
if (current_page < pages && isUpdate1312.value) {
current_page++
let percent = Math.floor((current_page / pages) * 100)
tip.value= "开始更新第:" + current_page + "/" + pages;
tip.value = "开始更新第:" + current_page + "/" + pages;
update1312(current_page);
} else {
tip.value= "所有更新已完成"
tip.value = "所有更新已完成"
isUpdate1312.value = false
}
}).catch((err: any) => {
isUpdate1312.value = false;
current_page=1;
current_page = 1;
})
}
const openUpdateBox = (type:number) => {
const openUpdateBox = (type: number) => {
//30
let start_time = new Date();
start_time.setDate(start_time.getDate() - 30);
updt_time.value = start_time;
if(type==1312){
if (type == 1312) {
isUpdate1312.value = true
}
if(type==1318){
if (type == 1318) {
isUpdate1318.value = true
}
if(type==1319){
if (type == 1319) {
isUpdate1319.value = true
}
@ -194,7 +200,7 @@ let change_page = (val: number) => {
}
let change_tab = (tab: TabsPaneContext, event: Event) => {
search_keyword.value = "";
nextTick(()=>{
nextTick(() => {
init()
})
}
@ -247,12 +253,13 @@ let download = (ver: any, type: any) => {
</script>
<style scoped lang="scss">
.update_box{
.update_box {
position: relative;
width: 100%;
height: 100%;
padding: 20px;
}
.container-wrapper {
box-sizing: border-box;
padding: 20px;
@ -273,18 +280,22 @@ let download = (ver: any, type: any) => {
.tip {
display: flex;
.search_input{
.search_input {
flex: 1;
}
.search_btn{
.search_btn {
width: 140px;
padding-left: 10px;
padding-right: 10px;
}
.middel{
.middel {
width: 200px;
}
.op_btn{
.op_btn {
width: 120px;
}