feat(wms): 新增普通物料收货功能

- 新增 NormalPGIController 和 NormalPGIControllerService 类实现普通物料收货相关功能
- 添加 PDAOrderVO、PDAOrderItemVO等数据传输对象
- 实现送货单列表、送货单详情、PDA 扫码收货等功能接口
- 新增 SAPCommonService 类处理与 SAP 系统的交互
- 修改 WmsSrmOrder 和 WmsSrmOrderItem 实体类,增加相关字段- 更新 WmsSrmOrderItemMapper 和 XML 文件,添加获取送货单详情的 SQL 查询
This commit is contained in:
zhangke 2025-07-28 18:22:40 +08:00
parent 7f4e760772
commit 8352b38351
29 changed files with 994 additions and 42 deletions

1
.gitignore vendored
View File

@ -32,3 +32,4 @@ build/
### VS Code ### ### VS Code ###
.vscode/ .vscode/
/dev_jco_rfc.log /dev_jco_rfc.log
logs

View File

@ -2,27 +2,84 @@ package com.nflg.wms.admin.controller;
/* * 普通物料收货单*/ /* * 普通物料收货单*/
import com.nflg.wms.admin.service.NormalPGIControllerService;
import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.SRMOrderSearchQO;
import com.nflg.wms.common.pojo.qo.SrmMaterialReceiptQO;
import com.nflg.wms.common.pojo.vo.*;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.repository.entity.WmsSrmMaterialReceiptItem;
import com.nflg.wms.repository.service.IWmsSrmMaterialReceiptItemService;
import com.nflg.wms.repository.service.IWmsSrmOrderItemService;
import com.nflg.wms.repository.service.IWmsSrmOrderService;
import com.nflg.wms.starter.BaseController; import com.nflg.wms.starter.BaseController;
import org.springframework.web.bind.annotation.RequestMapping; import com.nflg.wms.starter.annotation.ApiMark;
import org.springframework.web.bind.annotation.RestController; import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController @RestController
@RequestMapping("/pgi/normal") @RequestMapping("/pgi/normal")
public class NormalPGIController extends BaseController { public class NormalPGIController extends BaseController {
@Resource
private IWmsSrmOrderService wmsSrmOrderService;
@Resource
private IWmsSrmOrderItemService wmsSrmOrderItemService;
@Resource
private NormalPGIControllerService normalPGIControllerService;
@Resource
private IWmsSrmMaterialReceiptItemService wmsSrmMaterialReceiptItemService;
// @RequestMapping("search")
//收货单分页 //收货单分页
@PostMapping("search")
@ApiMark(moduleName = "送货单管理", apiName = "送货单列表")
public ApiResult<PageData<SrmOrderVO>> search(@Valid @RequestBody SRMOrderSearchQO request) {
return ApiResult.success(wmsSrmOrderService.search(request));
}
//收货单详情 //收货单详情
@GetMapping("getOrderItem")
@ApiMark(moduleName = "送货单管理", apiName = "获取送货单详情")
public ApiResult<SRMOrderItemVO> getOrderItem(@RequestParam Long orderId) {
return ApiResult.success(wmsSrmOrderItemService.getOrderItem(orderId));
}
//一键收货
//PDA 扫码收货 //PDA 扫码获取收货信息
@GetMapping("getOrderItemByOrderNo")
@ApiMark(moduleName = "送货单管理", apiName = "PDA扫描送货单号获取送货单详情")
public ApiResult<PDAOrderVO> getOrderItemByOrderNo(@RequestParam String orderNo) {
try {
PDAOrderVO pdaOrderVO = normalPGIControllerService.getOrderItemByOrderNo(orderNo);
return ApiResult.success(pdaOrderVO);
} catch (Exception e) {
return ApiResult.error(STATE.NoOrderData, "获取送货单详情失败", null);
}
}
// 查看扫码记录 // 查看扫码记录
@GetMapping("getScanCodes")
@ApiMark(moduleName = "送货单管理", apiName = "获取扫码的详情信息")
public ApiResult<List<WmsSrmMaterialReceiptItem>> getScanCodes(@RequestParam String orderItemId) {
return ApiResult.success(wmsSrmMaterialReceiptItemService.lambdaQuery().eq(WmsSrmMaterialReceiptItem::getOrderItemId, orderItemId).list());
}
//收货确认 //收货确认
@PostMapping("takeDelivery")
@ApiMark(moduleName = "送货单管理", apiName = "收货确认")
public ApiResult<Void> takeDelivery(@Valid @RequestBody SrmMaterialReceiptQO request) {
//UserUtil
// return ApiResult.success(wmsSrmMaterialReceiptService.takeDelivery(request));
}
//一键收货
} }

View File

