ソースを参照

新增
1、外出列表增加是否返院过滤条件
2、新增根据长者ID获取长者费用信息接口
3、增加床位对调接口
4、新增外出列表导出功能
5、新增建行支付额外增加记录账单信息模块供院区查看
6、完善护理计划模块相关功能
7、库存流水查询增加按月份范围查询

liangwenxuan 2 ヶ月 前
コミット
ca78e154fa
38 ファイル変更741 行追加72 行削除
  1. 9 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/BedChangeRecordController.java
  2. 17 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/ElderlyAskLeaveController.java
  3. 42 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/ElderlyCcbPayOrderRecordController.java
  4. 2 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/MaterialIoController.java
  5. 3 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/AskLeavePageReqVO.java
  6. 3 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/BedChangeElderlyRespVO.java
  7. 15 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/BedChangeRecordOneReqVO.java
  8. 12 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/BedSwapReqVO.java
  9. 73 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/ElderlyAskLeaveExportExcelVO.java
  10. 26 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/ElderlyCcbPayOrderRecordPageReqVO.java
  11. 37 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/ElderlyCcbPayOrderRecordRespVO.java
  12. 3 3
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/materialio/inventory/MaterialInventoryFlowReqVO.java
  13. 24 3
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/elderly/ElderlyNursingLogController.java
  14. 29 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/elderly/vo/ElderlyNursingLogListReqVO.java
  15. 12 3
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/elderly/vo/ElderlyNursingLogRespVO.java
  16. 3 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/elderly/vo/ElderlyNursingLogSaveReqVO.java
  17. 20 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/elderly/vo/ElderlyNursingLogSimpleRespVO.java
  18. 7 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/ElderlyCcbPayOrderRecordDO.java
  19. 4 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/elderly/ElderlyNursingLogDO.java
  20. 9 3
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/biz/ElderlyAskLeaveMapper.java
  21. 1 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/biz/ElderlyBuildFloorActivityImageMapper.java
  22. 8 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/biz/ElderlyCcbPayOrderRecordMapper.java
  23. 4 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/biz/ElderlyChangeRecordMapper.java
  24. 23 10
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/elderly/ElderlyNursingLogMapper.java
  25. 6 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyAskLeaveService.java
  26. 58 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyAskLeaveServiceImpl.java
  27. 13 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyCcbPayOrderRecordService.java
  28. 30 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyCcbPayOrderRecordServiceImpl.java
  29. 3 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyChangeRecordService.java
  30. 4 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyOrderFoodServiceImpl.java
  31. 8 11
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/MaterialIoServiceImpl.java
  32. 36 13
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/NurseChangeRecordServiceImpl.java
  33. 10 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/elderly/ElderlyNursingLogService.java
  34. 58 19
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/elderly/ElderlyNursingLogServiceImpl.java
  35. 32 0
      yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlyCcbPayOrderRecordMapper.xml
  36. 38 0
      yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlyChangeRecordMapper.xml
  37. 56 0
      yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlyNursingLogMapper.xml
  38. 3 1
      yudao-server/src/main/resources/application.yaml

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

@@ -48,6 +48,15 @@ public class BedChangeRecordController {
         return success(pageResult);
     }
 
+    @GetMapping("/getElderlyById")
+    @Operation(summary = "根据长者ID获取长者信息")
+    @Parameter(name = "elderId", description = "长者编号", required = true, example = "1024")
+    @TenantIgnore
+    public CommonResult<BedChangeElderlyRespVO> getElderlyById(@RequestParam("elderId") Long elderId) {
+        BedChangeElderlyRespVO respVO = changeRecordService.getElderlyById(elderId);
+        return success(respVO);
+    }
+
     @GetMapping("/checkPrivateRoom")
     @Operation(summary = "校验是否可以包房")
     @Parameter(name = "bedId", description = "床位id", required = true, example = "1024")

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

@@ -1,11 +1,14 @@
 package cn.iocoder.yudao.module.system.controller.admin.biz;
 
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 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.framework.tenant.core.context.TenantContextHolder;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.AskLeavePageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyAskLeaveExportExcelVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyAskLeaveDO;
 import cn.iocoder.yudao.module.system.service.biz.ElderlyAskLeaveService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -13,11 +16,14 @@ import io.swagger.v3.oas.annotations.Parameter;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
 import org.springframework.validation.annotation.Validated;
 import io.swagger.v3.oas.annotations.tags.Tag;
 
+import java.io.IOException;
+import java.util.List;
 import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -80,6 +86,17 @@ public class ElderlyAskLeaveController {
     }
 
 
+    @GetMapping("/exportExcel")
+    @Operation(summary = "导出老人外出请假Excel")
+    @TenantIgnore
+    @ApiAccessLog(operateType = cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT)
+    public void exportExcel(@Valid AskLeavePageReqVO reqVO, HttpServletResponse response) throws IOException {
+        List<ElderlyAskLeaveExportExcelVO> list = elderlyAskLeaveService.getExportList(reqVO);
+        // 导出 Excel
+        ExcelUtils.write(response, "老人外出请假.xls", "数据", ElderlyAskLeaveExportExcelVO.class, list);
+    }
+
+
 //
 //    @PutMapping("/update")
 //    @Operation(summary = "更新老人请假管理")

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

@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.system.controller.admin.biz;
+
+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.tenant.core.aop.TenantIgnore;
+import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyCcbPayOrderRecordPageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyCcbPayOrderRecordRespVO;
+import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyCcbPayOrderRecordDO;
+import cn.iocoder.yudao.module.system.service.biz.ElderlyCcbPayOrderRecordService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.Objects;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 建行支付账单记录")
+@RestController
+@RequestMapping("/elderly/ccb-pay-order-record")
+@Validated
+public class ElderlyCcbPayOrderRecordController {
+
+    @Resource
+    private ElderlyCcbPayOrderRecordService elderlyCcbPayOrderRecordService;
+
+    @GetMapping("/page")
+    @Operation(summary = "获得建行支付账单记录分页")
+    @TenantIgnore
+    public CommonResult<PageResult<ElderlyCcbPayOrderRecordRespVO>> getPage(@Valid ElderlyCcbPayOrderRecordPageReqVO pageReqVO) {
+        pageReqVO.setTenantIds(Objects.isNull(pageReqVO.getTenantIds()) ? new Long[]{TenantContextHolder.getTenantId()} : pageReqVO.getTenantIds());
+        PageResult<ElderlyCcbPayOrderRecordDO> pageResult = elderlyCcbPayOrderRecordService.getPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, ElderlyCcbPayOrderRecordRespVO.class));
+    }
+}

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

@@ -289,10 +289,10 @@ public class MaterialIoController {
         ExcelUtils.write(response, "库存查询报表.xlsx", "数据", MaterialInventoryReportExcelVO.class, excelList);
     }
 
-    @GetMapping("/stats/inventory/flow")
+    @PostMapping("/stats/inventory/flow")
     @Operation(summary = "库存流水查询")
     @TenantIgnore
