feat(wms): 完成质检并更新库存(质检入库)

- 在 IWmsInstockRecordService 中添加 completeQualityCheck 方法
- 在 IWmsInventoryService 中添加 queryByBatchAndLocation 方法
- 修改 WmsInstockDetailServiceImpl 中的 updateByBo 方法
- 实现 WmsInstockRecordServiceImpl 中的 completeQualityCheck 方法
- 实现 WmsInventoryServiceImpl 中的 queryByBatchAndLocation 方法
- 调整 WmsOutstockRecordBo 中的数据类型
master
zangch@mesnac.com 4 days ago
parent 8a6be901d1
commit 9dbd6ed1c2

@ -1,15 +1,13 @@
package org.dromara.wms.domain.bo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ibm.icu.math.BigDecimal;
import org.dromara.wms.domain.WmsOutstockRecord;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.wms.domain.WmsOutstockRecord;
import java.math.BigDecimal;
/**
* wms_outstock_record
@ -71,9 +69,9 @@ public class WmsOutstockRecordBo extends BaseEntity {
/**
* erp
*/
private java.math.BigDecimal erpSynchronousQty;
private BigDecimal erpSynchronousQty;
private java.math.BigDecimal returnQty;
private BigDecimal returnQty;
private String returnFlag;
private String returnLocationCode;

@ -66,4 +66,11 @@ public interface IWmsInstockRecordService {
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
*
* @param instockCode
* @return
*/
Boolean completeQualityCheck(String instockCode);
}

