refactor(inventory): 调整盘点任务确认逻辑移除资产履历记录

- 移除盘点结果确认时的资产履历记录功能
- 删除AssetLifecycleBusinessType中的盘点类型常量
- 移除AmsAssetLifecycleLog相关依赖和处理逻辑
- 更新测试用例以验证不再写入资产履历的行为
- 修改前端确认提示信息以反映新的业务逻辑
- 调整方法注释说明盘点只确认任务事实而不写履历
main
yangk 21 hours ago
parent 7317920a76
commit 9b63b8c51b

@ -23,8 +23,6 @@ public final class AssetLifecycleBusinessType
public static final String REPAIR = "REPAIR";
/** 资产处置/报废 */
public static final String DISPOSAL = "DISPOSAL";
/** 资产盘点 */
public static final String INVENTORY = "INVENTORY";
/** RFID标签绑定 */
public static final String RFID_BIND = "RFID_BIND";
/** RFID标签解绑 */

@ -176,7 +176,7 @@ public class AmsInventoryTaskController extends BaseController
return toAjax(amsInventoryTaskService.deleteSurplusItem(surplusId, getLoginName()));
}
/** 确认盘点结果,只写盘点履历,不自动调整资产台账。 */
/** 确认盘点结果,只确认任务事实,不自动调整资产台账,也不写资产履历。 */
@RequiresPermissions("asset:task:confirm")
@Log(title = "盘点任务管理", businessType = BusinessType.UPDATE)
@PostMapping("/confirm/{taskId}")

