feat(wms): 新增采购订单物料列表查询功能并优化盘点相关功能

- 在 IWmsPurchaseOrderDetailService 中新增 queryListWithInstockedQty 方法,用于查询带已入库数量统计的采购订单物料列表
- 修改 RemoteInventoryCheckServiceImpl 中的 generateOrderCode 方法,根据盘点任务类型生成不同前缀的订单号
- 在 WmsPurchaseOrderController 中为新增采购订单设置默认订单类型
master
zangch@mesnac.com 4 months ago
parent cefc2b802b
commit 0901fb1177

@ -117,6 +117,7 @@ public class WmsPurchaseOrderDetailController extends BaseController {
/**
* -
* WmsInstockRecord
*/
@GetMapping("/listWithInstockedQty")
public R<List<WmsPurchaseOrderDetailVo>> listWithInstockedQty(WmsPurchaseOrderDetailBo bo) {

@ -1,13 +1,10 @@
package org.dromara.wms.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
import java.util.Date;
/**
* wms_purchase_order

@ -16,6 +16,7 @@ import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
/**
* - wms_instock_detail
@ -190,4 +191,16 @@ public class WmsInstockDetailBo{
*/
private String inspectionRequest;
/**
* >1使
*/
@TableField(exist = false)
private List<Integer> packageQtyList;
/**
* average:, custom:
*/
@TableField(exist = false)
private String packageMode;
}

@ -7,6 +7,7 @@ import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.wms.domain.WmsOutstockOrder;
import java.util.Date;
import java.util.List;
/**
* wms_outstock_order
@ -91,4 +92,6 @@ public class WmsOutstockOrderBo extends BaseEntity {
*/
private Long customerId;
private List<WmsOutstockDetailBo> detailList;
}

