Ver Fonte

新增
1、新增针对某个费用明细可以部分缴费功能
2、居家长者信息增加显示账户信息
BUGFIX
1、修复账单分页列表显示错误问题
2、解决评估表模板没有赋值机构id问题
3、解决重构颐康中心配餐出现的BUG

liangwenxuan há 2 meses atrás
pai
commit
2c2d190db6
11 ficheiros alterados com 198 adições e 118 exclusões
  1. 4 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/home/HomeServiceMemberController.java
  2. 6 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/home/vo/HomeElderlyInfoDetailRespVO.java
  3. 2 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/yk/YkElderlyInfoController.java
  4. 3 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/home/HomeElderlyInfoDO.java
  5. 2 5
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/home/HomeServiceElderRelationDO.java
  6. 40 18
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseOrderServiceImpl.java
  7. 2 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/SysEvaluationProcessServiceImpl.java
  8. 56 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/home/HomeElderlyInfoServiceImpl.java
  9. 3 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/home/HomeServiceMemberService.java
  10. 14 5
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/home/HomeServiceMemberServiceImpl.java
  11. 66 86
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/yk/impl/YkElderlyInfoServiceImpl.java

+ 4 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/home/HomeServiceMemberController.java

@@ -18,6 +18,8 @@ import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import javax.validation.Valid;
 
