# Conflicts:
#	openhis-server/openhis-common/src/main/java/com/openhis/common/constant/PromptMsgConstant.java
#	openhis-server/openhis-domain/src/main/java/com/openhis/administration/service/IChargeItemService.java
This commit is contained in:
Zhang.WH
2025-03-07 17:48:31 +08:00
114 changed files with 5077 additions and 479 deletions

View File

@@ -0,0 +1,16 @@
{ // launch.json 配置了启动调试时相关设置configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
// launchtype项可配置值为local或remote, local代表前端连本地云函数remote代表前端连云端云函数
"version": "0.0",
"configurations": [{
"default" :
{
"launchtype" : "local"
},
"mp-weixin" :
{
"launchtype" : "local"
},
"type" : "uniCloud"
}
]
}

View File

@@ -1,3 +1,9 @@
<!--
* @Description:
* @Author: zhuWanLi
* @version: 1.0.0
* @Date: 2025-03-04 13:33:32
-->
<script>
export default {
onLaunch: function() {
@@ -14,4 +20,5 @@
<style>
/*每个页面公共css */
</style>
@import "@/static/font/iconfont.css";
</style>

View File

@@ -3,15 +3,56 @@
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "uni-app"
"navigationBarTextStyle": "white",
"navigationBarTitleText": "首页"
}
},
{
"path": "pages/healthCard/healthCard",
"style": {
"navigationBarTextStyle": "white",
"navigationBarTitleText": "健康卡"
}
},
{
"path": "pages/personInfo/personInfo",
"style": {
"navigationBarTextStyle": "white",
"navigationBarTitleText": "个人中心"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
"navigationBarTextStyle": "white",
"backgroundColor": "#F8F8F8",
"navigationBarBackgroundColor": "#ffffff"
// "titleNView": true
},
"uniIdRouter": {}
}
"uniIdRouter": {},
"tabBar": {
"color": "#282828",
"selectedColor": "#00a2f3",
"borderStyle": "white",
"backgroundColor": "#ffffff",
"list": [{
"pagePath": "pages/index/index",
"iconPath": "static/images/tabbar/shouye.png",
"selectedIconPath": "static/images/tabbar/shouye_1.png",
"text": "首页"
},
{
"pagePath": "pages/healthCard/healthCard",
"iconPath": "static/images/tabbar/erweima.png",
"selectedIconPath": "static/images/tabbar/erweima_1.png",
"text": "健康卡"
},
{
"pagePath": "pages/personInfo/personInfo",
"iconPath": "static/images/tabbar/wode.png",
"selectedIconPath": "static/images/tabbar/wode_1.png",
"text": "个人中心"
}
]
}
}

View File

@@ -0,0 +1,168 @@
<template>
<view class="service-page">
<!-- 顶部功能入口 -->
<view class="top-section">
<view class="top-item" @click="navigateTo('my-doctor')">
<image src="/static/icons/doctor.png" mode="aspectFit"></image>
<text>我的医生</text>
</view>
<view class="top-item" @click="navigateTo('online-consult')">
<image src="/static/icons/online.png" mode="aspectFit"></image>
<text>一键在线复诊</text>
</view>
</view>
<!-- 会员中心 -->
<view class="vip-section" @click="navigateTo('vip-center')">
<image src="/static/icons/vip.png" mode="aspectFit"></image>
<text>会员中心 · 精选权益超值享</text>
</view>
<!-- 服务与工具网格 -->
<view class="service-grid">
<view
class="grid-item"
v-for="(item, index) in serviceList"
:key="index"
@click="handleServiceClick(item)"
>
<image :src="item.icon" mode="aspectFit"></image>
<text>{{ item.title }}</text>
</view>
</view>
<!-- 商务合作 -->
<view class="cooperation" @click="navigateTo('business')">
<text>商务合作</text>
<image src="/static/icons/arrow-right.png" mode="aspectFit"></image>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue';
// 服务列表数据
const serviceList = ref([
{ id: 1, title: '收藏', icon: '/static/icons/collect.png', type: 'collect' },
{ id: 2, title: '我的医生', icon: '/static/icons/doctor.png', type: 'my-doctor' },
{ id: 3, title: '随访计划', icon: '/static/icons/follow-up.png', type: 'follow-plan' },
{ id: 4, title: '客服中心', icon: '/static/icons/service.png', type: 'customer-service' }
]);
// 处理服务点击
const handleServiceClick = (item) => {
switch(item.type) {
case 'customer-service':
uni.makePhoneCall({ phoneNumber: '400-123-4567' });
break;
default:
navigateTo(item.type);
}
};
// 通用跳转方法
const navigateTo = (path) => {
uni.navigateTo({ url: `/pages/${path}/${path}` });
};
</script>
<style lang="scss" scoped>
.service-page {
padding: 20rpx;
background-color: #f5f5f5;
}
.top-section {
display: flex;
justify-content: space-between;
margin: 20rpx 0;
padding: 30rpx;
background-color: #fff;
border-radius: 16rpx;
.top-item {
display: flex;
flex-direction: column;
align-items: center;
width: 45%;
image {
width: 100rpx;
height: 100rpx;
margin-bottom: 20rpx;
}
text {
font-size: 28rpx;
color: #333;
}
}
}
.vip-section {
display: flex;
align-items: center;
padding: 30rpx;
margin: 20rpx 0;
background-color: #fff;
border-radius: 16rpx;
image {
width: 60rpx;
height: 60rpx;
margin-right: 20rpx;
}
text {
font-size: 28rpx;
color: #ff9900;
}
}
.service-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 20rpx;
padding: 30rpx;
background-color: #fff;
border-radius: 16rpx;
.grid-item {
display: flex;
flex-direction: column;
align-items: center;
image {
width: 80rpx;
height: 80rpx;
margin-bottom: 20rpx;
}
text {
font-size: 24rpx;
color: #666;
}
}
}
.cooperation {
display: flex;
justify-content: space-between;
align-items: center;
padding: 30rpx;
margin-top: 20rpx;
background-color: #fff;
border-radius: 16rpx;
text {
font-size: 28rpx;
color: #333;
}
image {
width: 32rpx;
height: 32rpx;
}
}
</style>

View File

@@ -0,0 +1,64 @@
<template>
<view class="content">
<!-- <image class="logo" src="/static/logo.png"></image>
<view class="text-area">
<text class="title">{{title}}</text>
</view> -->
<view :style="{visibility: showSkeleton ? 'hidden' : 'visible'}">
<!-- 导航 -->
<home-navi @goLogin="openAuto"></home-navi>
<!-- 轮播 -->
<home-swiper :dataList="dataBanner"></home-swiper>
<!-- 菜单 -->
<home-menus :dataList="dataMenus" @goLogin="openAuto"></home-menus>
<!-- 健康科普 -->
<home-article :dataList="dataArticle" @goLogin="openAuto"></home-article>
<!-- 视频课堂 -->
<home-video :dataList="dataVideo" @goLogin="openAuto"></home-video>
</view>
</view>
</template>
<script>
export default {
data() {
return {
title: '1111'
}
},
onLoad() {
},
methods: {
}
}
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
</style>

View File

