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 actors; public LimsElnPreviewSampleCatalog(DataSource readOnlyDataSource, Supplier actors) { this.jdbc = new JdbcTemplate(readOnlyDataSource); this.jdbc.setQueryTimeout(5); this.actors = actors; } public List 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; } }