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.LimsJieyangTuihuiEntity;
|
import jnpf.limsEntity.LimsJieyangTuihuiParam;
|
import jnpf.limsEntity.LimsQingyandanEntity;
|
import jnpf.limsEntity.LimsSignEntity;
|
import jnpf.limsEntity.LimsSignUsageTarget;
|
import jnpf.limsEntity.SignOpType;
|
import jnpf.limsService.LimsJieyangTuihuiService;
|
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 LimsJieyangController {
|
|
@Autowired
|
private LimsQingyandanService limsQingyandanService;
|
@Autowired
|
private LimsSignService limsSignService;
|
@Autowired
|
private LimsJieyangTuihuiService limsJieyangTuihuiService;
|
|
/**
|
* 接样单操作:接样退回
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
@Operation(summary = "接样单操作(接样退回)")
|
@PostMapping("/jieyang/action")
|
public R<String> jieyangAction(@RequestBody Map<String, String> params) {
|
String action = params.get("action");
|
String id = params.get("id");
|
String liushuihao = params.get("jianyan_liushuihao");
|
String tuihuiyuanyin = params.get("tuihuiyuanyin");
|
String bizSign = params.get("biz_sign");
|
|
if (id == null || id.isEmpty()) {
|
return R.error("请验单ID不能为空");
|
}
|
|
// 合并表后接样数据也在 lims_qingyandan 上,按主键 id 直接 get
|
LimsQingyandanEntity qingyandan = limsQingyandanService.getById(id);
|
if (qingyandan == null) {
|
return R.error("请验单数据不存在");
|
}
|
|
switch (action) {
|
case "reject":
|
if (!BizStatus.PENDING_RECEIVE.getCode().equals(qingyandan.getJieyangStatus())) {
|
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.JIEYANG_REJECT,
|
qingyandan.getJianyanLiushuihao());
|
} catch (DataException e) {
|
return R.error(e.getMessage());
|
}
|
if (!limsQingyandanService.jieyangReject(qingyandan, tuihuiyuanyin, bizSign)) {
|
return R.error("当前请验单状态已变更,无法退回");
|
}
|
LimsSignUsageTarget rejectTarget = LimsSignUsageTarget.builder()
|
.targetTable("lims_qingyandan")
|
.targetId(qingyandan.getId())
|
.bizType("JIEYANG")
|
.bizModule("LIMS-接样")
|
.bizCode(qingyandan.getJianyanLiushuihao())
|
.build();
|
limsSignService.recordSignUsage(sign, SignOpType.JIEYANG_REJECT,
|
Collections.singletonList(qingyandan.getId()),
|
Collections.singletonList(rejectTarget));
|
return R.success("接样退回成功");
|
|
default:
|
return R.error("不支持的操作: " + action);
|
}
|
}
|
|
/**
|
* 接样:在请验单本行写入接样录入信息(合并表后直接操作 lims_qingyandan)。
|
* 检验项 submit 时已创建,本接口不再创建检验项,仅推进 jieyang_status → received。
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
@Operation(summary = "接样")
|
@PostMapping("/jieyang/edit-direct")
|
public R<String> jieyangEditDirect(@RequestBody LimsQingyandanEntity formData) {
|
if (formData.getId() == null || formData.getId().isEmpty()) {
|
return R.error("请验单ID不能为空");
|
}
|
LimsQingyandanEntity qingyandan = limsQingyandanService.getById(formData.getId());
|
if (qingyandan == null) {
|
return R.error("请验单数据不存在");
|
}
|
if (!BizStatus.PENDING_RECEIVE.getCode().equals(qingyandan.getJieyangStatus())) {
|
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.JIEYANG_RECEIVE, qingyandan.getJianyanLiushuihao());
|
} catch (DataException e) {
|
return R.error(e.getMessage());
|
}
|
formData.setBizSign(signId.trim());
|
limsQingyandanService.jieyangReceive(qingyandan, formData);
|
LimsSignUsageTarget target = LimsSignUsageTarget.builder()
|
.targetTable("lims_qingyandan")
|
.targetId(qingyandan.getId())
|
.bizType("JIEYANG")
|
.bizModule("LIMS-接样")
|
.bizCode(qingyandan.getJianyanLiushuihao())
|
.build();
|
limsSignService.recordSignUsage(sign, SignOpType.JIEYANG_RECEIVE,
|
Collections.singletonList(qingyandan.getId()), Collections.singletonList(target));
|
return R.success("接样成功");
|
}
|
|
/**
|
* 班组样品管理 - 样品退回:写入一条 lims_jieyang_tuihui。
|
* 请求体:{
|
* "biz_sign": "退回人签名",
|
* "data": {
|
* "jianyan_liushuihao": "...",
|
* "jieyang_banzu_id": "...",
|
* "ketuihui_shuliang": "5",
|
* "tuihui_shuliang": "3",
|
* "cunru_ren": "...", // 可选,缺省取当前用户
|
* "cunru_shijian": "...", // 可选,缺省取当前时间
|
* "jieyu_shuliang": "2", // 可选,缺省按 ketuihui - tuihui 兜底
|
* "beizhu": "..." // 可选
|
* }
|
* }
|
* biz_sign 仅作审计落库到 lims_sign,业务表不落 sign 列。
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
@Operation(summary = "样品退回")
|
@PostMapping("/jieyang/tuihui")
|
public R<String> jieyangTuihui(@RequestBody LimsJieyangTuihuiParam param) {
|
if (param == null || param.getData() == null) {
|
return R.error("请填写退回信息");
|
}
|
if (param.getBizSign() == null || param.getBizSign().isEmpty()) {
|
return R.error("请添加电子签名");
|
}
|
LimsJieyangTuihuiEntity data = param.getData();
|
if (data.getJianyanLiushuihao() == null || data.getJianyanLiushuihao().isEmpty()) {
|
return R.error("检验流水号不能为空");
|
}
|
if (data.getJieyangBanzuId() == null || data.getJieyangBanzuId().isEmpty()) {
|
return R.error("接样班组 id 不能为空");
|
}
|
|
LimsQingyandanEntity qingyandan = limsQingyandanService.findByLiushuihao(
|
data.getJianyanLiushuihao());
|
if (qingyandan == null) {
|
return R.error("请验单数据不存在");
|
}
|
|
LimsSignEntity sign;
|
try {
|
sign = limsSignService.requireValidSign(
|
param.getBizSign(), SignOpType.JIEYANG_TUIHUI,
|
qingyandan.getJianyanLiushuihao());
|
} catch (DataException e) {
|
return R.error(e.getMessage());
|
}
|
|
try {
|
data = limsJieyangTuihuiService.createTuihui(data);
|
} catch (DataException e) {
|
return R.error(e.getMessage());
|
}
|
|
LimsSignUsageTarget target = LimsSignUsageTarget.builder()
|
.targetTable("lims_jieyang_tuihui")
|
.targetId(data.getId())
|
.bizType("JIEYANG")
|
.bizModule("LIMS-接样")
|
.bizCode(qingyandan.getJianyanLiushuihao())
|
.build();
|
limsSignService.recordSignUsage(sign, SignOpType.JIEYANG_TUIHUI,
|
Collections.singletonList(data.getJieyangBanzuId()), Collections.singletonList(target));
|
|
return R.success("退回成功");
|
}
|
}
|