feat(wms):调整 check 的实现

This commit is contained in:
YunaiV
2026-05-15 11:00:26 +08:00
parent d8f9f0d029
commit 3a38a69fa5
4 changed files with 227 additions and 0 deletions

View File

@ -0,0 +1,89 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.sku.WmsItemSkuPageReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.sku.WmsItemSkuRespVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemBrandDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemCategoryDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemBrandService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemCategoryService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
/**
* WMS 商品 SKU Controller。
*
* <p>SKU 维度的查询入口:弹窗 / 选择器场景使用,按 SKU 一行展开,支持商品 / 品牌 / 分类多表联查筛选。
* 复用商品权限 {@code wms:item:query}不单独建权限点lite 也是商品/SKU 共用 {@code wms:item:list})。
*
* <p>SKU 的新增 / 修改 / 删除仍随商品弹窗一并维护,不在本 Controller 暴露。
*/
@Tag(name = "管理后台 - WMS 商品 SKU")
@RestController
@RequestMapping("/wms/item-sku")
@Validated
public class WmsItemSkuController {
@Resource
private WmsItemSkuService itemSkuService;
@Resource
private WmsItemService itemService;
@Resource
private WmsItemCategoryService categoryService;
@Resource
private WmsItemBrandService brandService;
@GetMapping("/page")
@Operation(summary = "获得商品 SKU 分页", description = "按 SKU 维度分页,支持商品 / 品牌 / 分类多表联查筛选")
@PreAuthorize("@ss.hasPermission('wms:item:query')")
public CommonResult<PageResult<WmsItemSkuRespVO>> getItemSkuPage(@Valid WmsItemSkuPageReqVO pageReqVO) {
PageResult<WmsItemSkuDO> pageResult = itemSkuService.getItemSkuPage(pageReqVO);
return success(new PageResult<>(buildItemSkuRespVOList(pageResult.getList()), pageResult.getTotal()));
}
// ==================== 拼接 VO ====================
private List<WmsItemSkuRespVO> buildItemSkuRespVOList(List<WmsItemSkuDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 查询关联数据
Map<Long, WmsItemDO> itemMap = itemService.getItemMap(convertSet(list, WmsItemSkuDO::getItemId));
Map<Long, WmsItemCategoryDO> categoryMap = categoryService.getItemCategoryMap(
convertSet(itemMap.values(), WmsItemDO::getCategoryId));
Map<Long, WmsItemBrandDO> brandMap = brandService.getItemBrandMap(
convertSet(itemMap.values(), WmsItemDO::getBrandId));
// 拼接 VO
return BeanUtils.toBean(list, WmsItemSkuRespVO.class, vo -> MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
vo.setItemCode(item.getCode()).setItemName(item.getName()).setUnit(item.getUnit())
.setCategoryId(item.getCategoryId()).setBrandId(item.getBrandId());
MapUtils.findAndThen(categoryMap, item.getCategoryId(), category ->
vo.setCategoryName(category.getName()));
MapUtils.findAndThen(brandMap, item.getBrandId(), brand ->
vo.setBrandName(brand.getName()));
}));
}
}

View File

@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.sku;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Schema(description = "管理后台 - WMS 商品 SKU 分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WmsItemSkuPageReqVO extends PageParam {
@Schema(description = "商品编号", example = "I00000001")
private String itemCode;
@Schema(description = "商品名称", example = "华为 nova flip")
private String itemName;
@Schema(description = "商品分类编号", example = "1")
private Long categoryId;
@Schema(description = "商品品牌编号", example = "1")
private Long brandId;
@Schema(description = "规格编号", example = "S00000001")
private String code;
@Schema(description = "规格名称", example = "黑色")
private String name;
@Schema(description = "条码", example = "12345678")
private String barCode;
}

View File

@ -1,8 +1,12 @@
package cn.iocoder.yudao.module.wms.dal.mysql.md.item;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.sku.WmsItemSkuPageReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import org.apache.ibatis.annotations.Mapper;
@ -18,6 +22,27 @@ import java.util.List;
@Mapper
public interface WmsItemSkuMapper extends BaseMapperX<WmsItemSkuDO> {
/**
* 按 SKU 维度分页查询,支持商品 / 品牌 / 分类多表联查筛选。
*
* 使用 {@link MPJLambdaWrapperX} 替代 lite 的手写 XML JOIN见 lite
* {@code ItemSkuMapper.selectByBo}),范式参照本模块 {@code WmsInventoryMapper.selectPage}。
*/
default PageResult<WmsItemSkuDO> selectPage(WmsItemSkuPageReqVO reqVO) {
MPJLambdaWrapperX<WmsItemSkuDO> query = new MPJLambdaWrapperX<WmsItemSkuDO>()
.selectAll(WmsItemSkuDO.class)
.innerJoin(WmsItemDO.class, WmsItemDO::getId, WmsItemSkuDO::getItemId)
.likeIfPresent(WmsItemDO::getCode, reqVO.getItemCode())
.likeIfPresent(WmsItemDO::getName, reqVO.getItemName())
.eqIfPresent(WmsItemDO::getCategoryId, reqVO.getCategoryId())
.eqIfPresent(WmsItemDO::getBrandId, reqVO.getBrandId())
.likeIfPresent(WmsItemSkuDO::getCode, reqVO.getCode())
.likeIfPresent(WmsItemSkuDO::getName, reqVO.getName())
.likeIfPresent(WmsItemSkuDO::getBarCode, reqVO.getBarCode())
.orderByDesc(WmsItemSkuDO::getId);
return selectJoinPage(reqVO, WmsItemSkuDO.class, query);
}
default List<WmsItemSkuDO> selectListByItemId(Long itemId) {
return selectList(new LambdaQueryWrapperX<WmsItemSkuDO>()
.eq(WmsItemSkuDO::getItemId, itemId)

View File

@ -0,0 +1,77 @@
package cn.iocoder.yudao.module.wms.service.inventory.dto;
import cn.iocoder.yudao.module.wms.enums.order.WmsOrderTypeEnum;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* WMS 库存盘点请求 DTO
*
* @author 芋道源码
*/
@Data
public class WmsInventoryCheckReqDTO {
/**
* 单据编号
*/
private Long orderId;
/**
* 单据号
*/
private String orderNo;
/**
* 单据类型
*
* 枚举 {@link WmsOrderTypeEnum#getType()}
*/
private Integer orderType;
/**
* 库存盘点明细
*/
private List<Item> items;
/**
* WMS 库存盘点明细
*/
@Data
public static class Item {
/**
* 库存编号
*/
private Long inventoryId;
/**
* SKU 编号
*/
private Long skuId;
/**
* 仓库编号
*/
private Long warehouseId;
/**
* 账面数量
*/
private BigDecimal quantity;
/**
* 实盘数量
*/
private BigDecimal checkQuantity;
// ========= 单价备注相关字段 =========
/**
* 单价
*/
private BigDecimal price;
/**
* 备注
*/
private String remark;
}
}