feat: 商品、规格、分类

This commit is contained in:
DataCall 2024-07-18 16:56:50 +08:00
parent 99274993f5
commit 86b0abaf7f
22 changed files with 1914 additions and 0 deletions

View file

@ -0,0 +1,111 @@
package com.ruoyi.wms.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.excel.utils.ExcelUtil;
import com.ruoyi.common.idempotent.annotation.RepeatSubmit;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.mybatis.core.page.PageQuery;
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
import com.ruoyi.common.web.core.BaseController;
import com.ruoyi.wms.domain.bo.ItemCategoryBo;
import com.ruoyi.wms.domain.vo.ItemCategoryVo;
import com.ruoyi.wms.domain.vo.ItemTypeTreeSelectVo;
import com.ruoyi.wms.service.ItemCategoryService;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/wms/itemCategory")
public class ItemCategoryController extends BaseController {
private final ItemCategoryService itemCategoryService;
/**
* 查询物料类型列表
*/
@GetMapping("/list")
public TableDataInfo<ItemCategoryVo> list(ItemCategoryBo bo, PageQuery pageQuery) {
return itemCategoryService.queryPageList(bo, pageQuery);
}
/**
* 获取物料类型下拉树列表
*/
@GetMapping("/treeselect")
public R treeselect(ItemCategoryBo query) {
List<ItemCategoryVo> itemTypes = itemCategoryService.queryList(query);
return R.ok(itemCategoryService.buildItemTypeTreeSelect(itemTypes));
}
/**
* 导出物料类型列表
*/
@Log(title = "物料类型", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ItemCategoryBo bo, HttpServletResponse response) {
List<ItemCategoryVo> list = itemCategoryService.queryList(bo);
ExcelUtil.exportExcel(list, "物料类型", ItemCategoryVo.class, response);
}
/**
* 获取物料类型详细信息
*
* @param itemTypeId 主键
*/
@GetMapping("/{itemTypeId}")
public R<ItemCategoryVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long itemTypeId) {
return R.ok(itemCategoryService.queryById(itemTypeId));
}
/**
* 新增物料类型
*/
@Log(title = "物料类型", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ItemCategoryBo bo) {
return toAjax(itemCategoryService.insertByBo(bo));
}
/**
* 修改物料类型
*/
@Log(title = "物料类型", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ItemCategoryBo bo) {
return toAjax(itemCategoryService.updateByBo(bo));
}
/**
* 删除物料类型
*
* @param itemTypeIds 主键串
*/
@Log(title = "物料类型", businessType = BusinessType.DELETE)
@DeleteMapping("/{itemTypeIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] itemTypeIds) {
List<Long> ids = new ArrayList<>(Arrays.asList(itemTypeIds));
return toAjax(itemCategoryService.deleteWithValidByIds(ids));
}
@PostMapping("/update/orderNum")
public R<Void> updateOrderNum(@RequestBody List<ItemTypeTreeSelectVo> tree) {
return toAjax(itemCategoryService.updateOrderNum(tree));
}
}

View file

@ -0,0 +1,119 @@
package com.ruoyi.wms.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.excel.utils.ExcelUtil;
import com.ruoyi.common.idempotent.annotation.RepeatSubmit;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.mybatis.core.page.PageQuery;
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
import com.ruoyi.common.web.core.BaseController;
import com.ruoyi.wms.domain.bo.ItemBo;
import com.ruoyi.wms.domain.vo.ItemVo;
import com.ruoyi.wms.service.ItemService;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/wms/item")
public class ItemController extends BaseController {
private final ItemService itemService;
/**
* 查询物料列表
*/
@GetMapping("/list")
public TableDataInfo<ItemVo> list(ItemBo bo, PageQuery pageQuery) {
return itemService.queryPageList(bo, pageQuery);
}
/**
* 查询物料列表
*/
@GetMapping("/selectList")
public List<ItemVo> selectList(ItemBo bo) {
return itemService.queryList(bo);
}
/**
* 导出物料列表
*/
@Log(title = "物料", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ItemBo bo, HttpServletResponse response) {
List<ItemVo> list = itemService.queryList(bo);
ExcelUtil.exportExcel(list, "物料", ItemVo.class, response);
}
/**
* 获取物料详细信息
*
* @param id 主键
*/
@GetMapping("/{id}")
public R<ItemVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(itemService.queryById(id));
}
/**
* 新增物料
*/
// @Log(title = "物料", businessType = BusinessType.INSERT)
// @RepeatSubmit()
// @PostMapping("/byBo")
// public R<Void> addByBo(@Validated(AddGroup.class) @RequestBody ItemBo bo) {
// return toAjax(itemService.insertByBo(bo));
// }
/**
* 新增物料
*/
@Log(title = "物料", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ItemBo form) {
return toAjax(itemService.insertByForm(form));
}
/**
* 修改物料
*/
@Log(title = "物料", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ItemBo form) {
return toAjax(itemService.updateByForm(form));
}
/**
* 修改物料
*/
// @Log(title = "物料", businessType = BusinessType.UPDATE)
// @RepeatSubmit()
// @PutMapping("/byBo")
// public R<Void> editByBo(@Validated(EditGroup.class) @RequestBody ItemBo bo) {
// return toAjax(itemService.updateByBo(bo));
// }
/**
* 删除物料
*
* @param ids 主键串
*/
@Log(title = "物料", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(itemService.deleteWithValidByIds(List.of(ids), true));
}
}

View file

