刘光辉
3 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
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
package jnpf.limsService.provider;
 
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Value;
import org.springframework.jdbc.core.JdbcTemplate;
 
import javax.sql.DataSource;
import java.util.List;
import java.util.function.Supplier;
 
/** Lists only preview samples that the current field manager may already read as test-work-item snapshots. */
public class LimsElnPreviewSampleCatalog {
    private final JdbcTemplate jdbc;
    private final Supplier<LimsElnSourceCatalog.Actor> actors;
 
    public LimsElnPreviewSampleCatalog(DataSource readOnlyDataSource,
            Supplier<LimsElnSourceCatalog.Actor> actors) {
        this.jdbc = new JdbcTemplate(readOnlyDataSource);
        this.jdbc.setQueryTimeout(5);
        this.actors = actors;
    }
 
    public List<Sample> search(String keyword) {
        LimsElnSourceCatalog.Actor actor = actors.get();
        if (actor == null || !actor.isFieldManager() || !"0".equals(actor.getTenantId())) {
            throw new LimsElnReadonlyResolver.SourceFailure("SOURCE_FORBIDDEN", "Field management permission required");
        }
        String query = keyword == null ? "" : keyword.trim();
        String pattern = "%" + query.replace("\\", "\\\\").replace("%", "\\%").replace("_", "\\_") + "%";
        return jdbc.query("SELECT task.f_id, task.jianyan_liushuihao, task.jianyan_xiangmu_mingcheng, "
                        + "task.chanpin_mingcheng, task.pihao FROM lims_jianyan_xiang task "
                        + "LEFT JOIN (SELECT f_tenant_id, bianma, COUNT(*) AS match_count FROM jianyan_xiangmu_guanli "
                        + "WHERE f_tenant_id = '0' GROUP BY f_tenant_id, bianma) project ON project.f_tenant_id = task.f_tenant_id "
                        + "AND project.bianma = task.jianyan_xiangmu_bianma "
                        + "WHERE task.f_tenant_id = '0' AND (task.f_delete_mark IS NULL OR task.f_delete_mark = 0) "
                        + "AND task.jianyan_zhuangtai IN ('pending_test','audit_rejected','cancelled') "
                        + "AND NULLIF(TRIM(task.qingyandan_id), '') IS NOT NULL AND project.match_count = 1 "
                        + "AND CASE WHEN LOWER(COALESCE(task.shifou_waijian, '')) = 'yes' "
                        + "THEN task.waijian_lururen = ? ELSE task.jiancha_ren = ? END "
                        + "AND (? = '' OR COALESCE(task.jianyan_liushuihao, '') ILIKE ? ESCAPE '\\' "
                        + "OR COALESCE(task.jianyan_xiangmu_mingcheng, '') ILIKE ? ESCAPE '\\' "
                        + "OR COALESCE(task.chanpin_mingcheng, '') ILIKE ? ESCAPE '\\' "
                        + "OR COALESCE(task.pihao, '') ILIKE ? ESCAPE '\\') "
                        + "ORDER BY task.jianyan_liushuihao DESC NULLS LAST, task.f_id LIMIT 50",
                (row, index) -> new Sample(row.getString(1), row.getString(2), row.getString(3),
                        row.getString(4), row.getString(5)),
                actor.getUserId(), actor.getUserId(), query, pattern, pattern, pattern, pattern);
    }
 
    @Value
    @JsonNaming(PropertyNamingStrategies.LowerCamelCaseStrategy.class)
    public static class Sample {
        String id;
        String testNo;
        String testName;
        String sampleName;
        String batchNo;
    }
}