Przeglądaj źródła

新增
1、新增特殊护理计划模块
修改
1、护理计划重构
BUGFIX
1、解决导入入住办理没有赋值分类名称问题

liangwenxuan 3 tygodni temu
rodzic
commit
c0b575aca8
28 zmienionych plików z 801 dodań i 43 usunięć
  1. 78 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/SpecialNursingPlanController.java
  2. 78 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/SpecialNursingPlanItemController.java
  3. 60 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/NursingPlanItemRespVO.java
  4. 1 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/NursingPlanItemVO.java
  5. 3 4
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/NursingPlanRespVO.java
  6. 30 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/SpecialNursingPlanItemPageReqVO.java
  7. 42 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/SpecialNursingPlanItemRespVO.java
  8. 33 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/SpecialNursingPlanItemSaveReqVO.java
  9. 24 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/SpecialNursingPlanPageReqVO.java
  10. 36 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/SpecialNursingPlanRespVO.java
  11. 26 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/nursing/vo/SpecialNursingPlanSaveReqVO.java
  12. 10 9
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/NurseItemDO.java
  13. 12 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/NursingPlanItemDO.java
  14. 39 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/SpecialNursingPlanDO.java
  15. 45 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/SpecialNursingPlanItemDO.java
  16. 8 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/biz/NursingPlanItemMapper.java
  17. 23 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/biz/SpecialNursingPlanItemMapper.java
  18. 21 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/biz/SpecialNursingPlanMapper.java
  19. 2 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/BuildServiceImpl.java
  20. 13 5
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseServiceImpl.java
  21. 0 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/NurseItemServiceImpl.java
  22. 0 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/NurseLevelServiceImpl.java
  23. 12 17
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/NursingPlanServiceImpl.java
  24. 20 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/SpecialNursingPlanItemService.java
  25. 66 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/SpecialNursingPlanItemServiceImpl.java
  26. 20 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/SpecialNursingPlanService.java
  27. 66 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/nursing/SpecialNursingPlanServiceImpl.java
  28. 33 0
      yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/NursingPlanItemMapper.xml

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

