仓库管理

This commit is contained in:
PQZ 2024-09-10 19:14:18 +08:00
parent f433aff58f
commit 0c53f3161c
13 changed files with 482 additions and 14 deletions

View File

@ -4,6 +4,8 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode;
public interface ErrorCodeConstants {
ErrorCode BASE_TYPE_NOT_EXISTS = new ErrorCode(500, "配置类型不存在");
ErrorCode BASE_TYPE_EXITS_CHILDREN = new ErrorCode(500, "存在存在子配置类型,无法删除");
ErrorCode BASE_TYPE_EXITS_CHILDREN = new ErrorCode(500, "存在子配置类型,无法删除");
ErrorCode BASE_WAREHOUSE_EXITS_CHILDREN = new ErrorCode(500, "存在子配置类型,无法删除");
ErrorCode BASE_TYPE_NAME_DUPLICATE = new ErrorCode(500, "同父级下配置类型名称或编码重复");
ErrorCode BASE_WAREHOUSE_NAME_DUPLICATE = new ErrorCode(500, "同父级下仓库区域名称或编码重复");
}

View File

@ -0,0 +1,105 @@
package cn.iocoder.yudao.module.conf.controller.admin;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.conf.service.BaseWarehouseService;
import cn.iocoder.yudao.module.conf.vo.BaseWarehouseListReqVO;
import cn.iocoder.yudao.module.conf.vo.BaseWarehouseRespVO;
import cn.iocoder.yudao.module.conf.vo.BaseWarehouseSaveReqVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 仓库管理")
@RestController
@RequestMapping("/conf/baseWarehouse")
@Validated
public class BaseWarehouseController {
@Resource
private BaseWarehouseService baseWarehouseService;
/**
* 新增账目配置类型
*
* @param createReqVO BaseTypeSaveReqVO实体
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<java.lang.String>
* @author PQZ
* @date 11:21 2024/9/10
**/
@PostMapping("/create")
@Operation(summary = "创建配置类型")
public CommonResult<Boolean> createBaseType(@Valid @RequestBody BaseWarehouseSaveReqVO createReqVO) {
baseWarehouseService.saveBaseWarehouse(createReqVO);
return success(true);
}
/**
* 编辑账目配置类型
*
* @param updateReqVO BaseTypeSaveReqVO实体
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<java.lang.Boolean>
* @author PQZ
* @date 14:25 2024/9/10
**/
@PutMapping("/update")
@Operation(summary = "更新配置类型")
public CommonResult<Boolean> updateBaseType(@Valid @RequestBody BaseWarehouseSaveReqVO updateReqVO) {
baseWarehouseService.saveBaseWarehouse(updateReqVO);
return success(true);
}
/**
* 删除配置类型
*
* @param id 类型id
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<java.lang.Boolean>
* @author PQZ
* @date 14:25 2024/9/10
**/
@DeleteMapping("/delete")
@Operation(summary = "删除配置类型")
@Parameter(name = "id", description = "编号", required = true)
public CommonResult<Boolean> deleteBaseType(@RequestParam("id") String id) {
baseWarehouseService.deleteBaseWarehouse(id);
return success(true);
}
/**
* 根据id获取配置类型
*
* @param id 配置类型id
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<cn.iocoder.yudao.module.conf.vo.BaseTypeRespVO>
* @author PQZ
* @date 14:26 2024/9/10
**/
@GetMapping("/get")
@Operation(summary = "获得配置类型")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<BaseWarehouseRespVO> getBaseType(@RequestParam("id") String id) {
return success(baseWarehouseService.getBaseWarehouse(id));
}
/**
* 配置类型列表
*
* @param listReqVO BaseTypeListReqVO 实体
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<java.util.List < cn.iocoder.yudao.module.conf.vo.BaseTypeRespVO>>
* @author PQZ
* @date 14:26 2024/9/10
**/
@GetMapping("/list")
@Operation(summary = "获得配置类型列表")
public CommonResult<List<BaseWarehouseRespVO>> getBaseTypeList(@Valid BaseWarehouseListReqVO listReqVO) {
return success(baseWarehouseService.getBaseWarehouseList(listReqVO));
}
}

View File

