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);
|
}
|
}
|
}
|