提交 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 { ...@@ -49,6 +49,11 @@ public class ProductBrandDO extends TenantEntity {
*/ */
private Integer status; private Integer status;
/**
* 部门id
*/
private Long deptId;
/** /**
* 删除标志(0代表存在 2代表删除) * 删除标志(0代表存在 2代表删除)
*/ */
......
...@@ -61,6 +61,11 @@ public class ProductCategoryDO extends TenantEntity { ...@@ -61,6 +61,11 @@ public class ProductCategoryDO extends TenantEntity {
*/ */
private Integer status; private Integer status;
/**
* 部门id
*/
private Long deptId;
/** /**
* 删除标志(0代表存在 2代表删除) * 删除标志(0代表存在 2代表删除)
*/ */
......
...@@ -45,6 +45,11 @@ public class ProductPropertyDO extends TenantEntity { ...@@ -45,6 +45,11 @@ public class ProductPropertyDO extends TenantEntity {
*/ */
private String remark; private String remark;
/**
* 部门id
*/
private Long deptId;
/** /**
* 删除标志(0代表存在 2代表删除) * 删除标志(0代表存在 2代表删除)
*/ */
......
...@@ -52,6 +52,11 @@ public class ProductPropertyValueDO extends TenantEntity { ...@@ -52,6 +52,11 @@ public class ProductPropertyValueDO extends TenantEntity {
*/ */
private String remark; private String remark;
/**
* 部门id
*/
private Long deptId;
/** /**
* 删除标志(0代表存在 2代表删除) * 删除标志(0代表存在 2代表删除)
*/ */
......
...@@ -128,6 +128,11 @@ public class ProductSkuDO extends TenantEntity { ...@@ -128,6 +128,11 @@ public class ProductSkuDO extends TenantEntity {
} }
/**
* 部门id
*/
private Long deptId;
/** /**
* 删除标志(0代表存在 2代表删除) * 删除标志(0代表存在 2代表删除)
*/ */
......
...@@ -168,6 +168,11 @@ public class ProductSpuDO extends TenantEntity { ...@@ -168,6 +168,11 @@ public class ProductSpuDO extends TenantEntity {
*/ */
private Integer browseCount; private Integer browseCount;
/**
* 部门id
*/
private Long deptId;
/** /**
* 删除标志(0代表存在 2代表删除) * 删除标志(0代表存在 2代表删除)
*/ */
......
...@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; ...@@ -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.mapper.BaseMapperPlusPlus;
import org.dromara.common.mybatis.core.page.PageResult; import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX; 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.admin.spu.vo.ProductSpuPageReqVO;
import org.dromara.mall.controller.product.app.spu.vo.AppProductSpuPageReqVO; import org.dromara.mall.controller.product.app.spu.vo.AppProductSpuPageReqVO;
import org.dromara.mall.domain.product.ProductSpuDO; import org.dromara.mall.domain.product.ProductSpuDO;
...@@ -37,6 +39,14 @@ public interface ProductSpuMapper extends BaseMapperPlusPlus<ProductSpuDO, Produ ...@@ -37,6 +39,14 @@ public interface ProductSpuMapper extends BaseMapperPlusPlus<ProductSpuDO, Produ
.orderByDesc(ProductSpuDO::getSort) .orderByDesc(ProductSpuDO::getSort)
.orderByDesc(ProductSpuDO::getId); .orderByDesc(ProductSpuDO::getId);
appendTabQuery(tabType, queryWrapper); 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); return selectPagePlus(reqVO, queryWrapper);
} }
...@@ -52,6 +62,18 @@ public interface ProductSpuMapper extends BaseMapperPlusPlus<ProductSpuDO, Produ ...@@ -52,6 +62,18 @@ public interface ProductSpuMapper extends BaseMapperPlusPlus<ProductSpuDO, Produ
queryWrapper.le(ProductSpuDO::getStock, ProductConstants.ALERT_STOCK) queryWrapper.le(ProductSpuDO::getStock, ProductConstants.ALERT_STOCK)
// 如果库存触发警戒库存且状态为回收站的话则不计入触发警戒库存的个数 // 如果库存触发警戒库存且状态为回收站的话则不计入触发警戒库存的个数
.notIn(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus()); .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); return selectCount(queryWrapper);
} }
......
...@@ -7,6 +7,7 @@ import jakarta.annotation.Resource; ...@@ -7,6 +7,7 @@ import jakarta.annotation.Resource;
import org.dromara.common.mall.enums.CommonStatusEnum; import org.dromara.common.mall.enums.CommonStatusEnum;
import org.dromara.common.mybatis.core.page.PageResult; import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX; 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.ProductBrandCreateReqVO;
import org.dromara.mall.controller.product.admin.brand.vo.ProductBrandListReqVO; import org.dromara.mall.controller.product.admin.brand.vo.ProductBrandListReqVO;
import org.dromara.mall.controller.product.admin.brand.vo.ProductBrandPageReqVO; import org.dromara.mall.controller.product.admin.brand.vo.ProductBrandPageReqVO;
...@@ -49,6 +50,7 @@ public class ProductBrandServiceImpl implements ProductBrandService { ...@@ -49,6 +50,7 @@ public class ProductBrandServiceImpl implements ProductBrandService {
// 插入 // 插入
ProductBrandDO brand = BeanUtil.copyProperties(createReqVO, ProductBrandDO.class); ProductBrandDO brand = BeanUtil.copyProperties(createReqVO, ProductBrandDO.class);
brand.setDeptId(LoginHelper.getDeptId());
productBrandMapper.insert(brand); productBrandMapper.insert(brand);
// 返回 // 返回
return brand.getId(); return brand.getId();
......
...@@ -6,6 +6,7 @@ import jakarta.annotation.Resource; ...@@ -6,6 +6,7 @@ import jakarta.annotation.Resource;
import org.dromara.common.mall.enums.CommonStatusEnum; import org.dromara.common.mall.enums.CommonStatusEnum;
import org.dromara.common.mall.util.collection.CollectionUtils; import org.dromara.common.mall.util.collection.CollectionUtils;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX; 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.ProductCategoryListReqVO;
import org.dromara.mall.controller.product.admin.category.vo.ProductCategorySaveReqVO; import org.dromara.mall.controller.product.admin.category.vo.ProductCategorySaveReqVO;
import org.dromara.mall.domain.product.ProductCategoryDO; import org.dromara.mall.domain.product.ProductCategoryDO;
...@@ -49,6 +50,7 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { ...@@ -49,6 +50,7 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
// 插入 // 插入
ProductCategoryDO category = BeanUtil.copyProperties(createReqVO, ProductCategoryDO.class); ProductCategoryDO category = BeanUtil.copyProperties(createReqVO, ProductCategoryDO.class);
category.setDeptId(LoginHelper.getDeptId());
productCategoryMapper.insert(category); productCategoryMapper.insert(category);
// 返回 // 返回
return category.getId(); return category.getId();
......
...@@ -5,6 +5,7 @@ import jakarta.annotation.Resource; ...@@ -5,6 +5,7 @@ import jakarta.annotation.Resource;
import org.dromara.common.mall.util.object.BeanUtils; import org.dromara.common.mall.util.object.BeanUtils;
import org.dromara.common.mybatis.core.page.PageResult; import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX; 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.ProductPropertyPageReqVO;
import org.dromara.mall.controller.product.admin.property.vo.property.ProductPropertySaveReqVO; import org.dromara.mall.controller.product.admin.property.vo.property.ProductPropertySaveReqVO;
import org.dromara.mall.domain.product.ProductPropertyDO; import org.dromara.mall.domain.product.ProductPropertyDO;
...@@ -54,6 +55,7 @@ public class ProductPropertyServiceImpl implements ProductPropertyService { ...@@ -54,6 +55,7 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
// 插入 // 插入
ProductPropertyDO property = BeanUtils.toBean(createReqVO, ProductPropertyDO.class); ProductPropertyDO property = BeanUtils.toBean(createReqVO, ProductPropertyDO.class);
property.setDeptId(LoginHelper.getDeptId());
productPropertyMapper.insert(property); productPropertyMapper.insert(property);
// 返回 // 返回
return property.getId(); return property.getId();
......
...@@ -5,6 +5,7 @@ import jakarta.annotation.Resource; ...@@ -5,6 +5,7 @@ import jakarta.annotation.Resource;
import org.dromara.common.mall.util.object.BeanUtils; import org.dromara.common.mall.util.object.BeanUtils;
import org.dromara.common.mybatis.core.page.PageResult; import org.dromara.common.mybatis.core.page.PageResult;
import org.dromara.common.mybatis.core.query.LambdaQueryWrapperX; 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.ProductPropertyValuePageReqVO;
import org.dromara.mall.controller.product.admin.property.vo.value.ProductPropertyValueSaveReqVO; import org.dromara.mall.controller.product.admin.property.vo.value.ProductPropertyValueSaveReqVO;
import org.dromara.mall.domain.product.ProductPropertyValueDO; import org.dromara.mall.domain.product.ProductPropertyValueDO;
...@@ -52,6 +53,7 @@ public class ProductPropertyValueServiceImpl implements ProductPropertyValueServ ...@@ -52,6 +53,7 @@ public class ProductPropertyValueServiceImpl implements ProductPropertyValueServ
// 新增 // 新增
ProductPropertyValueDO value = BeanUtils.toBean(createReqVO, ProductPropertyValueDO.class); ProductPropertyValueDO value = BeanUtils.toBean(createReqVO, ProductPropertyValueDO.class);
value.setDeptId(LoginHelper.getDeptId());
productPropertyValueMapper.insert(value); productPropertyValueMapper.insert(value);
return value.getId(); return value.getId();
} }
......
...@@ -5,6 +5,7 @@ import cn.hutool.core.collection.ListUtil; ...@@ -5,6 +5,7 @@ import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.dromara.common.mall.util.object.BeanUtils; 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.api.dto.product.ProductSkuUpdateStockReqDTO;
import org.dromara.mall.controller.product.admin.spu.vo.ProductSkuSaveReqVO; import org.dromara.mall.controller.product.admin.spu.vo.ProductSkuSaveReqVO;
import org.dromara.mall.convert.product.ProductSkuConvert; import org.dromara.mall.convert.product.ProductSkuConvert;
...@@ -138,7 +139,10 @@ public class ProductSkuServiceImpl implements ProductSkuService { ...@@ -138,7 +139,10 @@ public class ProductSkuServiceImpl implements ProductSkuService {
@Override @Override
public void createSkuList(Long spuId, List<ProductSkuSaveReqVO> skuCreateReqList) { 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); productSkuMapper.insertBatch(skus);
} }
......
...@@ -7,6 +7,8 @@ import jakarta.annotation.Resource; ...@@ -7,6 +7,8 @@ import jakarta.annotation.Resource;
import org.dromara.common.mall.enums.CommonStatusEnum; import org.dromara.common.mall.enums.CommonStatusEnum;
import org.dromara.common.mall.util.object.BeanUtils; import org.dromara.common.mall.util.object.BeanUtils;
import org.dromara.common.mybatis.core.page.PageResult; 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.category.vo.ProductCategoryListReqVO;
import org.dromara.mall.controller.product.admin.spu.vo.ProductSkuSaveReqVO; import org.dromara.mall.controller.product.admin.spu.vo.ProductSkuSaveReqVO;
import org.dromara.mall.controller.product.admin.spu.vo.ProductSpuPageReqVO; import org.dromara.mall.controller.product.admin.spu.vo.ProductSpuPageReqVO;
...@@ -64,6 +66,8 @@ public class ProductSpuServiceImpl implements ProductSpuService { ...@@ -64,6 +66,8 @@ public class ProductSpuServiceImpl implements ProductSpuService {
productSkuService.validateSkuList(skuSaveReqList, createReqVO.getSpecType()); productSkuService.validateSkuList(skuSaveReqList, createReqVO.getSpecType());
ProductSpuDO spu = BeanUtils.toBean(createReqVO, ProductSpuDO.class); ProductSpuDO spu = BeanUtils.toBean(createReqVO, ProductSpuDO.class);
// 设置部门
spu.setDeptId(LoginHelper.getDeptId());
// 初始化 SPU 中 SKU 相关属性 // 初始化 SPU 中 SKU 相关属性
initSpuFromSkus(spu, skuSaveReqList); initSpuFromSkus(spu, skuSaveReqList);
// 插入 SPU // 插入 SPU
...@@ -252,19 +256,31 @@ public class ProductSpuServiceImpl implements ProductSpuService { ...@@ -252,19 +256,31 @@ public class ProductSpuServiceImpl implements ProductSpuService {
Map<Integer, Long> counts = Maps.newLinkedHashMapWithExpectedSize(5); Map<Integer, Long> counts = Maps.newLinkedHashMapWithExpectedSize(5);
// 查询销售中的商品数量 // 查询销售中的商品数量
counts.put(ProductSpuPageReqVO.FOR_SALE, 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, 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, counts.put(ProductSpuPageReqVO.SOLD_OUT,
productSpuMapper.selectCount(ProductSpuDO::getStock, 0)); productSpuMapper.selectCountDataPermission(
new LambdaQueryWrapperX<ProductSpuDO>()
.eq(ProductSpuDO::getStock, 0)
));
// 查询触发警戒库存的商品数量 // 查询触发警戒库存的商品数量
counts.put(ProductSpuPageReqVO.ALERT_STOCK, counts.put(ProductSpuPageReqVO.ALERT_STOCK,
productSpuMapper.selectCount()); productSpuMapper.selectCount());
// 查询回收站中的商品数量 // 查询回收站中的商品数量
counts.put(ProductSpuPageReqVO.RECYCLE_BIN, 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; return counts;
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论