刘光辉
昨天 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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
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<LimsEquipmentCalibrationReminderRow> 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<LimsEquipmentCalibrationReminderRow> 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<LimsRetainObservationReminderRow> 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<LimsEnvironmentSamplingReminderRow> 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<LimsConsumableExpiryReminderRow> 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<LimsRetainDestructionReminderRow> 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<LimsStabilityPeriodReminderRow> selectStabilityPeriodDue();
}