@ -0,0 +1,100 @@
package com.ruoyi.wms.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.excel.utils.ExcelUtil;
import com.ruoyi.common.idempotent.annotation.RepeatSubmit;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.mybatis.core.page.PageQuery;
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
import com.ruoyi.common.web.core.BaseController;
import com.ruoyi.wms.domain.bo.ItemSkuBo;
import com.ruoyi.wms.domain.vo.ItemSkuVo;
import com.ruoyi.wms.service.ItemSkuService;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/wms/itemSku")
public class ItemSkuController extends BaseController {
private final ItemSkuService itemSkuService;
/**
* 查询sku信息列表
*/
@GetMapping("/list")
public TableDataInfo<ItemSkuVo> list(ItemSkuBo bo, PageQuery pageQuery) {
return itemSkuService.queryPageList(bo, pageQuery);
}
/**
* 查询sku信息列表
*/
@GetMapping("/selectList")
public List<ItemSkuVo> selectList(ItemSkuBo bo) {
return itemSkuService.queryList(bo);
}
/**
* 导出sku信息列表
*/
@Log(title = "sku信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ItemSkuBo bo, HttpServletResponse response) {
List<ItemSkuVo> list = itemSkuService.queryList(bo);
ExcelUtil.exportExcel(list, "sku信息", ItemSkuVo.class, response);
}
/**
* 获取sku信息详细信息
*
* @param id 主键
*/
@GetMapping("/{id}")
public R<ItemSkuVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(itemSkuService.queryById(id));
}
/**
* 新增sku信息
*/
@Log(title = "sku信息", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ItemSkuBo bo) {
return toAjax(itemSkuService.insertByBo(bo));
}
/**
* 修改sku信息
*/
@Log(title = "sku信息", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ItemSkuBo bo) {
return toAjax(itemSkuService.updateByBo(bo));
}
/**
* 删除sku信息
*
* @param ids 主键串
*/
@Log(title = "sku信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(itemSkuService.deleteWithValidByIds(List.of(ids), true));
}
}

View file

@ -0,0 +1,62 @@
package com.ruoyi.wms.domain.bo;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
import com.ruoyi.wms.domain.entity.Item;
import com.ruoyi.wms.domain.vo.ItemSkuVo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = Item.class, reverseConvertGenerate = false)
public class ItemBo extends BaseEntity {
/**
*
*/
@NotNull(message = "不能为空", groups = { EditGroup.class })
private Long id;
/**
* 主键集合
*/
private List<Long> ids;
/**
* 编号
*/
private String itemNo;
/**
* 名称
*/
@NotBlank(message = "名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String itemName;
/**
* 分类
*/
@NotBlank(message = "分类不能为空", groups = { AddGroup.class, EditGroup.class })
private String itemCategory;
/**
* 单位类别
*/
private String unit;
/**
* 备注
*/
private String remark;
private List<ItemSkuBo> sku;
}

View file

@ -0,0 +1,46 @@
package com.ruoyi.wms.domain.bo;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
import com.ruoyi.wms.domain.entity.ItemCategory;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ItemCategory.class, reverseConvertGenerate = false)
public class ItemCategoryBo extends BaseEntity {
/**
* 物料类型id
*/
@NotNull(message = "物料类型id不能为空", groups = { EditGroup.class })
private Long id;
/**
* 父物料类型id
*/
private Long parentId;
/**
* 物料类型名称
*/
@NotBlank(message = "物料类型名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String categoryName;
/**
* 显示顺序
*/
private Long orderNum;
/**
* 物料类型状态0停用 1正常
*/
private String status;
}

View file

@ -0,0 +1,72 @@
package com.ruoyi.wms.domain.bo;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
import com.ruoyi.wms.domain.entity.ItemSku;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ItemSku.class, reverseConvertGenerate = false)
public class ItemSkuBo extends BaseEntity {
/**
*
*/
@NotNull(message = "不能为空", groups = { EditGroup.class })
private Long id;
/**
* 规格名称
*/
@NotBlank(message = "规格名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String skuName;
/**
*
*/
@NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class })
private Long itemId;
/**
* sku编码
*/
private String outSkuId;
/**
* 入库价格
*/
private BigDecimal inPrice;
/**
* 出库价格
*/
private BigDecimal outPrice;
/**
* 库存预警
*/
private BigDecimal quantity;
/**
* 商品名称
*/
private String itemName;
/**
* 商品编码
*/
private String itemNo;
/**
* 商品分类
*/
private String itemCategory;
}

View file

@ -0,0 +1,58 @@
package com.ruoyi.wms.domain.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("wms_item")
public class Item extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@TableId(value = "id")
private Long id;
/**
* 编号
*/
private String itemNo;
/**
* 名称
*/
private String itemName;
/**
* 分类
*/
private String itemCategory;
/**
* 单位类别
*/
private String unit;
/**
* 删除标识
*/
@TableLogic
private Integer delFlag;
/**
* 备注
*/
private String remark;
}

View file

@ -0,0 +1,53 @@
package com.ruoyi.wms.domain.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("wms_item_category")
public class ItemCategory extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 物料类型id
*/
@TableId(value = "id")
private Long id;
/**
* 父物料类型id
*/
private Long parentId;
/**
* 物料类型名称
*/
private String categoryName;
/**
* 显示顺序
*/
private Long orderNum;
/**
* 物料类型状态0停用 1正常
*/
private String status;
/**
* 删除标志0代表存在 1代表删除
*/
@TableLogic
private String delFlag;
}

View file

@ -0,0 +1,65 @@
package com.ruoyi.wms.domain.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.math.BigDecimal;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("wms_item_sku")
public class ItemSku extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@TableId(value = "id")
private Long id;
/**
* 规格名称
*/
private String skuName;
/**
*
*/
private Long itemId;
/**
* sku编码
*/
private String outSkuId;
/**
* 入库价格
*/
private BigDecimal inPrice;
/**
* 出库价格
*/
private BigDecimal outPrice;
/**
* 库存预警
*/
private BigDecimal quantity;
/**
* 删除标识
*/
@TableLogic
private Integer delFlag;
}

View file

