From b506a0a10cdf3ac34cfdae2b82da4dae49b41567 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 20 一月 2026 11:10:33 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/estate_expert

---
 admin-server/src/main/java/com/estate/expert/admin/domain/common/request/AddCheckInfoRequest.java  |   44 +++
 admin-server/src/main/java/com/estate/expert/admin/controller/admin/RecordController.java          |  153 +++++++++++
 admin-server/src/main/java/com/estate/expert/admin/domain/business/check/Check.java                |   24 +
 admin-server/src/main/java/com/estate/expert/admin/domain/common/request/EditOnDutyRequest.java    |   40 +++
 admin-server/src/main/java/com/estate/expert/admin/service/CheckService.java                       |   39 ++
 admin-server/src/main/java/com/estate/expert/admin/service/impl/OnDutyServiceImpl.java             |  139 ++++++++++
 admin-server/src/main/java/com/estate/expert/admin/domain/business/onduty/OnDuty.java              |   12 
 admin-server/src/main/java/com/estate/expert/admin/domain/common/request/EditCheckInfoRequest.java |   36 ++
 admin-server/src/main/java/com/estate/expert/admin/service/OnDutyService.java                      |   40 +++
 admin-server/src/main/java/com/estate/expert/admin/service/impl/CheckServiceImpl.java              |   84 ++++++
 admin-server/src/main/java/com/estate/expert/admin/domain/common/request/AddOnDutyRequest.java     |   44 +++
 admin-server/src/main/java/com/estate/expert/admin/domain/common/response/PageRespMp.java          |   78 ++++++
 12 files changed, 725 insertions(+), 8 deletions(-)

diff --git a/admin-server/src/main/java/com/estate/expert/admin/controller/admin/RecordController.java b/admin-server/src/main/java/com/estate/expert/admin/controller/admin/RecordController.java
index dadabc9..f2fa471 100644
--- a/admin-server/src/main/java/com/estate/expert/admin/controller/admin/RecordController.java
+++ b/admin-server/src/main/java/com/estate/expert/admin/controller/admin/RecordController.java
@@ -1,9 +1,17 @@
 package com.estate.expert.admin.controller.admin;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.estate.expert.admin.domain.business.check.Check;
+import com.estate.expert.admin.domain.business.position.Position;
+import com.estate.expert.admin.domain.common.request.AddCheckInfoRequest;
+import com.estate.expert.admin.domain.common.request.AddOnDutyRequest;
 import com.estate.expert.admin.domain.common.request.BatchReq;
+import com.estate.expert.admin.domain.common.request.EditCheckInfoRequest;
+import com.estate.expert.admin.domain.common.request.EditOnDutyRequest;
 import com.estate.expert.admin.domain.common.request.PageReq;
 import com.estate.expert.admin.domain.common.request.RecordPageRequest;
 import com.estate.expert.admin.domain.common.response.PageResp;
+import com.estate.expert.admin.domain.common.response.PageRespMp;
 import com.estate.expert.admin.domain.exam.record.error.ErrorRecord;
 import com.estate.expert.admin.domain.exam.record.error.ErrorRecordDto;
 import com.estate.expert.admin.domain.exam.record.info.SetResponsibleDto;
@@ -11,8 +19,7 @@
 import com.estate.expert.admin.domain.exam.record.warning.WarningRecord;
 import com.estate.expert.admin.domain.exam.record.warning.WarningRecordDto;
 import com.estate.expert.admin.domain.user.User;
-import com.estate.expert.admin.service.ErrorRecordService;
-import com.estate.expert.admin.service.WarningRecordService;
+import com.estate.expert.admin.service.*;
 import com.estate.expert.common.domain.Session;
 import com.estate.expert.common.rpc.Result;
 import io.swagger.annotations.Api;
@@ -37,6 +44,15 @@
 
     @Resource
     private WarningRecordService warningRecordService;
+
+    @Resource
+    private PositionService positionService;
+
+    @Resource
+    private OnDutyService onDutyService;
+
+    @Resource
+    private CheckService checkService;
 
     ////////    问题清单    ////////
 
@@ -205,4 +221,137 @@
         return Result.success();
     }
 
