Compare commits

...

3 Commits

Author SHA1 Message Date
曹鹏飞 9e0ff6cfd4 feat(component): 添加零部件打包管理功能
- 新增 ComponentPackingController 控制器,提供零部件打包相关接口
- 实现出库单列表查询、装箱单详情查看、订单信息获取等功能
- 添加打包信息的新增、修改、删除操作支持
- 集成 SAP 服务获取零部件订单信息
- 实现 PDF 导出功能,支持装箱单打印
- 添加 PDA 端任务接口,支持移动端操作
- 增加业务验证逻辑,防止重复创建和误删已完成单据
2026-03-27 20:33:33 +08:00
曹鹏飞 29b9cad2d0 feat(out-assistance): 添加物料号搜索和ID过滤功能
- 在OutAssistanceSearchQO中新增matnr物料号字段和ids列表字段
- 添加@JsonIgnore注解忽略ids字段的序列化
- 在WmsOutAssistanceMapper.xml中实现ids条件查询逻辑
- 当ids为空时设置条件为false,非空时进行in查询
- 在WmsOutAssistanceServiceImpl中实现物料号搜索功能
- 通过物料号关联查询对应的订单ID列表进行过滤
- 使用StrUtil工具类进行字符串非空判断
2026-03-27 16:57:10 +08:00
曹鹏飞 fb1fb9e265 feat(shipment): 新增物料码管理功能并优化生产订单流程
- 新增 MaterialCodeController 控制器实现物料清单的增删改查功能
- 实现物料清单导入导出 Excel 模板功能
- 添加物料清单明细项的二维码生成功能
- 优化生产订单中二维码生成逻辑,支持齐套物料批量处理
- 重构生产订单打印数据查询逻辑,过滤父级物料项目
- 更新订单详情展示逻辑,按层级结构显示物料及子物料
- 修复生产订单中齐套物料扫描类型判断逻辑
- 完善物料码相关服务接口和数据模型定义
2026-03-27 16:35:49 +08:00
10 changed files with 136 additions and 78 deletions

View File

@ -60,8 +60,7 @@ public class ComponentPackingController {
*/ */
@PostMapping("search") @PostMapping("search")
public ApiResult<PageData<ComponentPackingVO>> search(@Valid @RequestBody ComponentPackingQO request) { public ApiResult<PageData<ComponentPackingVO>> search(@Valid @RequestBody ComponentPackingQO request) {
PageData<ComponentPackingVO> pageData = PageUtil.convert(wmscomponentPackingService.search(request), d -> Convert.convert(ComponentPackingVO.class, d)); return ApiResult.success(wmscomponentPackingService.search(request));
return ApiResult.success(pageData);
} }
/** /**

View File

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

View File

@ -1,5 +1,6 @@
package com.nflg.wms.common.pojo.qo; package com.nflg.wms.common.pojo.qo;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@ -19,6 +20,7 @@ public class ComponentPackingQO extends SearchBaseQO {
/** /**
* 办事处代理商 * 办事处代理商
*/ */
@JsonProperty("pName")
private String pName; private String pName;

View File

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

View File

@ -1,7 +1,10 @@
package com.nflg.wms.common.pojo.qo; package com.nflg.wms.common.pojo.qo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data; import lombok.Data;
import java.util.List;
@Data @Data
public class OutAssistanceSearchQO extends SearchBaseQO { public class OutAssistanceSearchQO extends SearchBaseQO {
@ -24,4 +27,12 @@ public class OutAssistanceSearchQO extends SearchBaseQO {
* 供应商 * 供应商
*/ */
private String lifnr; private String lifnr;
/**
* 物料号
*/
private String matnr;
@JsonIgnore
private List<Long> ids;
} }

View File

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

View File

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

View File

@ -1,10 +1,12 @@
package com.nflg.wms.repository.service.impl; package com.nflg.wms.repository.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.wms.common.pojo.qo.OutAssistanceSearchQO; import com.nflg.wms.common.pojo.qo.OutAssistanceSearchQO;
import com.nflg.wms.repository.entity.WmsOutAssistance; import com.nflg.wms.repository.entity.WmsOutAssistance;
import com.nflg.wms.repository.entity.WmsOutAssistanceItem;
import com.nflg.wms.repository.mapper.WmsOutAssistanceMapper; import com.nflg.wms.repository.mapper.WmsOutAssistanceMapper;
import com.nflg.wms.repository.service.IWmsOutAssistanceItemService; import com.nflg.wms.repository.service.IWmsOutAssistanceItemService;
import com.nflg.wms.repository.service.IWmsOutAssistanceService; import com.nflg.wms.repository.service.IWmsOutAssistanceService;
@ -26,6 +28,19 @@ public class WmsOutAssistanceServiceImpl extends ServiceImpl<WmsOutAssistanceMap
@Override @Override
public IPage<WmsOutAssistance> search(OutAssistanceSearchQO request) { public IPage<WmsOutAssistance> search(OutAssistanceSearchQO request) {
if (StrUtil.isNotBlank(request.getMatnr())) {
request.setIds(
wmsOutAssistanceItemService.lambdaQuery()
.like(WmsOutAssistanceItem::getMatnr, request.getMatnr())
.or()
.like(WmsOutAssistanceItem::getMatnr1, request.getMatnr())
.list()
.stream()
.map(WmsOutAssistanceItem::getOrderId)
.toList()
);
}
return baseMapper.search(request, new Page<>(request.getPage(), request.getPageSize())); return baseMapper.search(request, new Page<>(request.getPage(), request.getPageSize()));
} }
} }

View File

@ -6,6 +6,17 @@
SELECT * SELECT *
FROM wms_out_assistance FROM wms_out_assistance
<where> <where>
<if test="request.ids != null">
<if test="request.ids.isEmpty()">
and 1=2
</if>
<if test="!request.ids.isEmpty()">
and id in
<foreach item="item" collection="request.ids" separator="," open="(" close=")">
#{item}
</foreach>
</if>
</if>
<if test="request.no != null and request.no!=''"> <if test="request.no != null and request.no!=''">
AND "no" ilike CONCAT('%', #{request.no}, '%') AND "no" ilike CONCAT('%', #{request.no}, '%')
</if> </if>

View File

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