fix(doctorstation): 解决诊疗项目执行科室验证及耗材价格显示问题 bug#220

- 修复诊疗项目执行科室非空校验逻辑,使用effectiveOrgId替代positionId
- 添加getEffectiveOrgId方法统一获取执行科室ID的兼容处理
- 修复耗材价格处理逻辑,正确区分price和retailPrice字段避免零值判断错误
- 更新数据库查询映射,优化设备定义表与收费项目定义表关联条件
- 添加调试日志输出便于问题排查
This commit is contained in:
2026-03-23 17:58:27 +08:00
parent 251cf263ff
commit e90e541af3
4 changed files with 70 additions and 35 deletions

View File

@@ -1077,7 +1077,8 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
for (AdviceSaveDto adviceSaveDto : insertOrUpdateList) { for (AdviceSaveDto adviceSaveDto : insertOrUpdateList) {
// 🔧 Bug Fix #238: 诊疗项目执行科室非空校验 // 🔧 Bug Fix #238: 诊疗项目执行科室非空校验
if (adviceSaveDto.getAdviceType() != null && adviceSaveDto.getAdviceType() == 3) { if (adviceSaveDto.getAdviceType() != null && adviceSaveDto.getAdviceType() == 3) {
if (adviceSaveDto.getPositionId() == null) { Long effectiveOrgId = adviceSaveDto.getEffectiveOrgId();
if (effectiveOrgId == null) {
throw new ServiceException("诊疗项目必须选择执行科室"); throw new ServiceException("诊疗项目必须选择执行科室");
} }
} }
@@ -1116,8 +1117,8 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp
serviceRequest.setRequesterId(adviceSaveDto.getPractitionerId()); // 开方医生 serviceRequest.setRequesterId(adviceSaveDto.getPractitionerId()); // 开方医生
serviceRequest.setEncounterId(adviceSaveDto.getEncounterId()); // 就诊id serviceRequest.setEncounterId(adviceSaveDto.getEncounterId()); // 就诊id
serviceRequest.setAuthoredTime(curDate); // 请求签发时间 serviceRequest.setAuthoredTime(curDate); // 请求签发时间
// 执行科室 // 执行科室 - 使用兼容方法获取执行科室ID
serviceRequest.setOrgId(adviceSaveDto.getPositionId()); serviceRequest.setOrgId(adviceSaveDto.getEffectiveOrgId());
serviceRequest.setContentJson(adviceSaveDto.getContentJson()); // 请求内容json serviceRequest.setContentJson(adviceSaveDto.getContentJson()); // 请求内容json
serviceRequest.setYbClassEnum(adviceSaveDto.getYbClassEnum());// 类别医保编码 serviceRequest.setYbClassEnum(adviceSaveDto.getYbClassEnum());// 类别医保编码
serviceRequest.setConditionId(adviceSaveDto.getConditionId()); // 诊断id serviceRequest.setConditionId(adviceSaveDto.getConditionId()); // 诊断id

View File

@@ -50,10 +50,32 @@ public class AdviceSaveDto {
/** /**
* 物理位置id | 可能是 发药药房id,耗材房id,执行科室id * 物理位置id | 可能是 发药药房id,耗材房id,执行科室id
* 前端字段名orgId诊疗项目
* 对应数据库org_id / perform_location
*/ */
@JsonSerialize(using = ToStringSerializer.class) @JsonSerialize(using = ToStringSerializer.class)
private Long positionId; private Long positionId;
/**
* 执行科室ID | 诊疗项目使用
* 前端传来字段名orgId
* 对应数据库org_id
* 🔧 Bug Fix #238: 添加此字段以支持前端orgId传参
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long orgId;
/**
* 获取有效的执行科室ID兼容处理
* 优先使用orgId如果不存在则使用positionId
* 🔧 Bug Fix #238: 统一获取执行科室ID的方法
*
* @return 有效的科室ID如果都为null则返回null
*/
public Long getEffectiveOrgId() {
return orgId != null ? orgId : positionId;
}
/** 药品性质 | 分方使用 */ /** 药品性质 | 分方使用 */
private String pharmacologyCategoryCode; private String pharmacologyCategoryCode;

View File

@@ -100,10 +100,11 @@
AND T5.instance_table = 'adm_device_definition' AND T5.instance_table = 'adm_device_definition'
) as maximum_retail_price--最高零售价 ) as maximum_retail_price--最高零售价
FROM adm_device_definition T1 FROM adm_device_definition T1
LEFT JOIN adm_charge_item_definition T2 ON T1.id = T2.instance_id LEFT JOIN adm_charge_item_definition T2
ON T1.id = T2.instance_id
AND T2.instance_table = 'adm_device_definition'
<where> <where>
T1.delete_flag = '0' T1.delete_flag = '0'
AND T2.instance_table = 'adm_device_definition'
</where> </where>
ORDER BY T1.bus_no ORDER BY T1.bus_no
@@ -170,10 +171,11 @@
AND T5.instance_table = 'adm_device_definition' AND T5.instance_table = 'adm_device_definition'
) as maximum_retail_price--最高零售价 ) as maximum_retail_price--最高零售价
FROM adm_device_definition T1 FROM adm_device_definition T1
LEFT JOIN adm_charge_item_definition T2 ON T1.id = T2.instance_id LEFT JOIN adm_charge_item_definition T2
ON T1.id = T2.instance_id
AND T2.instance_table = 'adm_device_definition'
<where> <where>
T1.delete_flag = '0' T1.delete_flag = '0'
AND T2.instance_table = 'adm_device_definition'
<if test="id!= null"> <if test="id!= null">
AND T1.id = #{id} AND T1.id = #{id}