+    ////////    在岗情况    ////////
+
+    /**
+     * 在岗情况列表查询
+     * 支持"全部/我创建的"筛选
+     */
+    @ApiOperation("【APP】在岗情况列表")
+    @PostMapping("/onduty/list")
+    public Result listOnDutyRecords(@ApiParam(hidden = true) Session session,
+                                    @RequestParam(value = "planId", required = false) Integer planId,
+                                    @RequestParam(value = "mine", required = false) Boolean mine,
+                                    @Validated @RequestBody PageReq pageReq) {
+        // 根据 mine 参数决定是否筛选"我创建的"
+        var creatorId = mine != null && mine ? ((User) session.getUser()).getId() : null;
+
+        // 调用 Service 层的 JPA 查询方法
+        return Result.success(onDutyService.listOnDutyRecords(planId, creatorId, pageReq));
+    }
+
+    /**
+     * 添加在岗情况
+     */
+    @ApiOperation("【APP】添加在岗情况")
+    @PostMapping("/onduty/add")
+    public Result addOnDuty(@ApiParam(hidden = true) Session session,
+                            @Validated @RequestBody AddOnDutyRequest request) {
+        onDutyService.add((User) session.getUser(), request);
+        return Result.success();
+    }
+
+    /**
+     * 编辑在岗情况
+     */
+    @ApiOperation("【APP】编辑在岗情况")
+    @PostMapping("/onduty/edit")
+    public Result editOnDuty(@Validated @RequestBody EditOnDutyRequest request) {
+        onDutyService.edit(request);
+        return Result.success();
+    }
+
+    /**
+     * 删除在岗情况
+     */
+    @ApiOperation("【APP】删除在岗情况")
+    @PostMapping("/onduty/del")
+    public Result deleteOnDuty(@Validated @RequestBody BatchReq request) {
+        onDutyService.deleteByIds(request.getIds());
+        return Result.success();
+    }
+
+    @ApiOperation(value = "【APP】岗位列表")
+    @PostMapping("/position/list")
+    public Result list(@Validated @RequestBody PageReq pageReq) {
+        Page<Position> page = positionService.lambdaQuery().page(new Page<>(pageReq.getPage(), pageReq.getSize()));
+        return Result.success(PageRespMp.of(page));
+    }
+
+    /**
+     * 岗位详情
+     */
+    @ApiOperation(value = "【APP】岗位详情")
+    @GetMapping("/position/detail")
+    public Result getPositionDetail(@RequestParam("id") Integer id) {
+        Position position = positionService.getById(id);
+        if (position == null) {
+            throw new RuntimeException("岗位不存在");
+        }
+        return Result.success(position);
+    }
+
+    ////////    检查情况    ////////
+
+    /**
+     * 检查情况列表查询
+     * 支持"全部/我创建的"筛选
+     */
+    @ApiOperation("【APP】检查情况列表")
+    @PostMapping("/checkinfo/list")
+    public Result listCheckInfoRecords(@ApiParam(hidden = true) Session session,
+                                       @RequestParam(value = "planId", required = false) Integer planId,
+                                       @RequestParam(value = "mine", required = false) Boolean mine,
+                                       @Validated @RequestBody PageReq pageReq) {
+        // 根据 mine 参数决定是否筛选"我创建的"
+        var creatorId = mine != null && mine ? ((User) session.getUser()).getId() : null;
+
+        // 调用 Service 层的 JPA 查询方法
+        return Result.success(checkService.listCheckInfoRecords(planId, creatorId, pageReq));
+    }
+
+    /**
+     * 添加检查信息
+     */
+    @ApiOperation("【APP】添加检查信息")
+    @PostMapping("/checkinfo/add")
+    public Result addCheckInfo(@ApiParam(hidden = true) Session session,
+                               @Validated @RequestBody AddCheckInfoRequest request) {
+        checkService.addCheckInfo((User) session.getUser(), request);
+        return Result.success();
+    }
+
+    /**
+     * 检查信息详情
+     */
+    @ApiOperation("【APP】检查信息详情")
+    @GetMapping("/checkinfo/detail")
+    public Result getCheckInfoDetail(@RequestParam("id") Integer id) {
+        Check check = checkService.getById(id);
+        if (check == null) {
+            throw new RuntimeException("检查信息不存在");
+        }
+        return Result.success(check);
+    }
+
+    /**
+     * 编辑检查信息
+     */
+    @ApiOperation("【APP】编辑检查信息")
+    @PostMapping("/checkinfo/edit")
+    public Result editCheckInfo(@Validated @RequestBody EditCheckInfoRequest request) {
+        checkService.editCheckInfo(request);
+        return Result.success();
+    }
+
+    /**
+     * 删除检查信息
+     */
+    @ApiOperation("【APP】删除检查信息")
+    @PostMapping("/checkinfo/del")
+    public Result deleteCheckInfo(@Validated @RequestBody BatchReq request) {
+        checkService.deleteCheckInfoByIds(request.getIds());
+        return Result.success();
+    }
+
 }
