刘光辉
昨天 bb638871a7fb692d80f1b7a758f991dc0879002c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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。
 *
 * <p>用 @Select 自定义 SQL:跨 lims 业务表与 base 平台表聚合查询,
 * 列名按 L007 用 AS 别名映射到 Java 字段名。
 */
@Mapper
public interface LimsHaocaiAlertMapper extends SuperMapper<LimsHaocaiRukuEntity> {
 
    /**
     * 查所有"结余总量 < 缺货预警值"的耗材档案。
     *
     * <p>按 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<LimsHaocaiAlertRow> 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<String> selectUserIdsByRoleEnCode(@Param("enCode") String enCode);
}