|
|
@@ -1538,16 +1538,29 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
@Override
|
|
|
public PageResult<ExpenseOrderDO> getExpenseOrderPageByElderId(ExpenseBillPageReqVO pageReqVO) {
|
|
|
PageResult<ExpenseOrderDO> pageResult = expenseOrderMapper.selectPage(pageReqVO);
|
|
|
- for (ExpenseOrderDO expenseOrder : pageResult.getList()) {
|
|
|
+ List<ExpenseOrderDO> list = pageResult.getList();
|
|
|
+ if (CollectionUtil.isEmpty(list)) {
|
|
|
+ return pageResult;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 批量查询所有费用单明细,内存按 expenseOrderId 分组,消除 N+1
|
|
|
+ List<Long> orderIds = list.stream().map(ExpenseOrderDO::getId).collect(Collectors.toList());
|
|
|
+ List<ExpenseOrderItemDO> allItems = expenseOrderItemMapper.selectList(new LambdaQueryWrapperX<ExpenseOrderItemDO>()
|
|
|
+ .in(ExpenseOrderItemDO::getExpenseOrderId, orderIds));
|
|
|
+ Map<Long, List<ExpenseOrderItemDO>> itemsByOrderId = allItems.stream()
|
|
|
+ .collect(Collectors.groupingBy(ExpenseOrderItemDO::getExpenseOrderId));
|
|
|
|
|
|
+ // 同一位长者,仅查询一次
|
|
|
+ Long elderId = list.get(0).getElderId();
|
|
|
+ ElderlyInfoDO elderlyInfo = elderlyInfoMapper.selectById(elderId);
|
|
|
+
|
|
|
+ for (ExpenseOrderDO expenseOrder : list) {
|
|
|
BigDecimal bedAmount = BigDecimal.ZERO;
|
|
|
BigDecimal nurseAmount = BigDecimal.ZERO;
|
|
|
BigDecimal mealAmount = BigDecimal.ZERO;
|
|
|
BigDecimal otherAmount = BigDecimal.ZERO;
|
|
|
|
|
|
- List<ExpenseOrderItemDO> orderItems = expenseOrderItemMapper.selectList(new LambdaQueryWrapperX<ExpenseOrderItemDO>()
|
|
|
- .eq(ExpenseOrderItemDO::getExpenseOrderId, expenseOrder.getId()));
|
|
|
-
|
|
|
+ List<ExpenseOrderItemDO> orderItems = itemsByOrderId.getOrDefault(expenseOrder.getId(), Collections.emptyList());
|
|
|
for (ExpenseOrderItemDO orderItem : orderItems) {
|
|
|
if(orderItem.getExpenseSource().equals(BusinessConstants.EXPENSE_ITEM)){
|
|
|
if (orderItem.getType() != null && orderItem.getType() == 1) {
|
|
|
@@ -1567,8 +1580,9 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
expenseOrder.setNurseAmount(nurseAmount);
|
|
|
expenseOrder.setMealAmount(mealAmount);
|
|
|
expenseOrder.setOtherAmount(otherAmount);
|
|
|
- ElderlyInfoDO elderlyInfo = elderlyInfoMapper.selectById(expenseOrder.getElderId());
|
|
|
- expenseOrder.setElderName(elderlyInfo.getElderName());
|
|
|
+ if (elderlyInfo != null) {
|
|
|
+ expenseOrder.setElderName(elderlyInfo.getElderName());
|
|
|
+ }
|
|
|
}
|
|
|
return pageResult;
|
|
|
}
|
|
|
@@ -1590,24 +1604,24 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
|
|
|
@Override
|
|
|
public Map<String, Object> getExpenseOrderAmountByElderId(Long elderId) {
|
|
|
- List<ExpenseOrderDO> expenseOrderList = expenseOrderMapper.selectList(new LambdaQueryWrapperX<ExpenseOrderDO>()
|
|
|
- .eq(ExpenseOrderDO::getElderId, elderId));
|
|
|
- BigDecimal totalAmount = BigDecimal.ZERO;
|
|
|
- BigDecimal arrearsFeesAmount = BigDecimal.ZERO;
|
|
|
- for (ExpenseOrderDO expenseOrderDO : expenseOrderList) {
|
|
|
- if (expenseOrderDO.getPayStatus() == BooleanEnum.TRUE.getValue()) {
|
|
|
- totalAmount = totalAmount.add(expenseOrderDO.getPayableAmount());
|
|
|
- } else {
|
|
|
- arrearsFeesAmount = arrearsFeesAmount.add(expenseOrderDO.getActualAmount());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
+ // 单条聚合 SQL,避免全量查询后在内存中遍历累计
|
|
|
+ Map<String, Object> sumMap = expenseOrderMapper.selectAmountSumByElderId(elderId);
|
|
|
Map<String, Object> dataMap = new HashMap<>();
|
|
|
- dataMap.put("totalAmount", totalAmount);
|
|
|
- dataMap.put("arrearsFeesAmount", arrearsFeesAmount);
|
|
|
+ dataMap.put("totalAmount", convertToBigDecimal(sumMap.get("totalAmount")));
|
|
|
+ dataMap.put("arrearsFeesAmount", convertToBigDecimal(sumMap.get("arrearsFeesAmount")));
|
|
|
return dataMap;
|
|
|
}
|
|
|
|
|
|
+ private BigDecimal convertToBigDecimal(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ if (value instanceof BigDecimal) {
|
|
|
+ return (BigDecimal) value;
|
|
|
+ }
|
|
|
+ return new BigDecimal(value.toString());
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public void executeMonthlyBillingStatement(Long tenantId) {
|
|
|
List<ExpenseDO> expenseList = expenseMapper.selectList(new LambdaQueryWrapperX<ExpenseDO>()
|