diff --git a/admin-server/src/main/java/com/estate/expert/admin/domain/business/check/Check.java b/admin-server/src/main/java/com/estate/expert/admin/domain/business/check/Check.java
index 7cb299e..37f839f 100644
--- a/admin-server/src/main/java/com/estate/expert/admin/domain/business/check/Check.java
+++ b/admin-server/src/main/java/com/estate/expert/admin/domain/business/check/Check.java
@@ -5,11 +5,17 @@
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.estate.expert.admin.domain.user.User;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+import javax.persistence.Column;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
 import java.io.Serializable;
 import java.util.Date;
 
@@ -69,4 +75,22 @@
     private Date createTime;
 
 
+    /**
+     * 检查标题
+     */
+    @TableField("title")
+    @ApiModelProperty("检查标题")
+    private String title;
+
+    /**
+     * 创建者
+     */
+    @TableField("creator_id")
+    @ApiModelProperty("创建人id")
+    private Integer creatorId;
+
+    @TableField("deleted")
+    @TableLogic
+    @ApiModelProperty("是否删除 false正常true删除")
+    private Boolean deleted;
 }
diff --git a/admin-server/src/main/java/com/estate/expert/admin/domain/business/onduty/OnDuty.java b/admin-server/src/main/java/com/estate/expert/admin/domain/business/onduty/OnDuty.java
index 3636ffd..1bbb862 100644
--- a/admin-server/src/main/java/com/estate/expert/admin/domain/business/onduty/OnDuty.java
+++ b/admin-server/src/main/java/com/estate/expert/admin/domain/business/onduty/OnDuty.java
@@ -1,10 +1,7 @@
 package com.estate.expert.admin.domain.business.onduty;
 
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
@@ -103,6 +100,13 @@
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
+    @TableField("creator_id")
+    private Integer creatorId;
+
+    @TableField("deleted")
+    @TableLogic
+    private Boolean deleted;
+
 
 
 }