@ -0,0 +1,69 @@
package com.ruoyi.wms.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.common.excel.annotation.ExcelDictFormat;
import com.ruoyi.common.excel.convert.ExcelDictConvert;
import com.ruoyi.wms.domain.entity.ItemCategory;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ItemCategory.class)
public class ItemCategoryVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 物料类型id
*/
@ExcelProperty(value = "物料类型id")
private Long id;
/**
* 父物料类型id
*/
@ExcelProperty(value = "父物料类型id")
private Long parentId;
/**
* 祖级列表
*/
@ExcelProperty(value = "祖级列表")
private String ancestors;
/**
* 物料类型名称
*/
@ExcelProperty(value = "物料类型名称")
private String categoryName;
/**
* 显示顺序
*/
@ExcelProperty(value = "显示顺序")
private Long orderNum;
/**
* 物料类型状态0正常 1停用
*/
@ExcelProperty(value = "物料类型状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "0=正常,1=停用")
private String status;
/**
* 子物料类型
*/
@TableField(exist = false)
private List<ItemCategoryVo> children = new ArrayList<ItemCategoryVo>();
}

View file

@ -0,0 +1,88 @@
package com.ruoyi.wms.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.ruoyi.wms.domain.entity.ItemSku;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ItemSku.class)
public class ItemSkuVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "")
private Long id;
/**
* 规格名称
*/
@ExcelProperty(value = "规格名称")
private String skuName;
/**
*
*/
@ExcelProperty(value = "")
private Long itemId;
/**
*
*/
@ExcelProperty(value = "")
private String itemName;
/**
*
*/
@ExcelProperty(value = "")
private String itemNo;
/**
* sku编码
*/
@ExcelProperty(value = "sku编码")
private String outSkuId;
/**
* 入库价格
*/
@ExcelProperty(value = "入库价格")
private BigDecimal inPrice;
/**
* 出库价格
*/
@ExcelProperty(value = "出库价格")
private BigDecimal outPrice;
/**
* 库存预警
*/
@ExcelProperty(value = "库存预警")
private BigDecimal quantity;
/**
* 所属分类名称
*/
@ExcelProperty(value = "所属分类名称")
private String itemCategoryName;
private Integer delFlag;
private Long itemCategoryId;
}

View file

@ -0,0 +1,67 @@
package com.ruoyi.wms.domain.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;
public class ItemTypeTreeSelectVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 节点ID
*/
private Long id;
/**
* 节点名称
*/
private String label;
/**
* 子节点
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<ItemTypeTreeSelectVo> children;
public ItemTypeTreeSelectVo() {
}
public ItemTypeTreeSelectVo(ItemCategoryVo itemType) {
this.id = itemType.getId();
this.label = itemType.getCategoryName();
this.children = itemType.getChildren().stream().map(ItemTypeTreeSelectVo::new).collect(Collectors.toList());
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public List<ItemTypeTreeSelectVo> getChildren() {
return children;
}
public void setChildren(List<ItemTypeTreeSelectVo> children) {
this.children = children;
}
}

View file

@ -0,0 +1,64 @@
package com.ruoyi.wms.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.ruoyi.wms.domain.entity.Item;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = Item.class)
public class ItemVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "")
private Long id;
/**
* 编号
*/
@ExcelProperty(value = "编号")
private String itemNo;
/**
* 名称
*/
@ExcelProperty(value = "名称")
private String itemName;
/**
* 分类
*/
@ExcelProperty(value = "分类")
private String itemCategory;
/**
* 单位类别
*/
@ExcelProperty(value = "单位类别")
private String unit;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 类别
*/
private ItemCategoryVo itemCategoryInfo;
private List<ItemSkuVo> sku;
}

View file

@ -0,0 +1,12 @@
package com.ruoyi.wms.mapper;
import com.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import com.ruoyi.wms.domain.entity.ItemCategory;
import com.ruoyi.wms.domain.vo.ItemCategoryVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface ItemCategoryMapper extends BaseMapperPlus<ItemCategory, ItemCategoryVo> {
int updateOrderNum(@Param("list") List<ItemCategory> list);
}

View file

@ -0,0 +1,14 @@
package com.ruoyi.wms.mapper;
import com.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import com.ruoyi.wms.domain.entity.Item;
import com.ruoyi.wms.domain.vo.ItemVo;
import org.apache.ibatis.annotations.Param;
import java.util.Collection;
import java.util.List;
public interface ItemMapper extends BaseMapperPlus<Item, ItemVo> {
List<Item> selectByIdsIgnoreDelFlag(@Param("list") Collection<Long> ids);
}

View file

@ -0,0 +1,25 @@
package com.ruoyi.wms.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import com.ruoyi.wms.domain.bo.ItemSkuBo;
import com.ruoyi.wms.domain.entity.ItemSku;
import com.ruoyi.wms.domain.vo.ItemSkuVo;
import org.apache.ibatis.annotations.Param;
import java.util.Collection;
import java.util.List;
public interface ItemSkuMapper extends BaseMapperPlus<ItemSku, ItemSkuVo> {
/**
*
* @param itemIds
* @return
*/
List<ItemSku> selectByIdsIgnoreDelFlag(@Param("list") Collection<Long> itemIds);
int batchUpdate(@Param("list") Collection<ItemSku> list);
IPage<ItemSkuVo> selectByBo(IPage<ItemSkuVo> page, @Param("bo") ItemSkuBo bo);
}

View file

