feat(barcode): 添加越库处理状态并优化入库流程

- 在 BarCodeProcessStage 枚举中添加 Cross 越库状态
- 移除枚举类中未使用的 EnumValue 注解
- 修改 NormalPGIController 中的入库逻辑,将二维码状态设置为越库
- 更新库存记录的锁定数量为零,并添加正确的数量字段
- 优化生产订单项目的ID生成和关联关系
- 更新二维码主数据和服务层批量处理逻辑
- 修复入库单据查询的时间条件关联表问题
- 移除 QRCodeQO1 中不再需要的数量验证字段
This commit is contained in:
曹鹏飞 2026-03-30 18:50:00 +08:00
parent e8609eca0c
commit 6eb9ec648e
4 changed files with 52 additions and 47 deletions

View File

@ -1265,39 +1265,40 @@ public class NormalPGIController extends BaseController {
.findFirst()
.orElse(null);
VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("未找到二维码对应的订单");
item.setInQty(item.getInQty().add(code.getNum()));
item.setCrossQty(item.getCrossQty().add(code.getNum()));
// item.setInQty(item.getInQty().add(qrCodeMaster.getQuantity()));
item.setCrossQty(item.getCrossQty().add(qrCodeMaster.getQuantity()));
qrCodeMaster.setProcessStage(BarCodeProcessStage.Cross.getState());
});
});
List<PoReceiveTaskConfirmQO> qos = new ArrayList<>();
receiptItems.forEach(item -> {
PoReceiveTaskConfirmQO qo = qos.stream()
.filter(q -> q.getTaskId().equals(item.getReceiveId()))
.findFirst()
.orElse(null);
if (Objects.isNull(qo)) {
qo = new PoReceiveTaskConfirmQO()
.setTaskId(item.getReceiveId())
.setItems(new ArrayList<>());
qos.add(qo);
}
qo.getItems().add(new PoReceiveTaskItemConfirmQO()
.setId(item.getId())
.setReceivedWarehouse(item.getReceivedWarehouse())
.setItems(
qrCodeMasters.stream()
.filter(qit -> qit.getReceiptItemId().equals(item.getId()))
.toList()
.stream()
.map(qit -> new InCostCenterBackSubmitItemQRQO()
.setBinNo(item.getStorageLocation())
.setQrCode(qit.getBarcodeCode())
)
.toList()
)
);
});
qos.forEach(this::takeDeliveryConfirm);
// List<PoReceiveTaskConfirmQO> qos = new ArrayList<>();
// receiptItems.forEach(item -> {
// PoReceiveTaskConfirmQO qo = qos.stream()
// .filter(q -> q.getTaskId().equals(item.getReceiveId()))
// .findFirst()
// .orElse(null);
// if (Objects.isNull(qo)) {
// qo = new PoReceiveTaskConfirmQO()
// .setTaskId(item.getReceiveId())
// .setItems(new ArrayList<>());
// qos.add(qo);
// }
// qo.getItems().add(new PoReceiveTaskItemConfirmQO()
// .setId(item.getId())
// .setReceivedWarehouse(item.getReceivedWarehouse())
// .setItems(
// qrCodeMasters.stream()
// .filter(qit -> qit.getReceiptItemId().equals(item.getId()))
// .toList()
// .stream()
// .map(qit -> new InCostCenterBackSubmitItemQRQO()
// .setBinNo(item.getStorageLocation())
// .setQrCode(qit.getBarcodeCode())
// )
// .toList()
// )
// );
// });
// qos.forEach(this::takeDeliveryConfirm);
Map<String, List<Zwm3a07VO>> maps = datas.stream().collect(Collectors.groupingBy(Zwm3a07VO::getKey2));
List<WmsOutProduce> pOrders = new ArrayList<>();
List<WmsOutProduceTicket> tickets = new ArrayList<>();
@ -1323,10 +1324,13 @@ public class NormalPGIController extends BaseController {
items.forEach(item -> {
RLock lock = redissonClient.getLock(StrUtil.format("lock:inventory:{}:{}:{}", item.getDwerk(), item.getLgort2(), item.getMatnr()));
try {
Long itemId=IdUtil.getSnowflakeNextId();
// 等待5秒获取锁10秒后自动释放
if (lock.tryLock(5, 10, TimeUnit.SECONDS)) {
WmsOutProduceItem data = Convert.convert(WmsOutProduceItem.class, item);
data.setLockNum(item.getSqsl());
data.setId(itemId);
data.setLockNum(BigDecimal.ZERO);
data.setNum(item.getSqsl());
data.setOrderId(order.getId());
outProduceItemService.save(data);
} else {
@ -1335,7 +1339,7 @@ public class NormalPGIController extends BaseController {
ticketItems.add(
new WmsOutProduceTicketItem()
.setTicketId(ticket.getId())
.setProduceItemId(order.getId())
.setProduceItemId(itemId)
.setNum(item.getSqsl())
);
} catch (Exception e) {
@ -1348,6 +1352,8 @@ public class NormalPGIController extends BaseController {
}
});
});
qrCodeMasterService.updateBarCode(qrCodeMasters);
wmsPoReceiptItemService.updateBatchById(receiptItems);
outProduceService.saveBatch(pOrders);
outProduceTicketService.saveBatch(tickets);
outProduceTicketItemService.saveBatch(ticketItems);

View File

@ -1,6 +1,5 @@
package com.nflg.wms.common.constant;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
@ -56,7 +55,11 @@ public enum BarCodeProcessStage {
/**
* 已拒收
*/
Reject((short) 11, "拒收");
Reject((short) 11, "拒收"),
/**
* 已拒收
*/
Cross((short) 12, "已越库");
private final short state;
private final String description;

View File

@ -1,12 +1,8 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class QRCodeQO1 {
@ -16,10 +12,10 @@ public class QRCodeQO1 {
@NotBlank
private String codeId;
/**
* 数量
*/
@NotNull
@Positive(message = "数量必须大于0")
private BigDecimal num;
// /**
// * 数量
// */
// @NotNull
// @Positive(message = "数量必须大于0")
// private BigDecimal num;
}

View File

@ -8,10 +8,10 @@
INNER JOIN wms_in_produce_order_surplus ipos ON ipost.order_id=ipos."id"
<where>
<if test="request.startDate!=null">
and ipost.create_time >= #{request.startDate}
and ipos.create_time >= #{request.startDate}
</if>
<if test="request.endDate!=null">
and ipost.create_time &lt;= #{request.endDate}
and ipos.create_time &lt;= #{request.endDate}
</if>
<if test="request.no != null and request.no!=''">
AND ipost."no" ilike CONCAT('%',#{request.no},'%')