diff --git a/admin-server/src/main/java/com/estate/expert/admin/domain/common/request/AddCheckInfoRequest.java b/admin-server/src/main/java/com/estate/expert/admin/domain/common/request/AddCheckInfoRequest.java
new file mode 100644
index 0000000..f87e723
--- /dev/null
+++ b/admin-server/src/main/java/com/estate/expert/admin/domain/common/request/AddCheckInfoRequest.java
@@ -0,0 +1,44 @@
+package com.estate.expert.admin.domain.common.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 添加检查信息请求
+ *
+ * @author administrator
+ * @since 2026-01-20
+ */
+@Data
+@ApiModel("添加检查信息请求")
+public class AddCheckInfoRequest {
+
+    @ApiModelProperty(value = "计划ID", required = true)
+    @NotNull(message = "计划ID不能为空")
+    private Integer planId;
+
+    @ApiModelProperty(value = "项目ID", required = true)
+    @NotNull(message = "项目ID不能为空")
+    private Integer projectId;
+
+    @ApiModelProperty(value = "委托方ID", required = true)
+    @NotNull(message = "委托方ID不能为空")
+    private Integer clientId;
+
+    @ApiModelProperty(value = "检查标题", required = true)
+    @NotBlank(message = "检查标题不能为空")
+    private String title;
+
+    @ApiModelProperty(value = "安全告知单(图片URL,多张用逗号分隔)")
+    private String safetySlip;
+
+    @ApiModelProperty(value = "检查人员照片(图片URL,多张用逗号分隔)")
+    private String checkUserImg;
+
+    @ApiModelProperty(value = "廉政告知单(图片URL,多张用逗号分隔)")
+    private String integrityNotification;
+}
diff --git a/admin-server/src/main/java/com/estate/expert/admin/domain/common/request/AddOnDutyRequest.java b/admin-server/src/main/java/com/estate/expert/admin/domain/common/request/AddOnDutyRequest.java
new file mode 100644
index 0000000..90464e2
--- /dev/null
+++ b/admin-server/src/main/java/com/estate/expert/admin/domain/common/request/AddOnDutyRequest.java
@@ -0,0 +1,44 @@
+package com.estate.expert.admin.domain.common.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Value;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * 添加在岗情况请求
+ */
+@ApiModel("添加在岗情况请求")
+@Value
+@Builder
+public class AddOnDutyRequest {
+
+    @ApiModelProperty(value = "项目ID", required = true)
+    @NotNull(message = "项目ID不能为空")
+    Integer projectId;
+
+    @ApiModelProperty(value = "计划ID", required = true)
+    @NotNull(message = "计划ID不能为空")
+    Integer planId;
+
+    @ApiModelProperty(value = "岗位ID", required = true)
+    @NotNull(message = "岗位ID不能为空")
+    Integer positionId;
+
+    @ApiModelProperty(value = "在岗状态:1-在岗,2-未在岗,3-请假", required = true)
+    @NotNull(message = "在岗状态不能为空")
+    @Min(value = 1, message = "在岗状态值必须在1-3之间")
+    @Max(value = 3, message = "在岗状态值必须在1-3之间")
+    Integer state;
+
+    @ApiModelProperty(value = "问题说明")
+    String remark;
+
+    @ApiModelProperty(value = "图片URL列表(多张)")
+    List<String> images;
+}
diff --git a/admin-server/src/main/java/com/estate/expert/admin/domain/common/request/EditCheckInfoRequest.java b/admin-server/src/main/java/com/estate/expert/admin/domain/common/request/EditCheckInfoRequest.java
new file mode 100644
index 0000000..2ef2644
--- /dev/null
+++ b/admin-server/src/main/java/com/estate/expert/admin/domain/common/request/EditCheckInfoRequest.java
@@ -0,0 +1,36 @@
+package com.estate.expert.admin.domain.common.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 编辑检查信息请求
+ *
+ * @author administrator
+ * @since 2026-01-20
+ */
+@Data
+@ApiModel("编辑检查信息请求")
+public class EditCheckInfoRequest {
+
+    @ApiModelProperty(value = "检查信息ID", required = true)
+    @NotNull(message = "检查信息ID不能为空")
+    private Integer id;
+
+    @ApiModelProperty(value = "检查标题", required = true)
+    @NotBlank(message = "检查标题不能为空")
+    private String title;
+
+    @ApiModelProperty(value = "安全告知单(图片URL,多张用逗号分隔)")
+    private String safetySlip;
+
+    @ApiModelProperty(value = "检查人员照片(图片URL,多张用逗号分隔)")
+    private String checkUserImg;
+
+    @ApiModelProperty(value = "廉政告知单(图片URL,多张用逗号分隔)")
+    private String integrityNotification;
+}
diff --git a/admin-server/src/main/java/com/estate/expert/admin/domain/common/request/EditOnDutyRequest.java b/admin-server/src/main/java/com/estate/expert/admin/domain/common/request/EditOnDutyRequest.java
new file mode 100644
index 0000000..415f808
--- /dev/null
+++ b/admin-server/src/main/java/com/estate/expert/admin/domain/common/request/EditOnDutyRequest.java
@@ -0,0 +1,40 @@
+package com.estate.expert.admin.domain.common.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Value;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * 编辑在岗情况请求
+ */
+@ApiModel("编辑在岗情况请求")
+@Value
+@Builder
+public class EditOnDutyRequest {
+
+    @ApiModelProperty(value = "在岗记录ID", required = true)
+    @NotNull(message = "在岗记录ID不能为空")
+    Integer id;
+
+    @ApiModelProperty(value = "岗位ID", required = true)
+    @NotNull(message = "岗位ID不能为空")
+    Integer positionId;
+
+    @ApiModelProperty(value = "在岗状态:1-在岗,2-未在岗,3-请假", required = true)
+    @NotNull(message = "在岗状态不能为空")
+    @Min(value = 1, message = "在岗状态值必须在1-3之间")
+    @Max(value = 3, message = "在岗状态值必须在1-3之间")
+    Integer state;
+
+    @ApiModelProperty(value = "问题说明")
+    String remark;
+
+    @ApiModelProperty(value = "图片URL列表(多张)")
+    List<String> images;
+}
diff --git a/admin-server/src/main/java/com/estate/expert/admin/domain/common/response/PageRespMp.java b/admin-server/src/main/java/com/estate/expert/admin/domain/common/response/PageRespMp.java
new file mode 100644
index 0000000..d4c5486
--- /dev/null
+++ b/admin-server/src/main/java/com/estate/expert/admin/domain/common/response/PageRespMp.java
@@ -0,0 +1,78 @@
+package com.estate.expert.admin.domain.common.response;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+import java.util.List;
+
+/**
+ * mybatis plus 分页响应
+ * @param <T>
+ */
+@ApiModel("分页响应")
+@Data
+public class PageRespMp<T> {
+
+    @ApiModelProperty("总页数")
+    private int totalPages;
+
+    @ApiModelProperty("总记录数")
+    private long totalElements;
+
+    @ApiModelProperty("每页大小")
+    private int pageSize;
+
+    @ApiModelProperty("当前页码, 从0开始")
+    private int number;
+
+    @ApiModelProperty("数据列表")
+    private List<T> list;
+
+    public PageRespMp(Page<?> page, List<T> list) {
+        this.totalPages = (int) page.getPages();
+        this.totalElements = page.getTotal();
+        this.pageSize = (int) page.getSize();
+        this.number = (int) page.getCurrent();
+        this.list = list;
+    }
+
+    public PageRespMp(Page<T> page) {
+        this.totalPages = (int) page.getPages();
+        this.totalElements = page.getTotal();
+        this.pageSize = (int) page.getSize();
+        this.number = (int) page.getCurrent();
+        this.list = page.getRecords();
+    }
+
+    public PageRespMp(List<T> list) {
+        this.list = list;
+        this.totalPages = 1;
+        this.totalElements = list.size();
+        this.pageSize = list.size();
+        this.number = 0;
+    }
+
+    // of
+    public static <T> PageRespMp<T> of(Page<?> page, List<T> list) {
+        return new PageRespMp<>(page, list);
+    }
+
+    // of
+    public static <T> PageRespMp<T> of(Page<T> page) {
+        return new PageRespMp<>(page);
+    }
+
+    // of
+    public static <T> PageRespMp<T> of(List<T> list) {
+        return new PageRespMp<>(list);
+    }
+
+
+    // empty
+    public static <T> PageRespMp<T> empty() {
+        return new PageRespMp<>(new Page<>());
+    }
+}
diff --git a/admin-server/src/main/java/com/estate/expert/admin/service/CheckService.java b/admin-server/src/main/java/com/estate/expert/admin/service/CheckService.java
index 62395cf..d669e8e 100644
--- a/admin-server/src/main/java/com/estate/expert/admin/service/CheckService.java
+++ b/admin-server/src/main/java/com/estate/expert/admin/service/CheckService.java
@@ -5,7 +5,12 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.estate.expert.admin.domain.business.check.Check;
 import com.estate.expert.admin.domain.business.check.CheckVo;
