feat(shipment): 新增物料码管理功能并优化生产订单流程

- 新增 MaterialCodeController 控制器实现物料清单的增删改查功能
- 实现物料清单导入导出 Excel 模板功能
- 添加物料清单明细项的二维码生成功能
- 优化生产订单中二维码生成逻辑,支持齐套物料批量处理
- 重构生产订单打印数据查询逻辑,过滤父级物料项目
- 更新订单详情展示逻辑,按层级结构显示物料及子物料
- 修复生产订单中齐套物料扫描类型判断逻辑
- 完善物料码相关服务接口和数据模型定义
This commit is contained in:
曹鹏飞 2026-03-27 16:35:49 +08:00
parent 752f9d6c66
commit fb1fb9e265
5 changed files with 96 additions and 76 deletions

View File

@ -159,6 +159,45 @@ public class InProduceOrderController extends BaseController {
.setBatchNo(date + index)
.setSernr(request.getSernr());
produceOrderItemService.save(parent);
if (request.getList()) {
List<WmsBom> children = bomService.getChildren(request.getMatnr());
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(children)).throwMessage("请先添加齐套物料");
List<WmsInProduceOrderItem> items = children.stream()
.map(it -> new WmsInProduceOrderItem()
.setId(IdUtil.getSnowflakeNextId())
.setOrderId(order.getId())
.setParentId(parent.getId())
.setNum(request.getNum().multiply(it.getNum()))
.setMaterialNo(it.getNo())
.setMaterialDesc(it.getDescribe())
.setUnit(request.getMeins())
.setFactoryNo(request.getPwerk())
.setWarehouseNo(request.getLgort())
.setOrderNum(request.getPsmng())
.setBatchNo(parent.getBatchNo())
.setSernr(request.getSernr())
)
.toList();
produceOrderItemService.saveBatch(items);
qrCodeMasterService.saveBatch(
items.stream().map(it -> new WmsQrCodeMaster()
.setBarcodeCode(KeyUtil.next())
.setProcessStage(BarCodeProcessStage.ForStorage.getState())
.setBarcodeType(BarCodeType.Production.getState())
.setMaterialCode(it.getMaterialNo())
.setMaterialDescription(it.getMaterialDesc())
.setPackagingType((short) 0)
.setQuantity(it.getNum())
.setUnit(it.getUnit())
.setBatchNo(it.getBatchNo())
.setSerialNo(it.getSernr())
.setExtendId(it.getId())
.setCreateUserId(UserUtil.getUserId())
.setCreateUserName(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now())
).toList()
);
} else {
qrCodeMasterService.save(new WmsQrCodeMaster()
.setBarcodeCode(KeyUtil.next())
.setProcessStage(BarCodeProcessStage.ForStorage.getState())
@ -175,21 +214,6 @@ public class InProduceOrderController extends BaseController {
.setCreateUserName(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now())
);
if (request.getList()) {
List<WmsBom> children = bomService.getChildren(request.getMatnr());
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(children)).throwMessage("请先添加齐套信息");
produceOrderItemService.saveBatch(children.stream().map(it -> new WmsInProduceOrderItem()
.setOrderId(order.getId())
.setParentId(parent.getId())
.setNum(request.getNum().multiply(it.getNum()))
.setMaterialNo(it.getNo())
.setMaterialDesc(it.getDescribe())
.setUnit(request.getMeins())
.setFactoryNo(request.getPwerk())
.setWarehouseNo(request.getLgort())
.setOrderNum(request.getPsmng())
).toList()
);
}
return ApiResult.success(order.getId());
}
@ -248,16 +272,13 @@ public class InProduceOrderController extends BaseController {
, @Valid @RequestParam @NotNull Integer type) throws Exception {
WmsInProduceOrder order = produceOrderService.getById(id);
VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在");
List<QrCodeMasterPrintDTO> datas = convertToPrintDTO(qrCodeMasterService.getByExtendIds(
produceOrderItemService.lambdaQuery()
.select(WmsInProduceOrderItem::getId)
List<WmsInProduceOrderItem> items = produceOrderItemService.lambdaQuery()
.eq(WmsInProduceOrderItem::getOrderId, id)
.list()
.stream()
.map(WmsInProduceOrderItem::getId)
.toList()
)
);
.list();
if (order.getList()) {
items.removeIf(it -> it.getParentId() == 0);
}
List<QrCodeMasterPrintDTO> datas = convertToPrintDTO(qrCodeMasterService.getByExtendIds(items.stream().map(WmsInProduceOrderItem::getId).toList()));
Map<String, Object> variables = new HashMap<>();
variables.put("list", datas);
if (Objects.equals(type, 1)) {
@ -279,16 +300,13 @@ public class InProduceOrderController extends BaseController {
public ResponseEntity<byte[]> exportItemImageZip(@Valid @RequestParam @NotNull Long id) throws Exception {
WmsInProduceOrder order = produceOrderService.getById(id);
VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在");
List<QrCodeMasterPrintDTO> datas = convertToPrintDTO(qrCodeMasterService.getByExtendIds(
produceOrderItemService.lambdaQuery()
.select(WmsInProduceOrderItem::getId)
List<WmsInProduceOrderItem> items = produceOrderItemService.lambdaQuery()
.eq(WmsInProduceOrderItem::getOrderId, id)
.list()
.stream()
.map(WmsInProduceOrderItem::getId)
.toList()
)
);
.list();
if (order.getList()) {
items.removeIf(it -> it.getParentId() == 0);
}
List<QrCodeMasterPrintDTO> datas = convertToPrintDTO(qrCodeMasterService.getByExtendIds(items.stream().map(WmsInProduceOrderItem::getId).toList()));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ZipOutputStream zos = new ZipOutputStream(baos)) {
for (QrCodeMasterPrintDTO it : datas) {
@ -336,7 +354,7 @@ public class InProduceOrderController extends BaseController {
VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在");
List<InProduceOrderItemVO> list = produceOrderItemService.getVOByOrderId(id);
if (order.getList()) {
list.removeIf(item -> Objects.equals(item.getParentId(), 0L));
list.removeIf(item -> item.getParentId() != 0L);
}
InProduceOrderItemVO first = list.get(0);
Map<String, String> base = new HashMap<>();
@ -362,33 +380,32 @@ public class InProduceOrderController extends BaseController {
VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在");
VUtil.trueThrowBusinessError(!Objects.equals(order.getState(), (short) 0))
.throwMessage("该订单非待收货状态");
InProduceOrderVO vo=Convert.convert(InProduceOrderVO.class,order);
InProduceOrderVO vo = Convert.convert(InProduceOrderVO.class, order);
List<InProduceOrderItemVO> list = produceOrderItemService.getVOByOrderId(order.getId());
list.forEach(it -> {
if (it.getParentId() == 0) {
it.setBinNo(binService.getBinNo(it.getMaterialNo(), it.getFactoryNo(), it.getWarehouseNo()));
it.setIsDisableLocation(warehouseService.isEnableLocation(it.getFactoryNo(), it.getWarehouseNo()));
vo.getItems().add(it);
if (order.getList()) {
List<InProduceOrderItemVO> datas = new ArrayList<>();
list.stream().filter(it -> Objects.equals(it.getParentId(), 0L)).forEach(it -> {
List<InProduceOrderItemVO> children = list.stream()
.filter(child -> Objects.equals(child.getParentId(), it.getId()))
.toList();
Integer type = bomService.getScanType(it.getMaterialNo());
children.forEach(child -> {
child.setQiTao(type > 0);
it.setQiTao(type > 0);
if (Objects.equals(type, 0)) {
child.setMustScan(false);
it.setMustScan(false);
}
children.forEach(child -> {
child.setQiTao(it.isQiTao());
child.setMustScan(it.isMustScan());
child.setBinNo(binService.getBinNo(child.getMaterialNo(), child.getFactoryNo(), child.getWarehouseNo()));
child.setIsDisableLocation(warehouseService.isEnableLocation(child.getFactoryNo(), child.getWarehouseNo()));
});
datas.addAll(children);
});
vo.setItems(datas);
} else {
list.forEach(it -> {
it.setBinNo(binService.getBinNo(it.getMaterialNo(), it.getFactoryNo(), it.getWarehouseNo()));
it.setIsDisableLocation(warehouseService.isEnableLocation(it.getFactoryNo(), it.getWarehouseNo()));
});
vo.setItems(list);
it.setChildren(children);
}
}
});
return ApiResult.success(vo);
}
@ -431,7 +448,9 @@ public class InProduceOrderController extends BaseController {
.flatMap(Collection::stream)
.map(InventoryInItemQRCodeQO::getQrCode)
.collect(Collectors.toSet());
List<WmsQrCodeMaster> qrCodeMasters = CollectionUtil.isEmpty(allQrCodes) ? Collections.emptyList() : qrCodeMasterService.lambdaQuery()
List<WmsQrCodeMaster> qrCodeMasters = CollectionUtil.isEmpty(allQrCodes)
? Collections.emptyList()
: qrCodeMasterService.lambdaQuery()
.ne(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState())
.in(WmsQrCodeMaster::getBarcodeCode, allQrCodes)
.list();
@ -581,7 +600,7 @@ public class InProduceOrderController extends BaseController {
);
}
OptRecordDTO optRecordDTO = new OptRecordDTO();
optRecordDTO.setOperationType((short)1);
optRecordDTO.setOperationType((short) 1);
optRecordDTO.setOrderId(order.getNo());
optRecordService.add(optRecordDTO);
//同步入库信息到SAP

View File

@ -25,11 +25,6 @@ public class MaterialCodeSearchQO extends SearchBaseQO {
*/
private String customerName;
/**
* 装箱状态
*/
private Integer packingStatus;
/**
* 下单开始日期
*/

View File

@ -5,6 +5,7 @@ import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.List;
@Data
@Accessors(chain = true)
@ -83,4 +84,9 @@ public class InProduceOrderItemVO {
*/
@JsonProperty("isDisableLocation")
private Boolean isDisableLocation = true;
/**
* 清点件的齐套物料列表
*/
private List<InProduceOrderItemVO> children;
}

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Data
@ -67,5 +68,5 @@ public class InProduceOrderVO {
*/
private LocalDateTime updateTime;
private List<InProduceOrderItemVO> items;
private List<InProduceOrderItemVO> items=new ArrayList<>();
}

View File

@ -161,8 +161,7 @@ public class MaterialCodeController extends BaseController {
.like(StrUtil.isNotBlank(request.getNo()), WmsShipmentMaterialCode::getNo, request.getNo())
.like(StrUtil.isNotBlank(request.getSoNo()), WmsShipmentMaterialCode::getSoNo, request.getSoNo())
.like(StrUtil.isNotBlank(request.getMaterialNo()), WmsShipmentMaterialCode::getMaterialNo, request.getMaterialNo())
.like(StrUtil.isNotBlank(request.getCustomerName()), WmsShipmentMaterialCode::getCustomerName, request.getCustomerName())
.eq(Objects.nonNull(request.getPackingStatus()), WmsShipmentMaterialCode::getStatus, request.getPackingStatus()) .orderByAsc(WmsShipmentMaterialCode::getStatus)
.like(StrUtil.isNotBlank(request.getCustomerName()), WmsShipmentMaterialCode::getCustomerName, request.getCustomerName()) .orderByAsc(WmsShipmentMaterialCode::getStatus)
.orderByDesc(WmsShipmentMaterialCode::getId)
.page(new Page<>(request.getPage(), request.getPageSize()))
);