From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master
---
jnpf-lims/jnpf-lims-controller/src/main/java/jnpf/limsController/LimsJieyangController.java | 216 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 216 insertions(+), 0 deletions(-)
diff --git a/jnpf-lims/jnpf-lims-controller/src/main/java/jnpf/limsController/LimsJieyangController.java b/jnpf-lims/jnpf-lims-controller/src/main/java/jnpf/limsController/LimsJieyangController.java
new file mode 100644
index 0000000..c614ef4
--- /dev/null
+++ b/jnpf-lims/jnpf-lims-controller/src/main/java/jnpf/limsController/LimsJieyangController.java
@@ -0,0 +1,216 @@
+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("璇烽獙鍗旾D涓嶈兘涓虹┖");
+ }
+
+ // 鍚堝苟琛ㄥ悗鎺ユ牱鏁版嵁涔熷湪 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("璇烽獙鍗旾D涓嶈兘涓虹┖");
+ }
+ 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("閫�鍥炴垚鍔�");
+ }
+}
--
Gitblit v1.8.0