+import com.estate.expert.admin.domain.common.request.AddCheckInfoRequest;
+import com.estate.expert.admin.domain.common.request.EditCheckInfoRequest;
 import com.estate.expert.admin.domain.common.request.OnDutyRequest;
+import com.estate.expert.admin.domain.common.request.PageReq;
+import com.estate.expert.admin.domain.common.response.PageRespMp;
+import com.estate.expert.admin.domain.user.User;
 
 import java.util.List;
 
@@ -21,7 +26,39 @@
 
     List<CheckVo> pageList(Page<CheckVo> page, OnDutyRequest request);
 
-
     CheckVo detail(Integer id);
 
+    /**
+     * 分页查询检查情况列表(JPA 实现)
+     * 用于新的列表查询接口,支持"全部/我创建的"筛选
+     *
+     * @param planId 计划ID(可选)
+     * @param creatorId 创建者ID(null表示查询全部)
+     * @param pageReq 分页请求
+     * @return 检查情况分页结果
+     */
+    PageRespMp<Check> listCheckInfoRecords(Integer planId, Integer creatorId, PageReq pageReq);
+
+    /**
+     * 添加检查信息
+     *
+     * @param creator 创建者
+     * @param request 添加请求
+     */
+    void addCheckInfo(User creator, AddCheckInfoRequest request);
+
+    /**
+     * 编辑检查信息
+     *
+     * @param request 编辑请求
+     */
+    void editCheckInfo(EditCheckInfoRequest request);
+
+    /**
+     * 批量删除检查信息
+     *
+     * @param ids 检查信息ID列表
+     */
+    void deleteCheckInfoByIds(List<Integer> ids);
+
 }