@ -21,6 +21,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -57,6 +58,8 @@ public class SRMController extends BaseController {
srmOrderService.removeById(order); srmOrderService.removeById(order);
srmOrderItemService.remove(new LambdaQueryWrapper<WmsSrmOrderItem>().eq(WmsSrmOrderItem::getOrderId, order.getId())); srmOrderItemService.remove(new LambdaQueryWrapper<WmsSrmOrderItem>().eq(WmsSrmOrderItem::getOrderId, order.getId()));
} else { } else {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime deliveryDate = LocalDateTime.parse(request.getDeliveryNoteDate(), formatter);
order = new WmsSrmOrder() order = new WmsSrmOrder()
.setId(IdUtil.getSnowflakeNextId()) .setId(IdUtil.getSnowflakeNextId())
.setIuCode(request.getIuCode()) .setIuCode(request.getIuCode())
@ -65,6 +68,8 @@ public class SRMController extends BaseController {
.setNoteNum(request.getNoteNum()) .setNoteNum(request.getNoteNum())
.setWaybillNum(request.getWaybillNum()) .setWaybillNum(request.getWaybillNum())
.setPurchaseGroup(request.getPurchaseGroup()) .setPurchaseGroup(request.getPurchaseGroup())
.setOuCode(request.getOuCode())
.setDeliveryNoteDate(deliveryDate)
.setCreateTime(LocalDateTime.now()); .setCreateTime(LocalDateTime.now());
srmOrderService.save(order); srmOrderService.save(order);
} }

View File

@ -18,4 +18,95 @@ public class SAPMaterialInfoInOrderDTO {
* 仓库编号 * 仓库编号
*/ */
private String warehouseNo; private String warehouseNo;
/**
* 采购凭证号
*/
private String ebeln;
/**
* 采购凭证行项目
*/
private String ebelp;
/**
* 物料号
*/
private String matnr;
/**
* 物料描述
*/
private String maktx;
/**
* 标志关键部件
*/
private String kzkri;
/**
* 采购订单数量
*/
private BigDecimal menge;
/**
* 收货数量
*/
private BigDecimal wemng;
/**
* 单位
*/
private String meins;
/**
* 物料组
*/
private String matkl;
/**
* 物料描述描述
*/
private String wgbez;
/**
* 工厂
*/
private String werks;
/**
* 标识基于收获的发票验证
*/
private String webre;
/**
* 打印参数
*/
private String lbprt;
/**
* 特性值
*/
private String atwrt;
/**
* 采购组
*/
private String ekgrp;
/**
* 订单类型
*/
private String bsart;
/**
* 供应商账号
*/
private String lifnr;
} }

View File

