Parcourir la source

审核审批列表

xuzhancheng il y a 13 heures
Parent
commit
d51d5bd269

+ 38 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorderitemreport/BoilerTaskOrderItemReportController.java

@@ -23,9 +23,16 @@ import cn.start.tz.framework.excel.core.util.ExcelUtils;
 import cn.start.tz.framework.apilog.core.annotation.ApiAccessLog;
 import static cn.start.tz.framework.apilog.core.enums.OperateTypeEnum.*;
 
+import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerOrderItemPageRespVO;
+import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerTaskOrderPageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorderitemreport.vo.*;
+import cn.start.tz.module.pressure2.controller.admin.externalOA.vo.OATodoReportPageReqVO;
+import cn.start.tz.module.pressure2.controller.admin.externalOA.vo.OATodoReportRespVO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreport.BoilerTaskOrderItemReportDO;
+import cn.start.tz.module.pressure2.dal.mysql.boilertaskorderitemreport.BoilerTaskOrderItemReportMapper;
+import cn.start.tz.module.pressure2.enums.TaskOrderStatusEnum;
 import cn.start.tz.module.pressure2.service.boilertaskorderitemreport.BoilerTaskOrderItemReportService;
+import cn.start.tz.module.pressure2.service.externalOA.ExternalOAService;
 
 @Tag(name = "管理后台 - 锅炉任务单设备关联报告")
 @RestController
@@ -36,6 +43,12 @@ public class BoilerTaskOrderItemReportController {
     @Resource
     private BoilerTaskOrderItemReportService boilerTaskOrderItemReportService;
 
+    @Resource
+    private ExternalOAService externalOAService;
+
+    @Resource
+    private BoilerTaskOrderItemReportMapper boilerTaskOrderItemReportMapper;
+
     @PostMapping("/create")
     @Operation(summary = "创建锅炉任务单设备关联报告")
     //@PreAuthorize("@ss.hasPermission('pressure2:boiler-task-order-item-report:create')")
@@ -119,4 +132,29 @@ public class BoilerTaskOrderItemReportController {
         return success(boilerTaskOrderItemReportService.updateReportBySummaryId(summaryId));
     }
 
+    // ==================== OA流程:锅炉审核/审批分页 ====================
+
+    @GetMapping("/report-check/page")
+    @Operation(summary = "OA锅炉报告审核分页")
+    public CommonResult<PageResult<OATodoReportRespVO>> reportCheckPage(@Valid OATodoReportPageReqVO pageReqVO) {
+        return success(queryOAPage(pageReqVO, TaskOrderStatusEnum.REPORT_APPROVAL.getStatus()));
+    }
+
+    @GetMapping("/report-ratify/page")
+    @Operation(summary = "OA锅炉报告审批分页")
+    public CommonResult<PageResult<OATodoReportRespVO>> reportRatifyPage(@Valid OATodoReportPageReqVO pageReqVO) {
+        return success(queryOAPage(pageReqVO, TaskOrderStatusEnum.REPORT_RATIFY.getStatus()));
+    }
+
+    /** OA审核/审批公用查询逻辑 */
+    private PageResult<OATodoReportRespVO> queryOAPage(OATodoReportPageReqVO reqVO, Integer taskStatus) {
+        List<Long> summaryIds = externalOAService.getAffairSummaryList();
+        if (summaryIds == null || summaryIds.isEmpty()) {
+            return new PageResult<>(Collections.emptyList(), 0L);
+        }
+        reqVO.setSummaryIds(summaryIds.stream().map(String::valueOf).toList());
+        reqVO.setTaskStatus(taskStatus);
+        return boilerTaskOrderItemReportMapper.selectOACheckPage(reqVO);
+    }
+
 }

+ 66 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/externalOA/vo/OATodoReportPageReqVO.java

