|
|
|
|
@ -4,10 +4,11 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
|
|
|
|
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.anyList;
|
|
|
|
|
import static org.mockito.ArgumentMatchers.eq;
|
|
|
|
|
import static org.mockito.Mockito.doAnswer;
|
|
|
|
|
import static org.mockito.Mockito.never;
|
|
|
|
|
import static org.mockito.Mockito.verify;
|
|
|
|
|
import static org.mockito.Mockito.when;
|
|
|
|
|
|
|
|
|
|
@ -23,13 +24,17 @@ import org.mockito.Mock;
|
|
|
|
|
import org.mockito.junit.jupiter.MockitoExtension;
|
|
|
|
|
|
|
|
|
|
import com.ruoyi.asset.constant.DisposalOrderStatus;
|
|
|
|
|
import com.ruoyi.asset.constant.RfidBindStatus;
|
|
|
|
|
import com.ruoyi.asset.constant.RfidTagStatus;
|
|
|
|
|
import com.ruoyi.asset.domain.AmsAsset;
|
|
|
|
|
import com.ruoyi.asset.domain.AmsDisposalOperateContext;
|
|
|
|
|
import com.ruoyi.asset.domain.AmsDisposalOrder;
|
|
|
|
|
import com.ruoyi.asset.domain.AmsDisposalOrderItem;
|
|
|
|
|
import com.ruoyi.asset.domain.AmsRfidTag;
|
|
|
|
|
import com.ruoyi.asset.domain.AssetTransitionContext;
|
|
|
|
|
import com.ruoyi.asset.mapper.AmsAssetMapper;
|
|
|
|
|
import com.ruoyi.asset.mapper.AmsDisposalOrderMapper;
|
|
|
|
|
import com.ruoyi.asset.mapper.AmsRfidTagMapper;
|
|
|
|
|
import com.ruoyi.asset.service.IAssetStatusTransitionService;
|
|
|
|
|
import com.ruoyi.common.exception.ServiceException;
|
|
|
|
|
import com.ruoyi.system.service.ISysCodeRuleService;
|
|
|
|
|
@ -49,6 +54,9 @@ class AmsDisposalOrderServiceImplTest
|
|
|
|
|
@Mock
|
|
|
|
|
private AmsAssetMapper amsAssetMapper;
|
|
|
|
|
|
|
|
|
|
@Mock
|
|
|
|
|
private AmsRfidTagMapper amsRfidTagMapper;
|
|
|
|
|
|
|
|
|
|
@Mock
|
|
|
|
|
private ISysCodeRuleService sysCodeRuleService;
|
|
|
|
|
|
|
|
|
|
@ -198,6 +206,7 @@ class AmsDisposalOrderServiceImplTest
|
|
|
|
|
item.setItemId(500L);
|
|
|
|
|
|
|
|
|
|
when(amsDisposalOrderMapper.selectAmsDisposalOrderByOrderIdForUpdate(eq(100L))).thenReturn(current);
|
|
|
|
|
when(amsRfidTagMapper.selectBoundAmsRfidTagsByAssetIdsForUpdate(eq(List.of(1L)))).thenReturn(List.of());
|
|
|
|
|
stubAsset(1L, "IN_STOCK");
|
|
|
|
|
when(amsDisposalOrderMapper.countOtherActiveDisposalOrderByAssetId(eq(1L), eq(100L))).thenReturn(0);
|
|
|
|
|
when(amsDisposalOrderMapper.updateAmsDisposalOrder(any(AmsDisposalOrder.class))).thenReturn(1);
|
|
|
|
|
@ -218,6 +227,65 @@ class AmsDisposalOrderServiceImplTest
|
|
|
|
|
assertEquals(500L, transitionContext.getSourceItemId());
|
|
|
|
|
assertEquals(9L, transitionContext.getOperateUserId());
|
|
|
|
|
assertEquals("管理员", transitionContext.getOperateUserName());
|
|
|
|
|
verify(amsRfidTagMapper).selectBoundAmsRfidTagsByAssetIdsForUpdate(eq(List.of(1L)));
|
|
|
|
|
verify(amsRfidTagMapper, never()).voidBoundAmsRfidTagByAssetId(any(), any(), any(), any());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 测试:确认报废时,当前绑定的RFID标签同步作废,但保留绑定快照
|
|
|
|
|
*/
|
|
|
|
|
@Test
|
|
|
|
|
void confirmShouldVoidBoundRfidTagAndKeepBindingSnapshot()
|
|
|
|
|
{
|
|
|
|
|
AmsDisposalOrder current = buildRequest();
|
|
|
|
|
current.setOrderId(100L);
|
|
|
|
|
current.setDisposalNo("BF202606170001");
|
|
|
|
|
current.setOrderStatus(DisposalOrderStatus.PENDING_CONFIRM);
|
|
|
|
|
current.getAmsDisposalOrderItemList().get(0).setItemId(500L);
|
|
|
|
|
|
|
|
|
|
AmsRfidTag tag = buildBoundTag(10L, 1L);
|
|
|
|
|
|
|
|
|
|
when(amsDisposalOrderMapper.selectAmsDisposalOrderByOrderIdForUpdate(eq(100L))).thenReturn(current);
|
|
|
|
|
when(amsRfidTagMapper.selectBoundAmsRfidTagsByAssetIdsForUpdate(eq(List.of(1L)))).thenReturn(List.of(tag));
|
|
|
|
|
stubAsset(1L, "IN_STOCK");
|
|
|
|
|
when(amsDisposalOrderMapper.countOtherActiveDisposalOrderByAssetId(eq(1L), eq(100L))).thenReturn(0);
|
|
|
|
|
when(amsRfidTagMapper.voidBoundAmsRfidTagByAssetId(eq(10L), eq(1L), eq("admin"), any(Date.class))).thenReturn(1);
|
|
|
|
|
when(amsDisposalOrderMapper.updateAmsDisposalOrder(any(AmsDisposalOrder.class))).thenReturn(1);
|
|
|
|
|
|
|
|
|
|
assertEquals(1, service.confirmDisposal(100L, adminContext()));
|
|
|
|
|
|
|
|
|
|
verify(assetStatusTransitionService).confirmDisposal(eq(1L), any(AssetTransitionContext.class));
|
|
|
|
|
verify(amsRfidTagMapper).voidBoundAmsRfidTagByAssetId(eq(10L), eq(1L), eq("admin"), any(Date.class));
|
|
|
|
|
assertEquals(RfidBindStatus.BOUND, tag.getBindStatus());
|
|
|
|
|
assertEquals(1L, tag.getAssetId());
|
|
|
|
|
assertEquals("A001", tag.getAssetCode());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 测试:标签状态被并发改变时,报废确认失败且不更新报废单状态
|
|
|
|
|
*/
|
|
|
|
|
@Test
|
|
|
|
|
void confirmShouldFailWhenBoundRfidTagChangedBeforeVoid()
|
|
|
|
|
{
|
|
|
|
|
AmsDisposalOrder current = buildRequest();
|
|
|
|
|
current.setOrderId(100L);
|
|
|
|
|
current.setDisposalNo("BF202606170001");
|
|
|
|
|
current.setOrderStatus(DisposalOrderStatus.PENDING_CONFIRM);
|
|
|
|
|
|
|
|
|
|
AmsRfidTag tag = buildBoundTag(10L, 1L);
|
|
|
|
|
|
|
|
|
|
when(amsDisposalOrderMapper.selectAmsDisposalOrderByOrderIdForUpdate(eq(100L))).thenReturn(current);
|
|
|
|
|
when(amsRfidTagMapper.selectBoundAmsRfidTagsByAssetIdsForUpdate(eq(List.of(1L)))).thenReturn(List.of(tag));
|
|
|
|
|
stubAsset(1L, "IN_STOCK");
|
|
|
|
|
when(amsDisposalOrderMapper.countOtherActiveDisposalOrderByAssetId(eq(1L), eq(100L))).thenReturn(0);
|
|
|
|
|
when(amsRfidTagMapper.voidBoundAmsRfidTagByAssetId(eq(10L), eq(1L), eq("admin"), any(Date.class))).thenReturn(0);
|
|
|
|
|
|
|
|
|
|
ServiceException exception = assertThrows(ServiceException.class,
|
|
|
|
|
() -> service.confirmDisposal(100L, adminContext()));
|
|
|
|
|
|
|
|
|
|
assertTrue(exception.getMessage().contains("RFID标签"));
|
|
|
|
|
verify(assetStatusTransitionService).confirmDisposal(eq(1L), any(AssetTransitionContext.class));
|
|
|
|
|
verify(amsDisposalOrderMapper, never()).updateAmsDisposalOrder(any(AmsDisposalOrder.class));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -265,6 +333,20 @@ class AmsDisposalOrderServiceImplTest
|
|
|
|
|
return new AmsDisposalOperateContext(9L, "管理员", "admin", 3L, "资产管理部");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private AmsRfidTag buildBoundTag(Long tagId, Long assetId)
|
|
|
|
|
{
|
|
|
|
|
AmsRfidTag tag = new AmsRfidTag();
|
|
|
|
|
tag.setTagId(tagId);
|
|
|
|
|
tag.setTagCode("TAG-001");
|
|
|
|
|
tag.setEpcCode("EPC-001");
|
|
|
|
|
tag.setTagStatus(RfidTagStatus.NORMAL);
|
|
|
|
|
tag.setBindStatus(RfidBindStatus.BOUND);
|
|
|
|
|
tag.setAssetId(assetId);
|
|
|
|
|
tag.setAssetCode("A001");
|
|
|
|
|
tag.setAssetName("资产A");
|
|
|
|
|
return tag;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void stubAsset(Long assetId, String status)
|
|
|
|
|
{
|
|
|
|
|
AmsAsset asset = new AmsAsset();
|
|
|
|
|
|