소스 검색

修改
1、优化根据长者ID查询合同信息查询速度
BUGFIX
1、解决变更时存在零星账单会报错的问题

liangwenxuan 1 일 전
부모
커밋
723a314861

+ 2 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmElderlyChangeApiImpl.java

@@ -486,7 +486,8 @@ public class BpmElderlyChangeApiImpl implements BpmElderlyChangeApi {
                 String targetBillingMonth = resolveAttributionBillMonth(changeBillingMonth, changeYearMonth, hysteresisYearMonth);
                 ExpenseOrderDO targetExpenseOrder = expenseOrderMapper.selectOne(new LambdaQueryWrapperX<ExpenseOrderDO>()
                         .eq(ExpenseOrderDO::getElderId, elderlyId)
-                        .eq(ExpenseOrderDO::getBillingMonth, targetBillingMonth));
+                        .eq(ExpenseOrderDO::getBillingMonth, targetBillingMonth)
+                        .ne(ExpenseOrderDO::getType,4));
                 DailyExpensesDO currentDailyExpensesDO = new DailyExpensesDO();
                 currentDailyExpensesDO.setElderId(elderlyId);
                 currentDailyExpensesDO.setItemId(chargeCategory.getOverheadChargeId());

+ 9 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/biz/ExpenseOrderMapper.java

@@ -15,6 +15,7 @@ import org.apache.ibatis.annotations.Options;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -48,5 +49,13 @@ public interface ExpenseOrderMapper extends BaseMapperX<ExpenseOrderDO> {
                                @Param("billMonth") String billMonth,
                                @Param("payStatus") Integer payStatus);
 
+    /**
+     * 按长者聚合账单金额:已缴费合计、待缴费合计
+     *
+     * @param elderId 长者ID
+     * @return 包含 totalAmount(已缴费合计)、arrearsFeesAmount(待缴费合计)的 map
+     */
+    Map<String, Object> selectAmountSumByElderId(@Param("elderId") Long elderId);
+
 
 }

+ 1 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyContractServiceImpl.java

@@ -236,7 +236,7 @@ public class ElderlyContractServiceImpl implements ElderlyContractService {
         ElderlyInfoDO elderlyInfo = elderlyInfoMapper.selectById(elderId);
         resVO.setElderName(elderlyInfo.getElderName());
         resVO.setElderTags(elderlyInfo.getElderTags());
-        resVO.setBedName(buildService.getFullBedName(elderId));
+        resVO.setBedName(buildService.getFullBedNameByBedId(elderlyInfo.getBedId()));
         resVO.setCheckInTime(elderlyInfo.getCheckInTime());
         resVO.setNursingLevelName(elderlyInfo.getNurseLevelName());
         resVO.setSpecialCareNotes(elderlyInfo.getSpecialCareNotes());

+ 6 - 3
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyInfoServiceImpl.java

@@ -277,8 +277,11 @@ public class ElderlyInfoServiceImpl implements ElderlyInfoService {
 //        }
 //
 //
-        //获取亲属信息
-        List<RelativesDO> relatives = relativesMapper.selectList(new LambdaQueryWrapper<RelativesDO>().eq(RelativesDO::getPeopleId, elderlyInfo.getId()));
+        //获取亲属信息:优先复用调用方已查询的列表,避免重复查询
+        List<RelativesDO> relatives = elderlyInfo.getRelativesList();
+        if (relatives == null) {
+            relatives = relativesMapper.selectList(new LambdaQueryWrapper<RelativesDO>().eq(RelativesDO::getPeopleId, elderlyInfo.getId()));
+        }
         if (relatives != null && !relatives.isEmpty()) {
             count = count + 1;
         }
@@ -460,7 +463,7 @@ public class ElderlyInfoServiceImpl implements ElderlyInfoService {
     public ElderlyInfoDO findDetailById(Long id) {
         ElderlyInfoDO elderlyInfo = elderlyInfoMapper.selectById(id);
         if (elderlyInfo != null) {
-            elderlyInfo.setBedName(buildService.getFullBedName(id));
+            elderlyInfo.setBedName(buildService.getFullBedNameByBedId(elderlyInfo.getBedId()));
             List<RelativesDO> relatives = relativesMapper.selectList(new LambdaQueryWrapper<RelativesDO>().eq(RelativesDO::getPeopleId, elderlyInfo.getId()));
             elderlyInfo.setRelativesList(relatives);
             //统计信息完成度

+ 34 - 20
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseOrderServiceImpl.java

@@ -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>()

+ 8 - 0
yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ExpenseOrderMapper.xml

@@ -172,4 +172,12 @@
           )
     </select>
 
+    <select id="selectAmountSumByElderId" resultType="java.util.HashMap">
+        SELECT
+            COALESCE(SUM(CASE WHEN pay_status = 1 THEN payable_amount ELSE 0 END), 0) AS totalAmount,
+            COALESCE(SUM(CASE WHEN pay_status != 1 THEN actual_amount   ELSE 0 END), 0) AS arrearsFeesAmount
+        FROM elderly_expense_order
+        WHERE elder_id = #{elderId}
+    </select>
+
 </mapper>