package com.supervision.safety.mapper; import com.supervision.safety.domain.*; import org.apache.ibatis.annotations.*; import org.apache.ibatis.type.EnumTypeHandler; import java.util.Date; import java.util.List; import java.util.Map; @Mapper public interface SafetyIssueMapper { // === 基础 === @Select("SELECT id, description, risk_level, status, found_at, rectified_at, deleted, create_time, update_time " + "FROM safety_issue WHERE id=#{id} AND deleted=0") @Results(id="IssueMap", value = { @Result(column="risk_level", property="riskLevel", javaType=RiskLevel.class, typeHandler=EnumTypeHandler.class), @Result(column="status", property="status", javaType=IssueStatus.class, typeHandler=EnumTypeHandler.class) }) SafetyIssue findById(@Param("id") Long id); @Insert("INSERT INTO safety_issue(description, risk_level, status, found_at, rectified_at, deleted, create_time, update_time) " + "VALUES(#{description}, #{riskLevel,typeHandler=org.apache.ibatis.type.EnumTypeHandler}, " + "#{status,typeHandler=org.apache.ibatis.type.EnumTypeHandler}, #{foundAt}, #{rectifiedAt}, 0, NOW(), NOW())") @Options(useGeneratedKeys = true, keyProperty = "id") int insert(SafetyIssue issue); @Update("UPDATE safety_issue SET status=#{status,typeHandler=org.apache.ibatis.type.EnumTypeHandler}, " + "rectified_at=#{rectifiedAt}, update_time=NOW() WHERE id=#{id} AND deleted=0") int updateStatus(@Param("id") Long id, @Param("status") IssueStatus status, @Param("rectifiedAt") Date rectifiedAt); @Update("UPDATE safety_issue SET deleted=1, update_time=NOW() WHERE id=#{id} AND deleted=0") int logicalDelete(@Param("id") Long id); // === 查询/分页 === @SelectProvider(type=SafetyIssueSqlProvider.class, method="searchSql") @ResultMap("IssueMap") List search(@Param("keyword") String keyword, @Param("level") RiskLevel level, @Param("status") IssueStatus status, @Param("from") Date from, @Param("to") Date to, @Param("limit") int limit, @Param("offset") int offset); @SelectProvider(type=SafetyIssueSqlProvider.class, method="countSql") long count(@Param("keyword") String keyword, @Param("level") RiskLevel level, @Param("status") IssueStatus status, @Param("from") Date from, @Param("to") Date to); // === 统计 === @SelectProvider(type=SafetyIssueSqlProvider.class, method="countPendingByLevelSql") List> countPendingByLevel(); @SelectProvider(type=SafetyIssueSqlProvider.class, method="trendByDaySql") List> trendByDay(@Param("from") Date from, @Param("to") Date to); @SelectProvider(type=SafetyIssueSqlProvider.class, method="top5HighSql") @ResultMap("IssueMap") List top5High(); }