@ -13,6 +13,7 @@ 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.BaseMaterialInfo;
import org.dromara.wms.domain.WmsInstockDetail;
import org.dromara.wms.domain.WmsInstockPrint;
import org.dromara.wms.domain.bo.BaseMaterialInfoBo;
@ -100,6 +101,9 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService {
.select(BaseMaterialCategory::getMaterialCategoryName)
.leftJoin(BaseMaterialCategory.class, BaseMaterialCategory::getMaterialCategoryId, WmsInstockDetail::getMaterialCategoryId)
.select(BaseMaterialInfo::getInspectionRequest)//质检要求(0必检,1免检)
.leftJoin(BaseMaterialInfo.class, BaseMaterialInfo::getMaterialId, WmsInstockDetail::getMaterialId)
.eq(StringUtils.isNotBlank(bo.getIsInspection()), WmsInstockDetail::getIsInspection, bo.getIsInspection())
.eq(bo.getInstockQty() != null, WmsInstockDetail::getInstockQty, bo.getInstockQty())
@ -213,10 +217,9 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService {
BigDecimal printed = detail.getPrintedNum() != null ? detail.getPrintedNum() : BigDecimal.ZERO;
BigDecimal remaining = detail.getInstockQty().subtract(printed);
if (remaining.compareTo(BigDecimal.ZERO) <= 0) {// 无剩余
if (remaining.compareTo(BigDecimal.ONE) < 0) {// 剩余数量小于1时无法打印
throw new ServiceException("无剩余数量可打印");
}
int splitInt = bo.getSplitPackageCount() != null ? bo.getSplitPackageCount() : 1;
BigDecimal split = BigDecimal.valueOf(splitInt);
int copiesInt = bo.getPrintCopies() != null ? bo.getPrintCopies() : 1;
@ -225,30 +228,72 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService {
// 获取当前打印序列
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) {// 无法平均分包
throw new ServiceException("无法平均分包");
// 分包逻辑 - 支持平均分包和自定义分包两种模式
List<Integer> packageQtyList = bo.getPackageQtyList();
String packageMode = bo.getPackageMode();
// 默认为平均分包模式
if (packageMode == null) {
packageMode = "average";
}
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.setInboundStatus("0");//入库状态(0-待入库,1-已入库,2-入库中)
wmsInstockPrintService.insertWmsInstockPrint(print);
totalPackaged = totalPackaged.add(per);
if ("custom".equals(packageMode) && packageQtyList != null && packageQtyList.size() == splitInt) {
// 自定义模式:使用用户指定的每包数量
BigDecimal totalCustomQty = packageQtyList.stream()
.map(BigDecimal::valueOf)
.reduce(BigDecimal.ZERO, BigDecimal::add);
if (totalCustomQty.compareTo(remaining) > 0) {
throw new ServiceException("每包数量总计不能超过剩余数量");
}
for (int i = 1; i <= splitInt; i++) {
String order = baseOrder + String.format("%03d", i);
String batchCode = generateBatchCode(bo, bo.getBatchCode(), order);
BigDecimal currentPackageQty = BigDecimal.valueOf(packageQtyList.get(i - 1));
WmsInstockPrint print = new WmsInstockPrint();
BeanUtils.copyProperties(bo, print);
print.setBatchCode(batchCode);
print.setApportionQty(currentPackageQty);
print.setMaterialQty(1L); // 每个包打印1份
print.setInboundStatus("0"); // 入库状态(0-待入库,1-已入库,2-入库中)
wmsInstockPrintService.insertWmsInstockPrint(print);
totalPackaged = totalPackaged.add(currentPackageQty);
}
} else {
// 平均分包模式(默认模式)或自定义模式但数据不完整
if ("average".equals(packageMode) || packageQtyList == null || packageQtyList.size() != splitInt) {
// 使用平均分包逻辑
if (remaining.compareTo(split) < 0 || remaining.remainder(split).compareTo(BigDecimal.ZERO) != 0) {
throw new ServiceException("无法平均分包,剩余数量不能被平均分配");
}
BigDecimal per = remaining.divide(split, 0, RoundingMode.DOWN);
for (int i = 1; i <= splitInt; i++) {
String order = baseOrder + String.format("%03d", i);
String batchCode = generateBatchCode(bo, bo.getBatchCode(), order);
WmsInstockPrint print = new WmsInstockPrint();
BeanUtils.copyProperties(bo, print);
print.setBatchCode(batchCode);
print.setApportionQty(per);
print.setMaterialQty(1L); // 每个包打印1份
print.setInboundStatus("0"); // 入库状态(0-待入库,1-已入库,2-入库中)
wmsInstockPrintService.insertWmsInstockPrint(print);
totalPackaged = totalPackaged.add(per);
}
} else {
// 使用自定义数量但数据验证失败
throw new ServiceException("自定义分包数量数据验证失败");
}
}
} else {
// 重复打印逻辑split == 1
@ -257,7 +302,7 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService {
}
copies = BigDecimal.valueOf(copiesInt);
String batchCode = bo.getInstockCode() + bo.getMaterialCode() + baseOrder;
String batchCode = generateBatchCode(bo, bo.getBatchCode(), baseOrder);
WmsInstockPrint print = new WmsInstockPrint();
BeanUtils.copyProperties(bo, print);
@ -286,6 +331,15 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService {
return value.toString();
}
public String generateBatchCode(WmsInstockDetailBo bo, String batchCode, String baseOrder){
if(StringUtils.isBlank(batchCode)){
return bo.getInstockCode() + bo.getMaterialCode() + baseOrder;
}else{
return batchCode + baseOrder;
}
}
/**
*
*/

@ -167,6 +167,7 @@ public class WmsPurchaseOrderDetailServiceImpl implements IWmsPurchaseOrderDetai
/**
* -
* WmsInstockRecord
*
* @param bo
* @return -

@ -4,7 +4,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.wms.mapper.WmsPurchaseOrderDetailMapper">
<!-- 查询采购订单物料列表(带已入库数量统计) -->
<!-- 查询采购订单物料列表(带已入库记录数量统计) -->
<select id="selectListWithInstockedQty" resultType="org.dromara.wms.domain.vo.WmsPurchaseOrderDetailVo">
SELECT
pod.po_d_id,
@ -19,19 +19,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
pod.tenant_id,
pod.create_time,
COALESCE(instocked.instocked_qty, 0) as instocked_qty,
(pod.purchase_qty - COALESCE(instocked.instocked_qty, 0)) as remaining_qty
(pod.purchase_qty - COALESCE(instocked.instocked_qty, 0)) as remaining_qty
FROM wms_purchase_order_detail pod
LEFT JOIN (
SELECT
pod_inner.po_d_id,
SUM(wid.instock_qty) as instocked_qty
FROM wms_instock_detail wid
INNER JOIN wms_instock_order wio ON wid.instock_id = wio.instock_id
SUM(wir.instock_qty) as instocked_qty
FROM wms_instock_record wir
INNER JOIN wms_instock_order wio ON wir.instock_code = wio.instock_code
INNER JOIN wms_instock_detail wid ON wir.instock_code = wid.instock_code
INNER JOIN wms_purchase_order_detail pod_inner ON (
(
wid.po_d_id = pod_inner.po_d_id
OR (
wid.material_code = pod_inner.material_code
wir.material_code = pod_inner.material_code
AND wio.order_no = pod_inner.po_no
)
)

Loading…
Cancel
Save