25 Commits

Author SHA1 Message Date
Ubuntu_925
5bac178c64 !10 Merge branch 'develop' of <a href="https://gitee.com/Ubuntu_925/openhis-itai">https://gitee.com/Ubuntu_925/openhis-itai</a> into develop
Merge pull request !10 from Ubuntu_925/develop
2025-11-12 09:48:19 +00:00
whm
82716b2cdd Merge branch 'develop' of https://gitee.com/Ubuntu_925/openhis-itai into develop 2025-11-12 17:44:18 +08:00
whm
1b04cf670f openhis 配置文件 2025-11-12 17:44:07 +08:00
Ubuntu_925
7895f4cecd Merge branch 'develop' of gitee.com:tntlinking-opensource/openhis-itai into develop
Signed-off-by: Ubuntu_925 <14284422+Ubuntu_925@user.noreply.gitee.com>
2025-11-12 09:12:49 +00:00
whm
e8d67e6681 2025-11-12 openHIS 发版 2025-11-12 17:06:09 +08:00
whm
88535b8e7c 提交数据库变更脚本 2025-11-12 16:59:51 +08:00
Ubuntu_925
cede47f342 版本更新 2025-10-17 11:55:15 +08:00
abing
8ad2d6ebbb !6 修复编译错误、升级依赖版本、统一管理依赖
Merge pull request !6 from starxg/dev/starxg
2025-10-17 02:55:51 +00:00
Zhang.WH
dd0090a2a8 数据库脚本新增 2025-10-16 18:13:50 +08:00
Zhang.WH
e4c5f36f2e 版本更新 2025-10-16 17:38:49 +08:00
Zhang.WH
f515bb8fbb 版本更新 2025-10-16 17:18:06 +08:00
starxg
bd3874b3c7 修复编译错误升级依赖版本并同一管理 2025-10-09 16:40:52 +08:00
abing
8dc6faff0b !5 修改
Merge pull request !5 from Ubuntu_925/develop
2025-09-25 07:54:11 +00:00
Zhang.WH
d23a594a4b 修改 2025-09-25 10:49:37 +08:00
Zhang.WH
c8014404f1 后端最新版本同步 2025-09-25 10:43:50 +08:00
abing
38785887b1 !4 修改
Merge pull request !4 from Ubuntu_925/develop
2025-09-05 02:29:40 +00:00
abing
08f539dc72 版本更新
Merge pull request !3 from Ubuntu_925/develop
2025-09-03 07:59:28 +00:00
Zhang.WH
6987963840 Merge branch 'develop' of https://gitee.com/Ubuntu_925/openhis-itai into develop 2025-09-03 15:56:38 +08:00
Zhang.WH
2a75448a30 配置文件修改 2025-09-03 13:23:58 +08:00
Zhang.WH
72176f67cc 补充修改 2025-09-03 11:27:23 +08:00
Zhang.WH
155df0c917 修改 2025-09-03 11:23:29 +08:00
Zhang.WH
00208c5f79 文件修改 2025-09-03 11:05:08 +08:00
Zhang.WH
db9d790435 最新版本升级 2025-09-02 19:16:04 +08:00
mohaijiang
99773d092e update LICENSE.
Signed-off-by: mohaijiang <mohaijiang110@163.com>
2025-07-22 07:41:17 +00:00
天天开源
0dbed951d2 update README.md.
Signed-off-by: 天天开源 <14124580+TTopen@user.noreply.gitee.com>
2025-07-14 02:28:17 +00:00
1157 changed files with 143484 additions and 29513 deletions

View File

@@ -36,13 +36,11 @@
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.6.2</version>
</dependency>
<!-- Mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!-- 核心模块-->

View File

@@ -3,6 +3,7 @@ package com.core.web.util;
import com.core.common.core.domain.model.LoginUser;
import com.core.common.enums.TenantOptionDict;
import com.core.common.utils.SecurityUtils;
import com.core.common.utils.StringUtils;
/**
* 租户配置工具类
@@ -30,7 +31,12 @@ public class TenantOptionUtil {
if (loginUser.getOptionMap() == null || loginUser.getOptionMap().isEmpty()) {
return null;
}
return loginUser.getOptionMap().get(optionDict.getCode());
// return loginUser.getOptionMap().get(optionDict.getCode());
// TODO:2025/10/17 李永兴提出的sys_option切换TenantOption临时防止报错方案最晚2025年11月底删除
String newValue = loginUser.getOptionMap().get(optionDict.getCode());
String oldValue = loginUser.getOptionJson().getString(optionDict.getCode());
return StringUtils.isEmpty(newValue) ? oldValue : newValue;
}
}

View File

@@ -77,6 +77,10 @@
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<!-- io常用工具类 -->
<dependency>
@@ -136,7 +140,11 @@
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
</dependencies>

View File

@@ -5,10 +5,7 @@ import java.util.concurrent.TimeUnit;
import com.core.common.exception.UtilException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Component;
/**
@@ -256,4 +253,28 @@ public class RedisCache {
return this.redisTemplate.opsForValue().increment(key, delta);
}
}
/**
* 获取所有String类型的键值对开发环境下使用
*/
public Map<String, Object> getAllDictDataWithKeys(String pattern) {
pattern+="*";
Map<String, Object> allDict = new HashMap<>();
// 1. 获取所有键("*"匹配所有键)
Set<String> allKeys = redisTemplate.keys(pattern);
if (allKeys == null || allKeys.isEmpty()) {
return allDict;
}
// 2. 批量获取值使用multiGet高效批量查询
ValueOperations<String, Object> valueOps = redisTemplate.opsForValue();
List<Object> values = valueOps.multiGet(allKeys);
// 3. 组装键值对
Iterator<String> keyIter = allKeys.iterator();
for (Object value : values) {
if (keyIter.hasNext()) {
allDict.put(keyIter.next(), value);
}
}
return allDict;
}
}

View File

@@ -0,0 +1,32 @@
package com.core.common.enums;
/**
* Desc: 调价类型枚举
* @Author raymond
* @Date 09:14 2025/10/16
* @return
**/
public enum AdjustPriceEnum {
MEDICINE(0, "药品"),
CONSUMABLES(1, "耗材"),
DIAGNOSIS(2, "诊疗"),
REGISTER(3, "挂号");
private final Integer code;
private final String info;
AdjustPriceEnum(Integer code, String info) {
this.code = code;
this.info = info;
}
public Integer getCode() {
return code;
}
public String getInfo() {
return info;
}
}

View File

@@ -6,166 +6,93 @@ package com.core.common.enums;
* @author system
*/
public enum TenantOptionDict {
/**
* 医院名称
*/
HOSPITAL_NAME("hospitalName", "医院名称", 0),
YB_HOSPITAL_NAME("hospitalName", "保-医院名称", 0),
/**
* 医疗机构等级
* 医保-医疗机构等级(3101接口)
*/
MEDINS_LV("medinsLv", "医疗机构等级", 1),
YB_MEDINS_LV("medinsLv", "保_医疗机构等级", 1),
/**
* 定点医药机构编号
*/
FIXMEDINS_CODE("fixmedinsCode", "定点医药机构编号", 2),
YB_FIXMEDINS_CODE("fixmedinsCode", "医保_定点医药机构编号", 2),
/**
* 电子发票appid
*/
APP_ID("app_id", "电子发票appid", 3),
EINVOICE_APP_ID("app_id", "电子发票-appid", 3),
/**
* 电子发票key
*/
KEY("key", "电子发票key", 4),
EINVOICE_KEY("key", "电子发票-key", 4),
/**
* 电子发票url
*/
URL("url", "电子发票url", 5),
EINVOICE_URL("url", "电子发票-url", 5),
/**
* 医保开关
*/
YB_SWITCH("yb_switch", "医保开关", 6),
/**
* 客户端私钥
*/
CLI_PRV_KEY("cliPrvKey", "客户端私钥", 7),
/**
* 客户端公钥
*/
CLI_PUB_KEY("cliPubKey", "客户端公钥", 8),
/**
* 服务端公钥
*/
SERVER_PUB_KEY("serverPubKey", "服务端公钥", 9),
/**
* 定点医药机构名称
*/
FIXMEDINS_NAME("fixmedinsName", "定点医药机构名称", 10),
/**
* 行政区划
*/
ADMVS("admvs", "行政区划", 11),
/**
* 授权范围
*/
SCOPE("scope", "授权范围", 12),
/**
* 授权类型
*/
GRANT_TYPE("grantType", "授权类型", 13),
/**
* 密码
*/
PASSWORD("password", "密码", 14),
/**
* 用户名
*/
USERNAME("username", "用户名", 15),
/**
* 客户端安全码
*/
CLIENT_SECRET("clientSecret", "客户端安全码", 16),
/**
* 客户端ID
*/
CLIENT_ID("clientId", "客户端ID", 17),
/**
* 生产环境客户端公钥
*/
PROD_CLI_PUB_KEY("prod_cliPubKey", "生产环境客户端公钥", 18),
/**
* 生产环境客户端私钥
*/
PROD_CLI_PRV_KEY("prod_cliPrvKey", "生产环境客户端私钥", 19),
/**
* 生产环境客户端ID
*/
PROD_CLIENT_ID("prod_clientId", "生产环境客户端ID", 20),
/**
* 文件路径
*/
FILE_PATH("filePath", "文件路径", 21),
/**
* 电子地址
*/
ELE_ADDRESS("eleAddress", "电子地址", 22),
ELE_ADDRESS("eleAddress", "电子处方-请求地址", 22),
/**
* 服务地址
*/
ADDRESS("address", "服务地址", 23),
/**
* 超时时间
*/
TIME("time", "超时时间", 24),
/**
* 是否加密
*/
IS_ENCRYPT("isEncrypt", "是否加密", 25),
YB_IS_ENCRYPT("isEncrypt", "医保-是否加密", 25),
/**
* 医保区划
*/
INSUPLC_ADMDVS("insuplc_admdvs", "医保区划", 26),
YB_INSUPLC_ADMDVS("insuplc_admdvs", "医保-区划", 26),
/**
* 电子处方appId
*/
PRE_APP_ID("pre_app_id", "电子处方appId", 27),
ELE_PRE_APP_ID("pre_app_id", "电子处方-appId", 27),
/**
* 电子处方appSecret
*/
PRE_APP_SECRET("pre_app_secret", "电子处方appSecret", 28),
ELE_PRE_APP_SECRET("pre_app_secret", "电子处方-appSecret", 28),
/**
* 电子处方私钥
*/
APP_PRVKEY("APP_PRVKEY", "电子处方私钥", 29),
ELE_APP_PRVKEY("APP_PRVKEY", "电子处方-私钥", 29),
/**
* 电子处方公钥
*/
PLAF_PUBKEY("PLAF_PUBKEY", "电子处方公钥", 30),
/**
* 医保客户端ID
*/
YB_CLIENT_ID("ybClientId", "医保客户端ID", 31),
/**
* 医保客户端安全码
*/
YB_CLIENT_SECRET("ybClientSecret", "医保客户端安全码", 32),
/**
* 医保用户名
*/
YB_USERNAME("ybUsername", "医保用户名", 33),
/**
* 医保密码
*/
YB_PASSWORD("ybPassword", "医保密码", 34),
/**
* 医保授权类型
*/
YB_GRANT_TYPE("ybGrantType", "医保授权类型", 35),
/**
* 医保授权范围
*/
YB_SCOPE("ybScope", "医保授权范围", 36),
/**
* 医保密钥
*/
YB_CLI_PRV_KEY("ybCliPrvKey", "医保密钥", 37),
/**
* 医保服务URL
*/
YB_URL("ybUrl", "医保服务URL", 38),
ELE_PLAF_PUBKEY("PLAF_PUBKEY", "电子处方-公钥", 30),
/**
* 医院等级
*/
HOSPITAL_LV("hospital_lv", "医院等级", 39),
EINVOICE_HOSPITAL_LV("hospital_lv", "电子发票-医院等级", 39),
/**
* 无视LIS&PACS报错
*/
LIS_PACS_ERROR_IGNORE("lisPacsErrorIgnore", "无视LIS&PACS报错", 40),
/**
* LIS接口地址
*/
@@ -193,11 +120,91 @@ public enum TenantOptionDict {
/**
* PACSAppSecret
*/
INVOICE_URL("invoiceUrl", "电子发票中转服务的路径", 46),
INVOICE_FORWARD_URL("invoiceUrl", "电子发票-中转服务的路径", 46),
/**
* PACSAppSecret
*/
FORWARD_SWITCH("forwardSwitch", "电子发票中转服务开关", 47);
FORWARD_SWITCH("forwardSwitch", "电子发票-中转服务开关", 47),
/**
* 食源性开关
*/
FOODBORNE_SWITCH("foodborneSwitch", "食源性开关", 48),
/**
* 食源性接口地址 ../goto格式如下http://172.16.7.247/infections/goto 需指定到/goto
*/
FOODBORNE_API_URL("foodborneApiUrl", "食源性接口地址 ../goto", 49),
/**
* 食源性医疗机构
*/
FOODBORNE_HOSPITAL("foodborneHospital", "食源性医疗机构", 50),
/**
* 食源性登录账号
*/
FOODBORNE_USER_NAME("foodborneUserName", "食源性登录账号", 51),
/**
* BPC商户号
*/
BPC_MID("bpcMid", "BPC商户号", 52),
/**
* BPC终端号
*/
BPC_TID("bpcTid", "BPC终端号", 53),
/**
* BPCMD5签名密钥
*/
BPC_MD5_SHARED_SECRET("bpcMd5SharedSecret", "BPCMD5签名密钥", 54),
/**
* BPC请求URL
*/
BPC_REQUEST_URL("bpcRequestUrl", "BPC请求URL", 55),
/**
* 电子发票开关
*/
INVOICE_SWITCH("invoiceSwitch", "电子发票开关 (0:关闭 1:开启)", 56),
/**
* 医嘱定价来源
*/
ORDER_PRICING_SOURCE("orderPricingSource", "定价来源 batchSellingPrice/retailPrice", 57),
/**
* 三方支付(签到)
*/
THREE_PART_SIGN_URL("threePartSignUrl", "三方支付GET请求", 58),
/**
* 三方支付(消费)
*/
THREE_PART_PAY_URL("threePartPayUrl", "三方支付GET请求", 59),
/**
* 三方支付(退费)
*/
THREE_PART_RETURN_URL("threePartReturnUrl", "三方支付GET请求", 60),
/**
* 三方支付(隔天退费)
*/
THREE_PART_NEXT_DAY_RETURN_URL("threePartNextDayReturnUrl", "三方支付GET请求", 61),
/**
* 三方支付路径(支付结果查询)
*/
THREE_PART_PAY_QUERY_URL("threePartPayQueryUrl", "三方支付GET请求", 62),
/**
* 三方支付路径(退费结果查询)
*/
THREE_PART_RETURN_QUERY_URL("threePartReturnQueryUrl", "三方支付GET请求", 63),
/**
* 三方支付路径(隔天退费结果查询)
*/
THREE_PART_NEXT_DAY_RETURN_QUERY_URL("threePartNextDayReturnQueryUrl", "三方支付GET请求", 64),
/**
* 三方支付参数
*/
THREE_PART_PARAM("threePartParam", "三方支付GET请求", 65);
private final String code;
private final String name;
@@ -209,18 +216,6 @@ public enum TenantOptionDict {
this.sort = sort;
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
public Integer getSort() {
return sort;
}
public static TenantOptionDict getByCode(String code) {
if (code == null) {
return null;
@@ -232,4 +227,16 @@ public enum TenantOptionDict {
}
return null;
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
public Integer getSort() {
return sort;
}
}

View File

@@ -55,6 +55,17 @@ public class SecurityUtils {
}
}
/**
* 获取用户昵称
**/
public static String getNickName() {
try {
return getLoginUser().getUser().getNickName();
} catch (Exception e) {
throw new ServiceException("获取用户昵称异常", HttpStatus.UNAUTHORIZED);
}
}
/**
* 获取用户
**/

View File

@@ -80,7 +80,6 @@
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>5.3.3</version>
</dependency>
</dependencies>

View File

@@ -6,6 +6,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@@ -45,6 +46,11 @@ public class RedisConfig extends CachingConfigurerSupport {
return redisScript;
}
@Bean
public ValueOperations<Object, Object> valueOperations(RedisTemplate<Object, Object> redisTemplate) {
return redisTemplate.opsForValue();
}
/**
* 限流脚本
*/

View File

@@ -1,5 +1,9 @@
package com.core.framework.config;
import com.core.framework.config.properties.PermitAllUrlProperties;
import com.core.framework.security.filter.JwtAuthenticationTokenFilter;
import com.core.framework.security.handle.AuthenticationEntryPointImpl;
import com.core.framework.security.handle.LogoutSuccessHandlerImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -7,7 +11,7 @@ import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
@@ -17,17 +21,12 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic
import org.springframework.security.web.authentication.logout.LogoutFilter;
import org.springframework.web.filter.CorsFilter;
import com.core.framework.config.properties.PermitAllUrlProperties;
import com.core.framework.security.filter.JwtAuthenticationTokenFilter;
import com.core.framework.security.handle.AuthenticationEntryPointImpl;
import com.core.framework.security.handle.LogoutSuccessHandlerImpl;
/**
* spring security配置
*
* @author system
*/
@EnableMethodSecurity(prePostEnabled = true, securedEnabled = true)
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
@Configuration
public class SecurityConfig {
/**
@@ -86,38 +85,38 @@ public class SecurityConfig {
@Bean
protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
return httpSecurity
// CSRF禁用因为不使用session
.csrf(csrf -> csrf.disable())
// 禁用HTTP响应标头
.headers((headersCustomizer) -> {
headersCustomizer.cacheControl(cache -> cache.disable()).frameOptions(options -> options.sameOrigin());
})
// 认证失败处理类
.exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler))
// 基于token所以不需要session
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
// 注解标记允许匿名访问的url
.authorizeHttpRequests((requests) -> {
permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());
// 对于登录login 注册register 验证码captchaImage 允许匿名访问
requests.antMatchers("/login", "/register", "/captchaImage").permitAll()
// 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**")
.permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**")
.permitAll()
.antMatchers("/patientmanage/information/**")
.permitAll()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated();
})
// 添加Logout filter
.logout(logout -> logout.logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler))
// 添加JWT filter
.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class)
// 添加CORS filter
.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class)
.addFilterBefore(corsFilter, LogoutFilter.class).build();
// CSRF禁用因为不使用session
.csrf(csrf -> csrf.disable())
// 禁用HTTP响应标头
.headers((headersCustomizer) -> {
headersCustomizer.cacheControl(cache -> cache.disable()).frameOptions(options -> options.sameOrigin());
})
// 认证失败处理类
.exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler))
// 基于token所以不需要session
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
// 注解标记允许匿名访问的url
.authorizeHttpRequests((requests) -> {
permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());
// 对于登录login 注册register 验证码captchaImage 允许匿名访问
requests.antMatchers("/login", "/register", "/captchaImage").permitAll()
// 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**")
.permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**")
.permitAll()
.antMatchers("/patientmanage/information/**")
.permitAll()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated();
})
// 添加Logout filter
.logout(logout -> logout.logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler))
// 添加JWT filter
.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class)
// 添加CORS filter
.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class)
.addFilterBefore(corsFilter, LogoutFilter.class).build();
}
/**

View File

@@ -273,7 +273,7 @@ public class SysLoginService {
Optional<SysTenant> currentTenantOptional =
bindTenantList.getData().stream().filter(e -> tenantId.equals(e.getId())).findFirst();
if (currentTenantOptional.isEmpty()) {
throw new ServiceException("所属医院非法");
throw new ServiceException("所属医院无权限");
}
// 租户状态校验
SysTenant currentTenant = currentTenantOptional.get();

View File

@@ -23,15 +23,11 @@
<groupId>com.core</groupId>
<artifactId>core-common</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<scope>compile</scope>
</dependency>
<!-- postgresql -->

View File

@@ -23,18 +23,21 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<!-- 领域-->
<dependency>
<groupId>com.openhis</groupId>
<artifactId>openhis-domain</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- liteflow-->
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring-boot-starter</artifactId>
<version>2.12.4.1</version>
</dependency>
<!-- junit-->
@@ -43,16 +46,20 @@
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.43</version>
<scope>compile</scope>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<!-- rabbitMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
@@ -61,7 +68,6 @@
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.15</version>
<configuration>
<fork>true</fork> <!-- 如果没有该配置devtools不会生效 -->
</configuration>
@@ -76,20 +82,12 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.1.0</version>
<version>${maven-war-plugin.version}</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<warName>${project.artifactId}</warName>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>

View File

@@ -0,0 +1,204 @@
package com.openhis.web.adjustprice.appservice;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.core.common.core.domain.R;
import com.openhis.web.adjustprice.dto.AdjustPriceDataVo;
import com.openhis.web.adjustprice.dto.AdjustPriceManagerSearchParam;
/**
* Desc: 调价业务接口
*
* @Author raymond
* @Date 08:42 2025/10/16
* @return
**/
public interface IAdjustPriceService {
/**
* Desc: 保存调价数据
*
* @param dataVoList 前端数据集合
* @Author raymond
* @Date 08:57 2025/10/16
* @return com.core.common.core.domain.R<?>
**/
R<?> submitChangePriceData(List<AdjustPriceDataVo> dataVoList);
/**
* Desc: 保存并提交审核调价数据
*
* @param dataVoList
* @Author raymond
* @Date 16:22 2025/10/23
* @return com.core.common.core.domain.R<?>
**/
R<?> submitExamineChangePriceData(List<AdjustPriceDataVo> dataVoList);
/**
* Desc: 根据关键词查询 药品|耗材|诊疗 集合的最后价格
*
* @param searchKey
* @Author raymond
* @Date 09:32 2025/10/20
* @return java.util.List<?>
**/
R<?> searchKeyWordDataListByMed(String searchKey);
/**
* Desc: 根据关键词查询 药品|耗材|诊疗 集合的最后价格
*
* @param searchKey
* @Author raymond
* @Date 09:32 2025/10/20
* @return java.util.List<?>
**/
R<?> searchKeyWordDataListByDevice(String searchKey);
/**
* Desc: 根据关键词查询 药品|耗材|诊疗 集合的最后价格
*
* @param searchKey
* @Author raymond
* @Date 09:32 2025/10/20
* @return java.util.List<?>
**/
R<?> searchKeyWordDataListByActivity(String searchKey);
/**
* Desc: 查询提交的改价数据
*
* @param adjustPriceManagerSearchParam
* @param pageNo
* @param pageSize
* @param searchKey
* @param request
* @Author raymond
* @Date 23:39 2025/11/1
* @return com.core.common.core.domain.R<?>
**/
R<?> searchChangePriceSubmitDataToPage(AdjustPriceManagerSearchParam adjustPriceManagerSearchParam, Integer pageNo,
Integer pageSize, String searchKey, HttpServletRequest request);
/**
* Desc: 根据busNo 查询调价单详情 med
*
* @param busNo
* @Author raymond
* @Date 13:15 2025/10/21
* @return com.core.common.core.domain.R<?>
**/
R<?> searchChangePriceDataByMed(String busNo);
/**
* Desc: 根据busNo 查询调价单详情 med
*
* @param busNo
* @Author raymond
* @Date 13:15 2025/10/21
* @return com.core.common.core.domain.R<?>
**/
R<?> searchChangePriceDataByDevice(String busNo);
/**
* Desc: 根据busNo 查询调价单详情 Activity
*
* @param busNo
* @Author raymond
* @Date 13:15 2025/10/21
* @return com.core.common.core.domain.R<?>
**/
R<?> searchChangePriceDataByActivity(String busNo);
/**
* Desc: 根据busNo 查询调价单详情 Health
*
* @param busNo
* @Author raymond
* @Date 13:15 2025/10/21
* @return com.core.common.core.domain.R<?>
**/
R<?> searchChangePriceDataByHealth(String busNo);
/**
* Desc: 修改调价原因 和 价格
*
* @param busNo
* @Author raymond
* @Date 15:21 2025/10/21
* @return com.core.common.core.domain.R<?>
**/
R<?> cancelChangePriceData(String busNo);
/**
* Desc: 查询有挂号信息的科室
*
* @param
* @Author raymond
* @Date 16:38 2025/10/22
* @return com.core.common.core.domain.R<?>
**/
R<?> searchAllOrgData();
/**
* Desc: 根据科室id 加载挂号数据
*
* @param orgId
* @Author raymond
* @Date 16:45 2025/10/22
* @return com.core.common.core.domain.R<?>
**/
R<?> searchHealthData(Long orgId);
/**
* Desc: 根据业务单据号 进行单据提交操作
*
* @param busNo
* @Author raymond
* @Date 09:25 2025/10/23
* @return com.core.common.core.domain.R<?>
**/
R<?> updateExamineByApproval(String busNo);
/**
* Desc: 根据药品ID 是否在审核中
*
* @param itemId
* @Author raymond
* @Date 17:48 2025/11/3
* @return com.core.common.core.domain.R<?>
**/
R<?> checkMedApprovalExist(Long itemId);
/**
* Desc: 根据耗材ID 是否在审核中
*
* @param itemId
* @Author raymond
* @Date 17:48 2025/11/3
* @return com.core.common.core.domain.R<?>
**/
R<?> checkDeviceApprovalExist(Long itemId);
/**
* Desc: 根据诊疗ID 是否在审核中
*
* @param itemId
* @Author raymond
* @Date 17:48 2025/11/3
* @return com.core.common.core.domain.R<?>
**/
R<?> checkActivityApprovalExist(Long itemId);
/**
* Desc: 根据挂号ID 是否在审核中
*
* @param itemId
* @Author raymond
* @Date 17:48 2025/11/3
* @return com.core.common.core.domain.R<?>
**/
R<?> checkHealthApprovalExist(Long itemId);
}

View File

@@ -0,0 +1,594 @@
package com.openhis.web.adjustprice.appservice.impl;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
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.core.domain.entity.SysDictData;
import com.core.common.enums.AdjustPriceEnum;
import com.core.common.utils.AssignSeqUtil;
import com.core.common.utils.MessageUtils;
import com.core.common.utils.SecurityUtils;
import com.core.system.service.ISysDictDataService;
import com.openhis.administration.domain.ChangePriceRecord;
import com.openhis.administration.dto.ChangePriceDataDto;
import com.openhis.administration.dto.ChargeItemDefDetailPriceDto;
import com.openhis.administration.dto.HealthcareDto;
import com.openhis.administration.dto.OrgDataDto;
import com.openhis.administration.service.*;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.*;
import com.openhis.common.utils.EnumUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.common.utils.RedisKeys;
import com.openhis.common.utils.RedisUtil;
import com.openhis.medication.service.IMedicationService;
import com.openhis.web.adjustprice.appservice.IAdjustPriceService;
import com.openhis.web.adjustprice.dto.AdjustPriceDataVo;
import com.openhis.web.adjustprice.dto.AdjustPriceManagerSearchParam;
import com.openhis.web.adjustprice.dto.ChangePricePageDto;
import com.openhis.web.adjustprice.mapper.AdjustPriceMapper;
import com.openhis.web.inventorymanage.dto.InventorySearchParam;
import com.openhis.workflow.dto.ActivityDto;
import com.openhis.workflow.dto.AdjustPriceDto;
import com.openhis.workflow.service.IActivityDefinitionService;
import com.openhis.workflow.service.IInventoryItemService;
/**
* @ClassName AdjustPriceServiceImpl
* @Description 调价业务实现
* @Author raymond
* @Date 2025/10/15 16:10
* @Version 1.0
**/
@Service
public class AdjustPriceServiceImpl implements IAdjustPriceService {
@Resource
private IInventoryItemService inventoryItemService;
@Resource
private IActivityDefinitionService activityDefinitionService;
@Resource
private IHealthcareServiceService healthcareServiceService;
@Resource
private IMedicationService medicationService;
@Resource
private AdjustPriceMapper adjustPriceMapper;
@Resource
private IDeviceDefinitionService deviceDefinitionService;
@Resource
private IOrganizationService organizationService;
@Resource
private IChargeItemDefinitionService chargeItemDefinitionService;
@Resource
private IChangePriceRecordService changePriceRecordService;
@Resource
private ISysDictDataService sysDictDataService;
@Resource
private AssignSeqUtil assignSeqUtil;
@Resource
private RedisUtil redisUtil;
@Override
@Transactional(rollbackFor = Exception.class)
public R<?> submitChangePriceData(List<AdjustPriceDataVo> dataVoList) {
if (dataVoList.isEmpty()) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.AdjustPrice.M00001, null));
}
if (dataVoList.stream()
.anyMatch(data -> this.redisUtil.hasKey(RedisKeys.getProductsKey(data.getItemId().toString())))) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.AdjustPrice.M00002, null));
}
//获取数据中的类型
Integer categoryType = dataVoList.get(0).getCategoryType();
// 单据号
String busNo = assignSeqUtil.getSeqByDay(AssignSeqEnum.CHANGE_PRICE_BUZ.getPrefix());
// 当前人
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
// 根据表单提交的tab 进入不同的 execute
if (AdjustPriceEnum.MEDICINE.getCode().equals(categoryType)
|| AdjustPriceEnum.CONSUMABLES.getCode().equals(categoryType)) {
//如果是 药品或者是耗材 因为药品和耗材的价格取的是 charge_detail表
this.executeChangePriceForMedication(dataVoList, busNo, practitionerId, categoryType);
} else if (AdjustPriceEnum.DIAGNOSIS.getCode().equals(categoryType)) {
//如果是 如果是 诊疗, 取价格主表
this.executeChangePriceForActivity(dataVoList, busNo, practitionerId);
} else {
//如果是 如果是 挂号, 取价格主表
this.executeChangePriceForHealth(dataVoList, busNo, practitionerId);
}
return R.ok();
}
@Override
public R<?> submitExamineChangePriceData(List<AdjustPriceDataVo> dataVoList) {
if (dataVoList.isEmpty()) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.AdjustPrice.M00001, null));
}
if (dataVoList.stream()
.anyMatch(data -> this.redisUtil.hasKey(RedisKeys.getProductsKey(data.getItemId().toString())))) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.AdjustPrice.M00002, null));
}
//获取数据中的类型
Integer categoryType = dataVoList.get(0).getCategoryType();
// 单据号
String busNo = assignSeqUtil.getSeqByDay(AssignSeqEnum.CHANGE_PRICE_BUZ.getPrefix());
// 当前人
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
// 根据表单提交的tab 进入不同的 execute
if (AdjustPriceEnum.MEDICINE.getCode().equals(categoryType)
|| AdjustPriceEnum.CONSUMABLES.getCode().equals(categoryType)) {
this.executeChangePriceForMedicationExamine(dataVoList, busNo, practitionerId, categoryType);
} else if (AdjustPriceEnum.DIAGNOSIS.getCode().equals(categoryType)) {
this.executeChangePriceForActivityExamine(dataVoList, busNo, practitionerId);
} else {
this.executeChangePriceForHealthExamine(dataVoList, busNo, practitionerId);
}
return R.ok();
}
@Override
public R<?> searchKeyWordDataListByMed(String searchKey) {
//如果 searchKey == null 默认返回10条反则 查询所有
return R.ok(this.medicationService.searchMedListByKeyWord(searchKey));
}
@Override
public R<?> searchKeyWordDataListByDevice(String searchKey) {
//如果 searchKey == null 默认返回10条反则 查询所有
return R.ok(this.deviceDefinitionService.searchDeviceListByKeyWord(searchKey));
}
@Override
public R<?> searchKeyWordDataListByActivity(String searchKey) {
//如果 searchKey == null 默认返回10条反则 查询所有
return R.ok(this.activityDefinitionService.searchActivityListByKeyWord(searchKey));
}
@Override
public R<?> searchChangePriceSubmitDataToPage(AdjustPriceManagerSearchParam adjustPriceManagerSearchParam,
Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request) {
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
HashSet<String> searchFields = new HashSet<>();
searchFields.add(CommonConstants.FieldName.BusNo);
// 构建查询条件
QueryWrapper<InventorySearchParam> queryWrapper =
HisQueryUtils.buildQueryWrapper(adjustPriceManagerSearchParam, searchKey, searchFields, request);
// 查询入库单据分页列表
Page<ChangePricePageDto> changePricePageDtoPage = this.adjustPriceMapper.searchChangePriceDataToPage(
new Page<>(pageNo, pageSize), queryWrapper, SupplyType.REQUEST_MEDICATION_CHANGE_PRICE.getValue(),
SupplyType.REQUEST_DEVICE_CHANGE_PRICE.getValue(), SupplyType.REQUEST_ACTIVITY_CHANGE_PRICE.getValue(),
SupplyType.REQUEST_HEALTH_CHANGE_PRICE.getValue(), practitionerId);
changePricePageDtoPage.getRecords().forEach(e -> {
e.setStatusEnum_enumText(EnumUtils.getInfoByValue(SupplyStatus.class, e.getStatusEnum()));
e.setCategoryEnum_enumText(EnumUtils.getInfoByValue(SupplyType.class, e.getItemCategoryEnum()));
});
return R.ok(changePricePageDtoPage);
}
@Override
public R<?> searchChangePriceDataByMed(String busNo) {
// 根据 单据号 查询 药品详情
List<ChangePriceDataDto> dataList = this.changePriceRecordService.searchMedChangePriceByBusNo(busNo,
SupplyType.REQUEST_MEDICATION_CHANGE_PRICE.getValue(), null);
// 获取 药品的单位
for (ChangePriceDataDto changePriceDataDto : dataList) {
SysDictData sysDictData =
sysDictDataService.selectDictInfo(CommonConstants.FieldName.UnitCode, changePriceDataDto.getUnitCode());
changePriceDataDto.setLabel(sysDictData.getDictLabel());
}
return R.ok(dataList);
}
@Override
public R<?> searchChangePriceDataByDevice(String busNo) {
//根据 单据号 耗材调价单详情
return R.ok(this.changePriceRecordService.searchDeviceChangePriceByBusNo(busNo,
SupplyType.REQUEST_DEVICE_CHANGE_PRICE.getValue(), null));
}
@Override
public R<?> searchChangePriceDataByActivity(String busNo) {
//根据 单据号 查询 诊疗调价单详情
return R.ok(this.changePriceRecordService.searchActivityChangePriceByBusNo(busNo,
SupplyType.REQUEST_ACTIVITY_CHANGE_PRICE.getValue(), null));
}
@Override
public R<?> searchChangePriceDataByHealth(String busNo) {
//根据 单据号 挂号调价单详情
return R.ok(this.changePriceRecordService.searchHealthChangePriceByBusNo(busNo,
SupplyType.REQUEST_HEALTH_CHANGE_PRICE.getValue(), null));
}
@Override
public R<?> cancelChangePriceData(String busNo) {
//根据 单据号查询出 当前所有请求调价的数据集
List<ChangePriceRecord> changePriceRecordList =
this.changePriceRecordService.searchChangePriceDataForBusNo(busNo);
//循环数据集合,将状态修改为 无效状态
for (ChangePriceRecord data : changePriceRecordList) {
ChangePriceRecord changePriceRecord = this.changePriceRecordService.getById(data.getId());
changePriceRecord.setStatusEnum(SupplyStatus.EXPIRED_INVALIDATED.getValue());
this.changePriceRecordService.updateById(changePriceRecord);
}
return R.ok();
}
@Override
public R<?> searchAllOrgData() {
//查询所有科室
List<OrgDataDto> orgDataList = this.organizationService.searchOrgDataByHealth();
return R.ok(orgDataList);
}
@Override
public R<?> searchHealthData(Long orgId) {
//根据科室ID 查询所有号源
return R.ok(this.healthcareServiceService.searchAllHeathData(orgId,PublicationStatus.ACTIVE.getValue()));
}
@Override
public R<?> updateExamineByApproval(String busNo) {
//根据调价单编号 查询 分组后的 数据
List<ChangePriceRecord> changePriceRecordList =
this.changePriceRecordService.searchChangePriceDataGroupByBusNo(busNo);
if (!changePriceRecordList.isEmpty()) {
// 循环将数据进行填充
for (ChangePriceRecord data : changePriceRecordList) {
//提交 审批时,查看是否有正在审核中的 货品数据 。根据 货品ID 从redis中查询
if (this.redisUtil.hasKey(RedisKeys.getProductsKey(data.getItemId().toString()))) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.AdjustPrice.M00002, null));
}
//如果不存在向redis中插入 药品信息 = 给当前 货品上锁 。审批通过或驳回后 释放
this.redisUtil.set(RedisKeys.getProductsKey(data.getItemId().toString()), data.getItemId());
}
//根据 busNo 修改调价单状态
this.changePriceRecordService.submitApproval(busNo);
}
return R.ok();
}
@Override
public R<?> checkMedApprovalExist(Long itemId) {
//添加 货品调价时,先查询 当前货品是否在 审核中,如果在,不允许改价。
return this.changePriceRecordService.searchMedChangePriceByItemId(itemId,
SupplyType.REQUEST_MEDICATION_CHANGE_PRICE.getValue(), SupplyStatus.APPROVAL.getValue()).isEmpty() ? R.ok()
: R.fail(MessageUtils.createMessage(PromptMsgConstant.AdjustPrice.M00002, null));
}
@Override
public R<?> checkDeviceApprovalExist(Long itemId) {
//添加 货品调价时,先查询 当前货品是否在 审核中,如果在,不允许改价。
return this.changePriceRecordService.searchDeviceChangePriceByItemId(itemId,
SupplyType.REQUEST_DEVICE_CHANGE_PRICE.getValue(), SupplyStatus.APPROVAL.getValue()).isEmpty() ? R.ok()
: R.fail(MessageUtils.createMessage(PromptMsgConstant.AdjustPrice.M00002, null));
}
@Override
public R<?> checkActivityApprovalExist(Long itemId) {
//添加 货品调价时,先查询 当前货品是否在 审核中,如果在,不允许改价。
return this.changePriceRecordService.searchActivityChangePriceByItemId(itemId,
SupplyType.REQUEST_ACTIVITY_CHANGE_PRICE.getValue(), SupplyStatus.APPROVAL.getValue()).isEmpty() ? R.ok()
: R.fail(MessageUtils.createMessage(PromptMsgConstant.AdjustPrice.M00002, null));
}
@Override
public R<?> checkHealthApprovalExist(Long itemId) {
//添加 货品调价时,先查询 当前货品是否在 审核中,如果在,不允许改价。
return this.changePriceRecordService.searchHealthChangePriceByItemId(itemId,
SupplyType.REQUEST_HEALTH_CHANGE_PRICE.getValue(), SupplyStatus.APPROVAL.getValue()).isEmpty() ? R.ok()
: R.fail(MessageUtils.createMessage(PromptMsgConstant.AdjustPrice.M00002, null));
}
public boolean executeChangePriceForMedication(List<AdjustPriceDataVo> dataVoList, String busNo,
Long practitionerId, Integer categoryType) {
// 有库存的药品或耗材集合
List<AdjustPriceDataVo> resultList = new LinkedList<>();
// 从map中将表单集合取出
Map<Long, AdjustPriceDataVo> dataVoMap = this.executeMap(dataVoList);
//根据表单中的id数组 加载库存集合
List<AdjustPriceDto> inventoryItemList =
this.inventoryItemService.searchResultDataList(this.executeItemIds(dataVoList));
for (AdjustPriceDto data : inventoryItemList) {
AdjustPriceDataVo dataVo = new AdjustPriceDataVo();
dataVo.setTotalQuantity(data.getTotalCount());
dataVo.setItemTable(data.getItemTable());
dataVo.setItemId(data.getItemId());
dataVo.setNewBuyingPrice(dataVoMap.get(data.getItemId()).getNewBuyingPrice());
dataVo.setNewRetailPrice(dataVoMap.get(data.getItemId()).getNewRetailPrice());
dataVo.setReason(dataVoMap.get(data.getItemId()).getReason());
dataVo.setUnitCode(dataVoMap.get(data.getItemId()).getUnitCode());
dataVo.setLotNumber(data.getLotNumber());
dataVo.setLocationId(data.getLocationId());
resultList.add(dataVo);
}
//填充 ChangePriceRecord 对象返回list进行批量添加
List<ChangePriceRecord> changePriceRecords =
this.executeChangePriceData(busNo, practitionerId, resultList, SupplyStatus.PENDING_APPROVAL.getValue(),
AdjustPriceEnum.MEDICINE.getCode().equals(categoryType)
? SupplyType.REQUEST_MEDICATION_CHANGE_PRICE.getValue()
: SupplyType.REQUEST_DEVICE_CHANGE_PRICE.getValue());
return this.changePriceRecordService.saveOrUpdateBatch(changePriceRecords);
}
public boolean executeChangePriceForMedicationExamine(List<AdjustPriceDataVo> dataVoList, String busNo,
Long practitionerId, Integer categoryType) {
// 有库存的药品或耗材集合
List<AdjustPriceDataVo> resultList = new LinkedList<>();
Map<Long, AdjustPriceDataVo> dataVoMap = this.executeMap(dataVoList);
List<AdjustPriceDto> inventoryItemList =
this.inventoryItemService.searchResultDataList(this.executeItemIds(dataVoList));
for (AdjustPriceDto data : inventoryItemList) {
AdjustPriceDataVo dataVo = new AdjustPriceDataVo();
dataVo.setTotalQuantity(data.getTotalCount());
dataVo.setItemTable(data.getItemTable());
dataVo.setItemId(data.getItemId());
dataVo.setNewBuyingPrice(dataVoMap.get(data.getItemId()).getNewBuyingPrice());
dataVo.setNewRetailPrice(dataVoMap.get(data.getItemId()).getNewRetailPrice());
dataVo.setReason(dataVoMap.get(data.getItemId()).getReason());
dataVo.setUnitCode(dataVoMap.get(data.getItemId()).getUnitCode());
dataVo.setLotNumber(data.getLotNumber());
dataVo.setLocationId(data.getLocationId());
resultList.add(dataVo);
this.redisUtil.set(RedisKeys.getProductsKey(data.getItemId().toString()), data.getItemId());
}
//填充 ChangePriceRecord 对象返回list进行批量添加
List<ChangePriceRecord> changePriceRecords =
this.executeChangePriceData(busNo, practitionerId, resultList, SupplyStatus.APPROVAL.getValue(),
AdjustPriceEnum.MEDICINE.getCode().equals(categoryType)
? SupplyType.REQUEST_MEDICATION_CHANGE_PRICE.getValue()
: SupplyType.REQUEST_DEVICE_CHANGE_PRICE.getValue());
return this.changePriceRecordService.saveOrUpdateBatch(changePriceRecords);
}
public boolean executeChangePriceForActivity(List<AdjustPriceDataVo> dataVoList, String busNo,
Long practitionerId) {
List<ActivityDto> dataDtoList =
this.activityDefinitionService.searchActivityDefinitionByIds(this.executeItemIds(dataVoList));
Map<Long, AdjustPriceDataVo> dataVoMap = this.executeMap(dataVoList);
List<AdjustPriceDataVo> resultList = new LinkedList<>();
for (ActivityDto data : dataDtoList) {
AdjustPriceDataVo dataVo = new AdjustPriceDataVo();
dataVo.setItemTable(CommonConstants.TableName.WOR_ACTIVITY_DEFINITION);
dataVo.setName(data.getName());
dataVo.setItemId(data.getItemId());
dataVo.setNewBuyingPrice(dataVoMap.get(data.getItemId()).getNewBuyingPrice());
dataVo.setNewRetailPrice(dataVoMap.get(data.getItemId()).getNewRetailPrice());
dataVo.setReason(dataVoMap.get(data.getItemId()).getReason());
dataVo.setLotNumber(dataVoMap.get(data.getItemId()).getLotNumber());
resultList.add(dataVo);
}
//填充 ChangePriceRecord 对象返回list进行批量添加
List<ChangePriceRecord> changePriceRecords = this.executeChangePriceData(busNo, practitionerId, resultList,
SupplyStatus.PENDING_APPROVAL.getValue(), SupplyType.REQUEST_ACTIVITY_CHANGE_PRICE.getValue());
return this.changePriceRecordService.saveOrUpdateBatch(changePriceRecords);
}
/**
* Desc: 处理申请 诊疗改价业务申请
*
* @param dataVoList
* @Author raymond
* @Date 11:19 2025/10/18
* @return boolean
**/
public boolean executeChangePriceForActivityExamine(List<AdjustPriceDataVo> dataVoList, String busNo,
Long practitionerId) {
List<ActivityDto> dataDtoList =
this.activityDefinitionService.searchActivityDefinitionByIds(this.executeItemIds(dataVoList));
Map<Long, AdjustPriceDataVo> dataVoMap = this.executeMap(dataVoList);
List<AdjustPriceDataVo> resultList = new LinkedList<>();
for (ActivityDto data : dataDtoList) {
AdjustPriceDataVo dataVo = new AdjustPriceDataVo();
dataVo.setItemTable(CommonConstants.TableName.WOR_ACTIVITY_DEFINITION);
dataVo.setName(data.getName());
dataVo.setItemId(data.getItemId());
dataVo.setNewBuyingPrice(dataVoMap.get(data.getItemId()).getNewBuyingPrice());
dataVo.setNewRetailPrice(dataVoMap.get(data.getItemId()).getNewRetailPrice());
dataVo.setReason(dataVoMap.get(data.getItemId()).getReason());
dataVo.setLotNumber(dataVoMap.get(data.getItemId()).getLotNumber());
resultList.add(dataVo);
this.redisUtil.set(RedisKeys.getProductsKey(data.getItemId().toString()), data.getItemId());
}
//填充 ChangePriceRecord 对象返回list进行批量添加
List<ChangePriceRecord> changePriceRecords = this.executeChangePriceData(busNo, practitionerId, resultList,
SupplyStatus.APPROVAL.getValue(), SupplyType.REQUEST_ACTIVITY_CHANGE_PRICE.getValue());
return this.changePriceRecordService.saveOrUpdateBatch(changePriceRecords);
}
/**
* Desc: 处理申请 挂号改价业务
*
* @param dataVoList
* @Author raymond
* @Date 11:20 2025/10/18
* @return boolean
**/
public boolean executeChangePriceForHealth(List<AdjustPriceDataVo> dataVoList, String busNo, Long practitionerId) {
List<HealthcareDto> dataDtoList =
this.healthcareServiceService.searchHealthByIds(this.executeItemIds(dataVoList));
List<AdjustPriceDataVo> resultList = new LinkedList<>();
Map<Long, AdjustPriceDataVo> dataVoMap = this.executeMap(dataVoList);
for (HealthcareDto data : dataDtoList) {
AdjustPriceDataVo dataVo = new AdjustPriceDataVo();
dataVo.setItemTable(CommonConstants.TableName.ADM_HEALTHCARE_SERVICE);
dataVo.setItemId(data.getItemId());
dataVo.setName(data.getName());
dataVo.setNewBuyingPrice(dataVoMap.get(data.getItemId()).getNewBuyingPrice());
dataVo.setNewRetailPrice(dataVoMap.get(data.getItemId()).getNewRetailPrice());
dataVo.setReason(dataVoMap.get(data.getItemId()).getReason());
dataVo.setLotNumber(dataVoMap.get(data.getItemId()).getLotNumber());
resultList.add(dataVo);
}
//填充 ChangePriceRecord 对象返回list进行批量添加 supply_request表共享了 审核状态和 category 枚举
List<ChangePriceRecord> changePriceRecords = this.executeChangePriceData(busNo, practitionerId, resultList,
SupplyStatus.PENDING_APPROVAL.getValue(), SupplyType.REQUEST_HEALTH_CHANGE_PRICE.getValue());
return this.changePriceRecordService.saveOrUpdateBatch(changePriceRecords);
}
/**
* Desc: 处理申请 挂号改价业务
*
* @param dataVoList
* @Author raymond
* @Date 11:20 2025/10/18
* @return boolean
**/
public boolean executeChangePriceForHealthExamine(List<AdjustPriceDataVo> dataVoList, String busNo,
Long practitionerId) {
List<HealthcareDto> dataDtoList =
this.healthcareServiceService.searchHealthByIds(this.executeItemIds(dataVoList));
List<AdjustPriceDataVo> resultList = new LinkedList<>();
Map<Long, AdjustPriceDataVo> dataVoMap = this.executeMap(dataVoList);
for (HealthcareDto data : dataDtoList) {
AdjustPriceDataVo dataVo = new AdjustPriceDataVo();
dataVo.setItemTable(CommonConstants.TableName.ADM_HEALTHCARE_SERVICE);
dataVo.setItemId(data.getItemId());
dataVo.setName(data.getName());
dataVo.setNewBuyingPrice(dataVoMap.get(data.getItemId()).getNewBuyingPrice());
dataVo.setNewRetailPrice(dataVoMap.get(data.getItemId()).getNewRetailPrice());
dataVo.setReason(dataVoMap.get(data.getItemId()).getReason());
dataVo.setLotNumber(dataVoMap.get(data.getItemId()).getLotNumber());
resultList.add(dataVo);
this.redisUtil.set(RedisKeys.getProductsKey(data.getItemId().toString()), data.getItemId());
}
//填充 ChangePriceRecord 对象返回list进行批量添加 supply_request表共享了 审核状态和 category 枚举
List<ChangePriceRecord> changePriceRecords = this.executeChangePriceData(busNo, practitionerId, resultList,
SupplyStatus.APPROVAL.getValue(), SupplyType.REQUEST_HEALTH_CHANGE_PRICE.getValue());
return this.changePriceRecordService.saveOrUpdateBatch(changePriceRecords);
}
/**
* Desc: 封装对象数据
*
* @param busNo
* @param curUserId
* @param itemList
* @Author raymond
* @Date 09:35 2025/10/18
* @return java.util.List<com.openhis.workflow.domain.ChangePriceRecord>
**/
public List<ChangePriceRecord> executeChangePriceData(String busNo, Long curUserId,
List<AdjustPriceDataVo> itemList, Integer statusEnum, Integer categoryEnum) {
List<ChangePriceRecord> srList = new LinkedList<>();
for (AdjustPriceDataVo dataVo : itemList) {
ChangePriceRecord cpr = new ChangePriceRecord();
//如果是 药品调价
if (SupplyType.REQUEST_MEDICATION_CHANGE_PRICE.getValue().equals(categoryEnum)) {
// 获取当前进货价
ChargeItemDefDetailPriceDto buyingPriceDto = this.chargeItemDefinitionService
.getMedPriceByParam(ConditionCode.LOT_NUMBER_COST.getCode(), dataVo.getItemId());
// 获取当前零售价
ChargeItemDefDetailPriceDto retailPriceDto = this.chargeItemDefinitionService
.getMedPriceByParam(ConditionCode.LOT_NUMBER_PRICE.getCode(), dataVo.getItemId());
if (buyingPriceDto != null || retailPriceDto != null) {
// 库存 以最小单位存储,以货品最小单位进行计算
BigDecimal partPercent =
dataVo.getTotalQuantity().divide(buyingPriceDto.getPartPercent(), 6, RoundingMode.HALF_UP);
//进货价盈负差
BigDecimal buyingDiffPrice =
dataVo.getNewBuyingPrice().subtract(buyingPriceDto.getPrice()).multiply(partPercent);
// 零售价盈负差
BigDecimal retailDiffPrice =
dataVo.getNewRetailPrice().subtract(retailPriceDto.getPrice()).multiply(partPercent);
//填充 change_price_record表数据
cpr.setNewBuyingPrice(dataVo.getNewBuyingPrice()).setNewRetailPrice(dataVo.getNewRetailPrice())
.setItemQuantity(dataVo.getTotalQuantity()).setItemId(dataVo.getItemId())
.setItemTable(dataVo.getItemTable()).setReason(dataVo.getReason()).setBusNo(busNo)
.setApplicantId(curUserId).setStatusEnum(statusEnum).setItemCategoryEnum(categoryEnum)
.setLotNumber(dataVo.getLotNumber()).setUnitCode(dataVo.getUnitCode())
.setOriginBuyingPrice(buyingPriceDto.getPrice()).setOriginRetailPrice(retailPriceDto.getPrice())
.setDifferenceBuyingPrice(buyingDiffPrice).setDifferenceRetailPrice(retailDiffPrice)
.setApplicantTime(SupplyStatus.APPROVAL.getValue().equals(statusEnum) ? new Date() : null);
srList.add(cpr);
} //如果是 耗材调价
} else if (SupplyType.REQUEST_DEVICE_CHANGE_PRICE.getValue().equals(categoryEnum)) {
// 获取当前进货价
ChargeItemDefDetailPriceDto buyingPriceDto = this.chargeItemDefinitionService
.getDevicePriceByParam(ConditionCode.LOT_NUMBER_COST.getCode(), dataVo.getItemId());
// 获取当前零售价
ChargeItemDefDetailPriceDto retailPriceDto = this.chargeItemDefinitionService
.getDevicePriceByParam(ConditionCode.LOT_NUMBER_PRICE.getCode(), dataVo.getItemId());
if (buyingPriceDto != null || retailPriceDto != null) {
// 库存 以最小单位存储,以货品最小单位进行计算
BigDecimal partPercent =
dataVo.getTotalQuantity().divide(buyingPriceDto.getPartPercent(), 6, RoundingMode.HALF_UP);
//进货价盈负差
BigDecimal buyingDiffPrice =
dataVo.getNewBuyingPrice().subtract(buyingPriceDto.getPrice()).multiply(partPercent);
// 零售价盈负差
BigDecimal retailDiffPrice =
dataVo.getNewRetailPrice().subtract(retailPriceDto.getPrice()).multiply(partPercent);
//填充 change_price_record表数据
cpr.setNewBuyingPrice(dataVo.getNewBuyingPrice()).setNewRetailPrice(dataVo.getNewRetailPrice())
.setItemQuantity(dataVo.getTotalQuantity()).setItemId(dataVo.getItemId()).setLocationId(dataVo.getLocationId())
.setItemTable(dataVo.getItemTable()).setReason(dataVo.getReason()).setBusNo(busNo)
.setApplicantId(curUserId).setStatusEnum(statusEnum).setItemCategoryEnum(categoryEnum)
.setLotNumber(dataVo.getLotNumber()).setUnitCode(dataVo.getUnitCode())
.setOriginBuyingPrice(buyingPriceDto.getPrice()).setOriginRetailPrice(retailPriceDto.getPrice())
.setDifferenceBuyingPrice(buyingDiffPrice).setDifferenceRetailPrice(retailDiffPrice)
.setApplicantTime(SupplyStatus.APPROVAL.getValue().equals(statusEnum) ? new Date() : null);
srList.add(cpr);
}
} else {//如果是 诊疗或者挂号调价,诊疗和耗材 没有库存
ChargeItemDefDetailPriceDto retailPriceDto = this.chargeItemDefinitionService
.getProductPrice(PublicationStatus.ACTIVE.getValue(), dataVo.getItemId());
if (retailPriceDto != null) {
//新价格 - 原价格
BigDecimal retailDiffPrice = dataVo.getNewRetailPrice().subtract(retailPriceDto.getPrice());
//填充 change_price_record表数据
cpr.setNewBuyingPrice(dataVo.getNewBuyingPrice()).setNewRetailPrice(dataVo.getNewRetailPrice())
.setItemQuantity(dataVo.getTotalQuantity()).setItemId(dataVo.getItemId())
.setItemTable(dataVo.getItemTable()).setReason(dataVo.getReason()).setBusNo(busNo)
.setApplicantId(curUserId).setStatusEnum(statusEnum).setItemCategoryEnum(categoryEnum)
.setLotNumber(dataVo.getLotNumber()).setUnitCode(dataVo.getUnitCode())
.setOriginRetailPrice(retailPriceDto.getPrice()).setDifferenceRetailPrice(retailDiffPrice)
.setApplicantTime(SupplyStatus.APPROVAL.getValue().equals(statusEnum) ? new Date() : null);
srList.add(cpr);
}
}
}
return srList;
}
/**
* Desc: 封装获取药品和耗材的id数组
*
* @param dataVoList
* @Author raymond
* @Date 08:03 2025/10/18
* @return java.util.List<java.lang.Long>
**/
public List<Long> executeItemIds(List<AdjustPriceDataVo> dataVoList) {
List<Long> itemIds = new LinkedList<>();
for (AdjustPriceDataVo data : dataVoList) {
itemIds.add(data.getItemId());
}
return itemIds;
}
/**
* Desc: 存储表单数据
* @param dataVoList
* @Author raymond
* @Date 10:28 2025/11/5
* @return java.util.Map<java.lang.Long,com.openhis.web.adjustprice.dto.AdjustPriceDataVo>
**/
public Map<Long, AdjustPriceDataVo> executeMap(List<AdjustPriceDataVo> dataVoList) {
Map<Long, AdjustPriceDataVo> map = new ConcurrentHashMap<>();
for (AdjustPriceDataVo data : dataVoList) {
map.put(data.getItemId(), data);
}
return map;
}
}

View File

@@ -0,0 +1,183 @@
package com.openhis.web.adjustprice.controller;
import com.core.common.core.domain.R;
import com.core.common.enums.TenantOptionDict;
import com.core.web.util.TenantOptionUtil;
import com.openhis.common.enums.OrderPricingSource;
import com.openhis.web.adjustprice.appservice.IAdjustPriceService;
import com.openhis.web.adjustprice.dto.AdjustPriceDataVo;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* @ClassName ChargePriceController
* @Description 调价修改药品、耗材、诊疗、挂号接口类
* @Author raymond
* @Date 2025/10/14 16:56
* @Version 1.0
**/
@RestController
@RequestMapping("/change/price")
public class ChangePriceController {
@Resource
private IAdjustPriceService adjustPriceService;
/**
* Desc: 根据关键词搜索数据
*
* @param
* @return com.core.common.core.domain.R<?>
* @Author raymond
* @Date 09:26 2025/10/20
**/
@PostMapping(value = "searchKeyWordDataListByMed")
public R<?> searchKeyWordDataListByMed(@RequestParam(name = "searchKey", required = false) String searchKey) {
return R.ok(this.adjustPriceService.searchKeyWordDataListByMed(searchKey));
}
/**
* Desc: 根据关键词搜索数据
*
* @param
* @return com.core.common.core.domain.R<?>
* @Author raymond
* @Date 09:26 2025/10/20
**/
@PostMapping(value = "searchKeyWordDataListByDevice")
public R<?> searchKeyWordDataListByDevice(@RequestParam(name = "searchKey", required = false) String searchKey) {
return R.ok(this.adjustPriceService.searchKeyWordDataListByDevice(searchKey));
}
/**
* Desc: 根据关键词搜索数据
*
* @param
* @return com.core.common.core.domain.R<?>
* @Author raymond
* @Date 09:26 2025/10/20
**/
@PostMapping(value = "searchKeyWordDataListByActivity")
public R<?> searchKeyWordDataListByActivity(@RequestParam(name = "searchKey", required = false) String searchKey) {
return R.ok(this.adjustPriceService.searchKeyWordDataListByActivity(searchKey));
}
/**
* Desc: 查询所有 有挂号信息的科室
*
* @param
* @return com.core.common.core.domain.R<?>
* @Author raymond
* @Date 08:38 2025/10/22
**/
@PostMapping(value = "searchAllOrgData")
public R<?> searchAllOrgData() {
return this.adjustPriceService.searchAllOrgData();
}
/**
* Desc: 根据科室id 加载 挂号信息
*
* @param orgId
* @return com.core.common.core.domain.R<?>
* @Author raymond
* @Date 16:46 2025/10/22
**/
@PostMapping(value = "searchHealthData")
public R<?> searchHealthData(@RequestParam Long orgId) {
return this.adjustPriceService.searchHealthData(orgId);
}
/**
* Desc: 保存 改价数据
*
* @return com.core.common.core.domain.R<?>
* @Author raymond
* @Date 08:47 2025/10/15
**/
@PostMapping(value = "commitChangePriceData")
public R<?> commitChangePriceData(@RequestBody List<AdjustPriceDataVo> dataVoList) {
return adjustPriceService.submitChangePriceData(dataVoList);
}
/**
* Desc: 根据供应商和药品名称加载要修改的药品数据
*
* @return com.core.common.core.domain.R<?>
* @Author raymond
* @Date 08:47 2025/10/15
**/
@PostMapping(value = "submitExamineChangePriceData")
public R<?> submitExamineChangePriceData(@RequestBody List<AdjustPriceDataVo> dataVoList) {
return adjustPriceService.submitExamineChangePriceData(dataVoList);
}
/**
* Desc: 根据货品ID 查询是否有审核中的药品数据
*
* @param itemId
* @return com.core.common.core.domain.R<?>
* @Author raymond
* @Date 17:32 2025/11/3
**/
@PostMapping(value = "checkMedApprovalExist")
public R<?> checkMedApprovalExist(@RequestParam Long itemId) {
return this.adjustPriceService.checkMedApprovalExist(itemId);
}
/**
* Desc: 根据货品ID 查询是否有审核中的药品数据
*
* @param itemId
* @return com.core.common.core.domain.R<?>
* @Author raymond
* @Date 17:32 2025/11/3
**/
@PostMapping(value = "checkDeviceApprovalExist")
public R<?> checkDeviceApprovalExist(@RequestParam Long itemId) {
return this.adjustPriceService.checkDeviceApprovalExist(itemId);
}
/**
* Desc: 根据货品ID 查询是否有审核中的药品数据
*
* @param itemId
* @return com.core.common.core.domain.R<?>
* @Author raymond
* @Date 17:32 2025/11/3
**/
@PostMapping(value = "checkActivityApprovalExist")
public R<?> checkActivityApprovalExist(@RequestParam Long itemId) {
return this.adjustPriceService.checkActivityApprovalExist(itemId);
}
/**
* Desc: 根据货品ID 查询是否有审核中的药品数据
*
* @param itemId
* @return com.core.common.core.domain.R<?>
* @Author raymond
* @Date 17:32 2025/11/3
**/
@PostMapping(value = "checkHealthApprovalExist")
public R<?> checkHealthApprovalExist(@RequestParam Long itemId) {
return this.adjustPriceService.checkHealthApprovalExist(itemId);
}
/**
* Desc: 查询调价控制开关状态接口
*
* @return true:统一零售价 , false:按批次号售卖
**/
@GetMapping(value = "getAdjustPriceSwitchState")
public R<?> getAdjustPriceSwitchState() {
// 医嘱定价来源
String orderPricingSource = TenantOptionUtil.getOptionContent(TenantOptionDict.ORDER_PRICING_SOURCE);
if (OrderPricingSource.RETAIL_PRICE.getCode().equals(orderPricingSource)) {
return R.ok(true);
}
return R.ok(false);
}
}

View File

@@ -0,0 +1,153 @@
package com.openhis.web.adjustprice.controller;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.*;
import com.core.common.core.domain.R;
import com.core.common.utils.StringUtils;
import com.openhis.web.adjustprice.appservice.IAdjustPriceService;
import com.openhis.web.adjustprice.dto.AdjustPriceDataVo;
import com.openhis.web.adjustprice.dto.AdjustPriceManagerSearchParam;
/**
* @ClassName ChangePriceListPageController
* @Description TODO
* @Author raymond
* @Date 2025/10/23 15:16
* @Version 1.0
**/
@RestController
@RequestMapping("/change/price/list")
public class ChangePriceDataListPageController {
@Resource
private IAdjustPriceService adjustPriceService;
/**
* Desc: 查询 调价管理列表页面 分页查询当前人 提交的调价单
*
* @param adjustPriceManagerSearchParam
* @param pageNo
* @param pageSize
* @param searchKey
* @param request
* @Author raymond
* @Date 15:47 2025/10/23
* @return com.core.common.core.domain.R<?>
**/
@GetMapping(value = "getPage")
public R<?> getPage(AdjustPriceManagerSearchParam adjustPriceManagerSearchParam,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
@RequestParam(name = "searchKey", required = false) String searchKey, HttpServletRequest request) {
return this.adjustPriceService.searchChangePriceSubmitDataToPage(adjustPriceManagerSearchParam, pageNo,
pageSize, searchKey, request);
}
/**
* Desc: 根据单据号 进行提交审核操作
*
* @param busNo
* @Author raymond
* @Date 09:38 2025/10/23
* @return com.core.common.core.domain.R<?>
**/
@PostMapping(value = "updateStatusByApproval")
public R<?> updateStatusByApproval(@RequestParam String busNo) {
return this.adjustPriceService.updateExamineByApproval(busNo);
}
/**
* Desc: 作废 调价单数据
*
* @param busNo
* @Author raymond
* @Date 14:47 2025/10/21
* @return com.core.common.core.domain.R<?>
**/
@PostMapping(value = "cancelChangePriceData")
public R<?> cancelChangePriceData(@RequestParam String busNo) {
return this.adjustPriceService.cancelChangePriceData(busNo);
}
/**
* Desc: 根据供应商和药品名称加载要修改的药品数据
*
*
* @Author raymond
* @Date 08:47 2025/10/15
* @return com.core.common.core.domain.R<?>
**/
@PostMapping(value = "submitChangePriceData")
public R<?> submitChangePriceData(@RequestBody List<AdjustPriceDataVo> dataVoList) {
return adjustPriceService.submitChangePriceData(dataVoList);
}
/**
* Desc: 根据 单据号 药品调价单 查询详情
*
* @param busNo
* @Author raymond
* @Date 12:01 2025/10/21
* @return com.core.common.core.domain.R<?>
**/
@PostMapping(value = "searchChangePriceDataByMed")
public R<?> searchChangePriceDataByMed(@RequestParam String busNo) {
if (StringUtils.isEmpty(busNo)) {
return R.fail();
}
return this.adjustPriceService.searchChangePriceDataByMed(busNo);
}
/**
* Desc: 根据 单据号 耗材调价单 查询详情
*
* @param busNo
* @Author raymond
* @Date 12:01 2025/10/21
* @return com.core.common.core.domain.R<?>
**/
@PostMapping(value = "searchChangePriceDataByDevice")
public R<?> searchChangePriceDataByDevice(@RequestParam String busNo) {
if (StringUtils.isEmpty(busNo)) {
return R.fail();
}
return this.adjustPriceService.searchChangePriceDataByDevice(busNo);
}
/**
* Desc: 根据 单据号 诊疗调价单 查询详情
*
* @param busNo
* @Author raymond
* @Date 12:01 2025/10/21
* @return com.core.common.core.domain.R<?>
**/
@PostMapping(value = "searchChangePriceDataByActivity")
public R<?> searchChangePriceDataByActivity(@RequestParam String busNo) {
if (StringUtils.isEmpty(busNo)) {
return R.fail();
}
return this.adjustPriceService.searchChangePriceDataByActivity(busNo);
}
/**
* Desc: 根据 单据号 挂号调价单 查询详情
*
* @param busNo
* @Author raymond
* @Date 12:01 2025/10/21
* @return com.core.common.core.domain.R<?>
**/
@PostMapping(value = "searchChangePriceDataByHealth")
public R<?> searchChangePriceDataByHealth(@RequestParam String busNo) {
if (StringUtils.isEmpty(busNo)) {
return R.fail();
}
return this.adjustPriceService.searchChangePriceDataByHealth(busNo);
}
}

View File

@@ -0,0 +1,72 @@
package com.openhis.web.adjustprice.dto;
import java.math.BigDecimal;
import lombok.Data;
/**
* @ClassName AdjustPriceDataVo
* @Description TODO
* @Author raymond
* @Date 2025/10/16 08:31
* @Version 1.0
**/
@Data
public class AdjustPriceDataVo {
/**
* 表ID
*/
private Long itemId;
/**
* 分类 0、药品1、耗材2、诊疗3、挂号
*/
private Integer categoryType;
/**
* 改价原因
*/
private String reason;
/**
* 新进货价
*/
private BigDecimal newBuyingPrice;
/**
* 新售价
*/
private BigDecimal newRetailPrice;
/**
* 经手人
*/
private Long practitionerId;
/**
* 每个批次影响数量
*/
private BigDecimal quantity;
/**
* 总数量
*/
private BigDecimal totalQuantity;
/**
* 表名
*/
private String itemTable;
/**
* 单据号
*/
private String busNo;
private String name;
/**
* 批次号
*/
private String lotNumber;
/**
* 单位
*/
private String unitCode;
/**
* 位置
*/
private Long locationId;
private BigDecimal finalTotalQuantity;
}

View File

@@ -0,0 +1,33 @@
package com.openhis.web.adjustprice.dto;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
/**
* @ClassName AdjustPriceManagerSearchParam
* @Description 改价管理 查询条件
* @Author raymond
* @Date 2025/10/24 16:23
* @Version 1.0
**/
@Data
@Accessors(chain = true)
public class AdjustPriceManagerSearchParam {
/** 审核状态 */
private Integer statusEnum;
/** 单据类型 */
private Integer itemCategoryEnum;
/**
* 单据时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date applicantTime;
}

View File

@@ -0,0 +1,96 @@
package com.openhis.web.adjustprice.dto;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
/**
* @ClassName ChangePricePageDto
* @Description TODO
* @Author raymond
* @Date 2025/10/31 17:35
* @Version 1.0
**/
@Data
public class ChangePriceDataDto {
/** 批次号 */
private String originLotNumber;
/** 改价申请人id */
private Long applicantId;
/** 目标枚举 药品、耗材、诊疗、挂号 */
private Integer itemCategoryEnum;
private String itemCategoryEnum_Text;
/** 药品ID、耗材ID、诊疗ID、挂号ID */
@JsonSerialize(using = ToStringSerializer.class)
private Long itemId;
/**
* 获取名称
*/
private String itemName;
/** 原进货价 */
private BigDecimal originBuyingPrice;
/** 原零售价价格 */
private BigDecimal originRetailPrice;
/** 当前品库存量 */
private BigDecimal itemQuantity;
/** 当前业务批次号 */
private String busNo;
/** 改价申请时间 */
private Date applicantTime;
/** 新进货价 */
private BigDecimal newBuyingPrice;
/** 新零售价 */
private BigDecimal newRetailPrice;
/** 物品计量单位 */
private String unitCode;
/** 审批状态 */
private Integer statusEnum;
private Integer statusEnum_Text;
/** 批次号 */
private String lotNumber;
/** 条件理由 */
private String reason;
/** 零售价盈负差*/
private BigDecimal differenceRetailPrice;
/**进货价盈负差*/
private BigDecimal differenceBuyingPrice;
/**
* 科室名称
*/
private String orgName;
/**
* 价格主表ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long chargeId;
/**
* 调价表ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long changePriceRecordId;
private String label;
/**
* 规格
*/
private String totalVolume;
}

View File

@@ -0,0 +1,67 @@
package com.openhis.web.adjustprice.dto;
import java.math.BigDecimal;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.openhis.common.annotation.Dict;
import lombok.Data;
/**
* @ClassName ChangePricePageDto
* @Description 改价业务分页dto
* @Author raymond
* @Date 2025/11/1 22:53
* @Version 1.0
**/
@Data
public class ChangePricePageDto {
/** 单据号 */
private String busNo;
/** 状态 */
private Integer statusEnum;
private String statusEnum_enumText;
/** 审批人 */
@Dict(dictCode = "id", dictText = "name", dictTable = "adm_practitioner")
private Long approverId;
private String approverId_dictText;
/** 审批时间 */
private Date approvalTime;
/** 申请人 */
@Dict(dictCode = "id", dictText = "name", dictTable = "adm_practitioner")
private Long applicantId;
private String applicantId_dictText;
/** 申请时间 */
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date applicantTime;
/** 制单日期 */
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/** 备注 */
private String reason;
/**
* 24、药品
*/
private Integer itemCategoryEnum;
private String categoryEnum_enumText;
private BigDecimal originRetailPrice;
private BigDecimal originBuyingPrice;
private BigDecimal newBuyingPrice;
private BigDecimal newRetailPrice;
}

View File

@@ -0,0 +1,155 @@
package com.openhis.web.adjustprice.mapper;
import com.openhis.web.adjustprice.dto.ChangePriceDataDto;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.openhis.web.adjustprice.dto.ChangePricePageDto;
import com.openhis.web.inventorymanage.dto.InventorySearchParam;
import com.openhis.web.inventorymanage.dto.ReceiptPageDto;
import java.util.List;
/**
* Desc:
*
* @Author raymond
* @Date 14:37 2025/10/15
* @return
**/
@Component
public interface AdjustPriceMapper {
/**
* Desc: 查询单据审批分页列表
*
* @param page
* @param queryWrapper
* @param medTypeEnum
* @param deviceTypeEnum
* @param activityTypeEnum
* @param healthTypeEnum
* @Author raymond
* @Date 16:01 2025/10/24
* @return com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.openhis.web.inventorymanage.dto.ReceiptPageDto>
**/
Page<ReceiptPageDto> selectInventoryReceiptPage(@Param("page") Page<ReceiptPageDto> page,
@Param(Constants.WRAPPER) QueryWrapper<InventorySearchParam> queryWrapper,
@Param("medTypeEnum") Integer medTypeEnum, @Param("deviceTypeEnum") Integer deviceTypeEnum,
@Param("activityTypeEnum") Integer activityTypeEnum, @Param("healthTypeEnum") Integer healthTypeEnum);
/**
* Desc: 根据当前人 ID 查询提交的调价申请记录
*
* @param page
* @param queryWrapper
* @param medCategory
* @param deviceCategory
* @param activityCategory
* @param healthCategory
* @param applicantId
* @Author raymond
* @Date 00:59 2025/11/2
* @return com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.openhis.web.adjustprice.dto.ChangePricePageDto>
**/
Page<ChangePricePageDto> searchChangePriceDataToPage(@Param("page") Page<ReceiptPageDto> page,
@Param(Constants.WRAPPER) QueryWrapper<InventorySearchParam> queryWrapper,
@Param("medCategory") Integer medCategory, @Param("deviceCategory") Integer deviceCategory,
@Param("activityCategory") Integer activityCategory, @Param("healthCategory") Integer healthCategory,
@Param("applicantId") Long applicantId);
/**
* Desc: 根据条件 查询 药品调价单
* @param busNo
* @param categoryEnum
* @param statusEnum
* @Author raymond
* @Date 09:46 2025/11/2
* @return java.util.List<com.openhis.administration.dto.ChangePriceDataDto>
**/
List<ChangePriceDataDto> searchMedChangePriceByBusNo(@Param("busNo") String busNo, @Param("categoryEnum") Integer categoryEnum, @Param("statusEnum") Integer statusEnum);
/**
* Desc: 根据条件 查询 药品调价单
* @param itemId
* @param categoryEnum
* @param statusEnum
* @Author raymond
* @Date 07:34 2025/11/4
* @return java.util.List<com.openhis.administration.dto.ChangePriceDataDto>
**/
List<ChangePriceDataDto> searchMedChangePriceByItemId(@Param("itemId") Long itemId,@Param("categoryEnum") Integer categoryEnum,@Param("statusEnum") Integer statusEnum);
/**
* Desc: 根据条件 查询 耗材调价单
* @param busNo
* @param categoryEnum
* @param statusEnum
* @Author raymond
* @Date 09:46 2025/11/2
* @return java.util.List<com.openhis.administration.dto.ChangePriceDataDto>
**/
List<ChangePriceDataDto> searchDeviceChangePriceByBusNo(@Param("busNo") String busNo,@Param("categoryEnum") Integer categoryEnum,@Param("statusEnum") Integer statusEnum);
/**
* Desc: 根据条件 查询 耗材调价单
* @param itemId
* @param categoryEnum
* @param statusEnum
* @Author raymond
* @Date 07:33 2025/11/4
* @return java.util.List<com.openhis.administration.dto.ChangePriceDataDto>
**/
List<ChangePriceDataDto> searchDeviceChangePriceByItemId(@Param("itemId") Long itemId,@Param("categoryEnum") Integer categoryEnum,@Param("statusEnum") Integer statusEnum);
/**
* Desc: 根据条件 查询 诊疗调价单
* @param busNo
* @param categoryEnum
* @param statusEnum
* @Author raymond
* @Date 09:46 2025/11/2
* @return java.util.List<com.openhis.administration.dto.ChangePriceDataDto>
**/
List<ChangePriceDataDto> searchActivityChangePriceByBusNo(@Param("busNo") String busNo,@Param("categoryEnum") Integer categoryEnum,@Param("statusEnum") Integer statusEnum);
/**
* Desc: 根据条件 查询 诊疗调价单
* @param itemId
* @param categoryEnum
* @param statusEnum
* @Author raymond
* @Date 07:32 2025/11/4
* @return java.util.List<com.openhis.administration.dto.ChangePriceDataDto>
**/
List<ChangePriceDataDto> searchActivityChangePriceByItemId(@Param("itemId") Long itemId,@Param("categoryEnum") Integer categoryEnum,@Param("statusEnum") Integer statusEnum);
/**
* Desc: 根据条件 查询 挂号调价单
* @param busNo
* @param categoryEnum
* @param statusEnum
* @Author raymond
* @Date 09:46 2025/11/2
* @return java.util.List<com.openhis.administration.dto.ChangePriceDataDto>
**/
List<ChangePriceDataDto> searchHealthChangePriceByBusNo(@Param("busNo") String busNo,@Param("categoryEnum") Integer categoryEnum,@Param("statusEnum") Integer statusEnum);
/**
* Desc: 根据条件 查询 挂号调价单
* @param itemId
* @param categoryEnum
* @param statusEnum
* @Author raymond
* @Date 07:31 2025/11/4
* @return java.util.List<com.openhis.administration.dto.ChangePriceDataDto>
**/
List<ChangePriceDataDto> searchHealthChangePriceByItemId(@Param("itemId") Long itemId,@Param("categoryEnum") Integer categoryEnum,@Param("statusEnum") Integer statusEnum);
/**
* Desc: 根据条件 查询 审批单 审核中的数据
* @param busNo
* @param statusEnum
* @Author raymond
* @Date 10:36 2025/11/2
* @return java.util.List<com.openhis.administration.dto.ChangePriceDataDto>
**/
List<ChangePriceDataDto> searchChangePriceRecordDataByBusNo(@Param("busNo") String busNo,@Param("statusEnum") Integer statusEnum);
}

View File

@@ -6,6 +6,9 @@ import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.utils.DateTimeUtils;
import com.openhis.workflow.mapper.ActivityDefinitionMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -46,6 +49,9 @@ public class OrganizationLocationAppServiceImpl implements IOrganizationLocation
@Autowired
private IOrganizationLocationService organizationLocationService;
@Autowired
private ActivityDefinitionMapper activityDefinitionMapper;
/**
* 机构位置关系初始化
*
@@ -126,6 +132,25 @@ public class OrganizationLocationAppServiceImpl implements IOrganizationLocation
OrganizationLocation orgLoc = new OrganizationLocation();
BeanUtils.copyProperties(orgLocQueryDto, orgLoc);
Long activityDefinitionId = orgLoc.getActivityDefinitionId();
String activityName = activityDefinitionId != null ? activityDefinitionMapper.selectById(activityDefinitionId).getName() : "";
List<OrganizationLocation> organizationLocationList =
organizationLocationService.getOrgLocListByOrgIdAndActivityDefinitionId(orgLoc.getActivityDefinitionId());
organizationLocationList = (orgLoc.getId() != null)
? organizationLocationList.stream().filter(item -> !orgLoc.getId().equals(item.getId())).toList()
: organizationLocationList;
if (!organizationLocationList.isEmpty())
for (OrganizationLocation organizationLocation : organizationLocationList)
if (DateTimeUtils.isOverlap(organizationLocation.getStartTime(), organizationLocation.getEndTime(),
orgLoc.getStartTime(), orgLoc.getEndTime())) {
String organizationName =
organizationService.getById(organizationLocation.getOrganizationId()).getName();
return R.fail("当前诊疗:" + activityName + CommonConstants.Common.DASH + orgLoc.getStartTime()
+ CommonConstants.Common.DASH + orgLoc.getEndTime() + "" + organizationName + "时间冲突");
}
if (orgLocQueryDto.getId() != null) {
// 更新机构位置信息
organizationLocationService.updateById(orgLoc);

View File

@@ -14,6 +14,7 @@ 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.AssignSeqUtil;
import com.core.common.utils.ChineseConvertUtils;
import com.core.common.utils.MessageUtils;
import com.core.common.utils.SecurityUtils;
@@ -28,6 +29,8 @@ import com.openhis.administration.service.IPractitionerRoleService;
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.enums.AssignSeqEnum;
import com.openhis.common.enums.PractitionerRoles;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.web.basedatamanage.appservice.IPractitionerAppService;
@@ -58,6 +61,9 @@ public class PractitionerAppServiceImpl implements IPractitionerAppService {
@Resource
ISysTenantService sysTenantService;
@Resource
private AssignSeqUtil assignSeqUtil;
/**
* 新增用户及参与者
*
@@ -70,6 +76,8 @@ public class PractitionerAppServiceImpl implements IPractitionerAppService {
String nickName = userAndPractitionerDto.getNickName();
String phonenumber = userAndPractitionerDto.getPhonenumber();
String pharPracCertNo = userAndPractitionerDto.getPharPracCertNo(); // 职业证件编号
String signature = userAndPractitionerDto.getSignature(); // 签名图片
String drProfttlCode = userAndPractitionerDto.getDrProfttlCode(); // 职称编码
String sex = userAndPractitionerDto.getSex();
// 账号唯一性
long count = iBizUserService.count(new LambdaQueryWrapper<BizUser>().eq(BizUser::getUserName, userName));
@@ -105,8 +113,9 @@ public class PractitionerAppServiceImpl implements IPractitionerAppService {
// 新增 adm_practitioner
Practitioner practitioner = new Practitioner();
practitioner.setActiveFlag(AccountStatus.ACTIVE.getValue()); // 活动标记
practitioner.setBusNo(assignSeqUtil.getSeq(AssignSeqEnum.PRACTITIONER_NO.getPrefix(), 8)); // 编号
practitioner.setName(nickName); // 姓名
practitioner.setGenderEnum(Integer.parseInt(sex)); // 性别
practitioner.setGenderEnum(sex == null ? AdministrativeGender.UNKNOWN.getValue() : Integer.parseInt(sex)); // 性别
practitioner.setBirthDate(userAndPractitionerDto.getBirthDate()); // 出生日期
practitioner.setPhone(phonenumber); // 电话
practitioner.setAddress(userAndPractitionerDto.getAddress()); // 地址
@@ -119,6 +128,8 @@ public class PractitionerAppServiceImpl implements IPractitionerAppService {
practitioner.setPyStr(ChineseConvertUtils.toPinyinFirstLetter(nickName)); // 拼音码
practitioner.setWbStr(ChineseConvertUtils.toWBFirstLetter(nickName)); // 五笔码
practitioner.setPharPracCertNo(pharPracCertNo); // 职业证件编号
practitioner.setSignature(signature); // 签名图片
practitioner.setDrProfttlCode(drProfttlCode); // 职称编码
iPractitionerService.save(practitioner);
Long practitionerId = practitioner.getId();// 参与者id
// 新增 adm_practitioner_role
@@ -276,6 +287,8 @@ public class PractitionerAppServiceImpl implements IPractitionerAppService {
String phonenumber = userAndPractitionerDto.getPhonenumber();
String sex = userAndPractitionerDto.getSex();
String pharPracCertNo = userAndPractitionerDto.getPharPracCertNo(); // 职业证件编号
String signature = userAndPractitionerDto.getSignature(); // 签名图片
String drProfttlCode = userAndPractitionerDto.getDrProfttlCode(); // 职称编码
// 编辑 sys_user
BizUser bizUser = new BizUser();
bizUser.setNickName(nickName); // 昵称
@@ -299,7 +312,7 @@ public class PractitionerAppServiceImpl implements IPractitionerAppService {
Practitioner practitioner = new Practitioner();
practitioner.setId(practitionerId);
practitioner.setName(nickName); // 姓名
practitioner.setGenderEnum(Integer.parseInt(sex)); // 性别
practitioner.setGenderEnum(sex == null ? AdministrativeGender.UNKNOWN.getValue() : Integer.parseInt(sex)); // 性别
practitioner.setBirthDate(userAndPractitionerDto.getBirthDate()); // 出生日期
practitioner.setPhone(phonenumber); // 电话
practitioner.setAddress(userAndPractitionerDto.getAddress()); // 地址
@@ -312,6 +325,8 @@ public class PractitionerAppServiceImpl implements IPractitionerAppService {
practitioner.setPyStr(ChineseConvertUtils.toPinyinFirstLetter(nickName)); // 拼音码
practitioner.setWbStr(ChineseConvertUtils.toWBFirstLetter(nickName)); // 五笔码
practitioner.setPharPracCertNo(pharPracCertNo);// 职业证件编号
practitioner.setSignature(signature); // 签名图片
practitioner.setDrProfttlCode(drProfttlCode); // 职称编码
iPractitionerService.updateById(practitioner);
// 先删除,再新增 adm_practitioner_role
practitionerAppAppMapper.delPractitionerRole(practitionerId);

View File

@@ -99,6 +99,12 @@ public class UserAndPractitionerDto {
*/
private String pharPracCertNo;
/** 签名图片 */
private String signature;
/** 职称编码 */
private String drProfttlCode ;
/**
* 机构id
*/

View File

@@ -12,7 +12,6 @@ import java.util.stream.Stream;
import javax.servlet.http.HttpServletRequest;
import com.openhis.yb.service.YbManager;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -21,6 +20,7 @@ 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.AssignSeqUtil;
import com.core.common.utils.MessageUtils;
import com.core.common.utils.SecurityUtils;
import com.core.common.utils.StringUtils;
@@ -32,12 +32,14 @@ import com.openhis.administration.service.IHealthcareServiceService;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.AccountStatus;
import com.openhis.common.enums.AssignSeqEnum;
import com.openhis.common.enums.PublicationStatus;
import com.openhis.common.enums.Whether;
import com.openhis.common.utils.EnumUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.web.basicservice.dto.*;
import com.openhis.web.basicservice.mapper.HealthcareServiceBizMapper;
import com.openhis.yb.service.YbManager;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -58,6 +60,8 @@ public class HealthcareServiceController {
private final YbManager ybService;
private final AssignSeqUtil assignSeqUtil;
/**
* 服务管理基础数据初始化
*/
@@ -92,6 +96,7 @@ public class HealthcareServiceController {
// 服务管理-新增
HealthcareService healthcareService = new HealthcareService();
BeanUtils.copyProperties(healthcareServiceFormData, healthcareService);
// healthcareService.setBusNo(assignSeqUtil.getSeq(AssignSeqEnum.HEALTHCARE_SERVICE_NO.getPrefix(), 8));
HealthcareService healthcareServiceAfterAdd = iHealthcareServiceService.addHealthcareService(healthcareService);
// 同时保存费用定价
ChargeItemDefinition chargeItemDefinition = new ChargeItemDefinition();

View File

@@ -3,14 +3,14 @@
*/
package com.openhis.web.chargemanage.appservice;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.core.common.core.domain.R;
import com.openhis.web.chargemanage.dto.EncounterPatientPageParam;
import com.openhis.web.chargemanage.dto.EncounterPatientPrescriptionDto;
import java.util.List;
/**
* 门诊收费 service
*
@@ -62,4 +62,20 @@ public interface IOutpatientChargeAppService {
* @return 初始化信息
*/
R<?> outpatientChargeInit();
/**
* 学生医保转自费
*
* @param encounterId 就诊id
* @return 结果
*/
R<?> changeToStudentSelfPay(Long encounterId);
/**
* 学生自费转学生医保
*
* @param encounterId 就诊id
* @return 结果
*/
R<?> changeToStudentYbPay(Long encounterId);
}

View File

@@ -87,7 +87,7 @@ public class InpatientChargeAppServiceImpl implements IInpatientChargeAppService
encounterPatientPageParam, searchKey,
new HashSet<>(Arrays.asList(CommonConstants.FieldName.PatientWbStr, CommonConstants.FieldName.PatientPyStr,
CommonConstants.FieldName.PatientName, CommonConstants.FieldName.PatientBusNo,
CommonConstants.FieldName.EncounterBusNo, CommonConstants.FieldName.idCard)),
CommonConstants.FieldName.EncounterBusNo, CommonConstants.FieldName.IdCard)),
request);
// 就诊患者分页列表
Page<EncounterPatientPageDto> encounterPatientPage = inpatientChargeAppMapper

View File

@@ -88,7 +88,7 @@ public class OutpatientChargeAppServiceImpl implements IOutpatientChargeAppServi
encounterPatientPageParam, searchKey,
new HashSet<>(Arrays.asList(CommonConstants.FieldName.PatientWbStr, CommonConstants.FieldName.PatientPyStr,
CommonConstants.FieldName.PatientName, CommonConstants.FieldName.PatientBusNo,
CommonConstants.FieldName.EncounterBusNo, CommonConstants.FieldName.idCard)),
CommonConstants.FieldName.EncounterBusNo, CommonConstants.FieldName.IdCard)),
request);
// 就诊患者分页列表
Page<EncounterPatientPageDto> encounterPatientPage = outpatientChargeAppMapper
@@ -168,4 +168,46 @@ public class OutpatientChargeAppServiceImpl implements IOutpatientChargeAppServi
}
return R.ok(MessageUtils.createMessage(PromptMsgConstant.Common.M00004, null));
}
/**
* 学生医保转学生自费
*
* @param encounterId 就诊id
* @return 结果
*/
@Override
public R<?> changeToStudentSelfPay(Long encounterId) {
// 获取就诊患者的学生自费账户id
Long accountId = accountService.getStudentSelfAccount(encounterId);
if (accountId == null) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Payment.M00008, new Object[] {"医保账户"}));
}
// 自费转医保
boolean result = chargeItemService.updateAccountType(encounterId, accountId);
if (!result) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Payment.M00009, null));
}
return R.ok(MessageUtils.createMessage(PromptMsgConstant.Common.M00004, null));
}
/**
* 学生自费转学生医保
*
* @param encounterId 就诊id
* @return 结果
*/
@Override
public R<?> changeToStudentYbPay(Long encounterId) {
// 获取就诊患者的学生医保账户id
Long accountId = accountService.getStudentYbAccount(encounterId);
if (accountId == null) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Payment.M00008, new Object[] {"医保账户"}));
}
// 自费转医保
boolean result = chargeItemService.updateAccountType(encounterId, accountId);
if (!result) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Payment.M00009, null));
}
return R.ok(MessageUtils.createMessage(PromptMsgConstant.Common.M00004, null));
}
}

View File

@@ -3,15 +3,13 @@
*/
package com.openhis.web.chargemanage.appservice.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -54,23 +52,23 @@ import com.openhis.workflow.service.IServiceRequestService;
@Service
public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppService {
@Autowired
@Resource
private OutpatientRefundAppMapper outpatientRefundAppMapper;
@Autowired
@Resource
private IPaymentReconciliationService paymentReconciliationService;
@Autowired
@Resource
private IChargeItemService chargeItemService;
@Autowired
@Resource
private IMedicationDispenseService medicationDispenseService;
@Autowired
@Resource
private IDeviceDispenseService deviceDispenseService;
@Autowired
@Resource
private IServiceRequestService serviceRequestService;
@Autowired
@Resource
private IMedicationRequestService medicationRequestService;
@Autowired
@Resource
private IDeviceRequestService deviceRequestService;
@Autowired
@Resource
private AssignSeqUtil assignSeqUtil;
/**
@@ -109,8 +107,8 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
PaymentStatus.REFUND_PART.getValue(), PaymentStatus.REFUND_ALL.getValue());
// 获取付款id集合
List<Long> paymentIdList =
encounterPatientPaymentList.stream().map(EncounterPatientPaymentDto::getId).collect(Collectors.toList());
List<Long> paymentIdList = encounterPatientPaymentList.stream().map(EncounterPatientPaymentDto::getPaymentId)
.collect(Collectors.toList());
if (paymentIdList.isEmpty()) {
return R.ok(null);
}
@@ -130,7 +128,7 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
e.setServiceStatus_enumText(EnumUtils.getInfoByValue(RequestStatus.class, e.getServiceStatus()));
});
refundItemList.sort(Comparator.comparing(RefundItemDto::getPaymentId));
return R.ok(refundItemList);
}
@@ -161,22 +159,22 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
CommonConstants.TableName.MED_MEDICATION_REQUEST, CommonConstants.TableName.WOR_SERVICE_REQUEST,
CommonConstants.TableName.WOR_DEVICE_REQUEST, CommonConstants.Common.THREE);
for (RefundItemDto creatdDto : creatChargeItemList) {
for (RefundItemDto createDto : creatChargeItemList) {
// 未退费用项,生成新的请求,发放,费用项
if (CommonConstants.TableName.MED_MEDICATION_REQUEST.equals(creatdDto.getServiceTable())) {
if (CommonConstants.TableName.MED_MEDICATION_REQUEST.equals(createDto.getServiceTable())) {
// 药品请求查询
MedicationRequest medicationRequest = medicationRequestService.getById(creatdDto.getRequestId());
MedicationRequest medicationRequest = medicationRequestService.getById(createDto.getRequestId());
// 生成新的药品请求
medicationRequest.setId(null); // 药品请求id
medicationRequest
.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.MEDICATION_RES_NO.getPrefix(), 4)); // 药品请求编码
medicationRequest.setPrescriptionNo(String.valueOf("C" + creatdDto.getPrescriptionNo())); // 处方号
medicationRequest.setPrescriptionNo(String.valueOf("C" + createDto.getPrescriptionNo())); // 处方号
medicationRequestService.save(medicationRequest);
// 药品发放查询
MedicationDispense medicationDispense =
medicationDispenseService.getById(creatdDto.getDispenseId());
medicationDispenseService.getById(createDto.getDispenseId());
// 生成新的药品发放
medicationDispense.setId(null); // 药品发放id
medicationDispense
@@ -185,26 +183,26 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
medicationDispenseService.save(medicationDispense);
// 费用项查询
ChargeItem chargeItem = chargeItemService.getById(creatdDto.getChargeItemId());
ChargeItem chargeItem = chargeItemService.getById(createDto.getChargeItemId());
// 生成新的费用项
chargeItem.setRefundId(chargeItem.getId());// 退费id
chargeItem.setId(null); // 费用项id
chargeItem.setBusNo(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix().concat(medicationRequest.getBusNo())); // 编码
chargeItem.setPrescriptionNo(String.valueOf("C" + creatdDto.getPrescriptionNo())); // 处方号
chargeItem.setPrescriptionNo(String.valueOf("C" + createDto.getPrescriptionNo())); // 处方号
chargeItem.setServiceId(medicationRequest.getId()); // 医疗服务ID
chargeItem.setStatusEnum(ChargeItemStatus.PLANNED.getValue());// 收费单状态:待收费
chargeItemService.save(chargeItem);
} else if (CommonConstants.TableName.WOR_SERVICE_REQUEST.equals(creatdDto.getServiceTable())) {
} else if (CommonConstants.TableName.WOR_SERVICE_REQUEST.equals(createDto.getServiceTable())) {
// 服务请求查询
ServiceRequest serviceRequest = serviceRequestService.getById(creatdDto.getRequestId());
ServiceRequest serviceRequest = serviceRequestService.getById(createDto.getRequestId());
// 生成新的服务请求
serviceRequest.setId(null); // 服务请求id
serviceRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.SERVICE_RES_NO.getPrefix(), 4)); // 服务请求编码
serviceRequestService.save(serviceRequest);
// 费用项查询
ChargeItem chargeItem = chargeItemService.getById(creatdDto.getChargeItemId());
ChargeItem chargeItem = chargeItemService.getById(createDto.getChargeItemId());
// 生成新的费用项
chargeItem.setRefundId(chargeItem.getId());// 退费id
chargeItem.setId(null); // 费用项id
@@ -213,16 +211,16 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
chargeItem.setStatusEnum(ChargeItemStatus.PLANNED.getValue());// 收费单状态:待收费
chargeItemService.save(chargeItem);
} else if (CommonConstants.TableName.WOR_DEVICE_REQUEST.equals(creatdDto.getServiceTable())) {
} else if (CommonConstants.TableName.WOR_DEVICE_REQUEST.equals(createDto.getServiceTable())) {
// 耗材请求查询
DeviceRequest deviceRequest = deviceRequestService.getById(creatdDto.getRequestId());
DeviceRequest deviceRequest = deviceRequestService.getById(createDto.getRequestId());
// 生成新的耗材请求
deviceRequest.setId(null); // 耗材请求id
deviceRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.DEVICE_RES_NO.getPrefix(), 4)); // 耗材请求编码
deviceRequestService.save(deviceRequest);
// 耗材发放查询
DeviceDispense deviceDispense = deviceDispenseService.getById(creatdDto.getDispenseId());
DeviceDispense deviceDispense = deviceDispenseService.getById(createDto.getDispenseId());
// 生成新的耗材发放
deviceDispense.setId(null); // 耗材id
deviceDispense.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.DEVICE_DIS_NO.getPrefix(), 4)); // 器材发放id
@@ -230,7 +228,7 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
deviceDispenseService.save(deviceDispense);
// 费用项查询
ChargeItem chargeItem = chargeItemService.getById(creatdDto.getChargeItemId());
ChargeItem chargeItem = chargeItemService.getById(createDto.getChargeItemId());
// 生成新的费用项
chargeItem.setRefundId(chargeItem.getId());// 退费id
chargeItem.setId(null); // 费用项id
@@ -272,7 +270,7 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
medicationRequest.setId(null); // 药品请求id
medicationRequest
.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.MEDICATION_RES_NO.getPrefix(), 4)); // 药品请求编码
medicationRequest.setQuantity(dto.getQuantity() * (-1)); // 请求数量
medicationRequest.setQuantity(dto.getQuantity().multiply(new BigDecimal("-1"))); // 请求数量
medicationRequest.setUnitCode(dto.getUnitCode()); // 请求单位编码
medicationRequest.setStatusEnum(RequestStatus.CANCELLED.getValue()); // 请求状态
medicationRequest.setRefundMedicineId(dto.getRequestId()); // 退药id
@@ -298,7 +296,7 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
// 生成服务请求(取消服务)
serviceRequest.setId(null); // 服务请求id
serviceRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.SERVICE_RES_NO.getPrefix(), 4)); // 服务请求编码
serviceRequest.setQuantity(dto.getQuantity() * (-1)); // 请求数量
serviceRequest.setQuantity(dto.getQuantity().multiply(new BigDecimal("-1"))); // 请求数量
serviceRequest.setUnitCode(dto.getUnitCode()); // 请求单位编码
serviceRequest.setStatusEnum(RequestStatus.CANCELLED.getValue()); // 请求状态
serviceRequest.setRefundServiceId(dto.getRequestId()); // 退药id
@@ -321,7 +319,7 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
// 生成耗材请求(退耗材)
deviceRequest.setId(null); // 耗材请求id
deviceRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.DEVICE_RES_NO.getPrefix(), 4)); // 耗材请求编码
deviceRequest.setQuantity(dto.getQuantity() * (-1)); // 请求数量
deviceRequest.setQuantity(dto.getQuantity().multiply(new BigDecimal("-1"))); // 请求数量
deviceRequest.setUnitCode(dto.getUnitCode()); // 请求单位编码
deviceRequest.setStatusEnum(RequestStatus.CANCELLED.getValue()); // 请求状态
deviceRequest.setRefundDeviceId(dto.getRequestId()); // 退药id
@@ -371,14 +369,14 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
encounterPatientPageParam, searchKey,
new HashSet<>(Arrays.asList(CommonConstants.FieldName.PatientWbStr, CommonConstants.FieldName.PatientPyStr,
CommonConstants.FieldName.PatientName, CommonConstants.FieldName.PatientBusNo,
CommonConstants.FieldName.EncounterBusNo, CommonConstants.FieldName.idCard)),
CommonConstants.FieldName.EncounterBusNo, CommonConstants.FieldName.IdCard)),
request);
// 就诊患者分页列表
Page<EncounterPatientPageDto> encounterPatientPage =
outpatientRefundAppMapper.selectBilledEncounterPatientPage(new Page<>(pageNo, pageSize), queryWrapper,
ChargeItemStatus.BILLED.getValue(), ChargeItemStatus.REFUNDING.getValue(),
ChargeItemStatus.REFUNDED.getValue(), ChargeItemStatus.PART_REFUND.getValue(),
AccountType.MEDICAL_ELECTRONIC_CERTIFICATE.getCode(), EncounterClass.AMB.getValue());
Page<EncounterPatientPageDto> encounterPatientPage = outpatientRefundAppMapper.selectBilledEncounterPatientPage(
new Page<>(pageNo, pageSize), queryWrapper, ChargeItemStatus.BILLED.getValue(),
ChargeItemStatus.REFUNDING.getValue(), ChargeItemStatus.REFUNDED.getValue(),
ChargeItemStatus.PART_REFUND.getValue(), AccountType.MEDICAL_ELECTRONIC_CERTIFICATE.getCode(),
EncounterClass.AMB.getValue(), ChargeItemContext.REGISTER.getValue());
encounterPatientPage.getRecords().forEach(e -> {
// 性别枚举
@@ -386,9 +384,9 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
// 收费状态枚举
e.setStatusEnum_enumText(EnumUtils.getInfoByValue(ChargeItemStatus.class, e.getStatusEnum()));
// 计算年龄
e.setAge(AgeCalculatorUtil.getAge(e.getBirthDate()));
// 合同类型枚举
e.setCategoryEnum_enumText(EnumUtils.getInfoByValue(ContractCategory.class, e.getCategoryEnum()));
if (e.getBirthDate() != null) {
e.setAge(AgeCalculatorUtil.getAge(e.getBirthDate()));
}
});
return R.ok(encounterPatientPage);
}

View File

@@ -262,8 +262,9 @@ public class OutpatientRegistrationAppServiceImpl implements IOutpatientRegistra
request);
IPage<CurrentDayEncounterDto> currentDayEncounter = outpatientRegistrationAppMapper.getCurrentDayEncounter(
new Page<>(pageNo, pageSize), EncounterClass.AMB.getValue(), ParticipantType.ADMITTER.getCode(),
queryWrapper, ChargeItemContext.REGISTER.getValue(), PaymentStatus.SUCCESS.getValue());
new Page<>(pageNo, pageSize), EncounterClass.AMB.getValue(), EncounterStatus.IN_PROGRESS.getValue(),
ParticipantType.ADMITTER.getCode(), ParticipantType.REGISTRATION_DOCTOR.getCode(), queryWrapper,
ChargeItemContext.REGISTER.getValue(), PaymentStatus.SUCCESS.getValue());
currentDayEncounter.getRecords().forEach(e -> {
// 性别
e.setGenderEnum_enumText(EnumUtils.getInfoByValue(AdministrativeGender.class, e.getGenderEnum()));

View File

@@ -3,6 +3,7 @@
*/
package com.openhis.web.chargemanage.controller;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
@@ -27,7 +28,7 @@ import lombok.extern.slf4j.Slf4j;
@AllArgsConstructor
public class OutpatientChargeController {
@Autowired
@Resource
private IOutpatientChargeAppService outpatientChargeAppService;
/**
@@ -91,4 +92,26 @@ public class OutpatientChargeController {
public R<?> changeToMedicalInsurance(@RequestParam Long encounterId) {
return outpatientChargeAppService.changeToMedicalInsurance(encounterId);
}
/**
* 医保转自费
*
* @param encounterId 就诊id
* @return 操作结果
*/
@PutMapping("/student-self-pay")
public R<?> changeToStudentSelfPay(@RequestParam Long encounterId) {
return outpatientChargeAppService.changeToStudentSelfPay(encounterId);
}
/**
* 自费转医保
*
* @param encounterId 就诊id
* @return 操作结果
*/
@PutMapping("/student-yb-pay")
public R<?> changeToStudentYbPay(@RequestParam Long encounterId) {
return outpatientChargeAppService.changeToStudentYbPay(encounterId);
}
}

View File

@@ -5,6 +5,7 @@ package com.openhis.web.chargemanage.controller;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
@@ -30,7 +31,7 @@ import lombok.extern.slf4j.Slf4j;
@AllArgsConstructor
public class OutpatientRefundController {
@Autowired
@Resource
private IOutpatientRefundAppService outpatientRefundAppService;
/**

View File

@@ -130,5 +130,9 @@ public class CurrentDayEncounterDto {
* 生日
*/
private Date birthDate;
/**
* 电话
*/
private String phone;
}

View File

@@ -2,15 +2,12 @@ package com.openhis.web.chargemanage.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.EncounterActivityStatus;
import com.openhis.common.enums.LocationForm;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 就诊位置 表单数据
*/
@@ -39,7 +36,7 @@ public class EncounterLocationFormData {
* 设置默认值
*/
public EncounterLocationFormData() {
this.statusEnum = EncounterLocationStatus.PLANNED.getValue();
this.statusEnum = EncounterActivityStatus.PLANNED.getValue();
this.formEnum = LocationForm.ROOM.getValue();
}

View File

@@ -79,13 +79,6 @@ public class EncounterPatientPageDto {
*/
private Date birthDate;
/**
* 账户类型编码
*/
@Dict(dictCode = "account_code")
private String typeCode;
private String typeCode_dictText;
/**
* 账户余额
*/
@@ -120,10 +113,6 @@ public class EncounterPatientPageDto {
*/
private BigDecimal totalAmount;
/** 合同类型 */
private Integer categoryEnum;
private String categoryEnum_enumText;
/**
* 结算时间
*/
@@ -135,4 +124,9 @@ public class EncounterPatientPageDto {
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
/**
* 科室名称
*/
private String organizationName;
}

View File

@@ -5,7 +5,6 @@ package com.openhis.web.chargemanage.dto;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
@@ -29,7 +28,7 @@ public class EncounterPatientPaymentDto {
/** ID */
@TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
private Long paymentId;
/** 就诊ID */
private Long encounterId;

View File

@@ -9,6 +9,7 @@ import java.util.Date;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.annotation.Dict;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -91,7 +92,17 @@ public class EncounterPatientPrescriptionDto {
@Dict(dictCode = "med_type")
private String medTypeCode;
private String medTypeCode_dictText;
/** 用法 */
@Dict(dictCode = "method_code")
private String methodCode;
private String methodCode_dictText;
private String dose;
@Dict(dictCode = "unit_code")
private String doseUnitCode;
/** 单次剂量单位 */
private String doseUnitCode_dictText;
/** 频次 */
private String rateCode;
/** 合同编码 */
private String contractNo;
@@ -103,4 +114,13 @@ public class EncounterPatientPrescriptionDto {
/** 服务所在表 */
private String serviceTable;
/** 服务所在表对应的id */
@JsonSerialize(using = ToStringSerializer.class)
private Long serviceId;
/** 付款id */
@JsonSerialize(using = ToStringSerializer.class)
private Long paymentId;
}

View File

@@ -42,7 +42,7 @@ public class RefundItemDto {
private String prescriptionNo;
/** 请求数量 */
private Integer quantity;
private BigDecimal quantity;
/** 请求单位编码 */
@Dict(dictCode = "unit_code")

View File

@@ -56,4 +56,5 @@ public interface OutpatientChargeAppMapper {
@Param("register") Integer register, @Param("planned") Integer planned, @Param("billable") Integer billable,
@Param("billed") Integer billed, @Param("refunding") Integer refunding, @Param("refunded") Integer refunded,
@Param("partRefund") Integer partRefund);
}

View File

@@ -61,12 +61,14 @@ public interface OutpatientRefundAppMapper {
* @param partRefund 收费状态:部分退费
* @param insurance 账户类型:医保
* @param amb 就诊类型:门诊
* @param register 账单类型:挂号费
* @return 已结算就诊患者分页列表
*/
Page<EncounterPatientPageDto> selectBilledEncounterPatientPage(@Param("page") Page<EncounterPatientPageDto> page,
@Param(Constants.WRAPPER) QueryWrapper<EncounterPatientPageParam> queryWrapper, @Param("billed") Integer billed,
@Param("refunding") Integer refunding, @Param("refunded") Integer refunded,
@Param("partRefund") Integer partRefund, @Param("insurance") String insurance, @Param("amb") Integer amb);
@Param("partRefund") Integer partRefund, @Param("insurance") String insurance, @Param("amb") Integer amb,
@Param("register") Integer register);
/**
* 查询患者退费项目

View File

@@ -36,14 +36,17 @@ public interface OutpatientRegistrationAppMapper {
*
* @param page 分页参数
* @param classEnum 就诊类型
* @param participantType 参与者类型
* @param statusEnum 门诊就诊状态 | 在诊
* @param participantType1 参与者类型 | 接诊医生
* @param participantType2 参与者类型 | 挂号医生
* @param queryWrapper 查询条件
* @param register 收费项目类型:挂号
* @param paymentStatus 支付状态:成功
* @return 当日就诊数据
*/
IPage<CurrentDayEncounterDto> getCurrentDayEncounter(@Param("page") Page<CurrentDayEncounterDto> page,
@Param("classEnum") Integer classEnum, @Param("participantType") String participantType,
@Param("classEnum") Integer classEnum, @Param("statusEnum") Integer statusEnum,
@Param("participantType1") String participantType1, @Param("participantType2") String participantType2,
@Param(Constants.WRAPPER) QueryWrapper<CurrentDayEncounterDto> queryWrapper,
@Param("register") Integer register, @Param("paymentStatus") Integer paymentStatus);

View File

@@ -149,4 +149,43 @@ public interface ICommonService {
* @return 病区列表
*/
List<LocationDto> getPractitionerWard();
/**
* 查询参与者下拉列表
*
* @param searchKey 模糊查询关键字
* @return 参与者下拉列表
*/
R<?> getPractitionerList(String searchKey);
/**
* 查询医嘱打印信息
*
* @param requestIds 请求ids
* @param isPrescription 是否为处方
* @return 医嘱打印单
*/
R<?> getAdvicePrintInfo(List<Long> requestIds, String isPrescription);
/**
* 查询参与者签名
*
* @param practitionerId 参与者id
* @return 参与者签名
*/
R<?> getPractitionerSignature(Long practitionerId);
/**
* 查询所有供应商
*
* @return 供应商
*/
R<?> getSupplierList();
/**
* 查询所有诊疗项目
*
* @return 诊疗项目
*/
R<?> getActivityDefinition();
}

View File

@@ -15,15 +15,19 @@ 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.SecurityUtils;
import com.core.common.utils.StringUtils;
import com.core.common.utils.bean.BeanUtils;
import com.openhis.administration.domain.Location;
import com.openhis.administration.domain.Organization;
import com.openhis.administration.domain.Supplier;
import com.openhis.administration.domain.TraceNoManage;
import com.openhis.administration.mapper.TraceNoManageMapper;
import com.openhis.administration.service.ILocationService;
import com.openhis.administration.service.IOrganizationService;
import com.openhis.administration.service.IPractitionerRoleService;
import com.openhis.administration.service.ISupplierService;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.enums.*;
import com.openhis.common.utils.EnumUtils;
@@ -36,7 +40,6 @@ import com.openhis.web.common.dto.*;
import com.openhis.web.common.mapper.CommonAppMapper;
import com.openhis.workflow.domain.InventoryItem;
import com.openhis.workflow.service.IInventoryItemService;
import com.openhis.administration.domain.Organization;
/**
* app常用接口
@@ -63,11 +66,14 @@ public class CommonServiceImpl implements ICommonService {
private IOrganizationService organizationService;
@Resource
private IInventoryItemService iInventoryItemService;
private IInventoryItemService inventoryItemService;
@Resource
private ContractMapper contractMapper;
@Resource
private ISupplierService supplierService;
/**
* 获取药房列表
*
@@ -277,11 +283,10 @@ public class CommonServiceImpl implements ICommonService {
// 医保编码和生产厂家校验
for (LocationInventoryDto dto : locationInventoryDtoList) {
if (StringUtils.isNotEmpty(dto.getYbNo()) && StringUtils.isEmpty(dto.getManufacturer())) {
if (StringUtils.isNotEmpty(dto.getYbNo()) && StringUtils.isEmpty(dto.getManufacturerText())) {
return R.fail("生产厂家不能为空,请到药品目录维护");
}
}
return R.ok(locationInventoryDtoList);
}
@@ -301,7 +306,7 @@ public class CommonServiceImpl implements ICommonService {
* @return 科室列表
*/
@Override
public List<Organization> departmentList(){
public List<Organization> departmentList() {
return organizationService.getList(OrganizationType.DEPARTMENT.getValue(), null);
}
@@ -317,7 +322,7 @@ public class CommonServiceImpl implements ICommonService {
for (String traceNo : traceNoList) {
if (traceNo != null && !StringUtils.isEmpty(traceNo)) {
// 数据源更改
InventoryItem inventoryItem = iInventoryItemService.getOne(
InventoryItem inventoryItem = inventoryItemService.getOne(
new LambdaQueryWrapper<InventoryItem>().like(InventoryItem::getTraceNo, traceNo).last("LIMIT 1"));
if (inventoryItem != null) {
String itemId = inventoryItem.getItemId().toString();
@@ -451,4 +456,76 @@ public class CommonServiceImpl implements ICommonService {
}
return locationDtoList;
}
/**
* 查询参与者下拉列表
*
* @param searchKey 模糊查询关键字
* @return 参与者下拉列表
*/
@Override
public R<?> getPractitionerList(String searchKey) {
return R.ok(commonAppMapper.getPractitionerList(searchKey));
}
/**
* 查询医嘱打印信息
*
* @param requestIds 请求ids
* @param isPrescription 是否为处方
* @return 医嘱打印单
*/
@Override
public R<?> getAdvicePrintInfo(List<Long> requestIds, String isPrescription) {
AdvicePrintInfoDto advicePrintInfoDto;
if (Whether.YES.getCode().equals(isPrescription)) {
// 查询处方单
advicePrintInfoDto = commonAppMapper.selectPrescriptionPrintInfo(requestIds);
} else {
// 查询处置单
advicePrintInfoDto = commonAppMapper.selectTreatmentPrintInfo(requestIds);
}
advicePrintInfoDto
.setAge(advicePrintInfoDto.getBirthDate() != null
? AgeCalculatorUtil.getAge(advicePrintInfoDto.getBirthDate()) : "")
.setGenderEnum_enumText(
EnumUtils.getInfoByValue(AdministrativeGender.class, advicePrintInfoDto.getGenderEnum()))
.setEncounterYbClass_enumText(
EnumUtils.getInfoByValue(EncounterYbClass.class, advicePrintInfoDto.getEncounterYbClass()));
return R.ok(advicePrintInfoDto);
}
/**
* 查询参与者签名
*
* @param practitionerId 参与者id
* @return 参与者签名
*/
@Override
public R<?> getPractitionerSignature(Long practitionerId) {
return R.ok(commonAppMapper.getPractitionerSignature(practitionerId));
}
/**
* 查询所有供应商
*
* @return 供应商
*/
@Override
public R<?> getSupplierList() {
return R.ok(supplierService.list(new LambdaQueryWrapper<Supplier>().select(Supplier::getId, Supplier::getName)
.eq(Supplier::getTypeEnum, SupplierType.SUPPLIER.getValue())
.eq(Supplier::getDeleteFlag, DelFlag.NO.getCode()).eq(Supplier::getActiveFlag, Whether.YES.getValue())));
}
/**
* 查询所有诊疗项目
*
* @return 诊疗项目
*/
@Override
public R<?> getActivityDefinition() {
return R.ok(commonAppMapper.getActivityDefinition(PublicationStatus.ACTIVE.getValue()));
}
}

View File

@@ -198,4 +198,59 @@ public class CommonAppController {
public List<LocationDto> getPractitionerWard() {
return commonService.getPractitionerWard();
}
/**
* 查询参与者下拉列表
*
* @param searchKey 模糊查询关键字
* @return 参与者下拉列表
*/
@GetMapping(value = "/practitioner-list")
public R<?> getPractitionerList(@RequestParam(value = "searchKey", required = false) String searchKey) {
return commonService.getPractitionerList(searchKey);
}
/**
* 查询医嘱打印信息
*
* @param requestIds 请求ids
* @param isPrescription 是否为处方
* @return 医嘱打印单
*/
@GetMapping("/advice-print")
public R<?> getAdvicePrintInfo(@RequestParam(value = "requestIds") List<Long> requestIds, String isPrescription) {
return commonService.getAdvicePrintInfo(requestIds, isPrescription);
}
/**
* 查询参与者签名
*
* @param practitionerId 参与者id
* @return 参与者签名
*/
@GetMapping(value = "/practitioner-signature")
public R<?> getPractitionerSignature(@RequestParam(value = "practitionerId") Long practitionerId) {
return commonService.getPractitionerSignature(practitionerId);
}
/**
* 查询所有供应商
*
* @return 供应商
*/
@GetMapping(value = "/supplier")
public R<?> getSupplierList() {
return commonService.getSupplierList();
}
/**
* 查询所有诊疗项目
*
* @return 诊疗项目
*/
@GetMapping(value = "/activity-definition")
public R<?> getActivityDefinition() {
return commonService.getActivityDefinition();
}
}

View File

@@ -0,0 +1,29 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.common.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 诊疗项目dto
*
* @author zwh
* @date 2025-04-01
*/
@Data
@Accessors(chain = true)
public class ActivityDefinitionDto {
/** 项目定义ID */
@JsonSerialize(using = ToStringSerializer.class)
private Long activityDefinitionId;
/** 项目名称 */
private String activityDefinitionName;
}

View File

@@ -0,0 +1,95 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.common.dto;
import java.math.BigDecimal;
import com.openhis.common.annotation.Dict;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 医嘱项目打印信息
*
* @author zwh
* @date 2025-09-16
*/
@Data
@Accessors(chain = true)
public class AdviceItemPrintInfoDto {
/**
* 数量
*/
private Integer quantity;
/**
* 单价
*/
private BigDecimal unitPrice;
/**
* 总价
*/
private BigDecimal totalPrice;
/**
* 项目名称
*/
private String itemName;
/**
* 规格
*/
private String totalVolume;
/**
* 单次剂量
*/
private BigDecimal dose;
/**
* 用药频次
*/
@Dict(dictCode = "rate_code")
private String rateCode;
private String rateCode_dictText;
/**
* 用法
*/
@Dict(dictCode = "method_code")
private String methodCode;
private String methodCode_dictText;
/**
* 剂量单位
*/
@Dict(dictCode = "unit_code")
private String doseUnitCode;
private String doseUnitCode_dictText;
/**
* 单位
*/
@Dict(dictCode = "unit_code")
private String unitCode;
private String unitCode_dictText;
/**
* 处方号
*/
private String prescriptionNo;
/**
* 分组号
*/
private Long groupId;
/**
* 排序号
*/
private Integer sortNumber;
}

View File

@@ -0,0 +1,100 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.common.dto;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.annotation.Dict;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 处方信息
*
* @author zwh
* @date 2025-09-16
*/
@Data
@Accessors(chain = true)
public class AdvicePrintInfoDto {
/** 科室 */
private String departmentName;
/** 患者姓名 */
private String patientName;
/** 电话 */
private String phone;
/**
* 就诊编码
*/
private String encounterNo;
/** 性别 */
private Integer genderEnum;
private String genderEnum_enumText;
/** 年龄 */
private String age;
/** 生日 */
private Date birthDate;
/** 开具日期 */
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date reqTime;
/**
* 费用性质
*/
private String contractName;
/**
* 诊断名称
*/
private String conditionName;
/**
* 开单医生
*/
private String doctorName;
/**
* 发药医生
*/
private String dispenseDoctorName;
/**
* 配药医生
*/
private String preparerDoctorName;
/**
* 收费医生
*/
private String chargeDoctorName;
/** 就诊类型 */
private Integer encounterYbClass;
private String encounterYbClass_enumText;
/**
* 单位
*/
@Dict(dictCode = "unit_code")
private String unitCode;
private String unitCode_dictText;
/**
* 医嘱项目打印列表
*/
private List<AdviceItemPrintInfoDto> adviceItemList;
}

View File

@@ -87,7 +87,7 @@ public class InventoryItemDto {
/**
* 生产厂家
*/
private String manufacturer;
private String manufacturerText;
/**
* 项目对应表名

View File

@@ -75,6 +75,6 @@ public class LocationInventoryDto {
private String ybNo;
/** 生产厂家 */
private String manufacturer;
private String manufacturerText;
}

View File

@@ -26,22 +26,10 @@ public class PerformInfoDto {
@JsonSerialize(using = ToStringSerializer.class)
private Long requestId;
/** 医嘱项目id */
@JsonSerialize(using = ToStringSerializer.class)
private Long itemId;
/** 住院id */
@JsonSerialize(using = ToStringSerializer.class)
private Long encounterId;
/** 发放id */
@JsonSerialize(using = ToStringSerializer.class)
private Long dispenseId;
/** 执行id */
@JsonSerialize(using = ToStringSerializer.class)
private Long procedureId;
/** 请求所在表 */
private String requestTable;
@@ -49,16 +37,7 @@ public class PerformInfoDto {
@JsonSerialize(using = ToStringSerializer.class)
private Long locationId;
/** 执行开始时间 */
private Date exeStartTime;
/** 执行结束时间 */
private Date exeEndTime;
/** 组号 */
/** 分组id */
@JsonSerialize(using = ToStringSerializer.class)
private Long groupId;
/** 执行时间列表 */
private List<String> executeTimes;
}

View File

@@ -5,6 +5,7 @@ package com.openhis.web.common.dto;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
@@ -30,6 +31,7 @@ public class PerformRecordDto {
private String statusEnum_enumText;
/** 执行时间 */
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date occurrenceTime;
/** 执行位置 */

View File

@@ -0,0 +1,38 @@
/*
* Copyright ©2023 CJB-CNIT Team. All rights reserved
*/
package com.openhis.web.common.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 参与者dto
*
* @author zwh
* @date 2025-04-01
*/
@Data
@Accessors(chain = true)
public class PractitionerInfoDto {
/**
* 参与者id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long practitionerId;
/**
* 参与者名称
*/
private String practitionerName;
/**
* 科室名称
*/
private String organizationName;
}

View File

@@ -5,7 +5,6 @@ package com.openhis.web.common.mapper;
import java.util.List;
import com.openhis.administration.domain.TraceNoManage;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@@ -13,9 +12,8 @@ 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.common.dto.InventoryItemDto;
import com.openhis.web.common.dto.InventoryItemParam;
import com.openhis.web.common.dto.LocationInventoryDto;
import com.openhis.administration.domain.TraceNoManage;
import com.openhis.web.common.dto.*;
/**
* app常用接口 mapper
@@ -62,8 +60,48 @@ public interface CommonAppMapper {
/**
* 查询追溯码信息
*
* @param traceNo 追溯码
* @param traceNo 追溯码
* @return
*/
TraceNoManage getInfoByTraceNo(@Param("traceNo") String traceNo);
/**
* 查询参与者下拉列表
*
* @param searchKey 模糊查询关键字
* @return 参与者下拉列表
*/
List<PractitionerInfoDto> getPractitionerList(@Param("searchKey") String searchKey);
/**
* 查询处方打印信息
*
* @param requestIds 请求ids
* @return 处方打印信息
*/
AdvicePrintInfoDto selectPrescriptionPrintInfo(@Param("requestIds") List<Long> requestIds);
/**
* 查询处置打印信息
*
* @param requestIds 请求ids
* @return 处置打印信息
*/
AdvicePrintInfoDto selectTreatmentPrintInfo(@Param("requestIds") List<Long> requestIds);
/**
* 查询参与者签名
*
* @param practitionerId 参与者id
* @return 参与者签名
*/
String getPractitionerSignature(@Param("practitionerId") Long practitionerId);
/**
* 查询所有诊疗项目
*
* @param statusEnum 启用状态
* @return 诊疗项目
*/
List<ActivityDefinitionDto> getActivityDefinition(@Param("statusEnum") Integer statusEnum);
}

View File

@@ -0,0 +1,37 @@
package com.openhis.web.datadictionary.appservice;
import com.core.common.core.domain.R;
import com.openhis.web.datadictionary.dto.ICDCodeAddDto;
import com.openhis.web.datadictionary.dto.ICDCodeUpdateDto;
public interface ICDCodeService {
/**
* 分页查询icd10编码
*
* @param searchKey
* @param pageNo
* @param pageSize
* @return
*/
R<?> getICDCodePage(String searchKey, Integer pageNo, Integer pageSize);
/**
* 新增icd10编码
* @param icdCodeAddDto
* @return
*/
R<?> addICDInformation(ICDCodeAddDto icdCodeAddDto);
/**
* 删除icd10编码
* @param glNo
* @return
*/
R<?> deleteICDInformation(String glNo);
/**
* 修改icd10编码
* @param icdCodeUpdateDto
* @return
*/
R<?> saveOrUpdateICDInformation(ICDCodeUpdateDto icdCodeUpdateDto);
}

View File

@@ -6,15 +6,15 @@ package com.openhis.web.datadictionary.appservice;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import com.core.common.core.domain.R;
import com.openhis.web.datadictionary.dto.DeviceManageSelParam;
import com.openhis.web.datadictionary.dto.DeviceManageUpDto;
import org.springframework.web.bind.annotation.RequestParam;
/**
* 器材目录 service
@@ -80,4 +80,27 @@ public interface IDeviceManageAppService {
* @return
*/
R<?> editDeviceStart(@RequestBody List<Long> ids);
/**
* 导入器材目录
*
* @param file 文件
* @return 结果
*/
R<?> importData(MultipartFile file);
/**
* 获取导入模板
*
* @param response 响应
*/
void importTemplate(HttpServletResponse response);
/**
* 校验耗材是否可以编辑
*
* @param deviceId 耗材ID
* @return 校验结果
*/
R<?> validateDeviceEdit(Long deviceId);
}

View File

@@ -3,6 +3,9 @@ package com.openhis.web.datadictionary.appservice;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
import com.core.common.core.domain.R;
import com.openhis.web.datadictionary.dto.DiagnosisTreatmentSelParam;
@@ -75,4 +78,26 @@ public interface IDiagTreatMAppService {
*/
R<?> addDiseaseTreatment(DiagnosisTreatmentUpDto diagnosisTreatmentUpDto);
/**
* 导入诊疗目录
*
* @param file 文件
* @return 结果
*/
R<?> importData(MultipartFile file);
/**
* 获取导入模板
*
* @param response 响应
*/
void importTemplate(HttpServletResponse response);
/**
* 校验诊疗项目是否可以编辑
*
* @param activityId 诊疗ID
* @return 校验结果
*/
R<?> validateActivityEdit(Long activityId);
}

View File

@@ -97,4 +97,12 @@ public interface IMedicationManageAppService {
* @param response 响应
*/
void importTemplate(HttpServletResponse response);
/**
* 校验药品是否可以编辑
*
* @param medicationId 药品ID
* @return 校验结果
*/
R<?> validateMedicationEdit(Long medicationId);
}

View File

@@ -3,38 +3,45 @@
*/
package com.openhis.web.datadictionary.appservice.impl;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
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.core.domain.entity.SysDictData;
import com.core.common.enums.DeleteFlag;
import com.core.common.utils.*;
import com.core.common.utils.bean.BeanUtils;
import com.core.common.utils.poi.ExcelUtil;
import com.core.system.service.ISysDictTypeService;
import com.openhis.administration.domain.ChargeItemDefinition;
import com.openhis.administration.domain.DeviceDefinition;
import com.openhis.administration.domain.Location;
import com.openhis.administration.domain.Supplier;
import com.openhis.administration.service.IChargeItemDefinitionService;
import com.openhis.administration.service.IDeviceDefinitionService;
import com.openhis.administration.service.ILocationService;
import com.openhis.administration.service.ISupplierService;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.*;
import com.openhis.common.utils.CommonUtil;
import com.openhis.common.utils.EnumUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.sys.service.IOperationRecordService;
@@ -42,6 +49,8 @@ import com.openhis.web.datadictionary.appservice.IDeviceManageAppService;
import com.openhis.web.datadictionary.appservice.IItemDefinitionService;
import com.openhis.web.datadictionary.dto.*;
import com.openhis.web.datadictionary.mapper.DeviceManageMapper;
import com.openhis.workflow.domain.DeviceRequest;
import com.openhis.workflow.service.IDeviceRequestService;
import com.openhis.workflow.service.ISupplyRequestService;
import com.openhis.yb.service.YbManager;
@@ -54,32 +63,41 @@ import com.openhis.yb.service.YbManager;
@Service
public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
@Autowired
@Resource
private ISupplyRequestService supplyRequestService;
@Autowired
@Resource
private IDeviceDefinitionService deviceDefinitionService;
@Resource
private IChargeItemDefinitionService chargeItemDefinitionService;
@Resource
private ILocationService locationService;
@Resource
private DeviceManageMapper deviceManageMapper;
@Autowired
@Resource
private ISysDictTypeService sysDictTypeService;
@Autowired
@Resource
private IItemDefinitionService itemDefinitionServic;
@Autowired
@Resource
private ISupplierService supplierService;
@Autowired(required = false)
@Resource
private AssignSeqUtil assignSeqUtil;
@Autowired
@Resource
private YbManager ybService;
@Autowired
private IOperationRecordService iOperationRecordService;
@Resource
private IOperationRecordService operationRecordService;
@Resource
private IDeviceRequestService deviceRequestService;
/**
* 器材目录初始化
@@ -185,11 +203,6 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
*/
@Override
public R<?> editDevice(DeviceManageUpDto deviceManageDto) {
// // 校验是否可以编辑
// boolean result = supplyRequestService.verifyAbleEdit(deviceManageDto.getId());
// if (result) {
// return R.fail("该耗材已经发生过业务,不可编辑");
// }
DeviceDefinition deviceDefinition = new DeviceDefinition();
BeanUtils.copyProperties(deviceManageDto, deviceDefinition);
// 拼音码
@@ -216,7 +229,7 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
.setInstanceId(deviceDefinition.getId()).setPrice(deviceManageDto.getRetailPrice())
.setChargeName(deviceManageDto.getName());;
// 插入操作记录
iOperationRecordService.addEntityOperationRecord(DbOpType.UPDATE.getCode(),
operationRecordService.addEntityOperationRecord(DbOpType.UPDATE.getCode(),
CommonConstants.TableName.ADM_DEVICE_DEFINITION, deviceDefinition);
// 更新价格表
boolean upItemDef = itemDefinitionServic.updateItem(chargeItemDefinition);
@@ -247,12 +260,10 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
*/
@Override
public R<?> getDeviceOne(@RequestParam Long id) {
// 获取租户ID
Integer tenantId = SecurityUtils.getLoginUser().getTenantId();
// 根据ID查询【器材目录】
DeviceManageDto deviceManageDto = deviceManageMapper.getOne(id, tenantId);
return R.ok(deviceManageDto);
}
@@ -264,9 +275,7 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
*/
@Override
public R<?> editDeviceStop(List<Long> ids) {
List<DeviceDefinition> DeviceDefinitionList = new CopyOnWriteArrayList<>();
// 取得更新值
for (Long detail : ids) {
DeviceDefinition deviceDefinition = new DeviceDefinition();
@@ -275,7 +284,7 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
DeviceDefinitionList.add(deviceDefinition);
}
// 插入操作记录
iOperationRecordService.addIdsOperationRecord(DbOpType.STOP.getCode(),
operationRecordService.addIdsOperationRecord(DbOpType.STOP.getCode(),
CommonConstants.TableName.ADM_DEVICE_DEFINITION, ids);
// 更新器材信息
@@ -292,9 +301,7 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
*/
@Override
public R<?> editDeviceStart(List<Long> ids) {
List<DeviceDefinition> DeviceDefinitionList = new CopyOnWriteArrayList<>();
// 取得更新值
for (Long detail : ids) {
DeviceDefinition DeviceDefinition = new DeviceDefinition();
@@ -303,7 +310,7 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
DeviceDefinitionList.add(DeviceDefinition);
}
// 插入操作记录
iOperationRecordService.addIdsOperationRecord(DbOpType.START.getCode(),
operationRecordService.addIdsOperationRecord(DbOpType.START.getCode(),
CommonConstants.TableName.ADM_DEVICE_DEFINITION, ids);
// 更新器材信息
@@ -319,10 +326,8 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
*/
@Override
public R<?> addDevice(@Validated @RequestBody DeviceManageUpDto deviceManageUpDto) {
DeviceDefinition deviceDefinition = new DeviceDefinition();
BeanUtils.copyProperties(deviceManageUpDto, deviceDefinition);
// 使用10位数基础采番
String code = assignSeqUtil.getSeq(AssignSeqEnum.DEVICE_NUM.getPrefix(), 10);
deviceDefinition.setBusNo(code);
@@ -330,10 +335,8 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
deviceDefinition.setPyStr(ChineseConvertUtils.toPinyinFirstLetter(deviceDefinition.getName()));
// 五笔码
deviceDefinition.setWbStr(ChineseConvertUtils.toWBFirstLetter(deviceDefinition.getName()));
// 新增外来器材目录
deviceDefinition.setStatusEnum(PublicationStatus.ACTIVE.getValue());
if (deviceDefinitionService.addDevice(deviceDefinition)) {
// 调用医保目录对照接口
String ybSwitch = SecurityUtils.getLoginUser().getOptionJson().getString(CommonConstants.Option.YB_SWITCH); // 医保开关
@@ -345,7 +348,7 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
}
}
// 插入操作记录
iOperationRecordService.addEntityOperationRecord(DbOpType.INSERT.getCode(),
operationRecordService.addEntityOperationRecord(DbOpType.INSERT.getCode(),
CommonConstants.TableName.ADM_DEVICE_DEFINITION, deviceDefinition);
ItemUpFromDirectoryDto itemUpFromDirectoryDto = new ItemUpFromDirectoryDto();
@@ -360,7 +363,271 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"器材目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00008, null));
}
return R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00008, null));
}
/**
* 导入器材目录
*
* @param file 文件
* @return 结果
*/
@Override
public R<?> importData(MultipartFile file) {
// 读取文件
R<List<DeviceImportDto>> readResult = CommonUtil.readImportedExcelFile(file, DeviceImportDto.class);
if (R.SUCCESS != readResult.getCode()) {
return readResult;
}
List<DeviceImportDto> importDtoList = readResult.getData();
// 导入信息校验
R<?> validateResult = validateImportDtoList(importDtoList);
if (R.SUCCESS != validateResult.getCode()) {
return validateResult;
}
// 查询机构ID、位置信息供后续使用
Long orgId = SecurityUtils.getLoginUser().getOrgId();
List<Location> locationList = locationService.list(new LambdaQueryWrapper<Location>()
.eq(Location::getDeleteFlag, DeleteFlag.NOT_DELETED.getCode()).orderByAsc(Location::getId));
Long defaultLocationId = locationList.stream().findFirst().orElse(new Location()).getId();
Map<String, List<Location>> locationNameMap =
locationList.stream().collect(Collectors.groupingBy(Location::getName));
// 创建表数据
for (DeviceImportDto importDto : importDtoList) {
// 创建器材定义
DeviceDefinition deviceDefinition =
createDeviceDefinitionEntity(importDto, orgId, defaultLocationId, locationNameMap);
deviceDefinitionService.save(deviceDefinition);
// 创建费用定价和详情
chargeItemDefinitionService.addChargeItemDefinitionAndDetail(importDto.getName(), importDto.getTypeCode(),
importDto.getYbType(), importDto.getUnitCode(), importDto.getPurchasePrice(),
importDto.getRetailPrice(), importDto.getMaximumRetailPrice(), orgId,
CommonConstants.TableName.ADM_DEVICE_DEFINITION, deviceDefinition.getId());
}
return R.ok(null, "导入成功!");
}
/**
* 获取导入模板
*
* @param response 响应
*/
@Override
public void importTemplate(HttpServletResponse response) {
ExcelUtil<DeviceImportDto> util = new ExcelUtil<>(DeviceImportDto.class);
util.importTemplateExcel(response, "器材目录数据");
}
/**
* 校验耗材是否可以编辑
*
* @param deviceId 耗材ID
* @return 校验结果
*/
@Override
public R<?> validateDeviceEdit(Long deviceId) {
List<DeviceRequest> deviceRequestList = deviceRequestService.getDevRequestByDeviceId(deviceId);
if (!deviceRequestList.isEmpty()) {
if (deviceRequestList.stream()
.allMatch(x -> x.getStatusEnum().equals(RequestStatus.COMPLETED.getValue()))) {
return R.ok(1, "医生开过该耗材,不可编辑");
} else {
// 校验是否可以编辑
boolean result = supplyRequestService.verifyAbleEdit(deviceId);
if (result) {
return R.ok(2, "该耗材已经入库过,不可编辑");
}
}
}
return R.ok();
}
/**
* 导入信息校验
*
* @param importDtoList 器材目录导入数据列表
*/
private R<?> validateImportDtoList(List<DeviceImportDto> importDtoList) {
// 字段校验(必填及数值类型)
List<String> fieldValidateMsgList = new ArrayList<>();
for (int i = 0; i < importDtoList.size(); i++) {
DeviceImportDto importDto = importDtoList.get(i);
importDto.setLineNumber(i + 2);
List<String> lineValidateMsgList = new ArrayList<>();
if (StringUtils.isEmpty(importDto.getName())) {
lineValidateMsgList.add("器材名称必填");
}
if (StringUtils.isEmpty(importDto.getCategoryCode())) {
lineValidateMsgList.add("器材分类必填");
}
if (StringUtils.isEmpty(importDto.getUnitCode())) {
lineValidateMsgList.add("包装单位必填");
}
if (StringUtils.isEmpty(importDto.getSize())) {
lineValidateMsgList.add("包装规格必填");
}
if (StringUtils.isEmpty(importDto.getItemMinQuantityStr())) {
lineValidateMsgList.add("最小库存警戒数量(常规单位)必填");
}
BigDecimal itemMinQuantity;
try {
itemMinQuantity = new BigDecimal(importDto.getItemMinQuantityStr());
importDto.setItemMinQuantity(itemMinQuantity);
} catch (Exception e) {
lineValidateMsgList.add("最小库存警戒数量(常规单位)应为数值类型");
}
if (StringUtils.isEmpty(importDto.getItemMaxQuantityStr())) {
lineValidateMsgList.add("最大库存警戒数量(常规单位)必填");
}
BigDecimal itemMaxQuantity;
try {
itemMaxQuantity = new BigDecimal(importDto.getItemMaxQuantityStr());
importDto.setItemMaxQuantity(itemMaxQuantity);
} catch (Exception e) {
lineValidateMsgList.add("最大库存警戒数量(常规单位)应为数值类型");
}
if (StringUtils.isEmpty(importDto.getPartPercentStr())) {
lineValidateMsgList.add("拆零比必填");
}
BigDecimal partPercent;
try {
partPercent = new BigDecimal(importDto.getPartPercentStr());
importDto.setPartPercent(partPercent);
} catch (Exception e) {
lineValidateMsgList.add("拆零比应为数值类型");
}
if (StringUtils.isEmpty(importDto.getLocationName())) {
lineValidateMsgList.add("所在位置名称必填");
}
if (StringUtils.isEmpty(importDto.getHvcmFlag())) {
lineValidateMsgList.add("高值器材标志必填");
}
if (StringUtils.isEmpty(importDto.getYbFlag())) {
lineValidateMsgList.add("医保标记必填");
}
if (StringUtils.isEmpty(importDto.getYbMatchFlag())) {
lineValidateMsgList.add("医保对码标记必填");
}
if (Whether.YES.getCode().equals(importDto.getYbMatchFlag()) && StringUtils.isEmpty(importDto.getYbNo())) {
lineValidateMsgList.add("医保对码时,医保编码必填");
}
if (StringUtils.isEmpty(importDto.getAllergenFlag())) {
lineValidateMsgList.add("过敏标记必填");
}
if (StringUtils.isEmpty(importDto.getRxFlag())) {
lineValidateMsgList.add("处方标志必填");
}
if (StringUtils.isEmpty(importDto.getTypeCode())) {
lineValidateMsgList.add("财务类别必填");
}
if (StringUtils.isEmpty(importDto.getYbType())) {
lineValidateMsgList.add("医保费用类别必填");
}
if (StringUtils.isEmpty(importDto.getPurchasePriceStr())) {
lineValidateMsgList.add("购入价必填");
}
BigDecimal purchasePrice;
try {
purchasePrice = new BigDecimal(importDto.getPurchasePriceStr());
importDto.setPurchasePrice(purchasePrice);
} catch (Exception e) {
lineValidateMsgList.add("购入价应为数值类型");
}
if (StringUtils.isEmpty(importDto.getRetailPriceStr())) {
lineValidateMsgList.add("零售价必填");
}
BigDecimal retailPrice;
try {
retailPrice = new BigDecimal(importDto.getRetailPriceStr());
importDto.setRetailPrice(retailPrice);
} catch (Exception e) {
lineValidateMsgList.add("零售价应为数值类型");
}
if (StringUtils.isEmpty(importDto.getMaximumRetailPriceStr())) {
lineValidateMsgList.add("最高零售价必填");
}
BigDecimal maximumRetailPrice;
try {
maximumRetailPrice = new BigDecimal(importDto.getMaximumRetailPriceStr());
importDto.setMaximumRetailPrice(maximumRetailPrice);
} catch (Exception e) {
lineValidateMsgList.add("最高零售价应为数值类型");
}
if (!lineValidateMsgList.isEmpty()) {
fieldValidateMsgList
.add("■ 第" + importDto.getLineNumber() + "行:" + String.join("", lineValidateMsgList) + "");
}
}
if (!fieldValidateMsgList.isEmpty()) {
return R.fail("导入失败!器材信息填写有误:" + String.join(" ", fieldValidateMsgList));
}
// 重复校验(文件行重复)
List<String> lineRepeatedValidateMsgList = new ArrayList<>();
List<List<DeviceImportDto>> importDtoGroupList = new ArrayList<>(importDtoList.stream()
.collect(Collectors.groupingBy(e -> e.getName() + e.getManufacturerText() + e.getSize())).values());
for (List<DeviceImportDto> importDtoGroup : importDtoGroupList) {
if (importDtoGroup.size() > 1) {
lineRepeatedValidateMsgList.add(
"■ 第" + importDtoGroup.stream().map(DeviceImportDto::getLineNumber).sorted().map(Object::toString)
.collect(Collectors.joining(",")) + "行的【" + importDtoGroup.get(0).getName() + "】重复;");
}
}
if (!lineRepeatedValidateMsgList.isEmpty()) {
return R.fail("导入失败!文件中存在重复器材:" + String.join(" ", lineRepeatedValidateMsgList));
}
// 重复校验(文件与数据库重复)
List<String> dbRepeatedValidateMsgList = new ArrayList<>();
for (DeviceImportDto importDto : importDtoList) {
List<DeviceDefinition> deviceDefinitionList = deviceDefinitionService
.list(new LambdaQueryWrapper<DeviceDefinition>().eq(DeviceDefinition::getName, importDto.getName())
.eq(DeviceDefinition::getManufacturerText, importDto.getManufacturerText())
.eq(DeviceDefinition::getSize, importDto.getSize()));
if (!deviceDefinitionList.isEmpty()) {
dbRepeatedValidateMsgList
.add("■ 第" + importDto.getLineNumber() + "行的【" + importDto.getName() + "】在系统中已存在;");
}
}
if (!dbRepeatedValidateMsgList.isEmpty()) {
return R.fail("导入失败!系统中存在重复器材:" + String.join(" ", dbRepeatedValidateMsgList));
}
return R.ok();
}
/**
* 创建器材定义实体
*
* @param importDto 器材目录导入Dto
* @param orgId 机构ID
* @param defaultLocationId 默认位置ID
* @param locationNameMap 位置名称匹配分组Map
* @return 器材定义实体
*/
private DeviceDefinition createDeviceDefinitionEntity(DeviceImportDto importDto, Long orgId, Long defaultLocationId,
Map<String, List<Location>> locationNameMap) {
DeviceDefinition deviceDefinition = new DeviceDefinition();
// 根据输入的所在位置名称获取位置ID
List<Location> mapLocationList = locationNameMap.get(importDto.getLocationName());
if (mapLocationList == null || mapLocationList.isEmpty()) {
deviceDefinition.setLocationId(defaultLocationId);
} else {
deviceDefinition.setLocationId(mapLocationList.get(0).getId());
}
deviceDefinition.setBusNo(assignSeqUtil.getSeq(AssignSeqEnum.DEVICE_NUM.getPrefix(), 10))
.setName(importDto.getName()).setPyStr(ChineseConvertUtils.toPinyinFirstLetter(importDto.getName()))
.setWbStr(ChineseConvertUtils.toWBFirstLetter(importDto.getName()))
.setCategoryCode(importDto.getCategoryCode()).setTypeCode(importDto.getTypeCode())
.setUnitCode(importDto.getUnitCode()).setSize(importDto.getSize())
.setItemMinQuantity(importDto.getItemMinQuantity()).setItemMaxQuantity(importDto.getItemMaxQuantity())
.setPartPercent(importDto.getPartPercent()).setMinUnitCode(importDto.getMinUnitCode()).setOrgId(orgId)
.setHvcmFlag(CommonUtil.tryParseInt(importDto.getHvcmFlag())).setSalesUnitCode(importDto.getSalesUnitCode())
.setApprovalNumber(importDto.getApprovalNumber()).setYbFlag(CommonUtil.tryParseInt(importDto.getYbFlag()))
.setYbNo(importDto.getYbNo()).setYbOrgNo(importDto.getYbOrgNo())
.setYbMatchFlag(CommonUtil.tryParseInt(importDto.getYbMatchFlag()))
.setChrgitmLv(CommonUtil.tryParseInt(importDto.getChrgitmLv()))
.setStatusEnum(PublicationStatus.ACTIVE.getValue()).setManufacturerText(importDto.getManufacturerText())
.setAllergenFlag(CommonUtil.tryParseInt(importDto.getAllergenFlag()))
.setRxFlag(CommonUtil.tryParseInt(importDto.getRxFlag()));
return deviceDefinition;
}
}

View File

@@ -1,5 +1,6 @@
package com.openhis.web.datadictionary.appservice.impl;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
@@ -10,10 +11,10 @@ import java.util.stream.Stream;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.openhis.yb.service.YbManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -23,24 +24,28 @@ import com.core.common.core.domain.R;
import com.core.common.core.domain.entity.SysDictData;
import com.core.common.utils.*;
import com.core.common.utils.bean.BeanUtils;
import com.core.common.utils.poi.ExcelUtil;
import com.core.system.service.ISysDictTypeService;
import com.openhis.administration.domain.ChargeItemDefinition;
import com.openhis.administration.domain.Organization;
import com.openhis.administration.service.IChargeItemDefinitionService;
import com.openhis.administration.service.IOrganizationService;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.*;
import com.openhis.common.utils.CommonUtil;
import com.openhis.common.utils.EnumUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.sys.service.IOperationRecordService;
import com.openhis.web.common.appservice.ICommonService;
import com.openhis.web.datadictionary.appservice.IDiagTreatMAppService;
import com.openhis.web.datadictionary.appservice.IItemDefinitionService;
import com.openhis.web.datadictionary.dto.*;
import com.openhis.web.datadictionary.mapper.ActivityDefinitionManageMapper;
import com.openhis.workflow.domain.ActivityDefinition;
import com.openhis.workflow.mapper.ActivityDefinitionMapper;
import com.openhis.workflow.domain.ServiceRequest;
import com.openhis.workflow.service.IActivityDefinitionService;
import com.openhis.workflow.service.IServiceRequestService;
import com.openhis.yb.service.YbManager;
/**
* 诊疗实现类
@@ -51,32 +56,26 @@ import com.openhis.workflow.service.IActivityDefinitionService;
@Service
public class DiagTreatMAppServiceImpl implements IDiagTreatMAppService {
@Autowired
private IActivityDefinitionService iActivityDefinitionService;
@Autowired
private ActivityDefinitionMapper activityDefinitionMapper;
@Autowired
private IOrganizationService iOrganizationService;
@Autowired
private ISysDictTypeService iSysDictTypeService;
@Resource
private IActivityDefinitionService activityDefinitionService;
@Resource
private IChargeItemDefinitionService chargeItemDefinitionService;
@Resource
private IOrganizationService organizationService;
@Resource
private ActivityDefinitionManageMapper activityDefinitionManageMapper;
@Autowired
private IItemDefinitionService itemDefinitionServic;
@Autowired
@Resource
private IItemDefinitionService itemDefinitionService;
@Resource
private ISysDictTypeService sysDictTypeService;
@Autowired
private ICommonService commonService;
@Autowired(required = false)
AssignSeqUtil assignSeqUtil;
@Autowired
YbManager ybService;
@Autowired
IOperationRecordService iOperationRecordService;
@Resource
private AssignSeqUtil assignSeqUtil;
@Resource
private YbManager ybService;
@Resource
private IOperationRecordService operationRecordService;
@Resource
private IServiceRequestService serviceRequestService;
/**
* 诊疗目录初期查询
@@ -94,7 +93,7 @@ public class DiagTreatMAppServiceImpl implements IDiagTreatMAppService {
// 获取执行科室
LambdaQueryWrapper<Organization> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Organization::getTypeEnum, OrganizationType.DEPARTMENT);
List<Organization> organizations = iOrganizationService.list(queryWrapper);
List<Organization> organizations = organizationService.list(queryWrapper);
List<DiagnosisTreatmentInitDto.exeOrganization> exeOrganizations = organizations.stream()
.map(exeOrg -> new DiagnosisTreatmentInitDto.exeOrganization(exeOrg.getId(), exeOrg.getName()))
.collect(Collectors.toList());
@@ -110,15 +109,15 @@ public class DiagTreatMAppServiceImpl implements IDiagTreatMAppService {
.collect(Collectors.toList());
diagnosisTreatmentInitDto.setDiagnosisCategoryOptions(diagnosisCategories);
// 查询医疗服务项类型
List<SysDictData> medical_service_items =
iSysDictTypeService.selectDictDataByType(ActivityDefCategory.MEDICAL_SERVICE_ITEM.getCode());
// 获取医疗服务项List
List<DiagnosisTreatmentInitDto.diseaseTreatmentType> diseaseTreatmentCategoryList = medical_service_items
.stream().map(status -> new DiagnosisTreatmentInitDto.diseaseTreatmentType(status.getDictValue(),
status.getDictLabel()))
.collect(Collectors.toList());
List<DiagnosisTreatmentInitDto.diseaseTreatmentCategory> diseaseTreatmentCategories = new ArrayList<>();
// // 查询医疗服务项类型
// List<SysDictData> medical_service_items =
// iSysDictTypeService.selectDictDataByType(ActivityDefCategory.MEDICAL_SERVICE_ITEM.getCode());
// // 获取医疗服务项List
// List<DiagnosisTreatmentInitDto.diseaseTreatmentType> diseaseTreatmentCategoryList = medical_service_items
// .stream().map(status -> new DiagnosisTreatmentInitDto.diseaseTreatmentType(status.getDictValue(),
// status.getDictLabel()))
// .toList();
// List<DiagnosisTreatmentInitDto.diseaseTreatmentCategory> diseaseTreatmentCategories = new ArrayList<>();
//
// //获取目录分类
// DiagnosisTreatmentInitDto.diseaseTreatmentCategory diseaseTreatmentCategory =
@@ -233,10 +232,10 @@ public class DiagTreatMAppServiceImpl implements IDiagTreatMAppService {
activityDefinition.setWbStr(ChineseConvertUtils.toWBFirstLetter(activityDefinition.getName()));
// 更新诊疗信息
if (iActivityDefinitionService.updateById(activityDefinition)) {
if (activityDefinitionService.updateById(activityDefinition)) {
// 调用医保目录对照接口
String ybSwitch = SecurityUtils.getLoginUser().getOptionJson().getString(CommonConstants.Option.YB_SWITCH); // 医保开关
if (Whether.YES.getCode().equals(ybSwitch) && StringUtils.isNotEmpty(activityDefinition.getYbNo()) ) {
if (Whether.YES.getCode().equals(ybSwitch) && StringUtils.isNotEmpty(activityDefinition.getYbNo())) {
R<?> r = ybService.directoryCheck(CommonConstants.TableName.WOR_ACTIVITY_DEFINITION,
activityDefinition.getId());
if (200 != r.getCode()) {
@@ -251,16 +250,16 @@ public class DiagTreatMAppServiceImpl implements IDiagTreatMAppService {
.setInstanceId(diagnosisTreatmentUpDto.getId()).setPrice(diagnosisTreatmentUpDto.getRetailPrice())
.setChargeName(diagnosisTreatmentUpDto.getName());
// 插入操作记录
iOperationRecordService.addEntityOperationRecord(DbOpType.UPDATE.getCode(),
operationRecordService.addEntityOperationRecord(DbOpType.UPDATE.getCode(),
CommonConstants.TableName.WOR_ACTIVITY_DEFINITION, activityDefinition);
// 更新价格表
boolean upItemDef = itemDefinitionServic.updateItem(chargeItemDefinition);
boolean upItemDef = itemDefinitionService.updateItem(chargeItemDefinition);
// 更新子表,修改零售价,条件:单位
boolean upItemDetail1 = itemDefinitionServic.updateItemDetail(chargeItemDefinition,
boolean upItemDetail1 = itemDefinitionService.updateItemDetail(chargeItemDefinition,
diagnosisTreatmentUpDto.getRetailPrice(), ConditionCode.UNIT.getCode());
// 更新子表,修改最高零售价,条件:限制
boolean upItemDetail2 = itemDefinitionServic.updateItemDetail(chargeItemDefinition,
boolean upItemDetail2 = itemDefinitionService.updateItemDetail(chargeItemDefinition,
diagnosisTreatmentUpDto.getMaximumRetailPrice(), ConditionCode.LIMIT.getCode());
// 更新价格表
@@ -291,10 +290,10 @@ public class DiagTreatMAppServiceImpl implements IDiagTreatMAppService {
ActivityDefinitionList.add(ActivityDefinition);
}
// 插入操作记录
iOperationRecordService.addIdsOperationRecord(DbOpType.STOP.getCode(),
operationRecordService.addIdsOperationRecord(DbOpType.STOP.getCode(),
CommonConstants.TableName.WOR_ACTIVITY_DEFINITION, ids);
// 更新诊疗信息
return iActivityDefinitionService.updateBatchById(ActivityDefinitionList)
return activityDefinitionService.updateBatchById(ActivityDefinitionList)
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"诊疗目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
@@ -319,10 +318,10 @@ public class DiagTreatMAppServiceImpl implements IDiagTreatMAppService {
ActivityDefinitionList.add(ActivityDefinition);
}
// 插入操作记录
iOperationRecordService.addIdsOperationRecord(DbOpType.START.getCode(),
operationRecordService.addIdsOperationRecord(DbOpType.START.getCode(),
CommonConstants.TableName.WOR_ACTIVITY_DEFINITION, ids);
// 更新诊疗信息
return iActivityDefinitionService.updateBatchById(ActivityDefinitionList)
return activityDefinitionService.updateBatchById(ActivityDefinitionList)
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"诊疗目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
@@ -355,10 +354,10 @@ public class DiagTreatMAppServiceImpl implements IDiagTreatMAppService {
// 新增外来诊疗目录
activityDefinition.setStatusEnum(PublicationStatus.ACTIVE.getValue());
if (iActivityDefinitionService.addDiagnosisTreatment(activityDefinition)) {
if (activityDefinitionService.addDiagnosisTreatment(activityDefinition)) {
// 调用医保目录对照接口
String ybSwitch = SecurityUtils.getLoginUser().getOptionJson().getString(CommonConstants.Option.YB_SWITCH); // 医保开关
if (Whether.YES.getCode().equals(ybSwitch) && StringUtils.isNotEmpty(activityDefinition.getYbNo()) ) {
if (Whether.YES.getCode().equals(ybSwitch) && StringUtils.isNotEmpty(activityDefinition.getYbNo())) {
R<?> r = ybService.directoryCheck(CommonConstants.TableName.WOR_ACTIVITY_DEFINITION,
activityDefinition.getId());
if (200 != r.getCode()) {
@@ -366,7 +365,7 @@ public class DiagTreatMAppServiceImpl implements IDiagTreatMAppService {
}
}
// 插入操作记录
iOperationRecordService.addEntityOperationRecord(DbOpType.INSERT.getCode(),
operationRecordService.addEntityOperationRecord(DbOpType.INSERT.getCode(),
CommonConstants.TableName.WOR_ACTIVITY_DEFINITION, activityDefinition);
ItemUpFromDirectoryDto itemUpFromDirectoryDto = new ItemUpFromDirectoryDto();
@@ -378,7 +377,7 @@ public class DiagTreatMAppServiceImpl implements IDiagTreatMAppService {
.setConditionFlag(Whether.YES.getValue()).setChargeName(diagnosisTreatmentUpDto.getName())
.setInstanceId(activityDefinition.getId()).setPrice(diagnosisTreatmentUpDto.getRetailPrice());
return itemDefinitionServic.addItem(itemUpFromDirectoryDto)
return itemDefinitionService.addItem(itemUpFromDirectoryDto)
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"诊疗目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00008, null));
@@ -387,4 +386,188 @@ public class DiagTreatMAppServiceImpl implements IDiagTreatMAppService {
}
/**
* 导入诊疗目录
*
* @param file 文件
* @return 结果
*/
@Override
public R<?> importData(MultipartFile file) {
// 读取文件
R<List<DiagnosisTreatmentImportDto>> readResult =
CommonUtil.readImportedExcelFile(file, DiagnosisTreatmentImportDto.class);
if (R.SUCCESS != readResult.getCode()) {
return readResult;
}
List<DiagnosisTreatmentImportDto> importDtoList = readResult.getData();
// 导入信息校验
R<?> validateResult = validateImportDtoList(importDtoList);
if (R.SUCCESS != validateResult.getCode()) {
return validateResult;
}
// 查询机构ID供后续使用
Long orgId = SecurityUtils.getLoginUser().getOrgId();
// 创建表数据
for (DiagnosisTreatmentImportDto importDto : importDtoList) {
// 创建诊疗定义
ActivityDefinition activityDefinition = createActivityDefinitionEntity(importDto, orgId);
activityDefinitionService.save(activityDefinition);
// 创建费用定价和详情
chargeItemDefinitionService.addChargeItemDefinitionAndDetail(importDto.getName(), importDto.getTypeCode(),
importDto.getYbType(), importDto.getPermittedUnitCode(), null, importDto.getRetailPrice(),
importDto.getMaximumRetailPrice(), orgId, CommonConstants.TableName.WOR_ACTIVITY_DEFINITION,
activityDefinition.getId());
}
return R.ok(null, "导入成功!");
}
/**
* 获取导入模板
*
* @param response 响应
*/
@Override
public void importTemplate(HttpServletResponse response) {
ExcelUtil<DiagnosisTreatmentImportDto> util = new ExcelUtil<>(DiagnosisTreatmentImportDto.class);
util.importTemplateExcel(response, "诊疗目录数据");
}
/**
* 校验诊疗项目是否可以编辑
*
* @param activityId 诊疗ID
* @return 校验结果
*/
@Override
public R<?> validateActivityEdit(Long activityId) {
// 查询诊疗申请
List<ServiceRequest> serviceRequestList = serviceRequestService.getServiceRequestByActivityId(activityId);
if (!serviceRequestList.isEmpty()) {
if (serviceRequestList.stream().anyMatch(
serviceRequest -> RequestStatus.COMPLETED.getValue().equals(serviceRequest.getStatusEnum()))) {
return R.ok(1,"医生开过该诊疗项目,不可编辑");
}
}
return R.ok();
}
/**
* 导入信息校验
*
* @param importDtoList 器材目录导入数据列表
*/
private R<?> validateImportDtoList(List<DiagnosisTreatmentImportDto> importDtoList) {
// 字段校验(必填及数值类型)
List<String> fieldValidateMsgList = new ArrayList<>();
for (int i = 0; i < importDtoList.size(); i++) {
DiagnosisTreatmentImportDto importDto = importDtoList.get(i);
importDto.setLineNumber(i + 2);
List<String> lineValidateMsgList = new ArrayList<>();
if (StringUtils.isEmpty(importDto.getName())) {
lineValidateMsgList.add("诊疗名称必填");
}
if (StringUtils.isEmpty(importDto.getCategoryCode())) {
lineValidateMsgList.add("目录类别必填");
}
if (StringUtils.isEmpty(importDto.getPermittedUnitCode())) {
lineValidateMsgList.add("使用单位必填");
}
if (StringUtils.isEmpty(importDto.getYbFlag())) {
lineValidateMsgList.add("医保标记必填");
}
if (StringUtils.isEmpty(importDto.getYbMatchFlag())) {
lineValidateMsgList.add("医保对码标记必填");
}
if (Whether.YES.getCode().equals(importDto.getYbMatchFlag()) && StringUtils.isEmpty(importDto.getYbNo())) {
lineValidateMsgList.add("医保对码时,医保编码必填");
}
if (StringUtils.isEmpty(importDto.getChrgitmLv())) {
lineValidateMsgList.add("医保等级必填");
}
if (StringUtils.isEmpty(importDto.getTypeCode())) {
lineValidateMsgList.add("财务类别必填");
}
if (StringUtils.isEmpty(importDto.getYbType())) {
lineValidateMsgList.add("医保费用类别必填");
}
if (StringUtils.isEmpty(importDto.getRetailPriceStr())) {
lineValidateMsgList.add("零售价必填");
}
BigDecimal retailPrice;
try {
retailPrice = new BigDecimal(importDto.getRetailPriceStr());
importDto.setRetailPrice(retailPrice);
} catch (Exception e) {
lineValidateMsgList.add("零售价应为数值类型");
}
if (StringUtils.isEmpty(importDto.getMaximumRetailPriceStr())) {
lineValidateMsgList.add("最高零售价必填");
}
BigDecimal maximumRetailPrice;
try {
maximumRetailPrice = new BigDecimal(importDto.getMaximumRetailPriceStr());
importDto.setMaximumRetailPrice(maximumRetailPrice);
} catch (Exception e) {
lineValidateMsgList.add("最高零售价应为数值类型");
}
if (!lineValidateMsgList.isEmpty()) {
fieldValidateMsgList
.add("■ 第" + importDto.getLineNumber() + "行:" + String.join("", lineValidateMsgList) + "");
}
}
if (!fieldValidateMsgList.isEmpty()) {
return R.fail("导入失败!诊疗信息填写有误:" + String.join(" ", fieldValidateMsgList));
}
// 重复校验(文件行重复)
List<String> lineRepeatedValidateMsgList = new ArrayList<>();
List<List<DiagnosisTreatmentImportDto>> importDtoGroupList = new ArrayList<>(
importDtoList.stream().collect(Collectors.groupingBy(DiagnosisTreatmentImportDto::getName)).values());
for (List<DiagnosisTreatmentImportDto> importDtoGroup : importDtoGroupList) {
if (importDtoGroup.size() > 1) {
lineRepeatedValidateMsgList.add("■ 第"
+ importDtoGroup.stream().map(DiagnosisTreatmentImportDto::getLineNumber).sorted()
.map(Object::toString).collect(Collectors.joining(","))
+ "行的【" + importDtoGroup.get(0).getName() + "】重复;");
}
}
if (!lineRepeatedValidateMsgList.isEmpty()) {
return R.fail("导入失败!文件中存在重复诊疗:" + String.join(" ", lineRepeatedValidateMsgList));
}
// 重复校验(文件与数据库重复)
List<String> dbRepeatedValidateMsgList = new ArrayList<>();
for (DiagnosisTreatmentImportDto importDto : importDtoList) {
List<ActivityDefinition> deviceDefinitionList = activityDefinitionService.list(
new LambdaQueryWrapper<ActivityDefinition>().eq(ActivityDefinition::getName, importDto.getName()));
if (!deviceDefinitionList.isEmpty()) {
dbRepeatedValidateMsgList
.add("■ 第" + importDto.getLineNumber() + "行的【" + importDto.getName() + "】在系统中已存在;");
}
}
if (!dbRepeatedValidateMsgList.isEmpty()) {
return R.fail("导入失败!系统中存在重复诊疗:" + String.join(" ", dbRepeatedValidateMsgList));
}
return R.ok();
}
/**
* 创建诊疗定义实体
*
* @param importDto 器材目录导入Dto
* @param orgId 机构ID
* @return 诊疗定义实体
*/
private ActivityDefinition createActivityDefinitionEntity(DiagnosisTreatmentImportDto importDto, Long orgId) {
ActivityDefinition activityDefinition = new ActivityDefinition();
activityDefinition.setBusNo(assignSeqUtil.getSeq(AssignSeqEnum.ACTIVITY_DEFINITION_NUM.getPrefix(), 10))
.setName(importDto.getName()).setCategoryCode(importDto.getCategoryCode())
.setPyStr(ChineseConvertUtils.toPinyinFirstLetter(importDto.getName()))
.setWbStr(ChineseConvertUtils.toWBFirstLetter(importDto.getName()))
.setPermittedUnitCode(importDto.getPermittedUnitCode()).setOrgId(orgId)
.setYbFlag(CommonUtil.tryParseInt(importDto.getYbFlag())).setYbNo(importDto.getYbNo())
.setYbMatchFlag(CommonUtil.tryParseInt(importDto.getYbMatchFlag()))
.setStatusEnum(PublicationStatus.ACTIVE.getValue())
.setChrgitmLv(CommonUtil.tryParseInt(importDto.getChrgitmLv()));
return activityDefinition;
}
}

View File

@@ -63,13 +63,13 @@ public class DiseaseManageAppServiceImpl implements IDiseaseManageAppService {
DiseaseManageInitDto diseaseManageInitDto = new DiseaseManageInitDto();
// 获取疾病目录种类
List<DiseaseManageInitDto.diseaseCategory> diseaseCategoryList = Stream.of(ConditionDefinitionSource.values())
.map(status -> new DiseaseManageInitDto.diseaseCategory(status.getValue(), status.getInfo()))
.collect(Collectors.toList());
.map(status -> new DiseaseManageInitDto.diseaseCategory(status.getValue(), status.getInfo()))
.collect(Collectors.toList());
diseaseManageInitDto.setDiseaseCategoryList(diseaseCategoryList);
// 获取状态
List<DiseaseManageInitDto.statusEnumOption> statusEnumOptions = Stream.of(PublicationStatus.values())
.map(status -> new DiseaseManageInitDto.statusEnumOption(status.getValue(), status.getInfo()))
.collect(Collectors.toList());
.map(status -> new DiseaseManageInitDto.statusEnumOption(status.getValue(), status.getInfo()))
.collect(Collectors.toList());
diseaseManageInitDto.setStatusFlagOptions(statusEnumOptions);
return R.ok(diseaseManageInitDto);
@@ -79,22 +79,22 @@ public class DiseaseManageAppServiceImpl implements IDiseaseManageAppService {
* 查询病种目录分页列表
*
* @param diseaseManageSelParam 查询条件
* @param searchKey 查询条件-模糊查询
* @param pageNo 当前页码
* @param pageSize 查询条数
* @param searchKey 查询条件-模糊查询
* @param pageNo 当前页码
* @param pageSize 查询条数
* @return
*/
public R<?> getDiseaseList(DiseaseManageSelParam diseaseManageSelParam, String searchKey, Integer pageNo,
Integer pageSize, HttpServletRequest request) {
Integer pageSize, HttpServletRequest request) {
// 构建查询条件
QueryWrapper<ConditionDefinition> queryWrapper = HisQueryUtils.buildQueryWrapper(diseaseManageSelParam,
searchKey, new HashSet<>(Arrays.asList("condition_code", "name", "py_str", "wb_str")), request);
searchKey, new HashSet<>(Arrays.asList("condition_code", "name", "py_str", "wb_str")), request);
// 设置排序
queryWrapper.orderByAsc("condition_code");
// 分页查询
Page<DiseaseManageDto> diseasePage =
HisPageUtils.selectPage(conditionDefinitionMapper, queryWrapper, pageNo, pageSize, DiseaseManageDto.class);
HisPageUtils.selectPage(conditionDefinitionMapper, queryWrapper, pageNo, pageSize, DiseaseManageDto.class);
diseasePage.getRecords().forEach(e -> {
// 医保对码枚举类回显赋值
@@ -142,8 +142,8 @@ public class DiseaseManageAppServiceImpl implements IDiseaseManageAppService {
// 更新病种信息
return ConditionDefinitionService.updateById(conditionDefinition)
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
/**
@@ -159,13 +159,13 @@ public class DiseaseManageAppServiceImpl implements IDiseaseManageAppService {
for (Long detail : ids) {
ConditionDefinition conditionDefinition = new ConditionDefinition();
conditionDefinition.setId(detail);
conditionDefinition.setStatusEnum(PublicationStatus.ACTIVE.getValue());
conditionDefinition.setStatusEnum(PublicationStatus.RETIRED.getValue());
conditionDefinitionList.add(conditionDefinition);
}
// 更新病种信息
return ConditionDefinitionService.updateBatchById(conditionDefinitionList)
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
/**
@@ -186,8 +186,8 @@ public class DiseaseManageAppServiceImpl implements IDiseaseManageAppService {
}
// 更新病种信息
return ConditionDefinitionService.updateBatchById(conditionDefinitionList)
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
/**
@@ -210,8 +210,8 @@ public class DiseaseManageAppServiceImpl implements IDiseaseManageAppService {
// 五笔码
conditionDefinition.setWbStr(ChineseConvertUtils.toWBFirstLetter(conditionDefinition.getName()));
return ConditionDefinitionService.addDisease(conditionDefinition)
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00008, null));
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"疾病目录"}))
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00008, null));
}
}

View File

@@ -0,0 +1,118 @@
package com.openhis.web.datadictionary.appservice.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.core.common.utils.ChineseConvertUtils;
import com.core.common.utils.MessageUtils;
import com.core.common.utils.StringUtils;
import com.openhis.administration.domain.Account;
import com.openhis.administration.domain.Location;
import com.openhis.administration.mapper.LocationMapper;
import com.openhis.administration.service.ILocationService;
import com.openhis.clinical.domain.ConditionNoDefinition;
import com.openhis.clinical.mapper.ConditionNoDefinitionMapper;
import com.openhis.clinical.service.IConditionNoDefinitionService;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.*;
import com.openhis.common.utils.HisPageUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.web.basedatamanage.dto.LocationAddOrEditDto;
import com.openhis.web.basedatamanage.dto.LocationInfoDto;
import com.openhis.web.datadictionary.dto.DeviceManageDto;
import com.openhis.web.datadictionary.dto.ICDCodeAddDto;
import com.openhis.web.datadictionary.dto.ICDCodeDto;
import com.openhis.web.datadictionary.dto.ICDCodeUpdateDto;
import com.openhis.workflow.domain.SupplyRequest;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import com.core.common.core.domain.R;
import com.openhis.web.datadictionary.appservice.ICDCodeService;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
@Service
public class ICDCodeServiceImpl implements ICDCodeService {
@Resource
private ConditionNoDefinitionMapper conditionNoDefinitionMapper;
@Resource
private ICDCodeService icdCodeService;
@Resource
private IConditionNoDefinitionService conditionNoDefinitionService;
/**
*
* @param searchKey
* @param pageNo
* @param pageSize
* @return
*/
@Override
public R<?> getICDCodePage(String searchKey, Integer pageNo, Integer pageSize) {
// 构建查询条件
QueryWrapper<ConditionNoDefinition> queryWrapper = HisQueryUtils.buildQueryWrapper(null,searchKey,
new HashSet<>(Arrays.asList("gl_no", "gl_name", "icd10_no", "icd10_name")), null);
Page<ICDCodeDto> icdCodeDtoPage =
HisPageUtils.selectPage(conditionNoDefinitionMapper, queryWrapper, pageNo, pageSize, ICDCodeDto.class);
return R.ok(icdCodeDtoPage);
}
/**
* 添加
* @param icdCodeAddDto
* @return
*/
@Override
public R<?> addICDInformation(ICDCodeAddDto icdCodeAddDto) {
ConditionNoDefinition conditionNoDefinition = new ConditionNoDefinition();
conditionNoDefinition.setIcd10No(icdCodeAddDto.getIcd10No());
conditionNoDefinition.setIcd10Name(icdCodeAddDto.getIcd10Name());
conditionNoDefinition.setGlNo(icdCodeAddDto.getGlNo());
conditionNoDefinition.setGlName(icdCodeAddDto.getGlName());
boolean result = conditionNoDefinitionService.save(conditionNoDefinition);
if(result){
return R.ok("ok");
}
return R.fail("no");
}
/**
* 删除
* @param glNo
* @return
*/
@Override
public R<?> deleteICDInformation(String glNo) {
boolean result =
conditionNoDefinitionService.remove(new LambdaQueryWrapper<ConditionNoDefinition>().likeRight(ConditionNoDefinition::getGlNo, glNo));
return result ? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00005, new Object[] {"国临编码信息删除"}))
: R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00006, new Object[] {"国临编码信息删除"}));
}
@Override
public R<?> saveOrUpdateICDInformation(ICDCodeUpdateDto icdCodeUpdateDto) {
ConditionNoDefinition conditionNoDefinition = new ConditionNoDefinition();
conditionNoDefinition.setId(icdCodeUpdateDto.getId());
conditionNoDefinition.setIcd10No(icdCodeUpdateDto.getIcd10No());
conditionNoDefinition.setIcd10Name(icdCodeUpdateDto.getIcd10Name());
conditionNoDefinition.setGlNo(icdCodeUpdateDto.getGlNo());
conditionNoDefinition.setGlName(icdCodeUpdateDto.getGlName());
boolean result=conditionNoDefinitionService.saveOrUpdate(conditionNoDefinition);
if(result){
return R.ok("ok");
}
return R.fail("no");
}
}

View File

@@ -4,7 +4,8 @@ import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -12,7 +13,6 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.core.common.utils.bean.BeanUtils;
import com.openhis.administration.domain.ChargeItemDefDetail;
import com.openhis.administration.domain.ChargeItemDefinition;
import com.openhis.administration.mapper.ChargeItemDefAppMapper;
import com.openhis.administration.mapper.ChargeItemDefinitionMapper;
import com.openhis.administration.service.IChargeItemDefDetailService;
import com.openhis.administration.service.IChargeItemDefinitionService;
@@ -30,15 +30,14 @@ import com.openhis.web.datadictionary.dto.ItemUpFromDirectoryDto;
@Service
public class ItemDefinitionServiceImpl implements IItemDefinitionService {
@Autowired
IChargeItemDefinitionService chargeItemDefinitionService;
@Resource
private IChargeItemDefinitionService chargeItemDefinitionService;
@Autowired
IChargeItemDefDetailService chargeItemDefDetailService;
@Autowired
ChargeItemDefinitionMapper chargeItemDefinitionMapper;
@Autowired
ChargeItemDefAppMapper chargeItemDefAppMapper;
@Resource
private IChargeItemDefDetailService chargeItemDefDetailService;
@Resource
private ChargeItemDefinitionMapper chargeItemDefinitionMapper;
/**
* 添加药品/器材/诊疗的项目定价

View File

@@ -3,48 +3,50 @@
*/
package com.openhis.web.datadictionary.appservice.impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
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.core.domain.entity.SysDictData;
import com.core.common.enums.DeleteFlag;
import com.core.common.utils.*;
import com.core.common.utils.bean.BeanUtils;
import com.core.common.utils.poi.ExcelUtil;
import com.core.system.service.ISysDictTypeService;
import com.openhis.administration.domain.ChargeItemDefinition;
import com.openhis.administration.domain.Location;
import com.openhis.administration.domain.Supplier;
import com.openhis.administration.service.IChargeItemDefDetailService;
import com.openhis.administration.service.IChargeItemDefinitionService;
import com.openhis.administration.service.ILocationService;
import com.openhis.administration.service.ISupplierService;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.*;
import com.openhis.common.utils.CommonUtil;
import com.openhis.common.utils.EnumUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.medication.domain.Medication;
import com.openhis.medication.domain.MedicationDefinition;
import com.openhis.medication.domain.MedicationDetail;
import com.openhis.medication.domain.MedicationRequest;
import com.openhis.medication.service.IMedicationDefinitionService;
import com.openhis.medication.service.IMedicationDispenseService;
import com.openhis.medication.service.IMedicationRequestService;
import com.openhis.medication.service.IMedicationService;
import com.openhis.sys.service.IOperationRecordService;
import com.openhis.web.datadictionary.appservice.IItemDefinitionService;
@@ -63,43 +65,44 @@ import com.openhis.yb.service.YbManager;
@Service
public class MedicationManageAppServiceImpl implements IMedicationManageAppService {
@Autowired
@Resource
private IMedicationService medicationService;
@Autowired
@Resource
private IMedicationDefinitionService medicationDefinitionService;
@Autowired
IChargeItemDefinitionService chargeItemDefinitionService;
@Resource
private IChargeItemDefinitionService chargeItemDefinitionService;
@Autowired
IChargeItemDefDetailService chargeItemDefDetailService;
@Resource
private ILocationService locationService;
@Autowired
@Resource
private MedicationManageSearchMapper medicationManageSearchMapper;
@Autowired
@Resource
private ISupplierService supplierService;
@Autowired
@Resource
private ISysDictTypeService sysDictTypeService;
@Autowired
@Resource
private IItemDefinitionService itemDefinitionServic;
@Autowired(required = false)
@Resource
private AssignSeqUtil assignSeqUtil;
@Autowired
@Resource
private YbManager ybService;
@Autowired
private IOperationRecordService iOperationRecordService;
@Resource
private IOperationRecordService operationRecordService;
@Autowired
@Resource
private ISupplyRequestService supplyRequestService;
@Autowired
private IMedicationDispenseService medicationDispenseService;
@Resource
private IMedicationRequestService medicationRequestService;
/**
* 药品目录初始化
@@ -246,16 +249,6 @@ public class MedicationManageAppServiceImpl implements IMedicationManageAppServi
*/
@Override
public R<?> editMedication(@Validated @RequestBody MedicationManageUpDto medicationManageUpDto) {
// // 校验是否可以编辑
// boolean result = supplyRequestService.verifyAbleEdit(medicationManageUpDto.getMedicationDefId());
// if (result) {
// return R.fail("该药品已经发生过业务,不可编辑");
// }
// boolean result = medicationDispenseService.verifyAbleEdit(medicationManageUpDto.getMedicationDefId());
// if (result) {
// return R.fail("该药品已经发生过业务,不可编辑");
// }
// Todo:用Medication和medicationDefinition的domainservice来创造新的实例根据业务需求使用构造函数
// 如果小于5哥变量就用基本类型传递如果大于5哥在domain层定义构造方法的入参
@@ -298,7 +291,7 @@ public class MedicationManageAppServiceImpl implements IMedicationManageAppServi
}
// 插入操作记录
iOperationRecordService.addEntityOperationRecord(DbOpType.UPDATE.getCode(),
operationRecordService.addEntityOperationRecord(DbOpType.UPDATE.getCode(),
CommonConstants.TableName.MED_MEDICATION_DEFINITION, medication);
// Todo:封装一个价格初始话的方法给app层调用
// 更新价格表
@@ -359,7 +352,7 @@ public class MedicationManageAppServiceImpl implements IMedicationManageAppServi
// TODO:别用三元,日志在业务代码以后记录
// 插入操作记录
iOperationRecordService.addIdsOperationRecord(DbOpType.STOP.getCode(),
operationRecordService.addIdsOperationRecord(DbOpType.STOP.getCode(),
CommonConstants.TableName.MED_MEDICATION_DEFINITION, ids);
// 更新药品信息
return medicationService.updateBatchById(medicationList)
@@ -385,7 +378,7 @@ public class MedicationManageAppServiceImpl implements IMedicationManageAppServi
medicationList.add(medication);
}
// 插入操作记录
iOperationRecordService.addIdsOperationRecord(DbOpType.START.getCode(),
operationRecordService.addIdsOperationRecord(DbOpType.START.getCode(),
CommonConstants.TableName.MED_MEDICATION_DEFINITION, ids);
// 更新药品信息
return medicationService.updateBatchById(medicationList)
@@ -428,7 +421,7 @@ public class MedicationManageAppServiceImpl implements IMedicationManageAppServi
}
}
// 插入操作记录
iOperationRecordService.addEntityOperationRecord(DbOpType.INSERT.getCode(),
operationRecordService.addEntityOperationRecord(DbOpType.INSERT.getCode(),
CommonConstants.TableName.MED_MEDICATION_DEFINITION, medicationDetail);
// 新增子表外来药品目录
boolean insertMedicationSuccess = medicationService.addMedication(medicationDetail);
@@ -472,15 +465,40 @@ public class MedicationManageAppServiceImpl implements IMedicationManageAppServi
*/
@Override
public R<?> importData(MultipartFile file) {
ExcelUtil<MedicationImportDto> util = new ExcelUtil<>(MedicationImportDto.class);
List<MedicationImportDto> dtoList;
try {
dtoList = util.importExcel(file.getInputStream());
} catch (IOException e) {
return R.fail("文件读取失败");
// 读取文件
R<List<MedicationImportDto>> readResult = CommonUtil.readImportedExcelFile(file, MedicationImportDto.class);
if (R.SUCCESS != readResult.getCode()) {
return readResult;
}
return null;
List<MedicationImportDto> importDtoList = readResult.getData();
// 导入信息校验
R<?> validateResult = validateImportDtoList(importDtoList);
if (R.SUCCESS != validateResult.getCode()) {
return validateResult;
}
// 查询机构ID、位置信息供后续使用
Long orgId = SecurityUtils.getLoginUser().getOrgId();
List<Location> locationList = locationService.list(new LambdaQueryWrapper<Location>()
.eq(Location::getDeleteFlag, DeleteFlag.NOT_DELETED.getCode()).orderByAsc(Location::getId));
Long defaultLocationId = locationList.stream().findFirst().orElse(new Location()).getId();
Map<String, List<Location>> locationNameMap =
locationList.stream().collect(Collectors.groupingBy(Location::getName));
// 创建表数据
for (MedicationImportDto importDto : importDtoList) {
// 创建药品定义
MedicationDefinition medicationDefinition = createMedicationDefinitionEntity(importDto);
medicationDefinitionService.save(medicationDefinition);
// 创建药品
Medication medication =
createMedicationEntity(importDto, medicationDefinition.getId(), defaultLocationId, locationNameMap);
medicationService.save(medication);
// 创建费用定价和详情
chargeItemDefinitionService.addChargeItemDefinitionAndDetail(importDto.getName(), importDto.getTypeCode(),
importDto.getYbType(), importDto.getUnitCode(), importDto.getPurchasePrice(),
importDto.getRetailPrice(), importDto.getMaximumRetailPrice(), orgId,
CommonConstants.TableName.MED_MEDICATION_DEFINITION, medicationDefinition.getId());
}
return R.ok(null, "导入成功!");
}
/**
@@ -494,4 +512,336 @@ public class MedicationManageAppServiceImpl implements IMedicationManageAppServi
util.importTemplateExcel(response, "药品目录数据");
}
/**
* 校验药品是否可以编辑
*
* @param medicationId 药品ID
* @return 校验结果
*/
@Override
public R<?> validateMedicationEdit(Long medicationId) {
List<MedicationRequest> medicationRequestList =
medicationRequestService.getMedRequestByMedicationId(medicationId);
if (!medicationRequestList.isEmpty()) {
if (medicationRequestList.stream()
.allMatch(x -> x.getStatusEnum().equals(RequestStatus.COMPLETED.getValue()))) {
return R.ok(1, "医生开过该药品,不可编辑");
} else {
// 校验是否可以编辑
boolean result = supplyRequestService.verifyAbleEdit(medicationId);
if (result) {
return R.ok(2, "该药品已经入库过,不可编辑");
}
}
}
return R.ok();
}
/**
* 导入信息校验
*
* @param importDtoList 药品目录导入数据列表
*/
private R<?> validateImportDtoList(List<MedicationImportDto> importDtoList) {
// 字段校验(必填及数值类型)
List<String> fieldValidateMsgList = new ArrayList<>();
for (int i = 0; i < importDtoList.size(); i++) {
MedicationImportDto importDto = importDtoList.get(i);
importDto.setLineNumber(i + 2);
List<String> lineValidateMsgList = new ArrayList<>();
if (StringUtils.isEmpty(importDto.getName())) {
lineValidateMsgList.add("药品名称必填");
}
if (StringUtils.isEmpty(importDto.getCategoryCode())) {
lineValidateMsgList.add("药品分类必填");
}
if (Whether.YES.getCode().equals(importDto.getYbMatchFlag())
&& !MedCategoryCode.TRADITIONAL_CHINESE_MEDICINE.getValue().equals(importDto.getCategoryCode())
&& !MedCategoryCode.WESTERN_MEDICINE.getValue().equals(importDto.getCategoryCode())
&& !MedCategoryCode.CHINESE_HERBAL_MEDICINE.getValue().equals(importDto.getCategoryCode())) {
lineValidateMsgList.add("医保药的药品分类只能选择中成药、西药或中草药;");
}
if (StringUtils.isEmpty(importDto.getMerchandiseName())) {
lineValidateMsgList.add("商品名称必填");
}
if (StringUtils.isEmpty(importDto.getPharmacologyCategoryCode())) {
lineValidateMsgList.add("药品性质必填");
}
if (StringUtils.isEmpty(importDto.getUnitCode())) {
lineValidateMsgList.add("药品单位必填");
}
if (StringUtils.isEmpty(importDto.getMinUnitCode())) {
lineValidateMsgList.add("最小单位必填");
}
if (StringUtils.isEmpty(importDto.getPartPercentStr())) {
lineValidateMsgList.add("拆零比必填");
}
BigDecimal partPercent;
try {
partPercent = new BigDecimal(importDto.getPartPercentStr());
importDto.setPartPercent(partPercent);
} catch (Exception e) {
lineValidateMsgList.add("拆零比应为数值类型");
}
if (StringUtils.isEmpty(importDto.getDoseFrom())) {
lineValidateMsgList.add("剂量形式必填");
}
if (StringUtils.isEmpty(importDto.getYbMatchFlag())) {
lineValidateMsgList.add("医保是否对码必填");
}
if (Whether.YES.getCode().equals(importDto.getYbMatchFlag()) && StringUtils.isEmpty(importDto.getYbNo())) {
lineValidateMsgList.add("医保对码时,医保编码必填");
}
if (StringUtils.isEmpty(importDto.getSkinTestFlag())) {
lineValidateMsgList.add("是否皮试必填");
}
if (StringUtils.isEmpty(importDto.getInjectFlag())) {
lineValidateMsgList.add("是否为注射药物必填");
}
if (StringUtils.isEmpty(importDto.getRestrictedFlag())) {
lineValidateMsgList.add("是否限制使用必填");
}
if (Whether.YES.getCode().equals(importDto.getRestrictedFlag())
&& StringUtils.isEmpty(importDto.getRestrictedScope())) {
lineValidateMsgList.add("限制使用时,限制使用范围必填");
}
if (StringUtils.isEmpty(importDto.getChildrenFlag())) {
lineValidateMsgList.add("儿童用药标志必填");
}
if (StringUtils.isEmpty(importDto.getPartAttributeEnum())) {
lineValidateMsgList.add("拆分属性必填");
}
if (StringUtils.isEmpty(importDto.getAntibioticFlag())) {
lineValidateMsgList.add("是否抗生素必填");
}
if (Whether.YES.getCode().equals(importDto.getAntibioticFlag())
&& StringUtils.isEmpty(importDto.getAntibioticCode())) {
lineValidateMsgList.add("为抗生素时,抗生素分类必填");
}
if (StringUtils.isEmpty(importDto.getSelfFlag())) {
lineValidateMsgList.add("是否自制必填");
}
if (StringUtils.isEmpty(importDto.getBasicFlag())) {
lineValidateMsgList.add("基药标识必填");
}
if (StringUtils.isEmpty(importDto.getManufacturerText())) {
lineValidateMsgList.add("生产厂商文本必填");
}
if (StringUtils.isEmpty(importDto.getThoPartAttributeEnum())) {
lineValidateMsgList.add("住院临时医嘱拆分属性必填");
}
if (StringUtils.isEmpty(importDto.getUnitConversionRatioStr())) {
lineValidateMsgList.add("剂量单位换算比必填");
}
BigDecimal unitConversionRatio;
try {
unitConversionRatio = new BigDecimal(importDto.getUnitConversionRatioStr());
importDto.setUnitConversionRatio(unitConversionRatio);
} catch (Exception e) {
lineValidateMsgList.add("剂量单位换算比应为数值类型");
}
if (StringUtils.isEmpty(importDto.getChrgitmLv())) {
lineValidateMsgList.add("医保等级必填");
}
if (StringUtils.isEmpty(importDto.getRxFlag())) {
lineValidateMsgList.add("处方标志必填");
}
if (StringUtils.isEmpty(importDto.getItemMinQuantityStr())) {
lineValidateMsgList.add("最小库存警戒数量(常规单位)必填");
}
BigDecimal itemMinQuantity;
try {
itemMinQuantity = new BigDecimal(importDto.getItemMinQuantityStr());
importDto.setItemMinQuantity(itemMinQuantity);
} catch (Exception e) {
lineValidateMsgList.add("最小库存警戒数量(常规单位)应为数值类型");
}
if (StringUtils.isEmpty(importDto.getItemMaxQuantityStr())) {
lineValidateMsgList.add("最大库存警戒数量(常规单位)必填");
}
BigDecimal itemMaxQuantity;
try {
itemMaxQuantity = new BigDecimal(importDto.getItemMaxQuantityStr());
importDto.setItemMaxQuantity(itemMaxQuantity);
} catch (Exception e) {
lineValidateMsgList.add("最大库存警戒数量(常规单位)应为数值类型");
}
if (StringUtils.isEmpty(importDto.getLocationName())) {
lineValidateMsgList.add("所在位置名称必填");
}
if (StringUtils.isEmpty(importDto.getTotalVolume())) {
lineValidateMsgList.add("规格必填");
}
if (StringUtils.isNotEmpty(importDto.getDoseStr())) {
BigDecimal dose;
try {
dose = new BigDecimal(importDto.getDoseStr());
importDto.setDose(dose);
} catch (Exception e) {
lineValidateMsgList.add("单次剂量应为数值类型");
}
}
if (StringUtils.isNotEmpty(importDto.getMaxUnitStr())) {
BigDecimal maxUnit;
try {
maxUnit = new BigDecimal(importDto.getMaxUnitStr());
importDto.setMaxUnit(maxUnit);
} catch (Exception e) {
lineValidateMsgList.add("单次最大剂量应为数值类型");
}
}
if (StringUtils.isEmpty(importDto.getTypeCode())) {
lineValidateMsgList.add("财务类别必填");
}
if (StringUtils.isEmpty(importDto.getYbType())) {
lineValidateMsgList.add("医保费用类别必填");
}
if (StringUtils.isEmpty(importDto.getPurchasePriceStr())) {
lineValidateMsgList.add("购入价必填");
}
BigDecimal purchasePrice;
try {
purchasePrice = new BigDecimal(importDto.getPurchasePriceStr());
importDto.setPurchasePrice(purchasePrice);
} catch (Exception e) {
lineValidateMsgList.add("购入价应为数值类型");
}
if (StringUtils.isEmpty(importDto.getRetailPriceStr())) {
lineValidateMsgList.add("零售价必填");
}
BigDecimal retailPrice;
try {
retailPrice = new BigDecimal(importDto.getRetailPriceStr());
importDto.setRetailPrice(retailPrice);
} catch (Exception e) {
lineValidateMsgList.add("零售价应为数值类型");
}
if (StringUtils.isEmpty(importDto.getMaximumRetailPriceStr())) {
lineValidateMsgList.add("最高零售价必填");
}
BigDecimal maximumRetailPrice;
try {
maximumRetailPrice = new BigDecimal(importDto.getMaximumRetailPriceStr());
importDto.setMaximumRetailPrice(maximumRetailPrice);
} catch (Exception e) {
lineValidateMsgList.add("最高零售价应为数值类型");
}
if (!lineValidateMsgList.isEmpty()) {
fieldValidateMsgList
.add("■ 第" + importDto.getLineNumber() + "行:" + String.join("", lineValidateMsgList) + "");
}
}
if (!fieldValidateMsgList.isEmpty()) {
return R.fail("导入失败!药品信息填写有误:" + String.join(" ", fieldValidateMsgList) + " ■ ※如遇到模板中不存在的字段,请重新下载模板");
}
// 重复校验(文件行重复)
List<String> lineRepeatedValidateMsgList = new ArrayList<>();
List<List<MedicationImportDto>> importDtoGroupList = new ArrayList<>(importDtoList.stream()
.collect(Collectors.groupingBy(e -> e.getName() + e.getManufacturerText() + e.getTotalVolume())).values());
for (List<MedicationImportDto> importDtoGroup : importDtoGroupList) {
if (importDtoGroup.size() > 1) {
lineRepeatedValidateMsgList
.add(
"■ 第"
+ importDtoGroup.stream().map(MedicationImportDto::getLineNumber).sorted()
.map(Object::toString).collect(Collectors.joining(","))
+ "行的【" + importDtoGroup.get(0).getName() + "】重复;");
}
}
if (!lineRepeatedValidateMsgList.isEmpty()) {
return R.fail("导入失败!文件中存在重复药品:" + String.join(" ", lineRepeatedValidateMsgList));
}
// 重复校验(文件与数据库重复)
List<String> dbRepeatedValidateMsgList = new ArrayList<>();
for (MedicationImportDto importDto : importDtoList) {
List<MedicationDefinition> medicationDefinitionList = medicationDefinitionService.list(
new LambdaQueryWrapper<MedicationDefinition>().eq(MedicationDefinition::getName, importDto.getName())
.eq(MedicationDefinition::getManufacturerText, importDto.getManufacturerText()));
if (!medicationDefinitionList.isEmpty()) {
List<Medication> medicationList =
medicationService.list(new LambdaQueryWrapper<Medication>()
.in(Medication::getMedicationDefId,
medicationDefinitionList.stream().map(MedicationDefinition::getId)
.collect(Collectors.toList()))
.eq(Medication::getTotalVolume, importDto.getTotalVolume()));
if (!medicationList.isEmpty()) {
dbRepeatedValidateMsgList
.add("■ 第" + importDto.getLineNumber() + "行的【" + importDto.getName() + "】在系统中已存在;");
}
}
}
if (!dbRepeatedValidateMsgList.isEmpty()) {
return R.fail("导入失败!系统中存在重复药品:" + String.join(" ", dbRepeatedValidateMsgList));
}
return R.ok();
}
/**
* 创建药品定义实体
*
* @param importDto 药品目录导入Dto
* @return 药品定义实体
*/
private MedicationDefinition createMedicationDefinitionEntity(MedicationImportDto importDto) {
MedicationDefinition medicationDefinition = new MedicationDefinition();
medicationDefinition.setName(importDto.getName())
.setBusNo(assignSeqUtil.getSeq(AssignSeqEnum.MEDICATION_NUM.getPrefix(), 10)).setDomainEnum(1)
.setVersion(importDto.getVersion()).setNameEn(importDto.getNameEn())
.setPyStr(ChineseConvertUtils.toPinyinFirstLetter(importDto.getName()))
.setWbStr(ChineseConvertUtils.toWBFirstLetter(importDto.getName()))
.setCategoryCode(importDto.getCategoryCode()).setMerchandiseName(importDto.getMerchandiseName())
.setMerchandisePyStr(ChineseConvertUtils.toPinyinFirstLetter(importDto.getMerchandiseName()))
.setMerchandiseWbStr(ChineseConvertUtils.toPinyinFirstLetter(importDto.getMerchandiseName()))
.setUnitCode(importDto.getUnitCode()).setMinUnitCode(importDto.getMinUnitCode())
.setPartPercent(importDto.getPartPercent()).setDoseFrom(CommonUtil.tryParseInt(importDto.getDoseFrom()))
.setApprovalNumber(importDto.getApprovalNumber())
.setYbMatchFlag(CommonUtil.tryParseInt(importDto.getYbMatchFlag())).setYbNo(importDto.getYbNo())
.setPharmacologyCategoryCode(importDto.getPharmacologyCategoryCode())
.setSkinTestFlag(CommonUtil.tryParseInt(importDto.getSkinTestFlag()))
.setInjectFlag(CommonUtil.tryParseInt(importDto.getInjectFlag()))
.setManufacturerText(importDto.getManufacturerText())
.setRestrictedFlag(CommonUtil.tryParseInt(importDto.getRestrictedFlag()))
.setRestrictedScope(importDto.getRestrictedScope()).setActiveFlag(Whether.YES.getValue())
.setChildrenFlag(CommonUtil.tryParseInt(importDto.getChildrenFlag()))
.setNationalDrugCode(importDto.getNationalDrugCode())
.setPartAttributeEnum(CommonUtil.tryParseInt(importDto.getPartAttributeEnum()))
.setAntibioticCode(importDto.getAntibioticCode())
.setSelfFlag(CommonUtil.tryParseInt(importDto.getSelfFlag()))
.setAntibioticFlag(CommonUtil.tryParseInt(importDto.getAntibioticFlag()))
.setBasicFlag(CommonUtil.tryParseInt(importDto.getBasicFlag()))
.setThoPartAttributeEnum(CommonUtil.tryParseInt(importDto.getThoPartAttributeEnum()))
.setUnitConversionRatio(importDto.getUnitConversionRatio())
.setChrgitmLv(CommonUtil.tryParseInt(importDto.getChrgitmLv()))
.setRxFlag(CommonUtil.tryParseInt(importDto.getRxFlag())).setItemMinQuantity(importDto.getItemMinQuantity())
.setItemMaxQuantity(importDto.getItemMaxQuantity());
return medicationDefinition;
}
/**
* 创建药品基本实体
*
* @param importDto 药品目录导入Dto
* @param medicationDefId 药品定义ID
* @param defaultLocationId 默认位置ID
* @param locationNameMap 位置名称匹配分组Map
* @return 药品基本实体
*/
private Medication createMedicationEntity(MedicationImportDto importDto, Long medicationDefId,
Long defaultLocationId, Map<String, List<Location>> locationNameMap) {
Medication medication = new Medication();
// 根据输入的所在位置名称获取位置ID
List<Location> mapLocationList = locationNameMap.get(importDto.getLocationName());
if (mapLocationList == null || mapLocationList.isEmpty()) {
medication.setLocationId(defaultLocationId);
} else {
medication.setLocationId(mapLocationList.get(0).getId());
}
medication.setMedicationDefId(medicationDefId).setStatusEnum(PublicationStatus.ACTIVE.getValue())
.setDoseFormCode(importDto.getDoseFrom()).setTotalVolume(importDto.getTotalVolume())
.setActiveFlag(Whether.YES.getValue()).setMethodCode(importDto.getMethodCode())
.setRateCode(importDto.getRateCode()).setDose(importDto.getDose())
.setDoseUnitCode(importDto.getDoseUnitCode()).setMaxUnit(importDto.getMaxUnit());
return medication;
}
}

View File

@@ -2,15 +2,16 @@ package com.openhis.web.datadictionary.controller;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import com.core.common.core.domain.R;
import com.openhis.web.datadictionary.appservice.IDeviceManageAppService;
import com.openhis.web.datadictionary.dto.DeviceManageDto;
import com.openhis.web.datadictionary.dto.DeviceManageSelParam;
import com.openhis.web.datadictionary.dto.DeviceManageUpDto;
@@ -29,7 +30,7 @@ import lombok.extern.slf4j.Slf4j;
@AllArgsConstructor
public class DeviceManageController {
@Autowired
@Resource
private IDeviceManageAppService deviceManageAppService;
/**
@@ -67,7 +68,6 @@ public class DeviceManageController {
*/
@GetMapping("/information-one")
public R<?> getDeviceOne(@RequestParam Long id) {
return deviceManageAppService.getDeviceOne(id);
}
@@ -79,7 +79,6 @@ public class DeviceManageController {
*/
@PutMapping("/information")
public R<?> editDevice(@RequestBody DeviceManageUpDto deviceManageDto) {
return deviceManageAppService.editDevice(deviceManageDto);
}
@@ -118,24 +117,34 @@ public class DeviceManageController {
}
/**
* 新增医保器材目录
* 导入器材目录
*
* @param DeviceManageUpDto 器材目录
* @return
* @param file 文件
* @return 结果
*/
@PostMapping("/information-yb")
public R<?> addYbDevice(@RequestBody DeviceManageUpDto DeviceManageUpDto) {
return null;
@PostMapping("/import-data")
public R<?> importData(MultipartFile file) {
return deviceManageAppService.importData(file);
}
/**
* 器材目录导出
* 获取导入模板
*
* @param DeviceManageDto 器材目录
* @return
* @param response 响应
*/
@GetMapping("/information-export")
public R<?> exportDevice(@RequestBody DeviceManageDto DeviceManageDto) {
return null;
@PostMapping("/import-template")
public void importTemplate(HttpServletResponse response) {
deviceManageAppService.importTemplate(response);
}
/**
* 校验耗材是否可以编辑
*
* @param deviceId 耗材ID
* @return 校验结果
*/
@GetMapping("/validate-edit")
public R<?> validateDeviceEdit(Long deviceId) {
return deviceManageAppService.validateDeviceEdit(deviceId);
}
}

View File

@@ -2,15 +2,16 @@ package com.openhis.web.datadictionary.controller;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import com.core.common.core.domain.R;
import com.openhis.web.datadictionary.appservice.IDiagTreatMAppService;
import com.openhis.web.datadictionary.dto.DiagnosisTreatmentDto;
import com.openhis.web.datadictionary.dto.DiagnosisTreatmentSelParam;
import com.openhis.web.datadictionary.dto.DiagnosisTreatmentUpDto;
@@ -29,7 +30,7 @@ import lombok.extern.slf4j.Slf4j;
@AllArgsConstructor
public class DiagnosisTreatmentController {
@Autowired
@Resource
private IDiagTreatMAppService diagTreatMAppService;
/**
@@ -56,8 +57,8 @@ public class DiagnosisTreatmentController {
@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest request) {
return diagTreatMAppService.getDiseaseTreatmentPage(DiagnosisTreatmentSelParam, searchKey, pageNo,
pageSize, request);
return diagTreatMAppService.getDiseaseTreatmentPage(DiagnosisTreatmentSelParam, searchKey, pageNo, pageSize,
request);
}
/**
@@ -105,7 +106,7 @@ public class DiagnosisTreatmentController {
}
/**
* 新增外来诊疗目录
* 新增诊疗目录
*
* @param diagnosisTreatmentUpDto 诊疗目录
* @return
@@ -116,24 +117,34 @@ public class DiagnosisTreatmentController {
}
/**
* 新增医保诊疗目录
* 导入诊疗目录
*
* @param diagnosisTreatmentUpDto 诊疗目录
* @return
* @param file 文件
* @return 结果
*/
@PostMapping("/information-yb")
public R<?> addYbDiseaseTreatment(@RequestBody DiagnosisTreatmentUpDto diagnosisTreatmentUpDto) {
return null;
@PostMapping("/import-data")
public R<?> importData(MultipartFile file) {
return diagTreatMAppService.importData(file);
}
/**
* 诊疗目录导出
* 获取导入模板
*
* @param diagnosisTreatmentDto 诊疗目录
* @return
* @param response 响应
*/
@GetMapping("/information-export")
public R<?> exportDiseaseTreatment(@RequestBody DiagnosisTreatmentDto diagnosisTreatmentDto) {
return null;
@PostMapping("/import-template")
public void importTemplate(HttpServletResponse response) {
diagTreatMAppService.importTemplate(response);
}
/**
* 校验诊疗项目是否可以编辑
*
* @param activityId 诊疗ID
* @return 校验结果
*/
@GetMapping("/validate-edit")
public R<?> validateActivityEdit(Long activityId) {
return diagTreatMAppService.validateActivityEdit(activityId);
}
}

View File

@@ -20,7 +20,7 @@ import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* TODO:病种目录
* 病种目录
*
* @author lpt
* @date 2025-02-20

View File

@@ -0,0 +1,72 @@
package com.openhis.web.datadictionary.controller;
import javax.annotation.Resource;
import com.openhis.web.basedatamanage.dto.LocationAddOrEditDto;
import com.openhis.web.datadictionary.dto.ICDCodeAddDto;
import com.openhis.web.datadictionary.dto.ICDCodeDto;
import com.openhis.web.datadictionary.dto.ICDCodeUpdateDto;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import com.core.common.core.domain.R;
import com.openhis.web.datadictionary.appservice.ICDCodeService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@RestController
@RequestMapping("/base-data-manage/ICD10")
@Slf4j
@AllArgsConstructor
public class ICDCodeController {
@Resource
private ICDCodeService iCDCodeService;
/**
* 查询icd10
* @param searchKey
* @param pageNo
* @param pageSize
* @return
*/
@GetMapping("/information-page") // 前端传回来的查询条件
public R<?> getICDCodePage(@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return iCDCodeService.getICDCodePage(searchKey, pageNo, pageSize);
}
/**
* 新增icd10
* @param icdCodeAddDto
* @return
*/
@PostMapping("/add-icd-Information")
public R<?> ICDInformation(@Validated @RequestBody ICDCodeAddDto icdCodeAddDto) {
return iCDCodeService.addICDInformation(icdCodeAddDto);
}
/**
* 删除icd10
* @param glNo
* @return
*/
@DeleteMapping("/delete-icd-Information")
public R<?> deleteICDInformation(@RequestParam String glNo) {
return iCDCodeService.deleteICDInformation(glNo);
}
/**
* 更新
* @param icdCodeUpdateDto
* @return
*/
@PutMapping("/update-icd-Information")
public R<?> saveOrUpdateICDInformation(@RequestBody ICDCodeUpdateDto icdCodeUpdateDto){
return iCDCodeService.saveOrUpdateICDInformation(icdCodeUpdateDto);
}
}

View File

@@ -2,10 +2,10 @@ package com.openhis.web.datadictionary.controller;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -30,7 +30,7 @@ import lombok.extern.slf4j.Slf4j;
@AllArgsConstructor
public class MedicationManageController {
@Autowired
@Resource
private IMedicationManageAppService medicationManageAppService;
/**
@@ -117,17 +117,6 @@ public class MedicationManageController {
return medicationManageAppService.addMedication(medicationManageUpDto);
}
/**
* 新增医保药品目录
*
* @param medicationManageUpDto 药品目录信息
* @return
*/
@PostMapping("/information-yb")
public R<?> addYbMedication(@RequestBody MedicationManageUpDto medicationManageUpDto) {
return null;
}
/**
* 药品目录导出
*
@@ -166,4 +155,15 @@ public class MedicationManageController {
public void importTemplate(HttpServletResponse response) {
medicationManageAppService.importTemplate(response);
}
/**
* 校验药品是否可以编辑
*
* @param medicationId 药品ID
* @return 校验结果
*/
@GetMapping("/validate-edit")
public R<?> validateMedicationEdit(Long medicationId) {
return medicationManageAppService.validateMedicationEdit(medicationId);
}
}

View File

@@ -6,6 +6,8 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
/**
* 诊疗子项JSON
*/
@@ -20,6 +22,6 @@ public class ActivityChildJsonDto {
/**
* 子项请求数量
*/
private Integer childrenRequestNum;
private BigDecimal childrenRequestNum;
}

View File

@@ -0,0 +1,134 @@
package com.openhis.web.datadictionary.dto;
import java.math.BigDecimal;
import com.core.common.annotation.Excel;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 器材目录导入Dto
*
* @author Thanking
* @date 2025-09-24
*/
@Data
@Accessors(chain = true)
public class DeviceImportDto {
/** 行号 */
private Integer lineNumber;
// ---------------------- 器材定义 adm_device_definition -------------------------------------
/** 器材名称 */
@Excel(name = "器材名称", prompt = "必填")
private String name;
/** 器材分类 */
@Excel(name = "器材分类", prompt = "必填", dictType = "device_category_code", comboReadDict = true)
private String categoryCode;
/** 包装单位 */
@Excel(name = "包装单位", prompt = "必填", dictType = "unit_code", comboReadDict = true)
private String unitCode;
/** 包装规格 */
@Excel(name = "包装规格", prompt = "必填")
private String size;
/** 最小库存警戒数量(常规单位) */
@Excel(name = "最小库存警戒数量(常规单位)", width = 25, prompt = "必填,数值类型")
private String itemMinQuantityStr;
private BigDecimal itemMinQuantity;
/** 最大库存警戒数量(常规单位) */
@Excel(name = "最大库存警戒数量(常规单位)", width = 25, prompt = "必填,数值类型")
private String itemMaxQuantityStr;
private BigDecimal itemMaxQuantity;
/** 拆零比 */
@Excel(name = "拆零比", prompt = "必填,数值类型")
private String partPercentStr;
private BigDecimal partPercent;
/** 最小使用单位 */
@Excel(name = "最小使用单位", prompt = "必填", dictType = "unit_code", comboReadDict = true)
private String minUnitCode;
/** 所在位置名称locationId */
@Excel(name = "所在位置名称", prompt = "必填")
private String locationName;
/** 高值器材标志 */
@Excel(name = "高值器材标志", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String hvcmFlag;
/** 销售单位 */
@Excel(name = "销售单位", prompt = "必填", dictType = "unit_code", comboReadDict = true)
private String salesUnitCode;
/** 批准文号 */
@Excel(name = "批准文号")
private String approvalNumber;
/** 医保标记 */
@Excel(name = "医保标记", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String ybFlag;
/** 医保对码标记 */
@Excel(name = "医保对码标记", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String ybMatchFlag;
/** 医保编码 */
@Excel(name = "医保编码", prompt = "医保对码时必填")
private String ybNo;
/** 医药机构目录编码 */
@Excel(name = "医药机构目录编码")
private String ybOrgNo;
/** 医保等级 */
@Excel(name = "医保等级", prompt = "必填", dictType = "chrgitm_lv", comboReadDict = true)
private String chrgitmLv;
/** 生产厂家 */
@Excel(name = "生产厂家文本", prompt = "必填")
private String manufacturerText;
/** 过敏标记 */
@Excel(name = "过敏标记", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String allergenFlag;
/** 处方标志 */
@Excel(name = "处方标志", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String rxFlag;
// ---------------------- 费用定价 adm_charge_item_definition ----------------------------------------------
/** 财务类别 */
@Excel(name = "财务类别", prompt = "必填", dictType = "fin_type_code", comboReadDict = true)
private String typeCode;
/** 医保费用类别 */
@Excel(name = "医保费用类别", prompt = "必填", dictType = "med_chrgitm_type", comboReadDict = true)
private String ybType;
// ---------------------- 费用定价子表 adm_charge_item_def_detail ----------------------------------------------
/** 购入价 */
@Excel(name = "购入价", prompt = "必填,数值类型")
private String purchasePriceStr;
private BigDecimal purchasePrice;
/** 零售价 */
@Excel(name = "零售价", prompt = "必填,数值类型")
private String retailPriceStr;
private BigDecimal retailPrice;
/** 最高零售价 */
@Excel(name = "最高零售价", prompt = "必填,数值类型")
private String maximumRetailPriceStr;
private BigDecimal maximumRetailPrice;
}

View File

@@ -0,0 +1,75 @@
package com.openhis.web.datadictionary.dto;
import java.math.BigDecimal;
import com.core.common.annotation.Excel;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 诊疗目录导入Dto
*
* @author Thanking
* @date 2025-09-29
*/
@Data
@Accessors(chain = true)
public class DiagnosisTreatmentImportDto {
/** 行号 */
private Integer lineNumber;
// ---------------------- 诊疗定义 wor_activity_definition -------------------------------------
/** 诊疗名称 */
@Excel(name = "诊疗名称", prompt = "必填")
private String name;
/** 目录类别 */
@Excel(name = "目录类别", prompt = "必填", dictType = "activity_category_code", comboReadDict = true)
private String categoryCode;
/** 使用单位 */
@Excel(name = "使用单位", prompt = "必填", dictType = "unit_code", comboReadDict = true)
private String permittedUnitCode;
/** 医保标记 */
@Excel(name = "医保标记", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String ybFlag;
/** 医保对码标记 */
@Excel(name = "医保对码标记", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String ybMatchFlag;
/** 医保编码 */
@Excel(name = "医保编码", prompt = "医保对码时必填")
private String ybNo;
/** 医保等级 */
@Excel(name = "医保等级", prompt = "必填", dictType = "chrgitm_lv", comboReadDict = true)
private String chrgitmLv;
// ---------------------- 费用定价 adm_charge_item_definition ----------------------------------------------
/** 财务类别 */
@Excel(name = "财务类别", prompt = "必填", dictType = "fin_type_code", comboReadDict = true)
private String typeCode;
/** 医保费用类别 */
@Excel(name = "医保费用类别", prompt = "必填", dictType = "med_chrgitm_type", comboReadDict = true)
private String ybType;
// ---------------------- 费用定价子表 adm_charge_item_def_detail ----------------------------------------------
/** 零售价 */
@Excel(name = "零售价", prompt = "必填,数值类型")
private String retailPriceStr;
private BigDecimal retailPrice;
/** 最高零售价 */
@Excel(name = "最高零售价", prompt = "必填,数值类型")
private String maximumRetailPriceStr;
private BigDecimal maximumRetailPrice;
}

View File

@@ -19,4 +19,6 @@ public class DiseaseManageSelParam {
private Integer sourceEnum;
/** 状态 */
private Integer statusEnum;
/** 类型 */
private String typeCode;
}

View File

@@ -0,0 +1,31 @@
package com.openhis.web.datadictionary.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
@Data
@Accessors(chain = true)
public class ICDCodeAddDto {
/** ID */
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/** 国临编码 */
@NotNull
private String glNo;
/** 国临name */
private String glName;
/** 医保编码 */
private String icd10No;
/** 医保name */
private String icd10Name;
}

View File

@@ -0,0 +1,31 @@
package com.openhis.web.datadictionary.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.annotation.Dict;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
@Data
@Accessors(chain = true)
public class ICDCodeDto {
/** ID */
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/** 国临编码 */
private String glNo;
/** 国临name */
private String glName;
/** 医保编码 */
private String icd10No;
/** 医保name */
private String icd10Name;
}

View File

@@ -0,0 +1,32 @@
package com.openhis.web.datadictionary.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
@Data
@Accessors(chain = true)
public class ICDCodeUpdateDto {
/** ID */
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/** 国临编码 */
@NotNull
private String glNo;
/** 国临name */
private String glName;
/** 医保编码 */
private String icd10No;
/** 医保name */
private String icd10Name;
}

View File

@@ -10,17 +10,20 @@ import lombok.experimental.Accessors;
/**
* 药品目录导入Dto
*
* @author GuoRui
* @author Thanking
* @date 2025-08-18
*/
@Data
@Accessors(chain = true)
public class MedicationImportDto {
/** 行号 */
private Integer lineNumber;
// ---------------------- 药品定义 med_medication_definition -------------------------------------
/** 药品名称 */
@Excel(name = "药品名称")
@Excel(name = "药品名称", prompt = "必填")
private String name;
/** 药品版本 */
@@ -32,27 +35,32 @@ public class MedicationImportDto {
private String nameEn;
/** 药品分类 */
@Excel(name = "药品分类", dictType = "med_category_code", comboReadDict = true)
@Excel(name = "药品分类", prompt = "必填", dictType = "med_category_code", comboReadDict = true)
private String categoryCode;
/** 商品名称 */
@Excel(name = "商品名称")
@Excel(name = "商品名称", prompt = "必填")
private String merchandiseName;
/** 药品性质 */
@Excel(name = "药品性质", prompt = "必填", dictType = "medicine_properties", comboReadDict = true)
private String pharmacologyCategoryCode;
/** 药品单位 */
@Excel(name = "药品单位", dictType = "unit_code", comboReadDict = true)
@Excel(name = "药品单位", prompt = "必填", dictType = "unit_code", comboReadDict = true)
private String unitCode;
/** 最小单位 */
@Excel(name = "最小单位", dictType = "unit_code", comboReadDict = true)
@Excel(name = "最小单位", prompt = "必填", dictType = "unit_code", comboReadDict = true)
private String minUnitCode;
/** 拆零比 */
@Excel(name = "拆零比")
@Excel(name = "拆零比", prompt = "必填,数值类型")
private String partPercentStr;
private BigDecimal partPercent;
/** 剂量形式 */
@Excel(name = "剂量形式", dictType = "dose_from_code", comboReadDict = true)
@Excel(name = "剂量形式", prompt = "必填", dictType = "dose_form_code", comboReadDict = true)
private String doseFrom;
/** 批准文号 */
@@ -60,35 +68,31 @@ public class MedicationImportDto {
private String approvalNumber;
/** 医保是否对码 */
@Excel(name = "医保是否对码", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "医保是否对码", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String ybMatchFlag;
/** 医保编码 */
@Excel(name = "医保编码")
@Excel(name = "医保编码", prompt = "医保对码时必填")
private String ybNo;
/** 是否皮试 */
@Excel(name = "是否皮试", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "是否皮试", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String skinTestFlag;
/** 是否为注射药物 */
@Excel(name = "是否为注射药物", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "是否为注射药物", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String injectFlag;
/** 生产厂商文本 */
@Excel(name = "生产厂商文本")
private String manufacturerText;
/** 是否限制使用 */
@Excel(name = "是否限制使用", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "是否限制使用", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String restrictedFlag;
/** 限制使用范围 */
@Excel(name = "限制使用范围")
@Excel(name = "限制使用范围", prompt = "限制使用时必填")
private String restrictedScope;
/** 儿童用药标志 */
@Excel(name = "儿童用药标志", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "儿童用药标志", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String childrenFlag;
/** 贯标国家编码 */
@@ -96,56 +100,68 @@ public class MedicationImportDto {
private String nationalDrugCode;
/** 拆分属性 */
@Excel(name = "拆分属性", readConverterExp = "1=门诊按最小单位每次量向上取整,2=门诊按包装单位不可拆分,3=门诊按最小单位总量向上取整,4=门诊按包装单位每次量向上取整",
@Excel(name = "拆分属性", prompt = "必填",
readConverterExp = "1=门诊按最小单位每次量向上取整,2=门诊按包装单位不可拆分,3=门诊按最小单位总量向上取整,4=门诊按包装单位每次量向上取整",
combo = "门诊按最小单位每次量向上取整,门诊按包装单位不可拆分,门诊按最小单位总量向上取整,门诊按包装单位每次量向上取整")
private String partAttributeEnum;
/** 是否抗生素 */
@Excel(name = "是否抗生素", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "是否抗生素", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String antibioticFlag;
/** 抗生素分类 */
@Excel(name = "抗生素分类", dictType = "antibiotic_type_code", comboReadDict = true)
@Excel(name = "抗生素分类", prompt = "抗生素时必填", dictType = "antibiotic_type_code", comboReadDict = true)
private String antibioticCode;
/** 权限限制 */
@Excel(name = "权限限制", readConverterExp = "1=非限制使用,2=限制使用,3=特殊使用", combo = "非限制使用,限制使用,特殊使用")
private String restrictedEnum;
/** 是否自制 */
@Excel(name = "是否自制", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "是否自制", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String selfFlag;
/** 基药标识 */
@Excel(name = "基药标识", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "基药标识", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String basicFlag;
/** 生产厂商文本 */
@Excel(name = "生产厂商文本", prompt = "必填")
private String manufacturerText;
/** 住院临时医嘱拆分属性 */
@Excel(name = "住院临时医嘱拆分属性",
@Excel(name = "住院临时医嘱拆分属性", prompt = "必填", width = 20,
readConverterExp = "1=临时医嘱按最小单位每次量向上取整,2=临时医嘱按包装单位开立,3=临时医嘱按最小单位总量向上取整,4=临时医嘱按包装单位每次量向上取整",
combo = "临时医嘱按最小单位每次量向上取整,临时医嘱按包装单位开立,临时医嘱按最小单位总量向上取整,临时医嘱按包装单位每次量向上取整")
private String thoPartAttributeEnum;
/** 剂量单位换算比 */
@Excel(name = "剂量单位换算比")
@Excel(name = "剂量单位换算比", prompt = "必填,数值类型")
private String unitConversionRatioStr;
private BigDecimal unitConversionRatio;
/** 医保等级 */
@Excel(name = "医保等级", dictType = "chrgitm_lv", comboReadDict = true)
@Excel(name = "医保等级", prompt = "必填", dictType = "chrgitm_lv", comboReadDict = true)
private String chrgitmLv;
/** 处方标志 */
@Excel(name = "处方标志", readConverterExp = "0=否,1=是", combo = "否,是")
@Excel(name = "处方标志", prompt = "必填", readConverterExp = "0=否,1=是", combo = "否,是")
private String rxFlag;
/** 最小库存警戒数量(常规单位) */
@Excel(name = "最小库存警戒数量(常规单位)", width = 25, prompt = "必填,数值类型")
private String itemMinQuantityStr;
private BigDecimal itemMinQuantity;
/** 最大库存警戒数量(常规单位) */
@Excel(name = "最大库存警戒数量(常规单位)", width = 25, prompt = "必填,数值类型")
private String itemMaxQuantityStr;
private BigDecimal itemMaxQuantity;
// ---------------------- 药品基本信息 med_medication ----------------------------------------------
/** 所在位置名称locationId */
@Excel(name = "所在位置名称")
@Excel(name = "所在位置名称", prompt = "必填")
private String locationName;
/** 规格 */
@Excel(name = "规格")
@Excel(name = "规格", prompt = "必填")
private String totalVolume;
/** 用法 */
@@ -157,7 +173,8 @@ public class MedicationImportDto {
private String rateCode;
/** 单次剂量 */
@Excel(name = "单次剂量")
@Excel(name = "单次剂量", prompt = "数值类型")
private String doseStr;
private BigDecimal dose;
/** 剂量单位 */
@@ -165,31 +182,35 @@ public class MedicationImportDto {
private String doseUnitCode;
/** 单次最大剂量 */
@Excel(name = "单次最大剂量")
@Excel(name = "单次最大剂量", prompt = "数值类型")
private String maxUnitStr;
private BigDecimal maxUnit;
// ---------------------- 费用定价 adm_charge_item_definition ----------------------------------------------
/** 财务类别 */
@Excel(name = "财务类别", dictType = "fin_type_code", comboReadDict = true)
@Excel(name = "财务类别", prompt = "必填", dictType = "fin_type_code", comboReadDict = true)
private String typeCode;
/** 医保费用类别 */
@Excel(name = "医保费用类别", dictType = "med_chrgitm_type", comboReadDict = true)
@Excel(name = "医保费用类别", prompt = "必填", dictType = "med_chrgitm_type", comboReadDict = true)
private String ybType;
// ---------------------- 费用定价子表 adm_charge_item_def_detail ----------------------------------------------
/** 购入价 */
@Excel(name = "购入价")
@Excel(name = "购入价", prompt = "必填,数值类型")
private String purchasePriceStr;
private BigDecimal purchasePrice;
/** 零售价 */
@Excel(name = "零售价")
@Excel(name = "零售价", prompt = "必填,数值类型")
private String retailPriceStr;
private BigDecimal retailPrice;
/** 最高零售价 */
@Excel(name = "最高零售价")
@Excel(name = "最高零售价", prompt = "必填,数值类型")
private String maximumRetailPriceStr;
private BigDecimal maximumRetailPrice;
}

View File

@@ -289,4 +289,9 @@ public class MedicationManageDto {
/** 处方标志 */
private Integer rxFlag;
/**
* 用药说明
*/
private String dosageInstruction;
}

View File

@@ -258,4 +258,9 @@ public class MedicationManageUpDto {
/** 处方标志 */
private Integer rxFlag;
/**
* 用药说明
*/
private String dosageInstruction;
}

View File

@@ -0,0 +1,7 @@
package com.openhis.web.datadictionary.mapper;
import org.springframework.stereotype.Repository;
@Repository
public interface ICDCodeMapper {
}

View File

@@ -2,25 +2,16 @@ package com.openhis.web.departmentmanage.appservice.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import com.openhis.web.departmentmanage.mapper.DepartmentIssuanceOrderMapper;
import com.openhis.web.pharmacyDispensarymanage.dto.PharmacyDispensaryDetailDto;
import com.openhis.web.pharmacyDispensarymanage.dto.PharmacyDispensaryInitDto;
import com.openhis.web.pharmacyDispensarymanage.mapper.PharmacyDispensaryDispensingOrderMapper;
import com.openhis.workflow.domain.SupplyDelivery;
import com.openhis.workflow.service.ISupplyDeliveryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.core.common.core.domain.R;
import com.core.common.utils.AssignSeqUtil;
import com.core.common.utils.MessageUtils;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.*;
import com.openhis.common.utils.EnumUtils;
import com.openhis.web.departmentmanage.appservice.IDepartmentCommonService;
@@ -28,8 +19,10 @@ import com.openhis.web.departmentmanage.appservice.IDepartmentIssuanceOrderServi
import com.openhis.web.departmentmanage.dto.DepartmentDetailDto;
import com.openhis.web.departmentmanage.dto.DepartmentInitDto;
import com.openhis.web.departmentmanage.mapper.DepartmentCommonMapper;
import com.openhis.web.inventorymanage.dto.ProductStocktakingInitDto;
import com.openhis.web.departmentmanage.mapper.DepartmentIssuanceOrderMapper;
import com.openhis.workflow.domain.SupplyDelivery;
import com.openhis.workflow.domain.SupplyRequest;
import com.openhis.workflow.service.ISupplyDeliveryService;
import com.openhis.workflow.service.ISupplyRequestService;
/**
@@ -55,6 +48,7 @@ public class DepartmentIssuanceOrderServiceImpl implements IDepartmentIssuanceOr
private DepartmentCommonMapper departmentCommonMapper;
@Autowired
private DepartmentIssuanceOrderMapper departmentIssuanceOrderMapper;
/**
* 初始化
*
@@ -67,15 +61,15 @@ public class DepartmentIssuanceOrderServiceImpl implements IDepartmentIssuanceOr
// 单据分类
List<DepartmentInitDto.IntegerOption> supplyCategoryOption = new ArrayList<>();
supplyCategoryOption
.add(new DepartmentInitDto.IntegerOption(SupplyCategory.OUTPATIENT_PATIENT_DISPENSING.getValue(),
SupplyCategory.OUTPATIENT_PATIENT_DISPENSING.getInfo()));
supplyCategoryOption
.add(new DepartmentInitDto.IntegerOption(SupplyCategory.INPATIENT_PATIENT_DISPENSING.getValue(),
SupplyCategory.INPATIENT_PATIENT_DISPENSING.getInfo()));
supplyCategoryOption.add(
new DepartmentInitDto.IntegerOption(SupplyCategory.INPATIENT_PATIENT_SUMMARY_DISPENSING.getValue(),
SupplyCategory.INPATIENT_PATIENT_SUMMARY_DISPENSING.getInfo()));
// supplyCategoryOption
// .add(new DepartmentInitDto.IntegerOption(SupplyCategory.OUTPATIENT_PATIENT_DISPENSING.getValue(),
// SupplyCategory.OUTPATIENT_PATIENT_DISPENSING.getInfo()));
// supplyCategoryOption
// .add(new DepartmentInitDto.IntegerOption(SupplyCategory.INPATIENT_PATIENT_DISPENSING.getValue(),
// SupplyCategory.INPATIENT_PATIENT_DISPENSING.getInfo()));
// supplyCategoryOption.add(
// new DepartmentInitDto.IntegerOption(SupplyCategory.INPATIENT_PATIENT_SUMMARY_DISPENSING.getValue(),
// SupplyCategory.INPATIENT_PATIENT_SUMMARY_DISPENSING.getInfo()));
issuanceOrderInitDto.setSupplyCategoryOptions(supplyCategoryOption);
@@ -143,9 +137,8 @@ public class DepartmentIssuanceOrderServiceImpl implements IDepartmentIssuanceOr
.setStatusEnum(SupplyStatus.AGREE.getValue()).setCategoryEnum(item.getCategoryEnum())
.setItemTable(CommonConstants.TableName.ADM_DEVICE_DEFINITION).setItemId(item.getItemId())
.setUnitCode(item.getUnitCode()).setItemQuantity(item.getItemQuantity())
.setLotNumber(item.getLotNumber())
.setSourceTypeEnum(LocationForm.CABINET.getValue()).setSourceLocationId(item.getSourceLocationId())
.setPurposeTypeEnum(LocationForm.DEPARTMENT.getValue())
.setLotNumber(item.getLotNumber()).setSourceTypeEnum(LocationForm.CABINET.getValue())
.setSourceLocationId(item.getSourceLocationId()).setPurposeTypeEnum(LocationForm.DEPARTMENT.getValue())
.setPurposeLocationId(item.getPurposeLocationId()).setApplicantId(item.getApplicantId())
.setApplyTime(item.getApplyTime()).setApproverId(item.getApproverId())
.setApprovalTime(item.getApprovalTime());
@@ -156,9 +149,9 @@ public class DepartmentIssuanceOrderServiceImpl implements IDepartmentIssuanceOr
.setItemTable(supplyRequest.getItemTable()).setItemId(supplyRequest.getItemId())
.setBasedOnTable(CommonConstants.TableName.WOR_DEVICE_DISPENSE).setBasedOnIds(item.getDispenseIds())
.setUnitCode(supplyRequest.getUnitCode()).setQuantity(supplyRequest.getItemQuantity())
.setLotNumber(supplyRequest.getLotNumber())
.setPractitionerId(supplyRequest.getApplicantId()).setOccurrenceTime(supplyRequest.getApprovalTime())
.setReceiverId(supplyRequest.getPurposeLocationId()).setReceiveTime(supplyRequest.getApprovalTime());
.setLotNumber(supplyRequest.getLotNumber()).setPractitionerId(supplyRequest.getApplicantId())
.setOccurrenceTime(supplyRequest.getApprovalTime()).setReceiverId(supplyRequest.getPurposeLocationId())
.setReceiveTime(supplyRequest.getApprovalTime());
supplyDeliveryList.add(supplyDelivery);
}

View File

@@ -59,16 +59,16 @@ public class DepartmentProfitLossOrderServiceImpl implements IDepartmentProfitLo
// 单据分类
List<DepartmentInitDto.IntegerOption> supplyCategoryOption = new ArrayList<>();
supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.GENERAL_PROFIT_AND_LOSS.getValue(),
SupplyCategory.GENERAL_PROFIT_AND_LOSS.getInfo()));
supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.STOCKTAKING_PROFIT_AND_LOSS.getValue(),
SupplyCategory.STOCKTAKING_PROFIT_AND_LOSS.getInfo()));
supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.STANDBY_RESCUE_MEDICINES.getValue(),
SupplyCategory.STANDBY_RESCUE_MEDICINES.getInfo()));
supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.DAMAGED_EXPIRED_MEDICINES.getValue(),
SupplyCategory.DAMAGED_EXPIRED_MEDICINES.getInfo()));
supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.DONATED_MEDICINES.getValue(),
SupplyCategory.DONATED_MEDICINES.getInfo()));
// supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.GENERAL_PROFIT_AND_LOSS.getValue(),
// SupplyCategory.GENERAL_PROFIT_AND_LOSS.getInfo()));
// supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.STOCKTAKING_PROFIT_AND_LOSS.getValue(),
// SupplyCategory.STOCKTAKING_PROFIT_AND_LOSS.getInfo()));
// supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.STANDBY_RESCUE_MEDICINES.getValue(),
// SupplyCategory.STANDBY_RESCUE_MEDICINES.getInfo()));
// supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.DAMAGED_EXPIRED_MEDICINES.getValue(),
// SupplyCategory.DAMAGED_EXPIRED_MEDICINES.getInfo()));
// supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.DONATED_MEDICINES.getValue(),
// SupplyCategory.DONATED_MEDICINES.getInfo()));
purchaseOrderInitDto.setSupplyCategoryOptions(supplyCategoryOption);

View File

@@ -185,11 +185,8 @@ public class DepartmentReceiptApprovalServiceImpl implements IDepartmentReceiptA
}
// 追加追溯码信息
boolean flg = traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.IN.getValue(),
traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.IN.getValue(),
SupplyType.PURCHASE_STOCKIN.getValue());
if (!flg) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
// 调用医保商品采购接口 todo 科室材料相关医保接口未对应
String ybSwitch = SecurityUtils.getLoginUser().getOptionJson().getString(CommonConstants.Option.YB_SWITCH); // 医保开关
@@ -275,11 +272,9 @@ public class DepartmentReceiptApprovalServiceImpl implements IDepartmentReceiptA
}
}
// 追加追溯码信息
boolean flg = traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.OUT.getValue(),
traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.OUT.getValue(),
SupplyType.PURCHASE_RETURN.getValue());
if (!flg) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
// 调用医保采购退货接口
String ybSwitch = SecurityUtils.getLoginUser().getOptionJson().getString(CommonConstants.Option.YB_SWITCH); // 医保开关
if (Whether.YES.getCode().equals(ybSwitch)) {
@@ -642,11 +637,9 @@ public class DepartmentReceiptApprovalServiceImpl implements IDepartmentReceiptA
inventoryItemService.stockIn(inventoryItemList);
}
// 追加追溯码信息
boolean flg = traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.IN.getValue(),
traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.IN.getValue(),
SupplyType.PURCHASE_TRANSFERIN.getValue());
if (!flg) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
}
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, null));
@@ -721,11 +714,9 @@ public class DepartmentReceiptApprovalServiceImpl implements IDepartmentReceiptA
}
}
// 追加追溯码信息
boolean flg = traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.OUT.getValue(),
traceNoAppService.addTraceNoManage(supplyItemDetailList, TraceNoStatus.OUT.getValue(),
SupplyType.PURCHASE_TRANSFEROUT.getValue());
if (!flg) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
}
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, null));

View File

@@ -58,10 +58,10 @@ public class DepartmentRequisitionOrderServiceImpl implements IDepartmentRequisi
// 单据分类
List<DepartmentInitDto.IntegerOption> supplyCategoryOption = new ArrayList<>();
supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.NORMAL.getValue(),
SupplyCategory.NORMAL.getInfo()));
supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.PURCHASE_APPLICATION.getValue(),
SupplyCategory.PURCHASE_APPLICATION.getInfo()));
// supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.NORMAL.getValue(),
// SupplyCategory.NORMAL.getInfo()));
// supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.PURCHASE_APPLICATION.getValue(),
// SupplyCategory.PURCHASE_APPLICATION.getInfo()));
requisitionOrderInitDto.setSupplyCategoryOptions(supplyCategoryOption);

View File

@@ -24,7 +24,6 @@ import com.openhis.web.departmentmanage.appservice.IDepartmentReturnToWarehouseO
import com.openhis.web.departmentmanage.dto.DepartmentDetailDto;
import com.openhis.web.departmentmanage.dto.DepartmentInitDto;
import com.openhis.web.departmentmanage.mapper.DepartmentCommonMapper;
import com.openhis.web.departmentmanage.mapper.DepartmentReturnToWarehouseOrderMapper;
import com.openhis.web.inventorymanage.dto.ProductStocktakingInitDto;
import com.openhis.workflow.domain.SupplyRequest;
import com.openhis.workflow.service.ISupplyRequestService;
@@ -47,6 +46,7 @@ public class DepartmentReturnToWarehouseOrderServiceImpl implements IDepartmentR
private IDepartmentCommonService departmentCommonService;
@Autowired
private DepartmentCommonMapper departmentCommonMapper;
/**
* 初始化
*
@@ -59,8 +59,8 @@ public class DepartmentReturnToWarehouseOrderServiceImpl implements IDepartmentR
// 单据分类
List<DepartmentInitDto.IntegerOption> supplyCategoryOption = new ArrayList<>();
supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.NORMAL.getValue(),
SupplyCategory.NORMAL.getInfo()));
// supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.NORMAL.getValue(),
// SupplyCategory.NORMAL.getInfo()));
purchaseOrderInitDto.setSupplyCategoryOptions(supplyCategoryOption);
@@ -93,16 +93,14 @@ public class DepartmentReturnToWarehouseOrderServiceImpl implements IDepartmentR
List<DepartmentDetailDto.Option> unitList;
for (DepartmentDetailDto item : returnToDispensaryOrderDtoDetailPage.getRecords()) {
unitList = new ArrayList<>();
unitList.add(new DepartmentDetailDto.Option(item.getMaxUnitCode(),item.getMaxUnitCode_dictText()));
unitList.add(new DepartmentDetailDto.Option(item.getMinUnitCode(),item.getMinUnitCode_dictText()
));
unitList.add(new DepartmentDetailDto.Option(item.getMaxUnitCode(), item.getMaxUnitCode_dictText()));
unitList.add(new DepartmentDetailDto.Option(item.getMinUnitCode(), item.getMinUnitCode_dictText()));
item.setUnitList(unitList);
}
return R.ok(returnToDispensaryOrderDtoDetailPage);
}
/**
* 获取单据号
*
@@ -128,7 +126,8 @@ public class DepartmentReturnToWarehouseOrderServiceImpl implements IDepartmentR
@Override
public R<?> addOrEditReturnToWarehouseOrder(List<DepartmentDetailDto> returnToDispensaryOrderDtoList) {
// 请求数据取得
List<SupplyRequest> requestList = supplyRequestService.getSupplyByBusNo(returnToDispensaryOrderDtoList.get(0).getBusNo());
List<SupplyRequest> requestList =
supplyRequestService.getSupplyByBusNo(returnToDispensaryOrderDtoList.get(0).getBusNo());
if (!requestList.isEmpty()) {
// 请求id取得
List<Long> requestIdList = requestList.stream().map(SupplyRequest::getId).collect(Collectors.toList());

View File

@@ -24,7 +24,6 @@ import com.openhis.web.departmentmanage.appservice.IDepartmentStockInOrderServic
import com.openhis.web.departmentmanage.dto.DepartmentDetailDto;
import com.openhis.web.departmentmanage.dto.DepartmentInitDto;
import com.openhis.web.departmentmanage.mapper.DepartmentCommonMapper;
import com.openhis.web.departmentmanage.mapper.DepartmentStockInOrderMapper;
import com.openhis.web.inventorymanage.dto.ProductStocktakingInitDto;
import com.openhis.workflow.domain.SupplyRequest;
import com.openhis.workflow.service.ISupplyRequestService;
@@ -60,8 +59,8 @@ public class DepartmentStockInOrderServiceImpl implements IDepartmentStockInOrde
// 单据分类
List<DepartmentInitDto.IntegerOption> supplyCategoryOption = new ArrayList<>();
supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.NORMAL.getValue(),
SupplyCategory.NORMAL.getInfo()));
// supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.NORMAL.getValue(),
// SupplyCategory.NORMAL.getInfo()));
purchaseOrderInitDto.setSupplyCategoryOptions(supplyCategoryOption);
@@ -134,10 +133,11 @@ public class DepartmentStockInOrderServiceImpl implements IDepartmentStockInOrde
// 单据信息删除
supplyRequestService.removeByIds(requestIdList);
}
//添加原始单据号
if(stockInOrderDtoList.get(0).getOriginalBusNo()!=null){
// 添加原始单据号
if (stockInOrderDtoList.get(0).getOriginalBusNo() != null) {
// 审批单据并返回单据详情
List<SupplyRequest> agreedList = supplyRequestService.addOriginalBusNo(stockInOrderDtoList.get(0).getOriginalBusNo(), stockInOrderDtoList.get(0).getBusNo());
List<SupplyRequest> agreedList = supplyRequestService
.addOriginalBusNo(stockInOrderDtoList.get(0).getOriginalBusNo(), stockInOrderDtoList.get(0).getBusNo());
if (agreedList.isEmpty()) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
}
@@ -156,8 +156,9 @@ public class DepartmentStockInOrderServiceImpl implements IDepartmentStockInOrde
.setTraceNo(item.getTraceNo()).setTraceNoUnitCode(item.getTraceNoUnitCode())
.setSupplierId(item.getSupplierId()).setReason(item.getReason())
.setSourceTypeEnum(LocationForm.WAREHOUSE.getValue()).setSourceLocationId(item.getSourceLocationId())
.setPurposeTypeEnum(LocationForm.DEPARTMENT.getValue()).setPurposeLocationId(item.getPurposeLocationId())
.setApplicantId(item.getApplicantId()).setApplyTime(applyTime).setRemake(item.getRemake());
.setPurposeTypeEnum(LocationForm.DEPARTMENT.getValue())
.setPurposeLocationId(item.getPurposeLocationId()).setApplicantId(item.getApplicantId())
.setApplyTime(applyTime).setRemake(item.getRemake());
supplyRequestList.add(supplyRequest);
}
// 更新请求表

View File

@@ -60,10 +60,10 @@ public class DepartmentStocktakingOrderServiceImpl implements IDepartmentStockta
// 单据分类
List<DepartmentInitDto.IntegerOption> supplyCategoryOption = new ArrayList<>();
supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(
SupplyCategory.GENERAL_STOCKTAKING.getValue(), SupplyCategory.GENERAL_STOCKTAKING.getInfo()));
supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(
SupplyCategory.MONTHLY_STOCKTAKING.getValue(), SupplyCategory.MONTHLY_STOCKTAKING.getInfo()));
// supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(
// SupplyCategory.GENERAL_STOCKTAKING.getValue(), SupplyCategory.GENERAL_STOCKTAKING.getInfo()));
// supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(
// SupplyCategory.MONTHLY_STOCKTAKING.getValue(), SupplyCategory.MONTHLY_STOCKTAKING.getInfo()));
purchaseOrderInitDto.setSupplyCategoryOptions(supplyCategoryOption);

View File

@@ -24,7 +24,6 @@ import com.openhis.web.departmentmanage.appservice.IDepartmentTransferInOrderSer
import com.openhis.web.departmentmanage.dto.DepartmentDetailDto;
import com.openhis.web.departmentmanage.dto.DepartmentInitDto;
import com.openhis.web.departmentmanage.mapper.DepartmentCommonMapper;
import com.openhis.web.departmentmanage.mapper.DepartmentTransferInOrderMapper;
import com.openhis.web.inventorymanage.dto.ProductStocktakingInitDto;
import com.openhis.workflow.domain.SupplyRequest;
import com.openhis.workflow.service.ISupplyRequestService;
@@ -59,8 +58,8 @@ public class DepartmentTransferInOrderServiceImpl implements IDepartmentTransfer
// 单据分类
List<DepartmentInitDto.IntegerOption> supplyCategoryOption = new ArrayList<>();
supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.NORMAL.getValue(),
SupplyCategory.NORMAL.getInfo()));
// supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.NORMAL.getValue(),
// SupplyCategory.NORMAL.getInfo()));
purchaseOrderInitDto.setSupplyCategoryOptions(supplyCategoryOption);
@@ -127,7 +126,8 @@ public class DepartmentTransferInOrderServiceImpl implements IDepartmentTransfer
@Override
public R<?> addOrEditTransferInOrder(List<DepartmentDetailDto> transferInOrderDtoList) {
// 请求数据取得
List<SupplyRequest> requestList = supplyRequestService.getSupplyByBusNo(transferInOrderDtoList.get(0).getBusNo());
List<SupplyRequest> requestList =
supplyRequestService.getSupplyByBusNo(transferInOrderDtoList.get(0).getBusNo());
if (!requestList.isEmpty()) {
// 请求id取得
List<Long> requestIdList = requestList.stream().map(SupplyRequest::getId).collect(Collectors.toList());
@@ -149,8 +149,8 @@ public class DepartmentTransferInOrderServiceImpl implements IDepartmentTransfer
.setTraceNoUnitCode(item.getTraceNoUnitCode()).setSupplierId(item.getSupplierId())
.setReason(item.getReason()).setSourceTypeEnum(LocationForm.DEPARTMENT.getValue())
.setSourceLocationId(item.getSourceLocationId()).setPurposeTypeEnum(LocationForm.DEPARTMENT.getValue())
.setPurposeLocationId(item.getPurposeLocationId())
.setApplicantId(item.getApplicantId()).setApplyTime(applyTime).setRemake(item.getRemake());
.setPurposeLocationId(item.getPurposeLocationId()).setApplicantId(item.getApplicantId())
.setApplyTime(applyTime).setRemake(item.getRemake());
supplyRequestList.add(supplyRequest);
}
// 更新请求表

View File

@@ -59,8 +59,8 @@ public class DepartmentTransferOutOrderServiceImpl implements IDepartmentTransfe
// 单据分类
List<DepartmentInitDto.IntegerOption> supplyCategoryOption = new ArrayList<>();
supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.NORMAL.getValue(),
SupplyCategory.NORMAL.getInfo()));
// supplyCategoryOption.add(new DepartmentInitDto.IntegerOption(SupplyCategory.NORMAL.getValue(),
// SupplyCategory.NORMAL.getInfo()));
purchaseOrderInitDto.setSupplyCategoryOptions(supplyCategoryOption);

View File

@@ -4,9 +4,7 @@ import java.util.List;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.core.common.core.domain.R;
import com.openhis.web.doctorstation.dto.AdviceBaseDto;
import com.openhis.web.doctorstation.dto.AdviceSaveParam;
import com.openhis.web.doctorstation.dto.UpdateGroupIdParam;
import com.openhis.web.doctorstation.dto.*;
/**
* 医生站-医嘱/处方 应用Service
@@ -31,6 +29,15 @@ public interface IDoctorStationAdviceAppService {
List<Long> adviceDefinitionIdParamList, Long organizationId, Integer pageNo, Integer pageSize,
Integer pricingFlag, List<Integer> adviceTypes);
/**
* 查询医嘱绑定信息
*
* @param typeCode 1:用法绑东西 2:诊疗绑东西
* @param itemNo 用法的code 或者 诊疗定义id
* @return 医嘱绑定信息
*/
List<OrderBindInfoDto> getOrderBindInfo(String typeCode, String itemNo);
/**
* 门诊保存医嘱
*

View File

@@ -1,5 +1,7 @@
package com.openhis.web.doctorstation.appservice;
import javax.servlet.http.HttpServletRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.core.common.core.domain.R;
import com.openhis.web.doctorstation.dto.ConditionDefinitionMetadata;
@@ -91,4 +93,12 @@ public interface IDoctorStationDiagnosisAppService {
*/
R<?> delEncounterDiagnosis(Long conditionId);
/**
* 查询诊断信息
*
* @param searchKey 目标字符
* @param request 请求
* @return 查询结果
*/
R<?> getDiagnosisList(String searchKey, HttpServletRequest request);
}

View File

@@ -1,12 +1,5 @@
package com.openhis.web.doctorstation.appservice.impl;
import java.util.*;
import java.util.stream.Collectors;
import javax.annotation.Resource;
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.conditions.update.LambdaUpdateWrapper;
@@ -14,10 +7,13 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
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.enums.TenantOptionDict;
import com.core.common.exception.ServiceException;
import com.core.common.utils.AssignSeqUtil;
import com.core.common.utils.MessageUtils;
import com.core.common.utils.SecurityUtils;
import com.core.common.utils.StringUtils;
import com.core.web.util.TenantOptionUtil;
import com.openhis.administration.domain.ChargeItem;
import com.openhis.administration.service.IChargeItemService;
import com.openhis.common.constant.CommonConstants;
@@ -41,8 +37,13 @@ import com.openhis.workflow.service.IActivityDefinitionService;
import com.openhis.workflow.service.IDeviceDispenseService;
import com.openhis.workflow.service.IDeviceRequestService;
import com.openhis.workflow.service.IServiceRequestService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* 医生站-医嘱/处方 应用实现类
@@ -96,52 +97,60 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
/**
* 查询医嘱信息
*
* @param adviceBaseDto 查询条件
* @param searchKey 模糊查询关键字
* @param locationId 药房id
* @param adviceBaseDto 查询条件
* @param searchKey 模糊查询关键字
* @param locationId 药房id
* @param adviceDefinitionIdParamList 医嘱定义id参数集合
* @param organizationId 患者挂号对应的科室id
* @param pageNo 当前页
* @param pageSize 每页多少条
* @param pricingFlag 划价标记
* @param adviceTypes 医嘱类型参数集合
* @param organizationId 患者挂号对应的科室id
* @param pageNo 当前页
* @param pageSize 每页多少条
* @param pricingFlag 划价标记
* @param adviceTypes 医嘱类型参数集合
* @return 医嘱信息
*/
@Override
public IPage<AdviceBaseDto> getAdviceBaseInfo(AdviceBaseDto adviceBaseDto, String searchKey, Long locationId,
List<Long> adviceDefinitionIdParamList, Long organizationId, Integer pageNo, Integer pageSize,
Integer pricingFlag, List<Integer> adviceTypes) {
List<Long> adviceDefinitionIdParamList, Long organizationId, Integer pageNo, Integer pageSize,
Integer pricingFlag, List<Integer> adviceTypes) {
// 医嘱定价来源
String orderPricingSource = TenantOptionUtil.getOptionContent(TenantOptionDict.ORDER_PRICING_SOURCE);
if (StringUtils.isEmpty(orderPricingSource)) {
throw new ServiceException("租户配置项【医嘱定价来源】未配置");
}
// 构建查询条件
QueryWrapper<AdviceBaseDto> queryWrapper = HisQueryUtils.buildQueryWrapper(adviceBaseDto, searchKey,
new HashSet<>(Arrays.asList("advice_name", "py_str", "wb_str")), null);
new HashSet<>(Arrays.asList("advice_name", "py_str", "wb_str")), null);
IPage<AdviceBaseDto> adviceBaseInfo = doctorStationAdviceAppMapper.getAdviceBaseInfo(
new Page<>(pageNo, pageSize), PublicationStatus.ACTIVE.getValue(), organizationId,
CommonConstants.TableName.MED_MEDICATION_DEFINITION, CommonConstants.TableName.ADM_DEVICE_DEFINITION,
CommonConstants.TableName.WOR_ACTIVITY_DEFINITION, DeviceCategory.SINGLE_USE.getCode(), pricingFlag,
adviceDefinitionIdParamList, adviceTypes, queryWrapper);
new Page<>(pageNo, pageSize), PublicationStatus.ACTIVE.getValue(), organizationId,
CommonConstants.TableName.MED_MEDICATION_DEFINITION, CommonConstants.TableName.ADM_DEVICE_DEFINITION,
CommonConstants.TableName.WOR_ACTIVITY_DEFINITION, pricingFlag, adviceDefinitionIdParamList, adviceTypes,
queryWrapper);
List<AdviceBaseDto> adviceBaseDtoList = adviceBaseInfo.getRecords();
// 医嘱定义ID集合
List<Long> adviceDefinitionIdList =
adviceBaseDtoList.stream().map(AdviceBaseDto::getAdviceDefinitionId).collect(Collectors.toList());
adviceBaseDtoList.stream().map(AdviceBaseDto::getAdviceDefinitionId).collect(Collectors.toList());
// 费用定价主表ID集合
List<Long> chargeItemDefinitionIdList =
adviceBaseDtoList.stream().map(AdviceBaseDto::getChargeItemDefinitionId).collect(Collectors.toList());
adviceBaseDtoList.stream().map(AdviceBaseDto::getChargeItemDefinitionId).collect(Collectors.toList());
// 医嘱库存集合
List<AdviceInventoryDto> adviceInventoryList =
doctorStationAdviceAppMapper.getAdviceInventory(locationId, adviceDefinitionIdList,
CommonConstants.SqlCondition.ABOUT_INVENTORY_TABLE_STR, PublicationStatus.ACTIVE.getValue());
doctorStationAdviceAppMapper.getAdviceInventory(locationId, adviceDefinitionIdList,
CommonConstants.SqlCondition.ABOUT_INVENTORY_TABLE_STR, PublicationStatus.ACTIVE.getValue());
// 待发放个数信息
List<AdviceInventoryDto> adviceDraftInventoryList = doctorStationAdviceAppMapper.getAdviceDraftInventory(
CommonConstants.TableName.MED_MEDICATION_DEFINITION, CommonConstants.TableName.ADM_DEVICE_DEFINITION,
DispenseStatus.DRAFT.getValue(), DispenseStatus.PREPARATION.getValue());
CommonConstants.TableName.MED_MEDICATION_DEFINITION, CommonConstants.TableName.ADM_DEVICE_DEFINITION,
DispenseStatus.DRAFT.getValue(), DispenseStatus.PREPARATION.getValue());
// 预减库存
List<AdviceInventoryDto> adviceInventory =
adviceUtils.subtractInventory(adviceInventoryList, adviceDraftInventoryList);
adviceUtils.subtractInventory(adviceInventoryList, adviceDraftInventoryList);
// 查询取药科室配置
List<AdviceInventoryDto> medLocationConfig = doctorStationAdviceAppMapper.getMedLocationConfig(organizationId);
// 费用定价子表信息
List<AdvicePriceDto> childCharge = doctorStationAdviceAppMapper
.getChildCharge(ConditionCode.LOT_NUMBER_COST.getCode(), chargeItemDefinitionIdList);
.getChildCharge(ConditionCode.LOT_NUMBER_PRICE.getCode(), chargeItemDefinitionIdList);
// 费用定价主表信息
List<AdvicePriceDto> mainCharge = doctorStationAdviceAppMapper.getMainCharge(chargeItemDefinitionIdList);
List<AdvicePriceDto> mainCharge =
doctorStationAdviceAppMapper.getMainCharge(chargeItemDefinitionIdList, PublicationStatus.ACTIVE.getValue());
String unitCode = ""; // 包装单位
Long chargeItemDefinitionId; // 费用定价主表ID
for (AdviceBaseDto baseDto : adviceBaseDtoList) {
@@ -149,22 +158,42 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
case CommonConstants.TableName.MED_MEDICATION_DEFINITION: // 药品
// 是否皮试
baseDto
.setSkinTestFlag_enumText(EnumUtils.getInfoByValue(Whether.class, baseDto.getSkinTestFlag()));
.setSkinTestFlag_enumText(EnumUtils.getInfoByValue(Whether.class, baseDto.getSkinTestFlag()));
// 是否为注射药物
baseDto.setInjectFlag_enumText(EnumUtils.getInfoByValue(Whether.class, baseDto.getInjectFlag()));
case CommonConstants.TableName.ADM_DEVICE_DEFINITION: // 耗材
// 每一条医嘱的库存集合信息 , 包装单位库存前端计算
List<
AdviceInventoryDto> inventoryList =
AdviceInventoryDto> inventoryList =
adviceInventory.stream()
.filter(e -> baseDto.getAdviceDefinitionId().equals(e.getItemId())
&& baseDto.getAdviceTableName().equals(e.getItemTable()))
.collect(Collectors.toList());
.filter(e -> baseDto.getAdviceDefinitionId().equals(e.getItemId())
&& baseDto.getAdviceTableName().equals(e.getItemTable()))
.collect(Collectors.toList());
// 库存信息
baseDto.setInventoryList(inventoryList);
// 如果有库存信息,设置默认产品批号
// 设置默认产品批号
if (!inventoryList.isEmpty()) {
baseDto.setDefaultLotNumber(inventoryList.get(0).getLotNumber());
// 库存大于0
List<AdviceInventoryDto> hasInventoryList = inventoryList.stream()
.filter(e -> e.getQuantity().compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList());
if (!hasInventoryList.isEmpty()) {
baseDto.setDefaultLotNumber(hasInventoryList.get(0).getLotNumber());
}
}
if (!inventoryList.isEmpty() && !medLocationConfig.isEmpty()) {
// 第一步在medLocationConfig中匹配categoryCode
AdviceInventoryDto result1 = medLocationConfig.stream()
.filter(dto -> baseDto.getCategoryCode().equals(dto.getCategoryCode())).findFirst()
.orElse(null);
if (result1 != null) {
// 第二步在inventoryList中匹配locationId
AdviceInventoryDto result2 = inventoryList.stream()
.filter(dto -> result1.getLocationId().equals(dto.getLocationId())).findFirst()
.orElse(null);
if (result2 != null && result2.getLotNumber() != null) {
baseDto.setDefaultLotNumber(result2.getLotNumber());
}
}
}
unitCode = baseDto.getUnitCode();
chargeItemDefinitionId = baseDto.getChargeItemDefinitionId();
@@ -173,26 +202,35 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
for (AdviceInventoryDto adviceInventoryDto : inventoryList) {
Long finalChargeItemDefinitionId = chargeItemDefinitionId;
String finalUnitCode = unitCode;
// 匹配包装单位
List<AdvicePriceDto> advicePrice = childCharge.stream()
.filter(e -> e.getDefinitionId().equals(finalChargeItemDefinitionId)
&& e.getConditionValue().equals(adviceInventoryDto.getLotNumber()))
.peek(e -> e.setUnitCode(finalUnitCode)) // 设置 unitCode
.collect(Collectors.toList());
priceDtoList.addAll(advicePrice);
// 从定价子表取价格(适用于批次售卖场景)
List<AdvicePriceDto> childPrice = childCharge.stream()
.filter(e -> e.getDefinitionId().equals(finalChargeItemDefinitionId)
&& e.getConditionValue().equals(adviceInventoryDto.getLotNumber()))
.peek(e -> e.setUnitCode(finalUnitCode)) // 设置 unitCode
.collect(Collectors.toList());
// 从定价主表取价格(适用于统一零售价场景)
List<AdvicePriceDto> mainPrice = mainCharge.stream()
.filter(e -> baseDto.getChargeItemDefinitionId().equals(e.getDefinitionId()))
.collect(Collectors.toList());
// 按批次售价
if (OrderPricingSource.BATCH_SELLING_PRICE.getCode().equals(orderPricingSource)) {
priceDtoList.addAll(childPrice);
} else {
priceDtoList.addAll(mainPrice);
}
}
// 价格信息
baseDto.setPriceList(priceDtoList);
break;
case CommonConstants.TableName.WOR_ACTIVITY_DEFINITION: // 诊疗
List<AdvicePriceDto> priceList =
mainCharge.stream().filter(e -> baseDto.getChargeItemDefinitionId().equals(e.getDefinitionId()))
.collect(Collectors.toList());
mainCharge.stream().filter(e -> baseDto.getChargeItemDefinitionId().equals(e.getDefinitionId()))
.collect(Collectors.toList());
// 价格信息
baseDto.setPriceList(priceList);
// 活动类型
baseDto.setActivityType_enumText(
EnumUtils.getInfoByValue(ActivityType.class, baseDto.getActivityType()));
EnumUtils.getInfoByValue(ActivityType.class, baseDto.getActivityType()));
break;
default:
break;
@@ -201,11 +239,23 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
return adviceBaseInfo;
}
/**
* 查询医嘱绑定信息
*
* @param typeCode 1:用法绑东西 2:诊疗绑东西
* @param itemNo 用法的code 或者 诊疗定义id
* @return 医嘱绑定信息
*/
@Override
public List<OrderBindInfoDto> getOrderBindInfo(String typeCode, String itemNo) {
return doctorStationAdviceAppMapper.getOrderBindInfo(typeCode, PublicationStatus.ACTIVE.getValue(), itemNo);
}
/**
* 门诊保存/签发医嘱
*
* @param adviceSaveParam 医嘱表单信息
* @param adviceOpType 医嘱操作类型
* @param adviceOpType 医嘱操作类型
* @return 结果
*/
@Override
@@ -216,21 +266,21 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
List<AdviceSaveDto> adviceSaveList = adviceSaveParam.getAdviceSaveList();
// 药品
List<AdviceSaveDto> medicineList = adviceSaveList.stream()
.filter(e -> ItemType.MEDICINE.getValue().equals(e.getAdviceType())).collect(Collectors.toList());
.filter(e -> ItemType.MEDICINE.getValue().equals(e.getAdviceType())).collect(Collectors.toList());
// 耗材
List<AdviceSaveDto> deviceList = adviceSaveList.stream()
.filter(e -> ItemType.DEVICE.getValue().equals(e.getAdviceType())).collect(Collectors.toList());
.filter(e -> ItemType.DEVICE.getValue().equals(e.getAdviceType())).collect(Collectors.toList());
// 诊疗活动
List<AdviceSaveDto> activityList = adviceSaveList.stream()
.filter(e -> ItemType.ACTIVITY.getValue().equals(e.getAdviceType())).collect(Collectors.toList());
.filter(e -> ItemType.ACTIVITY.getValue().equals(e.getAdviceType())).collect(Collectors.toList());
/**
* 保存时,校验库存
*/
if (AdviceOpType.SAVE_ADVICE.getCode().equals(adviceOpType)) {
List<AdviceSaveDto> needCheckList =
adviceSaveList.stream().filter(e -> !DbOpType.DELETE.getCode().equals(e.getDbOpType())
&& !ItemType.ACTIVITY.getValue().equals(e.getAdviceType())).collect(Collectors.toList());
adviceSaveList.stream().filter(e -> !DbOpType.DELETE.getCode().equals(e.getDbOpType())
&& !ItemType.ACTIVITY.getValue().equals(e.getAdviceType())).collect(Collectors.toList());
// 校验库存
String tipRes = adviceUtils.checkInventory(needCheckList);
if (tipRes != null) {
@@ -261,25 +311,25 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
if (AdviceOpType.SIGN_ADVICE.getCode().equals(adviceOpType) && !adviceSaveList.isEmpty()) {
// 签发的医嘱id集合
List<Long> requestIds = adviceSaveList.stream()
.filter(e -> !DbOpType.DELETE.getCode().equals(e.getDbOpType()) && e.getRequestId() != null)
.collect(Collectors.toList()).stream().map(AdviceSaveDto::getRequestId).collect(Collectors.toList());
.filter(e -> !DbOpType.DELETE.getCode().equals(e.getDbOpType()) && e.getRequestId() != null)
.collect(Collectors.toList()).stream().map(AdviceSaveDto::getRequestId).collect(Collectors.toList());
// 就诊id
Long encounterId = adviceSaveList.get(0).getEncounterId();
iChargeItemService.update(new LambdaUpdateWrapper<ChargeItem>()
.set(ChargeItem::getStatusEnum, ChargeItemStatus.PLANNED.getValue())
.eq(ChargeItem::getEncounterId, encounterId)
.eq(ChargeItem::getStatusEnum, ChargeItemStatus.DRAFT.getValue())
.in(ChargeItem::getServiceId, requestIds));
.set(ChargeItem::getStatusEnum, ChargeItemStatus.PLANNED.getValue())
.eq(ChargeItem::getEncounterId, encounterId)
.eq(ChargeItem::getStatusEnum, ChargeItemStatus.DRAFT.getValue())
.in(ChargeItem::getServiceId, requestIds));
}
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"门诊医嘱"}));
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"门诊医嘱"}));
}
/**
* 处理药品
*/
private void handMedication(List<AdviceSaveDto> medicineList, Date curDate, String adviceOpType,
Long organizationId, String signCode) {
Long organizationId, String signCode) {
// 当前登录账号的科室id
Long orgId = SecurityUtils.getLoginUser().getOrgId();
// 保存操作
@@ -292,41 +342,38 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
ChargeItem chargeItem;
// 新增 + 修改
List<AdviceSaveDto> insertOrUpdateList =
medicineList.stream().filter(e -> (DbOpType.INSERT.getCode().equals(e.getDbOpType())
|| DbOpType.UPDATE.getCode().equals(e.getDbOpType()))).collect(Collectors.toList());
medicineList.stream().filter(e -> (DbOpType.INSERT.getCode().equals(e.getDbOpType())
|| DbOpType.UPDATE.getCode().equals(e.getDbOpType()))).collect(Collectors.toList());
// 删除
List<AdviceSaveDto> deleteList = medicineList.stream()
.filter(e -> DbOpType.DELETE.getCode().equals(e.getDbOpType())).collect(Collectors.toList());
.filter(e -> DbOpType.DELETE.getCode().equals(e.getDbOpType())).collect(Collectors.toList());
// 校验删除的医嘱是否已经收费
List<Long> delRequestIdList = deleteList.stream().map(AdviceSaveDto::getRequestId).collect(Collectors.toList());
if (!delRequestIdList.isEmpty()) {
List<ChargeItem> chargeItemList = iChargeItemService.getChargeItemInfoByReqId(delRequestIdList);
if (chargeItemList != null && !chargeItemList.isEmpty()) {
for (ChargeItem ci : chargeItemList) {
if (ChargeItemStatus.BILLED.getValue().equals(ci.getStatusEnum())) {
throw new ServiceException("已收费的项目无法删除,请刷新页面后重试");
}
}
}
}
for (AdviceSaveDto adviceSaveDto : deleteList) {
iMedicationRequestService.removeById(adviceSaveDto.getRequestId());
// 删除已经产生的药品发放信息
iMedicationDispenseService.deleteMedicationDispense(adviceSaveDto.getRequestId());
// 删除费用项
iChargeItemService.deleteByServiceTableAndId(CommonConstants.TableName.MED_MEDICATION_REQUEST,
adviceSaveDto.getRequestId());
adviceSaveDto.getRequestId());
// 删除基于这个药品生成的需要执行的诊疗请求
iServiceRequestService.remove(
new LambdaQueryWrapper<ServiceRequest>().eq(ServiceRequest::getBasedOnId, adviceSaveDto.getRequestId())
.isNotNull(ServiceRequest::getBasedOnTable)
.eq(ServiceRequest::getStatusEnum, RequestStatus.COMPLETED.getValue()));
new LambdaQueryWrapper<ServiceRequest>().eq(ServiceRequest::getBasedOnId, adviceSaveDto.getRequestId())
.isNotNull(ServiceRequest::getBasedOnTable)
.eq(ServiceRequest::getStatusEnum, RequestStatus.COMPLETED.getValue()));
}
// 当前时间毫秒值
Long currentTimeMillis = System.currentTimeMillis();
// 签发时
if (is_sign) {
// 对组号进行二次处理
Long i = 1L;
for (AdviceSaveDto adviceSaveDto : insertOrUpdateList) {
// 输液标记
if (Whether.YES.getValue().equals(adviceSaveDto.getInjectFlag())) {
if (adviceSaveDto.getGroupId() == null) {
adviceSaveDto.setGroupId(currentTimeMillis + i);
} else {
adviceSaveDto.setGroupId(currentTimeMillis + adviceSaveDto.getGroupId());
}
}
i = ++i;
}
// 生成处方号
prescriptionUtils.generatePrescriptionNumbers(insertOrUpdateList);
}
@@ -340,9 +387,10 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
if (is_sign) {
medicationRequest.setSignCode(signCode);
}
// 只有保存时处理的字段属性
// 保存时,处理数据(请求,发放,账单)
if (is_save) {
medicationRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.MEDICATION_RES_NO.getPrefix(), 4));
medicationRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源
medicationRequest.setQuantity(adviceSaveDto.getQuantity()); // 请求数量
medicationRequest.setExecuteNum(adviceSaveDto.getExecuteNum()); // 执行次数
medicationRequest.setUnitCode(adviceSaveDto.getUnitCode()); // 请求单位编码
@@ -372,24 +420,18 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
medicationRequest.setSortNumber(adviceSaveDto.getSortNumber()); // 排序号
}
iMedicationRequestService.saveOrUpdate(medicationRequest);
// 第一次保存时,如果药品请求为皮试或输液,自动开立对应绑定的诊疗请求
if (adviceSaveDto.getRequestId() == null) {
if (is_save && (Whether.YES.getValue().equals(adviceSaveDto.getSkinTestFlag())
|| Whether.YES.getValue().equals(adviceSaveDto.getInjectFlag()))) {
// 查询已经存在的当前数据
medicationRequest = iMedicationRequestService.getById(medicationRequest.getId());
adviceUtils.generateActRequestByMedicationFlag(medicationRequest, organizationId, adviceSaveDto);
}
}
// 保存时 处理药品发放 和 保存药品费用项
if (is_save) {
// 处理药品发放
iMedicationDispenseService.handleMedicationDispense(medicationRequest, adviceSaveDto.getDbOpType());
Long dispenseId =
iMedicationDispenseService.handleMedicationDispense(medicationRequest, adviceSaveDto.getDbOpType());
// 保存药品费用项
chargeItem = new ChargeItem();
chargeItem.setId(adviceSaveDto.getChargeItemId()); // 费用项id
chargeItem.setStatusEnum(ChargeItemStatus.DRAFT.getValue()); // 收费状态
chargeItem.setBusNo(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix().concat(medicationRequest.getBusNo()));
chargeItem.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源
chargeItem.setPrescriptionNo(adviceSaveDto.getPrescriptionNo()); // 处方号
chargeItem.setPatientId(adviceSaveDto.getPatientId()); // 患者
chargeItem.setContextEnum(adviceSaveDto.getAdviceType()); // 类型
@@ -406,6 +448,7 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
chargeItem.setAccountId(adviceSaveDto.getAccountId());// 关联账户ID
chargeItem.setConditionId(adviceSaveDto.getConditionId()); // 诊断id
chargeItem.setEncounterDiagnosisId(adviceSaveDto.getEncounterDiagnosisId()); // 就诊诊断id
chargeItem.setDispenseId(dispenseId); // 发放ID
chargeItem.setQuantityValue(adviceSaveDto.getQuantity()); // 数量
chargeItem.setQuantityUnit(adviceSaveDto.getUnitCode()); // 单位
@@ -413,82 +456,9 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
chargeItem.setTotalPrice(adviceSaveDto.getTotalPrice()); // 总价
iChargeItemService.saveOrUpdate(chargeItem);
}
}
// 签发时
/* if (is_sign) {
// --------------------如果是输液药品,生成仅用于执行的 "静脉输液" request(同一个组号生成一个)
List<AdviceSaveDto> injectList = insertOrUpdateList.stream()
.filter(dto -> Whether.YES.getValue().equals(dto.getInjectFlag()) && dto.getGroupId() != null) // 过滤条件输液且groupId不为null
.collect(Collectors.groupingBy(AdviceSaveDto::getGroupId)) // 按groupId分组
.values().stream().map(group -> group.get(0)).collect(Collectors.toList()); // 取每组中的第一个元素
// 静脉输液的诊疗定义id
Long intravenousInfusionDefinitionId = iActivityDefinitionService
.getAppointActivityDefinitionId(CommonConstants.BusinessName.INTRAVENOUS_INFUSION);
// 对应的诊疗医嘱信息
AdviceBaseDto injectQueryAdviceBaseDto = new AdviceBaseDto();
injectQueryAdviceBaseDto.setAdviceDefinitionId(intravenousInfusionDefinitionId); // 医嘱定义id
AdviceBaseDto injectAdviceBaseDto = this.getAdviceBaseInfo(injectQueryAdviceBaseDto, null, null, null,
organizationId, 1, 1, Whether.NO.getValue(), List.of(1, 2, 3)).getRecords().get(0);
ServiceRequest serviceRequestInjectExe;
for (AdviceSaveDto adviceSaveDto : injectList) {
Long groupId = adviceSaveDto.getGroupId();// 组号
Integer quantity = adviceSaveDto.getExecuteNum();// 执行次数
// 生成诊疗请求
serviceRequestInjectExe = new ServiceRequest();
serviceRequestInjectExe.setStatusEnum(RequestStatus.COMPLETED.getValue());// 请求状态,已完成
serviceRequestInjectExe
.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.SERVICE_RES_NO.getPrefix(), 4));
serviceRequestInjectExe.setQuantity(quantity); // 请求数量
serviceRequestInjectExe.setUnitCode(injectAdviceBaseDto.getUnitCode()); // 请求单位编码
serviceRequestInjectExe.setCategoryEnum(EncounterClass.AMB.getValue()); // 请求类型,默认-门诊
serviceRequestInjectExe.setActivityId(injectAdviceBaseDto.getAdviceDefinitionId());// 诊疗定义id
serviceRequestInjectExe.setPatientId(adviceSaveDto.getPatientId()); // 患者
serviceRequestInjectExe.setRequesterId(SecurityUtils.getLoginUser().getPractitionerId()); // 开方医生
serviceRequestInjectExe.setEncounterId(adviceSaveDto.getEncounterId()); // 就诊id
serviceRequestInjectExe.setAuthoredTime(curDate); // 请求签发时间
serviceRequestInjectExe.setOrgId(organizationId); // 执行科室
serviceRequestInjectExe.setBasedOnTable(CommonConstants.TableName.MED_MEDICATION_REQUEST);
serviceRequestInjectExe.setBasedOnId(adviceSaveDto.getRequestId());
serviceRequestInjectExe.setConditionId(adviceSaveDto.getConditionId()); // 诊断id
serviceRequestInjectExe.setEncounterDiagnosisId(adviceSaveDto.getEncounterDiagnosisId()); // 就诊诊断id
serviceRequestInjectExe.setGroupId(groupId);// 组号
iServiceRequestService.save(serviceRequestInjectExe);
}
// --------------------如果是皮试药品,生成仅用于执行的 "皮试检查" request(每个药品生成一个)
List<AdviceSaveDto> skinTestList = insertOrUpdateList.stream()
.filter(dto -> Whether.YES.getValue().equals(dto.getSkinTestFlag())).collect(Collectors.toList());
// 皮试检查的诊疗定义id
Long skinTestInspectionDefinitionId = iActivityDefinitionService
.getAppointActivityDefinitionId(CommonConstants.BusinessName.SKIN_TEST_INSPECTION);
AdviceBaseDto skinTestQueryAdviceBaseDto = new AdviceBaseDto();
skinTestQueryAdviceBaseDto.setAdviceDefinitionId(skinTestInspectionDefinitionId); // 医嘱定义id
// 对应的诊疗医嘱信息
AdviceBaseDto skinTestAdviceBaseDto = this.getAdviceBaseInfo(skinTestQueryAdviceBaseDto, null, null, null,
organizationId, 1, 1, Whether.NO.getValue(), List.of(1, 2, 3)).getRecords().get(0);
ServiceRequest serviceRequestSkinTestExe;
for (AdviceSaveDto adviceSaveDto : skinTestList) {
// 生成诊疗请求,用于执行
serviceRequestSkinTestExe = new ServiceRequest();
serviceRequestSkinTestExe.setStatusEnum(RequestStatus.COMPLETED.getValue());// 请求状态,已完成
serviceRequestSkinTestExe
.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.SERVICE_RES_NO.getPrefix(), 4));
serviceRequestSkinTestExe.setQuantity(1); // 请求数量
serviceRequestSkinTestExe.setUnitCode(skinTestAdviceBaseDto.getUnitCode()); // 请求单位编码
serviceRequestSkinTestExe.setCategoryEnum(EncounterClass.AMB.getValue()); // 请求类型,默认-门诊
serviceRequestSkinTestExe.setActivityId(skinTestAdviceBaseDto.getAdviceDefinitionId());// 诊疗定义id
serviceRequestSkinTestExe.setPatientId(adviceSaveDto.getPatientId()); // 患者
serviceRequestSkinTestExe.setRequesterId(SecurityUtils.getLoginUser().getPractitionerId()); // 开方医生
serviceRequestSkinTestExe.setEncounterId(adviceSaveDto.getEncounterId()); // 就诊id
serviceRequestSkinTestExe.setAuthoredTime(curDate); // 请求签发时间
serviceRequestSkinTestExe.setOrgId(organizationId); // 执行科室
serviceRequestSkinTestExe.setBasedOnTable(CommonConstants.TableName.MED_MEDICATION_REQUEST);
serviceRequestSkinTestExe.setBasedOnId(adviceSaveDto.getRequestId());
serviceRequestSkinTestExe.setConditionId(adviceSaveDto.getConditionId()); // 诊断id
serviceRequestSkinTestExe.setEncounterDiagnosisId(adviceSaveDto.getEncounterDiagnosisId()); // 就诊诊断id
iServiceRequestService.save(serviceRequestSkinTestExe);
}
}*/
}
/**
@@ -506,27 +476,41 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
ChargeItem chargeItem;
// 新增 + 修改
List<AdviceSaveDto> insertOrUpdateList =
deviceList.stream().filter(e -> (DbOpType.INSERT.getCode().equals(e.getDbOpType())
|| DbOpType.UPDATE.getCode().equals(e.getDbOpType()))).collect(Collectors.toList());
deviceList.stream().filter(e -> (DbOpType.INSERT.getCode().equals(e.getDbOpType())
|| DbOpType.UPDATE.getCode().equals(e.getDbOpType()))).collect(Collectors.toList());
// 删除
List<AdviceSaveDto> deleteList = deviceList.stream()
.filter(e -> DbOpType.DELETE.getCode().equals(e.getDbOpType())).collect(Collectors.toList());
.filter(e -> DbOpType.DELETE.getCode().equals(e.getDbOpType())).collect(Collectors.toList());
// 校验删除的医嘱是否已经收费
List<Long> delRequestIdList = deleteList.stream().map(AdviceSaveDto::getRequestId).collect(Collectors.toList());
if (!delRequestIdList.isEmpty()) {
List<ChargeItem> chargeItemList = iChargeItemService.getChargeItemInfoByReqId(delRequestIdList);
if (chargeItemList != null && !chargeItemList.isEmpty()) {
for (ChargeItem ci : chargeItemList) {
if (ChargeItemStatus.BILLED.getValue().equals(ci.getStatusEnum())) {
throw new ServiceException("已收费的项目无法删除,请刷新页面后重试");
}
}
}
}
for (AdviceSaveDto adviceSaveDto : deleteList) {
iDeviceRequestService.removeById(adviceSaveDto.getRequestId());
// 删除已经产生的耗材发放信息
iDeviceDispenseService.deleteDeviceDispense(adviceSaveDto.getRequestId());
// 删除费用项
iChargeItemService.deleteByServiceTableAndId(CommonConstants.TableName.WOR_DEVICE_REQUEST,
adviceSaveDto.getRequestId());
adviceSaveDto.getRequestId());
}
for (AdviceSaveDto adviceSaveDto : insertOrUpdateList) {
deviceRequest = new DeviceRequest();
deviceRequest.setId(adviceSaveDto.getRequestId()); // 主键id
deviceRequest.setStatusEnum(is_save ? RequestStatus.DRAFT.getValue() : RequestStatus.ACTIVE.getValue()); // 请求状态
// 只有保存时才处理的字段属性
// 保存时,处理数据(请求,发放,账单)
if (is_save) {
deviceRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.DEVICE_RES_NO.getPrefix(), 4));
deviceRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源
deviceRequest.setQuantity(adviceSaveDto.getQuantity()); // 请求数量
deviceRequest.setUnitCode(adviceSaveDto.getUnitCode()); // 请求单位编码
deviceRequest.setLotNumber(adviceSaveDto.getLotNumber());// 产品批号
@@ -546,19 +530,20 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
deviceRequest.setYbClassEnum(adviceSaveDto.getYbClassEnum());// 类别医保编码
deviceRequest.setConditionId(adviceSaveDto.getConditionId()); // 诊断id
deviceRequest.setEncounterDiagnosisId(adviceSaveDto.getEncounterDiagnosisId()); // 就诊诊断id
}
iDeviceRequestService.saveOrUpdate(deviceRequest);
// 保存时 处理耗材发放 和 保存耗材费用项
if (is_save) {
// 处理耗材发放
iDeviceDispenseService.handleDeviceDispense(deviceRequest, adviceSaveDto.getDbOpType());
Long dispenseId =
iDeviceDispenseService.handleDeviceDispense(deviceRequest, adviceSaveDto.getDbOpType());
// 保存耗材费用项
chargeItem = new ChargeItem();
chargeItem.setId(adviceSaveDto.getChargeItemId()); // 费用项id
chargeItem.setStatusEnum(ChargeItemStatus.DRAFT.getValue()); // 收费状态
chargeItem.setBusNo(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix().concat(deviceRequest.getBusNo()));
chargeItem.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源
chargeItem.setPatientId(adviceSaveDto.getPatientId()); // 患者
chargeItem.setContextEnum(adviceSaveDto.getAdviceType()); // 类型
chargeItem.setEncounterId(adviceSaveDto.getEncounterId()); // 就诊id
@@ -574,6 +559,7 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
chargeItem.setAccountId(adviceSaveDto.getAccountId());// 关联账户ID
chargeItem.setConditionId(adviceSaveDto.getConditionId()); // 诊断id
chargeItem.setEncounterDiagnosisId(adviceSaveDto.getEncounterDiagnosisId()); // 就诊诊断id
chargeItem.setDispenseId(dispenseId); // 发放ID
chargeItem.setQuantityValue(adviceSaveDto.getQuantity()); // 数量
chargeItem.setQuantityUnit(adviceSaveDto.getUnitCode()); // 单位
@@ -589,7 +575,7 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
* 处理诊疗
*/
private void handService(List<AdviceSaveDto> activityList, Date curDate, String adviceOpType, Long organizationId,
String signCode) {
String signCode) {
// 当前登录账号的科室id
Long orgId = SecurityUtils.getLoginUser().getOrgId();
// 保存操作
@@ -601,16 +587,30 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
ChargeItem chargeItem;
// 新增 + 修改
List<AdviceSaveDto> insertOrUpdateList =
activityList.stream().filter(e -> (DbOpType.INSERT.getCode().equals(e.getDbOpType())
|| DbOpType.UPDATE.getCode().equals(e.getDbOpType()))).collect(Collectors.toList());
activityList.stream().filter(e -> (DbOpType.INSERT.getCode().equals(e.getDbOpType())
|| DbOpType.UPDATE.getCode().equals(e.getDbOpType()))).collect(Collectors.toList());
// 删除
List<AdviceSaveDto> deleteList = activityList.stream()
.filter(e -> DbOpType.DELETE.getCode().equals(e.getDbOpType())).collect(Collectors.toList());
.filter(e -> DbOpType.DELETE.getCode().equals(e.getDbOpType())).collect(Collectors.toList());
// 校验删除的医嘱是否已经收费
List<Long> delRequestIdList = deleteList.stream().map(AdviceSaveDto::getRequestId).collect(Collectors.toList());
if (!delRequestIdList.isEmpty()) {
List<ChargeItem> chargeItemList = iChargeItemService.getChargeItemInfoByReqId(delRequestIdList);
if (chargeItemList != null && !chargeItemList.isEmpty()) {
for (ChargeItem ci : chargeItemList) {
if (ChargeItemStatus.BILLED.getValue().equals(ci.getStatusEnum())) {
throw new ServiceException("已收费的项目无法删除,请刷新页面后重试");
}
}
}
}
for (AdviceSaveDto adviceSaveDto : deleteList) {
iServiceRequestService.removeById(adviceSaveDto.getRequestId());
iServiceRequestService.removeById(adviceSaveDto.getRequestId());// 删除诊疗
iServiceRequestService.remove(
new LambdaQueryWrapper<ServiceRequest>().eq(ServiceRequest::getParentId, adviceSaveDto.getRequestId()));// 删除诊疗套餐对应的子项
// 删除费用项
iChargeItemService.deleteByServiceTableAndId(CommonConstants.TableName.WOR_SERVICE_REQUEST,
adviceSaveDto.getRequestId());
adviceSaveDto.getRequestId());
}
for (AdviceSaveDto adviceSaveDto : insertOrUpdateList) {
@@ -623,6 +623,7 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
// 只有保存时才处理的字段属性
if (is_save) {
serviceRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.SERVICE_RES_NO.getPrefix(), 4));
serviceRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源
serviceRequest.setQuantity(adviceSaveDto.getQuantity()); // 请求数量
serviceRequest.setUnitCode(adviceSaveDto.getUnitCode()); // 请求单位编码
@@ -648,6 +649,7 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
chargeItem.setId(adviceSaveDto.getChargeItemId()); // 费用项id
chargeItem.setStatusEnum(ChargeItemStatus.DRAFT.getValue()); // 收费状态
chargeItem.setBusNo(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix().concat(serviceRequest.getBusNo()));
chargeItem.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源
chargeItem.setPatientId(adviceSaveDto.getPatientId()); // 患者
chargeItem.setContextEnum(adviceSaveDto.getAdviceType()); // 类型
chargeItem.setEncounterId(adviceSaveDto.getEncounterId()); // 就诊id
@@ -673,7 +675,7 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
// 第一次保存时,处理诊疗套餐的子项信息
if (adviceSaveDto.getRequestId() == null) {
ActivityDefinition activityDefinition =
iActivityDefinitionService.getById(adviceSaveDto.getAdviceDefinitionId());
iActivityDefinitionService.getById(adviceSaveDto.getAdviceDefinitionId());
String childrenJson = activityDefinition.getChildrenJson();
if (childrenJson != null) {
// 诊疗子项参数类
@@ -683,6 +685,7 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
activityChildrenJsonParams.setEncounterId(serviceRequest.getEncounterId()); // 就诊id
activityChildrenJsonParams.setAccountId(chargeItem.getAccountId()); // 账户id
activityChildrenJsonParams.setChargeItemId(chargeItem.getId()); // 费用项id
activityChildrenJsonParams.setParentId(serviceRequest.getId());// 子项诊疗的父id
adviceUtils.handleActivityChild(childrenJson, organizationId, activityChildrenJsonParams);
}
}
@@ -693,8 +696,21 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
// 发送跨系统申请
adviceSaveDto.setRequestId(serviceRequest.getId());
try {
doctorStationSendApplyUtil.sendCrossSystemApply(adviceSaveDto, organizationId, curDate);
// 查询诊疗定义
ActivityDefinition activityDefinition =
iActivityDefinitionService.getById(adviceSaveDto.getAdviceDefinitionId());
if (activityDefinition != null) {
// 检验 或 检查
if (ActivityType.PROOF.getValue().equals(activityDefinition.getTypeEnum())
|| ActivityType.TEST.getValue().equals(activityDefinition.getTypeEnum())) {
doctorStationSendApplyUtil.sendCrossSystemApply(adviceSaveDto, organizationId, curDate);
}
}
} catch (Exception e) {
if (!Whether.YES.getCode()
.equals(TenantOptionUtil.getOptionContent(TenantOptionDict.LIS_PACS_ERROR_IGNORE))) {
throw e;
}
log.error(e.getMessage(), e);
}
}
@@ -713,21 +729,22 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
// 医嘱请求数据
List<RequestBaseDto> requestBaseInfo = doctorStationAdviceAppMapper.getRequestBaseInfo(encounterId, null,
CommonConstants.TableName.MED_MEDICATION_REQUEST, CommonConstants.TableName.WOR_DEVICE_REQUEST,
CommonConstants.TableName.WOR_SERVICE_REQUEST, practitionerId, Whether.NO.getCode());
CommonConstants.TableName.MED_MEDICATION_REQUEST, CommonConstants.TableName.WOR_DEVICE_REQUEST,
CommonConstants.TableName.WOR_SERVICE_REQUEST, practitionerId, Whether.NO.getCode(),
GenerateSource.DOCTOR_PRESCRIPTION.getValue());
for (RequestBaseDto requestBaseDto : requestBaseInfo) {
// 请求状态
requestBaseDto
.setStatusEnum_enumText(EnumUtils.getInfoByValue(RequestStatus.class, requestBaseDto.getStatusEnum()));
.setStatusEnum_enumText(EnumUtils.getInfoByValue(RequestStatus.class, requestBaseDto.getStatusEnum()));
// 是否皮试
requestBaseDto
.setSkinTestFlag_enumText(EnumUtils.getInfoByValue(Whether.class, requestBaseDto.getSkinTestFlag()));
.setSkinTestFlag_enumText(EnumUtils.getInfoByValue(Whether.class, requestBaseDto.getSkinTestFlag()));
// 是否为注射药物
requestBaseDto
.setInjectFlag_enumText(EnumUtils.getInfoByValue(Whether.class, requestBaseDto.getInjectFlag()));
.setInjectFlag_enumText(EnumUtils.getInfoByValue(Whether.class, requestBaseDto.getInjectFlag()));
// 收费状态
requestBaseDto.setChargeStatus_enumText(
EnumUtils.getInfoByValue(ChargeItemStatus.class, requestBaseDto.getChargeStatus()));
EnumUtils.getInfoByValue(ChargeItemStatus.class, requestBaseDto.getChargeStatus()));
}
return R.ok(requestBaseInfo);
}
@@ -785,7 +802,7 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
/**
* 查询历史医嘱请求数据
*
* @param patientId 病人id
* @param patientId 病人id
* @param encounterId 就诊id
* @return 历史医嘱请求数据
*/
@@ -795,21 +812,22 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
// 医嘱请求数据
List<RequestBaseDto> requestBaseInfo = doctorStationAdviceAppMapper.getRequestBaseInfo(encounterId, patientId,
CommonConstants.TableName.MED_MEDICATION_REQUEST, CommonConstants.TableName.WOR_DEVICE_REQUEST,
CommonConstants.TableName.WOR_SERVICE_REQUEST, practitionerId, Whether.YES.getCode());
CommonConstants.TableName.MED_MEDICATION_REQUEST, CommonConstants.TableName.WOR_DEVICE_REQUEST,
CommonConstants.TableName.WOR_SERVICE_REQUEST, practitionerId, Whether.YES.getCode(),
GenerateSource.DOCTOR_PRESCRIPTION.getValue());
for (RequestBaseDto requestBaseDto : requestBaseInfo) {
// 请求状态
requestBaseDto
.setStatusEnum_enumText(EnumUtils.getInfoByValue(RequestStatus.class, requestBaseDto.getStatusEnum()));
.setStatusEnum_enumText(EnumUtils.getInfoByValue(RequestStatus.class, requestBaseDto.getStatusEnum()));
// 是否皮试
requestBaseDto
.setSkinTestFlag_enumText(EnumUtils.getInfoByValue(Whether.class, requestBaseDto.getSkinTestFlag()));
.setSkinTestFlag_enumText(EnumUtils.getInfoByValue(Whether.class, requestBaseDto.getSkinTestFlag()));
// 是否为注射药物
requestBaseDto
.setInjectFlag_enumText(EnumUtils.getInfoByValue(Whether.class, requestBaseDto.getInjectFlag()));
.setInjectFlag_enumText(EnumUtils.getInfoByValue(Whether.class, requestBaseDto.getInjectFlag()));
// 收费状态
requestBaseDto.setChargeStatus_enumText(
EnumUtils.getInfoByValue(ChargeItemStatus.class, requestBaseDto.getChargeStatus()));
EnumUtils.getInfoByValue(ChargeItemStatus.class, requestBaseDto.getChargeStatus()));
}
return R.ok(requestBaseInfo);
}
@@ -824,7 +842,7 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
public void updateGroupId(UpdateGroupIdParam updateGroupIdParam) {
List<UpdateGroupDto> groupList = updateGroupIdParam.getGroupList();
List<Long> idsToSetNull = groupList.stream().filter(dto -> dto.getGroupId() == null)
.map(UpdateGroupDto::getRequestId).collect(Collectors.toList());
.map(UpdateGroupDto::getRequestId).collect(Collectors.toList());
if (!idsToSetNull.isEmpty()) {
// 创建更新条件
@@ -837,8 +855,8 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
// 处理非null的情况
List<MedicationRequest> medicationRequestList = groupList.stream().filter(dto -> dto.getGroupId() != null)
.map(dto -> new MedicationRequest().setId(dto.getRequestId()).setGroupId(dto.getGroupId()))
.collect(Collectors.toList());
.map(dto -> new MedicationRequest().setId(dto.getRequestId()).setGroupId(dto.getGroupId()))
.collect(Collectors.toList());
if (!medicationRequestList.isEmpty()) {
iMedicationRequestService.saveOrUpdateBatch(medicationRequestList);

View File

@@ -18,6 +18,7 @@ import com.core.common.core.domain.R;
import com.core.common.utils.AssignSeqUtil;
import com.core.common.utils.MessageUtils;
import com.core.common.utils.SecurityUtils;
import com.core.common.utils.StringUtils;
import com.openhis.administration.domain.ChargeItem;
import com.openhis.administration.domain.EncounterDiagnosis;
import com.openhis.administration.service.IChargeItemService;
@@ -246,7 +247,7 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
List<Long> adviceDefinitionIdParamList, Long organizationId, Integer pageNo, Integer pageSize,
Integer pricingFlag) {
adviceBaseDto.setAdviceType(1); // 医嘱类型为药品
adviceBaseDto.setCategoryCode(medCategoryCode.CHINESE_HERBAL_MEDICINE.getValue());// 中草药
adviceBaseDto.setCategoryCode(MedCategoryCode.CHINESE_HERBAL_MEDICINE.getValue());// 中草药
return iDoctorStationAdviceAppService.getAdviceBaseInfo(adviceBaseDto, searchKey, locationId,
adviceDefinitionIdParamList, organizationId, pageNo, pageSize, pricingFlag, List.of(1, 2, 3));
}
@@ -272,6 +273,11 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
Long orgId = SecurityUtils.getLoginUser().getOrgId();
// 患者挂号对应的科室id
Long organizationId = adviceSaveParam.getOrganizationId();
// 是否代煎
Integer sufferingFlag = adviceSaveParam.getSufferingFlag();
// 中药代煎定义id
Long sufferingDefinitionId =
iActivityDefinitionService.getAppointActivityDefinitionId(CommonConstants.BusinessName.SUFFERING_TCM);
// 保存时,校验库存
if (is_save) {
List<AdviceSaveDto> needCheckList = medicineList.stream()
@@ -300,9 +306,12 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
// 删除费用项
iChargeItemService.deleteByServiceTableAndId(CommonConstants.TableName.MED_MEDICATION_REQUEST,
adviceSaveDto.getRequestId());
// 删除代煎费
iChargeItemService.remove(new LambdaQueryWrapper<ChargeItem>()
.eq(ChargeItem::getPrescriptionNo, adviceSaveDto.getPrescriptionNo())
.eq(ChargeItem::getProductId, sufferingDefinitionId));
}
// 是否代煎
Integer sufferingFlag = adviceSaveParam.getSufferingFlag();
if (is_sign) {
// 按groupId分组
@@ -310,9 +319,16 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
insertOrUpdateList.stream().collect(Collectors.groupingBy(AdviceSaveDto::getGroupId));
// 为每个分组生成唯一的处方号
groupMap.forEach((groupId, groupList) -> {
String prescriptionNo =
assignSeqUtil.getSeq(AssignSeqEnum.PRESCRIPTION_CHINESE_HERBAL_MEDICINE.getPrefix(), 8);
groupList.forEach(dto -> dto.setPrescriptionNo(prescriptionNo));
// 先查询当前groupId是否已经被签发生成过处方号
List<MedicationRequest> list = iMedicationRequestService
.list(new LambdaQueryWrapper<MedicationRequest>().eq(MedicationRequest::getGroupId, groupId));
if (!list.isEmpty() && StringUtils.isNotEmpty(list.get(0).getPrescriptionNo())) {
groupList.forEach(dto -> dto.setPrescriptionNo(list.get(0).getPrescriptionNo()));
} else {
String prescriptionNo =
assignSeqUtil.getSeq(AssignSeqEnum.PRESCRIPTION_CHINESE_HERBAL_MEDICINE.getPrefix(), 8);
groupList.forEach(dto -> dto.setPrescriptionNo(prescriptionNo));
}
});
}
@@ -320,22 +336,23 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
String signCode = assignSeqUtil.getSeq(AssignSeqEnum.ADVICE_SIGN.getPrefix(), 10);
for (AdviceSaveDto adviceSaveDto : insertOrUpdateList) {
// 中药付数
Integer chineseHerbsDoseQuantity = adviceSaveDto.getChineseHerbsDoseQuantity();
BigDecimal chineseHerbsDoseQuantity = adviceSaveDto.getChineseHerbsDoseQuantity();
medicationRequest = new MedicationRequest();
medicationRequest.setTcmFlag(Whether.YES.getValue());// 中医标识
medicationRequest.setId(adviceSaveDto.getRequestId()); // 主键id
medicationRequest.setStatusEnum(is_save ? RequestStatus.DRAFT.getValue() : RequestStatus.ACTIVE.getValue()); // 请求状态
if (is_sign) {
medicationRequest.setGroupId(adviceSaveDto.getGroupId()); // 组号
medicationRequest.setPrescriptionNo(adviceSaveDto.getPrescriptionNo()); // 处方号
medicationRequest.setSignCode(signCode);
}
// 只有保存时处理的字段属性
// 保存时,处理数据(请求,发放,账单)
if (is_save) {
medicationRequest.setBusNo(assignSeqUtil.getSeq(AssignSeqEnum.MEDICATION_RES_NO.getPrefix(), 4));
medicationRequest.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.MEDICATION_RES_NO.getPrefix(), 4));
medicationRequest.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源
medicationRequest.setGroupId(adviceSaveDto.getGroupId()); // 组号
medicationRequest.setChineseHerbsDoseQuantity(chineseHerbsDoseQuantity); // 中药付数
medicationRequest.setSufferingFlag(sufferingFlag); // 代煎标识
medicationRequest.setQuantity(adviceSaveDto.getQuantity() * chineseHerbsDoseQuantity); // 请求数量
medicationRequest.setQuantity(adviceSaveDto.getQuantity().multiply(chineseHerbsDoseQuantity)); // 请求数量
medicationRequest.setUnitCode(adviceSaveDto.getUnitCode()); // 请求单位编码
medicationRequest.setLotNumber(adviceSaveDto.getLotNumber()); // 产品批号
medicationRequest.setCategoryEnum(adviceSaveDto.getCategoryEnum()); // 请求类型
@@ -357,16 +374,20 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
// medicationRequest.setDispensePerDuration(adviceSaveDto.getDispensePerDuration()); // 每次发药供应天数
medicationRequest.setContentJson(adviceSaveDto.getContentJson()); // 请求内容json
medicationRequest.setYbClassEnum(adviceSaveDto.getYbClassEnum());// 类别医保编码
medicationRequest.setDosageInstruction(adviceSaveDto.getDosageInstruction()); // 用药说明 , 即煎法
}
iMedicationRequestService.saveOrUpdate(medicationRequest);
if (is_save) {
// 处理药品发放
iMedicationDispenseService.handleMedicationDispense(medicationRequest, adviceSaveDto.getDbOpType());
Long dispenseId =
iMedicationDispenseService.handleMedicationDispense(medicationRequest, adviceSaveDto.getDbOpType());
// 保存药品费用项
chargeItem = new ChargeItem();
chargeItem.setId(adviceSaveDto.getChargeItemId()); // 费用项id
chargeItem.setStatusEnum(ChargeItemStatus.DRAFT.getValue()); // 默认-草稿
chargeItem.setBusNo(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix().concat(medicationRequest.getBusNo()));
chargeItem.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源
chargeItem.setPrescriptionNo(adviceSaveDto.getPrescriptionNo()); // 处方号
chargeItem.setPatientId(adviceSaveDto.getPatientId()); // 患者
chargeItem.setContextEnum(adviceSaveDto.getAdviceType()); // 类型
@@ -383,14 +404,14 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
chargeItem.setAccountId(adviceSaveDto.getAccountId());// 关联账户ID
chargeItem.setConditionId(adviceSaveDto.getConditionId()); // 诊断id
chargeItem.setEncounterDiagnosisId(adviceSaveDto.getEncounterDiagnosisId()); // 就诊诊断id
// chargeItem.setDispenseId(dispenseId); // 发放ID
chargeItem.setQuantityValue(medicationRequest.getQuantity()); // 数量
chargeItem.setQuantityUnit(medicationRequest.getUnitCode()); // 单位
chargeItem.setUnitPrice(adviceSaveDto.getUnitPrice()); // 单价
// 计算总价,保留4位小数
BigDecimal qty = new BigDecimal(chargeItem.getQuantityValue());
chargeItem.setTotalPrice(qty.multiply(chargeItem.getUnitPrice()).setScale(4, RoundingMode.HALF_UP)); // 总价
chargeItem.setTotalPrice(adviceSaveDto.getTotalPrice()); // 总价
// 计算总价,保留6位小数
BigDecimal qty = chargeItem.getQuantityValue();
chargeItem.setTotalPrice(qty.multiply(chargeItem.getUnitPrice()).setScale(6, RoundingMode.HALF_UP)); // 总价
chargeItem.setTcmFlag(Whether.YES.getValue());// 中医标识
iChargeItemService.saveOrUpdate(chargeItem);
@@ -406,61 +427,63 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
Long conditionId = medicineList.get(0).getConditionId();
// 就诊诊断id
Long encounterDiagnosisId = medicineList.get(0).getEncounterDiagnosisId();
// 中药代煎定义id
Long sufferingDefinitionId =
iActivityDefinitionService.getAppointActivityDefinitionId(CommonConstants.BusinessName.SUFFERING_TCM);
// 签发时,生成中药代煎的账单,只生成一次
// 中药付数
BigDecimal chineseHerbsDoseQuantity = medicineList.get(0).getChineseHerbsDoseQuantity();
// 处方号
String prescriptionNo = insertOrUpdateList.get(0).getPrescriptionNo();
// 签发时,生成中药代煎的账单
if (Whether.YES.getValue().equals(sufferingFlag) && is_sign) {
Integer quantity = 1; // 请求数量
BigDecimal quantity = chineseHerbsDoseQuantity; // 请求数量
AdviceBaseDto adviceBaseDto = new AdviceBaseDto();
adviceBaseDto.setAdviceDefinitionId(sufferingDefinitionId); // 医嘱定义id
// 当前是否已经生成了贵代煎账单
ChargeItem one = iChargeItemService.getOne(new LambdaQueryWrapper<ChargeItem>()
.eq(ChargeItem::getEncounterId, encounterId).eq(ChargeItem::getProductId, sufferingDefinitionId));
if (one == null) {
// 对应的诊疗医嘱信息
AdviceBaseDto activityAdviceBaseDto =
iDoctorStationAdviceAppService.getAdviceBaseInfo(adviceBaseDto, null, null, null, organizationId, 1,
1, Whether.NO.getValue(), List.of(1, 2, 3)).getRecords().get(0);
if (activityAdviceBaseDto != null) {
// 费用定价
AdvicePriceDto advicePriceDto = activityAdviceBaseDto.getPriceList().get(0);
if (advicePriceDto != null) {
// 生成账单
chargeItem = new ChargeItem();
chargeItem.setGenerateSourceEnum(ChargeItemGenerateSource.MEDICAL_ORDER_BINDING.getValue()); // 账单生成来源
chargeItem.setStatusEnum(ChargeItemStatus.DRAFT.getValue()); // 草稿
chargeItem.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix(), 4));
chargeItem.setPatientId(patientId); // 患者
chargeItem.setContextEnum(ChargeItemContext.ACTIVITY.getValue()); // 类型
chargeItem.setEncounterId(encounterId); // 就诊id
chargeItem.setDefinitionId(advicePriceDto.getDefinitionId()); // 费用定价ID
chargeItem.setEntererId(SecurityUtils.getLoginUser().getPractitionerId());// 开立人ID
chargeItem.setRequestingOrgId(orgId); // 开立科室
chargeItem.setEnteredDate(curDate); // 开立时间
chargeItem.setProductTable(activityAdviceBaseDto.getAdviceTableName());// 产品所在表
chargeItem.setProductId(activityAdviceBaseDto.getAdviceDefinitionId());// 收费项id
chargeItem.setAccountId(accountId);// 关联账户ID
chargeItem.setConditionId(conditionId); // 诊断id
chargeItem.setEncounterDiagnosisId(encounterDiagnosisId); // 就诊诊断id
chargeItem.setQuantityValue(quantity); // 数量
chargeItem.setQuantityUnit(activityAdviceBaseDto.getUnitCode()); // 单位
chargeItem.setUnitPrice(advicePriceDto.getPrice()); // 单价
// 计算总价,保留4位小数
BigDecimal qty = new BigDecimal(quantity);
chargeItem
.setTotalPrice(qty.multiply(advicePriceDto.getPrice()).setScale(4, RoundingMode.HALF_UP)); // 总价
chargeItem.setTcmFlag(Whether.YES.getValue());// 中医标识
iChargeItemService.save(chargeItem);
}
// 先删除中药代煎的账单
iChargeItemService.remove(new LambdaQueryWrapper<ChargeItem>()
.eq(ChargeItem::getPrescriptionNo, prescriptionNo).eq(ChargeItem::getProductId, sufferingDefinitionId));
// 对应的诊疗医嘱信息
AdviceBaseDto activityAdviceBaseDto = iDoctorStationAdviceAppService.getAdviceBaseInfo(adviceBaseDto, null,
null, null, organizationId, 1, 1, Whether.NO.getValue(), List.of(3)).getRecords().get(0);
if (activityAdviceBaseDto != null) {
// 费用定价
AdvicePriceDto advicePriceDto = activityAdviceBaseDto.getPriceList().get(0);
if (advicePriceDto != null) {
// 生成账单
chargeItem = new ChargeItem();
chargeItem.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源
chargeItem.setPrescriptionNo(prescriptionNo); // 处方号
chargeItem.setStatusEnum(ChargeItemStatus.PLANNED.getValue()); // 收费状态
chargeItem.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.CHARGE_ITEM_NO.getPrefix(), 4));
chargeItem.setGenerateSourceEnum(GenerateSource.DOCTOR_PRESCRIPTION.getValue()); // 生成来源
chargeItem.setPatientId(patientId); // 患者
chargeItem.setContextEnum(ChargeItemContext.ACTIVITY.getValue()); // 类型
chargeItem.setEncounterId(encounterId); // 就诊id
chargeItem.setDefinitionId(advicePriceDto.getDefinitionId()); // 费用定价ID
chargeItem.setEntererId(SecurityUtils.getLoginUser().getPractitionerId());// 开立人ID
chargeItem.setRequestingOrgId(orgId); // 开立科室
chargeItem.setEnteredDate(curDate); // 开立时间
chargeItem.setProductTable(activityAdviceBaseDto.getAdviceTableName());// 产品所在表
chargeItem.setProductId(activityAdviceBaseDto.getAdviceDefinitionId());// 收费项id
chargeItem.setAccountId(accountId);// 关联账户ID
chargeItem.setConditionId(conditionId); // 诊断id
chargeItem.setEncounterDiagnosisId(encounterDiagnosisId); // 就诊诊断id
chargeItem.setQuantityValue(quantity); // 数量
chargeItem.setQuantityUnit(activityAdviceBaseDto.getUnitCode()); // 单位
chargeItem.setUnitPrice(advicePriceDto.getPrice()); // 单价
// 计算总价,保留6位小数
BigDecimal qty = quantity;
chargeItem.setTotalPrice(qty.multiply(advicePriceDto.getPrice()).setScale(6, RoundingMode.HALF_UP)); // 总价
chargeItem.setTcmFlag(Whether.YES.getValue());// 中医标识
iChargeItemService.save(chargeItem);
}
}
} else if (Whether.NO.getValue().equals(sufferingFlag)) {
// 删除中药代煎的账单
iChargeItemService.remove(new LambdaQueryWrapper<ChargeItem>().eq(ChargeItem::getEncounterId, encounterId)
.eq(ChargeItem::getProductId, sufferingDefinitionId));
iChargeItemService.remove(new LambdaQueryWrapper<ChargeItem>()
.eq(ChargeItem::getPrescriptionNo, prescriptionNo).eq(ChargeItem::getProductId, sufferingDefinitionId));
}
// 签发时,把草稿状态的账单更新为待收费[中医]
@@ -491,7 +514,8 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
// 医嘱请求数据
List<RequestBaseDto> requestBaseInfo = doctorStationChineseMedicalAppMapper.getTcmRequestBaseInfo(encounterId,
null, CommonConstants.TableName.MED_MEDICATION_REQUEST, CommonConstants.TableName.WOR_DEVICE_REQUEST,
CommonConstants.TableName.WOR_SERVICE_REQUEST, practitionerId, Whether.NO.getCode());
CommonConstants.TableName.WOR_SERVICE_REQUEST, practitionerId, Whether.NO.getCode(),
GenerateSource.DOCTOR_PRESCRIPTION.getValue());
for (RequestBaseDto requestBaseDto : requestBaseInfo) {
// 请求状态
requestBaseDto
@@ -515,10 +539,10 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
// 当前账号的参与者id
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
// 医嘱请求数据
List<RequestBaseDto> requestBaseInfo =
doctorStationChineseMedicalAppMapper.getTcmRequestHistoryInfo(encounterId, patientId,
CommonConstants.TableName.MED_MEDICATION_REQUEST, CommonConstants.TableName.WOR_DEVICE_REQUEST,
CommonConstants.TableName.WOR_SERVICE_REQUEST, practitionerId, Whether.YES.getCode());
List<RequestBaseDto> requestBaseInfo = doctorStationChineseMedicalAppMapper.getTcmRequestHistoryInfo(
encounterId, patientId, CommonConstants.TableName.MED_MEDICATION_REQUEST,
CommonConstants.TableName.WOR_DEVICE_REQUEST, CommonConstants.TableName.WOR_SERVICE_REQUEST, practitionerId,
Whether.YES.getCode(), GenerateSource.DOCTOR_PRESCRIPTION.getValue());
for (RequestBaseDto requestBaseDto : requestBaseInfo) {
// 请求状态
requestBaseDto

View File

@@ -6,6 +6,7 @@ import java.util.HashSet;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
@@ -23,6 +24,7 @@ import com.openhis.clinical.domain.Condition;
import com.openhis.clinical.domain.ConditionDefinition;
import com.openhis.clinical.domain.DiagnosisBelongBinding;
import com.openhis.clinical.mapper.ConditionDefinitionMapper;
import com.openhis.clinical.service.IConditionDefinitionService;
import com.openhis.clinical.service.IConditionService;
import com.openhis.clinical.service.IDiagnosisBelongBindingService;
import com.openhis.common.constant.CommonConstants;
@@ -56,6 +58,9 @@ public class DoctorStationDiagnosisAppServiceImpl implements IDoctorStationDiagn
@Resource
IEncounterDiagnosisService iEncounterDiagnosisService;
@Resource
IConditionDefinitionService conditionDefinitionService;
/**
* 新增诊断归属绑定
*
@@ -67,7 +72,7 @@ public class DoctorStationDiagnosisAppServiceImpl implements IDoctorStationDiagn
// 如果绑定类型是个人,objectId 存储当前登录账号id
if (BindingType.PERSONAL.getValue().equals(diagnosisBelongBindingDto.getBindingEnum())) {
diagnosisBelongBindingDto.setObjectId(SecurityUtils.getLoginUser().getUserId());
} else if (BindingType.DEFINITION.getValue().equals(diagnosisBelongBindingDto.getBindingEnum())) {
} else if (BindingType.ORGANIZATION.getValue().equals(diagnosisBelongBindingDto.getBindingEnum())) {
diagnosisBelongBindingDto.setObjectId(SecurityUtils.getLoginUser().getOrgId());
}
DiagnosisBelongBinding diagnosisBelongBinding = new DiagnosisBelongBinding();
@@ -128,7 +133,7 @@ public class DoctorStationDiagnosisAppServiceImpl implements IDoctorStationDiagn
diagnosisBelongBindingDto, searchKey, new HashSet<>(Arrays.asList("definition_name", "object_name")), null);
IPage<DiagnosisBelongBindingDto> diagnosisBelongBindingPage =
doctorStationDiagnosisAppMapper.getDiagnosisBelongBindingPage(new Page<>(pageNo, pageSize),
BindingType.PERSONAL.getValue(), BindingType.DEFINITION.getValue(), queryWrapper);
BindingType.PERSONAL.getValue(), BindingType.ORGANIZATION.getValue(), queryWrapper);
diagnosisBelongBindingPage.getRecords().forEach(e -> {
// 诊断绑定类型
e.setBindingEnum_enumText(EnumUtils.getInfoByValue(BindingType.class, e.getBindingEnum()));
@@ -167,6 +172,7 @@ public class DoctorStationDiagnosisAppServiceImpl implements IDoctorStationDiagn
conditionDefinition.setStatusEnum(PublicationStatus.ACTIVE.getValue());
QueryWrapper<ConditionDefinition> queryWrapper = HisQueryUtils.buildQueryWrapper(conditionDefinition, searchKey,
new HashSet<>(Arrays.asList("name", "py_str", "wb_str")), null);
queryWrapper.eq("status_enum", PublicationStatus.ACTIVE.getValue());
// 设置排序
queryWrapper.orderByDesc("update_time");
// 拼接 用于区分 西医诊断 [1] 中医诊断 [2] 的查询条件
@@ -263,7 +269,7 @@ public class DoctorStationDiagnosisAppServiceImpl implements IDoctorStationDiagn
// 科室诊断
Long currentUserOrganizationId = SecurityUtils.getLoginUser().getOrgId();
List<ConditionDefinitionMetadata> organizationList = doctorStationDiagnosisAppMapper.getOrganizationList(
PublicationStatus.ACTIVE.getValue(), BindingType.DEFINITION.getValue(), currentUserOrganizationId);
PublicationStatus.ACTIVE.getValue(), BindingType.ORGANIZATION.getValue(), currentUserOrganizationId);
this.handleConditionDefinitionMetadata(organizationList);
conditionDefinitionBusinessClass.setOrganizationList(organizationList);
return R.ok(conditionDefinitionBusinessClass);
@@ -337,4 +343,19 @@ public class DoctorStationDiagnosisAppServiceImpl implements IDoctorStationDiagn
});
}
/**
* 查询诊断信息
*
* @param searchKey 目标字符
* @param request 请求
* @return 查询结果
*/
@Override
public R<?> getDiagnosisList(String searchKey, HttpServletRequest request) {
List<ConditionDefinition> conditionDefinitionListBySearchKey =
conditionDefinitionService.getConditionDefinitionListBySearchKey(searchKey, request);
return R.ok(conditionDefinitionListBySearchKey);
}
}

View File

@@ -6,52 +6,46 @@ import java.util.stream.Stream;
import javax.annotation.Resource;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.core.common.core.domain.R;
import com.core.common.core.domain.model.LoginUser;
import com.core.common.utils.AssignSeqUtil;
import com.core.common.utils.DateUtils;
import com.core.common.utils.MessageUtils;
import com.core.common.utils.SecurityUtils;
import com.openhis.administration.domain.Practitioner;
import com.openhis.administration.service.IPractitionerService;
import com.openhis.common.constant.CommonConstants;
import com.openhis.common.constant.YbCommonConstants;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.AssignSeqEnum;
import com.openhis.common.enums.PrescriptionType;
import com.openhis.common.enums.RequestStatus;
import com.openhis.common.enums.ybenums.YbRxItemTypeCode;
import com.openhis.common.utils.EnumUtils;
import com.openhis.common.utils.HisQueryUtils;
import com.openhis.financial.domain.Contract;
import com.openhis.web.doctorstation.appservice.IDoctorStationElepPrescriptionService;
import com.openhis.web.doctorstation.dto.*;
import com.openhis.web.doctorstation.mapper.DoctorStationElepPrescriptionMapper;
import com.openhis.web.inventorymanage.dto.ProductStocktakingInitDto;
import com.openhis.web.reportmanage.dto.ChargeReportSearchParam;
import com.openhis.workflow.domain.ElepMedicationRequest;
import com.openhis.workflow.domain.InventoryItem;
import com.openhis.workflow.domain.SupplyRequest;
import com.openhis.workflow.mapper.InventoryItemMapper;
import com.openhis.workflow.service.IElepMedicationRequestService;
import com.openhis.ybcatalog.domain.CatalogDrugInfo;
import com.openhis.ybcatalog.domain.CatalogDrugInfoUsual;
import com.openhis.ybcatalog.mapper.CatalogDrugInfoUsualMapper;
import com.openhis.ybcatalog.service.ICatalogDrugInfoService;
import com.openhis.ybcatalog.service.ICatalogDrugInfoUsualService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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.AssignSeqUtil;
import com.core.common.utils.MessageUtils;
import com.openhis.common.constant.PromptMsgConstant;
import com.openhis.common.enums.*;
import com.openhis.common.utils.EnumUtils;
import com.openhis.web.doctorstation.dto.*;
/**
* 医生站-电子处方 应用实现类
*/
@Service
public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<CatalogDrugInfoUsualMapper, CatalogDrugInfoUsual>
implements IDoctorStationElepPrescriptionService {
public class DoctorStationElepPrescriptionServiceImpl extends
ServiceImpl<CatalogDrugInfoUsualMapper, CatalogDrugInfoUsual> implements IDoctorStationElepPrescriptionService {
@Autowired
ICatalogDrugInfoUsualService catalogDrugInfoUsualService;
@Autowired
@@ -75,15 +69,17 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
// 处方类别
List<ElepPrescriptionInitDto.commonStatusOption> rxTypeCodeListOptions = Stream.of(YbRxItemTypeCode.values())
.map(prescriptionType -> new ElepPrescriptionInitDto.commonStatusOption(prescriptionType.getValue(),
prescriptionType.getDescription()))
.collect(Collectors.toList());
// //获取诊断信息
// List<ElepPrescriptionInitConditionDto> conditionInfoList = elepPrescriptionMapper.selectConditionInfo(encounterId);
// // 诊断列表
// List<ElepPrescriptionInitDto.conditionStatusOption> conditionListOptions = conditionInfoList.stream()
// .map(conditionInfo -> new ElepPrescriptionInitDto.conditionStatusOption(conditionInfo.getConditionId(), conditionInfo.getConditionName()))
// .collect(Collectors.toList());
.map(prescriptionType -> new ElepPrescriptionInitDto.commonStatusOption(prescriptionType.getValue(),
prescriptionType.getDescription()))
.collect(Collectors.toList());
// //获取诊断信息
// List<ElepPrescriptionInitConditionDto> conditionInfoList =
// elepPrescriptionMapper.selectConditionInfo(encounterId);
// // 诊断列表
// List<ElepPrescriptionInitDto.conditionStatusOption> conditionListOptions = conditionInfoList.stream()
// .map(conditionInfo -> new ElepPrescriptionInitDto.conditionStatusOption(conditionInfo.getConditionId(),
// conditionInfo.getConditionName()))
// .collect(Collectors.toList());
initDto.setRxTypeCodeListOptions(rxTypeCodeListOptions);
return R.ok(initDto);
@@ -92,35 +88,37 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
/**
* 获取药品信息
*
* @param pageNo 当前页
* @param pageSize 每页多少条
* @param pageNo 当前页
* @param pageSize 每页多少条
* @param searchKey 模糊查询关键字
* @return 药品信息
*/
@Override
public R<?> getAllMedicationUsualInfo(String searchKey, Integer pageNo, Integer pageSize) {
//从yb_catalog_drug_info_usual表中取数据
IPage<CatalogDrugInfoUsual> medicationUsualInfo = catalogDrugInfoUsualService.selectCatalogDrugInfoUsual(pageNo, pageSize, searchKey);
// 从yb_catalog_drug_info_usual表中取数据
IPage<CatalogDrugInfoUsual> medicationUsualInfo =
catalogDrugInfoUsualService.selectCatalogDrugInfoUsual(pageNo, pageSize, searchKey);
return R.ok(medicationUsualInfo);
}
/**
* 获取药品信息
*
* @param pageNo 当前页
* @param pageSize 每页多少条
* @param pageNo 当前页
* @param pageSize 每页多少条
* @param searchKey 模糊查询关键字
* @return 药品信息
*/
@Override
public R<?> getAllMedicationInfo(String searchKey, Integer pageNo, Integer pageSize) {
// 构建查询条件
QueryWrapper<String> queryWrapper =
HisQueryUtils.buildQueryWrapper(null, searchKey,
new HashSet<>(Arrays.asList("registered_name", "pinyin_code", "wubi_code", "approval_no")),
null);
//从yb_catalog_drug_info表中取数据
IPage<CatalogDrugInfo> medicationInfo = elepPrescriptionMapper.selectCatalogDrugInfo(new Page<>(pageNo, pageSize), queryWrapper);
QueryWrapper<String> queryWrapper = HisQueryUtils.buildQueryWrapper(null, searchKey,
new HashSet<>(
Arrays.asList("registered_name", "pinyin_code", "wubi_code", "approval_no", "manufacturer_name")),
null);
// 从yb_catalog_drug_info表中取数据
IPage<CatalogDrugInfo> medicationInfo =
elepPrescriptionMapper.selectCatalogDrugInfo(new Page<>(pageNo, pageSize), queryWrapper);
return R.ok(medicationInfo);
}
@@ -128,15 +126,15 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
* 获取处方信息
*
* @param patientId 患者id
* @param pageNo 当前页
* @param pageSize 每页多少条
* @param pageNo 当前页
* @param pageSize 每页多少条
* @return 药品信息
*/
@Override
public R<?> getPrescriptionInfo(Long patientId, Integer pageNo, Integer pageSize) {
// 处方信息查询
IPage<ElepPrescriptionInfoDto> prescriptionInfo =
elepPrescriptionMapper.selectElepPrescriptionInfo(new Page<>(pageNo, pageSize), patientId);
elepPrescriptionMapper.selectElepPrescriptionInfo(new Page<>(pageNo, pageSize), patientId);
// 状态转换
prescriptionInfo.getRecords().forEach(infoDto -> {
infoDto.setStatusEnum_enumText(EnumUtils.getInfoByValue(RequestStatus.class, infoDto.getStatusEnum()));
@@ -149,15 +147,15 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
* 获取药品信息
*
* @param prescriptionNo 处方号
* @param pageNo 当前页
* @param pageSize 每页多少条
* @param pageNo 当前页
* @param pageSize 每页多少条
* @return 药品详细信息
*/
@Override
public R<?> getMedicationInfo(String prescriptionNo, Integer pageNo, Integer pageSize) {
// 药品详细查询
IPage<ElepMedicationInfoDto> medicationInfo =
elepPrescriptionMapper.selectMedicationInfo(new Page<>(pageNo, pageSize), prescriptionNo);
elepPrescriptionMapper.selectMedicationInfo(new Page<>(pageNo, pageSize), prescriptionNo);
return R.ok(medicationInfo);
}
@@ -189,7 +187,8 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
Date now = DateUtils.getNowDate();
// 根据处方号查询处方信息
List<ElepMedicationRequest> requestList = elepMedicationRequestService.selectElepMedicationRequestByPrescriptionNo(prescriptionInfo.getPrescriptionNo());
List<ElepMedicationRequest> requestList = elepMedicationRequestService
.selectElepMedicationRequestByPrescriptionNo(prescriptionInfo.getPrescriptionNo());
if (!requestList.isEmpty()) {
List<Long> idList = requestList.stream().map(ElepMedicationRequest::getId).collect(Collectors.toList());
// 处方信息删除
@@ -205,68 +204,72 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
for (ElepMedicationInfoDto item : prescriptionInfo.getMedicationInfoList()) {
elepMedicationRequest = new ElepMedicationRequest();
elepMedicationRequest
// ID
.setId(null)
// 医院内部处方编号
.setPrescriptionNo(prescriptionInfo.getPrescriptionNo())
// 医院id
.setOrganizationId(info.getOrganizationId())
// 门诊/住院病历号
.setIptOtpNo(info.getIptOtpNo())
// 科室病区
.setDepartmentWard(info.getDepartmentWard())
// 医保类型
.setInsuranceEnum(info.getInsuranceEnum())
// 开具日期
.setIssueTime(now)
// 开具科室
.setOrgId(user.getOrgId())
// 患者
.setPatientId(prescriptionInfo.getPatientId())
// 就诊id
.setEncounterId(prescriptionInfo.getEncounterId())
// 诊断id
.setConditionId(prescriptionInfo.getConditionId())
// 有效天数
.setValidityDays(prescriptionInfo.getValidityDays())
// 药品定义id
.setMedicationId(item.getMedicationId())
// 药品剂量
.setMedDosage(item.getMedDosage())
// 药品剂量单位
.setMedDosageUnitCode(item.getMedDosageUnitCode())
// 药品频率
.setMedFrequency(item.getMedFrequency())
// 药品途径
.setMedRoute(item.getMedRoute())
// 请求数量
.setQuantity(item.getQuantity())
// 请求单位
.setUnitCode(item.getUnitCode())
// 开方医师
.setPrescribingDrId(user.getId())
// 处方状态
.setStatusEnum(RequestStatus.DRAFT.getValue())
// 延长原因
.setExtensionReason(prescriptionInfo.getExtensionReason())
// 处方类别
.setRxTypeCode(item.getRxTypeCode())
// 处方详细类别
.setRxItemTypeCode(item.getRxItemTypeCode())
// 支持用药信息
.setSupportInfo(item.getSupportInfo())
// 服药时间(开始)
.setEffectiveDoseStart(item.getEffectiveDoseStart())
// 服药时间(结束)
.setEffectiveDoseEnd(item.getEffectiveDoseEnd())
// 给药间隔
.setDispenseInterval(item.getDispenseInterval())
// 单次发药数
.setDispensePerQuantity(item.getDispensePerQuantity())
// 每次发药供应天数
.setDispensePerDuration(item.getDispensePerDuration())
// 药品版本号
.setVersion(item.getVersion());
// ID
.setId(null)
// 医院内部处方编号
.setPrescriptionNo(prescriptionInfo.getPrescriptionNo())
// 医院id
.setOrganizationId(info.getOrganizationId())
// 门诊/住院病历号
.setIptOtpNo(info.getIptOtpNo())
// 科室病区
.setDepartmentWard(info.getDepartmentWard())
// 医保类型
.setInsuranceEnum(info.getInsuranceEnum())
// 开具日期
.setIssueTime(now)
// 开具科室
.setOrgId(user.getOrgId())
// 患者
.setPatientId(prescriptionInfo.getPatientId())
// 就诊id
.setEncounterId(prescriptionInfo.getEncounterId())
// 诊断id
.setConditionId(prescriptionInfo.getConditionId())
// 诊断定义id
.setConditionDefId(prescriptionInfo.getConditionDefId())
// 慢病字段 普通门诊存空串慢病存MXXXX
.setOpspDiseCode(prescriptionInfo.getOpspDiseCode())
// 有效天数
.setValidityDays(prescriptionInfo.getValidityDays())
// 药品定义id
.setMedicationId(item.getMedicationId())
// 药品剂量
.setMedDosage(item.getMedDosage())
// 药品剂量单位
.setMedDosageUnitCode(item.getMedDosageUnitCode())
// 药品频率
.setMedFrequency(item.getMedFrequency())
// 药品途径
.setMedRoute(item.getMedRoute())
// 请求数量
.setQuantity(item.getQuantity())
// 请求单位
.setUnitCode(item.getUnitCode())
// 开方医师
.setPrescribingDrId(user.getId())
// 处方状态
.setStatusEnum(RequestStatus.DRAFT.getValue())
// 延长原因
.setExtensionReason(prescriptionInfo.getExtensionReason())
// 处方类别
.setRxTypeCode(item.getRxTypeCode())
// 处方详细类别
.setRxItemTypeCode(item.getRxItemTypeCode())
// 支持用药信息
.setSupportInfo(item.getSupportInfo())
// 服药时间(开始)
.setEffectiveDoseStart(item.getEffectiveDoseStart())
// 服药时间(结束)
.setEffectiveDoseEnd(item.getEffectiveDoseEnd())
// 给药间隔
.setDispenseInterval(item.getDispenseInterval())
// 单次发药数
.setDispensePerQuantity(item.getDispensePerQuantity())
// 每次发药供应天数
.setDispensePerDuration(item.getDispensePerDuration())
// 药品版本号
.setVersion(item.getVersion());
elepMedicationRequestList.add(elepMedicationRequest);
}
@@ -281,7 +284,8 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
CatalogDrugInfo drugInfo;
for (ElepMedicationInfoDto item : prescriptionInfo.getMedicationInfoList()) {
// 保存常用药品
usualInfo = baseMapper.selectOne(new LambdaUpdateWrapper<CatalogDrugInfoUsual>().eq(CatalogDrugInfoUsual::getMedicalCatalogCode, item.getMedicationId()));
usualInfo = baseMapper.selectOne(new LambdaUpdateWrapper<CatalogDrugInfoUsual>()
.eq(CatalogDrugInfoUsual::getMedicalCatalogCode, item.getMedicationId()));
if (usualInfo == null) {
drugInfo = elepPrescriptionMapper.selectCatalogDrugInfoByNo(item.getMedicationId(), item.getVersion());
BeanUtils.copyProperties(drugInfo, usualInfoInsert);
@@ -292,7 +296,7 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
}
}
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"电子处方"}));
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"电子处方"}));
}
/**
@@ -316,25 +320,25 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
// 修改处方信息
if (prescriptionInfo.getId() == null) {
elepMedicationRequestList = elepMedicationRequestService
.selectElepMedicationRequestByPrescriptionNo(prescriptionInfo.getPrescriptionNo());
.selectElepMedicationRequestByPrescriptionNo(prescriptionInfo.getPrescriptionNo());
// 判断信息是否存在
if (elepMedicationRequestList == null) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00006, null));
}
for (ElepMedicationRequest item : elepMedicationRequestList) {
item
// 开具日期
.setIssueTime(now)
// 开具科室
.setOrgId(user.getOrgId())
// 开方医师
.setPrescribingDrId(user.getId())
// 有效天数
.setValidityDays(prescriptionInfo.getValidityDays())
// 延长原因
.setExtensionReason(prescriptionInfo.getExtensionReason())
// 处方类别
.setRxTypeCode(prescriptionInfo.getRxTypeCode());
// 开具日期
.setIssueTime(now)
// 开具科室
.setOrgId(user.getOrgId())
// 开方医师
.setPrescribingDrId(user.getId())
// 有效天数
.setValidityDays(prescriptionInfo.getValidityDays())
// 延长原因
.setExtensionReason(prescriptionInfo.getExtensionReason())
// 处方类别
.setRxTypeCode(prescriptionInfo.getRxTypeCode());
}
// 修改处方
boolean flg = elepMedicationRequestService.updateBatchById(elepMedicationRequestList);
@@ -350,44 +354,48 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00006, null));
}
elepMedicationRequest
// 开具日期
.setIssueTime(now)
// 开具科室
.setOrgId(user.getOrgId())
// 开方医师
.setPrescribingDrId(user.getId())
// 药品定义id
.setMedicationId(prescriptionInfo.getMedicationId())
// 诊断id
.setConditionId(prescriptionInfo.getConditionId())
// 药品剂量
.setMedDosage(prescriptionInfo.getMedDosage())
// 药品剂量单位
.setMedDosageUnitCode(prescriptionInfo.getMedDosageUnitCode())
// 药品频率
.setMedFrequency(prescriptionInfo.getMedFrequency())
// 药品途径
.setMedRoute(prescriptionInfo.getMedRoute())
// 请求数量
.setQuantity(prescriptionInfo.getQuantity())
// 请求单位
.setUnitCode(prescriptionInfo.getUnitCode())
// 支持用药信息
.setSupportInfo(prescriptionInfo.getSupportInfo())
// 服药时间(开始)
.setEffectiveDoseStart(prescriptionInfo.getEffectiveDoseStart())
// 服药时间(结束)
.setEffectiveDoseEnd(prescriptionInfo.getEffectiveDoseEnd())
// 给药间隔
.setDispenseInterval(prescriptionInfo.getDispenseInterval())
// 单次发药数
.setDispensePerQuantity(prescriptionInfo.getDispensePerQuantity())
// 处方详细类别
.setRxItemTypeCode(prescriptionInfo.getRxItemTypeCode())
// 次发药供应天
.setDispensePerDuration(prescriptionInfo.getDispensePerDuration())
// 药品版本号
.setVersion(prescriptionInfo.getVersion());
// 开具日期
.setIssueTime(now)
// 开具科室
.setOrgId(user.getOrgId())
// 开方医师
.setPrescribingDrId(user.getId())
// 药品定义id
.setMedicationId(prescriptionInfo.getMedicationId())
// 诊断id
.setConditionId(prescriptionInfo.getConditionId())
// 诊断定义id
.setConditionDefId(prescriptionInfo.getConditionDefId())
// 慢病字段 普通门诊存空串慢病存MXXXX
.setOpspDiseCode(prescriptionInfo.getOpspDiseCode())
// 药品剂量
.setMedDosage(prescriptionInfo.getMedDosage())
// 药品剂量单位
.setMedDosageUnitCode(prescriptionInfo.getMedDosageUnitCode())
// 药品频率
.setMedFrequency(prescriptionInfo.getMedFrequency())
// 药品途径
.setMedRoute(prescriptionInfo.getMedRoute())
// 请求数量
.setQuantity(prescriptionInfo.getQuantity())
// 请求单位
.setUnitCode(prescriptionInfo.getUnitCode())
// 支持用药信息
.setSupportInfo(prescriptionInfo.getSupportInfo())
// 服药时间(开始)
.setEffectiveDoseStart(prescriptionInfo.getEffectiveDoseStart())
// 服药时间(结束)
.setEffectiveDoseEnd(prescriptionInfo.getEffectiveDoseEnd())
// 给药间隔
.setDispenseInterval(prescriptionInfo.getDispenseInterval())
// 次发药数
.setDispensePerQuantity(prescriptionInfo.getDispensePerQuantity())
// 处方详细类别
.setRxItemTypeCode(prescriptionInfo.getRxItemTypeCode())
// 每次发药供应天数
.setDispensePerDuration(prescriptionInfo.getDispensePerDuration())
// 药品版本号
.setVersion(prescriptionInfo.getVersion());
// 修改处方
boolean flg = elepMedicationRequestService.updateById(elepMedicationRequest);
@@ -396,7 +404,7 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
}
}
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"电子处方"}));
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"电子处方"}));
}
/**
@@ -413,20 +421,20 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
if (deletePrescriptionInfoParam.getIdList().isEmpty()) {
elepMedicationRequestList = elepMedicationRequestService
.selectElepMedicationRequestByPrescriptionNoList(deletePrescriptionInfoParam.getPrescriptionNoList());
.selectElepMedicationRequestByPrescriptionNoList(deletePrescriptionInfoParam.getPrescriptionNoList());
// 判断信息是否存在
if (elepMedicationRequestList == null) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00006, null));
}
// 删除处方
boolean flg = elepMedicationRequestService
.deleteElepMedicationRequestByPrescriptionNo(deletePrescriptionInfoParam.getPrescriptionNoList());
.deleteElepMedicationRequestByPrescriptionNo(deletePrescriptionInfoParam.getPrescriptionNoList());
if (!flg) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00011, null));
}
} else {
elepMedicationRequestList =
elepMedicationRequestService.selectElepMedicationRequestById(deletePrescriptionInfoParam.getIdList());
elepMedicationRequestService.selectElepMedicationRequestById(deletePrescriptionInfoParam.getIdList());
// 判断信息是否存在
if (elepMedicationRequestList == null) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00006, null));
@@ -437,7 +445,7 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00011, null));
}
}
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00005, new Object[]{"电子处方"}));
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00005, new Object[] {"电子处方"}));
}
/**
@@ -450,14 +458,19 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
public R<?> issuancePrescription(List<String> prescriptionNoList) {
// 搜索处方信息
List<ElepMedicationRequest> elepMedicationRequestList =
elepMedicationRequestService.selectElepMedicationRequestByPrescriptionNoList(prescriptionNoList);
elepMedicationRequestService.selectElepMedicationRequestByPrescriptionNoList(prescriptionNoList);
// 判断处方是否存在
if (elepMedicationRequestList == null) {
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00006, null));
}
for (ElepMedicationRequest item : elepMedicationRequestList) {
// 处方状态
item.setStatusEnum(RequestStatus.ACTIVE.getValue());
if (Objects.equals(item.getStatusEnum(), RequestStatus.DRAFT.getValue())
|| Objects.equals(item.getStatusEnum(), RequestStatus.ENDED.getValue())) {
// 处方状态
item.setStatusEnum(RequestStatus.ACTIVE.getValue());
} else {
return R.fail("选择了不能签发的处方");
}
}
// 签发处方
boolean flg = elepMedicationRequestService.updateBatchById(elepMedicationRequestList);
@@ -465,6 +478,6 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00011, null));
}
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[]{"电子处方"}));
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[] {"电子处方"}));
}
}

View File

@@ -136,7 +136,7 @@ public class DoctorStationEmrAppServiceImpl implements IDoctorStationEmrAppServi
BeanUtils.copyProperties(emrTemplateDto, emrTemplate);
if (BindingType.PERSONAL.getValue().toString().equals(emrTemplateDto.getUseScopeCode())) {
emrTemplate.setUserId(SecurityUtils.getLoginUser().getUserId());
} else if (BindingType.DEFINITION.getValue().toString().equals(emrTemplateDto.getUseScopeCode())) {
} else if (BindingType.ORGANIZATION.getValue().toString().equals(emrTemplateDto.getUseScopeCode())) {
emrTemplate.setUserId(SecurityUtils.getLoginUser().getOrgId());
} else if (BindingType.HOSPITAL.getValue().toString().equals(emrTemplateDto.getUseScopeCode())) {
emrTemplate.setUserId(null);

View File

@@ -62,8 +62,8 @@ public class DoctorStationMainAppServiceImpl implements IDoctorStationMainAppSer
// 当前登录账号ID
Long userId = SecurityUtils.getLoginUser().getUserId();
Long currentUserOrganizationId = SecurityUtils.getLoginUser().getOrgId();
// 不是待诊的情况,需要参与者账户id(接诊医生)的条件
if (!EncounterStatus.PLANNED.getValue().equals(patientInfoDto.getStatusEnum())) {
// 诊的情况,需要参与者账户id(接诊医生)的条件
if (EncounterStatus.IN_PROGRESS.getValue().equals(patientInfoDto.getStatusEnum())) {
patientInfoDto.setJzPractitionerUserId(userId);
}
// 划价时
@@ -83,7 +83,7 @@ public class DoctorStationMainAppServiceImpl implements IDoctorStationMainAppSer
IPage<PatientInfoDto> patientInfo = doctorStationMainAppMapper.getPatientInfo(new Page<>(pageNo, pageSize),
ParticipantType.REGISTRATION_DOCTOR.getCode(), ParticipantType.ADMITTER.getCode(),
ClinicalStatus.INACTIVE.getValue(), userId, currentUserOrganizationId, pricingFlag,
EncounterStatus.PLANNED.getValue(), queryWrapper);
EncounterStatus.PLANNED.getValue(), EncounterActivityStatus.ACTIVE.getValue(), queryWrapper);
patientInfo.getRecords().forEach(e -> {
// 性别
e.setGenderEnum_enumText(EnumUtils.getInfoByValue(AdministrativeGender.class, e.getGenderEnum()));
@@ -108,11 +108,18 @@ public class DoctorStationMainAppServiceImpl implements IDoctorStationMainAppSer
.set(Encounter::getReceptionTime, new Date())
.set(Encounter::getStatusEnum, EncounterStatus.IN_PROGRESS.getValue())
.set(Encounter::getSubjectStatusEnum, EncounterSubjectStatus.RECEIVING_CARE.getValue()));
// 先把之前的接诊记录更新为已完成
iEncounterParticipantService.update(new LambdaUpdateWrapper<EncounterParticipant>()
.eq(EncounterParticipant::getTypeCode, ParticipantType.ADMITTER.getCode())
.eq(EncounterParticipant::getEncounterId, encounterId)
.set(EncounterParticipant::getStatusEnum, EncounterActivityStatus.COMPLETED.getValue()));
// 插入接诊医生参与记录
EncounterParticipant encounterParticipant = new EncounterParticipant();
encounterParticipant.setEncounterId(encounterId);
encounterParticipant.setTypeCode(ParticipantType.ADMITTER.getCode());// 接诊医生
encounterParticipant.setPractitionerId(SecurityUtils.getLoginUser().getPractitionerId());
encounterParticipant.setStatusEnum(EncounterActivityStatus.ACTIVE.getValue()); // 状态
iEncounterParticipantService.save(encounterParticipant);
return update > 0 ? R.ok() : R.fail();
}

View File

@@ -45,7 +45,12 @@ public class ReservationRecordAppServiceImpl implements IReservationRecordAppSer
// 当前登录账号的科室id
Long orgId = SecurityUtils.getLoginUser().getOrgId();
// 参与者id
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
Long practitionerId;
if (reservationRecordDto.getPractitionerId() != null) {
practitionerId = reservationRecordDto.getPractitionerId();
} else {
practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
}
ReservationRecord reservationRecord = new ReservationRecord();
@@ -54,6 +59,7 @@ public class ReservationRecordAppServiceImpl implements IReservationRecordAppSer
reservationRecord.setChiefComplaint(reservationRecordDto.getChiefComplaint()); // 主诉
reservationRecord.setReservationTime(reservationRecordDto.getReservationTime());// 就诊预约时间
reservationRecord.setRemark(reservationRecordDto.getRemark()); // 备注
reservationRecord.setToothPosition(reservationRecordDto.getToothPosition()); // 牙位
reservationRecord.setOrgId(orgId); // 预约科室id
reservationRecord.setPractitionerId(practitionerId); // 预约医生id
iReservationRecordService.save(reservationRecord);
@@ -72,7 +78,12 @@ public class ReservationRecordAppServiceImpl implements IReservationRecordAppSer
// 当前登录账号的科室id
Long orgId = SecurityUtils.getLoginUser().getOrgId();
// 参与者id
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
Long practitionerId;
if (reservationRecordDto.getPractitionerId() != null) {
practitionerId = reservationRecordDto.getPractitionerId();
} else {
practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
}
ReservationRecord reservationRecord = new ReservationRecord();
@@ -82,6 +93,7 @@ public class ReservationRecordAppServiceImpl implements IReservationRecordAppSer
reservationRecord.setChiefComplaint(reservationRecordDto.getChiefComplaint()); // 主诉
reservationRecord.setReservationTime(reservationRecordDto.getReservationTime());// 就诊预约时间
reservationRecord.setRemark(reservationRecordDto.getRemark()); // 备注
reservationRecord.setToothPosition(reservationRecordDto.getToothPosition()); // 牙位
reservationRecord.setOrgId(orgId); // 预约科室id
reservationRecord.setPractitionerId(practitionerId); // 预约医生id
iReservationRecordService.updateById(reservationRecord);
@@ -114,17 +126,12 @@ public class ReservationRecordAppServiceImpl implements IReservationRecordAppSer
@Override
public IPage<ReservationRecordDto> getReservationInfo(ReservationRecordDto reservationRecordDto, String searchKey,
Integer pageNo, Integer pageSize, HttpServletRequest request) {
// 当前登录账号的科室id
Long orgId = SecurityUtils.getLoginUser().getOrgId();
// 参与者id
Long practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
// 构建查询条件
QueryWrapper<ReservationRecordDto> queryWrapper = HisQueryUtils.buildQueryWrapper(reservationRecordDto,
searchKey, new HashSet<>(Arrays.asList("patient_name", "chief_complaint", "patient_tel")), request);
return reservationRecordAppMapper.getReservationInfo(new Page<>(pageNo, pageSize), orgId, practitionerId,
queryWrapper);
return reservationRecordAppMapper.getReservationInfo(new Page<>(pageNo, pageSize), queryWrapper);
}
}

View File

@@ -32,27 +32,40 @@ public class DoctorStationAdviceController {
/**
* 查询医嘱信息
*
* @param adviceBaseDto 查询条件
* @param searchKey 模糊查询关键字
* @param locationId 药房id
* @param adviceBaseDto 查询条件
* @param searchKey 模糊查询关键字
* @param locationId 药房id
* @param adviceDefinitionIdParamList 医嘱定义id参数集合
* @param adviceTypes 医嘱类型参数集合
* @param organizationId 患者挂号对应的科室id
* @param pageNo 当前页
* @param pageSize 每页多少条
* @param adviceTypes 医嘱类型参数集合
* @param organizationId 患者挂号对应的科室id
* @param pageNo 当前页
* @param pageSize 每页多少条
* @return 医嘱信息
*/
@GetMapping(value = "/advice-base-info")
public R<?> getAdviceBaseInfo(AdviceBaseDto adviceBaseDto,
@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
@RequestParam(value = "locationId", required = false) Long locationId,
@RequestParam(value = "adviceDefinitionIdParamList", required = false) List<Long> adviceDefinitionIdParamList,
@RequestParam(value = "organizationId") Long organizationId,
@RequestParam(value = "adviceTypes") List<Integer> adviceTypes,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
@RequestParam(value = "locationId", required = false) Long locationId,
@RequestParam(value = "adviceDefinitionIdParamList", required = false) List<Long> adviceDefinitionIdParamList,
@RequestParam(value = "organizationId", defaultValue = "0") Long organizationId,
@RequestParam(value = "adviceTypes", defaultValue = "1,2,3") List<Integer> adviceTypes,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
return R.ok(iDoctorStationAdviceAppService.getAdviceBaseInfo(adviceBaseDto, searchKey, locationId,
adviceDefinitionIdParamList, organizationId, pageNo, pageSize, Whether.NO.getValue(), adviceTypes));
adviceDefinitionIdParamList, organizationId, pageNo, pageSize, Whether.NO.getValue(), adviceTypes));
}
/**
* 查询医嘱绑定信息
*
* @param typeCode 1:用法绑东西 2:诊疗绑东西
* @param itemNo 用法的code 或者 诊疗定义id
* @return 医嘱绑定信息
*/
@GetMapping(value = "/order-bind-info")
public R<?> getOrderBindInfo(@RequestParam(value = "typeCode") String typeCode,
@RequestParam(value = "itemNo") String itemNo) {
return R.ok(iDoctorStationAdviceAppService.getOrderBindInfo(typeCode, itemNo));
}
/**

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