From 86b0abaf7fefd5d93cdbcb783a71634584dd6527 Mon Sep 17 00:00:00 2001 From: DataCall <115401705@qq.com> Date: Thu, 18 Jul 2024 16:56:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=95=86=E5=93=81=E3=80=81=E8=A7=84?= =?UTF-8?q?=E6=A0=BC=E3=80=81=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ItemCategoryController.java | 111 ++++++ .../ruoyi/wms/controller/ItemController.java | 119 +++++++ .../wms/controller/ItemSkuController.java | 100 ++++++ .../java/com/ruoyi/wms/domain/bo/ItemBo.java | 62 ++++ .../ruoyi/wms/domain/bo/ItemCategoryBo.java | 46 +++ .../com/ruoyi/wms/domain/bo/ItemSkuBo.java | 72 ++++ .../com/ruoyi/wms/domain/entity/Item.java | 58 ++++ .../ruoyi/wms/domain/entity/ItemCategory.java | 53 +++ .../com/ruoyi/wms/domain/entity/ItemSku.java | 65 ++++ .../ruoyi/wms/domain/vo/ItemCategoryVo.java | 69 ++++ .../com/ruoyi/wms/domain/vo/ItemSkuVo.java | 88 +++++ .../wms/domain/vo/ItemTypeTreeSelectVo.java | 67 ++++ .../java/com/ruoyi/wms/domain/vo/ItemVo.java | 64 ++++ .../ruoyi/wms/mapper/ItemCategoryMapper.java | 12 + .../java/com/ruoyi/wms/mapper/ItemMapper.java | 14 + .../com/ruoyi/wms/mapper/ItemSkuMapper.java | 25 ++ .../wms/service/ItemCategoryService.java | 226 ++++++++++++ .../com/ruoyi/wms/service/ItemService.java | 242 +++++++++++++ .../com/ruoyi/wms/service/ItemSkuService.java | 324 ++++++++++++++++++ .../mapper/wms/ItemCategoryMapper.xml | 14 + .../main/resources/mapper/wms/ItemMapper.xml | 18 + .../resources/mapper/wms/ItemSkuMapper.xml | 65 ++++ 22 files changed, 1914 insertions(+) create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/controller/ItemCategoryController.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/controller/ItemController.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/controller/ItemSkuController.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/bo/ItemBo.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/bo/ItemCategoryBo.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/bo/ItemSkuBo.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/entity/Item.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/entity/ItemCategory.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/entity/ItemSku.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemCategoryVo.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemSkuVo.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemTypeTreeSelectVo.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemVo.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/mapper/ItemCategoryMapper.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/mapper/ItemMapper.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/mapper/ItemSkuMapper.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/service/ItemCategoryService.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/service/ItemService.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/service/ItemSkuService.java create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/resources/mapper/wms/ItemCategoryMapper.xml create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/resources/mapper/wms/ItemMapper.xml create mode 100644 ruoyi-modules/ruoyi-wms-service/src/main/resources/mapper/wms/ItemSkuMapper.xml diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/controller/ItemCategoryController.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/controller/ItemCategoryController.java new file mode 100644 index 0000000..c04eb64 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/controller/ItemCategoryController.java @@ -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 list(ItemCategoryBo bo, PageQuery pageQuery) { + return itemCategoryService.queryPageList(bo, pageQuery); + } + + /** + * 获取物料类型下拉树列表 + */ + @GetMapping("/treeselect") + public R treeselect(ItemCategoryBo query) { + List 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 list = itemCategoryService.queryList(bo); + ExcelUtil.exportExcel(list, "物料类型", ItemCategoryVo.class, response); + } + + /** + * 获取物料类型详细信息 + * + * @param itemTypeId 主键 + */ + @GetMapping("/{itemTypeId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long itemTypeId) { + return R.ok(itemCategoryService.queryById(itemTypeId)); + } + + /** + * 新增物料类型 + */ + @Log(title = "物料类型", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ItemCategoryBo bo) { + return toAjax(itemCategoryService.insertByBo(bo)); + } + + /** + * 修改物料类型 + */ + @Log(title = "物料类型", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ItemCategoryBo bo) { + return toAjax(itemCategoryService.updateByBo(bo)); + } + + /** + * 删除物料类型 + * + * @param itemTypeIds 主键串 + */ + @Log(title = "物料类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{itemTypeIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] itemTypeIds) { + List ids = new ArrayList<>(Arrays.asList(itemTypeIds)); + return toAjax(itemCategoryService.deleteWithValidByIds(ids)); + } + + @PostMapping("/update/orderNum") + public R updateOrderNum(@RequestBody List tree) { + return toAjax(itemCategoryService.updateOrderNum(tree)); + } +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/controller/ItemController.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/controller/ItemController.java new file mode 100644 index 0000000..2472b5d --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/controller/ItemController.java @@ -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 list(ItemBo bo, PageQuery pageQuery) { + return itemService.queryPageList(bo, pageQuery); + } + + /** + * 查询物料列表 + */ + @GetMapping("/selectList") + public List selectList(ItemBo bo) { + return itemService.queryList(bo); + } + + /** + * 导出物料列表 + */ + @Log(title = "物料", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ItemBo bo, HttpServletResponse response) { + List list = itemService.queryList(bo); + ExcelUtil.exportExcel(list, "物料", ItemVo.class, response); + } + + /** + * 获取物料详细信息 + * + * @param id 主键 + */ + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(itemService.queryById(id)); + } + + /** + * 新增物料 + */ +// @Log(title = "物料", businessType = BusinessType.INSERT) +// @RepeatSubmit() +// @PostMapping("/byBo") +// public R addByBo(@Validated(AddGroup.class) @RequestBody ItemBo bo) { +// return toAjax(itemService.insertByBo(bo)); +// } + + /** + * 新增物料 + */ + @Log(title = "物料", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ItemBo form) { + return toAjax(itemService.insertByForm(form)); + } + /** + * 修改物料 + */ + @Log(title = "物料", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ItemBo form) { + return toAjax(itemService.updateByForm(form)); + } + /** + * 修改物料 + */ +// @Log(title = "物料", businessType = BusinessType.UPDATE) +// @RepeatSubmit() +// @PutMapping("/byBo") +// public R editByBo(@Validated(EditGroup.class) @RequestBody ItemBo bo) { +// return toAjax(itemService.updateByBo(bo)); +// } + + /** + * 删除物料 + * + * @param ids 主键串 + */ + @Log(title = "物料", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(itemService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/controller/ItemSkuController.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/controller/ItemSkuController.java new file mode 100644 index 0000000..961fe9c --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/controller/ItemSkuController.java @@ -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 list(ItemSkuBo bo, PageQuery pageQuery) { + return itemSkuService.queryPageList(bo, pageQuery); + } + /** + * 查询sku信息列表 + */ + @GetMapping("/selectList") + public List selectList(ItemSkuBo bo) { + return itemSkuService.queryList(bo); + } + + /** + * 导出sku信息列表 + */ + @Log(title = "sku信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ItemSkuBo bo, HttpServletResponse response) { + List list = itemSkuService.queryList(bo); + ExcelUtil.exportExcel(list, "sku信息", ItemSkuVo.class, response); + } + + /** + * 获取sku信息详细信息 + * + * @param id 主键 + */ + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(itemSkuService.queryById(id)); + } + + /** + * 新增sku信息 + */ + @Log(title = "sku信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ItemSkuBo bo) { + return toAjax(itemSkuService.insertByBo(bo)); + } + + /** + * 修改sku信息 + */ + @Log(title = "sku信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R 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 remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(itemSkuService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/bo/ItemBo.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/bo/ItemBo.java new file mode 100644 index 0000000..00e3e64 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/bo/ItemBo.java @@ -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 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 sku; + +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/bo/ItemCategoryBo.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/bo/ItemCategoryBo.java new file mode 100644 index 0000000..a65fa97 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/bo/ItemCategoryBo.java @@ -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; + + +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/bo/ItemSkuBo.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/bo/ItemSkuBo.java new file mode 100644 index 0000000..fd90c4c --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/bo/ItemSkuBo.java @@ -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; +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/entity/Item.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/entity/Item.java new file mode 100644 index 0000000..cf6430c --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/entity/Item.java @@ -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; + + +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/entity/ItemCategory.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/entity/ItemCategory.java new file mode 100644 index 0000000..0039fc3 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/entity/ItemCategory.java @@ -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; + + +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/entity/ItemSku.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/entity/ItemSku.java new file mode 100644 index 0000000..ce051af --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/entity/ItemSku.java @@ -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; + + +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemCategoryVo.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemCategoryVo.java new file mode 100644 index 0000000..37658ce --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemCategoryVo.java @@ -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 children = new ArrayList(); + +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemSkuVo.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemSkuVo.java new file mode 100644 index 0000000..cf0037d --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemSkuVo.java @@ -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; + +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemTypeTreeSelectVo.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemTypeTreeSelectVo.java new file mode 100644 index 0000000..e44c235 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemTypeTreeSelectVo.java @@ -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 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 getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemVo.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemVo.java new file mode 100644 index 0000000..55f4848 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/domain/vo/ItemVo.java @@ -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 sku; +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/mapper/ItemCategoryMapper.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/mapper/ItemCategoryMapper.java new file mode 100644 index 0000000..d46270d --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/mapper/ItemCategoryMapper.java @@ -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 { + int updateOrderNum(@Param("list") List list); +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/mapper/ItemMapper.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/mapper/ItemMapper.java new file mode 100644 index 0000000..f099f74 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/mapper/ItemMapper.java @@ -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 { + + List selectByIdsIgnoreDelFlag(@Param("list") Collection ids); +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/mapper/ItemSkuMapper.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/mapper/ItemSkuMapper.java new file mode 100644 index 0000000..bac9821 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/mapper/ItemSkuMapper.java @@ -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 { + + /** + * + * @param itemIds + * @return + */ + List selectByIdsIgnoreDelFlag(@Param("list") Collection itemIds); + + int batchUpdate(@Param("list") Collection list); + + IPage selectByBo(IPage page, @Param("bo") ItemSkuBo bo); +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/service/ItemCategoryService.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/service/ItemCategoryService.java new file mode 100644 index 0000000..2b390f5 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/service/ItemCategoryService.java @@ -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 { + + private final ItemCategoryMapper baseMapper; + private final ItemMapper itemMapper; + + /** + * 查询物料类型 + */ + + public ItemCategoryVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 查询物料类型列表 + */ + + public TableDataInfo queryPageList(ItemCategoryBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询物料类型列表 + */ + + public List queryList(ItemCategoryBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + lqw.orderByAsc(ItemCategory::getOrderNum); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ItemCategoryBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper 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 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 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 ids) { + //因为分类只有两级,直接查一下子分类,根据分类id把分类和商品全删了就行 + LambdaQueryWrapper itemTypeWrapper = new LambdaQueryWrapper<>(); + itemTypeWrapper.in(ItemCategory::getParentId, ids); + List 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 itemWrapper = new LambdaQueryWrapper<>(); + itemWrapper.in(Item::getItemCategory, ids); + itemMapper.delete(itemWrapper); + return true; + } + + /** + * @param itemTypes + * @return + */ + + public List buildItemTypeTreeSelect(List itemTypes) { + List itemTypeTrees = buildDeptTree(itemTypes); + return itemTypeTrees.stream().map(ItemTypeTreeSelectVo::new).collect(Collectors.toList()); + } + + /** + * 构建前端所需要树结构 + * + * @param itemTypes 部门列表 + * @return 树结构列表 + */ + private List buildDeptTree(List itemTypes) { + List returnList = new ArrayList<>(); + List tempList = new ArrayList(); + for (ItemCategoryVo dept : itemTypes) { + tempList.add(dept.getId()); + } + for (Iterator 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 list, ItemCategoryVo t) { + // 得到子节点列表 + List childList = getChildList(list, t); + t.setChildren(childList); + for (ItemCategoryVo tChild : childList) { + if (hasChild(list, tChild)) { + recursionFn(list, tChild); + } + } + } + + /** + * 得到子节点列表 + */ + private List getChildList(List list, ItemCategoryVo t) { + List 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 list, ItemCategoryVo t) { + return getChildList(list, t).size() > 0; + } + + public int updateOrderNum(List tree) { + List 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); + } +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/service/ItemService.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/service/ItemService.java new file mode 100644 index 0000000..2a26f87 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/service/ItemService.java @@ -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 queryById(List itemIds) { + if (itemIds == null || itemIds.isEmpty()) { + return CollUtil.newArrayList(); + } + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.in(Item::getId, itemIds); + return baseMapper.selectVoList(lambdaQueryWrapper); + } + + /** + * 忽略删除标识查询商品 + * @param ids + * @return + */ + public List queryByIdsIgnoreDelFlag(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return CollUtil.newArrayList(); + } + return MapstructUtils.convert(baseMapper.selectByIdsIgnoreDelFlag(ids), ItemVo.class); + } + + /** + * 查询物料列表 + */ + + public TableDataInfo queryPageList(ItemBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + List itemVoList = result.getRecords(); + if (!CollUtil.isEmpty(itemVoList)) { + LambdaQueryWrapper itemTypeWrapper = new LambdaQueryWrapper<>(); + itemTypeWrapper.in(ItemCategory::getId, itemVoList.stream().map(ItemVo::getItemCategory).collect(Collectors.toSet())); + Map 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 queryList(ItemBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ItemBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper 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 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 buildSubItemTypeIdList(Long parentId) { + LambdaQueryWrapper 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 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 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 skuVoList) { + return skuVoList.stream().map(ItemSkuBo::getSkuName).distinct().count() == skuVoList.size(); + } + + /** + * 批量删除物料 + */ + + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + boolean flag = baseMapper.deleteBatchIds(ids) > 0; + if (flag) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(ItemSku::getItemId, ids); + List skuIds = itemSkuMapper.selectList(wrapper).stream().map(ItemSku::getId).toList(); + flag = itemSkuService.batchUpdateDelFlag(skuIds) > 0; + } + return flag; + } +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/service/ItemSkuService.java b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/service/ItemSkuService.java new file mode 100644 index 0000000..d80c219 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/java/com/ruoyi/wms/service/ItemSkuService.java @@ -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 queryByIds(List itemIds) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.in(ItemSku::getItemId, itemIds); + List itemSkuVos = baseMapper.selectVoList(); + // 注入itemName + injectItemInfo(itemSkuVos); + return itemSkuVos; + } + + /** + * 根据itemId忽略逻辑删除标识查询sku信息 + * @param itemIds + * @return + */ + public List queryByIdsIgnoreDelFlag(Collection itemIds) { + if (CollUtil.isEmpty(itemIds)) { + return CollUtil.newArrayList(); + } + List skuVoList = MapstructUtils.convert(baseMapper.selectByIdsIgnoreDelFlag(itemIds), ItemSkuVo.class); + injectItemInfo(skuVoList); + return skuVoList; + } + + /** + * 查询sku信息列表,用于出入库的选择组件 + */ + + public TableDataInfo queryPageList(ItemSkuBo bo, PageQuery pageQuery) { + //开始查sku + IPage result = baseMapper.selectByBo(pageQuery.build(), bo); + return TableDataInfo.build(result); + } + + /** + * 注入itemName + * + * @param records sku信息列表 + */ + private void injectItemInfo(List records) { + List itemIds = records.stream().map(ItemSkuVo::getItemId).toList(); + if (!CollUtil.isEmpty(itemIds)) { + Map 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 records) { + List itemIdList = records.stream().map(ItemSkuVo::getItemId).toList(); + if (CollUtil.isNotEmpty(itemIdList)) { + List itemVos = itemService.queryById(itemIdList); + Map itemToCategoryMap = itemVos.stream().collect(Collectors.toMap(ItemVo::getId, ItemVo::getItemCategory)); + Set typeSet = itemVos.stream().map(ItemVo::getItemCategory).collect(Collectors.toSet()); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(ItemCategory::getId, typeSet); + Map 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 queryList(ItemSkuBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ItemSkuBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper 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 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 sku) { + // 校验,填充条码 + this.generateOutSkuId(sku, itemId); + List itemSkuInDb = this.queryListByItemId(itemId); + //商品在库里的sku为空,肯定是新增,直接批量插入就行了 + if (CollUtil.isEmpty(itemSkuInDb)) { + sku.forEach(item -> item.setItemId(itemId)); + return baseMapper.insertBatch(MapstructUtils.convert(sku, ItemSku.class)); + } + // 标记删除集合 + List 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 addList = sku.stream().filter(it -> it.getId() == null).toList(); + List 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 markDeleteItemSkuList(List saveList, List dbList) { + List deleteList = new ArrayList<>(); + Map 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 skuVoList) { + ArrayList 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 wrapper = new LambdaQueryWrapper<>(); + wrapper.in(ItemSku::getOutSkuId, skuVoList.stream().map(ItemSkuVo::getOutSkuId).toList()); + List itemSkuList = baseMapper.selectList(wrapper); + return itemSkuList.size() > 0 && itemSkuList.stream().anyMatch(it -> !it.getItemId().equals(itemId)); + } + + private void generateOutSkuId(List skuVoList, Long itemId) { + // 先校验用户填的条码是否唯一 1.本商品下比较 2.与库里其余sku比较 + List hasOutSkuIdList = skuVoList.stream().filter(it -> StrUtil.isNotBlank(it.getOutSkuId())).toList(); + ArrayList 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 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 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 queryListByItemId(Long id) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(ItemSku::getItemId, id); + return baseMapper.selectVoList(lqw); + } + + /** + * 批量软删除sku + * + * @param itemSkuIds + */ + public int batchUpdateDelFlag(Collection itemSkuIds) { + if (CollUtil.isEmpty(itemSkuIds)) { + return 1; + } + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(ItemSku::getId, itemSkuIds); + wrapper.set(ItemSku::getDelFlag, 2); + return baseMapper.update(null, wrapper); + } +} diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/resources/mapper/wms/ItemCategoryMapper.xml b/ruoyi-modules/ruoyi-wms-service/src/main/resources/mapper/wms/ItemCategoryMapper.xml new file mode 100644 index 0000000..9aa4813 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/resources/mapper/wms/ItemCategoryMapper.xml @@ -0,0 +1,14 @@ + + + + + + + update wms_item_type + set order_num=#{item.orderNum} + where id=#{item.id} + + + diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/resources/mapper/wms/ItemMapper.xml b/ruoyi-modules/ruoyi-wms-service/src/main/resources/mapper/wms/ItemMapper.xml new file mode 100644 index 0000000..46f082c --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/resources/mapper/wms/ItemMapper.xml @@ -0,0 +1,18 @@ + + + + + + select id,item_no,item_name,item_category,unit,del_flag,remark,create_by,create_time,update_by,update_time from wms_item + + + + diff --git a/ruoyi-modules/ruoyi-wms-service/src/main/resources/mapper/wms/ItemSkuMapper.xml b/ruoyi-modules/ruoyi-wms-service/src/main/resources/mapper/wms/ItemSkuMapper.xml new file mode 100644 index 0000000..81f2288 --- /dev/null +++ b/ruoyi-modules/ruoyi-wms-service/src/main/resources/mapper/wms/ItemSkuMapper.xml @@ -0,0 +1,65 @@ + + + + + + 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 + + + + 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} + + + + + +