@ -87,7 +87,7 @@ public interface IAmsInventoryTaskService
public int deleteSurplusItem(Long surplusId, String operateLoginName);
/**
*
*
*
* @param taskId ID
* @param operateUserId ID

@ -8,7 +8,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import com.ruoyi.asset.constant.AssetLifecycleBusinessType;
import com.ruoyi.asset.constant.AssetStatus;
import com.ruoyi.asset.constant.InventoryIdentifyMethod;
import com.ruoyi.asset.constant.InventoryResult;
@ -19,7 +18,6 @@ import com.ruoyi.asset.constant.InventoryTaskStatus;
import com.ruoyi.asset.constant.RfidBindStatus;
import com.ruoyi.asset.domain.AmsAsset;
import com.ruoyi.asset.domain.AmsAssetCategory;
import com.ruoyi.asset.domain.AmsAssetLifecycleLog;
import com.ruoyi.asset.domain.AmsAssetLocation;
import com.ruoyi.asset.domain.AmsInventoryTask;
import com.ruoyi.asset.domain.AmsInventoryTaskItem;
@ -33,7 +31,6 @@ import com.ruoyi.asset.service.IAmsAssetCategoryService;
import com.ruoyi.asset.service.IAmsAssetLocationService;
import com.ruoyi.asset.service.IAmsInventoryTaskService;
import com.ruoyi.asset.service.IAmsWarehouseService;
import com.ruoyi.asset.service.IAssetLifecycleService;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
@ -86,9 +83,6 @@ public class AmsInventoryTaskServiceImpl implements IAmsInventoryTaskService
@Autowired
private IAmsAssetCategoryService amsAssetCategoryService;
@Autowired
private IAssetLifecycleService assetLifecycleService;
@Override
public AmsInventoryTask selectAmsInventoryTaskByTaskId(Long taskId)
{
@ -326,7 +320,7 @@ public class AmsInventoryTaskServiceImpl implements IAmsInventoryTaskService
}
/**
*
*
*/
@Override
@Transactional(rollbackFor = Exception.class)
@ -349,49 +343,11 @@ public class AmsInventoryTaskServiceImpl implements IAmsInventoryTaskService
{
throw new ServiceException(StringUtils.format("资产【{}】盘点结果无效", item.getAssetCode()));
}
AmsAsset asset = amsAssetMapper.selectAmsAssetByAssetIdForUpdate(item.getAssetId());
if (StringUtils.isNull(asset))
{
throw new ServiceException(StringUtils.format("资产【{}】不存在或已删除", item.getAssetCode()));
}
AmsAssetLifecycleLog lifecycleLog = new AmsAssetLifecycleLog();
lifecycleLog.setBusinessType(AssetLifecycleBusinessType.INVENTORY);
lifecycleLog.setSourceOrderId(task.getTaskId());
lifecycleLog.setSourceOrderNo(task.getTaskNo());
lifecycleLog.setSourceItemId(item.getItemId());
lifecycleLog.setOperateUserId(operateUserId);
lifecycleLog.setOperateUserName(StringUtils.trim(operateUserName));
lifecycleLog.setOperateTime(now);
lifecycleLog.setChangeSummary("确认盘点结果:" + item.getInventoryResult());
lifecycleLog.setCreateBy(StringUtils.trim(operateLoginName));
lifecycleLog.setRemark(buildLifecycleRemark(item));
assetLifecycleService.recordLifecycle(asset, asset, lifecycleLog);
}
List<AmsInventoryTaskSurplus> surplusItems = sortedSurplusItems(task);
for (AmsInventoryTaskSurplus surplus : surplusItems)
{
requireSurplusRecorded(surplus);
if (StringUtils.isNotNull(surplus.getAssetId()))
{
AmsAsset asset = amsAssetMapper.selectAmsAssetByAssetIdForUpdate(surplus.getAssetId());
if (StringUtils.isNull(asset))
{
throw new ServiceException(StringUtils.format("盘盈资产【{}】不存在或已删除",
surplus.getAssetCode()));
}
AmsAssetLifecycleLog lifecycleLog = new AmsAssetLifecycleLog();
lifecycleLog.setBusinessType(AssetLifecycleBusinessType.INVENTORY);
lifecycleLog.setSourceOrderId(task.getTaskId());
lifecycleLog.setSourceOrderNo(task.getTaskNo());
lifecycleLog.setSourceItemId(surplus.getSurplusId());
lifecycleLog.setOperateUserId(operateUserId);
lifecycleLog.setOperateUserName(StringUtils.trim(operateUserName));
lifecycleLog.setOperateTime(now);
lifecycleLog.setChangeSummary("确认盘盈:" + surplus.getSurplusType());
lifecycleLog.setCreateBy(StringUtils.trim(operateLoginName));
lifecycleLog.setRemark(buildSurplusLifecycleRemark(surplus));
assetLifecycleService.recordLifecycle(asset, asset, lifecycleLog);
}
}
amsInventoryTaskMapper.confirmAmsInventoryTaskSurplusByTaskId(task.getTaskId(),
InventorySurplusStatus.CONFIRMED, StringUtils.trim(operateLoginName));
@ -945,62 +901,6 @@ public class AmsInventoryTaskServiceImpl implements IAmsInventoryTaskService
}
}
private String buildLifecycleRemark(AmsInventoryTaskItem item)
{
StringBuilder remark = new StringBuilder("盘点结果:").append(item.getInventoryResult());
if (StringUtils.isNotEmpty(item.getBookWarehouseName()) || StringUtils.isNotEmpty(item.getBookLocationName()))
{
remark.append(";账面位置:")
.append(StringUtils.nvl(item.getBookWarehouseName(), ""))
.append("/")
.append(StringUtils.nvl(item.getBookLocationName(), ""));
}
if (StringUtils.isNotEmpty(item.getInventoryWarehouseName())
|| StringUtils.isNotEmpty(item.getInventoryLocationName()))
{
remark.append(";盘点位置:")
.append(StringUtils.nvl(item.getInventoryWarehouseName(), ""))
.append("/")
.append(StringUtils.nvl(item.getInventoryLocationName(), ""));
}
if (StringUtils.isNotEmpty(item.getRemark()))
{
remark.append("").append(item.getRemark());
}
return remark.length() > 500 ? remark.substring(0, 500) : remark.toString();
}
private String buildSurplusLifecycleRemark(AmsInventoryTaskSurplus surplus)
{
StringBuilder remark = new StringBuilder("盘盈类型:").append(surplus.getSurplusType());
remark.append(";识别方式:").append(surplus.getIdentifyMethod());
if (StringUtils.isNotEmpty(surplus.getAssetCode()))
{
remark.append(";资产编码:").append(surplus.getAssetCode());
}
if (StringUtils.isNotEmpty(surplus.getEpcCode()))
{
remark.append("EPC").append(surplus.getEpcCode());
}
if (StringUtils.isNotEmpty(surplus.getBookWarehouseName())
|| StringUtils.isNotEmpty(surplus.getBookLocationName()))
{
remark.append(";账面位置:")
.append(StringUtils.nvl(surplus.getBookWarehouseName(), ""))
.append("/")
.append(StringUtils.nvl(surplus.getBookLocationName(), ""));
}
remark.append(";盘点位置:")
.append(StringUtils.nvl(surplus.getInventoryWarehouseName(), ""))
.append("/")
.append(StringUtils.nvl(surplus.getInventoryLocationName(), ""));
if (StringUtils.isNotEmpty(surplus.getRemark()))
{
remark.append("").append(surplus.getRemark());
}
return remark.length() > 500 ? remark.substring(0, 500) : remark.toString();
}
private void requireStatus(AmsInventoryTask task, String requiredStatus, String message)
{
if (!StringUtils.equals(requiredStatus, task.getTaskStatus()))

@ -196,7 +196,7 @@
}
function confirmTask(taskId) {
$.modal.confirm("确认后只写入盘点履历,不会自动调整资产台账,是否继续?", function() {
$.modal.confirm("确认后只完成盘点任务,不会自动调整资产台账,也不会写资产履历,是否继续?", function() {
$.operate.post(prefix + "/confirm/" + taskId, {});
});
}

@ -10,13 +10,11 @@ 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.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Collections;
import java.util.List;
import com.ruoyi.asset.constant.AssetLifecycleBusinessType;
import com.ruoyi.asset.constant.AssetStatus;
import com.ruoyi.asset.constant.InventoryIdentifyMethod;
import com.ruoyi.asset.constant.InventoryResult;
@ -27,7 +25,6 @@ import com.ruoyi.asset.constant.InventoryTaskStatus;
import com.ruoyi.asset.constant.RfidBindStatus;
import com.ruoyi.asset.domain.AmsAsset;
import com.ruoyi.asset.domain.AmsAssetCategory;
import com.ruoyi.asset.domain.AmsAssetLifecycleLog;
import com.ruoyi.asset.domain.AmsAssetLocation;
import com.ruoyi.asset.domain.AmsInventoryTask;
import com.ruoyi.asset.domain.AmsInventoryTaskItem;
@ -40,7 +37,6 @@ import com.ruoyi.asset.mapper.AmsRfidTagMapper;
import com.ruoyi.asset.service.IAmsAssetCategoryService;
import com.ruoyi.asset.service.IAmsAssetLocationService;
import com.ruoyi.asset.service.IAmsWarehouseService;
import com.ruoyi.asset.service.IAssetLifecycleService;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.system.service.ISysCodeRuleService;
import org.junit.jupiter.api.Test;
@ -74,9 +70,6 @@ class AmsInventoryTaskServiceImplTest
@Mock
private IAmsAssetCategoryService amsAssetCategoryService;
@Mock
private IAssetLifecycleService assetLifecycleService;
@InjectMocks
private AmsInventoryTaskServiceImpl service;
@ -330,56 +323,40 @@ class AmsInventoryTaskServiceImplTest
verify(amsInventoryTaskMapper, never()).insertAmsInventoryTaskSurplus(any(AmsInventoryTaskSurplus.class));
}
/** 确认结果只写盘点履历,不调用资产台账状态更新。 */
/** 确认结果只完成任务,不调用资产台账状态更新,也不写资产履历。 */
@Test
void confirmResultShouldWriteLifecycleWithoutUpdatingAssetLedger()
void confirmResultShouldCompleteWithoutUpdatingAssetLedger()
{
AmsInventoryTask current = buildPersistedTask(InventoryTaskStatus.PENDING_RESULT_CONFIRM);
current.setAmsInventoryTaskItemList(Collections.singletonList(buildPersistedItemWithResult()));
when(amsInventoryTaskMapper.selectAmsInventoryTaskByTaskIdForUpdate(100L)).thenReturn(current);
when(amsAssetMapper.selectAmsAssetByAssetIdForUpdate(1L)).thenReturn(buildAsset());
when(amsInventoryTaskMapper.updateAmsInventoryTaskStatus(any(AmsInventoryTask.class))).thenReturn(1);
assertEquals(1, service.confirmResult(100L, 9L, "管理员", "admin"));
ArgumentCaptor<AmsAssetLifecycleLog> lifecycleCaptor =
ArgumentCaptor.forClass(AmsAssetLifecycleLog.class);
verify(assetLifecycleService).recordLifecycle(any(AmsAsset.class), any(AmsAsset.class),
lifecycleCaptor.capture());
AmsAssetLifecycleLog lifecycleLog = lifecycleCaptor.getValue();
assertEquals(AssetLifecycleBusinessType.INVENTORY, lifecycleLog.getBusinessType());
assertEquals(100L, lifecycleLog.getSourceOrderId());
assertEquals(500L, lifecycleLog.getSourceItemId());
assertEquals(9L, lifecycleLog.getOperateUserId());
assertTrue(lifecycleLog.getRemark().contains(InventoryResult.NORMAL));
verify(amsAssetMapper, never()).selectAmsAssetByAssetIdForUpdate(1L);
verify(amsAssetMapper, never()).updateAssetForTransition(any(AmsAsset.class));
assertEquals(InventoryTaskStatus.INVENTORY_DONE, current.getTaskStatus());
assertNotNull(current.getFinishTime());
}
/** 确认结果时,账内盘盈写盘点履历并把盘盈明细置为已确认。 */
/** 确认结果时,只把盘盈明细置为已确认,不写资产履历。 */
@Test
void confirmResultShouldWriteLifecycleForKnownSurplus()
void confirmResultShouldConfirmKnownSurplusWithoutLifecycle()
{
AmsInventoryTask current = buildPersistedTask(InventoryTaskStatus.PENDING_RESULT_CONFIRM);
current.setAmsInventoryTaskItemList(Collections.singletonList(buildPersistedItemWithResult()));
current.setAmsInventoryTaskSurplusList(Collections.singletonList(buildPersistedKnownSurplus()));
when(amsInventoryTaskMapper.selectAmsInventoryTaskByTaskIdForUpdate(100L)).thenReturn(current);
when(amsAssetMapper.selectAmsAssetByAssetIdForUpdate(1L)).thenReturn(buildAsset());
when(amsAssetMapper.selectAmsAssetByAssetIdForUpdate(2L)).thenReturn(buildOutOfScopeAsset());
when(amsInventoryTaskMapper.updateAmsInventoryTaskStatus(any(AmsInventoryTask.class))).thenReturn(1);
when(amsInventoryTaskMapper.confirmAmsInventoryTaskSurplusByTaskId(100L,
InventorySurplusStatus.CONFIRMED, "admin")).thenReturn(1);
assertEquals(1, service.confirmResult(100L, 9L, "管理员", "admin"));
ArgumentCaptor<AmsAssetLifecycleLog> lifecycleCaptor =
ArgumentCaptor.forClass(AmsAssetLifecycleLog.class);
verify(assetLifecycleService, times(2)).recordLifecycle(any(AmsAsset.class), any(AmsAsset.class),
lifecycleCaptor.capture());
assertTrue(lifecycleCaptor.getAllValues().stream()
.anyMatch(log -> Long.valueOf(700L).equals(log.getSourceItemId())
&& log.getRemark().contains("盘盈类型")));
verify(amsAssetMapper, never()).selectAmsAssetByAssetIdForUpdate(1L);
verify(amsAssetMapper, never()).selectAmsAssetByAssetIdForUpdate(2L);
verify(amsAssetMapper, never()).updateAssetForTransition(any(AmsAsset.class));
verify(amsInventoryTaskMapper).confirmAmsInventoryTaskSurplusByTaskId(100L,
InventorySurplusStatus.CONFIRMED, "admin");
}
@ -468,20 +445,6 @@ class AmsInventoryTaskServiceImplTest
return item;
}
private AmsAsset buildAsset()
{
AmsAsset asset = new AmsAsset();
asset.setAssetId(1L);
asset.setAssetCode("A001");
asset.setAssetName("资产A");
asset.setAssetStatus(AssetStatus.IN_STOCK);
asset.setWarehouseId(1L);
asset.setWarehouseName("一号仓");
asset.setLocationId(10L);
asset.setLocationName("一号仓A区");
return asset;
}
private AmsAsset buildOutOfScopeAsset()
{
AmsAsset asset = new AmsAsset();

Loading…
Cancel
Save