feat(wms): 入库验证库存是否存在,更新或新增库存

dev
wanghao 2 weeks ago
parent 2d5c3f5e3f
commit 020a7daa1f

@ -51,6 +51,7 @@ public class WmsInventoryDetails extends TenantEntity {
*
*/
private Double inventoryAmount;
private Double startInventoryAmount;
/**
*

@ -50,7 +50,7 @@ public class WmsInventoryDetailsBo extends BaseEntity {
*
*/
private Double inventoryAmount;
private Double startInventoryAmount;
/**
*
*/

@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Param;
import org.dromara.wms.domain.WmsInventoryLedger;
import org.dromara.wms.domain.vo.WmsInventoryLedgerVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.springframework.stereotype.Repository;
/**
* Mapper
@ -15,6 +16,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
* @author Yinq
* @date 2025-12-02
*/
@Repository
public interface WmsInventoryLedgerMapper extends BaseMapperPlus<WmsInventoryLedger, WmsInventoryLedgerVo> {
/**

@ -67,7 +67,8 @@ public interface IWmsInventoryDetailsService {
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
void insertList(List<WmsInventoryDetails> inventoryDetailsList);
TableDataInfo<WmsInventoryDetailsVo> listCount(WmsInventoryDetailsBo bo, PageQuery pageQuery);
WmsInventoryDetails queryInventory(WmsInventoryDetailsBo inventory);
}

@ -14,13 +14,15 @@ import org.dromara.system.api.RemoteCodeRuleService;
import org.dromara.wms.domain.WmsInStockBill;
import org.dromara.wms.domain.WmsInStockDetails;
import org.dromara.wms.domain.WmsInventoryDetails;
import org.dromara.wms.domain.WmsInventoryLedger;
import org.dromara.wms.domain.bo.WmsInStockBillBo;
import org.dromara.wms.domain.bo.WmsInventoryDetailsBo;
import org.dromara.wms.domain.vo.WmsInStockBillVo;
import org.dromara.wms.mapper.WmsInStockBillMapper;
import org.dromara.wms.mapper.WmsInStockDetailsMapper;
import org.dromara.wms.mapper.WmsInventoryLedgerMapper;
import org.dromara.wms.service.IWmsInStockBillService;
import org.dromara.wms.service.IWmsInventoryDetailsService;
import org.dromara.wms.service.IWmsWarehouseInfoService;
import org.dromara.workflow.api.RemoteWorkflowService;
import org.dromara.workflow.api.domain.RemoteStartProcess;
import org.dromara.workflow.api.event.ProcessEvent;
@ -42,7 +44,8 @@ public class WmsInStockBillServiceImpl implements IWmsInStockBillService {
private final WmsInStockBillMapper baseMapper;
private final WmsInStockDetailsMapper wmsInStockDetailsMapper;
private final IWmsInventoryDetailsService inventoryService;
private final IWmsWarehouseInfoService warehouseService;
// private final IWmsWarehouseInfoService warehouseService;
private final WmsInventoryLedgerMapper wmsInventoryLedgerMapper;
@DubboReference
private RemoteCodeRuleService remoteCodeRuleService;
@DubboReference(timeout = 30000)//超时时间
@ -110,31 +113,57 @@ public class WmsInStockBillServiceImpl implements IWmsInStockBillService {
@Override
public Boolean insertByBo(WmsInStockBillBo bo) {
WmsInStockBill add = MapstructUtils.convert(bo, WmsInStockBill.class);
add.setInStockCode(remoteCodeRuleService.selectCodeRuleCode("1005"));
String inStockType = add.getInStockType();
add.setInStockCode(remoteCodeRuleService.selectCodeRuleCode("1005"));// 物料入库编码
add.setInStockBillStatus("3");
boolean flag = baseMapper.insert(add) > 0;
boolean flag = baseMapper.insert(add) > 0;//插入主表
if (flag) {
Long inStockBillId = add.getInStockBillId();
List<WmsInStockDetails> inStockDetailsList = bo.getInStockDetailsList();
List<WmsInventoryDetails> inventoryDetailsList = new ArrayList<>(inStockDetailsList.size());//库存集合
List<WmsInventoryLedger> wmsInventoryLedgers = new ArrayList<>(inStockDetailsList.size());//库存集合
Long projectId = bo.getProjectId();// 项目ID
inStockDetailsList.forEach(item -> {
item.setInStockBillId(inStockBillId); // 设置入库单明细的入库单ID
item.setProjectId(projectId); // 关联项目
WmsInventoryDetails inventory = new WmsInventoryDetails();
inventory.setWarehouseId(item.getWarehouseId()); // 关联仓库
inventory.setProjectId(projectId); // 关联项目
inventory.setBatchNumber(item.getBatchNumber()); // 关联批次号
inventory.setMaterielId(item.getMaterialId()); // 关联物料
inventory.setUnitPrice(item.getUnitPrice());
Double inStockAmount = item.getInStockAmount();
inventory.setInventoryAmount(inStockAmount);
inventory.setStartInventoryAmount(inStockAmount); // 初始库存数量
inventoryDetailsList.add(inventory);
Double inventoryTableAmount = 0.0;// 库存表数量
// 构建库存明细
WmsInventoryDetailsBo inventory = new WmsInventoryDetailsBo();
inventory.setWarehouseId(item.getWarehouseId());
inventory.setProjectId(projectId);
inventory.setBatchNumber(item.getBatchNumber());
inventory.setMaterielId(item.getMaterialId());
inventory.setUnitPrice(item.getUnitPrice());
// 查询相同项目 相同仓库 相同批次 相同单价的物料
WmsInventoryDetails queryInventory = inventoryService.queryInventory(inventory);
if (queryInventory != null) {
WmsInventoryDetailsBo inventoryUpdate = new WmsInventoryDetailsBo();
inventoryUpdate.setInventoryDetailsId(queryInventory.getInventoryDetailsId());
inventoryTableAmount = queryInventory.getInventoryAmount() ;
inventoryUpdate.setInventoryAmount(inventoryTableAmount+ inStockAmount);
inventoryService.updateByBo(inventoryUpdate); // 更新库存数量
} else {
inventory.setUnitName(item.getUnitName());
inventory.setInventoryAmount(inStockAmount);
inventory.setStartInventoryAmount(inStockAmount); // 初始库存数量
inventoryService.insertByBo(inventory);
}
//库存变动
WmsInventoryLedger wmsInventoryLedger = new WmsInventoryLedger();
wmsInventoryLedger.setWarehouseId(item.getWarehouseId());
wmsInventoryLedger.setBatchNumber(item.getBatchNumber());
wmsInventoryLedger.setMaterielId(item.getMaterialId());
wmsInventoryLedger.setChangeType(inStockType);//变动类型
wmsInventoryLedger.setLedgerState("1");
wmsInventoryLedger.setChangeAmount(inStockAmount);
wmsInventoryLedger.setInventoryAmount(inventoryTableAmount);
wmsInventoryLedgers.add(wmsInventoryLedger);
});
wmsInStockDetailsMapper.insert(inStockDetailsList); //插入子表
inventoryService.insertList(inventoryDetailsList); //插入库存
wmsInventoryLedgerMapper.insert(wmsInventoryLedgers);
}
return flag;
}

@ -127,7 +127,6 @@ public class WmsInventoryDetailsServiceImpl implements IWmsInventoryDetailsServi
@Override
public Boolean insertByBo(WmsInventoryDetailsBo bo) {
WmsInventoryDetails add = MapstructUtils.convert(bo, WmsInventoryDetails.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setInventoryDetailsId(add.getInventoryDetailsId());
@ -144,16 +143,9 @@ public class WmsInventoryDetailsServiceImpl implements IWmsInventoryDetailsServi
@Override
public Boolean updateByBo(WmsInventoryDetailsBo bo) {
WmsInventoryDetails update = MapstructUtils.convert(bo, WmsInventoryDetails.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
*
*/
private void validEntityBeforeSave(WmsInventoryDetails entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
*
@ -164,14 +156,22 @@ public class WmsInventoryDetailsServiceImpl implements IWmsInventoryDetailsServi
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
@Override
public void insertList(List<WmsInventoryDetails> inventoryDetailsList) {
baseMapper.insert(inventoryDetailsList);
public WmsInventoryDetails queryInventory(WmsInventoryDetailsBo bo) {
MPJLambdaWrapper<WmsInventoryDetails> lqw = JoinWrappers.lambda(WmsInventoryDetails.class)
.selectAll(WmsInventoryDetails.class)
.eq(StringUtils.isNotBlank(bo.getLocationCode()), WmsInventoryDetails::getLocationCode, bo.getLocationCode())
.eq(bo.getWarehouseId() != null, WmsInventoryDetails::getWarehouseId, bo.getWarehouseId())
.eq(bo.getMaterielId() != null, WmsInventoryDetails::getMaterielId, bo.getMaterielId())
.eq(bo.getProjectId() != null, WmsInventoryDetails::getProjectId, bo.getProjectId())
.eq(StringUtils.isNotBlank(bo.getBatchNumber()), WmsInventoryDetails::getBatchNumber, bo.getBatchNumber())
.eq(bo.getUnitPrice() != null, WmsInventoryDetails::getUnitPrice, bo.getUnitPrice());
return baseMapper.selectOne(lqw);
}
}

@ -10,14 +10,18 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.api.RemoteCodeRuleService;
import org.dromara.wms.domain.WmsInventoryDetails;
import org.dromara.wms.domain.WmsOutStockBill;
import org.dromara.wms.domain.WmsOutStockDetails;
import org.dromara.wms.domain.bo.WmsOutStockBillBo;
import org.dromara.wms.domain.vo.WmsInventoryDetailsVo;
import org.dromara.wms.domain.vo.WmsOutStockBillVo;
import org.dromara.wms.mapper.WmsInventoryDetailsMapper;
import org.dromara.wms.mapper.WmsOutStockBillMapper;
import org.dromara.wms.mapper.WmsOutStockDetailsMapper;
import org.dromara.wms.service.IWmsOutStockBillService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection;
import java.util.List;
@ -37,6 +41,7 @@ public class WmsOutStockBillServiceImpl implements IWmsOutStockBillService {
private final WmsOutStockDetailsMapper wmsOutStockDetailsMapper;
@DubboReference
private RemoteCodeRuleService remoteCodeRuleService;
private final WmsInventoryDetailsMapper wmsInventoryDetailsMapper;
/**
*
@ -98,6 +103,7 @@ public class WmsOutStockBillServiceImpl implements IWmsOutStockBillService {
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(WmsOutStockBillBo bo) {
WmsOutStockBill add = MapstructUtils.convert(bo, WmsOutStockBill.class);
add.setOutStockCode(remoteCodeRuleService.selectCodeRuleCode("1006"));
@ -107,7 +113,15 @@ public class WmsOutStockBillServiceImpl implements IWmsOutStockBillService {
Long outStockBillId = add.getOutStockBillId();
List<WmsOutStockDetails> outStockDetailsList = bo.getOutStockDetailsList();
outStockDetailsList.forEach(item -> {
item.setOutStockBillId(outStockBillId);
// 从出库明细中获取库存ID
Long inventoryId = item.getInventoryDetailsId();
WmsInventoryDetails inventory = wmsInventoryDetailsMapper.selectById(inventoryId);
if (inventory.getInventoryAmount()<item.getOutStockAmount()) {
throw new IllegalArgumentException("库存数量不足");
}
});
//插入出库明细
wmsOutStockDetailsMapper.insert(outStockDetailsList);

Loading…
Cancel
Save