Преглед изворни кода

新增
1、轮候入住分页列表增加显示当前审批人
2、轮候入住分页列表优先显示不通过状态的数据
BUGFIX
1、解决账单分页列表已缴费列显示不正确的问题
修改
1、重构颐康中心配餐

liangwenxuan пре 2 месеци
родитељ
комит
3b3e36cf79
18 измењених фајлова са 266 додато и 199 уклоњено
  1. 26 5
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
  2. 13 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/bpm/vo/CheckInWaitRecordRespVO.java
  3. 3 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/home/vo/HomeServiceMemeberPageRespVO.java
  4. 3 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/home/vo/HomeServiceMemeberSaveReqVO.java
  5. 4 4
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/yk/YkElderlyInfoController.java
  6. 3 6
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/yk/vo/YkElderlyInfoRespVO.java
  7. 6 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/ExpenseOrderDO.java
  8. 16 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/home/HomeElderlyInfoDO.java
  9. 3 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/home/HomeServiceMemberDO.java
  10. 5 5
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/yk/YkElderlyInfoDO.java
  11. 2 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/yk/YkElderlyInfoMapper.java
  12. 40 93
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseOrderServiceImpl.java
  13. 1 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/home/HomeServiceItemService.java
  14. 4 4
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/yk/YkElderlyInfoService.java
  15. 11 11
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/yk/impl/DeliveryPersonInfoServiceImpl.java
  16. 119 67
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/yk/impl/YkElderlyInfoServiceImpl.java
  17. 1 1
      yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlyCheckInWaitMapper.xml
  18. 6 0
      yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/HomeServiceMemberMapper.xml

+ 26 - 5
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java

@@ -1215,18 +1215,39 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
         }
         List<CheckInWaitRecordRespVO> list = pageResult.getList();
         Set<String> processInstanceIds = new HashSet<>();
-        list.forEach((item) -> {
-            processInstanceIds.add(item.getProcessInstanceId());
-        });
+        list.forEach(item -> processInstanceIds.add(item.getProcessInstanceId()));
+
         List<HistoricProcessInstance> processInstanceList = historyService.createHistoricProcessInstanceQuery()
                 .processInstanceIds(processInstanceIds).list();
