diff --git a/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/controller/CheckOrderController.java b/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/controller/CheckOrderController.java index ab1d46a..e73e9a0 100644 --- a/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/controller/CheckOrderController.java +++ b/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/controller/CheckOrderController.java @@ -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 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 remove(@NotEmpty(message = "主键不能为空") - @PathVariable Long[] ids) { - checkOrderService.deleteByIds(List.of(ids)); + @DeleteMapping("/{id}") + public R remove(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + checkOrderService.deleteById(id); return R.ok(); } } diff --git a/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/controller/CheckOrderDetailController.java b/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/controller/CheckOrderDetailController.java index e2d3e36..002ea91 100644 --- a/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/controller/CheckOrderDetailController.java +++ b/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/controller/CheckOrderDetailController.java @@ -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> listByCheckOrderId(@NotNull @PathVariable Long checkOrderId) { + return R.ok(checkOrderDetailService.queryByCheckOrderId(checkOrderId)); + } } diff --git a/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/bo/CheckOrderBo.java b/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/bo/CheckOrderBo.java index f336957..ff5f5ef 100644 --- a/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/bo/CheckOrderBo.java +++ b/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/bo/CheckOrderBo.java @@ -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 details; } diff --git a/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/vo/CheckOrderDetailVo.java b/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/vo/CheckOrderDetailVo.java index af92f99..89d8a56 100644 --- a/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/vo/CheckOrderDetailVo.java +++ b/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/vo/CheckOrderDetailVo.java @@ -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; } diff --git a/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/vo/CheckOrderVo.java b/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/vo/CheckOrderVo.java index 2639d09..11f3487 100644 --- a/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/vo/CheckOrderVo.java +++ b/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/vo/CheckOrderVo.java @@ -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 details; } diff --git a/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/CheckOrderDetailService.java b/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/CheckOrderDetailService.java index c7d77e4..2acaa25 100644 --- a/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/CheckOrderDetailService.java +++ b/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/CheckOrderDetailService.java @@ -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 { private final CheckOrderDetailMapper checkOrderDetailMapper; + private final ItemSkuService itemSkuService; + private final InventoryDetailMapper inventoryDetailMapper; /** * 查询库存盘点单据详情 @@ -89,4 +99,36 @@ public class CheckOrderDetailService { public void deleteByIds(Collection ids) { checkOrderDetailMapper.deleteBatchIds(ids); } + + @Transactional + public void saveDetails(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + saveOrUpdateBatch(list); + } + + public List queryByCheckOrderId(Long checkOrderId) { + CheckOrderDetailBo bo = new CheckOrderDetailBo(); + bo.setCheckOrderId(checkOrderId); + List details = queryList(bo); + if (CollUtil.isEmpty(details)) { + return Collections.emptyList(); + } + Set skuIds = details + .stream() + .map(CheckOrderDetailVo::getSkuId) + .collect(Collectors.toSet()); + Map itemSkuMap = itemSkuService.queryVosByIds(skuIds) + .stream() + .collect(Collectors.toMap(ItemSkuVo::getId, Function.identity())); + List inventoryDetailIds = details.stream().map(CheckOrderDetailVo::getInventoryDetailId).toList(); + Map 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; + } } diff --git a/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/CheckOrderService.java b/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/CheckOrderService.java index b5f995e..f6065e2 100644 --- a/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/CheckOrderService.java +++ b/ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/CheckOrderService.java @@ -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 addDetailList = MapstructUtils.convert(bo.getDetails(), CheckOrderDetail.class); + addDetailList.forEach(it -> it.setCheckOrderId(add.getId())); + checkOrderDetailService.saveDetails(addDetailList); + } + + private void validateCheckOrderNo(String checkOrderNo) { + LambdaQueryWrapper 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 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() + "】已盘库完成,无法删除!"); + } } /** diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceConstants.java index 3e17ec5..a59bc7a 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceConstants.java @@ -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; + } }