刘光辉
昨天 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
package jnpf.limsController;
 
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jnpf.exception.DataException;
import jnpf.limsEntity.BizStatus;
import jnpf.limsEntity.LimsQingyandanEntity;
import jnpf.limsEntity.LimsSignEntity;
import jnpf.limsEntity.LimsSignUsageTarget;
import jnpf.limsEntity.SignOpType;
import jnpf.limsService.LimsQingyandanService;
import jnpf.limsService.LimsSignService;
import jnpf.util.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.Collections;
import java.util.Map;
 
@Slf4j
@Tag(name = "lims取样单接口", description = "取样 / 取样退回")
@RestController
@RequestMapping("/lims/biz")
public class LimsQuyangController {
 
    @Autowired
    private LimsQingyandanService limsQingyandanService;
    @Autowired
    private LimsSignService limsSignService;
 
    /**
     * 取样:在请验单本行写入取样信息 + 推进取样/接样状态(合并表后直接操作 lims_qingyandan)
     */
    @Transactional(rollbackFor = Exception.class)
    @Operation(summary = "取样")
    @PostMapping("/quyang/fetch")
    public R<String> quyangFetch(@RequestBody LimsQingyandanEntity formData) {
        if (formData.getId() == null || formData.getId().isEmpty()) {
            return R.error("请验单ID不能为空");
        }
        // 合并表后所有阶段表单都带请验单主键 id,直接按主键 get,最快且无歧义
        LimsQingyandanEntity qingyandan = limsQingyandanService.getById(formData.getId());
        if (qingyandan == null) {
            return R.error("请验单数据不存在");
        }
        if (!BizStatus.PENDING_FETCH.getCode().equals(qingyandan.getQuyangStatus())) {
            return R.error("只有待取样状态才能取样");
        }
 
        String signId = formData.getBizSign();
        if (signId == null || signId.trim().isEmpty()) {
            signId = qingyandan.getBizSign();
        }
        if (signId == null || signId.trim().isEmpty()) {
            return R.error("请添加电子签名");
        }
        LimsSignEntity sign;
        try {
            sign = limsSignService.requireValidSign(
                    signId.trim(), SignOpType.QUYANG_FETCH, qingyandan.getJianyanLiushuihao());
        } catch (DataException e) {
            return R.error(e.getMessage());
        }
        formData.setBizSign(signId.trim());
        limsQingyandanService.fetch(qingyandan, formData);
        LimsSignUsageTarget target = LimsSignUsageTarget.builder()
                .targetTable("lims_qingyandan")
                .targetId(qingyandan.getId())
                .bizType("QUYANG")
                .bizModule("LIMS-取样")
                .bizCode(qingyandan.getJianyanLiushuihao())
                .build();
        limsSignService.recordSignUsage(sign, SignOpType.QUYANG_FETCH,
                Collections.singletonList(qingyandan.getId()), Collections.singletonList(target));
        return R.success("取样成功");
    }
 
    /**
     * 取样单操作:退回请验单
     */
    @Transactional(rollbackFor = Exception.class)
    @Operation(summary = "取样单操作(退回)")
    @PostMapping("/quyang/action")
    public R<String> quyangAction(@RequestBody Map<String, String> params) {
        String action = params.get("action");
        String liushuihao = params.get("jianyan_liushuihao");
        String tuihuiyuanyin = params.get("tuihuiyuanyin");
        String bizSign = params.get("biz_sign");
 
        if (liushuihao == null || liushuihao.isEmpty()) {
            return R.error("检验流水号不能为空");
        }
 
        LimsQingyandanEntity qingyandan = limsQingyandanService.findByLiushuihao(liushuihao);
        if (qingyandan == null) {
            return R.error("请验单数据不存在");
        }
 
        BizStatus currentStatus = BizStatus.fromCode(qingyandan.getBizStatus());
 
        switch (action) {
            case "reject":
                if (currentStatus != BizStatus.PENDING_FETCH && currentStatus != BizStatus.CONFIRMED) {
                    return R.error("只有待取样状态的请验单才能退回修正");
                }
                if (bizSign == null || bizSign.isEmpty()) {
                    return R.error("请添加电子签名");
                }
                if (tuihuiyuanyin == null || tuihuiyuanyin.isEmpty()) {
                    return R.error("请填写退回原因");
                }
                LimsSignEntity sign;
                try {
                    sign = limsSignService.requireValidSign(bizSign, SignOpType.QUYANG_REJECT,
                            qingyandan.getJianyanLiushuihao());
                } catch (DataException e) {
                    return R.error(e.getMessage());
                }
                if (!limsQingyandanService.reject(qingyandan, tuihuiyuanyin, bizSign)) {
                    return R.error("当前请验单状态已变更,无法退回");
                }
                LimsSignUsageTarget target = LimsSignUsageTarget.builder()
                        .targetTable("lims_qingyandan")
                        .targetId(qingyandan.getId())
                        .bizType("QUYANG")
                        .bizModule("LIMS-取样")
                        .bizCode(qingyandan.getJianyanLiushuihao())
                        .build();
                limsSignService.recordSignUsage(sign, SignOpType.QUYANG_REJECT,
                        Collections.singletonList(qingyandan.getId()), Collections.singletonList(target));
                return R.success("退回修正成功");
 
            default:
                return R.error("不支持的操作: " + action);
        }
    }
}