mirror of
https://github.com/zccbbg/wms-ruoyi.git
synced 2024-09-20 11:05:54 +08:00
feat: 商品、规格、分类
This commit is contained in:
parent
99274993f5
commit
86b0abaf7f
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -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>();
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
Loading…
Reference in a new issue