@@ -0,0 +1,66 @@
+package cn.start.tz.module.pressure2.controller.admin.externalOA.vo;
+
+import cn.start.tz.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.util.List;
+
+import static cn.start.tz.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+/**
+ * OA待办报告审核/审批分页查询 Request VO
+ */
+@Schema(description = "OA待办 - 报告审核/审批分页查询 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class OATodoReportPageReqVO extends PageParam {
+
+    @Schema(description = "任务单号")
+    private String orderNo;
+
+    @Schema(description = "记录编号(报告编号)")
+    private String recordNo;
+
+    @Schema(description = "设备注册代码")
+    private String equipCode;
+
+    @Schema(description = "出厂编号")
+    private String productNo;
+
+    @Schema(description = "单位名称")
+    private String unitName;
+
+    @Schema(description = "检验类型")
+    private Integer checkType;
+
+    @Schema(description = "检验项目(报告名称)")
+    private String checkProject;
+
+    @Schema(description = "检验员ID列表")
+    private List<String> checkUserIds;
+
+    @Schema(description = "已检天数(检验日期距今天数)")
+    private Integer checkedDays;
+
+    @Schema(description = "校核人ID")
+    private String recheckId;
+
+    @Schema(description = "项目负责人ID列表")
+    private List<String> managerIds;
+
+    /** OA过滤用:summaryId列表(Controller层设置,前端不传) */
+    private List<String> summaryIds;
+
+    /** OA过滤用:任务状态(Controller层设置,前端不传) */
+    private Integer taskStatus;
+
+    @Schema(description = "检验日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private List<LocalDate> checkDate;
+}

+ 60 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/externalOA/vo/OATodoReportRespVO.java

@@ -0,0 +1,60 @@
+package cn.start.tz.module.pressure2.controller.admin.externalOA.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * OA待办报告审核/审批列表 Response VO
+ */
+@Schema(description = "OA待办 - 报告审核/审批列表 Response VO")
+@Data
+public class OATodoReportRespVO {
+
+    @Schema(description = "报告ID")
+    private String id;
+
+    @Schema(description = "任务单号")
+    private String orderNo;
+
+    @Schema(description = "记录编号(报告编号)")
+    private String recordNo;
+
+    @Schema(description = "设备注册代码")
+    private String equipCode;
+
+    @Schema(description = "单位名称")
+    private String unitName;
+
+    @Schema(description = "剩余期限(工作日)")
+    private Integer remainingDays;
+
+    @Schema(description = "检验项目(报告名称)")
+    private String checkProject;
+
+    @Schema(description = "报告编制人")
+    private String prepareName;
+
+    @Schema(description = "报告状态", example = "600")
+    private Integer taskStatus;
+
+    @Schema(description = "检验时间")
+    private LocalDate checkDate;
+
+    @Schema(description = "校核人")
+    private String recheckName;
+
+    @Schema(description = "审核人")
+    private String approvalName;
+
+    @Schema(description = "提交时间")
+    private LocalDateTime submitTime;
+
+    @Schema(description = "orderItemId(用于跳转详情)")
+    private String orderItemId;
+
+    @Schema(description = "orderId")
+    private String orderId;
+}

+ 40 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/pipetaskorderitemreport/PipeTaskOrderItemReportController.java

@@ -30,6 +30,14 @@ import cn.start.tz.module.pressure2.controller.admin.pipetaskorderitemreport.vo.
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitemreport.PipeTaskOrderItemReportDO;
 import cn.start.tz.module.pressure2.service.pipetaskorderitemreport.PipeTaskOrderItemReportService;
 
+import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerTaskOrderPageReqVO;
+import cn.start.tz.module.pressure2.controller.admin.externalOA.vo.OATodoReportPageReqVO;
+import cn.start.tz.module.pressure2.controller.admin.externalOA.vo.OATodoReportRespVO;
+import cn.start.tz.module.pressure2.controller.admin.pipetaskorder.vo.PipeOrderItemPageRespVO;
+import cn.start.tz.module.pressure2.dal.mysql.pipetaskorderitemreport.PipeTaskOrderItemReportMapper;
+import cn.start.tz.module.pressure2.enums.TaskOrderStatusEnum;
+import cn.start.tz.module.pressure2.service.externalOA.ExternalOAService;
+
 @Tag(name = "管理后台 - 管道任务单设备关联报告")
 @RestController
 @RequestMapping("/pressure2/pipe-task-order-item-report")
@@ -39,6 +47,12 @@ public class PipeTaskOrderItemReportController {
     @Resource
     private PipeTaskOrderItemReportService pipeTaskOrderItemReportService;
 
+    @Resource
+    private ExternalOAService externalOAService;
+
+    @Resource
+    private PipeTaskOrderItemReportMapper pipeTaskOrderItemReportMapper;
+
     @PostMapping("/create")
     @Operation(summary = "创建管道任务单设备关联报告")
     //@PreAuthorize("@ss.hasPermission('pressure2:pipe-task-order-item-report:create')")
@@ -111,4 +125,30 @@ public class PipeTaskOrderItemReportController {
     public CommonResult<Boolean> updateReportBySummaryId(@RequestParam("summaryId") String summaryId) {
         return success(pipeTaskOrderItemReportService.updateReportBySummaryId(summaryId));
     }
+
+    // ==================== OA流程:管道审核/审批分页 ====================
+
+    @GetMapping("/report-check/page")
+    @Operation(summary = "OA管道报告审核分页")
+    public CommonResult<PageResult<OATodoReportRespVO>> reportCheckPage(@Valid OATodoReportPageReqVO pageReqVO) {
+        return success(queryOAPage(pageReqVO, TaskOrderStatusEnum.REPORT_APPROVAL.getStatus()));
+    }
+
+    @GetMapping("/report-ratify/page")
+    @Operation(summary = "OA管道报告审批分页")
+    public CommonResult<PageResult<OATodoReportRespVO>> reportRatifyPage(@Valid OATodoReportPageReqVO pageReqVO) {
+        return success(queryOAPage(pageReqVO, TaskOrderStatusEnum.REPORT_RATIFY.getStatus()));
+    }
+
+    /** OA审核/审批公用查询逻辑 */
+    private PageResult<OATodoReportRespVO> queryOAPage(OATodoReportPageReqVO reqVO, Integer taskStatus) {
+        List<Long> summaryIds = externalOAService.getAffairSummaryList();
+        if (summaryIds == null || summaryIds.isEmpty()) {
+            return new PageResult<>(Collections.emptyList(), 0L);
+        }
+        reqVO.setSummaryIds(summaryIds.stream().map(String::valueOf).toList());
+        reqVO.setTaskStatus(taskStatus);
+        return pipeTaskOrderItemReportMapper.selectOACheckPage(reqVO);
+    }
+
 }

+ 82 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/mysql/boilertaskorderitemreport/BoilerTaskOrderItemReportMapper.java

@@ -2,6 +2,8 @@ package cn.start.tz.module.pressure2.dal.mysql.boilertaskorderitemreport;
 
 import java.util.*;
 
+import java.time.LocalDate;
+
 import cn.hutool.core.collection.CollUtil;
 import cn.start.tz.framework.common.pojo.PageResult;
 import cn.start.tz.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -10,11 +12,17 @@ import cn.start.tz.framework.mybatis.core.query.MPJLambdaWrapperX;
 import cn.start.tz.module.bpm.enums.task.BpmTaskStatusEnum;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerMajorIssuesPageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerMajorIssuesPageRespVO;
+import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerOrderItemPageRespVO;
+import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerTaskOrderPageReqVO;
+import cn.start.tz.module.pressure2.controller.admin.externalOA.vo.OATodoReportPageReqVO;
+import cn.start.tz.module.pressure2.controller.admin.externalOA.vo.OATodoReportRespVO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorder.BoilerTaskOrderDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitem.BoilerTaskOrderItemDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreport.BoilerTaskOrderItemReportDO;
+import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreportuser.BoilerTaskOrderItemReportUserDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderreport.BoilerTaskOrderReportDO;
 import cn.start.tz.module.pressure2.dal.dataobject.dynamictb.DynamicTbDO;
+import cn.start.tz.module.pressure2.dal.dataobject.equipboiler.EquipBoilerDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitemreport.PipeTaskOrderItemReportDO;
 import jodd.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -195,4 +203,78 @@ public interface BoilerTaskOrderItemReportMapper extends BaseMapperX<BoilerTaskO
 
     List<BoilerTaskOrderItemReportDO> selectGenerateReportList(String orderId);
 
+    /**
+     * OA审核/审批分页查询(独立方法,不影响原有接口)
+     * 按summaryId + taskStatus过滤报告,关联任务单、设备、报告用户信息
+     */
+    default PageResult<OATodoReportRespVO> selectOACheckPage(OATodoReportPageReqVO reqVO) {
+        MPJLambdaWrapperX<BoilerTaskOrderItemReportDO> wrapper = new MPJLambdaWrapperX<>();
+        wrapper.selectAs(BoilerTaskOrderItemReportDO::getId, OATodoReportRespVO::getId)
+                .selectAs(BoilerTaskOrderItemReportDO::getReportNo, OATodoReportRespVO::getRecordNo)
+                .selectAs(BoilerTaskOrderItemReportDO::getReportName, OATodoReportRespVO::getCheckProject)
+                .selectAs(BoilerTaskOrderItemReportDO::getPrepareName, OATodoReportRespVO::getPrepareName)
+                .selectAs(BoilerTaskOrderItemReportDO::getTaskStatus, OATodoReportRespVO::getTaskStatus)
+                .selectAs(BoilerTaskOrderItemReportDO::getRecheckName, OATodoReportRespVO::getRecheckName)
+                .selectAs(BoilerTaskOrderItemReportDO::getApprovalName, OATodoReportRespVO::getApprovalName)
+                .selectAs(BoilerTaskOrderItemReportDO::getSubmitTime, OATodoReportRespVO::getSubmitTime)
+                .selectAs(BoilerTaskOrderItemReportDO::getOrderItemId, OATodoReportRespVO::getOrderItemId)
+                .selectAs(BoilerTaskOrderItemReportDO::getOrderId, OATodoReportRespVO::getOrderId)
+                .selectAs(BoilerTaskOrderDO::getOrderNo, OATodoReportRespVO::getOrderNo)
+                .selectAs(BoilerTaskOrderDO::getUnitName, OATodoReportRespVO::getUnitName)
+                .selectAs(BoilerTaskOrderDO::getCheckDate, OATodoReportRespVO::getCheckDate)
+                .selectAs(EquipBoilerDO::getEquipCode, OATodoReportRespVO::getEquipCode)
+                .leftJoin(BoilerTaskOrderItemDO.class, BoilerTaskOrderItemDO::getId, BoilerTaskOrderItemReportDO::getOrderItemId)
+                .leftJoin(BoilerTaskOrderDO.class, BoilerTaskOrderDO::getId, BoilerTaskOrderItemDO::getOrderId)
+                .leftJoin(EquipBoilerDO.class, EquipBoilerDO::getId, BoilerTaskOrderItemDO::getEquipId)
+                .eq(BoilerTaskOrderItemReportDO::getReportType, 100) // 只查主报告
+                .in(BoilerTaskOrderItemReportDO::getSummaryId, reqVO.getSummaryIds())
+                .eq(BoilerTaskOrderItemReportDO::getTaskStatus, reqVO.getTaskStatus())
+                .orderByDesc(BoilerTaskOrderItemReportDO::getSubmitTime);
+
+        // 检验员过滤:关联报告用户表
+        if (!CollUtil.isEmpty(reqVO.getCheckUserIds())) {
+            wrapper.leftJoin(BoilerTaskOrderItemReportUserDO.class,
+                    BoilerTaskOrderItemReportUserDO::getReportId, BoilerTaskOrderItemReportDO::getId);
+            wrapper.in(BoilerTaskOrderItemReportUserDO::getUserId, reqVO.getCheckUserIds());
+        }
+
+        // 搜索条件
+        if (StringUtils.isNotBlank(reqVO.getOrderNo())) {
+            wrapper.like(BoilerTaskOrderDO::getOrderNo, reqVO.getOrderNo());
+        }
+        if (StringUtils.isNotBlank(reqVO.getRecordNo())) {
+            wrapper.like(BoilerTaskOrderItemReportDO::getReportNo, reqVO.getRecordNo());
+        }
+        if (StringUtils.isNotBlank(reqVO.getEquipCode())) {
+            wrapper.like(EquipBoilerDO::getEquipCode, reqVO.getEquipCode());
+        }
+        if (StringUtils.isNotBlank(reqVO.getProductNo())) {
+            wrapper.like(EquipBoilerDO::getProductCode, reqVO.getProductNo());
+        }
+        if (StringUtils.isNotBlank(reqVO.getUnitName())) {
+            wrapper.like(BoilerTaskOrderDO::getUnitName, reqVO.getUnitName());
+        }
+        if (reqVO.getCheckType() != null) {
+            wrapper.eq(BoilerTaskOrderDO::getCheckType, reqVO.getCheckType());
+        }
+        if (StringUtils.isNotBlank(reqVO.getCheckProject())) {
+            wrapper.like(BoilerTaskOrderItemReportDO::getReportName, reqVO.getCheckProject());
+        }
+        if (StringUtils.isNotBlank(reqVO.getRecheckId())) {
+            wrapper.eq(BoilerTaskOrderItemReportDO::getRecheckId, reqVO.getRecheckId());
+        }
+        if (!CollUtil.isEmpty(reqVO.getManagerIds())) {
+            wrapper.in(BoilerTaskOrderDO::getManagerId, reqVO.getManagerIds());
+        }
+        if (reqVO.getCheckedDays() != null && reqVO.getCheckedDays() > 0) {
+            // 已检天数:检验日期 = 今天 - checkedDays
+            wrapper.le(BoilerTaskOrderDO::getCheckDate, LocalDate.now());
+            wrapper.ge(BoilerTaskOrderDO::getCheckDate, LocalDate.now().minusDays(reqVO.getCheckedDays()));
+        }
+        if (!CollUtil.isEmpty(reqVO.getCheckDate()) && reqVO.getCheckDate().size() == 2) {
+            wrapper.between(BoilerTaskOrderDO::getCheckDate, reqVO.getCheckDate().get(0), reqVO.getCheckDate().get(1));
+        }
+
+        return selectJoinPage(reqVO, OATodoReportRespVO.class, wrapper);
+    }
 }

+ 77 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/mysql/pipetaskorderitemreport/PipeTaskOrderItemReportMapper.java

@@ -2,6 +2,8 @@ package cn.start.tz.module.pressure2.dal.mysql.pipetaskorderitemreport;
 
 import java.util.*;
 
+import java.time.LocalDate;
+
 import cn.hutool.core.collection.CollUtil;
 import cn.start.tz.framework.common.pojo.PageResult;
 import cn.start.tz.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -10,6 +12,10 @@ import cn.start.tz.framework.mybatis.core.query.MPJLambdaWrapperX;
 import cn.start.tz.module.bpm.enums.task.BpmTaskStatusEnum;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerMajorIssuesPageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerMajorIssuesPageRespVO;
+import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerTaskOrderPageReqVO;
+import cn.start.tz.module.pressure2.controller.admin.externalOA.vo.OATodoReportPageReqVO;
+import cn.start.tz.module.pressure2.controller.admin.externalOA.vo.OATodoReportRespVO;
+import cn.start.tz.module.pressure2.controller.admin.pipetaskorder.vo.PipeOrderItemPageRespVO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorder.BoilerTaskOrderDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitem.BoilerTaskOrderItemDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreport.BoilerTaskOrderItemReportDO;
@@ -19,6 +25,7 @@ import cn.start.tz.module.pressure2.dal.dataobject.equippipe.EquipPipeDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorder.PipeTaskOrderDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitem.PipeTaskOrderItemDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitemreport.PipeTaskOrderItemReportDO;
+import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitemreportuser.PipeTaskOrderItemReportUserDO;
 import jodd.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.ibatis.annotations.Mapper;
@@ -200,4 +207,74 @@ public interface PipeTaskOrderItemReportMapper extends BaseMapperX<PipeTaskOrder
 
     List<PipeTaskOrderItemReportDO> selectGenerateReportList(String orderId);
 
+    /**
+     * OA审核/审批分页查询(独立方法,不影响原有接口)
+     * 按summaryId + taskStatus过滤报告,关联任务单、设备、报告用户信息
+     */
+    default PageResult<OATodoReportRespVO> selectOACheckPage(OATodoReportPageReqVO reqVO) {
+        MPJLambdaWrapperX<PipeTaskOrderItemReportDO> wrapper = new MPJLambdaWrapperX<>();
+        wrapper.selectAs(PipeTaskOrderItemReportDO::getId, OATodoReportRespVO::getId)
+                .selectAs(PipeTaskOrderItemReportDO::getReportNo, OATodoReportRespVO::getRecordNo)
+                .selectAs(PipeTaskOrderItemReportDO::getReportName, OATodoReportRespVO::getCheckProject)
+                .selectAs(PipeTaskOrderItemReportDO::getPrepareName, OATodoReportRespVO::getPrepareName)
+                .selectAs(PipeTaskOrderItemReportDO::getTaskStatus, OATodoReportRespVO::getTaskStatus)
+                .selectAs(PipeTaskOrderItemReportDO::getRecheckName, OATodoReportRespVO::getRecheckName)
+                .selectAs(PipeTaskOrderItemReportDO::getApprovalName, OATodoReportRespVO::getApprovalName)
+                .selectAs(PipeTaskOrderItemReportDO::getSubmitTime, OATodoReportRespVO::getSubmitTime)
+                .selectAs(PipeTaskOrderItemReportDO::getOrderId, OATodoReportRespVO::getOrderId)
+                .selectAs(PipeTaskOrderDO::getOrderNo, OATodoReportRespVO::getOrderNo)
+                .selectAs(PipeTaskOrderDO::getUnitName, OATodoReportRespVO::getUnitName)
+                .selectAs(PipeTaskOrderDO::getCheckDate, OATodoReportRespVO::getCheckDate)
+                .leftJoin(PipeTaskOrderDO.class, PipeTaskOrderDO::getId, PipeTaskOrderItemReportDO::getOrderId)
+                .leftJoin(PipeTaskOrderItemDO.class, PipeTaskOrderItemDO::getOrderId, PipeTaskOrderDO::getId)
+                .leftJoin(EquipPipeDO.class, EquipPipeDO::getId, PipeTaskOrderItemDO::getEquipId)
+                .eq(PipeTaskOrderItemReportDO::getReportType, 100) // 只查主报告
+                .in(PipeTaskOrderItemReportDO::getSummaryId, reqVO.getSummaryIds())
+                .eq(PipeTaskOrderItemReportDO::getTaskStatus, reqVO.getTaskStatus())
+                .orderByDesc(PipeTaskOrderItemReportDO::getSubmitTime)
+                // 设备注册代码取管线项目编号
+                .selectAs(EquipPipeDO::getProjectNo, OATodoReportRespVO::getEquipCode);
+
+        // 检验员过滤:关联报告用户表
+        if (!CollUtil.isEmpty(reqVO.getCheckUserIds())) {
+            wrapper.leftJoin(PipeTaskOrderItemReportUserDO.class,
+                    PipeTaskOrderItemReportUserDO::getReportId, PipeTaskOrderItemReportDO::getId);
+            wrapper.in(PipeTaskOrderItemReportUserDO::getUserId, reqVO.getCheckUserIds());
+        }
+
+        // 搜索条件
+        if (StringUtils.isNotBlank(reqVO.getOrderNo())) {
+            wrapper.like(PipeTaskOrderDO::getOrderNo, reqVO.getOrderNo());
+        }
+        if (StringUtils.isNotBlank(reqVO.getRecordNo())) {
+            wrapper.like(PipeTaskOrderItemReportDO::getReportNo, reqVO.getRecordNo());
+        }
+        if (StringUtils.isNotBlank(reqVO.getEquipCode())) {
+            wrapper.like(EquipPipeDO::getProjectNo, reqVO.getEquipCode());
+        }
+        if (StringUtils.isNotBlank(reqVO.getUnitName())) {
+            wrapper.like(PipeTaskOrderDO::getUnitName, reqVO.getUnitName());
+        }
+        if (reqVO.getCheckType() != null) {
+            wrapper.eq(PipeTaskOrderDO::getCheckType, reqVO.getCheckType());
+        }
+        if (StringUtils.isNotBlank(reqVO.getCheckProject())) {
+            wrapper.like(PipeTaskOrderItemReportDO::getReportName, reqVO.getCheckProject());
+        }
+        if (StringUtils.isNotBlank(reqVO.getRecheckId())) {
+            wrapper.eq(PipeTaskOrderItemReportDO::getRecheckId, reqVO.getRecheckId());
+        }
+        if (!CollUtil.isEmpty(reqVO.getManagerIds())) {
+            wrapper.in(PipeTaskOrderDO::getManagerId, reqVO.getManagerIds());
+        }
+        if (reqVO.getCheckedDays() != null && reqVO.getCheckedDays() > 0) {
+            wrapper.le(PipeTaskOrderDO::getCheckDate, LocalDate.now());
+            wrapper.ge(PipeTaskOrderDO::getCheckDate, LocalDate.now().minusDays(reqVO.getCheckedDays()));
+        }
+        if (!CollUtil.isEmpty(reqVO.getCheckDate()) && reqVO.getCheckDate().size() == 2) {
+            wrapper.between(PipeTaskOrderDO::getCheckDate, reqVO.getCheckDate().get(0), reqVO.getCheckDate().get(1));
+        }
+
+        return selectJoinPage(reqVO, OATodoReportRespVO.class, wrapper);
+    }
 }