@ -20,8 +20,6 @@ import lombok.*;
@AllArgsConstructor
public class BaseType extends TenantBaseDO {
public static final Long PARENT_ID_ROOT = 0L;
/**
* 主键标识
*/

View File

@ -0,0 +1,57 @@
package cn.iocoder.yudao.module.conf.entity;
import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 仓库 DO
*
* @author pqz
*/
@TableName("dl_base_warehouse")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BaseWarehouse extends TenantBaseDO {
/**
* 主键标识
*/
@TableId(type = IdType.ASSIGN_UUID)
private String id;
/**
* 父id
*/
private String parentId;
/**
* 仓库/货架名称
*/
private String name;
/**
* 仓库/货架编码
*/
private String code;
/**
* 状态01启用02禁用
*/
private String status;
/**排序*/
private double sort;
/**
* 备注
*/
private String remark;
/**
* 所属子公司
*/
private String corpId;
}

View File

@ -1,6 +1,5 @@
package cn.iocoder.yudao.module.conf.mapper;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.conf.entity.BaseType;
import cn.iocoder.yudao.module.conf.vo.BaseTypeListReqVO;
import cn.iocoder.yudao.module.conf.vo.BaseTypeRespVO;

View File

@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.conf.mapper;
import cn.iocoder.yudao.module.conf.entity.BaseWarehouse;
import cn.iocoder.yudao.module.conf.vo.BaseWarehouseListReqVO;
import cn.iocoder.yudao.module.conf.vo.BaseWarehouseRespVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 仓库 Mapper
*
* @author pqz
*/
@Mapper
public interface BaseWarehouseMapper extends BaseMapper<BaseWarehouse> {
/**
* 查询仓库列表
* @author PQZ
* @date 18:24 2024/9/10
* @param entity BaseWarehouseListReqVO实体
* @return java.util.List<cn.iocoder.yudao.module.conf.vo.BaseWarehouseRespVO>
**/
List<BaseWarehouseRespVO> queryList(@Param("entity")BaseWarehouseListReqVO entity);
}

View File

@ -0,0 +1,55 @@
package cn.iocoder.yudao.module.conf.service;
import cn.iocoder.yudao.module.conf.entity.BaseWarehouse;
import cn.iocoder.yudao.module.conf.vo.*;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 仓库 Service 接口
*
* @author pqz
*/
public interface BaseWarehouseService extends IService<BaseWarehouse> {
/**
* 新增仓库
*
* @param saveReqVO BaseWarehouseSaveReqVO实体
* @return void
* @author PQZ
* @date 18:28 2024/9/10
**/
void saveBaseWarehouse(BaseWarehouseSaveReqVO saveReqVO);
/**
* 删除仓库
*
* @param id 仓库id
* @author PQZ
* @date 18:29 2024/9/10
**/
void deleteBaseWarehouse(String id);
/**
* 根据仓库id查询仓库
*
* @param id 仓库id
* @return cn.iocoder.yudao.module.conf.vo.BaseTypeRespVO
* @author PQZ
* @date 18:30 2024/9/10
**/
BaseWarehouseRespVO getBaseWarehouse(String id);
/**
* 获取仓库列表
*
* @param listReqVO BaseWarehouseListReqVO实体
* @return java.util.List<cn.iocoder.yudao.module.conf.vo.BaseWarehouseRespVO>
* @author PQZ
* @date 18:31 2024/9/10
**/
List<BaseWarehouseRespVO> getBaseWarehouseList(BaseWarehouseListReqVO listReqVO);
}

View File

@ -17,7 +17,6 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import static cn.iocoder.yudao.common.ErrorCodeConstants.*;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -45,7 +44,7 @@ public class BaseTypeServiceImpl extends ServiceImpl<BaseTypeMapper, BaseType> i
public void saveBaseType(BaseTypeSaveReqVO saveReqVO) {
/*1、数据校验*/
//同级别下校验名称是否重复
validateBaseTypeNameUnique(saveReqVO.getId(),saveReqVO.getParentId(),saveReqVO.getType(),saveReqVO.getName(),saveReqVO.getCode());
validateBaseTypeNameUnique(saveReqVO.getId(), saveReqVO.getParentId(), saveReqVO.getType(), saveReqVO.getName(), saveReqVO.getCode());
/*2、数据保存*/
//类型转换
BaseType baseType = BeanUtils.toBean(saveReqVO, BaseType.class);
@ -55,9 +54,10 @@ public class BaseTypeServiceImpl extends ServiceImpl<BaseTypeMapper, BaseType> i
/**
* 删除配置类型
*
* @param id 配置类型id
* @author PQZ
* @date 17:07 2024/9/10
* @param id 配置类型id
**/
@Override
public void deleteBaseType(String id) {
@ -84,7 +84,7 @@ public class BaseTypeServiceImpl extends ServiceImpl<BaseTypeMapper, BaseType> i
* @author PQZ
* @date 11:34 2024/9/10
**/
private void validateBaseTypeNameUnique(String id, String parentId, String type, String name,String code) {
private void validateBaseTypeNameUnique(String id, String parentId, String type, String name, String code) {
//配置类型不能为空
if (StringUtils.isBlank(type)) {
throw exception(BASE_TYPE_NOT_EXISTS);
@ -93,7 +93,7 @@ public class BaseTypeServiceImpl extends ServiceImpl<BaseTypeMapper, BaseType> i
lambdaQueryWrapper.eq(BaseDO::getDeleted, 0)
.eq(BaseType::getType, type)
.eq(BaseType::getName, name)
.eq(BaseType::getName, code)
.eq(BaseType::getCode, code)
.eq(BaseType::getParentId, parentId);
//id存在为编辑情况,排除自身
if (null != id) {
@ -108,17 +108,18 @@ public class BaseTypeServiceImpl extends ServiceImpl<BaseTypeMapper, BaseType> i
/**
* 根据类型id查询配置类型
* @author PQZ
* @date 14:40 2024/9/10
*
* @param id 类型id
* @return cn.iocoder.yudao.module.conf.entity.BaseType
* @author PQZ
* @date 14:40 2024/9/10
**/
@Override
public BaseTypeRespVO getBaseType(String id) {
BaseType baseType = getById(id);
BaseTypeRespVO result = BeanUtils.toBean(baseType, BaseTypeRespVO.class);
//关联子公司转换
if (StringUtils.isNotBlank(result.getCorpId())){
if (StringUtils.isNotBlank(result.getCorpId())) {
result.setCorpIds(Arrays.asList(result.getCorpId().split(",")));
}
return result;
@ -126,10 +127,11 @@ public class BaseTypeServiceImpl extends ServiceImpl<BaseTypeMapper, BaseType> i
/**
* 获取配置类型列表
* @author PQZ
* @date 14:27 2024/9/10
*
* @param listReqVO BaseTypeListReqVO
* @return java.util.List<cn.iocoder.yudao.module.conf.entity.BaseType>
* @author PQZ
* @date 14:27 2024/9/10
**/
@Override
public List<BaseTypeRespVO> getBaseTypeList(BaseTypeListReqVO listReqVO) {

View File

@ -0,0 +1,134 @@
package cn.iocoder.yudao.module.conf.service.impl;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.conf.entity.BaseWarehouse;
import cn.iocoder.yudao.module.conf.mapper.BaseWarehouseMapper;
import cn.iocoder.yudao.module.conf.service.BaseWarehouseService;
import cn.iocoder.yudao.module.conf.vo.BaseWarehouseListReqVO;
import cn.iocoder.yudao.module.conf.vo.BaseWarehouseRespVO;
import cn.iocoder.yudao.module.conf.vo.BaseWarehouseSaveReqVO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import static cn.iocoder.yudao.common.ErrorCodeConstants.BASE_WAREHOUSE_EXITS_CHILDREN;
import static cn.iocoder.yudao.common.ErrorCodeConstants.BASE_WAREHOUSE_NAME_DUPLICATE;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
/**
* 配置类型 Service 实现类
*
* @author pqz
*/
@Service
@Validated
public class BaseWarehouseServiceImpl extends ServiceImpl<BaseWarehouseMapper, BaseWarehouse> implements BaseWarehouseService {
@Resource
private BaseWarehouseMapper baseWarehouseMapper;
/**
* 新增仓库
*
* @param saveReqVO BaseWarehouseSaveReqVO实体
* @return void
* @author PQZ
* @date 18:28 2024/9/10
**/
@Override
public void saveBaseWarehouse(BaseWarehouseSaveReqVO saveReqVO) {
/*1、数据校验*/
//同级别下校验名称是否重复
validateWarehouseUnique(saveReqVO.getId(), saveReqVO.getParentId(), saveReqVO.getName(), saveReqVO.getCode());
/*2、数据保存*/
//类型转换
BaseWarehouse baseWarehouse = BeanUtils.toBean(saveReqVO, BaseWarehouse.class);
//数据保存
saveOrUpdate(baseWarehouse);
}
/**
* 删除仓库
*
* @param id 仓库id
* @author PQZ
* @date 18:29 2024/9/10
**/
@Override
public void deleteBaseWarehouse(String id) {
// 校验是否有子配置类型
LambdaQueryWrapper<BaseWarehouse> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(BaseWarehouse::getParentId, id);
List<BaseWarehouse> list = list(lambdaQueryWrapper);
if (list.size() > 0) {
throw exception(BASE_WAREHOUSE_EXITS_CHILDREN);
}
// 删除
baseWarehouseMapper.deleteById(id);
}
/**
* 根据仓库id查询仓库
*
* @param id 仓库id
* @return cn.iocoder.yudao.module.conf.vo.BaseTypeRespVO
* @author PQZ
* @date 18:30 2024/9/10
**/
@Override
public BaseWarehouseRespVO getBaseWarehouse(String id) {
BaseWarehouse baseWarehouse = getById(id);
BaseWarehouseRespVO result = BeanUtils.toBean(baseWarehouse, BaseWarehouseRespVO.class);
//关联子公司转换
if (StringUtils.isNotBlank(result.getCorpId())) {
result.setCorpIds(Arrays.asList(result.getCorpId().split(",")));
}
return result;
}
/**
* 获取仓库列表
*
* @param listReqVO BaseWarehouseListReqVO实体
* @return java.util.List<cn.iocoder.yudao.module.conf.vo.BaseWarehouseRespVO>
* @author PQZ
* @date 18:31 2024/9/10
**/
@Override
public List<BaseWarehouseRespVO> getBaseWarehouseList(BaseWarehouseListReqVO listReqVO) {
return baseWarehouseMapper.queryList(listReqVO);
}
/**
* 同类型同级别下校验名称及编码唯一性
*
* @param id id
* @param parentId 父类id
* @param name 名称
* @param code 编码
* @author PQZ
* @date 11:34 2024/9/10
**/
private void validateWarehouseUnique(String id, String parentId, String name, String code) {
LambdaQueryWrapper<BaseWarehouse> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(BaseDO::getDeleted, 0)
.eq(BaseWarehouse::getName, name)
.eq(BaseWarehouse::getCode, code)
.eq(BaseWarehouse::getParentId, parentId);
//id存在为编辑情况,排除自身
if (null != id) {
lambdaQueryWrapper.ne(BaseWarehouse::getId, id);
}
//查询list校验唯一性
List<BaseWarehouse> list = list(lambdaQueryWrapper);
if (list.size() > 0) {
throw exception(BASE_WAREHOUSE_NAME_DUPLICATE);
}
}
}

View File

@ -0,0 +1,19 @@
package cn.iocoder.yudao.module.conf.vo;
import cn.iocoder.yudao.module.conf.entity.BaseWarehouse;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import java.time.LocalDateTime;
import org.springframework.format.annotation.DateTimeFormat;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 仓库列表 Request VO")
@Data
public class BaseWarehouseListReqVO extends BaseWarehouse {
}

View File

@ -0,0 +1,19 @@
package cn.iocoder.yudao.module.conf.vo;
import cn.iocoder.yudao.module.conf.entity.BaseWarehouse;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 仓库 Response VO")
@Data
@ExcelIgnoreUnannotated
public class BaseWarehouseRespVO extends BaseWarehouse {
/**关联子公司*/
List<String> corpIds = new ArrayList<>();
/**子公司名称字符串*/
String corpNames;
}

View File

@ -0,0 +1,13 @@
package cn.iocoder.yudao.module.conf.vo;
import cn.iocoder.yudao.module.conf.entity.BaseWarehouse;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 仓库新增/修改 Request VO")
@Data
public class BaseWarehouseSaveReqVO extends BaseWarehouse {
}

View File

@ -0,0 +1,38 @@
<?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="cn.iocoder.yudao.module.conf.mapper.BaseWarehouseMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<select id="queryList" resultType="cn.iocoder.yudao.module.conf.vo.BaseWarehouseRespVO">
SELECT
dbw.*,
GROUP_CONCAT(bc.corp_name) AS corpNames
FROM
dl_base_warehouse dbw
LEFT JOIN base_company bc ON FIND_IN_SET(bc.id, dbw.corp_id) > 0
<where>
dbw.deleted = 0
<if test="entity.status != null and entity.status != ''">
and dbw.status = #{entity.status}
</if>
<if test="entity.corpId != null and entity.corpId != ''">
and dbw.corp_id like concat('%', #{entity.corpId}, '%')
</if>
<if test="entity.name != null and entity.name != ''">
and dbw.name like concat('%', #{entity.name}, '%')
</if>
<if test="entity.code != null and entity.code != ''">
and dbw.code like concat('%', #{entity.code}, '%')
</if>
</where>
GROUP BY
dbw.id
order by dbw.sort asc
</select>
</mapper>