refactor(wms): 重构入库单物料分包打印逻辑

- 在 WmsInstockDetailBo 中添加 splitPackageCount 和 printCopies 字段
- 重新实现 updateByBo 方法,支持分包打印和重复打印功能
- 优化打印逻辑,确保分包数量和打印份数的正确处理
- 修改方案如下:
        a. 根据instockDetailId获取入库明细,计算剩余数量(剩余数量=入库数量-已分包数量)
        b. 分包数量(splitPackageCount)>1时:
             - 检查:分包数量必须小于等于剩余数量(因为每包至少1个)
             - 计算每包数量 = 剩余数量 / 分包数量(注意:这里要确保整除?如果不整除,如何处理?根据需求,这里应该要求整除,否则提示错误)
             - 循环分包数量次数,生成多个条码记录(条码批次号规则:原条码批次号(如果有)或生成新的批次号,可以加上分包序号)
             - 更新已分包数量:原已分包数量 + 每包数量 * 分包数量
        c. 分包数量=1时:
             - 生成一条条码记录,但设置打印份数为printCopies
             - 注意:此时不更新已分包数量(因为重复打印的是同一个包,只是打印多份)
        d. 保存条码记录(wms_instock_print表)
        e. 更新入库明细的已分包数量(仅当分包时更新)
master
zangch@mesnac.com 1 week ago
parent 65fe7d83f2
commit 86822599dc

@ -174,5 +174,11 @@ public class WmsInstockDetailBo{
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
// 分包数量
private Integer splitPackageCount;
// 打印份数(仅当不分包时有效)
private Integer printCopies;
}

