feat: 盘库单保存、删除、查询接口

This commit is contained in:
DataCall 2024-08-13 11:19:41 +08:00
parent 1b76475ff7
commit 1a9a64f3f1
8 changed files with 132 additions and 17 deletions

View file

@ -2,6 +2,7 @@ package com.ruoyi.wms.controller;
import java.util.List;
import com.ruoyi.common.core.constant.ServiceConstants;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
@ -76,6 +77,7 @@ public class CheckOrderController extends BaseController {
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CheckOrderBo bo) {
bo.setCheckOrderStatus(ServiceConstants.CheckOrderStatus.PENDING);
checkOrderService.insertByBo(bo);
return R.ok();
}
@ -95,14 +97,14 @@ public class CheckOrderController extends BaseController {
/**
* 删除库存盘点单据
*
* @param ids 主键
* @param id 主键
*/
@SaCheckPermission("wms:checkOrder:remove")
@Log(title = "库存盘点单据", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
checkOrderService.deleteByIds(List.of(ids));
@DeleteMapping("/{id}")
public R<Void> remove(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
checkOrderService.deleteById(id);
return R.ok();
}
}

View file

@ -105,4 +105,13 @@ public class CheckOrderDetailController extends BaseController {
checkOrderDetailService.deleteByIds(List.of(ids));
return R.ok();
}
/**
* 根据盘库单id查询盘库单详情列表
*/
@SaCheckPermission("wms:checkOrderDetail:query")
@GetMapping("/list/{checkOrderId}")
public R<List<CheckOrderDetailVo>> listByCheckOrderId(@NotNull @PathVariable Long checkOrderId) {
return R.ok(checkOrderDetailService.queryByCheckOrderId(checkOrderId));
}
}

View file

