|
|
|
|
@ -3,16 +3,10 @@ package com.ruoyi.asset.service.impl;
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Objects;
|
|
|
|
|
import com.ruoyi.asset.constant.AssetStatus;
|
|
|
|
|
import com.ruoyi.asset.domain.AmsAssetCategory;
|
|
|
|
|
import com.ruoyi.asset.domain.AmsAssetLocation;
|
|
|
|
|
import com.ruoyi.asset.domain.AmsWarehouse;
|
|
|
|
|
import com.ruoyi.asset.service.IAmsAssetCategoryService;
|
|
|
|
|
import com.ruoyi.asset.service.IAmsAssetLocationService;
|
|
|
|
|
import com.ruoyi.asset.service.IAmsWarehouseService;
|
|
|
|
|
import com.ruoyi.common.constant.UserConstants;
|
|
|
|
|
import com.ruoyi.common.core.domain.entity.SysDept;
|
|
|
|
|
import com.ruoyi.common.core.domain.entity.SysDictData;
|
|
|
|
|
import com.ruoyi.common.core.domain.entity.SysUser;
|
|
|
|
|
import com.ruoyi.common.exception.ServiceException;
|
|
|
|
|
@ -24,7 +18,6 @@ import com.ruoyi.asset.mapper.AmsAssetMapper;
|
|
|
|
|
import com.ruoyi.asset.domain.AmsAsset;
|
|
|
|
|
import com.ruoyi.asset.service.IAmsAssetService;
|
|
|
|
|
import com.ruoyi.common.core.text.Convert;
|
|
|
|
|
import com.ruoyi.system.service.ISysDeptService;
|
|
|
|
|
import com.ruoyi.system.service.ISysDictDataService;
|
|
|
|
|
import com.ruoyi.system.service.ISysUserService;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
@ -50,15 +43,6 @@ public class AmsAssetServiceImpl implements IAmsAssetService
|
|
|
|
|
@Autowired
|
|
|
|
|
private IAmsAssetCategoryService amsAssetCategoryService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private IAmsWarehouseService amsWarehouseService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private IAmsAssetLocationService amsAssetLocationService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private ISysDeptService sysDeptService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private ISysUserService sysUserService;
|
|
|
|
|
|
|
|
|
|
@ -181,11 +165,12 @@ public class AmsAssetServiceImpl implements IAmsAssetService
|
|
|
|
|
{
|
|
|
|
|
throw new ServiceException("资产编码已存在");
|
|
|
|
|
}
|
|
|
|
|
// 建档只产生在库资产,使用归属必须由后续领用业务写入。
|
|
|
|
|
amsAsset.setAssetStatus(AssetStatus.IN_STOCK);
|
|
|
|
|
// 普通建档只表示实物已登记,仓位和使用归属必须由首次入库及后续流转业务写入。
|
|
|
|
|
amsAsset.setAssetStatus(AssetStatus.PENDING_INBOUND);
|
|
|
|
|
clearWarehouseLocation(amsAsset);
|
|
|
|
|
clearUseOwnership(amsAsset);
|
|
|
|
|
clearRfidBinding(amsAsset);
|
|
|
|
|
fillAssetForSave(amsAsset);
|
|
|
|
|
fillBasicAssetForSave(amsAsset);
|
|
|
|
|
amsAsset.setDelFlag(DEL_FLAG_NORMAL);
|
|
|
|
|
amsAsset.setCreateTime(DateUtils.getNowDate());
|
|
|
|
|
return amsAssetMapper.insertAmsAsset(amsAsset);
|
|
|
|
|
@ -209,29 +194,10 @@ public class AmsAssetServiceImpl implements IAmsAssetService
|
|
|
|
|
{
|
|
|
|
|
throw new ServiceException("资产编码已存在");
|
|
|
|
|
}
|
|
|
|
|
// 检查并拒绝有业务引用的资产修改归属字段,归属只能通过流转服务变更
|
|
|
|
|
int referenceCount = amsAssetMapper.countAssetReferences(current.getAssetId());
|
|
|
|
|
if (referenceCount > 0 && ownershipIdentityChanged(current, amsAsset))
|
|
|
|
|
{
|
|
|
|
|
throw new ServiceException("资产已有业务引用或履历,仓库、位置、使用人和部门只能通过业务流转修改");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 普通编辑不能改变状态或 RFID 当前关系,避免绕过公共业务服务。
|
|
|
|
|
// 普通编辑不能改变状态、当前归属或 RFID 当前关系,避免绕过公共业务服务。
|
|
|
|
|
preserveControlledFields(amsAsset, current);
|
|
|
|
|
if (referenceCount > 0)
|
|
|
|
|
{
|
|
|
|
|
// 有业务引用的资产:保留当前归属快照,仅允许修改基础信息和类别
|
|
|
|
|
fillReferencedAssetForSave(amsAsset, current);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// 未进入业务流程的资产:在库状态下清除使用归属,然后执行完整快照回填
|
|
|
|
|
if (StringUtils.equals(AssetStatus.IN_STOCK, current.getAssetStatus()))
|
|
|
|
|
{
|
|
|
|
|
clearUseOwnership(amsAsset);
|
|
|
|
|
}
|
|
|
|
|
fillAssetForSave(amsAsset);
|
|
|
|
|
}
|
|
|
|
|
preserveOwnershipFields(amsAsset, current);
|
|
|
|
|
fillBasicAssetForSave(amsAsset);
|
|
|
|
|
amsAsset.setUpdateTime(DateUtils.getNowDate());
|
|
|
|
|
return amsAssetMapper.updateAmsAsset(amsAsset);
|
|
|
|
|
}
|
|
|
|
|
@ -286,27 +252,10 @@ public class AmsAssetServiceImpl implements IAmsAssetService
|
|
|
|
|
/**
|
|
|
|
|
* 页面和导入只传业务选择值,快照字段统一在服务层回填,避免前端伪造名称造成台账不一致。
|
|
|
|
|
*/
|
|
|
|
|
private void fillAssetForSave(AmsAsset amsAsset)
|
|
|
|
|
private void fillBasicAssetForSave(AmsAsset amsAsset)
|
|
|
|
|
{
|
|
|
|
|
validateBasicFields(amsAsset);
|
|
|
|
|
fillCategorySnapshot(amsAsset);
|
|
|
|
|
fillWarehouseSnapshot(amsAsset);
|
|
|
|
|
fillLocationSnapshot(amsAsset);
|
|
|
|
|
fillUseDeptSnapshot(amsAsset);
|
|
|
|
|
fillUserSnapshot(amsAsset);
|
|
|
|
|
fillCustodianSnapshot(amsAsset);
|
|
|
|
|
validateAssetStatus(amsAsset);
|
|
|
|
|
validateNumberFields(amsAsset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 已进入业务流程的资产保留当前归属快照,避免历史主数据停用后阻断基础信息维护。
|
|
|
|
|
*/
|
|
|
|
|
private void fillReferencedAssetForSave(AmsAsset amsAsset, AmsAsset current)
|
|
|
|
|
{
|
|
|
|
|
validateBasicFields(amsAsset);
|
|
|
|
|
fillCategorySnapshot(amsAsset);
|
|
|
|
|
preserveOwnershipFields(amsAsset, current);
|
|
|
|
|
fillCustodianSnapshot(amsAsset);
|
|
|
|
|
validateAssetStatus(amsAsset);
|
|
|
|
|
validateNumberFields(amsAsset);
|
|
|
|
|
@ -360,96 +309,6 @@ public class AmsAssetServiceImpl implements IAmsAssetService
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void fillWarehouseSnapshot(AmsAsset amsAsset)
|
|
|
|
|
{
|
|
|
|
|
AmsWarehouse warehouse = null;
|
|
|
|
|
if (StringUtils.isNotNull(amsAsset.getWarehouseId()))
|
|
|
|
|
{
|
|
|
|
|
warehouse = amsWarehouseService.selectAmsWarehouseByWarehouseId(amsAsset.getWarehouseId());
|
|
|
|
|
}
|
|
|
|
|
else if (StringUtils.isNotEmpty(amsAsset.getWarehouseCode()))
|
|
|
|
|
{
|
|
|
|
|
AmsWarehouse query = new AmsWarehouse();
|
|
|
|
|
query.setWarehouseCode(amsAsset.getWarehouseCode());
|
|
|
|
|
List<AmsWarehouse> warehouseList = amsWarehouseService.selectAmsWarehouseList(query);
|
|
|
|
|
warehouse = warehouseList == null || warehouseList.isEmpty() ? null : warehouseList.get(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isNull(warehouse))
|
|
|
|
|
{
|
|
|
|
|
throw new ServiceException("所属仓库不能为空或不存在");
|
|
|
|
|
}
|
|
|
|
|
if (!StringUtils.equals(ENABLED_YES, warehouse.getEnabled()))
|
|
|
|
|
{
|
|
|
|
|
throw new ServiceException("所属仓库已停用");
|
|
|
|
|
}
|
|
|
|
|
amsAsset.setWarehouseId(warehouse.getWarehouseId());
|
|
|
|
|
amsAsset.setWarehouseCode(warehouse.getWarehouseCode());
|
|
|
|
|
amsAsset.setWarehouseName(warehouse.getWarehouseName());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void fillLocationSnapshot(AmsAsset amsAsset)
|
|
|
|
|
{
|
|
|
|
|
AmsAssetLocation location = null;
|
|
|
|
|
if (StringUtils.isNotNull(amsAsset.getLocationId()))
|
|
|
|
|
{
|
|
|
|
|
location = amsAssetLocationService.selectAmsAssetLocationByLocationId(amsAsset.getLocationId());
|
|
|
|
|
}
|
|
|
|
|
else if (StringUtils.isNotEmpty(amsAsset.getLocationCode()))
|
|
|
|
|
{
|
|
|
|
|
AmsAssetLocation query = new AmsAssetLocation();
|
|
|
|
|
query.setLocationCode(amsAsset.getLocationCode());
|
|
|
|
|
List<AmsAssetLocation> locationList = amsAssetLocationService.selectAmsAssetLocationList(query);
|
|
|
|
|
location = locationList == null || locationList.isEmpty() ? null : locationList.get(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isNull(location))
|
|
|
|
|
{
|
|
|
|
|
throw new ServiceException("存放位置不能为空或不存在");
|
|
|
|
|
}
|
|
|
|
|
if (!StringUtils.equals(ENABLED_YES, location.getEnabled()))
|
|
|
|
|
{
|
|
|
|
|
throw new ServiceException("存放位置已停用");
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isNotNull(amsAsset.getWarehouseId())
|
|
|
|
|
&& !amsAsset.getWarehouseId().equals(location.getWarehouseId()))
|
|
|
|
|
{
|
|
|
|
|
throw new ServiceException("存放位置不属于所选仓库");
|
|
|
|
|
}
|
|
|
|
|
amsAsset.setLocationId(location.getLocationId());
|
|
|
|
|
amsAsset.setLocationCode(location.getLocationCode());
|
|
|
|
|
amsAsset.setLocationName(location.getLocationName());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void fillUseDeptSnapshot(AmsAsset amsAsset)
|
|
|
|
|
{
|
|
|
|
|
if (StringUtils.isNull(amsAsset.getUseDeptId()))
|
|
|
|
|
{
|
|
|
|
|
amsAsset.setUseDeptName(null);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
SysDept query = new SysDept();
|
|
|
|
|
query.setDeptId(amsAsset.getUseDeptId());
|
|
|
|
|
query.setStatus(UserConstants.DEPT_NORMAL);
|
|
|
|
|
List<SysDept> deptList = sysDeptService.selectDeptList(query);
|
|
|
|
|
if (deptList == null || deptList.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
throw new ServiceException("使用部门不存在或已停用");
|
|
|
|
|
}
|
|
|
|
|
amsAsset.setUseDeptName(deptList.get(0).getDeptName());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void fillUserSnapshot(AmsAsset amsAsset)
|
|
|
|
|
{
|
|
|
|
|
if (StringUtils.isNull(amsAsset.getUseUserId()))
|
|
|
|
|
{
|
|
|
|
|
amsAsset.setUseUserName(null);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
SysUser user = selectNormalUser(amsAsset.getUseUserId(), "使用人");
|
|
|
|
|
amsAsset.setUseUserName(user.getUserName());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void fillCustodianSnapshot(AmsAsset amsAsset)
|
|
|
|
|
{
|
|
|
|
|
if (StringUtils.isNull(amsAsset.getCustodianId()))
|
|
|
|
|
@ -507,15 +366,6 @@ public class AmsAssetServiceImpl implements IAmsAssetService
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 判断编辑提交的归属字段是否与当前数据库值不同(任一不同即视为变更) */
|
|
|
|
|
private boolean ownershipIdentityChanged(AmsAsset current, AmsAsset incoming)
|
|
|
|
|
{
|
|
|
|
|
return !Objects.equals(current.getWarehouseId(), incoming.getWarehouseId())
|
|
|
|
|
|| !Objects.equals(current.getLocationId(), incoming.getLocationId())
|
|
|
|
|
|| !Objects.equals(current.getUseDeptId(), incoming.getUseDeptId())
|
|
|
|
|
|| !Objects.equals(current.getUseUserId(), incoming.getUseUserId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 防篡改:将状态和 RFID 关系强制恢复为数据库当前值,阻止前端直接修改这些受控字段 */
|
|
|
|
|
private void preserveControlledFields(AmsAsset incoming, AmsAsset current)
|
|
|
|
|
{
|
|
|
|
|
@ -525,7 +375,7 @@ public class AmsAssetServiceImpl implements IAmsAssetService
|
|
|
|
|
incoming.setEpcCode(current.getEpcCode());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 有业务引用时保留当前归属快照不变,避免历史主数据停用后阻断基础信息的日常维护 */
|
|
|
|
|
/** 普通编辑始终保留当前归属快照,归属只能通过业务流转服务修改。 */
|
|
|
|
|
private void preserveOwnershipFields(AmsAsset incoming, AmsAsset current)
|
|
|
|
|
{
|
|
|
|
|
incoming.setWarehouseId(current.getWarehouseId());
|
|
|
|
|
@ -540,7 +390,18 @@ public class AmsAssetServiceImpl implements IAmsAssetService
|
|
|
|
|
incoming.setUseUserName(current.getUseUserName());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 清除使用归属信息(建档和在库编辑时调用,在库资产不应有使用人信息) */
|
|
|
|
|
/** 清除仓库和位置,待入库资产在首次确认入库前不能拥有仓位。 */
|
|
|
|
|
private void clearWarehouseLocation(AmsAsset asset)
|
|
|
|
|
{
|
|
|
|
|
asset.setWarehouseId(null);
|
|
|
|
|
asset.setWarehouseCode(null);
|
|
|
|
|
asset.setWarehouseName(null);
|
|
|
|
|
asset.setLocationId(null);
|
|
|
|
|
asset.setLocationCode(null);
|
|
|
|
|
asset.setLocationName(null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 清除使用归属信息,待入库和在库资产均不应有使用归属。 */
|
|
|
|
|
private void clearUseOwnership(AmsAsset asset)
|
|
|
|
|
{
|
|
|
|
|
asset.setUseDeptId(null);
|
|
|
|
|
|