+ 14 - 0
tz-module-system/tz-module-system-biz/src/main/java/cn/start/tz/module/system/controller/admin/user/UserController.java

@@ -260,6 +260,20 @@ public class UserController {
     }
 
 
+    @PostMapping("/assign-role-batch")
+    @Operation(summary = "批量分配用户角色", description = "给多个用户统一分配同一个角色")
+    public CommonResult<Boolean> assignRoleBatch(@Valid @RequestBody UserAssignRoleBatchReqVO reqVO) {
+        userService.assignRoleBatch(reqVO);
+        return success(true);
+    }
+
+    @GetMapping("/list-by-role")
+    @Operation(summary = "根据角色获取用户ID列表")
+    @Parameter(name = "roleId", description = "角色编号", required = true, example = "1")
+    public CommonResult<Set<String>> getUserIdListByRoleId(@RequestParam("roleId") String roleId) {
+        return success(permissionService.getUserRoleIdListByRoleId(Set.of(roleId)));
+    }
+
     @PutMapping("/appointment-dept")
     @Operation(summary = "修改约检部门")
     public CommonResult<Boolean> appointmentDept(@Valid @RequestBody UserUpdarteAppointmentDeptVO reqVO) {

+ 7 - 0
tz-module-system/tz-module-system-biz/src/main/java/cn/start/tz/module/system/service/user/AdminUserService.java

@@ -249,5 +249,12 @@ public interface AdminUserService {
 
     void appointmentDept(@Valid UserUpdarteAppointmentDeptVO reqVO);
 
+    /**
+     * 批量分配用户角色 - 给多个用户统一分配同一个角色
+     *
+     * @param reqVO 批量分配请求,包含角色ID和用户ID列表
+     */
+    void assignRoleBatch(UserAssignRoleBatchReqVO reqVO);
+
 //    void localFileUpload();
 }

+ 11 - 0
tz-module-system/tz-module-system-biz/src/main/java/cn/start/tz/module/system/service/user/AdminUserServiceImpl.java

@@ -703,6 +703,17 @@ public class AdminUserServiceImpl implements AdminUserService {
         userMapper.updateById(updateObj);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void assignRoleBatch(UserAssignRoleBatchReqVO reqVO) {
+        // 遍历用户列表,为每个用户追加该角色(保留已有角色)
+        for (String userId : reqVO.getUserIds()) {
+            Set<String> existingRoleIds = permissionService.getUserRoleIdListByUserId(userId);
+            existingRoleIds.add(reqVO.getRoleId());
+            permissionService.assignUserRole(userId, existingRoleIds);
+        }
+    }
+
 //    private static final String IMAGE_DIRECTORY = "C:\\Users\\LENOVO\\Desktop\\代码生成\\签名";
 //
 //    @Override