Bläddra i källkod

新增
1、外出模块返院登记增加上传附件功能
2、护理计划增加执行护理记录接口
3、护理计划增加批量创建长者护理记录接口
4、长者护理记录模块重构
5、长者特殊护理计划执行记录增加撤销特殊照护计划明细接口
6、护理计划模块增加根据长者ID查询护理计划接口
7、增加定时任务为护理计划明细是高频类型的项目定时添加未完成的护理记录

liangwenxuan 3 veckor sedan
förälder
incheckning
3d02d6b4a4
43 ändrade filer med 864 tillägg och 187 borttagningar
  1. 13 9
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/elderly/ElderlyNursingLogController.java
  2. 3 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/elderly/vo/ElderlyNursingLogDetailRespVO.java
  3. 6 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/elderly/vo/ElderlyNursingLogListReqVO.java
  4. 0 4
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/elderly/vo/ElderlyNursingLogPageReqVO.java
  5. 6 3
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/elderly/vo/ElderlyNursingLogRespVO.java
  6. 10 12
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/elderly/vo/ElderlyNursingLogSaveReqVO.java
  7. 13 5
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/ElderlySpecialNursingLogController.java
  8. 14 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/NursingPlanController.java
  9. 0 8
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/SpecialNursingPlanItemController.java
  10. 8 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/ElderlySpecialNursingLogRespVO.java
  11. 25 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/ElderlySpecialNursingLogSimpleRespVO.java
  12. 28 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/HighFrequencyPlanItemVO.java
  13. 2 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/NursingPlanItemRespVO.java
  14. 3 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/NursingPlanItemVO.java
  15. 35 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/NursingPlanItemWithElderVO.java
  16. 56 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/NursingPlanLogRespVO.java
  17. 20 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/NursingPlanLowFrequencyByFloorRespVO.java
  18. 19 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/SpecialNursingPlanCancelReqVO.java
  19. 6 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/SpecialNursingPlanItemExecuteReqVO.java
  20. 15 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/SpecialNursingPlanItemSaveReqVO.java
  21. 6 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/ElderlyAskLeaveDO.java
  22. 3 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/ElderlySpecialNursingLogDO.java
  23. 1 9
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/NursingPlanItemDO.java
  24. 11 4
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/elderly/ElderlyNursingLogDO.java
  25. 4 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/yk/YkElderlySelfFundedRecord.java
  26. 8 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/biz/ElderlySpecialNursingLogMapper.java
  27. 15 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/biz/NursingPlanItemMapper.java
  28. 29 16
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/elderly/ElderlyNursingLogMapper.java
  29. 185 4
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/NurseLogSyncJob.java
  30. 20 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/BuildServiceImpl.java
  31. 3 3
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/elderly/ElderlyNursingLogService.java
  32. 27 18
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/elderly/ElderlyNursingLogServiceImpl.java
  33. 5 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/ElderlySpecialNursingLogService.java
  34. 41 15
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/ElderlySpecialNursingLogServiceImpl.java
  35. 6 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/NursingPlanService.java
  36. 48 13
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/NursingPlanServiceImpl.java
  37. 0 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/SpecialNursingPlanItemService.java
  38. 0 16
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/SpecialNursingPlanItemServiceImpl.java
  39. 1 5
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/SpecialNursingPlanServiceImpl.java
  40. 60 12
      yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlyNursingLogMapper.xml
  41. 34 10
      yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlySpecialNursingLogMapper.xml
  42. 73 2
      yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/NursingPlanItemMapper.xml
  43. 2 0
      yudao-server/src/main/resources/application.yaml

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

@@ -41,18 +41,18 @@ public class ElderlyNursingLogController {
     @Operation(summary = "创建长者护理记录")
     @PermitAll
     @TenantIgnore
-    public CommonResult<Long> create(@Valid @RequestBody ElderlyNursingLogSaveReqVO createReqVO) {
-        createReqVO.setTenantId(Objects.isNull(createReqVO.getTenantId())
-                ? TenantContextHolder.getTenantId() : createReqVO.getTenantId());
+    public CommonResult<Boolean> create(@Valid @RequestBody List<ElderlyNursingLogSaveReqVO> createReqVO) {
         return success(nursingLogService.create(createReqVO));
     }
 
-    @PutMapping("/update")
-    @Operation(summary = "更新长者护理记录")
-    public CommonResult<Boolean> update(@Valid @RequestBody ElderlyNursingLogSaveReqVO updateReqVO) {
+    @PostMapping("/executeNursingLog")
+    @Operation(summary = "执行护理记录")
+    @PermitAll
+    @TenantIgnore
+    public CommonResult<Boolean> executeNursingLog(@Valid @RequestBody ElderlyNursingLogSaveReqVO updateReqVO) {
         updateReqVO.setTenantId(Objects.isNull(updateReqVO.getTenantId())
                 ? TenantContextHolder.getTenantId() : updateReqVO.getTenantId());
-        nursingLogService.update(updateReqVO);
+        nursingLogService.executeNursingLog(updateReqVO);
         return success(Boolean.TRUE);
     }
 
@@ -92,12 +92,16 @@ public class ElderlyNursingLogController {
     @Parameter(name = "elderId", description = "长者编号", required = true, example = "1")
     @Parameter(name = "start", description = "开始日期", required = true, example = "2026-01-02")
     @Parameter(name = "end", description = "结束日期", required = true, example = "2026-01-02")
+    @Parameter(name = "pageNo", description = "页码,从 1 开始", required = true, example = "1")
+    @Parameter(name = "pageSize", description = "每页条数", required = true, example = "10")
     @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));
+                                                                 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) LocalDate end,
+                                                                 @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                 @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+        return success(nursingLogService.getDetailByElderId(elderId, start, end, pageNo, pageSize));
     }
 }

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

@@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.system.controller.admin.elderly.vo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+
 import java.util.List;
 
 @Schema(description = "管理后台 - 长者护理记录详情 Response VO")
