huminmin
2026-06-29 b16eec9b38aedda5f5e7e60f749f9b2dbba2a84e
特种设备管理
已添加20个文件
713 ■■■■■ 文件已修改
doc/特种设备管理建表SQL.sql 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/controller/SpecialEquipmentLedgerController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/controller/SpecialEquipmentRecordController.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/controller/SpecialEquipmentRectificationController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/mapper/SpecialEquipmentLedgerMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/mapper/SpecialEquipmentRecordMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/mapper/SpecialEquipmentRectificationMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/pojo/SpecialEquipmentLedger.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/pojo/SpecialEquipmentRecord.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/pojo/SpecialEquipmentRectification.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/service/SpecialEquipmentLedgerService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/service/SpecialEquipmentRecordService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/service/SpecialEquipmentRectificationService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/service/impl/SpecialEquipmentLedgerServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/service/impl/SpecialEquipmentRecordServiceImpl.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/service/impl/SpecialEquipmentRectificationServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/specialequipment/task/SpecialEquipmentReminderTask.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/safe/specialequipment/SpecialEquipmentLedgerMapper.xml 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/safe/specialequipment/SpecialEquipmentRecordMapper.xml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/safe/specialequipment/SpecialEquipmentRectificationMapper.xml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/ÌØÖÖÉ豸¹ÜÀí½¨±íSQL.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
-- ç‰¹ç§è®¾å¤‡ç®¡ç†
-- å½’属:安全生产模块
DROP TABLE IF EXISTS special_equipment_ledger;
CREATE TABLE special_equipment_ledger (
    id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    equipment_no VARCHAR(64) DEFAULT NULL COMMENT '设备编号',
    equipment_name VARCHAR(128) DEFAULT NULL COMMENT '设备名称',
    equipment_type VARCHAR(64) DEFAULT NULL COMMENT '设备类别',
    model_spec VARCHAR(128) DEFAULT NULL COMMENT '规格型号',
    manufacture_date DATE DEFAULT NULL COMMENT '制造日期',
    install_location VARCHAR(255) DEFAULT NULL COMMENT '安装位置',
    use_unit VARCHAR(255) DEFAULT NULL COMMENT '使用单位',
    certificate_no VARCHAR(128) DEFAULT NULL COMMENT '特种设备使用登记证号',
    inspection_cycle_days INT DEFAULT NULL COMMENT '检验周期(天)',
    next_inspection_date DATE DEFAULT NULL COMMENT '下次检验日期',
    maintenance_cycle_days INT DEFAULT NULL COMMENT '维保周期(天)',
    next_maintenance_date DATE DEFAULT NULL COMMENT '下次维保日期',
    alarm_days INT DEFAULT 30 COMMENT '预警提前天数',
    manager_id BIGINT DEFAULT NULL COMMENT '负责人ID',
    manager_name VARCHAR(64) DEFAULT NULL COMMENT '负责人',
    safety_officer VARCHAR(64) DEFAULT NULL COMMENT '安全员',
    risk_level VARCHAR(32) DEFAULT NULL COMMENT '风险等级',
    latest_inspection_date DATE DEFAULT NULL COMMENT '最新检验日期',
    latest_maintenance_date DATE DEFAULT NULL COMMENT '最新维保日期',
    hazard_status TINYINT DEFAULT 0 COMMENT '隐患状态 0-无隐患 1-待整改 2-整改中 3-已闭环',
    hazard_description VARCHAR(500) DEFAULT NULL COMMENT '隐患描述',
    rectification_deadline DATE DEFAULT NULL COMMENT '整改截止日期',
    remarks VARCHAR(500) DEFAULT NULL COMMENT '备注',
    create_user BIGINT DEFAULT NULL COMMENT '创建人',
    create_time DATETIME DEFAULT NULL COMMENT '创建时间',
    update_user BIGINT DEFAULT NULL COMMENT '更新人',
    update_time DATETIME DEFAULT NULL COMMENT '更新时间',
    tenant_id BIGINT DEFAULT NULL COMMENT '租户ID',
    dept_id BIGINT DEFAULT NULL COMMENT '部门ID',
    PRIMARY KEY (id),
    KEY idx_ledger_equipment_no (equipment_no),
    KEY idx_ledger_next_inspection_date (next_inspection_date),
    KEY idx_ledger_next_maintenance_date (next_maintenance_date),
    KEY idx_ledger_tenant_id (tenant_id),
    KEY idx_ledger_dept_id (dept_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='特种设备电子台账';
DROP TABLE IF EXISTS special_equipment_record;
CREATE TABLE special_equipment_record (
    id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    equipment_id BIGINT DEFAULT NULL COMMENT '设备ID',
    record_type TINYINT DEFAULT NULL COMMENT '记录类型 1-检验 2-维保',
    record_no VARCHAR(64) DEFAULT NULL COMMENT '记录编号',
    record_date DATE DEFAULT NULL COMMENT '记录日期',
    execute_result VARCHAR(255) DEFAULT NULL COMMENT '执行结果',
    problem_description VARCHAR(500) DEFAULT NULL COMMENT '问题描述',
    dispose_measure VARCHAR(500) DEFAULT NULL COMMENT '处理措施',
    executor_id BIGINT DEFAULT NULL COMMENT '执行人ID',
    executor_name VARCHAR(64) DEFAULT NULL COMMENT '执行人',
    next_due_date DATE DEFAULT NULL COMMENT '下次到期日期',
    attachment_remark VARCHAR(500) DEFAULT NULL COMMENT '附件说明',
    create_user BIGINT DEFAULT NULL COMMENT '创建人',
    create_time DATETIME DEFAULT NULL COMMENT '创建时间',
    update_user BIGINT DEFAULT NULL COMMENT '更新人',
    update_time DATETIME DEFAULT NULL COMMENT '更新时间',
    tenant_id BIGINT DEFAULT NULL COMMENT '租户ID',
    dept_id BIGINT DEFAULT NULL COMMENT '部门ID',
    PRIMARY KEY (id),
    KEY idx_record_equipment_id (equipment_id),
    KEY idx_record_record_type (record_type),
    KEY idx_record_record_date (record_date),
    KEY idx_record_next_due_date (next_due_date),
    KEY idx_record_tenant_id (tenant_id),
    KEY idx_record_dept_id (dept_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='特种设备检验维保记录';
DROP TABLE IF EXISTS special_equipment_rectification;
CREATE TABLE special_equipment_rectification (
    id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    equipment_id BIGINT DEFAULT NULL COMMENT '设备ID',
    hazard_description VARCHAR(500) DEFAULT NULL COMMENT '隐患描述',
    risk_level VARCHAR(32) DEFAULT NULL COMMENT '风险等级',
    discovered_date DATE DEFAULT NULL COMMENT '发现日期',
    responsible_user_id BIGINT DEFAULT NULL COMMENT '整改责任人ID',
    responsible_user_name VARCHAR(64) DEFAULT NULL COMMENT '整改责任人',
    rectification_deadline DATE DEFAULT NULL COMMENT '整改期限',
    rectification_status TINYINT DEFAULT 1 COMMENT '整改状态 1-待整改 2-整改中 3-待复核 4-已闭环',
    rectification_measures VARCHAR(500) DEFAULT NULL COMMENT '整改措施',
    rectification_result VARCHAR(500) DEFAULT NULL COMMENT '整改结果',
    closed_date DATE DEFAULT NULL COMMENT '闭环日期',
    remarks VARCHAR(500) DEFAULT NULL COMMENT '备注',
    create_user BIGINT DEFAULT NULL COMMENT '创建人',
    create_time DATETIME DEFAULT NULL COMMENT '创建时间',
    update_user BIGINT DEFAULT NULL COMMENT '更新人',
    update_time DATETIME DEFAULT NULL COMMENT '更新时间',
    tenant_id BIGINT DEFAULT NULL COMMENT '租户ID',
    dept_id BIGINT DEFAULT NULL COMMENT '部门ID',
    PRIMARY KEY (id),
    KEY idx_rect_equipment_id (equipment_id),
    KEY idx_rect_status (rectification_status),
    KEY idx_rect_deadline (rectification_deadline),
    KEY idx_rect_tenant_id (tenant_id),
    KEY idx_rect_dept_id (dept_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='特种设备隐患整改';
src/main/java/com/ruoyi/safe/specialequipment/controller/SpecialEquipmentLedgerController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.safe.specialequipment.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentLedger;
import com.ruoyi.safe.specialequipment.service.SpecialEquipmentLedgerService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@Tag(name = "安全生产--特种设备电子台账")
@RequestMapping("/safe/specialEquipment/ledger")
@AllArgsConstructor
public class SpecialEquipmentLedgerController extends BaseController {
    private final SpecialEquipmentLedgerService service;
    @GetMapping("/listPage") @Operation(summary = "特种设备台账-分页查询")
    public AjaxResult listPage(Page page, SpecialEquipmentLedger req) { return AjaxResult.success(service.listPage(page, req)); }
    @GetMapping("/list") @Operation(summary = "特种设备台账-列表查询")
    public AjaxResult list(SpecialEquipmentLedger req) { return AjaxResult.success(service.list(Wrappers.lambdaQuery(req))); }
    @PostMapping("/add") @Log(title = "特种设备台账-新增", businessType = BusinessType.INSERT)
    @Operation(summary = "特种设备台账-新增")
    public AjaxResult add(@RequestBody SpecialEquipmentLedger req) { return service.save(req) ? success() : error(); }
    @PostMapping("/update") @Log(title = "特种设备台账-修改", businessType = BusinessType.UPDATE)
    @Operation(summary = "特种设备台账-修改")
    public AjaxResult update(@RequestBody SpecialEquipmentLedger req) { return service.updateById(req) ? success() : error(); }
    @DeleteMapping("/delete") @Log(title = "特种设备台账-删除", businessType = BusinessType.DELETE)
    @Operation(summary = "特种设备台账-删除")
    public AjaxResult delete(@RequestBody List<Long> ids) { return service.removeByIds(ids) ? success() : error(); }
}
src/main/java/com/ruoyi/safe/specialequipment/controller/SpecialEquipmentRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.safe.specialequipment.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentRecord;
import com.ruoyi.safe.specialequipment.service.SpecialEquipmentRecordService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@Tag(name = "安全生产--特种设备检验维保记录")
@RequestMapping("/safe/specialEquipment/record")
@AllArgsConstructor
public class SpecialEquipmentRecordController extends BaseController {
    private final SpecialEquipmentRecordService service;
    @GetMapping("/listPage") @Operation(summary = "检验维保记录-分页查询")
    public AjaxResult listPage(Page page, SpecialEquipmentRecord req) { return AjaxResult.success(service.listPage(page, req)); }
    @PostMapping("/add") @Log(title = "检验维保记录-新增", businessType = BusinessType.INSERT)
    @Operation(summary = "检验维保记录-新增")
    public AjaxResult add(@RequestBody SpecialEquipmentRecord req) { return service.save(req) ? success() : error(); }
    @PostMapping("/update") @Log(title = "检验维保记录-修改", businessType = BusinessType.UPDATE)
    @Operation(summary = "检验维保记录-修改")
    public AjaxResult update(@RequestBody SpecialEquipmentRecord req) { return service.updateById(req) ? success() : error(); }
    @DeleteMapping("/delete") @Log(title = "检验维保记录-删除", businessType = BusinessType.DELETE)
    @Operation(summary = "检验维保记录-删除")
    public AjaxResult delete(@RequestBody List<Long> ids) { return service.removeByIds(ids) ? success() : error(); }
}
src/main/java/com/ruoyi/safe/specialequipment/controller/SpecialEquipmentRectificationController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.safe.specialequipment.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentRectification;
import com.ruoyi.safe.specialequipment.service.SpecialEquipmentRectificationService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
import java.util.List;
@RestController
@Tag(name = "安全生产--特种设备隐患整改")
@RequestMapping("/safe/specialEquipment/rectification")
@AllArgsConstructor
public class SpecialEquipmentRectificationController extends BaseController {
    private final SpecialEquipmentRectificationService service;
    @GetMapping("/listPage") @Operation(summary = "隐患整改-分页查询")
    public AjaxResult listPage(Page page, SpecialEquipmentRectification req) { return AjaxResult.success(service.listPage(page, req)); }
    @PostMapping("/add") @Log(title = "隐患整改-新增", businessType = BusinessType.INSERT)
    @Operation(summary = "隐患整改-新增")
    public AjaxResult add(@RequestBody SpecialEquipmentRectification req) { return service.save(req) ? success() : error(); }
    @PostMapping("/close") @Log(title = "隐患整改-闭环", businessType = BusinessType.UPDATE)
    @Operation(summary = "隐患整改-闭环")
    public AjaxResult close(@RequestBody SpecialEquipmentRectification req) { req.setRectificationStatus(4); req.setClosedDate(LocalDate.now()); return service.updateById(req) ? success() : error(); }
    @DeleteMapping("/delete") @Log(title = "隐患整改-删除", businessType = BusinessType.DELETE)
    @Operation(summary = "隐患整改-删除")
    public AjaxResult delete(@RequestBody List<Long> ids) { return service.removeByIds(ids) ? success() : error(); }
}
src/main/java/com/ruoyi/safe/specialequipment/mapper/SpecialEquipmentLedgerMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.safe.specialequipment.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentLedger;
import org.apache.ibatis.annotations.Param;
public interface SpecialEquipmentLedgerMapper extends BaseMapper<SpecialEquipmentLedger> {
    IPage<SpecialEquipmentLedger> listPage(Page page, @Param("req") SpecialEquipmentLedger req);
}
src/main/java/com/ruoyi/safe/specialequipment/mapper/SpecialEquipmentRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.safe.specialequipment.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentRecord;
import org.apache.ibatis.annotations.Param;
public interface SpecialEquipmentRecordMapper extends BaseMapper<SpecialEquipmentRecord> {
    IPage<SpecialEquipmentRecord> listPage(Page page, @Param("req") SpecialEquipmentRecord req);
}
src/main/java/com/ruoyi/safe/specialequipment/mapper/SpecialEquipmentRectificationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.safe.specialequipment.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentRectification;
import org.apache.ibatis.annotations.Param;
public interface SpecialEquipmentRectificationMapper extends BaseMapper<SpecialEquipmentRectification> {
    IPage<SpecialEquipmentRectification> listPage(Page page, @Param("req") SpecialEquipmentRectification req);
}
src/main/java/com/ruoyi/safe/specialequipment/pojo/SpecialEquipmentLedger.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.ruoyi.safe.specialequipment.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.*;
@Data
@Schema(description = "特种设备电子台账")
@TableName("special_equipment_ledger")
public class SpecialEquipmentLedger {
    private static final long serialVersionUID = 1L;
    @TableId(type = IdType.AUTO) private Long id;
    @Excel(name = "设备编号") private String equipmentNo;
    @Excel(name = "设备名称") private String equipmentName;
    @Excel(name = "设备类别") private String equipmentType;
    @Excel(name = "规格型号") private String modelSpec;
    @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "制造日期", width = 30, dateFormat = "yyyy-MM-dd") private LocalDate manufactureDate;
    @Excel(name = "安装位置") private String installLocation;
    @Excel(name = "使用单位") private String useUnit;
    @Excel(name = "登记证号") private String certificateNo;
    @Excel(name = "检验周期(天)") private Integer inspectionCycleDays;
    @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "下次检验日期", width = 30, dateFormat = "yyyy-MM-dd") private LocalDate nextInspectionDate;
    @Excel(name = "维保周期(天)") private Integer maintenanceCycleDays;
    @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "下次维保日期", width = 30, dateFormat = "yyyy-MM-dd") private LocalDate nextMaintenanceDate;
    @Excel(name = "预警提前天数") private Integer alarmDays;
    private Long managerId;
    @Excel(name = "负责人") private String managerName;
    @Excel(name = "安全员") private String safetyOfficer;
    @Excel(name = "风险等级") private String riskLevel;
    @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "最新检验日期", width = 30, dateFormat = "yyyy-MM-dd") private LocalDate latestInspectionDate;
    @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "最新维保日期", width = 30, dateFormat = "yyyy-MM-dd") private LocalDate latestMaintenanceDate;
    @Excel(name = "隐患状态", readConverterExp = "0=无隐患,1=待整改,2=整改中,3=已闭环") private Integer hazardStatus;
    @Excel(name = "隐患描述") private String hazardDescription;
    @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "整改截止日期", width = 30, dateFormat = "yyyy-MM-dd") private LocalDate rectificationDeadline;
    @Excel(name = "备注") private String remarks;
    @TableField(fill = FieldFill.INSERT) private Long createUser;
    @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime;
    @TableField(fill = FieldFill.UPDATE) private Long updateUser;
    @TableField(fill = FieldFill.UPDATE) private LocalDateTime updateTime;
    @TableField(fill = FieldFill.INSERT) private Long tenantId;
    @TableField(fill = FieldFill.INSERT) private Long deptId;
}
src/main/java/com/ruoyi/safe/specialequipment/pojo/SpecialEquipmentRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.safe.specialequipment.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.*;
@Data
@Schema(description = "特种设备检验维保记录")
@TableName("special_equipment_record")
public class SpecialEquipmentRecord {
    private static final long serialVersionUID = 1L;
    @TableId(type = IdType.AUTO) private Long id;
    private Long equipmentId;
    @Excel(name = "记录类型", readConverterExp = "1=检验,2=维保") private Integer recordType;
    @Excel(name = "记录编号") private String recordNo;
    @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "记录日期", width = 30, dateFormat = "yyyy-MM-dd") private LocalDate recordDate;
    @Excel(name = "执行结果") private String executeResult;
    @Excel(name = "问题描述") private String problemDescription;
    @Excel(name = "处理措施") private String disposeMeasure;
    private Long executorId;
    @Excel(name = "执行人") private String executorName;
    @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "下次到期日期", width = 30, dateFormat = "yyyy-MM-dd") private LocalDate nextDueDate;
    @Excel(name = "附件说明") private String attachmentRemark;
    @TableField(fill = FieldFill.INSERT) private Long createUser;
    @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime;
    @TableField(fill = FieldFill.UPDATE) private Long updateUser;
    @TableField(fill = FieldFill.UPDATE) private LocalDateTime updateTime;
    @TableField(fill = FieldFill.INSERT) private Long tenantId;
    @TableField(fill = FieldFill.INSERT) private Long deptId;
}
src/main/java/com/ruoyi/safe/specialequipment/pojo/SpecialEquipmentRectification.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.ruoyi.safe.specialequipment.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.*;
@Data
@Schema(description = "特种设备隐患整改")
@TableName("special_equipment_rectification")
public class SpecialEquipmentRectification {
    private static final long serialVersionUID = 1L;
    @TableId(type = IdType.AUTO) private Long id;
    private Long equipmentId;
    @Excel(name = "隐患描述") private String hazardDescription;
    @Excel(name = "风险等级") private String riskLevel;
    @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "发现日期", width = 30, dateFormat = "yyyy-MM-dd") private LocalDate discoveredDate;
    private Long responsibleUserId;
    @Excel(name = "整改责任人") private String responsibleUserName;
    @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "整改期限", width = 30, dateFormat = "yyyy-MM-dd") private LocalDate rectificationDeadline;
    @Excel(name = "整改状态", readConverterExp = "1=待整改,2=整改中,3=待复核,4=已闭环") private Integer rectificationStatus;
    @Excel(name = "整改措施") private String rectificationMeasures;
    @Excel(name = "整改结果") private String rectificationResult;
    @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "闭环日期", width = 30, dateFormat = "yyyy-MM-dd") private LocalDate closedDate;
    @Excel(name = "备注") private String remarks;
    @TableField(fill = FieldFill.INSERT) private Long createUser;
    @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime;
    @TableField(fill = FieldFill.UPDATE) private Long updateUser;
    @TableField(fill = FieldFill.UPDATE) private LocalDateTime updateTime;
    @TableField(fill = FieldFill.INSERT) private Long tenantId;
    @TableField(fill = FieldFill.INSERT) private Long deptId;
}
src/main/java/com/ruoyi/safe/specialequipment/service/SpecialEquipmentLedgerService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package com.ruoyi.safe.specialequipment.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentLedger;
public interface SpecialEquipmentLedgerService extends IService<SpecialEquipmentLedger> {
    IPage<SpecialEquipmentLedger> listPage(Page page, SpecialEquipmentLedger req);
}
src/main/java/com/ruoyi/safe/specialequipment/service/SpecialEquipmentRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package com.ruoyi.safe.specialequipment.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentRecord;
public interface SpecialEquipmentRecordService extends IService<SpecialEquipmentRecord> {
    IPage<SpecialEquipmentRecord> listPage(Page page, SpecialEquipmentRecord req);
}
src/main/java/com/ruoyi/safe/specialequipment/service/SpecialEquipmentRectificationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package com.ruoyi.safe.specialequipment.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentRectification;
public interface SpecialEquipmentRectificationService extends IService<SpecialEquipmentRectification> {
    IPage<SpecialEquipmentRectification> listPage(Page page, SpecialEquipmentRectification req);
}
src/main/java/com/ruoyi/safe/specialequipment/service/impl/SpecialEquipmentLedgerServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.safe.specialequipment.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.safe.specialequipment.mapper.SpecialEquipmentLedgerMapper;
import com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentLedger;
import com.ruoyi.safe.specialequipment.service.SpecialEquipmentLedgerService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@Service
@RequiredArgsConstructor
public class SpecialEquipmentLedgerServiceImpl extends ServiceImpl<SpecialEquipmentLedgerMapper, SpecialEquipmentLedger> implements SpecialEquipmentLedgerService {
    private final SpecialEquipmentLedgerMapper mapper;
    public IPage<SpecialEquipmentLedger> listPage(Page page, SpecialEquipmentLedger req) { return mapper.listPage(page, req); }
    public boolean save(SpecialEquipmentLedger entity) {
        entity.setHazardStatus(entity.getHazardStatus() == null ? 0 : entity.getHazardStatus());
        entity.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        entity.setCreateUser(SecurityUtils.getLoginUser().getUserId());
        entity.setCreateTime(LocalDateTime.now());
        return super.save(entity);
    }
}
src/main/java/com/ruoyi/safe/specialequipment/service/impl/SpecialEquipmentRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ruoyi.safe.specialequipment.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.safe.specialequipment.mapper.SpecialEquipmentLedgerMapper;
import com.ruoyi.safe.specialequipment.mapper.SpecialEquipmentRecordMapper;
import com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentLedger;
import com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentRecord;
import com.ruoyi.safe.specialequipment.service.SpecialEquipmentRecordService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@Service
@RequiredArgsConstructor
public class SpecialEquipmentRecordServiceImpl extends ServiceImpl<SpecialEquipmentRecordMapper, SpecialEquipmentRecord> implements SpecialEquipmentRecordService {
    private final SpecialEquipmentRecordMapper mapper;
    private final SpecialEquipmentLedgerMapper ledgerMapper;
    public IPage<SpecialEquipmentRecord> listPage(Page page, SpecialEquipmentRecord req) { return mapper.listPage(page, req); }
    public boolean save(SpecialEquipmentRecord entity) {
        entity.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        entity.setCreateUser(SecurityUtils.getLoginUser().getUserId());
        entity.setCreateTime(LocalDateTime.now());
        boolean saved = super.save(entity);
        syncLedgerDate(entity);
        return saved;
    }
    @Override
    public boolean updateById(SpecialEquipmentRecord entity) {
        boolean updated = super.updateById(entity);
        syncLedgerDate(entity);
        return updated;
    }
    private void syncLedgerDate(SpecialEquipmentRecord entity) {
        if (entity == null || entity.getEquipmentId() == null || entity.getRecordType() == null) {
            return;
        }
        SpecialEquipmentLedger ledger = ledgerMapper.selectById(entity.getEquipmentId());
        if (ledger == null) {
            return;
        }
        if (entity.getRecordType() == 1) {
            ledger.setLatestInspectionDate(entity.getRecordDate());
            ledger.setNextInspectionDate(entity.getNextDueDate());
        } else if (entity.getRecordType() == 2) {
            ledger.setLatestMaintenanceDate(entity.getRecordDate());
            ledger.setNextMaintenanceDate(entity.getNextDueDate());
        }
        ledgerMapper.updateById(ledger);
    }
}
src/main/java/com/ruoyi/safe/specialequipment/service/impl/SpecialEquipmentRectificationServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.safe.specialequipment.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.safe.specialequipment.mapper.SpecialEquipmentRectificationMapper;
import com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentRectification;
import com.ruoyi.safe.specialequipment.service.SpecialEquipmentRectificationService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@Service
@RequiredArgsConstructor
public class SpecialEquipmentRectificationServiceImpl extends ServiceImpl<SpecialEquipmentRectificationMapper, SpecialEquipmentRectification> implements SpecialEquipmentRectificationService {
    private final SpecialEquipmentRectificationMapper mapper;
    public IPage<SpecialEquipmentRectification> listPage(Page page, SpecialEquipmentRectification req) { return mapper.listPage(page, req); }
    public boolean save(SpecialEquipmentRectification entity) {
        entity.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        entity.setCreateUser(SecurityUtils.getLoginUser().getUserId());
        entity.setCreateTime(LocalDateTime.now());
        entity.setRectificationStatus(entity.getRectificationStatus() == null ? 1 : entity.getRectificationStatus());
        return super.save(entity);
    }
    @Override
    public boolean updateById(SpecialEquipmentRectification entity) {
        return super.updateById(entity);
    }
}
src/main/java/com/ruoyi/safe/specialequipment/task/SpecialEquipmentReminderTask.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
package com.ruoyi.safe.specialequipment.task;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.approve.pojo.NotificationManagement;
import com.ruoyi.approve.service.NotificationManagementService;
import com.ruoyi.safe.specialequipment.mapper.SpecialEquipmentLedgerMapper;
import com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentLedger;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@Component
@RequiredArgsConstructor
public class SpecialEquipmentReminderTask {
    private final SpecialEquipmentLedgerMapper ledgerMapper;
    private final NotificationManagementService notificationManagementService;
    private static final int REMIND_DAYS = 30;
    @Scheduled(cron = "0 0 8 * * ?")
    public void remindExpire() {
        LocalDate now = LocalDate.now();
        LocalDate threshold = now.plusDays(REMIND_DAYS);
        List<SpecialEquipmentLedger> list = ledgerMapper.selectList(Wrappers.<SpecialEquipmentLedger>lambdaQuery()
                .and(wrapper -> wrapper
                        .isNotNull(SpecialEquipmentLedger::getNextInspectionDate)
                        .le(SpecialEquipmentLedger::getNextInspectionDate, threshold)
                        .or()
                        .isNotNull(SpecialEquipmentLedger::getNextMaintenanceDate)
                        .le(SpecialEquipmentLedger::getNextMaintenanceDate, threshold)));
        for (SpecialEquipmentLedger ledger : list) {
            syncReminder(ledger, now, threshold, true);
            syncReminder(ledger, now, threshold, false);
        }
    }
    private void syncReminder(SpecialEquipmentLedger ledger, LocalDate now, LocalDate threshold, boolean inspection) {
        LocalDate dueDate = inspection ? ledger.getNextInspectionDate() : ledger.getNextMaintenanceDate();
        if (dueDate == null || dueDate.isAfter(threshold)) {
            return;
        }
        long daysLeft = ChronoUnit.DAYS.between(now, dueDate);
        String reminderType = inspection ? "检验到期提醒" : "维保到期提醒";
        String title = ledger.getEquipmentName() + "-" + reminderType;
        String content = String.format("设备【%s】(%s) %s,%s,请及时安排处理。",
                ledger.getEquipmentName(),
                Optional.ofNullable(ledger.getEquipmentNo()).orElse(""),
                inspection ? "检验即将到期" : "维保即将到期",
                daysLeft < 0 ? ("已逾期 " + Math.abs(daysLeft) + " å¤©") : ("距离到期还有 " + daysLeft + " å¤©"));
        NotificationManagement notification = notificationManagementService.lambdaQuery()
                .eq(NotificationManagement::getTitle, title)
                .eq(NotificationManagement::getType, reminderType)
                .oneOpt()
                .orElseGet(NotificationManagement::new);
        notification.setTitle(title);
        notification.setType(reminderType);
        notification.setPriority(daysLeft <= 7 ? "高" : "中");
        notification.setStatus("1");
        notification.setExpireDate(dueDate);
        notification.setContent(content);
        notification.setDepartments(new ArrayList<>());
        notification.setSyncMethods(new ArrayList<>());
        if (notification.getId() == null) {
            notificationManagementService.save(notification);
        } else {
            notificationManagementService.updateById(notification);
        }
    }
}
src/main/resources/mapper/safe/specialequipment/SpecialEquipmentLedgerMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
<?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="com.ruoyi.safe.specialequipment.mapper.SpecialEquipmentLedgerMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentLedger">
        <id column="id" property="id" />
        <result column="equipment_no" property="equipmentNo" />
        <result column="equipment_name" property="equipmentName" />
        <result column="equipment_type" property="equipmentType" />
        <result column="model_spec" property="modelSpec" />
        <result column="manufacture_date" property="manufactureDate" />
        <result column="install_location" property="installLocation" />
        <result column="use_unit" property="useUnit" />
        <result column="certificate_no" property="certificateNo" />
        <result column="inspection_cycle_days" property="inspectionCycleDays" />
        <result column="next_inspection_date" property="nextInspectionDate" />
        <result column="maintenance_cycle_days" property="maintenanceCycleDays" />
        <result column="next_maintenance_date" property="nextMaintenanceDate" />
        <result column="alarm_days" property="alarmDays" />
        <result column="manager_id" property="managerId" />
        <result column="manager_name" property="managerName" />
        <result column="safety_officer" property="safetyOfficer" />
        <result column="risk_level" property="riskLevel" />
        <result column="latest_inspection_date" property="latestInspectionDate" />
        <result column="latest_maintenance_date" property="latestMaintenanceDate" />
        <result column="hazard_status" property="hazardStatus" />
        <result column="hazard_description" property="hazardDescription" />
        <result column="rectification_deadline" property="rectificationDeadline" />
        <result column="remarks" property="remarks" />
        <result column="create_user" property="createUser" />
        <result column="create_time" property="createTime" />
        <result column="update_user" property="updateUser" />
        <result column="update_time" property="updateTime" />
        <result column="tenant_id" property="tenantId" />
        <result column="dept_id" property="deptId" />
    </resultMap>
    <select id="listPage" resultMap="BaseResultMap">
        select l.id,
               l.equipment_no,
               l.equipment_name,
               l.equipment_type,
               l.model_spec,
               l.manufacture_date,
               l.install_location,
               l.use_unit,
               l.certificate_no,
               l.inspection_cycle_days,
               l.next_inspection_date,
               l.maintenance_cycle_days,
               l.next_maintenance_date,
               l.alarm_days,
               l.manager_id,
               COALESCE(u.nick_name, u.user_name) as manager_name,
               l.safety_officer,
               l.risk_level,
               l.latest_inspection_date,
               l.latest_maintenance_date,
               l.hazard_status,
               l.hazard_description,
               l.rectification_deadline,
               l.remarks,
               l.create_user,
               l.create_time,
               l.update_user,
               l.update_time,
               l.tenant_id,
               l.dept_id
        from special_equipment_ledger l
                 left join sys_user u on u.user_id = l.manager_id
        where 1=1
        <if test="req.equipmentName != null and req.equipmentName != ''">
            and l.equipment_name like concat('%', #{req.equipmentName}, '%')
        </if>
        <if test="req.equipmentType != null and req.equipmentType != ''">
            and l.equipment_type like concat('%', #{req.equipmentType}, '%')
        </if>
        <if test="req.hazardStatus != null">
            and l.hazard_status = #{req.hazardStatus}
        </if>
    </select>
</mapper>
src/main/resources/mapper/safe/specialequipment/SpecialEquipmentRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
<?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="com.ruoyi.safe.specialequipment.mapper.SpecialEquipmentRecordMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentRecord">
        <id column="id" property="id" />
        <result column="equipment_id" property="equipmentId" />
        <result column="record_type" property="recordType" />
        <result column="record_no" property="recordNo" />
        <result column="record_date" property="recordDate" />
        <result column="execute_result" property="executeResult" />
        <result column="problem_description" property="problemDescription" />
        <result column="dispose_measure" property="disposeMeasure" />
        <result column="executor_id" property="executorId" />
        <result column="executor_name" property="executorName" />
        <result column="next_due_date" property="nextDueDate" />
        <result column="attachment_remark" property="attachmentRemark" />
        <result column="create_user" property="createUser" />
        <result column="create_time" property="createTime" />
        <result column="update_user" property="updateUser" />
        <result column="update_time" property="updateTime" />
        <result column="tenant_id" property="tenantId" />
        <result column="dept_id" property="deptId" />
    </resultMap>
    <select id="listPage" resultMap="BaseResultMap">
        select *
        from special_equipment_record
        where 1=1
        <if test="req.recordType != null">
            and record_type = #{req.recordType}
        </if>
        <if test="req.recordNo != null and req.recordNo != ''">
            and record_no like concat('%', #{req.recordNo}, '%')
        </if>
        <if test="req.equipmentId != null">
            and equipment_id = #{req.equipmentId}
        </if>
    </select>
</mapper>
src/main/resources/mapper/safe/specialequipment/SpecialEquipmentRectificationMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
<?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="com.ruoyi.safe.specialequipment.mapper.SpecialEquipmentRectificationMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.safe.specialequipment.pojo.SpecialEquipmentRectification">
        <id column="id" property="id" />
        <result column="equipment_id" property="equipmentId" />
        <result column="hazard_description" property="hazardDescription" />
        <result column="risk_level" property="riskLevel" />
        <result column="discovered_date" property="discoveredDate" />
        <result column="responsible_user_id" property="responsibleUserId" />
        <result column="responsible_user_name" property="responsibleUserName" />
        <result column="rectification_deadline" property="rectificationDeadline" />
        <result column="rectification_status" property="rectificationStatus" />
        <result column="rectification_measures" property="rectificationMeasures" />
        <result column="rectification_result" property="rectificationResult" />
        <result column="closed_date" property="closedDate" />
        <result column="remarks" property="remarks" />
        <result column="create_user" property="createUser" />
        <result column="create_time" property="createTime" />
        <result column="update_user" property="updateUser" />
        <result column="update_time" property="updateTime" />
        <result column="tenant_id" property="tenantId" />
        <result column="dept_id" property="deptId" />
    </resultMap>
    <select id="listPage" resultMap="BaseResultMap">
        select *
        from special_equipment_rectification
        where 1=1
        <if test="req.rectificationStatus != null">
            and rectification_status = #{req.rectificationStatus}
        </if>
        <if test="req.hazardDescription != null and req.hazardDescription != ''">
            and hazard_description like concat('%', #{req.hazardDescription}, '%')
        </if>
        <if test="req.equipmentId != null">
            and equipment_id = #{req.equipmentId}
        </if>
    </select>
</mapper>