Browse Source

新增
1、新增巡房项目模块
修改
1、针对已缴费账单再次查询该月账单的项目操作增加禁止操作提示
BUGFIX
1、解决变更时,如果生效月及之后存在月账单的月份如果零星账单会报错的问题

liangwenxuan 1 tuần trước cách đây
mục cha
commit
1f44e6aff7
15 tập tin đã thay đổi với 801 bổ sung11 xóa
  1. 4 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmElderlyApiImpl.java
  2. 13 6
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmElderlyChangeApiImpl.java
  3. 98 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/ElderlyItemsRoundController.java
  4. 57 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/elderlyitemsround/ElderlyItemsRoundBatchSaveReqVO.java
  5. 44 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/elderlyitemsround/ElderlyItemsRoundPageReqVO.java
  6. 72 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/elderlyitemsround/ElderlyItemsRoundRespVO.java
  7. 57 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/elderlyitemsround/ElderlyItemsRoundSaveReqVO.java
  8. 72 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/ElderlyItemsRoundDO.java
  9. 27 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/biz/ElderlyItemsRoundMapper.java
  10. 98 3
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/BuildServiceImpl.java
  11. 23 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyItemsRoundService.java
  12. 118 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyItemsRoundServiceImpl.java
  13. 54 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseOrderServiceImpl.java
  14. 63 0
      yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlyItemsRoundMapper.xml
  15. 1 0
      yudao-server/src/main/resources/application.yaml

+ 4 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmElderlyApiImpl.java

@@ -379,8 +379,10 @@ public class BpmElderlyApiImpl implements BpmElderlyApi {
         elderlyInfoMapper.updateById(elderlyInfoDO);
 
         BuildBedDO bedDO = buildBedMapper.selectById(originalElderlyInfoDO.getBedId());
-        bedDO.setStatus(0);
-        buildBedMapper.updateById(bedDO);
+        if(bedDO != null){
+            bedDO.setStatus(0);
+            buildBedMapper.updateById(bedDO);
+        }
     }
 
     @Override

+ 13 - 6
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/bpm/BpmElderlyChangeApiImpl.java