@ -10,6 +10,7 @@ import jakarta.validation.constraints.*;
import io.github.linpeilie.annotations.AutoMapper;
import java.math.BigDecimal;
import java.util.List;
/**
* 库存盘点单据业务对象 wms_check_order
@ -24,7 +25,7 @@ import java.math.BigDecimal;
public class CheckOrderBo extends BaseEntity {
/**
*
*
*/
@NotNull(message = "不能为空", groups = { EditGroup.class })
private Long id;
@ -38,7 +39,6 @@ public class CheckOrderBo extends BaseEntity {
/**
* 库存盘点单状态 -1作废 0未盘库 1已盘库
*/
@NotNull(message = "库存盘点单状态 -1作废 0未盘库 1已盘库不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer checkOrderStatus;
/**
@ -56,14 +56,13 @@ public class CheckOrderBo extends BaseEntity {
/**
* 所属库区
*/
@NotNull(message = "所属库区不能为空", groups = { AddGroup.class, EditGroup.class })
private Long areaId;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
private List<CheckOrderDetailBo> details;
}

View file

@ -27,7 +27,7 @@ public class CheckOrderDetailVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
*
*/
@ExcelProperty(value = "")
private Long id;
@ -80,5 +80,8 @@ public class CheckOrderDetailVo implements Serializable {
@ExcelProperty(value = "备注")
private String remark;
private ItemSkuVo itemSku;
private InventoryDetailVo inventoryDetail;
}

View file

@ -11,6 +11,7 @@ import io.github.linpeilie.annotations.AutoMapper;
import java.io.Serializable;
import java.io.Serial;
import java.util.List;
/**
* 库存盘点单据视图对象 wms_check_order
@ -27,7 +28,7 @@ public class CheckOrderVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
*
*/
@ExcelProperty(value = "")
private Long id;
@ -68,5 +69,5 @@ public class CheckOrderVo implements Serializable {
@ExcelProperty(value = "备注")
private String remark;
private List<CheckOrderDetailVo> details;
}

View file

@ -1,5 +1,7 @@
package com.ruoyi.wms.service;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.utils.MapstructUtils;
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
import com.ruoyi.common.mybatis.core.page.PageQuery;
@ -7,16 +9,22 @@ import com.ruoyi.common.core.utils.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.wms.domain.entity.MovementOrderDetail;
import com.ruoyi.wms.domain.vo.InventoryDetailVo;
import com.ruoyi.wms.domain.vo.ItemSkuVo;
import com.ruoyi.wms.domain.vo.MovementOrderDetailVo;
import com.ruoyi.wms.mapper.InventoryDetailMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.ruoyi.wms.domain.bo.CheckOrderDetailBo;
import com.ruoyi.wms.domain.vo.CheckOrderDetailVo;
import com.ruoyi.wms.domain.entity.CheckOrderDetail;
import com.ruoyi.wms.mapper.CheckOrderDetailMapper;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 库存盘点单据详情Service业务层处理
@ -26,9 +34,11 @@ import java.util.Collection;
*/
@RequiredArgsConstructor
@Service
public class CheckOrderDetailService {
public class CheckOrderDetailService extends ServiceImpl<CheckOrderDetailMapper, CheckOrderDetail> {
private final CheckOrderDetailMapper checkOrderDetailMapper;
private final ItemSkuService itemSkuService;
private final InventoryDetailMapper inventoryDetailMapper;
/**
* 查询库存盘点单据详情
@ -89,4 +99,36 @@ public class CheckOrderDetailService {
public void deleteByIds(Collection<Long> ids) {
checkOrderDetailMapper.deleteBatchIds(ids);
}
@Transactional
public void saveDetails(List<CheckOrderDetail> list) {
if (CollUtil.isEmpty(list)) {
return;
}
saveOrUpdateBatch(list);
}
public List<CheckOrderDetailVo> queryByCheckOrderId(Long checkOrderId) {
CheckOrderDetailBo bo = new CheckOrderDetailBo();
bo.setCheckOrderId(checkOrderId);
List<CheckOrderDetailVo> details = queryList(bo);
if (CollUtil.isEmpty(details)) {
return Collections.emptyList();
}
Set<Long> skuIds = details
.stream()
.map(CheckOrderDetailVo::getSkuId)
.collect(Collectors.toSet());
Map<Long, ItemSkuVo> itemSkuMap = itemSkuService.queryVosByIds(skuIds)
.stream()
.collect(Collectors.toMap(ItemSkuVo::getId, Function.identity()));
List<Long> inventoryDetailIds = details.stream().map(CheckOrderDetailVo::getInventoryDetailId).toList();
Map<Long, InventoryDetailVo> inventoryDetailMap = inventoryDetailMapper.selectVoBatchIds(inventoryDetailIds)
.stream().collect(Collectors.toMap(InventoryDetailVo::getId, Function.identity()));
details.forEach(it -> {
it.setItemSku(itemSkuMap.get(it.getSkuId()));
it.setInventoryDetail(inventoryDetailMap.get(it.getInventoryDetailId()));
});
return details;
}
}

View file

@ -1,18 +1,24 @@
package com.ruoyi.wms.service;
import com.ruoyi.common.core.constant.ServiceConstants;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.exception.base.BaseException;
import com.ruoyi.common.core.utils.MapstructUtils;
import com.ruoyi.common.mybatis.core.domain.BaseEntity;
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
import com.ruoyi.common.mybatis.core.page.PageQuery;
import com.ruoyi.common.core.utils.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.wms.domain.entity.CheckOrderDetail;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.ruoyi.wms.domain.bo.CheckOrderBo;
import com.ruoyi.wms.domain.vo.CheckOrderVo;
import com.ruoyi.wms.domain.entity.CheckOrder;
import com.ruoyi.wms.mapper.CheckOrderMapper;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
@ -29,12 +35,18 @@ import java.util.Collection;
public class CheckOrderService {
private final CheckOrderMapper checkOrderMapper;
private final CheckOrderDetailService checkOrderDetailService;
/**
* 查询库存盘点单据
*/
public CheckOrderVo queryById(Long id){
return checkOrderMapper.selectVoById(id);
CheckOrderVo checkOrderVo = checkOrderMapper.selectVoById(id);
if (checkOrderVo == null) {
throw new BaseException("盘库单不存在");
}
checkOrderVo.setDetails(checkOrderDetailService.queryByCheckOrderId(id));
return checkOrderVo;
}
/**
@ -62,23 +74,61 @@ public class CheckOrderService {
lqw.eq(bo.getCheckOrderTotal() != null, CheckOrder::getCheckOrderTotal, bo.getCheckOrderTotal());
lqw.eq(bo.getWarehouseId() != null, CheckOrder::getWarehouseId, bo.getWarehouseId());
lqw.eq(bo.getAreaId() != null, CheckOrder::getAreaId, bo.getAreaId());
lqw.orderByDesc(BaseEntity::getCreateTime);
return lqw;
}
/**
* 新增库存盘点单据
*/
@Transactional
public void insertByBo(CheckOrderBo bo) {
// 校验盘库单号唯一性
validateCheckOrderNo(bo.getCheckOrderNo());
// 创建盘库单
CheckOrder add = MapstructUtils.convert(bo, CheckOrder.class);
checkOrderMapper.insert(add);
// 创建盘库单明细
List<CheckOrderDetail> addDetailList = MapstructUtils.convert(bo.getDetails(), CheckOrderDetail.class);
addDetailList.forEach(it -> it.setCheckOrderId(add.getId()));
checkOrderDetailService.saveDetails(addDetailList);
}
private void validateCheckOrderNo(String checkOrderNo) {
LambdaQueryWrapper<CheckOrder> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(CheckOrder::getCheckOrderNo, checkOrderNo);
if (checkOrderMapper.exists(lambdaQueryWrapper)) {
throw new BaseException("盘库单号重复,请手动修改");
}
}
/**
* 修改库存盘点单据
*/
@Transactional
public void updateByBo(CheckOrderBo bo) {
// 更新盘库单
CheckOrder update = MapstructUtils.convert(bo, CheckOrder.class);
checkOrderMapper.updateById(update);
// 保存盘库单明细
List<CheckOrderDetail> detailList = MapstructUtils.convert(bo.getDetails(), CheckOrderDetail.class);
detailList.forEach(it -> it.setCheckOrderId(bo.getId()));
checkOrderDetailService.saveDetails(detailList);
}
public void deleteById(Long id) {
validateIdBeforeDelete(id);
checkOrderMapper.deleteById(id);
}
private void validateIdBeforeDelete(Long id) {
CheckOrderVo checkOrderVo = queryById(id);
if (checkOrderVo == null) {
throw new BaseException("盘库单不存在");
}
if (ServiceConstants.CheckOrderStatus.FINISH.equals(checkOrderVo.getCheckOrderStatus())) {
throw new ServiceException("盘库单【" + checkOrderVo.getCheckOrderNo() + "】已盘库完成,无法删除!");
}
}
/**

View file

@ -47,4 +47,13 @@ public class ServiceConstants {
public static final Integer PENDING = 0;
public static final Integer FINISH = 1;
}
/**
* 盘库单状态
*/
public class CheckOrderStatus {
public static final Integer INVALID = -1;
public static final Integer PENDING = 0;
public static final Integer FINISH = 1;
}
}