+import java.util.List;
+
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "管理后台 - 居家服务人员")
@@ -83,8 +85,8 @@ public class HomeServiceMemberController {
     @PostMapping("/assign")
     @Operation(summary = "分配服务人员")
     @TenantIgnore
-    public CommonResult<Boolean> assign(@Valid @RequestBody HomeServiceMemberAssignReqVO assignReqVO) {
-        homeServiceMemberService.assignHomeServiceMember(assignReqVO);
+    public CommonResult<Boolean> assign(@Valid @RequestBody List<HomeServiceMemberAssignReqVO> assignReqVOList) {
+        homeServiceMemberService.assignHomeServiceMember(assignReqVOList);
         return success(true);
     }
 }

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

@@ -60,6 +60,12 @@ public class HomeElderlyInfoDetailRespVO {
     private String disease;
     private String medicalHistory;
     private String extraFile;
+    @Schema(description = "账户余额")
+    private String accountBalance;
+    @Schema(description = "代金券")
+    private String voucherBalance;
+    @Schema(description = "现金")
+    private String cashBalance;
     @Schema(description = "亲属列表")
     private List<HomeElderlyFamilyDO> familyList;
     @Schema(description = "紧急联系人")

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

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.controller.admin.yk;
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.module.system.controller.admin.yk.vo.*;
@@ -92,7 +93,7 @@ public class YkElderlyInfoController {
     public CommonResult<String> importElderlyInfo(@RequestPart("file") MultipartFile file) throws IOException {
         List<YkElderlyInfoImportVO> dataList = ExcelUtils.read(file, YkElderlyInfoImportVO.class);
         for (YkElderlyInfoImportVO data : dataList) {
-            YkElderlyInfoSaveReqVO saveReqVO = cn.iocoder.yudao.framework.common.util.object.BeanUtils.toBean(data, YkElderlyInfoSaveReqVO.class);
+            YkElderlyInfoSaveReqVO saveReqVO = BeanUtils.toBean(data, YkElderlyInfoSaveReqVO.class);
             ykElderlyInfoService.createElderlyInfo(saveReqVO);
         }
         return success("导入成功,共导入" + dataList.size() + "条数据");

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

@@ -35,8 +35,10 @@ public class HomeElderlyInfoDO extends BaseNoDeleteDO implements Serializable {
     private LocalDateTime checkIn;
     private String currentLiveArea;
     private String currentLiveAddress;
+    private String currentLiveCommunity;
     private String householdArea;
     private String householdAddress;
+    private String householdCommunity;
     private String householdType;
     private String ethnicity;
     private String maritalStatus;
@@ -54,6 +56,7 @@ public class HomeElderlyInfoDO extends BaseNoDeleteDO implements Serializable {
     private String isMigrate;
     private String isResident;
     private Integer isService;
+    private Integer isSubsidize;
     private Integer serviceTimesYear;
     private Integer inStatus;
     private String healthStatus;

+ 2 - 5
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/home/HomeServiceElderRelationDO.java

@@ -1,5 +1,6 @@
 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.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -13,16 +14,12 @@ import java.time.LocalDateTime;
  */
 @TableName("home_service_elder_relation")
 @Data
-public class HomeServiceElderRelationDO implements Serializable {
+public class HomeServiceElderRelationDO extends BaseNoDeleteDO implements Serializable {
 
     @TableId(type = IdType.AUTO)
     private Long id;
     private Long homeElderId;
     private Long homeServiceMemberId;
     private Long tenantId;
-    private LocalDateTime createTime;
-    private LocalDateTime updateTime;
-    private String creator;
-    private String updater;
 }
 

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

@@ -166,12 +166,12 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
     public PageResult<ExpenseOrderDO> getExpenseBillPage(ExpenseBillPageReqVO pageReqVO) {
         Page<ExpenseOrderDO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
         List<ExpenseOrderDO> list = expenseOrderMapper.getExpenseBillPage(page, pageReqVO);
-        Map<String,BigDecimal> categoryAmountMap = new HashMap<>();
-        Map<Integer,String> typeCategoryMap = new HashMap<>();
         for (ExpenseOrderDO expenseOrderDO : list) {
+            Map<String,BigDecimal> categoryAmountMap = new HashMap<>();
+            Map<Integer,String> typeCategoryMap = new HashMap<>();
             BigDecimal otherAmount = BigDecimal.ZERO;
             BigDecimal otherRoundAmount = BigDecimal.ZERO;
-            BigDecimal paidAmount = BigDecimal.ZERO;
+            BigDecimal payAmountTotal = BigDecimal.ZERO;
 
             String fullBedName = buildService.getFullBedName(expenseOrderDO.getElderId());
             expenseOrderDO.setBedName(fullBedName);
@@ -184,44 +184,63 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
             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());
+                payAmountTotal = payAmountTotal.add(payInfo.getRoundPayTwoDecimalAmount() == null ? BigDecimal.ZERO : payInfo.getRoundPayTwoDecimalAmount());
             }
 
             for (ExpenseOrderItemDO orderItem : orderItems) {
                 String categoryKey = StringUtils.isBlank(orderItem.getItemCategoryName()) ? "" :orderItem.getItemCategoryName().replaceAll("-", "").replace("/", "");
+                BigDecimal totalAmount = orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP);
                 if(orderItem.getExpenseSource().equals(BusinessConstants.EXPENSE_ITEM)){
                     if (orderItem.getType() != null && orderItem.getType() == 1) {
                         typeCategoryMap.put(orderItem.getType(), categoryKey);
-                        categoryAmountMap.put(categoryKey,orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
+                        categoryAmountMap.compute(categoryKey, (k,v)->{
+                            if(v == null){
+                                v = BigDecimal.ZERO;
+                            }
+                            return v.add(totalAmount);
+                        });
                     } else if (orderItem.getType() != null && orderItem.getType() == 2) {
                         typeCategoryMap.put(orderItem.getType(), categoryKey);
-                        categoryAmountMap.put(categoryKey,orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
+                        categoryAmountMap.compute(categoryKey, (k,v)->{
+                            if(v == null){
+                                v = BigDecimal.ZERO;
+                            }
+                            return v.add(totalAmount);
+                        });
                     } else if (orderItem.getType() != null && orderItem.getType() == 3) {
                         typeCategoryMap.put(orderItem.getType(), categoryKey);
-                        categoryAmountMap.put(categoryKey,orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
+                        categoryAmountMap.compute(categoryKey, (k,v)->{
+                            if(v == null){
+                                v = BigDecimal.ZERO;
+                            }
+                            return v.add(totalAmount);
+                        });
                     }else {
-                        otherAmount = otherAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
-                        otherRoundAmount = otherRoundAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
+                        otherAmount = otherAmount.add(totalAmount);
+                        otherRoundAmount = otherRoundAmount.add(totalAmount);
                     }
                 } else {
                     BigDecimal categoryAmount = categoryAmountMap.get(categoryKey);
                     if(categoryAmount != null){
-                        categoryAmountMap.put(categoryKey,categoryAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP)));
+                        categoryAmountMap.put(categoryKey,categoryAmount.add(totalAmount));
                         continue;
                     }
-                    otherAmount = otherAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
-                    otherRoundAmount = otherRoundAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
+                    otherAmount = otherAmount.add(totalAmount);
+                    otherRoundAmount = otherRoundAmount.add(totalAmount);
                 }
             }
             expenseOrderDO.setBedAmount(categoryAmountMap.getOrDefault(typeCategoryMap.get(1),BigDecimal.ZERO));
             expenseOrderDO.setNurseAmount(categoryAmountMap.getOrDefault(typeCategoryMap.get(2),BigDecimal.ZERO));
             expenseOrderDO.setMealAmount(categoryAmountMap.getOrDefault(typeCategoryMap.get(3),BigDecimal.ZERO));
             expenseOrderDO.setOtherAmount(otherAmount);
-            expenseOrderDO.setPayableAmount(expenseOrderDO.getBedAmount().add(expenseOrderDO.getNurseAmount()).add(expenseOrderDO.getMealAmount()).add(expenseOrderDO.getOtherAmount()).setScale(2, RoundingMode.HALF_UP));
             expenseOrderDO.setOtherRoundAmount(otherRoundAmount);
-            expenseOrderDO.setPaidAmount(paidAmount.setScale(2, RoundingMode.HALF_UP));
+            expenseOrderDO.setPaidAmount(payAmountTotal.setScale(2, RoundingMode.HALF_UP));
+            expenseOrderDO.setActualAmount(expenseOrderDO.getBedAmount()
+                    .add(expenseOrderDO.getNurseAmount())
+                    .add(expenseOrderDO.getMealAmount())
+                    .add(expenseOrderDO.getOtherAmount())
+                    .setScale(2, RoundingMode.HALF_UP));
         }
-
         return new PageResult<>(list, page.getTotal());
     }
 
@@ -378,6 +397,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
         payOrder.setCreatedTime(saveReqVO.getPayTime());
         payOrder.setType(BusinessConstants.EXPENSE_PAY_ORDER_MONTH);
         payOrder.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
+        payOrder.setRemarks(saveReqVO.getRemarks());
         payOrder.setTenantId(expenseOrder.getTenantId());
         expensePayOrderMapper.insert(payOrder);
 
@@ -446,7 +466,9 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
         }
         boolean isPartialPay = false;
         if (items.size() == 1 && items.size() == saveReqVO.getExpenseOrderItems().size()) {
-            isPartialPay = !items.get(0).getPayAmount().equals(saveReqVO.getExpenseOrderItems().get(0).getTotalAmount());
+            ExpenseOrderItemDO expenseOrderItemDO = saveReqVO.getExpenseOrderItems().get(0);
+            BigDecimal needPayAmount = expenseOrderItemDO.getTotalAmount().subtract(expenseOrderItemDO.getPayAmount() == null ? BigDecimal.ZERO : expenseOrderItemDO.getPayAmount());
+            isPartialPay = !items.get(0).getPayAmount().equals(needPayAmount);
         }
         //修改勾选的收费项状态
         for (ExpenseOrderItemDO expenseOrderItem : saveReqVO.getExpenseOrderItems()) {
@@ -455,7 +477,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
             expenseOrderItem.setPayOrderId(payOrder.getId());
             // 某个项目部分缴费,只能是一个
             if(isPartialPay){
-                expenseOrderItem.setPayAmount(items.get(0).getPayAmount());
+                expenseOrderItem.setPayAmount(items.get(0).getPayAmount().add(expenseOrderItem.getPayAmount() == null ? BigDecimal.ZERO : expenseOrderItem.getPayAmount()));
             }else {
                 expenseOrderItem.setPayAmount(expenseOrderItem.getTotalAmount());
             }
@@ -559,7 +581,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
         List<ExpenseOrderItemDO> expenseOrderItems = expenseOrderItemMapper.selectList(new LambdaQueryWrapperX<ExpenseOrderItemDO>()
                 .eq(ExpenseOrderItemDO::getExpenseOrderId, expenseOrder.getId())
                 .eq(ExpenseOrderItemDO::getIsShow, BooleanEnum.TRUE.getValue()));
-        List<ExpenseOrderItemDO> paySuccessCollect = expenseOrderItems.stream().filter(e -> !Objects.equals(e.getPayStatus(), BooleanEnum.FALSE.getValue())).collect(Collectors.toList());
+        List<ExpenseOrderItemDO> paySuccessCollect = expenseOrderItems.stream().filter(e -> Objects.equals(e.getPayStatus(), BooleanEnum.TRUE.getValue())).collect(Collectors.toList());
         if (expenseOrder.getPayableAmount() == null) {
             expenseOrder.setPayableAmount(BigDecimal.ZERO);
         }

+ 2 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/SysEvaluationProcessServiceImpl.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.service.biz;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
 import cn.iocoder.yudao.module.system.controller.admin.sys.vo.EvaluationProcessPageReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.CheckInProcessSequenceDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.SysEvaluationProcessDO;
@@ -64,6 +65,7 @@ public class SysEvaluationProcessServiceImpl implements SysEvaluationProcessServ
         if (templates != null && !templates.isEmpty()) {
             for (CheckInProcessSequenceDO sequenceEntity : templates) {
                 sequenceEntity.setEvaluationProcessId(processDO.getId());
+                sequenceEntity.setTenantId(TenantContextHolder.getTenantId());
                 checkInProcessSequenceMapper.insert(sequenceEntity);
             }
         }

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

@@ -7,8 +7,12 @@ import cn.iocoder.yudao.module.system.controller.admin.home.vo.HomeElderlyInfoDe
 import cn.iocoder.yudao.module.system.controller.admin.home.vo.HomeElderlyInfoPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.home.vo.HomeElderlyInfoPageRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.home.vo.HomeElderlyInfoSaveReqVO;
+import cn.iocoder.yudao.module.system.dal.dataobject.home.HomeElderlyAccountDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.home.HomeElderlyAccountDetailDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.home.HomeElderlyFamilyDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.home.HomeElderlyInfoDO;
+import cn.iocoder.yudao.module.system.dal.mysql.home.HomeElderlyAccountDetailMapper;
+import cn.iocoder.yudao.module.system.dal.mysql.home.HomeElderlyAccountMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.home.HomeElderlyFamilyMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.home.HomeElderlyInfoMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -16,9 +20,11 @@ import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 @Service
@@ -31,6 +37,12 @@ public class HomeElderlyInfoServiceImpl implements HomeElderlyInfoService {
     @Resource
     private HomeElderlyFamilyMapper homeElderlyFamilyMapper;
 
+    @Resource
+    private HomeElderlyAccountMapper homeElderlyAccountMapper;
+
+    @Resource
+    private HomeElderlyAccountDetailMapper homeElderlyAccountDetailMapper;
+
     @Override
     public Long createHomeElderlyInfo(HomeElderlyInfoSaveReqVO createReqVO) {
         HomeElderlyInfoDO doObj = BeanUtils.toBean(createReqVO, HomeElderlyInfoDO.class);
@@ -64,6 +76,7 @@ public class HomeElderlyInfoServiceImpl implements HomeElderlyInfoService {
         HomeElderlyInfoDetailRespVO respVO = BeanUtils.toBean(infoDO, HomeElderlyInfoDetailRespVO.class);
         respVO.setFamilyList(familyList.stream().filter(item -> Objects.equals(item.getIsEmergency(), 0)).collect(Collectors.toList()));
         respVO.setEmergencyPerson(familyList.stream().filter(item -> Objects.equals(item.getIsEmergency(), 1)).findFirst().orElse(null));
+        fillAccountInfo(respVO, id);
         return respVO;
     }
 
@@ -74,6 +87,49 @@ public class HomeElderlyInfoServiceImpl implements HomeElderlyInfoService {
         return new PageResult<>(list, page.getTotal());
     }
 
+    private void fillAccountInfo(HomeElderlyInfoDetailRespVO respVO, Long homeElderId) {
+        HomeElderlyAccountDO accountDO = homeElderlyAccountMapper.selectOne(new LambdaQueryWrapperX<HomeElderlyAccountDO>()
+                .eq(HomeElderlyAccountDO::getHomeElderId, homeElderId)
+                .last("limit 1"));
+        BigDecimal accountAmount = accountDO == null || accountDO.getAmount() == null ? BigDecimal.ZERO : accountDO.getAmount();
+        respVO.setAccountBalance(formatAmount(accountAmount));
+
+        BigDecimal voucherAmount = BigDecimal.ZERO;
+        BigDecimal cashAmount = BigDecimal.ZERO;
+        if (accountDO != null) {
+            List<HomeElderlyAccountDetailDO> detailList = homeElderlyAccountDetailMapper.selectList(new LambdaQueryWrapperX<HomeElderlyAccountDetailDO>()
+                    .eq(HomeElderlyAccountDetailDO::getAccountId, accountDO.getId()));
+            voucherAmount = sumByType(detailList, true);
+            cashAmount = sumByType(detailList, false);
+        }
+        respVO.setVoucherBalance(formatAmount(voucherAmount));
+        respVO.setCashBalance(formatAmount(cashAmount));
+    }
+
+    private BigDecimal sumByType(List<HomeElderlyAccountDetailDO> detailList, boolean voucher) {
+        if (detailList == null || detailList.isEmpty()) {
+            return BigDecimal.ZERO;
+        }
+        return detailList.stream()
+                .filter(item -> isVoucherType(item.getType()) == voucher)
+                .map(HomeElderlyAccountDetailDO::getAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
+
+    private boolean isVoucherType(String type) {
+        if (type == null) {
+            return false;
+        }
+        String normalized = type.trim().toLowerCase();
+        return "voucher".equals(normalized) || "vouch".equals(normalized) || "1".equals(normalized) || "2".equals(normalized);
+    }
+
+    private String formatAmount(BigDecimal amount) {
+        BigDecimal safeAmount = Optional.ofNullable(amount).orElse(BigDecimal.ZERO);
+        return safeAmount.stripTrailingZeros().toPlainString() + "元";
+    }
+
     private void saveOrUpdateFamilyList(Long homeElderId, HomeElderlyInfoSaveReqVO reqVO) {
         homeElderlyFamilyMapper.delete(new LambdaQueryWrapperX<HomeElderlyFamilyDO>()
                 .eq(HomeElderlyFamilyDO::getHomeElderId, homeElderId));

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

@@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.system.controller.admin.home.vo.HomeServiceMemebe
 import cn.iocoder.yudao.module.system.controller.admin.home.vo.HomeServiceMemeberPageRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.home.vo.HomeServiceMemeberSaveReqVO;
 
+import java.util.List;
+
 public interface HomeServiceMemberService {
 
     Long createHomeServiceMemeber(HomeServiceMemeberSaveReqVO createReqVO);
@@ -18,5 +20,5 @@ public interface HomeServiceMemberService {
 
     PageResult<HomeServiceMemeberPageRespVO> getHomeServiceMemeberPage(HomeServiceMemeberPageReqVO pageReqVO);
 
-    void assignHomeServiceMember(HomeServiceMemberAssignReqVO assignReqVO);
+    void assignHomeServiceMember(List<HomeServiceMemberAssignReqVO> assignReqVOList);
 }

+ 14 - 5
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/home/HomeServiceMemberServiceImpl.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.service.home;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
 import cn.iocoder.yudao.module.system.controller.admin.home.vo.HomeServiceMemberAssignReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.home.vo.HomeServiceMemeberPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.home.vo.HomeServiceMemeberPageRespVO;
@@ -15,6 +16,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
 
 @Service
 @Validated
@@ -55,10 +58,16 @@ public class HomeServiceMemberServiceImpl implements HomeServiceMemberService {
     }
 
     @Override
-    public void assignHomeServiceMember(HomeServiceMemberAssignReqVO assignReqVO) {
-        HomeServiceElderRelationDO relationDO = new HomeServiceElderRelationDO();
-        relationDO.setHomeServiceMemberId(assignReqVO.getServiceMemberId());
-        relationDO.setHomeElderId(assignReqVO.getHomeElderId());
-        homeServiceElderRelationMapper.insert(relationDO);
+    public void assignHomeServiceMember(List<HomeServiceMemberAssignReqVO> assignReqVOList) {
+        Long tenantId = TenantContextHolder.getTenantId();
+        List<HomeServiceElderRelationDO> relationDOList = new ArrayList<>();
+        for (HomeServiceMemberAssignReqVO assignReqVO : assignReqVOList) {
+            HomeServiceElderRelationDO relationDO = new HomeServiceElderRelationDO();
+            relationDO.setHomeServiceMemberId(assignReqVO.getServiceMemberId());
+            relationDO.setHomeElderId(assignReqVO.getHomeElderId());
+            relationDO.setTenantId(tenantId);
+            relationDOList.add(relationDO);
+        }
+        homeServiceElderRelationMapper.insertBatch(relationDOList);
     }
 }

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

@@ -6,14 +6,18 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
 import cn.iocoder.yudao.module.system.controller.admin.yk.vo.*;
+import cn.iocoder.yudao.module.system.dal.dataobject.home.HomeElderlyFamilyDO;
 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.HomeElderlyFamilyMapper;
 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.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -55,41 +59,78 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
     @Resource
     private YkElderlyPaymentRecordMapper ykElderlyPaymentRecordMapper;
 
+    @Autowired
+    private HomeElderlyFamilyMapper homeElderlyFamilyMapper;
+
 
     @Override
     public Long createElderlyInfo(YkElderlyInfoSaveReqVO createReqVO) {
-        // 检查是否已存在相同身份证号的长者
         HomeElderlyInfoDO existingElderlyInfo = homeElderlyInfoMapper.selectOne(new LambdaQueryWrapperX<HomeElderlyInfoDO>()
                 .eq(HomeElderlyInfoDO::getIdCard, createReqVO.getIdCard()));
-
         if (existingElderlyInfo != null) {
-            // 如果长者已存在,更新字段但保留送工费
-            BigDecimal originalDeliveryFee = existingElderlyInfo.getDeliveryFee();
-
-            // 将新信息复制到现有对象中
-            HomeElderlyInfoDO updateObj = BeanUtils.toBean(createReqVO, HomeElderlyInfoDO.class);
-            updateObj.setId(existingElderlyInfo.getId());
-            // 保留原有的送工费
-            updateObj.setDeliveryFee(originalDeliveryFee);
-            // 保留原有的创建信息
-            updateObj.setCreator(existingElderlyInfo.getCreator());
-            updateObj.setCreateTime(existingElderlyInfo.getCreateTime());
-            // 更新修改信息
-            updateObj.setUpdater(SecurityFrameworkUtils.getLoginUserNickname());
-            updateObj.setUpdateTime(LocalDateTime.now());
-            updateObj.setTenantId(createReqVO.getTenantId() == null ? TenantContextHolder.getTenantId() : createReqVO.getTenantId());
-
-            homeElderlyInfoMapper.updateById(updateObj);
+            updateElderlyInfoFromReq(existingElderlyInfo, createReqVO);
             return existingElderlyInfo.getId();
-        } else {
-            // 如果长者不存在,新增
-            HomeElderlyInfoDO elderlyInfo = BeanUtils.toBean(createReqVO, HomeElderlyInfoDO.class);
+        }
+
+        HomeElderlyInfoDO elderlyInfo = buildElderlyInfo(createReqVO);
+        homeElderlyInfoMapper.insert(elderlyInfo);
+        upsertEmergencyContact(elderlyInfo.getId(), elderlyInfo.getTenantId(), createReqVO);
+        return elderlyInfo.getId();
+    }
+
+    private void updateElderlyInfoFromReq(HomeElderlyInfoDO existingElderlyInfo, YkElderlyInfoSaveReqVO reqVO) {
+        BigDecimal originalDeliveryFee = existingElderlyInfo.getDeliveryFee();
+        HomeElderlyInfoDO updateObj = buildElderlyInfo(reqVO);
+        updateObj.setId(existingElderlyInfo.getId());
+        updateObj.setDeliveryFee(originalDeliveryFee);
+        updateObj.setCreator(existingElderlyInfo.getCreator());
+        updateObj.setCreateTime(existingElderlyInfo.getCreateTime());
+        updateObj.setUpdater(SecurityFrameworkUtils.getLoginUserNickname());
+        updateObj.setUpdateTime(LocalDateTime.now());
+        updateObj.setTenantId(resolveTenantId(reqVO.getTenantId()));
+        homeElderlyInfoMapper.updateById(updateObj);
+        upsertEmergencyContact(updateObj.getId(), updateObj.getTenantId(), reqVO);
+    }
+
+    private HomeElderlyInfoDO buildElderlyInfo(YkElderlyInfoSaveReqVO reqVO) {
+        HomeElderlyInfoDO elderlyInfo = BeanUtils.toBean(reqVO, HomeElderlyInfoDO.class);
+        elderlyInfo.setIsSubsidize("生效中".equals(reqVO.getSupportStatus()) ? 1 : 0);
+        elderlyInfo.setHouseholdArea(reqVO.getHouseholdDistrict() + "/" + reqVO.getHouseholdStreet());
+        elderlyInfo.setCurrentLiveArea(reqVO.getResidenceDistrict() + "/" + reqVO.getResidenceStreet());
+        elderlyInfo.setCurrentLiveAddress(reqVO.getCurrentAddress());
+        elderlyInfo.setPhone(reqVO.getPersonalPhone());
+        elderlyInfo.setTenantId(resolveTenantId(reqVO.getTenantId()));
+        if (elderlyInfo.getId() == null) {
             elderlyInfo.setCreator(SecurityFrameworkUtils.getLoginUserNickname());
             elderlyInfo.setCreateTime(LocalDateTime.now());
-            elderlyInfo.setTenantId(createReqVO.getTenantId() == null ? TenantContextHolder.getTenantId() : createReqVO.getTenantId());
-            homeElderlyInfoMapper.insert(elderlyInfo);
-            return elderlyInfo.getId();
         }
+        return elderlyInfo;
+    }
+
+    private void upsertEmergencyContact(Long elderlyId, Long tenantId, YkElderlyInfoSaveReqVO reqVO) {
+        if (StringUtils.isBlank(reqVO.getEmergencyContact()) || StringUtils.isBlank(reqVO.getEmergencyContactPhone())) {
+            return;
+        }
+        HomeElderlyFamilyDO homeElderlyFamilyDO = homeElderlyFamilyMapper.selectOne(new LambdaQueryWrapperX<HomeElderlyFamilyDO>()
+                .eq(HomeElderlyFamilyDO::getHomeElderId, elderlyId)
+                .eq(HomeElderlyFamilyDO::getIsEmergency, 1));
+        if (homeElderlyFamilyDO == null) {
+            homeElderlyFamilyDO = new HomeElderlyFamilyDO();
+            homeElderlyFamilyDO.setHomeElderId(elderlyId);
+            homeElderlyFamilyDO.setIsEmergency(1);
+            homeElderlyFamilyDO.setTenantId(tenantId);
+            homeElderlyFamilyDO.setContactName(reqVO.getEmergencyContact());
+            homeElderlyFamilyDO.setPhone(reqVO.getEmergencyContactPhone());
+            homeElderlyFamilyMapper.insert(homeElderlyFamilyDO);
+            return;
+        }
+        homeElderlyFamilyDO.setContactName(reqVO.getEmergencyContact());
+        homeElderlyFamilyDO.setPhone(reqVO.getEmergencyContactPhone());
+        homeElderlyFamilyMapper.updateById(homeElderlyFamilyDO);
+    }
+
+    private Long resolveTenantId(Long tenantId) {
+        return tenantId == null ? TenantContextHolder.getTenantId() : tenantId;
     }
 
     @Override
@@ -242,67 +283,6 @@ public class YkElderlyInfoServiceImpl implements YkElderlyInfoService {
 
     }
 
-//    @Override
-//    public String importExpenseRecord(List<YkElderlyExpenseRecordImportVO> dataList) {
-//        int successCount = 0;
-//        int failCount = 0;
-//        StringBuilder errorMsg = new StringBuilder();
-//
-//        for (int i = 0; i < dataList.size(); i++) {
-//            YkElderlyExpenseRecordImportVO importVO = dataList.get(i);
-//            try {
-//                //查询长者
-//                YkElderlyInfoDO ykElderlyInfoDO = homeElderlyInfoMapper.selectOne(new LambdaQueryWrapperX<YkElderlyInfoDO>()
-//                        .eq(YkElderlyInfoDO::getElderName, importVO.getServiceObj())
-//                        .eq(YkElderlyInfoDO::getIdCard, importVO.getIdCard()));
-//
-//                if (ykElderlyInfoDO == null) {
-//                    failCount++;
-//                    errorMsg.append("第").append(i + 1).append("行,服务对象不存在,请检查!\n");
-//                    continue;
-//                }
-//
-//                // 创建费用变动记录
-//                YkElderlyExpenseRecordDO recordDO = new YkElderlyExpenseRecordDO();
-//                recordDO.setType(2); // 消费类型
-//                recordDO.setExpenseType(1); // 余额类型
-//                recordDO.setYkElderId(ykElderlyInfoDO.getId());
-//                recordDO.setAmount(importVO.getSelfPaidAmount());
-//                recordDO.setBalance(importVO.getConsumptionAfter());
-//                recordDO.setRemarks("费用导入");
-//                recordDO.setCreatedTime(new Date());
-//                recordDO.setTenantId(TenantContextHolder.getTenantId());
-//                recordDO.setMealPeriod(importVO.getMealPeriod());
-//                recordDO.setMealTime(importVO.getMealTime());
-//                recordDO.setCitySubsidy(importVO.getCitySubsidy());
-//                recordDO.setDistrictSubsidy(importVO.getDistrictSubsidy());
-//                recordDO.setDistrictCharitySubsidy(importVO.getDistrictCharitySubsidy());
-//                recordDO.setStreetSubsidy(importVO.getStreetSubsidy());
-//                recordDO.setStreetCharitySubsidy(importVO.getStreetCharitySubsidy());
-//                recordDO.setTotalSubsidyWithoutOperation(importVO.getTotalSubsidyWithoutOperation());
-//                recordDO.setOperationSubsidyForElderly(importVO.getOperationSubsidyForElderly());
-//                recordDO.setSelfPaidAmount(importVO.getSelfPaidAmount());
-//                recordDO.setConsumptionBefore(importVO.getConsumptionBefore());
-//                recordDO.setConsumptionAfter(importVO.getConsumptionAfter());
-//                recordDO.setTotalConsumptionAmount(importVO.getTotalConsumptionAmount());
-//                recordDO.setImportTime(LocalDateTime.now());
-//
-//                ykElderlyExpenseRecordMapper.insert(recordDO);
-//                successCount++;
-//
-//                //更新颐康长者表的余额
-//                ykElderlyInfoDO.setBalance(recordDO.getBalance());
-//                homeElderlyInfoMapper.updateById(ykElderlyInfoDO);
-//
-//            } catch (Exception e) {
-//                failCount++;
-//                errorMsg.append("第").append(i + 1).append("行数据导入失败:").append(e.getMessage()).append("\n");
-//            }
-//        }
-//
-//        return String.format("导入完成,成功:%d条,失败:%d条\n%s", successCount, failCount, errorMsg);
-//    }
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String importExpenseRecord(List<YkElderlyExpenseRecordImportVO> importVOList) {