package jnpf.limsMapper; import jnpf.base.mapper.SuperMapper; import jnpf.limsEntity.LimsHaocaiAlertRow; import jnpf.limsEntity.LimsHaocaiRukuEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; /** * 耗材缺货预警 daily 扫描专用 mapper。 * *

用 @Select 自定义 SQL:跨 lims 业务表与 base 平台表聚合查询, * 列名按 L007 用 AS 别名映射到 Java 字段名。 */ @Mapper public interface LimsHaocaiAlertMapper extends SuperMapper { /** * 查所有"结余总量 < 缺货预警值"的耗材档案。 * *

按 haocai_id = 档案 f_id 关联入库表,剔除已删除与 jieyu_shuliang='0' 后求和; * LEFT JOIN 保证完全无库存(sum=0)的耗材也能命中。 * quehuo_yujing / jieyu_shuliang 是 varchar:PG 下 CAST 遇非数值直接抛错(MySQL 宽松返 0), * 一律先用正则守护,非数值按 NULL 处理(该行不参与求和/不触发预警,不炸整个跑批)。 */ @Select("SELECT d.f_id AS id," + " d.f_tenant_id AS tenantId," + " d.mingcheng AS mingcheng," + " d.quehuo_yujing AS quehuoYujing," + " COALESCE(SUM(CASE WHEN r.jieyu_shuliang ~ '^-?[0-9]+(\\.[0-9]+)?$'" + " THEN CAST(r.jieyu_shuliang AS NUMERIC(20,4)) END), 0) AS jieyuSum" + " FROM lims_haocai_dangan d" + " LEFT JOIN lims_haocai_ruku r" + " ON r.haocai_id = d.f_id" + " AND (r.f_delete_mark IS NULL OR r.f_delete_mark <> 1)" + " AND r.jieyu_shuliang IS NOT NULL AND r.jieyu_shuliang <> '' AND r.jieyu_shuliang <> '0'" + " WHERE (d.f_delete_mark IS NULL OR d.f_delete_mark <> 1)" + " AND d.quehuo_yujing ~ '^-?[0-9]+(\\.[0-9]+)?$'" + " AND NOT EXISTS (SELECT 1 FROM lims_message_event e" + " WHERE e.tenant_id = COALESCE(d.f_tenant_id, '0')" + " AND e.occurrence_key = CONCAT('LIMS.CONSUMABLE.STOCK.LOW:', d.f_id, ':'," + " TO_CHAR(CURRENT_DATE, 'YYYYMMDD')))" + " GROUP BY d.f_id, d.f_tenant_id, d.mingcheng, d.quehuo_yujing" + " HAVING COALESCE(SUM(CASE WHEN r.jieyu_shuliang ~ '^-?[0-9]+(\\.[0-9]+)?$'" + " THEN CAST(r.jieyu_shuliang AS NUMERIC(20,4)) END), 0)" + " < CAST(d.quehuo_yujing AS NUMERIC(20,4))") List selectBelowThreshold(); /** * 按角色编码查该角色下在职(启用、未删)用户 id 列表。 * 用 enCode 而非角色 f_id,避免硬编码环境相关主键。 * 角色成员存 base_role_relation(f_object_type='user' 小写)。 */ @Select("SELECT r.f_object_id" + " FROM base_role_relation r" + " JOIN base_role b ON r.f_role_id = b.f_id" + " JOIN base_user u ON u.f_id = r.f_object_id" + " WHERE b.f_en_code = #{enCode}" + " AND r.f_object_type = 'user'" + " AND (b.f_delete_mark IS NULL OR b.f_delete_mark <> 1)" + " AND (u.f_delete_mark IS NULL OR u.f_delete_mark <> 1)" + " AND u.f_enabled_mark = 1") List selectUserIdsByRoleEnCode(@Param("enCode") String enCode); }