@@ -13,7 +15,7 @@ public class ElderlyNursingLogDetailRespVO {
     private Header header;
 
     @Schema(description = "护理记录列表")
-    private List<ElderlyNursingLogRespVO> records;
+    private PageResult<ElderlyNursingLogRespVO> records;
 
     @Schema(description = "表头信息")
     @Data

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

@@ -12,9 +12,15 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
 @Data
 public class ElderlyNursingLogListReqVO {
 
+    @Schema(description = "长者姓名")
+    private String elderName;
+
     @Schema(description = "护理员名称")
     private String nurse;
 
+    @Schema(description = "频次类型(高(1)、中/低(2)")
+    private Integer frequencyCategoryType;
+
     @Schema(description = "机构id")
     private Long tenantId;
 

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

@@ -20,10 +20,6 @@ public class ElderlyNursingLogPageReqVO extends PageParam {
     @Schema(description = "长者姓名")
     private String elderName;
 
-    @Schema(description = "护理日期范围")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
-    private LocalDate[] nurseDate;
-
     @Schema(description = "机构id数组")
     private Long[] tenantIds;
 }

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

@@ -38,15 +38,18 @@ public class ElderlyNursingLogRespVO {
     @Schema(description = "护理计划项目名称", example = "基础护理")
     private String nursingItemName;
 
-    @Schema(description = "图片")
-    private String image;
+    @Schema(description = "频次类型", example = "1")
+    private Integer frequencyCategoryType;
 
     @Schema(description = "备注")
     private String remark;
 
+    @Schema(description = "状态")
+    private Integer status;
+
     @Schema(description = "护理日期")
     @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY)
-    private LocalDate nurseDate;
+    private LocalDateTime finishTime;
 
     @Schema(description = "创建时间")
     @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)

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

@@ -2,36 +2,34 @@ 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 javax.validation.constraints.NotNull;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
 @Schema(description = "管理后台 - 长者护理记录新增/修改 Request VO")
 @Data
 public class ElderlyNursingLogSaveReqVO {
 
-    @Schema(description = "id", example = "1024")
-    private Long id;
-
-    @Schema(description = "护理计划项目id", example = "1")
+    @Schema(description = "护理计划明细id", example = "1")
     private Long nursingPlanItemId;
 
-    @Schema(description = "长者id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotNull(message = "长者id不能为空")
+    @Schema(description = "长者id", example = "1")
     private Long elderId;
 
     @Schema(description = "护理员")
     private String nurse;
 
-    @Schema(description = "图片")
-    private String image;
-
     @Schema(description = "备注")
     private String remark;
 
-    @Schema(description = "护理日期", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotNull(message = "护理日期不能为空")
-    private LocalDate nurseDate;
+    @Schema(description = "完成时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "完成时间不能为空")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime finishTime;
 
     @Schema(description = "机构id", example = "1")
     private Long tenantId;

+ 13 - 5
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/ElderlySpecialNursingLogController.java

@@ -7,13 +7,14 @@ import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogListReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogSimpleRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanCancelReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemSaveReqVO;
 import cn.iocoder.yudao.module.system.service.nursing.ElderlySpecialNursingLogService;
 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 org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
@@ -31,10 +32,18 @@ public class ElderlySpecialNursingLogController {
     @Resource
     private ElderlySpecialNursingLogService elderlySpecialNursingLogService;
 
+    @PutMapping("/cancel")
+    @Operation(summary = "撤销特殊照护计划明细")
+    @TenantIgnore
+    public CommonResult<Boolean> cancel(@Valid @RequestBody SpecialNursingPlanCancelReqVO updateReqVO) {
+        elderlySpecialNursingLogService.cancel(updateReqVO);
+        return success(true);
+    }
+
     @GetMapping("/page")
     @Operation(summary = "获得长者特殊护理计划执行日志分页")
     @TenantIgnore
-    public CommonResult<PageResult<ElderlySpecialNursingLogRespVO>> getPage(@Valid ElderlySpecialNursingLogPageReqVO pageReqVO) {
+    public CommonResult<PageResult<ElderlySpecialNursingLogSimpleRespVO>> getPage(@Valid ElderlySpecialNursingLogPageReqVO pageReqVO) {
         pageReqVO.setTenantIds(Objects.isNull(pageReqVO.getTenantIds())
                 ? new Long[]{TenantContextHolder.getTenantId()} : pageReqVO.getTenantIds());
         return success(elderlySpecialNursingLogService.getPage(pageReqVO));
@@ -49,4 +58,3 @@ public class ElderlySpecialNursingLogController {
         return success(elderlySpecialNursingLogService.getListByElderIdAndFinishTime(listReqVO));
     }
 }
-

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

@@ -5,6 +5,8 @@ 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.nursing.vo.NursingPlanPageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanLowFrequencyByFloorRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanLogRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanSaveReqVO;
 import cn.iocoder.yudao.module.system.service.nursing.NursingPlanService;
@@ -87,10 +89,20 @@ public class NursingPlanController {
     @Operation(summary = "根据长者ID查询护理计划")
     @TenantIgnore
     @PermitAll
-    public CommonResult<List<NursingPlanRespVO>> getNursingPlanByElderId(@RequestParam("elderId") Long elderId) {
+    public CommonResult<List<NursingPlanLogRespVO>> getNursingPlanByElderId(@RequestParam("elderId") Long elderId) {
         return success(nursingPlanService.getNursingPlanByElderId(elderId));
     }
 
+    @GetMapping("/getLowFrequencyPlanItemsByFloorId")
+    @Operation(summary = "根据楼层ID获取长者中/低频护理计划明细")
+    @Parameter(name = "floorId", description = "楼层ID", required = true, example = "1024")
+    @TenantIgnore
+    @PermitAll
+    public CommonResult<List<NursingPlanLowFrequencyByFloorRespVO>> getLowFrequencyPlanItemsByFloorId(@RequestParam("floorId") Long floorId,
+                                                                                                      @RequestParam("tenantId") Long tenantId) {
+        return success(nursingPlanService.getLowFrequencyPlanItemsByFloorId(floorId,tenantId));
+    }
+
 //    @GetMapping("/export-excel")
 //    @Operation(summary = "导出护理计划 Excel")
 //    @PreAuthorize("@ss.hasPermission('elderly:nursing-plan:export')")
@@ -104,4 +116,4 @@ public class NursingPlanController {
 //                        BeanUtils.toBean(list, NursingPlanRespVO.class));
 //    }
 
-}
+}

+ 0 - 8
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/SpecialNursingPlanItemController.java

@@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.system.controller.admin.nursing;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemExecuteReqVO;
-import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemSaveReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemUnfinishedByFloorRespVO;
 import cn.iocoder.yudao.module.system.service.nursing.SpecialNursingPlanItemService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -28,13 +27,6 @@ public class SpecialNursingPlanItemController {
     @Resource
     private SpecialNursingPlanItemService specialNursingPlanItemService;
 
-    @PutMapping("/update")
-    @Operation(summary = "更新特殊照护计划明细")
-    @TenantIgnore
-    public CommonResult<Boolean> update(@Valid @RequestBody SpecialNursingPlanItemSaveReqVO updateReqVO) {
-        specialNursingPlanItemService.update(updateReqVO);
-        return success(true);
-    }
     @PostMapping("/execute")
     @Operation(summary = "执行特殊照护计划")
     @TenantIgnore

+ 8 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/ElderlySpecialNursingLogRespVO.java

@@ -14,6 +14,8 @@ public class ElderlySpecialNursingLogRespVO {
 
     @Schema(description = "特殊护理计划明细id", example = "1")
     private Long specialPlanItemId;
+    @Schema(description = "特殊护理计划明细名称", example = "1")
+    private String specialPlanItemName;
 
     @Schema(description = "长者id", example = "1")
     private Long elderId;
@@ -21,6 +23,9 @@ public class ElderlySpecialNursingLogRespVO {
     @Schema(description = "长者姓名")
     private String elderName;
 
+    @Schema(description = "床号id")
+    private Long bedId;
+
     @Schema(description = "床号")
     private String bedName;
 
@@ -36,7 +41,9 @@ public class ElderlySpecialNursingLogRespVO {
     @Schema(description = "图片")
     private String imageUrl;
 
+    @Schema(description = "状态,0:完成,1:撤销")
+    private Integer status;
+
     @Schema(description = "租户ID", example = "1")
     private Long tenantId;
 }
-

+ 25 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/ElderlySpecialNursingLogSimpleRespVO.java

@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.system.controller.admin.nursing.vo;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 长者特殊护理计划执行日志分页(按长者聚合)Response VO")
+@Data
+public class ElderlySpecialNursingLogSimpleRespVO {
+
+    @Schema(description = "长者id")
+    private Long elderId;
+
+    @Schema(description = "长者姓名")
+    private String elderName;
+
+    @Schema(description = "床位")
+    private String bedName;
+
+    @Schema(description = "护理等级")
+    private String nurseLevelName;
+
+    @JsonIgnore
+    private Long bedId;
+}

+ 28 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/HighFrequencyPlanItemVO.java

@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.system.controller.admin.nursing.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+public class HighFrequencyPlanItemVO {
+    private Long elderId;
+    private Long nursingPlanId;
+    private Long nursingPlanItemId;
+    private Long nurseItemId;
+    /**
+     * 频次:在 frequencyType 对应的周期内执行的次数
+     */
+    private BigDecimal frequency;
+    /**
+     * 频次单位:1=次/日,2=次/周,3=次/月,4=次/年
+     */
+    private Integer frequencyType;
+    private String operatingMode;
+    private LocalDateTime beginTime;
+    /**
+     * 超时提醒(来自 nurse_item.timeout)
+     */
+    private Integer timeout;
+}

+ 2 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/NursingPlanItemRespVO.java

@@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.Date;
 
@@ -25,7 +26,7 @@ public class NursingPlanItemRespVO {
     private String nurseItemName;
 
     @Schema(description = "频次")
-    private Integer frequency;
+    private BigDecimal frequency;
 
     @Schema(description = "频次单位")
     private Integer frequencyType;

+ 3 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/NursingPlanItemVO.java

@@ -6,6 +6,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
@@ -41,7 +42,7 @@ public class NursingPlanItemVO {
      * 频次
      */
     @Schema(description = "频次")
-    private Integer frequency;
+    private BigDecimal frequency;
     /**
      * 频次单位
      */
@@ -58,4 +59,4 @@ public class NursingPlanItemVO {
     @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY)
     private LocalDate date;
 
-}
+}

+ 35 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/NursingPlanItemWithElderVO.java

@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.system.controller.admin.nursing.vo;
+
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Data
+public class NursingPlanItemWithElderVO {
+
+    private Long elderId;
+    private String elderName;
+
+    private Long id;
+    private Long nursingPlanId;
+    private Long nurseItemId;
+    private String nurseItemName;
+    private BigDecimal frequency;
+    private Integer frequencyType;
+    private String frequencyCategory;
+    private Integer frequencyCategoryType;
+    private String operatingMode;
+    private Integer isDelete;
+    private Integer isExtra;
+
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime beginTime;
+
+    private Date createdTime;
+    private String createdBy;
+}

+ 56 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/NursingPlanLogRespVO.java

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.system.controller.admin.nursing.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 NursingPlanLogRespVO {
+
+    @Schema(description = "id", example = "1024")
+    private Long id;
+
+    @Schema(description = "护理计划项目id", example = "1")
+    private Long nursingPlanItemId;
+
+    @Schema(description = "护理项目名称", example = "基础护理")
+    private String nurseItemName;
+
+    @Schema(description = "长者id", example = "1")
+    private Long elderId;
+
+    @Schema(description = "护理员")
+    private String nurse;
+
+    @Schema(description = "备注")
+    private String remark;
+
+    @Schema(description = "护理日期")
+    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+    private LocalDate nurseDate;
+
+    @Schema(description = "机构id")
+    private Long tenantId;
+
+    @Schema(description = "完成时间")
+    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime finishTime;
+
+    @Schema(description = "超时时间")
+    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime timeout;
+
+    @Schema(description = "状态,0:待完成,1:已完成,2:未完成")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime createTime;
+}

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

@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.system.controller.admin.nursing.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "管理后台 - 楼层长者中/低频护理计划明细 Response VO")
+@Data
+public class NursingPlanLowFrequencyByFloorRespVO {
+
+    @Schema(description = "长者id")
+    private Long elderId;
+
+    @Schema(description = "长者姓名")
+    private String elderName;
+
+    @Schema(description = "中/低频护理计划明细列表(frequency_category_type=2)")
+    private List<NursingPlanItemRespVO> items;
+}

+ 19 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/SpecialNursingPlanCancelReqVO.java

@@ -0,0 +1,19 @@
+package cn.iocoder.yudao.module.system.controller.admin.nursing.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 特殊照护计划撤销 Request VO")
+@Data
+public class SpecialNursingPlanCancelReqVO {
+
+    @Schema(description = "日志id", example = "1")
+    private Long id;
+
+    @Schema(description = "特殊照护明细id", example = "1")
+    private Long specialItemId;
+
+    @Schema(description = "状态,0:未完成,1:已完成")
+    private Integer status;
+}
+

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

@@ -1,11 +1,15 @@
 package cn.iocoder.yudao.module.system.controller.admin.nursing.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.NotNull;
 import java.time.LocalDateTime;
 
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
 @Schema(description = "管理后台 - 特殊照护计划明细执行 Request VO")
 @Data
 public class SpecialNursingPlanItemExecuteReqVO {
@@ -20,6 +24,8 @@ public class SpecialNursingPlanItemExecuteReqVO {
 
     @Schema(description = "完成时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @NotNull(message = "完成时间不能为空")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime finishTime;
 
     @Schema(description = "备注")

+ 15 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/SpecialNursingPlanItemSaveReqVO.java

@@ -12,7 +12,21 @@ public class SpecialNursingPlanItemSaveReqVO {
     @Schema(description = "主键ID(修改时必传)", example = "1")
     private Long id;
 
+    @Schema(description = "特殊护理计划ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "特殊护理计划ID不能为空")
+    private Long specialNursingPlanId;
+
+    @Schema(description = "护理项目ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "护理项目ID不能为空")
+    private Long nurseItemId;
+
+    @Schema(description = "护理项目名称")
+    private String nurseItemName;
+
     @Schema(description = "状态,0:未完成,1:已完成")
     private Integer status;
-}
 
+    @Schema(description = "租户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "租户ID不能为空")
+    private Long tenantId;
+}

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

@@ -124,6 +124,12 @@ public class ElderlyAskLeaveDO implements Serializable {
     @Schema(description = "外出退费配置项ID")
     private Long outboundRefundConfigId;
 
+    /**
+     * 附件
+     */
+    @Schema(description = "附件", example = "1")
+    private String extraFile;
+
     private Integer orgType;
 
     private Long tenantId;

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

@@ -44,6 +44,9 @@ public class ElderlySpecialNursingLogDO extends BaseNoDeleteDO {
     @Schema(description = "图片")
     private String imageUrl;
 
+    @Schema(description = "状态,0:完成,1:撤销")
+    private Integer status;
+
     @Schema(description = "租户ID")
     private Long tenantId;
 }

+ 1 - 9
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/NursingPlanItemDO.java

@@ -44,14 +44,6 @@ public class NursingPlanItemDO {
      */
     private String nurseItemName;
     /**
-     * 频次
-     */
-    private Integer frequency;
-    /**
-     * 频次单位
-     */
-    private Integer frequencyType;
-    /**
      * 操作方式
      */
     private String operatingMode;
@@ -84,4 +76,4 @@ public class NursingPlanItemDO {
     @TableField(exist = false)
     private String categoryName;
 
-}
+}

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

@@ -9,6 +9,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 
 /**
  * 长者护理记录 DO
@@ -19,7 +20,7 @@ import java.time.LocalDate;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class ElderlyNursingLogDO {
+public class ElderlyNursingLogDO extends BaseNoDeleteDO{
 
     @TableId(type = IdType.AUTO)
     private Long id;
@@ -33,9 +34,6 @@ public class ElderlyNursingLogDO {
     /** 护理员 */
     private String nurse;
 
-    /** 图片 */
-    private String image;
-
     /** 备注 */
     private String remark;
 
@@ -44,4 +42,13 @@ public class ElderlyNursingLogDO {
 
     /** 机构id */
     private Long tenantId;
+
+    /** 完成时间 */
+    private LocalDateTime finishTime;
+
+    /** 超时时间 */
+    private LocalDateTime timeout;
+
+    /** 状态,0:待完成,1:已完成,2:未完成 */
+    private Integer status;
 }

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

@@ -3,11 +3,14 @@ package cn.iocoder.yudao.module.system.dal.dataobject.yk;
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.*;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
 
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
+
 /**
  * 每日自费金额记录表 DO
  *
@@ -27,6 +30,7 @@ public class YkElderlySelfFundedRecord {
     /**
      * 创建时间
      */
+    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY)
     private LocalDate createDate;
     /**
      * 金额

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

@@ -3,6 +3,7 @@ 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.nursing.vo.ElderlySpecialNursingLogPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogSimpleRespVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlySpecialNursingLogDO;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Mapper;
@@ -14,6 +15,11 @@ import java.util.List;
 @Mapper
 public interface ElderlySpecialNursingLogMapper extends BaseMapperX<ElderlySpecialNursingLogDO> {
 
-    List<ElderlySpecialNursingLogRespVO> selectPageWithElderInfo(@Param("page") Page<ElderlySpecialNursingLogRespVO> page,
-                                                                 @Param("pageVO") ElderlySpecialNursingLogPageReqVO pageReqVO);
+    List<ElderlySpecialNursingLogSimpleRespVO> selectPageWithElderInfo(@Param("page") Page<ElderlySpecialNursingLogSimpleRespVO> page,
+                                                                       @Param("pageVO") ElderlySpecialNursingLogPageReqVO pageReqVO);
+
+    List<ElderlySpecialNursingLogRespVO> selectListByElderIdAndFinishTimeWithItemName(@Param("elderId") Long elderId,
+                                                                                      @Param("tenantId") Long tenantId,
+                                                                                      @Param("begin") LocalDateTime begin,
+                                                                                      @Param("endExclusive") LocalDateTime endExclusive);
 }

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

@@ -2,11 +2,14 @@ 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.nursing.vo.HighFrequencyPlanItemVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanItemRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanItemWithElderVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.NursingPlanItemDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDate;
 import java.util.List;
 
 
@@ -19,7 +22,18 @@ import java.util.List;
 public interface NursingPlanItemMapper extends BaseMapperX<NursingPlanItemDO> {
 
     List<NursingPlanItemRespVO> selectNursingPlanItemsWithFrequencyCategory(@Param("nursingPlanId") Long nursingPlanId,
-                                                                            @Param("isExtra") Integer isExtra);
+                                                                            @Param("isExtra") Integer isExtra,
+                                                                            @Param("isHighFrequencyCategoryType") Integer isHighFrequencyCategoryType);
+
+    List<HighFrequencyPlanItemVO> selectHighFrequencyPlanItems(@Param("tenantId") Long tenantId,
+                                                               @Param("today") LocalDate today);
+
+    List<NursingPlanItemWithElderVO> selectPlanItemsWithElderByElderIdsAndFrequencyCategoryType(
+            @Param("elderIds") List<Long> elderIds,
+            @Param("frequencyCategoryType") Integer frequencyCategoryType,
+            @Param("today") LocalDate today,
+            @Param("tenantId") Long tenantId);
+
 
 //    default PageResult<NursingPlanItemDO> selectPage(NursingPlanItemPageReqVO reqVO) {
 //        return selectPage(reqVO, new LambdaQueryWrapperX<NursingPlanItemDO>()

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

@@ -3,11 +3,15 @@ package cn.iocoder.yudao.module.system.dal.mysql.elderly;
 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.ElderlyNursingLogRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanLogRespVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.elderly.ElderlyNursingLogDO;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.Data;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -16,15 +20,6 @@ import java.util.List;
 @Mapper
 public interface ElderlyNursingLogMapper extends BaseMapperX<ElderlyNursingLogDO> {
 
-    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> selectList(String nurse, Long tenantId, LocalDate startDate, LocalDate endDate) {
         return selectList(new LambdaQueryWrapperX<ElderlyNursingLogDO>()
                 .eqIfPresent(ElderlyNursingLogDO::getTenantId, tenantId)
@@ -35,12 +30,30 @@ public interface ElderlyNursingLogMapper extends BaseMapperX<ElderlyNursingLogDO
                 .orderByDesc(ElderlyNursingLogDO::getId));
     }
 
-    List<ElderlyNursingLogRespVO> selectListWithItemName(@Param("nurse") String nurse,
-                                                        @Param("tenantId") Long tenantId,
-                                                        @Param("startDate") LocalDate startDate,
-                                                        @Param("endDate") LocalDate endDate);
+    List<ElderlyNursingLogRespVO> getFinishList(@Param("nurse") String nurse,
+                                          @Param("elderName") String elderName,
+                                          @Param("tenantId") Long tenantId,
+                                          @Param("frequencyCategoryType") Integer frequencyCategoryType,
+                                          @Param("startDate") LocalDateTime startDate,
+                                          @Param("endDate") LocalDateTime endDate);
 
-    List<ElderlyNursingLogRespVO> selectByElderIdWithItemName(@Param("elderId") Long elderId,
-                                                             @Param("startDate") LocalDate startDate,
-                                                             @Param("endDate") LocalDate endDate);
+    List<ElderlyNursingLogRespVO> selectPageByElderIdWithItemName(@Param("page") Page<ElderlyNursingLogRespVO> page,
+                                                                  @Param("elderId") Long elderId,
+                                                                  @Param("startDate") LocalDateTime startDate,
+                                                                  @Param("endDate") LocalDateTime endDate);
+
+    List<NursingPlanLogRespVO> selectPlanLogByElderIdWithItemName(@Param("elderId") Long elderId);
+
+    List<LatestCreateTimeDTO> selectLatestCreateTimeByPlanItemIds(@Param("tenantId") Long tenantId,
+                                                                  @Param("nursingPlanItemIds") List<Long> nursingPlanItemIds);
+
+    /**
+     * 批量查询指定护理明细(nursingPlanItemId)下最近一次生成日志的 createTime。
+     * 用于定时器按“频率间隔”判断是否需要继续生成新的日志。
+     */
+    @Data
+    class LatestCreateTimeDTO {
+        private Long nursingPlanItemId;
+        private LocalDateTime createTime;
+    }
 }

+ 185 - 4
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/NurseLogSyncJob.java

@@ -1,12 +1,27 @@
 package cn.iocoder.yudao.module.system.job;
 
 import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
+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.framework.tenant.core.job.TenantJob;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.HighFrequencyPlanItemVO;
+import cn.iocoder.yudao.module.system.dal.dataobject.elderly.ElderlyNursingLogDO;
+import cn.iocoder.yudao.module.system.dal.mysql.biz.NursingPlanItemMapper;
+import cn.iocoder.yudao.module.system.dal.mysql.elderly.ElderlyNursingLogMapper;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 每天生成护理日志
@@ -15,14 +30,180 @@ import java.util.List;
 @Slf4j
 public class NurseLogSyncJob implements JobHandler {
 
+    @Autowired
+    private ElderlyNursingLogMapper elderlyNursingLogMapper;
+
+    @Resource
+    private NursingPlanItemMapper nursingPlanItemMapper;
+
+    /**
+     * 获取当前机构(tenantId)下,高频护理计划明细(frequency_category_type=1 且护理项目启用)列表。
+     *
+     * 返回字段来自:elderly_nursing_plan_item + nurse_item(例如 timeout)。
+     */
+    public List<HighFrequencyPlanItemVO> getCurrentOrgHighFrequencyNursingPlanItems() {
+        Long tenantId = TenantContextHolder.getTenantId();
+        if (tenantId == null) {
+            return Collections.emptyList();
+        }
+        return nursingPlanItemMapper.selectHighFrequencyPlanItems(tenantId, LocalDateTime.now().toLocalDate());
+    }
+
+    /**
+     * 根据护理明细的 frequencyType + frequency,计算“最小生成间隔”。
+     *
+     * 规则:在一个自然周期(天/周/月/年)内,期望生成 frequency 次,则间隔约等于 周期时长 / frequency。
+     * 这里使用向上取整(ceil)避免生成过于频繁。
+     *
+     * frequencyType:
+     * 1:次/日;2:次/周;3:次/月;4:次/年;5:时/次
+     */
+    private Duration calculateInterval(BigDecimal frequency, Integer frequencyType, LocalDateTime now) {
+        if (frequency == null || frequency.compareTo(BigDecimal.ZERO) <= 0) {
+            return null;
+        }
+        if (frequencyType == null) {
+            return Duration.ofDays(1);
+        }
+
+        // frequencyType=5(时/次)语义不同:frequency 表示“每次间隔多少小时”,例如 frequency=2 => 间隔 2h
+        if (frequencyType == 5) {
+            long intervalSeconds = (long) Math.ceil(frequency.doubleValue() * Duration.ofHours(1).getSeconds());
+            intervalSeconds = Math.max(1L, intervalSeconds);
+            return Duration.ofSeconds(intervalSeconds);
+        }
+
+        long secondsPerPeriod;
+        switch (frequencyType) {
+            case 1:
+                secondsPerPeriod = Duration.ofDays(1).getSeconds();
+                break;
+            case 2:
+                secondsPerPeriod = Duration.ofDays(7).getSeconds();
+                break;
+            case 3:
+                secondsPerPeriod = Duration.ofDays(now.toLocalDate().lengthOfMonth()).getSeconds();
+                break;
+            case 4:
+                secondsPerPeriod = Duration.ofDays(now.toLocalDate().lengthOfYear()).getSeconds();
+                break;
+            default:
+                secondsPerPeriod = Duration.ofDays(1).getSeconds();
+                break;
+        }
+
+        double freq = frequency.doubleValue();
+        if (freq <= 0D) {
+            return null;
+        }
+        long intervalSeconds = (long) Math.ceil(secondsPerPeriod / freq);
+        intervalSeconds = Math.max(1L, intervalSeconds);
+        return Duration.ofSeconds(intervalSeconds);
+    }
+
+    /**
+     * 将已超时但仍处于“待完成”的护理日志,更新为“未完成”状态。
+     *
+     * 判定标准:timeout 不为空 且 timeout 早于当前时间。
+     */
+    private int markOverdueLogsAsUnfinished(Long tenantId, LocalDateTime now) {
+        List<ElderlyNursingLogDO> overdueLogs = elderlyNursingLogMapper.selectList(
+                new LambdaQueryWrapperX<ElderlyNursingLogDO>()
+                        .eq(ElderlyNursingLogDO::getTenantId, tenantId)
+                        .eq(ElderlyNursingLogDO::getStatus, 0)
+                        .isNotNull(ElderlyNursingLogDO::getTimeout)
+                        .lt(ElderlyNursingLogDO::getTimeout, now)
+                        .orderByDesc(ElderlyNursingLogDO::getId)
+        );
+        if (overdueLogs.isEmpty()) {
+            return 0;
+        }
+        int updated = 0;
+        for (ElderlyNursingLogDO logDO : overdueLogs) {
+            logDO.setStatus(2);
+            elderlyNursingLogMapper.updateById(logDO);
+            updated++;
+        }
+        return updated;
+    }
 
 
     @Override
-    @TenantIgnore
+    @TenantJob
     public String execute(String param) throws Exception {
-        log.info("护理日志记录定时器开始执行..........................");
-        // NursingLog 模块已移除,跳过创建护理日志
+        Long tenantId = TenantContextHolder.getTenantId();
+        log.info("机构:{},护理日志记录定时器开始执行..........................",tenantId);
+
+        LocalDateTime now = LocalDateTime.now();
+
+        // 1) 先刷新历史日志状态:超时且仍待完成 => 未完成
+        int overdueUpdated = markOverdueLogsAsUnfinished(tenantId, now);
+
+        // 2) 获取本机构高频护理明细,用于按频率生成护理日志
+        List<HighFrequencyPlanItemVO> items = getCurrentOrgHighFrequencyNursingPlanItems();
+        if (items.isEmpty()) {
+            log.info("护理日志记录定时器执行结束..........................");
+            return String.format("租户{}无高频护理项目需要生成,更新未完成{}条", tenantId, overdueUpdated);
+        }
+
+        // 去重:同一个 nursingPlanItemId 只保留一条明细(避免重复生成)
+        Map<Long, HighFrequencyPlanItemVO> itemByPlanItemId = items.stream()
+                .filter(i -> i.getNursingPlanItemId() != null && i.getElderId() != null)
+                .collect(Collectors.toMap(HighFrequencyPlanItemVO::getNursingPlanItemId, i -> i, (a, b) -> a));
+        if (itemByPlanItemId.isEmpty()) {
+            log.info("护理日志记录定时器执行结束..........................");
+            return String.format("租户{}今日无有效护理明细需要生成,更新未完成{}条", tenantId, overdueUpdated);
+        }
+        List<Long> nursingPlanItemIds = new ArrayList<>(itemByPlanItemId.keySet());
+
+        // 3) 查询每个护理明细最近一次生成的日志 createTime
+        //    如果最新记录仍在“频率允许间隔”内,则不需要再生成
+        Map<Long, LocalDateTime> latestCreateTimeByPlanItemId = elderlyNursingLogMapper
+                .selectLatestCreateTimeByPlanItemIds(tenantId, nursingPlanItemIds)
+                .stream()
+                .filter(r -> r.getNursingPlanItemId() != null)
+                .collect(Collectors.toMap(ElderlyNursingLogMapper.LatestCreateTimeDTO::getNursingPlanItemId,
+                        ElderlyNursingLogMapper.LatestCreateTimeDTO::getCreateTime, (a, b) -> a));
+
+        List<ElderlyNursingLogDO> toInsert = new ArrayList<>();
+        for (HighFrequencyPlanItemVO item : itemByPlanItemId.values()) {
+            // beginTime 未到,跳过生成
+            if (item.getBeginTime() != null && now.isBefore(item.getBeginTime())) {
+                continue;
+            }
+            Duration interval = calculateInterval(item.getFrequency(), item.getFrequencyType(), now);
+            if (interval == null) {
+                continue;
+            }
+
+            LocalDateTime latest = latestCreateTimeByPlanItemId.get(item.getNursingPlanItemId());
+            // 最新生成时间仍在间隔内:不生成
+            if (latest != null && !now.isAfter(latest.plus(interval))) {
+                continue;
+            }
+
+            // 生成一条新的护理日志:
+            // - timeout 由护理项目的 timeout 推算(单位:小时)
+            LocalDateTime timeoutTime = null;
+            if (item.getTimeout() != null && item.getTimeout() > 0) {
+                timeoutTime = now.plusHours(item.getTimeout());
+            }
+
+            toInsert.add(ElderlyNursingLogDO.builder()
+                    .nursingPlanItemId(item.getNursingPlanItemId())
+                    .elderId(item.getElderId())
+                    .tenantId(tenantId)
+                    .timeout(timeoutTime)
+                    .status(0)
+                    .build());
+        }
+
+        int inserted = 0;
+        for (ElderlyNursingLogDO logDO : toInsert) {
+            elderlyNursingLogMapper.insert(logDO);
+            inserted++;
+        }
         log.info("护理日志记录定时器执行结束..........................");
-        return null;
+        return String.format("租户{}新增护理日志{}条,更新未完成{}条", tenantId, inserted, overdueUpdated);
     }
 }

+ 20 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/BuildServiceImpl.java

@@ -90,6 +90,8 @@ public class BuildServiceImpl implements BuildService {
     @Resource
     private NursingPlanMapper nursingPlanMapper;
     @Resource
+    private NurseItemMapper nurseItemMapper;
+    @Resource
     private NursingPlanItemMapper nursingPlanItemMapper;
 
     @Resource
@@ -733,12 +735,28 @@ public class BuildServiceImpl implements BuildService {
                                 .eq(NursingPlanItemDO::getNursingPlanId, nursingPlan.getId())
                                 .eq(NursingPlanItemDO::getIsDelete, 0));
 
+                        List<Long> nurseItemIds = nursingPlanItemList.stream()
+                                .map(NursingPlanItemDO::getNurseItemId)
+                                .filter(Objects::nonNull)
+                                .distinct()
+                                .collect(Collectors.toList());
+                        Map<Long, NurseItemDO> nurseItemMap = nurseItemIds.isEmpty() ? Collections.emptyMap()
+                                : nurseItemMapper.selectBatchIds(nurseItemIds).stream()
+                                .filter(Objects::nonNull)
+                                .filter(i -> i.getId() != null)
+                                .collect(Collectors.toMap(NurseItemDO::getId, i -> i, (a, b) -> a));
+
                         List<NursingPlanItemVO> collect = nursingPlanItemList.stream().map(item -> {
                             NursingPlanItemVO itemVO = new NursingPlanItemVO();
                             BeanUtils.copyProperties(item, itemVO);
                             itemVO.setDate(LocalDate.now());
 
-                            DictDataDO dictDataDO = dataMap.get(String.valueOf(item.getFrequencyType()));
+                            NurseItemDO nurseItem = nurseItemMap.get(item.getNurseItemId());
+                            if (nurseItem != null) {
+                                itemVO.setFrequency(nurseItem.getFrequency());
+                            }
+
+                            DictDataDO dictDataDO = dataMap.get(String.valueOf(nurseItem == null ? null : nurseItem.getFrequencyType()));
                             if (dictDataDO != null) {
                                 itemVO.setFrequencyTypeUnit(dictDataDO.getLabel());
                             }
@@ -1450,4 +1468,4 @@ public class BuildServiceImpl implements BuildService {
         roomVO.setBedList(bedList);
         roomVO.setIsFinish(isFinish);
     }
-}
+}

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

@@ -16,9 +16,9 @@ import java.util.List;
  */
 public interface ElderlyNursingLogService {
 
-    Long create(ElderlyNursingLogSaveReqVO createReqVO);
+    Boolean create(List<ElderlyNursingLogSaveReqVO> createReqVO);
 
-    void update(ElderlyNursingLogSaveReqVO updateReqVO);
+    void executeNursingLog(ElderlyNursingLogSaveReqVO updateReqVO);
 
     void delete(Long id);
 
@@ -29,6 +29,6 @@ public interface ElderlyNursingLogService {
 
     List<ElderlyNursingLogRespVO> getList(ElderlyNursingLogListReqVO listReqVO);
 
-    ElderlyNursingLogDetailRespVO getDetailByElderId(Long elderId, LocalDate start,LocalDate end);
+    ElderlyNursingLogDetailRespVO getDetailByElderId(Long elderId, LocalDate start, LocalDate end, Integer pageNo, Integer pageSize);
 }
 

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

@@ -11,11 +11,13 @@ import cn.iocoder.yudao.module.system.dal.dataobject.elderly.ElderlyNursingLogDO
 import cn.iocoder.yudao.module.system.dal.mysql.biz.ElderlyInfoMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.elderly.ElderlyNursingLogMapper;
 import cn.iocoder.yudao.module.system.service.biz.BuildService;
+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.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -32,21 +34,20 @@ public class ElderlyNursingLogServiceImpl implements ElderlyNursingLogService {
     private BuildService buildService;
 
     @Override
-    public Long create(ElderlyNursingLogSaveReqVO createReqVO) {
-        ElderlyNursingLogDO nursingLog = BeanUtils.toBean(createReqVO, ElderlyNursingLogDO.class);
-        if (nursingLog.getTenantId() == null) {
-            nursingLog.setTenantId(TenantContextHolder.getTenantId());
+    public Boolean create(List<ElderlyNursingLogSaveReqVO> createReqVO) {
+        List<ElderlyNursingLogDO> insertList = new ArrayList<>();
+        for (ElderlyNursingLogSaveReqVO reqVO : createReqVO) {
+            ElderlyNursingLogDO nursingLog = BeanUtils.toBean(reqVO, ElderlyNursingLogDO.class);
+            nursingLog.setStatus(1);
+            insertList.add(nursingLog);
         }
-        nursingLogMapper.insert(nursingLog);
-        return nursingLog.getId();
+        return nursingLogMapper.insertBatch(insertList);
     }
 
     @Override
-    public void update(ElderlyNursingLogSaveReqVO updateReqVO) {
+    public void executeNursingLog(ElderlyNursingLogSaveReqVO updateReqVO) {
         ElderlyNursingLogDO nursingLog = BeanUtils.toBean(updateReqVO, ElderlyNursingLogDO.class);
-        if (nursingLog.getTenantId() == null) {
-            nursingLog.setTenantId(TenantContextHolder.getTenantId());
-        }
+        nursingLog.setStatus(1);
         nursingLogMapper.updateById(nursingLog);
     }
 
@@ -83,9 +84,8 @@ public class ElderlyNursingLogServiceImpl implements ElderlyNursingLogService {
         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::getFinishTime)
                         .orderByDesc(ElderlyNursingLogDO::getId));
 
         List<ElderlyNursingLogDO> list = pageResult.getList();
@@ -122,11 +122,13 @@ public class ElderlyNursingLogServiceImpl implements ElderlyNursingLogService {
     @Override
     public List<ElderlyNursingLogRespVO> getList(ElderlyNursingLogListReqVO listReqVO) {
         // 查询护理记录列表(关联护理项目名称)
-        List<ElderlyNursingLogRespVO> voList = nursingLogMapper.selectListWithItemName(
+        List<ElderlyNursingLogRespVO> voList = nursingLogMapper.getFinishList(
                 listReqVO.getNurse(),
+                listReqVO.getElderName(),
                 listReqVO.getTenantId(),
-                listReqVO.getStartDate(),
-                listReqVO.getEndDate());
+                listReqVO.getFrequencyCategoryType(),
+                listReqVO.getStartDate().atStartOfDay(),
+                listReqVO.getEndDate().plusDays(1).atStartOfDay());
 
         if (CollectionUtil.isEmpty(voList)) {
             return Collections.emptyList();
@@ -139,7 +141,7 @@ public class ElderlyNursingLogServiceImpl implements ElderlyNursingLogService {
     }
 
     @Override
-    public ElderlyNursingLogDetailRespVO getDetailByElderId(Long elderId, LocalDate start, LocalDate end) {
+    public ElderlyNursingLogDetailRespVO getDetailByElderId(Long elderId, LocalDate start, LocalDate end, Integer pageNo, Integer pageSize) {
         if (elderId == null) {
             return null;
         }
@@ -147,7 +149,14 @@ public class ElderlyNursingLogServiceImpl implements ElderlyNursingLogService {
         if (elder == null) {
             return null;
         }
-        List<ElderlyNursingLogRespVO> records = nursingLogMapper.selectByElderIdWithItemName(elderId, start, end);
+        Page<ElderlyNursingLogRespVO> page = new Page<>(
+                pageNo == null ? 1 : pageNo,
+                pageSize == null ? 10 : pageSize
+        );
+        List<ElderlyNursingLogRespVO> records = nursingLogMapper.selectPageByElderIdWithItemName(page,
+                elderId,
+                start == null ? null : start.atStartOfDay(),
+                end == null ? null : end.plusDays(1).atStartOfDay());
 
         ElderlyNursingLogDetailRespVO detailRespVO = new ElderlyNursingLogDetailRespVO();
         ElderlyNursingLogDetailRespVO.Header header = new ElderlyNursingLogDetailRespVO.Header();
@@ -161,7 +170,7 @@ public class ElderlyNursingLogServiceImpl implements ElderlyNursingLogService {
             record.setBedName(header.getBedName());
             record.setNurseLevelName(elder.getNurseLevelName());
         }
-        detailRespVO.setRecords(records);
+        detailRespVO.setRecords(new PageResult<>(records, page.getTotal()));
         return detailRespVO;
     }
 

+ 5 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/ElderlySpecialNursingLogService.java

@@ -4,13 +4,16 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogListReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogSimpleRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanCancelReqVO;
 
 import java.util.List;
 
 public interface ElderlySpecialNursingLogService {
 
-    PageResult<ElderlySpecialNursingLogRespVO> getPage(ElderlySpecialNursingLogPageReqVO pageReqVO);
+    PageResult<ElderlySpecialNursingLogSimpleRespVO> getPage(ElderlySpecialNursingLogPageReqVO pageReqVO);
 
     List<ElderlySpecialNursingLogRespVO> getListByElderIdAndFinishTime(ElderlySpecialNursingLogListReqVO listReqVO);
-}
 
+    Boolean cancel(SpecialNursingPlanCancelReqVO reqVO);
+}

+ 41 - 15
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/ElderlySpecialNursingLogServiceImpl.java

@@ -1,16 +1,20 @@
 package cn.iocoder.yudao.module.system.service.nursing;
 
 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.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogListReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogSimpleRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanCancelReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyInfoDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlySpecialNursingLogDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlySpecialNursingPlanItemDO;
 import cn.iocoder.yudao.module.system.dal.mysql.biz.ElderlyInfoMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.biz.ElderlySpecialNursingLogMapper;
+import cn.iocoder.yudao.module.system.dal.mysql.biz.SpecialNursingPlanItemMapper;
+import cn.iocoder.yudao.module.system.service.biz.BuildService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -20,6 +24,9 @@ import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.COMMON_NOT_FOUND;
+
 @Service
 @Validated
 public class ElderlySpecialNursingLogServiceImpl implements ElderlySpecialNursingLogService {
@@ -28,13 +35,23 @@ public class ElderlySpecialNursingLogServiceImpl implements ElderlySpecialNursin
     private ElderlySpecialNursingLogMapper elderlySpecialNursingLogMapper;
     @Resource
     private ElderlyInfoMapper elderlyInfoMapper;
+    @Resource
+    private SpecialNursingPlanItemMapper specialNursingPlanItemMapper;
+
+    @Autowired
+    private BuildService buildService;
 
     @Override
-    public PageResult<ElderlySpecialNursingLogRespVO> getPage(ElderlySpecialNursingLogPageReqVO pageReqVO) {
+    public PageResult<ElderlySpecialNursingLogSimpleRespVO> getPage(ElderlySpecialNursingLogPageReqVO pageReqVO) {
 
-        Page<ElderlySpecialNursingLogRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
-        List<ElderlySpecialNursingLogRespVO> records = elderlySpecialNursingLogMapper
+        Page<ElderlySpecialNursingLogSimpleRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
+        List<ElderlySpecialNursingLogSimpleRespVO> records = elderlySpecialNursingLogMapper
                 .selectPageWithElderInfo(page, pageReqVO);
+        for (ElderlySpecialNursingLogSimpleRespVO record : records) {
+            if (record.getBedId() != null) {
+                record.setBedName(buildService.getFullBedNameByBedId(record.getBedId()));
+            }
+        }
         page.setRecords(records);
         return new PageResult<>(records, page.getTotal());
     }
@@ -44,22 +61,23 @@ public class ElderlySpecialNursingLogServiceImpl implements ElderlySpecialNursin
         LocalDateTime begin = toBegin(listReqVO.getFinishTime());
         LocalDateTime endExclusive = toEndExclusive(listReqVO.getFinishTime());
 
-        LambdaQueryWrapperX<ElderlySpecialNursingLogDO> wrapper = new LambdaQueryWrapperX<ElderlySpecialNursingLogDO>()
-                .eq(ElderlySpecialNursingLogDO::getElderId, listReqVO.getElderId())
-                .eqIfPresent(ElderlySpecialNursingLogDO::getTenantId, listReqVO.getTenantId())
-                .geIfPresent(ElderlySpecialNursingLogDO::getFinishTime, begin)
-                .ltIfPresent(ElderlySpecialNursingLogDO::getFinishTime, endExclusive)
-                .orderByDesc(ElderlySpecialNursingLogDO::getFinishTime)
-                .orderByDesc(ElderlySpecialNursingLogDO::getId);
-        List<ElderlySpecialNursingLogDO> list = elderlySpecialNursingLogMapper.selectList(wrapper);
-        if (list.isEmpty()) {
+        List<ElderlySpecialNursingLogRespVO> respList = elderlySpecialNursingLogMapper
+                .selectListByElderIdAndFinishTimeWithItemName(listReqVO.getElderId(), listReqVO.getTenantId(), begin, endExclusive);
+        if (respList.isEmpty()) {
             return Collections.emptyList();
         }
-        List<ElderlySpecialNursingLogRespVO> respList = BeanUtils.toBean(list, ElderlySpecialNursingLogRespVO.class);
         enrichElderInfo(respList);
         return respList;
     }
 
+    @Override
+    public Boolean cancel(SpecialNursingPlanCancelReqVO reqVO) {
+        validateExists(reqVO);
+        elderlySpecialNursingLogMapper.updateById(new ElderlySpecialNursingLogDO().setId(reqVO.getId()).setStatus(1));
+        specialNursingPlanItemMapper.updateById(new ElderlySpecialNursingPlanItemDO().setId(reqVO.getSpecialItemId()).setStatus(0));
+        return true;
+    }
+
     private void enrichElderInfo(List<ElderlySpecialNursingLogRespVO> respList) {
         Set<Long> elderIds = respList.stream()
                 .map(ElderlySpecialNursingLogRespVO::getElderId)
@@ -94,4 +112,12 @@ public class ElderlySpecialNursingLogServiceImpl implements ElderlySpecialNursin
         }
         return range[1].plusDays(1).atStartOfDay();
     }
+    private void validateExists(SpecialNursingPlanCancelReqVO reqVO) {
+        if (reqVO.getId() == null || elderlySpecialNursingLogMapper.selectById(reqVO.getId()) == null) {
+            throw exception(COMMON_NOT_FOUND);
+        }
+        if (reqVO.getSpecialItemId() == null || specialNursingPlanItemMapper.selectById(reqVO.getSpecialItemId()) == null) {
+            throw exception(COMMON_NOT_FOUND);
+        }
+    }
 }

+ 6 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/NursingPlanService.java

@@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.system.service.nursing;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanPageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanLogRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanLowFrequencyByFloorRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanSaveReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.NursingPlanDO;
@@ -27,7 +29,9 @@ public interface NursingPlanService {
 
     void copyNursingPlan(NursingPlanSaveReqVO saveReqVO);
 
-    List<NursingPlanRespVO> getNursingPlanByElderId(Long elderId);
+    List<NursingPlanLogRespVO> getNursingPlanByElderId(Long elderId);
+
+    List<NursingPlanLowFrequencyByFloorRespVO> getLowFrequencyPlanItemsByFloorId(Long floorId,Long tenantId);
 
     List<NursingPlanDO> selectAll();
-}
+}

+ 48 - 13
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/NursingPlanServiceImpl.java

@@ -4,10 +4,14 @@ import cn.hutool.core.collection.CollectionUtil;
 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.framework.tenant.core.context.TenantContextHolder;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanItemRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanLogRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanLowFrequencyByFloorRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanSaveReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanItemWithElderVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.DailyExpensesDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyContractDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyInfoDO;
@@ -22,10 +26,12 @@ import cn.iocoder.yudao.module.system.dal.mysql.biz.NurseItemMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.biz.NursingCategoryMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.biz.NursingPlanItemMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.biz.NursingPlanMapper;
+import cn.iocoder.yudao.module.system.dal.mysql.elderly.ElderlyNursingLogMapper;
 import cn.iocoder.yudao.module.system.enums.common.BooleanEnum;
 import cn.iocoder.yudao.module.system.service.biz.BuildService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -37,6 +43,7 @@ import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
@@ -73,6 +80,9 @@ public class NursingPlanServiceImpl implements NursingPlanService {
     @Resource
     private DailyExpensesMapper dailyExpensesMapper;
 
+    @Autowired
+    private ElderlyNursingLogMapper elderlyNursingLogMapper;
+
     @Override
     @Transactional
     public void createNursingPlan(NursingPlanSaveReqVO createReqVO) {
@@ -90,6 +100,7 @@ public class NursingPlanServiceImpl implements NursingPlanService {
         NursingPlanDO nursingPlan = new NursingPlanDO();
         BeanUtils.copyProperties(createReqVO, nursingPlan);
         nursingPlan.setCreatedTime(new Date());
+        nursingPlan.setStatus(1);
         nursingPlan.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
 
 
@@ -151,7 +162,7 @@ public class NursingPlanServiceImpl implements NursingPlanService {
         respVO.setNurseLevelName(elderlyInfoDO == null ? null : elderlyInfoDO.getNurseLevelName());
 
         List<NursingPlanItemRespVO> allItems =
-                nursingPlanItemMapper.selectNursingPlanItemsWithFrequencyCategory(nursingPlanDO.getId(), null);
+                nursingPlanItemMapper.selectNursingPlanItemsWithFrequencyCategory(nursingPlanDO.getId(), null,null);
         Map<Boolean, List<NursingPlanItemRespVO>> itemGroup = allItems.stream()
                 .collect(Collectors.partitioningBy(item -> BooleanEnum.TRUE.getValue().equals(item.getIsExtra())));
 
@@ -275,20 +286,44 @@ public class NursingPlanServiceImpl implements NursingPlanService {
     }
 
     @Override
-    public List<NursingPlanRespVO> getNursingPlanByElderId(Long elderId) {
-        List<NursingPlanDO> nursingPlanList = nursingPlanMapper.selectList(new LambdaQueryWrapperX<NursingPlanDO>()
-                .eq(NursingPlanDO::getElderId, elderId));
-
-        return nursingPlanList.stream().map(e -> {
-            NursingPlanRespVO respVO = new NursingPlanRespVO();
-            BeanUtils.copyProperties(e, respVO);
+    public List<NursingPlanLogRespVO> getNursingPlanByElderId(Long elderId) {
+        return elderlyNursingLogMapper.selectPlanLogByElderIdWithItemName(elderId);
+    }
 
-            List<NursingPlanItemRespVO> nursingPlanItem =
-                    nursingPlanItemMapper.selectNursingPlanItemsWithFrequencyCategory(e.getId(), null);
+    @Override
+    public List<NursingPlanLowFrequencyByFloorRespVO> getLowFrequencyPlanItemsByFloorId(Long floorId,Long tenantId) {
+        List<ElderlyInfoDO> elders = elderlyInfoMapper.selectList(new LambdaQueryWrapperX<ElderlyInfoDO>()
+                .select(ElderlyInfoDO::getId, ElderlyInfoDO::getElderName)
+                .eq(ElderlyInfoDO::getFloorId, floorId)
+                .eq(ElderlyInfoDO::getInStatus, 1));
+        if (CollectionUtil.isEmpty(elders)) {
+            return Collections.emptyList();
+        }
 
-            respVO.setItems(nursingPlanItem);
-            return respVO;
-        }).collect(Collectors.toList());
+        List<Long> elderIds = elders.stream().map(ElderlyInfoDO::getId).collect(Collectors.toList());
+        List<NursingPlanItemWithElderVO> rows = nursingPlanItemMapper
+                .selectPlanItemsWithElderByElderIdsAndFrequencyCategoryType(elderIds, 2, LocalDate.now(), tenantId);
+
+        Map<Long, List<NursingPlanItemRespVO>> itemsByElderId = rows.stream()
+                .filter(r -> r.getElderId() != null)
+                .collect(Collectors.groupingBy(NursingPlanItemWithElderVO::getElderId,
+                        Collectors.mapping(r -> {
+                            NursingPlanItemRespVO item = new NursingPlanItemRespVO();
+                            BeanUtils.copyProperties(r, item);
+                            return item;
+                        }, Collectors.toList())));
+
+        List<NursingPlanLowFrequencyByFloorRespVO> result = new ArrayList<>(elders.size());
+        for (ElderlyInfoDO elder : elders) {
+            NursingPlanLowFrequencyByFloorRespVO vo = new NursingPlanLowFrequencyByFloorRespVO();
+            vo.setElderId(elder.getId());
+            vo.setElderName(elder.getElderName());
+            vo.setItems(itemsByElderId.getOrDefault(elder.getId(), Collections.emptyList()));
+            result.add(vo);
+        }
+        return result.stream()
+                .filter(e->CollectionUtil.isNotEmpty(e.getItems()))
+                .collect(Collectors.toList());
     }
 
     @Override

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

@@ -1,13 +1,11 @@
 package cn.iocoder.yudao.module.system.service.nursing;
 
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemExecuteReqVO;
-import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemSaveReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemUnfinishedByFloorRespVO;
 
 import java.util.List;
 
 public interface SpecialNursingPlanItemService {
-    void update(SpecialNursingPlanItemSaveReqVO updateReqVO);
     void executePlan(SpecialNursingPlanItemExecuteReqVO executeReqVO);
 
     List<SpecialNursingPlanItemUnfinishedByFloorRespVO> getUnfinishedByFloorId(Long floorId);

+ 0 - 16
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/SpecialNursingPlanItemServiceImpl.java

@@ -3,11 +3,8 @@ package cn.iocoder.yudao.module.system.service.nursing;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.hutool.core.collection.CollectionUtil;
-import cn.iocoder.yudao.module.system.controller.admin.biz.vo.BuildBedInfoVO;
-import cn.iocoder.yudao.module.system.controller.admin.biz.vo.BuildRoomInfoVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemExecuteReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemRespVO;
-import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemSaveReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemUnfinishedByFloorRespVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyInfoDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlySpecialNursingLogDO;
@@ -49,13 +46,6 @@ public class SpecialNursingPlanItemServiceImpl implements SpecialNursingPlanItem
 
 
     @Override
-    public void update(SpecialNursingPlanItemSaveReqVO updateReqVO) {
-        validateExists(updateReqVO.getId());
-        ElderlySpecialNursingPlanItemDO updateObj = BeanUtils.toBean(updateReqVO, ElderlySpecialNursingPlanItemDO.class);
-        specialNursingPlanItemMapper.updateById(updateObj);
-    }
-
-    @Override
     @Transactional(rollbackFor = Exception.class)
     public void executePlan(SpecialNursingPlanItemExecuteReqVO executeReqVO) {
         ElderlySpecialNursingPlanItemDO specialItem = specialNursingPlanItemMapper.selectById(executeReqVO.getSpecialPlanItemId());
@@ -180,10 +170,4 @@ public class SpecialNursingPlanItemServiceImpl implements SpecialNursingPlanItem
 
         return result;
     }
-
-    private void validateExists(Long id) {
-        if (id == null || specialNursingPlanItemMapper.selectById(id) == null) {
-            throw exception(COMMON_NOT_FOUND);
-        }
-    }
 }

+ 1 - 5
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/SpecialNursingPlanServiceImpl.java

@@ -3,11 +3,7 @@ package cn.iocoder.yudao.module.system.service.nursing;
 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.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemRespVO;
-import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemSaveReqVO;
-import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanPageReqVO;
-import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanRespVO;
-import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanSaveReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.*;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlySpecialNursingPlanItemDO;
 import cn.iocoder.yudao.module.system.dal.mysql.biz.SpecialNursingPlanItemMapper;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlySpecialNursingPlanDO;

+ 60 - 12
yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlyNursingLogMapper.xml

@@ -2,54 +2,102 @@
 <!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 id="selectLatestCreateTimeByPlanItemIds"
+            resultType="cn.iocoder.yudao.module.system.dal.mysql.elderly.ElderlyNursingLogMapper$LatestCreateTimeDTO">
+        SELECT
+            enl.nursing_plan_item_id AS nursingPlanItemId,
+            MAX(enl.create_time) AS createTime
+        FROM elderly_nursing_log enl
+        WHERE enl.tenant_id = #{tenantId}
+          AND enl.nursing_plan_item_id IN
+            <foreach collection="nursingPlanItemIds" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        GROUP BY enl.nursing_plan_item_id
+    </select>
+
+    <select id="getFinishList" resultType="cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogRespVO">
         SELECT
             enl.id,
             enl.elder_id AS elderId,
+            enp.elder_name AS elderName,
             enl.nurse,
             enl.nursing_plan_item_id AS nursingPlanItemId,
             npi.nurse_item_name AS nursingItemName,
-            enl.image,
+            ni.frequency_category_type AS frequencyCategoryType,
             enl.remark,
+            enl.finish_time AS finishTime,
             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
+        LEFT JOIN nurse_item ni ON npi.nurse_item_id = ni.id
+        LEFT JOIN elderly_nursing_plan enp ON enp.id = npi.nursing_plan_id
+        WHERE enl.status = 1
             <if test="nurse != null and nurse != ''">
                 AND enl.nurse LIKE CONCAT('%', #{nurse}, '%')
             </if>
+            <if test="elderName != null and elderName != ''">
+                AND enp.elder_name LIKE CONCAT('%', #{elderName}, '%')
+            </if>
             <if test="tenantId != null">
                 AND enl.tenant_id = #{tenantId}
             </if>
+            <if test="frequencyCategoryType != null">
+                AND ni.frequency_category_type = #{frequencyCategoryType}
+            </if>
             <if test="startDate != null">
-                AND enl.nurse_date &gt;= #{startDate}
+                AND enl.finish_time &gt;= #{startDate}
             </if>
             <if test="endDate != null">
-                AND enl.nurse_date &lt;= #{endDate}
+                AND enl.finish_time &lt;= #{endDate}
             </if>
-        ORDER BY enl.nurse_date DESC, enl.id DESC
+        ORDER BY enl.finish_time DESC, enl.id DESC
     </select>
 
-    <select id="selectByElderIdWithItemName" resultType="cn.iocoder.yudao.module.system.controller.admin.elderly.vo.ElderlyNursingLogRespVO">
+    <select id="selectPageByElderIdWithItemName" 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,
+            ni.frequency_category_type AS frequencyCategoryType,
             enl.remark,
-            enl.nurse_date AS nurseDate,
+            enl.status,
+            enl.finish_time AS finishTime,
             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}
+        LEFT JOIN nurse_item ni ON npi.nurse_item_id = ni.id
+        WHERE enl.elder_id = #{elderId} AND enl.status != 0
             <if test="startDate != null">
-                AND enl.nurse_date &gt;= #{startDate}
+                AND enl.create_time &gt;= #{startDate}
             </if>
             <if test="endDate != null">
-                AND enl.nurse_date &lt;= #{endDate}
+                AND enl.create_time &lt;= #{endDate}
             </if>
+        ORDER BY enl.create_time DESC, enl.id DESC
+    </select>
+
+    <select id="selectPlanLogByElderIdWithItemName"
+            resultType="cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanLogRespVO">
+        SELECT
+            enl.id,
+            enl.nursing_plan_item_id AS nursingPlanItemId,
+            npi.nurse_item_name AS nurseItemName,
+            enl.elder_id AS elderId,
+            enl.nurse,
+            enl.remark,
+            enl.nurse_date AS nurseDate,
+            enl.tenant_id AS tenantId,
+            enl.finish_time AS finishTime,
+            enl.timeout,
+            enl.status,
+            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}
+          AND enl.status != 1
         ORDER BY enl.nurse_date DESC, enl.id DESC
     </select>
 

+ 34 - 10
yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlySpecialNursingLogMapper.xml

@@ -3,18 +3,13 @@
 <mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.biz.ElderlySpecialNursingLogMapper">
 
     <select id="selectPageWithElderInfo"
-            resultType="cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogRespVO">
+            resultType="cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogSimpleRespVO">
         SELECT
-            log.id,
-            log.special_plan_item_id AS specialPlanItemId,
-            log.elder_id AS elderId,
+            ei.id as elderId,
             ei.elder_name AS elderName,
-            ei.bed_name AS bedName,
+            ei.bed_id AS bedId,
             ei.nurse_level_name AS nurseLevelName,
-            log.finish_time AS finishTime,
-            log.remark,
-            log.image_url AS imageUrl,
-            log.tenant_id AS tenantId
+            MAX(log.finish_time) AS finishTime
         FROM elderly_special_nursing_log log
         LEFT JOIN elderly_info ei
             ON ei.id = log.elder_id
@@ -32,8 +27,37 @@
             <if test="pageVO.elderName != null and pageVO.elderName != ''">
                 AND ei.elder_name LIKE CONCAT('%', #{pageVO.elderName}, '%')
             </if>
+        GROUP BY log.tenant_id, log.elder_id, ei.elder_name, ei.bed_id, ei.nurse_level_name
+        ORDER BY MAX(log.finish_time) DESC
+    </select>
+
+    <select id="selectListByElderIdAndFinishTimeWithItemName"
+            resultType="cn.iocoder.yudao.module.system.controller.admin.nursing.vo.ElderlySpecialNursingLogRespVO">
+        SELECT
+            log.id,
+            log.special_plan_item_id AS specialPlanItemId,
+            item.nurse_item_name AS specialPlanItemName,
+            log.elder_id AS elderId,
+            log.finish_time AS finishTime,
+            log.remark,
+            log.image_url AS imageUrl,
+            log.status,
+            log.tenant_id AS tenantId
+        FROM elderly_special_nursing_log log
+        LEFT JOIN elderly_special_nursing_plan_item item
+            ON item.id = log.special_plan_item_id
+            AND item.tenant_id = log.tenant_id
+        WHERE log.elder_id = #{elderId}
+            <if test="tenantId != null">
+                AND log.tenant_id = #{tenantId}
+            </if>
+            <if test="begin != null">
+                AND log.finish_time &gt;= #{begin}
+            </if>
+            <if test="endExclusive != null">
+                AND log.finish_time &lt; #{endExclusive}
+            </if>
         ORDER BY log.finish_time DESC, log.id DESC
     </select>
 
 </mapper>
-

+ 73 - 2
yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/NursingPlanItemMapper.xml

@@ -8,8 +8,8 @@
                enpi.nursing_plan_id,
                enpi.nurse_item_id,
                enpi.nurse_item_name,
-               enpi.frequency,
-               enpi.frequency_type,
+               ni.frequency as frequency,
+               ni.frequency_type as frequencyType,
                enpi.operating_mode,
                enpi.is_delete,
                enpi.is_extra,
@@ -26,8 +26,79 @@
             <if test="isExtra != null">
                 and enpi.is_extra = #{isExtra}
             </if>
+            <if test="isHighFrequencyCategoryType != null">
+                and ni.frequency_category_type = #{isHighFrequencyCategoryType}
+            </if>
         </where>
         order by enpi.id asc
     </select>
 
+    <select id="selectHighFrequencyPlanItems"
+            resultType="cn.iocoder.yudao.module.system.controller.admin.nursing.vo.HighFrequencyPlanItemVO">
+        select enp.elder_id        as elderId,
+               enp.id              as nursingPlanId,
+               enpi.id             as nursingPlanItemId,
+               enpi.nurse_item_id  as nurseItemId,
+               ni.frequency        as frequency,
+               ni.frequency_type   as frequencyType,
+               enpi.operating_mode as operatingMode,
+               enpi.begin_time     as beginTime,
+               ni.timeout          as timeout
+        from elderly_nursing_plan_item enpi
+                 inner join elderly_nursing_plan enp on enp.id = enpi.nursing_plan_id
+                 inner join elderly_info ei on ei.id = enp.elder_id
+                 inner join nurse_item ni on ni.id = enpi.nurse_item_id
+        <where>
+            enpi.is_delete = 0
+            and enp.status = 1
+            and enp.effective_date &lt;= #{today}
+            and (enp.expiration_date is null or enp.expiration_date &gt;= #{today})
+            and ei.tenant_id = #{tenantId}
+            and ni.tenant_id = #{tenantId}
+            and ni.status = 1
+            and ni.frequency_category_type = 1
+        </where>
+        order by enp.elder_id asc, enpi.id asc
+    </select>
+
+    <select id="selectPlanItemsWithElderByElderIdsAndFrequencyCategoryType"
+            resultType="cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanItemWithElderVO">
+        select ei.id as elderId,
+               ei.elder_name as elderName,
+               enpi.id,
+               enpi.nursing_plan_id,
+               enpi.nurse_item_id,
+               enpi.nurse_item_name,
+               ni.frequency as frequency,
+               ni.frequency_type as frequencyType,
+               enpi.operating_mode,
+               enpi.is_delete,
+               enpi.is_extra,
+               enpi.begin_time,
+               enpi.created_time,
+               enpi.created_by,
+               ni.frequency_category,
+               ni.frequency_category_type
+        from elderly_info ei
+                 inner join elderly_nursing_plan enp on enp.elder_id = ei.id
+                 inner join elderly_nursing_plan_item enpi on enpi.nursing_plan_id = enp.id
+                 inner join nurse_item ni on ni.id = enpi.nurse_item_id
+        <where>
+            ei.id in
+            <foreach collection="elderIds" item="elderId" open="(" separator="," close=")">
+                #{elderId}
+            </foreach>
+            and ei.in_status = 1
+            and enp.status = 1
+            and enp.effective_date &lt;= #{today}
+            and (enp.expiration_date is null or enp.expiration_date &gt;= #{today})
+            and enpi.is_delete = 0
+            and ni.frequency_category_type = #{frequencyCategoryType}
+            and ni.status = 1
+            and ei.tenant_id = #{tenantId}
+            and ni.tenant_id = #{tenantId}
+        </where>
+        order by ei.id asc, enpi.id asc
+    </select>
+
 </mapper>

+ 2 - 0
yudao-server/src/main/resources/application.yaml

@@ -243,6 +243,8 @@ yudao:
       - /admin-api/nurse/nurseLeve/simple-list
       - /admin-api/nursing/special-plan-item/getUnfinishedByFloorId
       - /admin-api/nursing/special-plan-item/execute
+      - /admin-api/elderly-nursing-log/executeNursingLog
+      - /admin-api/elderly/nursingPlan/getLowFrequencyPlanItemsByFloorId
 #      - /admin-api/bpm/check-in-wait/create
     ignore-tables:
       - system_tenant