Compare commits
20 Commits
1276dc4adb
...
2c7456531d
Author | SHA1 | Date | |
---|---|---|---|
![]() |
2c7456531d | ||
![]() |
cede47f342 | ||
![]() |
8ad2d6ebbb | ||
![]() |
dd0090a2a8 | ||
![]() |
e4c5f36f2e | ||
![]() |
f515bb8fbb | ||
![]() |
bd3874b3c7 | ||
![]() |
8dc6faff0b | ||
![]() |
d23a594a4b | ||
![]() |
c8014404f1 | ||
![]() |
38785887b1 | ||
![]() |
08f539dc72 | ||
![]() |
6987963840 | ||
![]() |
2a75448a30 | ||
![]() |
72176f67cc | ||
![]() |
155df0c917 | ||
![]() |
00208c5f79 | ||
![]() |
db9d790435 | ||
![]() |
99773d092e | ||
![]() |
0dbed951d2 |
@@ -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>
|
||||
|
||||
<!-- 核心模块-->
|
||||
|
@@ -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,6 @@
|
||||
<dependency>
|
||||
<groupId>com.belerweb</groupId>
|
||||
<artifactId>pinyin4j</artifactId>
|
||||
<version>2.5.1</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -197,7 +197,39 @@ public enum TenantOptionDict {
|
||||
/**
|
||||
* 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);
|
||||
|
||||
private final String code;
|
||||
private final String name;
|
||||
|
@@ -80,7 +80,6 @@
|
||||
<dependency>
|
||||
<groupId>com.googlecode.aviator</groupId>
|
||||
<artifactId>aviator</artifactId>
|
||||
<version>5.3.3</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
@@ -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 {
|
||||
/**
|
||||
|
@@ -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();
|
||||
|
@@ -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 -->
|
||||
|
@@ -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,11 +46,10 @@
|
||||
<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>
|
||||
@@ -61,7 +63,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 +77,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>
|
||||
|
@@ -0,0 +1,22 @@
|
||||
package com.openhis.web.adjustprice.appservice;
|
||||
|
||||
import com.openhis.web.adjustprice.dto.SupplyListDto;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Desc:
|
||||
* @Author raymond
|
||||
* @Date 16:09 2025/10/15
|
||||
* @return
|
||||
**/
|
||||
public interface ISupplyService {
|
||||
/**
|
||||
* Desc:
|
||||
* @param
|
||||
* @Author raymond
|
||||
* @Date 17:10 2025/10/15
|
||||
* @return java.util.List<com.openhis.web.paymentmanage.dto.SupplyListDto>
|
||||
**/
|
||||
List<SupplyListDto> searchAllSupplyList();
|
||||
}
|
@@ -0,0 +1,28 @@
|
||||
package com.openhis.web.adjustprice.appservice.impl;
|
||||
|
||||
import com.openhis.web.adjustprice.appservice.ISupplyService;
|
||||
import com.openhis.web.adjustprice.dto.SupplyListDto;
|
||||
import com.openhis.web.adjustprice.mapper.SupplyMapper;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @ClassName ChangePriceImpl
|
||||
* @Description TODO
|
||||
* @Author raymond
|
||||
* @Date 2025/10/15 16:10
|
||||
* @Version 1.0
|
||||
**/
|
||||
@Component
|
||||
public class SupplyServiceImpl implements ISupplyService {
|
||||
|
||||
@Resource
|
||||
private SupplyMapper supplyMapper;
|
||||
|
||||
@Override
|
||||
public List<SupplyListDto> searchAllSupplyList() {
|
||||
return this.supplyMapper.searchAllSupplyList();
|
||||
}
|
||||
}
|
@@ -0,0 +1,112 @@
|
||||
package com.openhis.web.adjustprice.controller;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import com.core.common.core.domain.R;
|
||||
import com.openhis.web.adjustprice.appservice.ISupplyService;
|
||||
import com.openhis.web.datadictionary.dto.MedicationSearchParam;
|
||||
|
||||
/**
|
||||
* @ClassName ChargePriceController
|
||||
* @Description 调价修改药品、耗材、诊疗、挂号接口类
|
||||
* @Author raymond
|
||||
* @Date 2025/10/14 16:56
|
||||
* @Version 1.0
|
||||
**/
|
||||
@RestController
|
||||
@RequestMapping("/change/price")
|
||||
public class ChangePriceController {
|
||||
@Resource
|
||||
private ISupplyService supplyService;
|
||||
|
||||
/**
|
||||
* Desc: 查询所有供应商集合
|
||||
*
|
||||
* @param
|
||||
* @Author raymond
|
||||
* @Date 16:55 2025/10/15
|
||||
* @return com.core.common.core.domain.R<?>
|
||||
**/
|
||||
@GetMapping(value = "searchAllSupply")
|
||||
public R<?> searchAllSupply() {
|
||||
return R.ok(this.supplyService.searchAllSupplyList());
|
||||
}
|
||||
|
||||
/**
|
||||
* Desc: 根据供应商和药品名称加载要修改的药品数据
|
||||
*
|
||||
* @Author raymond
|
||||
* @Date 08:47 2025/10/15
|
||||
* @return com.core.common.core.domain.R<?>
|
||||
**/
|
||||
@PostMapping(value = "searchMedicineListToPage")
|
||||
public R<?> searchMedicineListToPage() {
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* Desc:
|
||||
*
|
||||
* @param medicationSearchParam
|
||||
* @param searchKey
|
||||
* @param pageNo
|
||||
* @param pageSize
|
||||
* @param request
|
||||
* @Author raymond
|
||||
* @Date 13:41 2025/10/15
|
||||
* @return com.core.common.core.domain.R<?>
|
||||
**/
|
||||
@PostMapping(value = "searchConsumablesListToPage")
|
||||
public R<?> searchConsumablesListToPage(MedicationSearchParam medicationSearchParam,
|
||||
@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
|
||||
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest request) {
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Desc:
|
||||
*
|
||||
* @param medicationSearchParam
|
||||
* @param searchKey
|
||||
* @param pageNo
|
||||
* @param pageSize
|
||||
* @param request
|
||||
* @Author raymond
|
||||
* @Date 13:41 2025/10/15
|
||||
* @return com.core.common.core.domain.R<?>
|
||||
**/
|
||||
@PostMapping(value = "searchDiagnosisListToPage")
|
||||
public R<?> searchDiagnosisListToPage(MedicationSearchParam medicationSearchParam,
|
||||
@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
|
||||
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest request) {
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Desc:
|
||||
*
|
||||
* @param medicationSearchParam
|
||||
* @param searchKey
|
||||
* @param pageNo
|
||||
* @param pageSize
|
||||
* @param request
|
||||
* @Author raymond
|
||||
* @Date 13:41 2025/10/15
|
||||
* @return com.core.common.core.domain.R<?>
|
||||
**/
|
||||
@PostMapping(value = "searchHealthCareListToPage")
|
||||
public R<?> searchRegisterListToPage(MedicationSearchParam medicationSearchParam,
|
||||
@RequestParam(value = "searchKey", defaultValue = "") String searchKey,
|
||||
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest request) {
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
@@ -0,0 +1,22 @@
|
||||
package com.openhis.web.adjustprice.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @ClassName SupplyListDto
|
||||
* @Description TODO
|
||||
* @Author raymond
|
||||
* @Date 2025/10/15 16:56
|
||||
* @Version 1.0
|
||||
**/
|
||||
@Data
|
||||
public class SupplyListDto {
|
||||
/**
|
||||
* 供应商ID
|
||||
*/
|
||||
private Long supplyId;
|
||||
/**
|
||||
* 供应商名称
|
||||
*/
|
||||
private String supplyName;
|
||||
}
|
@@ -0,0 +1,25 @@
|
||||
package com.openhis.web.adjustprice.mapper;
|
||||
|
||||
import com.openhis.web.adjustprice.dto.SupplyListDto;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Desc:
|
||||
* @Author raymond
|
||||
* @Date 14:37 2025/10/15
|
||||
* @return
|
||||
**/
|
||||
@Component
|
||||
public interface SupplyMapper {
|
||||
/**
|
||||
* Desc:
|
||||
* @param
|
||||
* @Author raymond
|
||||
* @Date 17:10 2025/10/15
|
||||
* @return java.util.List<com.openhis.web.paymentmanage.dto.SupplyListDto>
|
||||
**/
|
||||
List<SupplyListDto> searchAllSupplyList();
|
||||
|
||||
}
|
@@ -7,6 +7,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import com.openhis.common.enums.AdministrativeGender;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
@@ -70,6 +71,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));
|
||||
@@ -106,7 +109,7 @@ public class PractitionerAppServiceImpl implements IPractitionerAppService {
|
||||
Practitioner practitioner = new Practitioner();
|
||||
practitioner.setActiveFlag(AccountStatus.ACTIVE.getValue()); // 活动标记
|
||||
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 +122,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 +281,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 +306,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 +319,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);
|
||||
|
@@ -99,6 +99,12 @@ public class UserAndPractitionerDto {
|
||||
*/
|
||||
private String pharPracCertNo;
|
||||
|
||||
/** 签名图片 */
|
||||
private String signature;
|
||||
|
||||
/** 职称编码 */
|
||||
private String drProfttlCode ;
|
||||
|
||||
/**
|
||||
* 机构id
|
||||
*/
|
||||
|
@@ -126,7 +126,6 @@ public class OutpatientChargeAppServiceImpl implements IOutpatientChargeAppServi
|
||||
});
|
||||
return prescriptionDtoList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 医保转自费
|
||||
*
|
||||
|
@@ -3,6 +3,7 @@
|
||||
*/
|
||||
package com.openhis.web.chargemanage.appservice.impl;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
@@ -272,7 +273,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 +299,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 +322,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
|
||||
@@ -374,11 +375,11 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
|
||||
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 +387,9 @@ public class OutpatientRefundAppServiceImpl implements IOutpatientRefundAppServi
|
||||
// 收费状态枚举
|
||||
e.setStatusEnum_enumText(EnumUtils.getInfoByValue(ChargeItemStatus.class, e.getStatusEnum()));
|
||||
// 计算年龄
|
||||
if (e.getBirthDate() != null) {
|
||||
e.setAge(AgeCalculatorUtil.getAge(e.getBirthDate()));
|
||||
// 合同类型枚举
|
||||
e.setCategoryEnum_enumText(EnumUtils.getInfoByValue(ContractCategory.class, e.getCategoryEnum()));
|
||||
}
|
||||
});
|
||||
return R.ok(encounterPatientPage);
|
||||
}
|
||||
|
@@ -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();
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
|
||||
@@ -103,4 +104,9 @@ public class EncounterPatientPrescriptionDto {
|
||||
|
||||
/** 服务所在表 */
|
||||
private String serviceTable;
|
||||
|
||||
/** 服务所在表对应的id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long serviceId;
|
||||
|
||||
}
|
||||
|
@@ -42,7 +42,7 @@ public class RefundItemDto {
|
||||
private String prescriptionNo;
|
||||
|
||||
/** 请求数量 */
|
||||
private Integer quantity;
|
||||
private BigDecimal quantity;
|
||||
|
||||
/** 请求单位编码 */
|
||||
@Dict(dictCode = "unit_code")
|
||||
|
@@ -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);
|
||||
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
/**
|
||||
* 查询患者退费项目
|
||||
|
@@ -149,4 +149,21 @@ 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);
|
||||
}
|
||||
|
@@ -15,10 +15,12 @@ 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.TraceNoManage;
|
||||
import com.openhis.administration.mapper.TraceNoManageMapper;
|
||||
import com.openhis.administration.service.ILocationService;
|
||||
@@ -36,7 +38,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常用接口
|
||||
@@ -301,7 +302,7 @@ public class CommonServiceImpl implements ICommonService {
|
||||
* @return 科室列表
|
||||
*/
|
||||
@Override
|
||||
public List<Organization> departmentList(){
|
||||
public List<Organization> departmentList() {
|
||||
return organizationService.getList(OrganizationType.DEPARTMENT.getValue(), null);
|
||||
}
|
||||
|
||||
@@ -451,4 +452,43 @@ 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -7,6 +7,8 @@ import java.util.List;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import com.openhis.common.enums.Whether;
|
||||
import com.openhis.web.common.dto.AdvicePrintInfoDto;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
@@ -198,4 +200,28 @@ 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
@@ -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;
|
||||
}
|
@@ -26,10 +26,6 @@ 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;
|
||||
@@ -45,20 +41,20 @@ public class PerformInfoDto {
|
||||
/** 请求所在表 */
|
||||
private String requestTable;
|
||||
|
||||
/** 执行时间列表 */
|
||||
private List<String> executeTimes;
|
||||
|
||||
/** 执行位置 */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long locationId;
|
||||
|
||||
/** 分组id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long groupId;
|
||||
|
||||
/** 执行开始时间 */
|
||||
private Date exeStartTime;
|
||||
|
||||
/** 执行结束时间 */
|
||||
private Date exeEndTime;
|
||||
|
||||
/** 组号 */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long groupId;
|
||||
|
||||
/** 执行时间列表 */
|
||||
private List<String> executeTimes;
|
||||
}
|
||||
|
@@ -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;
|
||||
|
||||
/** 执行位置 */
|
||||
|
@@ -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;
|
||||
|
||||
}
|
@@ -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
|
||||
@@ -66,4 +64,28 @@ public interface CommonAppMapper {
|
||||
* @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);
|
||||
}
|
||||
|
@@ -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,19 @@ public interface IDeviceManageAppService {
|
||||
* @return
|
||||
*/
|
||||
R<?> editDeviceStart(@RequestBody List<Long> ids);
|
||||
|
||||
/**
|
||||
* 导入器材目录
|
||||
*
|
||||
* @param file 文件
|
||||
* @return 结果
|
||||
*/
|
||||
R<?> importData(MultipartFile file);
|
||||
|
||||
/**
|
||||
* 获取导入模板
|
||||
*
|
||||
* @param response 响应
|
||||
*/
|
||||
void importTemplate(HttpServletResponse response);
|
||||
}
|
||||
|
@@ -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,18 @@ public interface IDiagTreatMAppService {
|
||||
*/
|
||||
R<?> addDiseaseTreatment(DiagnosisTreatmentUpDto diagnosisTreatmentUpDto);
|
||||
|
||||
/**
|
||||
* 导入诊疗目录
|
||||
*
|
||||
* @param file 文件
|
||||
* @return 结果
|
||||
*/
|
||||
R<?> importData(MultipartFile file);
|
||||
|
||||
/**
|
||||
* 获取导入模板
|
||||
*
|
||||
* @param response 响应
|
||||
*/
|
||||
void importTemplate(HttpServletResponse response);
|
||||
}
|
@@ -3,38 +3,46 @@
|
||||
*/
|
||||
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;
|
||||
@@ -60,6 +68,12 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
|
||||
@Autowired
|
||||
private IDeviceDefinitionService deviceDefinitionService;
|
||||
|
||||
@Autowired
|
||||
private IChargeItemDefinitionService chargeItemDefinitionService;
|
||||
|
||||
@Autowired
|
||||
private ILocationService locationService;
|
||||
|
||||
@Resource
|
||||
private DeviceManageMapper deviceManageMapper;
|
||||
|
||||
@@ -185,11 +199,11 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
|
||||
*/
|
||||
@Override
|
||||
public R<?> editDevice(DeviceManageUpDto deviceManageDto) {
|
||||
// // 校验是否可以编辑
|
||||
// boolean result = supplyRequestService.verifyAbleEdit(deviceManageDto.getId());
|
||||
// if (result) {
|
||||
// return R.fail("该耗材已经发生过业务,不可编辑");
|
||||
// }
|
||||
// 校验是否可以编辑
|
||||
boolean result = supplyRequestService.verifyAbleEdit(deviceManageDto.getId());
|
||||
if (result) {
|
||||
return R.fail("该耗材已经发生过业务,不可编辑");
|
||||
}
|
||||
DeviceDefinition deviceDefinition = new DeviceDefinition();
|
||||
BeanUtils.copyProperties(deviceManageDto, deviceDefinition);
|
||||
// 拼音码
|
||||
@@ -363,4 +377,245 @@ public class DeviceManageAppServiceImpl implements IDeviceManageAppService {
|
||||
|
||||
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 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -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,11 @@ 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,13 +25,16 @@ 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;
|
||||
@@ -41,6 +46,7 @@ import com.openhis.web.datadictionary.mapper.ActivityDefinitionManageMapper;
|
||||
import com.openhis.workflow.domain.ActivityDefinition;
|
||||
import com.openhis.workflow.mapper.ActivityDefinitionMapper;
|
||||
import com.openhis.workflow.service.IActivityDefinitionService;
|
||||
import com.openhis.yb.service.YbManager;
|
||||
|
||||
/**
|
||||
* 诊疗实现类
|
||||
@@ -52,7 +58,9 @@ import com.openhis.workflow.service.IActivityDefinitionService;
|
||||
public class DiagTreatMAppServiceImpl implements IDiagTreatMAppService {
|
||||
|
||||
@Autowired
|
||||
private IActivityDefinitionService iActivityDefinitionService;
|
||||
private IActivityDefinitionService activityDefinitionService;
|
||||
@Autowired
|
||||
private IChargeItemDefinitionService chargeItemDefinitionService;
|
||||
@Autowired
|
||||
private ActivityDefinitionMapper activityDefinitionMapper;
|
||||
@Autowired
|
||||
@@ -110,15 +118,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 +241,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()) {
|
||||
@@ -294,7 +302,7 @@ public class DiagTreatMAppServiceImpl implements IDiagTreatMAppService {
|
||||
iOperationRecordService.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));
|
||||
|
||||
@@ -322,7 +330,7 @@ public class DiagTreatMAppServiceImpl implements IDiagTreatMAppService {
|
||||
iOperationRecordService.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 +363,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()) {
|
||||
@@ -387,4 +395,169 @@ 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 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;
|
||||
}
|
||||
}
|
||||
|
@@ -142,7 +142,7 @@ public class DiseaseManageAppServiceImpl implements IDiseaseManageAppService {
|
||||
|
||||
// 更新病种信息
|
||||
return ConditionDefinitionService.updateById(conditionDefinition)
|
||||
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"疾病目录"}))
|
||||
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"疾病目录"}))
|
||||
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
|
||||
}
|
||||
|
||||
@@ -159,12 +159,12 @@ 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.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"疾病目录"}))
|
||||
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
|
||||
}
|
||||
|
||||
@@ -186,7 +186,7 @@ public class DiseaseManageAppServiceImpl implements IDiseaseManageAppService {
|
||||
}
|
||||
// 更新病种信息
|
||||
return ConditionDefinitionService.updateBatchById(conditionDefinitionList)
|
||||
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[] {"疾病目录"}))
|
||||
? R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"疾病目录"}))
|
||||
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00007, null));
|
||||
}
|
||||
|
||||
@@ -210,7 +210,7 @@ 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.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00002, new Object[]{"疾病目录"}))
|
||||
: R.fail(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00008, null));
|
||||
}
|
||||
|
||||
|
@@ -3,11 +3,8 @@
|
||||
*/
|
||||
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;
|
||||
|
||||
@@ -21,23 +18,27 @@ 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;
|
||||
@@ -70,10 +71,10 @@ public class MedicationManageAppServiceImpl implements IMedicationManageAppServi
|
||||
private IMedicationDefinitionService medicationDefinitionService;
|
||||
|
||||
@Autowired
|
||||
IChargeItemDefinitionService chargeItemDefinitionService;
|
||||
private IChargeItemDefinitionService chargeItemDefinitionService;
|
||||
|
||||
@Autowired
|
||||
IChargeItemDefDetailService chargeItemDefDetailService;
|
||||
private ILocationService locationService;
|
||||
|
||||
@Autowired
|
||||
private MedicationManageSearchMapper medicationManageSearchMapper;
|
||||
@@ -246,16 +247,11 @@ 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("该药品已经发生过业务,不可编辑");
|
||||
// }
|
||||
|
||||
// 校验是否可以编辑
|
||||
boolean result = supplyRequestService.verifyAbleEdit(medicationManageUpDto.getMedicationDefId());
|
||||
if (result) {
|
||||
return R.fail("该药品已经发生过业务,不可编辑");
|
||||
}
|
||||
// Todo:用Medication和medicationDefinition的domainservice来创造新的实例,根据业务需求,使用构造函数;
|
||||
// 如果小于5哥变量,就用基本类型传递,如果大于5哥,在domain层定义构造方法的入参
|
||||
|
||||
@@ -472,15 +468,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 +515,307 @@ public class MedicationManageAppServiceImpl implements IMedicationManageAppServi
|
||||
util.importTemplateExcel(response, "药品目录数据");
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入信息校验
|
||||
*
|
||||
* @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.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("1").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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -3,10 +3,12 @@ package com.openhis.web.datadictionary.controller;
|
||||
import java.util.List;
|
||||
|
||||
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;
|
||||
@@ -138,4 +140,25 @@ public class DeviceManageController {
|
||||
public R<?> exportDevice(@RequestBody DeviceManageDto DeviceManageDto) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入器材目录
|
||||
*
|
||||
* @param file 文件
|
||||
* @return 结果
|
||||
*/
|
||||
@PostMapping("/import-data")
|
||||
public R<?> importData(MultipartFile file) {
|
||||
return deviceManageAppService.importData(file);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取导入模板
|
||||
*
|
||||
* @param response 响应
|
||||
*/
|
||||
@PostMapping("/import-template")
|
||||
public void importTemplate(HttpServletResponse response) {
|
||||
deviceManageAppService.importTemplate(response);
|
||||
}
|
||||
}
|
||||
|
@@ -3,10 +3,12 @@ package com.openhis.web.datadictionary.controller;
|
||||
import java.util.List;
|
||||
|
||||
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;
|
||||
@@ -56,8 +58,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);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -136,4 +138,25 @@ public class DiagnosisTreatmentController {
|
||||
public R<?> exportDiseaseTreatment(@RequestBody DiagnosisTreatmentDto diagnosisTreatmentDto) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入诊疗目录
|
||||
*
|
||||
* @param file 文件
|
||||
* @return 结果
|
||||
*/
|
||||
@PostMapping("/import-data")
|
||||
public R<?> importData(MultipartFile file) {
|
||||
return diagTreatMAppService.importData(file);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取导入模板
|
||||
*
|
||||
* @param response 响应
|
||||
*/
|
||||
@PostMapping("/import-template")
|
||||
public void importTemplate(HttpServletResponse response) {
|
||||
diagTreatMAppService.importTemplate(response);
|
||||
}
|
||||
}
|
||||
|
@@ -20,7 +20,7 @@ import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* TODO:病种目录
|
||||
* 病种目录
|
||||
*
|
||||
* @author lpt
|
||||
* @date 2025-02-20
|
||||
|
@@ -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;
|
||||
|
||||
}
|
||||
|
@@ -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 GuoRui
|
||||
* @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;
|
||||
}
|
@@ -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 GuoRui
|
||||
* @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;
|
||||
|
||||
}
|
@@ -17,10 +17,13 @@ import lombok.experimental.Accessors;
|
||||
@Accessors(chain = true)
|
||||
public class MedicationImportDto {
|
||||
|
||||
/** 行号 */
|
||||
private Integer lineNumber;
|
||||
|
||||
// ---------------------- 药品定义 med_medication_definition -------------------------------------
|
||||
|
||||
/** 药品名称 */
|
||||
@Excel(name = "药品名称")
|
||||
@Excel(name = "药品名称", prompt = "必填")
|
||||
private String name;
|
||||
|
||||
/** 药品版本 */
|
||||
@@ -32,27 +35,28 @@ 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 = "药品单位", 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 +64,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 +96,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 +169,8 @@ public class MedicationImportDto {
|
||||
private String rateCode;
|
||||
|
||||
/** 单次剂量 */
|
||||
@Excel(name = "单次剂量")
|
||||
@Excel(name = "单次剂量", prompt = "数值类型")
|
||||
private String doseStr;
|
||||
private BigDecimal dose;
|
||||
|
||||
/** 剂量单位 */
|
||||
@@ -165,31 +178,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;
|
||||
|
||||
}
|
||||
|
@@ -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));
|
||||
|
||||
|
@@ -4,6 +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.ActivityBindDeviceDto;
|
||||
import com.openhis.web.doctorstation.dto.AdviceBaseDto;
|
||||
import com.openhis.web.doctorstation.dto.AdviceSaveParam;
|
||||
import com.openhis.web.doctorstation.dto.UpdateGroupIdParam;
|
||||
@@ -31,6 +32,14 @@ public interface IDoctorStationAdviceAppService {
|
||||
List<Long> adviceDefinitionIdParamList, Long organizationId, Integer pageNo, Integer pageSize,
|
||||
Integer pricingFlag, List<Integer> adviceTypes);
|
||||
|
||||
/**
|
||||
* 查询诊疗绑定耗材信息
|
||||
*
|
||||
* @param activityId 诊疗id
|
||||
* @return 诊疗绑定耗材信息
|
||||
*/
|
||||
ActivityBindDeviceDto getActivityBindDevice(Long activityId);
|
||||
|
||||
/**
|
||||
* 门诊保存医嘱
|
||||
*
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
package com.openhis.web.doctorstation.appservice.impl;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -137,6 +138,8 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
|
||||
// 预减库存
|
||||
List<AdviceInventoryDto> adviceInventory =
|
||||
adviceUtils.subtractInventory(adviceInventoryList, adviceDraftInventoryList);
|
||||
// 查询取药科室配置
|
||||
List<AdviceInventoryDto> medLocationConfig = doctorStationAdviceAppMapper.getMedLocationConfig(organizationId);
|
||||
// 费用定价子表信息
|
||||
List<AdvicePriceDto> childCharge = doctorStationAdviceAppMapper
|
||||
.getChildCharge(ConditionCode.LOT_NUMBER_COST.getCode(), chargeItemDefinitionIdList);
|
||||
@@ -162,9 +165,29 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
|
||||
.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();
|
||||
@@ -201,6 +224,43 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
|
||||
return adviceBaseInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询诊疗绑定耗材信息
|
||||
*
|
||||
* @param activityId 诊疗id
|
||||
* @return 诊疗绑定耗材信息
|
||||
*/
|
||||
public ActivityBindDeviceDto getActivityBindDevice(Long activityId) {
|
||||
ActivityBindDeviceDto activityBindDeviceDto = new ActivityBindDeviceDto();
|
||||
List<ActivityBindDeviceDetailDto> activityBindDevice = doctorStationAdviceAppMapper.getActivityBindDevice(
|
||||
activityId + "", PublicationStatus.ACTIVE.getValue(), CommonConstants.TableName.ADM_DEVICE_DEFINITION);
|
||||
// 详细信息赋值
|
||||
if (!activityBindDevice.isEmpty()) {
|
||||
// 耗材id集合
|
||||
List<Long> deviceIds =
|
||||
activityBindDevice.stream().map(ActivityBindDeviceDetailDto::getDeviceId).collect(Collectors.toList());
|
||||
// 耗材医嘱信息
|
||||
List<AdviceBaseDto> deviceRecords =
|
||||
this.getAdviceBaseInfo(null, null, null, deviceIds, 0L, 1, 100, Whether.NO.getValue(), List.of(1, 2, 3))
|
||||
.getRecords();
|
||||
Map<Long, AdviceBaseDto> adviceMap = deviceRecords.stream().collect(Collectors
|
||||
.toMap(AdviceBaseDto::getAdviceDefinitionId, advice -> advice, (existing, replacement) -> existing // 如果有重复key,保留第一个
|
||||
));
|
||||
activityBindDeviceDto.setActivityBindDeviceInfos(activityBindDevice);
|
||||
for (ActivityBindDeviceDetailDto activityBindDeviceInfo : activityBindDeviceDto
|
||||
.getActivityBindDeviceInfos()) {
|
||||
Long deviceId = activityBindDeviceInfo.getDeviceId();
|
||||
if (deviceId != null) {
|
||||
AdviceBaseDto matchedAdvice = adviceMap.get(deviceId);
|
||||
if (matchedAdvice != null) {
|
||||
activityBindDeviceInfo.setOrderDetailInfos(matchedAdvice);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return activityBindDeviceDto;
|
||||
}
|
||||
|
||||
/**
|
||||
* 门诊保存/签发医嘱
|
||||
*
|
||||
@@ -297,6 +357,18 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
|
||||
// 删除
|
||||
List<AdviceSaveDto> deleteList = medicineList.stream()
|
||||
.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());
|
||||
// 删除已经产生的药品发放信息
|
||||
@@ -511,6 +583,18 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
|
||||
// 删除
|
||||
List<AdviceSaveDto> deleteList = deviceList.stream()
|
||||
.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());
|
||||
// 删除已经产生的耗材发放信息
|
||||
@@ -606,8 +690,22 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
|
||||
// 删除
|
||||
List<AdviceSaveDto> deleteList = activityList.stream()
|
||||
.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());
|
||||
@@ -683,6 +781,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);
|
||||
}
|
||||
}
|
||||
|
@@ -246,7 +246,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));
|
||||
}
|
||||
@@ -320,7 +320,7 @@ 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
|
||||
@@ -335,7 +335,7 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
|
||||
medicationRequest.setBusNo(assignSeqUtil.getSeq(AssignSeqEnum.MEDICATION_RES_NO.getPrefix(), 4));
|
||||
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()); // 请求类型
|
||||
@@ -388,7 +388,7 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
|
||||
chargeItem.setQuantityUnit(medicationRequest.getUnitCode()); // 单位
|
||||
chargeItem.setUnitPrice(adviceSaveDto.getUnitPrice()); // 单价
|
||||
// 计算总价,保留4位小数
|
||||
BigDecimal qty = new BigDecimal(chargeItem.getQuantityValue());
|
||||
BigDecimal qty = chargeItem.getQuantityValue();
|
||||
chargeItem.setTotalPrice(qty.multiply(chargeItem.getUnitPrice()).setScale(4, RoundingMode.HALF_UP)); // 总价
|
||||
chargeItem.setTotalPrice(adviceSaveDto.getTotalPrice()); // 总价
|
||||
|
||||
@@ -411,7 +411,7 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
|
||||
iActivityDefinitionService.getAppointActivityDefinitionId(CommonConstants.BusinessName.SUFFERING_TCM);
|
||||
// 签发时,生成中药代煎的账单,只生成一次
|
||||
if (Whether.YES.getValue().equals(sufferingFlag) && is_sign) {
|
||||
Integer quantity = 1; // 请求数量
|
||||
BigDecimal quantity = new BigDecimal("1"); // 请求数量
|
||||
|
||||
AdviceBaseDto adviceBaseDto = new AdviceBaseDto();
|
||||
adviceBaseDto.setAdviceDefinitionId(sufferingDefinitionId); // 医嘱定义id
|
||||
@@ -449,7 +449,7 @@ public class DoctorStationChineseMedicalAppServiceImpl implements IDoctorStation
|
||||
chargeItem.setQuantityUnit(activityAdviceBaseDto.getUnitCode()); // 单位
|
||||
chargeItem.setUnitPrice(advicePriceDto.getPrice()); // 单价
|
||||
// 计算总价,保留4位小数
|
||||
BigDecimal qty = new BigDecimal(quantity);
|
||||
BigDecimal qty = quantity;
|
||||
chargeItem
|
||||
.setTotalPrice(qty.multiply(advicePriceDto.getPrice()).setScale(4, RoundingMode.HALF_UP)); // 总价
|
||||
chargeItem.setTcmFlag(Whether.YES.getValue());// 中医标识
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
@@ -78,12 +72,14 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
|
||||
.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());
|
||||
// //获取诊断信息
|
||||
// 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);
|
||||
@@ -99,8 +95,9 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
|
||||
*/
|
||||
@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);
|
||||
}
|
||||
|
||||
@@ -115,12 +112,13 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
|
||||
@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")),
|
||||
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);
|
||||
// 从yb_catalog_drug_info表中取数据
|
||||
IPage<CatalogDrugInfo> medicationInfo =
|
||||
elepPrescriptionMapper.selectCatalogDrugInfo(new Page<>(pageNo, pageSize), queryWrapper);
|
||||
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());
|
||||
// 处方信息删除
|
||||
@@ -227,6 +226,10 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
|
||||
.setEncounterId(prescriptionInfo.getEncounterId())
|
||||
// 诊断id
|
||||
.setConditionId(prescriptionInfo.getConditionId())
|
||||
// 诊断定义id
|
||||
.setConditionDefId(prescriptionInfo.getConditionDefId())
|
||||
// 慢病字段 普通门诊存空串,慢病存MXXXX
|
||||
.setOpspDiseCode(prescriptionInfo.getOpspDiseCode())
|
||||
// 有效天数
|
||||
.setValidityDays(prescriptionInfo.getValidityDays())
|
||||
// 药品定义id
|
||||
@@ -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[] {"电子处方"}));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -360,6 +364,10 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
|
||||
.setMedicationId(prescriptionInfo.getMedicationId())
|
||||
// 诊断id
|
||||
.setConditionId(prescriptionInfo.getConditionId())
|
||||
// 诊断定义id
|
||||
.setConditionDefId(prescriptionInfo.getConditionDefId())
|
||||
// 慢病字段 普通门诊存空串,慢病存MXXXX
|
||||
.setOpspDiseCode(prescriptionInfo.getOpspDiseCode())
|
||||
// 药品剂量
|
||||
.setMedDosage(prescriptionInfo.getMedDosage())
|
||||
// 药品剂量单位
|
||||
@@ -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[] {"电子处方"}));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -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[] {"电子处方"}));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -456,8 +464,13 @@ public class DoctorStationElepPrescriptionServiceImpl extends ServiceImpl<Catalo
|
||||
return R.fail(MessageUtils.createMessage(PromptMsgConstant.Common.M00006, null));
|
||||
}
|
||||
for (ElepMedicationRequest item : elepMedicationRequestList) {
|
||||
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[] {"电子处方"}));
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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();
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -47,14 +47,25 @@ public class DoctorStationAdviceController {
|
||||
@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 = "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));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询诊疗绑定耗材信息
|
||||
*
|
||||
* @param activityId 诊疗id
|
||||
* @return 诊疗绑定耗材信息
|
||||
*/
|
||||
@GetMapping(value = "/activity-bind-device-info")
|
||||
public R<?> getActivityBindDevice(@RequestParam(value = "activityId") Long activityId) {
|
||||
return R.ok(iDoctorStationAdviceAppService.getActivityBindDevice(activityId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 门诊保存医嘱
|
||||
*
|
||||
|
@@ -7,6 +7,8 @@ import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@@ -160,6 +162,18 @@ public class DoctorStationDiagnosisController {
|
||||
return iDoctorStationDiagnosisAppService.getEncounterDiagnosis(encounterId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询就诊诊断信息
|
||||
*
|
||||
* @param searchKey 目标字符
|
||||
* @return 就诊诊断信息
|
||||
*/
|
||||
@GetMapping(value = "/get-diagnosis-list")
|
||||
public R<?> getDiagnosisList(@RequestParam(value = "searchKey", required = false) String searchKey,
|
||||
HttpServletRequest request) {
|
||||
return iDoctorStationDiagnosisAppService.getDiagnosisList(searchKey, request);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除就诊诊断信息
|
||||
*
|
||||
|
@@ -0,0 +1,51 @@
|
||||
package com.openhis.web.doctorstation.dto;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
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;
|
||||
|
||||
/**
|
||||
* 诊疗绑定耗材 详情dto
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class ActivityBindDeviceDetailDto {
|
||||
|
||||
/**
|
||||
* 用于搭配Dict切面,无实际业务意义
|
||||
*/
|
||||
@Dict(dictCode = "test_field")
|
||||
private String testField;
|
||||
private String testField_dictText;
|
||||
|
||||
/**
|
||||
* 诊疗id
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long activityId;
|
||||
|
||||
/**
|
||||
* 耗材id
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long deviceId;
|
||||
|
||||
/** 数量 */
|
||||
private BigDecimal quantity;
|
||||
|
||||
/**
|
||||
* 单位
|
||||
*/
|
||||
private String unitCode;
|
||||
|
||||
/**
|
||||
* 耗材详细信息
|
||||
*/
|
||||
private AdviceBaseDto orderDetailInfos;
|
||||
|
||||
}
|
@@ -0,0 +1,28 @@
|
||||
package com.openhis.web.doctorstation.dto;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.openhis.common.annotation.Dict;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 诊疗绑定耗材 dto
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class ActivityBindDeviceDto {
|
||||
|
||||
/**
|
||||
* 用于搭配Dict切面,无实际业务意义
|
||||
*/
|
||||
@Dict(dictCode = "test_field")
|
||||
private String testField;
|
||||
private String testField_dictText;
|
||||
|
||||
/**
|
||||
* 诊疗绑定耗材详情
|
||||
*/
|
||||
private List<ActivityBindDeviceDetailDto> activityBindDeviceInfos;
|
||||
|
||||
}
|
@@ -36,4 +36,10 @@ public class ActivityChildrenJsonParams {
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long chargeItemId;
|
||||
|
||||
/**
|
||||
* 诊疗子项对应的上级ServiceRequestId
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long parentId;
|
||||
|
||||
}
|
||||
|
@@ -133,6 +133,10 @@ public class AdviceBaseDto {
|
||||
*/
|
||||
private String supplier;
|
||||
|
||||
/** 供应商ID */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long supplierId;
|
||||
|
||||
/**
|
||||
* 生产厂家
|
||||
*/
|
||||
|
@@ -23,6 +23,9 @@ public class AdviceInventoryDto {
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long itemId;
|
||||
|
||||
/** 目录类别 */
|
||||
private String categoryCode;
|
||||
|
||||
/** 库存id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long inventoryId;
|
||||
|
@@ -70,7 +70,7 @@ public class AdviceSaveDto {
|
||||
private String prescriptionNo;
|
||||
|
||||
/** 请求数量 */
|
||||
private Integer quantity;
|
||||
private BigDecimal quantity;
|
||||
|
||||
/** 每次发药供应天数 */
|
||||
private Integer dispensePerDuration;
|
||||
@@ -218,7 +218,7 @@ public class AdviceSaveDto {
|
||||
/**
|
||||
* 中药付数
|
||||
*/
|
||||
private Integer chineseHerbsDoseQuantity;
|
||||
private BigDecimal chineseHerbsDoseQuantity;
|
||||
|
||||
/**
|
||||
* 代煎标识 | 0:否 , 1:是
|
||||
@@ -234,7 +234,7 @@ public class AdviceSaveDto {
|
||||
* 设置默认值
|
||||
*/
|
||||
public AdviceSaveDto() {
|
||||
this.chineseHerbsDoseQuantity = 1;
|
||||
this.chineseHerbsDoseQuantity = new BigDecimal("1");
|
||||
this.therapyEnum = TherapyTimeType.TEMPORARY.getValue();
|
||||
this.practitionerId = SecurityUtils.getLoginUser().getPractitionerId();
|
||||
this.founderOrgId = SecurityUtils.getLoginUser().getOrgId(); // 开方人科室
|
||||
|
@@ -4,19 +4,13 @@ import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import javax.validation.constraints.Positive;
|
||||
|
||||
/**
|
||||
* 电子处方 dto
|
||||
*/
|
||||
@@ -24,104 +18,82 @@ import javax.validation.constraints.Positive;
|
||||
@Accessors(chain = true)
|
||||
public class ElepPrescriptionInfoParam {
|
||||
|
||||
/** 药品信息 */
|
||||
List<ElepMedicationInfoDto> medicationInfoList;
|
||||
/** ID */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Integer id;
|
||||
|
||||
/** 医院内部处方编号 */
|
||||
private String prescriptionNo;
|
||||
|
||||
/** 医院id (前台不传) */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long organizationId;
|
||||
|
||||
/** 门诊/住院病历号 (前台不传) */
|
||||
private String iptOtpNo;
|
||||
|
||||
/** 科室病区 (前台不传) */
|
||||
private String departmentWard;
|
||||
|
||||
/** 医保类型 (前台不传) */
|
||||
private Integer insuranceEnum;
|
||||
|
||||
/** 开具日期 (前台不传) */
|
||||
private Date issueTime;
|
||||
|
||||
/** 开具科室 (前台不传) */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long orgId;
|
||||
|
||||
/** 患者 */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long patientId;
|
||||
|
||||
/** 就诊id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long encounterId;
|
||||
|
||||
/** 诊断id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long conditionId;
|
||||
|
||||
/** 诊断id */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long conditionDefId;
|
||||
/** 慢病字段 */
|
||||
private String opspDiseCode;
|
||||
/** 有效天数 */
|
||||
private Integer validityDays;
|
||||
|
||||
/** 药品定义id */
|
||||
private String medicationId;
|
||||
|
||||
/** 药品剂量 */
|
||||
private BigDecimal medDosage;
|
||||
/** 药品剂量单位 */
|
||||
private String medDosageUnitCode;
|
||||
|
||||
/** 药品频率 */
|
||||
private String medFrequency;
|
||||
|
||||
/** 药品途径 */
|
||||
private String medRoute;
|
||||
|
||||
/** 开方医师 (前台不传) */
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long prescribingDrId;
|
||||
|
||||
/** 延长原因 */
|
||||
private String extensionReason;
|
||||
|
||||
/** 处方状态 (前台不传) */
|
||||
private Integer statusEnum;
|
||||
|
||||
/** 请求数量 */
|
||||
private Integer quantity;
|
||||
|
||||
/** 请求单位 */
|
||||
private String unitCode;
|
||||
|
||||
/** 处方类别 */
|
||||
private Integer rxTypeCode;
|
||||
/** 处方类别 */
|
||||
private Integer rxItemTypeCode;
|
||||
|
||||
/** 支持用药信息 */
|
||||
private String supportInfo;
|
||||
/** 服药时间(开始) */
|
||||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date effectiveDoseStart;
|
||||
|
||||
/** 服药时间(结束) */
|
||||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date effectiveDoseEnd;
|
||||
/** 给药间隔 */
|
||||
private String dispenseInterval;
|
||||
|
||||
/** 单次发药数 */
|
||||
private Integer dispensePerQuantity;
|
||||
|
||||
/** 每次发药供应天数 */
|
||||
private Integer dispensePerDuration;
|
||||
|
||||
/** 药品版本号 */
|
||||
private String version;
|
||||
|
||||
/** 药品信息 */
|
||||
List<ElepMedicationInfoDto> medicationInfoList;
|
||||
}
|
||||
|
@@ -64,4 +64,9 @@ public class ReservationRecordDto {
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 牙位
|
||||
*/
|
||||
private String toothPosition;
|
||||
|
||||
}
|
@@ -68,6 +68,14 @@ public interface DoctorStationAdviceAppMapper {
|
||||
@Param("deviceTableName") String deviceTableName, @Param("status1") Integer status1,
|
||||
@Param("status2") Integer status2);
|
||||
|
||||
/**
|
||||
* 查询取药科室配置
|
||||
*
|
||||
* @param organizationId 患者挂号对应的科室id
|
||||
* @return 取药科室配置
|
||||
*/
|
||||
List<AdviceInventoryDto> getMedLocationConfig(@Param("organizationId") Long organizationId);
|
||||
|
||||
/**
|
||||
* 查询 费用定价子表
|
||||
*
|
||||
@@ -112,4 +120,15 @@ public interface DoctorStationAdviceAppMapper {
|
||||
*/
|
||||
List<EncounterContractDto> getEncounterContract(@Param("encounterId") Long encounterId);
|
||||
|
||||
/**
|
||||
* 查询诊疗绑定耗材
|
||||
*
|
||||
* @param activityId 诊疗id
|
||||
* @param status 启用状态
|
||||
* @param tableName 表名
|
||||
* @return 诊疗绑定耗材
|
||||
*/
|
||||
List<ActivityBindDeviceDetailDto> getActivityBindDevice(@Param("activityId") String activityId,
|
||||
@Param("status") Integer status, @Param("tableName") String tableName);
|
||||
|
||||
}
|
||||
|
@@ -30,6 +30,7 @@ public interface DoctorStationMainAppMapper {
|
||||
* @param currentUserOrganizationId 当前登录账号所属的科室ID
|
||||
* @param pricingFlag 划价标记
|
||||
* @param encounterStatus 就诊状态
|
||||
* @param activityStatus 活跃状态
|
||||
* @param queryWrapper 查询条件
|
||||
* @return 就诊患者信息
|
||||
*/
|
||||
@@ -38,6 +39,7 @@ public interface DoctorStationMainAppMapper {
|
||||
@Param("ClinicalStatus") Integer ClinicalStatus, @Param("userId") Long userId,
|
||||
@Param("currentUserOrganizationId") Long currentUserOrganizationId, @Param("pricingFlag") Integer pricingFlag,
|
||||
@Param("encounterStatus") Integer encounterStatus,
|
||||
@Param("activityStatus") Integer activityStatus,
|
||||
@Param(Constants.WRAPPER) QueryWrapper<PatientInfoDto> queryWrapper);
|
||||
|
||||
/**
|
||||
|
@@ -19,13 +19,10 @@ public interface ReservationRecordAppMapper {
|
||||
* 查询 预约记录
|
||||
*
|
||||
* @param page 分页参数
|
||||
* @param orgId 科室id
|
||||
* @param practitionerId 参与者id
|
||||
* @param queryWrapper 查询条件
|
||||
* @return 预约记录
|
||||
*/
|
||||
IPage<ReservationRecordDto> getReservationInfo(@Param("page") Page<ReservationRecordDto> page,
|
||||
@Param("orgId") Long orgId, @Param("practitionerId") Long practitionerId,
|
||||
@Param(Constants.WRAPPER) QueryWrapper<ReservationRecordDto> queryWrapper);
|
||||
|
||||
}
|
||||
|
@@ -2,10 +2,7 @@ package com.openhis.web.doctorstation.utils;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@@ -28,6 +25,7 @@ import com.openhis.web.datadictionary.dto.ActivityChildJsonDto;
|
||||
import com.openhis.web.doctorstation.appservice.IDoctorStationAdviceAppService;
|
||||
import com.openhis.web.doctorstation.dto.*;
|
||||
import com.openhis.web.doctorstation.mapper.DoctorStationAdviceAppMapper;
|
||||
import com.openhis.web.inhospitalnursestation.dto.MedicationRequestUseExe;
|
||||
import com.openhis.web.personalization.dto.ActivityDeviceDto;
|
||||
import com.openhis.workflow.domain.DeviceRequest;
|
||||
import com.openhis.workflow.domain.ServiceRequest;
|
||||
@@ -102,11 +100,10 @@ public class AdviceUtils {
|
||||
matched = true;
|
||||
// 检查库存是否充足
|
||||
BigDecimal minUnitQuantity = saveDto.getMinUnitQuantity();
|
||||
Integer chineseHerbsDoseQuantity = saveDto.getChineseHerbsDoseQuantity(); // 中药付数
|
||||
BigDecimal chineseHerbsDoseQuantity = saveDto.getChineseHerbsDoseQuantity(); // 中药付数
|
||||
// 中草药医嘱的情况
|
||||
if (chineseHerbsDoseQuantity != null && chineseHerbsDoseQuantity > 0) {
|
||||
minUnitQuantity =
|
||||
minUnitQuantity.multiply(BigDecimal.valueOf(chineseHerbsDoseQuantity.longValue()));
|
||||
if (chineseHerbsDoseQuantity != null && chineseHerbsDoseQuantity.compareTo(BigDecimal.ZERO) > 0) {
|
||||
minUnitQuantity = minUnitQuantity.multiply(chineseHerbsDoseQuantity);
|
||||
}
|
||||
if (minUnitQuantity.compareTo(inventoryDto.getQuantity()) > 0) {
|
||||
return saveDto.getAdviceName() + "在" + inventoryDto.getLocationName() + "库存不足";
|
||||
@@ -122,6 +119,56 @@ public class AdviceUtils {
|
||||
return null; // 校验通过
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行住院医嘱,校验药品库存
|
||||
*
|
||||
* @param medUseExeList 药品请求信息
|
||||
* @return 结果
|
||||
*/
|
||||
public String checkExeMedInventory(List<MedicationRequestUseExe> medUseExeList) {
|
||||
// 医嘱定义id集合
|
||||
List<Long> adviceDefinitionIdList =
|
||||
medUseExeList.stream().map(MedicationRequestUseExe::getMedicationId).collect(Collectors.toList());
|
||||
// 医嘱库存集合
|
||||
List<AdviceInventoryDto> adviceInventoryList =
|
||||
doctorStationAdviceAppMapper.getAdviceInventory(null, 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());
|
||||
// 预减库存
|
||||
List<AdviceInventoryDto> adviceInventory =
|
||||
this.subtractInventory(adviceInventoryList, adviceDraftInventoryList);
|
||||
// 生命提示信息集合
|
||||
List<String> tipsList = new ArrayList<>();
|
||||
for (MedicationRequestUseExe medicationRequestUseExe : medUseExeList) {
|
||||
Optional<AdviceInventoryDto> matchedInventory = adviceInventory.stream()
|
||||
.filter(inventoryDto -> medicationRequestUseExe.getMedicationId().equals(inventoryDto.getItemId())
|
||||
&& CommonConstants.TableName.MED_MEDICATION_DEFINITION.equals(inventoryDto.getItemTable())
|
||||
&& medicationRequestUseExe.getPerformLocation().equals(inventoryDto.getLocationId())
|
||||
&& medicationRequestUseExe.getLotNumber().equals(inventoryDto.getLotNumber()))
|
||||
.findFirst();
|
||||
// 匹配到库存信息
|
||||
if (matchedInventory.isPresent()) {
|
||||
AdviceInventoryDto inventoryDto = matchedInventory.get();
|
||||
if ((medicationRequestUseExe.getExecuteTimesNum()
|
||||
.multiply(medicationRequestUseExe.getMinUnitQuantity()))
|
||||
.compareTo(inventoryDto.getQuantity()) > 0) {
|
||||
tipsList
|
||||
.add("【" + medicationRequestUseExe.getBusNo() + "】在" + inventoryDto.getLocationName() + "库存不足");
|
||||
}
|
||||
} else {
|
||||
tipsList.add("【" + medicationRequestUseExe.getBusNo() + "】未匹配到库存信息");
|
||||
}
|
||||
}
|
||||
if (!tipsList.isEmpty()) {
|
||||
// 返回库存不足提示信息
|
||||
return String.join(";", tipsList);
|
||||
}
|
||||
return null; // 校验通过
|
||||
}
|
||||
|
||||
/**
|
||||
* 预减库存
|
||||
*
|
||||
@@ -176,12 +223,12 @@ public class AdviceUtils {
|
||||
AdviceBaseDto adviceBaseDto;
|
||||
ServiceRequest serviceRequest;
|
||||
AdviceBaseDto activityAdviceBaseDto;
|
||||
Integer quantity;
|
||||
BigDecimal quantity;
|
||||
ChargeItem chargeItem;
|
||||
DeviceRequest deviceRequest;
|
||||
// 生成皮试检查对应的请求和账单;生成皮试检查这个诊疗自身的请求,以及皮试检查诊疗绑定的耗材(包括发放)
|
||||
if (isSkinTest) {
|
||||
quantity = 1; // 请求数量
|
||||
quantity = new BigDecimal("1"); // 请求数量
|
||||
// 皮试检查的诊疗定义id
|
||||
Long skinTestInspectionDefinitionId = iActivityDefinitionService
|
||||
.getAppointActivityDefinitionId(CommonConstants.BusinessName.SKIN_TEST_INSPECTION);
|
||||
@@ -235,7 +282,7 @@ public class AdviceUtils {
|
||||
chargeItem.setQuantityUnit(activityAdviceBaseDto.getUnitCode()); // 单位
|
||||
chargeItem.setUnitPrice(advicePriceDto.getPrice()); // 单价
|
||||
// 计算总价,保留4位小数
|
||||
BigDecimal qty = new BigDecimal(quantity);
|
||||
BigDecimal qty = quantity;
|
||||
chargeItem
|
||||
.setTotalPrice(qty.multiply(advicePriceDto.getPrice()).setScale(4, RoundingMode.HALF_UP)); // 总价
|
||||
iChargeItemService.save(chargeItem);
|
||||
@@ -301,7 +348,7 @@ public class AdviceUtils {
|
||||
chargeItem.setQuantityUnit(activityAdviceBaseDto.getUnitCode()); // 单位
|
||||
chargeItem.setUnitPrice(advicePriceDto.getPrice()); // 单价
|
||||
// 计算总价,保留4位小数
|
||||
BigDecimal qty = new BigDecimal(quantity);
|
||||
BigDecimal qty = quantity;
|
||||
chargeItem
|
||||
.setTotalPrice(qty.multiply(advicePriceDto.getPrice()).setScale(4, RoundingMode.HALF_UP)); // 总价
|
||||
iChargeItemService.save(chargeItem);
|
||||
@@ -321,7 +368,7 @@ public class AdviceUtils {
|
||||
List<ActivityDeviceDto> tmpActivityList = outpatientRegistrationAppMapper.getTmpActivityList(methodCode,
|
||||
CommonConstants.TableName.WOR_ACTIVITY_DEFINITION);
|
||||
for (ActivityDeviceDto activityDeviceDto : tmpActivityList) {
|
||||
quantity = activityDeviceDto.getQuantity() * executeNum; // 请求数量
|
||||
quantity = activityDeviceDto.getQuantity().multiply(new BigDecimal(executeNum)); // 请求数量
|
||||
adviceBaseDto = new AdviceBaseDto();
|
||||
adviceBaseDto.setAdviceDefinitionId(activityDeviceDto.getDevActId());
|
||||
// 对应的诊疗医嘱信息
|
||||
@@ -379,7 +426,7 @@ public class AdviceUtils {
|
||||
chargeItem.setQuantityUnit(activityAdviceBaseDto.getUnitCode()); // 单位
|
||||
chargeItem.setUnitPrice(advicePriceDto.getPrice()); // 单价
|
||||
// 计算总价,保留4位小数
|
||||
BigDecimal qty = new BigDecimal(quantity);
|
||||
BigDecimal qty = quantity;
|
||||
chargeItem.setTotalPrice(
|
||||
qty.multiply(advicePriceDto.getPrice()).setScale(4, RoundingMode.HALF_UP)); // 总价
|
||||
iChargeItemService.saveOrUpdate(chargeItem);
|
||||
@@ -410,7 +457,7 @@ public class AdviceUtils {
|
||||
objectMapper.readValue(childrenJson, new TypeReference<>() {});
|
||||
// 创建子项的诊疗请求
|
||||
Long adviceDefinitionId; // 诊疗医嘱定义ID
|
||||
Integer quantity; // 子项请求数量
|
||||
BigDecimal quantity; // 子项请求数量
|
||||
List<ChargeItem> chargeItemList = new ArrayList<>(); // 子项账单集合
|
||||
ServiceRequest serviceRequest;
|
||||
ChargeItem chargeItem;
|
||||
@@ -443,6 +490,7 @@ public class AdviceUtils {
|
||||
serviceRequest.setEncounterId(activityChildrenJsonParams.getEncounterId()); // 就诊id
|
||||
serviceRequest.setAuthoredTime(curDate); // 请求签发时间
|
||||
serviceRequest.setOrgId(organizationId); // 执行科室
|
||||
serviceRequest.setParentId(activityChildrenJsonParams.getParentId()); // 子项诊疗的父id
|
||||
|
||||
iServiceRequestService.save(serviceRequest);
|
||||
|
||||
@@ -471,7 +519,7 @@ public class AdviceUtils {
|
||||
chargeItem.setQuantityUnit(activityAdviceBaseDto.getUnitCode()); // 单位
|
||||
chargeItem.setUnitPrice(advicePriceDto.getPrice()); // 单价
|
||||
// 计算总价,保留4位小数
|
||||
BigDecimal qty = new BigDecimal(quantity);
|
||||
BigDecimal qty = quantity;
|
||||
chargeItem.setTotalPrice(
|
||||
qty.multiply(advicePriceDto.getPrice()).setScale(4, RoundingMode.HALF_UP)); // 总价
|
||||
chargeItemList.add(chargeItem);
|
||||
|
@@ -14,8 +14,8 @@ import com.openhis.administration.domain.Practitioner;
|
||||
import com.openhis.administration.service.IOrganizationService;
|
||||
import com.openhis.administration.service.IPatientService;
|
||||
import com.openhis.administration.service.IPractitionerService;
|
||||
import com.openhis.common.enums.ActivityType;
|
||||
import com.openhis.common.enums.ybenums.YbGender;
|
||||
import com.openhis.common.enums.ActivityDefCategory;
|
||||
import com.openhis.common.enums.AdministrativeGender;
|
||||
import com.openhis.crosssystem.dto.LisApplyDto;
|
||||
import com.openhis.crosssystem.dto.LisApplyGroupDto;
|
||||
import com.openhis.crosssystem.dto.PacsApplyDto;
|
||||
@@ -93,15 +93,15 @@ public class DoctorStationSendApplyUtil {
|
||||
}
|
||||
|
||||
// 检验,发送LIS申请
|
||||
if (ActivityType.PROOF.getValue().equals(activityDefinition.getTypeEnum())) {
|
||||
if (ActivityDefCategory.PROOF.getCode().equals(activityDefinition.getCategoryCode())) {
|
||||
// LIS性别转换
|
||||
LisPatientSex lisPatientSex;
|
||||
if (patient.getGenderEnum() == null) {
|
||||
lisPatientSex = LisPatientSex.UNKNOWN;
|
||||
} else {
|
||||
if (YbGender.MALE.getValue().equals(patient.getGenderEnum().toString())) {
|
||||
if (AdministrativeGender.MALE.getValue().equals(patient.getGenderEnum())) {
|
||||
lisPatientSex = LisPatientSex.MALE;
|
||||
} else if (YbGender.FEMALE.getValue().equals(patient.getGenderEnum().toString())) {
|
||||
} else if (AdministrativeGender.FEMALE.getValue().equals(patient.getGenderEnum())) {
|
||||
lisPatientSex = LisPatientSex.FEMALE;
|
||||
} else {
|
||||
lisPatientSex = LisPatientSex.UNKNOWN;
|
||||
@@ -122,15 +122,15 @@ public class DoctorStationSendApplyUtil {
|
||||
crossSystemSendApplyUtil.sendApplyToLis(lisApplyDto);
|
||||
|
||||
// 检查,发送PACS申请
|
||||
} else if (ActivityType.TEST.getValue().equals(activityDefinition.getTypeEnum())) {
|
||||
} else if (ActivityDefCategory.TEST.getCode().equals(activityDefinition.getCategoryCode())) {
|
||||
// PACS性别转换
|
||||
PacsPatientSex pacsPatientSex;
|
||||
if (patient.getGenderEnum() == null) {
|
||||
pacsPatientSex = PacsPatientSex.UNKNOWN;
|
||||
} else {
|
||||
if (YbGender.MALE.getValue().equals(patient.getGenderEnum().toString())) {
|
||||
if (AdministrativeGender.MALE.getValue().equals(patient.getGenderEnum())) {
|
||||
pacsPatientSex = PacsPatientSex.MALE;
|
||||
} else if (YbGender.FEMALE.getValue().equals(patient.getGenderEnum().toString())) {
|
||||
} else if (AdministrativeGender.FEMALE.getValue().equals(patient.getGenderEnum())) {
|
||||
pacsPatientSex = PacsPatientSex.FEMALE;
|
||||
} else {
|
||||
pacsPatientSex = PacsPatientSex.UNKNOWN;
|
||||
|
@@ -103,7 +103,7 @@ public class PrescriptionUtils {
|
||||
BigDecimal currentTotal = BigDecimal.ZERO;
|
||||
for (AdviceSaveDto medicine : medicines) {
|
||||
// 计算单个药品总金额
|
||||
BigDecimal medicinePrice = medicine.getUnitPrice().multiply(new BigDecimal(medicine.getQuantity()));
|
||||
BigDecimal medicinePrice = medicine.getUnitPrice().multiply(medicine.getQuantity());
|
||||
// 特殊处理:单药品金额超限
|
||||
if (medicinePrice.compareTo(MAX_SINGLE_PRESCRIPTION_PRICE) > 0) {
|
||||
// 先保存当前组(如果有药品)
|
||||
|
@@ -26,6 +26,8 @@ public interface IDocDefinitionAppService {
|
||||
*/
|
||||
R<?> updateDefinition(DocDefinitionDto definitionDto);
|
||||
|
||||
R<?> deleteDefinition(Long id);
|
||||
|
||||
/**
|
||||
* 获取文书定义列表 树形结构
|
||||
*
|
||||
|
@@ -28,7 +28,7 @@ public interface IDocRecordAppService {
|
||||
/**
|
||||
* 根据患者ID或就诊ID获取文书记录列表,只针对不需返回患者具体信息的列表,体温单除外,单独处理
|
||||
*/
|
||||
R<?> getRecordByEncounterIdList(DocRecordQueryParam docRecordQueryParam, Integer IsPage, Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request);
|
||||
R<?> getRecordByEncounterIdList(DocRecordQueryParam docRecordQueryParam, Integer isPage, Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request);
|
||||
|
||||
R<?> getRecordPageList(DocRecordPatientQueryParam docRecordPatientQueryParam, List<Integer> primaryMenuEnumList, Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request);
|
||||
|
||||
|
@@ -2,8 +2,11 @@ package com.openhis.web.document.appservice;
|
||||
|
||||
import com.core.common.core.domain.R;
|
||||
import com.openhis.document.domain.DocStatistics;
|
||||
import com.openhis.web.document.dto.DocRecordQueryParam;
|
||||
import com.openhis.web.document.dto.DocStatisticsDto;
|
||||
import com.openhis.web.document.dto.DocStatisticsQueryParam;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -20,4 +23,6 @@ public interface IDocStatisticsAppService {
|
||||
|
||||
public R<?> queryByEncounterId(Long encounterId);
|
||||
|
||||
R<?> getStatisticsList(DocStatisticsQueryParam queryParam, Integer isPage, Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request);
|
||||
|
||||
}
|
@@ -38,8 +38,9 @@ public interface IDocStatisticsDefinitionAppService {
|
||||
*/
|
||||
public List<DocStatisticsDefinitionDto> getList(Integer isStatistics);
|
||||
|
||||
List<DocStatisticsDefinitionDto> getListWithOptionList(Integer isStatistics);
|
||||
/**
|
||||
* 获取文档统计定义选项列表并按指定格式返回
|
||||
* 过时obsolete 获取文档统计定义选项列表并按指定格式返回 (key-value)
|
||||
*
|
||||
* @return 封装了处理结果的响应对象
|
||||
*/
|
||||
@@ -53,22 +54,4 @@ public interface IDocStatisticsDefinitionAppService {
|
||||
|
||||
public R<?> deleteDocStatisticsDefinition(Long id);
|
||||
|
||||
|
||||
/**
|
||||
* 根据id获取文档统计定义
|
||||
*
|
||||
* @param id
|
||||
* @return 封装了处理结果的响应对象
|
||||
*/
|
||||
public R<?> getDocStatisticsDefinitionById(Long id);
|
||||
|
||||
/**
|
||||
* 根据code获取文档统计定义
|
||||
*
|
||||
* @param code
|
||||
* @return 封装了处理结果的响应对象
|
||||
*/
|
||||
public R<?> getDocStatisticsDefinitionByCode(String code);
|
||||
|
||||
|
||||
}
|
@@ -1,36 +0,0 @@
|
||||
package com.openhis.web.document.appservice;
|
||||
|
||||
|
||||
import com.core.common.core.domain.AjaxResult;
|
||||
import com.core.common.core.domain.R;
|
||||
import com.openhis.web.document.dto.DocStatisticsDefinitionOptionDto;
|
||||
import com.openhis.web.document.dto.DocStatisticsDefinitionOptionList;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 文档模板 业务接口
|
||||
*/
|
||||
public interface IDocStatisticsDefinitionOptionAppService {
|
||||
|
||||
|
||||
/**
|
||||
* 新增、修改文档模板 统计项选项
|
||||
*
|
||||
* @param docStatisticsDefinitionOptionList
|
||||
*/
|
||||
public R<?> add(DocStatisticsDefinitionOptionList docStatisticsDefinitionOptionList);
|
||||
|
||||
public R<?> createOrEdit(DocStatisticsDefinitionOptionList docStatisticsDefinitionOptionList);
|
||||
|
||||
public R<?> deleteDocStatisticsDefinitionOptionById(Long id);
|
||||
|
||||
public DocStatisticsDefinitionOptionList getDocStatisticsDefinitionOptionByDefinitionId(Long docStatisticsDefinitionId);
|
||||
|
||||
/**
|
||||
* 获取文档模板 统计项选项列表
|
||||
*/
|
||||
public AjaxResult getDocStatisticsDefinitionOptionList();
|
||||
|
||||
|
||||
}
|
@@ -58,6 +58,9 @@ public class DocDefinitionAppServiceImpl implements IDocDefinitionAppService {
|
||||
if (definitionDto.getVueRouter() == null || definitionDto.getVueRouter().trim().isEmpty()) {
|
||||
return R.fail("新增文书定义失败:文书路由不能为空(或不能为空白字符)");
|
||||
}
|
||||
if (definitionDto.getUseRangeEnum() != null && DocUseRangeEnum.DEPT_USE.getValue().equals(definitionDto.getUseRangeEnum()) && definitionDto.getOrganizationIds() == null) {
|
||||
return R.fail("新增文书定义失败:科室分配时,科室不能为空");
|
||||
}
|
||||
|
||||
// 2. 校验"名称+版本号"唯一性(避免重复创建)
|
||||
long duplicateCount = docDefinitionService.lambdaQuery()
|
||||
@@ -146,7 +149,9 @@ public class DocDefinitionAppServiceImpl implements IDocDefinitionAppService {
|
||||
if (definitionDto.getBusNo() == null || definitionDto.getBusNo().trim().isEmpty()) {
|
||||
return R.fail("修改文书定义失败:文书业务编号不能为空(或不能为空白字符)");
|
||||
}
|
||||
|
||||
if (definitionDto.getUseRangeEnum() != null && DocUseRangeEnum.DEPT_USE.getValue().equals(definitionDto.getUseRangeEnum()) && definitionDto.getOrganizationIds() == null) {
|
||||
return R.fail("修改文书定义失败:科室分配时,科室不能为空");
|
||||
}
|
||||
// 2. 校验文书是否存在
|
||||
DocDefinition existingDoc = docDefinitionService.getById(definitionDto.getId());
|
||||
if (existingDoc == null) {
|
||||
@@ -193,8 +198,7 @@ public class DocDefinitionAppServiceImpl implements IDocDefinitionAppService {
|
||||
log.error("修改文书定义失败:数据库更新异常(ID={}, 业务编号={}",
|
||||
definitionDto.getId(), definitionDto.getBusNo());
|
||||
return R.fail("修改文书定义失败:数据库更新操作异常");
|
||||
}
|
||||
|
||||
} else {
|
||||
// 7. 更新科室分配(仅当使用范围为"科室级"时执行)
|
||||
DocDefinitionOrganizationDto orgDto = new DocDefinitionOrganizationDto();
|
||||
orgDto.setBusNo(existingDoc.getBusNo());
|
||||
@@ -203,6 +207,23 @@ public class DocDefinitionAppServiceImpl implements IDocDefinitionAppService {
|
||||
// 复用科室分配服务的更新逻辑(先删后加,全量覆盖)
|
||||
return docDefinitionOrganizationAppService.updateOrganization(orgDto);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<?> deleteDefinition(Long id) {
|
||||
// 1. 参数校验
|
||||
if (id == null) {
|
||||
return R.fail("删除文书定义失败:文书ID不能为空");
|
||||
}
|
||||
boolean result = docDefinitionService.removeById(id);
|
||||
if (result) {
|
||||
log.info("删除文书定义成功:ID={}", id);
|
||||
return R.ok("删除文书定义成功");
|
||||
} else {
|
||||
log.error("删除文书定义失败:数据库删除异常(ID={})", id);
|
||||
return R.fail("删除文书定义失败:数据库删除操作异常");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文书定义树形列表(按目录结构组织)
|
||||
|
@@ -129,9 +129,6 @@ public class DocDefinitionOrganizationAppServiceImpl implements IDocDefinitionOr
|
||||
if (definitionOrganizationDto == null) {
|
||||
return R.fail("文书科室分配更新失败:请求参数不能为空");
|
||||
}
|
||||
if (definitionOrganizationDto.getOrganizationIds() == null || definitionOrganizationDto.getOrganizationIds().isEmpty()) {
|
||||
return R.fail("文书科室分配更新失败:科室ID列表不能为空");
|
||||
}
|
||||
if (definitionOrganizationDto.getDefinitionId() == null || definitionOrganizationDto.getDefinitionId() == 0) {
|
||||
return R.fail("文书科室分配更新失败:文书定义ID不能为空(或不能为0)");
|
||||
}
|
||||
@@ -140,17 +137,21 @@ public class DocDefinitionOrganizationAppServiceImpl implements IDocDefinitionOr
|
||||
}
|
||||
|
||||
// 2. 先删除原有分配关系
|
||||
LambdaQueryWrapper<DocDefinitionOrganization> deleteWrapper = new LambdaQueryWrapper<>();
|
||||
deleteWrapper.eq(DocDefinitionOrganization::getDefinitionId, definitionOrganizationDto.getDefinitionId())
|
||||
LambdaQueryWrapper<DocDefinitionOrganization> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(DocDefinitionOrganization::getDefinitionId, definitionOrganizationDto.getDefinitionId())
|
||||
.eq(DocDefinitionOrganization::getBusNo, definitionOrganizationDto.getBusNo().trim());
|
||||
|
||||
boolean deleteSuccess = docDefinitionOrganizationService.remove(deleteWrapper);
|
||||
Long count = docDefinitionOrganizationService.count(wrapper);
|
||||
if (count > 0) {
|
||||
boolean deleteSuccess = docDefinitionOrganizationService.remove(wrapper);
|
||||
if (!deleteSuccess) {
|
||||
log.error("文书科室分配更新失败:删除原有分配记录异常(文书定义ID={}, 业务编号={}",
|
||||
definitionOrganizationDto.getDefinitionId(), definitionOrganizationDto.getBusNo());
|
||||
return R.fail("文书科室分配更新失败:删除原有分配记录异常");
|
||||
}
|
||||
|
||||
}
|
||||
if (definitionOrganizationDto.getOrganizationIds() == null || definitionOrganizationDto.getOrganizationIds().isEmpty()) {
|
||||
return R.ok("文书科室分配更新成功");
|
||||
} else {
|
||||
// 3. 再新增新的分配关系
|
||||
List<DocDefinitionOrganization> newOrgList = new ArrayList<>();
|
||||
for (Long orgId : definitionOrganizationDto.getOrganizationIds()) {
|
||||
@@ -160,7 +161,6 @@ public class DocDefinitionOrganizationAppServiceImpl implements IDocDefinitionOr
|
||||
docOrg.setOrganizationId(orgId);
|
||||
newOrgList.add(docOrg);
|
||||
}
|
||||
|
||||
boolean saveSuccess = docDefinitionOrganizationService.saveBatch(newOrgList);
|
||||
if (saveSuccess) {
|
||||
return R.ok("文书科室分配更新成功");
|
||||
@@ -170,4 +170,5 @@ public class DocDefinitionOrganizationAppServiceImpl implements IDocDefinitionOr
|
||||
return R.fail("文书科室分配更新失败:新增新分配记录异常");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,5 +1,8 @@
|
||||
package com.openhis.web.document.appservice.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
@@ -19,15 +22,15 @@ import com.openhis.document.mapper.DocRecordMapper;
|
||||
import com.openhis.document.service.IDocRecordService;
|
||||
import com.openhis.web.document.appservice.IDocDefinitionAppService;
|
||||
import com.openhis.web.document.appservice.IDocRecordAppService;
|
||||
import com.openhis.web.document.dto.DocDefinitionDto;
|
||||
import com.openhis.web.document.dto.DocRecordDto;
|
||||
import com.openhis.web.document.dto.DocRecordPatientDto;
|
||||
import com.openhis.web.document.dto.DocRecordPatientQueryParam;
|
||||
import com.openhis.web.document.dto.DocRecordQueryParam;
|
||||
import com.openhis.web.document.appservice.IDocStatisticsAppService;
|
||||
import com.openhis.web.document.appservice.IDocStatisticsDefinitionAppService;
|
||||
import com.openhis.web.document.dto.*;
|
||||
import com.openhis.web.document.mapper.DocRecordAppMapper;
|
||||
import com.openhis.web.document.util.ConvertToDocStatistics;
|
||||
import com.openhis.web.document.util.PermissionProcessor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -37,6 +40,9 @@ import javax.servlet.http.HttpServletRequest;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Timestamp;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
|
||||
@Slf4j
|
||||
@@ -51,6 +57,12 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
|
||||
private IDocDefinitionAppService docDefinitionAppService;
|
||||
@Resource
|
||||
private DocRecordAppMapper docRecordAppMapper;
|
||||
@Resource
|
||||
private IDocStatisticsDefinitionAppService docStatisticsDefinitionAppService;
|
||||
@Resource
|
||||
private IDocStatisticsAppService docStatisticsAppService;
|
||||
@Resource
|
||||
ConvertToDocStatistics convertToDocStatistics;
|
||||
@Autowired
|
||||
private JdbcTemplate jdbcTemplate; // 使用 JdbcTemplate 执行 SQL
|
||||
|
||||
@@ -198,6 +210,27 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 文书统计 - 新增、编辑记录
|
||||
*
|
||||
* @param docRecordDto
|
||||
* @return
|
||||
*/
|
||||
private R<?> createOrUpdateStatistics(DocRecordDto docRecordDto) {
|
||||
if (docRecordDto == null) {
|
||||
return R.fail("插入文书统计数据失败:原始文书记录不能为空");
|
||||
}
|
||||
if (docRecordDto.getContentJson() == null) {
|
||||
return R.fail("插入文书统计数据失败:原始文书记录内容不能为空");
|
||||
}
|
||||
List<DocStatisticsDto> list = convertToDocStatistics.convertToStatisticsDtoList(docRecordDto);
|
||||
if (list == null || list.isEmpty()) {
|
||||
return R.fail("插入文书统计数据失败:统计数据为空");
|
||||
}
|
||||
return docStatisticsAppService.createOrUpdte(list);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增记录
|
||||
*
|
||||
@@ -213,7 +246,6 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
|
||||
docRecord.setDefinitionId(docRecordDto.getDefinitionId());
|
||||
docRecord.setDefinitionBusNo(docRecordDto.getDefinitionBusNo());
|
||||
docRecord.setContentJson(docRecordDto.getContentJson());
|
||||
// 状态默认设为草稿(修复原逻辑:原代码先判断再覆盖,导致默认值无效)
|
||||
docRecord.setStatusEnum(docRecordDto.getStatusEnum() == null ? DocStatusEnum.DRAFT.getValue() : docRecordDto.getStatusEnum());
|
||||
docRecord.setOrganizationId(SecurityUtils.getLoginUser().getOrgId());
|
||||
docRecord.setEncounterId(docRecordDto.getEncounterId());
|
||||
@@ -222,6 +254,8 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
|
||||
docRecord.setIsEdit(0);
|
||||
boolean saveSuccess = docRecordService.save(docRecord);
|
||||
if (saveSuccess) {
|
||||
docRecordDto.setId(docRecord.getId());
|
||||
createOrUpdateStatistics(docRecordDto);
|
||||
return R.ok("新增患者文书记录成功");
|
||||
} else {
|
||||
return R.fail("新增患者文书记录失败");
|
||||
@@ -259,7 +293,6 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
|
||||
docRecord.setPatientId(docRecordDto.getPatientId());
|
||||
docRecord.setRecordTime(docRecordDto.getRecordTime());
|
||||
docRecord.setIsEdit(0);
|
||||
|
||||
// 执行修改
|
||||
boolean updateSuccess = docRecordService.updateById(docRecord);
|
||||
if (updateSuccess) {
|
||||
@@ -268,6 +301,7 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
|
||||
if (!logSuccess) {
|
||||
return R.fail("修改患者文书记录成功,但插入文档操作日志失败");
|
||||
}
|
||||
createOrUpdateStatistics(docRecordDto);
|
||||
return R.ok("修改患者文书记录成功");
|
||||
} else {
|
||||
return R.fail("修改患者文书记录失败");
|
||||
@@ -287,19 +321,16 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
|
||||
return R.fail("患者文书记录:患者ID和就诊ID不能同时为空");
|
||||
}
|
||||
if (docRecordQueryParam.getDefinitionId() == null) {
|
||||
return R.fail("患者文书记录:文书类型ID不能为空");
|
||||
return R.fail("患者文书记录:文书类型(定义)ID不能为空");
|
||||
}
|
||||
|
||||
// 2. 分页查询逻辑
|
||||
if (isPage != null && isPage == 1) {
|
||||
QueryWrapper<DocRecord> queryWrapper = HisQueryUtils.buildQueryWrapper(
|
||||
QueryWrapper<DocRecordDto> queryWrapper = HisQueryUtils.buildQueryWrapper(
|
||||
docRecordQueryParam, null, null, request);
|
||||
// 按记录时间倒序(最新记录在前)
|
||||
queryWrapper.lambda().orderByDesc(DocRecord::getRecordTime);
|
||||
|
||||
Page<DocRecordDto> recordPage = HisPageUtils.selectPage(
|
||||
docRecordMapper, queryWrapper, pageNo, pageSize, DocRecordDto.class);
|
||||
return R.ok(recordPage, "获取患者文书记录列表成功");
|
||||
IPage<DocRecordDto> pageResult = docRecordAppMapper.getRecordPageListByEncounterId(
|
||||
new Page<>(pageNo, pageSize), queryWrapper);
|
||||
return R.ok(pageResult, "获取患者文书记录列表成功");
|
||||
}
|
||||
// 3. 不分页查询逻辑
|
||||
else {
|
||||
@@ -319,12 +350,15 @@ public class DocRecordAppServiceImpl implements IDocRecordAppService {
|
||||
queryWrapper.eq(DocRecord::getOrganizationId, docRecordQueryParam.getOrganizationId());
|
||||
}
|
||||
|
||||
DocDefinitionDto docDefinitionDto = docDefinitionAppService.getDefinitionById(docRecordQueryParam.getDefinitionId());
|
||||
// 实体转DTO
|
||||
List<DocRecordDto> dtoList = new ArrayList<>();
|
||||
List<DocRecord> recordList = docRecordService.list(queryWrapper);
|
||||
for (DocRecord record : recordList) {
|
||||
DocRecordDto dto = new DocRecordDto();
|
||||
BeanUtils.copyProperties(record, dto);
|
||||
dto.setName(docDefinitionDto!=null?docDefinitionDto.getName():"");
|
||||
dto.setVersion(docDefinitionDto!=null?docDefinitionDto.getVersion():"");
|
||||
dtoList.add(dto);
|
||||
}
|
||||
return R.ok(dtoList, "获取患者文书记录列表成功");
|
||||
|
@@ -1,16 +1,25 @@
|
||||
package com.openhis.web.document.appservice.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.core.common.core.domain.R;
|
||||
import com.core.common.utils.SecurityUtils;
|
||||
import com.core.common.utils.bean.BeanUtils;
|
||||
import com.openhis.common.utils.HisPageUtils;
|
||||
import com.openhis.common.utils.HisQueryUtils;
|
||||
import com.openhis.document.domain.DocStatistics;
|
||||
import com.openhis.document.mapper.DocStatisticsMapper;
|
||||
import com.openhis.document.service.IDocStatisticsService;
|
||||
import com.openhis.web.document.appservice.IDocStatisticsAppService;
|
||||
import com.openhis.web.document.appservice.IDocTemplateAppService;
|
||||
import com.openhis.web.document.dto.DocStatisticsDto;
|
||||
import com.openhis.web.document.dto.DocStatisticsQueryParam;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -22,6 +31,9 @@ public class DocStatisticsAppServiceImpl implements IDocStatisticsAppService {
|
||||
|
||||
@Resource
|
||||
private IDocStatisticsService docStatisticsService;
|
||||
@Resource
|
||||
private DocStatisticsMapper docStatisticsMapper;
|
||||
|
||||
|
||||
@Override
|
||||
public R<?> createOrUpdte(List<DocStatisticsDto> docStatisticsList) {
|
||||
@@ -31,12 +43,13 @@ public class DocStatisticsAppServiceImpl implements IDocStatisticsAppService {
|
||||
//根据recordId和statisticDefinitionId判断是否存在,存在则更新,不存在则新增
|
||||
LambdaQueryWrapper<DocStatistics> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(DocStatistics::getRecordId, docStatisticsList.get(0).getRecordId());
|
||||
queryWrapper.eq(DocStatistics::getStatisticDefinitionId, docStatisticsList.get(0).getStatisticDefinitionId());
|
||||
// queryWrapper.eq(DocStatistics::getStatisticDefinitionId, docStatisticsList.get(0).getStatisticDefinitionId());
|
||||
List<DocStatistics> docStatisticsOldList = docStatisticsService.list(queryWrapper);
|
||||
if (docStatisticsOldList.size() > 0) {
|
||||
//批量删除
|
||||
docStatisticsService.removeByIds(docStatisticsOldList.stream().map(DocStatistics::getId).toList());
|
||||
}
|
||||
List<DocStatistics> docStatisticsInsertList = new ArrayList<>();
|
||||
//批量新增
|
||||
for (DocStatisticsDto docStatisticsDto : docStatisticsList) {
|
||||
DocStatistics docStatistics = new DocStatistics();
|
||||
@@ -45,13 +58,18 @@ public class DocStatisticsAppServiceImpl implements IDocStatisticsAppService {
|
||||
docStatistics.setEncounterId(docStatisticsDto.getEncounterId());
|
||||
docStatistics.setPatientId(docStatisticsDto.getPatientId());
|
||||
docStatistics.setStatisticDefinitionCode(docStatisticsDto.getStatisticDefinitionCode());
|
||||
docStatistics.setOrgnizationId(docStatisticsDto.getOrgnizationId()); //TODO: 待确定
|
||||
docStatistics.setOrganizationId(SecurityUtils.getLoginUser().getOrgId());
|
||||
docStatistics.setValue(docStatisticsDto.getValue());
|
||||
docStatistics.setRecordingDate(docStatisticsDto.getRecordingDate());
|
||||
docStatistics.setRecordingTime(docStatisticsDto.getRecordingTime());
|
||||
docStatistics.setRecordTime(docStatisticsDto.getRecordTime());
|
||||
docStatistics.setSource(docStatisticsDto.getSource());
|
||||
docStatisticsInsertList.add(docStatistics);
|
||||
}
|
||||
boolean result = docStatisticsService.saveBatch(docStatisticsInsertList);
|
||||
if (result) {
|
||||
return R.ok();
|
||||
} else {
|
||||
return R.fail("新增或更新文档统计数据失败");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -66,6 +84,68 @@ public class DocStatisticsAppServiceImpl implements IDocStatisticsAppService {
|
||||
|
||||
@Override
|
||||
public R<?> queryByEncounterId(Long encounterId) {
|
||||
return null;
|
||||
LambdaQueryWrapper<DocStatistics> queryWrapper = new LambdaQueryWrapper();
|
||||
queryWrapper.eq(DocStatistics::getEncounterId, encounterId);
|
||||
List<DocStatistics> docStatisticsList = docStatisticsService.list(queryWrapper);
|
||||
List<DocStatisticsDto> docStatisticsDtoList = new ArrayList<>();
|
||||
for (DocStatistics docStatistics : docStatisticsList) {
|
||||
DocStatisticsDto docStatisticsDto = new DocStatisticsDto();
|
||||
docStatisticsDto.setId(docStatistics.getId());
|
||||
docStatisticsDto.setRecordId(docStatistics.getRecordId());
|
||||
docStatisticsDto.setStatisticDefinitionId(docStatistics.getStatisticDefinitionId());
|
||||
docStatisticsDto.setEncounterId(docStatistics.getEncounterId());
|
||||
docStatisticsDto.setPatientId(docStatistics.getPatientId());
|
||||
docStatisticsDto.setStatisticDefinitionCode(docStatistics.getStatisticDefinitionCode());
|
||||
docStatisticsDto.setOrganizationId(docStatistics.getOrganizationId());
|
||||
docStatisticsDto.setValue(docStatistics.getValue());
|
||||
docStatisticsDto.setRecordTime(docStatistics.getRecordTime());
|
||||
docStatisticsDto.setSource(docStatistics.getSource());
|
||||
docStatisticsDtoList.add(docStatisticsDto);
|
||||
}
|
||||
return R.ok(docStatisticsDtoList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<?> getStatisticsList(DocStatisticsQueryParam queryParam, Integer isPage, Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request) {
|
||||
// 1. 分页查询逻辑
|
||||
if (isPage != null && isPage == 1) {
|
||||
QueryWrapper<DocStatistics> queryWrapper = HisQueryUtils.buildQueryWrapper(
|
||||
queryParam, null, null, request);
|
||||
// 按记录时间倒序(最新记录在前)
|
||||
queryWrapper.lambda().orderByDesc(DocStatistics::getRecordTime);
|
||||
|
||||
Page<DocStatisticsDto> recordPage = HisPageUtils.selectPage(
|
||||
docStatisticsMapper, queryWrapper, pageNo, pageSize, DocStatisticsDto.class);
|
||||
return R.ok(recordPage, "获取患者文书统计数据成功");
|
||||
}
|
||||
//2. 不分页查询逻辑
|
||||
else {
|
||||
LambdaQueryWrapper<DocStatistics> queryWrapper = new LambdaQueryWrapper<>();
|
||||
// 患者ID查询条件
|
||||
if (queryParam.getPatientId() != null) {
|
||||
queryWrapper.eq(DocStatistics::getPatientId, queryParam.getPatientId());
|
||||
}
|
||||
// 就诊ID查询条件(修复原逻辑:原代码字段匹配错误,用EncounterId匹配DefinitionBusNo)
|
||||
if (queryParam.getEncounterId() != null) {
|
||||
queryWrapper.eq(DocStatistics::getEncounterId, queryParam.getEncounterId());
|
||||
}
|
||||
// 科室ID查询条件(修复原逻辑:原代码字段匹配错误,用OrganizationId匹配EncounterId)
|
||||
if (queryParam.getOrganizationId() != null) {
|
||||
queryWrapper.eq(DocStatistics::getOrganizationId, queryParam.getOrganizationId());
|
||||
}
|
||||
if (queryParam.getStatisticsDefinitionCode() != null) {
|
||||
queryWrapper.eq(DocStatistics::getStatisticDefinitionCode, queryParam.getStatisticsDefinitionCode());
|
||||
}
|
||||
|
||||
// 实体转DTO
|
||||
List<DocStatisticsDto> dtoList = new ArrayList<>();
|
||||
List<DocStatistics> statisticsList = docStatisticsService.list(queryWrapper);
|
||||
for (DocStatistics statistics : statisticsList) {
|
||||
DocStatisticsDto dto = new DocStatisticsDto();
|
||||
BeanUtils.copyProperties(statistics, dto);
|
||||
dtoList.add(dto);
|
||||
}
|
||||
return R.ok(dtoList, "获取患者文书统计数据成功");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -3,7 +3,10 @@ package com.openhis.web.document.appservice.impl;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.core.common.constant.CacheConstants;
|
||||
import com.core.common.core.domain.R;
|
||||
import com.core.common.core.domain.entity.SysDictData;
|
||||
import com.core.common.core.redis.RedisCache;
|
||||
import com.core.common.utils.bean.BeanUtils;
|
||||
import com.openhis.common.utils.HisPageUtils;
|
||||
import com.openhis.common.utils.HisQueryUtils;
|
||||
@@ -11,13 +14,11 @@ import com.openhis.document.domain.DocStatisticsDefinition;
|
||||
import com.openhis.document.mapper.DocStatisticsDefinitionMapper;
|
||||
import com.openhis.document.service.IDocStatisticsDefinitionService;
|
||||
import com.openhis.web.document.appservice.IDocStatisticsDefinitionAppService;
|
||||
import com.openhis.web.document.appservice.IDocStatisticsDefinitionOptionAppService;
|
||||
import com.openhis.web.document.dto.DocDefinitionOrganizationDto;
|
||||
import com.openhis.web.document.dto.DocStatisticsDefinitionDto;
|
||||
import com.openhis.web.document.dto.DocStatisticsDefinitionOptionList;
|
||||
import com.openhis.web.document.dto.OptionDto;
|
||||
import com.openhis.web.document.mapper.DocStatisticsDefinitionAppMapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@@ -35,12 +36,11 @@ public class DocStatisticsDefinitionAppServiceImpl implements IDocStatisticsDefi
|
||||
@Resource
|
||||
private IDocStatisticsDefinitionService iDocStatisticsDefinitionService;
|
||||
@Resource
|
||||
private IDocStatisticsDefinitionOptionAppService iDocStaticsDefinitionOptionAppService;
|
||||
@Resource
|
||||
private DocStatisticsDefinitionMapper docStatisticsDefinitionMapper;
|
||||
@Resource
|
||||
private DocStatisticsDefinitionAppMapper docStatisticsDefinitionAppMapper;
|
||||
|
||||
@Autowired
|
||||
private RedisCache redisCache;
|
||||
@Override
|
||||
public R<?> createOrEdit(DocStatisticsDefinitionDto docStatisticsDefinitionDto) {
|
||||
if (docStatisticsDefinitionDto == null) {
|
||||
@@ -95,15 +95,10 @@ public class DocStatisticsDefinitionAppServiceImpl implements IDocStatisticsDefi
|
||||
docStatisticsDefinition.setIsStatistics(docStatisticsDefinitionDto.getIsStatistics());
|
||||
docStatisticsDefinition.setDisplayOrder(docStatisticsDefinitionDto.getDisplayOrder());
|
||||
docStatisticsDefinition.setUnit(docStatisticsDefinitionDto.getUnit());
|
||||
|
||||
|
||||
docStatisticsDefinition.setDictType(docStatisticsDefinitionDto.getDictType());
|
||||
docStatisticsDefinition.setDictName(docStatisticsDefinitionDto.getDictName());
|
||||
boolean saveResult = iDocStatisticsDefinitionService.save(docStatisticsDefinition);
|
||||
if (saveResult) {
|
||||
// 同步保存选项列表(如有)
|
||||
if (docStatisticsDefinitionDto.getOptionList() != null && !docStatisticsDefinitionDto.getOptionList().getOptions().isEmpty()) {
|
||||
docStatisticsDefinitionDto.getOptionList().setDocStatisticsDefinitionId(docStatisticsDefinition.getId());
|
||||
return iDocStaticsDefinitionOptionAppService.add(docStatisticsDefinitionDto.getOptionList());
|
||||
}
|
||||
return R.ok("文档统计定义新增成功");
|
||||
} else {
|
||||
return R.fail("文档统计定义新增失败");
|
||||
@@ -131,10 +126,12 @@ public class DocStatisticsDefinitionAppServiceImpl implements IDocStatisticsDefi
|
||||
existingData.setIsStatistics(docStatisticsDefinitionDto.getIsStatistics());
|
||||
existingData.setDisplayOrder(docStatisticsDefinitionDto.getDisplayOrder());
|
||||
existingData.setUnit(docStatisticsDefinitionDto.getUnit());
|
||||
existingData.setDictType(docStatisticsDefinitionDto.getDictType());
|
||||
existingData.setDictName(docStatisticsDefinitionDto.getDictName());
|
||||
boolean updateResult = iDocStatisticsDefinitionService.updateById(existingData);
|
||||
if (updateResult) {
|
||||
// 同步更新选项列表
|
||||
return iDocStaticsDefinitionOptionAppService.createOrEdit(docStatisticsDefinitionDto.getOptionList());
|
||||
return R.ok("文档统计定义更新成功");
|
||||
} else {
|
||||
return R.fail("文档统计定义更新失败");
|
||||
}
|
||||
@@ -168,12 +165,12 @@ public class DocStatisticsDefinitionAppServiceImpl implements IDocStatisticsDefi
|
||||
*/
|
||||
@Override
|
||||
public R<?> getPageList(Integer pageNo, Integer pageSize, String searchKey, HttpServletRequest request) {
|
||||
// Map<String, Object> keyMap = redisCache.getAllDictDataWithKeys(CacheConstants.SYS_DICT_KEY);
|
||||
// 构建查询条件(支持多字段搜索)
|
||||
QueryWrapper<DocStatisticsDefinition> queryWrapper = HisQueryUtils.buildQueryWrapper(
|
||||
null, searchKey, new HashSet<>(Arrays.asList("name", "code")), request);
|
||||
// 按记录时间倒序(最新记录在前)
|
||||
queryWrapper.lambda().orderByDesc(DocStatisticsDefinition::getDisplayOrder);
|
||||
|
||||
Page<DocStatisticsDefinitionDto> recordPage = HisPageUtils.selectPage(
|
||||
docStatisticsDefinitionMapper, queryWrapper, pageNo, pageSize, DocStatisticsDefinitionDto.class);
|
||||
// 转换为分页结果
|
||||
@@ -181,13 +178,14 @@ public class DocStatisticsDefinitionAppServiceImpl implements IDocStatisticsDefi
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文档统计定义列表(不分页)
|
||||
* 获取文档统计定义列表(不分页,不包含options)
|
||||
*
|
||||
* @param isStatistics 是否统计
|
||||
* @return 文档统计定义列表
|
||||
*/
|
||||
@Override
|
||||
public List<DocStatisticsDefinitionDto> getList(Integer isStatistics) {
|
||||
Map<String, Object> keyMap = redisCache.getAllDictDataWithKeys(CacheConstants.SYS_DICT_KEY);
|
||||
LambdaQueryWrapper<DocStatisticsDefinition> queryWrapper = new LambdaQueryWrapper<>();
|
||||
if (isStatistics != null) {
|
||||
queryWrapper.eq(DocStatisticsDefinition::getIsStatistics, isStatistics);
|
||||
@@ -201,7 +199,28 @@ public class DocStatisticsDefinitionAppServiceImpl implements IDocStatisticsDefi
|
||||
}
|
||||
return resultList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<DocStatisticsDefinitionDto> getListWithOptionList(Integer isStatistics) {
|
||||
//从redis中获取所有字典数据
|
||||
Map<String, Object> keyMap = redisCache.getAllDictDataWithKeys(CacheConstants.SYS_DICT_KEY);
|
||||
LambdaQueryWrapper<DocStatisticsDefinition> queryWrapper = new LambdaQueryWrapper<>();
|
||||
if (isStatistics != null) {
|
||||
queryWrapper.eq(DocStatisticsDefinition::getIsStatistics, isStatistics);
|
||||
}
|
||||
List<DocStatisticsDefinition> dataList = iDocStatisticsDefinitionService.list(queryWrapper);
|
||||
List<DocStatisticsDefinitionDto> resultList = new ArrayList<>();
|
||||
for (DocStatisticsDefinition data : dataList) {
|
||||
DocStatisticsDefinitionDto dto = new DocStatisticsDefinitionDto();
|
||||
BeanUtils.copyProperties(data, dto);
|
||||
if(keyMap.containsKey(CacheConstants.SYS_DICT_KEY+data.getDictType()))
|
||||
{
|
||||
List<SysDictData> dictData = (List<SysDictData>) keyMap.get(CacheConstants.SYS_DICT_KEY+data.getDictType());
|
||||
dto.setOptionList(dictData);
|
||||
}
|
||||
resultList.add(dto);
|
||||
}
|
||||
return resultList;
|
||||
}
|
||||
/**
|
||||
* 获取文档统计定义选项列表并按指定格式返回
|
||||
*
|
||||
@@ -276,62 +295,12 @@ public class DocStatisticsDefinitionAppServiceImpl implements IDocStatisticsDefi
|
||||
}
|
||||
boolean deleteResult = iDocStatisticsDefinitionService.removeById(id);
|
||||
if (deleteResult) {
|
||||
// 同步删除选项列表
|
||||
iDocStaticsDefinitionOptionAppService.deleteDocStatisticsDefinitionOptionById(id);
|
||||
return R.ok("文档统计定义删除成功");
|
||||
} else {
|
||||
return R.fail("文档统计定义删除失败");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文档统计定义详情
|
||||
*
|
||||
* @param id 文档统计定义ID
|
||||
* @return 封装了处理结果的响应对象
|
||||
*/
|
||||
@Override
|
||||
public R<?> getDocStatisticsDefinitionById(Long id) {
|
||||
if (id == null) {
|
||||
return R.fail("获取文档统计定义,参数ID不能为空");
|
||||
}
|
||||
DocStatisticsDefinition data = iDocStatisticsDefinitionService.getById(id);
|
||||
if (data == null) {
|
||||
return R.fail("获取文档统计定义失败,目标数据不存在");
|
||||
}
|
||||
// 转换为DTO返回
|
||||
DocStatisticsDefinitionDto dto = new DocStatisticsDefinitionDto();
|
||||
BeanUtils.copyProperties(data, dto);
|
||||
DocStatisticsDefinitionOptionList optionList = iDocStaticsDefinitionOptionAppService.getDocStatisticsDefinitionOptionByDefinitionId(id);
|
||||
dto.setOptionList(optionList);
|
||||
return R.ok(dto, "文档统计定义获取成功");
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据代码获取文档统计定义详情
|
||||
*
|
||||
* @param code 文档统计定义代码
|
||||
* @return 封装了处理结果的响应对象
|
||||
*/
|
||||
@Override
|
||||
public R<?> getDocStatisticsDefinitionByCode(String code) {
|
||||
if (code == null || code.trim().isEmpty()) {
|
||||
return R.fail("获取文档统计定义,参数代码不能为空");
|
||||
}
|
||||
// 按代码查询
|
||||
LambdaQueryWrapper<DocStatisticsDefinition> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(DocStatisticsDefinition::getCode, code);
|
||||
DocStatisticsDefinition data = iDocStatisticsDefinitionService.getOne(queryWrapper);
|
||||
if (data == null) {
|
||||
return R.fail("获取文档统计定义失败,目标数据不存在");
|
||||
}
|
||||
DocStatisticsDefinitionDto dto = new DocStatisticsDefinitionDto();
|
||||
if (data != null) {
|
||||
BeanUtils.copyProperties(data, dto);
|
||||
}
|
||||
DocStatisticsDefinitionOptionList optionList = iDocStaticsDefinitionOptionAppService.getDocStatisticsDefinitionOptionByDefinitionId(data.getId());
|
||||
dto.setOptionList(optionList);
|
||||
return R.ok(dto, "文档统计定义获取成功");
|
||||
}
|
||||
|
||||
}
|
@@ -1,229 +0,0 @@
|
||||
package com.openhis.web.document.appservice.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.core.common.core.domain.AjaxResult;
|
||||
import com.core.common.core.domain.R;
|
||||
import com.core.common.utils.bean.BeanUtils;
|
||||
import com.openhis.document.domain.DocStatisticsDefinitionOption;
|
||||
import com.openhis.document.mapper.DocStatisticsDefinitionOptionMapper;
|
||||
import com.openhis.document.service.IDocStatisticsDefinitionOptionService;
|
||||
import com.openhis.web.document.appservice.IDocStatisticsDefinitionOptionAppService;
|
||||
import com.openhis.web.document.dto.DocStatisticsDefinitionOptionDto;
|
||||
import com.openhis.web.document.dto.DocStatisticsDefinitionOptionList;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 文档统计定义选项 业务实现类
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class DocStatisticsDefinitionOptionAppServiceImpl implements IDocStatisticsDefinitionOptionAppService {
|
||||
|
||||
@Resource
|
||||
private DocStatisticsDefinitionOptionMapper docStatisticsDefinitonOptionMapper;
|
||||
@Resource
|
||||
private IDocStatisticsDefinitionOptionService docStatisticsDefinitionOptionService;
|
||||
|
||||
/**
|
||||
* 新增文档统计定义选项
|
||||
*
|
||||
* @param docStatisticsDefinitionOptionList 选项列表DTO
|
||||
*/
|
||||
@Override
|
||||
public R<?> add(DocStatisticsDefinitionOptionList docStatisticsDefinitionOptionList) {
|
||||
// 参数校验
|
||||
if (docStatisticsDefinitionOptionList == null) {
|
||||
return R.fail("统计项选项列表为空,请选择统计项选项");
|
||||
}
|
||||
if (docStatisticsDefinitionOptionList.getOptions() == null || docStatisticsDefinitionOptionList.getOptions().isEmpty()) {
|
||||
return R.fail("统计项选项不允许为空,请正确填写统计项选项");
|
||||
}
|
||||
if (docStatisticsDefinitionOptionList.getDocStatisticsDefinitionId() == null) {
|
||||
return R.fail("统计项定义ID为空,请选择统计项定义ID");
|
||||
}
|
||||
|
||||
// DTO转实体
|
||||
List<DocStatisticsDefinitionOption> optionList = new ArrayList<>();
|
||||
for (DocStatisticsDefinitionOptionDto dto : docStatisticsDefinitionOptionList.getOptions()) {
|
||||
DocStatisticsDefinitionOption option = new DocStatisticsDefinitionOption();
|
||||
option.setDocStatisticsDefinitionId(docStatisticsDefinitionOptionList.getDocStatisticsDefinitionId());
|
||||
option.setOption(dto.getOption());
|
||||
option.setDisplayOrder(dto.getDisplayOrder());
|
||||
optionList.add(option);
|
||||
}
|
||||
|
||||
// 批量新增
|
||||
boolean saveSuccess = docStatisticsDefinitionOptionService.saveBatch(optionList);
|
||||
if (saveSuccess) {
|
||||
return R.ok(optionList, "统计项选项保存成功");
|
||||
} else {
|
||||
return R.fail("统计项选项保存失败");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增/编辑文档统计定义选项(区分增删改)
|
||||
*
|
||||
* @param docStatisticsDefinitionOptionList 选项列表DTO
|
||||
*/
|
||||
@Override
|
||||
public R<?> createOrEdit(DocStatisticsDefinitionOptionList docStatisticsDefinitionOptionList) {
|
||||
// 参数校验
|
||||
if (docStatisticsDefinitionOptionList == null) {
|
||||
return R.fail("统计项选项列表为空,请选择统计项选项");
|
||||
}
|
||||
Long definitionId = docStatisticsDefinitionOptionList.getDocStatisticsDefinitionId();
|
||||
if (definitionId == null) {
|
||||
return R.fail("统计项定义ID为空,请选择统计项定义ID");
|
||||
}
|
||||
|
||||
// 1. 查询原数据列表(按统计定义ID关联)
|
||||
List<DocStatisticsDefinitionOption> oldList = docStatisticsDefinitonOptionMapper.selectList(
|
||||
new LambdaQueryWrapper<DocStatisticsDefinitionOption>()
|
||||
.eq(DocStatisticsDefinitionOption::getDocStatisticsDefinitionId, definitionId));
|
||||
oldList = oldList == null ? Collections.emptyList() : oldList;
|
||||
|
||||
// 2. 处理新数据列表(DTO转实体,避免空指针)
|
||||
List<DocStatisticsDefinitionOption> newList = new ArrayList<>();
|
||||
if (docStatisticsDefinitionOptionList.getOptions() != null && !docStatisticsDefinitionOptionList.getOptions().isEmpty()) {
|
||||
for (DocStatisticsDefinitionOptionDto dto : docStatisticsDefinitionOptionList.getOptions()) {
|
||||
DocStatisticsDefinitionOption option = new DocStatisticsDefinitionOption();
|
||||
BeanUtils.copyProperties(dto, option); // 改用BeanUtils简化赋值
|
||||
option.setDocStatisticsDefinitionId(definitionId); // 强制关联父ID,确保数据一致性
|
||||
newList.add(option);
|
||||
}
|
||||
}
|
||||
newList = newList == null ? Collections.emptyList() : newList;
|
||||
|
||||
// 3. 构建原数据ID映射(快速查找)
|
||||
Map<Long, DocStatisticsDefinitionOption> oldIdMap = oldList.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.filter(item -> item.getId() != null)
|
||||
.collect(Collectors.toMap(DocStatisticsDefinitionOption::getId, item -> item));
|
||||
|
||||
// 4. 提取新数据中的有效ID集合
|
||||
Set<Long> newIds = newList.stream()
|
||||
.map(DocStatisticsDefinitionOption::getId)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
// 5. 确定需要删除的项(原数据存在但新数据不存在)
|
||||
List<Long> deleteIds = oldList.stream()
|
||||
.map(DocStatisticsDefinitionOption::getId)
|
||||
.filter(id -> !newIds.contains(id))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 6. 区分新增和修改的项
|
||||
List<DocStatisticsDefinitionOption> addList = new ArrayList<>();
|
||||
List<DocStatisticsDefinitionOption> updateList = new ArrayList<>();
|
||||
for (DocStatisticsDefinitionOption newItem : newList) {
|
||||
Long newItemId = newItem.getId();
|
||||
if (newItemId != null && oldIdMap.containsKey(newItemId)) {
|
||||
// 有ID且原数据存在 → 修改
|
||||
updateList.add(newItem);
|
||||
} else {
|
||||
// 无ID或原数据不存在 → 新增
|
||||
addList.add(newItem);
|
||||
}
|
||||
}
|
||||
|
||||
// 7. 执行删除操作
|
||||
if (!deleteIds.isEmpty()) {
|
||||
boolean deleteSuccess = docStatisticsDefinitionOptionService.removeByIds(deleteIds);
|
||||
if (!deleteSuccess) {
|
||||
return R.fail("统计项选项删除失败");
|
||||
}
|
||||
}
|
||||
|
||||
// 8. 执行修改操作
|
||||
if (!updateList.isEmpty()) {
|
||||
boolean updateSuccess = docStatisticsDefinitionOptionService.updateBatchById(updateList);
|
||||
if (!updateSuccess) {
|
||||
return R.fail("统计项选项更新失败");
|
||||
}
|
||||
}
|
||||
|
||||
// 9. 执行新增操作
|
||||
if (!addList.isEmpty()) {
|
||||
boolean addSuccess = docStatisticsDefinitionOptionService.saveBatch(addList);
|
||||
if (!addSuccess) {
|
||||
return R.fail("统计项选项新增失败");
|
||||
}
|
||||
}
|
||||
|
||||
return R.ok("统计项选项更新成功");
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除单个统计项选项
|
||||
*
|
||||
* @param id 选项ID
|
||||
*/
|
||||
@Override
|
||||
public R<?> deleteDocStatisticsDefinitionOptionById(Long id) {
|
||||
if (id == null) {
|
||||
return R.fail("统计项选项ID为空,请选择要删除的统计项选项");
|
||||
}
|
||||
|
||||
// 先校验数据是否存在
|
||||
DocStatisticsDefinitionOption existingOption = docStatisticsDefinitionOptionService.getById(id);
|
||||
if (existingOption == null) {
|
||||
return R.fail("统计项选项不存在,删除失败");
|
||||
}
|
||||
// 执行删除
|
||||
boolean deleteSuccess = docStatisticsDefinitionOptionService.removeById(id);
|
||||
if (deleteSuccess) {
|
||||
return R.ok("统计项选项删除成功");
|
||||
} else {
|
||||
return R.fail("统计项选项删除失败");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据统计定义ID查询选项列表
|
||||
*
|
||||
* @param docStatisticsDefinitionId 统计定义ID
|
||||
*/
|
||||
@Override
|
||||
public DocStatisticsDefinitionOptionList getDocStatisticsDefinitionOptionByDefinitionId(Long docStatisticsDefinitionId) {
|
||||
|
||||
// 修复原查询条件错误:原逻辑用ID查ID,改为用统计定义ID查关联选项
|
||||
LambdaQueryWrapper<DocStatisticsDefinitionOption> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(DocStatisticsDefinitionOption::getDocStatisticsDefinitionId, docStatisticsDefinitionId)
|
||||
.orderByAsc(DocStatisticsDefinitionOption::getDisplayOrder); // 按显示顺序排序
|
||||
|
||||
List<DocStatisticsDefinitionOption> optionList = docStatisticsDefinitonOptionMapper.selectList(queryWrapper);
|
||||
if (optionList == null || optionList.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
// 实体转DTO
|
||||
List<DocStatisticsDefinitionOptionDto> dtoList = new ArrayList<>();
|
||||
for (DocStatisticsDefinitionOption option : optionList) {
|
||||
DocStatisticsDefinitionOptionDto dto = new DocStatisticsDefinitionOptionDto();
|
||||
dto.setId(option.getId());
|
||||
dto.setOption(option.getOption());
|
||||
dto.setDisplayOrder(option.getDisplayOrder());
|
||||
dtoList.add(dto);
|
||||
}
|
||||
|
||||
// 封装返回结果
|
||||
DocStatisticsDefinitionOptionList resultList = new DocStatisticsDefinitionOptionList();
|
||||
resultList.setDocStatisticsDefinitionId(docStatisticsDefinitionId);
|
||||
resultList.setOptions(dtoList);
|
||||
|
||||
return resultList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文档模板 统计项选项列表
|
||||
*/
|
||||
@Override
|
||||
public AjaxResult getDocStatisticsDefinitionOptionList() {
|
||||
return null;
|
||||
}
|
||||
}
|
@@ -84,6 +84,19 @@ public class DocDefinitionController {
|
||||
return iDocDefinitionAppService.getDefinitionDetailById(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文书定义详情
|
||||
*
|
||||
* @param id 文书定义ID
|
||||
* @return 文书定义详情
|
||||
*/
|
||||
@DeleteMapping("/delete/{id}")
|
||||
public R<?> deleteDefinition(@PathVariable("id") Long id) {
|
||||
log.info("删除文书定义,ID={}", id);
|
||||
// 调用删除服务(注意:方法名应改为删除相关,如removeById)
|
||||
return iDocDefinitionAppService.deleteDefinition(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询获取文书定义列表 树形结构
|
||||
*
|
||||
|
@@ -90,11 +90,11 @@ public class DocRecordController {
|
||||
*/
|
||||
@GetMapping("/getRecordByEncounterIdList")
|
||||
R<?> getRecordByEncounterIdList(DocRecordQueryParam docRecordQueryParam,
|
||||
@RequestParam(value = "IsPage", defaultValue = "1") Integer IsPage,
|
||||
@RequestParam(value = "isPage", defaultValue = "1") Integer isPage,
|
||||
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
|
||||
@RequestParam(name = "searchKey", required = false) String searchKey, HttpServletRequest request) {
|
||||
return docRecordAppService.getRecordByEncounterIdList(docRecordQueryParam, IsPage, pageNo, pageSize, searchKey, request);
|
||||
return docRecordAppService.getRecordByEncounterIdList(docRecordQueryParam, isPage, pageNo, pageSize, searchKey, request);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -1,24 +1,59 @@
|
||||
package com.openhis.web.document.controller;
|
||||
|
||||
import com.core.common.core.domain.R;
|
||||
import com.openhis.web.document.appservice.IDocRecordAppService;
|
||||
import com.openhis.web.document.appservice.IDocStatisticsAppService;
|
||||
import com.openhis.web.document.dto.DocStatisticsDto;
|
||||
import com.openhis.web.document.dto.DocStatisticsQueryParam;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 文档模板-病历另存为模板使用 controller
|
||||
* DocStatistics文书统计 controller
|
||||
*
|
||||
* @author wanghaiming
|
||||
* @date 2025-08-12
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/document/template")
|
||||
@RequestMapping("/document/statistics")
|
||||
@Slf4j
|
||||
@AllArgsConstructor
|
||||
public class DocStatisticsController {
|
||||
|
||||
private final IDocRecordAppService docRecordAppService;
|
||||
private final IDocStatisticsAppService docStatisticsAppService;
|
||||
|
||||
@PostMapping("/createOrUpdte")
|
||||
public R<?> createOrUpdte(List<DocStatisticsDto> docStatisticsList) {
|
||||
return docStatisticsAppService.createOrUpdte(docStatisticsList);
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
public R<?> delete(List<Long> ids) {
|
||||
return docStatisticsAppService.delete(ids);
|
||||
}
|
||||
|
||||
@GetMapping("/queryByRecordId")
|
||||
public R<?> queryByRecordId(Long recordId) {
|
||||
return docStatisticsAppService.queryByRecordId(recordId);
|
||||
}
|
||||
|
||||
@GetMapping("/queryByEncounterId")
|
||||
public R<?> queryByEncounterId(Long encounterId) {
|
||||
return docStatisticsAppService.queryByEncounterId(encounterId);
|
||||
}
|
||||
|
||||
@GetMapping("/getStatisticsList")
|
||||
R<?> getStatisticsList(DocStatisticsQueryParam queryParam,
|
||||
@RequestParam(value = "isPage", defaultValue = "1") Integer isPage,
|
||||
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
|
||||
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
|
||||
@RequestParam(name = "searchKey", required = false) String searchKey, HttpServletRequest request) {
|
||||
return docStatisticsAppService.getStatisticsList(queryParam, isPage, pageNo, pageSize, searchKey, request);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@@ -78,29 +79,6 @@ public class DocStatisticsDefinitionController {
|
||||
public R<?> deleteDocStatisticsDefinition(Long id) {
|
||||
return docStatisticsDefinitionAppService.deleteDocStatisticsDefinition(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取统计定义详情
|
||||
*
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/getDocStatisticsDefinitionById")
|
||||
public R<?> getDocStatisticsDefinitionById(Long id) {
|
||||
return docStatisticsDefinitionAppService.getDocStatisticsDefinitionById(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据code获取统计定义详情
|
||||
*
|
||||
* @param code
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/getDocStatisticsDefinitionByCode")
|
||||
public R<?> getDocStatisticsDefinitionByCode(String code) {
|
||||
return docStatisticsDefinitionAppService.getDocStatisticsDefinitionByCode(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询列表-不包含options
|
||||
*
|
||||
@@ -116,9 +94,30 @@ public class DocStatisticsDefinitionController {
|
||||
@RequestParam(name = "searchKey", required = false) String searchKey, HttpServletRequest request) {
|
||||
return docStatisticsDefinitionAppService.getPageList(pageNo, pageSize, searchKey, request);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文档统计定义选项列表并按指定格式返回
|
||||
* 获取文档统计定义列表-不包含options,即字典数据
|
||||
*
|
||||
* @param isStatistics 文档统计定义是否启用 0:不统计 1:统计 可不传
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/getList")
|
||||
public R<?> getList(Integer isStatistics){
|
||||
List<DocStatisticsDefinitionDto> list = docStatisticsDefinitionAppService.getList(isStatistics);
|
||||
return R.ok(list);
|
||||
}
|
||||
/**
|
||||
* 获取文档统计定义列表(包含options,即字典数据)
|
||||
*
|
||||
* @param isStatistics 文档统计定义是否启用 0:不统计 1:统计 可不传
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/getListWithOptionList")
|
||||
public R<?>getListWithOptionList(Integer isStatistics){
|
||||
List<DocStatisticsDefinitionDto> list = docStatisticsDefinitionAppService.getListWithOptionList(isStatistics);
|
||||
return R.ok(list);
|
||||
}
|
||||
/**
|
||||
* 获取文档统计定义选项列表并按指定格式返回-已作废
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
|
@@ -1,25 +0,0 @@
|
||||
package com.openhis.web.document.controller;
|
||||
|
||||
import com.openhis.web.document.appservice.IDocRecordAppService;
|
||||
import com.openhis.web.document.appservice.IDocStatisticsDefinitionOptionAppService;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* 文文统计选项 controller
|
||||
*
|
||||
* @author wanghaiming
|
||||
* @date 2025-08-12
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/document/statisticsOption")
|
||||
@Slf4j
|
||||
@AllArgsConstructor
|
||||
public class DocStatisticsOptionController {
|
||||
|
||||
private final IDocStatisticsDefinitionOptionAppService docStatisticsDefinitionOptionAppService;
|
||||
|
||||
|
||||
}
|
@@ -18,7 +18,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* DOC模板 controller
|
||||
* 文书模板 controller
|
||||
*
|
||||
* @author wanghaiming
|
||||
* @date 2025-08-12
|
||||
|
@@ -1,5 +1,7 @@
|
||||
package com.openhis.web.document.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
@@ -12,6 +14,8 @@ public class DirectoryNode {
|
||||
private String name;
|
||||
private int level;
|
||||
private DocDefinitionDto document;
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long id;
|
||||
private List<DirectoryNode> children = new ArrayList<>();
|
||||
}
|
||||
|
||||
|
@@ -81,5 +81,7 @@ public class DocDefinitionDto {
|
||||
* 文书权限 0-不限制 1-查看 2- 编辑
|
||||
*/
|
||||
private Integer pharmacistPermissionEnum;
|
||||
// 关键:通过contentUsing指定集合中元素的序列化器
|
||||
@JsonSerialize(contentUsing = ToStringSerializer.class)
|
||||
private List<Long> organizationIds;
|
||||
}
|
||||
|
@@ -19,6 +19,6 @@ public class DocDefinitionOrganizationDto {
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long definitionId;
|
||||
private String busNo;
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
@JsonSerialize(contentUsing = ToStringSerializer.class)
|
||||
private List<Long> organizationIds;
|
||||
}
|
||||
|
@@ -17,8 +17,5 @@ public class DocDefinitonParam {
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long organizationId;
|
||||
private String name;
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private List<Integer> useRanges;
|
||||
|
||||
|
||||
}
|
||||
|
@@ -53,4 +53,10 @@ public class DocRecordDto {
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date recordTime;
|
||||
private String createBy;
|
||||
private String source;
|
||||
/**
|
||||
* 记录名称
|
||||
*/
|
||||
private String name;
|
||||
private String version;
|
||||
}
|
||||
|
@@ -60,7 +60,7 @@ public class DocRecordPatientDto extends DocRecordDto {
|
||||
/**
|
||||
* 病历名称
|
||||
*/
|
||||
private String docName;
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 主菜单枚举值/病历类型
|
||||
|
@@ -1,5 +1,7 @@
|
||||
package com.openhis.web.document.dto;
|
||||
|
||||
import com.core.common.annotation.Excel;
|
||||
import com.core.common.core.domain.entity.SysDictData;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
@@ -48,9 +50,16 @@ public class DocStatisticsDefinitionDto {
|
||||
*/
|
||||
private Integer displayOrder;
|
||||
|
||||
/*
|
||||
统计类型定义选项值
|
||||
*/
|
||||
private DocStatisticsDefinitionOptionList optionList;
|
||||
private String defaultValue;
|
||||
|
||||
// /*
|
||||
// 统计类型定义选项值
|
||||
// */
|
||||
private List<SysDictData> optionList;
|
||||
/** 字典名称 */
|
||||
private String dictName;
|
||||
|
||||
/** 字典类型 */
|
||||
private String dictType;
|
||||
|
||||
}
|
||||
|
@@ -1,9 +1,11 @@
|
||||
package com.openhis.web.document.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@@ -15,6 +17,7 @@ public class DocStatisticsDto {
|
||||
/**
|
||||
* 记录ID
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long recordId;
|
||||
/**
|
||||
* 统计项定义ID
|
||||
@@ -33,19 +36,18 @@ public class DocStatisticsDto {
|
||||
* 记录科室ID
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long orgnizationId;
|
||||
private Long organizationId;
|
||||
/**
|
||||
* 统计值
|
||||
*/
|
||||
|
||||
private String value;
|
||||
/**
|
||||
* 记录日期 yyyy-MM-dd
|
||||
* 记录时间
|
||||
*/
|
||||
private Date recordingDate;
|
||||
/**
|
||||
* 记录时间 yyyy-MM-dd HH:mm:ss
|
||||
*/
|
||||
private Date recordingTime;
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date recordTime;
|
||||
/**
|
||||
* 记录来源
|
||||
*/
|
||||
|
@@ -0,0 +1,30 @@
|
||||
package com.openhis.web.document.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 查询单个患者的文档记录参数
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class DocStatisticsQueryParam {
|
||||
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long definitionId;
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long patientId;
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long encounterId;
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long organizationId;
|
||||
private String statisticsDefinitionCode;
|
||||
/**
|
||||
* 记录时间 yyyy-MM-dd HH:mm:ss
|
||||
*/
|
||||
private Date recordTime;
|
||||
}
|
@@ -28,6 +28,7 @@ public class DocTemplateDto {
|
||||
/**
|
||||
* 文书定义ID
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long definitionId;
|
||||
|
||||
/**
|
||||
@@ -37,10 +38,12 @@ public class DocTemplateDto {
|
||||
/**
|
||||
* 当useRange=1时,指定机构ID
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long organizationId;
|
||||
/**
|
||||
* 当useRange=2时,指定用户ID
|
||||
*/
|
||||
@JsonSerialize(using = ToStringSerializer.class)
|
||||
private Long userId;
|
||||
/**
|
||||
* 备注
|
||||
|
@@ -4,6 +4,7 @@ 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.document.dto.DocRecordDto;
|
||||
import com.openhis.web.document.dto.DocRecordPatientDto;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
@@ -23,4 +24,7 @@ public interface DocRecordAppMapper {
|
||||
IPage<DocRecordPatientDto> getRecordPageList(@Param("page") Page<DocRecordPatientDto> page,
|
||||
@Param("primaryMenuEnumList") List<Integer> primaryMenuEnumList,
|
||||
@Param(Constants.WRAPPER) QueryWrapper<DocRecordPatientDto> queryWrapper);
|
||||
IPage<DocRecordDto> getRecordPageListByEncounterId(@Param("page") Page<DocRecordPatientDto> page,
|
||||
@Param(Constants.WRAPPER) QueryWrapper<DocRecordDto> queryWrapper);
|
||||
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user