Parcourir la source

新增
1、新增撤销退住申请(审批通过未结算)接口
2、新增撤销结算接口
3、新增批量确认居家服务订单接口

liangwenxuan il y a 1 semaine
Parent
commit
739d10c9ab
27 fichiers modifiés avec 989 ajouts et 679 suppressions
  1. 9 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/business/BpmElderlyController.java
  2. 2 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/business/BpmElderlApplyService.java
  3. 28 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/business/BpmElderlApplyServiceImpl.java
  4. 6 1
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java
  5. 2 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmElderlyApi.java
  6. 2 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmElderlyExpenseApi.java
  7. 43 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmElderlyApiImpl.java
  8. 165 78
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmElderlyExpenseApiImpl.java
  9. 9 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/RefundSettlementOrderController.java
  10. 6 36
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/ExpenseOrderItemVO.java
  11. 8 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/home/HomeServiceOrderController.java
  12. 21 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/home/vo/HomeServiceOrderPageRespVO.java
  13. 7 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/home/vo/HomeServiceOrderRespVO.java
  14. 7 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/home/vo/HomeServiceOrderSaveReqVO.java
  15. 5 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/RefundSettlementOrderDO.java
  16. 5 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/RefundSettlementOrderItemDO.java
  17. 7 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/home/HomeServiceOrderDO.java
  18. 0 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/home/HomeServiceOrderItemDO.java
  19. 33 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/home/HomeServiceOrderItemMapper.java
  20. 17 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/home/vo/HomeServiceOrderItemDetailVO.java
  21. 1 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyConsumerVouchersServiceImpl.java
  22. 1 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseOrderServiceImpl.java
  23. 4 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/RefundSettlementOrderService.java
  24. 559 556
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/RefundSettlementOrderServiceImpl.java
  25. 2 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/home/HomeServiceOrderService.java
  26. 32 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/home/HomeServiceOrderServiceImpl.java
  27. 8 0
      yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/HomeServiceOrderMapper.xml

+ 9 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/business/BpmElderlyController.java

@@ -56,6 +56,15 @@ public class BpmElderlyController {
         return success(elderlApplyService.createApplyRetreat(getLoginUserId(), createReqVO));
     }
 
+    @PostMapping("/retreatRevoke")
+    @PreAuthorize("@ss.hasAnyPermissions('check-out:add', 'check-out:relaunch')")
+    @Operation(summary = "撤销退住申请(审批通过未结算)")
+    @TenantIgnore
+    public CommonResult<Boolean> retreatRevoke(@RequestParam("businessId") Long retreatRecordId) {
+        elderlApplyService.revokeApprovedRetreat(getLoginUserId(), retreatRecordId);
+        return success(true);
+    }
+
     @PostMapping("/bedChangeCreate")
     @PreAuthorize("@ss.hasAnyPermissions('bed-change:add', 'bed-change:relaunch')")
     @Operation(summary = "创建床位变更")

+ 2 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/business/BpmElderlApplyService.java

