刘光辉
昨天 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
package jnpf.limsService;
 
import jnpf.limsEntity.LimsFenjianItem;
import jnpf.limsEntity.LimsJianceTaskAcceptParam;
import jnpf.limsEntity.LimsJianyanAssignParam;
import jnpf.limsEntity.LimsJianyanAuditFailParam;
import jnpf.limsEntity.LimsJianyanAuditOutcome;
import jnpf.limsEntity.LimsJianyanAuditParam;
import jnpf.limsEntity.LimsJianyanResultParam;
import jnpf.limsEntity.LimsSignUsageTarget;
import jnpf.limsEntity.LimsSubmitResultOutcome;
 
import java.util.List;
 
/**
 * LIMS 检测任务服务:分检 → 分配检验员 → 录入结果 → 审核 / 退回。
 */
public interface LimsJianceTaskService {
 
    /**
     * 样品分检:把请验单 submit 时创建的检验项(jianyan_zhuangtai=created +
     * fenjian_zhuangtai=wei_fenjian)推进到 pending_assign,并标记 fenjian_zhuangtai=fenjian,
     * 同时回写操作员录入的 4 个分检字段(分检量 / 分检单位 / 分装容器 / 分检后保存条件)。
     *
     * <p>按 lims_jianyan_xiang.f_id 逐条 UPDATE,带状态 / 软删过滤:仅 created 行被推进,
     * 其余状态自动跳过;4 个分检字段行级必填(缺失抛 DataException)。
     *
     * @param param 分检入参(共享 bizSign + data 列表,见 {@link LimsFenjianItem})
     * @return 实际被推进的业务目标(非 created / 已软删 / 不存在 的行不计入)
     */
    List<LimsSignUsageTarget> fenjianSamples(LimsJianceTaskAcceptParam param);
 
    /**
     * 分配(含改派)检验任务:每行可指定不同的检验员 / 要求完成日期,
     * bizSign 共享(一次操作只签一次名)。按 id 逐条 UPDATE。
     *
     * <p>每条 SQL 带状态 / 软删过滤:允许 pending_assign(初次分配)或
     * pending_test(改派)的行被更新,pending_audit / audited 禁止直接改派
     * (需走退回流程),软删行跳过。
     *
     * @param param 分配入参(bizSign + data 列表)
     * @return 实际被更新的业务目标(可能小于 data.size(),表示部分行被跳过)
     */
    List<LimsSignUsageTarget> assignJianyanXiang(LimsJianyanAssignParam param);
 
    /**
     * 批量录入检验结果:把 pending_test 且属于当前登录检验员的行置为 pending_audit,
     * 写入 jianyan_jieguo / jianyan_jielun / biz_files(签名仅审计在 lims_sign)。
     *
     * <p>每行结果各异,按 id 逐条 UPDATE;每条 SQL 都带 3 个过滤条件:
     * 状态 pending_test + jiancha_ren = 当前用户 + 未软删,
     * 状态不对 / 非本人任务 / 被软删的行自动跳过。
     *
     * @param param 录入入参(共享 bizSign + data 列表)
     * @return 执行结果(含实际更新行数 + 异常调查流程发起失败的流水号列表)
     */
    LimsSubmitResultOutcome submitJianyanResult(LimsJianyanResultParam param);
 
    /**
     * 批量审核通过检验结果:把选中的 pending_audit 行置为 audited,
     * 写入 renwu_shenheren(当前登录用户);签名仅审计在 lims_sign。
     *
     * <p>业务校验(每行独立判断,不满足的行被跳过):
     * <ul>
     *   <li>审核人 ≠ 录入人(jiancha_ren),不能审核自己录入的任务</li>
     *   <li>审核人必须属于该行的 jiancha_banzu 班组(即在部门成员内)</li>
     * </ul>
     *
     * @param param 审核入参(共享 bizSign + data 列表)
     * @return 执行结果明细(含未通过行按原因分桶,便于 controller 给出针对性错误)
     */
    LimsJianyanAuditOutcome passJianyanAudit(LimsJianyanAuditParam param);
 
    /**
     * 批量项目退回:把选中的 audited 行置为 audit_rejected,
     * 每行写入退回原因(note → tuihui_yuanyin),并写入退回人 / 签名。
     *
     * <p>业务校验(同 passJianyanAudit):
     * <ul>
     *   <li>退回人 ≠ 录入人(jiancha_ren)</li>
     *   <li>退回人必须在该行的 jiancha_banzu 班组内</li>
     * </ul>
     *
     * @param param 退回入参(共享 bizSign + data 每行 id + note)
     * @return 执行结果明细(含未通过行按原因分桶,便于 controller 给出针对性错误)
     */
    LimsJianyanAuditOutcome failJianyanAudit(LimsJianyanAuditFailParam param);
}