仓库业务逻辑补全2.0 : 1、出库修改删除数据时库存相应改变;2、出库的列表查询 新增更多查询参数 ;3、修复一些BUG

This commit is contained in:
刘宗坤
2024-11-05 23:31:31 +08:00
parent 36d06eeb53
commit 57a88d5959
13 changed files with 351 additions and 16 deletions

View File

@@ -4,6 +4,8 @@ import java.util.List;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import com.ruoyi.oa.domain.bo.SysOaOutWarehouseBoList;
import com.ruoyi.oa.domain.vo.SysOaOutWarehouseListVo;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
@@ -46,7 +48,7 @@ public class SysOaOutWarehouseController extends BaseController {
*/
@SaCheckPermission("oa:oaOutWarehouse:list")
@GetMapping("/list")
public TableDataInfo<SysOaOutWarehouseVo> list(SysOaOutWarehouseBo bo, PageQuery pageQuery) {
public TableDataInfo<SysOaOutWarehouseListVo> list(SysOaOutWarehouseBo bo, PageQuery pageQuery) {
return iSysOaOutWarehouseService.queryPageList(bo, pageQuery);
}
@@ -98,6 +100,18 @@ public class SysOaOutWarehouseController extends BaseController {
return toAjax(iSysOaOutWarehouseService.insertByBo(bo));
}
/**
* 批量新增仓库出库
*/
@SaCheckPermission("oa:oaOutWarehouse:add")
@Log(title = "仓库批量出库",businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/insertOutBatch")
public R<Void> addAll(@Validated(AddGroup.class) @RequestBody SysOaOutWarehouseBoList boList) {
return toAjax(iSysOaOutWarehouseService.insertByBoList(boList));
}
/**
* 修改仓库出库
*/

View File

@@ -26,8 +26,8 @@ public class SysOaOutWarehouseBo extends BaseEntity {
/**
* 主键id
*/
@NotNull(message = "出库数量不能为空", groups = { EditGroup.class })
@TableId(value = "id",type = IdType.AUTO)
@NotNull(message = "主键id不能为空", groups = { EditGroup.class })
private Long id;
/**
@@ -52,5 +52,13 @@ public class SysOaOutWarehouseBo extends BaseEntity {
@NotNull(message = "出库对象id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long warehouseId;
/**
* 项目名
*/
private String projectName;
/**
* 物料名
*/
private String warehouseName;
}

View File

@@ -0,0 +1,47 @@
package com.ruoyi.oa.domain.bo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotNull;
/**
* 仓库出库业务对象 sys_oa_out_warehouse
*
* @author liuzongkun999
* @date 2024-11-02
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class SysOaOutWarehouseBo2 extends BaseEntity {
/**
* 物料id
*/
@NotNull(message = "出库对象id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long warehouseId;
/**
* 出库数量
*/
@NotNull(message = "出库数量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long amount;
/**
* 出库备注
*/
private String remark;
/**
* 对应项目id
*/
private Long projectId;
}

View File

@@ -0,0 +1,30 @@
package com.ruoyi.oa.domain.bo;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.validate.AddGroup;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 仓库批量出库业务对象 sys_oa_out_warehouse
*
* @author liuzongkun999
* @date 2024-11-05
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class SysOaOutWarehouseBoList extends BaseEntity {
/**
* 该项目对应的出库数据
*/
private List<SysOaOutWarehouseBo2> outWareHouseList;
/**
* 项目id
*/
@NotNull(message = "项目id不能为空", groups = AddGroup.class)
private Long projectId;
}

View File

@@ -0,0 +1,56 @@
package com.ruoyi.oa.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
/**
* 仓库出库查询对象 sys_oa_out_warehouse
*
* @author liuzongkun999
* @date 2024-11-02
*/
@Data
@ExcelIgnoreUnannotated
public class SysOaOutWarehouseListVo {
/**
* 主键id
*/
private Long id;
/**
* 出库后对应的项目id
*/
private Long projectId;
/**
* 出库数量
*/
private Long amount;
/**
* 项目名称
*/
private String projectName;
/**
* 出库备注
*/
private String remark;
/**
* 出库对象id
*/
private Long warehouseId;
/**
* 出库物料名称
*/
private String warehouseName;
}

View File

@@ -2,10 +2,7 @@ package com.ruoyi.oa.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.ruoyi.common.annotation.ExcelDictFormat;
import com.ruoyi.common.convert.ExcelDictConvert;
import lombok.Data;
import java.util.Date;

View File

@@ -1,8 +1,16 @@
package com.ruoyi.oa.mapper;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.oa.domain.SysOaOutWarehouse;
import com.ruoyi.oa.domain.bo.SysOaOutWarehouseBo;
import com.ruoyi.oa.domain.bo.SysOaOutWarehouseBo2;
import com.ruoyi.oa.domain.vo.SysOaOutWarehouseListVo;
import com.ruoyi.oa.domain.vo.SysOaOutWarehouseVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 仓库出库Mapper接口
@@ -12,4 +20,10 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
*/
public interface SysOaOutWarehouseMapper extends BaseMapperPlus<SysOaOutWarehouseMapper, SysOaOutWarehouse, SysOaOutWarehouseVo> {
/**
* 仓库出库筛选(联查)
*/
List<SysOaOutWarehouseListVo> defineselectList(@Param(value = "bo") SysOaOutWarehouseBo bo, @Param(value = "page") PageQuery pageQuery);
}

View File

@@ -1,5 +1,6 @@
package com.ruoyi.oa.mapper;
import com.ruoyi.oa.domain.SysOaOutWarehouse;
import com.ruoyi.oa.domain.SysOaProject;
import com.ruoyi.oa.domain.vo.SysOaProjectVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus;

View File

@@ -1,6 +1,8 @@
package com.ruoyi.oa.service;
import com.ruoyi.oa.domain.SysOaOutWarehouse;
import com.ruoyi.oa.domain.bo.SysOaOutWarehouseBoList;
import com.ruoyi.oa.domain.vo.SysOaOutWarehouseListVo;
import com.ruoyi.oa.domain.vo.SysOaOutWarehouseVo;
import com.ruoyi.oa.domain.bo.SysOaOutWarehouseBo;
import com.ruoyi.common.core.page.TableDataInfo;
@@ -32,7 +34,7 @@ public interface ISysOaOutWarehouseService {
/**
* 查询仓库出库列表
*/
TableDataInfo<SysOaOutWarehouseVo> queryPageList(SysOaOutWarehouseBo bo, PageQuery pageQuery);
TableDataInfo<SysOaOutWarehouseListVo> queryPageList(SysOaOutWarehouseBo bo, PageQuery pageQuery);
/**
* 查询仓库出库列表
@@ -44,6 +46,11 @@ public interface ISysOaOutWarehouseService {
*/
Boolean insertByBo(SysOaOutWarehouseBo bo);
/**
* 仓库批量出库
*/
Boolean insertByBoList(SysOaOutWarehouseBoList boList);
/**
* 修改仓库出库
*/
@@ -55,5 +62,4 @@ public interface ISysOaOutWarehouseService {
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -1,13 +1,20 @@
package com.ruoyi.oa.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
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.oa.domain.SysOaProject;
import com.ruoyi.oa.domain.SysOaWarehouse;
import com.ruoyi.oa.domain.bo.SysOaOutWarehouseBo2;
import com.ruoyi.oa.domain.bo.SysOaOutWarehouseBoList;
import com.ruoyi.oa.domain.vo.SysOaOutWarehouseListVo;
import com.ruoyi.oa.mapper.SysOaProjectMapper;
import com.ruoyi.oa.mapper.SysOaWarehouseMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@@ -17,10 +24,13 @@ import com.ruoyi.oa.domain.SysOaOutWarehouse;
import com.ruoyi.oa.mapper.SysOaOutWarehouseMapper;
import com.ruoyi.oa.service.ISysOaOutWarehouseService;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import static cn.hutool.core.bean.BeanUtil.*;
/**
* 仓库出库Service业务层处理
*
@@ -61,9 +71,19 @@ public class SysOaOutWarehouseServiceImpl implements ISysOaOutWarehouseService {
* 查询仓库出库列表
*/
@Override
public TableDataInfo<SysOaOutWarehouseVo> queryPageList(SysOaOutWarehouseBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<SysOaOutWarehouse> lqw = buildQueryWrapper(bo);
Page<SysOaOutWarehouseVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
public TableDataInfo<SysOaOutWarehouseListVo> queryPageList(SysOaOutWarehouseBo bo, PageQuery pageQuery) {
// LambdaQueryWrapper<SysOaOutWarehouse> lqw = buildQueryWrapper(bo);
// Page<SysOaOutWarehouseVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
pageQuery.setPageNum(ObjectUtil.defaultIfNull(pageQuery.getPageNum(), 1));
pageQuery.setPageSize(ObjectUtil.defaultIfNull(pageQuery.getPageSize(), Integer.MAX_VALUE));
if (pageQuery.getPageNum() <= 0) {
pageQuery.setPageNum(1);
}
if (pageQuery.getPageSize() <= 0) {
pageQuery.setPageSize(Integer.MAX_VALUE);
}
pageQuery.setPageNum((pageQuery.getPageNum() - 1)*pageQuery.getPageSize());
List<SysOaOutWarehouseListVo> result = baseMapper.defineselectList(bo, pageQuery);
return TableDataInfo.build(result);
}
@@ -79,9 +99,11 @@ public class SysOaOutWarehouseServiceImpl implements ISysOaOutWarehouseService {
private LambdaQueryWrapper<SysOaOutWarehouse> buildQueryWrapper(SysOaOutWarehouseBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<SysOaOutWarehouse> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getProjectId() != null, SysOaOutWarehouse::getProjectId, bo.getProjectId());
lqw.eq(bo.getAmount() != null, SysOaOutWarehouse::getAmount, bo.getAmount());
lqw.eq(bo.getWarehouseId() != null, SysOaOutWarehouse::getWarehouseId, bo.getWarehouseId());
return lqw;
}
@@ -90,10 +112,13 @@ public class SysOaOutWarehouseServiceImpl implements ISysOaOutWarehouseService {
*/
@Override
public Boolean insertByBo(SysOaOutWarehouseBo bo) {
SysOaOutWarehouse decrease = BeanUtil.toBean(bo, SysOaOutWarehouse.class);
SysOaOutWarehouse decrease = toBean(bo, SysOaOutWarehouse.class);
validEntityBeforeSave(decrease);
SysOaWarehouse warehouse = baseMapper2.selectById(decrease.getWarehouseId());
// 1 如果对应仓库表项目数量-将要出库数量<0出库失败, 繁殖 增加该条
if(warehouse == null) {
throw new Error("已不存在该物料"+decrease.getWarehouseId());
}
if(warehouse.getInventory() - decrease.getAmount() < 0) {
throw new Error("剩余数量不足,出库失败");
}
@@ -106,14 +131,74 @@ public class SysOaOutWarehouseServiceImpl implements ISysOaOutWarehouseService {
return baseMapper.insert(decrease) > 0;
}
/**
* 仓库批量出库
*/
@Override
public Boolean insertByBoList(SysOaOutWarehouseBoList boList) {
// 只进行了插入出库表
// 还缺少 检验数量是否足够,以及删除对应库存数量的业务逻辑
Long projectId = boList.getProjectId();
List<SysOaOutWarehouseBo2> list = boList.getOutWareHouseList();
list.forEach((sysOaOutWarehouseBo2 -> {
sysOaOutWarehouseBo2.setProjectId(projectId);
SysOaOutWarehouseBo sysOaOutWarehouse = toBean(sysOaOutWarehouseBo2, SysOaOutWarehouseBo.class);
insertByBo(sysOaOutWarehouse);
}));
return true;
}
/**
* 修改仓库出库
*/
@Override
public Boolean updateByBo(SysOaOutWarehouseBo bo) {
SysOaOutWarehouse update = BeanUtil.toBean(bo, SysOaOutWarehouse.class);
SysOaOutWarehouse update = toBean(bo, SysOaOutWarehouse.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
// 修改后的数量
Long amount1 = update.getAmount();
//获得 修改前的数量
SysOaOutWarehouse sysOaOutWarehouse = baseMapper.selectById(update.getId());
Long amount = sysOaOutWarehouse.getAmount();
//找出库存表对应的那条数据 的库存数量
LambdaQueryWrapper<SysOaWarehouse> lqw = Wrappers.lambdaQuery();
lqw.eq(SysOaWarehouse::getId, update.getWarehouseId());
SysOaWarehouse warehouse = baseMapper2.selectOne(lqw);
Long inventory = warehouse.getInventory();
//出库多了
if(amount1 > amount) {
//确保出库不超余量
if(amount1-amount<=inventory) {
//可以减少差值
baseMapper.updateById(update);
warehouse.setInventory(inventory -( amount1 - amount));
baseMapper2.updateById(warehouse);
}
else {
throw new Error("库存数量不足,无法增加出库数量");
}
}
else {
//确保出库不能为负
if (amount1 > 0) {
//此时增加差值
baseMapper.updateById(update);
warehouse.setInventory(warehouse.getInventory() + amount - amount1);
baseMapper2.updateById(warehouse);
}
else {
throw new Error("出库数量不能为负");
}
}
return true;
}
/**
@@ -131,7 +216,28 @@ public class SysOaOutWarehouseServiceImpl implements ISysOaOutWarehouseService {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
//需要增加的对应物料数量
LambdaQueryWrapper<SysOaOutWarehouse> lqw = Wrappers.lambdaQuery();
lqw.in(SysOaOutWarehouse::getId, ids.toArray());
List<SysOaOutWarehouse> sysOaOutWarehouses = baseMapper.selectList(lqw); //出库表中的所有删除的数据
sysOaOutWarehouses.forEach(sysOaOutWarehouse -> { //其中一条
//选出相对应的 库存表中那一条的数据
LambdaQueryWrapper<SysOaWarehouse> lqw2 = Wrappers.lambdaQuery();
lqw2.eq(SysOaWarehouse::getId, sysOaOutWarehouse.getWarehouseId());
SysOaWarehouse warehouse = baseMapper2.selectOne(lqw2);
// 恢复原本出库的数量
warehouse.setInventory(warehouse.getInventory() + sysOaOutWarehouse.getAmount());
baseMapper2.updateById(warehouse);
});
boolean flag = baseMapper.deleteBatchIds(ids) > 0;
return flag;
}

View File

@@ -7,6 +7,8 @@ import com.ruoyi.common.core.domain.PageQuery;
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.oa.domain.SysOaOutWarehouse;
import com.ruoyi.oa.mapper.SysOaOutWarehouseMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.ruoyi.oa.domain.bo.SysOaWarehouseBo;
@@ -15,6 +17,7 @@ import com.ruoyi.oa.domain.SysOaWarehouse;
import com.ruoyi.oa.mapper.SysOaWarehouseMapper;
import com.ruoyi.oa.service.ISysOaWarehouseService;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Collection;
@@ -31,6 +34,8 @@ public class SysOaWarehouseServiceImpl implements ISysOaWarehouseService {
private final SysOaWarehouseMapper baseMapper;
private final SysOaOutWarehouseMapper outWareMapper;
/**
* 查询仓库管理
*/
@@ -122,6 +127,13 @@ public class SysOaWarehouseServiceImpl implements ISysOaWarehouseService {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
LambdaQueryWrapper<SysOaWarehouse> lqw = Wrappers.lambdaQuery();
lqw.in(SysOaWarehouse::getId, ids);
List<SysOaWarehouse> sysOaWarehouses = baseMapper.selectList(lqw);
sysOaWarehouses.forEach(sysOaWarehouse -> {
sysOaWarehouse.setDelFlag(1L);
});
return baseMapper.updateBatchById(sysOaWarehouses);
}
}

View File

@@ -18,4 +18,49 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<!-- 仓库出库筛选(联查) -->
<select id="defineselectList" resultType="com.ruoyi.oa.domain.vo.SysOaOutWarehouseListVo">
select
ware.id as id,
ware.project_id as projectId,
ware.amount as amount,
ware.remark as remark,
ware.warehouse_id as warehouseId,
project.project_name as projectName
from
sys_oa_out_warehouse ware
join
sys_oa_project project on ware.project_id = project.project_id
<if test="bo.warehouseName != null and bo.warehouseName != ''">
join sys_oa_warehouse warehouse on warehouse.id = ware.warehouse_id
</if>
<where>
<if test="bo.projectName != null and bo.projectName != ''">
and project.project_name like concat('%', #{bo.projectName}, '%')
</if>
<if test="bo.id != null and bo.id != ''">
and ware.id = #{bo.id}
</if>
<if test="bo.projectId != null and bo.projectId != ''">
and project.project_id = #{bo.projectId}
</if>
<if test="bo.amount != null and bo.amount != ''">
and ware.amount = #{bo.amount}
</if>
<if test="bo.remark != null and bo.remark != ''">
and ware.remark like concat('%', #{bo.remark}, '%')
</if>
<if test="bo.warehouseId != null and bo.warehouseId != ''">
and ware.warehouse_id = #{bo.warehouseId}
</if>
<if test="bo.warehouseName != null and bo.warehouseName != ''">
and warehouse.name like concat('%', #{bo.warehouseName}, '%')
</if>
</where>
<if test="page != null and page.pageNum != null and page.pageSize != null">
limit #{page.pageNum}, #{page.pageSize}
</if>
</select>
</mapper>

View File

@@ -34,5 +34,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
</mapper>