-    public CommonResult<MaterialInventoryFlowRespVO> getInventoryFlow(@Valid MaterialInventoryFlowReqVO reqVO) {
+    public CommonResult<MaterialInventoryFlowRespVO> getInventoryFlow(@Valid @RequestBody MaterialInventoryFlowReqVO reqVO) {
         return success(materialIoService.getInventoryFlow(reqVO));
     }
 

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

@@ -24,4 +24,7 @@ public class AskLeavePageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     @Schema(description = "查询时间")
     private LocalDateTime[] queryTime;
+
+    @Schema(description = "是否返院")
+    private Integer isUpdated;
 }

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

@@ -42,6 +42,9 @@ public class BedChangeElderlyRespVO {
     @Schema(description = "类型名称", example = "20769")
     private String itemName;
 
+    @Schema(description = "费用明细id")
+    private Long expenseItemId;
+
     @Schema(description = "原始id,原始床位/护理/餐饮")
     private String originalId;
 

+ 15 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/BedChangeRecordOneReqVO.java

@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.system.controller.admin.biz.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class BedChangeRecordOneReqVO {
+
+    @Schema(description = "长者ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "长者ID不能为空")
+    private Long elderId;
+
+}

+ 12 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/BedSwapReqVO.java

@@ -2,17 +2,21 @@ package cn.iocoder.yudao.module.system.controller.admin.biz.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
+
 @Schema(description = "管理后台 - 床位对调 Request VO")
 @Data
 public class BedSwapReqVO {
 
     @Schema(description = "开始日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-10-01")
     @NotNull(message = "开始日期不能为空")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
     private LocalDate startDate;
 
     @Schema(description = "长者A ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1001")
@@ -36,10 +40,10 @@ public class BedSwapReqVO {
     private Long originalExpenseItemIdB;
 
     @Schema(description = "长者A新费用项目ID", example = "4001")
-    private Long newExpenseItemIdA;
+    private Long newItemIdA;
 
     @Schema(description = "长者B新费用项目ID", example = "4002")
-    private Long newExpenseItemIdB;
+    private Long newItemIdB;
 
     @Schema(description = "长者A是否打折", example = "1")
     private Integer isDiscountA;
@@ -58,4 +62,10 @@ public class BedSwapReqVO {
 
     @Schema(description = "长者B实际费用金额", example = "900")
     private BigDecimal actualAmountB;
+
+    @Schema(description = "长者A是否包房", example = "1")
+    private Integer isPrivateA;
+
+    @Schema(description = "长者B是否包房", example = "1")
+    private Integer isPrivateB;
 }

+ 73 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/ElderlyAskLeaveExportExcelVO.java

@@ -0,0 +1,73 @@
+package cn.iocoder.yudao.module.system.controller.admin.biz.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Date;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
+public class ElderlyAskLeaveExportExcelVO {
+    @ExcelProperty("老人姓名")
+    private String elderName;
+
+    @ExcelProperty("楼栋名称")
+    private String buildName;
+
+    @ExcelProperty("楼层名称")
+    private String floorName;
+
+    @ExcelProperty("房间号")
+    private String roomName;
+
+    @ExcelProperty("床位名称")
+    private String bedName;
+
+    @ExcelProperty("陪同人")
+    private String accompanyPerson;
+
+    @ExcelProperty("外出时间")
+    private LocalDate outDate;
+
+    @ExcelProperty("返回时间")
+    private LocalDate comeDate;
+
+    @ExcelProperty("外出登记人")
+    private String outPerson;
+
+    @ExcelProperty("联系电话")
+    private String outPhone;
+
+    @ExcelProperty("外出事由")
+    private String remarks;
+
+    @ExcelProperty("外出类型")
+    private String type;
+
+    @ExcelProperty("请假状态")
+    private Integer leaveStatus;
+
+    @ExcelProperty("预估天数")
+    private BigDecimal numberDays;
+
+    @ExcelProperty("租户名称")
+    private String tenantName;
+
+    @ExcelProperty("归属月")
+    private String belongMonth;
+
+    // 将 Date 转换为 LocalDate 的辅助方法
+    public static LocalDate convertToLocalDate(Date date) {
+        return date == null ? null : date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+    }
+}

+ 26 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/ElderlyCcbPayOrderRecordPageReqVO.java

@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.system.controller.admin.biz.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 建行支付账单记录分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ElderlyCcbPayOrderRecordPageReqVO extends PageParam {
+
+    @Schema(description = "长者姓名", example = "张三")
+    private String elderName;
+
+    @Schema(description = "账单月起", example = "2024-01")
+    private String beginBillingMonth;
+
+    @Schema(description = "账单月止", example = "2024-12")
+    private String endBillingMonth;
+
+    @Schema(description = "租户ID数组")
+    private Long[] tenantIds;
+}

+ 37 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/ElderlyCcbPayOrderRecordRespVO.java

@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.system.controller.admin.biz.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 建行支付账单记录 Response VO")
+@Data
+public class ElderlyCcbPayOrderRecordRespVO {
+
+    @Schema(description = "id")
+    private Long id;
+
+    @Schema(description = "账单id")
+    private Long expenseOrderId;
+
+    @Schema(description = "账单月")
+    private String billingMonth;
+
+    @Schema(description = "支付时间")
+    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = "GMT+8")
+    private Date payTime;
+
+    @Schema(description = "金额")
+    private BigDecimal payAmount;
+
+    @Schema(description = "机构id")
+    private Long tenantId;
+
+    @Schema(description = "长者姓名")
+    private String elderName;
+}

+ 3 - 3
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/materialio/inventory/MaterialInventoryFlowReqVO.java

@@ -14,9 +14,9 @@ public class MaterialInventoryFlowReqVO {
     @NotNull(message = "入库单明细ID不能为空")
     private Long inboundItemId;
 
-    @Schema(description = "月份(YYYY-MM)", required = true, example = "2024-06")
-    @NotEmpty(message = "月份不能为空")
-    private String month;
+    @Schema(description = "月份范围(YYYY-MM),数组第0个为开始,第1个为结束,可不传结束", required = true, example = "[\"2024-06\",\"2024-07\"]")
+    @NotEmpty(message = "月份范围不能为空")
+    private String[] months;
 
 }
 

+ 24 - 3
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/elderly/ElderlyNursingLogController.java

@@ -5,22 +5,28 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
 import cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogDetailRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogListReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogSimpleRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogSaveReqVO;
 import cn.iocoder.yudao.module.system.service.elderly.ElderlyNursingLogService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.annotation.security.PermitAll;
 import javax.validation.Valid;
+import java.time.LocalDate;
+import java.util.List;
 import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
 
 @Tag(name = "管理后台 - 长者护理记录")
 @RestController
@@ -67,16 +73,31 @@ public class ElderlyNursingLogController {
 
     @GetMapping("/page")
     @Operation(summary = "获得长者护理记录分页")
-    public CommonResult<PageResult<ElderlyNursingLogRespVO>> getPage(@Valid ElderlyNursingLogPageReqVO pageReqVO) {
+    public CommonResult<PageResult<ElderlyNursingLogSimpleRespVO>> getPage(@Valid ElderlyNursingLogPageReqVO pageReqVO) {
         pageReqVO.setTenantIds(Objects.isNull(pageReqVO.getTenantIds())
                 ? new Long[]{TenantContextHolder.getTenantId()} : pageReqVO.getTenantIds());
         return success(nursingLogService.getPage(pageReqVO));
     }
 
+    @GetMapping("/list")
+    @Operation(summary = "获取长者护理记录列表")
+    @TenantIgnore
+    @PermitAll
+    public CommonResult<List<ElderlyNursingLogRespVO>> getList(@Valid ElderlyNursingLogListReqVO listReqVO) {
+        return success(nursingLogService.getList(listReqVO));
+    }
+
     @GetMapping("/detail")
     @Operation(summary = "获得长者护理记录详情")
     @Parameter(name = "elderId", description = "长者编号", required = true, example = "1")
-    public CommonResult<ElderlyNursingLogDetailRespVO> getDetail(@RequestParam("elderId") Long elderId) {
-        return success(nursingLogService.getDetailByElderId(elderId));
+    @Parameter(name = "start", description = "开始日期", required = true, example = "2026-01-02")
+    @Parameter(name = "end", description = "结束日期", required = true, example = "2026-01-02")
+    @PermitAll
+    public CommonResult<ElderlyNursingLogDetailRespVO> getDetail(@RequestParam("elderId") Long elderId,
+                                                                 @RequestParam("start")
+                                                                 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) LocalDate start,
+                                                                 @RequestParam("end")
+                                                                 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) LocalDate end) {
+        return success(nursingLogService.getDetailByElderId(elderId,start,end));
     }
 }

+ 29 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/elderly/vo/ElderlyNursingLogListReqVO.java

@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.system.controller.admin.elderly.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
+
+@Data
+public class ElderlyNursingLogListReqVO {
+
+    @Schema(description = "护理员名称")
+    private String nurse;
+
+    @Schema(description = "机构id")
+    private Long tenantId;
+
+    @Schema(description = "护理开始日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+    private LocalDate startDate;
+
+    @Schema(description = "护理结束日期,可为空")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+    private LocalDate endDate;
+
+}

+ 12 - 3
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/elderly/vo/ElderlyNursingLogRespVO.java

@@ -1,11 +1,15 @@
 package cn.iocoder.yudao.module.system.controller.admin.elderly.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
 @Schema(description = "管理后台 - 长者护理记录 Response VO")
 @Data
 public class ElderlyNursingLogRespVO {
@@ -22,12 +26,18 @@ public class ElderlyNursingLogRespVO {
     @Schema(description = "床位号(完整床位名)")
     private String bedName;
 
+    @Schema(description = "护理员")
+    private String nurse;
+
     @Schema(description = "护理等级")
     private String nurseLevelName;
 
     @Schema(description = "护理计划项目id", example = "1")
     private Long nursingPlanItemId;
 
+    @Schema(description = "护理计划项目名称", example = "基础护理")
+    private String nursingItemName;
+
     @Schema(description = "图片")
     private String image;
 
@@ -35,11 +45,10 @@ public class ElderlyNursingLogRespVO {
     private String remark;
 
     @Schema(description = "护理日期")
+    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY)
     private LocalDate nurseDate;
 
-    @Schema(description = "创建人")
-    private String creator;
-
     @Schema(description = "创建时间")
+    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime createTime;
 }

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

@@ -20,6 +20,9 @@ public class ElderlyNursingLogSaveReqVO {
     @NotNull(message = "长者id不能为空")
     private Long elderId;
 
+    @Schema(description = "护理员")
+    private String nurse;
+
     @Schema(description = "图片")
     private String image;
 

+ 20 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/elderly/vo/ElderlyNursingLogSimpleRespVO.java

@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.system.controller.admin.elderly.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class ElderlyNursingLogSimpleRespVO {
+    @Schema(description = "长者id")
+    private Long elderId;
+
+    @Schema(description = "长者姓名")
+    private String elderName;
+
+    @Schema(description = "床位号(完整床位名)")
+    private String bedName;
+
+    @Schema(description = "护理等级")
+    private String nurseLevelName;
+
+}

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

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.dal.dataobject.biz;
 
 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 com.fasterxml.jackson.annotation.JsonFormat;
@@ -64,4 +65,10 @@ public class ElderlyCcbPayOrderRecordDO {
      */
     @Schema(description = "机构id")
     private Long tenantId;
+
+    /**
+     * 长者姓名(联表字段)
+     */
+    @TableField(exist = false)
+    private String elderName;
 }

+ 4 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/elderly/ElderlyNursingLogDO.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
 import java.time.LocalDate;
@@ -29,6 +30,9 @@ public class ElderlyNursingLogDO {
     /** 长者id */
     private Long elderId;
 
+    /** 护理员 */
+    private String nurse;
+
     /** 图片 */
     private String image;
 

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

@@ -17,12 +17,18 @@ import org.apache.ibatis.annotations.Mapper;
 public interface ElderlyAskLeaveMapper extends BaseMapperX<ElderlyAskLeaveDO> {
 
     default PageResult<ElderlyAskLeaveDO> selectPage(AskLeavePageReqVO reqVO){
-        return selectPage(reqVO,new LambdaQueryWrapperX<ElderlyAskLeaveDO>()
-                .eqIfPresent(ElderlyAskLeaveDO::getOrgType,reqVO.getOrgType())
+        LambdaQueryWrapperX<ElderlyAskLeaveDO> wrapper = new LambdaQueryWrapperX<>();
+        wrapper = wrapper.eqIfPresent(ElderlyAskLeaveDO::getOrgType,reqVO.getOrgType())
                 .likeIfPresent(ElderlyAskLeaveDO::getElderName,reqVO.getElderName())
                 .betweenIfPresent(ElderlyAskLeaveDO::getOutDate,reqVO.getQueryTime())
                 .inIfPresent(ElderlyAskLeaveDO::getTenantId,reqVO.getTenantIds())
-                .orderByDesc(ElderlyAskLeaveDO::getCreateDate));
+                .orderByDesc(ElderlyAskLeaveDO::getCreateDate);
+        if(reqVO.getIsUpdated() != null){
+            return selectPage(reqVO, reqVO.getIsUpdated() == 1 ?
+                    wrapper.isNotNull(ElderlyAskLeaveDO::getUpdateDate) :
+                    wrapper.isNull(ElderlyAskLeaveDO::getUpdateDate));
+        }
+        return selectPage(reqVO,wrapper);
     }
 
 }

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

@@ -34,3 +34,4 @@ public interface ElderlyBuildFloorActivityImageMapper extends BaseMapperX<Elderl
 
 
 
+

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

@@ -1,8 +1,13 @@
 package cn.iocoder.yudao.module.system.dal.mysql.biz;
 
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyCcbPayOrderRecordPageReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyCcbPayOrderRecordDO;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 建行支付账单记录 Mapper
@@ -11,4 +16,7 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface ElderlyCcbPayOrderRecordMapper extends BaseMapperX<ElderlyCcbPayOrderRecordDO> {
+
+    List<ElderlyCcbPayOrderRecordDO> selectPageWithElderInfo(Page<ElderlyCcbPayOrderRecordDO> page,
+                                                             @Param("reqVO") ElderlyCcbPayOrderRecordPageReqVO reqVO);
 }

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

@@ -68,6 +68,10 @@ public interface ElderlyChangeRecordMapper extends BaseMapperX<ElderlyChangeReco
     List<BedChangeElderlyRespVO> selectElderlyPage(Page<ElderlyInfoDO> page,
                                                    @Param("pageVO") ElderlyInfoPageReqVO pageVO);
 
+    List<BedChangeElderlyRespVO> selectElderlyById(Page<ElderlyInfoDO> page,
+                                                  @Param("pageVO") ElderlyInfoPageReqVO pageVO,
+                                                  @Param("elderId") Long elderId);
+
     List<NurseChangeRecordRespVO> selectNurseListPage(Page<NurseChangeRecordRespVO> page,
                                                       @Param("pageVO") ChangeRecordPageReqApiVO pageReqVO);
 

+ 23 - 10
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/elderly/ElderlyNursingLogMapper.java

@@ -1,13 +1,13 @@
 package cn.iocoder.yudao.module.system.dal.mysql.elderly;
 
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
-import cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogPageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogRespVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.elderly.ElderlyNursingLogDO;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDate;
 import java.util.List;
 
 /**
@@ -16,18 +16,31 @@ import java.util.List;
 @Mapper
 public interface ElderlyNursingLogMapper extends BaseMapperX<ElderlyNursingLogDO> {
 
-    default PageResult<ElderlyNursingLogDO> selectPage(ElderlyNursingLogPageReqVO reqVO) {
-        return selectPage(reqVO, new LambdaQueryWrapperX<ElderlyNursingLogDO>()
-                .betweenIfPresent(ElderlyNursingLogDO::getNurseDate, reqVO.getNurseDate())
-                .inIfPresent(ElderlyNursingLogDO::getTenantId, reqVO.getTenantIds())
+    default List<ElderlyNursingLogDO> selectByElderId(Long elderId, LocalDate start, LocalDate end) {
+        return selectList(new LambdaQueryWrapperX<ElderlyNursingLogDO>()
+                .eq(ElderlyNursingLogDO::getElderId, elderId)
+                .leIfPresent(ElderlyNursingLogDO::getNurseDate, end)
+                .ge(ElderlyNursingLogDO::getNurseDate, start)
                 .orderByDesc(ElderlyNursingLogDO::getNurseDate)
                 .orderByDesc(ElderlyNursingLogDO::getId));
     }
 
-    default List<ElderlyNursingLogDO> selectByElderId(Long elderId) {
-        return selectList(new LambdaQueryWrapper<ElderlyNursingLogDO>()
-                .eq(ElderlyNursingLogDO::getElderId, elderId)
+    default List<ElderlyNursingLogDO> selectList(String nurse, Long tenantId, LocalDate startDate, LocalDate endDate) {
+        return selectList(new LambdaQueryWrapperX<ElderlyNursingLogDO>()
+                .eqIfPresent(ElderlyNursingLogDO::getTenantId, tenantId)
+                .likeIfPresent(ElderlyNursingLogDO::getNurse, nurse)
+                .leIfPresent(ElderlyNursingLogDO::getNurseDate, endDate)
+                .ge(ElderlyNursingLogDO::getNurseDate, startDate)
                 .orderByDesc(ElderlyNursingLogDO::getNurseDate)
                 .orderByDesc(ElderlyNursingLogDO::getId));
     }
+
+    List<ElderlyNursingLogRespVO> selectListWithItemName(@Param("nurse") String nurse,
+                                                        @Param("tenantId") Long tenantId,
+                                                        @Param("startDate") LocalDate startDate,
+                                                        @Param("endDate") LocalDate endDate);
+
+    List<ElderlyNursingLogRespVO> selectByElderIdWithItemName(@Param("elderId") Long elderId,
+                                                             @Param("startDate") LocalDate startDate,
+                                                             @Param("endDate") LocalDate endDate);
 }

+ 6 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyAskLeaveService.java

@@ -4,8 +4,12 @@ package cn.iocoder.yudao.module.system.service.biz;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.AskLeavePageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyAskLeaveExportExcelVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyAskLeaveDO;
 
+import javax.validation.Valid;
+import java.util.List;
+
 /**
  * 老人请假管理 Service 接口
  *
@@ -23,4 +27,6 @@ public interface ElderlyAskLeaveService {
     PageResult<ElderlyAskLeaveDO> findPage(AskLeavePageReqVO reqVO);
 
     ElderlyAskLeaveDO getDetail(Long id);
+
+    List<ElderlyAskLeaveExportExcelVO> getExportList(@Valid AskLeavePageReqVO reqVO);
 }

+ 58 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyAskLeaveServiceImpl.java

@@ -1,10 +1,12 @@
 package cn.iocoder.yudao.module.system.service.biz;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.AskLeavePageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyAskLeaveExportExcelVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.*;
 import cn.iocoder.yudao.module.system.dal.mysql.biz.*;
 import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantMapper;
@@ -643,6 +645,62 @@ public class ElderlyAskLeaveServiceImpl implements ElderlyAskLeaveService {
         return elderlyAskLeaveDO;
     }
 
+    @Override
+    public List<ElderlyAskLeaveExportExcelVO> getExportList(AskLeavePageReqVO reqVO) {
+        // 设置不分页,导出全部数据
+        reqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        PageResult<ElderlyAskLeaveDO> pageResult = elderlyAskLeaveMapper.selectPage(reqVO);
+
+        List<ElderlyAskLeaveDO> list = pageResult.getList();
+        if (CollectionUtils.isEmpty(list)) {
+            return Collections.emptyList();
+        }
+
+        // 填充老人信息和租户名称
+        for (ElderlyAskLeaveDO elderlyAskLeaveDO : list) {
+            ElderlyInfoDO elderlyInfoDO = elderlyInfoMapper.selectById(elderlyAskLeaveDO.getElderId());
+            if (elderlyInfoDO != null) {
+                elderlyInfoDO.setBedName(buildService.getFullBedName(elderlyInfoDO.getId()));
+            }
+            elderlyAskLeaveDO.setElderlyInfo(elderlyInfoDO);
+        }
+
+        // 转换为导出VO
+        return list.stream().map(this::convertToExportVO).collect(Collectors.toList());
+    }
+
+    /**
+     * 将 DO 转换为导出 VO
+     */
+    private ElderlyAskLeaveExportExcelVO convertToExportVO(ElderlyAskLeaveDO elderlyAskLeaveDO) {
+        ElderlyAskLeaveExportExcelVO exportVO = new ElderlyAskLeaveExportExcelVO();
+
+        // 基础字段
+        exportVO.setElderName(elderlyAskLeaveDO.getElderName());
+        exportVO.setAccompanyPerson(elderlyAskLeaveDO.getAccompanyPerson());
+        exportVO.setOutDate(ElderlyAskLeaveExportExcelVO.convertToLocalDate(elderlyAskLeaveDO.getOutDate()));
+        exportVO.setComeDate(ElderlyAskLeaveExportExcelVO.convertToLocalDate(elderlyAskLeaveDO.getComeDate()));
+        exportVO.setOutPerson(elderlyAskLeaveDO.getOutPerson());
+        exportVO.setOutPhone(elderlyAskLeaveDO.getOutPhone());
+        exportVO.setRemarks(elderlyAskLeaveDO.getRemarks());
+        exportVO.setType(elderlyAskLeaveDO.getType());
+        exportVO.setLeaveStatus(elderlyAskLeaveDO.getLeaveStatus());
+        exportVO.setNumberDays(elderlyAskLeaveDO.getNumberDays());
+        exportVO.setTenantName(elderlyAskLeaveDO.getTenantName());
+        exportVO.setBelongMonth(elderlyAskLeaveDO.getBelongMonth());
+
+        // 老人信息(床位等)
+        ElderlyInfoDO elderlyInfo = elderlyAskLeaveDO.getElderlyInfo();
+        if (elderlyInfo != null) {
+            exportVO.setBuildName(elderlyInfo.getBuildName());
+            exportVO.setFloorName(elderlyInfo.getFloorName());
+            exportVO.setRoomName(elderlyInfo.getRoomName());
+            exportVO.setBedName(elderlyInfo.getBedName());
+        }
+
+        return exportVO;
+    }
+
     /**
      * 检查返院时间是否超过合同到期时间
      */

+ 13 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyCcbPayOrderRecordService.java

@@ -0,0 +1,13 @@
+package cn.iocoder.yudao.module.system.service.biz;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyCcbPayOrderRecordPageReqVO;
+import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyCcbPayOrderRecordDO;
+
+/**
+ * 建行支付账单记录 Service
+ */
+public interface ElderlyCcbPayOrderRecordService {
+
+    PageResult<ElderlyCcbPayOrderRecordDO> getPage(ElderlyCcbPayOrderRecordPageReqVO pageReqVO);
+}

+ 30 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyCcbPayOrderRecordServiceImpl.java

@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.system.service.biz;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyCcbPayOrderRecordPageReqVO;
+import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyCcbPayOrderRecordDO;
+import cn.iocoder.yudao.module.system.dal.mysql.biz.ElderlyCcbPayOrderRecordMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 建行支付账单记录 Service 实现类
+ */
+@Service
+@Validated
+public class ElderlyCcbPayOrderRecordServiceImpl implements ElderlyCcbPayOrderRecordService {
+
+    @Resource
+    private ElderlyCcbPayOrderRecordMapper elderlyCcbPayOrderRecordMapper;
+
+    @Override
+    public PageResult<ElderlyCcbPayOrderRecordDO> getPage(ElderlyCcbPayOrderRecordPageReqVO pageReqVO) {
+        Page<ElderlyCcbPayOrderRecordDO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
+        List<ElderlyCcbPayOrderRecordDO> list = elderlyCcbPayOrderRecordMapper.selectPageWithElderInfo(page, pageReqVO);
+        return new PageResult<>(list, page.getTotal());
+    }
+}

+ 3 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyChangeRecordService.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.service.biz;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.*;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.BedChangeRecordOneReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyChangeRecordDO;
 
 import javax.validation.Valid;
@@ -57,6 +58,8 @@ public interface ElderlyChangeRecordService {
 
     PageResult<BedChangeElderlyRespVO> findElderlyPage(ElderlyInfoPageReqVO pageVO);
 
+    BedChangeElderlyRespVO getElderlyById(Long elderId);
+
     Boolean checkPrivateRoom(Long bedId, Long elderId);
 
     List<NurseChangeyEvaluationRespVO> getEvaluationByElderId(Long elderId);

+ 4 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyOrderFoodServiceImpl.java

@@ -88,6 +88,10 @@ public class ElderlyOrderFoodServiceImpl implements ElderlyOrderFoodService {
     public List<ElderlyOrderFoodGetResVO> get(ElderlyOrderFoodGetReqVO reqVO) {
         // 获取当前日期
         LocalDate now = LocalDate.now();
+        // 周五要拿到下周一的菜单
+        if (now.getDayOfWeek().getValue() == 5) {
+            now = now.plusDays(3);
+        }
         // 本周一(第一天)
         LocalDate monday = now.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
         // 本周日(最后一天)

+ 8 - 11
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/MaterialIoServiceImpl.java

@@ -2058,15 +2058,10 @@ public class MaterialIoServiceImpl implements MaterialIoService {
 
     @Override
     public MaterialInventoryFlowRespVO getInventoryFlow(MaterialInventoryFlowReqVO reqVO) {
-        // 1. 解析月份
-        YearMonth currentMonth;
-        try {
-            currentMonth = YearMonth.parse(reqVO.getMonth());
-        } catch (Exception e) {
-            throw exceptionCustomMsg(COMMON_NOT_FOUND, "月份格式不正确,应为 YYYY-MM");
-        }
-        LocalDate monthStart = currentMonth.atDay(1);
-        LocalDate nextMonthStart = currentMonth.plusMonths(1).atDay(1);
+        // 1. 解析月份范围
+        MonthRange monthRange = parseMonthRange(reqVO.getMonths());
+        LocalDate monthStart = monthRange.getStart();
+        LocalDate nextMonthStart = monthRange.getEnd();
 
         // 2. 查询入库明细批次
         MaterialInboundOrderItemDO inboundItem = inboundOrderItemMapper.selectById(reqVO.getInboundItemId());
@@ -2106,7 +2101,8 @@ public class MaterialIoServiceImpl implements MaterialIoService {
         // 7. 查询入库流水(该批次所属的入库单,如果订单日期在月份范围内)
         List<MaterialInventoryFlowRespVO.FlowItem> flowList = new ArrayList<>();
         MaterialInboundOrderDO inboundOrder = inboundOrderMapper.selectById(inboundItem.getInboundOrderId());
-        if (inboundOrder != null && !inboundOrder.getOrderDate().isBefore(monthStart) && inboundOrder.getOrderDate().isBefore(nextMonthStart)) {
+        if (inboundOrder != null && !inboundOrder.getOrderDate().isBefore(monthStart)
+                && (nextMonthStart == null || inboundOrder.getOrderDate().isBefore(nextMonthStart))) {
             MaterialInventoryFlowRespVO.FlowItem inFlow = new MaterialInventoryFlowRespVO.FlowItem();
             inFlow.setTime(inboundOrder.getOrderDate().toString());
             inFlow.setOrderId(inboundOrder.getId());
@@ -2126,7 +2122,8 @@ public class MaterialIoServiceImpl implements MaterialIoService {
                     .map(MaterialOutboundOrderItemDO::getOutboundOrderId)
                     .collect(Collectors.toSet());
             Map<Long, MaterialOutboundOrderDO> outboundOrderMap = outboundOrderMapper.selectBatchIds(outboundOrderIds).stream()
-                    .filter(order -> !order.getOrderDate().isBefore(monthStart) && order.getOrderDate().isBefore(nextMonthStart))
+                    .filter(order -> !order.getOrderDate().isBefore(monthStart)
+                            && (nextMonthStart == null || order.getOrderDate().isBefore(nextMonthStart)))
                     .collect(Collectors.toMap(MaterialOutboundOrderDO::getId, Function.identity()));
 
             // 查询部门信息

+ 36 - 13
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/NurseChangeRecordServiceImpl.java

@@ -8,11 +8,14 @@ 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.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.BedChangeRecordOneReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.BedChangeElderlyRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.*;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.*;
 import cn.iocoder.yudao.module.system.dal.mysql.biz.*;
@@ -61,6 +64,7 @@ public class NurseChangeRecordServiceImpl implements ElderlyChangeRecordService
     @Resource
     private ExpenseItemMapper expenseItemMapper;
 
+    @Autowired
     private ExpenseMapper expenseMapper;
 
     @Resource
@@ -147,6 +151,25 @@ public class NurseChangeRecordServiceImpl implements ElderlyChangeRecordService
         return new PageResult<>(list, page.getTotal());
     }
 
+    @Override
+    @TenantIgnore
+    public BedChangeElderlyRespVO getElderlyById(Long elderId) {
+        if (elderId == null) {
+            return null;
+        }
+        ElderlyInfoPageReqVO pageVO = new ElderlyInfoPageReqVO();
+        pageVO.setIdentification(1);
+        Page<ElderlyInfoDO> page = new Page<>(1, 1);
+        List<BedChangeElderlyRespVO> list = bedChangeRecordMapper.selectElderlyById(page, pageVO, elderId);
+        if (CollectionUtil.isEmpty(list)) {
+            return null;
+        }
+        BedChangeElderlyRespVO respVO = list.get(0);
+        respVO.setBedName(buildService.getFullBedName(respVO.getId()));
+        respVO.setOriginalId(String.valueOf(respVO.getBedId()));
+        return respVO;
+    }
+
     @Override
     @TenantIgnore
     public Boolean checkPrivateRoom(Long bedId, Long elderId) {
@@ -238,12 +261,6 @@ public class NurseChangeRecordServiceImpl implements ElderlyChangeRecordService
         if (elderA == null || elderB == null) {
             throw exceptionCustomMsg(COMMON_ERROR, "长者信息不存在");
         }
-        if (reqVO.getBedIdA() != null && !reqVO.getBedIdA().equals(elderA.getBedId())) {
-            throw exceptionCustomMsg(COMMON_ERROR, "长者A床位ID与当前床位不匹配");
-        }
-        if (reqVO.getBedIdB() != null && !reqVO.getBedIdB().equals(elderB.getBedId())) {
-            throw exceptionCustomMsg(COMMON_ERROR, "长者B床位ID与当前床位不匹配");
-        }
 
         validateExpenseParams(reqVO);
 
@@ -258,27 +275,29 @@ public class NurseChangeRecordServiceImpl implements ElderlyChangeRecordService
         elderA.setRoomId(bedB.getRoomId());
         elderA.setFloorId(bedB.getFloorId());
         elderA.setBuildId(bedB.getBuildId());
+        elderA.setIsPrivateRoom(reqVO.getIsPrivateA());
 
         elderB.setBedId(bedA.getId());
         elderB.setBedName(bedA.getBedName());
         elderB.setRoomId(bedA.getRoomId());
         elderB.setFloorId(bedA.getFloorId());
         elderB.setBuildId(bedA.getBuildId());
+        elderB.setIsPrivateRoom(reqVO.getIsPrivateB());
 
         elderlyInfoMapper.updateById(elderA);
         elderlyInfoMapper.updateById(elderB);
 
-        if (reqVO.getNewExpenseItemIdA() != null) {
+        if (reqVO.getNewItemIdA() != null) {
             handleExpenseItemSwap(reqVO, true);
         }
-        if (reqVO.getNewExpenseItemIdB() != null) {
+        if (reqVO.getNewItemIdB() != null) {
             handleExpenseItemSwap(reqVO, false);
         }
     }
 
     private void validateExpenseParams(BedSwapReqVO reqVO) {
-        boolean changeA = reqVO.getNewExpenseItemIdA() != null;
-        boolean changeB = reqVO.getNewExpenseItemIdB() != null;
+        boolean changeA = reqVO.getNewItemIdA() != null;
+        boolean changeB = reqVO.getNewItemIdB() != null;
         if (changeA != changeB) {
             throw exceptionCustomMsg(COMMON_ERROR, "费用变更需同时提交A/B两位长者的信息");
         }
@@ -327,8 +346,8 @@ public class NurseChangeRecordServiceImpl implements ElderlyChangeRecordService
         }
         expenseItemMapper.updateBatch(expenseItemDOS);
 
-        Long newExpenseItemId = isElderA ? reqVO.getNewExpenseItemIdA() : reqVO.getNewExpenseItemIdB();
-        OverheadChargeDO newCharge = sysOverheadChargeMapper.selectById(newExpenseItemId);
+        Long newItemId = isElderA ? reqVO.getNewItemIdA() : reqVO.getNewItemIdB();
+        OverheadChargeDO newCharge = sysOverheadChargeMapper.selectById(newItemId);
         if (newCharge == null) {
             throw exceptionCustomMsg(COMMON_ERROR, (isElderA ? "长者A" : "长者B") + "新费用项目不存在");
         }
@@ -359,7 +378,11 @@ public class NurseChangeRecordServiceImpl implements ElderlyChangeRecordService
         expenseDO.setElderId(elderId);
         expenseDO.setTotalAmount(total);
         expenseMapper.insert(expenseDO);
-        newExpenseItemList = newExpenseItemList.stream().map(e->e.setExpenseId(expenseDO.getId())).collect(Collectors.toList());
+        newExpenseItemList = newExpenseItemList.stream().map(e->{
+            e.setId(null);
+            e.setExpenseId(expenseDO.getId());
+            return e;
+        }).collect(Collectors.toList());
         expenseItemMapper.insertBatch(newExpenseItemList);
     }
 }

+ 10 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/elderly/ElderlyNursingLogService.java

@@ -2,10 +2,15 @@ package cn.iocoder.yudao.module.system.service.elderly;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogDetailRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogListReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogSimpleRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogSaveReqVO;
 
+import java.time.LocalDate;
+import java.util.List;
+
 /**
  * 长者护理记录 Service
  */
@@ -19,8 +24,11 @@ public interface ElderlyNursingLogService {
 
     ElderlyNursingLogRespVO get(Long id);
 
-    PageResult<ElderlyNursingLogRespVO> getPage(ElderlyNursingLogPageReqVO pageReqVO);
 
-    ElderlyNursingLogDetailRespVO getDetailByElderId(Long elderId);
+    PageResult<ElderlyNursingLogSimpleRespVO> getPage(ElderlyNursingLogPageReqVO pageReqVO);
+
+    List<ElderlyNursingLogRespVO> getList(ElderlyNursingLogListReqVO listReqVO);
+
+    ElderlyNursingLogDetailRespVO getDetailByElderId(Long elderId, LocalDate start,LocalDate end);
 }
 

+ 58 - 19
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/elderly/ElderlyNursingLogServiceImpl.java

@@ -15,6 +15,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import java.time.LocalDate;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -66,40 +67,79 @@ public class ElderlyNursingLogServiceImpl implements ElderlyNursingLogService {
     }
 
     @Override
-    public PageResult<ElderlyNursingLogRespVO> getPage(ElderlyNursingLogPageReqVO pageReqVO) {
-        if (pageReqVO.getTenantIds() == null || pageReqVO.getTenantIds().length == 0) {
-            pageReqVO.setTenantIds(new Long[]{TenantContextHolder.getTenantId()});
-        }
-
-        List<Long> elderIds;
+    public PageResult<ElderlyNursingLogSimpleRespVO> getPage(ElderlyNursingLogPageReqVO pageReqVO) {
+        // 如果按长者姓名搜索,先获取符合条件的 elderIds
+        List<Long> elderIds = null;
         if (pageReqVO.getElderName() != null && !pageReqVO.getElderName().trim().isEmpty()) {
             List<ElderlyInfoDO> elders = elderlyInfoMapper.selectList(new LambdaQueryWrapperX<ElderlyInfoDO>()
-                    .inIfPresent(ElderlyInfoDO::getTenantId, pageReqVO.getTenantIds())
                     .like(ElderlyInfoDO::getElderName, pageReqVO.getElderName()));
             elderIds = elders.stream().map(ElderlyInfoDO::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
             if (elderIds.isEmpty()) {
                 return PageResult.empty();
             }
-        } else {
-            elderIds = null;
         }
 
-        PageResult<ElderlyNursingLogDO> pageResult = nursingLogMapper.selectPage(pageReqVO);
+        // 在 SQL 层面加入 elderIds 过滤,确保分页正确
+        PageResult<ElderlyNursingLogDO> pageResult = nursingLogMapper.selectPage(pageReqVO,
+                new LambdaQueryWrapperX<ElderlyNursingLogDO>()
+                        .inIfPresent(ElderlyNursingLogDO::getElderId, elderIds)
+                        .betweenIfPresent(ElderlyNursingLogDO::getNurseDate, pageReqVO.getNurseDate())
+                        .groupBy(ElderlyNursingLogDO::getElderId)
+                        .orderByDesc(ElderlyNursingLogDO::getNurseDate)
+                        .orderByDesc(ElderlyNursingLogDO::getId));
+
         List<ElderlyNursingLogDO> list = pageResult.getList();
+        if (CollectionUtil.isEmpty(list)) {
+            return PageResult.empty();
+        }
+
+        // 批量获取 ElderlyInfoDO 用于填充护理等级
+        Set<Long> elderIdSet = list.stream().map(ElderlyNursingLogDO::getElderId).filter(Objects::nonNull).collect(Collectors.toSet());
+        final Map<Long, ElderlyInfoDO> elderMap;
+        if (!elderIdSet.isEmpty()) {
+            List<ElderlyInfoDO> elders = elderlyInfoMapper.selectBatchIds(elderIdSet);
+            elderMap = elders.stream().collect(Collectors.toMap(ElderlyInfoDO::getId, Function.identity(), (a, b) -> a));
+        } else {
+            elderMap = Collections.emptyMap();
+        }
+
+        // 转换为简化 VO
+        List<ElderlyNursingLogSimpleRespVO> simpleVOList = list.stream().map(nursingLog -> {
+            ElderlyNursingLogSimpleRespVO simpleVO = new ElderlyNursingLogSimpleRespVO();
+            ElderlyInfoDO elder = elderMap.get(nursingLog.getElderId());
+            if (elder != null) {
+                simpleVO.setElderId(nursingLog.getElderId());
+                simpleVO.setElderName(elder.getElderName());
+                simpleVO.setNurseLevelName(elder.getNurseLevelName());
+                simpleVO.setBedName(buildService.getFullBedName(elder.getId()));
+            }
+            return simpleVO;
+        }).collect(Collectors.toList());
 
-        if (elderIds != null) {
-            list = list.stream().filter(r -> elderIds.contains(r.getElderId())).collect(Collectors.toList());
-            pageResult.setList(list);
-            pageResult.setTotal((long) list.size());
+        return new PageResult<>(simpleVOList, pageResult.getTotal());
+    }
+
+    @Override
+    public List<ElderlyNursingLogRespVO> getList(ElderlyNursingLogListReqVO listReqVO) {
+        // 查询护理记录列表(关联护理项目名称)
+        List<ElderlyNursingLogRespVO> voList = nursingLogMapper.selectListWithItemName(
+                listReqVO.getNurse(),
+                listReqVO.getTenantId(),
+                listReqVO.getStartDate(),
+                listReqVO.getEndDate());
+
+        if (CollectionUtil.isEmpty(voList)) {
+            return Collections.emptyList();
         }
 
-        List<ElderlyNursingLogRespVO> voList = BeanUtils.toBean(list, ElderlyNursingLogRespVO.class);
+        // 填充老人信息(护理等级、床位等)
         fillElderInfo(voList);
-        return new PageResult<>(voList, pageResult.getTotal());
+
+        return voList;
     }
 
     @Override
-    public ElderlyNursingLogDetailRespVO getDetailByElderId(Long elderId) {
+    public ElderlyNursingLogDetailRespVO getDetailByElderId(Long elderId, LocalDate start, LocalDate end) {
         if (elderId == null) {
             return null;
         }
@@ -107,8 +147,7 @@ public class ElderlyNursingLogServiceImpl implements ElderlyNursingLogService {
         if (elder == null) {
             return null;
         }
-        List<ElderlyNursingLogDO> logs = nursingLogMapper.selectByElderId(elderId);
-        List<ElderlyNursingLogRespVO> records = BeanUtils.toBean(logs, ElderlyNursingLogRespVO.class);
+        List<ElderlyNursingLogRespVO> records = nursingLogMapper.selectByElderIdWithItemName(elderId, start, end);
 
         ElderlyNursingLogDetailRespVO detailRespVO = new ElderlyNursingLogDetailRespVO();
         ElderlyNursingLogDetailRespVO.Header header = new ElderlyNursingLogDetailRespVO.Header();

+ 32 - 0
yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlyCcbPayOrderRecordMapper.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.biz.ElderlyCcbPayOrderRecordMapper">
+
+    <select id="selectPageWithElderInfo"
+            resultType="cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyCcbPayOrderRecordDO">
+        select ecpor.*, ei.elder_name as elderName
+        from elderly_ccb_pay_order_record ecpor
+                 left join elderly_expense_order eeo on eeo.id = ecpor.expense_order_id
+                 left join elderly_info ei on ei.id = eeo.elder_id
+        <where>
+            1 = 1
+            <if test="reqVO.elderName != null and reqVO.elderName != ''">
+                and ei.elder_name like concat('%', #{reqVO.elderName}, '%')
+            </if>
+            <if test="reqVO.beginBillingMonth != null and reqVO.beginBillingMonth != ''">
+                and ecpor.billing_month <![CDATA[ >= ]]> #{reqVO.beginBillingMonth}
+            </if>
+            <if test="reqVO.endBillingMonth != null and reqVO.endBillingMonth != ''">
+                and ecpor.billing_month <![CDATA[ <= ]]> #{reqVO.endBillingMonth}
+            </if>
+            <if test="reqVO.tenantIds != null and reqVO.tenantIds.length > 0">
+                and ecpor.tenant_id in
+                <foreach collection="reqVO.tenantIds" item="tenantId" open="(" separator="," close=")">
+                    #{tenantId}
+                </foreach>
+            </if>
+        </where>
+        order by ecpor.pay_time desc, ecpor.id desc
+    </select>
+
+</mapper>

+ 38 - 0
yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlyChangeRecordMapper.xml

@@ -171,6 +171,7 @@
 
     <select id="selectElderlyPage" resultType="cn.iocoder.yudao.module.system.controller.admin.biz.vo.BedChangeElderlyRespVO">
         SELECT
+            eei.id AS expenseItemId,
             eei.item_name,
             ei.id,
             ei.elder_name,
@@ -208,6 +209,43 @@
         order by ei.update_time desc
     </select>
 
+    <select id="selectElderlyById" resultType="cn.iocoder.yudao.module.system.controller.admin.biz.vo.BedChangeElderlyRespVO">
+        SELECT
+            eei.item_name,
+            ei.id,
+            ei.elder_name,
+            ei.id_card,
+            ei.bed_id,
+            eei.item_id AS originalId,
+            eei.item_id AS overheadChargeId,
+            eei.actual_amount,
+            eei.discount_amount,
+            eei.is_discount,
+            ei.tenant_id,
+            st.name AS tenantName,
+            ei.elder_sex
+        FROM
+            elderly_info ei
+                INNER JOIN elderly_expense ee ON ei.id = ee.elder_id
+                INNER JOIN elderly_expense_item eei ON eei.expense_id = ee.id
+                INNER JOIN sys_charge_category scc ON scc.id = eei.item_category_id
+                INNER JOIN system_tenant st ON st.id = ei.tenant_id
+        WHERE
+            ei.in_status = 1
+            AND ei.id = #{elderId}
+            AND ee.created_time = (SELECT MAX(ee2.created_time) FROM elderly_expense ee2 WHERE ee2.elder_id = ei.id)
+            <if test="pageVO.identification != null">
+                AND scc.identification = #{pageVO.identification}
+            </if>
+            <if test="pageVO.tenantIds != null">
+                AND ei.tenant_id in
+                <foreach item="id" collection="pageVO.tenantIds" open="(" separator="," close=")">
+                    #{id}
+                </foreach>
+            </if>
+        order by ei.update_time desc
+    </select>
+
     <select id="selectNurseListPage" resultType="cn.iocoder.yudao.module.system.api.bpm.vo.NurseChangeRecordRespVO">
         SELECT
             ecr.id,

+ 56 - 0
yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlyNursingLogMapper.xml

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.elderly.ElderlyNursingLogMapper">
+
+    <select id="selectListWithItemName" resultType="cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogRespVO">
+        SELECT
+            enl.id,
+            enl.elder_id AS elderId,
+            enl.nurse,
+            enl.nursing_plan_item_id AS nursingPlanItemId,
+            npi.nurse_item_name AS nursingItemName,
+            enl.image,
+            enl.remark,
+            enl.create_time AS createTime
+        FROM elderly_nursing_log enl
+        LEFT JOIN elderly_nursing_plan_item npi ON npi.id = enl.nursing_plan_item_id
+        WHERE 1 = 1
+            <if test="nurse != null and nurse != ''">
+                AND enl.nurse LIKE CONCAT('%', #{nurse}, '%')
+            </if>
+            <if test="tenantId != null">
+                AND enl.tenant_id = #{tenantId}
+            </if>
+            <if test="startDate != null">
+                AND enl.nurse_date &gt;= #{startDate}
+            </if>
+            <if test="endDate != null">
+                AND enl.nurse_date &lt;= #{endDate}
+            </if>
+        ORDER BY enl.nurse_date DESC, enl.id DESC
+    </select>
+
+    <select id="selectByElderIdWithItemName" resultType="cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogRespVO">
+        SELECT
+            enl.id,
+            enl.elder_id AS elderId,
+            enl.nurse,
+            enl.nursing_plan_item_id AS nursingPlanItemId,
+            npi.nurse_item_name AS nursingItemName,
+            enl.image,
+            enl.remark,
+            enl.nurse_date AS nurseDate,
+            enl.create_time AS createTime
+        FROM elderly_nursing_log enl
+        LEFT JOIN elderly_nursing_plan_item npi ON npi.id = enl.nursing_plan_item_id
+        WHERE enl.elder_id = #{elderId}
+            <if test="startDate != null">
+                AND enl.nurse_date &gt;= #{startDate}
+            </if>
+            <if test="endDate != null">
+                AND enl.nurse_date &lt;= #{endDate}
+            </if>
+        ORDER BY enl.nurse_date DESC, enl.id DESC
+    </select>
+
+</mapper>

+ 3 - 1
yudao-server/src/main/resources/application.yaml

@@ -70,7 +70,7 @@ flowable:
 mybatis-plus:
   configuration:
     map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
-    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
   global-config:
     db-config:
       id-type: NONE # “智能”模式,基于 IdTypeEnvironmentPostProcessor + 数据源的类型,自动适配成 AUTO、INPUT 模式。
@@ -234,6 +234,8 @@ yudao:
       - /admin-api/relatives/getDetailsByElderId
       - /admin-api/elderly/nursingPlan/getNursingPlanByElderId
       - /admin-api/elderly-nursing-log/create
+      - /admin-api/elderly-nursing-log/detail
+      - /admin-api/elderly-nursing-log/list
     ignore-tables:
       - system_tenant
       - system_groups