@ -0,0 +1,127 @@
package com.nflg.wms.admin.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.nflg.wms.admin.pojo.dto.SAPMaterialInfoInOrderDTO;
import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.dto.SAPSyncParamsDTO;
import com.nflg.wms.common.pojo.qo.SrmMaterialReceiptQO;
import com.nflg.wms.common.pojo.vo.PDAOrderItemVO;
import com.nflg.wms.common.pojo.vo.PDAOrderVO;
import com.nflg.wms.common.pojo.vo.SRMOrderItemVO;
import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.WmsSrmOrder;
import com.nflg.wms.repository.entity.WmsSrmOrderItem;
import com.nflg.wms.repository.service.IWmsSrmOrderItemService;
import com.nflg.wms.repository.service.IWmsSrmOrderService;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.apache.poi.ss.formula.functions.Forecast;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class NormalPGIControllerService {
@Resource
private IWmsSrmOrderItemService wmsSrmOrderItemService;
@Resource
private IWmsSrmOrderService wmsSrmOrderService;
@Resource
private SAPCommonService sapCommonService;
@Resource
private SapService sapService;
public PDAOrderVO getOrderItemByOrderNo(@RequestParam String orderNo) throws Exception {
//return ApiResult.success(wmsSrmOrderItemService.getOrderItem(orderId));
PDAOrderVO pdaOrderVO = null;
WmsSrmOrder order = wmsSrmOrderService.lambdaQuery().eq(WmsSrmOrder::getNoteNum, orderNo).one();
if (Objects.isNull(order))
return null;
pdaOrderVO.setNoteNum(order.getNoteNum());
pdaOrderVO.setSupplierNum(order.getSupplierNum());
pdaOrderVO.setSupplierName(order.getSupplierName());
List<WmsSrmOrderItem> orderItemList = wmsSrmOrderItemService.lambdaQuery().eq(WmsSrmOrderItem::getOrderId, order.getId()).list();
if (CollectionUtil.isNotEmpty(orderItemList)) {
List<PDAOrderItemVO> orderItemVOList = new ArrayList<>();
for (WmsSrmOrderItem item : orderItemList) {
PDAOrderItemVO itemVO = new PDAOrderItemVO();
itemVO.setId(item.getId());
itemVO.setPoLineNumber(item.getPoLineNumber());
itemVO.setPoNum(item.getPoNum());
itemVO.setItemCode(item.getItemCode());
itemVO.setItemName(item.getItemName());
itemVO.setIsQuality(item.getIsQuality());
itemVO.setOrderQty(item.getOrderQty());
itemVO.setUomCode(item.getUomCode());
itemVO.setDeliveryQty(item.getDeliveryQty());
SAPSyncParamsDTO syncParamsDTO = sapCommonService.getMaterialInfoInOrder(item.getPoNum(), order.getSupplierNum(), item.getItemCode());
if (Objects.nonNull(syncParamsDTO)) {
itemVO.setItemName(syncParamsDTO.getMaktx());
itemVO.setUomCode(syncParamsDTO.getMeins());
itemVO.setOrderQty(syncParamsDTO.getMenge());
itemVO.setReceivedWarehouse(syncParamsDTO.getWarehouseNo());
itemVO.setBinNos(syncParamsDTO.getBinNos());
itemVO.setLbprt(syncParamsDTO.getLbprt());
itemVO.setTransportNum(syncParamsDTO.getTransportNum());
boolean isQuality = false;
if (syncParamsDTO.getKzkri().equals("0"))
isQuality = true;
else
isQuality = false;
itemVO.setIsQuality(isQuality);
orderItemVOList.add(itemVO);
}
}
pdaOrderVO.setOrderItemVOList(orderItemVOList);
}
return pdaOrderVO;
}
@Transactional
public void takeDelivery(List<SrmMaterialReceiptQO> request) {
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(request)).throwMessage("收货参数为空");
request.forEach(item -> {
SAPMaterialInfoInOrderDTO materialInfoInOrder = sapService.getMaterialInfoInOrder(item.getPoNum(), item.getSupplierNum(), item.getItemCode());
VUtil.trueThrowBusinessError(Objects.isNull(materialInfoInOrder)).throwMessage("无法获取到有效订单信息" + item.getPoNum());
//判断收货数量是否大于了未收数量
VUtil.trueThrowBusinessError(item.getReceiptNum().add(item.getCrossNumber()).compareTo(materialInfoInOrder.getTransportNum()) > 0).throwMessage("无法获取到有效订单信息" + item.getPoNum());
//判断序列号批次号是否规范
// 1 - 批次号为空序列号为空
// 2 - 批次号必填序列号为空
// 3 - 批次号为空序列号必填
// 4 - 批次号必填序列号必填
//批次號必填
if (materialInfoInOrder.getLbprt().equals("2") || materialInfoInOrder.getLbprt().equals("4")) {
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(item.getScanCodes()) || item.getScanCodes().stream().anyMatch(code -> StrUtil.isBlank(code.getBatchNumber()))).throwMessage("此物料[" + item.getItemCode() + "]必须填写批次号" + item.getPoNum());
}
//序列號必填
if (materialInfoInOrder.getLbprt().equals("3") || materialInfoInOrder.getLbprt().equals("4")) {
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(item.getScanCodes()) || item.getScanCodes().stream().anyMatch(code -> StrUtil.isBlank(code.getSerialNumber()))).throwMessage("此物料[" + item.getItemCode() + "]必须填写序列号" + item.getPoNum());
}
// 保存收货信息
//质检物料发送到质检单
//生成上架任务
});
}
}

View File

@ -0,0 +1,60 @@
package com.nflg.wms.admin.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.nflg.wms.admin.pojo.dto.SAPMaterialInfoInOrderDTO;
import com.nflg.wms.common.pojo.dto.SAPSyncFromDTO;
import com.nflg.wms.common.pojo.dto.SAPSyncParamsDTO;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Slf4j
@Component
public class SAPCommonService {
@Resource
private SapService sapService;
public SAPSyncParamsDTO getMaterialInfoInOrder(String orderNo, String supplierNo, String materialNo) throws Exception {
//获取订单信息
SAPMaterialInfoInOrderDTO materialInfoInOrder = sapService.getMaterialInfoInOrder(orderNo, supplierNo, materialNo);
if (Objects.isNull(materialInfoInOrder))
throw (new Exception("无法获取到有效订单信息" + orderNo));
SAPSyncParamsDTO syncParams = new SAPSyncParamsDTO();
syncParams.setMaktx(materialInfoInOrder.getMaktx());
syncParams.setEbelp(materialInfoInOrder.getEbelp());
syncParams.setMatnr(materialInfoInOrder.getMatnr());
syncParams.setMenge(materialInfoInOrder.getMenge());
syncParams.setWemng(materialInfoInOrder.getWemng());
syncParams.setMeins(materialInfoInOrder.getMeins());
syncParams.setEbeln(materialInfoInOrder.getEbeln());
syncParams.setTransportNum(materialInfoInOrder.getTransportNum());
syncParams.setMatkl(materialInfoInOrder.getMatkl());
syncParams.setWgbez(materialInfoInOrder.getWgbez());
syncParams.setWerks(materialInfoInOrder.getWerks());
syncParams.setLbprt(materialInfoInOrder.getLbprt());
syncParams.setKzkri(materialInfoInOrder.getKzkri());
//获取仓库信息
List<String> warehouseNos = new ArrayList<>();
warehouseNos.add(materialInfoInOrder.getWarehouseNo());
List<String> materialNos=new ArrayList<>();
materialNos.add(materialInfoInOrder.getMatnr());
List<SAPSyncFromDTO> list = sapService.getStorage(materialInfoInOrder.getWerks(), warehouseNos, materialNos, null, null);
if (!CollectionUtil.isEmpty(list)) {
//同步仓库信息
SAPSyncFromDTO dbWarehouse = list.get(0);
syncParams.setWarehouseNo(dbWarehouse.getWarehouseNo());
syncParams.setBinNos(dbWarehouse.getBinNos());
}
return syncParams;
}
}

