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/LimsShebeiYiqiController.java |  356 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 356 insertions(+), 0 deletions(-)

diff --git a/jnpf-lims/jnpf-lims-controller/src/main/java/jnpf/limsController/LimsShebeiYiqiController.java b/jnpf-lims/jnpf-lims-controller/src/main/java/jnpf/limsController/LimsShebeiYiqiController.java
new file mode 100644
index 0000000..18cad13
--- /dev/null
+++ b/jnpf-lims/jnpf-lims-controller/src/main/java/jnpf/limsController/LimsShebeiYiqiController.java
@@ -0,0 +1,356 @@
+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.LimsShebeiYiqiJiaozhunNeibuParam;
+import jnpf.limsEntity.LimsShebeiYiqiJiaozhunWaibuParam;
+import jnpf.limsEntity.LimsShebeiYiqiPeijianGenghuanParam;
+import jnpf.limsEntity.LimsShebeiYiqiWeibaoParam;
+import jnpf.limsService.LimsShebeiYiqiXinxiService;
+import jnpf.limsService.LimsShebeiYiqiJiaozhunNeibuService;
+import jnpf.limsService.LimsShebeiYiqiJiaozhunWaibuService;
+import jnpf.limsService.LimsShebeiYiqiPeijianGenghuanService;
+import jnpf.limsService.LimsShebeiYiqiQijuBaofeiService;
+import jnpf.limsService.LimsShebeiYiqiWeibaoService;
+import jnpf.util.R;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.lang.reflect.Array;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+@Slf4j
+@Tag(name = "lims璁惧浠櫒鎺ュ彛", description = "璁惧浠櫒涓氬姟鎿嶄綔")
+@RestController
+@RequestMapping("/lims/biz/shebei/yiqi")
+public class LimsShebeiYiqiController {
+
+    @Autowired
+    private LimsShebeiYiqiXinxiService limsShebeiYiqiXinxiService;
+
+    @Autowired
+    private LimsShebeiYiqiJiaozhunWaibuService limsShebeiYiqiJiaozhunWaibuService;
+
+    @Autowired
+    private LimsShebeiYiqiJiaozhunNeibuService limsShebeiYiqiJiaozhunNeibuService;
+
+    @Autowired
+    private LimsShebeiYiqiQijuBaofeiService limsShebeiYiqiQijuBaofeiService;
+
+    @Autowired
+    private LimsShebeiYiqiWeibaoService limsShebeiYiqiWeibaoService;
+
+    @Autowired
+    private LimsShebeiYiqiPeijianGenghuanService limsShebeiYiqiPeijianGenghuanService;
+
+    /**
+     * 浠櫒鎶ュ簾锛氭寜浠櫒淇℃伅 f_id 灏� biz_status 鏇存柊涓� yibaofei銆�
+     */
+    @Operation(summary = "浠櫒鎶ュ簾")
+    @PostMapping("/baofei")
+    public R<String> baofei(@RequestBody(required = false) Map<String, Object> formData,
+                            @RequestParam(value = "yiqi_id", required = false) String yiqiId) {
+        String resolvedYiqiId = resolveYiqiId(formData, yiqiId);
+        try {
+            limsShebeiYiqiXinxiService.baofei(resolvedYiqiId);
+            return R.success("鎶ュ簾鎴愬姛");
+        } catch (DataException e) {
+            log.warn("浠櫒鎶ュ簾澶辫触锛歽iqiId={}, msg={}", resolvedYiqiId, e.getMessage());
+            return R.error(e.getMessage());
+        }
+    }
+
+    /**
+     * 灏嗗閮ㄦ牎鍑嗚褰曞悓姝ュ埌鍏宠仈鐨勮閲忓櫒鍏枫��
+     */
+    @Operation(summary = "鍚屾澶栭儴鏍″噯缁撴灉")
+    @PostMapping("/jiaozhun/waibu")
+    public R<String> syncWaibuJiaozhun(@RequestBody LimsShebeiYiqiJiaozhunWaibuParam param) {
+        String jiaozhunId = param == null ? "" : param.getJiaozhunId();
+        try {
+            limsShebeiYiqiJiaozhunWaibuService.syncToQiju(jiaozhunId);
+            return R.success("澶栭儴鏍″噯缁撴灉鍚屾鎴愬姛");
+        } catch (DataException e) {
+            log.warn("鍚屾澶栭儴鏍″噯缁撴灉澶辫触锛歫iaozhunId={}, msg={}", jiaozhunId, e.getMessage());
+            return R.error(e.getMessage());
+        }
+    }
+
+    /**
+     * 灏嗙淮淇濊褰曞悓姝ュ埌鍏宠仈鐨勭淮淇濆瓙椤广��
+     */
+    @Operation(summary = "鍚屾浠櫒缁翠繚瀛愰」")
+    @PostMapping("/weibao/sync")
+    public R<String> syncWeibao(@RequestBody LimsShebeiYiqiWeibaoParam param) {
+        String weibaoId = param == null ? "" : param.getWeibaoId();
+        try {
+            int count = limsShebeiYiqiWeibaoService.syncToZixiang(weibaoId);
+            return R.success("缁翠繚瀛愰」鍚屾鎴愬姛锛屽叡" + count + "鏉�");
+        } catch (DataException e) {
+            log.warn("鍚屾浠櫒缁翠繚瀛愰」澶辫触锛歸eibaoId={}, msg={}", weibaoId, e.getMessage());
+            return R.error(e.getMessage());
+        }
+    }
+
+    /**
+     * 灏嗛厤浠舵洿鎹㈣褰曞悓姝ュ埌鍏宠仈鐨勯厤浠舵洿鎹㈠瓙椤广��
+     */
+    @Operation(summary = "鍚屾浠櫒閰嶄欢鏇存崲瀛愰」")
+    @PostMapping("/peijian/genghuan/sync")
+    public R<String> syncPeijianGenghuan(@RequestBody LimsShebeiYiqiPeijianGenghuanParam param) {
+        String genghuanId = param == null ? "" : param.getGenghuanId();
+        try {
+            int count = limsShebeiYiqiPeijianGenghuanService.syncToZixiang(genghuanId);
+            return R.success("閰嶄欢鏇存崲瀛愰」鍚屾鎴愬姛锛屽叡" + count + "鏉�");
+        } catch (DataException e) {
+            log.warn("鍚屾浠櫒閰嶄欢鏇存崲瀛愰」澶辫触锛歡enghuanId={}, msg={}", genghuanId, e.getMessage());
+            return R.error(e.getMessage());
+        }
+    }
+
+    /**
+     * 灏嗘祦绋嬪叧鑱旂殑鍐呴儴鏍″噯璁板綍鍚屾鍒板叧鑱旂殑璁¢噺鍣ㄥ叿銆�
+     */
+    @Operation(summary = "鍚屾鍐呴儴鏍″噯缁撴灉")
+    @PostMapping("/jiaozhun/neibu")
+    public R<String> syncNeibuJiaozhun(@RequestBody LimsShebeiYiqiJiaozhunNeibuParam param) {
+        String flowId = param == null ? "" : param.getFlowId();
+        String taskId = param == null ? "" : param.getTaskId();
+        try {
+            limsShebeiYiqiJiaozhunNeibuService.syncToQiju(flowId, taskId);
+            return R.success("鍐呴儴鏍″噯缁撴灉鍚屾鎴愬姛");
+        } catch (DataException e) {
+            log.warn("鍚屾鍐呴儴鏍″噯缁撴灉澶辫触锛歠lowId={}, taskId={}, msg={}", flowId, taskId, e.getMessage());
+            return R.error(e.getMessage());
+        }
+    }
+
+    /**
+     * 鏍规嵁娴佺▼鍏宠仈鐨勫櫒鍏锋姤搴熺敵璇凤紝灏嗗搴旇閲忓櫒鍏锋爣璁颁负宸叉姤搴熴��
+     */
+    @Operation(summary = "鍣ㄥ叿鎶ュ簾")
+    @PostMapping("/qiju/baofei")
+    public R<String> baofeiQiju(@RequestBody(required = false) Map<String, Object> formData,
+                                @RequestParam(value = "flow_id", required = false) String flowId,
+                                @RequestParam(value = "task_id", required = false) String taskId) {
+        String resolvedFlowId = resolveParam(formData, flowId, "flow_id", "flowId");
+        String resolvedTaskId = resolveParam(formData, taskId, "task_id", "taskId");
+        try {
+            limsShebeiYiqiQijuBaofeiService.baofeiQiju(resolvedFlowId, resolvedTaskId);
+            return R.success("鍣ㄥ叿鎶ュ簾鎴愬姛");
+        } catch (DataException e) {
+            log.warn("鍣ㄥ叿鎶ュ簾澶辫触锛歠lowId={}, taskId={}, msg={}",
+                    resolvedFlowId, resolvedTaskId, e.getMessage());
+            return R.error(e.getMessage());
+        }
+    }
+
+    /**
+     * 浠櫒鎵归噺鍚敤锛氭寜浠櫒淇℃伅 f_id 鎵归噺灏� xingneng_zhuangtai 鏇存柊涓� zhunyong銆�
+     */
+    @Operation(summary = "浠櫒鎵归噺鍚敤")
+    @PostMapping("/qiyong")
+    public R<Map<String, Object>> qiyong(@RequestBody(required = false) Map<String, Object> formData,
+                                         @RequestParam(value = "yiqi_ids", required = false) String yiqiIds) {
+        List<String> resolvedYiqiIds = resolveYiqiIds(formData, yiqiIds);
+        try {
+            int count = limsShebeiYiqiXinxiService.qiyong(resolvedYiqiIds);
+            Map<String, Object> data = new java.util.HashMap<>(2);
+            data.put("yiqi_ids", resolvedYiqiIds);
+            data.put("count", count);
+            return R.success("鍚敤鎴愬姛", data);
+        } catch (DataException e) {
+            log.warn("浠櫒鎵归噺鍚敤澶辫触锛歽iqiIds={}, msg={}", resolvedYiqiIds, e.getMessage());
+            return R.error(e.getMessage());
+        }
+    }
+
+    /**
+     * 鏍¢獙浠櫒褰撳ぉ鏄惁宸插畬鎴愭牎鍑嗐��
+     */
+    @Operation(summary = "鏍¢獙浠櫒褰撳ぉ鏍″噯鐘舵��")
+    @PostMapping("/jiaoyan/check")
+    public R<String> check(@RequestBody(required = false) Map<String, Object> formData,
+                           @RequestParam(value = "yiqi_id", required = false) String yiqiId,
+                           @RequestParam(value = "jiaoyan_shijian", required = false) String jiaoyanShijian) {
+        String resolvedYiqiId = resolveYiqiId(formData, yiqiId);
+        try {
+            LocalDateTime resolvedJiaoyanShijian = resolveJiaoyanShijian(formData, jiaoyanShijian);
+            limsShebeiYiqiXinxiService.checkTodayJiaoyan(resolvedYiqiId, resolvedJiaoyanShijian);
+            return R.success("鏍¢獙閫氳繃");
+        } catch (DataException e) {
+            log.warn("浠櫒鏍″噯鏍¢獙澶辫触锛歽iqiId={}, msg={}", resolvedYiqiId, e.getMessage());
+            return R.error(e.getMessage());
+        }
+    }
+
+    /**
+     * 鏍¢獙浠櫒鏄惁婊¤冻浣跨敤鏉′欢銆�
+     */
+    @Operation(summary = "鏍¢獙浠櫒浣跨敤鐘舵��")
+    @PostMapping("/shiyong/check")
+    public R<String> checkShiyong(@RequestBody(required = false) Map<String, Object> formData,
+                                  @RequestParam(value = "yiqi_id", required = false) String yiqiId) {
+        String resolvedYiqiId = resolveYiqiId(formData, yiqiId);
+        try {
+            limsShebeiYiqiXinxiService.checkShiyong(resolvedYiqiId);
+            return R.success("鏍¢獙閫氳繃");
+        } catch (DataException e) {
+            log.warn("浠櫒浣跨敤鏍¢獙澶辫触锛歽iqiId={}, msg={}", resolvedYiqiId, e.getMessage());
+            return R.error(e.getMessage());
+        }
+    }
+
+    /**
+     * 纭浠櫒楠岃瘉锛屽苟灏嗛獙璇佺粨鏋滃悓姝ュ埌鍏宠仈浠櫒淇℃伅銆�
+     */
+    @Operation(summary = "纭浠櫒楠岃瘉")
+    @PostMapping("/yanzheng/confirm")
+    public R<String> confirmYanzheng(@RequestBody(required = false) Map<String, Object> formData) {
+        String yanzhengId = resolveParam(formData, null, "yanzheng_id", "yanzhengId");
+        try {
+            limsShebeiYiqiXinxiService.confirmYanzheng(yanzhengId);
+            return R.success("浠櫒楠岃瘉纭鎴愬姛");
+        } catch (DataException e) {
+            log.warn("纭浠櫒楠岃瘉澶辫触锛歽anzhengId={}, msg={}", yanzhengId, e.getMessage());
+            return R.error(e.getMessage());
+        }
+    }
+
+    /**
+     * 纭浠櫒璁¢噺锛屽苟灏嗚閲忕粨鏋滃悓姝ュ埌鍏宠仈浠櫒淇℃伅銆�
+     */
+    @Operation(summary = "纭浠櫒璁¢噺")
+    @PostMapping("/jiliang/confirm")
+    public R<String> confirmJiliang(@RequestBody(required = false) Map<String, Object> formData) {
+        String jiliangId = resolveParam(formData, null, "jiliang_id", "jiliangId");
+        try {
+            limsShebeiYiqiXinxiService.confirmJiliang(jiliangId);
+            return R.success("浠櫒璁¢噺纭鎴愬姛");
+        } catch (DataException e) {
+            log.warn("纭浠櫒璁¢噺澶辫触锛歫iliangId={}, msg={}", jiliangId, e.getMessage());
+            return R.error(e.getMessage());
+        }
+    }
+
+    private String resolveYiqiId(Map<String, Object> formData, String yiqiId) {
+        String value = trimToEmpty(yiqiId);
+        if (!value.isEmpty()) {
+            return value;
+        }
+        if (formData == null) {
+            return "";
+        }
+        Object raw = formData.get("yiqi_id");
+        if (raw == null) {
+            raw = formData.get("yiqiId");
+        }
+        return raw == null ? "" : trimToEmpty(String.valueOf(raw));
+    }
+
+    private String resolveParam(Map<String, Object> formData, String requestParam,
+                                String snakeCaseKey, String camelCaseKey) {
+        String value = trimToEmpty(requestParam);
+        if (!value.isEmpty() || formData == null) {
+            return value;
+        }
+        Object raw = formData.get(snakeCaseKey);
+        if (raw == null) {
+            raw = formData.get(camelCaseKey);
+        }
+        return raw == null ? "" : trimToEmpty(String.valueOf(raw));
+    }
+
+    private LocalDateTime resolveJiaoyanShijian(Map<String, Object> formData, String jiaoyanShijian) throws DataException {
+        Object raw = trimToEmpty(jiaoyanShijian);
+        if (raw.toString().isEmpty() && formData != null) {
+            raw = formData.get("jiaoyan_shijian");
+            if (raw == null) {
+                raw = formData.get("jiaoyanShijian");
+            }
+        }
+        if (raw == null || trimToEmpty(String.valueOf(raw)).isEmpty()) {
+            throw new DataException("鏍″噯鏃堕棿(jiaoyan_shijian)涓嶈兘涓虹┖");
+        }
+
+        String value = trimToEmpty(String.valueOf(raw));
+        try {
+            if (value.matches("^-?\\d{1,17}$")) {
+                return LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(value)), ZoneId.systemDefault());
+            }
+            if (value.length() == 10) {
+                return LocalDate.parse(value, DateTimeFormatter.ISO_LOCAL_DATE).atStartOfDay();
+            }
+            try {
+                return LocalDateTime.parse(value, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
+            } catch (DateTimeParseException ignored) {
+                return LocalDateTime.parse(value, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+            }
+        } catch (DateTimeParseException | NumberFormatException e) {
+            throw new DataException("鏍″噯鏃堕棿(jiaoyan_shijian)鏍煎紡涓嶆纭�");
+        }
+    }
+
+    private List<String> resolveYiqiIds(Map<String, Object> formData, String yiqiIds) {
+        Set<String> ids = new LinkedHashSet<>();
+        addIds(ids, yiqiIds);
+        if (formData != null) {
+            Object raw = formData.get("yiqi_ids");
+            if (raw == null) {
+                raw = formData.get("yiqiIds");
+            }
+            addIds(ids, raw);
+        }
+        return new ArrayList<>(ids);
+    }
+
+    private void addIds(Set<String> ids, Object raw) {
+        if (raw == null) {
+            return;
+        }
+        if (raw instanceof Iterable) {
+            for (Object item : (Iterable<?>) raw) {
+                addIds(ids, item);
+            }
+            return;
+        }
+        if (raw.getClass().isArray()) {
+            int length = Array.getLength(raw);
+            for (int i = 0; i < length; i++) {
+                addIds(ids, Array.get(raw, i));
+            }
+            return;
+        }
+        String value = trimToEmpty(String.valueOf(raw));
+        if (value.isEmpty()) {
+            return;
+        }
+        String[] splitIds = value.split(",");
+        for (String splitId : splitIds) {
+            String id = trimToEmpty(splitId);
+            if (!id.isEmpty()) {
+                ids.add(id);
+            }
+        }
+    }
+
+    private String trimToEmpty(String value) {
+        return value == null ? "" : value.trim();
+    }
+}

--
Gitblit v1.8.0