@ -81,4 +81,12 @@ public interface IWmsInventoryService {
int deletePlanList(ArrayList<Long> ids);
TableDataInfo<WmsInventoryVo> listInventoryAlarm(WmsInventoryBo bo, PageQuery pageQuery);
/**
*
* @param batchCode
* @param locationCode
* @return VO
*/
WmsInventoryVo queryByBatchAndLocation(String batchCode, String locationCode);
}

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
@ -197,7 +198,6 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService {
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(WmsInstockDetailBo bo) {
String username = LoginHelper.getUsername();
// 如果 splitPackageCount 为空,执行常规更新
if (bo.getSplitPackageCount() == null) {
@ -208,13 +208,13 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService {
// 获取当前明细
WmsInstockDetail detail = baseMapper.selectById(bo.getInstockDetailId());
if (detail == null) {
return false;
throw new ServiceException("入库单-物料不存在");
}
BigDecimal printed = detail.getPrintedNum() != null ? detail.getPrintedNum() : BigDecimal.ZERO;
BigDecimal remaining = detail.getInstockQty().subtract(printed);
if (remaining.compareTo(BigDecimal.ZERO) <= 0) {
return false; // 无剩余
if (remaining.compareTo(BigDecimal.ZERO) <= 0) {// 无剩余
throw new ServiceException("无剩余数量可打印");
}
int splitInt = bo.getSplitPackageCount() != null ? bo.getSplitPackageCount() : 1;
@ -230,8 +230,8 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService {
if (splitInt > 1) {
// 分包逻辑
if (remaining.compareTo(split) < 0 || remaining.remainder(split).compareTo(BigDecimal.ZERO) != 0) {
return false; // 无法平均分包
if (remaining.compareTo(split) < 0 || remaining.remainder(split).compareTo(BigDecimal.ZERO) != 0) {// 无法平均分包
throw new ServiceException("无法平均分包");
}
BigDecimal per = remaining.divide(split, 0, RoundingMode.DOWN);
@ -244,7 +244,6 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService {
print.setBatchCode(batchCode);
print.setApportionQty(per);
print.setMaterialQty(1L); // 每个包打印1份使用Long类型
print.setCreateBy(username);
wmsInstockPrintService.insertWmsInstockPrint(print);
@ -257,15 +256,13 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService {
}
copies = BigDecimal.valueOf(copiesInt);
String order = baseOrder;
String batchCode = bo.getInstockCode() + bo.getMaterialCode() + order;
String batchCode = bo.getInstockCode() + bo.getMaterialCode() + baseOrder;
WmsInstockPrint print = new WmsInstockPrint();
BeanUtils.copyProperties(bo, print);
print.setBatchCode(batchCode);
print.setApportionQty(remaining);
print.setMaterialQty(copies.longValue()); // 转换为Long
print.setCreateBy(username);
wmsInstockPrintService.insertWmsInstockPrint(print);

@ -1,27 +1,35 @@
package org.dromara.wms.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils;
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.common.satoken.utils.LoginHelper;
import org.dromara.wms.domain.BaseMaterialCategory;
import org.dromara.wms.domain.WmsBaseWarehouse;
import org.springframework.stereotype.Service;
import org.dromara.wms.domain.bo.WmsInstockRecordBo;
import org.dromara.wms.domain.vo.WmsInstockRecordVo;
import org.dromara.wms.domain.WmsInstockRecord;
import org.dromara.wms.domain.bo.WmsInstockOrderBo;
import org.dromara.wms.domain.bo.WmsInstockPrintBo;
import org.dromara.wms.domain.bo.WmsInstockRecordBo;
import org.dromara.wms.domain.bo.WmsInventoryBo;
import org.dromara.wms.domain.vo.WmsInstockOrderVo;
import org.dromara.wms.domain.vo.WmsInstockPrintVo;
import org.dromara.wms.domain.vo.WmsInstockRecordVo;
import org.dromara.wms.domain.vo.WmsInventoryVo;
import org.dromara.wms.mapper.WmsInstockOrderMapper;
import org.dromara.wms.mapper.WmsInstockRecordMapper;
import org.dromara.wms.service.IWmsInstockRecordService;
import org.dromara.wms.service.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* Service
@ -34,6 +42,11 @@ import java.util.Collection;
public class WmsInstockRecordServiceImpl implements IWmsInstockRecordService {
private final WmsInstockRecordMapper baseMapper;
private final IWmsInventoryService inventoryService;
private final IWmsInstockOrderService instockOrderService;
private final WmsInstockOrderMapper instockOrderMapper;
private final IWmsInstockDetailService instockDetailService;
private final IWmsInstockPrintService instockPrintService;
/**
*
@ -149,4 +162,80 @@ public class WmsInstockRecordServiceImpl implements IWmsInstockRecordService {
}
return baseMapper.deleteByIds(ids) > 0;
}
/**
*
*
* @param instockCode
* @return Boolean falsetrue
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean completeQualityCheck(String instockCode) {
// 查询入库单信息
WmsInstockOrderBo orderBo = new WmsInstockOrderBo();
orderBo.setInstockCode(instockCode);
List<WmsInstockOrderVo> orders = instockOrderService.queryList(orderBo);
if (orders.isEmpty()) {
throw new ServiceException("入库单不存在 " + instockCode);
}
WmsInstockOrderVo order = orders.get(0);
// 查询入库打印记录(这些是去质检的对象)
WmsInstockPrintBo printBo = new WmsInstockPrintBo();
printBo.setInstockCode(instockCode);
List<WmsInstockPrintVo> prints = instockPrintService.queryList(printBo);
if (prints.isEmpty()) {
throw new ServiceException("无打印记录可质检 " + instockCode);
}
// 遍历打印记录,生成入库记录并更新库存
for (WmsInstockPrintVo print : prints) {
// 构造入库记录对象
WmsInstockRecordBo recordBo = new WmsInstockRecordBo();
recordBo.setInstockCode(instockCode);
recordBo.setBatchCode(print.getBatchCode());
recordBo.setMaterialId(print.getMaterialId());
recordBo.setWarehouseId(order.getWarehouseId());
recordBo.setMaterialCode(print.getMaterialCode());
recordBo.setMaterialName(print.getMaterialName());
// TODO: 获取库位
// recordBo.setLocationCode();
recordBo.setInstockQty(print.getApportionQty().doubleValue()); // Use apportionQty as qualified quantity
recordBo.setMaterialCategoryId(print.getMaterialCategoryId());
// 设置ERP同步状态为质检通过
// recordBo.setErpSynchronousStatus("QC_PASSED");
// recordBo.setErpSynchronousQty(print.getApportionQty().doubleValue());
// 插入入库记录
insertByBo(recordBo);
// 更新库存信息
WmsInventoryVo inventoryVo = inventoryService.queryByBatchAndLocation(recordBo.getBatchCode(), recordBo.getLocationCode());
double qty = recordBo.getInstockQty();
if (inventoryVo == null) {
// 如果库存记录不存在,则新增一条库存记录
WmsInventoryBo inventoryBo = new WmsInventoryBo();
inventoryBo.setBatchCode(recordBo.getBatchCode());
inventoryBo.setMaterialId(recordBo.getMaterialId());
inventoryBo.setStoreId(recordBo.getWarehouseId());
inventoryBo.setLocationCode(recordBo.getLocationCode());
inventoryBo.setMaterialCategoryId(Long.valueOf(recordBo.getMaterialCategoryId()));
inventoryBo.setInventoryQty(new BigDecimal(qty));
inventoryBo.setLockState("0");//锁定状态0未锁定1锁定
inventoryBo.setInventoryStatus("1");//库存状态0库存归01正常
inventoryService.insertByBo(inventoryBo);
} else {
// 如果库存记录存在,则更新库存数量
WmsInventoryBo update = new WmsInventoryBo();
update.setInventoryId(inventoryVo.getInventoryId());
update.setInventoryQty(inventoryVo.getInventoryQty().add(new BigDecimal(qty)));
inventoryService.updateByBo(update);
}
}
return true;
}
}

@ -1,18 +1,19 @@
package org.dromara.wms.service.impl;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.utils.MapstructUtils;
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.common.satoken.utils.LoginHelper;
import org.dromara.wms.domain.*;
import org.dromara.wms.domain.bo.WmsConfigurationBo;
import org.dromara.wms.domain.BaseMaterialCategory;
import org.dromara.wms.domain.WmsBaseWarehouse;
import org.dromara.wms.domain.WmsInventory;
import org.dromara.wms.domain.bo.WmsInventoryBo;
import org.dromara.wms.domain.bo.WmsMoveOrderBo;
import org.dromara.wms.domain.vo.WmsInventoryVo;
@ -22,7 +23,6 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* Service
@ -222,4 +222,22 @@ public class WmsInventoryServiceImpl implements IWmsInventoryService {
}
return baseMapper.deleteByIds(ids) > 0;
}
/**
*
* @param batchCode
* @param locationCode
* @return VO
*/
@Override
public WmsInventoryVo queryByBatchAndLocation(String batchCode, String locationCode) {
LambdaQueryWrapper<WmsInventory> lqw = Wrappers.lambdaQuery();
lqw
.eq(WmsInventory::getBatchCode, batchCode)
.eq(WmsInventory::getLocationCode, locationCode);
return baseMapper.selectVoOne(lqw);
}
}

Loading…
Cancel
Save