package jnpf.limsMapper; import jnpf.limsEntity.*; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import java.util.List; /** * Read-only M1 reminder queries. Event-table exclusion keeps the daily scan bounded. */ @Mapper public interface LimsBusinessReminderMapper { @Select("SELECT x.f_id AS id," + " x.f_tenant_id AS tenantId," + " j.mingcheng AS name," + " j.bianhao AS code," + " j.jiliang_ren AS recipientUserId," + " x.jiliang_tixing_riqi AS reminderDate," + " x.xiaci_jiliang_shijian AS dueDate" + " FROM lims_shebei_yiqi_xinxi x" + " JOIN LATERAL (" + " SELECT r.mingcheng, r.bianhao, r.jiliang_ren" + " FROM lims_shebei_yiqi_jiliang r" + " WHERE r.yiqi_id = x.f_id" + " AND COALESCE(r.f_tenant_id, '0') = COALESCE(x.f_tenant_id, '0')" + " AND (r.f_delete_mark IS NULL OR r.f_delete_mark <> 1)" + " AND r.xiaci_jiliang_shijian = x.xiaci_jiliang_shijian" + " AND r.jiliang_ren IS NOT NULL AND r.jiliang_ren <> ''" + " ORDER BY r.shangci_jiliang_shijian DESC NULLS LAST, r.f_id DESC" + " LIMIT 1" + " ) j ON TRUE" + " WHERE (x.f_delete_mark IS NULL OR x.f_delete_mark <> 1)" + " AND (x.biz_status IS NULL OR x.biz_status <> 'yibaofei')" + " AND x.jiliang_tixing_riqi IS NOT NULL" + " AND x.xiaci_jiliang_shijian IS NOT NULL" + " AND x.jiliang_tixing_riqi::date <= CURRENT_DATE" + " AND NOT EXISTS (SELECT 1 FROM lims_message_event e" + " WHERE e.tenant_id = COALESCE(x.f_tenant_id, '0')" + " AND e.occurrence_key = CONCAT('LIMS.EQUIPMENT.CALIBRATION.DUE:', x.f_id, ':'," + " TO_CHAR(x.xiaci_jiliang_shijian, 'YYYYMMDD')))") List selectEquipmentCalibrationDue(); @Select("SELECT x.f_id AS id," + " x.f_tenant_id AS tenantId," + " j.mingcheng AS name," + " j.bianhao AS code," + " j.yanzheng_ren AS recipientUserId," + " x.yanzheng_tixing_riqi AS reminderDate," + " x.xiaci_yanzheng_shijian AS dueDate" + " FROM lims_shebei_yiqi_xinxi x" + " JOIN LATERAL (" + " SELECT r.mingcheng, r.bianhao, r.yanzheng_ren" + " FROM lims_shebei_yiqi_yanzheng r" + " WHERE r.yiqi_id = x.f_id" + " AND COALESCE(r.f_tenant_id, '0') = COALESCE(x.f_tenant_id, '0')" + " AND (r.f_delete_mark IS NULL OR r.f_delete_mark <> 1)" + " AND r.xiaci_yanzheng_shijian = x.xiaci_yanzheng_shijian" + " AND r.yanzheng_ren IS NOT NULL AND r.yanzheng_ren <> ''" + " ORDER BY r.shangci_yanzheng_shijian DESC NULLS LAST, r.f_id DESC LIMIT 1" + " ) j ON TRUE" + " WHERE (x.f_delete_mark IS NULL OR x.f_delete_mark <> 1)" + " AND (x.biz_status IS NULL OR x.biz_status <> 'yibaofei')" + " AND x.yanzheng_tixing_riqi IS NOT NULL" + " AND x.xiaci_yanzheng_shijian IS NOT NULL" + " AND x.yanzheng_tixing_riqi::date <= CURRENT_DATE" + " AND NOT EXISTS (SELECT 1 FROM lims_message_event e" + " WHERE e.tenant_id = COALESCE(x.f_tenant_id, '0')" + " AND e.occurrence_key = CONCAT('LIMS.EQUIPMENT.VERIFICATION.DUE:', x.f_id, ':'," + " TO_CHAR(x.xiaci_yanzheng_shijian, 'YYYYMMDD')))") List selectEquipmentVerificationDue(); @Select("SELECT z.f_id AS id," + " z.f_tenant_id AS tenantId," + " z.f_foreign_id AS planId," + " z.yangpin_mingcheng AS sampleName," + " z.yangpin_bianma AS sampleCode," + " z.pihao AS batchNo," + " z.guancha_ren AS recipientUserId," + " z.guancha_riqi AS observationDate" + " FROM lims_liuyang_jihua_zixiang z" + " WHERE (z.f_delete_mark IS NULL OR z.f_delete_mark <> 1)" + " AND (z.biz_status IS NULL OR z.biz_status <> 'disabled')" + " AND (z.shifou_yiguancha IS NULL OR z.shifou_yiguancha <> 'yes')" + " AND z.guancha_riqi IS NOT NULL" + " AND z.guancha_riqi::date <= CURRENT_DATE" + " AND z.guancha_ren IS NOT NULL AND z.guancha_ren <> ''" + " AND NOT EXISTS (SELECT 1 FROM lims_message_event e" + " WHERE e.tenant_id = COALESCE(z.f_tenant_id, '0')" + " AND e.occurrence_key = CONCAT('LIMS.RETAIN.SAMPLE.OBSERVATION.DUE:', z.f_id, ':'," + " TO_CHAR(z.guancha_riqi, 'YYYYMMDD')))") List selectRetainObservationDue(); @Select("SELECT r.jihua_id AS planId, r.f_tenant_id AS tenantId," + " MAX(r.jihua_mingcheng) AS planName, MAX(r.jihua_leixing) AS planType," + " r.jihua_riqi AS plannedDate," + " STRING_AGG(DISTINCT NULLIF(r.jiance_quyu, ''), '、') AS monitoringArea," + " STRING_AGG(DISTINCT NULLIF(r.jiejing_jibie, ''), '、') AS cleanlinessLevel," + " STRING_AGG(DISTINCT NULLIF(r.jiance_xiangmu, ''), '、') AS monitoringItems" + " FROM lims_huanjing_jiance_jilu r" + " WHERE (r.f_delete_mark IS NULL OR r.f_delete_mark <> 1)" + " AND r.biz_status = 'enabled'" + " AND r.jihua_riqi IS NOT NULL AND r.jihua_riqi::date <= CURRENT_DATE" + " AND r.quyang_riqi IS NULL AND (r.quyang_ren IS NULL OR r.quyang_ren = '')" + " AND NOT EXISTS (SELECT 1 FROM lims_message_event e" + " WHERE e.tenant_id = COALESCE(r.f_tenant_id, '0')" + " AND e.occurrence_key = CONCAT('LIMS.ENVIRONMENT.SAMPLING.DUE:', r.jihua_id, ':'," + " TO_CHAR(r.jihua_riqi, 'YYYYMMDD')))" + " GROUP BY r.jihua_id, r.f_tenant_id, r.jihua_riqi") List selectEnvironmentSamplingDue(); @Select("SELECT z.f_id AS id, z.f_tenant_id AS tenantId, z.bianhao AS batchCode," + " z.tiaoma_bianma AS barcode, z.mingcheng AS name, z.guige AS specification," + " z.shengyuliang AS remainingQuantity, z.danwei AS unit," + " z.cunfang_weizhi AS storageLocation, z.youxiaoqi AS expiryDate," + " (z.youxiaoqi::date - CURRENT_DATE) AS remainingDays," + " CASE (z.youxiaoqi::date - CURRENT_DATE)" + " WHEN 30 THEN 'D30' WHEN 7 THEN 'D7' WHEN 1 THEN 'D1' ELSE 'D0' END AS reminderStage" + " FROM lims_haocai_ruku_zixiang z" + " WHERE (z.f_delete_mark IS NULL OR z.f_delete_mark <> 1)" + " AND z.biz_status IN ('weichuku', 'yikaiping')" + " AND z.shengyuliang ~ '^\\s*[0-9]+(\\.[0-9]+)?\\s*$'" + " AND z.shengyuliang::numeric > 0 AND z.youxiaoqi IS NOT NULL" + " AND (z.youxiaoqi::date - CURRENT_DATE) IN (30, 7, 1, 0)" + " AND NOT EXISTS (SELECT 1 FROM lims_message_event e" + " WHERE e.tenant_id = COALESCE(z.f_tenant_id, '0')" + " AND e.occurrence_key = CONCAT('LIMS.CONSUMABLE.BATCH.EXPIRY.DUE:', z.f_id, ':'," + " TO_CHAR(z.youxiaoqi, 'YYYYMMDD'), ':'," + " CASE (z.youxiaoqi::date - CURRENT_DATE)" + " WHEN 30 THEN 'D30' WHEN 7 THEN 'D7' WHEN 1 THEN 'D1' ELSE 'D0' END))") List selectConsumableExpiryDue(); @Select("SELECT l.f_id AS id, l.f_tenant_id AS tenantId, l.yangpin_mingcheng AS sampleName," + " l.yangpin_bianma AS sampleCode, l.pihao AS batchNo," + " l.liuyang_xiancunliang AS currentQuantity," + " COALESCE(NULLIF(l.liuyang_xiancunliang_danwei, ''), l.liuyang_danwei) AS unit," + " l.liuyang_weizhi AS storageLocation, l.baocun_qixian AS retentionDeadline" + " FROM lims_liuyang_jilu l" + " WHERE (l.f_delete_mark IS NULL OR l.f_delete_mark <> 1)" + " AND l.baocun_qixian IS NOT NULL AND l.baocun_qixian::date <= CURRENT_DATE" + " AND (l.xiaohui_danhao IS NULL OR l.xiaohui_danhao = '')" + " AND COALESCE(l.biz_status, '') NOT IN ('daixiaohui', 'yixiaohui', 'destroyed')" + " AND NOT EXISTS (SELECT 1 FROM lims_message_event e" + " WHERE e.tenant_id = COALESCE(l.f_tenant_id, '0')" + " AND e.occurrence_key = CONCAT('LIMS.RETAIN.SAMPLE.DESTRUCTION.DUE:', l.f_id, ':'," + " TO_CHAR(l.baocun_qixian, 'YYYYMMDD')))") List selectRetainDestructionDue(); @Select("SELECT c.f_id AS id, c.kaoca_jihua_id AS planId, c.f_tenant_id AS tenantId," + " p.bianhao AS planCode, p.kaoca_mingcheng AS planName," + " p.yangpin_mingcheng AS sampleName, c.pihao AS batchNo," + " c.zhouqi AS period, c.zhouqi_danwei AS periodUnit," + " c.jiahua_anpai_riqi AS plannedDate," + " STRING_AGG(DISTINCT NULLIF(z.jianyan_xiangmu_mingcheng, ''), '、') AS inspectionItems," + " STRING_AGG(DISTINCT NULLIF(z.jiancha_banzu, ''), ',') AS organizationIds" + " FROM lims_wendingxing_kaoca_jihua_zhouqi c" + " JOIN lims_wendingxing_kaoca_jihua p ON p.f_id = c.kaoca_jihua_id" + " CROSS JOIN LATERAL regexp_split_to_table(" + " TRIM(BOTH '[] ' FROM COALESCE(c.jiancha_xiangmu_ids, '')), '\\s*,\\s*') item(item_id)" + " JOIN zhiliang_biaozhun_guanli_zixiang z" + " ON z.f_id = TRIM(BOTH '\"' FROM item.item_id)" + " AND COALESCE(z.f_tenant_id, '0') = COALESCE(c.f_tenant_id, '0')" + " WHERE (c.f_delete_mark IS NULL OR c.f_delete_mark <> 1)" + " AND (p.f_delete_mark IS NULL OR p.f_delete_mark <> 1)" + " AND (z.f_delete_mark IS NULL OR z.f_delete_mark <> 1)" + " AND (c.shifou_yizhixing IS NULL OR c.shifou_yizhixing <> 'yes')" + " AND (c.shifou_jixu_zhixing IS NULL OR c.shifou_jixu_zhixing <> 'no')" + " AND c.jiahua_anpai_riqi IS NOT NULL AND c.jiahua_anpai_riqi::date <= CURRENT_DATE" + " AND NOT EXISTS (SELECT 1 FROM lims_message_event e" + " WHERE e.tenant_id = COALESCE(c.f_tenant_id, '0')" + " AND e.occurrence_key = CONCAT('LIMS.STABILITY.PERIOD.DUE:', c.f_id, ':'," + " TO_CHAR(c.jiahua_anpai_riqi, 'YYYYMMDD')))" + " GROUP BY c.f_id, c.kaoca_jihua_id, c.f_tenant_id, p.bianhao, p.kaoca_mingcheng," + " p.yangpin_mingcheng, c.pihao, c.zhouqi, c.zhouqi_danwei, c.jiahua_anpai_riqi" + " HAVING COUNT(NULLIF(z.jiancha_banzu, '')) > 0") List selectStabilityPeriodDue(); }