@ -0,0 +1,226 @@
package com.ruoyi.wms.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.utils.MapstructUtils;
import com.ruoyi.common.mybatis.core.page.PageQuery;
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
import com.ruoyi.wms.domain.bo.ItemCategoryBo;
import com.ruoyi.wms.domain.entity.Item;
import com.ruoyi.wms.domain.entity.ItemCategory;
import com.ruoyi.wms.domain.vo.ItemCategoryVo;
import com.ruoyi.wms.domain.vo.ItemTypeTreeSelectVo;
import com.ruoyi.wms.mapper.ItemCategoryMapper;
import com.ruoyi.wms.mapper.ItemMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static cn.hutool.core.lang.Validator.isNotNull;
@RequiredArgsConstructor
@Service
public class ItemCategoryService extends ServiceImpl<ItemCategoryMapper, ItemCategory> {
private final ItemCategoryMapper baseMapper;
private final ItemMapper itemMapper;
/**
* 查询物料类型
*/
public ItemCategoryVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 查询物料类型列表
*/
public TableDataInfo<ItemCategoryVo> queryPageList(ItemCategoryBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ItemCategory> lqw = buildQueryWrapper(bo);
Page<ItemCategoryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询物料类型列表
*/
public List<ItemCategoryVo> queryList(ItemCategoryBo bo) {
LambdaQueryWrapper<ItemCategory> lqw = buildQueryWrapper(bo);
lqw.orderByAsc(ItemCategory::getOrderNum);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ItemCategory> buildQueryWrapper(ItemCategoryBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ItemCategory> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getParentId() != null, ItemCategory::getParentId, bo.getParentId());
lqw.like(StrUtil.isNotBlank(bo.getCategoryName()), ItemCategory::getCategoryName, bo.getCategoryName());
lqw.eq(bo.getOrderNum() != null, ItemCategory::getOrderNum, bo.getOrderNum());
lqw.eq(StrUtil.isNotBlank(bo.getStatus()), ItemCategory::getStatus, bo.getStatus());
return lqw;
}
/**
* 新增物料类型
*/
public Boolean insertByBo(ItemCategoryBo bo) {
if (!validateItemTypeName(bo)) {
throw new RuntimeException("分类名重复");
}
ItemCategory add = MapstructUtils.convert(bo, ItemCategory.class);
LambdaQueryWrapper<ItemCategory> wrapper = new LambdaQueryWrapper<>();
if (bo.getParentId() != null){
wrapper.eq(ItemCategory::getParentId, bo.getParentId());
ItemCategory info = baseMapper.selectById(bo.getParentId());
}else {
wrapper.eq(ItemCategory::getParentId, 0L);
}
//查当前级别排序最大值
wrapper.orderByDesc(ItemCategory::getOrderNum);
wrapper.last("limit 1");
ItemCategory itemType = baseMapper.selectOne(wrapper);
add.setOrderNum(itemType == null ? 0L : itemType.getOrderNum() + 1);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改物料类型
*/
public Boolean updateByBo(ItemCategoryBo bo) {
if (!validateItemTypeName(bo)) {
throw new RuntimeException("分类名重复");
}
ItemCategory update = MapstructUtils.convert(bo, ItemCategory.class);
return baseMapper.updateById(update) > 0;
}
private boolean validateItemTypeName(ItemCategoryBo bo) {
LambdaQueryWrapper<ItemCategory> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(ItemCategory::getCategoryName, bo.getCategoryName());
queryWrapper.ne(bo.getId() != null, ItemCategory::getId, bo.getId());
return baseMapper.selectCount(queryWrapper) == 0;
}
/**
* 批量删除物料类型
*/
@Transactional
public Boolean deleteWithValidByIds(List<Long> ids) {
//因为分类只有两级直接查一下子分类根据分类id把分类和商品全删了就行
LambdaQueryWrapper<ItemCategory> itemTypeWrapper = new LambdaQueryWrapper<>();
itemTypeWrapper.in(ItemCategory::getParentId, ids);
List<Long> subIdList = baseMapper.selectList(itemTypeWrapper).stream().map(ItemCategory::getId).collect(Collectors.toList());
if (!CollUtil.isEmpty(subIdList)) {
ids.addAll(subIdList);
}
int rows = baseMapper.deleteBatchIds(ids);
if (rows < 1) {
throw new RuntimeException("删除分类失败");
}
LambdaQueryWrapper<Item> itemWrapper = new LambdaQueryWrapper<>();
itemWrapper.in(Item::getItemCategory, ids);
itemMapper.delete(itemWrapper);
return true;
}
/**
* @param itemTypes
* @return
*/
public List<ItemTypeTreeSelectVo> buildItemTypeTreeSelect(List<ItemCategoryVo> itemTypes) {
List<ItemCategoryVo> itemTypeTrees = buildDeptTree(itemTypes);
return itemTypeTrees.stream().map(ItemTypeTreeSelectVo::new).collect(Collectors.toList());
}
/**
* 构建前端所需要树结构
*
* @param itemTypes 部门列表
* @return 树结构列表
*/
private List<ItemCategoryVo> buildDeptTree(List<ItemCategoryVo> itemTypes) {
List<ItemCategoryVo> returnList = new ArrayList<>();
List<Long> tempList = new ArrayList<Long>();
for (ItemCategoryVo dept : itemTypes) {
tempList.add(dept.getId());
}
for (Iterator<ItemCategoryVo> iterator = itemTypes.iterator(); iterator.hasNext(); ) {
ItemCategoryVo dept = (ItemCategoryVo) iterator.next();
// 如果是顶级节点, 遍历该父节点的所有子节点
if (!tempList.contains(dept.getParentId())) {
recursionFn(itemTypes, dept);
returnList.add(dept);
}
}
if (returnList.isEmpty()) {
returnList = itemTypes;
}
return returnList;
}
/**
* 递归列表
*/
private void recursionFn(List<ItemCategoryVo> list, ItemCategoryVo t) {
// 得到子节点列表
List<ItemCategoryVo> childList = getChildList(list, t);
t.setChildren(childList);
for (ItemCategoryVo tChild : childList) {
if (hasChild(list, tChild)) {
recursionFn(list, tChild);
}
}
}
/**
* 得到子节点列表
*/
private List<ItemCategoryVo> getChildList(List<ItemCategoryVo> list, ItemCategoryVo t) {
List<ItemCategoryVo> tlist = new ArrayList<>();
for (ItemCategoryVo n : list) {
if (isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getId().longValue()) {
tlist.add(n);
}
}
return tlist;
}
/**
* 判断是否有子节点
*/
private boolean hasChild(List<ItemCategoryVo> list, ItemCategoryVo t) {
return getChildList(list, t).size() > 0;
}
public int updateOrderNum(List<ItemTypeTreeSelectVo> tree) {
List<ItemCategory> updateList = new ArrayList<>();
for (int i = 0; i < tree.size(); i++) {
ItemCategory itemType = new ItemCategory();
itemType.setId(tree.get(i).getId());
itemType.setOrderNum((long) i);
updateList.add(itemType);
}
return baseMapper.updateOrderNum(updateList);
}
}

View file

@ -0,0 +1,242 @@
package com.ruoyi.wms.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.utils.MapstructUtils;
import com.ruoyi.common.mybatis.core.page.PageQuery;
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
import com.ruoyi.wms.domain.bo.ItemBo;
import com.ruoyi.wms.domain.bo.ItemSkuBo;
import com.ruoyi.wms.domain.entity.Item;
import com.ruoyi.wms.domain.entity.ItemCategory;
import com.ruoyi.wms.domain.entity.ItemSku;
import com.ruoyi.wms.domain.vo.ItemCategoryVo;
import com.ruoyi.wms.domain.vo.ItemSkuVo;
import com.ruoyi.wms.domain.vo.ItemVo;
import com.ruoyi.wms.mapper.ItemCategoryMapper;
import com.ruoyi.wms.mapper.ItemMapper;
import com.ruoyi.wms.mapper.ItemSkuMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@RequiredArgsConstructor
@Service
@Log4j2
public class ItemService {
private final ItemMapper baseMapper;
private final ItemSkuService itemSkuService;
private final ItemSkuMapper itemSkuMapper;
private final ItemCategoryMapper itemCategoryMapper;
/**
* 查询物料
*/
public ItemVo queryById(Long id) {
ItemVo item = baseMapper.selectVoById(id);
item.setSku(itemSkuService.queryListByItemId(id));
return item;
}
/**
* 查询物料
*
* @param itemIds ids
*/
public List<ItemVo> queryById(List<Long> itemIds) {
if (itemIds == null || itemIds.isEmpty()) {
return CollUtil.newArrayList();
}
LambdaQueryWrapper<Item> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.in(Item::getId, itemIds);
return baseMapper.selectVoList(lambdaQueryWrapper);
}
/**
* 忽略删除标识查询商品
* @param ids
* @return
*/
public List<ItemVo> queryByIdsIgnoreDelFlag(Collection<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return CollUtil.newArrayList();
}
return MapstructUtils.convert(baseMapper.selectByIdsIgnoreDelFlag(ids), ItemVo.class);
}
/**
* 查询物料列表
*/
public TableDataInfo<ItemVo> queryPageList(ItemBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<Item> lqw = buildQueryWrapper(bo);
Page<ItemVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
List<ItemVo> itemVoList = result.getRecords();
if (!CollUtil.isEmpty(itemVoList)) {
LambdaQueryWrapper<ItemCategory> itemTypeWrapper = new LambdaQueryWrapper<>();
itemTypeWrapper.in(ItemCategory::getId, itemVoList.stream().map(ItemVo::getItemCategory).collect(Collectors.toSet()));
Map<Long, ItemCategoryVo> itemCategoryVoMap = itemCategoryMapper.selectVoList(itemTypeWrapper).stream().collect(Collectors.toMap(ItemCategoryVo::getId, Function.identity()));
itemVoList.forEach(itemVo -> {
itemVo.setItemCategoryInfo(itemCategoryVoMap.get(Long.valueOf(itemVo.getItemCategory())));
});
}
return TableDataInfo.build(result);
}
/**
* 查询物料列表
*/
public List<ItemVo> queryList(ItemBo bo) {
LambdaQueryWrapper<Item> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<Item> buildQueryWrapper(ItemBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<Item> lqw = Wrappers.lambdaQuery();
lqw.eq(StrUtil.isNotBlank(bo.getItemNo()), Item::getItemNo, bo.getItemNo());
// 主键集合
lqw.in(!CollUtil.isEmpty(bo.getIds()), Item::getId, bo.getIds());
lqw.like(StrUtil.isNotBlank(bo.getItemName()), Item::getItemName, bo.getItemName());
if (!StrUtil.isBlank(bo.getItemCategory())){
Long parentId = Long.valueOf(bo.getItemCategory());
List<Long> subIdList = this.buildSubItemTypeIdList(parentId);
subIdList.add(Long.valueOf(bo.getItemCategory()));
lqw.in(Item::getItemCategory, subIdList);
}
lqw.eq(StrUtil.isNotBlank(bo.getUnit()), Item::getUnit, bo.getUnit());
return lqw;
}
private List<Long> buildSubItemTypeIdList(Long parentId) {
LambdaQueryWrapper<ItemCategory> itemTypeWrapper = new LambdaQueryWrapper<>();
itemTypeWrapper.eq(ItemCategory::getParentId, parentId);
return itemCategoryMapper.selectList(itemTypeWrapper).stream().map(ItemCategory::getId).collect(Collectors.toList());
}
/**
* 新增物料
*/
// public Boolean insertByBo(ItemBo bo) {
// Item add = MapstructUtils.convert(bo, Item.class);
// validEntityBeforeSave(add);
// boolean flag = baseMapper.insert(add) > 0;
// if (flag) {
// bo.setId(add.getId());
// }
// return flag;
// }
/**
* 新增物料
*
* @param bo
*/
@Transactional
public boolean insertByForm(ItemBo bo) {
log.info("新增物料:{}", bo.getSku());
validEntityBeforeSave(bo);
Item item = MapstructUtils.convert(bo, Item.class);
boolean flag = baseMapper.insert(item) > 0;
if (flag) {
bo.setId(item.getId());
flag = itemSkuService.saveSku(bo.getId(), bo.getSku());
}
return flag;
}
/**
* 修改物料
*/
// public Boolean updateByBo(ItemBo bo) {
// Item update = MapstructUtils.convert(bo, Item.class);
// validEntityBeforeSave(update);
// return baseMapper.updateById(update) > 0;
// }
/**
* 修改物料
*
* @param bo
*/
public Boolean updateByForm(ItemBo bo) {
validEntityBeforeSave(bo);
log.info("新增物料:{}", bo.getSku());
boolean flag = baseMapper.updateById(MapstructUtils.convert(bo, Item.class)) > 0;
if (flag) {
flag = itemSkuService.saveSku(bo.getId(), bo.getSku());
}
return flag;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(ItemBo entity) {
if (!validateItemName(entity)) {
throw new RuntimeException("商品名称重复");
}
if (!validateItemNo(entity)) {
throw new RuntimeException("商品编号重复");
}
if (!validateItemSku(entity.getSku())) {
throw new RuntimeException("商品规格重复");
}
}
private boolean validateItemName(ItemBo item) {
LambdaQueryWrapper<Item> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(Item::getItemName, item.getItemName());
queryWrapper.ne(item.getId() != null, Item::getId, item.getId());
return baseMapper.selectCount(queryWrapper) == 0;
}
private boolean validateItemNo(ItemBo form) {
if (StrUtil.isBlank(form.getItemNo())) {
return true;
}
LambdaQueryWrapper<Item> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(Item::getItemNo, form.getItemNo());
queryWrapper.ne(form.getId() != null, Item::getId, form.getId());
return baseMapper.selectCount(queryWrapper) == 0;
}
private boolean validateItemSku(List<ItemSkuBo> skuVoList) {
return skuVoList.stream().map(ItemSkuBo::getSkuName).distinct().count() == skuVoList.size();
}
/**
* 批量删除物料
*/
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
boolean flag = baseMapper.deleteBatchIds(ids) > 0;
if (flag) {
LambdaQueryWrapper<ItemSku> wrapper = new LambdaQueryWrapper<>();
wrapper.in(ItemSku::getItemId, ids);
List<Long> skuIds = itemSkuMapper.selectList(wrapper).stream().map(ItemSku::getId).toList();
flag = itemSkuService.batchUpdateDelFlag(skuIds) > 0;
}
return flag;
}
}

View file

@ -0,0 +1,324 @@
package com.ruoyi.wms.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.core.utils.MapstructUtils;
import com.ruoyi.common.mybatis.core.page.PageQuery;
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
import com.ruoyi.wms.domain.bo.ItemSkuBo;
import com.ruoyi.wms.domain.entity.ItemCategory;
import com.ruoyi.wms.domain.entity.ItemSku;
import com.ruoyi.wms.domain.vo.ItemSkuVo;
import com.ruoyi.wms.domain.vo.ItemVo;
import com.ruoyi.wms.mapper.ItemCategoryMapper;
import com.ruoyi.wms.mapper.ItemMapper;
import com.ruoyi.wms.mapper.ItemSkuMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@RequiredArgsConstructor(onConstructor_ = {@Lazy})
@Service
public class ItemSkuService {
private final ItemSkuMapper baseMapper;
private final ItemService itemService;
private final ItemCategoryMapper itemCategoryMapper;
private final ItemMapper itemMapper;
/**
* 查询sku信息
*/
public ItemSkuVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 根据skuId查询sku信息
*
* @param itemIds skuId
*/
public List<ItemSkuVo> queryByIds(List<Long> itemIds) {
LambdaQueryWrapper<ItemSku> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.in(ItemSku::getItemId, itemIds);
List<ItemSkuVo> itemSkuVos = baseMapper.selectVoList();
// 注入itemName
injectItemInfo(itemSkuVos);
return itemSkuVos;
}
/**
* 根据itemId忽略逻辑删除标识查询sku信息
* @param itemIds
* @return
*/
public List<ItemSkuVo> queryByIdsIgnoreDelFlag(Collection<Long> itemIds) {
if (CollUtil.isEmpty(itemIds)) {
return CollUtil.newArrayList();
}
List<ItemSkuVo> skuVoList = MapstructUtils.convert(baseMapper.selectByIdsIgnoreDelFlag(itemIds), ItemSkuVo.class);
injectItemInfo(skuVoList);
return skuVoList;
}
/**
* 查询sku信息列表用于出入库的选择组件
*/
public TableDataInfo<ItemSkuVo> queryPageList(ItemSkuBo bo, PageQuery pageQuery) {
//开始查sku
IPage<ItemSkuVo> result = baseMapper.selectByBo(pageQuery.build(), bo);
return TableDataInfo.build(result);
}
/**
* 注入itemName
*
* @param records sku信息列表
*/
private void injectItemInfo(List<ItemSkuVo> records) {
List<Long> itemIds = records.stream().map(ItemSkuVo::getItemId).toList();
if (!CollUtil.isEmpty(itemIds)) {
Map<Long, ItemVo> itemMap = itemService.queryByIdsIgnoreDelFlag(itemIds).stream().collect(Collectors.toMap(ItemVo::getId, Function.identity()));
records.forEach(itemSkuVo -> {
ItemVo itemVo = itemMap.get(itemSkuVo.getItemId());
itemSkuVo.setItemName(itemVo.getItemName());
itemSkuVo.setItemNo(itemVo.getItemNo());
itemSkuVo.setItemId(itemVo.getId());
});
}
}
private void injectItemTypeName(List<ItemSkuVo> records) {
List<Long> itemIdList = records.stream().map(ItemSkuVo::getItemId).toList();
if (CollUtil.isNotEmpty(itemIdList)) {
List<ItemVo> itemVos = itemService.queryById(itemIdList);
Map<Long, String> itemToCategoryMap = itemVos.stream().collect(Collectors.toMap(ItemVo::getId, ItemVo::getItemCategory));
Set<String> typeSet = itemVos.stream().map(ItemVo::getItemCategory).collect(Collectors.toSet());
LambdaQueryWrapper<ItemCategory> wrapper = new LambdaQueryWrapper<>();
wrapper.in(ItemCategory::getId, typeSet);
Map<Long, ItemCategory> itemCategoryMap = itemCategoryMapper.selectList(wrapper).stream().collect(Collectors.toMap(ItemCategory::getId, Function.identity()));
records.forEach(itemSkuVo -> {
itemSkuVo.setItemCategoryName(itemCategoryMap.get(Long.valueOf(itemToCategoryMap.get(itemSkuVo.getItemId()))).getCategoryName());
itemSkuVo.setItemCategoryId(itemCategoryMap.get(Long.valueOf(itemToCategoryMap.get(itemSkuVo.getItemId()))).getId());
});
}
}
/**
* 查询sku信息列表
*/
public List<ItemSkuVo> queryList(ItemSkuBo bo) {
LambdaQueryWrapper<ItemSku> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ItemSku> buildQueryWrapper(ItemSkuBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ItemSku> lqw = Wrappers.lambdaQuery();
lqw.like(StrUtil.isNotBlank(bo.getSkuName()), ItemSku::getSkuName, bo.getSkuName());
lqw.eq(bo.getItemId() != null, ItemSku::getItemId, bo.getItemId());
lqw.eq(StrUtil.isNotBlank(bo.getOutSkuId()), ItemSku::getOutSkuId, bo.getOutSkuId());
lqw.eq(bo.getInPrice() != null, ItemSku::getInPrice, bo.getInPrice());
lqw.eq(bo.getOutPrice() != null, ItemSku::getOutPrice, bo.getOutPrice());
lqw.eq(bo.getQuantity() != null, ItemSku::getQuantity, bo.getQuantity());
return lqw;
}
/**
* 新增sku信息
*/
public Boolean insertByBo(ItemSkuBo bo) {
ItemSku add = MapstructUtils.convert(bo, ItemSku.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改sku信息
*/
public Boolean updateByBo(ItemSkuBo bo) {
ItemSku update = MapstructUtils.convert(bo, ItemSku.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(ItemSku entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除sku信息
*/
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 批量新增商品sku
* 1.a)校验传入sku规格条码彼此唯一性 b)校验传入sku和不同商品下sku唯一性
* 2.查询商品未删sku
* 3.比较传入的sku和1中查到的标记需要删除的sku
* 4.批量删除更新新增....
*
* @param itemId 商品id
* @param sku 商品sku
*/
public boolean saveSku(Long itemId, List<ItemSkuBo> sku) {
// 校验填充条码
this.generateOutSkuId(sku, itemId);
List<ItemSkuVo> itemSkuInDb = this.queryListByItemId(itemId);
//商品在库里的sku为空肯定是新增直接批量插入就行了
if (CollUtil.isEmpty(itemSkuInDb)) {
sku.forEach(item -> item.setItemId(itemId));
return baseMapper.insertBatch(MapstructUtils.convert(sku, ItemSku.class));
}
// 标记删除集合
List<ItemSkuVo> deleteList = this.markDeleteItemSkuList(sku, itemSkuInDb);
// 批量删除
int rows = this.batchUpdateDelFlag(deleteList.stream().map(ItemSkuVo::getId).collect(Collectors.toList()));
if (rows < 1) {
throw new RuntimeException("删除商品规格失败");
}
// 批量新增sku
// 遍历sku绑定商品id
sku.forEach(item -> item.setItemId(itemId));
// 筛出更新和新增集合
List<ItemSkuBo> addList = sku.stream().filter(it -> it.getId() == null).toList();
List<ItemSkuBo> updateList = sku.stream().filter(it -> it.getId() != null).toList();
// 批量新增
if (CollUtil.isNotEmpty(addList) && !baseMapper.insertBatch(MapstructUtils.convert(addList, ItemSku.class))) {
throw new RuntimeException("创建商品规格失败");
}
if (CollUtil.isNotEmpty(updateList) && baseMapper.batchUpdate(MapstructUtils.convert(updateList, ItemSku.class)) < 1) {
throw new RuntimeException("更新商品规格失败");
}
return true;
}
/**
* 标记需要删除的sku
*
* @param saveList 需要保存的sku
* @param dbList 库中的sku
* @return 删除集合
*/
private List<ItemSkuVo> markDeleteItemSkuList(List<ItemSkuBo> saveList, List<ItemSkuVo> dbList) {
List<ItemSkuVo> deleteList = new ArrayList<>();
Map<Long, ItemSkuBo> saveMap = saveList.stream().collect(Collectors.toMap(ItemSkuBo::getId, Function.identity(), (v1, v2) -> v1));
dbList.forEach(item -> {
if (saveMap.get(item.getId()) == null) {
deleteList.add(item);
}
});
return deleteList;
}
private boolean validateOutSkuIdIfExist(List<ItemSkuVo> skuVoList) {
ArrayList<ItemSkuVo> collect =
skuVoList.stream().collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ItemSkuVo::getOutSkuId))), ArrayList::new));
if (collect.size() < skuVoList.size()) {
return true;
}
Long itemId = skuVoList.get(0).getItemId();
LambdaQueryWrapper<ItemSku> wrapper = new LambdaQueryWrapper<>();
wrapper.in(ItemSku::getOutSkuId, skuVoList.stream().map(ItemSkuVo::getOutSkuId).toList());
List<ItemSku> itemSkuList = baseMapper.selectList(wrapper);
return itemSkuList.size() > 0 && itemSkuList.stream().anyMatch(it -> !it.getItemId().equals(itemId));
}
private void generateOutSkuId(List<ItemSkuBo> skuVoList, Long itemId) {
// 先校验用户填的条码是否唯一 1.本商品下比较 2.与库里其余sku比较
List<ItemSkuBo> hasOutSkuIdList = skuVoList.stream().filter(it -> StrUtil.isNotBlank(it.getOutSkuId())).toList();
ArrayList<ItemSkuBo> validateHasResult = hasOutSkuIdList.stream().collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ItemSkuBo::getOutSkuId))), ArrayList::new));
if (validateHasResult.size() < hasOutSkuIdList.size()) {
throw new RuntimeException("规格条码重复");
}
LambdaQueryWrapper<ItemSku> wrapper = Wrappers.lambdaQuery();
if (CollUtil.isNotEmpty(hasOutSkuIdList)) {
wrapper.in(ItemSku::getOutSkuId, hasOutSkuIdList.stream().map(ItemSkuBo::getOutSkuId).toList());
wrapper.ne(ItemSku::getItemId, itemId);
Long countResult = baseMapper.selectCount(wrapper);
if (countResult != null && countResult > 0L) {
throw new RuntimeException("条码重复");
}
}
// 拿库里非本商品的sku
wrapper.clear();
wrapper.eq(ItemSku::getItemId, itemId);
List<ItemSku> skuListInDb = baseMapper.selectList(wrapper);
// 循环生成未填条码校验通过加入sku中
for (ItemSkuBo itemSkuVo : skuVoList) {
if (StrUtil.isBlank(itemSkuVo.getOutSkuId())) {
boolean flag = true;
while (flag) {
String outSkuId = RandomUtil.randomNumbers(8);
flag = hasOutSkuIdList.stream().anyMatch(it -> it.getOutSkuId().equals(outSkuId));
if (!flag) {
flag = skuListInDb.stream().anyMatch(it -> it.getOutSkuId().equals(outSkuId));
}
if (!flag) {
itemSkuVo.setOutSkuId(outSkuId);
}
}
}
}
}
/**
* 查询sku列表
*
* @param id 商品id
*/
public List<ItemSkuVo> queryListByItemId(Long id) {
LambdaQueryWrapper<ItemSku> lqw = Wrappers.lambdaQuery();
lqw.eq(ItemSku::getItemId, id);
return baseMapper.selectVoList(lqw);
}
/**
* 批量软删除sku
*
* @param itemSkuIds
*/
public int batchUpdateDelFlag(Collection<Long> itemSkuIds) {
if (CollUtil.isEmpty(itemSkuIds)) {
return 1;
}
LambdaUpdateWrapper<ItemSku> wrapper = new LambdaUpdateWrapper<>();
wrapper.in(ItemSku::getId, itemSkuIds);
wrapper.set(ItemSku::getDelFlag, 2);
return baseMapper.update(null, wrapper);
}
}

