Merge remote-tracking branch 'origin/main'

This commit is contained in:
LiJianZhao 2025-04-25 14:56:17 +08:00
commit 6fba365b12
25 changed files with 1050 additions and 414 deletions

View File

@ -43,7 +43,7 @@ body {
.container-wrapper { .container-wrapper {
height: 100%; height: 100%;
//background-color: base.$background-color-panel; background-color: #fff;
@include base.center-wrapper; @include base.center-wrapper;
//@include base.padding; //@include base.padding;
@include base.border-radius; @include base.border-radius;

View File

@ -11,8 +11,11 @@
<router-link to="/social" class="menu-item" active-class="active active7">医保</router-link> <router-link to="/social" class="menu-item" active-class="active active7">医保</router-link>
<router-link to="/statistics" class="menu-item" active-class="active active8">统计</router-link> <router-link to="/statistics" class="menu-item" active-class="active active8">统计</router-link>
<router-link to="/settings" class="menu-item" active-class="active active9">设置</router-link> <router-link to="/settings" class="menu-item" active-class="active active9">设置</router-link>
<el-button style="float: right;color: #fff" @click="logout" type="text">退出登录</el-button>
</div> </div>
</div> </div>
</header> </header>
</template> </template>
@ -142,4 +145,15 @@ header {
} }
</style> </style>
<script setup lang="ts"> <script setup lang="ts">
import { useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'
let logout = function () {
localStorage.removeItem('token')
useRouter().push("/manager/login")
ElMessage({
message: "退出成功,即将为您跳转到登陆页面",
type: 'success',
duration: 1000,
})
}
</script> </script>

View File

@ -1,5 +1,4 @@
<template> <template>
<CloseBtn @click="exit"></CloseBtn>
<el-descriptions title="新增领用" border label-width="100"> <el-descriptions title="新增领用" border label-width="100">
<el-descriptions-item label="领用人" width="200"> <el-descriptions-item label="领用人" width="200">
<el-input v-model="formData.name" disabled></el-input> <el-input v-model="formData.name" disabled></el-input>

View File

@ -1,5 +1,4 @@
<template> <template>
<CloseBtn @click="exit"></CloseBtn>
<el-descriptions title="详情领用" border label-width="100"> <el-descriptions title="详情领用" border label-width="100">
<el-descriptions-item label="领用人" width="200"> <el-descriptions-item label="领用人" width="200">
<el-input v-model="formData.name" disabled></el-input> <el-input v-model="formData.name" disabled></el-input>

View File

@ -1,6 +1,4 @@
<template> <template>
<CloseBtn @click="exit"></CloseBtn>
<div class="edit-panel" v-loading="isLoading" element-loading-text="正在保存......"> <div class="edit-panel" v-loading="isLoading" element-loading-text="正在保存......">
<div class="top"> <div class="top">

View File

@ -1,5 +1,4 @@
<template> <template>
<CloseBtn @click="exit"></CloseBtn>
<div class="edit-panel" v-loading="isLoading" element-loading-text="正在保存......"> <div class="edit-panel" v-loading="isLoading" element-loading-text="正在保存......">
<div class="top"> <div class="top">
<el-descriptions title="采购订单" border> <el-descriptions title="采购订单" border>

View File

@ -1,7 +1,5 @@
<template> <template>
<CloseBtn @click="close"></CloseBtn>
<el-descriptions <el-descriptions
title="新增供货商"
direction="vertical" direction="vertical"
:column="1" :column="1"
> >

View File

@ -0,0 +1,89 @@
<template>
<div class="auth">
<el-form ref="ruleFormRef" model="ciphertext" label-width="auto"
class="demo-ruleForm" status-icon>
<el-input
v-model="ciphertext"
maxlength="400"
placeholder="Please input"
show-word-limit
:autosize="{ minRows: 8, maxRows: 20 }"
type="textarea"
@input="parsing"
/>
<div class="btn">
<el-button type="primary" @click="save">保存</el-button>
</div>
</el-form>
<el-descriptions title="解析后的数据" size="small" :column="2" border v-if="flag">
<el-descriptions-item
align="center"
label="定点机构编码"
:span="2"
>
{{ decryptedText.fixmedinsCode }}
</el-descriptions-item>
<el-descriptions-item
align="center"
label="证书创建时间"
>
{{ decryptedText.createDate }}
</el-descriptions-item>
<el-descriptions-item
align="center"
label="证书过期时间"
>
{{ decryptedText.expiryDate }}
</el-descriptions-item>
</el-descriptions>
</div>
</template>
<script setup lang="ts">
import {post} from "@/utils/request.ts";
import {onMounted, onUnmounted, ref} from "vue";
import {ElMessage} from "element-plus";
const decryptedText = ref<any>({})
const ciphertext = ref<string>('')
const flag = ref<any>(false)
const parsing = () => {
if (ciphertext.value) {
post("common/config/parsing", {ciphertext: ciphertext.value}).then((res: any) => {
decryptedText.value = res;
flag.value = true;
})
} else {
flag.value = false;
}
}
const save = () => {
if (ciphertext.value) {
post("common/config/setcert", {encryptedText: ciphertext.value}).then((res: any) => {
ElMessage.success("保存成功")
})
}
}
const get = () => {
}
onMounted(async () => {
post("common/config/get", {key: 'common_cert'}).then((res: any) => {
ciphertext.value = res.val;
parsing()
})
})
</script>
<style scoped lang="scss">
.auth {
margin: 0 auto;
.btn {
margin: 24px 0;
display: flex;
justify-content: center;
}
}
</style>

View File

@ -17,37 +17,37 @@
:column="1" :column="1"
border border
> >
<el-descriptions-item label="主诉"> <el-descriptions-item :width="140" label="主诉">
<div>{{ formDate.mainAppeal}}</div> <div>{{ formDate.mainAppeal}}</div>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="诊断"> <el-descriptions-item :width="140" label="诊断">
<div>{{ formDate.diagnosisSummary}}</div> <div>{{ formDate.diagnosisSummary}}</div>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="现病史"> <el-descriptions-item :width="140" label="现病史">
<div>{{ formDate.nowMedicalHistory}}</div> <div>{{ formDate.nowMedicalHistory}}</div>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="既往史"> <el-descriptions-item :width="140" label="既往史">
<div>{{ formDate.beforeMedicalHistory}}</div> <div>{{ formDate.beforeMedicalHistory}}</div>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="过敏史"> <el-descriptions-item :width="140" label="过敏史">
<div>{{ formDate.allergyHistory}}</div> <div>{{ formDate.allergyHistory}}</div>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="体格检查"> <el-descriptions-item :width="140" label="体格检查">
<div>{{ formDate.exam}}</div> <div>{{ formDate.exam}}</div>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="望闻问切" v-if="modelType==1"> <el-descriptions-item :width="140" label="望闻问切" v-if="modelType==1">
<div>{{ formDate.chinaAdjunctCheck}}</div> <div>{{ formDate.chinaAdjunctCheck}}</div>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="法制" v-if="modelType==1"> <el-descriptions-item :width="140" label="法制" v-if="modelType==1">
<div>{{ formDate.chinaDeal}}</div> <div>{{ formDate.chinaDeal}}</div>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="口腔检查" v-if="modelType==2"> <el-descriptions-item :width="140" label="口腔检查" v-if="modelType==2">
<div>{{ formDate.mouthCheck}}</div> <div>{{ formDate.mouthCheck}}</div>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="辅助检查" v-if="modelType==2 || modelType ==0"> <el-descriptions-item :width="140" label="辅助检查" v-if="modelType==2 || modelType ==0">
<div>{{ formDate.adjunctCheck}}</div> <div>{{ formDate.adjunctCheck}}</div>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="处置" v-if="modelType==0 || modelType ==2"> <el-descriptions-item :width="140" label="处置" v-if="modelType==0 || modelType ==2">
<div>{{ formDate.deal}}</div> <div>{{ formDate.deal}}</div>
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>

View File

@ -2,7 +2,7 @@
import Panel from '../common/Panel.vue'; import Panel from '../common/Panel.vue';
import {defineEmits, defineModel,defineProps} from 'vue' import {defineEmits, defineModel,defineProps} from 'vue'
const {status}=defineProps(['status']) const {status}=defineProps(['status'])
const emit = defineEmits(['save','deleteItem']); const emit = defineEmits(['save','deleteItem','edit']);
const save = () => { const save = () => {
emit('save'); emit('save');
}; };
@ -10,7 +10,9 @@ const deleteItem = () => {
emit('deleteItem'); emit('deleteItem');
}; };
const totalAmount = defineModel<any>() const totalAmount = defineModel<any>()
const editItem= () => {
emit('edit');
};
</script> </script>
<template> <template>
@ -20,7 +22,7 @@ const totalAmount = defineModel<any>()
<div class="btn-group"> <div class="btn-group">
<el-button v-if="status == 2" @click="deleteItem">取消接诊</el-button> <el-button v-if="status == 2" @click="deleteItem">取消接诊</el-button>
<el-button v-if="status == 2" type="primary" @click="save">完成接诊</el-button> <el-button v-if="status == 2" type="primary" @click="save">完成接诊</el-button>
<el-button v-if="status == 3" type="primary">修改</el-button> <el-button v-if="status == 3" type="primary" @click="editItem">修改</el-button>
</div> </div>
</div> </div>
</Panel> </Panel>

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<div class="header" style="width: 100%;display: flex;justify-content: center"> <div class="header" style="width: 100%;display: flex;justify-content: center;margin-bottom: 10px">
<el-button type="primary" style="margin-top:10px" round class="btn" @click="openCreateSearch" <el-button type="primary" style="margin-top:10px" round class="btn" @click="openCreateSearch"
plain> plain>
一键建档 一键建档
@ -8,7 +8,6 @@
</div> </div>
<el-form :model="form" label-width="auto"> <el-form :model="form" label-width="auto">
<el-descriptions <el-descriptions
:title="props.id?'编辑' : '新增'"
:column="3" :column="3"
direction="vertical" direction="vertical"
border border

View File

@ -1,30 +1,59 @@
<template> <template>
<el-form :model="form" label-width="auto"> <el-form :model="userInfo" label-width="auto" :rules="rules" ref="ruleFormRef">
<el-descriptions <el-descriptions
:title="props.id?'编辑' : '新增'" title="基本信息"
:column="3"
direction="vertical"
border
>
<el-descriptions-item label="账号">
<el-form-item prop="username">
<el-input v-model="userInfo.username"/>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="密码">
<el-form-item prop="password">
<el-input v-model="userInfo.password" show-password/>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="用户名">
<el-form-item>
<el-input v-model="userInfo.name"/>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
<el-form :model="memberInfo" label-width="auto">
<el-descriptions
title="扩展信息"
:column="3" :column="3"
direction="vertical" direction="vertical"
border border
> >
<el-descriptions-item label="姓名"> <el-descriptions-item label="姓名">
<el-form-item> <el-form-item>
<el-input v-model="form.name"/> <el-input v-model="memberInfo.name"/>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="性别"> <el-descriptions-item label="性别">
<el-form-item> <el-form-item>
<el-input v-model="form.gender"/> <el-input v-model="memberInfo.gender"/>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="年龄"> <el-descriptions-item label="年龄">
<el-form-item> <el-form-item>
<el-input v-model="form.age"/> <el-input v-model="memberInfo.age"/>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="手机号">
<el-form-item>
<el-input v-model="memberInfo.tel"/>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="角色"> <el-descriptions-item label="角色">
<el-form-item> <el-form-item>
<el-select <el-select
v-model="form.role" v-model="memberInfo.role"
placeholder="选择角色" placeholder="选择角色"
size="large" size="large"
> >
@ -39,18 +68,13 @@
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="身份证号"> <el-descriptions-item label="身份证号">
<el-form-item> <el-form-item>
<el-input v-model="form.idCardNumber"/> <el-input v-model="memberInfo.idCardNumber"/>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="手机号">
<el-form-item>
<el-input v-model="form.tel"/>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="科室"> <el-descriptions-item label="科室">
<el-form-item> <el-form-item>
<el-select <el-select
v-model="form.sectionId" v-model="memberInfo.sectionId"
placeholder="选择科室" placeholder="选择科室"
> >
<el-option <el-option
@ -64,17 +88,17 @@
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="医保人员代码"> <el-descriptions-item label="医保人员代码">
<el-form-item> <el-form-item>
<el-input v-model="form.socialMemberCode"/> <el-input v-model="memberInfo.socialMemberCode"/>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="备注"> <el-descriptions-item label="备注">
<el-form-item> <el-form-item>
<el-input v-model="form.memo"/> <el-input v-model="memberInfo.memo"/>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="电子签名"> <el-descriptions-item label="电子签名">
<el-form-item> <el-form-item>
<UpLoad v-model="uploadURL" ref="uploadRef" @uploadSuccess="(url)=>{form.electronicSignature=url}"></UpLoad> <UpLoad v-model="uploadURL" ref="uploadRef" @uploadSuccess="(url)=>{memberInfo.electronicSignature=url}"></UpLoad>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
@ -133,7 +157,7 @@ const roleList = [
label: '其他', label: '其他',
}, },
] ]
const form = ref<any>({ const memberInfo = ref<any>({
name: "", // name: "", //
gender: "", // gender: "", //
age: "", // age: "", //
@ -144,24 +168,48 @@ const form = ref<any>({
sectionId: "", // id sectionId: "", // id
electronicSignature: "", // electronicSignature: "", //
memo: '',// memo: '',//
password: "",
}) })
const userInfo= ref<any>({
username: "", //
name: "",
password: "",
})
const rules= {
username: [
{required: true, message: '请输入账号', trigger: 'blur'},
],
password: [
{required: true, message: '请输入密码', trigger: 'blur'},
],
}
const emit = defineEmits(['onSubmit']) const emit = defineEmits(['onSubmit'])
const onSubmit = () => { const onSubmit = () => {
emit('onSubmit') emit('onSubmit')
} }
const ruleFormRef= ref<any>('')
const save = () => { const save = () => {
if (props.id) { let form={
post("organization/member/edit", {data: form.value}).then((res) => { memberInfo:memberInfo.value,
onSubmit() userInfo:userInfo.value,
form.value = {}
})
} else {
post("organization/member/add", {data: form.value}).then((res) => {
onSubmit()
form.value = {}
})
} }
ruleFormRef.value.validate((valid: any) => {
if (valid) {
if (props.id) {
post("organization/member/edit", {data: form}).then((res) => {
onSubmit()
memberInfo.value = {}
userInfo.value = {}
})
} else {
post("organization/member/add", {data: form}).then((res) => {
onSubmit()
memberInfo.value = {}
})
}
}
})
} }
const options = Object.entries(depts).map(([key, value]) => { const options = Object.entries(depts).map(([key, value]) => {
if (typeof value === 'string') { if (typeof value === 'string') {
@ -179,10 +227,15 @@ const options = Object.entries(depts).map(([key, value]) => {
}); });
const uploadRef = ref<any>('') const uploadRef = ref<any>('')
const init = (id: any) => { const init = (id: any) => {
memberInfo.value = {}
userInfo.value = {}
post("organization/member/getById", {id}).then((res: any) => { post("organization/member/getById", {id}).then((res: any) => {
form.value = res memberInfo.value = res.memberInfo
if(form.value.electronicSignature){ if(res.userInfo){
uploadRef.value?.getImageUrl(form.value.electronicSignature) userInfo.value = res.userInfo
}
if(memberInfo.value.electronicSignature){
uploadRef.value?.getImageUrl(memberInfo.value.electronicSignature)
} }
}) })
} }

View File

@ -7,6 +7,10 @@ const router = createRouter({
path: '/', path: '/',
redirect: '/home/index', redirect: '/home/index',
}, },
{
path: '/manager/login',
component: ()=>import('../views/Login.vue'),
},
{ {
path: '/home', path: '/home',
component: () => import('../views/Layout.vue'), component: () => import('../views/Layout.vue'),

View File

@ -11,7 +11,6 @@ export async function initRequest(_router:any) {
function post(path: string, data: any = {}, options: any = {}) { function post(path: string, data: any = {}, options: any = {}) {
let config={catch_error: false,base_url:globalConfig.base_url} let config={catch_error: false,base_url:globalConfig.base_url}
config={...config,...options} config={...config,...options}
let token = localStorage.getItem('token'); let token = localStorage.getItem('token');
let headers: Record<string, string> = {}; let headers: Record<string, string> = {};
if (token) { if (token) {

338
src/views/Login.vue Normal file
View File

@ -0,0 +1,338 @@
<script setup lang="ts">
import {ref} from 'vue'
import {post} from '@/utils/request.ts'
import {useRouter} from "vue-router";
import {ElMessage} from "element-plus";
import Mask from "@/components/common/Mask.vue";
import Auth from "@/components/manger/Auth.vue";
const username = ref('')
const password = ref('')
const rememberMe = ref(false)
const router = useRouter();
const handleLogin = () => {
post("manager/user/login", {username: username.value, password: password.value}).then((token: any) => {
localStorage.setItem('token', token)
ElMessage({
message: "登陆成功,即将为您跳转到首页",
type: 'success',
duration: 1000,
onClose: () => {
router.push("/home/index")
}
})
})
}
const isShowAuth = ref(false)
const showAuth = () => {
isShowAuth.value = true
}
</script>
<template>
<div class="login-container">
<div class="particles-bg">
<div class="particle particle-1"></div>
<div class="particle particle-2"></div>
<div class="particle particle-3"></div>
<div class="particle particle-4"></div>
</div>
<div class="login-card">
<h1 class="title">欢迎使用药慧精灵</h1>
<div class="input-group">
<i class="fas fa-user input-icon"></i>
<input
v-model="username"
type="text"
placeholder="请输入用户名"
class="input-field"
>
</div>
<div class="input-group">
<i class="fas fa-lock input-icon"></i>
<input
v-model="password"
type="password"
placeholder="请输入密码"
class="input-field"
>
</div>
<div class="button">
<button type="submit" class="login-button" @click="handleLogin">登录</button>
<button class="auth-button" @click="showAuth">授权</button>
</div>
</div>
</div>
<Mask :is-show="isShowAuth" @close="isShowAuth=false" :width="600" :height="600" title="授权">
<Auth></Auth>
</Mask>
</template>
<style scoped lang="scss">
.login-container {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background: #5078c8;
}
//
.particles-bg {
position: fixed;
width: 100vw;
height: 100vh;
overflow: hidden;
z-index: 0;
}
//
.particle {
position: absolute;
border-radius: 50%;
animation: float 12s infinite linear;
filter: blur(1px);
//
background: linear-gradient(145deg, #89c3fd 0%, #a8d8ff 100%);
//
&::before, &::after {
content: '';
position: absolute;
width: 70%;
height: 70%;
border-radius: inherit;
background: rgba(255, 255, 255, 0.4);
}
//
&-1 {
width: 60px;
height: 60px;
top: 15%;
left: 5%;
animation-duration: 14s;
}
&-2 {
width: 80px;
height: 80px;
top: 70%;
right: 10%;
animation-duration: 16s;
}
&-3 {
width: 40px;
height: 40px;
top: 40%;
right: 30%;
animation-duration: 12s;
}
&-4 {
width: 100px;
height: 100px;
top: 65%;
left: 15%;
animation-duration: 18s;
}
//
&:nth-child(odd)::before {
top: 20%;
left: 20%;
}
&:nth-child(even)::after {
bottom: 20%;
right: 20%;
}
}
//
@keyframes float {
0%, 100% {
transform: translate(0, 0) rotate(0deg) scale(1);
opacity: 0.6;
}
33% {
transform: translate(30px, -80px) rotate(120deg) scale(0.9);
opacity: 0.8;
}
66% {
transform: translate(-20px, 60px) rotate(240deg) scale(1.1);
opacity: 0.4;
}
}
// 4
.particles-bg::before,
.particles-bg::after {
content: '';
position: absolute;
width: 50px;
height: 50px;
border-radius: 50%;
background: linear-gradient(145deg, #c2e9fb 0%, #a1c4fd 100%);
animation: miniFloat 10s infinite linear;
opacity: 0.7;
}
.particles-bg::before {
top: 20%;
right: 5%;
animation-delay: 2s;
}
.particles-bg::after {
bottom: 30%;
left: 8%;
animation-delay: 5s;
}
@keyframes miniFloat {
0%, 100% {
transform: translate(0, 0) scale(1);
}
50% {
transform: translate(40px, -60px) scale(0.8);
}
}
/* 调整原有卡片层级 */
.login-card {
position: relative;
z-index: 1;
/* 保持原有样式 */
}
.login-card {
background: rgba(255, 255, 255, 0.95);
padding: 2.5rem;
border-radius: 20px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
width: 480px;
transform: translateY(-10%);
}
.title {
text-align: center;
font-size: 2rem;
color: #2c3e50;
margin-bottom: 2rem;
font-weight: 600;
}
.input-group {
position: relative;
margin-bottom: 1.5rem;
}
.input-icon {
position: absolute;
left: 1rem;
top: 50%;
transform: translateY(-50%);
color: #7f8c8d;
}
.input-field {
width: 100%;
padding: 1rem 1rem 1rem 2.5rem;
border: 2px solid #ecf0f1;
border-radius: 8px;
font-size: 1rem;
transition: all 0.3s ease;
&:focus {
border-color: #3498db;
box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.1);
outline: none;
}
}
.options {
display: flex;
justify-content: space-between;
align-items: center;
margin: 1.5rem 0;
}
.remember-me {
display: flex;
align-items: center;
gap: 0.5rem;
color: #7f8c8d;
}
.forgot-password {
color: #3498db;
text-decoration: none;
font-size: 0.9rem;
&:hover {
text-decoration: underline;
}
}
.button{
display: flex;
}
.login-button {
flex: 1;
padding: 1rem;
background: linear-gradient(135deg, #3498db, #2980b9);
border: none;
border-radius: 8px;
color: white;
font-size: 1.1rem;
font-weight: 600;
cursor: pointer;
transition: transform 0.2s ease;
&:hover {
transform: translateY(-2px);
}
&:active {
transform: translateY(0);
}
}
.auth-button{
flex: 1;
margin-left: 10px;
padding: 1rem;
background: linear-gradient(135deg, #3498db, #2980b9);
border: none;
border-radius: 8px;
color: white;
font-size: 1.1rem;
font-weight: 600;
cursor: pointer;
transition: transform 0.2s ease;
&:hover {
transform: translateY(-2px);
}
&:active {
transform: translateY(0);
}
}
.register-link {
text-align: center;
margin-top: 1.5rem;
color: #7f8c8d;
a {
color: #3498db;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
}
</style>

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="container-wrapper"> <div class="container-wrapper">
<div class="top"> <div class="top">
<el-button type="primary" @click="is_add = true">新增领用</el-button> <el-button type="primary" :icon="Plus" @click="is_add = true">新增领用</el-button>
</div> </div>
<div class="content"> <div class="content">
<el-table :data="dataList" style="width: 100%" @row-click="rowClick"> <el-table :data="dataList" style="width: 100%" @row-click="rowClick">
@ -28,21 +28,21 @@
/> />
</div> </div>
</div> </div>
<Mask :width="1200" :height="600" :top="100" :is-show="is_add" @close="is_add=false"> <Mask :width="1200" :height="600" :top="100" :is-show="is_add" @close="is_add=false" title="新增">
<AddApply @close="closeAddApply"/> <AddApply @close="closeAddApply"/>
</Mask> </Mask>
<Mask :width="1200" :height="600" :top="100" :is-show="is_detail" @close="is_detail=false"> <Mask :width="1200" :height="600" :top="100" :is-show="is_detail" @close="is_detail=false" title="编辑">
<DetailApply :id="id" @close="closeDetailApply"/> <DetailApply :id="id" @close="closeDetailApply"/>
</Mask> </Mask>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import Mask from "@/components/common/Mask.vue"; import Mask from "@/components/common/Mask.vue";
import AddApply from "@/components/inventory/apply/AddApply.vue"; import AddApply from "@/components/inventory/apply/AddApply.vue";
import {onMounted, ref} from "vue"; import {onMounted, ref} from "vue";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import DetailApply from "@/components/inventory/apply/DetailApply.vue"; import DetailApply from "@/components/inventory/apply/DetailApply.vue";
import {Plus} from "@element-plus/icons-vue";
const is_add = ref(false) const is_add = ref(false)
const is_detail = ref(false) const is_detail = ref(false)
@ -97,7 +97,7 @@ const rowClick = (row: any) => {
@use "@/assets/scss/base.scss"; @use "@/assets/scss/base.scss";
.container-wrapper { .container-wrapper {
box-sizing: border-box; box-sizing: border-box;
padding: 20px; padding: 24px;
overflow: hidden; overflow: hidden;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -115,12 +115,10 @@ const rowClick = (row: any) => {
box-sizing: border-box; box-sizing: border-box;
padding: 10px; padding: 10px;
position: relative; position: relative;
border-bottom: 1px solid #EEE; border-top: 1px solid #EEE;
.page_btn_list { display: flex;
position: absolute; justify-content: flex-end;
left: 0; align-items: center;
top: 10px;
}
} }
} }

View File

@ -2,7 +2,7 @@
<div class="container-wrapper"> <div class="container-wrapper">
<div class="top"> <div class="top">
<el-dropdown> <el-dropdown>
<el-button type="primary" @click="openAdd">开始盘点</el-button> <el-button type="primary" :icon="Plus" @click="openAdd">开始盘点</el-button>
</el-dropdown> </el-dropdown>
</div> </div>
<div class="content_list"> <div class="content_list">
@ -32,18 +32,19 @@
</div> </div>
</div> </div>
<Mask :width="1200" :height="500" :is-show="showAdd" :top="100" @close="showAdd = false"> <Mask :width="1200" :height="500" :is-show="showAdd" :top="100" @close="showAdd = false">
<Add @close="showAdd = false"/> <Add @close="showAdd = false"/>
</Mask> </Mask>
<Mask :width="1200" :height="500" :is-show="showDetail" :top="100" @close="showDetail = false"> <Mask :width="1200" :height="500" :is-show="showDetail" :top="100" @close="showDetail = false">
<Detail :id="id" @close="showDetail = false"/> <Detail :id="id" @close="showDetail = false"/>
</Mask> </Mask>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref} from "vue"; import {onMounted, ref} from "vue";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import Mask from "@/components/common/Mask.vue"; import Mask from "@/components/common/Mask.vue";
import Add from "@/components/inventory/check/Add.vue"; import Add from "@/components/inventory/check/Add.vue";
import Detail from "@/components/inventory/check/Detail.vue"; import Detail from "@/components/inventory/check/Detail.vue";
import {Plus} from "@element-plus/icons-vue";
const tableData = ref([]) const tableData = ref([])
const getCheck = () => { const getCheck = () => {
@ -65,7 +66,7 @@ const openAdd = () => {
showAdd.value = true showAdd.value = true
} }
const editCheck = (row: any) => { const editCheck = (row: any) => {
id.value=row.id id.value = row.id
showDetail.value = true showDetail.value = true
} }
@ -88,34 +89,36 @@ let changePage = (value: number) => {
}) })
} }
// YYYY-MM-DD // YYYY-MM-DD
const formatDate = (isoStr:any) => { const formatDate = (isoStr: any) => {
const date = new Date(isoStr); const date = new Date(isoStr);
return `${date.getFullYear()}-${(date.getMonth()+1).toString().padStart(2,'0')}-${date.getDate().toString().padStart(2,'0')}`; return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@use "../../assets/scss/base.scss"; @use "../../assets/scss/base.scss";
.container-wrapper { .container-wrapper {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
padding: 24px;
.content_list { .content_list {
flex: 1; flex: 1;
overflow: hidden; overflow: hidden;
margin-top: base.$margin-base; margin-top: base.$margin-base;
} }
.bottom { .bottom {
height: 60px; height: 60px;
background-color: #FFF; background-color: #FFF;
box-sizing: border-box; box-sizing: border-box;
padding: 10px; padding: 10px;
position: relative; position: relative;
border-bottom: 1px solid #EEE; border-top: 1px solid #EEE;
.page_btn_list { display: flex;
position: absolute; justify-content: flex-end;
left: 0; align-items: center;
top: 10px;
}
} }
} }
</style> </style>

View File

@ -1,86 +1,77 @@
<template> <template>
<div class="container-wrapper"> <div class="container-wrapper">
<div class="top"> <div class="top">
<el-dropdown> <div class="search">
<el-button type="primary">新增商品 <el-form :inline="true" :model="searchModel">
<el-icon class="el-icon--right"> <el-form-item>
<arrow-down/> <el-input placeholder="请输入名称"
</el-icon> clearable
</el-button> v-model="searchModel.name"
<template #dropdown> style="width: 200px"
<el-dropdown-menu> >
<el-dropdown-item @click="open_edit(1301,0)">中西成药</el-dropdown-item> <template #prefix>
<el-dropdown-item @click="open_edit(1302,0)">中药饮片</el-dropdown-item> <el-icon class="el-input__icon">
<el-dropdown-item @click="open_edit(1306,0)">医疗器材</el-dropdown-item> <search/>
<el-dropdown-item @click="open_edit(0,0)">其他商品</el-dropdown-item> </el-icon>
</el-dropdown-menu> </template>
</template> </el-input>
</el-dropdown> </el-form-item>
</div> <el-form-item>
<div class="search"> <el-cascader :options="allCateList" :show-all-levels="false" v-model="searchModel.cateId" clearable/>
<el-form :inline="true" :model="searchModel"> </el-form-item>
<el-form-item> <el-form-item>
<el-input placeholder="请输入名称" <el-select
clearable placeholder="利润分类"
v-model="searchModel.name" style="width: 150px"
style="width: 200px" multiple
> collapse-tags
<template #prefix> collapse-tags-tooltip
<el-icon class="el-input__icon"> v-model="searchModel.curProfitCate"
<search/> >
</el-icon> <el-option
</template> v-for="item in profitCategory"
</el-input> :key="item.name"
</el-form-item> :label="item.name"
<el-form-item> :value="item.name"
<el-cascader :options="allCateList" :show-all-levels="false" v-model="searchModel.cateId" clearable/> />
</el-form-item> </el-select>
<el-form-item> </el-form-item>
<el-select <el-form-item style="margin-right: 0">
placeholder="利润分类" <el-input placeholder="最低毛利率" v-model="searchModel.minInterestRate" style="width: 100px">
style="width: 150px" <template #suffix>
multiple <el-icon class="el-input__icon">%</el-icon>
collapse-tags </template>
collapse-tags-tooltip </el-input>
v-model="searchModel.curProfitCate" <el-icon style="color: #ddd">
> <SemiSelect/>
<el-option </el-icon>
v-for="item in profitCategory" </el-form-item>
:key="item.name"
:label="item.name"
:value="item.name"
/>
</el-select>
</el-form-item>
<el-form-item style="margin-right: 0">
<el-input placeholder="最低毛利率" v-model="searchModel.minInterestRate" style="width: 100px">
<template #suffix>
<el-icon class="el-input__icon">%</el-icon>
</template>
</el-input>
<el-icon style="color: #ddd">
<SemiSelect/>
</el-icon>
</el-form-item>
<el-form-item> <el-form-item>
<el-input placeholder="最高毛利率" v-model="searchModel.maxInterestRate" style="width: 100px"> <el-input placeholder="最高毛利率" v-model="searchModel.maxInterestRate" style="width: 100px">
<template #suffix> <template #suffix>
<el-icon class="el-input__icon">%</el-icon> <el-icon class="el-input__icon">%</el-icon>
</template> </template>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="searchGoods">搜索</el-button> <el-button type="primary" @click="searchGoods">搜索</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div class="right"> <div class="right">
<el-checkbox v-model="inventoryNumber" label="不看0库存" size="large" @change="searchGoods"/> <el-checkbox v-model="inventoryNumber" label="不看0库存" size="large" @change="searchGoods"/>
<el-checkbox v-model="status" label="不看已停用" size="large" @change="searchGoods"/> <el-checkbox v-model="status" label="不看已停用" size="large" @change="searchGoods"/>
</div>
</div>
<div class="addBtn">
<el-button type="primary" :icon="Plus" @click="open_edit(1301,0)">新增中西成药</el-button>
<el-button type="primary" :icon="Plus" @click="open_edit(1302,0)">新增中药饮片</el-button>
<el-button type="primary" :icon="Plus" @click="open_edit(1306,0)">新增医疗器材</el-button>
<el-button type="primary" :icon="Plus" @click="open_edit(0,0)">新增其他商品</el-button>
</div> </div>
</div> </div>
<div class="content_goods" ref="content"> <div class="content_goods" ref="content">
<el-table :data="tableData" style="width: 100%;height: 100%" @row-click="openMack"> <el-table :data="tableData" style="width: 100%;height: 100%;padding: 0 24px" @row-click="openMack">
<el-table-column fixed prop="name" label="名称" width="200" show-overflow-tooltip/> <el-table-column fixed prop="name" label="名称" width="200" show-overflow-tooltip/>
<el-table-column fixed label="类型" width="200"> <el-table-column fixed label="类型" width="200">
<template #default="scope"> <template #default="scope">
@ -95,12 +86,12 @@
<el-table-column fixed label="厂家" prop="producer" width="230" show-overflow-tooltip/> <el-table-column fixed label="厂家" prop="producer" width="230" show-overflow-tooltip/>
<el-table-column fixed label="进价" width="120"> <el-table-column fixed label="进价" width="120">
<template #default="scope"> <template #default="scope">
{{ scope.row.purchaseUnitPrice?.toFixed(2) }} {{ scope.row.purchaseUnitPrice.toFixed(2) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed label="售价" width="120"> <el-table-column fixed label="售价" width="120">
<template #default="scope"> <template #default="scope">
{{ scope.row.unitPrice?.toFixed(2) }} {{ scope.row.unitPrice.toFixed(2) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="标签" prop="producer" width="200"> <el-table-column label="标签" prop="producer" width="200">
@ -116,7 +107,7 @@
</el-table-column> </el-table-column>
<el-table-column label="毛利率" width="120"> <el-table-column label="毛利率" width="120">
<template #default="scope"> <template #default="scope">
{{ (scope.row.interestRate * 100)?.toFixed(2) }}% {{ (scope.row.interestRate * 100).toFixed(2) }}%
</template> </template>
</el-table-column> </el-table-column>
@ -140,7 +131,7 @@
</el-table-column> </el-table-column>
<el-table-column label="药品成本" prop="costPrice" show-overflow-tooltip> <el-table-column label="药品成本" prop="costPrice" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ scope.row.costPrice?.toFixed(2) }} {{ scope.row.costPrice.toFixed(2) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="医保码" prop="hilistCode" show-overflow-tooltip></el-table-column> <el-table-column label="医保码" prop="hilistCode" show-overflow-tooltip></el-table-column>
@ -167,10 +158,13 @@
</div> </div>
</div> </div>
</div> </div>
<Mask :is-show="is_add" :top="50" :height="900" @close="is_add = false" title="新建档案"> <Mask :is-show="is_add" :top="50" :height="900">
<Edit ref="editRef" @close="is_add = false;init()"/> <Edit ref="editRef" @close="is_add = false;init()"/>
</Mask> </Mask>
<Mask :is-show="open" :top="50" :height="600" @close="open=false" title="列表信息"> <Mask :is-show="open" :top="50" :height="600">
<div style="height: 50px">
<CloseBtn @click="closeMack"></CloseBtn>
</div>
<el-tabs v-model="activeName" @tab-change="changeTab"> <el-tabs v-model="activeName" @tab-change="changeTab">
<el-tab-pane label="商品信息" name="first"> <el-tab-pane label="商品信息" name="first">
<Edit ref="editRef" @close="open = false;init()"/> <Edit ref="editRef" @close="open = false;init()"/>
@ -188,11 +182,12 @@
import {nextTick, onMounted, ref} from "vue"; import {nextTick, onMounted, ref} from "vue";
import {ElTabPane} from "element-plus"; import {ElTabPane} from "element-plus";
import {post} from '@/utils/request.ts'; import {post} from '@/utils/request.ts';
import Mask from "@/components/common/Mask.vue"; import Mask from "@/components/Mask.vue";
import Edit from "@/components/inventory/goods/Edit.vue"; import Edit from "@/components/inventory/goods/Edit.vue";
import InventoryBatchDetail from "@/components/inventory/goods/InventoryBatchDetail.vue"; import InventoryBatchDetail from "@/components/inventory/goods/InventoryBatchDetail.vue";
import InventoryStatistics from "@/components/inventory/goods/InventoryStatistics.vue"; import InventoryStatistics from "@/components/inventory/goods/InventoryStatistics.vue";
import {ArrowDown, SemiSelect} from "@element-plus/icons-vue"; import CloseBtn from "@/components/CloseBtn.vue";
import {Plus, SemiSelect} from "@element-plus/icons-vue";
const inventoryNumber = ref(false) const inventoryNumber = ref(false)
const status = ref(false) const status = ref(false)
@ -398,41 +393,44 @@ const activeName = ref('first')
height: 100%; height: 100%;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.top {
height: 112px;
padding: 24px 24px 0;
background: #fff;
.search {
display: flex;
justify-content: space-between;
.el-form-item {
margin-right: 5px;
}
}
}
.content_goods {
width: 100%;
flex: 1;
overflow: hidden;
}
.bottom {
width: 100%;
height: 60px;
background-color: #FFF;
box-sizing: border-box;
padding: 10px;
position: relative;
border-top: 1px solid #EEE;
display: flex;
justify-content: flex-end;
align-items: center;
}
} }
.tags { .tags {
margin-left: 5px; margin-left: 5px;
} }
.search {
display: flex;
justify-content: space-between;
margin-top: 10px;
.el-form-item {
margin-right: 5px;
}
}
.content_goods {
width: 100%;
flex: 1;
overflow: hidden;
}
.bottom {
width: 100%;
height: 60px;
background-color: #FFF;
box-sizing: border-box;
padding: 10px;
position: relative;
border-bottom: 1px solid #EEE;
.page_btn_list {
position: absolute;
left: 0;
top: 10px;
}
}
</style> </style>

View File

@ -2,11 +2,11 @@
<div class="container-wrapper"> <div class="container-wrapper">
<div class="top"> <div class="top">
<el-dropdown> <el-dropdown>
<el-button type="primary" @click="open_add(null)">新增采购</el-button> <el-button type="primary" :icon="Plus" @click="open_add(null)">新增采购</el-button>
</el-dropdown> </el-dropdown>
</div> </div>
<div class="content_list"> <div class="content_list">
<el-table :data="tableData" style="width: 100%"> <el-table :data="tableData" style="width: 100%" @row-click="open_add">
<el-table-column fixed label="进货单号" width="250" show-overflow-tooltip> <el-table-column fixed label="进货单号" width="250" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
<div class="link">{{ scope.row.code }}</div> <div class="link">{{ scope.row.code }}</div>
@ -21,20 +21,17 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="采购人" prop="managerUserName" width="100"></el-table-column> <el-table-column label="采购人" prop="managerUserName" width="100"></el-table-column>
<el-table-column label="供应商" prop="supplierName" width="250"></el-table-column> <el-table-column label="供应商" prop="supplierName"></el-table-column>
<el-table-column prop="purchaseDate" label="采购时间" width="250"> <el-table-column prop="purchaseDate" label="采购时间">
<template #default="scope"> <template #default="scope">
{{ formatDate(scope.row.purchaseDate) }} {{ formatDate(scope.row.purchaseDate) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="createDatetime" label="创建时间" width="250"> <el-table-column prop="createDatetime" label="创建时间">
<template #default="scope"> <template #default="scope">
{{ formatDate(scope.row.createDatetime) }} {{ formatDate(scope.row.createDatetime) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed="right" label="操作" min-width="120" #default="scope">
<el-button link type="primary" size="small" @click="open_add(scope.row.code)">详情</el-button>
</el-table-column>
</el-table> </el-table>
</div> </div>
<div class="bottom"> <div class="bottom">
@ -49,7 +46,7 @@
/> />
</div> </div>
</div> </div>
<Mask :width="1200" :height="700" :top="100" :is-show="is_add"> <Mask :width="1200" :height="700" :top="100" :is-show="is_add" @close="is_add=false" :title="open_code?'编辑':'新增'">
<AddOrder v-if="!open_code" @close="closeAddOrder"/> <AddOrder v-if="!open_code" @close="closeAddOrder"/>
<EditOrder v-else :code="open_code" @close="is_add=false" @updateOrderDetail="init"/> <EditOrder v-else :code="open_code" @close="is_add=false" @updateOrderDetail="init"/>
</Mask> </Mask>
@ -63,6 +60,7 @@ import {useRoute} from "vue-router";
import AddOrder from "@/components/inventory/purchase/AddOrder.vue"; import AddOrder from "@/components/inventory/purchase/AddOrder.vue";
import Mask from "@/components/common/Mask.vue"; import Mask from "@/components/common/Mask.vue";
import EditOrder from "@/components/inventory/purchase/EditOrder.vue"; import EditOrder from "@/components/inventory/purchase/EditOrder.vue";
import {Plus} from "@element-plus/icons-vue";
let tableData = ref([]) let tableData = ref([])
let is_add = ref(false) let is_add = ref(false)
@ -116,7 +114,7 @@ const formatDate = (isoStr: any) => {
@use "@/assets/scss/base.scss"; @use "@/assets/scss/base.scss";
.container-wrapper { .container-wrapper {
box-sizing: border-box; box-sizing: border-box;
padding: 20px; padding: 24px;
overflow: hidden; overflow: hidden;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -134,12 +132,10 @@ const formatDate = (isoStr: any) => {
box-sizing: border-box; box-sizing: border-box;
padding: 10px; padding: 10px;
position: relative; position: relative;
border-bottom: 1px solid #EEE; border-top: 1px solid #EEE;
.page_btn_list { display: flex;
position: absolute; justify-content: flex-end;
left: 0; align-items: center;
top: 10px;
}
} }
} }
.full_screen { .full_screen {

View File

@ -2,11 +2,11 @@
<div class="container-wrapper"> <div class="container-wrapper">
<div class="top"> <div class="top">
<el-dropdown> <el-dropdown>
<el-button type="primary" @click="openAdd">添加供应商</el-button> <el-button type="primary" :icon="Plus" @click="openAdd">添加供应商</el-button>
</el-dropdown> </el-dropdown>
</div> </div>
<div class="content_list"> <div class="content_list">
<el-table :data="tableData" style="width: 100%"> <el-table :data="tableData" @row-click="editSupplier">
<el-table-column label="供应商名称" prop="name" width="250"> <el-table-column label="供应商名称" prop="name" width="250">
</el-table-column> </el-table-column>
<el-table-column label="启用状态" prop="turn" width="80"> <el-table-column label="启用状态" prop="turn" width="80">
@ -15,16 +15,10 @@
<el-tag type="info" v-else>已禁用</el-tag> <el-tag type="info" v-else>已禁用</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="许可证号" prop="licenseCode" width="150"></el-table-column> <el-table-column label="许可证号" prop="licenseCode"></el-table-column>
<el-table-column label="联系人" prop="contactName" width="100"></el-table-column> <el-table-column label="联系人" prop="contactName" width="100"></el-table-column>
<el-table-column label="联系方式" prop="contactTel" width="150"></el-table-column> <el-table-column label="联系方式" prop="contactTel" width="150"></el-table-column>
<el-table-column label="备注" width="250" prop="reamark"/> <el-table-column label="备注" prop="reamark"/>
<el-table-column label="操作" width="150">
<template #default="scope">
<el-button link type="primary" size="small" @click="editSupplier(scope.row)">详情</el-button>
</template>
</el-table-column>
</el-table> </el-table>
</div> </div>
<div class="bottom"> <div class="bottom">
@ -39,7 +33,7 @@
/> />
</div> </div>
</div> </div>
<Mask :width="400" :height="600" :is-show="showAdd" :top="100"> <Mask :width="400" :height="600" :is-show="showAdd" :top="100" @close="showAdd = false" :title="id?'编辑':'添加'">
<AddSupplier @close="showAdd = false" @saveSuccess="getSupplier()" ref="addSupplierRef"></AddSupplier> <AddSupplier @close="showAdd = false" @saveSuccess="getSupplier()" ref="addSupplierRef"></AddSupplier>
</Mask> </Mask>
</div> </div>
@ -49,6 +43,7 @@ import {nextTick, onMounted, ref, watch} from "vue";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import Mask from "@/components/common/Mask.vue"; import Mask from "@/components/common/Mask.vue";
import AddSupplier from "@/components/inventory/supplier/AddSupplier.vue"; import AddSupplier from "@/components/inventory/supplier/AddSupplier.vue";
import {Plus} from "@element-plus/icons-vue";
const tableData = ref([]) const tableData = ref([])
const getSupplier = () => { const getSupplier = () => {
@ -67,7 +62,9 @@ const addSupplierRef = ref();
const openAdd = () => { const openAdd = () => {
showAdd.value = true showAdd.value = true
} }
const id = ref('')
const editSupplier = (row: any) => { const editSupplier = (row: any) => {
id.value = row.id
openAdd() openAdd()
nextTick(() => { nextTick(() => {
addSupplierRef.value.edit(row) addSupplierRef.value.edit(row)
@ -95,25 +92,10 @@ let changePage = (value: number) => {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@use "@/assets/scss/base.scss"; @use "@/assets/scss/base.scss";
.bottom {
width: 100%;
height: 60px;
background-color: #FFF;
box-sizing: border-box;
padding: 10px;
position: relative;
border-bottom: 1px solid #EEE;
.page_btn_list {
position: absolute;
left: 0;
top: 10px;
}
}
.container-wrapper { .container-wrapper {
box-sizing: border-box; box-sizing: border-box;
padding: 20px; padding: 24px;
overflow: hidden; overflow: hidden;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -133,14 +115,10 @@ let changePage = (value: number) => {
box-sizing: border-box; box-sizing: border-box;
padding: 10px; padding: 10px;
position: relative; position: relative;
border-bottom: 1px solid #EEE; border-top: 1px solid #EEE;
margin-top: base.$margin-base; display: flex;
justify-content: flex-end;
.page_btn_list { align-items: center;
position: absolute;
left: 0;
top: 10px;
}
} }
} }
</style> </style>

View File

@ -19,7 +19,7 @@
<PharmaceuticalConsumables v-else v-model="goodsList"></PharmaceuticalConsumables> <PharmaceuticalConsumables v-else v-model="goodsList"></PharmaceuticalConsumables>
</div> </div>
<div class="bottom"> <div class="bottom">
<Settlement v-if="status!=1" v-model="totalAmount" @deleteItem="deleteItem" @save="save" :status="status"></Settlement> <Settlement v-if="status!=1" v-model="totalAmount" @deleteItem="deleteItem" @save="save" :status="status" @edit="edit"></Settlement>
</div> </div>
</el-scrollbar> </el-scrollbar>
</div> </div>
@ -98,7 +98,6 @@ const getId = (item: any) => {
status.value = 2 status.value = 2
}) })
} }
if (item.status == 3) { if (item.status == 3) {
post(apiConfig.DoctorDetail, { post(apiConfig.DoctorDetail, {
regisId: item.id regisId: item.id
@ -119,8 +118,13 @@ const deleteItem = () => {
const getStatus = (e: any) => { const getStatus = (e: any) => {
status.value = e status.value = e
} }
const edit=()=>{
post('registration/changeStatus', {id: registerId.value, status: 2}).then((res: any) => {
status.value = 2
})
}
// 使 watch goodsList itemList // 使 watch goodsList itemList
watch([()=>goodsList.value, itemList], ([newGoodsList, newItemList]) => { watch([()=>goodsList.value, itemList,status], ([newGoodsList, newItemList,newStatus]) => {
const pharmaceuticalTotalAmount = newItemList.reduce((pre: any, cur: any) => { const pharmaceuticalTotalAmount = newItemList.reduce((pre: any, cur: any) => {
return pre + cur.unitPrice return pre + cur.unitPrice
}, 0); }, 0);
@ -129,7 +133,9 @@ watch([()=>goodsList.value, itemList], ([newGoodsList, newItemList]) => {
return pre + cur.selectNum * cur.selectedPrice return pre + cur.selectNum * cur.selectedPrice
}, 0); }, 0);
totalAmount.value = pharmaceuticalTotalAmount + serviceTotalAmount; totalAmount.value = pharmaceuticalTotalAmount + serviceTotalAmount;
console.log(serviceTotalAmount) if (newStatus) {
registerId.value=''
}
}, {deep: true}); }, {deep: true});
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@ -119,6 +119,10 @@ const options = Array.from({length: 10000}).map((_, idx) => ({
})) }))
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.container-wrapper{
padding:0 24px;
background: #fff;
}
.form { .form {
width: 100%; width: 100%;
padding: 0 24px; padding: 0 24px;

View File

@ -1,80 +1,59 @@
<template> <template>
<div class="container-wrapper"> <div class="container-wrapper">
<div class="title"> <div class="title">
<el-select-v2 <div class="title-search">
v-model="state" <el-form
filterable :model="search"
remote label-width="auto"
ref="selectRef" :inline="true"
:remote-method="querySearchAsync" class="demo-form-inline"
:options="options"
placeholder="输入关键字搜索"
style="width: 200px"
>
<template #prefix>
<div class="prefix-wrapper">
<el-icon>
<Search/>
</el-icon>
</div>
</template>
<template #header>
<div class="header">
<div class="text">药品</div>
<div class="text">规格</div>
<div class="text">库存</div>
<div class="text">厂家</div>
<div class="text">最近供应商</div>
</div>
</template>
<template #default="{ item }">
<div class="row" @click="handleSelect(item)">
<div class="text" style="margin-left: 0">{{ item.name }}</div>
<div class="text">{{ item.minPackagingNumber }}*{{ item.minPackagingUnit }}/{{ item.packagingUnit }}</div>
<div class="text">
{{ item.inventoryWholeNumber }}{{ item.packagingUnit }}
<template v-if="item.inventoryFragmentNumber > 0">
{{ item.inventoryFragmentNumber }}{{ item.minPackagingUnit }}
</template>
</div>
<div class="text">{{ item.producer }}</div>
<div class="text" style="margin-left: 15px"></div>
</div>
</template>
<template #footer>
</template>
</el-select-v2>
<div class="search_box">
<el-input
v-model="state"
placeholder="输入关键字搜索药品"
clearable
style="width: 200px"
> >
<template #prefix> <el-form-item>
<el-icon> <el-input v-model="search.itemSocialCode" placeholder="医保码编码" style="width: 200px"></el-input>
<Search/> </el-form-item>
</el-icon> <el-form-item>
</template> <el-input v-model="search.itemName" placeholder="项目名称" style="width: 200px"></el-input>
</el-input> </el-form-item>
</el-form>
</div> </div>
<div class="search_box"> <div class="title-btn">
<el-button type="primary" @click="isShow=true">新建项目</el-button> <el-button type="primary" @click="initData()">查询</el-button>
<el-button type="primary" @click="search={}">重置</el-button>
<el-button type="primary" :icon="Plus" @click="isShow=true">新建项目</el-button>
<el-button type="primary" @click="openSetMenu">组套</el-button> <el-button type="primary" @click="openSetMenu">组套</el-button>
</div> </div>
</div> </div>
<div class="content_list"> <div class="table">
<el-table :data="tableData" style="width: 100%" @row-click="rowClick"> <el-scrollbar>
<el-table-column prop="itemSocialCode" label="医保码编码" width="200" <el-table :data="tableData" @row-click="rowClick">
:show-overflow-tooltip="true"></el-table-column> <el-table-column prop="itemSocialCode" label="医保码编码" width="200"
<el-table-column prop="itemName" label="项目名称"></el-table-column> :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="unit" label="单位"></el-table-column> <el-table-column prop="itemName" label="项目名称"></el-table-column>
<el-table-column prop="purchaseUnitPrice" label="原价"></el-table-column> <el-table-column prop="unit" label="单位"></el-table-column>
<el-table-column prop="unitPrice" label="售价"></el-table-column> <el-table-column prop="purchaseUnitPrice" label="原价"></el-table-column>
</el-table> <el-table-column prop="unitPrice" label="售价"></el-table-column>
<el-table-column prop="createDatetime" label="创建时间">
<template #default="scope">
{{ formatDate(scope.row.createDatetime) }}
</template>
</el-table-column>
</el-table>
</el-scrollbar>
</div>
<div class="bottom">
<div class="page_btn_list">
<el-pagination
background
layout="prev, pager, next"
:page-size="pageSize"
:current-page="page"
:total="total"
@current-change="changePage"
/>
</div>
</div> </div>
</div> </div>
<Mask :is-show="isShow" @close="initData()"> <Mask :is-show="isShow" @close="initData()" :title="id?'项目编辑':'项目新增'">
<ItemEdit :id="id" ref="ItemEditRef" @close="initData()"></ItemEdit> <ItemEdit :id="id" ref="ItemEditRef" @close="initData()"></ItemEdit>
</Mask> </Mask>
<SetMenu ref="setMenuRef"></SetMenu> <SetMenu ref="setMenuRef"></SetMenu>
@ -85,6 +64,8 @@ import {post} from "@/utils/request.ts";
import Mask from "@/components/common/Mask.vue"; import Mask from "@/components/common/Mask.vue";
import ItemEdit from "@/components/settings/ItemEdit.vue"; import ItemEdit from "@/components/settings/ItemEdit.vue";
import SetMenu from "@/components/settings/SetMenu.vue"; import SetMenu from "@/components/settings/SetMenu.vue";
import {formatDate} from "@/utils/dateUtils.ts";
import {Plus} from "@element-plus/icons-vue"
const state = ref([]) const state = ref([])
const options = ref([ const options = ref([
@ -145,10 +126,11 @@ const rowClick = ((row: any) => {
const tableData = ref<any>([]) const tableData = ref<any>([])
const initData = () => { const initData = () => {
post('item/list', {page: 1, size: 20}).then((res: any) => { post('item/list', {page: page.value, size: pageSize.value}).then((res: any) => {
tableData.value = res.list tableData.value = res.list
total.value = res.total_count
}) })
id.value='' id.value = ''
isShow.value = false isShow.value = false
} }
onMounted(() => { onMounted(() => {
@ -160,52 +142,56 @@ const openSetMenu = () => {
setMenuRef.value?.init(); setMenuRef.value?.init();
}); });
} }
const changePage = (val: any) => {
page.value = val
};
const pageSize = ref(20);
const page = ref(1);
const total = ref(0);
const search = ref<any>({})
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.title { .container-wrapper {
padding: 24px;
background: #fff;
display: flex; display: flex;
height: 60px; flex-direction: column;
align-items: center;
.search_box { .title {
//background-color: rgb(148.6, 212.3, 117.1); display: flex;
background-color: #fff; height: 60px;
padding: 10px; align-items: center;
border-radius: 10px; justify-content: space-between;
.title-search {
padding: 10px;
border-radius: 10px;
box-sizing: border-box;
margin-top: 10px;
margin-bottom: 10px;
display: flex;
}
.el-popper.is-pure {
padding: 10px;
}
}
.table {
flex: 1;
min-height: 0;
}
.bottom {
height: 60px;
background-color: #FFF;
box-sizing: border-box; box-sizing: border-box;
margin-top: 10px;
margin-bottom: 10px;
}
.header {
padding: 10px; padding: 10px;
font-size: 18px; border-top: 1px solid #EEE;
display: flex; display: flex;
justify-content: flex-end;
.text {
font-size: 16px;
width: 200px;
color: #6a6a6a;
}
}
.row {
display: flex;
max-height: 500px;
.text {
font-size: 12px;
width: 150px;
margin-left: 10px;
overflow: hidden; /* 隐藏超出部分 */
text-overflow: ellipsis; /* 显示省略号 */
white-space: nowrap; /* 防止换行 */
}
}
.el-popper.is-pure {
padding: 10px;
} }
} }
</style> </style>

View File

@ -1,46 +1,95 @@
<template> <template>
<div class="container-wrapper"> <div class="container-wrapper">
<el-button type="primary" @click="isShow=true">新增</el-button> <div class="title">
<el-table :data="tableData" style="width: 100%" @row-click="rowClick"> <div class="title-search">
<el-table-column prop="date" label="日期" width="180"> <el-form
<template #default="scope"> :model="search"
{{formatDate(scope.row.createDatetime)}} label-width="auto"
</template> :inline="true"
</el-table-column> class="demo-form-inline"
<el-table-column prop="name" label="姓名" width="180"/> >
<el-table-column prop="role" label="角色" width="180"> <el-form-item>
<template #default="scope"> <el-input v-model="search.name" placeholder="请输入姓名" style="width: 200px"></el-input>
{{roleList.find((item: any) => item.value === scope.row.role)?.label||'-'}} </el-form-item>
</template> <el-form-item>
</el-table-column> <el-select v-model="search.sectionId" placeholder="请选择" style="width: 200px">
<el-table-column prop="sectionId" label="科室"> <el-option
<template #default="scope"> v-for="item in roleList"
{{sectionList.find((item: any) => item.id === scope.row.sectionId)?.name ||'-'}} :key="item.value"
</template> :label="item.label"
</el-table-column> :value="item.value"
<el-table-column prop="memo" label="备注"/> >
</el-table> </el-option>
<Mask :is-show="isShow" @close="init()" :width="800" :height="600"> </el-select>
</el-form-item>
</el-form>
</div>
<div class="title-btn">
<el-button type="primary" @click="init()">查询</el-button>
<el-button type="primary" @click="search={}">重置</el-button>
<el-button type="primary" :icon="Plus" @click="isShow=true">新增</el-button>
</div>
</div>
<div class="table">
<el-table :data="tableData" style="width: 100%" @row-click="rowClick">
<el-table-column prop="date" label="日期" width="180">
<template #default="scope">
{{ formatDate(scope.row.memberInfo.createDatetime) }}
</template>
</el-table-column>
<el-table-column prop="name" label="姓名" width="180">
<template #default="scope">
{{ scope.row.memberInfo.name }}
</template>
</el-table-column>
<el-table-column prop="role" label="角色" width="180">
<template #default="scope">
{{ roleList.find((item: any) => item.value === scope.row.memberInfo.role)?.label || '-' }}
</template>
</el-table-column>
<el-table-column prop="sectionId" label="科室">
<template #default="scope">
{{ sectionList.find((item: any) => item.id === scope.row.memberInfo.sectionId)?.name || '-' }}
</template>
</el-table-column>
<el-table-column prop="memo" label="备注"/>
</el-table>
</div>
<div class="bottom">
<div class="page_btn_list">
<el-pagination
background
layout="prev, pager, next"
:page-size="pageSize"
:current-page="page"
:total="total"
@current-change="changePage"
/>
</div>
</div>
<Mask :is-show="isShow" @close="isShow=false" :width="800" :height="600" title="成员管理">
<MemberEdit :id="id" ref="memberEditRef" @onSubmit="init()"></MemberEdit> <MemberEdit :id="id" ref="memberEditRef" @onSubmit="init()"></MemberEdit>
</Mask> </Mask>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {onMounted, ref,nextTick} from "vue" import {onMounted, ref, nextTick} from "vue"
import Mask from '@/components/common/Mask.vue' import Mask from '@/components/common/Mask.vue'
import MemberEdit from "@/components/settings/MemberEdit.vue"; import MemberEdit from "@/components/settings/MemberEdit.vue";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import {formatDate} from "@/utils/dateUtils.ts"; import {formatDate} from "@/utils/dateUtils.ts";
import {Plus} from "@element-plus/icons-vue";
const id = ref<any>("") const id = ref<any>("")
const isShow = ref(false) const isShow = ref(false)
const tableData = ref<any>([]); const tableData = ref<any>([]);
const memberEditRef = ref<any>(null) const memberEditRef = ref<any>(null)
const rowClick = (row: any) => { const rowClick = (row: any) => {
id.value = row.id id.value = row.memberInfo.id
isShow.value = true isShow.value = true
nextTick(() => { nextTick(() => {
memberEditRef.value?.init(row.id) memberEditRef.value?.init(id.value)
}) })
} }
const roleList = [ const roleList = [
@ -79,7 +128,7 @@ const roleList = [
] ]
const init = (() => { const init = (() => {
isShow.value = false isShow.value = false
post('organization/member/list ', {page: 1, size: 100}).then((res: any) => { post('organization/member/list ', {page: page.value, size: pageSize.value}).then((res: any) => {
tableData.value = res.list tableData.value = res.list
list() list()
}) })
@ -88,19 +137,55 @@ const deleteDoctor = (row: any) => {
post('organization/member/list ', {id}).then((res: any) => { post('organization/member/list ', {id}).then((res: any) => {
init() init()
}) })
console.log(row)
} }
const sectionList=ref<any>([]); const sectionList = ref<any>([]);
const list= ()=>{ const list = () => {
post('organization/section/allList').then((res: any) => { post('organization/section/allList').then((res: any) => {
sectionList.value = res sectionList.value = res
}) })
} }
onMounted(()=>{ onMounted(() => {
init() init()
}) })
const changePage = (val: any) => {
page.value = val
};
const pageSize = ref(20);
const page = ref(1);
const total = ref(0);
const search = ref<any>({})
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@use "@/assets/scss/base.scss"; @use "@/assets/scss/base.scss";
.container-wrapper {
background: #fff;
padding: 24px;
display: flex;
flex-direction: column;
height: 100%;
.title {
height: 60px;
display: flex;
justify-content: space-between;
}
.table {
flex: 1;
}
.bottom {
height: 60px;
background-color: #FFF;
box-sizing: border-box;
padding: 10px;
border-top: 1px solid #EEE;
display: flex;
justify-content: flex-end;
}
}
</style> </style>

View File

@ -1,31 +1,66 @@
<template> <template>
<div class="container-wrapper"> <div class="container-wrapper">
<el-button type="primary" @click="isShow=true">新增</el-button> <div class="title">
<el-table :data="tableData" style="width: 100%" @row-click="rowClick"> <div class="title-search">
<el-table-column prop="bedCnt" label="病床数量" width="80"/> <el-form
<el-table-column prop="beginDate" label="开始日期" width="100"/> :model="search"
<el-table-column prop="caty" label="类别"></el-table-column> label-width="auto"
<el-table-column prop="code" label="编码" width="180"/> :inline="true"
<el-table-column prop="createDatetime" label="创建日期时间" width="120"> class="demo-form-inline"
<template #default="scope"> >
{{ scope.row.createDatetime ? formatDate(scope.row.createDatetime) : '-' }} <el-form-item>
</template> <el-input v-model="search.resperName" placeholder="负责人姓名" style="width: 200px"></el-input>
</el-table-column> </el-form-item>
<el-table-column prop="creationDate" label="创建日期" width="120"/> <el-form-item>
<el-table-column prop="delFlag" label="删除标志"/> <el-cascader :props="{ checkStrictly: true }" v-model="search.caty" :options="options" placeholder="科室类别"/>
<el-table-column prop="drPsncnt" label="医生人数"/> </el-form-item>
<el-table-column prop="endDate" label="结束日期" width="120"/> </el-form>
<el-table-column prop="info" label="信息"/> </div>
<el-table-column prop="medServScp" label="医疗服务范围"/> <div class="title-btn">
<el-table-column prop="memo" label="备注"/> <el-button type="primary" @click="init()">查询</el-button>
<el-table-column prop="name" label="内科"/> <el-button type="primary" @click="search={}">重置</el-button>
<el-table-column prop="nursPsncnt" label="护士人数"/> <el-button type="primary" :icon="Plus" @click="isShow=true">新增</el-button>
<el-table-column prop="pharPsncnt" label="药剂师人数"/> </div>
<el-table-column prop="resperName" label="负责人姓名"/> </div>
<el-table-column prop="resperTel" label="负责人电话"/> <div class="table">
<el-table-column prop="socialBedCnt" label="社会病床数量"/> <el-table :data="tableData" style="width: 100%" @row-click="rowClick">
<el-table-column prop="tecnPsncnt" label="技术人员人数"/> <el-table-column prop="bedCnt" label="病床数量" width="80"/>
</el-table> <el-table-column prop="beginDate" label="开始日期" width="100"/>
<el-table-column prop="caty" label="类别"></el-table-column>
<el-table-column prop="code" label="编码" width="180"/>
<el-table-column prop="createDatetime" label="创建日期时间" width="120">
<template #default="scope">
{{ scope.row.createDatetime ? formatDate(scope.row.createDatetime) : '-' }}
</template>
</el-table-column>
<el-table-column prop="creationDate" label="创建日期" width="120"/>
<el-table-column prop="delFlag" label="删除标志"/>
<el-table-column prop="drPsncnt" label="医生人数"/>
<el-table-column prop="endDate" label="结束日期" width="120"/>
<el-table-column prop="info" label="信息"/>
<el-table-column prop="medServScp" label="医疗服务范围"/>
<el-table-column prop="memo" label="备注"/>
<el-table-column prop="name" label="内科"/>
<el-table-column prop="nursPsncnt" label="护士人数"/>
<el-table-column prop="pharPsncnt" label="药剂师人数"/>
<el-table-column prop="resperName" label="负责人姓名"/>
<el-table-column prop="resperTel" label="负责人电话"/>
<el-table-column prop="socialBedCnt" label="社会病床数量"/>
<el-table-column prop="tecnPsncnt" label="技术人员人数"/>
</el-table>
</div>
<div class="bottom">
<div class="page_btn_list">
<el-pagination
background
layout="prev, pager, next"
:page-size="pageSize"
:current-page="page"
:total="total"
@current-change="changePage"
/>
</div>
</div>
</div> </div>
<Mask :is-show="isShow" @close="init()" :height="570"> <Mask :is-show="isShow" @close="init()" :height="570">
<SectionEdit :id="id" ref="sectionRef" @onSubmit="init()"></SectionEdit> <SectionEdit :id="id" ref="sectionRef" @onSubmit="init()"></SectionEdit>
@ -38,6 +73,8 @@ import SectionEdit from "@/components/settings/SectionEdit.vue";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import deptsObj from '@/assets/config/directory/depts.json' import deptsObj from '@/assets/config/directory/depts.json'
import {formatDate} from '@/utils/dateUtils.ts' import {formatDate} from '@/utils/dateUtils.ts'
import depts from "@/assets/config/directory/depts.json";
import {Plus} from "@element-plus/icons-vue";
const id = ref<any>("") const id = ref<any>("")
const isShow = ref(false) const isShow = ref(false)
@ -67,18 +104,72 @@ const rowClick = (row: any) => {
onMounted(() => { onMounted(() => {
init() init()
}) })
interface Dept {
[key: string]: string | { name: string; children: { [key: string]: string } };
}
const init = () => { const init = () => {
isShow.value = false isShow.value = false
post('organization/section/list', {page: 1, size: 10}).then((res: any) => { post('organization/section/list', {page: page.value, size: pageSize.value}).then((res: any) => {
tableData.value = res.list tableData.value = res.list
tableData.value.forEach((item: any) => { tableData.value.forEach((item: any) => {
item.caty = deptsObj[item.caty] let dept: Dept = deptsObj
item.caty = dept[item.caty]
console.log(item.caty) console.log(item.caty)
}) })
}) })
} }
const changePage = (val: any) => {
page.value = val
};
const pageSize = ref(20);
const page = ref(1);
const total = ref(0);
const search = ref<any>({})
const options = Object.entries(depts).map(([key, value]) => {
if (typeof value === 'string') {
return {value: key, label: value};
} else {
return {
value: key,
label: value.name,
children: Object.entries(value.children).map(([childKey, childValue]) => ({
value: childKey,
label: childValue,
})),
};
}
});
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@use "@/assets/scss/base.scss"; @use "@/assets/scss/base.scss";
.container-wrapper {
background: #fff;
padding: 24px;
display: flex;
flex-direction: column;
height: 100%;
.title {
height: 60px;
display: flex;
justify-content: space-between;
align-items: center;
}
.table {
flex: 1;
}
.bottom {
height: 60px;
background-color: #FFF;
box-sizing: border-box;
padding: 10px;
border-top: 1px solid #EEE;
display: flex;
justify-content: flex-end;
}
}
</style> </style>