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/test/java/jnpf/dmsService/DmsDanganXiaohuiShenqingTongguoServiceTest.java |  140 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 140 insertions(+), 0 deletions(-)

diff --git a/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsService/DmsDanganXiaohuiShenqingTongguoServiceTest.java b/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsService/DmsDanganXiaohuiShenqingTongguoServiceTest.java
new file mode 100644
index 0000000..7f552fd
--- /dev/null
+++ b/jnpf-dms/jnpf-dms-biz/src/test/java/jnpf/dmsService/DmsDanganXiaohuiShenqingTongguoServiceTest.java
@@ -0,0 +1,140 @@
+package jnpf.dmsService;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
+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.impl.DmsDanganXiaohuiShenqingTongguoServiceImpl;
+import jnpf.exception.DataException;
+import org.apache.ibatis.builder.MapperBuilderAssistant;
+import org.apache.ibatis.session.Configuration;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+
+import java.util.Arrays;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+class DmsDanganXiaohuiShenqingTongguoServiceTest {
+
+    @BeforeEach
+    void setUp() {
+        initialize(DmsDanganXiaohuiShenqingEntity.class);
+        initialize(DmsDanganXiaohuiShenqingZixiangEntity.class);
+        initialize(DmsDanganCundangShenqingDanganheEntity.class);
+    }
+
+    @Test
+    void assignsEverySelectedDanganheToTheApprovedApplication() throws Exception {
+        DmsDanganXiaohuiShenqingMapper shenqingMapper = mock(DmsDanganXiaohuiShenqingMapper.class);
+        DmsDanganXiaohuiShenqingZixiangMapper zixiangMapper = mock(DmsDanganXiaohuiShenqingZixiangMapper.class);
+        DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class);
+        when(shenqingMapper.selectList(any())).thenReturn(Arrays.asList(application("destroy-1")));
+        when(zixiangMapper.selectList(any())).thenReturn(Arrays.asList(detail("box-1"), detail("box-2")));
+        when(danganheMapper.selectList(any())).thenReturn(Arrays.asList(sourceBox("box-1", null), sourceBox("box-2", "")));
+        when(danganheMapper.update(isNull(), any())).thenReturn(2);
+
+        service(shenqingMapper, zixiangMapper, danganheMapper).tongguo("flow-1", "task-1");
+
+        ArgumentCaptor<Wrapper<DmsDanganCundangShenqingDanganheEntity>> captor = ArgumentCaptor.forClass(Wrapper.class);
+        verify(danganheMapper).update(isNull(), captor.capture());
+        com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<?> update =
+                (com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<?>) captor.getValue();
+        assertTrue(update.getSqlSet().contains("xiaohui_id"));
+        assertTrue(update.getParamNameValuePairs().containsValue("destroy-1"));
+    }
+
+    @Test
+    void allowsAnIdempotentApprovalForTheSameApplication() throws Exception {
+        DmsDanganXiaohuiShenqingMapper shenqingMapper = mock(DmsDanganXiaohuiShenqingMapper.class);
+        DmsDanganXiaohuiShenqingZixiangMapper zixiangMapper = mock(DmsDanganXiaohuiShenqingZixiangMapper.class);
+        DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class);
+        when(shenqingMapper.selectList(any())).thenReturn(Arrays.asList(application("destroy-1")));
+        when(zixiangMapper.selectList(any())).thenReturn(Arrays.asList(detail("box-1")));
+        when(danganheMapper.selectList(any())).thenReturn(Arrays.asList(sourceBox("box-1", "destroy-1")));
+        when(danganheMapper.update(isNull(), any())).thenReturn(1);
+
+        service(shenqingMapper, zixiangMapper, danganheMapper).tongguo("flow-1", "task-1");
+
+        verify(danganheMapper).update(isNull(), any());
+    }
+
+    @Test
+    void rejectsDanganheAssignedToAnotherDestructionApplication() {
+        DmsDanganXiaohuiShenqingMapper shenqingMapper = mock(DmsDanganXiaohuiShenqingMapper.class);
+        DmsDanganXiaohuiShenqingZixiangMapper zixiangMapper = mock(DmsDanganXiaohuiShenqingZixiangMapper.class);
+        DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class);
+        when(shenqingMapper.selectList(any())).thenReturn(Arrays.asList(application("destroy-1")));
+        when(zixiangMapper.selectList(any())).thenReturn(Arrays.asList(detail("box-1")));
+        when(danganheMapper.selectList(any())).thenReturn(Arrays.asList(sourceBox("box-1", "destroy-other")));
+
+        DataException error = assertThrows(DataException.class,
+                () -> service(shenqingMapper, zixiangMapper, danganheMapper).tongguo("flow-1", "task-1"));
+
+        assertEquals("妗f鐩掑凡鍏宠仈鍏朵粬閿�姣佺敵璇凤紝鏃犳硶閲嶅閫氳繃", error.getMessage());
+        verify(danganheMapper, never()).update(any(), any());
+    }
+
+    @Test
+    void rejectsBlankDanganheIdBeforeUpdatingAnything() {
+        DmsDanganXiaohuiShenqingMapper shenqingMapper = mock(DmsDanganXiaohuiShenqingMapper.class);
+        DmsDanganXiaohuiShenqingZixiangMapper zixiangMapper = mock(DmsDanganXiaohuiShenqingZixiangMapper.class);
+        DmsDanganCundangShenqingDanganheMapper danganheMapper = mock(DmsDanganCundangShenqingDanganheMapper.class);
+        when(shenqingMapper.selectList(any())).thenReturn(Arrays.asList(application("destroy-1")));
+        when(zixiangMapper.selectList(any())).thenReturn(Arrays.asList(detail(" ")));
+
+        DataException error = assertThrows(DataException.class,
+                () -> service(shenqingMapper, zixiangMapper, danganheMapper).tongguo("flow-1", "task-1"));
+
+        assertEquals("妗f閿�姣佺敵璇锋槑缁嗙己灏戞。妗堢洅ID(danganhe_id)", error.getMessage());
+        verify(danganheMapper, never()).selectList(any());
+        verify(danganheMapper, never()).update(any(), any());
+    }
+
+    private void initialize(Class<?> entityClass) {
+        if (TableInfoHelper.getTableInfo(entityClass) == null) {
+            TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new Configuration(), ""), entityClass);
+        }
+    }
+
+    private DmsDanganXiaohuiShenqingTongguoService service(
+            DmsDanganXiaohuiShenqingMapper shenqingMapper,
+            DmsDanganXiaohuiShenqingZixiangMapper zixiangMapper,
+            DmsDanganCundangShenqingDanganheMapper danganheMapper) {
+        return new DmsDanganXiaohuiShenqingTongguoServiceImpl(shenqingMapper, zixiangMapper, danganheMapper);
+    }
+
+    private DmsDanganXiaohuiShenqingEntity application(String id) {
+        DmsDanganXiaohuiShenqingEntity application = new DmsDanganXiaohuiShenqingEntity();
+        application.setId(id);
+        application.setFlowId("flow-1");
+        application.setFlowTaskId("task-1");
+        return application;
+    }
+
+    private DmsDanganXiaohuiShenqingZixiangEntity detail(String danganheId) {
+        DmsDanganXiaohuiShenqingZixiangEntity detail = new DmsDanganXiaohuiShenqingZixiangEntity();
+        detail.setDanganheId(danganheId);
+        return detail;
+    }
+
+    private DmsDanganCundangShenqingDanganheEntity sourceBox(String id, String xiaohuiId) {
+        DmsDanganCundangShenqingDanganheEntity danganhe = new DmsDanganCundangShenqingDanganheEntity();
+        danganhe.setId(id);
+        danganhe.setXiaohuiId(xiaohuiId);
+        return danganhe;
+    }
+}

--
Gitblit v1.8.0