View file

@ -0,0 +1,14 @@
<?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">
<mapper namespace="com.ruoyi.wms.mapper.ItemCategoryMapper">
<update id="updateOrderNum">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update wms_item_type
set order_num=#{item.orderNum}
where id=#{item.id}
</foreach>
</update>
</mapper>

View file

@ -0,0 +1,18 @@
<?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">
<mapper namespace="com.ruoyi.wms.mapper.ItemMapper">
<sql id="selectItem">
select id,item_no,item_name,item_category,unit,del_flag,remark,create_by,create_time,update_by,update_time from wms_item
</sql>
<select id="selectByIdsIgnoreDelFlag" resultType="com.ruoyi.wms.domain.entity.Item">
<include refid="selectItem"/>
where id in
<foreach collection="list" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</select>
</mapper>

View file

@ -0,0 +1,65 @@
<?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">
<mapper namespace="com.ruoyi.wms.mapper.ItemSkuMapper">
<sql id="selectItemSku">
select id,sku_name,item_id,out_sku_id,in_price,out_price,quantity,del_flag,create_time,create_by,update_time,update_by from wms_item_sku
</sql>
<update id="batchUpdate">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update wms_item_sku
set sku_name=#{item.skuName},item_id=#{item.itemId},out_sku_id=#{item.outSkuId},in_price=#{item.inPrice}
,out_price=#{item.outPrice},quantity=#{item.quantity}
where id=#{item.id}
</foreach>
</update>
<select id="selectByIdsIgnoreDelFlag" resultType="com.ruoyi.wms.domain.entity.ItemSku">
<include refid="selectItemSku"/>
where id in
<foreach collection="list" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</select>
<select id="selectByBo" resultType="com.ruoyi.wms.domain.vo.ItemSkuVo">
select
a.id,
a.sku_name,
a.item_id,
a.out_sku_id,
a.in_price,
a.out_price,
a.quantity,
a.del_flag,
a.create_by,
a.create_time,
a.update_by,
a.update_time,
b.item_name,
b.item_no,
c.category_name itemCategoryName,
c.id itemCategoryId
from wms_item_sku a
inner join wms_item b on a.item_id=b.id
inner join wms_item_category c on b.item_category=c.id
where a.del_flag=0 and b.del_flag=0
<if test="bo.itemName != null and bo.itemName != ''">
and b.item_name like concat('%', #{bo.itemName}, '%')
</if>
<if test="bo.itemNo != null and bo.itemNo != ''">
and b.item_no like concat('%', #{bo.itemNo}, '%')
</if>
<if test="bo.skuName != null and bo.skuName != ''">
and a.sku_name like concat('%', #{bo.skuName}, '%')
</if>
<if test="bo.outSkuId != null and bo.outSkuId != ''">
and a.out_sku_id like concat('%', #{bo.outSkuId}, '%')
</if>
<if test="bo.itemCategory != null and bo.itemCategory != ''">
and (c.id=#{bo.itemCategory} or c.parent_id=#{bo.itemCategory})
</if>
order by c.id desc,a.item_id desc
</select>
</mapper>