提交 6a21eb32 authored 作者: hzh's avatar hzh

商品功能实现

上级 5741d016
package org.dromara.common.mybatis.helper;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.enums.DataScopeType;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.api.RemoteDataScopeService;
import org.dromara.system.api.model.RoleDTO;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author hzh
* @date 2025-04-21
**/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class CustomerDataPermissionHelper {
/**
* 是否需要过滤数据
*
* @return 是否需要过滤数据
*/
public static Boolean isNeedFilter() {
// 如果是超级管理员或租户管理员,则不过滤数据
if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) {
return false;
}
List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles();
for (RoleDTO role : roles) {
// 获取角色权限泛型
DataScopeType type = DataScopeType.findCode(role.getDataScope());
if (ObjectUtil.isNull(type)) {
throw new ServiceException("角色数据范围异常 => " + role.getDataScope());
}
// 全部数据权限直接返回
if (type == DataScopeType.ALL) {
return false;
}
}
return true;
}
public static Boolean isNeedFilterDeptId() {
List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles();
for (RoleDTO role : roles) {
// 获取角色权限泛型
DataScopeType type = DataScopeType.findCode(role.getDataScope());
if (type == DataScopeType.CUSTOM || type == DataScopeType.DEPT || type == DataScopeType.DEPT_AND_CHILD) {
return true;
}
}
return false;
}
public static List<Long> getDeptIds() {
List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles();
Long deptId = LoginHelper.getDeptId();
List<Long> deptIds = new ArrayList<>();
RemoteDataScopeService rdss = SpringUtils.getBean(RemoteDataScopeService.class);
for (RoleDTO role : roles) {
// 获取角色权限泛型
DataScopeType type = DataScopeType.findCode(role.getDataScope());
if (ObjectUtil.isNull(type)) {
throw new ServiceException("角色数据范围异常 => " + role.getDataScope());
}
if (type == DataScopeType.CUSTOM) {
deptIds.addAll(stringToListLong(rdss.getRoleCustom(role.getRoleId())));
} else if (type == DataScopeType.DEPT) {
deptIds.add(deptId);
} else if (type == DataScopeType.DEPT_AND_CHILD) {
deptIds.addAll(stringToListLong(rdss.getDeptAndChild(deptId)));
}
}
if (CollectionUtils.isEmpty(deptIds)) {
return List.of(-1L);
}
return deptIds;
}
public static List<Long> stringToListLong(String str) {
if (StringUtils.isBlank(str)) {
return List.of();
}
// 按逗号分割字符串为数组
String[] arr = StrUtil.splitToArray(str, ',');
// 将数组转换为List<Long>
List<Long> longList = CollUtil.newArrayList(arr).stream()
.map(Long::parseLong)
.collect(Collectors.toList());
return longList;
}
}
......@@ -49,6 +49,11 @@ public class ProductBrandDO extends TenantEntity {
*/
private Integer status;
/**
* 部门id
*/
private Long deptId;
/**
* 删除标志(0代表存在 2代表删除)
*/
......
......@@ -61,6 +61,11 @@ public class ProductCategoryDO extends TenantEntity {
*/
private Integer status;
/**
* 部门id
*/
private Long deptId;
/**
* 删除标志(0代表存在 2代表删除)
*/
......
......@@ -45,6 +45,11 @@ public class ProductPropertyDO extends TenantEntity {
*/
private String remark;
/**
* 部门id
*/
private Long deptId;
/**
* 删除标志(0代表存在 2代表删除)
*/
......
......@@ -52,6 +52,11 @@ public class ProductPropertyValueDO extends TenantEntity {
*/
private String remark;
/**
* 部门id
*/
private Long deptId;
/**
* 删除标志(0代表存在 2代表删除)
*/
......
......@@ -128,6 +128,11 @@ public class ProductSkuDO extends TenantEntity {
}
/**
* 部门id
*/
private Long deptId;
/**
* 删除标志(0代表存在 2代表删除)
*/
......
......@@ -168,6 +168,11 @@ public class ProductSpuDO extends TenantEntity {
*/
private Integer browseCount;
/**
* 部门id
*/
private Long deptId;
/**
* 删除标志(0代表存在 2代表删除)
*/
......
......@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.common.mybatis.helper.CustomerDataPermissionHelper;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.mall.controller.product.admin.spu.vo.ProductSpuPageReqVO;
import org.dromara.mall.controller.product.app.spu.vo.AppProductSpuPageReqVO;
import org.dromara.mall.domain.product.ProductSpuDO;
......@@ -37,6 +39,14 @@ public interface ProductSpuMapper extends BaseMapperPlusPlus<ProductSpuDO, Produ
.orderByDesc(ProductSpuDO::getSort)
.orderByDesc(ProductSpuDO::getId);
appendTabQuery(tabType, queryWrapper);
// 设置权限
if (CustomerDataPermissionHelper.isNeedFilter()) {
if (CustomerDataPermissionHelper.isNeedFilterDeptId()) {
queryWrapper.in(ProductSpuDO::getDeptId, CustomerDataPermissionHelper.getDeptIds());
} else {
queryWrapper.eq(ProductSpuDO::getCreateBy, LoginHelper.getUserId());
}
}
return selectPagePlus(reqVO, queryWrapper);
}
......@@ -52,6 +62,18 @@ public interface ProductSpuMapper extends BaseMapperPlusPlus<ProductSpuDO, Produ
queryWrapper.le(ProductSpuDO::getStock, ProductConstants.ALERT_STOCK)
// 如果库存触发警戒库存且状态为回收站的话则不计入触发警戒库存的个数
.notIn(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus());
return selectCountDataPermission(queryWrapper);
}
default Long selectCountDataPermission(LambdaQueryWrapperX<ProductSpuDO> queryWrapper) {
// 设置权限
if (CustomerDataPermissionHelper.isNeedFilter()) {
if (CustomerDataPermissionHelper.isNeedFilterDeptId()) {
queryWrapper.in(ProductSpuDO::getDeptId, CustomerDataPermissionHelper.getDeptIds());
} else {
queryWrapper.eq(ProductSpuDO::getCreateBy, LoginHelper.getUserId());
}
}
return selectCount(queryWrapper);
}
......
......@@ -7,6 +7,7 @@ import jakarta.annotation.Resource;
import org.dromara.common.mall.enums.CommonStatusEnum;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.mall.controller.product.admin.brand.vo.ProductBrandCreateReqVO;
import org.dromara.mall.controller.product.admin.brand.vo.ProductBrandListReqVO;
import org.dromara.mall.controller.product.admin.brand.vo.ProductBrandPageReqVO;
......@@ -49,6 +50,7 @@ public class ProductBrandServiceImpl implements ProductBrandService {
// 插入
ProductBrandDO brand = BeanUtil.copyProperties(createReqVO, ProductBrandDO.class);
brand.setDeptId(LoginHelper.getDeptId());
productBrandMapper.insert(brand);
// 返回
return brand.getId();
......
......@@ -6,6 +6,7 @@ import jakarta.annotation.Resource;
import org.dromara.common.mall.enums.CommonStatusEnum;
import org.dromara.common.mall.util.collection.CollectionUtils;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.mall.controller.product.admin.category.vo.ProductCategoryListReqVO;
import org.dromara.mall.controller.product.admin.category.vo.ProductCategorySaveReqVO;
import org.dromara.mall.domain.product.ProductCategoryDO;
......@@ -49,6 +50,7 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
// 插入
ProductCategoryDO category = BeanUtil.copyProperties(createReqVO, ProductCategoryDO.class);
category.setDeptId(LoginHelper.getDeptId());
productCategoryMapper.insert(category);
// 返回
return category.getId();
......
......@@ -5,6 +5,7 @@ import jakarta.annotation.Resource;
import org.dromara.common.mall.util.object.BeanUtils;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.mall.controller.product.admin.property.vo.property.ProductPropertyPageReqVO;
import org.dromara.mall.controller.product.admin.property.vo.property.ProductPropertySaveReqVO;
import org.dromara.mall.domain.product.ProductPropertyDO;
......@@ -54,6 +55,7 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
// 插入
ProductPropertyDO property = BeanUtils.toBean(createReqVO, ProductPropertyDO.class);
property.setDeptId(LoginHelper.getDeptId());
productPropertyMapper.insert(property);
// 返回
return property.getId();
......
......@@ -5,6 +5,7 @@ import jakarta.annotation.Resource;
import org.dromara.common.mall.util.object.BeanUtils;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.mall.controller.product.admin.property.vo.value.ProductPropertyValuePageReqVO;
import org.dromara.mall.controller.product.admin.property.vo.value.ProductPropertyValueSaveReqVO;
import org.dromara.mall.domain.product.ProductPropertyValueDO;
......@@ -52,6 +53,7 @@ public class ProductPropertyValueServiceImpl implements ProductPropertyValueServ
// 新增
ProductPropertyValueDO value = BeanUtils.toBean(createReqVO, ProductPropertyValueDO.class);
value.setDeptId(LoginHelper.getDeptId());
productPropertyValueMapper.insert(value);
return value.getId();
}
......
......@@ -5,6 +5,7 @@ import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil;
import jakarta.annotation.Resource;
import org.dromara.common.mall.util.object.BeanUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.mall.api.dto.product.ProductSkuUpdateStockReqDTO;
import org.dromara.mall.controller.product.admin.spu.vo.ProductSkuSaveReqVO;
import org.dromara.mall.convert.product.ProductSkuConvert;
......@@ -138,7 +139,10 @@ public class ProductSkuServiceImpl implements ProductSkuService {
@Override
public void createSkuList(Long spuId, List<ProductSkuSaveReqVO> skuCreateReqList) {
List<ProductSkuDO> skus = BeanUtils.toBean(skuCreateReqList, ProductSkuDO.class, sku -> sku.setSpuId(spuId));
List<ProductSkuDO> skus = BeanUtils.toBean(skuCreateReqList, ProductSkuDO.class, sku ->{
sku.setSpuId(spuId);
sku.setDeptId(LoginHelper.getDeptId());
} );
productSkuMapper.insertBatch(skus);
}
......
......@@ -7,6 +7,8 @@ import jakarta.annotation.Resource;
import org.dromara.common.mall.enums.CommonStatusEnum;
import org.dromara.common.mall.util.object.BeanUtils;
import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.mall.controller.product.admin.category.vo.ProductCategoryListReqVO;
import org.dromara.mall.controller.product.admin.spu.vo.ProductSkuSaveReqVO;
import org.dromara.mall.controller.product.admin.spu.vo.ProductSpuPageReqVO;
......@@ -64,6 +66,8 @@ public class ProductSpuServiceImpl implements ProductSpuService {
productSkuService.validateSkuList(skuSaveReqList, createReqVO.getSpecType());
ProductSpuDO spu = BeanUtils.toBean(createReqVO, ProductSpuDO.class);
// 设置部门
spu.setDeptId(LoginHelper.getDeptId());
// 初始化 SPU 中 SKU 相关属性
initSpuFromSkus(spu, skuSaveReqList);
// 插入 SPU
......@@ -252,19 +256,31 @@ public class ProductSpuServiceImpl implements ProductSpuService {
Map<Integer, Long> counts = Maps.newLinkedHashMapWithExpectedSize(5);
// 查询销售中的商品数量
counts.put(ProductSpuPageReqVO.FOR_SALE,
productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus()));
productSpuMapper.selectCountDataPermission(
new LambdaQueryWrapperX<ProductSpuDO>()
.eq(ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus())
));
// 查询仓库中的商品数量
counts.put(ProductSpuPageReqVO.IN_WAREHOUSE,
productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.DISABLE.getStatus()));
productSpuMapper.selectCountDataPermission(
new LambdaQueryWrapperX<ProductSpuDO>()
.eq(ProductSpuDO::getStatus, ProductSpuStatusEnum.DISABLE.getStatus())
));
// 查询售空的商品数量
counts.put(ProductSpuPageReqVO.SOLD_OUT,
productSpuMapper.selectCount(ProductSpuDO::getStock, 0));
productSpuMapper.selectCountDataPermission(
new LambdaQueryWrapperX<ProductSpuDO>()
.eq(ProductSpuDO::getStock, 0)
));
// 查询触发警戒库存的商品数量
counts.put(ProductSpuPageReqVO.ALERT_STOCK,
productSpuMapper.selectCount());
// 查询回收站中的商品数量
counts.put(ProductSpuPageReqVO.RECYCLE_BIN,
productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus()));
productSpuMapper.selectCountDataPermission(
new LambdaQueryWrapperX<ProductSpuDO>()
.eq(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus())
));
return counts;
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论