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