This commit is contained in:
zhangke 2025-08-04 15:56:48 +08:00
parent 57377c33c5
commit 9cd3aae9a6
13 changed files with 368 additions and 36 deletions

View File

@ -1,19 +1,29 @@
package com.nflg.wms.admin.controller;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import com.nflg.wms.admin.service.CenterOutboundControllerService;
import com.nflg.wms.admin.service.CenterReturnControllerService;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.C_MaterialOutboundItemQO;
import com.nflg.wms.common.pojo.qo.C_MaterialOutboundSearchQO;
import com.nflg.wms.common.pojo.qo.C_MaterialReturnSearchQO;
import com.nflg.wms.common.pojo.vo.C_MaterialOutboundVO;
import com.nflg.wms.common.pojo.vo.C_MaterialReturnItemVO;
import com.nflg.wms.common.pojo.vo.C_MaterialReturnVO;
import com.nflg.wms.common.pojo.vo.ScanCodeVO;
import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.*;
import com.nflg.wms.common.util.PageUtil;
import com.nflg.wms.repository.entity.WmsCenterOutboundItem;
import com.nflg.wms.repository.entity.WmsCenterOutboundScan;
import com.nflg.wms.repository.entity.WmsCenterReturnItem;
import com.nflg.wms.repository.service.IWmsCenterOutboundItemService;
import com.nflg.wms.repository.service.IWmsCenterOutboundScanService;
import com.nflg.wms.repository.service.IWmsCenterOutboundService;
import com.nflg.wms.starter.annotation.ApiMark;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 中心领料单
@ -21,35 +31,169 @@ import java.util.List;
@RestController
@RequestMapping("/center/outbound")
public class CeneterOutboundControlelr {
@Resource
private IWmsCenterOutboundService wmsCenterOutboundService;
@Resource
private IWmsCenterOutboundItemService wmsCenterOutboundItemService;
@Resource
private IWmsCenterOutboundScanService wmsCenterOutboundScanService;
@Resource
private CenterOutboundControllerService outboundControllerService;
/**
* 查询领料单列表
*
* @param request 领料单搜索请求参数对象包含分页信息和搜索条件
* @return 返回分页的领料单数据包含领料单列表和分页信息
*/
@PostMapping("search")
@ApiMark(moduleName = "中心领料单管理", apiName = "领料单列表")
public ApiResult<PageData<C_MaterialOutboundVO>> search(@Valid @RequestBody C_MaterialOutboundSearchQO request) {
// return ApiResult.success(wmsSrmOrderService.search(request));
return null;
// 调用服务层查询领料单数据并转换为前端需要的VO对象格式
PageData<C_MaterialOutboundVO> pageData = PageUtil.convert(wmsCenterOutboundService.search(request), d -> Convert.convert(C_MaterialOutboundVO.class, d));
return ApiResult.success(pageData);
}
/**
* 获取领料单详情
*
* @param orderId 领料单ID
* @return 领料单明细项列表
*/
//收货单详情
@GetMapping("getOrderItem")
@ApiMark(moduleName = "中心领料单管理", apiName = "领料单详情")
public ApiResult<C_MaterialOutboundItemQO> getOrderItem(@RequestParam Long orderId) {
return null;
// return ApiResult.success(wmsSrmOrderItemService.getOrderItem(orderId));
public ApiResult<List<C_MaterialOutboundItemVO>> getOrderItem(@RequestParam Long orderId) {
// 查询退库单对应的明细项
List<WmsCenterOutboundItem> items = wmsCenterOutboundItemService.lambdaQuery()
.eq(WmsCenterOutboundItem::getOrderId, orderId)
.list();
// 如果明细项为空返回空列表
if (CollectionUtil.isEmpty(items)) {
return ApiResult.success(Collections.emptyList());
}
// 将明细项转换为VO对象
List<C_MaterialOutboundItemVO> vos = items.stream()
.map(this::convertToVO)
.collect(Collectors.toList());
return ApiResult.success(vos);
}
private C_MaterialOutboundItemVO convertToVO(WmsCenterOutboundItem item) {
C_MaterialOutboundItemVO vo = new C_MaterialOutboundItemVO();
if (item != null) {
vo.setId(item.getId());
vo.setOrderId(item.getOrderId());
vo.setReservedNumberId(item.getReservedNumberId());
vo.setMaterialNo(item.getMaterialNo());
vo.setMaterialDesc(item.getMaterialDesc());
vo.setUnit(item.getUnit());
vo.setFactory(item.getFactory());
vo.setQty(item.getQty());
vo.setWarehouseNumber(item.getWarehouseNumber());
vo.setQty(item.getQty());
}
return vo;
}
/**
* 获取物料的扫码信息
*
* @param orderItemId 订单项ID
* @return 返回扫码信息列表
*/
@GetMapping("getScanCodes")
@ApiMark(moduleName = "中心领料单管理", apiName = "条码详情")
public ApiResult<List<ScanCodeVO>> getScanCodes(@RequestParam String orderItemId) {
// 查询退库单对应的明细项
List<WmsCenterOutboundScan> items = wmsCenterOutboundScanService.lambdaQuery()
.eq(WmsCenterOutboundScan::getItemId, orderItemId)
.list();
// 如果明细项为空返回空列表
if (CollectionUtil.isEmpty(items)) {
return ApiResult.success(Collections.emptyList());
}
// 将明细项转换为VO对象
List<ScanCodeVO> vos = items.stream()
.map(this::convertToScanCodeVO)
.collect(Collectors.toList());
return ApiResult.success(vos);
}
private ScanCodeVO convertToScanCodeVO(WmsCenterOutboundScan item) {
ScanCodeVO vo = new ScanCodeVO();
if (item != null) {
vo.setCodeId(item.getCodeId());
vo.setCodeNum(item.getCodeNum());
vo.setBatchNumber(item.getBatchNumber());
vo.setSerialNumber(item.getSerialNumber());
vo.setCodeContent(item.getCodeContent());
}
return vo;
}
/**
* 根据预留单号查询出库信息
*
* @param reservedNumber 预留单号
* @return 出库信息列表的API结果
*/
@PostMapping("getOutboundItems")
@ApiMark(moduleName = "中心领料单管理", apiName = "从SAP查询中心领料单信息")
public ApiResult<List<C_MaterialOutboundSAPItemVO>> getOutboundItems(@RequestParam String reservedNumber) {
// 查询预留单对应的出库项信息
List<C_MaterialOutboundSAPItemVO> sapItems = outboundControllerService.getOrderItem(reservedNumber);
// 如果查询结果为空则返回空列表
if (Objects.isNull(sapItems) || CollectionUtil.isEmpty(sapItems)) {
return ApiResult.success(Collections.emptyList());
}
// 返回查询到的出库信息列表
return ApiResult.success(sapItems);
}
// 根据预留单号查询出库信息
//确认出库
// 获取出库单列表信息
// 获取出库单详情信息
//获取物料的扫码信息
@GetMapping("getScanCodes")
@ApiMark(moduleName = "中心领料单管理", apiName = "条码详情")
public List<ScanCodeVO> getScanCodes(@RequestParam String orderItemId) {
return null;
// return wmsSrmOrderItemService.getScanCodes(orderItemId);
/**
* 确认出库操作
*
* @param request 出库请求参数包含出库物料信息必须经过验证
* @return ApiResult<Void> 操作结果成功时返回空数据的API结果
*/
@PostMapping("confirmOutbound")
@ApiMark(moduleName = "中心领料单管理", apiName = "出库确认")
public ApiResult<Void> confirmOutbound(@Valid @RequestBody C_MaterialOutboundQO request) {
// 调用出库服务执行确认出库操作
outboundControllerService.confirmOutbound(request);
return ApiResult.success();
}
// 获取物料出库的推荐批次根据物料编号+仓库+工厂+数量 按照有效期和批次号进行升序排序
/**
* 获取推荐物料出库项列表
*
* @param request 推荐项查询参数对象包含查询条件
* @return ApiResult<List < C_MaterialOutboundreCommendationItemVO>> 包含推荐物料出库项列表的API结果对象
*/
@PostMapping("getCommendationItems")
@ApiMark(moduleName = "中心领料单管理", apiName = "获取出库的建议内容")
public ApiResult<List<C_MaterialOutboundreCommendationItemVO>> getCommendationItems(@Valid @RequestBody CommendationItemQO request) {
// 调用出库控制器服务获取推荐项数据并返回成功结果
return ApiResult.success(outboundControllerService.getCommendationItems(request));
}
}

View File

@ -61,7 +61,7 @@ public class CenterReturnController {
@ApiMark(moduleName = "中心物料退库管理", apiName = "退库单列表")
public ApiResult<PageData<C_MaterialReturnVO>> search(@Valid @RequestBody C_MaterialReturnSearchQO request) {
// 调用服务层查询退库单数据并转换为前端需要的VO对象格式
PageData<C_MaterialReturnVO> pageData = PageUtil.convert(wmsCenterReturnService.searchDictionary(request), d -> Convert.convert(C_MaterialReturnVO.class, d));
PageData<C_MaterialReturnVO> pageData = PageUtil.convert(wmsCenterReturnService.search(request), d -> Convert.convert(C_MaterialReturnVO.class, d));
return ApiResult.success(pageData);
}
@ -145,8 +145,9 @@ public class CenterReturnController {
}
/**
/**
* 根据预留单号查询退货信息
*
* @param reservedNumber 预留单号
* @return ApiResult<C_SAPMaterialReturnVO> 退货信息结果封装
* @throws JCoException SAP连接异常
@ -168,7 +169,7 @@ public class CenterReturnController {
}
/**
/**
* 提交退货信息
*
* @param request 退货申请参数对象包含退货物料的相关信息

View File

@ -26,20 +26,19 @@ public class BasdeSerialNumberControllerService {
)
public String generateSerialNumber(Integer businessType) {
String currentDate = LocalDate.now().format(DATE_FORMATTER);
int retryCount = 0;
LambdaQueryWrapper<BasdeSerialNumber> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(BasdeSerialNumber::getBusinessType, businessType)
.eq(BasdeSerialNumber::getCurrentDateStr, currentDate);
BasdeSerialNumber serialNumber = basdeSerialNumberService.lambdaQuery()
.eq(BasdeSerialNumber::getBusinessType, businessType)
.eq(BasdeSerialNumber::getCurrentDateStr, currentDate)
.one();
if (Objects.isNull(serialNumber)) {
return null;
}
int nextSerial = serialNumber.getMaxSerial() + 1;
int nextSerial = 0;
if (serialNumber.getCurrentDateStr().equals(currentDate)) {
nextSerial = serialNumber.getMaxSerial();
}
nextSerial = nextSerial + 1;
serialNumber.setMaxSerial(nextSerial);
serialNumber.setCurrentDateStr(currentDate);
basdeSerialNumberService.updateById(serialNumber);

View File

@ -0,0 +1,42 @@
package com.nflg.wms.admin.service;
import com.nflg.wms.common.pojo.dto.SapImportResultDTO;
import com.nflg.wms.common.pojo.qo.C_MaterialOutboundQO;
import com.nflg.wms.common.pojo.qo.CommendationItemQO;
import com.nflg.wms.common.pojo.vo.C_MaterialOutboundSAPItemVO;
import com.nflg.wms.common.pojo.vo.C_MaterialOutboundreCommendationItemVO;
import com.nflg.wms.repository.service.IWmsCenterOutboundItemService;
import com.nflg.wms.repository.service.IWmsCenterOutboundScanService;
import com.nflg.wms.repository.service.IWmsCenterOutboundService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class CenterOutboundControllerService {
@Resource
private IWmsCenterOutboundService wmsCenterOutboundService;
@Resource
private IWmsCenterOutboundItemService wmsCenterOutboundItemService;
@Resource
private IWmsCenterOutboundScanService wmsCenterOutboundScanService;
@Resource
private SapService sapService;
public List<C_MaterialOutboundSAPItemVO> getOrderItem(String reservedNumber) {
}
public void confirmOutbound(C_MaterialOutboundQO request) {
}
public List<C_MaterialOutboundreCommendationItemVO> getCommendationItems(CommendationItemQO request) {
}
}

View File

@ -0,0 +1,14 @@
package com.nflg.wms.common.pojo.dto;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class SapImportResultDTO {
//SAP同步的结果
private boolean syncStatus;
//SAP同步失败的错误信息
private String syncMsg;
}

View File

@ -3,6 +3,7 @@ package com.nflg.wms.common.pojo.qo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.List;
@Data
@ -28,7 +29,7 @@ public class C_MaterialOutboundItemQO {
private String resbMeins;
// 实际出库数量
private String resbErfmg;
private BigDecimal resbErfmg;
//扫码信息
private List<ScanCodeQO> scanCodes;

View File

@ -0,0 +1,19 @@
package com.nflg.wms.common.pojo.qo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
@Data
@Accessors(chain = true)
public class CommendationItemQO {
//工厂
private String factory;
//物料编号
private String materialNo;
// 仓库编号
private String warehouseNumber;
//出库数量
private BigDecimal qty;
}

View File

@ -0,0 +1,57 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.List;
@Data
@Accessors(chain = true)
public class C_MaterialOutboundSAPItemVO {
/**
* 预留单行号
*/
private String reservedNumberId;
/**
* 物料编号
*/
private String materialNo;
/**
* 物料描述
*/
private String materialDesc;
/**
* 单位
*/
private String unit;
/**
* 工厂
*/
private String factory;
/**
* 领料数量
*/
private BigDecimal qty;
/**
* 默认仓库
*/
private String warehouseNumber;
/**
* 货位编号
*/
private String binNos;
/**
* 推荐物料出库列表
*/
private List<C_MaterialOutboundreCommendationItemVO> recommendationItems;
}

View File

@ -0,0 +1,20 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
@Data
@Accessors(chain = true)
public class C_MaterialOutboundreCommendationItemVO {
/**
* 推荐的批次号
*/
private String recommendationBatchCode;
/**
* 推荐的数量
*/
private BigDecimal recommendationBatchNum;
}

View File

@ -1,7 +1,10 @@
package com.nflg.wms.repository.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.wms.common.pojo.qo.C_MaterialOutboundSearchQO;
import com.nflg.wms.repository.entity.WmsCenterOutbound;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.validation.Valid;
/**
* <p>
@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IWmsCenterOutboundService extends IService<WmsCenterOutbound> {
IPage<WmsCenterOutbound> search(@Valid C_MaterialOutboundSearchQO request);
}

View File

@ -20,7 +20,7 @@ import java.util.List;
*/
public interface IWmsCenterReturnService extends IService<WmsCenterReturn> {
IPage<WmsCenterReturn> searchDictionary(@Valid C_MaterialReturnSearchQO request);
IPage<WmsCenterReturn> search(@Valid C_MaterialReturnSearchQO request);
void saveReturns(WmsCenterReturn wmsCenterReturn, List<WmsCenterReturnItem> wmsCenterReturnItems, List<WmsCenterReturnScan> wmsCenterReturnScans);
}

View File

@ -1,6 +1,12 @@
package com.nflg.wms.repository.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.wms.common.pojo.qo.C_MaterialOutboundSearchQO;
import com.nflg.wms.repository.entity.WmsCenterOutbound;
import com.nflg.wms.repository.entity.WmsCenterReturn;
import com.nflg.wms.repository.mapper.WmsCenterOutboundMapper;
import com.nflg.wms.repository.service.IWmsCenterOutboundService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -17,4 +23,29 @@ import org.springframework.stereotype.Service;
@Service
public class WmsCenterOutboundServiceImpl extends ServiceImpl<WmsCenterOutboundMapper, WmsCenterOutbound> implements IWmsCenterOutboundService {
@Override
public IPage<WmsCenterOutbound> search(C_MaterialOutboundSearchQO request) {
// 参数非空校验
if (request == null) {
throw new IllegalArgumentException("请求参数不能为空");
}
// 分页参数校验
int page = request.getPage() <= 0 ? 1 : request.getPage();
int pageSize = request.getPageSize() <= 0 ? 10 : request.getPageSize();
LambdaQueryWrapper<WmsCenterOutbound> queryWrapper = new LambdaQueryWrapper<>();
if (StrUtil.isNotBlank(request.getOrderNumber())) {
// 对用户输入进行转义防止SQL注入
String orderNumber = request.getOrderNumber().replace("\\", "\\\\").replace("%", "\\%").replace("_", "\\_");
queryWrapper.like(WmsCenterOutbound::getOrderNumber, orderNumber);
}
if (StrUtil.isNotBlank(request.getReservedNumber())) {
// 对用户输入进行转义防止SQL注入
String reservedNumber = request.getReservedNumber().replace("\\", "\\\\").replace("%", "\\%").replace("_", "\\_");
queryWrapper.like(WmsCenterOutbound::getReservedNumber, reservedNumber);
}
queryWrapper.orderByDesc(WmsCenterOutbound::getId);
return baseMapper.selectPage(new Page<>(page, pageSize), queryWrapper);
}
}

View File

@ -48,7 +48,7 @@ public class WmsCenterReturnServiceImpl extends ServiceImpl<WmsCenterReturnMappe
* @throws IllegalArgumentException 当请求参数为空时抛出异常
*/
@Override
public IPage<WmsCenterReturn> searchDictionary(C_MaterialReturnSearchQO request) {
public IPage<WmsCenterReturn> search(C_MaterialReturnSearchQO request) {
// 参数非空校验
if (request == null) {
throw new IllegalArgumentException("请求参数不能为空");