@@ -0,0 +1,78 @@
+package cn.iocoder.yudao.module.system.controller.admin.nursing;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+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.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.service.nursing.SpecialNursingPlanService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 特殊照护计划")
+@RestController
+@RequestMapping("/nursing/special-plan")
+@Validated
+public class SpecialNursingPlanController {
+
+    @Resource
+    private SpecialNursingPlanService specialNursingPlanService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建特殊照护计划")
+    public CommonResult<Long> create(@Valid @RequestBody SpecialNursingPlanSaveReqVO createReqVO) {
+        if (createReqVO.getTenantId() == null) {
+            createReqVO.setTenantId(TenantContextHolder.getTenantId());
+        }
+        return success(specialNursingPlanService.create(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新特殊照护计划")
+    @TenantIgnore
+    public CommonResult<Boolean> update(@Valid @RequestBody SpecialNursingPlanSaveReqVO updateReqVO) {
+        if (updateReqVO.getTenantId() == null) {
+            updateReqVO.setTenantId(TenantContextHolder.getTenantId());
+        }
+        specialNursingPlanService.update(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除特殊照护计划")
+    @Parameter(name = "id", description = "编号", required = true)
+    @TenantIgnore
+    public CommonResult<Boolean> delete(@RequestParam("id") Long id) {
+        specialNursingPlanService.delete(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得特殊照护计划详情")
+    @Parameter(name = "id", description = "编号", required = true, example = "1")
+    @TenantIgnore
+    public CommonResult<SpecialNursingPlanRespVO> get(@RequestParam("id") Long id) {
+        return success(specialNursingPlanService.get(id));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得特殊照护计划分页")
+    @TenantIgnore
+    public CommonResult<PageResult<SpecialNursingPlanRespVO>> page(@Valid SpecialNursingPlanPageReqVO pageReqVO) {
+        if (pageReqVO.getTenantIds() == null) {
+            pageReqVO.setTenantIds(new Long[]{TenantContextHolder.getTenantId()});
+        }
+        return success(specialNursingPlanService.getPage(pageReqVO));
+    }
+}
+

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

@@ -0,0 +1,78 @@
+package cn.iocoder.yudao.module.system.controller.admin.nursing;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+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.SpecialNursingPlanItemPageReqVO;
+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.service.nursing.SpecialNursingPlanItemService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 特殊照护计划明细")
+@RestController
+@RequestMapping("/nursing/special-plan-item")
+@Validated
+public class SpecialNursingPlanItemController {
+
+    @Resource
+    private SpecialNursingPlanItemService specialNursingPlanItemService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建特殊照护计划明细")
+    public CommonResult<Long> create(@Valid @RequestBody SpecialNursingPlanItemSaveReqVO createReqVO) {
+        if (createReqVO.getTenantId() == null) {
+            createReqVO.setTenantId(TenantContextHolder.getTenantId());
+        }
+        return success(specialNursingPlanItemService.create(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新特殊照护计划明细")
+    @TenantIgnore
+    public CommonResult<Boolean> update(@Valid @RequestBody SpecialNursingPlanItemSaveReqVO updateReqVO) {
+        if (updateReqVO.getTenantId() == null) {
+            updateReqVO.setTenantId(TenantContextHolder.getTenantId());
+        }
+        specialNursingPlanItemService.update(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除特殊照护计划明细")
+    @Parameter(name = "id", description = "编号", required = true)
+    @TenantIgnore
+    public CommonResult<Boolean> delete(@RequestParam("id") Long id) {
+        specialNursingPlanItemService.delete(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得特殊照护计划明细详情")
+    @Parameter(name = "id", description = "编号", required = true, example = "1")
+    @TenantIgnore
+    public CommonResult<SpecialNursingPlanItemRespVO> get(@RequestParam("id") Long id) {
+        return success(specialNursingPlanItemService.get(id));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得特殊照护计划明细分页")
+    @TenantIgnore
+    public CommonResult<PageResult<SpecialNursingPlanItemRespVO>> page(@Valid SpecialNursingPlanItemPageReqVO pageReqVO) {
+        if (pageReqVO.getTenantIds() == null) {
+            pageReqVO.setTenantIds(new Long[]{TenantContextHolder.getTenantId()});
+        }
+        return success(specialNursingPlanItemService.getPage(pageReqVO));
+    }
+}
+

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

@@ -0,0 +1,60 @@
+package cn.iocoder.yudao.module.system.controller.admin.nursing.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+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 NursingPlanItemRespVO {
+
+    @Schema(description = "主键ID")
+    private Long id;
+
+    @Schema(description = "护理计划ID")
+    private Long nursingPlanId;
+
+    @Schema(description = "护理项目ID")
+    private Long nurseItemId;
+
+    @Schema(description = "护理项目名称")
+    private String nurseItemName;
+
+    @Schema(description = "频次")
+    private Integer frequency;
+
+    @Schema(description = "频次单位")
+    private Integer frequencyType;
+
+    @Schema(description = "频次类别")
+    private String frequencyCategory;
+
+    @Schema(description = "频次类型,1:高频,2:中/低频")
+    private Integer frequencyCategoryType;
+
+    @Schema(description = "操作方式")
+    private String operatingMode;
+
+    @Schema(description = "是否删除,0:正常 1:删除")
+    private Integer isDelete;
+
+    @Schema(description = "是否是额外护理项目")
+    private Integer isExtra;
+
+    @Schema(description = "护理开始时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime beginTime;
+
+    @Schema(description = "创建时间")
+    private Date createdTime;
+
+    @Schema(description = "创建人")
+    private String createdBy;
+
+    @Schema(description = "护理分类名称")
+    private String categoryName;
+}

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

@@ -46,7 +46,7 @@ public class NursingPlanItemVO {
      * 频次单位
      */
     @Schema(description = "频次单位")
-    private String frequencyUnit;
+    private String frequencyTypeUnit;
     /**
      * 操作方式
      */

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

@@ -1,6 +1,5 @@
 package cn.iocoder.yudao.module.system.controller.admin.nursing.vo;
 
-import cn.iocoder.yudao.module.system.dal.dataobject.biz.NursingPlanItemDO;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
@@ -81,14 +80,14 @@ public class NursingPlanRespVO {
     private Integer status;
 
     @Schema(description = "护理项目列表")
-    private List<NursingPlanItemDO> items;
+    private List<NursingPlanItemRespVO> items;
 
     @Schema(description = "额外护理项目列表")
-    private List<NursingPlanItemDO> extraItems;
+    private List<NursingPlanItemRespVO> extraItems;
 
     @Schema(description = "床位号")
     private String bedName;
 
     @Schema(description = "护理级别名称")
     private String nurseLevelName;
-}
+}

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

@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.system.controller.admin.nursing.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 特殊照护计划明细分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class SpecialNursingPlanItemPageReqVO extends PageParam {
+
+    @Schema(description = "特殊护理计划ID")
+    private Long specialNursingPlanId;
+
+    @Schema(description = "护理项目ID")
+    private Long nurseItemId;
+
+    @Schema(description = "护理项目名称")
+    private String nurseItemName;
+
+    @Schema(description = "状态,0:未完成,1:已完成")
+    private Integer status;
+
+    @Schema(description = "租户ID数组")
+    private Long[] tenantIds;
+}
+

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

@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.system.controller.admin.nursing.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 特殊照护计划明细 Response VO")
+@Data
+public class SpecialNursingPlanItemRespVO {
+
+    @Schema(description = "主键ID", example = "1")
+    private Long id;
+
+    @Schema(description = "特殊护理计划ID", example = "1")
+    private Long specialNursingPlanId;
+
+    @Schema(description = "护理项目ID", example = "1")
+    private Long nurseItemId;
+
+    @Schema(description = "护理项目名称")
+    private String nurseItemName;
+
+    @Schema(description = "状态,0:未完成,1:已完成")
+    private Integer status;
+
+    @Schema(description = "租户ID", example = "1")
+    private Long tenantId;
+
+    @Schema(description = "创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+    @Schema(description = "创建人")
+    private String creator;
+
+    @Schema(description = "更新人")
+    private String updater;
+}
+

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

@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.system.controller.admin.nursing.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 特殊照护计划明细新增/修改 Request VO")
+@Data
+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;
+}
+

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

@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.system.controller.admin.nursing.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 特殊照护计划分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class SpecialNursingPlanPageReqVO extends PageParam {
+
+    @Schema(description = "长者ID")
+    private Long elderId;
+
+    @Schema(description = "长者名称")
+    private String elderName;
+
+    @Schema(description = "租户ID数组")
+    private Long[] tenantIds;
+}
+

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

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.system.controller.admin.nursing.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 特殊照护计划 Response VO")
+@Data
+public class SpecialNursingPlanRespVO {
+
+    @Schema(description = "护理计划ID", example = "1")
+    private Long id;
+
+    @Schema(description = "长者ID", example = "1")
+    private Long elderId;
+
+    @Schema(description = "长者名称")
+    private String elderName;
+
+    @Schema(description = "租户ID", example = "1")
+    private Long tenantId;
+
+    @Schema(description = "创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+    @Schema(description = "创建人")
+    private String creator;
+
+    @Schema(description = "更新人")
+    private String updater;
+}
+

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

@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.system.controller.admin.nursing.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 特殊照护计划新增/修改 Request VO")
+@Data
+public class SpecialNursingPlanSaveReqVO {
+
+    @Schema(description = "护理计划ID(修改时必传)", example = "1")
+    private Long id;
+
+    @Schema(description = "长者ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "长者ID不能为空")
+    private Long elderId;
+
+    @Schema(description = "长者名称")
+    private String elderName;
+
+    @Schema(description = "租户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "租户ID不能为空")
+    private Long tenantId;
+}
+

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.system.dal.dataobject.biz;
 
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseNoDeleteDO;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -15,7 +16,7 @@ import java.util.List;
 
 @TableName("nurse_item")
 @Data
-public class NurseItemDO implements Serializable {
+public class NurseItemDO extends BaseNoDeleteDO implements Serializable {
 
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
@@ -41,21 +42,21 @@ public class NurseItemDO implements Serializable {
      */
     private String remark;
     /**
-     * 计量方式
+     * 频次
      */
-    private Integer frequency;
+    private BigDecimal frequency;
     /**
-     * 创建时间
+     * 频次计量方式,1:次/日,2:次/周,3:次/月,4:次/年
      */
-    private Date createTime;
+    private Integer frequencyType;
     /**
-     * 创建人
+     * 频次类别
      */
-    private String createdBy;
+    private String frequencyCategory;
     /**
-     * 项目编号
+     * 频次类型,1:高频,2:中/低频
      */
-    private String itemCode;
+    private Integer frequencyCategoryType;
     /**
      * 项目图标
      */

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.system.dal.dataobject.biz;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.*;
 
 import java.util.*;
@@ -7,6 +8,9 @@ import java.time.LocalDateTime;
 
 import com.baomidou.mybatisplus.annotation.*;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
 /**
  * 护理计划配置项 DO
@@ -46,7 +50,7 @@ public class NursingPlanItemDO {
     /**
      * 频次单位
      */
-    private String frequencyUnit;
+    private Integer frequencyType;
     /**
      * 操作方式
      */
@@ -62,6 +66,13 @@ public class NursingPlanItemDO {
     private Integer isExtra;
 
     /**
+     * 护理开始时间
+     */
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime beginTime;
+
+    /**
      * 创建时间
      */
     private Date createdTime;

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

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.system.dal.dataobject.biz;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseNoDeleteDO;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+/**
+ * 特殊照护计划 DO
+ */
+@TableName("elderly_special_nursing_plan")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SpecialNursingPlanDO extends BaseNoDeleteDO {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @Schema(description = "长者ID")
+    private Long elderId;
+
+    @Schema(description = "长者名称")
+    private String elderName;
+
+    @Schema(description = "租户ID")
+    private Long tenantId;
+}
+

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

@@ -0,0 +1,45 @@
+package cn.iocoder.yudao.module.system.dal.dataobject.biz;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseNoDeleteDO;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+/**
+ * 特殊照护计划明细 DO
+ */
+@TableName("elderly_special_nursing_plan_item")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SpecialNursingPlanItemDO extends BaseNoDeleteDO {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @Schema(description = "特殊护理计划ID")
+    private Long specialNursingPlanId;
+
+    @Schema(description = "护理项目ID")
+    private Long nurseItemId;
+
+    @Schema(description = "护理项目名称")
+    private String nurseItemName;
+
+    @Schema(description = "状态,0:未完成,1:已完成")
+    private Integer status;
+
+    @Schema(description = "租户ID")
+    private Long tenantId;
+}
+

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

@@ -2,8 +2,12 @@ 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.NursingPlanItemRespVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.NursingPlanItemDO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 
 /**
@@ -14,6 +18,9 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface NursingPlanItemMapper extends BaseMapperX<NursingPlanItemDO> {
 
+    List<NursingPlanItemRespVO> selectNursingPlanItemsWithFrequencyCategory(@Param("nursingPlanId") Long nursingPlanId,
+                                                                            @Param("isExtra") Integer isExtra);
+
 //    default PageResult<NursingPlanItemDO> selectPage(NursingPlanItemPageReqVO reqVO) {
 //        return selectPage(reqVO, new LambdaQueryWrapperX<NursingPlanItemDO>()
 //                .eqIfPresent(NursingPlanItemDO::getNursingPlanId, reqVO.getNursingPlanId())
@@ -28,4 +35,4 @@ public interface NursingPlanItemMapper extends BaseMapperX<NursingPlanItemDO> {
 //                .orderByDesc(NursingPlanItemDO::getId));
 //    }
 
-}
+}

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

@@ -0,0 +1,23 @@
+package cn.iocoder.yudao.module.system.dal.mysql.biz;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemPageReqVO;
+import cn.iocoder.yudao.module.system.dal.dataobject.biz.SpecialNursingPlanItemDO;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SpecialNursingPlanItemMapper extends BaseMapperX<SpecialNursingPlanItemDO> {
+
+    default PageResult<SpecialNursingPlanItemDO> selectPage(SpecialNursingPlanItemPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<SpecialNursingPlanItemDO>()
+                .eqIfPresent(SpecialNursingPlanItemDO::getSpecialNursingPlanId, reqVO.getSpecialNursingPlanId())
+                .eqIfPresent(SpecialNursingPlanItemDO::getNurseItemId, reqVO.getNurseItemId())
+                .likeIfPresent(SpecialNursingPlanItemDO::getNurseItemName, reqVO.getNurseItemName())
+                .eqIfPresent(SpecialNursingPlanItemDO::getStatus, reqVO.getStatus())
+                .inIfPresent(SpecialNursingPlanItemDO::getTenantId, reqVO.getTenantIds())
+                .orderByDesc(SpecialNursingPlanItemDO::getId));
+    }
+}
+

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

@@ -0,0 +1,21 @@
+package cn.iocoder.yudao.module.system.dal.mysql.biz;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanPageReqVO;
+import cn.iocoder.yudao.module.system.dal.dataobject.biz.SpecialNursingPlanDO;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SpecialNursingPlanMapper extends BaseMapperX<SpecialNursingPlanDO> {
+
+    default PageResult<SpecialNursingPlanDO> selectPage(SpecialNursingPlanPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<SpecialNursingPlanDO>()
+                .eqIfPresent(SpecialNursingPlanDO::getElderId, reqVO.getElderId())
+                .likeIfPresent(SpecialNursingPlanDO::getElderName, reqVO.getElderName())
+                .inIfPresent(SpecialNursingPlanDO::getTenantId, reqVO.getTenantIds())
+                .orderByDesc(SpecialNursingPlanDO::getId));
+    }
+}
+

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

@@ -738,9 +738,9 @@ public class BuildServiceImpl implements BuildService {
                             BeanUtils.copyProperties(item, itemVO);
                             itemVO.setDate(LocalDate.now());
 
-                            DictDataDO dictDataDO = dataMap.get(item.getFrequencyUnit());
+                            DictDataDO dictDataDO = dataMap.get(String.valueOf(item.getFrequencyType()));
                             if (dictDataDO != null) {
-                                itemVO.setFrequencyUnit(dictDataDO.getLabel());
+                                itemVO.setFrequencyTypeUnit(dictDataDO.getLabel());
                             }
                             return itemVO;
                         }).collect(Collectors.toList());

+ 13 - 5
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseServiceImpl.java

@@ -46,10 +46,9 @@ import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalAdjusters;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exceptionCustomMsg;
@@ -119,6 +118,9 @@ public class ExpenseServiceImpl implements ExpenseService {
     @Autowired
     private ReservationDepositMapper reservationDepositMapper;
 
+    @Autowired
+    private SysChargeCategoryMapper sysChargeCategoryMapper;
+
 
     @Override
     @Transactional
@@ -128,7 +130,10 @@ public class ExpenseServiceImpl implements ExpenseService {
         List<ExpenseItemDO> monthlyExpenses = createReqVO.getMonthlyExpenses();
         List<ExpenseItemDO> oneTimeExpenses = createReqVO.getOneTimeExpenses();
         List<ExpenseItemDO> stageExpenses = createReqVO.getStageExpenses();
-
+        List<SysChargeCategoryDO> sysChargeCategoryDOS = sysChargeCategoryMapper.selectList(new LambdaQueryWrapperX<SysChargeCategoryDO>().eq(SysChargeCategoryDO::getTenantId, TenantContextHolder.getTenantId()));
+        Map<Long, SysChargeCategoryDO> categoryMap = sysChargeCategoryDOS
+                .stream()
+                .collect(Collectors.toMap(SysChargeCategoryDO::getId, Function.identity()));
         ExpenseDO expense = new ExpenseDO();
         BeanUtils.copyProperties(createReqVO, expense);
         expense.setCreatedTime(new Date());
@@ -213,6 +218,7 @@ public class ExpenseServiceImpl implements ExpenseService {
 
         for (ExpenseItemDO item : monthlyExpenses) {
             item.setIsMonthlyExpense(BooleanEnum.TRUE.getValue());
+            item.setItemCategoryName(categoryMap.getOrDefault(item.getItemCategoryId(),new SysChargeCategoryDO()).getName());
             item.setExpenseId(expense.getId());
             item.setTenantId(createReqVO.getTenantId());
             item.setChangeStartDate(date);
@@ -262,6 +268,7 @@ public class ExpenseServiceImpl implements ExpenseService {
         //计算其他费用
         for (ExpenseItemDO item : oneTimeExpenses) {
             item.setExpenseId(expense.getId());
+            item.setItemCategoryName(categoryMap.getOrDefault(item.getItemCategoryId(),new SysChargeCategoryDO()).getName());
             if (item.getIsDeposit() != null && item.getIsDeposit() != 1) {
                 item.setIsOneTimeFee(BooleanEnum.TRUE.getValue());
             }
@@ -292,6 +299,7 @@ public class ExpenseServiceImpl implements ExpenseService {
         for (ExpenseItemDO stageExpenseItem : stageExpenses) {
             stageExpenseItem.setExpenseId(expense.getId());
             stageExpenseItem.setTenantId(createReqVO.getTenantId());
+            stageExpenseItem.setItemCategoryName(categoryMap.getOrDefault(stageExpenseItem.getItemCategoryId(),new SysChargeCategoryDO()).getName());
             expenseItemMapper.insert(stageExpenseItem);
 
             if (stageExpenseItem.getIsHirePurchase().equals(BooleanEnum.TRUE.getValue())) {

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

@@ -30,7 +30,6 @@ public class NurseItemServiceImpl implements NurseItemService {
 
     @Override
     public void addNurseItem(NurseItemDO itemDO) {
-        itemDO.setCreateTime(new Date());
         nurseItemMapper.insert(itemDO);
     }
 

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

@@ -166,8 +166,6 @@ public class NurseLevelServiceImpl implements NurseLevelService {
             }
             NurseItemDO nurseItemDO = new NurseItemDO();
             BeanUtils.copyProperties(nurseItemImportExcel, nurseItemDO);
-            nurseItemDO.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
-            nurseItemDO.setCreateTime(new Date());
             nurseItemDO.setStatus(1);
             nurseItemDO.setCategoryId(optional.get().getId());
             nurseItemDO.setTenantId(TenantContextHolder.getTenantId());

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

@@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanPageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanItemRespVO;
 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.DailyExpensesDO;
@@ -36,8 +37,10 @@ import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -147,20 +150,13 @@ public class NursingPlanServiceImpl implements NursingPlanService {
         ElderlyInfoDO elderlyInfoDO = elderlyInfoMapper.selectById(nursingPlanDO.getElderId());
         respVO.setNurseLevelName(elderlyInfoDO == null ? null : elderlyInfoDO.getNurseLevelName());
 
-        //查询护理项目
-        List<NursingPlanItemDO> nursingPlanItems = nursingPlanItemMapper.selectList(new LambdaQueryWrapperX<NursingPlanItemDO>()
-                .eq(NursingPlanItemDO::getNursingPlanId, nursingPlanDO.getId())
-                .eq(NursingPlanItemDO::getIsExtra, BooleanEnum.FALSE.getValue())
-                .eq(NursingPlanItemDO::getIsDelete, BooleanEnum.FALSE.getValue()));
-
-        //额外护理项目
-        List<NursingPlanItemDO> extraItems = nursingPlanItemMapper.selectList(new LambdaQueryWrapperX<NursingPlanItemDO>()
-                .eq(NursingPlanItemDO::getNursingPlanId, nursingPlanDO.getId())
-                .eq(NursingPlanItemDO::getIsDelete, BooleanEnum.FALSE.getValue())
-                .eq(NursingPlanItemDO::getIsExtra, BooleanEnum.TRUE.getValue()));
+        List<NursingPlanItemRespVO> allItems =
+                nursingPlanItemMapper.selectNursingPlanItemsWithFrequencyCategory(nursingPlanDO.getId(), null);
+        Map<Boolean, List<NursingPlanItemRespVO>> itemGroup = allItems.stream()
+                .collect(Collectors.partitioningBy(item -> BooleanEnum.TRUE.getValue().equals(item.getIsExtra())));
 
-        respVO.setItems(nursingPlanItems);
-        respVO.setExtraItems(extraItems);
+        respVO.setItems(itemGroup.getOrDefault(false, Collections.emptyList()));
+        respVO.setExtraItems(itemGroup.getOrDefault(true, Collections.emptyList()));
         return respVO;
     }
 
@@ -287,9 +283,8 @@ public class NursingPlanServiceImpl implements NursingPlanService {
             NursingPlanRespVO respVO = new NursingPlanRespVO();
             BeanUtils.copyProperties(e, respVO);
 
-            List<NursingPlanItemDO> nursingPlanItem = nursingPlanItemMapper.selectList(new LambdaQueryWrapperX<NursingPlanItemDO>()
-                    .eq(NursingPlanItemDO::getNursingPlanId, e.getId())
-                    .eq(NursingPlanItemDO::getIsDelete, BooleanEnum.FALSE.getValue()));
+            List<NursingPlanItemRespVO> nursingPlanItem =
+                    nursingPlanItemMapper.selectNursingPlanItemsWithFrequencyCategory(e.getId(), null);
 
             respVO.setItems(nursingPlanItem);
             return respVO;
@@ -300,4 +295,4 @@ public class NursingPlanServiceImpl implements NursingPlanService {
     public List<NursingPlanDO> selectAll() {
         return nursingPlanMapper.selectList();
     }
-}
+}

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

@@ -0,0 +1,20 @@
+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.SpecialNursingPlanItemPageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemSaveReqVO;
+
+public interface SpecialNursingPlanItemService {
+
+    Long create(SpecialNursingPlanItemSaveReqVO createReqVO);
+
+    void update(SpecialNursingPlanItemSaveReqVO updateReqVO);
+
+    void delete(Long id);
+
+    SpecialNursingPlanItemRespVO get(Long id);
+
+    PageResult<SpecialNursingPlanItemRespVO> getPage(SpecialNursingPlanItemPageReqVO pageReqVO);
+}
+

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

@@ -0,0 +1,66 @@
+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.module.system.controller.admin.nursing.vo.SpecialNursingPlanItemPageReqVO;
+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.dal.dataobject.biz.SpecialNursingPlanItemDO;
+import cn.iocoder.yudao.module.system.dal.mysql.biz.SpecialNursingPlanItemMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+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 SpecialNursingPlanItemServiceImpl implements SpecialNursingPlanItemService {
+
+    @Resource
+    private SpecialNursingPlanItemMapper specialNursingPlanItemMapper;
+
+    @Override
+    public Long create(SpecialNursingPlanItemSaveReqVO createReqVO) {
+        SpecialNursingPlanItemDO item = BeanUtils.toBean(createReqVO, SpecialNursingPlanItemDO.class);
+        specialNursingPlanItemMapper.insert(item);
+        return item.getId();
+    }
+
+    @Override
+    public void update(SpecialNursingPlanItemSaveReqVO updateReqVO) {
+        validateExists(updateReqVO.getId());
+        SpecialNursingPlanItemDO updateObj = BeanUtils.toBean(updateReqVO, SpecialNursingPlanItemDO.class);
+        specialNursingPlanItemMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void delete(Long id) {
+        validateExists(id);
+        specialNursingPlanItemMapper.deleteById(id);
+    }
+
+    @Override
+    public SpecialNursingPlanItemRespVO get(Long id) {
+        SpecialNursingPlanItemDO item = specialNursingPlanItemMapper.selectById(id);
+        if (item == null) {
+            throw exception(COMMON_NOT_FOUND);
+        }
+        return BeanUtils.toBean(item, SpecialNursingPlanItemRespVO.class);
+    }
+
+    @Override
+    public PageResult<SpecialNursingPlanItemRespVO> getPage(SpecialNursingPlanItemPageReqVO pageReqVO) {
+        PageResult<SpecialNursingPlanItemDO> pageResult = specialNursingPlanItemMapper.selectPage(pageReqVO);
+        return BeanUtils.toBean(pageResult, SpecialNursingPlanItemRespVO.class);
+    }
+
+    private void validateExists(Long id) {
+        if (id == null || specialNursingPlanItemMapper.selectById(id) == null) {
+            throw exception(COMMON_NOT_FOUND);
+        }
+    }
+}
+

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

@@ -0,0 +1,20 @@
+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.SpecialNursingPlanPageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.nursing.vo.SpecialNursingPlanSaveReqVO;
+
+public interface SpecialNursingPlanService {
+
+    Long create(SpecialNursingPlanSaveReqVO createReqVO);
+
+    void update(SpecialNursingPlanSaveReqVO updateReqVO);
+
+    void delete(Long id);
+
+    SpecialNursingPlanRespVO get(Long id);
+
+    PageResult<SpecialNursingPlanRespVO> getPage(SpecialNursingPlanPageReqVO pageReqVO);
+}
+

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

@@ -0,0 +1,66 @@
+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.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.dal.dataobject.biz.SpecialNursingPlanDO;
+import cn.iocoder.yudao.module.system.dal.mysql.biz.SpecialNursingPlanMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+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 SpecialNursingPlanServiceImpl implements SpecialNursingPlanService {
+
+    @Resource
+    private SpecialNursingPlanMapper specialNursingPlanMapper;
+
+    @Override
+    public Long create(SpecialNursingPlanSaveReqVO createReqVO) {
+        SpecialNursingPlanDO specialNursingPlan = BeanUtils.toBean(createReqVO, SpecialNursingPlanDO.class);
+        specialNursingPlanMapper.insert(specialNursingPlan);
+        return specialNursingPlan.getId();
+    }
+
+    @Override
+    public void update(SpecialNursingPlanSaveReqVO updateReqVO) {
+        validateExists(updateReqVO.getId());
+        SpecialNursingPlanDO updateObj = BeanUtils.toBean(updateReqVO, SpecialNursingPlanDO.class);
+        specialNursingPlanMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void delete(Long id) {
+        validateExists(id);
+        specialNursingPlanMapper.deleteById(id);
+    }
+
+    @Override
+    public SpecialNursingPlanRespVO get(Long id) {
+        SpecialNursingPlanDO record = specialNursingPlanMapper.selectById(id);
+        if (record == null) {
+            throw exception(COMMON_NOT_FOUND);
+        }
+        return BeanUtils.toBean(record, SpecialNursingPlanRespVO.class);
+    }
+
+    @Override
+    public PageResult<SpecialNursingPlanRespVO> getPage(SpecialNursingPlanPageReqVO pageReqVO) {
+        PageResult<SpecialNursingPlanDO> pageResult = specialNursingPlanMapper.selectPage(pageReqVO);
+        return BeanUtils.toBean(pageResult, SpecialNursingPlanRespVO.class);
+    }
+
+    private void validateExists(Long id) {
+        if (id == null || specialNursingPlanMapper.selectById(id) == null) {
+            throw exception(COMMON_NOT_FOUND);
+        }
+    }
+}
+

+ 33 - 0
yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/NursingPlanItemMapper.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.biz.NursingPlanItemMapper">
+
+    <select id="selectNursingPlanItemsWithFrequencyCategory"
+            resultType="cn.iocoder.yudao.module.system.controller.admin.nursing.vo.NursingPlanItemRespVO">
+        select enpi.id,
+               enpi.nursing_plan_id,
+               enpi.nurse_item_id,
+               enpi.nurse_item_name,
+               enpi.frequency,
+               enpi.frequency_type,
+               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_nursing_plan_item enpi
+                 left join nurse_item ni on ni.id = enpi.nurse_item_id
+        <where>
+            enpi.nursing_plan_id = #{nursingPlanId}
+            and enpi.is_delete = 0
+            <if test="isExtra != null">
+                and enpi.is_extra = #{isExtra}
+            </if>
+        </where>
+        order by enpi.id asc
+    </select>
+
+</mapper>