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-dms/jnpf-dms-biz/src/main/java/jnpf/dmsService/impl/DmsDanganXiaohuiShenqingTongguoServiceImpl.java |  122 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 122 insertions(+), 0 deletions(-)

diff --git a/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsService/impl/DmsDanganXiaohuiShenqingTongguoServiceImpl.java b/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsService/impl/DmsDanganXiaohuiShenqingTongguoServiceImpl.java
new file mode 100644
index 0000000..f510313
--- /dev/null
+++ b/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsService/impl/DmsDanganXiaohuiShenqingTongguoServiceImpl.java
@@ -0,0 +1,122 @@
+package jnpf.dmsService.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import jnpf.dmsEntity.DmsDanganCundangShenqingDanganheEntity;
+import jnpf.dmsEntity.DmsDanganXiaohuiShenqingEntity;
+import jnpf.dmsEntity.DmsDanganXiaohuiShenqingZixiangEntity;
+import jnpf.dmsMapper.DmsDanganCundangShenqingDanganheMapper;
+import jnpf.dmsMapper.DmsDanganXiaohuiShenqingMapper;
+import jnpf.dmsMapper.DmsDanganXiaohuiShenqingZixiangMapper;
+import jnpf.dmsService.DmsDanganXiaohuiShenqingTongguoService;
+import jnpf.exception.DataException;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+@Service
+@RequiredArgsConstructor
+public class DmsDanganXiaohuiShenqingTongguoServiceImpl
+        implements DmsDanganXiaohuiShenqingTongguoService {
+
+    private final DmsDanganXiaohuiShenqingMapper shenqingMapper;
+    private final DmsDanganXiaohuiShenqingZixiangMapper zixiangMapper;
+    private final DmsDanganCundangShenqingDanganheMapper danganheMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void tongguo(String flowId, String taskId) throws DataException {
+        String resolvedFlowId = requireValue(flowId, "娴佺▼ID(flow_id)");
+        String resolvedTaskId = requireValue(taskId, "娴佺▼浠诲姟ID(task_id)");
+
+        DmsDanganXiaohuiShenqingEntity shenqing = findApplication(resolvedFlowId, resolvedTaskId);
+        Set<String> danganheIds = findDanganheIds(shenqing.getId());
+        List<DmsDanganCundangShenqingDanganheEntity> danganheList = findSourceDanganhe(danganheIds);
+        ensureAssignable(danganheList, shenqing.getId());
+
+        LambdaUpdateWrapper<DmsDanganCundangShenqingDanganheEntity> update = new LambdaUpdateWrapper<>();
+        update.in(DmsDanganCundangShenqingDanganheEntity::getId, danganheIds)
+                .isNull(DmsDanganCundangShenqingDanganheEntity::getDeleteMark)
+                .and(wrapper -> wrapper.isNull(DmsDanganCundangShenqingDanganheEntity::getXiaohuiId)
+                        .or()
+                        .eq(DmsDanganCundangShenqingDanganheEntity::getXiaohuiId, shenqing.getId()))
+                .set(DmsDanganCundangShenqingDanganheEntity::getXiaohuiId, shenqing.getId());
+        if (danganheMapper.update(null, update) != danganheIds.size()) {
+            throw new DataException("妗f鐩掗攢姣佸叧鑱斿彂鐢熷苟鍙戝彉鏇达紝璇烽噸鏂板鐞�");
+        }
+    }
+
+    private DmsDanganXiaohuiShenqingEntity findApplication(String flowId, String taskId) throws DataException {
+        LambdaQueryWrapper<DmsDanganXiaohuiShenqingEntity> query = new LambdaQueryWrapper<>();
+        query.eq(DmsDanganXiaohuiShenqingEntity::getFlowId, flowId)
+                .eq(DmsDanganXiaohuiShenqingEntity::getFlowTaskId, taskId)
+                .isNull(DmsDanganXiaohuiShenqingEntity::getDeleteMark);
+        List<DmsDanganXiaohuiShenqingEntity> applications = shenqingMapper.selectList(query);
+        if (applications.isEmpty()) {
+            throw new DataException("鏈壘鍒版。妗堥攢姣佺敵璇凤細flow_id=" + flowId + ", task_id=" + taskId);
+        }
+        if (applications.size() > 1) {
+            throw new DataException("flow_id涓巘ask_id鍏宠仈浜嗗鏉℃。妗堥攢姣佺敵璇凤紝鏃犳硶纭閫氳繃璁板綍");
+        }
+        return applications.get(0);
+    }
+
+    private Set<String> findDanganheIds(String shenqingId) throws DataException {
+        LambdaQueryWrapper<DmsDanganXiaohuiShenqingZixiangEntity> query = new LambdaQueryWrapper<>();
+        query.eq(DmsDanganXiaohuiShenqingZixiangEntity::getForeignId, shenqingId)
+                .isNull(DmsDanganXiaohuiShenqingZixiangEntity::getDeleteMark);
+        List<DmsDanganXiaohuiShenqingZixiangEntity> details = zixiangMapper.selectList(query);
+        if (details.isEmpty()) {
+            throw new DataException("妗f閿�姣佺敵璇锋湭鍏宠仈妗f鐩掓槑缁嗭紝鏃犳硶閫氳繃");
+        }
+        Set<String> ids = new LinkedHashSet<>();
+        for (DmsDanganXiaohuiShenqingZixiangEntity detail : details) {
+            String danganheId = trimToEmpty(detail.getDanganheId());
+            if (danganheId.isEmpty()) {
+                throw new DataException("妗f閿�姣佺敵璇锋槑缁嗙己灏戞。妗堢洅ID(danganhe_id)");
+            }
+            if (!ids.add(danganheId)) {
+                throw new DataException("妗f閿�姣佺敵璇锋槑缁嗗寘鍚噸澶嶆。妗堢洅ID(danganhe_id)");
+            }
+        }
+        return ids;
+    }
+
+    private List<DmsDanganCundangShenqingDanganheEntity> findSourceDanganhe(Set<String> danganheIds)
+            throws DataException {
+        LambdaQueryWrapper<DmsDanganCundangShenqingDanganheEntity> query = new LambdaQueryWrapper<>();
+        query.in(DmsDanganCundangShenqingDanganheEntity::getId, danganheIds)
+                .isNull(DmsDanganCundangShenqingDanganheEntity::getDeleteMark);
+        List<DmsDanganCundangShenqingDanganheEntity> danganheList = danganheMapper.selectList(query);
+        if (danganheList.size() != danganheIds.size()) {
+            throw new DataException("瀛樺湪鏈壘鍒版垨宸插垹闄ょ殑妗f鐩掞紝鏃犳硶閫氳繃閿�姣佺敵璇�");
+        }
+        return danganheList;
+    }
+
+    private void ensureAssignable(List<DmsDanganCundangShenqingDanganheEntity> danganheList, String shenqingId)
+            throws DataException {
+        for (DmsDanganCundangShenqingDanganheEntity danganhe : danganheList) {
+            String currentXiaohuiId = trimToEmpty(danganhe.getXiaohuiId());
+            if (!currentXiaohuiId.isEmpty() && !shenqingId.equals(currentXiaohuiId)) {
+                throw new DataException("妗f鐩掑凡鍏宠仈鍏朵粬閿�姣佺敵璇凤紝鏃犳硶閲嶅閫氳繃");
+            }
+        }
+    }
+
+    private String requireValue(String value, String fieldName) throws DataException {
+        String resolved = trimToEmpty(value);
+        if (resolved.isEmpty()) {
+            throw new DataException(fieldName + "涓嶈兘涓虹┖");
+        }
+        return resolved;
+    }
+
+    private String trimToEmpty(String value) {
+        return value == null ? "" : value.trim();
+    }
+}

--
Gitblit v1.8.0