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