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 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 quyangAction(@RequestBody Map 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); } } }