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-biz/src/main/java/jnpf/limsService/impl/LimsYichangDiaochaServiceImpl.java |  208 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 208 insertions(+), 0 deletions(-)

diff --git a/jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/LimsYichangDiaochaServiceImpl.java b/jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/LimsYichangDiaochaServiceImpl.java
new file mode 100644
index 0000000..30ac12d
--- /dev/null
+++ b/jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/LimsYichangDiaochaServiceImpl.java
@@ -0,0 +1,208 @@
+package jnpf.limsService.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import jnpf.base.ActionResult;
+import jnpf.base.ActionResultCode;
+import jnpf.flowable.TaskApi;
+import jnpf.flowable.model.task.FlowModel;
+import jnpf.limsEntity.JianyanJielun;
+import jnpf.limsEntity.LimsAdDiaochabiaoEntity;
+import jnpf.limsEntity.LimsJianyanResultItem;
+import jnpf.limsEntity.LimsJianyanXiangEntity;
+import jnpf.limsEntity.LimsOosOotDiaochabiaoEntity;
+import jnpf.limsEntity.YichangDiaochaLeixing;
+import jnpf.limsEntity.ZhiliangBiaozhunGuanliZixiangEntity;
+import jnpf.limsService.LimsAdDiaochabiaoService;
+import jnpf.limsService.LimsFlowTemplateResolver;
+import jnpf.limsService.LimsOosOotDiaochabiaoService;
+import jnpf.limsService.LimsYichangDiaochaService;
+import jnpf.limsService.ZhiliangBiaozhunGuanliZixiangService;
+import jnpf.util.UserProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.Collections;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@Service
+public class LimsYichangDiaochaServiceImpl implements LimsYichangDiaochaService {
+
+    @Autowired
+    private ZhiliangBiaozhunGuanliZixiangService zhiliangBiaozhunGuanliZixiangService;
+
+    @Autowired
+    private LimsAdDiaochabiaoService limsAdDiaochabiaoService;
+
+    @Autowired
+    private LimsOosOotDiaochabiaoService limsOosOotDiaochabiaoService;
+
+    @Autowired
+    private LimsFlowTemplateResolver limsFlowTemplateResolver;
+
+    @Autowired
+    private TaskApi taskApi;
+
+    @Override
+    public void createIfNeeded(LimsJianyanXiangEntity row, LimsJianyanResultItem item) {
+        if (row == null || item == null) {
+            return;
+        }
+        YichangDiaochaLeixing t = YichangDiaochaLeixing.fromCode(item.getYichangDiaochaLeixing());
+        if (t == null || !t.isInvestigation()) {
+            return;
+        }
+
+        // 纭畾鎬у弽鏌ワ細lims_jianyan_xiang.f_foreign_id = zixiang.f_id锛�= 琛ㄥ崟妫�楠岄」鐩甶d锛夛紱
+        // zixiang.f_foreign_id = guanli.f_id锛�= 琛ㄥ崟璐ㄩ噺鏍囧噯锛夈�俧_foreign_id 鍒涘缓鍚庣ǔ瀹氥�佹姤鍛婃祦绋嬩笉瑕嗙洊銆�
+        String jianyanXiangmuId = row.getForeignId();
+        String zhiliangBiaozhunId = null;
+        if (jianyanXiangmuId != null && !jianyanXiangmuId.isEmpty()) {
+            ZhiliangBiaozhunGuanliZixiangEntity zixiang =
+                    zhiliangBiaozhunGuanliZixiangService.getById(jianyanXiangmuId);
+            if (zixiang != null) {
+                zhiliangBiaozhunId = zixiang.getForeignId();
+            }
+        }
+
+        if (t == YichangDiaochaLeixing.AD) {
+            launchAd(row, item, jianyanXiangmuId, zhiliangBiaozhunId, t);
+        } else {
+            // OOS / OOT锛氬悓涓�寮犺〃 + 鍚屼竴妯℃澘锛宒iaocha_fenlei 鐢ㄦ灇涓� code锛坥os/oot锛�
+            launchOosOot(row, item, jianyanXiangmuId, zhiliangBiaozhunId, t);
+        }
+    }
+
+    private void launchAd(LimsJianyanXiangEntity row, LimsJianyanResultItem item, String jianyanXiangmuId,
+                          String zhiliangBiaozhunId, YichangDiaochaLeixing t) {
+        // 鍒ら噸锛氳嚜鐒堕敭 = qingyan_liushuihao + jianyan_xiangmu_id锛涘凡瀛樺湪鍒欒烦杩囷紝闃查噸澶嶅彂璧�
+        QueryWrapper<LimsAdDiaochabiaoEntity> dup = new QueryWrapper<>();
+        dup.eq("qingyan_liushuihao", row.getJianyanLiushuihao());
+        dup.eq("jianyan_xiangmu_id", jianyanXiangmuId);
+        dup.and(w -> w.isNull("f_delete_mark").or().ne("f_delete_mark", 1));
+        if (limsAdDiaochabiaoService.count(dup) > 0) {
+            return;
+        }
+
+        Date now = new Date();
+        Map<String, Object> formData = baseFormData(row, jianyanXiangmuId, zhiliangBiaozhunId, now);
+        formData.put("ad_diaocha_bianhao", nextBianhao("AD", now, true));
+        // 寮傚父鎻忚堪锛欰D 琛ㄥ崟鍙戣捣闃舵蹇呭~锛岀敤妫�楠岀粨鏋滄暟鎹嫾涓�鍙ュ瑙傛弿杩帮紝璋冩煡鍛樺彲鍐嶆敼
+        formData.put("yichang_miaoshu", describeAnomaly(row, item));
+        launch(t, formData, row.getJianyanLiushuihao());
+    }
+
+    private void launchOosOot(LimsJianyanXiangEntity row, LimsJianyanResultItem item, String jianyanXiangmuId,
+                              String zhiliangBiaozhunId, YichangDiaochaLeixing t) {
+        String fenlei = t.getCode(); // oos / oot
+        // 鍒ら噸锛氳嚜鐒堕敭 = qingyan_liushuihao + jianyan_xiangmu_id + diaocha_fenlei
+        QueryWrapper<LimsOosOotDiaochabiaoEntity> dup = new QueryWrapper<>();
+        dup.eq("qingyan_liushuihao", row.getJianyanLiushuihao());
+        dup.eq("jianyan_xiangmu_id", jianyanXiangmuId);
+        dup.eq("diaocha_fenlei", fenlei);
+        dup.and(w -> w.isNull("f_delete_mark").or().ne("f_delete_mark", 1));
+        if (limsOosOotDiaochabiaoService.count(dup) > 0) {
+            return;
+        }
+
+        Date now = new Date();
+        Map<String, Object> formData = baseFormData(row, jianyanXiangmuId, zhiliangBiaozhunId, now);
+        formData.put("diaocha_fenlei", fenlei);
+        formData.put("diaocha_bianhao", nextBianhao(fenlei.toUpperCase(), now, false));
+        // 妫�楠屾弿杩帮細OOS/OOT 琛ㄥ崟鍙戣捣闃舵蹇呭~锛屽悓 AD 寮傚父鎻忚堪
+        formData.put("jianyan_miaoshu", describeAnomaly(row, item));
+        launch(t, formData, row.getJianyanLiushuihao());
+    }
+
+    /** 鍏叡琛ㄥ崟瀛楁锛坘ey = 鐗╃悊鍒楀悕锛孉D/OOS/OOT 鍚屾簮锛夈�傛棩鏈熺敤 yyyy-MM-dd 瀛楃涓诧紙涓庡簱鍐呯幇鏈夋暟鎹竴鑷达級銆� */
+    private Map<String, Object> baseFormData(LimsJianyanXiangEntity row, String jianyanXiangmuId,
+                                             String zhiliangBiaozhunId, Date now) {
+        String today = new SimpleDateFormat("yyyy-MM-dd").format(now);
+        String currentUserId = UserProvider.getUser().getUserId();
+        Map<String, Object> m = new LinkedHashMap<>();
+        m.put("yangpin_leixing", row.getBizType());
+        m.put("yangpin_mingcheng", row.getChanpinMingcheng());
+        m.put("yangpin_id", row.getChanpinId());
+        m.put("pihao", row.getPihao());
+        m.put("qingyan_liushuihao", row.getJianyanLiushuihao());
+        m.put("zhiliang_biaozhun", zhiliangBiaozhunId);
+        m.put("jianyan_xiangmu", row.getJianyanXiangmuMingcheng());
+        m.put("jianyan_xiangmu_id", jianyanXiangmuId);
+        m.put("faxian_riqi", today);
+        m.put("jianyan_ren", currentUserId);
+        m.put("jianyan_riqi", today);
+        m.put("qingyandan_id", row.getQingyandanId());
+        return m;
+    }
+
+    /**
+     * 寮傚父鎻忚堪 / 妫�楠屾弿杩帮紙琛ㄥ崟鍙戣捣闃舵蹇呭~锛夛細鐢� 妫�楠岄」鐩� + 鏈妫�楠岀粨鏋� + 鏍囧噯瑙勫畾 + 妫�楠岀粨璁�
+     * 鎷间竴鍙ュ瑙傛弿杩帮紝璋冩煡鍛樺彲鍦ㄨ〃鍗曢噷鍐嶄慨鏀广�傜粨鏋�/缁撹鍙栬嚜鏈褰曞叆 item锛屾爣鍑�/椤圭洰鍙栬嚜妫�楠岄」 row銆�
+     */
+    private String describeAnomaly(LimsJianyanXiangEntity row, LimsJianyanResultItem item) {
+        String xiangmu = safe(row.getJianyanXiangmuMingcheng());
+        String jieguo = safe(item.getJianyanJieguo());
+        String biaozhun = safe(row.getBiaozhunGuiding());
+        String jielun = jielunLabel(item.getJianyanJielun());
+        return "妫�楠岄」鐩��" + xiangmu + "銆戞楠岀粨鏋溿��" + jieguo + "銆戯紝鏍囧噯瑙勫畾銆�" + biaozhun + "銆戯紝妫�楠岀粨璁恒��" + jielun + "銆戙��";
+    }
+
+    private static String safe(String s) {
+        return s == null ? "" : s;
+    }
+
+    /** 妫�楠岀粨璁� code 鈫� 涓枃 label锛涚┖ / 鏈煡 code 涓嶆姏寮傚父锛堣繑鍥炲師鍊兼垨绌猴級 */
+    private static String jielunLabel(String code) {
+        if (code == null || code.isEmpty()) {
+            return "";
+        }
+        try {
+            return JianyanJielun.fromCode(code).getLabel();
+        } catch (Exception e) {
+            return code;
+        }
+    }
+
+    /** 瑙f瀽 templateId 鈫� 浠ュ綋鍓嶇櫥褰曠敤鎴峰悕涔� launchFlow 鈫� 鏍¢獙杩斿洖锛涘け璐ユ姏寮傚父锛堜氦 submit 鏀堕泦涓哄彂璧峰け璐ワ級銆� */
+    private void launch(YichangDiaochaLeixing t, Map<String, Object> formData, String liushuihao) {
+        String enCode = t.getFlowTemplateEnCode();
+        String templateId = limsFlowTemplateResolver.resolveTemplateId(enCode);
+        if (templateId == null || templateId.isEmpty()) {
+            throw new RuntimeException("鏈壘鍒版祦绋嬫ā鏉匡紙enCode=" + enCode + "锛夛紝鏃犳硶鍙戣捣 " + t.getCode() + " 璋冩煡娴佺▼");
+        }
+        FlowModel model = new FlowModel();
+        model.setTemplateId(templateId);
+        model.setUserIds(Collections.singletonList(UserProvider.getUser().getUserId()));
+        model.setFormDataList(Collections.singletonList(formData));
+        // hasPermission 榛樿 false锛氫袱妯℃澘 visibleType=1 鍏ㄥ眬鍙彂璧凤紝涓嶅仛鍙戣捣鏉冮檺杩囨护
+        ActionResult result = taskApi.launchFlow(model);
+        // 鎴愬姛鍒ゅ畾鐢ㄥ钩鍙板父閲� ActionResultCode.SUCCESS锛堜笌 VisualdevModelDataController 鍙戣捣鍚庡垽瀹氫竴鑷达級锛�
+        // 涓嶈兘纭紪鐮� "200"鈥斺�攍aunchFlow 鎴愬姛杩斿洖鐨� code 鏄� SUCCESS 鐮併�乵sg 涓�"鎻愪氦鎴愬姛锛岃鑰愬績绛夊緟"锛屽苟闈� "200"銆�
+        if (result == null || !ActionResultCode.SUCCESS.getCode().equals(result.getCode())) {
+            throw new RuntimeException("鍙戣捣 " + t.getCode() + " 璋冩煡娴佺▼澶辫触锛堟祦姘村彿=" + liushuihao + "锛夛細"
+                    + (result == null ? "鏃犺繑鍥�" : result.getMsg()));
+        }
+    }
+
+    /**
+     * 鐢熸垚"鍓嶇紑+yyyyMMdd+3浣嶆棩鍐呮祦姘�"缂栧彿锛涙祦姘� = 褰撳ぉ璇ュ墠缂�宸叉湁琛屾暟 + 1銆�
+     * isAd=true 鏌� lims_ad_diaochabiao.ad_diaocha_bianhao锛屽惁鍒欐煡 lims_oos_oot_diaochabiao.diaocha_bianhao銆�
+     * LIMS 鍗曟嵁閲忎綆锛屽苟鍙戠鎾炲彲蹇界暐锛涚湡姝g殑閲嶅鐢卞垽閲嶈嚜鐒堕敭鎷︽埅銆�
+     */
+    private String nextBianhao(String prefix, Date now, boolean isAd) {
+        String head = prefix + new SimpleDateFormat("yyyy").format(now);
+        long seq;
+        if (isAd) {
+            QueryWrapper<LimsAdDiaochabiaoEntity> w = new QueryWrapper<>();
+            w.likeRight("ad_diaocha_bianhao", head);
+            seq = limsAdDiaochabiaoService.count(w) + 1;
+        } else {
+            QueryWrapper<LimsOosOotDiaochabiaoEntity> w = new QueryWrapper<>();
+            w.likeRight("diaocha_bianhao", head);
+            seq = limsOosOotDiaochabiaoService.count(w) + 1;
+        }
+        return String.format("%s%04d", head, seq);
+    }
+}

--
Gitblit v1.8.0