diff --git a/admin-server/src/main/java/com/estate/expert/admin/service/OnDutyService.java b/admin-server/src/main/java/com/estate/expert/admin/service/OnDutyService.java
index 42b0e97..7f26869 100644
--- a/admin-server/src/main/java/com/estate/expert/admin/service/OnDutyService.java
+++ b/admin-server/src/main/java/com/estate/expert/admin/service/OnDutyService.java
@@ -5,7 +5,12 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.estate.expert.admin.domain.business.onduty.OnDuty;
 import com.estate.expert.admin.domain.business.onduty.OnDutyVo;
+import com.estate.expert.admin.domain.common.request.AddOnDutyRequest;
+import com.estate.expert.admin.domain.common.request.EditOnDutyRequest;
 import com.estate.expert.admin.domain.common.request.OnDutyRequest;
+import com.estate.expert.admin.domain.common.request.PageReq;
+import com.estate.expert.admin.domain.common.response.PageRespMp;
+import com.estate.expert.admin.domain.user.User;
 
 import java.util.List;
 
@@ -24,4 +29,39 @@
 
     OnDutyVo detail(Integer id);
 
+    /**
+     * 添加在岗情况记录
+     *
+     * @param creator 创建者
+     * @param request 添加请求
+     * @return 在岗情况实体
+     */
+    OnDuty add(User creator, AddOnDutyRequest request);
+
+    /**
+     * 分页查询在岗情况列表(JPA 实现)
+     * 用于新的列表查询接口,支持"全部/我创建的"筛选
+     *
+     * @param planId 计划ID(可选)
+     * @param creatorId 创建者ID(null表示查询全部)
+     * @param pageReq 分页请求
+     * @return 在岗情况分页结果
+     */
+    PageRespMp<OnDuty> listOnDutyRecords(Integer planId, Integer creatorId, PageReq pageReq);
+
+    /**
+     * 编辑在岗情况记录
+     *
+     * @param request 编辑请求
+     * @return 更新后的在岗情况实体
+     */
+    OnDuty edit(EditOnDutyRequest request);
+
+    /**
+     * 批量删除在岗情况记录
+     *
+     * @param ids 在岗记录ID列表
+     */
+    void deleteByIds(List<Integer> ids);
+
 }
diff --git a/admin-server/src/main/java/com/estate/expert/admin/service/impl/CheckServiceImpl.java b/admin-server/src/main/java/com/estate/expert/admin/service/impl/CheckServiceImpl.java
index 60cd065..24e2706 100644
--- a/admin-server/src/main/java/com/estate/expert/admin/service/impl/CheckServiceImpl.java
+++ b/admin-server/src/main/java/com/estate/expert/admin/service/impl/CheckServiceImpl.java
@@ -5,13 +5,22 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.estate.expert.admin.domain.business.check.Check;
 import com.estate.expert.admin.domain.business.check.CheckVo;
-import com.estate.expert.admin.domain.business.onduty.OnDutyVo;
+import com.estate.expert.admin.domain.common.request.AddCheckInfoRequest;
+import com.estate.expert.admin.domain.common.request.EditCheckInfoRequest;
 import com.estate.expert.admin.domain.common.request.OnDutyRequest;
+import com.estate.expert.admin.domain.common.request.PageReq;
+import com.estate.expert.admin.domain.common.response.PageRespMp;
 import com.estate.expert.admin.domain.repository.CheckMapper;
+import com.estate.expert.admin.domain.user.User;
 import com.estate.expert.admin.service.CheckService;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -40,4 +49,77 @@
     public CheckVo detail(Integer id) {
         return  this.baseMapper.detail(id);
     }