View File

@@ -257,8 +257,11 @@ function fetchFromApi(searchKey) {
searchKey: searchKey || '', searchKey: searchKey || '',
statusEnum: 2, statusEnum: 2,
}).then((res) => { }).then((res) => {
console.log('[Debug] 耗材列表返回数据:', res.data);
if (res.data && res.data.records) { if (res.data && res.data.records) {
adviceBaseList.value = res.data.records.map((item) => ({ adviceBaseList.value = res.data.records.map((item) => {
console.log('[Debug] 耗材项:', item.name, 'price:', item.price, 'retailPrice:', item.retailPrice);
return {
adviceName: item.name || item.busNo, adviceName: item.name || item.busNo,
adviceType: 4, adviceType: 4,
unitCode: item.unitCode || '', unitCode: item.unitCode || '',
@@ -267,7 +270,13 @@ function fetchFromApi(searchKey) {
minUnitCode_dictText: item.minUnitCode_dictText || item.unitCode_dictText || '', minUnitCode_dictText: item.minUnitCode_dictText || item.unitCode_dictText || '',
volume: item.size || item.totalVolume || '', volume: item.size || item.totalVolume || '',
partPercent: item.partPercent || 1, partPercent: item.partPercent || 1,
priceList: item.price ? [{ price: item.price }] : (item.retailPrice ? [{ price: item.retailPrice }] : []), // 🔧 Bug #220 修复正确处理耗材价格支持price或retailPrice字段
// 零售价可能是0所以不能用简单的布尔判断需要明确检查null/undefined
priceList: (item.price !== undefined && item.price !== null)
? [{ price: item.price }]
: ((item.retailPrice !== undefined && item.retailPrice !== null)
? [{ price: item.retailPrice }]
: []),
inventoryList: [], inventoryList: [],
adviceDefinitionId: item.id, adviceDefinitionId: item.id,
adviceTableName: 'adm_device_definition', adviceTableName: 'adm_device_definition',
@@ -285,7 +294,8 @@ function fetchFromApi(searchKey) {
deviceId: item.id, deviceId: item.id,
deviceName: item.name, deviceName: item.name,
...item, ...item,
})); };
});
nextTick(() => { nextTick(() => {
currentIndex.value = 0; currentIndex.value = 0;
}); });