@ -1,17 +1,19 @@
package org.dromara.wms.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
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.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 lombok.RequiredArgsConstructor;
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.BaseMaterialCategory;
import org.dromara.wms.domain.WmsInstockDetail;
import org.dromara.wms.domain.WmsInstockPrint;
import org.dromara.wms.domain.bo.BaseMaterialInfoBo;
import org.dromara.wms.domain.bo.WmsInstockDetailBo;
import org.dromara.wms.domain.vo.BaseMaterialInfoVo;
@ -26,9 +28,10 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* -Service
@ -142,6 +145,49 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService {
return a>0;
}
// /**
// * 修改入库单-物料
// *
// * @param bo 入库单-物料
// * @return 是否修改成功
// */
// @Override
// @Transactional(rollbackFor = Exception.class)
// public Boolean updateByBo(WmsInstockDetailBo bo) {
// String username = LoginHelper.getUsername();
// if (bo.getPrintNum()==null){
// WmsInstockDetail update = MapstructUtils.convert(bo, WmsInstockDetail.class);
// update.setUpdateBy(username);
// // validEntityBeforeSave(update);
// return baseMapper.updateDetail(update)>0;
// }
// if (bo.getPrintedNum()==null){
// bo.setPrintedNum(new BigDecimal(0));
// }
// //分包数量不能超过入库数量
// if (bo.getPrintNum().add(bo.getPrintedNum()).compareTo(bo.getInstockQty())>0){
// return false;
// }
// Integer printNum = (int)wmsInstockPrintService.queryPrintNum(bo) + 1;
// String order = generateOrder(printNum);
// WmsInstockPrint wmsInstockPrint = new WmsInstockPrint();
// BeanUtils.copyProperties(bo,wmsInstockPrint);
// String instockCode = bo.getInstockCode();
// String materialCode = bo.getMaterialCode();
// String batchCode = instockCode+materialCode+order;
// wmsInstockPrint.setBatchCode(batchCode);
// wmsInstockPrint.setApportionQty(bo.getPrintNum());
// wmsInstockPrint.setMaterialQty(bo.getBarcodeNum());
// wmsInstockPrint.setCreateBy(username);
// // int rows = wmsInstockPrintService.insertWmsInstockPrint(wmsInstockPrint);
// WmsInstockDetail wmsInstockDetail = new WmsInstockDetail();
// wmsInstockDetail.setPrintedNum(bo.getPrintedNum().add(bo.getPrintNum()));
// LambdaUpdateWrapper<WmsInstockDetail> updateWrapper = new LambdaUpdateWrapper<>();
// updateWrapper.eq(WmsInstockDetail::getInstockDetailId,bo.getInstockDetailId());
// wmsInstockDetail.setUpdateBy(username);
// int update = baseMapper.update(wmsInstockDetail, updateWrapper);
// return update>0;
// }
/**
* -
*
@ -152,38 +198,85 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService {
@Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(WmsInstockDetailBo bo) {
String username = LoginHelper.getUsername();
if (bo.getPrintNum()==null){
// 如果 splitPackageCount 为空,执行常规更新
if (bo.getSplitPackageCount() == null) {
WmsInstockDetail update = MapstructUtils.convert(bo, WmsInstockDetail.class);
update.setUpdateBy(username);
// validEntityBeforeSave(update);
return baseMapper.updateDetail(update)>0;
return baseMapper.updateById(update) > 0;
}
if (bo.getPrintedNum()==null){
bo.setPrintedNum(new BigDecimal(0));
}
//分包数量不能超过入库数量
if (bo.getPrintNum().add(bo.getPrintedNum()).compareTo(bo.getInstockQty())>0){
// 获取当前明细
WmsInstockDetail detail = baseMapper.selectById(bo.getInstockDetailId());
if (detail == null) {
return false;
}
Integer printNum = (int)wmsInstockPrintService.queryPrintNum(bo) + 1;
String order = generateOrder(printNum);
WmsInstockPrint wmsInstockPrint = new WmsInstockPrint();
BeanUtils.copyProperties(bo,wmsInstockPrint);
String instockCode = bo.getInstockCode();
String materialCode = bo.getMaterialCode();
String batchCode = instockCode+materialCode+order;
wmsInstockPrint.setBatchCode(batchCode);
wmsInstockPrint.setApportionQty(bo.getPrintNum());
wmsInstockPrint.setMaterialQty(bo.getBarcodeNum());
wmsInstockPrint.setCreateBy(username);
// int rows = wmsInstockPrintService.insertWmsInstockPrint(wmsInstockPrint);
WmsInstockDetail wmsInstockDetail = new WmsInstockDetail();
wmsInstockDetail.setPrintedNum(bo.getPrintedNum().add(bo.getPrintNum()));
LambdaUpdateWrapper<WmsInstockDetail> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(WmsInstockDetail::getInstockDetailId,bo.getInstockDetailId());
wmsInstockDetail.setUpdateBy(username);
int update = baseMapper.update(wmsInstockDetail, updateWrapper);
return update>0;
BigDecimal printed = detail.getPrintedNum() != null ? detail.getPrintedNum() : BigDecimal.ZERO;
BigDecimal remaining = detail.getInstockQty().subtract(printed);
if (remaining.compareTo(BigDecimal.ZERO) <= 0) {
return false; // 无剩余
}
int splitInt = bo.getSplitPackageCount() != null ? bo.getSplitPackageCount() : 1;
BigDecimal split = BigDecimal.valueOf(splitInt);
int copiesInt = bo.getPrintCopies() != null ? bo.getPrintCopies() : 1;
BigDecimal copies = BigDecimal.valueOf(copiesInt);
// 获取当前打印序列
Integer printSeq = (int) wmsInstockPrintService.queryPrintNum(bo) + 1;
String baseOrder = generateOrder(printSeq);
BigDecimal totalPackaged = BigDecimal.ZERO;
if (splitInt > 1) {
// 分包逻辑
if (remaining.compareTo(split) < 0 || remaining.remainder(split).compareTo(BigDecimal.ZERO) != 0) {
return false; // 无法平均分包
}
BigDecimal per = remaining.divide(split, 0, RoundingMode.DOWN);
for (int i = 1; i <= splitInt; i++) {
String order = baseOrder + "-" + String.format("%03d", i);
String batchCode = bo.getInstockCode() + bo.getMaterialCode() + order;
WmsInstockPrint print = new WmsInstockPrint();
BeanUtils.copyProperties(bo, print);
print.setBatchCode(batchCode);
print.setApportionQty(per);
print.setMaterialQty(1L); // 每个包打印1份使用Long类型
print.setCreateBy(username);
wmsInstockPrintService.insertWmsInstockPrint(print);
totalPackaged = totalPackaged.add(per);
}
} else {
// 重复打印逻辑split == 1
if (copiesInt < 1) {
copiesInt = 1;
}
copies = BigDecimal.valueOf(copiesInt);
String order = baseOrder;
String batchCode = bo.getInstockCode() + bo.getMaterialCode() + order;
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);
totalPackaged = remaining;
}
// 更新 printedNum
detail.setPrintedNum(printed.add(totalPackaged));
baseMapper.updateById(detail);
return true;
}
public String generateOrder(Integer value){
if (value.toString().length()<3){

Loading…
Cancel
Save