+
+    @Override
+    public PageRespMp<Check> listCheckInfoRecords(Integer planId, Integer creatorId, PageReq pageReq) {
+        Page<Check> page = lambdaQuery().eq(Check::getPlanId, planId).eq(Objects.nonNull(creatorId), Check::getCreatorId, creatorId)
+                .page(new Page<>(pageReq.getPage(), pageReq.getSize()));
+        // 将 Spring Data Page 转换为自定义 PageResp
+        return PageRespMp.of(page);
+    }
+
+    /**
+     * 添加检查信息(MyBatis Plus 方式)
+     */
+    @Override
+    @Transactional
+    public void addCheckInfo(User creator, AddCheckInfoRequest request) {
+        // 1. 创建 Check 实体对象(MyBatis Plus 实体)
+        Check check = new Check();
+
+        // 2. 设置基本字段
+        check.setTitle(request.getTitle());
+        check.setSafetySlip(request.getSafetySlip());
+        check.setCheckUserImg(request.getCheckUserImg());
+        check.setIntegrityNotification(request.getIntegrityNotification());
+
+        // 3. 设置关联字段
+        check.setPlanId(request.getPlanId());
+        check.setProjectId(request.getProjectId());
+        check.setClientId(request.getClientId());
+
+        // 4. 设置创建者ID(MyBatis Plus 使用 creatorId 字段)
+        check.setCreatorId(creator.getId());
+
+        // 5. 设置时间字段
+        check.setTime(new Date());
+
+        // createTime: 当前时间戳
+        check.setCreateTime(new Date());
+
+        // 6. 保存到数据库(MyBatis Plus 方式)
+        save(check);
+    }
+
+    /**
+     * 编辑检查信息(MyBatis Plus 方式)
+     */
+    @Override
+    @Transactional
+    public void editCheckInfo(EditCheckInfoRequest request) {
+        // 1. 根据 id 查询现有的 Check 实体
+        Check check = getById(request.getId());
+        if (check == null) {
+            throw new RuntimeException("检查信息不存在");
+        }
+
+        // 2. 更新字段
+        check.setTitle(request.getTitle());
+        check.setSafetySlip(request.getSafetySlip());
+        check.setCheckUserImg(request.getCheckUserImg());
+        check.setIntegrityNotification(request.getIntegrityNotification());
+
+        // 3. 保存更新(MyBatis Plus 方式)
+        updateById(check);
+    }
+
+    /**
+     * 批量删除检查信息(MyBatis Plus 方式)
+     */
+    @Override
+    @Transactional
+    public void deleteCheckInfoByIds(List<Integer> ids) {
+        // 使用 MyBatis Plus 的批量删除方法(逻辑删除,因为 Check 实体有 @TableLogic 注解)
+        removeByIds(ids);
+    }
 }
diff --git a/admin-server/src/main/java/com/estate/expert/admin/service/impl/OnDutyServiceImpl.java b/admin-server/src/main/java/com/estate/expert/admin/service/impl/OnDutyServiceImpl.java
index 1b6a229..7c4e588 100644
--- a/admin-server/src/main/java/com/estate/expert/admin/service/impl/OnDutyServiceImpl.java
+++ b/admin-server/src/main/java/com/estate/expert/admin/service/impl/OnDutyServiceImpl.java
@@ -5,12 +5,28 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.estate.expert.admin.domain.business.onduty.OnDuty;
 import com.estate.expert.admin.domain.business.onduty.OnDutyVo;
+import com.estate.expert.admin.domain.business.position.Position;
+import com.estate.expert.admin.domain.common.request.AddOnDutyRequest;
+import com.estate.expert.admin.domain.common.request.EditOnDutyRequest;
 import com.estate.expert.admin.domain.common.request.OnDutyRequest;
+import com.estate.expert.admin.domain.common.request.PageReq;
+import com.estate.expert.admin.domain.common.response.PageRespMp;
+import com.estate.expert.admin.domain.project.Project;
+import com.estate.expert.admin.domain.project.ProjectRepository;
 import com.estate.expert.admin.domain.repository.OnDutyMapper;
+import com.estate.expert.admin.domain.user.User;
 import com.estate.expert.admin.service.OnDutyService;