@@ -1,52 +1,318 @@
<template>
<view class="content">
<image class="logo" src="/static/logo.png"></image>
<view class="text-area">
<text class="title">{{title}}</text>
<view class="container">
<!-- 轮播图 -->
<swiper class="swiper-container" autoplay circular indicator-dots>
<swiper-item v-for="(item, index) in swiperList" :key="index">
<image :src="item.image" mode="aspectFill" class="swiper-image"></image>
</swiper-item>
</swiper>
<!-- 用户信息栏 -->
<!-- <view class="user-card">
<view class="user-info">
<view class="user-info-left">
<image class="avatar" src="/static/images/user.png"></image>
</view>
<text class="name">{{ currentPatient.name }}</text>
<text class="switch" @click="switchPatient">切换就诊人 ></text>
</view>
<text class="patient-id">就诊号{{ currentPatient.id }}</text>
</view> -->
<view class="user-card">
<view class="user-info-left">
<image class="avatar" src="/static/images/user.png"></image>
<text class="name">{{ currentPatient.name }}</text>
<text class="switch-patient" @click="switchPatient">切换就诊人 ></text>
</view>
<text class="patient-id">就诊号{{ currentPatient.id }}</text>
</view>
<!-- 功能宫格区域 -->
<scroll-view scroll-y class="main-content">
<view class="grid-container">
<view class="section-title">医院服务</view>
<view class="grid-row">
<view v-for="(item, index) in firstRow" :key="index" class="grid-item"
@click="handleFunction(item)">
<image class="icon" :src="item.icon" mode="aspectFit" />
<text class="label">{{ item.label }}</text>
</view>
</view>
<view class="grid-row">
<view v-for="(item, index) in secondRow" :key="index" class="grid-item"
@click="handleFunction(item)">
<image class="icon" :src="item.icon" mode="aspectFit" />
<text class="label">{{ item.label }}</text>
</view>
</view>
</view>
<view class="section">
<view class="service-grid">
<view v-for="(item, index) in hospitalServices" :key="index" class="service-item">
<text>{{ item }}</text>
</view>
</view>
</view>
</scroll-view>
</view>
</template>
<script setup>
import {
ref,
reactive
} from 'vue';
<script>
export default {
data() {
return {
title: 'Hello666'
}
// 轮播图数据
const swiperList = ref([{
image: '/static/shouye/lunbotu1.png'
},
onLoad() {
{
image: '/static/shouye/lunbotu2.png'
},
methods: {
{
image: '/static/shouye/lunbotu1.png'
}
}
</script>
]);
// 当前就诊人信息
const currentPatient = reactive({
name: '张三',
id: '123456'
});
<style>
.content {
// 功能配置(示例数据)
const firstRow = ref([{
label: '健康码',
icon: '/static/icons/health-code.png',
path: '/pages/health-code'
},
{
label: '预约挂号',
icon: '/static/icons/appointment.png',
path: '/pages/appointment'
},
{
label: '当日挂号',
icon: '/static/icons/today-reg.png',
path: '/pages/today-reg'
},
{
label: '门诊缴费',
icon: '/static/icons/payment.png',
path: '/pages/payment'
}
]);
const secondRow = ref([{
label: '查看报告',
icon: '/static/icons/report.png',
path: '/pages/report'
},
{
label: '就诊记录',
icon: '/static/icons/record.png',
path: '/pages/records'
},
{
label: '科室查询',
icon: '/static/icons/department.png',
path: '/pages/department'
},
{
label: '医生查询',
icon: '/static/icons/doctor.png',
path: '/pages/doctor'
}
]);
// 医院服务
const hospitalServices = ref([
'医院介绍',
'国粹中医',
'惠民政策',
'特色疗法'
]);
// 底部导航
const tabItems = ref([{
text: '首页',
icon: '/static/tabs/home.png',
selectedIcon: '/static/tabs/home-active.png'
},
{
text: '健康卡',
icon: '/static/tabs/health-card.png',
selectedIcon: '/static/tabs/health-card-active.png'
},
{
text: '个人中心',
icon: '/static/tabs/profile.png',
selectedIcon: '/static/tabs/profile-active.png'
}
]);
const activeTab = ref(0);
// 切换就诊人
const switchPatient = () => {
uni.navigateTo({
url: '/pages/patient/switch'
});
};
// 处理功能点击
const handleFunction = (item) => {
if (item.path) {
uni.navigateTo({
url: item.path
});
}
};
// 切换底部导航
const switchTab = (index) => {
activeTab.value = index;
// 实际项目应使用路由跳转
};
</script>
<style scoped>
.swiper-container {
width: 100%;
height: 300rpx;
}
.swiper-image {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 15rpx;
}
.container {
height: 100vh;
display: flex;
flex-direction: column;
}
.user-card {
/* background: linear-gradient(135deg, #6eb4ff, #007aff); */
padding: 30rpx;
color: black;
}
.user-info {
display: flex;
justify-content: space-between;
align-items: center;
padding-bottom: 20rpx;
}
.name {
font-size: 36rpx;
font-weight: bold;
}
.switch {
padding-left: 10rpx;
font-size: 28rpx;
/* text-decoration: underline; */
}
.patient-id {
font-size: 28rpx;
}
.main-content {
flex: 1;
background-color: #f5f5f5;
}
.grid-container {
padding-top: 1vh;
}
.grid-row {
display: flex;
justify-content: space-between;
margin-bottom: 1vh;
}
.grid-item {
width: 23%;
background: white;
border-radius: 16rpx;
padding: 20rpx;
text-align: center;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
}
.icon {
width: 80rpx;
height: 80rpx;
margin-bottom: 15rpx;
}
.label {
font-size: 24rpx;
color: #333;
}
.section {
background: white;
margin: 20rpx;
border-radius: 16rpx;
padding: 30rpx;
}
.section-title {
font-size: 32rpx;
font-weight: bold;
margin-bottom: 30rpx;
}
.service-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20rpx;
}
.service-item {
background: #f8f8f8;
padding: 30rpx;
border-radius: 12rpx;
text-align: center;
}
.tabbar {
height: 100rpx;
background: white;
display: flex;
justify-content: space-around;
align-items: center;
box-shadow: 0 -4rpx 12rpx rgba(0, 0, 0, 0.05);
}
.tab-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
.tab-icon {
width: 48rpx;
height: 48rpx;
margin-bottom: 8rpx;
}
.text-area {
display: flex;
justify-content: center;
.active {
color: #007aff;
}
.title {
font-size: 36rpx;
color: #8f8f94;
.avatar {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
margin-right: 30rpx;
}
</style>
</style>

View File

@@ -0,0 +1,43 @@
<template>
<view class="service-item" @click="handleClick">
<image :src="icon" class="icon" />
<text class="title">{{ title }}</text>
</view>
</template>
<script>
export default {
props: {
icon: {
type: String,
required: true
},
title: {
type: String,
required: true
}
},
methods: {
handleClick() {
this.$emit('click');
}
}
}
</script>
<style>
.service-item {
display: flex;
flex-direction: column;
align-items: center;
cursor: pointer;
}
.icon {
width: 40px;
height: 40px;
}
.title {
margin-top: 5px;
font-size: 14px;
}
</style>

View File

@@ -0,0 +1,233 @@
<template>
<view class="container">
<!-- 用户信息区域 -->
<view class="user-info">
<view class="avatar-section">
<view class="user-info-left">
<image class="avatar" src="/static/images/user.png"></image>
</view>
<view class="user-info-right">
<view class="name-section">
<view>
<text class="name">{{ currentPatient.name }}</text>
<text class="switch-patient" @click="switchPatient">切换就诊人></text>
</view>
<view class="patient-id">
<text>就诊号{{ currentPatient.id }}</text>
</view>
</view>
</view>
</view>
</view>
<!-- 顶部功能入口 -->
<view class="top-section">
<view class="top-item" @click="navigateTo('my-doctor')">
<uni-icons custom-prefix="iconfont" type="my-jiaofeijilu" size="30"></uni-icons>
<text>缴费记录</text>
</view>
<view class="top-item" @click="navigateTo('my-doctor')">
<uni-icons custom-prefix="iconfont" type="my-guahaojilu" size="30"></uni-icons>
<text>挂号记录</text>
</view>
<view class="top-item" @click="navigateTo('my-doctor')">
<uni-icons custom-prefix="iconfont" type="my-jiuzhenjilu" size="30"></uni-icons>
<text>就诊记录</text>
</view>
<view class="top-item" @click="navigateTo('online-consult')">
<uni-icons custom-prefix="iconfont" type="my-wodebaogao" size="30"></uni-icons>
<text>我的报告</text>
</view>
<view class="top-item" @click="navigateTo('my-doctor')">
<uni-icons custom-prefix="iconfont" type="my-jiuzhenrenguanli" size="30"></uni-icons>
<text>就诊人管理</text>
</view>
</view>
<!-- 功能列表 -->
<view class="menu-list">
<navigator v-for="(item, index) in menus" :key="index" class="menu-item" :url="item.url">
<text>{{ item.label }}</text>
</navigator>
</view>
</view>
</template>
<script setup>
import {
ref,
reactive
} from 'vue';
import {
onLoad
} from '@dcloudio/uni-app';
// 用户信息
const userInfo = reactive({
avatar: ''
});
// 当前就诊人信息
const currentPatient = ref({
name: '张三',
id: '123456'
});
// 菜单配置
const menus = ref([{
label: '缴费记录',
url: '/pages/records/payment'
},
{
label: '挂号记录',
url: '/pages/records/registration'
},
{
label: '就诊记录',
url: '/pages/records/medical'
},
{
label: '我的报告',
url: '/pages/records/report'
},
{
label: '就诊人管理',
url: '/pages/patient/manage'
}
]);
// 处理头像点击
const handleAvatarClick = () => {
uni.chooseImage({
count: 1,
success: (res) => {
userInfo.avatar = res.tempFilePaths[0];
}
});
};
// 切换就诊人
const switchPatient = () => {
uni.navigateTo({
url: '/pages/patient/select'
});
};
// 初始化数据
onLoad(() => {
// 这里可以添加请求用户数据的逻辑
});
</script>
<style scoped lang='scss'>
.container {
background-color: #f5f5f5;
min-height: 100vh;
}
/* 设置整个用户信息区域 */
.user-info {
background-color: #fff;
padding-top: 20rpx;
padding-left: 20rpx;
padding-right: 20rpx;
display: flex;
/* 启用Flex布局 */
justify-content: space-between;
/* 在水平上分配空间 */
align-items: center;
/* 垂直方向居中对齐 */
}
/* 名字和切换按钮布局 */
.name-section {
display: flex;
flex-direction: column;
}
/* 名字布局 */
.name {
font-weight: bold;
}
/* 选择就诊人布局 */
.switch-patient {
border: #007aff;
color: #007aff;
padding-left: 10px;
font-size: 28rpx;
}
/* 就诊号 */
.patient-id {
font-size: 26rpx;
color: #666;
padding-top: 10rpx;
}
.avatar-section {
display: flex;
align-items: center;
margin-bottom: 20rpx;
/* 左侧区域 */
.user-info-left {
display: flex;
/* 启用Flex布局 */
align-items: center;
/* 垂直方向居中 */
}
/* 右侧区域 */
.user-info-right {
display: flex;
/* 启用Flex布局 */
align-items: center;
/* 垂直方向居中 */
}
}
.avatar {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
margin-right: 30rpx;
}
.menu-list {
margin-top: 20rpx;
background-color: #fff;
}
/* .menu-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 30rpx;
border-bottom: 2rpx solid #eee;
} */
.top-section {
display: flex;
margin: 20rpx 0;
padding: 30rpx;
background-color: #fff;
border-radius: 16rpx;
.top-item {
display: flex;
flex-direction: column;
align-items: center;
width: 45%;
font-size: 25 rpx;
.image {
width: 100rpx;
height: 100rpx;
margin-bottom: 20rpx;
}
.text {
/* font-size: 20rpx ; */
color: #333;
}
}
}
</style>

View File

@@ -0,0 +1,69 @@
@font-face {
font-family: "iconfont";
src: url('/static/font/iconfont.ttf') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-keshi:before {
content: "\e624";
}
.icon-yisheng_1:before {
content: "\e633";
}
.icon-menzhenjiaofei2:before {
content: "\e605";
}
.icon-erweima:before {
content: "\e642";
}
.icon-jinriguahao:before {
content: "\e627";
}
.icon-qiandao_:before {
content: "\e687";
}
.icon-chakanbaogao:before {
content: "\e69d";
}
.icon-homejiuzhenjilu:before {
content: "\e6b1";
}
.icon-yuyueguahao:before {
content: "\e606";
}
.my-jiuzhenjilu:before {
content: "\e61a";
}
.my-guahaojilu:before {
content: "\e718";
}
.my-wodebaogao:before {
content: "\e67a";
}
.my-jiaofeijilu:before {
content: "\e6ce";
}
.my-jiuzhenrenguanli:before {
content: "\e6a9";
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 742 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 729 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 725 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 608 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 601 B

View File

@@ -0,0 +1,22 @@
## 1.3.52022-01-24
- 优化 size 属性可以传入不带单位的字符串数值
## 1.3.42022-01-24
- 优化 size 支持其他单位
## 1.3.32022-01-17
- 修复 nvue 有些图标不显示的bug兼容老版本图标
## 1.3.22021-12-01
- 优化 示例可复制图标名称
## 1.3.12021-11-23
- 优化 兼容旧组件 type 值
## 1.3.02021-11-19
- 新增 更多图标
- 优化 自定义图标使用方式
- 优化 组件UI并提供设计资源详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons)
## 1.1.72021-11-08
## 1.2.02021-07-30
- 组件兼容 vue3如何创建vue3项目详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
## 1.1.52021-05-12
- 新增 组件示例地址
## 1.1.42021-02-05
- 调整为uni_modules目录规范

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,96 @@
<template>
<!-- #ifdef APP-NVUE -->
<text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" @click="_onClick">{{unicode}}</text>
<!-- #endif -->
<!-- #ifndef APP-NVUE -->
<text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick"></text>
<!-- #endif -->
</template>
<script>
import icons from './icons.js';
const getVal = (val) => {
const reg = /^[0-9]*$/g
return (typeof val === 'number' || reg.test(val) )? val + 'px' : val;
}
// #ifdef APP-NVUE
var domModule = weex.requireModule('dom');
import iconUrl from './uniicons.ttf'
domModule.addRule('fontFace', {
'fontFamily': "uniicons",
'src': "url('"+iconUrl+"')"
});
// #endif
/**
* Icons 图标
* @description 用于展示 icons 图标
* @tutorial https://ext.dcloud.net.cn/plugin?id=28
* @property {Number} size 图标大小
* @property {String} type 图标图案,参考示例
* @property {String} color 图标颜色
* @property {String} customPrefix 自定义图标
* @event {Function} click 点击 Icon 触发事件
*/
export default {
name: 'UniIcons',
emits:['click'],
props: {
type: {
type: String,
default: ''
},
color: {
type: String,
default: '#333333'
},
size: {
type: [Number, String],
default: 16
},
customPrefix:{
type: String,
default: ''
}
},
data() {
return {
icons: icons.glyphs
}
},
computed:{
unicode(){
let code = this.icons.find(v=>v.font_class === this.type)
if(code){
return unescape(`%u${code.unicode}`)
}
return ''
},
iconSize(){
return getVal(this.size)
}
},
methods: {
_onClick() {
this.$emit('click')
}
}
}
</script>
<style lang="scss">
/* #ifndef APP-NVUE */
@import './uniicons.css';
@font-face {
font-family: uniicons;
src: url('./uniicons.ttf') format('truetype');
}
/* #endif */
.uni-icons {
font-family: uniicons;
text-decoration: none;
text-align: center;
}
</style>

View File

@@ -0,0 +1,663 @@
.uniui-color:before {
content: "\e6cf";
}
.uniui-wallet:before {
content: "\e6b1";
}
.uniui-settings-filled:before {
content: "\e6ce";
}
.uniui-auth-filled:before {
content: "\e6cc";
}
.uniui-shop-filled:before {
content: "\e6cd";
}
.uniui-staff-filled:before {
content: "\e6cb";
}
.uniui-vip-filled:before {
content: "\e6c6";
}
.uniui-plus-filled:before {
content: "\e6c7";
}
.uniui-folder-add-filled:before {
content: "\e6c8";
}
.uniui-color-filled:before {
content: "\e6c9";
}
.uniui-tune-filled:before {
content: "\e6ca";
}
.uniui-calendar-filled:before {
content: "\e6c0";
}
.uniui-notification-filled:before {
content: "\e6c1";
}
.uniui-wallet-filled:before {
content: "\e6c2";
}
.uniui-medal-filled:before {
content: "\e6c3";
}
.uniui-gift-filled:before {
content: "\e6c4";
}
.uniui-fire-filled:before {
content: "\e6c5";
}
.uniui-refreshempty:before {
content: "\e6bf";
}
.uniui-location-filled:before {
content: "\e6af";
}
.uniui-person-filled:before {
content: "\e69d";
}
.uniui-personadd-filled:before {
content: "\e698";
}
.uniui-back:before {
content: "\e6b9";
}
.uniui-forward:before {
content: "\e6ba";
}
.uniui-arrow-right:before {
content: "\e6bb";
}
.uniui-arrowthinright:before {
content: "\e6bb";
}
.uniui-arrow-left:before {
content: "\e6bc";
}
.uniui-arrowthinleft:before {
content: "\e6bc";
}
.uniui-arrow-up:before {
content: "\e6bd";
}
.uniui-arrowthinup:before {
content: "\e6bd";
}
.uniui-arrow-down:before {
content: "\e6be";
}
.uniui-arrowthindown:before {
content: "\e6be";
}
.uniui-bottom:before {
content: "\e6b8";
}
.uniui-arrowdown:before {
content: "\e6b8";
}
.uniui-right:before {
content: "\e6b5";
}
.uniui-arrowright:before {
content: "\e6b5";
}
.uniui-top:before {
content: "\e6b6";
}
.uniui-arrowup:before {
content: "\e6b6";
}
.uniui-left:before {
content: "\e6b7";
}
.uniui-arrowleft:before {
content: "\e6b7";
}
.uniui-eye:before {
content: "\e651";
}
.uniui-eye-filled:before {
content: "\e66a";
}
.uniui-eye-slash:before {
content: "\e6b3";
}
.uniui-eye-slash-filled:before {
content: "\e6b4";
}
.uniui-info-filled:before {
content: "\e649";
}
.uniui-reload:before {
content: "\e6b2";
}
.uniui-micoff-filled:before {
content: "\e6b0";
}
.uniui-map-pin-ellipse:before {
content: "\e6ac";
}
.uniui-map-pin:before {
content: "\e6ad";
}
.uniui-location:before {
content: "\e6ae";
}
.uniui-starhalf:before {
content: "\e683";
}
.uniui-star:before {
content: "\e688";
}
.uniui-star-filled:before {
content: "\e68f";
}
.uniui-calendar:before {
content: "\e6a0";
}
.uniui-fire:before {
content: "\e6a1";
}
.uniui-medal:before {
content: "\e6a2";
}
.uniui-font:before {
content: "\e6a3";
}
.uniui-gift:before {
content: "\e6a4";
}
.uniui-link:before {
content: "\e6a5";
}
.uniui-notification:before {
content: "\e6a6";
}
.uniui-staff:before {
content: "\e6a7";
}
.uniui-vip:before {
content: "\e6a8";
}
.uniui-folder-add:before {
content: "\e6a9";
}
.uniui-tune:before {
content: "\e6aa";
}
.uniui-auth:before {
content: "\e6ab";
}
.uniui-person:before {
content: "\e699";
}
.uniui-email-filled:before {
content: "\e69a";
}
.uniui-phone-filled:before {
content: "\e69b";
}
.uniui-phone:before {
content: "\e69c";
}
.uniui-email:before {
content: "\e69e";
}
.uniui-personadd:before {
content: "\e69f";
}
.uniui-chatboxes-filled:before {
content: "\e692";
}
.uniui-contact:before {
content: "\e693";
}
.uniui-chatbubble-filled:before {
content: "\e694";
}
.uniui-contact-filled:before {
content: "\e695";
}
.uniui-chatboxes:before {
content: "\e696";
}
.uniui-chatbubble:before {
content: "\e697";
}
.uniui-upload-filled:before {
content: "\e68e";
}
.uniui-upload:before {
content: "\e690";
}
.uniui-weixin:before {
content: "\e691";
}
.uniui-compose:before {
content: "\e67f";
}
.uniui-qq:before {
content: "\e680";
}
.uniui-download-filled:before {
content: "\e681";
}
.uniui-pyq:before {
content: "\e682";
}
.uniui-sound:before {
content: "\e684";
}
.uniui-trash-filled:before {
content: "\e685";
}
.uniui-sound-filled:before {
content: "\e686";
}
.uniui-trash:before {
content: "\e687";
}
.uniui-videocam-filled:before {
content: "\e689";
}
.uniui-spinner-cycle:before {
content: "\e68a";
}
.uniui-weibo:before {
content: "\e68b";
}
.uniui-videocam:before {
content: "\e68c";
}
.uniui-download:before {
content: "\e68d";
}
.uniui-help:before {
content: "\e679";
}
.uniui-navigate-filled:before {
content: "\e67a";
}
.uniui-plusempty:before {
content: "\e67b";
}
.uniui-smallcircle:before {
content: "\e67c";
}
.uniui-minus-filled:before {
content: "\e67d";
}
.uniui-micoff:before {
content: "\e67e";
}
.uniui-closeempty:before {
content: "\e66c";
}
.uniui-clear:before {
content: "\e66d";
}
.uniui-navigate:before {
content: "\e66e";
}
.uniui-minus:before {
content: "\e66f";
}
.uniui-image:before {
content: "\e670";
}
.uniui-mic:before {
content: "\e671";
}
.uniui-paperplane:before {
content: "\e672";
}
.uniui-close:before {
content: "\e673";
}
.uniui-help-filled:before {
content: "\e674";
}
.uniui-paperplane-filled:before {
content: "\e675";
}
.uniui-plus:before {
content: "\e676";
}
.uniui-mic-filled:before {
content: "\e677";
}
.uniui-image-filled:before {
content: "\e678";
}
.uniui-locked-filled:before {
content: "\e668";
}
.uniui-info:before {
content: "\e669";
}
.uniui-locked:before {
content: "\e66b";
}
.uniui-camera-filled:before {
content: "\e658";
}
.uniui-chat-filled:before {
content: "\e659";
}
.uniui-camera:before {
content: "\e65a";
}
.uniui-circle:before {
content: "\e65b";
}
.uniui-checkmarkempty:before {
content: "\e65c";
}
.uniui-chat:before {
content: "\e65d";
}
.uniui-circle-filled:before {
content: "\e65e";
}
.uniui-flag:before {
content: "\e65f";
}
.uniui-flag-filled:before {
content: "\e660";
}
.uniui-gear-filled:before {
content: "\e661";
}
.uniui-home:before {
content: "\e662";
}
.uniui-home-filled:before {
content: "\e663";
}
.uniui-gear:before {
content: "\e664";
}
.uniui-smallcircle-filled:before {
content: "\e665";
}
.uniui-map-filled:before {
content: "\e666";
}
.uniui-map:before {
content: "\e667";
}
.uniui-refresh-filled:before {
content: "\e656";
}
.uniui-refresh:before {
content: "\e657";
}
.uniui-cloud-upload:before {
content: "\e645";
}
.uniui-cloud-download-filled:before {
content: "\e646";
}
.uniui-cloud-download:before {
content: "\e647";
}
.uniui-cloud-upload-filled:before {
content: "\e648";
}
.uniui-redo:before {
content: "\e64a";
}
.uniui-images-filled:before {
content: "\e64b";
}
.uniui-undo-filled:before {
content: "\e64c";
}
.uniui-more:before {
content: "\e64d";
}
.uniui-more-filled:before {
content: "\e64e";
}
.uniui-undo:before {
content: "\e64f";
}
.uniui-images:before {
content: "\e650";
}
.uniui-paperclip:before {
content: "\e652";
}
.uniui-settings:before {
content: "\e653";
}
.uniui-search:before {
content: "\e654";
}
.uniui-redo-filled:before {
content: "\e655";
}
.uniui-list:before {
content: "\e644";
}
.uniui-mail-open-filled:before {
content: "\e63a";
}
.uniui-hand-down-filled:before {
content: "\e63c";
}
.uniui-hand-down:before {
content: "\e63d";
}
.uniui-hand-up-filled:before {
content: "\e63e";
}
.uniui-hand-up:before {
content: "\e63f";
}
.uniui-heart-filled:before {
content: "\e641";
}
.uniui-mail-open:before {
content: "\e643";
}
.uniui-heart:before {
content: "\e639";
}
.uniui-loop:before {
content: "\e633";
}
.uniui-pulldown:before {
content: "\e632";
}
.uniui-scan:before {
content: "\e62a";
}
.uniui-bars:before {
content: "\e627";
}
.uniui-cart-filled:before {
content: "\e629";
}
.uniui-checkbox:before {
content: "\e62b";
}
.uniui-checkbox-filled:before {
content: "\e62c";
}
.uniui-shop:before {
content: "\e62f";
}
.uniui-headphones:before {
content: "\e630";
}
.uniui-cart:before {
content: "\e631";
}

View File

@@ -0,0 +1,86 @@
{
"id": "uni-icons",
"displayName": "uni-icons 图标",
"version": "1.3.5",
"description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。",
"keywords": [
"uni-ui",
"uniui",
"icon",
"图标"
],
"repository": "https://github.com/dcloudio/uni-ui",
"engines": {
"HBuilderX": "^3.2.14"
},
"directories": {
"example": "../../temps/example_temps"
},
"dcloudext": {
"category": [
"前端组件",
"通用组件"
],
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "无",
"permissions": "无"
},
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
},
"uni_modules": {
"dependencies": ["uni-scss"],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y"
},
"client": {
"App": {
"app-vue": "y",
"app-nvue": "y"
},
"H5-mobile": {
"Safari": "y",
"Android Browser": "y",
"微信浏览器(Android)": "y",
"QQ浏览器(Android)": "y"
},
"H5-pc": {
"Chrome": "y",
"IE": "y",
"Edge": "y",
"Firefox": "y",
"Safari": "y"
},
"小程序": {
"微信": "y",
"阿里": "y",
"百度": "y",
"字节跳动": "y",
"QQ": "y"
},
"快应用": {
"华为": "u",
"联盟": "u"
},
"Vue": {
"vue2": "y",
"vue3": "y"
}
}
}
}
}

View File

@@ -0,0 +1,8 @@
## Icons 图标
> **组件名uni-icons**
> 代码块: `uIcons`
用于展示 icons 图标 。
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons)
#### 如使用过程中有任何问题或者您对uni-ui有一些好的建议欢迎加入 uni-ui 交流群871950839

View File

@@ -3,8 +3,6 @@
*/
package com.core.common.enums;
import com.core.common.utils.StringUtils;
/**
* 采番前缀枚举
*
@@ -17,8 +15,12 @@ public enum AssignSeqEnum {
* 例子
*/
TEST("1", "例子", "TE"),
//患者编号
PATIENT_NUM("1", "患者编号", "PN");
// 患者编号
PATIENT_NUM("1", "患者编号", "PN"),
/**
* 就诊编号
*/
ENCOUNTER_NUM("1", "就诊编号", "EN");
private final String code;
private final String info;

View File

@@ -2,7 +2,9 @@ package com.core.common.utils;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.Date;
/**
* 根据出生日期算年龄
@@ -15,7 +17,9 @@ public final class AgeCalculatorUtil {
/**
* 当前年龄取得(床位列表表示年龄用)
*/
public static String getAge(LocalDateTime dateTime) {
public static String getAge(Date date) {
// 将 Date 转换为 LocalDateTime
LocalDateTime dateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
LocalDateTime now = LocalDateTime.now();
int years = now.getYear() - dateTime.getYear();
if (years > 2) {
@@ -78,5 +82,4 @@ public final class AgeCalculatorUtil {
private static boolean isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
}
}

View File

@@ -0,0 +1,13 @@
package com.openhis.web.basedatamanage.appservice;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.openhis.web.basedatamanage.dto.LocationQueryDto;
/**
* Location 应该服务类
*/
public interface ILocationAppService {
// 查询位置树
Page<LocationQueryDto> getLocationTree(Integer formKey, Integer pageNo, Integer pageSize);
}

View File

@@ -0,0 +1,13 @@
package com.openhis.web.basedatamanage.appservice;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.openhis.web.basedatamanage.dto.OrganizationQueryDto;
/**
* Organization 应该服务类
*/
public interface IOrganizationAppService {
// 查询机构树
Page<OrganizationQueryDto> getOrganizationTree(Integer pageNo, Integer pageSize);
}

View File

@@ -0,0 +1,101 @@
package com.openhis.web.basedatamanage.appservice.impl;
import java.util.*;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import com.openhis.common.enums.LocationBedStatus;
import com.openhis.common.enums.LocationMode;
import com.openhis.common.enums.LocationStatus;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.openhis.administration.domain.Location;
import com.openhis.administration.service.ILocationService;
import com.openhis.common.enums.LocationForm;
import com.openhis.common.utils.EnumUtils;
import com.openhis.web.basedatamanage.appservice.ILocationAppService;
import com.openhis.web.basedatamanage.dto.LocationQueryDto;
@Service
public class ILocationAppServiceImpl implements ILocationAppService {
@Resource
ILocationService locationService;
@Override
public Page<LocationQueryDto> getLocationTree(Integer formKey, Integer pageNo, Integer pageSize) {
QueryWrapper<Location> queryWrapper = new QueryWrapper<>();
if (formKey != null) {
queryWrapper.eq("form_enum", formKey);
}
// 查询位置列表
Page<Location> page = locationService.page(new Page<>(pageNo, pageSize), queryWrapper);
List<Location> locationList = page.getRecords();
// 将位置列表转为树结构
List<LocationQueryDto> locationTree = buildTree(locationList);
Page<LocationQueryDto> locationQueryDtoPage = new Page<>(pageNo, pageSize, page.getTotal());
locationQueryDtoPage.setRecords(locationTree);
locationQueryDtoPage.getRecords().forEach(e -> {
// 物理形式枚举回显赋值
e.setFormEnum_enumText(EnumUtils.getInfoByValue(LocationForm.class, e.getFormEnum()));
// 状态编码回显赋值
e.setStatusEnum_enumText(EnumUtils.getInfoByValue(LocationStatus.class, e.getStatusEnum()));
// 操作状态回显赋值
e.setOperationalEnum_enumText(EnumUtils.getInfoByValue(LocationBedStatus.class, e.getOperationalEnum()));
// 模式编码回显赋值
e.setModeEnum_enumText(EnumUtils.getInfoByValue(LocationMode.class, e.getModeEnum()));
});
return locationQueryDtoPage;
}
/**
* 将位置列表转换为树结构
*
* @param records 位置列表
* @return tree
*/
private List<LocationQueryDto> buildTree(List<Location> records) {
// 按b_no的层级排序确保父节点先处理
List<Location> sortedRecords = records.stream()
.sorted(Comparator.comparingInt(r -> r.getBusNo().split("\\.").length)).collect(Collectors.toList());
Map<String, LocationQueryDto> nodeMap = new HashMap<>();
List<LocationQueryDto> tree = new ArrayList<>();
for (Location record : sortedRecords) {
String bNo = record.getBusNo();
String[] parts = bNo.split("\\.");
LocationQueryDto node = new LocationQueryDto();
BeanUtils.copyProperties(record, node);
// 将当前节点加入映射
nodeMap.put(bNo, node);
if (parts.length == 1) {
// 根节点
tree.add(node);
} else {
// 获取父节点的b_no去掉最后一部分
String parentBNo = String.join(".", Arrays.copyOf(parts, parts.length - 1));
LocationQueryDto parent = nodeMap.get(parentBNo);
if (parent != null) {
parent.getChildren().add(node);
} else {
// 处理父节点不存在的情况(例如数据缺失)
// 可根据需求调整为将节点加入根或抛出异常
tree.add(node);
}
}
}
return tree;
}
}

View File

@@ -0,0 +1,76 @@
package com.openhis.web.basedatamanage.appservice.impl;
import java.util.*;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.openhis.administration.domain.Organization;
import com.openhis.administration.service.IOrganizationService;
import com.openhis.web.basedatamanage.appservice.IOrganizationAppService;
import com.openhis.web.basedatamanage.dto.OrganizationQueryDto;
@Service
public class IOrganizationAppServiceImpl implements IOrganizationAppService {
@Resource
IOrganizationService organizationService;
@Override
public Page<OrganizationQueryDto> getOrganizationTree(Integer pageNo, Integer pageSize) {
// 查询机构列表
Page<Organization> page = organizationService.page(new Page<>(pageNo, pageSize));
List<Organization> organizationList = page.getRecords();
// 将机构列表转为树结构
List<OrganizationQueryDto> orgTree = buildTree(organizationList);
Page<OrganizationQueryDto> orgQueryDtoPage = new Page<>(pageNo, pageSize, page.getTotal());
orgQueryDtoPage.setRecords(orgTree);
return orgQueryDtoPage;
}
/**
* 将机构列表转换为树结构
*
* @param records 机构列表
* @return tree
*/
private List<OrganizationQueryDto> buildTree(List<Organization> records) {
// 按b_no的层级排序确保父节点先处理
List<Organization> sortedRecords = records.stream()
.sorted(Comparator.comparingInt(r -> r.getBusNo().split("\\.").length)).collect(Collectors.toList());
Map<String, OrganizationQueryDto> nodeMap = new HashMap<>();
List<OrganizationQueryDto> tree = new ArrayList<>();
for (Organization record : sortedRecords) {
String bNo = record.getBusNo();
String[] parts = bNo.split("\\.");
OrganizationQueryDto node = new OrganizationQueryDto();
BeanUtils.copyProperties(record, node);
// 将当前节点加入映射
nodeMap.put(bNo, node);
if (parts.length == 1) {
// 根节点
tree.add(node);
} else {
// 获取父节点的b_no去掉最后一部分
String parentBNo = String.join(".", Arrays.copyOf(parts, parts.length - 1));
OrganizationQueryDto parent = nodeMap.get(parentBNo);
if (parent != null) {
parent.getChildren().add(node);
} else {
// 处理父节点不存在的情况(例如数据缺失)
// 可根据需求调整为将节点加入根或抛出异常
}
}
}
return tree;
}
}

View File

@@ -3,29 +3,23 @@
*/
package com.openhis.web.basedatamanage.controller;
import java.util.Arrays;
import java.util.HashSet;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.core.common.core.domain.R;
import com.core.common.utils.MessageUtils;
import com.core.common.utils.bean.BeanUtils;
import com.openhis.administration.domain.Location;
import com.openhis.administration.mapper.LocationMapper;
import com.openhis.administration.service.ILocationService;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.LocationBedStatus;
import com.openhis.common.enums.LocationForm;
import com.openhis.common.utils.HisPageUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.common.enums.LocationMode;
import com.openhis.common.enums.LocationStatus;
import com.openhis.web.basedatamanage.appservice.ILocationAppService;
import com.openhis.web.basedatamanage.dto.LocationQueryDto;
import com.openhis.web.basedatamanage.dto.LocationQueryParam;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -43,6 +37,7 @@ import lombok.extern.slf4j.Slf4j;
public class CabinetLocationController {
private final ILocationService locationService;
private final ILocationAppService iLocationAppService;
@Autowired
private LocationMapper locationMapper;
@@ -50,32 +45,18 @@ public class CabinetLocationController {
/**
* 位置分页列表
*
* @param locationQueryParam 查询字段
* @param searchKey 模糊查询关键字
* @param pageNo 当前页码
* @param pageSize 查询条数
* @param request 请求数据
* @return 位置分页列表
*/
@GetMapping(value = "/cabinet-location")
public R<?> getLocationPage(LocationQueryParam locationQueryParam,
@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
public R<?> getLocationPage(@RequestParam(required = false, value = "formKey", defaultValue = "") Integer formKey,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest request) {
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
// 构建查询条件
QueryWrapper<Location> queryWrapper = HisQueryUtils.buildQueryWrapper(locationQueryParam, searchKey,
new HashSet<>(Arrays.asList("name", "py_str", "wb_str")), request);
Page<LocationQueryDto> locationTree = iLocationAppService.getLocationTree(formKey, pageNo, pageSize);
return R.ok(locationTree, MessageUtils.createMessage(PromptMsgConstant.Common.M00009, new Object[] {"机构信息"}));
// 设置排序
queryWrapper.orderByDesc("create_time");
// 执行分页查询并转换为 locationQueryDtoPage
Page<LocationQueryDto> locationQueryDtoPage =
HisPageUtils.selectPage(locationMapper, queryWrapper, pageNo, pageSize, LocationQueryDto.class);
return R.ok(locationQueryDtoPage,
MessageUtils.createMessage(PromptMsgConstant.Common.M00009, new Object[] {"位置信息"}));
}
/**
@@ -88,12 +69,15 @@ public class CabinetLocationController {
// 设置为库房
// LocationQueryDto locationQuery = new LocationQueryDto(LocationForm.CABINET);
Location location = new Location();
locationQueryDto.setFormEnum(LocationForm.CABINET);
BeanUtils.copyProperties(locationQueryDto, location);
// locationQueryDto.setFormEnum(LocationForm.CABINET);
// BeanUtils.copyProperties(locationQueryDto, location);
Location location = new Location(locationQueryDto.getId(), locationQueryDto.getBusNo(),
locationQueryDto.getName(), LocationStatus.ACTIVE.getValue(), LocationBedStatus.U.getValue(),
LocationMode.INSTANCE.getValue(), locationQueryDto.getTypeCode(), locationQueryDto.getTypeJson(),
locationQueryDto.getPyStr(), locationQueryDto.getWbStr(), LocationForm.CABINET.getValue(),
locationQueryDto.getOrganizationId(), locationQueryDto.getDisplayOrder());
boolean saveLocationSuccess = locationService.save(location);
return saveLocationSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00001, new Object[] {"位置信息"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00003, new Object[] {"位置信息"}));
@@ -114,13 +98,18 @@ public class CabinetLocationController {
/**
* 编辑库房位置信息
*
* @param location 库房位置信息
* @param locationQueryDto 库房位置信息
*/
@PutMapping("/cabinet-location")
public R<?> editLocation(@Validated @RequestBody Location location) {
public R<?> editLocation(@Validated @RequestBody LocationQueryDto locationQueryDto) {
Location location = new Location(locationQueryDto.getId(), locationQueryDto.getBusNo(),
locationQueryDto.getName(), LocationStatus.ACTIVE.getValue(), LocationBedStatus.U.getValue(),
LocationMode.INSTANCE.getValue(), locationQueryDto.getTypeCode(), locationQueryDto.getTypeJson(),
locationQueryDto.getPyStr(), locationQueryDto.getWbStr(), LocationForm.CABINET.getValue(),
locationQueryDto.getOrganizationId(), locationQueryDto.getDisplayOrder());
boolean updateLocationSuccess = locationService.updateById(location);
return updateLocationSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"位置信息"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, new Object[] {"位置信息"}));

View File

@@ -3,16 +3,6 @@
*/
package com.openhis.web.basedatamanage.controller;
import java.util.*;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.core.common.core.domain.R;
import com.core.common.utils.AssignSeqUtil;
@@ -22,12 +12,18 @@ import com.openhis.administration.mapper.OrganizationMapper;
import com.openhis.administration.service.IOrganizationService;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.OrganizationType;
import com.openhis.web.basedatamanage.dto.OrgQueryParam;
import com.openhis.web.basedatamanage.appservice.IOrganizationAppService;
import com.openhis.web.basedatamanage.dto.OrganizationInitDto;
import com.openhis.web.basedatamanage.dto.OrganizationQueryDto;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.*;
import java.util.stream.Collectors;
/**
* 机构管理controller
@@ -42,6 +38,7 @@ import lombok.extern.slf4j.Slf4j;
public class OrganizationController {
private final IOrganizationService organizationService;
private final IOrganizationAppService iOrganizationAppService;
@Autowired
private OrganizationMapper organizationMapper;
@@ -63,38 +60,17 @@ public class OrganizationController {
/**
* 机构分页列表
*
* @param orgQueryParam 查询字段
* @param searchKey 模糊查询关键字
* @param pageNo 当前页码
* @param pageNo 当前页码
* @param pageSize 查询条数
* @param request 请求数据
* @return 机构分页列表
*/
@GetMapping(value = "/organization")
public R<?> getOrganizationPage(OrgQueryParam orgQueryParam,
@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest request) {
// // 构建查询条件
// QueryWrapper<Organization> queryWrapper = HisQueryUtils.buildQueryWrapper(orgQueryParam, searchKey,
// new HashSet<>(Arrays.asList("name", "py_str", "wb_str")), request);
//
// // 设置排序
// queryWrapper.orderByDesc("create_time");
// // 执行分页查询并转换为 orgQueryDtoPage
// Page<OrganizationQueryDto> orgQueryDtoPage =
// HisPageUtils.selectPage(organizationMapper, queryWrapper, pageNo, pageSize, OrganizationQueryDto.class);
// 查询机构列表
Page<Organization> page = organizationService.page(new Page<>(pageNo, pageSize));
List<Organization> organizationList = page.getRecords();
// 将机构列表转为树结构
List<OrganizationQueryDto> orgTree = buildTree(organizationList);
Page<OrganizationQueryDto> orgQueryDtoPage = new Page<>(pageNo, pageSize, page.getTotal());
orgQueryDtoPage.setRecords(orgTree);
return R.ok(orgQueryDtoPage,
MessageUtils.createMessage(PromptMsgConstant.Common.M00009, new Object[] {"机构信息"}));
public R<?> getOrganizationPage(
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
Page<OrganizationQueryDto> organizationTree = iOrganizationAppService.getOrganizationTree(pageNo, pageSize);
return R.ok(organizationTree,
MessageUtils.createMessage(PromptMsgConstant.Common.M00009, new Object[]{"机构信息"}));
}
/**
@@ -116,8 +92,8 @@ public class OrganizationController {
boolean saveOrgSuccess = organizationService.save(organization);
return saveOrgSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00001, new Object[] {"机构信息"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00003, new Object[] {"机构信息"}));
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00001, new Object[]{"机构信息"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00003, new Object[]{"机构信息"}));
}
/**
@@ -129,7 +105,7 @@ public class OrganizationController {
public R<?> getOrganizationById(@Validated @RequestParam Long orgId) {
Organization organization = organizationService.getById(orgId);
return R.ok(organization, MessageUtils.createMessage(PromptMsgConstant.Common.M00009, new Object[] {"机构信息"}));
return R.ok(organization, MessageUtils.createMessage(PromptMsgConstant.Common.M00009, new Object[]{"机构信息"}));
}
/**
@@ -145,8 +121,8 @@ public class OrganizationController {
boolean updateOrgSuccess = organizationService.updateById(organization);
return updateOrgSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"机构信息"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, new Object[] {"机构信息"}));
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"机构信息"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, new Object[]{"机构信息"}));
}
/**
@@ -166,8 +142,8 @@ public class OrganizationController {
boolean deleteOrgSuccess = organizationService.removeByIds(orgIdList);
return deleteOrgSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00005, new Object[] {"机构信息"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00006, new Object[] {"机构信息"}));
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00005, new Object[]{"机构信息"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00006, new Object[]{"机构信息"}));
}
/**
@@ -181,8 +157,8 @@ public class OrganizationController {
boolean activeSuccess = organizationService.activeChange(orgId);
return activeSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[] {"启用"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, new Object[] {"启用"}));
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[]{"启用"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, new Object[]{"启用"}));
}
/**
@@ -196,49 +172,9 @@ public class OrganizationController {
boolean inActiveSuccess = organizationService.activeChange(orgId);
return inActiveSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[] {"停用"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, new Object[] {"停用"}));
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[]{"停用"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, new Object[]{"停用"}));
}
/**
* 将机构列表转换为树结构
*
* @param records 机构列表
* @return tree
*/
private List<OrganizationQueryDto> buildTree(List<Organization> records) {
// 按b_no的层级排序确保父节点先处理
List<Organization> sortedRecords = records.stream()
.sorted(Comparator.comparingInt(r -> r.getBusNo().split("\\.").length)).collect(Collectors.toList());
Map<String, OrganizationQueryDto> nodeMap = new HashMap<>();
List<OrganizationQueryDto> tree = new ArrayList<>();
for (Organization record : sortedRecords) {
String bNo = record.getBusNo();
String[] parts = bNo.split("\\.");
OrganizationQueryDto node = new OrganizationQueryDto();
BeanUtils.copyProperties(record, node);
// 将当前节点加入映射
nodeMap.put(bNo, node);
if (parts.length == 1) {
// 根节点
tree.add(node);
} else {
// 获取父节点的b_no去掉最后一部分
String parentBNo = String.join(".", Arrays.copyOf(parts, parts.length - 1));
OrganizationQueryDto parent = nodeMap.get(parentBNo);
if (parent != null) {
parent.getChildren().add(node);
} else {
// 处理父节点不存在的情况(例如数据缺失)
// 可根据需求调整为将节点加入根或抛出异常
}
}
}
return tree;
}
}

View File

@@ -0,0 +1,175 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.basedatamanage.controller;
import java.util.Arrays;
import java.util.HashSet;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.core.common.core.domain.R;
import com.core.common.utils.MessageUtils;
import com.openhis.administration.domain.Practitioner;
import com.openhis.administration.domain.PractitionerRole;
import com.openhis.administration.mapper.PractitionerMapper;
import com.openhis.administration.mapper.PractitionerRoleMapper;
import com.openhis.administration.service.IPractitionerService;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.AccountStatus;
import com.openhis.common.enums.AdministrativeGender;
import com.openhis.common.utils.EnumUtils;
import com.openhis.common.utils.HisPageUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.web.basedatamanage.dto.PractSearchParam;
import com.openhis.web.basedatamanage.dto.PractitionerDto;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* 员工管理Controller业务层处理
*
* @author
* @date 2025-02-21
*/
@RestController
@RequestMapping("/basedatamanage/practitioner")
@Slf4j
@AllArgsConstructor
public class PractitionerController {
private final IPractitionerService practitionerService;
@Autowired
private PractitionerMapper practitionerMapper;
@Autowired
private PractitionerRoleMapper practitionerRoleMapper;
/**
* 员工分页列表
*
* @param practSearchParam 查询条件
* @param pageNo 当前页码
* @param pageSize 查询条数
* @param request 请求数据
* @return 员工分页列表
*/
@GetMapping(value = "/practitioner")
public R<?> getPractitionerPage(PractSearchParam practSearchParam,
@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest request) {
// 构建查询条件
QueryWrapper<Practitioner> queryWrapper = HisQueryUtils.buildQueryWrapper(practSearchParam, searchKey,
new HashSet<>(Arrays.asList("name", "py_str", "wb_str")), request);
// 设置排序
queryWrapper.orderByDesc("name");
// 执行分页查询并转换为 practitionerDtoPage
Page<PractitionerDto> practitionerDtoPage =
HisPageUtils.selectPage(practitionerMapper, queryWrapper, pageNo, pageSize, PractitionerDto.class);
practitionerDtoPage.getRecords().forEach(e -> {
// 性别回显赋值
e.setGenderEnum_enumText(EnumUtils.getInfoByValue(AdministrativeGender.class, e.getGenderEnum()));
});
return R.ok(practitionerDtoPage,
MessageUtils.createMessage(PromptMsgConstant.Common.M00009, new Object[] {"员工信息"}));
}
/**
* 添加员工信息
*
* @param practitionerDto 员工信息
*/
@PostMapping("/practitioner")
public R<?> addPractitioner(@Validated @RequestBody PractitionerDto practitionerDto) {
// 新增practitioner信息
Practitioner practitioner = new Practitioner();
BeanUtils.copyProperties(practitionerDto, practitioner);
practitioner.setActiveFlag(AccountStatus.ACTIVE.getValue());
boolean savePractitionerSuccess = practitionerService.save(practitioner);
PractitionerRole practitionerRole = new PractitionerRole();
practitionerRole.setPractitionerId(practitioner.getId());
practitionerRole.setName(practitioner.getName());
Integer saveProleSuccess = practitionerRoleMapper.insert(practitionerRole);
boolean saveFlag;
if (savePractitionerSuccess && saveProleSuccess == 1) {
saveFlag = true;
} else {
saveFlag = false;
}
return saveFlag ? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00001, new Object[] {"员工信息"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, new Object[] {"员工信息"}));
}
/**
* 获取员工需要编辑的信息
*
* @param practitionerId 员工信息
*/
@GetMapping("/practitioner-getById")
public R<?> getPractitionerById(@Validated @RequestParam Long practitionerId) {
Practitioner practitioner = practitionerService.getById(practitionerId);
if (practitioner != null) {
return R.ok(practitioner,
MessageUtils.createMessage(PromptMsgConstant.Common.M00009, new Object[] {"员工信息"}));
} else {
return R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, new Object[] {"员工信息查新失败"}));
}
}
/**
* 编辑员工信息
*
* @param practitionerDto 员工信息
*/
@PutMapping("/practitioner")
public R<?> editPractitioner(@Validated @RequestBody PractitionerDto practitionerDto) {
// 编辑practitioner信息
Practitioner practitioner = new Practitioner();
BeanUtils.copyProperties(practitionerDto, practitioner);
boolean editPractitionerSuccess = practitionerService.updateById(practitioner);
return editPractitionerSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"员工信息"}))
: R.fail(PromptMsgConstant.Common.M00007, null);
}
/**
* 删除员工信息
*
* @param practitionerId 主表id
*/
@DeleteMapping("/practitioner")
public R<?> deletePractitioner(@RequestParam Long practitionerId) {
boolean delPractitionerSuccess = practitionerService.removeById(practitionerId);
return delPractitionerSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00005, new Object[] {"员工信息"}))
: R.fail(PromptMsgConstant.Common.M00006, null);
}
}

