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