@@ -25,6 +25,8 @@ public interface BpmElderlApplyService {
 
     Long createApplyRetreat(Long userId, BpmApplyRetreatCreateReqVO createReqVO);
 
+    void revokeApprovedRetreat(Long userId, Long retreatRecordId);
+
     Long bedChangeCreate(Long loginUserId, BedChangeRecordCreateReqVO createReqVO);
 
     Long nurseChangeCreate(Long loginUserId, NurseChangeRecordCreateReqVO createReqVO);

+ 28 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/business/BpmElderlApplyServiceImpl.java

@@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.bpm.controller.admin.business.vo.*;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.business.BpmBusinessFormDO;
 import cn.iocoder.yudao.module.bpm.dal.mysql.business.BpmBusinessFormMapper;
 import cn.iocoder.yudao.module.bpm.enums.BpmBusinessTypeEnum;
+import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
 import cn.iocoder.yudao.module.system.api.bpm.BpmCheckInApi;
 import cn.iocoder.yudao.module.system.api.bpm.BpmCheckInWaitApi;
 import cn.iocoder.yudao.module.system.api.bpm.BpmElderlyExpenseApi;
@@ -176,6 +177,33 @@ public class BpmElderlApplyServiceImpl implements BpmElderlApplyService {
         return bpmBusinessFormService.create(businessFormCreateReqVO);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    @TenantIgnore
+    public void revokeApprovedRetreat(Long userId, Long retreatRecordId) {
+        BpmBusinessFormDO businessFormDO = bpmBusinessFormMapper.selectOne(new LambdaQueryWrapperX<BpmBusinessFormDO>()
+                .eq(BpmBusinessFormDO::getBusinessId, retreatRecordId)
+                .eq(BpmBusinessFormDO::getType, BpmBusinessTypeEnum.APPLY_RETREAT.getValue())
+                .orderByDesc(BpmBusinessFormDO::getId)
+                .last("LIMIT 1"));
+        if (businessFormDO == null) {
+            throw new RuntimeException("找不到对应的退住申请流程记录");
+        }
+        if (!Objects.equals(businessFormDO.getStatus(), BpmTaskStatusEnum.APPROVE.getStatus())
+                && !Objects.equals(businessFormDO.getStatus(), 5)) {
+            throw new RuntimeException("该退住申请未处于审批通过状态,无法撤销");
+        }
+
+        elderlyExpenseApi.revokeApprovedRetreat(retreatRecordId);
+        bpmElderlyApi.revokeApprovedRetreat(retreatRecordId);
+
+        BpmBusinessFormDO update = new BpmBusinessFormDO();
+        update.setId(businessFormDO.getId());
+        update.setStatus(BpmTaskStatusEnum.CANCEL.getStatus());
+        update.setCompleteStatus(1);
+        bpmBusinessFormMapper.updateById(update);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     @LogRecord(type = ELDER_BED_CHANGE_TYPE, subType = ELDER_BED_CHANGE_SUB_TYPE, bizNo = "{{#createReqVO.elderlyId}}",

+ 6 - 1
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java

@@ -53,7 +53,12 @@ public class FileController {
     public CommonResult<String> uploadFile(FileUploadReqVO uploadReqVO) throws Exception {
         MultipartFile file = uploadReqVO.getFile();
         String path = uploadReqVO.getPath();
-        String result = fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()));
+        String result = "";
+        try{
+            result = fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()));
+        }catch (Exception e){
+            log.error("upload异常:,{}", (Object) e.getStackTrace());
+        }
         LogRecordContext.putVariable("file",file);
         return success(result);
     }

+ 2 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmElderlyApi.java

@@ -47,6 +47,8 @@ public interface BpmElderlyApi {
 
     void releaseBed(Long retreatRecordId);
 
+    void revokeApprovedRetreat(Long retreatRecordId);
+
     void delectRetreatRecordByElderId(Long elderId, Integer orgType, Long tenantId);
 
     Long generateApplyAccommodationData(Long elderId, Long startTenantId);

+ 2 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmElderlyExpenseApi.java

@@ -15,6 +15,8 @@ public interface BpmElderlyExpenseApi {
      */
     void generateRefundSettlementOrder(Long businessId, Long startTenantId);
 
+    void revokeApprovedRetreat(Long retreatRecordId);
+
     /**
      * 退住申请前检查
      * 检查是否有未缴费的账单,存在则不能申请抛出异常

+ 43 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmElderlyApiImpl.java

@@ -385,6 +385,49 @@ public class BpmElderlyApiImpl implements BpmElderlyApi {
         }
     }
 
+    @Override
+    @TenantIgnore
+    public void revokeApprovedRetreat(Long retreatRecordId) {
+        ElderlyRetreatRecordDO elderlyRetreatRecordDO = retreatRecordMapper.selectById(retreatRecordId);
+        if (elderlyRetreatRecordDO == null) {
+            throw new RuntimeException("找不到该退住申请记录");
+        }
+        Long elderId = elderlyRetreatRecordDO.getElderlyId();
+        ElderlyInfoDO originalElderlyInfoDO = elderlyInfoMapper.selectById(elderId);
+        if (originalElderlyInfoDO == null) {
+            throw new RuntimeException("找不到该长者信息");
+        }
+
+        BuildBedDO bedDO = originalElderlyInfoDO.getBedId() == null ? null : buildBedMapper.selectById(originalElderlyInfoDO.getBedId());
+        if (bedDO != null && !Objects.equals(bedDO.getStatus(), 0)) {
+            throw new RuntimeException("床位已被占用,无法撤销退住申请");
+        }
+
+        ElderlyInfoDO elderlyInfoDO = new ElderlyInfoDO();
+        elderlyInfoDO.setId(elderId);
+        elderlyInfoDO.setCheckOutTime(null);
+        elderlyInfoDO.setInStatus(1);
+        elderlyInfoMapper.updateById(elderlyInfoDO);
+
+        ElderlyCheckInRecordDO elderlyCheckInRecordDO = elderlyCheckInRecordMapper.selectOne(new LambdaQueryWrapperX<ElderlyCheckInRecordDO>()
+                .eq(ElderlyCheckInRecordDO::getElderId, elderId)
+                .eq(ElderlyCheckInRecordDO::getCurrentFlag, 0));
+        if (elderlyCheckInRecordDO != null && Objects.equals(elderlyCheckInRecordDO.getStatus(), 3)) {
+            elderlyCheckInRecordDO.setStatus(2);
+            elderlyCheckInRecordMapper.updateById(elderlyCheckInRecordDO);
+        }
+
+        if (bedDO != null) {
+            bedDO.setStatus(1);
+            buildBedMapper.updateById(bedDO);
+        }
+
+        ElderlyRetreatRecordDO updateRetreat = new ElderlyRetreatRecordDO();
+        updateRetreat.setId(retreatRecordId);
+        updateRetreat.setCurrentFlag(1);
+        retreatRecordMapper.updateById(updateRetreat);
+    }
+
     @Override
     public void delectRetreatRecordByElderId(Long elderId, Integer orgType, Long tenantId) {
         retreatRecordMapper.update(new LambdaUpdateWrapper<ElderlyRetreatRecordDO>()

+ 165 - 78
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmElderlyExpenseApiImpl.java

@@ -34,6 +34,7 @@ import cn.iocoder.yudao.module.system.service.biz.ExpenseOrderService;
 import cn.iocoder.yudao.module.system.service.biz.RefundSettlementOrderService;
 import com.mzt.logapi.starter.annotation.LogRecord;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -80,10 +81,6 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
     @Resource
     private ExpenseOrderMapper expenseOrderMapper;
 
-
-    @Resource
-    private ExpenseOrderItemMapper expenseOrderItemMapper;
-
     @Resource
     private AdminUserMapper userMapper;
     @Resource
@@ -102,6 +99,11 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
     @Resource
     private RefundSettlementOrderItemMapper refundSettlementOrderItemMapper;
 
+    @Autowired
+    private ExpenseSubsidyMapper expenseSubsidyMapper;
+    @Autowired
+    private ElderlyConsumerVouchersMapper consumerVouchersMapper;
+
     @Override
     @LogRecord(type = EXPENSE_SETTLEMENT_TYPE, subType = EXPENSE_SETTLEMENT_TYPE_SUB_TYPE, bizNo = "{{#elderlyInfo.id}}",
             success = EXPENSE_SETTLEMENT_INSERT_SUCCESS)
@@ -121,6 +123,12 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
                 .eq(ExpenseOrderDO::getElderId,elderlyInfo.getId())
                 .eq(ExpenseOrderDO::getPayStatus,0)
                 .ge(ExpenseOrderDO::getBillingMonth,costDeadlineYearMonth));
+        // 解锁退住日期后续月账单,避免推送至金蝶
+        expenseOrderMapper.update(new ExpenseOrderDO().setIsLock(Boolean.FALSE),new LambdaQueryWrapperX<ExpenseOrderDO>()
+                .eq(ExpenseOrderDO::getElderId,elderlyInfo.getId())
+                .eq(ExpenseOrderDO::getPayStatus,0)
+                .eq(ExpenseOrderDO::getIsShow,Boolean.FALSE)
+                .gt(ExpenseOrderDO::getBillingMonth,costDeadlineYearMonth));
         if (elderlyCheckInRecordDO != null){
             elderlyCheckInRecordDO.setStatus(3);
             elderlyCheckInRecordMapper.updateById(elderlyCheckInRecordDO);
@@ -130,6 +138,7 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
         RefundSettlementOrderDO order = new RefundSettlementOrderDO();
         order.setElderId(elderlyInfo.getId());
         order.setBusinessId(businessId);
+        order.setVersion(1);
         order.setRefundAmount(BigDecimal.ZERO);
         order.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
         order.setCreatedTime(new Date());
@@ -137,6 +146,7 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
         order.setTenantId(startTenantId);
         refundSettlementOrderMapper.insert(order);
 
+//        createRetreatChangeDailyExpenses(elderlyRetreatRecord, startTenantId);
 
         // 生成退款单子项,获取退住结算数据
         RefundSettlementOrderRespVO virtualRefundSettlementOrder = refundSettlementOrderService.getVirtualRefundSettlementOrder(order.getId());
@@ -159,80 +169,6 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
         refundSettlementOrderMapper.updateById(order);
 
 
-        //查询长者月度费项配置
-        ExpenseDO expense = expenseMapper.selectList(new LambdaQueryWrapperX<ExpenseDO>()
-                        .eq(ExpenseDO::getElderId, elderlyInfo.getId())
-                        .eq(ExpenseDO::getTenantId, startTenantId)
-                        .orderByDesc(ExpenseDO::getCreatedTime))
-                .stream()
-                .findFirst()
-                .get();
-
-        List<ExpenseItemDO> expenseItems = expenseItemMapper.selectList(new LambdaQueryWrapperX<ExpenseItemDO>()
-                .eq(ExpenseItemDO::getExpenseId, expense.getId())
-                .eq(ExpenseItemDO::getIsMonthlyExpense, BooleanEnum.TRUE.getValue())
-                .eq(ExpenseItemDO::getTenantId, startTenantId));
-
-        for (ExpenseItemDO expenseItem : expenseItems) {
-            List<ExpenseItemDO> list = expenseItemMapper.selectCurrentMonthList(elderlyRetreatRecord.getRetreatDate(),
-                    elderlyRetreatRecord.getElderlyId(), expenseItem.getType());
-            LocalDate retreatDate = elderlyRetreatRecord.getRetreatDate();
-            LocalDate firstDayOfMonth = retreatDate.withDayOfMonth(1);
-            for (int i = 0; i < list.size(); i++) {
-                ExpenseItemDO expenseItemDO = list.get(i);
-                BigDecimal daysInCurrentMonth = BigDecimal.valueOf(elderlyRetreatRecord.getRetreatDate().lengthOfMonth());
-                BigDecimal actualAmount = expenseItemDO.getActualAmount();
-                LocalDate changeStartDate = expenseItemDO.getChangeStartDate();
-                LocalDate changeEndDate = expenseItemDO.getChangeEndDate();
-
-                if (null == changeEndDate && changeStartDate.isBefore(retreatDate)) {
-                    changeEndDate = retreatDate;
-                }
-
-                // 变更产生的金额
-                BigDecimal amount = BigDecimal.ZERO;
-                // 变更整月差额
-                BigDecimal changeAmount = BigDecimal.ZERO;
-                if (null != changeStartDate && null != changeEndDate) {
-                    long startDay = changeStartDate.toEpochDay();
-                    long endDay = changeEndDate.toEpochDay();
-                    BigDecimal currentDays = BigDecimal.valueOf(endDay - startDay);
-                    BigDecimal currentDayAmount = actualAmount.divide(daysInCurrentMonth, 8, RoundingMode.HALF_UP);
-                    amount = currentDayAmount.multiply(currentDays);
-                    if (i == list.size() - 1) {
-                        continue;
-                    }
-                    ExpenseItemDO nextItem = list.get(i + 1);
-                    LocalDate lastDayOfMonth = firstDayOfMonth.with(TemporalAdjusters.lastDayOfMonth());
-                    long epochDay = lastDayOfMonth.toEpochDay();
-                    BigDecimal changeDay = BigDecimal.valueOf(epochDay - endDay);
-                    BigDecimal changeDayAmount = nextItem.getActualAmount().divide(daysInCurrentMonth, 8, RoundingMode.HALF_UP);
-                    BigDecimal currentAmount = currentDayAmount.multiply(changeDay);
-                    changeAmount = changeDayAmount.multiply(changeDay);
-                    BigDecimal finalAmount = currentAmount.subtract(changeAmount);
-
-                    DailyExpensesDO dailyExpenses = new DailyExpensesDO();
-                    dailyExpenses.setType(2); // 2:变更
-                    dailyExpenses.setElderId(elderlyRetreatRecord.getElderlyId());
-                    dailyExpenses.setAttributionBillTime(lastDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM")));
-                    dailyExpenses.setItemId(nextItem.getId());
-                    dailyExpenses.setItemCategory(nextItem.getItemCategoryName());
-                    dailyExpenses.setItemName(nextItem.getItemName());
-                    dailyExpenses.setPrice(finalAmount);
-                    dailyExpenses.setAmount(finalAmount);
-                    String currentRemark = String.format(RETREAT_DAILY_PAY_REMARK, nextItem.getItemName(), changeEndDate
-                            ,changeEndDate, lastDayOfMonth);
-                    dailyExpenses.setRemarks(currentRemark); //todo 补充备注
-                    dailyExpenses.setCount(1);
-                    dailyExpenses.setCreatedTime(new Date());
-                    dailyExpenses.setAccountingTime(new Date());
-                    dailyExpenses.setIsGenerateBill(BooleanEnum.FALSE.getValue());
-                    dailyExpenses.setTenantId(startTenantId);
-                    dailyExpenses.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
-                    dailyExpensesMapper.insert(dailyExpenses);
-                }
-            }
-        }
         Map<String, Object> templateParams = new HashMap<>();
         templateParams.put("elderName", elderlyInfo.getElderName());
         List<BusinessParamsConfigDO> businessParamsConfigDOS = businessParamsConfigMapper.selectListByName(startTenantId ,NoticeConstants.REFUND_SETTLEMENT_HANDLE_NAME);
@@ -308,6 +244,85 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
 
     }
 
+    private void createRetreatChangeDailyExpenses(ElderlyRetreatRecordDO elderlyRetreatRecord, Long startTenantId) {
+        ExpenseDO expense = expenseMapper.selectList(new LambdaQueryWrapperX<ExpenseDO>()
+                        .eq(ExpenseDO::getElderId, elderlyRetreatRecord.getElderlyId())
+                        .eq(ExpenseDO::getTenantId, startTenantId)
+                        .orderByDesc(ExpenseDO::getCreatedTime))
+                .stream()
+                .findFirst()
+                .orElse(null);
+        if (expense == null) {
+            return;
+        }
+
+        List<ExpenseItemDO> expenseItems = expenseItemMapper.selectList(new LambdaQueryWrapperX<ExpenseItemDO>()
+                .eq(ExpenseItemDO::getExpenseId, expense.getId())
+                .eq(ExpenseItemDO::getIsMonthlyExpense, BooleanEnum.TRUE.getValue())
+                .eq(ExpenseItemDO::getTenantId, startTenantId));
+
+        for (ExpenseItemDO expenseItem : expenseItems) {
+            List<ExpenseItemDO> list = expenseItemMapper.selectCurrentMonthList(elderlyRetreatRecord.getRetreatDate(),
+                    elderlyRetreatRecord.getElderlyId(), expenseItem.getType());
+            LocalDate retreatDate = elderlyRetreatRecord.getRetreatDate();
+            LocalDate firstDayOfMonth = retreatDate.withDayOfMonth(1);
+            for (int i = 0; i < list.size(); i++) {
+                ExpenseItemDO expenseItemDO = list.get(i);
+                BigDecimal daysInCurrentMonth = BigDecimal.valueOf(elderlyRetreatRecord.getRetreatDate().lengthOfMonth());
+                BigDecimal actualAmount = expenseItemDO.getActualAmount();
+                LocalDate changeStartDate = expenseItemDO.getChangeStartDate();
+                LocalDate changeEndDate = expenseItemDO.getChangeEndDate();
+
+                if (changeStartDate == null) {
+                    continue;
+                }
+                if (changeEndDate == null && changeStartDate.isBefore(retreatDate)) {
+                    changeEndDate = retreatDate;
+                }
+                if (changeEndDate == null) {
+                    continue;
+                }
+                if (i == list.size() - 1) {
+                    continue;
+                }
+
+                long endDay = changeEndDate.toEpochDay();
+                ExpenseItemDO nextItem = list.get(i + 1);
+                LocalDate lastDayOfMonth = firstDayOfMonth.with(TemporalAdjusters.lastDayOfMonth());
+                long epochDay = lastDayOfMonth.toEpochDay();
+                BigDecimal changeDay = BigDecimal.valueOf(epochDay - endDay);
+                if (changeDay.compareTo(BigDecimal.ZERO) <= 0) {
+                    continue;
+                }
+
+                BigDecimal currentDayAmount = actualAmount.divide(daysInCurrentMonth, 8, RoundingMode.HALF_UP);
+                BigDecimal changeDayAmount = nextItem.getActualAmount().divide(daysInCurrentMonth, 8, RoundingMode.HALF_UP);
+                BigDecimal currentAmount = currentDayAmount.multiply(changeDay);
+                BigDecimal changeAmount = changeDayAmount.multiply(changeDay);
+                BigDecimal finalAmount = currentAmount.subtract(changeAmount);
+
+                DailyExpensesDO dailyExpenses = new DailyExpensesDO();
+                dailyExpenses.setType(2);
+                dailyExpenses.setElderId(elderlyRetreatRecord.getElderlyId());
+                dailyExpenses.setAttributionBillTime(lastDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM")));
+                dailyExpenses.setItemId(nextItem.getId());
+                dailyExpenses.setItemCategory(nextItem.getItemCategoryName());
+                dailyExpenses.setItemName(nextItem.getItemName());
+                dailyExpenses.setPrice(finalAmount);
+                dailyExpenses.setAmount(finalAmount);
+                String currentRemark = String.format(RETREAT_DAILY_PAY_REMARK, nextItem.getItemName(), changeEndDate, changeEndDate, lastDayOfMonth);
+                dailyExpenses.setRemarks(currentRemark);
+                dailyExpenses.setCount(1);
+                dailyExpenses.setCreatedTime(new Date());
+                dailyExpenses.setAccountingTime(new Date());
+                dailyExpenses.setIsGenerateBill(BooleanEnum.FALSE.getValue());
+                dailyExpenses.setTenantId(startTenantId);
+                dailyExpenses.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
+                dailyExpensesMapper.insert(dailyExpenses);
+            }
+        }
+    }
+
     @NotNull
     private static RefundSettlementOrderItemDO getRefundSettlementOrderItemDO(ExpenseOrderItemVO itemVO, RefundSettlementOrderDO order) {
         RefundSettlementOrderItemDO refundItem = new RefundSettlementOrderItemDO();
@@ -319,6 +334,8 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
         refundItem.setRefundAmount(itemVO.getAmount());
         refundItem.setActualRefundAmount(itemVO.getAmount());
         refundItem.setSourceItemId(itemVO.getItemId());
+        refundItem.setSourceOrderItemId(itemVO.getSourceOrderItemId());
+        refundItem.setExpenseSource(itemVO.getExpenseSource());
         refundItem.setTenantId(TenantContextHolder.getTenantId());
         // 根据费用类型设置type字段
         if (itemVO.getIsDeposit() != null && itemVO.getIsDeposit() == 1) {
@@ -342,6 +359,76 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
         return refundItem;
     }
 
+    @Override
+    @TenantIgnore
+    @Transactional
+    public void revokeApprovedRetreat(Long retreatRecordId) {
+        ElderlyRetreatRecordDO retreatRecord = retreatRecordMapper.selectById(retreatRecordId);
+        if (retreatRecord == null) {
+            throw new RuntimeException("找不到该退住申请记录");
+        }
+
+        RefundSettlementOrderDO refundSettlementOrder = refundSettlementOrderMapper.selectOne(new LambdaQueryWrapperX<RefundSettlementOrderDO>()
+                .eq(RefundSettlementOrderDO::getBusinessId, retreatRecordId)
+                .orderByDesc(RefundSettlementOrderDO::getCreatedTime)
+                .last("LIMIT 1"));
+        if (refundSettlementOrder == null) {
+            throw new RuntimeException("未找到对应退住结算单,无法撤销退住申请");
+        }
+        if (Objects.equals(refundSettlementOrder.getStatus(), BooleanEnum.TRUE.getValue())) {
+            throw new RuntimeException("退住结算单已结算,请先撤销结算");
+        }
+
+        List<RefundSettlementOrderItemDO> refundItems = refundSettlementOrderItemMapper.selectList(
+                new LambdaQueryWrapperX<RefundSettlementOrderItemDO>()
+                        .eq(RefundSettlementOrderItemDO::getRefundSettlementOrderId, refundSettlementOrder.getId()));
+        Set<Long> subsidyIds = new HashSet<>();
+        Set<Long> voucherIds = new HashSet<>();
+        for (RefundSettlementOrderItemDO refundItem : refundItems) {
+            if(refundItem.getExpenseSource().equals(BusinessConstants.LONG_TERM_CARE_INSURANCE)){
+                subsidyIds.add(refundItem.getSourceItemId());
+            }
+            if(refundItem.getExpenseSource().equals(BusinessConstants.CONSUMER_VOUCHER)){
+                voucherIds.add(refundItem.getSourceItemId());
+            }
+        }
+        List<ExpenseSubsidyDO> expenseSubsidyDOS = expenseSubsidyMapper.selectList(new LambdaQueryWrapperX<ExpenseSubsidyDO>().in(ExpenseSubsidyDO::getId, subsidyIds));
+        List<ExpenseSubsidyDO> updateExpenseSubsidyList = new ArrayList<>();
+        for (ExpenseSubsidyDO expenseSubsidyDO : expenseSubsidyDOS) {
+            // 退住后补录的长护险未带入到任何月度账单,需要撤销抵扣状态
+            if (StringUtils.isBlank(expenseSubsidyDO.getOrderNumber())) {
+                expenseSubsidyDO.setStatus(0);
+                updateExpenseSubsidyList.add(expenseSubsidyDO);
+            }
+        }
+        // 更新退住后补录的长护险
+        expenseSubsidyMapper.updateBatch(updateExpenseSubsidyList);
+
+        List<ElderlyConsumerVouchersDO> vouchersDOS = consumerVouchersMapper.selectList(new LambdaQueryWrapperX<ElderlyConsumerVouchersDO>().in(ElderlyConsumerVouchersDO::getId, voucherIds));
+        List<ElderlyConsumerVouchersDO> updatevouchersList = new ArrayList<>();
+        for (ElderlyConsumerVouchersDO vouchersDO : vouchersDOS) {
+            if (StringUtils.isBlank(vouchersDO.getOrderNumber())) {
+                vouchersDO.setStatus(0);
+                updatevouchersList.add(vouchersDO);
+            }
+        }
+        consumerVouchersMapper.updateBatch(updatevouchersList);
+
+
+        refundSettlementOrderItemMapper.delete(new LambdaQueryWrapperX<RefundSettlementOrderItemDO>()
+                .eq(RefundSettlementOrderItemDO::getRefundSettlementOrderId, refundSettlementOrder.getId()));
+        refundSettlementOrderMapper.deleteById(refundSettlementOrder.getId());
+
+        Long elderId = retreatRecord.getElderlyId();
+        YearMonth costDeadlineYearMonth = YearMonth.from(retreatRecord.getCostDeadlineDate());
+        expenseOrderMapper.update(new ExpenseOrderDO().setIsShow(Boolean.TRUE), new LambdaQueryWrapperX<ExpenseOrderDO>()
+                .eq(ExpenseOrderDO::getElderId, elderId)
+                .eq(ExpenseOrderDO::getPayStatus, 0)
+                .eq(ExpenseOrderDO::getIsShow, Boolean.FALSE)
+                .ge(ExpenseOrderDO::getBillingMonth, costDeadlineYearMonth));
+        notifyMessageSendApi.updateMessageByCodeAndPkMessage(BpmMessageEnum.REFUND_SETTLEMENT_HANDLE.getTemplateCode(), elderId);
+    }
+
     @Override
     public void applyRetreatCheck(Long elderId,LocalDate costDeadlineDate){
         ElderlyInfoDO elderlyInfoDO = elderlyInfoMapper.selectById(elderId);

+ 9 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/RefundSettlementOrderController.java

@@ -150,6 +150,15 @@ public class RefundSettlementOrderController {
         return success(refundSettlementOrderService.getSettledRefundOrderDetail(id));
     }
 
+    @PostMapping("/revokeSettlement")
+    @Operation(summary = "撤销结算")
+    @Parameter(name = "id", description = "退住结算单ID", required = true, example = "1024")
+    @TenantIgnore
+    public CommonResult<Boolean> revokeSettlement(@RequestParam("id") Long id) {
+        refundSettlementOrderService.revokeSettlement(id);
+        return success(true);
+    }
+
 
 //
 //    @GetMapping("/export-excel")

+ 6 - 36
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/ExpenseOrderItemVO.java

@@ -44,42 +44,12 @@ public class ExpenseOrderItemVO {
     @Schema(description = "费用项ID")
     private Long itemId;
 
-//    @Schema(description = "应退金额")
-//    private BigDecimal refundAmount;
-
-
-//    @Schema(description = "费用分类,日常,外出,变更等")
-//    private Integer expenseType;
-//
-//    @Schema(description = "费用项来源")
-//    private String expenseSource;
-//
-//    @Schema(description = "费用项ID")
-//    private Long sourceExpenseItemId;
-//
-//    @Schema(description = "费用项名称")
-//    private String itemName;
-//
-//    @Schema(description = "费用项分类")
-//    private String itemCategory;
-//
-//    @Schema(description = "开始日期")
-//    private String startTime;
-//
-//    @Schema(description = "结束日期")
-//    private String endTime;
-//
-//    @Schema(description = "单价")
-//    private BigDecimal price;
-//
-//    @Schema(description = "数量")
-//    private Integer count;
-//
-//    @Schema(description = "总金额")
-//    private BigDecimal totalAmount;
-//
-//    @Schema(description = "费用类型,床位费,护理费,膳食费等")
-//    private Integer type;
+    @Schema(description = "来源账单明细id")
+    private Long sourceOrderItemId;
+
+    @Schema(description = "来源类型")
+    private String expenseSource;
+
     @Schema(description = "是否跳过,后端使用")
     private boolean isSkip;
 }

+ 8 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/home/HomeServiceOrderController.java

@@ -76,5 +76,12 @@ public class HomeServiceOrderController {
         }
         return success(homeServiceOrderService.getHomeServiceOrderPage(pageReqVO));
     }
-}
 
+    @PutMapping("/confirm-batch")
+    @Operation(summary = "批量确认居家服务订单")
+    @TenantIgnore
+    public CommonResult<Boolean> confirmBatch(@RequestBody Long[] orderIds) {
+        homeServiceOrderService.confirmHomeServiceOrders(orderIds);
+        return success(true);
+    }
+}

+ 21 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/home/vo/HomeServiceOrderPageRespVO.java

@@ -1,10 +1,13 @@
 package cn.iocoder.yudao.module.system.controller.admin.home.vo;
 
+import cn.iocoder.yudao.module.system.dal.dataobject.home.HomeServiceOrderItemDO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.List;
 
 @Schema(description = "管理后台 - 居家服务订单分页 Response VO")
 @Data
@@ -12,10 +15,22 @@ public class HomeServiceOrderPageRespVO {
 
     private Long id;
 
+    private String homeElderName;
+
+    private Integer sex;
+
+    private Integer age;
+
+    private String phone;
+
+    private String address;
+
     private Integer orderType;
 
     private Long serviceMemberId;
 
+    private String serviceMemberName;
+
     private LocalDateTime orderTime;
 
     private LocalDateTime serviceStartTime;
@@ -34,6 +49,10 @@ public class HomeServiceOrderPageRespVO {
 
     private Integer type;
 
+    private Integer status;
+
+    private LocalDate subsidyArrivalDate;
+
     private Long tenantId;
 
     private LocalDateTime createTime;
@@ -43,5 +62,7 @@ public class HomeServiceOrderPageRespVO {
     private String creator;
 
     private String updater;
+
+    private String items;
 }
 

+ 7 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/home/vo/HomeServiceOrderRespVO.java

@@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -15,6 +16,8 @@ public class HomeServiceOrderRespVO {
 
     private Integer orderType;
 
+    private Long homeElderId;
+
     private Long serviceMemberId;
 
     private LocalDateTime orderTime;
@@ -35,6 +38,10 @@ public class HomeServiceOrderRespVO {
 
     private Integer type;
 
+    private Integer status;
+
+    private LocalDate subsidyArrivalDate;
+
     private Long tenantId;
 
     private LocalDateTime createTime;

+ 7 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/home/vo/HomeServiceOrderSaveReqVO.java

@@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -13,6 +14,8 @@ public class HomeServiceOrderSaveReqVO {
 
     private Long id;
 
+    private Long homeElderId;
+
     private Integer orderType;
 
     private Long serviceMemberId;
@@ -35,6 +38,10 @@ public class HomeServiceOrderSaveReqVO {
 
     private Integer type;
 
+    private Integer status;
+
+    private LocalDate subsidyArrivalDate;
+
     private Long tenantId;
 
     private List<Long> serviceItemIds;

+ 5 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/RefundSettlementOrderDO.java

@@ -81,6 +81,11 @@ public class RefundSettlementOrderDO{
     @Schema(description = "业务ID")
     private Long businessId;
 
+    /**
+     * 数据版本
+     */
+    @Schema(description = "数据版本")
+    private Integer version;
 
     private Long tenantId;
 

+ 5 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/RefundSettlementOrderItemDO.java

@@ -61,6 +61,11 @@ public class RefundSettlementOrderItemDO {
     @Schema(description = "来源费用项ID")
     private Long sourceItemId;
 
+    @Schema(description = "来源账单明细id")
+    private Long sourceOrderItemId;
+
+    @Schema(description = "来源类型")
+    private String expenseSource;
 
     private Long tenantId;
 }

+ 7 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/home/HomeServiceOrderDO.java

@@ -11,6 +11,7 @@ import lombok.ToString;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@@ -28,6 +29,8 @@ public class HomeServiceOrderDO extends BaseNoDeleteDO {
     @TableId(type = IdType.AUTO)
     private Long id;
 
+    private Long homeElderId;
+
     private Integer orderType;
 
     private Long serviceMemberId;
@@ -56,6 +59,10 @@ public class HomeServiceOrderDO extends BaseNoDeleteDO {
 
     private Integer type;
 
+    private Integer status;
+
+    private LocalDate subsidyArrivalDate;
+
     private Long tenantId;
 }
 

+ 0 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/home/HomeServiceOrderItemDO.java

@@ -26,4 +26,3 @@ public class HomeServiceOrderItemDO extends BaseNoDeleteDO {
 
     private Long tenantId;
 }
-

+ 33 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/home/HomeServiceOrderItemMapper.java

@@ -2,9 +2,41 @@ package cn.iocoder.yudao.module.system.dal.mysql.home;
 
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.module.system.dal.dataobject.home.HomeServiceOrderItemDO;
+import cn.iocoder.yudao.module.system.dal.mysql.home.vo.HomeServiceOrderItemDetailVO;
+import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
 
 @Mapper
 public interface HomeServiceOrderItemMapper extends BaseMapperX<HomeServiceOrderItemDO> {
-}
 
+    @Select({
+            "<script>",
+            "select",
+            "oi.id,",
+            "oi.home_service_order_id as homeServiceOrderId,",
+            "oi.service_item_id as serviceItemId,",
+            "oi.tenant_id as tenantId,",
+            "i.item_name as itemName",
+            "from home_service_order_item oi",
+            "left join home_service_item i on i.id = oi.service_item_id",
+            "<where>",
+            "<choose>",
+            "<when test='orderIds != null and orderIds.length &gt; 0'>",
+            "oi.home_service_order_id in",
+            "<foreach collection='orderIds' item='orderId' open='(' separator=',' close=')'>",
+            "#{orderId}",
+            "</foreach>",
+            "</when>",
+            "<otherwise>",
+            "1 = 0",
+            "</otherwise>",
+            "</choose>",
+            "</where>",
+            "order by oi.home_service_order_id asc, oi.id asc",
+            "</script>"
+    })
+    List<HomeServiceOrderItemDetailVO> selectListByOrderIds(@Param("orderIds") Long[] orderIds);
+}

+ 17 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/home/vo/HomeServiceOrderItemDetailVO.java

@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.system.dal.mysql.home.vo;
+
+import lombok.Data;
+
+@Data
+public class HomeServiceOrderItemDetailVO {
+
+    private Long id;
+
+    private Long homeServiceOrderId;
+
+    private Long serviceItemId;
+
+    private Long tenantId;
+
+    private String itemName;
+}

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

@@ -270,7 +270,7 @@ public class ElderlyConsumerVouchersServiceImpl implements ElderlyConsumerVouche
         BigDecimal newAmount = currentAmount.add(orderItem.getRefundAmount());
         refundSettlementOrderDO.setRefundAmount(newAmount);
         refundSettlementOrderMapper.updateById(refundSettlementOrderDO);
-        //更新长护险状态
+        // 更新消费券状态
         vouchers.setStatus(1);
         elderlyConsumerVouchersMapper.updateById(vouchers);
     }

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

@@ -2944,7 +2944,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
 
             ExpensePayOrderItemDO payOrderItem = new ExpensePayOrderItemDO();
             payOrderItem.setPayOrderId(payOrder.getId());
-            payOrderItem.setPayType("system");
+            payOrderItem.setPayType(String.valueOf(1));
             payOrderItem.setPayAmount(payAmount);
             payOrderItem.setRoundPayAmount(payAmount.setScale(0, RoundingMode.HALF_UP));
             payOrderItem.setRoundPayTwoDecimalAmount(payAmount.setScale(2, RoundingMode.HALF_UP));

+ 4 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/RefundSettlementOrderService.java

@@ -17,7 +17,7 @@ public interface RefundSettlementOrderService {
 
     RefundSettlementOrderRespVO getRefundSettlementOrder(Long id);
     
-    RefundSettlementOrderRespVO getRefundSettlementOrderDetails(Long id);
+//    RefundSettlementOrderRespVO getRefundSettlementOrderDetails(Long id);
 
     /**
      * 获取虚拟账单详情(新的简化版接口)
@@ -39,4 +39,6 @@ public interface RefundSettlementOrderService {
     RefundSettledOrderDetailVO getSettledRefundOrderDetail(Long id);
 
     void editRefundSettlementOrder(RefundSettlementOrderRespVO respVO);
-}
+
+    void revokeSettlement(Long id);
+}

Fichier diff supprimé car celui-ci est trop grand
+ 559 - 556
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/RefundSettlementOrderServiceImpl.java


+ 2 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/home/HomeServiceOrderService.java

@@ -17,5 +17,6 @@ public interface HomeServiceOrderService {
     HomeServiceOrderRespVO getHomeServiceOrder(Long id);
 
     PageResult<HomeServiceOrderPageRespVO> getHomeServiceOrderPage(HomeServiceOrderPageReqVO pageReqVO);
-}
 
+    void confirmHomeServiceOrders(Long[] orderIds);
+}

+ 32 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/home/HomeServiceOrderServiceImpl.java

@@ -12,13 +12,19 @@ import cn.iocoder.yudao.module.system.dal.dataobject.home.HomeServiceOrderDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.home.HomeServiceOrderItemDO;
 import cn.iocoder.yudao.module.system.dal.mysql.home.HomeServiceOrderItemMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.home.HomeServiceOrderMapper;
+import cn.iocoder.yudao.module.system.dal.mysql.home.vo.HomeServiceOrderItemDetailVO;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @Service
 @Validated
@@ -76,9 +82,35 @@ public class HomeServiceOrderServiceImpl implements HomeServiceOrderService {
     public PageResult<HomeServiceOrderPageRespVO> getHomeServiceOrderPage(HomeServiceOrderPageReqVO pageReqVO) {
         Page<HomeServiceOrderPageRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
         List<HomeServiceOrderPageRespVO> list = homeServiceOrderMapper.selectPageWithJoin(page, pageReqVO);
+        List<Long> orderIds = list.stream().map(HomeServiceOrderPageRespVO::getId).collect(Collectors.toList());
+        if (orderIds.isEmpty()) {
+            return new PageResult<>(list, page.getTotal());
+        }
+        List<HomeServiceOrderItemDetailVO> homeServiceOrderItemDOS =
+                homeServiceOrderItemMapper.selectListByOrderIds(orderIds.toArray(new Long[0]));
+        Map<Long, String> itemsMap = homeServiceOrderItemDOS.stream()
+                .collect(Collectors.groupingBy(HomeServiceOrderItemDetailVO::getHomeServiceOrderId,Collectors.mapping(HomeServiceOrderItemDetailVO::getItemName,Collectors.joining(","))));
+        list.forEach(e->e.setItems(itemsMap.get(e.getId())));
         return new PageResult<>(list, page.getTotal());
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void confirmHomeServiceOrders(Long[] orderIds) {
+        if (orderIds == null || orderIds.length == 0) {
+            return;
+        }
+        List<HomeServiceOrderDO> homeServiceOrderList = homeServiceOrderMapper.selectList(new LambdaQueryWrapperX<HomeServiceOrderDO>()
+                .in(HomeServiceOrderDO::getId, Arrays.asList(orderIds)));
+        for (HomeServiceOrderDO homeServiceOrderDO : homeServiceOrderList) {
+            if (homeServiceOrderDO.getSubsidyArrivalDate() == null) {
+                homeServiceOrderDO.setSubsidyArrivalDate(LocalDate.now());
+            }
+            homeServiceOrderDO.setStatus(1);
+        }
+        homeServiceOrderMapper.updateBatch(homeServiceOrderList);
+    }
+
     private void saveOrderItems(Long orderId, List<Long> serviceItemIds, Long tenantId) {
         if (serviceItemIds == null || serviceItemIds.isEmpty()) {
             return;

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

@@ -6,7 +6,13 @@
         select
             o.id,
             o.order_type as orderType,
+            hei.elder_name as homeElderName,
+            hei.sex as sex,
+            TIMESTAMPDIFF(YEAR, hei.birthday, CURDATE()) AS age,
+            hei.phone as phone,
+            CONCAT_WS(' ', hei.current_live_area, hei.current_live_address) as address,
             o.service_member_id as serviceMemberId,
+            m.name as serviceMemberName,
             o.order_time as orderTime,
             o.service_start_time as serviceStartTime,
             o.service_end_time as serviceEndTime,
@@ -16,6 +22,8 @@
             o.subsidy_amount as subsidyAmount,
             o.self_pay_amount as selfPayAmount,
             o.type,
+            o.subsidy_arrival_date,
+            o.status,
             o.tenant_id as tenantId,
             o.create_time as createTime,
             o.update_time as updateTime,

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff