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 jieyangAction(@RequestBody Map 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 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 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("退回成功"); } }