-        processInstanceList.forEach((processInstance) -> {
-            list.forEach((record) -> {
+        processInstanceList.forEach(processInstance -> {
+            list.forEach(record -> {
                 if (processInstance.getId().equals(record.getProcessInstanceId())) {
                     record.setStartTaskId(processInstance.getId());
                 }
             });
         });
+
+        // 补充当前审批人:取 /bpm/task/list-by-process-instance-id 逻辑中的最后一个任务的 assigneeUser
+        list.forEach(record -> {
+            List<HistoricTaskInstance> taskList = bpmTaskService.getTaskListByProcessInstanceId(record.getProcessInstanceId(), true);
+            HistoricTaskInstance latestTask = CollUtil.getLast(taskList);
+            if (latestTask == null || StrUtil.isBlank(latestTask.getAssignee())) {
+                return;
+            }
+            Long assigneeUserId = Long.valueOf(latestTask.getAssignee());
+            AdminUserRespDTO assigneeUser = adminUserApi.getUserTenantIgnore(assigneeUserId);
+            if (assigneeUser == null) {
+                return;
+            }
+            CheckInWaitRecordRespVO.ApproverUser approverUser = new CheckInWaitRecordRespVO.ApproverUser();
+            approverUser.setId(assigneeUser.getId());
+            approverUser.setNickname(assigneeUser.getNickname());
+            approverUser.setDeptId(assigneeUser.getDeptId());
+            DeptRespDTO dept = assigneeUser.getDeptId() == null ? null : deptApi.getDeptTenantIgnore(assigneeUser.getDeptId());
+            approverUser.setDeptName(dept == null ? null : dept.getName());
+            record.setAssigneeUser(approverUser);
+        });
+
         return pageResult;
     }
 

+ 13 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/bpm/vo/CheckInWaitRecordRespVO.java

@@ -26,7 +26,20 @@ public class CheckInWaitRecordRespVO {
     private Integer bpmStatus;
     private String processInstanceId;
     private String startTaskId;
+    /**
+     * 当前审批人,来源于 /bpm/task/list-by-process-instance-id 返回列表最后一个任务的 assigneeUser
+     */
+    private ApproverUser assigneeUser;
     private Integer type;
     private String tenantName;
     private LocalDateTime createdTime;
+
+    @Data
+    public static class ApproverUser {
+        private Long id;
+        private String nickname;
+        private String avatar;
+        private Long deptId;
+        private String deptName;
+    }
 }

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

@@ -14,6 +14,9 @@ public class HomeServiceMemeberPageRespVO {
     private String idCard;
     private String sex;
     private String phone;
+    private String avatar;
+    private String liveAddress;
+    private String liveDetail;
     private Long serviceAreaId;
     private String serviceArea;
     private Long serviceDeptId;

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

@@ -12,6 +12,9 @@ public class HomeServiceMemeberSaveReqVO {
     private String idCard;
     private String sex;
     private String phone;
+    private String avatar;
+    private String liveAddress;
+    private String liveDetail;
     private Long serviceAreaId;
     private Long serviceDeptId;
     private Long tenantId;

+ 4 - 4
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/yk/YkElderlyInfoController.java

@@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.module.system.controller.admin.yk.vo.*;
 import cn.iocoder.yudao.module.system.dal.dataobject.yk.YkElderlyDeliveryDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.yk.YkElderlyExpenseRecordDO;
-import cn.iocoder.yudao.module.system.dal.dataobject.yk.YkElderlyInfoDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.home.HomeElderlyInfoDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.yk.YkElderlySelfFundedRecord;
 import cn.iocoder.yudao.module.system.service.yk.YkElderlyInfoService;
 import cn.iocoder.yudao.module.system.service.yk.YkElderlySelfFundedRecordService;
@@ -75,7 +75,7 @@ public class YkElderlyInfoController {
     @Operation(summary = "获得颐康中心长者信息")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
     public CommonResult<YkElderlyInfoRespVO> getElderlyInfo(@RequestParam("id") Long id) {
-        YkElderlyInfoDO elderlyInfo = ykElderlyInfoService.getElderlyInfo(id);
+        HomeElderlyInfoDO elderlyInfo = ykElderlyInfoService.getElderlyInfo(id);
         return success(cn.iocoder.yudao.framework.common.util.object.BeanUtils.toBean(elderlyInfo, YkElderlyInfoRespVO.class));
     }
 
@@ -83,7 +83,7 @@ public class YkElderlyInfoController {
     @Operation(summary = "获得颐康中心长者信息分页")
     @TenantIgnore
     public CommonResult<PageResult<YkElderlyInfoRespVO>> getElderlyInfoPage(@Valid YkElderlyInfoPageReqVO pageVO) {
-        PageResult<YkElderlyInfoDO> pageResult = ykElderlyInfoService.getElderlyInfoPage(pageVO);
+        PageResult<HomeElderlyInfoDO> pageResult = ykElderlyInfoService.getElderlyInfoPage(pageVO);
         return success(cn.iocoder.yudao.framework.common.util.object.BeanUtils.toBean(pageResult, YkElderlyInfoRespVO.class));
     }
 
@@ -113,7 +113,7 @@ public class YkElderlyInfoController {
 //    @Operation(summary = "导出颐康中心长者信息 Excel")
 //    public void exportElderlyInfoExcel(@Valid YkElderlyInfoExportReqVO exportReqVO,
 //              HttpServletResponse response) throws IOException {
-//        List<YkElderlyInfoDO> list = ykElderlyInfoService.getElderlyInfoList(exportReqVO);
+//        List<HomeElderlyInfoDO> list = ykElderlyInfoService.getElderlyInfoList(exportReqVO);
 //        // 导出 Excel
 //        List<YkElderlyInfoRespVO> datas = cn.iocoder.yudao.framework.common.util.object.BeanUtils.toBean(list, YkElderlyInfoRespVO.class);
 //        ExcelUtils.write(response, "颐康中心长者信息.xls", "数据", YkElderlyInfoRespVO.class, datas);

+ 3 - 6
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/yk/vo/YkElderlyInfoRespVO.java

@@ -5,7 +5,6 @@ import lombok.Data;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.util.Date;
 
 @Schema(description = "管理后台 - 颐康中心长者信息 Response VO")
 @Data
@@ -74,12 +73,10 @@ public class YkElderlyInfoRespVO {
     private BigDecimal deliveryFee;
 
 
-    private String createdBy;
+    private String creator;
 
-    private Date createdTime;
+    private String updater;
 
-    private String updatedBy;
-
-    private Date updatedTime;
+    private LocalDateTime updateTime;
 
 }

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

@@ -155,6 +155,12 @@ public class ExpenseOrderDO {
     @TableField(exist = false)
     private BigDecimal otherRoundAmount;
 
+    /**
+     * 已缴费金额
+     */
+    @TableField(exist = false)
+    private BigDecimal paidAmount;
+
 //    /**
 //     * 缴费总额
 //     */

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

@@ -1,6 +1,8 @@
 package cn.iocoder.yudao.module.system.dal.dataobject.home;
 
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseNoDeleteDO;
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
@@ -9,12 +11,14 @@ import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
+import static com.baomidou.mybatisplus.annotation.FieldStrategy.NEVER;
+
 /**
  * 居家长者信息 DO
  */
 @TableName("home_elderly_info")
 @Data
-public class HomeElderlyInfoDO implements Serializable {
+public class HomeElderlyInfoDO extends BaseNoDeleteDO implements Serializable {
 
     @TableId(type = IdType.AUTO)
     private Long id;
@@ -60,5 +64,16 @@ public class HomeElderlyInfoDO implements Serializable {
     private String disease;
     private String medicalHistory;
     private String extraFile;
+    /**
+     * 送工费
+     */
+    private BigDecimal deliveryFee;
+
+    /**
+     * 余额(兼容字段,实际值取 home_elderly_account.amount)
+     */
+    @TableField(exist = false, updateStrategy = NEVER)
+    private BigDecimal balance;
+
     private Long tenantId;
 }

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

@@ -21,6 +21,9 @@ public class HomeServiceMemberDO implements Serializable {
     private String idCard;
     private String sex;
     private String phone;
+    private String avatar;
+    private String liveAddress;
+    private String liveDetail;
     private Long serviceAreaId;
     private Long serviceDeptId;
     private Long tenantId;

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

@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.*;
 
 import java.math.BigDecimal;
-import java.util.Date;
+import java.time.LocalDateTime;
 
 /**
  * 颐康中心长者信息 DO
@@ -113,12 +113,12 @@ public class YkElderlyInfoDO {
     private Integer status;
 
 
-    private String createdBy;
+    private String creator;
 
-    private Date createdTime;
+    private LocalDateTime createTime;
 
-    private String updatedBy;
+    private String updater;
 
-    private Date updatedTime;
+    private LocalDateTime updateTime;
 
 }

+ 2 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/yk/YkElderlyInfoMapper.java

@@ -23,7 +23,7 @@ public interface YkElderlyInfoMapper extends BaseMapperX<YkElderlyInfoDO> {
                 .eqIfPresent(YkElderlyInfoDO::getIdCard, reqVO.getIdCard())
                 .eqIfPresent(YkElderlyInfoDO::getSupportType, reqVO.getSupportType())
                 .eqIfPresent(YkElderlyInfoDO::getSupportStatus, reqVO.getSupportStatus())
-                .betweenIfPresent(YkElderlyInfoDO::getCreatedTime, reqVO.getCreateTime())
+                .betweenIfPresent(YkElderlyInfoDO::getCreateTime, reqVO.getCreateTime())
                 .inIfPresent(YkElderlyInfoDO::getTenantId,reqVO.getTenantIds())
                 .orderByDesc(YkElderlyInfoDO::getId));
     }
@@ -34,7 +34,7 @@ public interface YkElderlyInfoMapper extends BaseMapperX<YkElderlyInfoDO> {
                 .eqIfPresent(YkElderlyInfoDO::getIdCard, reqVO.getIdCard())
                 .eqIfPresent(YkElderlyInfoDO::getSupportType, reqVO.getSupportType())
                 .eqIfPresent(YkElderlyInfoDO::getSupportStatus, reqVO.getSupportStatus())
-                .betweenIfPresent(YkElderlyInfoDO::getCreatedTime, reqVO.getCreateTime())
+                .betweenIfPresent(YkElderlyInfoDO::getCreateTime, reqVO.getCreateTime())
                 .orderByDesc(YkElderlyInfoDO::getId));
     }
 

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

@@ -172,6 +172,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
             BigDecimal mealAmount = BigDecimal.ZERO;
             BigDecimal otherAmount = BigDecimal.ZERO;
             BigDecimal otherRoundAmount = BigDecimal.ZERO;
+            BigDecimal paidAmount = BigDecimal.ZERO;
 
             String fullBedName = buildService.getFullBedName(expenseOrderDO.getElderId());
             expenseOrderDO.setBedName(fullBedName);
@@ -181,6 +182,11 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
             List<ExpenseOrderItemDO> orderItems = expenseOrderItemMapper.selectList(new LambdaQueryWrapperX<ExpenseOrderItemDO>()
                     .eq(ExpenseOrderItemDO::getExpenseOrderId, expenseOrderDO.getId()));
 
+            List<ExpensePayOrderDO> payInfos = expensePayOrderMapper.selectList(new LambdaQueryWrapperX<ExpensePayOrderDO>()
+                    .eq(ExpensePayOrderDO::getExpenseOrderId, expenseOrderDO.getId()));
+            for (ExpensePayOrderDO payInfo : payInfos) {
+                paidAmount = paidAmount.add(payInfo.getRoundPayTwoDecimalAmount() == null ? BigDecimal.ZERO : payInfo.getRoundPayTwoDecimalAmount());
+            }
 
             for (ExpenseOrderItemDO orderItem : orderItems) {
                 if(orderItem.getExpenseSource().equals(BusinessConstants.EXPENSE_ITEM)){
@@ -205,6 +211,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
             expenseOrderDO.setOtherAmount(otherAmount);
             expenseOrderDO.setPayableAmount(bedAmount.add(nurseAmount).add(mealAmount).add(otherAmount).setScale(2, RoundingMode.HALF_UP));
             expenseOrderDO.setOtherRoundAmount(otherRoundAmount);
+            expenseOrderDO.setPaidAmount(paidAmount.setScale(2, RoundingMode.HALF_UP));
         }
 
         return new PageResult<>(list, page.getTotal());
@@ -2381,101 +2388,41 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
 
         // 判断是否是当前月份
         BigDecimal totalAmount = BigDecimal.ZERO;
-        if (billYearMonth.equals(expireYearMonth)) {
-            LocalDate expireDate = expireTime.toInstant()
-                    .atZone(ZoneId.systemDefault())
-                    .toLocalDate();
-
-            int dayOfMonth = expireDate.getDayOfMonth();  // 当前月第几号
-            int monthDays = expireDate.lengthOfMonth();   // 当前月天数
-
-            // 生成账单费用项
-            for (ExpenseItemRespVO item : dataList) {
-                ExpenseOrderItemDO orderItem = new ExpenseOrderItemDO();
-                orderItem.setExpenseOrderId(expenseOrder.getId());
-                orderItem.setSourceExpenseItemId(item.getSourceExpenseItemId());
-                orderItem.setExpenseSource(item.getExpenseSource());
-                orderItem.setCount(item.getCount());
-                orderItem.setItemName(item.getItemName());
-                orderItem.setContractId(item.getContractId());
-                orderItem.setDescription(StringUtils.isBlank(item.getDescription()) ? LocalDateTimeUtil.format(expireDate.withDayOfMonth(1), DatePattern.NORM_DATE_PATTERN)
-                        + "至" + LocalDateTimeUtil.format(expireDate, DatePattern.NORM_DATE_PATTERN) + "的" + item.getItemName() : item.getDescription());
-
-                if (item.getExpenseSource().equals(BusinessConstants.EXPENSE_ITEM)) {
-                    // 计算单价
-                    orderItem.setPrice(item.getPrice());  // 单价
-                    orderItem.setActualPrice(item.getPrice()); // 实际单价
-                    BigDecimal itemTotalAmount = item.getTotalAmount();
-                    BigDecimal dayPrice = itemTotalAmount.divide(BigDecimal.valueOf(monthDays), 8, RoundingMode.DOWN);
-                    BigDecimal actualPrice = dayPrice.multiply(BigDecimal.valueOf(dayOfMonth)).setScale(8, RoundingMode.DOWN);
-                    orderItem.setTotalAmount(actualPrice);  // 总金额
-                    orderItem.setRoundAmount(orderItem.getTotalAmount().setScale(0, RoundingMode.HALF_UP));
-                    orderItem.setRoundTwoDecimalAmount(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
-                    orderItem.setStartDate(billYearMonth.atDay(1));
-                    orderItem.setEndDate(expireDate);
-                } else {
-                    orderItem.setPrice(item.getPrice());  // 单价
-                    orderItem.setActualPrice(item.getPrice()); // 实际单价
-                    orderItem.setTotalAmount(item.getTotalAmount());  // 总金额
-                    orderItem.setRoundAmount(orderItem.getTotalAmount().setScale(0, RoundingMode.HALF_UP));
-                    orderItem.setRoundTwoDecimalAmount(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
-                    if (item.getExpenseSource().equals(BusinessConstants.DISCOUNT_DEDUCTION)) {
-                        addDiscountRecord(elderId, billingMonth, item);
-                    }
-                }
-                orderItem.setCreatedTime(new Date());
-                orderItem.setType(item.getType());
-                orderItem.setItemCategoryName(item.getItemCategory());
-                orderItem.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
-                orderItem.setTenantId(expenseOrder.getTenantId());
-                expenseOrderItemMapper.insert(orderItem);
-
-                // 判断是否生成过账单
-                DailyExpensesDO dailyExpenses = dailyExpensesMapper.selectById(item.getSourceExpenseItemId());
-                if (dailyExpenses != null) {
-                    dailyExpenses.setIsGenerateBill(BooleanEnum.TRUE.getValue());
-                    dailyExpenses.setExpenseOrderNumber(expenseOrder.getBillOrderNumber());
-                    dailyExpensesMapper.updateById(dailyExpenses);
-                }
-                totalAmount = totalAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.DOWN));
+        // 生成账单费用项
+        for (ExpenseItemRespVO item : dataList) {
+            ExpenseOrderItemDO orderItem = new ExpenseOrderItemDO();
+            orderItem.setExpenseOrderId(expenseOrder.getId());
+            orderItem.setSourceExpenseItemId(item.getSourceExpenseItemId());
+            orderItem.setExpenseSource(item.getExpenseSource());
+            orderItem.setCount(item.getCount());
+            orderItem.setItemName(item.getItemName());
+            orderItem.setPrice(item.getPrice());  // 单价
+            orderItem.setActualPrice(item.getPrice()); // 实际单价
+            orderItem.setTotalAmount(item.getTotalAmount());  // 总金额
+            orderItem.setRoundAmount(orderItem.getTotalAmount().setScale(0, RoundingMode.HALF_UP));
+            orderItem.setRoundTwoDecimalAmount(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
+            orderItem.setCreatedTime(new Date());
+            orderItem.setType(item.getType());
+            orderItem.setItemCategoryName(item.getItemCategory());
+            orderItem.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
+            orderItem.setDescription(StringUtils.isBlank(item.getDescription()) ? LocalDateTimeUtil.format(yearMonth.atDay(1), DatePattern.NORM_DATE_PATTERN)
+                    + "至" + LocalDateTimeUtil.format(yearMonth.atEndOfMonth(), DatePattern.NORM_DATE_PATTERN) + "的" + item.getItemName() : item.getDescription());
+            orderItem.setTenantId(expenseOrder.getTenantId());
+            orderItem.setStartDate(billYearMonth.atDay(1));
+            orderItem.setEndDate(billYearMonth.atEndOfMonth());
+            orderItem.setContractId(item.getContractId());
+            expenseOrderItemMapper.insert(orderItem);
+            if (item.getExpenseSource().equals(BusinessConstants.DISCOUNT_DEDUCTION)) {
+                addDiscountRecord(elderId, billingMonth, item);
             }
-        } else {
-            // 生成账单费用项
-            for (ExpenseItemRespVO item : dataList) {
-                ExpenseOrderItemDO orderItem = new ExpenseOrderItemDO();
-                orderItem.setExpenseOrderId(expenseOrder.getId());
-                orderItem.setSourceExpenseItemId(item.getSourceExpenseItemId());
-                orderItem.setExpenseSource(item.getExpenseSource());
-                orderItem.setCount(item.getCount());
-                orderItem.setItemName(item.getItemName());
-                orderItem.setPrice(item.getPrice());  // 单价
-                orderItem.setActualPrice(item.getPrice()); // 实际单价
-                orderItem.setTotalAmount(item.getTotalAmount());  // 总金额
-                orderItem.setRoundAmount(orderItem.getTotalAmount().setScale(0, RoundingMode.HALF_UP));
-                orderItem.setRoundTwoDecimalAmount(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
-                orderItem.setCreatedTime(new Date());
-                orderItem.setType(item.getType());
-                orderItem.setItemCategoryName(item.getItemCategory());
-                orderItem.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
-                orderItem.setDescription(StringUtils.isBlank(item.getDescription()) ? LocalDateTimeUtil.format(yearMonth.atDay(1), DatePattern.NORM_DATE_PATTERN)
-                        + "至" + LocalDateTimeUtil.format(yearMonth.atEndOfMonth(), DatePattern.NORM_DATE_PATTERN) + "的" + item.getItemName() : item.getDescription());
-                orderItem.setTenantId(expenseOrder.getTenantId());
-                orderItem.setStartDate(billYearMonth.atDay(1));
-                orderItem.setEndDate(billYearMonth.atEndOfMonth());
-                orderItem.setContractId(item.getContractId());
-                expenseOrderItemMapper.insert(orderItem);
-                if (item.getExpenseSource().equals(BusinessConstants.DISCOUNT_DEDUCTION)) {
-                    addDiscountRecord(elderId, billingMonth, item);
-                }
-                // 判断是否生成过账单
-                DailyExpensesDO dailyExpenses = dailyExpensesMapper.selectById(item.getSourceExpenseItemId());
-                if (dailyExpenses != null) {
-                    dailyExpenses.setIsGenerateBill(BooleanEnum.TRUE.getValue());
-                    dailyExpenses.setExpenseOrderNumber(expenseOrder.getBillOrderNumber());
-                    dailyExpensesMapper.updateById(dailyExpenses);
-                }
-                totalAmount = totalAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.DOWN));
+            // 判断是否生成过账单
+            DailyExpensesDO dailyExpenses = dailyExpensesMapper.selectById(item.getSourceExpenseItemId());
+            if (dailyExpenses != null) {
+                dailyExpenses.setIsGenerateBill(BooleanEnum.TRUE.getValue());
+                dailyExpenses.setExpenseOrderNumber(expenseOrder.getBillOrderNumber());
+                dailyExpensesMapper.updateById(dailyExpenses);
             }
+            totalAmount = totalAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.DOWN));
         }
 
         expenseOrder.setActualAmount(totalAmount);

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

@@ -20,3 +20,4 @@ public interface HomeServiceItemService {
 }
 
 
+

+ 4 - 4
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/yk/YkElderlyInfoService.java

@@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.system.controller.admin.yk.vo.*;
 import cn.iocoder.yudao.module.system.dal.dataobject.yk.YkElderlyDeliveryDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.yk.YkElderlyExpenseRecordDO;
-import cn.iocoder.yudao.module.system.dal.dataobject.yk.YkElderlyInfoDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.home.HomeElderlyInfoDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.yk.YkElderlyPaymentRecordDO;
 
 import javax.validation.Valid;
@@ -45,7 +45,7 @@ public interface YkElderlyInfoService {
      * @param id 编号
      * @return 长者信息
      */
-    YkElderlyInfoDO getElderlyInfo(Long id);
+    HomeElderlyInfoDO getElderlyInfo(Long id);
 
     /**
      * 获得长者信息分页
@@ -53,7 +53,7 @@ public interface YkElderlyInfoService {
      * @param pageReqVO 分页查询
      * @return 长者信息分页
      */
-    PageResult<YkElderlyInfoDO> getElderlyInfoPage(YkElderlyInfoPageReqVO pageReqVO);
+    PageResult<HomeElderlyInfoDO> getElderlyInfoPage(YkElderlyInfoPageReqVO pageReqVO);
 
     /**
      * 获得长者信息列表, 用于 Excel 导出
@@ -61,7 +61,7 @@ public interface YkElderlyInfoService {
      * @param exportReqVO 查询条件
      * @return 长者信息列表
      */
-    List<YkElderlyInfoDO> getElderlyInfoList(YkElderlyInfoExportReqVO exportReqVO);
+    List<HomeElderlyInfoDO> getElderlyInfoList(YkElderlyInfoExportReqVO exportReqVO);
 
     void batchConfirm(YkMealBatchConfirmReqVO reqVO);
 

+ 11 - 11
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/yk/impl/DeliveryPersonInfoServiceImpl.java

@@ -11,10 +11,10 @@ import cn.iocoder.yudao.module.system.controller.admin.yk.vo.deliveryPerson.Deli
 import cn.iocoder.yudao.module.system.controller.admin.yk.vo.deliveryPerson.DeliveryPersonInfoUpdateReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.yk.YkDeliveryStaffInfoDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.yk.YkElderlyDeliveryDO;
-import cn.iocoder.yudao.module.system.dal.dataobject.yk.YkElderlyInfoDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.home.HomeElderlyInfoDO;
 import cn.iocoder.yudao.module.system.dal.mysql.yk.YkDeliveryStaffInfoMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.yk.YkElderlyDeliveryMapper;
-import cn.iocoder.yudao.module.system.dal.mysql.yk.YkElderlyInfoMapper;
+import cn.iocoder.yudao.module.system.dal.mysql.home.HomeElderlyInfoMapper;
 import cn.iocoder.yudao.module.system.service.yk.DeliveryPersonInfoService;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
@@ -38,7 +38,7 @@ public class DeliveryPersonInfoServiceImpl implements DeliveryPersonInfoService
     @Resource
     private YkElderlyDeliveryMapper ykElderlyDeliveryMapper;
     @Resource
-    private YkElderlyInfoMapper ykElderlyInfoMapper;
+    private HomeElderlyInfoMapper homeElderlyInfoMapper;
 
     @Override
     public Long createDeliveryPersonInfo(DeliveryPersonInfoCreateReqVO createReqVO) {
@@ -138,11 +138,11 @@ public class DeliveryPersonInfoServiceImpl implements DeliveryPersonInfoService
         Long totalMeals = ykElderlyDeliveryMapper.selectCount(deliveryWrapper);
         result.put("totalMeals", totalMeals.intValue());
 
-        List<YkElderlyInfoDO> ykElderlyInfoList = ykElderlyInfoMapper.selectList(new LambdaQueryWrapperX<YkElderlyInfoDO>().eqIfPresent(YkElderlyInfoDO::getTenantId, tenantId));
+        List<HomeElderlyInfoDO> elderlyInfoList = homeElderlyInfoMapper.selectList(new LambdaQueryWrapperX<HomeElderlyInfoDO>().eqIfPresent(HomeElderlyInfoDO::getTenantId, tenantId));
 
-        // 计算ykElderlyInfoList里面每个长者的余额总和
-        BigDecimal totalAmount = ykElderlyInfoList.stream()
-                .map(YkElderlyInfoDO::getBalance)
+        // 计算elderlyInfoList里面每个长者的余额总和
+        BigDecimal totalAmount = elderlyInfoList.stream()
+                .map(HomeElderlyInfoDO::getBalance)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
         result.put("totalAmount", totalAmount);
         return result;
@@ -158,11 +158,11 @@ public class DeliveryPersonInfoServiceImpl implements DeliveryPersonInfoService
 
         Long confirmedMeals = ykElderlyDeliveryMapper.selectCount(deliveryWrapper);
         result.put("confirmedMeals", confirmedMeals.intValue());
-        List<YkElderlyInfoDO> ykElderlyInfoList = ykElderlyInfoMapper.selectList(new LambdaQueryWrapperX<YkElderlyInfoDO>().eqIfPresent(YkElderlyInfoDO::getTenantId, tenantId));
+        List<HomeElderlyInfoDO> elderlyInfoList = homeElderlyInfoMapper.selectList(new LambdaQueryWrapperX<HomeElderlyInfoDO>().eqIfPresent(HomeElderlyInfoDO::getTenantId, tenantId));
 
-        // 计算ykElderlyInfoList里面每个长者的余额总和
-        BigDecimal totalAmount = ykElderlyInfoList.stream()
-                .map(YkElderlyInfoDO::getBalance)
+        // 计算elderlyInfoList里面每个长者的余额总和
+        BigDecimal totalAmount = elderlyInfoList.stream()
+                .map(HomeElderlyInfoDO::getBalance)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
         result.put("totalAmount", totalAmount);
         return result;

+ 119 - 67
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/yk/impl/YkElderlyInfoServiceImpl.java

@@ -9,7 +9,11 @@ import cn.iocoder.yudao.module.system.controller.admin.yk.vo.*;
 import cn.iocoder.yudao.module.system.convert.excel.LocalDateTimeConvert;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyInfoDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.restaurant.DishesOrderItemDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.home.HomeElderlyInfoDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.yk.*;
+import cn.iocoder.yudao.module.system.dal.dataobject.home.HomeElderlyAccountDO;
+import cn.iocoder.yudao.module.system.dal.mysql.home.HomeElderlyAccountMapper;
+import cn.iocoder.yudao.module.system.dal.mysql.home.HomeElderlyInfoMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.yk.*;
 import cn.iocoder.yudao.module.system.service.yk.YkElderlyInfoService;
 import com.alibaba.excel.annotation.ExcelProperty;
@@ -44,7 +48,10 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.ELDERLY_IN
 public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
 
     @Resource
-    private YkElderlyInfoMapper ykElderlyInfoMapper;
+    private HomeElderlyInfoMapper homeElderlyInfoMapper;
+    @Resource
+    private HomeElderlyAccountMapper homeElderlyAccountMapper;
+
     @Resource
     private YkElderlyDeliveryMapper ykElderlyDeliveryMapper;
     @Resource
@@ -58,37 +65,35 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
     @Override
     public Long createElderlyInfo(YkElderlyInfoSaveReqVO createReqVO) {
         // 检查是否已存在相同身份证号的长者
-        YkElderlyInfoDO existingElderlyInfo = ykElderlyInfoMapper.selectOne(new LambdaQueryWrapperX<YkElderlyInfoDO>()
-                .eq(YkElderlyInfoDO::getIdCard, createReqVO.getIdCard()));
+        HomeElderlyInfoDO existingElderlyInfo = homeElderlyInfoMapper.selectOne(new LambdaQueryWrapperX<HomeElderlyInfoDO>()
+                .eq(HomeElderlyInfoDO::getIdCard, createReqVO.getIdCard()));
 
         if (existingElderlyInfo != null) {
-            // 如果长者已存在,更新字段但保留余额和送工费
-            BigDecimal originalBalance = existingElderlyInfo.getBalance();
+            // 如果长者已存在,更新字段但保留送工费
             BigDecimal originalDeliveryFee = existingElderlyInfo.getDeliveryFee();
 
             // 将新信息复制到现有对象中
-            YkElderlyInfoDO updateObj = BeanUtils.toBean(createReqVO, YkElderlyInfoDO.class);
+            HomeElderlyInfoDO updateObj = BeanUtils.toBean(createReqVO, HomeElderlyInfoDO.class);
             updateObj.setId(existingElderlyInfo.getId());
-            // 保留原有的余额和送工费
-            updateObj.setBalance(originalBalance);
+            // 保留原有的送工费
             updateObj.setDeliveryFee(originalDeliveryFee);
             // 保留原有的创建信息
-            updateObj.setCreatedBy(existingElderlyInfo.getCreatedBy());
-            updateObj.setCreatedTime(existingElderlyInfo.getCreatedTime());
+            updateObj.setCreator(existingElderlyInfo.getCreator());
+            updateObj.setCreateTime(existingElderlyInfo.getCreateTime());
             // 更新修改信息
-            updateObj.setUpdatedBy(SecurityFrameworkUtils.getLoginUserNickname());
-            updateObj.setUpdatedTime(new Date());
+            updateObj.setUpdater(SecurityFrameworkUtils.getLoginUserNickname());
+            updateObj.setUpdateTime(LocalDateTime.now());
             updateObj.setTenantId(createReqVO.getTenantId() == null ? TenantContextHolder.getTenantId() : createReqVO.getTenantId());
 
-            ykElderlyInfoMapper.updateById(updateObj);
+            homeElderlyInfoMapper.updateById(updateObj);
             return existingElderlyInfo.getId();
         } else {
             // 如果长者不存在,新增
-            YkElderlyInfoDO elderlyInfo = BeanUtils.toBean(createReqVO, YkElderlyInfoDO.class);
-            elderlyInfo.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
-            elderlyInfo.setCreatedTime(new Date());
+            HomeElderlyInfoDO elderlyInfo = BeanUtils.toBean(createReqVO, HomeElderlyInfoDO.class);
+            elderlyInfo.setCreator(SecurityFrameworkUtils.getLoginUserNickname());
+            elderlyInfo.setCreateTime(LocalDateTime.now());
             elderlyInfo.setTenantId(createReqVO.getTenantId() == null ? TenantContextHolder.getTenantId() : createReqVO.getTenantId());
-            ykElderlyInfoMapper.insert(elderlyInfo);
+            homeElderlyInfoMapper.insert(elderlyInfo);
             return elderlyInfo.getId();
         }
     }
@@ -98,8 +103,8 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
         // 校验存在
         validateElderlyInfoExists(updateReqVO.getId());
         // 更新
-        YkElderlyInfoDO updateObj = BeanUtils.toBean(updateReqVO, YkElderlyInfoDO.class);
-        ykElderlyInfoMapper.updateById(updateObj);
+        HomeElderlyInfoDO updateObj = BeanUtils.toBean(updateReqVO, HomeElderlyInfoDO.class);
+        homeElderlyInfoMapper.updateById(updateObj);
     }
 
     @Override
@@ -107,54 +112,60 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
         // 校验存在
         validateElderlyInfoExists(id);
         // 删除
-        ykElderlyInfoMapper.deleteById(id);
+        homeElderlyInfoMapper.deleteById(id);
     }
 
     private void validateElderlyInfoExists(Long id) {
-        if (ykElderlyInfoMapper.selectById(id) == null) {
+        if (homeElderlyInfoMapper.selectById(id) == null) {
             throw exception(ELDERLY_INFO_NOT_EXISTS);
         }
     }
 
     @Override
-    public YkElderlyInfoDO getElderlyInfo(Long id) {
-        return ykElderlyInfoMapper.selectById(id);
+    public HomeElderlyInfoDO getElderlyInfo(Long id) {
+        HomeElderlyInfoDO elderlyInfo = homeElderlyInfoMapper.selectById(id);
+        fillBalanceFromAccount(elderlyInfo);
+        return elderlyInfo;
     }
 
     @Override
-    public PageResult<YkElderlyInfoDO> getElderlyInfoPage(YkElderlyInfoPageReqVO pageReqVO) {
-        return ykElderlyInfoMapper.selectPage(pageReqVO);
+    public PageResult<HomeElderlyInfoDO> getElderlyInfoPage(YkElderlyInfoPageReqVO pageReqVO) {
+        PageResult<HomeElderlyInfoDO> pageResult = homeElderlyInfoMapper.selectPage(pageReqVO);
+        fillBalanceFromAccount(pageResult.getList());
+        return pageResult;
     }
 
     @Override
-    public List<YkElderlyInfoDO> getElderlyInfoList(YkElderlyInfoExportReqVO exportReqVO) {
-        return ykElderlyInfoMapper.selectList(exportReqVO);
+    public List<HomeElderlyInfoDO> getElderlyInfoList(YkElderlyInfoExportReqVO exportReqVO) {
+        List<HomeElderlyInfoDO> list = homeElderlyInfoMapper.selectList(exportReqVO);
+        fillBalanceFromAccount(list);
+        return list;
     }
 
     @Override
     public PageResult<YkElderlyMealRespVO> getElderlyMealPage(YkElderlyMealPageReqVO pageReqVO) {
         Page<YkElderlyMealRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
-        List<YkElderlyMealRespVO> ykElderlyMealRespVOPageResult = ykElderlyInfoMapper.selectElderlyMealPage(page, pageReqVO);
+        List<YkElderlyMealRespVO> ykElderlyMealRespVOPageResult = homeElderlyInfoMapper.selectElderlyMealPage(page, pageReqVO);
         return new PageResult<>(ykElderlyMealRespVOPageResult, page.getTotal());
     }
 
     @Override
     public void batchConfirm(YkMealBatchConfirmReqVO reqVO) {
         Long tenantId = reqVO.getTenantId();
-        List<YkElderlyInfoDO> ykElderlyInfoList = ykElderlyInfoMapper.selectList(new LambdaQueryWrapperX<YkElderlyInfoDO>()
-                .eqIfPresent(YkElderlyInfoDO::getTenantId, tenantId));
-        List<YkElderlyInfoDO> filteredList = ykElderlyInfoList.stream()
+        List<HomeElderlyInfoDO> homeElderlyInfoList = homeElderlyInfoMapper.selectList(new LambdaQueryWrapperX<HomeElderlyInfoDO>()
+                .eqIfPresent(HomeElderlyInfoDO::getTenantId, tenantId));
+        List<HomeElderlyInfoDO> filteredList = homeElderlyInfoList.stream()
                 .filter(elderlyInfo -> !reqVO.getIds().contains(elderlyInfo.getId()))
                 .collect(Collectors.toList());
         //生成送餐记录
-        for (YkElderlyInfoDO ykElderlyInfoDO : filteredList) {
+        for (HomeElderlyInfoDO homeElderlyInfoDO : filteredList) {
             YkDeliveryStaffInfoDO ykDeliveryStaffInfoDO = deliveryPersonInfoMapper.selectOne(new LambdaQueryWrapperX<YkDeliveryStaffInfoDO>()
-                    .likeIfPresent(YkDeliveryStaffInfoDO::getElderlyIds, String.valueOf(ykElderlyInfoDO.getId())));
+                    .likeIfPresent(YkDeliveryStaffInfoDO::getElderlyIds, String.valueOf(homeElderlyInfoDO.getId())));
             YkElderlyDeliveryDO ykElderlyDeliveryDO = new YkElderlyDeliveryDO();
-            ykElderlyDeliveryDO.setYkElderId(ykElderlyInfoDO.getId());
-            ykElderlyDeliveryDO.setYkElderName(ykElderlyInfoDO.getElderName());
-            ykElderlyDeliveryDO.setPhone(ykElderlyInfoDO.getPersonalPhone());
-            ykElderlyDeliveryDO.setDeliveryAddress(ykElderlyInfoDO.getCurrentAddress());
+            ykElderlyDeliveryDO.setYkElderId(homeElderlyInfoDO.getId());
+            ykElderlyDeliveryDO.setYkElderName(homeElderlyInfoDO.getElderName());
+            ykElderlyDeliveryDO.setPhone(homeElderlyInfoDO.getPhone());
+            ykElderlyDeliveryDO.setDeliveryAddress(homeElderlyInfoDO.getCurrentLiveAddress());
             ykElderlyDeliveryDO.setDeliveryDate(reqVO.getDate());
             ykElderlyDeliveryDO.setMealStandard(reqVO.getMealStandard());
             ykElderlyDeliveryDO.setMealType(reqVO.getMealType());
@@ -171,7 +182,8 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
             recordDO.setExpenseType(1);
             recordDO.setYkElderId(ykElderlyInfoDO.getId());
             recordDO.setAmount(ykElderlyDeliveryDO.getMealStandard());
-            recordDO.setBalance(ykElderlyInfoDO.getBalance().subtract(recordDO.getAmount()));
+            BigDecimal accountAmount = getElderlyAccountAmount(ykElderlyInfoDO.getId());
+            recordDO.setBalance(accountAmount.subtract(recordDO.getAmount()));
             recordDO.setRemarks("长者送餐");
             recordDO.setCreatedTime(new Date());
             recordDO.setTenantId(tenantId);
@@ -205,11 +217,11 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
         delivery.setDeliveryFee(reqVO.getAmount());
         ykElderlyDeliveryMapper.updateById(delivery);
 
-        YkElderlyInfoDO ykElderlyInfoDO = ykElderlyInfoMapper.selectById(delivery.getYkElderId());
+        HomeElderlyInfoDO ykElderlyInfoDO = homeElderlyInfoMapper.selectById(delivery.getYkElderId());
         BigDecimal deliveryFee = ykElderlyInfoDO.getDeliveryFee();
         BigDecimal afterAmount = deliveryFee.add(reqVO.getAmount());
         ykElderlyInfoDO.setDeliveryFee(afterAmount);
-        ykElderlyInfoMapper.updateById(ykElderlyInfoDO);
+        homeElderlyInfoMapper.updateById(ykElderlyInfoDO);
 
         //生成费用变动记录
         YkElderlyExpenseRecordDO recordDO = new YkElderlyExpenseRecordDO();
@@ -238,7 +250,7 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
 //            YkElderlyExpenseRecordImportVO importVO = dataList.get(i);
 //            try {
 //                //查询长者
-//                YkElderlyInfoDO ykElderlyInfoDO = ykElderlyInfoMapper.selectOne(new LambdaQueryWrapperX<YkElderlyInfoDO>()
+//                YkElderlyInfoDO ykElderlyInfoDO = homeElderlyInfoMapper.selectOne(new LambdaQueryWrapperX<YkElderlyInfoDO>()
 //                        .eq(YkElderlyInfoDO::getElderName, importVO.getServiceObj())
 //                        .eq(YkElderlyInfoDO::getIdCard, importVO.getIdCard()));
 //
@@ -278,7 +290,7 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
 //
 //                //更新颐康长者表的余额
 //                ykElderlyInfoDO.setBalance(recordDO.getBalance());
-//                ykElderlyInfoMapper.updateById(ykElderlyInfoDO);
+//                homeElderlyInfoMapper.updateById(ykElderlyInfoDO);
 //
 //            } catch (Exception e) {
 //                failCount++;
@@ -304,9 +316,9 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
             YkElderlyExpenseRecordImportVO importVO = importVOList.get(i);
             try {
                 //查询长者
-                YkElderlyInfoDO ykElderlyInfoDO = ykElderlyInfoMapper.selectOne(new LambdaQueryWrapperX<YkElderlyInfoDO>()
-                        .eq(YkElderlyInfoDO::getElderName, importVO.getServiceObj())
-                        .eq(YkElderlyInfoDO::getIdCard, importVO.getIdCard()));
+                HomeElderlyInfoDO ykElderlyInfoDO = homeElderlyInfoMapper.selectOne(new LambdaQueryWrapperX<HomeElderlyInfoDO>()
+                        .eq(HomeElderlyInfoDO::getElderName, importVO.getServiceObj())
+                        .eq(HomeElderlyInfoDO::getIdCard, importVO.getIdCard()));
 
                 if (ykElderlyInfoDO == null) {
                     failCount++;
@@ -367,9 +379,8 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
                     ykElderlyExpenseRecordMapper.insert(recordDO);
                     successCount++;
 
-                    //更新颐康长者表的余额
-                    ykElderlyInfoDO.setBalance(recordDO.getBalance());
-                    ykElderlyInfoMapper.updateById(ykElderlyInfoDO);
+                    //更新长者账户余额
+                    updateElderlyAccountAmount(ykElderlyInfoDO.getId(), recordDO.getBalance());
 
                     // 自动确认:查询该日期内是否有收款记录未确认,金额匹配则相互确认
                     String confirmMsg = autoConfirmExpenseRecord(recordDO);
@@ -404,9 +415,9 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
             YkElderlyExpenseRecordWeChatImportVO importVO = importVOList.get(i);
             try {
                 //查询长者
-                YkElderlyInfoDO ykElderlyInfoDO = ykElderlyInfoMapper.selectOne(new LambdaQueryWrapperX<YkElderlyInfoDO>()
-                        .eq(YkElderlyInfoDO::getElderName, importVO.getServiceObj())
-                        .eq(YkElderlyInfoDO::getIdCard, importVO.getIdCard()));
+                HomeElderlyInfoDO ykElderlyInfoDO = homeElderlyInfoMapper.selectOne(new LambdaQueryWrapperX<HomeElderlyInfoDO>()
+                        .eq(HomeElderlyInfoDO::getElderName, importVO.getServiceObj())
+                        .eq(HomeElderlyInfoDO::getIdCard, importVO.getIdCard()));
 
                 if (ykElderlyInfoDO == null) {
                     failCount++;
@@ -451,10 +462,9 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
                     ykElderlyExpenseRecordMapper.insert(recordDO);
                     successCount++;
 
-                    //更新颐康长者表的余额
-                    ykElderlyInfoDO.setBalance(recordDO.getBalance());
-                    ykElderlyInfoMapper.updateById(ykElderlyInfoDO);
-                    
+                    //更新长者账户余额
+                    updateElderlyAccountAmount(ykElderlyInfoDO.getId(), recordDO.getBalance());
+
                     // 自动确认:查询该日期内是否有收款记录未确认,金额匹配则相互确认
                     String confirmMsg = autoConfirmExpenseRecord(recordDO);
                     if (confirmMsg != null) {
@@ -591,13 +601,13 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
         YkElderlyExpenseRecordDO ykElderlyExpenseRecordDO = ykElderlyExpenseRecordMapper.selectById(reqVO.getId());
 
         // 查询长者信息
-        YkElderlyInfoDO elderlyInfo = ykElderlyInfoMapper.selectById(ykElderlyExpenseRecordDO.getYkElderId());
+        HomeElderlyInfoDO elderlyInfo = homeElderlyInfoMapper.selectById(ykElderlyExpenseRecordDO.getYkElderId());
         if (elderlyInfo == null) {
             throw exception(ELDERLY_INFO_NOT_EXISTS);
         }
 
         // 获取变更前余额
-        BigDecimal balanceBefore = elderlyInfo.getBalance();
+        BigDecimal balanceBefore = getElderlyAccountAmount(elderlyInfo.getId());
         // 设置变更后余额为指定值(不累加)
         BigDecimal balanceAfter = reqVO.getAmount();
 
@@ -622,9 +632,8 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
 
         ykElderlyExpenseRecordMapper.insert(recordDO);
 
-        // 更新长者余额为指定值(不累加)
-        elderlyInfo.setBalance(balanceAfter);
-        ykElderlyInfoMapper.updateById(elderlyInfo);
+        // 更新长者账户余额为指定值(不累加)
+        updateElderlyAccountAmount(elderlyInfo.getId(), balanceAfter);
 
     }
 
@@ -633,7 +642,7 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
         YkElderlyExpenseRecordDO ykElderlyExpenseRecordDO = ykElderlyExpenseRecordMapper.selectById(reqVO.getId());
 
         // 查询长者信息
-        YkElderlyInfoDO elderlyInfo = ykElderlyInfoMapper.selectById(ykElderlyExpenseRecordDO.getYkElderId());
+        HomeElderlyInfoDO elderlyInfo = homeElderlyInfoMapper.selectById(ykElderlyExpenseRecordDO.getYkElderId());
         if (elderlyInfo == null) {
             throw exception(ELDERLY_INFO_NOT_EXISTS);
         }
@@ -664,7 +673,8 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
 
 
         elderlyInfo.setDeliveryFee(feeAfter);
-        ykElderlyInfoMapper.updateById(elderlyInfo);
+        homeElderlyInfoMapper.updateById(elderlyInfo);
+        updateElderlyAccountAmount(elderlyInfo.getId(), updateBalance);
     }
 
     @Override
@@ -692,7 +702,7 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
         YkElderlyDeliveryDO ykElderlyDeliveryDO = ykElderlyDeliveryMapper.selectById(reqVO.getMealId());
 
         // 查询长者信息
-        YkElderlyInfoDO elderlyInfo = ykElderlyInfoMapper.selectById(reqVO.getElderlyId());
+        HomeElderlyInfoDO elderlyInfo = homeElderlyInfoMapper.selectById(reqVO.getElderlyId());
         if (elderlyInfo == null) {
             throw exception(ELDERLY_INFO_NOT_EXISTS);
         }
@@ -702,14 +712,15 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
         // 设置变更后餐标为指定值
         BigDecimal feeAfter = reqVO.getMealStandard();
         BigDecimal updateFee = feeAfter.subtract(feeBefore);
-        BigDecimal updateBalance = elderlyInfo.getBalance().subtract(updateFee);
+        BigDecimal balanceBefore = getElderlyAccountAmount(elderlyInfo.getId());
+        BigDecimal updateBalance = balanceBefore.subtract(updateFee);
         // 创建费用变动记录
         YkElderlyExpenseRecordDO recordDO = new YkElderlyExpenseRecordDO();
         recordDO.setType(feeAfter.compareTo(feeBefore) > 0 ? 1 : 3); // 1:增加 3:减少
         recordDO.setExpenseType(2); // 工费类型
         recordDO.setYkElderId(elderlyInfo.getId());
         recordDO.setAmount(feeAfter);
-        recordDO.setConsumptionBefore(elderlyInfo.getBalance()); // 变更前送工费
+        recordDO.setConsumptionBefore(balanceBefore); // 变更前余额
         recordDO.setConsumptionAfter(updateBalance); // 变更后送工费
         recordDO.setRemarks(reqVO.getRemark());
         recordDO.setBalance(updateBalance);
@@ -723,15 +734,56 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
 
 
         elderlyInfo.setDeliveryFee(feeAfter);
-        ykElderlyInfoMapper.updateById(elderlyInfo);
+        homeElderlyInfoMapper.updateById(elderlyInfo);
     }
     private BigDecimal safeAmount(BigDecimal amount) {
         return amount == null ? BigDecimal.ZERO : amount;
     }
 
+    private void fillBalanceFromAccount(HomeElderlyInfoDO elderlyInfo) {
+        if (elderlyInfo == null) {
+            return;
+        }
+        elderlyInfo.setBalance(getElderlyAccountAmount(elderlyInfo.getId()));
+    }
+
+    private void fillBalanceFromAccount(List<HomeElderlyInfoDO> elderlyInfoList) {
+        if (elderlyInfoList == null || elderlyInfoList.isEmpty()) {
+            return;
+        }
+        elderlyInfoList.forEach(this::fillBalanceFromAccount);
+    }
+
+    private BigDecimal getElderlyAccountAmount(Long elderlyId) {
+        HomeElderlyAccountDO accountDO = homeElderlyAccountMapper.selectOne(
+                new LambdaQueryWrapperX<HomeElderlyAccountDO>()
+                        .eq(HomeElderlyAccountDO::getHomeElderId, elderlyId)
+                        .last("limit 1")
+        );
+        return accountDO == null || accountDO.getAmount() == null ? BigDecimal.ZERO : accountDO.getAmount();
+    }
+
+    private void updateElderlyAccountAmount(Long elderlyId, BigDecimal amount) {
+        HomeElderlyAccountDO accountDO = homeElderlyAccountMapper.selectOne(
+                new LambdaQueryWrapperX<HomeElderlyAccountDO>()
+                        .eq(HomeElderlyAccountDO::getHomeElderId, elderlyId)
+                        .last("limit 1")
+        );
+        if (accountDO == null) {
+            accountDO = new HomeElderlyAccountDO();
+            accountDO.setHomeElderId(elderlyId);
+            accountDO.setAmount(safeAmount(amount));
+            accountDO.setTenantId(TenantContextHolder.getTenantId());
+            homeElderlyAccountMapper.insert(accountDO);
+            return;
+        }
+        accountDO.setAmount(safeAmount(amount));
+        homeElderlyAccountMapper.updateById(accountDO);
+    }
+
     @Override
     public void batchDeleteElderlyInfo(List<Long> ids) {
-        ykElderlyInfoMapper.deleteBatchIds(ids);
+        homeElderlyInfoMapper.deleteBatchIds(ids);
     }
 
     @Override

+ 1 - 1
yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlyCheckInWaitMapper.xml

@@ -29,7 +29,7 @@
                 #{id}
             </foreach>
         </if>
-        ORDER BY eciw.create_time DESC
+        ORDER BY bbf.status DESC,eciw.create_time DESC
     </select>
 
 </mapper>

+ 6 - 0
yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/HomeServiceMemberMapper.xml

@@ -9,6 +9,9 @@
             m.id_card as idCard,
             m.sex,
             m.phone,
+            m.avatar,
+            m.live_address as liveAddress,
+            m.live_detail as liveDetail,
             m.service_area_id as serviceAreaId,
             a.area as serviceArea,
             m.service_dept_id as serviceDeptId,
@@ -56,6 +59,9 @@
             m.id_card as idCard,
             m.sex,
             m.phone,
+            m.avatar,
+            m.live_address as liveAddress,
+            m.live_detail as liveDetail,
             m.service_area_id as serviceAreaId,
             a.area as serviceArea,
             m.service_dept_id as serviceDeptId,