“mitao”
2026-01-20 4e5beb844f03daec12f2b039365730b0683f8a9e
feat(app):计算任务新增在岗信息、检查信息接口
5个文件已添加
7个文件已修改
733 ■■■■■ 已修改文件
admin-server/src/main/java/com/estate/expert/admin/controller/admin/RecordController.java 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-server/src/main/java/com/estate/expert/admin/domain/business/check/Check.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-server/src/main/java/com/estate/expert/admin/domain/business/onduty/OnDuty.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-server/src/main/java/com/estate/expert/admin/domain/common/request/AddCheckInfoRequest.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-server/src/main/java/com/estate/expert/admin/domain/common/request/AddOnDutyRequest.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-server/src/main/java/com/estate/expert/admin/domain/common/request/EditCheckInfoRequest.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-server/src/main/java/com/estate/expert/admin/domain/common/request/EditOnDutyRequest.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-server/src/main/java/com/estate/expert/admin/domain/common/response/PageRespMp.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-server/src/main/java/com/estate/expert/admin/service/CheckService.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-server/src/main/java/com/estate/expert/admin/service/OnDutyService.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-server/src/main/java/com/estate/expert/admin/service/impl/CheckServiceImpl.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin-server/src/main/java/com/estate/expert/admin/service/impl/OnDutyServiceImpl.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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();
    }
}
admin-server/src/main/java/com/estate/expert/admin/domain/business/check/Check.java
@@ -4,11 +4,17 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
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;
@@ -67,4 +73,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;
}
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;
}
admin-server/src/main/java/com/estate/expert/admin/domain/common/request/AddCheckInfoRequest.java
New file
@@ -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;
}
admin-server/src/main/java/com/estate/expert/admin/domain/common/request/AddOnDutyRequest.java
New file
@@ -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;
}
admin-server/src/main/java/com/estate/expert/admin/domain/common/request/EditCheckInfoRequest.java
New file
@@ -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;
}
admin-server/src/main/java/com/estate/expert/admin/domain/common/request/EditOnDutyRequest.java
New file
@@ -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;
}
admin-server/src/main/java/com/estate/expert/admin/domain/common/response/PageRespMp.java
New file
@@ -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<>());
    }
}
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);
}
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);
}
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);
    }
}
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);
    }
}