View File

@ -26,12 +26,13 @@ public class SapService {
/** /**
* 获取库存信息 * 获取库存信息
* @param factory 工厂编号 *
* @param factory 工厂编号
* @param warehouseNos 仓库编号列表 * @param warehouseNos 仓库编号列表
* @param beginTime 开始时间格式yyyyMMdd * @param beginTime 开始时间格式yyyyMMdd
* @param endTime 结束时间格式yyyyMMdd * @param endTime 结束时间格式yyyyMMdd
*/ */
public List<SAPSyncFromDTO> getStorage(String factory, List<String> warehouseNos,List<String> materialNos, String beginTime, String endTime) { public List<SAPSyncFromDTO> getStorage(String factory, List<String> warehouseNos, List<String> materialNos, String beginTime, String endTime) {
Map<String, Object> parameters = new HashMap<>(); Map<String, Object> parameters = new HashMap<>();
parameters.put("I_WERKS", factory); parameters.put("I_WERKS", factory);
parameters.put("I_TYPE", Objects.nonNull(beginTime) || Objects.nonNull(endTime) ? "I" : "A"); parameters.put("I_TYPE", Objects.nonNull(beginTime) || Objects.nonNull(endTime) ? "I" : "A");
@ -74,11 +75,12 @@ public class SapService {
/** /**
* 获取订单中物料的信息 * 获取订单中物料的信息
* @param orderNo 采购单号 *
* @param orderNo 采购单号
* @param supplierNo 供应商编号 * @param supplierNo 供应商编号
* @param materialNo 物料编号 * @param materialNo 物料编号
*/ */
public SAPMaterialInfoInOrderDTO getMaterialInfoInOrder(String orderNo, String supplierNo, String materialNo){ public SAPMaterialInfoInOrderDTO getMaterialInfoInOrder(String orderNo, String supplierNo, String materialNo) {
Map<String, Object> parameters = new HashMap<>(); Map<String, Object> parameters = new HashMap<>();
parameters.put("I_EBELN", orderNo); parameters.put("I_EBELN", orderNo);
parameters.put("I_LIFNR", supplierNo); parameters.put("I_LIFNR", supplierNo);
@ -89,19 +91,37 @@ public class SapService {
tOut.setRow(0); tOut.setRow(0);
return new SAPMaterialInfoInOrderDTO() return new SAPMaterialInfoInOrderDTO()
.setTransportNum(tOut.getBigDecimal("WSHSL")) .setTransportNum(tOut.getBigDecimal("WSHSL"))
.setWarehouseNo(tOut.getString("LGORT")); .setWarehouseNo(tOut.getString("LGORT"))
.setAtwrt(tOut.getString("ATWRT"))
.setBsart(tOut.getString("BSART"))
.setEbeln(tOut.getString("EBELN"))
.setEbelp(tOut.getString("EBELP"))
.setMatnr(tOut.getString("MATNR"))
.setMaktx(tOut.getString("MAKTX"))
.setKzkri(tOut.getString("KZKRI"))
.setMeins(tOut.getString("MEINS"))
.setMenge(tOut.getBigDecimal("MENGE"))
.setMatkl(tOut.getString("MATKL"))
.setWgbez(tOut.getString("WGBEZ"))
.setWerks(tOut.getString("WERKS"))
.setWebre(tOut.getString("WEBRE"))
.setLbprt(tOut.getString("LBPRZ"))
.setEkgrp(tOut.getString("EKGRP"))
.setBsart(tOut.getString("BSART"))
.setLifnr(tOut.getString("LIFNR"))
;
} }
/** /**
* 搜索订单 * 搜索订单
*
* @param supplierNo 供应商编码 * @param supplierNo 供应商编码
*/ */
public List<SAPOrderDTO> searchOrder(String supplierNo) { public List<SAPOrderDTO> searchOrder(String supplierNo) {
Map<String, Object> parameters = new HashMap<>(); Map<String, Object> parameters = new HashMap<>();
parameters.put("I_LIFNR", supplierNo); parameters.put("I_LIFNR", supplierNo);
JCoTable tOut = exec("ZRFC_MM_SMXT", parameters,null,"T_SMXTOUT"); JCoTable tOut = exec("ZRFC_MM_SMXT", parameters, null, "T_SMXTOUT");
List<SAPOrderDTO> result = new ArrayList<>(); List<SAPOrderDTO> result = new ArrayList<>();
for (int i = 0; i < tOut.getNumRows(); i++) { for (int i = 0; i < tOut.getNumRows(); i++) {
tOut.setRow(i); tOut.setRow(i);
@ -121,16 +141,16 @@ public class SapService {
} }
private JCoTable exec(String functionName, Map<String, Object> parameters) { private JCoTable exec(String functionName, Map<String, Object> parameters) {
return exec(functionName, parameters, null,"T_OUT"); return exec(functionName, parameters, null, "T_OUT");
} }
private JCoTable exec(String functionName, Map<String, Object> parameters, Map<String, List<Map<String, Object>>> tables) { private JCoTable exec(String functionName, Map<String, Object> parameters, Map<String, List<Map<String, Object>>> tables) {
return exec(functionName, parameters, tables,"T_OUT"); return exec(functionName, parameters, tables, "T_OUT");
} }
private JCoTable exec(String functionName, Map<String, Object> parameters, Map<String, List<Map<String, Object>>> tables,String outName) { private JCoTable exec(String functionName, Map<String, Object> parameters, Map<String, List<Map<String, Object>>> tables, String outName) {
try { try {
log.info("SAP functionName:{}",functionName); log.info("SAP functionName:{}", functionName);
JCoFunction function = repository.getFunction(functionName); JCoFunction function = repository.getFunction(functionName);
log.info("SAP ImportParameter:{}", JSONUtil.toJsonStr(parameters)); log.info("SAP ImportParameter:{}", JSONUtil.toJsonStr(parameters));
if (CollectionUtil.isNotEmpty(parameters)) { if (CollectionUtil.isNotEmpty(parameters)) {
@ -151,7 +171,7 @@ public class SapService {
JCoTable out = function.getTableParameterList().getTable(outName); JCoTable out = function.getTableParameterList().getTable(outName);
log.info("SAP返回: {}", out); log.info("SAP返回: {}", out);
return out; return out;
}catch (JCoException ex){ } catch (JCoException ex) {
log.error("SAP错误", ex); log.error("SAP错误", ex);
throw new NflgException(STATE.BusinessError, "SAP错误"); throw new NflgException(STATE.BusinessError, "SAP错误");
} }

View File

@ -24,8 +24,8 @@ public enum STATE {
PageError(114, "页面异常"), PageError(114, "页面异常"),
BusinessError(115, "业务异常"), BusinessError(115, "业务异常"),
RequestMethodError(116, "请求方式错误"), RequestMethodError(116, "请求方式错误"),
InconsistentDataError(117, "需要用户确认") InconsistentDataError(117, "需要用户确认"),
; NoOrderData(118, "订单不存在");
@Getter @Getter
private final Integer state; private final Integer state;

View File

@ -0,0 +1,86 @@
package com.nflg.wms.common.pojo.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class SAPSyncParamsDTO {
/**
* 未收货数量
*/
private BigDecimal transportNum;
/**
* 仓库编号
*/
private String warehouseNo;
/**
* 货位编号
*/
private String binNos;
/**
* 采购凭证号
*/
private String ebeln;
/**
* 采购凭证行项目
*/
private String ebelp;
/**
* 物料号
*/
private String matnr;
/**
* 物料描述
*/
private String maktx;
/**
* 采购订单数量
*/
private BigDecimal menge;
/**
* 收货数量
*/
private BigDecimal wemng;
/**
* 单位
*/
private String meins;
/**
* 物料组
*/
private String matkl;
/**
* 物料描述描述
*/
private String wgbez;
/**
* 工厂
*/
private String werks;
/**
* 打印参数
*/
private String lbprt;
/**
* 是否质检
*/
private String kzkri;
}

View File

@ -0,0 +1,40 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class PDAScanCodeQO {
/**
* 二维码编号
*/
private String codeId;
/**
* 数量
*/
@NotNull
private BigDecimal codeNum;
/**
* 批次号
*/
private String batchNumber;
/**
* 序列号,多个序列号使用;号隔开
*/
private String serialNumber;
/**
* 二维码内容
*/
private String codeContent;
}

View File

@ -0,0 +1,28 @@
package com.nflg.wms.common.pojo.qo;
import lombok.Data;
@Data
public class SRMOrderSearchQO extends SearchBaseQO {
/**
* 送货单号
*/
private String noteNum;
/**
* 供应商编号
*/
private String supplierNum;
/**
* 订单号
*/
private String poNum;
/**
* 物料编号
*/
private String itemCode;
}

View File

@ -0,0 +1,70 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 送货单收货参数
*/
@Data
public class SrmMaterialReceiptQO {
/**
* 订单编号
*/
private String noteNum;
/**
* 送货单行号
* */
public String lineNumber;
/**
* 供应商编号
*/
private String supplierNum;
/**
* 采购订单号
*/
private String poNum;
/**
* 采购订单行号
*/
private String poLineNumber;
/**
* 物料编码
*/
private String itemCode;
/**
* 普通物料送货单的详情ID
*/
@NotNull
private Long orderItemId;
/**
* 收货数量如果是需要质检的数量为0
*/
@NotNull
private BigDecimal receiptNum;
/**
* 越库数量
*/
@NotNull
private BigDecimal crossNumber;
/**
* 扫码记录
*/
@NotEmpty
private List<PDAScanCodeQO> scanCodes;
}

View File

@ -0,0 +1,81 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class PDAOrderItemVO {
private Long id;
/**
* 送货单行号
* */
public String lineNumber;
/**
* 采购订单号
*/
private String poNum;
/**
* 采购订单行号
*/
private String poLineNumber;
/**
* 物料编码
*/
private String itemCode;
/**
* 物料描述
*/
private String itemName;
/**
* 订单数量
*/
private BigDecimal orderQty;
/**
* 单位
*/
private String uomCode;
/**
* 送货数量
*/
private BigDecimal deliveryQty;
/**
* 收货仓库
*/
private String receivedWarehouse;
/**
* 货位编号
*/
private String binNos;
/**
* 是否质检
*/
private Boolean isQuality;
/**
* 打印参数
* 1-批次号为空序列号为空
* 2-批次号必填序列号为空
* 3-批次号为空序列号必填
* 4-批次号必填序列号必填
*/
private String lbprt;
/**
* 未收货数量,如果收货数量大于了未收数量需要抛出异常
*/
private BigDecimal transportNum;
}

View File

@ -0,0 +1,30 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
import java.util.List;
@Data
public class PDAOrderVO {
/**
* 订单编号
*/
private String noteNum;
/**
* 供应商编号
*/
private String supplierNum;
/**
* 供应商名称
*/
private String supplierName;
/**
* 订单项
*/
private List<PDAOrderItemVO> orderItemVOList;
}

View File

@ -0,0 +1,118 @@
package com.nflg.wms.common.pojo.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class SRMOrderItemVO {
private Long id;
/**
* 送货单行号
*/
private String lineNumber;
/**
* 订单编号
*/
private String noteNum;
/**
* 采购订单号
*/
private String poNum;
/**
* 采购订单行号
*/
private String poLineNumber;
/**
* 送货单行号
*/
private String lineNumber;
/**
* 物料编码
*/
private String itemCode;
/**
* 物料描述
*/
private String itemName;
/**
* 订单数量
*/
private BigDecimal orderQty;
/**
* 单位
*/
private String uomCode;
/**
* 送货数量
*/
private BigDecimal deliveryQty;
/**
* 不合格数量
*/
private BigDecimal unqualifiedQty;
/**
* 合格数量
*/
private BigDecimal qualifiedQty;
/**
* 越库数量
*/
private BigDecimal crossNumber;
/**
* 收货数量
*/
private BigDecimal receiptNum;
/**
* 收货仓库
*/
private String receivedWarehouse;
/**
* 订单需求日期
*/
private String demandDate;
/**
* 实际送货时间
*/
private String deliveryNoteDate;
/**
* 采购订单类型
*/
private String orderType;
/**
* 是否质检
*/
private Boolean isQuality;
/**
* 上架状态
*/
private Integer dataStatus;
/**
* 扫描码数量
*/
private Integer scanCodeNum;
}

View File

@ -0,0 +1,48 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
@Data
public class SrmOrderVO {
/**
* 送货单号
*/
private String noteNum;
/**
* 公司
*/
private String ouCode;
/**
* 工厂
*/
private String iuCode;
/**
* 采购组
*/
private String purchaseGroup;
/**
* 发货时间
*/
private String deliveryNoteDate;
/**
* 运单号
*/
private String waybillNum;
/**
* 供应商编号
*/
private String supplierNum;
/**
* 供应商名称
*/
private String supplierName;
}

View File

@ -65,4 +65,14 @@ public class WmsSrmOrder implements Serializable {
* 创建时间 * 创建时间
*/ */
private LocalDateTime createTime; private LocalDateTime createTime;
/**
* 公司
*/
private String ouCode;
/**
* 发货时间
*/
private LocalDateTime deliveryNoteDate;
} }

View File

@ -95,14 +95,4 @@ public class WmsSrmOrderItem implements Serializable {
* 是否质检 * 是否质检
*/ */
private Boolean isQuality; private Boolean isQuality;
/**
* 发货时间
*/
private String deliveryNoteDate;
/**
* 公司
*/
private String ouCode;
} }

View File

@ -1,6 +1,7 @@
package com.nflg.wms.repository.mapper; package com.nflg.wms.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nflg.wms.common.pojo.vo.SRMOrderItemVO;
import com.nflg.wms.repository.entity.WmsSrmOrderItem; import com.nflg.wms.repository.entity.WmsSrmOrderItem;
/** /**
@ -12,5 +13,5 @@ import com.nflg.wms.repository.entity.WmsSrmOrderItem;
* @since 2025 * @since 2025
*/ */
public interface WmsSrmOrderItemMapper extends BaseMapper<WmsSrmOrderItem> { public interface WmsSrmOrderItemMapper extends BaseMapper<WmsSrmOrderItem> {
SRMOrderItemVO getOrderItem(Long orderId);
} }

View File

@ -1,16 +1,20 @@
package com.nflg.wms.repository.mapper; package com.nflg.wms.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.wms.common.pojo.qo.SRMOrderSearchQO;
import com.nflg.wms.common.pojo.vo.SrmOrderVO;
import com.nflg.wms.repository.entity.WmsSrmOrder; import com.nflg.wms.repository.entity.WmsSrmOrder;
/** /**
* <p> * <p>
* Mapper 接口 * Mapper 接口
* </p> * </p>
* *
* @author 代码生成器生成 * @author 代码生成器生成
* @since 2025 * @since 2025
*/ */
public interface WmsSrmOrderMapper extends BaseMapper<WmsSrmOrder> { public interface WmsSrmOrderMapper extends BaseMapper<WmsSrmOrder> {
IPage<SrmOrderVO> search(SRMOrderSearchQO request, Page<?> objectPage);
} }

View File

@ -1,16 +1,17 @@
package com.nflg.wms.repository.service; package com.nflg.wms.repository.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.wms.common.pojo.vo.SRMOrderItemVO;
import com.nflg.wms.repository.entity.WmsSrmOrderItem; import com.nflg.wms.repository.entity.WmsSrmOrderItem;
/** /**
* <p> * <p>
* 服务类 * 服务类
* </p> * </p>
* *
* @author 代码生成器生成 * @author 代码生成器生成
* @since 2025 * @since 2025
*/ */
public interface IWmsSrmOrderItemService extends IService<WmsSrmOrderItem> { public interface IWmsSrmOrderItemService extends IService<WmsSrmOrderItem> {
SRMOrderItemVO getOrderItem(Long orderId);
} }

View File

@ -1,7 +1,12 @@
package com.nflg.wms.repository.service; package com.nflg.wms.repository.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.SRMOrderSearchQO;
import com.nflg.wms.common.pojo.vo.SrmOrderVO;
import com.nflg.wms.repository.entity.WmsSrmOrder; import com.nflg.wms.repository.entity.WmsSrmOrder;
import jakarta.validation.Valid;
/** /**
* <p> * <p>
@ -13,4 +18,5 @@ import com.nflg.wms.repository.entity.WmsSrmOrder;
*/ */
public interface IWmsSrmOrderService extends IService<WmsSrmOrder> { public interface IWmsSrmOrderService extends IService<WmsSrmOrder> {
IPage<SrmOrderVO> search(@Valid SRMOrderSearchQO request);
} }

View File

@ -39,8 +39,8 @@ public class WmsInTaskServiceImpl extends ServiceImpl<WmsInTaskMapper, WmsInTask
return result; return result;
} }
try { try {
List<WmsInTask> newTaskList = new ArrayList<WmsInTask>(); List<WmsInTask> newTaskList = new ArrayList<>();
List<WmsInTask> oldTaskList = new ArrayList<WmsInTask>(); List<WmsInTask> oldTaskList = new ArrayList<>();
tasks.forEach(task -> { tasks.forEach(task -> {
String taskNumber = "SJ-" + task.getNoteNum(); String taskNumber = "SJ-" + task.getNoteNum();

View File

@ -1,6 +1,7 @@
package com.nflg.wms.repository.service.impl; package com.nflg.wms.repository.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.wms.common.pojo.vo.SRMOrderItemVO;
import com.nflg.wms.repository.entity.WmsSrmOrderItem; import com.nflg.wms.repository.entity.WmsSrmOrderItem;
import com.nflg.wms.repository.mapper.WmsSrmOrderItemMapper; import com.nflg.wms.repository.mapper.WmsSrmOrderItemMapper;
import com.nflg.wms.repository.service.IWmsSrmOrderItemService; import com.nflg.wms.repository.service.IWmsSrmOrderItemService;
@ -17,4 +18,8 @@ import org.springframework.stereotype.Service;
@Service @Service
public class WmsSrmOrderItemServiceImpl extends ServiceImpl<WmsSrmOrderItemMapper, WmsSrmOrderItem> implements IWmsSrmOrderItemService { public class WmsSrmOrderItemServiceImpl extends ServiceImpl<WmsSrmOrderItemMapper, WmsSrmOrderItem> implements IWmsSrmOrderItemService {
@Override
public SRMOrderItemVO getOrderItem(Long orderId) {
return baseMapper.getOrderItem(orderId);
}
} }

View File

@ -1,6 +1,10 @@
package com.nflg.wms.repository.service.impl; package com.nflg.wms.repository.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.SRMOrderSearchQO;
import com.nflg.wms.common.pojo.vo.SrmOrderVO;
import com.nflg.wms.repository.entity.WmsSrmOrder; import com.nflg.wms.repository.entity.WmsSrmOrder;
import com.nflg.wms.repository.mapper.WmsSrmOrderMapper; import com.nflg.wms.repository.mapper.WmsSrmOrderMapper;
import com.nflg.wms.repository.service.IWmsSrmOrderService; import com.nflg.wms.repository.service.IWmsSrmOrderService;
@ -8,7 +12,7 @@ import org.springframework.stereotype.Service;
/** /**
* <p> * <p>
* 服务实现类 * 服务实现类
* </p> * </p>
* *
* @author 代码生成器生成 * @author 代码生成器生成
@ -17,4 +21,8 @@ import org.springframework.stereotype.Service;
@Service @Service
public class WmsSrmOrderServiceImpl extends ServiceImpl<WmsSrmOrderMapper, WmsSrmOrder> implements IWmsSrmOrderService { public class WmsSrmOrderServiceImpl extends ServiceImpl<WmsSrmOrderMapper, WmsSrmOrder> implements IWmsSrmOrderService {
@Override
public IPage<SrmOrderVO> search(SRMOrderSearchQO request) {
return baseMapper.search(request, new Page<>(request.getPage(), request.getPageSize()));
}
} }

View File

@ -1,5 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.wms.repository.mapper.WmsSrmOrderItemMapper"> <mapper namespace="com.nflg.wms.repository.mapper.WmsSrmOrderItemMapper">
<select id="getOrderItem" resultType="com.nflg.wms.common.pojo.vo.SRMOrderItemVO">
SELECT a.id,
c.note_num,
a.line_number,
a.order_type,
a.po_num,
a.po_line_number,
a.item_code,
a.item_name,
a.uom_code,
a.order_qty,
a.delivery_qty,
sum(d.unqualified_qty) as unqualified_qty,
sum(d.qualified_qty) as qualified_qty,
sum(b.receipt_num) as receipt_num,
sum(b.cross_number) as cross_number,
b.received_warehouse,
a.demand_date,
c.delivery_note_date,
case when b.is_quality is null then a.is_quality else b.is_quality end,
COALESCE(d.data_status, 0) as data_status,
count(d.item_code) as scan_code_num
from wms_srm_order_item a left join wms_srm_material_receipt b on a.id = b.order_item_id
left join wms_srm_order c on a.order_id = c.id
left join wms_in_task_item d on c.note_num = d.note_num and a.line_number = d.line_number
left join wms_srm_material_receipt_item e on b.id=e.receipt_id
where a.id = #{orderId}
GROUP BY a.id,
c.note_num, a.line_number, a.order_type,
a.po_num, a.po_line_number,
a.item_code, a.item_name, a.uom_code,
a.order_qty, a.delivery_qty, b.received_warehouse,
a.demand_date, c.delivery_note_date, d.data_status, b.is_quality, a.is_quality
</select>
</mapper> </mapper>

View File

@ -1,5 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.wms.repository.mapper.WmsSrmOrderMapper"> <mapper namespace="com.nflg.wms.repository.mapper.WmsSrmOrderMapper">
<select id="search" resultType="com.nflg.wms.common.pojo.vo.SrmOrderVO">
select a.iu_code,a.note_num,a.purchase_group,a.waybill_num,a.supplier_num,a.create_time, a.delivery_note_date
,a.ou_code,
b.supplier_name from wms_srm_order a left join user_supplier b on a.supplier_num=b.supplier_code
<if test="request.noteNum !=null and request.noteNum !='' ">
and a.note_num like concat('%', #{request.noteNum}, '%')
</if>
<if test="request.supplierNum !=null and request.supplierNum !='' ">
and a.supplier_num =#{request.supplierNum}
</if>
<if test="request.poNum !=null and request.poNum !='' ">
and EXISTS (select 1 from wms_srm_order_item where a.id=wms_srm_order_item.order_id and
wms_srm_order_item.po_num like concat('%', #{request.poNum}, '%')
</if>
<if test="request.itemCode !=null and request.itemCode !='' ">
and EXISTS (select 1 from wms_srm_order_item where a.id=wms_srm_order_item.order_id and
wms_srm_order_item.item_code like concat('%', #{request.itemCode}, '%')
</if>
<if test="request.startDate !=null and request.startDate !='' ">
and a.delivery_note_date >= #{request.startDate}
</if>
<if test="request.endDate !=null and request.endDate !='' ">
and a.delivery_note_date &lt;= #{request.endDate}
</if>
order by a.delivery_note_date desc
</select>
</mapper> </mapper>

View File

@ -46,6 +46,8 @@
<if test="request.itemCode !=null and request.itemCode !='' "> <if test="request.itemCode !=null and request.itemCode !='' ">
and a.item_code like =#{request.itemCode} and a.item_code like =#{request.itemCode}
</if> </if>
order by a.create_time desc
</where> </where>
</select> </select>
</mapper> </mapper>

View File

@ -33,7 +33,7 @@ public class CodeGeneratorTest {
) )
.strategyConfig(builder -> { .strategyConfig(builder -> {
builder builder
.addInclude("wms_srm_material_receipt") //只生成指定表 .addInclude("wms_srm_material_receipt_item") //只生成指定表
.entityBuilder().idType(IdType.ASSIGN_ID) .entityBuilder().idType(IdType.ASSIGN_ID)
.enableLombok() .enableLombok()
.enableChainModel() .enableChainModel()