@@ -338,6 +338,7 @@ public class BpmElderlyChangeApiImpl implements BpmElderlyChangeApi {
             DateTimeFormatter billingMonthFormatter = DateTimeFormatter.ofPattern("yyyy-MM");
             String changeBillingMonth = bedChangeRecordDO.getChangeDate().format(billingMonthFormatter);
             YearMonth changeYearMonth = YearMonth.parse(changeBillingMonth, billingMonthFormatter);
+            // 滞后年月
             YearMonth hysteresisYearMonth = null;
             if (StringUtils.isNotBlank(hysteresisMonth)) {
                 try {
@@ -351,7 +352,8 @@ public class BpmElderlyChangeApiImpl implements BpmElderlyChangeApi {
             // 查询已生成账单,对生效期内的已生成账单增加日常费用记录
             List<ExpenseOrderDO> generateExpenseOrder = expenseOrderMapper.selectList(new LambdaQueryWrapperX<ExpenseOrderDO>()
                     .eq(ExpenseOrderDO::getElderId, elderlyId)
-                    .ge(ExpenseOrderDO::getBillingMonth, changeBillingMonth));
+                    .ge(ExpenseOrderDO::getBillingMonth, changeBillingMonth)
+                    .ne(ExpenseOrderDO::getType,4));
             if (generateExpenseOrder.size() > 0) {
                 List<String> targetBillingMonths = new ArrayList<>(generateExpenseOrder.size());
                 Set<String> targetBillingMonthSet = new HashSet<>(generateExpenseOrder.size());
@@ -362,9 +364,11 @@ public class BpmElderlyChangeApiImpl implements BpmElderlyChangeApi {
                 }
 
                 Map<String, ExpenseOrderDO> targetOrderMap = new HashMap<>();
+                // 滞后年月,月账单映射处理
                 if (CollectionUtil.isNotEmpty(targetBillingMonthSet)) {
                     List<ExpenseOrderDO> targetOrders = expenseOrderMapper.selectList(new LambdaQueryWrapperX<ExpenseOrderDO>()
                             .eq(ExpenseOrderDO::getElderId, elderlyId)
+                            .ne(ExpenseOrderDO::getType,4)
                             .in(ExpenseOrderDO::getBillingMonth, targetBillingMonthSet)
                             .orderByDesc(ExpenseOrderDO::getCreatedTime));
                     for (ExpenseOrderDO targetOrder : targetOrders) {
@@ -451,7 +455,8 @@ public class BpmElderlyChangeApiImpl implements BpmElderlyChangeApi {
             // 生效的当月查询是否有账单,无账单则生成日常费用,有账单的情况上面已生成不用重复生成
             ExpenseOrderDO expenseOrder = expenseOrderMapper.selectOne(new LambdaQueryWrapperX<ExpenseOrderDO>()
                     .eq(ExpenseOrderDO::getElderId, elderlyId)
-                    .eq(ExpenseOrderDO::getBillingMonth, changeBillingMonth));
+                    .eq(ExpenseOrderDO::getBillingMonth, changeBillingMonth)
+                    .ne(ExpenseOrderDO::getType,4));
             if(expenseOrder == null){
                 String targetBillingMonth = resolveAttributionBillMonth(changeBillingMonth, changeYearMonth, hysteresisYearMonth);
                 ExpenseOrderDO targetExpenseOrder = expenseOrderMapper.selectOne(new LambdaQueryWrapperX<ExpenseOrderDO>()
@@ -546,17 +551,17 @@ public class BpmElderlyChangeApiImpl implements BpmElderlyChangeApi {
                 udpateExpenseItemDO.setId(item.getId());
                 udpateExpenseItemDO.setChangeEndDate(changeEndDate);
                 expenseItemMapper.updateById(udpateExpenseItemDO);
-                item.setChangeStartDate(bedChangeRecordDO.getChangeDate());
             } else {
                 ExpenseItemDO udpateExpenseItemDO = new ExpenseItemDO();
                 udpateExpenseItemDO.setId(item.getId());
                 udpateExpenseItemDO.setChangeFlag(1);
                 if (item.getIsMonthlyExpense() == 1) {
-                    udpateExpenseItemDO.setChangeEndDate(item.getChangeStartDate().minusDays(1));
+                    udpateExpenseItemDO.setChangeEndDate(changeEndDate);
                 }
                 expenseItemMapper.updateById(udpateExpenseItemDO);
             }
             item.setId(null);
+            item.setChangeStartDate(bedChangeRecordDO.getChangeDate());
             totalAmout.add(item.getActualAmount());
         });
         if(totalAmout.compareTo(BigDecimal.ZERO) != 0) {
@@ -709,6 +714,7 @@ public class BpmElderlyChangeApiImpl implements BpmElderlyChangeApi {
                     // 查询已生成账单,对生效期内的已生成账单增加日常费用记录
                     List<ExpenseOrderDO> generateExpenseOrder = expenseOrderMapper.selectList(new LambdaQueryWrapperX<ExpenseOrderDO>()
                             .eq(ExpenseOrderDO::getElderId, elderlyId)
+                            .ne(ExpenseOrderDO::getType,4)
                             .ge(ExpenseOrderDO::getBillingMonth, changeRecordDO.getChangeDate().format(DateTimeFormatter.ofPattern("yyyy-MM"))));
                     BigDecimal dailyExpensesDOAmount = finalAmount;
                     if (generateExpenseOrder.size() > 0) {
@@ -785,6 +791,7 @@ public class BpmElderlyChangeApiImpl implements BpmElderlyChangeApi {
                     // 生效的当月查询是否有账单,无账单则生成日常费用,有账单的情况上面已生成不用重复生成
                     ExpenseOrderDO expenseOrder = expenseOrderMapper.selectOne(new LambdaQueryWrapperX<ExpenseOrderDO>()
                             .eq(ExpenseOrderDO::getElderId, elderlyId)
+                            .ne(ExpenseOrderDO::getType,4)
                             .eq(ExpenseOrderDO::getBillingMonth, changeRecordDO.getChangeDate().format(DateTimeFormatter.ofPattern("yyyy-MM"))));
                     if(expenseOrder == null){
                         DailyExpensesDO currentDailyExpensesDO = new DailyExpensesDO();
@@ -822,15 +829,15 @@ public class BpmElderlyChangeApiImpl implements BpmElderlyChangeApi {
                     item.setTotalAmount(priceChange.getAmount());
                     udpateExpenseItemDO.setChangeFlag(1);
                     udpateExpenseItemDO.setChangeEndDate(changeEndDate);
-                    item.setChangeStartDate(changeRecordDO.getChangeDate());
                     expenseItemMapper.updateById(udpateExpenseItemDO);
                 }else {
                     if(item.getIsMonthlyExpense().equals(BooleanEnum.TRUE.getValue())){
-                        udpateExpenseItemDO.setChangeEndDate(item.getChangeStartDate().minusDays(1));
+                        udpateExpenseItemDO.setChangeEndDate(changeEndDate);
                         expenseItemMapper.updateById(udpateExpenseItemDO);
                     }
                 }
                 item.setId(null);
+                item.setChangeStartDate(changeRecordDO.getChangeDate());
                 item.setCreateTime(date);
                 totalAmout.add(item.getActualAmount());
             });

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

@@ -0,0 +1,98 @@
+package cn.iocoder.yudao.module.system.controller.admin.biz;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
+import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.elderlyitemsround.ElderlyItemsRoundBatchSaveReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.elderlyitemsround.ElderlyItemsRoundPageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.elderlyitemsround.ElderlyItemsRoundRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.elderlyitemsround.ElderlyItemsRoundSaveReqVO;
+import cn.iocoder.yudao.module.system.service.biz.ElderlyItemsRoundService;
+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.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.annotation.security.PermitAll;
+import javax.validation.Valid;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 长者巡房项目")
+@RestController
+@RequestMapping("/elderly-items-round")
+@Validated
+public class ElderlyItemsRoundController {
+
+    @Resource
+    private ElderlyItemsRoundService elderlyItemsRoundService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建长者巡房项目")
+    public CommonResult<Long> create(@Valid @RequestBody ElderlyItemsRoundSaveReqVO createReqVO) {
+        if (createReqVO.getTenantId() == null) {
+            createReqVO.setTenantId(TenantContextHolder.getTenantId());
+        }
+        return success(elderlyItemsRoundService.create(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新长者巡房项目")
+    @TenantIgnore
+    public CommonResult<Boolean> update(@Valid @RequestBody ElderlyItemsRoundSaveReqVO updateReqVO) {
+        if (updateReqVO.getTenantId() == null) {
+            updateReqVO.setTenantId(TenantContextHolder.getTenantId());
+        }
+        elderlyItemsRoundService.update(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除长者巡房项目")
+    @Parameter(name = "id", description = "编号", required = true)
+    @TenantIgnore
+    public CommonResult<Boolean> delete(@RequestParam("id") Long id) {
+        elderlyItemsRoundService.delete(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得长者巡房项目详情")
+    @Parameter(name = "id", description = "编号", required = true, example = "1")
+    @TenantIgnore
+    public CommonResult<ElderlyItemsRoundRespVO> get(@RequestParam("id") Long id) {
+        return success(elderlyItemsRoundService.get(id));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得长者巡房项目分页")
+    @TenantIgnore
+    public CommonResult<PageResult<ElderlyItemsRoundRespVO>> page(@Valid ElderlyItemsRoundPageReqVO pageReqVO) {
+        if (pageReqVO.getTenantIds() == null) {
+            pageReqVO.setTenantIds(new Long[]{TenantContextHolder.getTenantId()});
+        }
+        return success(elderlyItemsRoundService.getPage(pageReqVO));
+    }
+
+    @PostMapping("/batch-create")
+    @Operation(summary = "批量新增长者巡房项目")
+    @PermitAll
+    @TenantIgnore
+    public CommonResult<Boolean> batchCreate(@Valid @RequestBody ElderlyItemsRoundBatchSaveReqVO reqVO) {
+        if (reqVO.getTenantId() == null) {
+            reqVO.setTenantId(TenantContextHolder.getTenantId());
+        }
+        return success(elderlyItemsRoundService.batchCreate(reqVO));
+    }
+}
+

+ 57 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/elderlyitemsround/ElderlyItemsRoundBatchSaveReqVO.java

@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.system.controller.admin.biz.vo.elderlyitemsround;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Schema(description = "管理后台 - 长者巡房项目批量新增 Request VO")
+@Data
+public class ElderlyItemsRoundBatchSaveReqVO {
+
+    @Schema(description = "角色(护理员/医生/社工)", requiredMode = Schema.RequiredMode.REQUIRED, example = "护理员")
+    @NotNull(message = "角色不能为空")
+    private String role;
+
+    @Schema(description = "记录员", requiredMode = Schema.RequiredMode.REQUIRED, example = "护理员")
+    @NotNull(message = "记录员不能为空")
+    private String recorder;
+
+    @Schema(description = "楼栋id", example = "1")
+    private Long buildId;
+
+    @Schema(description = "楼层id", example = "1")
+    private Long floorId;
+
+    @Schema(description = "房间id", example = "1")
+    private Long roomId;
+
+    @Schema(description = "巡视记录明细", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Valid
+    @NotEmpty(message = "records 不能为空")
+    private List<Record> records;
+
+    @Schema(description = "机构id", example = "1")
+    private Long tenantId;
+
+    @Data
+    public static class Record {
+
+        @Schema(description = "长者id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+        @NotNull(message = "elderId 不能为空")
+        private Long elderId;
+
+        @Schema(description = "巡视项目组")
+        private String items;
+
+        @Schema(description = "语音")
+        private String voice;
+
+        @Schema(description = "备注")
+        private String remark;
+    }
+}
+

+ 44 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/elderlyitemsround/ElderlyItemsRoundPageReqVO.java

@@ -0,0 +1,44 @@
+package cn.iocoder.yudao.module.system.controller.admin.biz.vo.elderlyitemsround;
+
+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;
+import org.springframework.format.annotation.DateTimeFormat;
+
+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 = "管理后台 - 长者巡房项目分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ElderlyItemsRoundPageReqVO extends PageParam {
+
+    @Schema(description = "角色", example = "护理员")
+    private String role;
+
+    @Schema(description = "长者姓名(模糊匹配)", example = "张三")
+    private String elderName;
+
+    @Schema(description = "楼栋id", example = "1")
+    private Long buildId;
+
+    @Schema(description = "楼层id", example = "1")
+    private Long floorId;
+
+    @Schema(description = "房间id", example = "1")
+    private Long roomId;
+
+    @Schema(description = "巡房时间范围")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+    private LocalDate[] roundTime;
+
+    @Schema(description = "机构id数组")
+    private Long[] tenantIds;
+}
+

+ 72 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/elderlyitemsround/ElderlyItemsRoundRespVO.java

@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.system.controller.admin.biz.vo.elderlyitemsround;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 长者巡房项目 Response VO")
+@Data
+public class ElderlyItemsRoundRespVO {
+
+    @Schema(description = "id", example = "1")
+    private Long id;
+
+    @Schema(description = "记录人")
+    private String recorder;
+
+    @Schema(description = "角色", example = "护理员")
+    private String role;
+
+    @Schema(description = "长者id", example = "1")
+    private Long elderId;
+
+    @Schema(description = "长者姓名")
+    private String elderName;
+
+    @Schema(description = "楼栋id", example = "1")
+    private Long buildId;
+
+    @Schema(description = "楼层id", example = "1")
+    private Long floorId;
+
+    @Schema(description = "房间id", example = "1")
+    private Long roomId;
+
+    @Schema(description = "巡视项目组")
+    private String items;
+
+    @Schema(description = "语音")
+    private String voice;
+
+    @Schema(description = "备注")
+    private String remark;
+
+    @Schema(description = "机构id", example = "1")
+    private Long tenantId;
+
+    @Schema(description = "巡房时间")
+    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime roundTime;
+
+    @Schema(description = "房间号")
+    private String roomName;
+
+    @Schema(description = "创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+    @Schema(description = "创建人")
+    private String creator;
+
+    @Schema(description = "更新人")
+    private String updater;
+}
+

+ 57 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/elderlyitemsround/ElderlyItemsRoundSaveReqVO.java

@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.system.controller.admin.biz.vo.elderlyitemsround;
+
+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 java.util.List;
+
+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 = "管理后台 - 长者巡房项目新增/修改 Request VO")
+@Data
+public class ElderlyItemsRoundSaveReqVO {
+
+    @Schema(description = "id(修改时必传)", example = "1")
+    private Long id;
+
+    @Schema(description = "记录人")
+    private String recorder;
+
+    @Schema(description = "角色", requiredMode = Schema.RequiredMode.REQUIRED, example = "护理员")
+    @NotNull(message = "角色不能为空")
+    private String role;
+
+    @Schema(description = "长者id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "长者id不能为空")
+    private Long elderId;
+
+    @Schema(description = "楼栋id", example = "1")
+    private Long buildId;
+
+    @Schema(description = "楼层id", example = "1")
+    private Long floorId;
+
+    @Schema(description = "房间id", example = "1")
+    private Long roomId;
+
+    @Schema(description = "巡视项目组")
+    private String items;
+
+    @Schema(description = "语音")
+    private String voice;
+
+    @Schema(description = "备注")
+    private String remark;
+
+    @Schema(description = "机构id", example = "1")
+    private Long tenantId;
+
+    @Schema(description = "巡房时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime roundTime;
+}
+

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

@@ -0,0 +1,72 @@
+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.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
+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;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@TableName(value = "elderly_items_round", autoResultMap = true)
+@KeySequence("elderly_items_round_seq")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ElderlyItemsRoundDO extends BaseNoDeleteDO {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    @Schema(description = "记录人")
+    private String recorder;
+
+    @Schema(description = "角色")
+    private String role;
+
+    @Schema(description = "长者id")
+    private Long elderId;
+
+    @Schema(description = "楼栋id")
+    private Long buildId;
+
+    @Schema(description = "楼层id")
+    private Long floorId;
+
+    @Schema(description = "房间id")
+    private Long roomId;
+
+    @Schema(description = "巡视项目")
+    private String items;
+
+    @Schema(description = "语音")
+    private String voice;
+
+    @Schema(description = "备注")
+    private String remark;
+
+    @Schema(description = "机构id")
+    private Long tenantId;
+
+    @Schema(description = "巡房时间")
+    private LocalDateTime roundTime;
+
+    @TableField(exist = false)
+    private String elderName;
+    @TableField(exist = false)
+    private String roomName;
+}
+

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

@@ -0,0 +1,27 @@
+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.module.system.controller.admin.biz.vo.elderlyitemsround.ElderlyItemsRoundPageReqVO;
+import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyItemsRoundDO;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface ElderlyItemsRoundMapper extends BaseMapperX<ElderlyItemsRoundDO> {
+
+    List<ElderlyItemsRoundDO> selectPageWithElderInfo(Page<ElderlyItemsRoundDO> page,
+                                                      @Param("reqVO") ElderlyItemsRoundPageReqVO reqVO);
+
+    ElderlyItemsRoundDO selectByIdWithElderInfo(@Param("id") Long id);
+
+    default PageResult<ElderlyItemsRoundDO> selectPageWithElderInfo(ElderlyItemsRoundPageReqVO reqVO) {
+        Page<ElderlyItemsRoundDO> page = new Page<>(reqVO.getPageNo(), reqVO.getPageSize());
+        List<ElderlyItemsRoundDO> list = selectPageWithElderInfo(page, reqVO);
+        return new PageResult<>(list, page.getTotal());
+    }
+}
+

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

@@ -894,12 +894,14 @@ public class BuildServiceImpl implements BuildService {
                 .collect(Collectors.toList());
         Map<Long, List<ElderlyInfoDO>> elderlyByRoomId;
         Set<Long> orderedElderIdsToday;
+        Map<Long, String> fullBedNameByBedId;
         if (CollectionUtil.isNotEmpty(roomIds)) {
             List<ElderlyInfoDO> elderlyInfoList = elderlyInfoMapper.selectList(new LambdaQueryWrapperX<ElderlyInfoDO>()
                     .in(ElderlyInfoDO::getRoomId, roomIds)
                     .eq(ElderlyInfoDO::getInStatus, 1));
             elderlyByRoomId = elderlyInfoList.stream()
                     .collect(Collectors.groupingBy(ElderlyInfoDO::getRoomId, LinkedHashMap::new, Collectors.toList()));
+            fullBedNameByBedId = buildFullBedNameByBedId(tenantId, elderlyInfoList);
 
             List<Long> elderIds = elderlyInfoList.stream().map(ElderlyInfoDO::getId).collect(Collectors.toList());
             if (CollectionUtil.isNotEmpty(elderIds)) {
@@ -915,6 +917,7 @@ public class BuildServiceImpl implements BuildService {
         } else {
             orderedElderIdsToday = Collections.emptySet();
             elderlyByRoomId = Collections.emptyMap();
+            fullBedNameByBedId = Collections.emptyMap();
         }
         List<BuildFloorTreeRespVO> result = new ArrayList<>();
         for (BuildDO build : buildList) {
@@ -934,7 +937,8 @@ public class BuildServiceImpl implements BuildService {
                             roomVO.setRoomName(room.getRoomName());
                             handleIsFinishAndBedList(roomVO,
                                     elderlyByRoomId.getOrDefault(room.getId(), Collections.emptyList()),
-                                    orderedElderIdsToday);
+                                    orderedElderIdsToday,
+                                    fullBedNameByBedId);
                             return roomVO;
                         }).collect(Collectors.toList());
                 floorVO.setRoomList(roomVOList);
@@ -1449,15 +1453,106 @@ public class BuildServiceImpl implements BuildService {
                 .toInstant());
     }
 
+    private Map<Long, String> buildFullBedNameByBedId(Long tenantId, List<ElderlyInfoDO> elderlyInfoList) {
+        if (CollectionUtil.isEmpty(elderlyInfoList)) {
+            return Collections.emptyMap();
+        }
+
+        Set<Long> bedIds = elderlyInfoList.stream()
+                .map(ElderlyInfoDO::getBedId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+        if (CollectionUtil.isEmpty(bedIds)) {
+            return Collections.emptyMap();
+        }
+
+        List<BuildBedDO> bedList = buildBedMapper.selectList(new LambdaQueryWrapperX<BuildBedDO>()
+                .eqIfPresent(BuildBedDO::getTenantId, tenantId)
+                .in(BuildBedDO::getId, bedIds));
+        if (CollectionUtil.isEmpty(bedList)) {
+            return Collections.emptyMap();
+        }
+        Map<Long, BuildBedDO> bedById = bedList.stream()
+                .collect(Collectors.toMap(BuildBedDO::getId, b -> b, (a, b) -> a));
+
+        Set<Long> roomIds = bedList.stream()
+                .map(BuildBedDO::getRoomId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+        Map<Long, BuildRoomDO> roomById = Collections.emptyMap();
+        if (CollectionUtil.isNotEmpty(roomIds)) {
+            List<BuildRoomDO> roomList = buildRoomMapper.selectList(new LambdaQueryWrapperX<BuildRoomDO>()
+                    .eqIfPresent(BuildRoomDO::getTenantId, tenantId)
+                    .in(BuildRoomDO::getId, roomIds));
+            roomById = roomList.stream().collect(Collectors.toMap(BuildRoomDO::getId, r -> r, (a, b) -> a));
+        }
+
+        Set<Long> floorIds = roomById.values().stream()
+                .map(BuildRoomDO::getFloorId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+        Map<Long, BuildFloorDO> floorById = Collections.emptyMap();
+        if (CollectionUtil.isNotEmpty(floorIds)) {
+            List<BuildFloorDO> floorList = buildFloorMapper.selectList(new LambdaQueryWrapperX<BuildFloorDO>()
+                    .eqIfPresent(BuildFloorDO::getTenantId, tenantId)
+                    .in(BuildFloorDO::getId, floorIds));
+            floorById = floorList.stream().collect(Collectors.toMap(BuildFloorDO::getId, f -> f, (a, b) -> a));
+        }
+
+        Set<Long> buildIds = floorById.values().stream()
+                .map(BuildFloorDO::getBuildId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+        Map<Long, BuildDO> buildById = Collections.emptyMap();
+        if (CollectionUtil.isNotEmpty(buildIds)) {
+            List<BuildDO> buildList = buildMapper.selectList(new LambdaQueryWrapperX<BuildDO>()
+                    .eqIfPresent(BuildDO::getTenantId, tenantId)
+                    .in(BuildDO::getId, buildIds));
+            buildById = buildList.stream().collect(Collectors.toMap(BuildDO::getId, b -> b, (a, b) -> a));
+        }
+
+        Map<Long, String> fullNameByBedId = new HashMap<>();
+        for (BuildBedDO bed : bedList) {
+            List<String> parts = new ArrayList<>(4);
+
+            BuildRoomDO room = bed.getRoomId() != null ? roomById.get(bed.getRoomId()) : null;
+            BuildFloorDO floor = room != null && room.getFloorId() != null ? floorById.get(room.getFloorId()) : null;
+            BuildDO build = floor != null && floor.getBuildId() != null ? buildById.get(floor.getBuildId()) : null;
+
+            if (build != null && StringUtils.isNotBlank(build.getBuildName())) {
+                parts.add(build.getBuildName());
+            }
+            if (floor != null && StringUtils.isNotBlank(floor.getFloorName())) {
+                parts.add(floor.getFloorName());
+            }
+            if (room != null && StringUtils.isNotBlank(room.getRoomName())) {
+                parts.add(room.getRoomName());
+            }
+            if (StringUtils.isNotBlank(bed.getBedName())) {
+                parts.add(bed.getBedName());
+            }
+
+            if (CollectionUtil.isNotEmpty(parts)) {
+                fullNameByBedId.put(bed.getId(), String.join("-", parts));
+            }
+        }
+        return fullNameByBedId;
+    }
+
     private void handleIsFinishAndBedList(BuildFloorTreeRespVO.RoomVO roomVO,
                                            List<ElderlyInfoDO> elderlyInfoList,
-                                           Set<Long> orderedElderIdsToday){
+                                           Set<Long> orderedElderIdsToday,
+                                           Map<Long, String> fullBedNameByBedId){
         List<BuildFloorTreeRespVO.BedVO> bedList = new ArrayList<>();
         boolean isFinish = true;
         for (ElderlyInfoDO elderlyInfoDO : elderlyInfoList) {
             BuildFloorTreeRespVO.BedVO bedVO = new BuildFloorTreeRespVO.BedVO();
             bedVO.setBedId(elderlyInfoDO.getBedId());
-            bedVO.setBedName(elderlyInfoDO.getBedName());
+            String bedName = elderlyInfoDO.getBedName();
+            if (StringUtils.isBlank(bedName) && elderlyInfoDO.getBedId() != null && fullBedNameByBedId != null) {
+                bedName = fullBedNameByBedId.get(elderlyInfoDO.getBedId());
+            }
+            bedVO.setBedName(bedName);
             bedVO.setElderId(elderlyInfoDO.getId());
             bedVO.setElderName(elderlyInfoDO.getElderName());
             bedList.add(bedVO);

+ 23 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyItemsRoundService.java

@@ -0,0 +1,23 @@
+package cn.iocoder.yudao.module.system.service.biz;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.elderlyitemsround.ElderlyItemsRoundBatchSaveReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.elderlyitemsround.ElderlyItemsRoundPageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.elderlyitemsround.ElderlyItemsRoundRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.elderlyitemsround.ElderlyItemsRoundSaveReqVO;
+
+public interface ElderlyItemsRoundService {
+
+    Long create(ElderlyItemsRoundSaveReqVO createReqVO);
+
+    void update(ElderlyItemsRoundSaveReqVO updateReqVO);
+
+    void delete(Long id);
+
+    ElderlyItemsRoundRespVO get(Long id);
+
+    PageResult<ElderlyItemsRoundRespVO> getPage(ElderlyItemsRoundPageReqVO pageReqVO);
+
+    Boolean batchCreate(ElderlyItemsRoundBatchSaveReqVO reqVO);
+}
+

+ 118 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyItemsRoundServiceImpl.java

@@ -0,0 +1,118 @@
+package cn.iocoder.yudao.module.system.service.biz;
+
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+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.biz.vo.elderlyitemsround.ElderlyItemsRoundBatchSaveReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.elderlyitemsround.ElderlyItemsRoundPageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.elderlyitemsround.ElderlyItemsRoundRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.elderlyitemsround.ElderlyItemsRoundSaveReqVO;
+import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyItemsRoundDO;
+import cn.iocoder.yudao.module.system.dal.mysql.biz.ElderlyItemsRoundMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+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 ElderlyItemsRoundServiceImpl implements ElderlyItemsRoundService {
+
+    @Resource
+    private ElderlyItemsRoundMapper elderlyItemsRoundMapper;
+
+    @Override
+    public Long create(ElderlyItemsRoundSaveReqVO createReqVO) {
+        ElderlyItemsRoundDO record = BeanUtils.toBean(createReqVO, ElderlyItemsRoundDO.class);
+        fillDefault(record);
+        elderlyItemsRoundMapper.insert(record);
+        return record.getId();
+    }
+
+    @Override
+    public void update(ElderlyItemsRoundSaveReqVO updateReqVO) {
+        validateExists(updateReqVO.getId());
+        ElderlyItemsRoundDO updateObj = BeanUtils.toBean(updateReqVO, ElderlyItemsRoundDO.class);
+        fillDefault(updateObj);
+        elderlyItemsRoundMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void delete(Long id) {
+        validateExists(id);
+        elderlyItemsRoundMapper.deleteById(id);
+    }
+
+    @Override
+    public ElderlyItemsRoundRespVO get(Long id) {
+        ElderlyItemsRoundDO record = elderlyItemsRoundMapper.selectByIdWithElderInfo(id);
+        if (record == null) {
+            throw exception(COMMON_NOT_FOUND);
+        }
+        return BeanUtils.toBean(record, ElderlyItemsRoundRespVO.class);
+    }
+
+    @Override
+    public PageResult<ElderlyItemsRoundRespVO> getPage(ElderlyItemsRoundPageReqVO pageReqVO) {
+        PageResult<ElderlyItemsRoundDO> pageResult = elderlyItemsRoundMapper.selectPageWithElderInfo(pageReqVO);
+        return BeanUtils.toBean(pageResult, ElderlyItemsRoundRespVO.class);
+    }
+
+    @Override
+    public Boolean batchCreate(ElderlyItemsRoundBatchSaveReqVO reqVO) {
+        Long tenantId = reqVO.getTenantId() != null ? reqVO.getTenantId() : TenantContextHolder.getTenantId();
+
+        List<ElderlyItemsRoundDO> insertList = new ArrayList<>();
+        for (ElderlyItemsRoundBatchSaveReqVO.Record recordReq : reqVO.getRecords()) {
+            ElderlyItemsRoundDO record = new ElderlyItemsRoundDO();
+            record.setTenantId(tenantId);
+            record.setRecorder(reqVO.getRecorder());
+            record.setRole(reqVO.getRole());
+            record.setBuildId(reqVO.getBuildId());
+            record.setFloorId(reqVO.getFloorId());
+            record.setRoomId(reqVO.getRoomId());
+            record.setElderId(recordReq.getElderId());
+            record.setItems(recordReq.getItems());
+            record.setVoice(recordReq.getVoice());
+            record.setRemark(recordReq.getRemark());
+            insertList.add(record);
+        }
+        return elderlyItemsRoundMapper.insertBatch(insertList);
+    }
+
+    private void fillDefault(ElderlyItemsRoundDO record) {
+        if (record.getTenantId() == null) {
+            record.setTenantId(TenantContextHolder.getTenantId());
+        }
+        if (StrUtil.isBlank(record.getRecorder())) {
+            record.setRecorder(trimRecorder(SecurityFrameworkUtils.getLoginUserNickname()));
+        } else {
+            record.setRecorder(trimRecorder(record.getRecorder()));
+        }
+    }
+
+    private String trimRecorder(String recorder) {
+        if (recorder == null) {
+            return null;
+        }
+        String value = recorder.trim();
+        if (value.length() <= 20) {
+            return value;
+        }
+        return value.substring(0, 20);
+    }
+
+    private void validateExists(Long id) {
+        if (id == null || elderlyItemsRoundMapper.selectById(id) == null) {
+            throw exception(COMMON_NOT_FOUND);
+        }
+    }
+}
+

+ 54 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseOrderServiceImpl.java

@@ -62,6 +62,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.client.RestTemplate;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exceptionCustomMsg;
 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
 import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.*;
 
@@ -808,6 +809,9 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
             return collect;
 
         } else {
+            if(dbExpenseOrder.getPayStatus() == 1){
+                throw exceptionCustomMsg(COMMON_ERROR,",账单已缴费,无法追加生成费用");
+            }
             List<ExpenseItemRespVO> resultList = new ArrayList<>();
             YearMonth billingYm = YearMonth.parse(billingMonth, DateTimeFormatter.ofPattern("yyyy-MM"));
             LocalDate monthStart = billingYm.atDay(1);
@@ -1075,6 +1079,8 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
             isExpenseOrderConfirmed(dbExpenseOrder);
             // 单个处理时校验账单是否已锁定
             isExpenseOrderLock(dbExpenseOrder);
+            // 单个处理时校验账单是否已缴费
+            isExpenseOrderPay(dbExpenseOrder);
         }
 
         if (dbExpenseOrder == null) {
@@ -2289,6 +2295,13 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
                     }
                     continue;
                 }
+                // 批量处理时校验账单是否已缴费,如果已确认则跳过
+                if (isExpenseOrderPay(expenseOrder, true)) {
+                    if (taskId != null) {
+                        taskStatusManager.addProcessDetail(taskId, elderlyInfo.getId(), elderlyInfo.getElderName(), "SKIPPED", "账单已缴费");
+                    }
+                    continue;
+                }
             }
 
             // 账单不存在
@@ -2434,6 +2447,10 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
         if(isExpenseOrderLock(expenseOrder,isBatch)){
             return;
         }
+        // 校验账单是否已缴费
+        if(isExpenseOrderPay(expenseOrder,isBatch)){
+            return;
+        }
 
         YearMonth attributionBillTime = YearMonth.parse(billingMonth, DateTimeFormatter.ofPattern("yyyy-MM"));
         List<ExpenseItemRespVO> dataList = new ArrayList<>(collectDailyExpenseItemsHasBill(elderId, billingMonth));
@@ -2555,6 +2572,8 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
                 isExpenseOrderConfirmed(expenseOrderDO);
                 // 单个处理时校验账单是否已锁定
                 isExpenseOrderLock(expenseOrderDO);
+                // 单个处理时校验账单是否已缴费
+                isExpenseOrderPay(expenseOrderDO);
             }
 
             if (expenseOrderDO == null) {
@@ -2795,6 +2814,8 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
         isExpenseOrderConfirmed(expenseOrderDO);
         // 单个处理时校验账单是否已锁定
         isExpenseOrderLock(expenseOrderDO);
+        // 单个处理时校验账单是否已缴费
+        isExpenseOrderPay(expenseOrderDO);
         BigDecimal totalAmount = BigDecimal.ZERO;
         List<ExpenseOrderItemEditVO> items = saveVO.getItems();
         List<DailyExpensesDO> updateDailyExpenseList = new ArrayList<>();
@@ -3088,6 +3109,39 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
         isExpenseOrderLock(expenseOrder, false);
     }
 
+
+    /**
+     * 校验账单是否已缴费(默认为单个处理)
+     *
+     * @param expenseOrder 账单对象
+     * @throws ServiceException 如果账单已缴费
+     */
+    private void isExpenseOrderPay(ExpenseOrderDO expenseOrder) {
+        isExpenseOrderPay(expenseOrder, false);
+    }
+
+    /**
+     * 校验账单是否已缴费
+     *
+     * @param expenseOrder 账单对象
+     * @param isBatch      是否批量处理
+     * @return true表示已确认,false表示未确认
+     * @throws ServiceException 如果是单个处理且账单已确认
+     */
+    private boolean isExpenseOrderPay(ExpenseOrderDO expenseOrder, boolean isBatch) {
+        // 如果账单已确认
+        if (expenseOrder.getPayStatus() == 1) {
+            // 批量处理时直接返回true,表示需要跳过
+            if (isBatch) {
+                log.info("账单已缴费,跳过处理, 账单ID:{}", expenseOrder.getId());
+                return true;
+            } else {
+                // 单个处理时报错
+                throw exception(EXPENSE_ORDER_ALREADY_PAY);
+            }
+        }
+        return false;
+    }
     /**
      * 根据账单ID向长者亲属发送账单通知短信
      *

+ 63 - 0
yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ElderlyItemsRoundMapper.xml

@@ -0,0 +1,63 @@
+<?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.ElderlyItemsRoundMapper">
+
+    <resultMap id="ElderlyItemsRoundDOResultMap"
+               type="cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyItemsRoundDO"
+               autoMapping="true">
+        <id column="id" property="id"/>
+        <result column="items" property="items"/>
+        <result column="elderName" property="elderName"/>
+        <result column="roomName" property="roomName"/>
+    </resultMap>
+
+    <select id="selectPageWithElderInfo" resultMap="ElderlyItemsRoundDOResultMap">
+        SELECT
+            eir.*,
+            ei.elder_name AS elderName
+        FROM elderly_items_round eir
+        LEFT JOIN elderly_info ei ON ei.id = eir.elder_id
+        WHERE 1 = 1
+        <if test="reqVO.tenantIds != null">
+            AND eir.tenant_id IN
+            <foreach item="id" collection="reqVO.tenantIds" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+        <if test="reqVO.role != null and reqVO.role != ''">
+            AND eir.role = #{reqVO.role}
+        </if>
+        <if test="reqVO.elderName != null and reqVO.elderName != ''">
+            AND ei.elder_name LIKE CONCAT('%', #{reqVO.elderName}, '%')
+        </if>
+        <if test="reqVO.buildId != null">
+            AND eir.build_id = #{reqVO.buildId}
+        </if>
+        <if test="reqVO.floorId != null">
+            AND eir.floor_id = #{reqVO.floorId}
+        </if>
+        <if test="reqVO.roomId != null">
+            AND eir.room_id = #{reqVO.roomId}
+        </if>
+        <if test="reqVO.roundTime != null and reqVO.roundTime.length &gt;= 1">
+            AND eir.round_time &gt;= #{reqVO.roundTime[0]}
+        </if>
+        <if test="reqVO.roundTime != null and reqVO.roundTime.length == 2">
+            AND eir.round_time &lt; #{reqVO.roundTime[1]} + INTERVAL 1 DAY
+        </if>
+        ORDER BY eir.round_time DESC, eir.id DESC
+    </select>
+
+    <select id="selectByIdWithElderInfo" resultMap="ElderlyItemsRoundDOResultMap">
+        SELECT
+            eir.*,
+            ei.elder_name AS elderName,
+            room.room_name AS roomName
+        FROM elderly_items_round eir
+        LEFT JOIN elderly_info ei ON ei.id = eir.elder_id
+        LEFT JOIN org_build_room room ON room.id = ei.room_id
+        WHERE eir.id = #{id}
+    </select>
+
+</mapper>
+

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

@@ -245,6 +245,7 @@ yudao:
       - /admin-api/nursing/special-plan-item/execute
       - /admin-api/elderly-nursing-log/executeNursingLog
       - /admin-api/elderly/nursingPlan/getLowFrequencyPlanItemsByFloorId
+      - /admin-api/elderly-items-round/batch-create
 #      - /admin-api/bpm/check-in-wait/create
     ignore-tables:
       - system_tenant