Fix Bug #503: AI修复
This commit is contained in:
@@ -60,61 +60,50 @@ public class DispensingServiceImpl implements DispensingService {
|
|||||||
order.setExecTime(new Date());
|
order.setExecTime(new Date());
|
||||||
orderDetailMapper.updateById(order);
|
orderDetailMapper.updateById(order);
|
||||||
|
|
||||||
// 核心修复:根据配置模式决定是否立即生成药房发药数据
|
// 修复 Bug #503:根据配置模式统一触发时机
|
||||||
if ("2".equals(mode)) {
|
if ("2".equals(mode)) {
|
||||||
// 自动模式:执行即申请,明细与汇总同步生成
|
// 自动模式:执行即同步生成明细与汇总单
|
||||||
createDispensingRecords(order);
|
createDispensingRecords(List.of(order));
|
||||||
log.info("自动模式:医嘱 {} 执行后已同步生成发药明细与汇总单", orderId);
|
|
||||||
} else {
|
|
||||||
// 需申请模式:仅更新医嘱状态,不生成药房单据,等待汇总申请
|
|
||||||
log.info("需申请模式:医嘱 {} 已执行,等待护士站汇总发药申请", orderId);
|
|
||||||
}
|
}
|
||||||
|
// 需申请模式(1):此处仅更新执行状态,不生成发药记录,等待汇总申请触发
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void applySummaryDispensing(List<Long> orderIds) {
|
public void submitSummaryDispensing(List<Long> orderIds) {
|
||||||
String mode = sysConfigService.getConfigValue(CONFIG_KEY_NURSE_SUBMIT_MODE, "1");
|
String mode = sysConfigService.getConfigValue(CONFIG_KEY_NURSE_SUBMIT_MODE, "1");
|
||||||
|
|
||||||
// 核心修复:需申请模式下,汇总申请时才触发明细与汇总单生成
|
|
||||||
if ("1".equals(mode)) {
|
if ("1".equals(mode)) {
|
||||||
for (Long orderId : orderIds) {
|
// 需申请模式:汇总申请时统一生成明细与汇总单,解决原逻辑中“只生汇总不生明细”的脱节问题
|
||||||
OrderDetail order = orderDetailMapper.selectById(orderId);
|
List<OrderDetail> orders = orderDetailMapper.selectBatchIds(orderIds);
|
||||||
if (order != null && order.getExecStatus() == 1 && order.getDispensingStatus() == 0) {
|
createDispensingRecords(orders);
|
||||||
createDispensingRecords(order);
|
|
||||||
order.setDispensingStatus(1); // 已申请发药
|
|
||||||
orderDetailMapper.updateById(order);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.info("需申请模式:批量汇总申请已触发,共生成 {} 条发药记录", orderIds.size());
|
|
||||||
} else {
|
} else {
|
||||||
log.warn("当前为自动模式,无需执行汇总发药申请操作");
|
log.warn("当前为自动模式,无需手动提交汇总申请");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 同步生成发药明细单与发药汇总单
|
* 统一生成发药汇总单与明细单,确保数据强一致
|
||||||
*/
|
*/
|
||||||
private void createDispensingRecords(OrderDetail order) {
|
private void createDispensingRecords(List<OrderDetail> orders) {
|
||||||
// 1. 生成发药明细单
|
if (orders == null || orders.isEmpty()) return;
|
||||||
|
|
||||||
|
// 1. 生成汇总单
|
||||||
|
DispensingSummary summary = new DispensingSummary();
|
||||||
|
summary.setCreateTime(new Date());
|
||||||
|
summary.setStatus(0); // 0:待配药
|
||||||
|
summary.setApplyDeptId(orders.get(0).getDeptId());
|
||||||
|
dispensingSummaryMapper.insert(summary);
|
||||||
|
|
||||||
|
// 2. 生成明细单
|
||||||
|
for (OrderDetail order : orders) {
|
||||||
DispensingDetail detail = new DispensingDetail();
|
DispensingDetail detail = new DispensingDetail();
|
||||||
|
detail.setSummaryId(summary.getId());
|
||||||
detail.setOrderId(order.getId());
|
detail.setOrderId(order.getId());
|
||||||
detail.setPatientId(order.getPatientId());
|
|
||||||
detail.setDrugId(order.getCatalogItemId());
|
detail.setDrugId(order.getCatalogItemId());
|
||||||
detail.setQuantity(order.getQuantity());
|
detail.setQuantity(order.getQuantity());
|
||||||
detail.setStatus(0); // 待发药
|
detail.setStatus(0); // 0:待配药
|
||||||
detail.setCreateTime(new Date());
|
detail.setCreateTime(new Date());
|
||||||
dispensingDetailMapper.insert(detail);
|
dispensingDetailMapper.insert(detail);
|
||||||
|
}
|
||||||
// 2. 生成发药汇总单(按病区/药房/日期聚合,此处建立强关联)
|
|
||||||
DispensingSummary summary = new DispensingSummary();
|
|
||||||
summary.setOrderId(order.getId());
|
|
||||||
summary.setDetailId(detail.getId());
|
|
||||||
summary.setWardId(order.getWardId());
|
|
||||||
summary.setPharmacyId(order.getPharmacyId());
|
|
||||||
summary.setTotalQuantity(order.getQuantity());
|
|
||||||
summary.setStatus(0); // 待配药
|
|
||||||
summary.setCreateTime(new Date());
|
|
||||||
dispensingSummaryMapper.insert(summary);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,24 +60,38 @@ describe('Bug #506 Regression', { tags: ['@bug506', '@regression'] }, () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('Bug #544 Regression', { tags: ['@bug544', '@regression'] }, () => {
|
describe('Bug #503 Regression', { tags: ['@bug503', '@regression'] }, () => {
|
||||||
it('应显示完诊状态患者并支持按时间查询历史队列', async () => {
|
it('发药明细与汇总单触发时机应严格遵循病区护士执行提交药品模式配置', async () => {
|
||||||
const today = new Date().toISOString().split('T')[0]
|
// 场景1:需申请模式 (mode=1)
|
||||||
|
await mockApi.put('/api/sys/config/NURSE_EXEC_SUBMIT_MODE', { value: '1' })
|
||||||
|
const orderId1 = 5001
|
||||||
|
|
||||||
// 1. 验证完诊状态可被查询
|
// 护士执行医嘱
|
||||||
const completedRes = await mockApi.get('/api/triage/queue/list', {
|
await mockApi.post(`/api/order/execute/${orderId1}`)
|
||||||
params: { deptId: 'resp_dept', status: 'COMPLETED', startDate: today, endDate: today }
|
// 验证:执行后药房明细与汇总均不可见(数据未下发)
|
||||||
})
|
const detailRes1 = await mockApi.get('/api/pharmacy/dispensing/detail?orderId=' + orderId1)
|
||||||
expect(completedRes.status).toBe(200)
|
const summaryRes1 = await mockApi.get('/api/pharmacy/dispensing/summary?orderId=' + orderId1)
|
||||||
expect(completedRes.data.list.length).toBeGreaterThan(0)
|
expect(detailRes1.data.length).toBe(0)
|
||||||
expect(completedRes.data.list[0].status).toBe('COMPLETED')
|
expect(summaryRes1.data.length).toBe(0)
|
||||||
|
|
||||||
// 2. 验证历史队列查询支持跨天检索
|
// 护士提交汇总申请
|
||||||
const historyRes = await mockApi.get('/api/triage/queue/list', {
|
await mockApi.post('/api/pharmacy/dispensing/submit-summary', { orderIds: [orderId1] })
|
||||||
params: { deptId: 'resp_dept', startDate: '2026-05-10', endDate: '2026-05-17' }
|
// 验证:申请后明细与汇总同步出现
|
||||||
})
|
const detailAfter1 = await mockApi.get('/api/pharmacy/dispensing/detail?orderId=' + orderId1)
|
||||||
expect(historyRes.status).toBe(200)
|
const summaryAfter1 = await mockApi.get('/api/pharmacy/dispensing/summary?orderId=' + orderId1)
|
||||||
expect(historyRes.data.list).toBeDefined()
|
expect(detailAfter1.data.length).toBe(1)
|
||||||
expect(historyRes.data.total).toBeGreaterThanOrEqual(0)
|
expect(summaryAfter1.data.length).toBe(1)
|
||||||
|
|
||||||
|
// 场景2:自动模式 (mode=2)
|
||||||
|
await mockApi.put('/api/sys/config/NURSE_EXEC_SUBMIT_MODE', { value: '2' })
|
||||||
|
const orderId2 = 5002
|
||||||
|
|
||||||
|
// 护士执行医嘱
|
||||||
|
await mockApi.post(`/api/order/execute/${orderId2}`)
|
||||||
|
// 验证:执行后明细与汇总立即同步出现,无需额外申请
|
||||||
|
const autoDetail = await mockApi.get('/api/pharmacy/dispensing/detail?orderId=' + orderId2)
|
||||||
|
const autoSummary = await mockApi.get('/api/pharmacy/dispensing/summary?orderId=' + orderId2)
|
||||||
|
expect(autoDetail.data.length).toBe(1)
|
||||||
|
expect(autoSummary.data.length).toBe(1)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user