+import com.estate.expert.admin.service.PositionService;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
+import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -22,6 +38,12 @@
  */
 @Service
 public class OnDutyServiceImpl extends ServiceImpl<OnDutyMapper, OnDuty> implements OnDutyService {
+
+    @Resource
+    private ProjectRepository projectRepository;
+
+    @Resource
+    private PositionService positionService;
 
     @Override
     public List<OnDutyVo> pageList(Page<OnDutyVo> page, OnDutyRequest request) {
@@ -39,4 +61,121 @@
     public OnDutyVo detail(Integer id) {
         return  this.baseMapper.detail(id);
     }
+
+    @Override
+    @Transactional
+    public OnDuty add(User creator, AddOnDutyRequest request) {
+        // 1. 查询项目信息,获取 clientId
+        Project project = projectRepository.findById(request.getProjectId())
+                .orElseThrow(() -> new RuntimeException("项目不存在"));
+
+        if (project.getClient() == null) {
+            throw new RuntimeException("项目未关联委托方");
+        }
+        Integer clientId = project.getClient().getId();
+
+        // 2. 查询岗位信息,获取 positionName(MyBatis Plus 方式)
+        Position position = positionService.getById(request.getPositionId());
+        if (position == null) {
+            throw new RuntimeException("岗位不存在");
+        }
+        String positionName = position.getName();
+
+        // 3. 处理图片列表(逗号分隔)
+        String imgStr = null;
+        if (!CollectionUtils.isEmpty(request.getImages())) {
+            imgStr = String.join(",", request.getImages());
+        }
+
+        // 4. 构建 OnDuty 实体
+        OnDuty onDuty = new OnDuty();
+        onDuty.setPlanId(request.getPlanId());
+        onDuty.setProjectId(request.getProjectId());
+        onDuty.setClientId(clientId);
+        onDuty.setContent("人员在岗"); // 固定值
+        onDuty.setPositionId(request.getPositionId());
+        onDuty.setPositionName(positionName);
+        onDuty.setRemark(request.getRemark());
+        onDuty.setImg(imgStr);
+        onDuty.setState(request.getState());
+
+        // 5. 设置创建者
+        onDuty.setCreatorId(creator.getId());
+
+        // 6. 设置时间字段
+        // time: 当前日期(00:00:00)
+        LocalDate today = LocalDate.now();
+        Date timeDate = Date.from(today.atStartOfDay(ZoneId.systemDefault()).toInstant());
+        onDuty.setTime(timeDate);
+
+        // createTime: 当前时间戳
+        onDuty.setCreateTime(new Date());
+
+        // 6. 保存到数据库
+        this.save(onDuty);
+
+        return onDuty;
+    }
+
+    /**
+     * 分页查询在岗情况列表(JPA 实现)
+     * 用于新的列表查询接口,支持"全部/我创建的"筛选
+     */
+    @Override
+    public PageRespMp<OnDuty> listOnDutyRecords(Integer planId, Integer creatorId, PageReq pageReq) {
+        Page<OnDuty> page = lambdaQuery().eq(OnDuty::getPlanId, planId).eq(Objects.nonNull(creatorId), OnDuty::getCreatorId, creatorId)
+                .page(new Page<>(pageReq.getPage(), pageReq.getSize()));
+        //转换为 PageRespMp
+        return PageRespMp.of(page);
+    }
+
+    /**
+     * 编辑在岗情况记录
+     */
+    @Override
+    @Transactional
+    public OnDuty edit(EditOnDutyRequest request) {
+        // 1. 查询现有记录
+        OnDuty onDuty = this.getById(request.getId());
+        if (onDuty == null) {
+            throw new RuntimeException("在岗记录不存在");
+        }
+
+        // 2. 如果岗位ID发生变化,需要更新岗位名称(MyBatis Plus 方式)
+        if (!onDuty.getPositionId().equals(request.getPositionId())) {
+            Position position = positionService.getById(request.getPositionId());
+            if (position == null) {
+                throw new RuntimeException("岗位不存在");
+            }
+            onDuty.setPositionName(position.getName());
+        }
+
+        // 3. 更新可编辑字段
+        onDuty.setPositionId(request.getPositionId());
+        onDuty.setState(request.getState());
+        onDuty.setRemark(request.getRemark());
+
+        // 4. 处理图片列表(逗号分隔)
+        String imgStr = null;
+        if (!CollectionUtils.isEmpty(request.getImages())) {
+            imgStr = String.join(",", request.getImages());
+        }
+        onDuty.setImg(imgStr);
+
+        // 5. 保存更新(MyBatis-Plus 的 updateById)
+        this.updateById(onDuty);
+
+        return onDuty;
+    }
+
+    /**
+     * 批量删除在岗情况记录
+     */
+    @Override
+    @Transactional
+    public void deleteByIds(List<Integer> ids) {
+        // 使用 MyBatis-Plus 的批量删除方法(物理删除)
+        this.removeByIds(ids);
+    }
 }
+

--
Gitblit v1.7.1