View File

@@ -8,7 +8,6 @@ import java.util.HashSet;
import javax.servlet.http.HttpServletRequest;
import com.openhis.administration.domain.Organization;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
@@ -78,24 +77,24 @@ public class PractitionerRoleController {
}
/**
* 添加岗位信息
*
* @param practitionerRoleDto 岗位信息
*/
@PostMapping("/practitioner-role")
public R<?> addPractitionerRole(@Validated @RequestBody PractitionerRoleDto practitionerRoleDto) {
// 新增practitionerRole信息
PractitionerRole practitionerRole = new PractitionerRole();
BeanUtils.copyProperties(practitionerRoleDto, practitionerRole);
boolean savePractitionerRoleSuccess = practitionerRoleService.save(practitionerRole);
return savePractitionerRoleSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00001, new Object[] {"岗位信息"}))
: R.fail(PromptMsgConstant.Common.M00007, null);
}
// /**
// * 添加岗位信息
// *
// * @param practitionerRoleDto 岗位信息
// */
// @PostMapping("/practitioner-role")
// public R<?> addPractitionerRole(@Validated @RequestBody CreatePractitionerRoleDto practitionerRoleDto) {
//
// // 新增practitionerRole信息
// PractitionerRole practitionerRole = new PractitionerRole();
// BeanUtils.copyProperties(practitionerRoleDto, practitionerRole);
//
// boolean savePractitionerRoleSuccess = practitionerRoleService.save(practitionerRole);
//
// return savePractitionerRoleSuccess
// ? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00001, new Object[] {"岗位信息"}))
// : R.fail(PromptMsgConstant.Common.M00007, null);
// }
/**
* 获取岗位需要编辑的信息
@@ -106,7 +105,8 @@ public class PractitionerRoleController {
public R<?> getPractitionerRoleById(@Validated @RequestParam Long proleId) {
PractitionerRole practitionerRole = practitionerRoleService.getById(proleId);
return R.ok(practitionerRole, MessageUtils.createMessage(PromptMsgConstant.Common.M00009, new Object[] {"岗位信息"}));
return R.ok(practitionerRole,
MessageUtils.createMessage(PromptMsgConstant.Common.M00009, new Object[] {"岗位信息"}));
}
/**
@@ -120,6 +120,15 @@ public class PractitionerRoleController {
// 编辑practitionerRole信息
PractitionerRole practitionerRole = new PractitionerRole();
BeanUtils.copyProperties(practitionerRoleDto, practitionerRole);
if (practitionerRole.getRole_code() == null) {
return R.fail(PromptMsgConstant.Common.M00007, "角色编码不能为空");
}
if (practitionerRole.getOrgId() == null) {
return R.fail(PromptMsgConstant.Common.M00007, "科室不能为空");
}
if (practitionerRole.getLocationId() == null) {
return R.fail(PromptMsgConstant.Common.M00007, "位置不能为空");
}
boolean editPractitionerRoleSuccess = practitionerRoleService.updateById(practitionerRole);

View File

@@ -3,10 +3,15 @@
*/
package com.openhis.web.basedatamanage.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.util.ArrayList;
import java.util.List;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.enums.LocationBedStatus;
import com.openhis.common.enums.LocationForm;
import com.openhis.common.enums.LocationMode;
import com.openhis.common.enums.LocationStatus;
@@ -20,30 +25,41 @@ import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class LocationQueryDto {
/** ID */
@TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/** 编码 */
@NotBlank(message = "位置编码不能为空")
private String busNo;
/** 名称 */
@NotBlank(message = "位置名称不能为空")
private String name;
/** 状态编码 */
private LocationStatus statusEnum;
@NotNull(message = "状态编码不能为空")
// private LocationStatus statusEnum;
private Integer statusEnum;
private String statusEnum_enumText;
/** 操作状态 */
private LocationBedStatus operationalEnum;
@NotNull(message = "操作状态不能为空")
// private LocationBedStatus operationalEnum;
private Integer operationalEnum;
private String operationalEnum_enumText;
/** 模式编码 */
private LocationMode modeEnum;
@NotNull(message = "模式编码不能为空")
// private LocationMode modeEnum;
private Integer modeEnum;
private String modeEnum_enumText;
/** 模式编码 */
private String typeCode;
/** 功能编码 */
@NotBlank(message = "功能编码不能为空")
private String typeJson;
/** 拼音码 */
@@ -53,18 +69,20 @@ public class LocationQueryDto {
private String wbStr;
/** 物理形式枚举 */
private LocationForm formEnum;
@NotNull(message = "物理形式枚举不能为空")
// private LocationForm formEnum;
private Integer formEnum;
private String formEnum_enumText;
/** 机构编码 */
@NotNull(message = "机构编码不能为空")
@JsonSerialize(using = ToStringSerializer.class)
private Long organizationId;
/** 显示顺序 */
private Integer displayOrder;
// public LocationQueryDto(LocationForm form, String busNo, LocationMode mode) {
// public LocationQueryDto(LocationForm form) {
// this.statusEnum = LocationStatus.ACTIVE;
// this.formEnum = form;
// this.modeEnum = mode;
// }
/** 子集合 */
private List<LocationQueryDto> children = new ArrayList<>();
}

View File

@@ -1,33 +0,0 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.basedatamanage.dto;
import java.io.Serializable;
import com.openhis.common.enums.OrganizationClass;
import com.openhis.common.enums.OrganizationType;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 科室分页查询条件
*
* @author
* @date 2025-02-21
*/
@Data
@Accessors(chain = true)
public class OrgQueryParam implements Serializable {
/** 活动标识 */
private Integer activeFlag;
/** 机构类型枚举 */
private OrganizationType typeEnum;
/** 机构分类枚举 */
private OrganizationClass classEnum;
}

View File

@@ -8,6 +8,8 @@ import java.util.List;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.enums.OrganizationClass;
import com.openhis.common.enums.OrganizationType;
@@ -23,7 +25,7 @@ import lombok.experimental.Accessors;
public class OrganizationQueryDto {
/** ID */
@TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/** 编码 */

View File

@@ -18,9 +18,6 @@ import lombok.experimental.Accessors;
@Accessors(chain = true)
public class PractRoleSearchParam implements Serializable {
/** 名称 */
private String name;
/** 专业编码枚举 */
private Integer specialtyEnum;

View File

@@ -5,21 +5,20 @@ package com.openhis.web.basedatamanage.dto;
import java.io.Serializable;
import com.openhis.common.enums.LocationMode;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 科室分页查询条件
* 员工分页查询条件
*
* @author
* @date 2025-02-21
*/
@Data
@Accessors(chain = true)
public class LocationQueryParam implements Serializable {
/** 模式编码 */
private LocationMode modeEnum;
public class PractSearchParam implements Serializable {
/** 活动标记 */
private Integer activeFlag;
}

View File

@@ -0,0 +1,79 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.basedatamanage.dto;
import java.util.Date;
import javax.validation.constraints.NotBlank;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author
* @date 2025-02-21
*/
@Data
@Accessors(chain = true)
public class PractitionerDto {
/** 姓名 */
@NotBlank(message = "姓名不能为空")
private String name;
/** 其他名称 */
private String nameJson;
/** 性别编码 */
// @NotBlank(message = "性别不能为空")
// private AdministrativeGender genderEnum;
private Integer genderEnum;
private String genderEnum_enumText;
/** 生日 */
private Date birthDate;
/** 死亡时间 */
private Date deceasedDate;
/** 电话 */
private String phone;
/** 地址 */
private String address;
/** 地址省 */
private String addressProvince;
/** 地址市 */
private String addressCity;
/** 地址区 */
private String addressDistrict;
/** 地址街道 */
private String addressStreet;
/** 患者其他地址 */
private String addressJson;
/** 拼音码 */
private String pyStr;
/** 五笔码 */
private String wbStr;
/** 患者院内编码/病历号 */
private String busNo;
/** 医保码 */
private String ybNo;
/** 系统用户id */
@JsonSerialize(using = ToStringSerializer.class)
private Long userId;
}

View File

@@ -1,53 +0,0 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.basedatamanage.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author
* @date 2025-02-21
*/
@Data
@Accessors(chain = true)
public class PractitionerRoleDto {
/** ID */
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/** 名称 */
private String name;
/** 角色编码 */
private String role_code;
/** 活动标识 */
private Integer activeFlag;
/** 参与者Id */
private Long practitionerId;
/** 机构 */
private Long orgId;
/** 位置ID */
private Long locationId;
/** 服务id */
private Long healthcareServiceId;
/** 专业编码枚举 */
private Integer specialtyEnum;
/** 岗位类型 */
private String typeCode;
/** 有效时间 */
private String availabilityJson;
}

View File

@@ -1,5 +1,7 @@
package com.openhis.web.basicservice.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.annotation.Dict;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -15,6 +17,7 @@ public class HealthcareServiceDto {
/**
* ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
@@ -27,6 +30,7 @@ public class HealthcareServiceDto {
* 提供部门ID
*/
@Dict(dictTable = "adm_organization",dictCode = "id",dictText = "name")
@JsonSerialize(using = ToStringSerializer.class)
private Long offeredOrgId;
private String offeredOrgId_dictText;
@@ -55,6 +59,7 @@ public class HealthcareServiceDto {
* 地点
*/
@Dict(dictTable = "adm_location",dictCode = "id",dictText = "name")
@JsonSerialize(using = ToStringSerializer.class)
private Long locationId;
private String locationId_dictText;
@@ -84,6 +89,12 @@ public class HealthcareServiceDto {
private Integer appointmentRequiredFlag;
private String appointmentRequiredFlag_enumText;
/**
* 费用定价ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long definitionId;
/**
* 名称
*/

View File

@@ -142,7 +142,7 @@ public class DiseaseManageController {
for (Long detail : ids) {
ConditionDefinition conditionDefinition = new ConditionDefinition();
conditionDefinition.setId(detail);
conditionDefinition.setStatusEnum(PublicationStatus.RETIRED);
conditionDefinition.setStatusEnum(PublicationStatus.RETIRED.getValue());
conditionDefinitionList.add(conditionDefinition);
}
// 更新病种信息
@@ -165,7 +165,7 @@ public class DiseaseManageController {
for (Long detail : ids) {
ConditionDefinition conditionDefinition = new ConditionDefinition();
conditionDefinition.setId(detail);
conditionDefinition.setStatusEnum(PublicationStatus.ACTIVE);
conditionDefinition.setStatusEnum(PublicationStatus.ACTIVE.getValue());
conditionDefinitionList.add(conditionDefinition);
}
// 更新病种信息
@@ -185,7 +185,7 @@ public class DiseaseManageController {
ConditionDefinition conditionDefinition = new ConditionDefinition();
BeanUtils.copyProperties(diseaseManageUpDto, conditionDefinition);
// 新增外来病种目录
conditionDefinition.setStatusEnum(PublicationStatus.DRAFT);
conditionDefinition.setStatusEnum(PublicationStatus.DRAFT.getValue());
return iConditionDefinitionService.addDisease(conditionDefinition)
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00008, null));

View File

@@ -15,6 +15,7 @@ import javax.validation.constraints.NotBlank;
* @author lpt
* @date 2025-02-25
*/
@Data
@Accessors(chain = true)
public class DiseaseManageUpDto {

View File

@@ -0,0 +1,76 @@
package com.openhis.web.outpatientservice.appservice;
import java.util.List;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.core.common.core.domain.R;
import com.openhis.web.basicservice.dto.HealthcareServiceDto;
import com.openhis.web.outpatientservice.dto.*;
/**
* 门诊挂号 应用Service
*/
public interface IOutpatientRegistrationAppService {
/**
* 查询患者信息
*
* @param searchKey 模糊查询关键字
* @param pageNo 当前页
* @param pageSize 每页多少条
* @return 患者信息
*/
Page<PatientMetadata> getPatientMetadataBySearchKey(String searchKey, Integer pageNo, Integer pageSize);
/**
* 查询费用性质
*
* @return 费用性质
*/
List<ContractMetadata> getContractMetadata();
/**
* 查询诊断信息
*
* @param searchKey 模糊查询关键字
* @param pageNo 当前页
* @param pageSize 每页多少条
* @return 诊断信息
*/
Page<ConditionDefinitionMetadata> getConditionDefinitionMetadataSearchKey(String searchKey, Integer pageNo,
Integer pageSize);
/**
* 根据位置id筛选医生
*
* @param locationId 位置ID
* @param searchKey 模糊查询关键字
* @param pageNo 当前页
* @param pageSize 每页多少条
* @return 筛选医生
*/
IPage<PractitionerMetadata> getPractitionerMetadataByLocationId(Long locationId, String searchKey, Integer pageNo,
Integer pageSize);
/**
* 根据机构id筛选服务项目
*
* @param organizationId 机构id
* @param searchKey 模糊查询关键字
* @param pageNo 当前页
* @param pageSize 每页多少条
* @return 服务项目
*/
IPage<HealthcareServiceDto> getHealthcareMetadataByOrganizationId(Long organizationId, String searchKey,
Integer pageNo, Integer pageSize);
/**
* 保存挂号
*
* @param outpatientRegistrationAddParam 就诊表单信息
* @return 结果
*/
R<?> saveRegister(OutpatientRegistrationAddParam outpatientRegistrationAddParam);
}

View File

@@ -0,0 +1,271 @@
package com.openhis.web.outpatientservice.appservice.impl;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import com.openhis.common.enums.*;
import com.openhis.common.enums.PractitionerRole;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.core.common.core.domain.R;
import com.core.common.utils.AgeCalculatorUtil;
import com.core.common.utils.MessageUtils;
import com.core.common.utils.bean.BeanUtils;
import com.openhis.administration.domain.*;
import com.openhis.administration.mapper.PatientMapper;
import com.openhis.administration.service.*;
import com.openhis.clinical.domain.ConditionDefinition;
import com.openhis.clinical.mapper.ConditionDefinitionMapper;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.utils.EnumUtils;
import com.openhis.common.utils.HisPageUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.financial.domain.Contract;
import com.openhis.financial.mapper.ContractMapper;
import com.openhis.web.basicservice.dto.HealthcareServiceDto;
import com.openhis.web.basicservice.mapper.HealthcareServiceBizMapper;
import com.openhis.web.outpatientservice.appservice.IOutpatientRegistrationAppService;
import com.openhis.web.outpatientservice.dto.*;
import com.openhis.web.outpatientservice.mapper.OutpatientRegistrationAppMapper;
/**
* 门诊挂号 应用实现类
*/
@Service
public class IOutpatientRegistrationAppServiceImpl implements IOutpatientRegistrationAppService {
@Resource
PatientMapper patientMapper;
@Resource
ContractMapper contractMapper;
@Resource
ConditionDefinitionMapper conditionDefinitionMapper;
@Resource
OutpatientRegistrationAppMapper outpatientRegistrationAppMapper;
@Resource
HealthcareServiceBizMapper healthcareServiceBizMapper;
@Resource
IEncounterService iEncounterService;
@Resource
IEncounterLocationService iEncounterLocationService;
@Resource
IEncounterParticipantService iEncounterParticipantService;
@Resource
IAccountService iAccountService;
@Resource
IChargeItemService iChargeItemService;
/**
* 门诊挂号 - 查询患者信息
*
* @param searchKey 模糊查询关键字
* @param pageNo 当前页
* @param pageSize 每页多少条
* @return 患者信息
*/
@Override
public Page<PatientMetadata> getPatientMetadataBySearchKey(String searchKey, Integer pageNo, Integer pageSize) {
// 构建查询条件
QueryWrapper<Patient> queryWrapper = HisQueryUtils.buildQueryWrapper(null, searchKey,
new HashSet<>(Arrays.asList("id_card", "name", "py_str", "wb_str")), null);
// 设置排序
queryWrapper.orderByDesc("update_time");
// 患者信息
Page<PatientMetadata> patientMetadataPage =
HisPageUtils.selectPage(patientMapper, queryWrapper, pageNo, pageSize, PatientMetadata.class);
// 现有就诊过的患者id集合
List<Long> patientIdList =
iEncounterService.list().stream().map(e -> e.getPatientId()).collect(Collectors.toList());
patientMetadataPage.getRecords().forEach(e -> {
// 性别枚举
e.setGenderEnum_enumText(EnumUtils.getInfoByValue(AdministrativeGender.class, e.getGenderEnum()));
// 计算年龄
e.setAge(AgeCalculatorUtil.getAge(e.getBirthDate()));
// 初复诊
e.setFirstEnum_enumText(patientIdList.contains(e.getId()) ? EncounterType.FOLLOW_UP.getInfo()
: EncounterType.INITIAL.getInfo());
});
return patientMetadataPage;
}
/**
* 查询费用性质
*
* @return 费用性质
*/
@Override
public List<ContractMetadata> getContractMetadata() {
// TODO: Contract表的基础数据维护还没做,具体不知道状态字段的取值是什么,先查询默认值为0的数据
List<Contract> ContractList =
contractMapper.selectList(new LambdaQueryWrapper<Contract>().eq(Contract::getStatusEnum, 0));
// 复制同名字段并 return
return ContractList.stream().map(contract -> {
ContractMetadata metadata = new ContractMetadata();
try {
BeanUtils.copyProperties(contract, metadata);
} catch (Exception e) {
e.printStackTrace();
}
return metadata;
}).collect(Collectors.toList());
}
/**
* 查询诊断信息
*
* @param searchKey 模糊查询关键字
* @param pageNo 当前页
* @param pageSize 每页多少条
* @return 诊断信息
*/
@Override
public Page<ConditionDefinitionMetadata> getConditionDefinitionMetadataSearchKey(String searchKey, Integer pageNo,
Integer pageSize) {
// 构建查询条件
ConditionDefinition conditionDefinition = new ConditionDefinition();
// 查询状态是有效的
conditionDefinition.setStatusEnum(PublicationStatus.ACTIVE.getValue());
QueryWrapper<ConditionDefinition> queryWrapper = HisQueryUtils.buildQueryWrapper(conditionDefinition, searchKey,
new HashSet<>(Arrays.asList("name", "py_str", "wb_str")), null);
// 设置排序
queryWrapper.orderByDesc("update_time");
// 诊断信息
Page<ConditionDefinitionMetadata> conditionDefinitionMetadataPage = HisPageUtils
.selectPage(conditionDefinitionMapper, queryWrapper, pageNo, pageSize, ConditionDefinitionMetadata.class);
conditionDefinitionMetadataPage.getRecords().forEach(e -> {
// 医保标记
e.setYbFlag_enumText(EnumUtils.getInfoByValue(WhetherContainUnknown.class, e.getYbFlag()));
// 医保对码标记
e.setYbMatchFlag_enumText(EnumUtils.getInfoByValue(WhetherContainUnknown.class, e.getYbMatchFlag()));
});
return conditionDefinitionMetadataPage;
}
/**
* 根据位置id筛选医生
*
* @param locationId 位置ID
* @param searchKey 模糊查询关键字
* @param pageNo 当前页
* @param pageSize 每页多少条
* @return 筛选医生
*/
@Override
public IPage<PractitionerMetadata> getPractitionerMetadataByLocationId(Long locationId, String searchKey,
Integer pageNo, Integer pageSize) {
// 构建查询条件
QueryWrapper<PractitionerMetadata> queryWrapper = HisQueryUtils.buildQueryWrapper(null, searchKey,
new HashSet<>(Arrays.asList("name", "py_str", "wb_str")), null);
IPage<PractitionerMetadata> practitionerMetadataPage =
outpatientRegistrationAppMapper.getPractitionerMetadataPage(new Page<>(pageNo, pageSize), locationId,
PractitionerRole.DOCTOR.getCode(), queryWrapper);
practitionerMetadataPage.getRecords().forEach(e -> {
// 性别
e.setGenderEnum_enumText(EnumUtils.getInfoByValue(AdministrativeGender.class, e.getGenderEnum()));
});
return practitionerMetadataPage;
}
/**
* 根据机构id筛选服务项目
*
* @param organizationId 机构id
* @param searchKey 模糊查询关键字
* @param pageNo 当前页
* @param pageSize 每页多少条
* @return 服务项目
*/
@Override
public IPage<HealthcareServiceDto> getHealthcareMetadataByOrganizationId(Long organizationId, String searchKey,
Integer pageNo, Integer pageSize) {
// 构建查询条件
HealthcareServiceDto healthcareServiceDto = new HealthcareServiceDto();
healthcareServiceDto.setOfferedOrgId(organizationId);
QueryWrapper<HealthcareServiceDto> queryWrapper = HisQueryUtils.buildQueryWrapper(healthcareServiceDto,
searchKey, new HashSet<>(Arrays.asList("name", "charge_name")), null);
return healthcareServiceBizMapper.getHealthcareServicePage(new Page<>(pageNo, pageSize),
CommonConstants.TableName.ADM_HEALTHCARE_SERVICE, queryWrapper);
}
/**
* 保存挂号
*
* @param outpatientRegistrationAddParam 就诊表单信息
* @return 结果
*/
@Override
public R<?> saveRegister(OutpatientRegistrationAddParam outpatientRegistrationAddParam) {
// 就诊管理-表单数据
EncounterFormData encounterFormData = outpatientRegistrationAddParam.getEncounterFormData();
// 就诊位置管理-表单数据
EncounterLocationFormData encounterLocationFormData =
outpatientRegistrationAddParam.getEncounterLocationFormData();
// 就诊参数者管理-表单数据
EncounterParticipantFormData encounterParticipantFormData =
outpatientRegistrationAddParam.getEncounterParticipantFormData();
// 就诊账户管理-表单数据
AccountFormData accountFormData = outpatientRegistrationAddParam.getAccountFormData();
// 费用项管理-表单数据
ChargeItemFormData chargeItemFormData = outpatientRegistrationAddParam.getChargeItemFormData();
// 患者ID
Long patientId = encounterFormData.getPatientId();
// 服务项目ID
Long serviceTypeId = encounterFormData.getServiceTypeId();
// 校验是否重复挂号
Integer num = outpatientRegistrationAppMapper.getNumByPatientIdAndOrganizationId(patientId, serviceTypeId);
if (num > 0) {
return R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00008, null));
}
// 保存就诊信息
Encounter encounter = new Encounter();
BeanUtils.copyProperties(encounterFormData, encounter);
// 就诊ID
Long encounterId = iEncounterService.saveEncounterByRegister(encounter);
// 保存就诊位置信息
encounterLocationFormData.setEncounterId(encounterId);
EncounterLocation encounterLocation = new EncounterLocation();
BeanUtils.copyProperties(encounterLocationFormData, encounterLocation);
iEncounterLocationService.saveEncounterLocationByRegister(encounterLocation);
// 保存就诊参数者信息
encounterParticipantFormData.setEncounterId(encounterId);
EncounterParticipant encounterParticipant = new EncounterParticipant();
BeanUtils.copyProperties(encounterParticipantFormData, encounterParticipant);
iEncounterParticipantService.saveEncounterParticipantByRegister(encounterParticipant);
// 保存就诊账户信息
accountFormData.setEncounterId(encounterId);
Account account = new Account();
BeanUtils.copyProperties(accountFormData, account);
// 账户ID
Long accountId = iAccountService.saveAccountByRegister(account);
// 保存就诊费用项
chargeItemFormData.setEncounterId(encounterId);
chargeItemFormData.setAccountId(accountId);
ChargeItem chargeItem = new ChargeItem();
BeanUtils.copyProperties(chargeItemFormData, chargeItem);
iChargeItemService.saveChargeItemByRegister(chargeItem);
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[] {"挂号"}));
}
}

View File

@@ -3,21 +3,25 @@
*/
package com.openhis.web.outpatientservice.controller;
import com.core.common.core.domain.R;
import com.openhis.common.enums.PriorityLevel;
import com.openhis.web.outpatientservice.controller.appservice.IOutpatientRegistrationService;
import com.openhis.web.outpatientservice.dto.OutpatientRegistrationInitDto;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.springframework.web.bind.annotation.*;
import com.core.common.core.domain.R;
import com.openhis.common.enums.LocationForm;
import com.openhis.common.enums.PriorityLevel;
import com.openhis.web.basedatamanage.appservice.ILocationAppService;
import com.openhis.web.outpatientservice.appservice.IOutpatientRegistrationAppService;
import com.openhis.web.outpatientservice.dto.OutpatientRegistrationAddParam;
import com.openhis.web.outpatientservice.dto.OutpatientRegistrationInitDto;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import javax.validation.Valid;
/**
* 门诊挂号 controller
*/
@@ -27,16 +31,18 @@ import java.util.stream.Stream;
@AllArgsConstructor
public class OutpatientRegistrationController {
private final IOutpatientRegistrationService iOutpatientRegistrationService;
private final IOutpatientRegistrationAppService iOutpatientRegistrationAppService;
private final ILocationAppService iLocationAppService;
/**
* 门诊挂号基础数据初始化
* 基础数据初始化
*/
@GetMapping(value = "/init")
public R<?> init() {
OutpatientRegistrationInitDto outpatientRegistrationInitDto = new OutpatientRegistrationInitDto();
// 优先级
List<OutpatientRegistrationInitDto.priorityLevelOption> priorityLevelOptionOptions = Stream.of(PriorityLevel.values())
List<OutpatientRegistrationInitDto.priorityLevelOption> priorityLevelOptionOptions =
Stream.of(PriorityLevel.values())
.map(e -> new OutpatientRegistrationInitDto.priorityLevelOption(e.getValue(), e.getInfo()))
.collect(Collectors.toList());
outpatientRegistrationInitDto.setPriorityLevelOptionOptions(priorityLevelOptionOptions);
@@ -44,19 +50,88 @@ public class OutpatientRegistrationController {
}
/**
* 门诊挂号 - 查询患者信息
* 查询患者信息
*
* @param searchKey 模糊查询关键字
* @param pageNo 当前页
* @param pageSize 每页多少条
* @param pageNo 当前页
* @param pageSize 每页多少条
* @return 患者信息
*/
@GetMapping(value = "/patient-metadata")
public R<?> getPatientMetadata(@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return R.ok(iOutpatientRegistrationService.getPatientMetadataBySearchKey(searchKey, pageNo, pageSize));
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return R.ok(iOutpatientRegistrationAppService.getPatientMetadataBySearchKey(searchKey, pageNo, pageSize));
}
/**
* 查询费用性质
*
* @return 费用性质
*/
@GetMapping(value = "/contract-list")
public R<?> getContractList() {
return R.ok(iOutpatientRegistrationAppService.getContractMetadata());
}
/**
* 查询诊断信息
*/
@GetMapping(value = "/condition-definition-metadata")
public R<?> getConditionDefinitionMetadata(@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return R
.ok(iOutpatientRegistrationAppService.getConditionDefinitionMetadataSearchKey(searchKey, pageNo, pageSize));
}
/**
* 查询就诊位置
*
* @param pageNo 当前页码
* @param pageSize 查询条数
* @return 位置分页列表
*/
@GetMapping(value = "/location-tree")
public R<?> getLocationTree(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return R.ok(iLocationAppService.getLocationTree(LocationForm.ROOM.getValue(), pageNo, pageSize));
}
/**
* 根据位置id筛选医生
*/
@GetMapping(value = "/practitioner-metadata")
public R<?> getPractitionerMetadata(@RequestParam(value = "locationId") Long locationId,
@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return R.ok(iOutpatientRegistrationAppService.getPractitionerMetadataByLocationId(locationId, searchKey, pageNo,
pageSize));
}
/**
* 根据机构id筛选服务项目
*/
@GetMapping(value = "/healthcare-metadata")
public R<?> getHealthcareMetadata(@RequestParam(value = "organizationId") Long organizationId,
@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return R.ok(iOutpatientRegistrationAppService.getHealthcareMetadataByOrganizationId(organizationId, searchKey,
pageNo, pageSize));
}
/**
* 保存挂号
*
* @param outpatientRegistrationAddParam 就诊表单信息
* @return 结果
*/
@PostMapping(value = "/save")
public R<?> saveRegister(@Valid @RequestBody OutpatientRegistrationAddParam outpatientRegistrationAddParam) {
return iOutpatientRegistrationAppService.saveRegister(outpatientRegistrationAddParam);
}
}

View File

@@ -1,21 +0,0 @@
package com.openhis.web.outpatientservice.controller.appservice;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.openhis.web.outpatientservice.dto.PatientMetadata;
/**
* 门诊挂号 Service
*/
public interface IOutpatientRegistrationService {
/**
* 门诊挂号 - 查询患者信息
*
* @param searchKey 模糊查询关键字
* @param pageNo 当前页
* @param pageSize 每页多少条
* @return 患者信息
*/
Page<PatientMetadata> getPatientMetadataBySearchKey(String searchKey, Integer pageNo, Integer pageSize);
}

View File

@@ -1,56 +0,0 @@
package com.openhis.web.outpatientservice.controller.appservice.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.openhis.administration.domain.Patient;
import com.openhis.administration.mapper.PatientMapper;
import com.openhis.common.enums.AdministrativeGender;
import com.openhis.common.utils.EnumUtils;
import com.openhis.common.utils.HisPageUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.web.outpatientservice.controller.appservice.IOutpatientRegistrationService;
import com.openhis.web.outpatientservice.dto.PatientMetadata;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.HashSet;
/**
* 门诊挂号 实现类
*/
@Service
public class IOutpatientRegistrationServiceImpl implements IOutpatientRegistrationService {
@Resource
PatientMapper patientMapper;
/**
* 门诊挂号 - 查询患者信息
*
* @param searchKey 模糊查询关键字
* @param pageNo 当前页
* @param pageSize 每页多少条
* @return 患者信息
*/
@Override
public Page<PatientMetadata> getPatientMetadataBySearchKey(String searchKey, Integer pageNo, Integer pageSize) {
// 构建查询条件
QueryWrapper<Patient> queryWrapper = HisQueryUtils.buildQueryWrapper(null,
searchKey, new HashSet<>(Arrays.asList("name", "py_str", "wb_str")), null
);
// 设置排序
queryWrapper.orderByDesc("update_time");
// 患者信息
Page<PatientMetadata> patientMetadataPage = HisPageUtils.selectPage(patientMapper,
queryWrapper, pageNo, pageSize, PatientMetadata.class);
patientMetadataPage.getRecords().forEach(e -> {
// 性别枚举
e.setGenderEnum_enumText(EnumUtils.getInfoByValue(AdministrativeGender.class, e.getGenderEnum()));
});
return patientMetadataPage;
}
}

View File

@@ -0,0 +1,62 @@
package com.openhis.web.outpatientservice.dto;
import java.math.BigDecimal;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.enums.AccountBillingStatus;
import com.openhis.common.enums.AccountStatus;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 就诊账号 表单数据
*/
@Data
@Accessors(chain = true)
public class AccountFormData {
/**
* 就诊ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
/** 患者id */
@JsonSerialize(using = ToStringSerializer.class)
private Long patientId;
/** 状态枚举 */
private Integer statusEnum;
/** 结账状态枚举 */
private Integer billingStatusEnum;
/** 账户类型编码 */
private String typeCode; // 1:个人现金账户, 2:医保账户
/** 名称 */
private String name; // 刷医保卡时应该会带出该信息
/** 账户余额 */
private BigDecimal balanceAmount; // 刷医保卡时应该会带出该信息
/** 医保区域编码 */
private String ybAreaNo; // 刷医保卡时应该会带出该信息
/** 合同编码 */
private String contractNo; // 从选择的费用性质里选择合同编码
/** 欠费限制额度 */
private BigDecimal limitAccount; // 刷医保卡时应该会带出该信息
/**
* 设置默认值
*/
public AccountFormData() {
this.statusEnum = AccountStatus.ACTIVE.getValue();
this.billingStatusEnum = AccountBillingStatus.OPEN.getValue();
}
}

View File

@@ -0,0 +1,87 @@
package com.openhis.web.outpatientservice.dto;
import java.math.BigDecimal;
import java.util.Date;
import com.core.common.utils.SecurityUtils;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.enums.ChargeItemStatus;
import com.openhis.common.enums.EncounterClass;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 费用项管理 表单数据
*/
@Data
@Accessors(chain = true)
public class ChargeItemFormData {
/**
* 就诊ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
/** 患者id */
@JsonSerialize(using = ToStringSerializer.class)
private Long patientId;
/** 层级 */
private String busNo;
/** 状态 */
private Integer statusEnum;
/** 类别 */
private Integer contextEnum;
/** 发生时间 */
private Date occurrenceTime;
/** 执行人Id */
@JsonSerialize(using = ToStringSerializer.class)
private Long performerId;
/** 费用定价ID */
@JsonSerialize(using = ToStringSerializer.class)
private Long definitionId;
/** 开立人ID */
@JsonSerialize(using = ToStringSerializer.class)
private Long entererId;
/** 开立时间 */
private Date enteredDate;
/** 医疗服务类型 */
private String serviceTable;
/** 医疗服务ID */
@JsonSerialize(using = ToStringSerializer.class)
private Long serviceId;
/** 总价 */
private BigDecimal totalPrice;
/** 关联账户ID */
@JsonSerialize(using = ToStringSerializer.class)
private Long accountId;
/**
* 设置默认值
*/
public ChargeItemFormData() {
this.statusEnum = ChargeItemStatus.BILLED.getValue();
this.contextEnum = EncounterClass.AMB.getValue();
this.occurrenceTime = new Date();
this.performerId = SecurityUtils.getLoginUser().getUserId();
this.entererId = SecurityUtils.getLoginUser().getUserId();
this.enteredDate = new Date();
this.serviceTable = CommonConstants.TableName.ADM_HEALTHCARE_SERVICE;
}
}

View File

@@ -0,0 +1,37 @@
package com.openhis.web.outpatientservice.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 诊断 元数据
*/
@Data
@Accessors(chain = true)
public class ConditionDefinitionMetadata {
/** ID */
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/** 编码 */
private String conditionCode;
/** 诊断名称 */
private String name;
/** 医保标记 */
private Integer ybFlag;
private String ybFlag_enumText;
/** 医保编码 */
private String ybNo;
/** 医保对码标记 */
private Integer ybMatchFlag;
private String ybMatchFlag_enumText;
}

View File

@@ -0,0 +1,16 @@
package com.openhis.web.outpatientservice.dto;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 费用性质 元数据
*/
@Data
@Accessors(chain = true)
public class ContractMetadata {
/** 合同名称 */
private String contractName;
/** 合同编码 */
private String busNo;
}

View File

@@ -0,0 +1,32 @@
package com.openhis.web.outpatientservice.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 就诊诊断 表单数据
*/
@Data
@Accessors(chain = true)
public class EncounterDiagnosisFormData {
/**
* 就诊ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
/**
* 诊断ID
*/
@NotBlank(message = "诊断ID不能为空")
@JsonSerialize(using = ToStringSerializer.class)
private Long conditionId;
}

View File

@@ -0,0 +1,83 @@
package com.openhis.web.outpatientservice.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.enums.*;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 就诊 表单数据
*/
@Data
@Accessors(chain = true)
public class EncounterFormData {
/**
* 患者ID
*/
@NotBlank(message = "患者ID不能为空")
@JsonSerialize(using = ToStringSerializer.class)
private Long patientId;
/**
* 状态编码
*/
private Integer statusEnum;
/**
* 类别编码
*/
private Integer classEnum;
/**
* 类别医保编码
*/
private Integer ybClassEnum;
/**
* 优先级编码
*/
@NotBlank(message = "优先级编码不能为空")
private Integer priorityEnum;
/**
* 分类编码
*/
private Integer typeEnum;
/**
* 服务ID
*/
@NotBlank(message = "服务ID不能为空")
@JsonSerialize(using = ToStringSerializer.class)
private Long serviceTypeId;
/**
* 就诊对象状态
*/
private Integer subjectStatusEnum;
/**
* 机构ID
*/
@NotBlank(message = "机构ID不能为空")
@JsonSerialize(using = ToStringSerializer.class)
private Long organizationId;
/**
* 设置默认值
*/
public EncounterFormData() {
this.statusEnum = EncounterStatus.PLANNED.getValue();
this.classEnum = EncounterClass.AMB.getValue();
this.ybClassEnum = EncounterYbClass.ORDINARY_OUTPATIENT.getValue();
this.typeEnum = OutpatientClass.GENERAL_OUTPATIENT_SERVICE.getValue();
this.subjectStatusEnum = EncounterSubjectStatus.TRIAGED.getValue();
}
}

View File

@@ -0,0 +1,48 @@
package com.openhis.web.outpatientservice.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.enums.EncounterLocationStatus;
import com.openhis.common.enums.LocationForm;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 就诊位置 表单数据
*/
@Data
@Accessors(chain = true)
public class EncounterLocationFormData {
/**
* 就诊ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
/**
* 位置ID
*/
@NotBlank(message = "位置ID不能为空")
@JsonSerialize(using = ToStringSerializer.class)
private Long locationId;
/** 状态枚举 */
private Integer statusEnum;
/** 物理形式枚举 */
private Integer formEnum;
/**
* 设置默认值
*/
public EncounterLocationFormData() {
this.statusEnum = EncounterLocationStatus.PLANNED.getValue();
this.formEnum = LocationForm.ROOM.getValue();
}
}

View File

@@ -0,0 +1,41 @@
package com.openhis.web.outpatientservice.dto;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.enums.ParticipantType;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 就诊参数者 表单数据
*/
@Data
@Accessors(chain = true)
public class EncounterParticipantFormData {
/**
* 就诊ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
/** 参与者类型 */
private String typeCode;
/** 参与者ID */
@NotBlank(message = "参与者ID不能为空")
@JsonSerialize(using = ToStringSerializer.class)
private Long practitionerId;
/**
* 设置默认值
*/
public EncounterParticipantFormData() {
this.typeCode = ParticipantType.ADMITTER.getCode();
}
}

View File

@@ -4,19 +4,39 @@ import lombok.Data;
import lombok.experimental.Accessors;
/**
* 门诊挂号 新增数
* 门诊挂号 新增
*/
@Data
@Accessors(chain = true)
public class OutpatientRegistrationAddParam {
// 就诊管理-表单数据
/**
* 就诊管理-表单数据
*/
private EncounterFormData encounterFormData;
// 就诊诊断管理-表单数据
// /**
// * 就诊诊断管理-表单数据
// */
// private EncounterDiagnosisFormData encounterDiagnosisFormData;
// 就诊位置管理-表单数据
/**
* 就诊位置管理-表单数据
*/
private EncounterLocationFormData encounterLocationFormData;
// 就诊参数者管理-表单数据
/**
* 就诊参数者管理-表单数据
*/
private EncounterParticipantFormData encounterParticipantFormData;
/**
* 就诊账户管理-表单数据
*/
private AccountFormData accountFormData;
/**
* 费用项管理-表单数据
*/
private ChargeItemFormData chargeItemFormData;
}

View File

@@ -1,8 +1,12 @@
package com.openhis.web.outpatientservice.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* 患者信息 元数据
*/
@@ -12,6 +16,7 @@ public class PatientMetadata {
/**
* ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
@@ -25,4 +30,30 @@ public class PatientMetadata {
private Integer genderEnum;
private String genderEnum_enumText;
/**
* 身份证号
*/
private String idCard;
/**
* 电话
*/
private String phone;
/**
* 生日
*/
private Date birthDate;
/**
* 年龄
*/
private String age;
/**
* 初复诊
*/
private String firstEnum_enumText;
}

View File

@@ -0,0 +1,36 @@
package com.openhis.web.outpatientservice.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 参与者 元数据
*/
@Data
@Accessors(chain = true)
public class PractitionerMetadata {
/**
* ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/** 姓名 */
private String name;
/**
* 性别编码
*/
private Integer genderEnum;
private String genderEnum_enumText;
/** 拼音码 */
private String pyStr;
/** 五笔码 */
private String wbStr;
}

View File

@@ -0,0 +1,30 @@
package com.openhis.web.outpatientservice.mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.openhis.web.outpatientservice.dto.PractitionerMetadata;
/**
* 门诊挂号 应用Mapper
*/
@Repository
public interface OutpatientRegistrationAppMapper {
/**
* 查询医生
*/
IPage<PractitionerMetadata> getPractitionerMetadataPage(@Param("page") Page<PractitionerMetadata> page,
@Param("locationId") Long locationId, @Param("RoleCode") String RoleCode,
@Param(Constants.WRAPPER) QueryWrapper<PractitionerMetadata> queryWrapper);
/**
* 根据病人id和科室id查询当日挂号次数
*/
Integer getNumByPatientIdAndOrganizationId(@Param("patientId") Long patientId,
@Param("serviceTypeId") Long serviceTypeId);
}

View File

@@ -52,7 +52,7 @@ public class OutpatientRecordController {
* @param pageSize 每页大小默认为10
*/
@GetMapping("/outpatient-record-page")
public R<?> getPatient(@RequestParam(required = false) OutpatientRecordSearchParam outpatientRecordSearchParam,
public R<?> getPatient(OutpatientRecordSearchParam outpatientRecordSearchParam,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {

View File

@@ -25,9 +25,9 @@ public class OutpatientRecordSearchParam {
private String doctorName;
/** 筛选开始时间 */
private Date beginTime;
private String beginTime;
/** 筛选结束时间 */
private Date endTime;
private String endTime;
}

View File

@@ -19,6 +19,7 @@
T3.extra_details,
T3.contact,
T3.appointment_required_flag,
T3.definition_id,
T3.charge_name,
T3.price
FROM
@@ -37,12 +38,14 @@
T1.extra_details,
T1.contact,
T1.appointment_required_flag,
T2.id AS definition_id,
T2.charge_name,
T2.price
FROM
adm_healthcare_service AS T1
LEFT JOIN adm_charge_item_definition AS T2 ON T2.instance_id = T1.ID
AND T2.instance_table = #{tableName}
WHERE T1.delete_flag = '0'
ORDER BY
T1.create_time DESC
) AS T3

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.openhis.web.outpatientservice.mapper.OutpatientRegistrationAppMapper">
<select id="getPractitionerMetadataPage" resultType="com.openhis.web.outpatientservice.dto.PractitionerMetadata">
SELECT T3.tenant_id,
T3.ID,
T3.NAME,
T3.gender_enum,
T3.py_str,
T3.wb_str
FROM (
SELECT T1.tenant_id,
T1.ID,
T1.NAME,
T1.gender_enum,
T1.py_str,
T1.wb_str
FROM adm_practitioner AS T1
WHERE T1.delete_flag = '0'
AND EXISTS(SELECT 1
FROM adm_practitioner_role AS T2
WHERE T2.practitioner_id = T1.ID
AND T2.location_id = #{locationId}
AND T2.ROLE_code = #{RoleCode})
) AS T3
${ew.customSqlSegment}
</select>
<select id="getNumByPatientIdAndOrganizationId" resultType="Integer">
SELECT COUNT
(1)
FROM adm_encounter
WHERE delete_flag = '0'
AND patient_id = #{patientId}
AND service_type_id = #{serviceTypeId}
AND create_time > CURRENT_DATE
</select>
</mapper>

View File

@@ -139,13 +139,14 @@
<!-- 如果传入phone参数且不为空 -->
<if test="OutpatientRecordSearchParam != null and OutpatientRecordSearchParam.phone != null and OutpatientRecordSearchParam.phone != ''">
AND pt.phone LIKE CONCAT('%',#{phone}, '%')
AND pt.phone LIKE CONCAT('%',#{OutpatientRecordSearchParam.phone}, '%')
</if>
<!-- 时间筛选 -->
<if test="OutpatientRecordSearchParam != null and OutpatientRecordSearchParam.startTime != null and OutpatientRecordSearchParam.endTime != null">
AND e.start_time BETWEEN #{OutpatientRecordSearchParam.startTime} AND
#{OutpatientRecordSearchParam.endTime}
<if test="OutpatientRecordSearchParam != null and OutpatientRecordSearchParam.beginTime != null and OutpatientRecordSearchParam.endTime != null">
AND e.start_time BETWEEN
TO_TIMESTAMP(#{OutpatientRecordSearchParam.beginTime} || ' 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND
TO_TIMESTAMP(#{OutpatientRecordSearchParam.endTime} || ' 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
</if>
<!-- 如果传入doctorName参数且不为空 -->
@@ -184,13 +185,14 @@
<!-- 如果传入phone参数且不为空 -->
<if test="OutpatientRecordSearchParam != null and OutpatientRecordSearchParam.phone != null and OutpatientRecordSearchParam.phone != ''">
AND pt.phone LIKE CONCAT('%',#{phone}, '%')
AND pt.phone LIKE CONCAT('%',#{OutpatientRecordSearchParam.phone}, '%')
</if>
<!-- 时间筛选 -->
<if test="OutpatientRecordSearchParam != null and OutpatientRecordSearchParam.startTime != null and OutpatientRecordSearchParam.endTime != null">
AND e.start_time BETWEEN #{OutpatientRecordSearchParam.startTime} AND
#{OutpatientRecordSearchParam.endTime}
<if test="OutpatientRecordSearchParam != null and OutpatientRecordSearchParam.beginTime != null and OutpatientRecordSearchParam.endTime != null">
AND e.start_time BETWEEN
TO_TIMESTAMP(#{OutpatientRecordSearchParam.beginTime} || ' 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND
TO_TIMESTAMP(#{OutpatientRecordSearchParam.endTime} || ' 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
</if>
<!-- 如果传入doctorName参数且不为空 -->

View File

@@ -6,7 +6,7 @@ import lombok.Getter;
@Getter
@AllArgsConstructor
public enum AccountBillingStatus {
public enum AccountBillingStatus implements HisEnumInterface {
OPEN (1, "open", "可用"),

View File

@@ -6,7 +6,7 @@ import lombok.Getter;
@Getter
@AllArgsConstructor
public enum ChargeItemStatus {
public enum ChargeItemStatus implements HisEnumInterface {
PLANNED (1, "planned", "待收费"),
BILLABLE(2, "billable", "待结算"),

View File

@@ -0,0 +1,25 @@
package com.openhis.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 过敏与不耐受中临床状况
*
* @author liuhr
* @date 2025/3/6
*/
@Getter
@AllArgsConstructor
public enum ClinicalStatus implements HisEnumInterface {
ACTIVE(1, "active", "阳性"),
INACTIVE(2, "inactive", "阴性"),
RESOLVED(3, "resolved", "已解决");
@EnumValue
private final Integer value;
private final String code;
private final String info;
}

View File

@@ -1,12 +1,13 @@
package com.openhis.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum EncounterLocationStatus {
public enum EncounterLocationStatus implements HisEnumInterface {
PLANNED(1, "planned", "已安排"),
ACTIVE(2, "active", "使用中"),

View File

@@ -6,7 +6,7 @@ import lombok.Getter;
@Getter
@AllArgsConstructor
public enum EncounterType {
public enum EncounterType implements HisEnumInterface {
INITIAL(1, "initial", "初诊"),
FOLLOW_UP(2, "follow-up", "复诊");

View File

@@ -5,5 +5,6 @@ package com.openhis.common.enums;
*/
public interface HisEnumInterface {
Integer getValue();
String getCode();
String getInfo();
}

View File

@@ -1,18 +1,20 @@
package com.openhis.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum LocationBedStatus {
C (1, "C", "关闭"),
H (2, "H", "整理"),
O (3, "O", "占用"),
U (4, "U", "空闲"),
K (5, "K", "污染"),
I (6, "I", "隔离");
public enum LocationBedStatus implements HisEnumInterface {
C(1, "C", "关闭"),
H(2, "H", "整理"),
O(3, "O", "占用"),
U(4, "U", "空闲"),
K(5, "K", "污染"),
I(6, "I", "隔离");
@EnumValue
private final Integer value;
private final String code;

View File

@@ -1,35 +1,39 @@
package com.openhis.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum LocationForm {
public enum LocationForm implements HisEnumInterface {
SITE(1, "si", "集合点A collection of buildings or other locations such as a site or a campus."),
BUILDING(2, "bu", "建筑Any Building or structure. This may contain rooms, corridors, wings, etc. It might not have walls, or a roof, but is considered a defined/allocated space."),
BUILDING(2, "bu",
"建筑Any Building or structure. This may contain rooms, corridors, wings, etc. It might not have walls, or a roof, but is considered a defined/allocated space."),
WING(3, "wi", "连廊A Wing within a Building, this often contains levels, rooms and corridors."),
WARD(4, "wa", "病区A Ward is a section of a medical facility that may contain rooms and other types of location."),
LEVEL(5, "lvl", "楼层A Level in a multi-level Building/Structure."),
CORRIDOR(6, "co", "走廊Any corridor within a Building, that may connect rooms."),
ROOM(7, "ro", "诊室A space that is allocated as a room, it may have walls/roof etc., but does not require these."),
BED(8, "bd", "床A space that is allocated for sleeping/laying on. This is not the physical bed/trolley that may be moved about, but the space it may occupy."),
BED(8, "bd",
"床A space that is allocated for sleeping/laying on. This is not the physical bed/trolley that may be moved about, but the space it may occupy."),
VEHICLE(9, "ve", "运输工具A means of transportation."),
HOUSE(10, "ho", "病房A residential dwelling. Usually used to reference a location that a person/patient may reside."),
CABINET(11, "ca", "库房A container that can store goods, equipment, medications or other items."),
ROAD(12, "rd", "路A defined path to travel between 2 points that has a known name."),
AREA(13, "area", "区域A defined physical boundary of something, such as a flood risk zone, region, postcode"),
JURISDICTION(14, "jdn", "适用范围A wide scope that covers a conceptual domain, such as a Nation (Country wide community or Federal Government - e.g. Ministry of Health), Province or State (community or Government), Business (throughout the enterprise), Nation with a business scope of an agency (e.g. CDC, FDA etc.) or a Business segment (UK Pharmacy), not just an physical boundary"),
JURISDICTION(14, "jdn",
"适用范围A wide scope that covers a conceptual domain, such as a Nation (Country wide community or Federal Government - e.g. Ministry of Health), Province or State (community or Government), Business (throughout the enterprise), Nation with a business scope of an agency (e.g. CDC, FDA etc.) or a Business segment (UK Pharmacy), not just an physical boundary"),
VIRTUAL(15, "vi", "虚拟A location that is virtual in nature, such as a conference call or virtual meeting space");
// PHARMACY(16, "ph", "药房"),
// PHARMACY_WINDOW(17, "phw", "发药窗口"),
// PHARMACY_TABLE(18, "dt", "摆药台"),
// NURSE_STATION(19, "ns", "护士站"),
// PERSON_STORE(20, "ps", "个人储物柜"),
// DOCTOR_TABLE(21, "dt", "医生诊台");
// PHARMACY(16, "ph", "药房"),
// PHARMACY_WINDOW(17, "phw", "发药窗口"),
// PHARMACY_TABLE(18, "dt", "摆药台"),
// NURSE_STATION(19, "ns", "护士站"),
// PERSON_STORE(20, "ps", "个人储物柜"),
// DOCTOR_TABLE(21, "dt", "医生诊台");
@EnumValue
private final Integer value;
private final String code;

View File

@@ -1,13 +1,14 @@
package com.openhis.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum LocationMode {
INSTANCE (1, "instance", "具体"),
public enum LocationMode implements HisEnumInterface {
INSTANCE(1, "instance", "具体"),
KIND(2, "Kind", "种类");

View File

@@ -1,17 +1,19 @@
package com.openhis.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum LocationStatus {
ACTIVE (1, "active", "有效"),
public enum LocationStatus implements HisEnumInterface {
ACTIVE(1, "active", "有效"),
INACTIVE(2, "inactive", "无效"),
SUSPENDED(3, "suspended", "临时关闭");
@EnumValue
private final Integer value;
private final String code;

View File

@@ -0,0 +1,34 @@
package com.openhis.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 参与者类型
*/
@Getter
@AllArgsConstructor
public enum ParticipantType implements HisEnumInterface {
ADMITTER(1, "1", "首诊医生"),
ATTENDER(2, "2", "责任护士"),
CONTACT(3, "3", "联系人"),
CONSULTANT(4, "4", "顾问"),
DISCHARGER(5, "5", "出院办理人"),
ESCORT(6, "6", "护送人"),
REFERRER(7, "7", "推荐人"),
EMERGENCY(8, "8", "紧急联系人");
@EnumValue
private final Integer value;
private final String code;
private final String info;
}

View File

@@ -0,0 +1,24 @@
package com.openhis.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 参与者角色
*/
@Getter
@AllArgsConstructor
public enum PractitionerRole implements HisEnumInterface {
DOCTOR(1, "doctor", "医生"),
NURSE(2, "nurse", "护士"),
PHARMACIST(3, "pharmacist", "药师");
@EnumValue
private final Integer value;
private final String code;
private final String info;
}

View File

@@ -1,13 +1,13 @@
package com.openhis.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum PublicationStatus {
public enum PublicationStatus implements HisEnumInterface {
DRAFT(1, "draft", "草稿"),

View File

@@ -0,0 +1,25 @@
package com.openhis.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 过敏与不耐受中验证状态
*
* @author liuhr
* @date 2025/3/6
*/
@Getter
@AllArgsConstructor
public enum VerificationStatus implements HisEnumInterface {
UNCONFIRMED(1, "unconfirmed", "未确认"),
CONFIRMED(2, "confirmed", "已确认"),
REFUTED(3, "refuted", "已反驳"),
ENTERED_IN_ERROR(4, "entered-in-error", "输入错误");
@EnumValue
private final Integer value;
private final String code;
private final String info;
}

View File

@@ -30,7 +30,7 @@ public class ChargeItem extends HisBaseEntity {
private Long id;
/** 状态 */
private ChargeItemStatus statusEnum;
private Integer statusEnum;
/** 层级 */
private String busNo;

View File

@@ -105,4 +105,9 @@ public class Encounter extends HisBaseEntity {
*/
private Integer displayOrder;
/**
* 初复诊
*/
private Integer firstEnum;
}

View File

@@ -1,14 +1,12 @@
package com.openhis.administration.domain;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.core.common.core.domain.HisBaseEntity;
import com.openhis.common.enums.EncounterLocationStatus;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@@ -36,7 +34,7 @@ public class EncounterLocation extends HisBaseEntity {
private Long locationId;
/** 状态枚举 */
private EncounterLocationStatus statusEnum;
private Integer statusEnum;
/** 物理形式枚举 */
private Integer formEnum;
@@ -47,5 +45,4 @@ public class EncounterLocation extends HisBaseEntity {
/** 结束时间 */
private Date endTime;
}

View File

@@ -1,17 +1,13 @@
package com.openhis.administration.domain;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.core.common.core.domain.HisBaseEntity;
import com.openhis.common.enums.LocationBedStatus;
import com.openhis.common.enums.LocationForm;
import com.openhis.common.enums.LocationMode;
import com.openhis.common.enums.LocationStatus;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@@ -39,13 +35,16 @@ public class Location extends HisBaseEntity {
private String name;
/** 状态编码 */
private LocationStatus statusEnum;
// private LocationStatus statusEnum;
private Integer statusEnum;
/** 操作状态 */
private LocationBedStatus operationalEnum;
// private LocationBedStatus operationalEnum;
private Integer operationalEnum;
/** 模式编码 */
private LocationMode modeEnum;
// private LocationMode modeEnum;
private Integer modeEnum;
/** 模式编码 */
private String typeCode;
@@ -60,7 +59,8 @@ public class Location extends HisBaseEntity {
private String wbStr;
/** 物理形式枚举 */
private LocationForm formEnum;
// private LocationForm formEnum;
private Integer formEnum;
/** 机构编码 */
private Long organizationId;
@@ -68,5 +68,22 @@ public class Location extends HisBaseEntity {
/** 显示顺序 */
private Integer displayOrder;
public Location(Long id, String busNo, String name, Integer statusEnum, Integer operationalEnum,
Integer modeEnum, String typeCode, String typeJson, String pyStr, String wbStr, Integer formEnum,
Long organizationId, Integer displayOrder) {
this.id = id;
this.busNo = busNo;
this.name = name;
this.statusEnum = statusEnum;
this.operationalEnum = operationalEnum;
this.modeEnum = modeEnum;
this.typeCode = typeCode;
this.typeJson = typeJson;
this.pyStr = pyStr;
this.wbStr = wbStr;
this.formEnum = formEnum;
this.organizationId = organizationId;
this.displayOrder = displayOrder;
}
}

View File

@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.core.common.core.domain.HisBaseEntity;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@@ -25,6 +27,7 @@ public class Patient extends HisBaseEntity {
/** ID */
@TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/** 活动标记 */

View File

@@ -39,7 +39,7 @@ public class Practitioner extends HisBaseEntity {
private String nameJson;
/** 性别编码 */
private AdministrativeGender genderEnum;
private Integer genderEnum;
/** 生日 */
private Date birthDate;

View File

@@ -1,13 +1,10 @@
package com.openhis.administration.domain;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.core.common.core.domain.HisBaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@@ -58,5 +55,4 @@ public class PractitionerRole extends HisBaseEntity {
/** 有效时间 */
private String availabilityJson;
}

View File

@@ -11,4 +11,11 @@ import com.openhis.administration.domain.Account;
*/
public interface IAccountService extends IService<Account> {
/**
* 门诊挂号时保存账号信息
*
* @param account 账号信息
*/
Long saveAccountByRegister(Account account);
}

View File

@@ -1,11 +1,9 @@
package com.openhis.administration.service;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.openhis.administration.domain.ChargeItem;
import com.openhis.workflow.domain.SupplyRequest;
/**
* 费用项管理Service接口
@@ -21,4 +19,11 @@ public interface IChargeItemService extends IService<ChargeItem> {
* @param chargeItemList 采购账单
*/
void createBilledPurchaseCharge(List<ChargeItem> chargeItemList);
/**
* 门诊挂号时保存 费用项
*
* @param chargeItem 费用项
*/
void saveChargeItemByRegister(ChargeItem chargeItem);
}

View File

@@ -11,4 +11,11 @@ import com.openhis.administration.domain.EncounterLocation;
*/
public interface IEncounterLocationService extends IService<EncounterLocation> {
/**
* 门诊挂号时保存就诊位置信息
*
* @param encounterLocation 就诊位置信息
*/
void saveEncounterLocationByRegister(EncounterLocation encounterLocation);
}

View File

@@ -11,4 +11,11 @@ import com.openhis.administration.domain.EncounterParticipant;
*/
public interface IEncounterParticipantService extends IService<EncounterParticipant> {
/**
* 门诊挂号时保存就诊参与者
*
* @param encounterParticipant 就诊参与者信息
*/
void saveEncounterParticipantByRegister(EncounterParticipant encounterParticipant);
}

View File

@@ -10,5 +10,12 @@ import com.openhis.administration.domain.Encounter;
* @date 2025-02-20
*/
public interface IEncounterService extends IService<Encounter> {
/**
* 保存就诊信息
*
* @param encounter 就诊信息
* @return 保存后的信息
*/
Long saveEncounterByRegister(Encounter encounter);
}

Some files were not shown because too many files have changed in this diff Show More