# 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> <script>
export default { export default {
onLaunch: function() { onLaunch: function() {
@@ -14,4 +20,5 @@
<style> <style>
/*每个页面公共css */ /*每个页面公共css */
</style> @import "@/static/font/iconfont.css";
</style>

View File

@@ -3,15 +3,56 @@
{ {
"path": "pages/index/index", "path": "pages/index/index",
"style": { "style": {
"navigationBarTitleText": "uni-app" "navigationBarTextStyle": "white",
"navigationBarTitleText": "首页"
}
},
{
"path": "pages/healthCard/healthCard",
"style": {
"navigationBarTextStyle": "white",
"navigationBarTitleText": "健康卡"
}
},
{
"path": "pages/personInfo/personInfo",
"style": {
"navigationBarTextStyle": "white",
"navigationBarTitleText": "个人中心"
} }
} }
], ],
"globalStyle": { "globalStyle": {
"navigationBarTextStyle": "black", "navigationBarTextStyle": "white",
"navigationBarTitleText": "uni-app", "backgroundColor": "#F8F8F8",
"navigationBarBackgroundColor": "#F8F8F8", "navigationBarBackgroundColor": "#ffffff"
"backgroundColor": "#F8F8F8" // "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> <template>
<view class="content"> <view class="container">
<image class="logo" src="/static/logo.png"></image> <!-- 轮播图 -->
<view class="text-area"> <swiper class="swiper-container" autoplay circular indicator-dots>
<text class="title">{{title}}</text> <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> </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> </view>
</template> </template>
<script setup>
import {
ref,
reactive
} from 'vue';
<script> // 轮播图数据
export default { const swiperList = ref([{
data() { image: '/static/shouye/lunbotu1.png'
return {
title: 'Hello666'
}
}, },
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; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center;
} }
.logo { .tab-icon {
height: 200rpx; width: 48rpx;
width: 200rpx; height: 48rpx;
margin-top: 200rpx; margin-bottom: 8rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
} }
.text-area { .active {
display: flex; color: #007aff;
justify-content: center;
} }
.title { .avatar {
font-size: 36rpx; width: 120rpx;
color: #8f8f94; 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; package com.core.common.enums;
import com.core.common.utils.StringUtils;
/** /**
* 采番前缀枚举 * 采番前缀枚举
* *
@@ -17,8 +15,12 @@ public enum AssignSeqEnum {
* 例子 * 例子
*/ */
TEST("1", "例子", "TE"), TEST("1", "例子", "TE"),
//患者编号 // 患者编号
PATIENT_NUM("1", "患者编号", "PN"); PATIENT_NUM("1", "患者编号", "PN"),
/**
* 就诊编号
*/
ENCOUNTER_NUM("1", "就诊编号", "EN");
private final String code; private final String code;
private final String info; private final String info;

View File

@@ -2,7 +2,9 @@ package com.core.common.utils;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.Period; import java.time.Period;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit; 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(); LocalDateTime now = LocalDateTime.now();
int years = now.getYear() - dateTime.getYear(); int years = now.getYear() - dateTime.getYear();
if (years > 2) { if (years > 2) {
@@ -78,5 +82,4 @@ public final class AgeCalculatorUtil {
private static boolean isLeapYear(int year) { private static boolean isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); 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; 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.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.core.common.core.domain.R; import com.core.common.core.domain.R;
import com.core.common.utils.MessageUtils; import com.core.common.utils.MessageUtils;
import com.core.common.utils.bean.BeanUtils;
import com.openhis.administration.domain.Location; import com.openhis.administration.domain.Location;
import com.openhis.administration.mapper.LocationMapper; import com.openhis.administration.mapper.LocationMapper;
import com.openhis.administration.service.ILocationService; import com.openhis.administration.service.ILocationService;
import com.openhis.common.constant.PromptMsgConstant; import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.LocationBedStatus;
import com.openhis.common.enums.LocationForm; import com.openhis.common.enums.LocationForm;
import com.openhis.common.utils.HisPageUtils; import com.openhis.common.enums.LocationMode;
import com.openhis.common.utils.HisQueryUtils; 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.LocationQueryDto;
import com.openhis.web.basedatamanage.dto.LocationQueryParam;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -43,6 +37,7 @@ import lombok.extern.slf4j.Slf4j;
public class CabinetLocationController { public class CabinetLocationController {
private final ILocationService locationService; private final ILocationService locationService;
private final ILocationAppService iLocationAppService;
@Autowired @Autowired
private LocationMapper locationMapper; private LocationMapper locationMapper;
@@ -50,32 +45,18 @@ public class CabinetLocationController {
/** /**
* 位置分页列表 * 位置分页列表
* *
* @param locationQueryParam 查询字段
* @param searchKey 模糊查询关键字
* @param pageNo 当前页码 * @param pageNo 当前页码
* @param pageSize 查询条数 * @param pageSize 查询条数
* @param request 请求数据
* @return 位置分页列表 * @return 位置分页列表
*/ */
@GetMapping(value = "/cabinet-location") @GetMapping(value = "/cabinet-location")
public R<?> getLocationPage(LocationQueryParam locationQueryParam, public R<?> getLocationPage(@RequestParam(required = false, value = "formKey", defaultValue = "") Integer formKey,
@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest request) { @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
// 构建查询条件 Page<LocationQueryDto> locationTree = iLocationAppService.getLocationTree(formKey, pageNo, pageSize);
QueryWrapper<Location> queryWrapper = HisQueryUtils.buildQueryWrapper(locationQueryParam, searchKey, return R.ok(locationTree, MessageUtils.createMessage(PromptMsgConstant.Common.M00009, new Object[] {"机构信息"}));
new HashSet<>(Arrays.asList("name", "py_str", "wb_str")), request);
// 设置排序
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); // LocationQueryDto locationQuery = new LocationQueryDto(LocationForm.CABINET);
Location location = new Location(); // locationQueryDto.setFormEnum(LocationForm.CABINET);
locationQueryDto.setFormEnum(LocationForm.CABINET); // BeanUtils.copyProperties(locationQueryDto, location);
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); boolean saveLocationSuccess = locationService.save(location);
return saveLocationSuccess return saveLocationSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00001, new Object[] {"位置信息"})) ? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00001, new Object[] {"位置信息"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00003, 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") @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); boolean updateLocationSuccess = locationService.updateById(location);
return updateLocationSuccess return updateLocationSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"位置信息"})) ? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"位置信息"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, new Object[] {"位置信息"})); : R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, new Object[] {"位置信息"}));

View File

@@ -3,16 +3,6 @@
*/ */
package com.openhis.web.basedatamanage.controller; 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.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.core.common.core.domain.R; import com.core.common.core.domain.R;
import com.core.common.utils.AssignSeqUtil; 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.administration.service.IOrganizationService;
import com.openhis.common.constant.PromptMsgConstant; import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.OrganizationType; 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.OrganizationInitDto;
import com.openhis.web.basedatamanage.dto.OrganizationQueryDto; import com.openhis.web.basedatamanage.dto.OrganizationQueryDto;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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 * 机构管理controller
@@ -42,6 +38,7 @@ import lombok.extern.slf4j.Slf4j;
public class OrganizationController { public class OrganizationController {
private final IOrganizationService organizationService; private final IOrganizationService organizationService;
private final IOrganizationAppService iOrganizationAppService;
@Autowired @Autowired
private OrganizationMapper organizationMapper; private OrganizationMapper organizationMapper;
@@ -63,38 +60,17 @@ public class OrganizationController {
/** /**
* 机构分页列表 * 机构分页列表
* *
* @param orgQueryParam 查询字段 * @param pageNo 当前页码
* @param searchKey 模糊查询关键字
* @param pageNo 当前页码
* @param pageSize 查询条数 * @param pageSize 查询条数
* @param request 请求数据
* @return 机构分页列表 * @return 机构分页列表
*/ */
@GetMapping(value = "/organization") @GetMapping(value = "/organization")
public R<?> getOrganizationPage(OrgQueryParam orgQueryParam, public R<?> getOrganizationPage(
@RequestParam(value = "searchKey", defaultValue = "") String searchKey, @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest request) { Page<OrganizationQueryDto> organizationTree = iOrganizationAppService.getOrganizationTree(pageNo, pageSize);
return R.ok(organizationTree,
// // 构建查询条件 MessageUtils.createMessage(PromptMsgConstant.Common.M00009, new Object[]{"机构信息"}));
// 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[] {"机构信息"}));
} }
/** /**
@@ -116,8 +92,8 @@ public class OrganizationController {
boolean saveOrgSuccess = organizationService.save(organization); boolean saveOrgSuccess = organizationService.save(organization);
return saveOrgSuccess return saveOrgSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00001, new Object[] {"机构信息"})) ? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00001, new Object[]{"机构信息"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00003, 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) { public R<?> getOrganizationById(@Validated @RequestParam Long orgId) {
Organization organization = organizationService.getById(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); boolean updateOrgSuccess = organizationService.updateById(organization);
return updateOrgSuccess return updateOrgSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"机构信息"})) ? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"机构信息"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, new Object[] {"机构信息"})); : R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, new Object[]{"机构信息"}));
} }
/** /**
@@ -166,8 +142,8 @@ public class OrganizationController {
boolean deleteOrgSuccess = organizationService.removeByIds(orgIdList); boolean deleteOrgSuccess = organizationService.removeByIds(orgIdList);
return deleteOrgSuccess return deleteOrgSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00005, new Object[] {"机构信息"})) ? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00005, new Object[]{"机构信息"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00006, new Object[] {"机构信息"})); : R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00006, new Object[]{"机构信息"}));
} }
/** /**
@@ -181,8 +157,8 @@ public class OrganizationController {
boolean activeSuccess = organizationService.activeChange(orgId); boolean activeSuccess = organizationService.activeChange(orgId);
return activeSuccess return activeSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[] {"启用"})) ? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[]{"启用"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, new Object[] {"启用"})); : R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, new Object[]{"启用"}));
} }
/** /**
@@ -196,49 +172,9 @@ public class OrganizationController {
boolean inActiveSuccess = organizationService.activeChange(orgId); boolean inActiveSuccess = organizationService.activeChange(orgId);
return inActiveSuccess return inActiveSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[] {"停用"})) ? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[]{"停用"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, 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 javax.servlet.http.HttpServletRequest;
import com.openhis.administration.domain.Organization;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@@ -78,24 +77,24 @@ public class PractitionerRoleController {
} }
/** // /**
* 添加岗位信息 // * 添加岗位信息
* // *
* @param practitionerRoleDto 岗位信息 // * @param practitionerRoleDto 岗位信息
*/ // */
@PostMapping("/practitioner-role") // @PostMapping("/practitioner-role")
public R<?> addPractitionerRole(@Validated @RequestBody PractitionerRoleDto practitionerRoleDto) { // public R<?> addPractitionerRole(@Validated @RequestBody CreatePractitionerRoleDto practitionerRoleDto) {
//
// 新增practitionerRole信息 // // 新增practitionerRole信息
PractitionerRole practitionerRole = new PractitionerRole(); // PractitionerRole practitionerRole = new PractitionerRole();
BeanUtils.copyProperties(practitionerRoleDto, practitionerRole); // BeanUtils.copyProperties(practitionerRoleDto, practitionerRole);
//
boolean savePractitionerRoleSuccess = practitionerRoleService.save(practitionerRole); // boolean savePractitionerRoleSuccess = practitionerRoleService.save(practitionerRole);
//
return savePractitionerRoleSuccess // return savePractitionerRoleSuccess
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00001, new Object[] {"岗位信息"})) // ? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00001, new Object[] {"岗位信息"}))
: R.fail(PromptMsgConstant.Common.M00007, null); // : R.fail(PromptMsgConstant.Common.M00007, null);
} // }
/** /**
* 获取岗位需要编辑的信息 * 获取岗位需要编辑的信息
@@ -106,7 +105,8 @@ public class PractitionerRoleController {
public R<?> getPractitionerRoleById(@Validated @RequestParam Long proleId) { public R<?> getPractitionerRoleById(@Validated @RequestParam Long proleId) {
PractitionerRole practitionerRole = practitionerRoleService.getById(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 practitionerRole = new PractitionerRole(); PractitionerRole practitionerRole = new PractitionerRole();
BeanUtils.copyProperties(practitionerRoleDto, 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); boolean editPractitionerRoleSuccess = practitionerRoleService.updateById(practitionerRole);

View File

@@ -3,10 +3,15 @@
*/ */
package com.openhis.web.basedatamanage.dto; package com.openhis.web.basedatamanage.dto;
import com.baomidou.mybatisplus.annotation.IdType; import java.util.ArrayList;
import com.baomidou.mybatisplus.annotation.TableId; 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.LocationBedStatus;
import com.openhis.common.enums.LocationForm;
import com.openhis.common.enums.LocationMode; import com.openhis.common.enums.LocationMode;
import com.openhis.common.enums.LocationStatus; import com.openhis.common.enums.LocationStatus;
@@ -20,30 +25,41 @@ import lombok.experimental.Accessors;
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
public class LocationQueryDto { public class LocationQueryDto {
/** ID */ /** ID */
@TableId(type = IdType.ASSIGN_ID) @JsonSerialize(using = ToStringSerializer.class)
private Long id; private Long id;
/** 编码 */ /** 编码 */
@NotBlank(message = "位置编码不能为空")
private String busNo; private String busNo;
/** 名称 */ /** 名称 */
@NotBlank(message = "位置名称不能为空")
private String name; 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; private String typeCode;
/** 功能编码 */ /** 功能编码 */
@NotBlank(message = "功能编码不能为空")
private String typeJson; private String typeJson;
/** 拼音码 */ /** 拼音码 */
@@ -53,18 +69,20 @@ public class LocationQueryDto {
private String wbStr; 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 Long organizationId;
/** 显示顺序 */ /** 显示顺序 */
private Integer displayOrder; private Integer displayOrder;
// public LocationQueryDto(LocationForm form, String busNo, LocationMode mode) { /** 子集合 */
// public LocationQueryDto(LocationForm form) { private List<LocationQueryDto> children = new ArrayList<>();
// this.statusEnum = LocationStatus.ACTIVE;
// this.formEnum = form;
// this.modeEnum = mode;
// }
} }

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.IdType;
import com.baomidou.mybatisplus.annotation.TableId; 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.OrganizationClass;
import com.openhis.common.enums.OrganizationType; import com.openhis.common.enums.OrganizationType;
@@ -23,7 +25,7 @@ import lombok.experimental.Accessors;
public class OrganizationQueryDto { public class OrganizationQueryDto {
/** ID */ /** ID */
@TableId(type = IdType.ASSIGN_ID) @JsonSerialize(using = ToStringSerializer.class)
private Long id; private Long id;
/** 编码 */ /** 编码 */

View File

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

View File

@@ -5,21 +5,20 @@ package com.openhis.web.basedatamanage.dto;
import java.io.Serializable; import java.io.Serializable;
import com.openhis.common.enums.LocationMode;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
/** /**
* 科室分页查询条件 * 员工分页查询条件
* *
* @author * @author
* @date 2025-02-21 * @date 2025-02-21
*/ */
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
public class LocationQueryParam implements Serializable { public class PractSearchParam implements Serializable {
/** 模式编码 */
private LocationMode modeEnum; /** 活动标记 */
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; 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 com.openhis.common.annotation.Dict;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@@ -15,6 +17,7 @@ public class HealthcareServiceDto {
/** /**
* ID * ID
*/ */
@JsonSerialize(using = ToStringSerializer.class)
private Long id; private Long id;
/** /**
@@ -27,6 +30,7 @@ public class HealthcareServiceDto {
* 提供部门ID * 提供部门ID
*/ */
@Dict(dictTable = "adm_organization",dictCode = "id",dictText = "name") @Dict(dictTable = "adm_organization",dictCode = "id",dictText = "name")
@JsonSerialize(using = ToStringSerializer.class)
private Long offeredOrgId; private Long offeredOrgId;
private String offeredOrgId_dictText; private String offeredOrgId_dictText;
@@ -55,6 +59,7 @@ public class HealthcareServiceDto {
* 地点 * 地点
*/ */
@Dict(dictTable = "adm_location",dictCode = "id",dictText = "name") @Dict(dictTable = "adm_location",dictCode = "id",dictText = "name")
@JsonSerialize(using = ToStringSerializer.class)
private Long locationId; private Long locationId;
private String locationId_dictText; private String locationId_dictText;
@@ -84,6 +89,12 @@ public class HealthcareServiceDto {
private Integer appointmentRequiredFlag; private Integer appointmentRequiredFlag;
private String appointmentRequiredFlag_enumText; 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) { for (Long detail : ids) {
ConditionDefinition conditionDefinition = new ConditionDefinition(); ConditionDefinition conditionDefinition = new ConditionDefinition();
conditionDefinition.setId(detail); conditionDefinition.setId(detail);
conditionDefinition.setStatusEnum(PublicationStatus.RETIRED); conditionDefinition.setStatusEnum(PublicationStatus.RETIRED.getValue());
conditionDefinitionList.add(conditionDefinition); conditionDefinitionList.add(conditionDefinition);
} }
// 更新病种信息 // 更新病种信息
@@ -165,7 +165,7 @@ public class DiseaseManageController {
for (Long detail : ids) { for (Long detail : ids) {
ConditionDefinition conditionDefinition = new ConditionDefinition(); ConditionDefinition conditionDefinition = new ConditionDefinition();
conditionDefinition.setId(detail); conditionDefinition.setId(detail);
conditionDefinition.setStatusEnum(PublicationStatus.ACTIVE); conditionDefinition.setStatusEnum(PublicationStatus.ACTIVE.getValue());
conditionDefinitionList.add(conditionDefinition); conditionDefinitionList.add(conditionDefinition);
} }
// 更新病种信息 // 更新病种信息
@@ -185,7 +185,7 @@ public class DiseaseManageController {
ConditionDefinition conditionDefinition = new ConditionDefinition(); ConditionDefinition conditionDefinition = new ConditionDefinition();
BeanUtils.copyProperties(diseaseManageUpDto, conditionDefinition); BeanUtils.copyProperties(diseaseManageUpDto, conditionDefinition);
// 新增外来病种目录 // 新增外来病种目录
conditionDefinition.setStatusEnum(PublicationStatus.DRAFT); conditionDefinition.setStatusEnum(PublicationStatus.DRAFT.getValue());
return iConditionDefinitionService.addDisease(conditionDefinition) return iConditionDefinitionService.addDisease(conditionDefinition)
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"疾病目录"})) ? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00008, null)); : R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00008, null));

View File

@@ -15,6 +15,7 @@ import javax.validation.constraints.NotBlank;
* @author lpt * @author lpt
* @date 2025-02-25 * @date 2025-02-25
*/ */
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
public class DiseaseManageUpDto { 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; 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.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; 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 * 门诊挂号 controller
*/ */
@@ -27,16 +31,18 @@ import java.util.stream.Stream;
@AllArgsConstructor @AllArgsConstructor
public class OutpatientRegistrationController { public class OutpatientRegistrationController {
private final IOutpatientRegistrationService iOutpatientRegistrationService; private final IOutpatientRegistrationAppService iOutpatientRegistrationAppService;
private final ILocationAppService iLocationAppService;
/** /**
* 门诊挂号基础数据初始化 * 基础数据初始化
*/ */
@GetMapping(value = "/init") @GetMapping(value = "/init")
public R<?> init() { public R<?> init() {
OutpatientRegistrationInitDto outpatientRegistrationInitDto = new OutpatientRegistrationInitDto(); 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())) .map(e -> new OutpatientRegistrationInitDto.priorityLevelOption(e.getValue(), e.getInfo()))
.collect(Collectors.toList()); .collect(Collectors.toList());
outpatientRegistrationInitDto.setPriorityLevelOptionOptions(priorityLevelOptionOptions); outpatientRegistrationInitDto.setPriorityLevelOptionOptions(priorityLevelOptionOptions);
@@ -44,19 +50,88 @@ public class OutpatientRegistrationController {
} }
/** /**
* 门诊挂号 - 查询患者信息 * 查询患者信息
* *
* @param searchKey 模糊查询关键字 * @param searchKey 模糊查询关键字
* @param pageNo 当前页 * @param pageNo 当前页
* @param pageSize 每页多少条 * @param pageSize 每页多少条
* @return 患者信息 * @return 患者信息
*/ */
@GetMapping(value = "/patient-metadata") @GetMapping(value = "/patient-metadata")
public R<?> getPatientMetadata(@RequestParam(value = "searchKey", defaultValue = "") String searchKey, public R<?> getPatientMetadata(@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) { @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return R.ok(iOutpatientRegistrationService.getPatientMetadataBySearchKey(searchKey, pageNo, 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; import lombok.experimental.Accessors;
/** /**
* 门诊挂号 新增数 * 门诊挂号 新增
*/ */
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
public class OutpatientRegistrationAddParam { 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; 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.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.util.Date;
/** /**
* 患者信息 元数据 * 患者信息 元数据
*/ */
@@ -12,6 +16,7 @@ public class PatientMetadata {
/** /**
* ID * ID
*/ */
@JsonSerialize(using = ToStringSerializer.class)
private Long id; private Long id;
/** /**
@@ -25,4 +30,30 @@ public class PatientMetadata {
private Integer genderEnum; private Integer genderEnum;
private String genderEnum_enumText; 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 * @param pageSize 每页大小默认为10
*/ */
@GetMapping("/outpatient-record-page") @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 = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) { @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {

View File

@@ -25,9 +25,9 @@ public class OutpatientRecordSearchParam {
private String doctorName; 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.extra_details,
T3.contact, T3.contact,
T3.appointment_required_flag, T3.appointment_required_flag,
T3.definition_id,
T3.charge_name, T3.charge_name,
T3.price T3.price
FROM FROM
@@ -37,12 +38,14 @@
T1.extra_details, T1.extra_details,
T1.contact, T1.contact,
T1.appointment_required_flag, T1.appointment_required_flag,
T2.id AS definition_id,
T2.charge_name, T2.charge_name,
T2.price T2.price
FROM FROM
adm_healthcare_service AS T1 adm_healthcare_service AS T1
LEFT JOIN adm_charge_item_definition AS T2 ON T2.instance_id = T1.ID LEFT JOIN adm_charge_item_definition AS T2 ON T2.instance_id = T1.ID
AND T2.instance_table = #{tableName} AND T2.instance_table = #{tableName}
WHERE T1.delete_flag = '0'
ORDER BY ORDER BY
T1.create_time DESC T1.create_time DESC
) AS T3 ) 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参数且不为空 --> <!-- 如果传入phone参数且不为空 -->
<if test="OutpatientRecordSearchParam != null and OutpatientRecordSearchParam.phone != null and OutpatientRecordSearchParam.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>
<!-- 时间筛选 --> <!-- 时间筛选 -->
<if test="OutpatientRecordSearchParam != null and OutpatientRecordSearchParam.startTime != null and OutpatientRecordSearchParam.endTime != null"> <if test="OutpatientRecordSearchParam != null and OutpatientRecordSearchParam.beginTime != null and OutpatientRecordSearchParam.endTime != null">
AND e.start_time BETWEEN #{OutpatientRecordSearchParam.startTime} AND AND e.start_time BETWEEN
#{OutpatientRecordSearchParam.endTime} 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> </if>
<!-- 如果传入doctorName参数且不为空 --> <!-- 如果传入doctorName参数且不为空 -->
@@ -184,13 +185,14 @@
<!-- 如果传入phone参数且不为空 --> <!-- 如果传入phone参数且不为空 -->
<if test="OutpatientRecordSearchParam != null and OutpatientRecordSearchParam.phone != null and OutpatientRecordSearchParam.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>
<!-- 时间筛选 --> <!-- 时间筛选 -->
<if test="OutpatientRecordSearchParam != null and OutpatientRecordSearchParam.startTime != null and OutpatientRecordSearchParam.endTime != null"> <if test="OutpatientRecordSearchParam != null and OutpatientRecordSearchParam.beginTime != null and OutpatientRecordSearchParam.endTime != null">
AND e.start_time BETWEEN #{OutpatientRecordSearchParam.startTime} AND AND e.start_time BETWEEN
#{OutpatientRecordSearchParam.endTime} 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> </if>
<!-- 如果传入doctorName参数且不为空 --> <!-- 如果传入doctorName参数且不为空 -->

View File

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

View File

@@ -6,7 +6,7 @@ import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum ChargeItemStatus { public enum ChargeItemStatus implements HisEnumInterface {
PLANNED (1, "planned", "待收费"), PLANNED (1, "planned", "待收费"),
BILLABLE(2, "billable", "待结算"), 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; package com.openhis.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue; import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum EncounterLocationStatus { public enum EncounterLocationStatus implements HisEnumInterface {
PLANNED(1, "planned", "已安排"), PLANNED(1, "planned", "已安排"),
ACTIVE(2, "active", "使用中"), ACTIVE(2, "active", "使用中"),

View File

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

View File

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

View File

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

View File

@@ -1,35 +1,39 @@
package com.openhis.common.enums; package com.openhis.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue; import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @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."), 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."), 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."), 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."), LEVEL(5, "lvl", "楼层A Level in a multi-level Building/Structure."),
CORRIDOR(6, "co", "走廊Any corridor within a Building, that may connect rooms."), 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."), 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."), 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."), 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."), 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."), 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"), 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"); VIRTUAL(15, "vi", "虚拟A location that is virtual in nature, such as a conference call or virtual meeting space");
// PHARMACY(16, "ph", "药房"), // PHARMACY(16, "ph", "药房"),
// PHARMACY_WINDOW(17, "phw", "发药窗口"), // PHARMACY_WINDOW(17, "phw", "发药窗口"),
// PHARMACY_TABLE(18, "dt", "摆药台"), // PHARMACY_TABLE(18, "dt", "摆药台"),
// NURSE_STATION(19, "ns", "护士站"), // NURSE_STATION(19, "ns", "护士站"),
// PERSON_STORE(20, "ps", "个人储物柜"), // PERSON_STORE(20, "ps", "个人储物柜"),
// DOCTOR_TABLE(21, "dt", "医生诊台"); // DOCTOR_TABLE(21, "dt", "医生诊台");
@EnumValue @EnumValue
private final Integer value; private final Integer value;
private final String code; private final String code;

View File

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

View File

@@ -1,17 +1,19 @@
package com.openhis.common.enums; package com.openhis.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue; import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum LocationStatus { public enum LocationStatus implements HisEnumInterface {
ACTIVE (1, "active", "有效"), ACTIVE(1, "active", "有效"),
INACTIVE(2, "inactive", "无效"), INACTIVE(2, "inactive", "无效"),
SUSPENDED(3, "suspended", "临时关闭"); SUSPENDED(3, "suspended", "临时关闭");
@EnumValue @EnumValue
private final Integer value; private final Integer value;
private final String code; 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; package com.openhis.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue; import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue; import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum PublicationStatus { public enum PublicationStatus implements HisEnumInterface {
DRAFT(1, "draft", "草稿"), 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 Long id;
/** 状态 */ /** 状态 */
private ChargeItemStatus statusEnum; private Integer statusEnum;
/** 层级 */ /** 层级 */
private String busNo; private String busNo;

View File

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

View File

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

View File

@@ -1,17 +1,13 @@
package com.openhis.administration.domain; package com.openhis.administration.domain;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.core.common.core.domain.HisBaseEntity; import com.core.common.core.domain.HisBaseEntity;
import com.openhis.common.enums.LocationBedStatus; import com.openhis.common.enums.LocationBedStatus;
import com.openhis.common.enums.LocationForm;
import com.openhis.common.enums.LocationMode; import com.openhis.common.enums.LocationMode;
import com.openhis.common.enums.LocationStatus; import com.openhis.common.enums.LocationStatus;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@@ -39,13 +35,16 @@ public class Location extends HisBaseEntity {
private String name; 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; private String typeCode;
@@ -60,7 +59,8 @@ public class Location extends HisBaseEntity {
private String wbStr; private String wbStr;
/** 物理形式枚举 */ /** 物理形式枚举 */
private LocationForm formEnum; // private LocationForm formEnum;
private Integer formEnum;
/** 机构编码 */ /** 机构编码 */
private Long organizationId; private Long organizationId;
@@ -68,5 +68,22 @@ public class Location extends HisBaseEntity {
/** 显示顺序 */ /** 显示顺序 */
private Integer displayOrder; 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.baomidou.mybatisplus.annotation.TableName;
import com.core.common.core.domain.HisBaseEntity; 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.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@@ -25,6 +27,7 @@ public class Patient extends HisBaseEntity {
/** ID */ /** ID */
@TableId(type = IdType.ASSIGN_ID) @TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id; private Long id;
/** 活动标记 */ /** 活动标记 */

View File

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

View File

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

View File

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

View File

@@ -1,11 +1,9 @@
package com.openhis.administration.service; package com.openhis.administration.service;
import java.util.Date;
import java.util.List; import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.openhis.administration.domain.ChargeItem; import com.openhis.administration.domain.ChargeItem;
import com.openhis.workflow.domain.SupplyRequest;
/** /**
* 费用项管理Service接口 * 费用项管理Service接口
@@ -21,4 +19,11 @@ public interface IChargeItemService extends IService<ChargeItem> {
* @param chargeItemList 采购账单 * @param chargeItemList 采购账单
*/ */
void createBilledPurchaseCharge(List<ChargeItem> 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> { 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> { 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 * @date 2025-02-20
*/ */
public interface IEncounterService extends IService<Encounter> { 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