商品模块代码提交
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
package com.czg.service.product.mapper;
|
||||
|
||||
import com.czg.product.entity.ProdSku;
|
||||
import com.mybatisflex.core.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
/**
|
||||
* 商品SKU
|
||||
*
|
||||
* @author Tankaikai tankaikai@aliyun.com
|
||||
* @since 1.0 2025-02-16
|
||||
*/
|
||||
@Mapper
|
||||
public interface ProdSkuMapper extends BaseMapper<ProdSku> {
|
||||
|
||||
}
|
||||
@@ -8,7 +8,7 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
* 商品
|
||||
*
|
||||
* @author Tankaikai tankaikai@aliyun.com
|
||||
* @since 1.0 2025-02-10
|
||||
* @since 1.0 2025-02-16
|
||||
*/
|
||||
@Mapper
|
||||
public interface ProductMapper extends BaseMapper<Product> {
|
||||
|
||||
@@ -11,6 +11,6 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
* @since 1.0 2025-02-13
|
||||
*/
|
||||
@Mapper
|
||||
public interface ShopProductSpecMapper extends BaseMapper<ShopProdSpec> {
|
||||
public interface ShopProdSpecMapper extends BaseMapper<ShopProdSpec> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
package com.czg.service.product.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.czg.exception.CzgException;
|
||||
import com.czg.product.dto.ProdSkuDTO;
|
||||
import com.czg.product.entity.ProdSku;
|
||||
import com.czg.product.service.ProdSkuService;
|
||||
import com.czg.sa.StpKit;
|
||||
import com.czg.service.product.mapper.ProdSkuMapper;
|
||||
import com.czg.utils.PageUtil;
|
||||
import com.mybatisflex.core.paginate.Page;
|
||||
import com.mybatisflex.core.query.QueryWrapper;
|
||||
import com.mybatisflex.core.update.UpdateChain;
|
||||
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 商品SKU
|
||||
*
|
||||
* @author Tankaikai tankaikai@aliyun.com
|
||||
* @since 1.0 2025-02-16
|
||||
*/
|
||||
@Service
|
||||
public class ProdSkuServiceImpl extends ServiceImpl<ProdSkuMapper, ProdSku> implements ProdSkuService {
|
||||
|
||||
private QueryWrapper buildQueryWrapper(ProdSkuDTO param) {
|
||||
QueryWrapper queryWrapper = PageUtil.buildSortQueryWrapper();
|
||||
/*if (StrUtil.isNotEmpty(param.getName())) {
|
||||
queryWrapper.like(ProdSku::getName, param.getName());
|
||||
}*/
|
||||
Long shopId = StpKit.USER.getLoginIdAsLong();
|
||||
queryWrapper.eq(ProdSku::getShopId, shopId);
|
||||
queryWrapper.orderBy(ProdSku::getId, false);
|
||||
return queryWrapper;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Page<ProdSkuDTO> getProdSkuPage(ProdSkuDTO param) {
|
||||
QueryWrapper queryWrapper = buildQueryWrapper(param);
|
||||
return super.pageAs(PageUtil.buildPage(), queryWrapper, ProdSkuDTO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ProdSkuDTO> getProdSkuList(ProdSkuDTO param) {
|
||||
QueryWrapper queryWrapper = buildQueryWrapper(param);
|
||||
//queryWrapper.eq(ProdSku::getStatus, StatusEnum.ENABLED.value());
|
||||
return super.listAs(queryWrapper, ProdSkuDTO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProdSkuDTO getProdSkuById(Long id) {
|
||||
Long shopId = StpKit.USER.getLoginIdAsLong();
|
||||
return super.getOneAs(query().eq(ProdSku::getId, id).eq(ProdSku::getShopId, shopId), ProdSkuDTO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addProdSku(ProdSkuDTO dto) {
|
||||
Long shopId = StpKit.USER.getLoginIdAsLong();
|
||||
boolean exists = true;
|
||||
//super.exists(query().eq(ProdSku::getName, dto.getName()).eq(ProdSku::getShopId, shopId));
|
||||
if (exists) {
|
||||
throw new CzgException("商品SKU已存在");
|
||||
}
|
||||
ProdSku entity = BeanUtil.copyProperties(dto, ProdSku.class);
|
||||
//entity.setStatus(StatusEnum.ENABLED.value());
|
||||
entity.setShopId(shopId);
|
||||
return super.save(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateProdSku(ProdSkuDTO dto) {
|
||||
Long shopId = StpKit.USER.getLoginIdAsLong();
|
||||
dto.setShopId(shopId);
|
||||
//boolean exists = super.exists(query().eq(ProdSku::getName, dto.getName()).eq(ProdSku::getShopId, shopId).ne(ProdSku::getId, dto.getId()));
|
||||
boolean exists = true;
|
||||
if (exists) {
|
||||
throw new CzgException("商品SKU已存在");
|
||||
}
|
||||
ProdSku entity = BeanUtil.copyProperties(dto, ProdSku.class);
|
||||
return super.updateById(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean deleteProdSku(Long id) {
|
||||
Long shopId = StpKit.USER.getLoginIdAsLong();
|
||||
//return super.remove(query().eq(ClassName}::getId, id).eq(ClassName}::getShopId, shopId));
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean disableProdSku(Long id) {
|
||||
Long shopId = StpKit.USER.getLoginIdAsLong();
|
||||
return UpdateChain.of(ProdSku.class)
|
||||
//.set(ProdSku::getStatus, StatusEnum.DISABLE.value())
|
||||
.eq(ProdSku::getId, id)
|
||||
.eq(ProdSku::getShopId, shopId)
|
||||
.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean enableProdSku(Long id) {
|
||||
Long shopId = StpKit.USER.getLoginIdAsLong();
|
||||
return UpdateChain.of(ProdSku.class)
|
||||
//.set(ProdSku::getStatus, StatusEnum.ENABLED.value())
|
||||
.eq(ProdSku::getId, id)
|
||||
.eq(ProdSku::getShopId, shopId)
|
||||
.update();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,19 +1,174 @@
|
||||
package com.czg.service.product.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.ObjUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.czg.enums.DeleteEnum;
|
||||
import com.czg.enums.YesNoEnum;
|
||||
import com.czg.exception.CzgException;
|
||||
import com.czg.product.dto.ProdSkuDTO;
|
||||
import com.czg.product.dto.ProductDTO;
|
||||
import com.czg.product.entity.ProdSku;
|
||||
import com.czg.product.entity.Product;
|
||||
import com.czg.product.enums.ProductTypeEnum;
|
||||
import com.czg.product.service.ProductService;
|
||||
import com.czg.sa.StpKit;
|
||||
import com.czg.service.product.mapper.ProdSkuMapper;
|
||||
import com.czg.service.product.mapper.ProductMapper;
|
||||
import com.czg.utils.PageUtil;
|
||||
import com.mybatisflex.core.paginate.Page;
|
||||
import com.mybatisflex.core.query.QueryWrapper;
|
||||
import com.mybatisflex.core.update.UpdateChain;
|
||||
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.czg.product.entity.table.ProductTableDef.PRODUCT;
|
||||
import static com.czg.product.entity.table.ShopProdCategoryTableDef.SHOP_PROD_CATEGORY;
|
||||
import static com.czg.product.entity.table.ShopProdSpecTableDef.SHOP_PROD_SPEC;
|
||||
import static com.czg.product.entity.table.ShopProdUnitTableDef.SHOP_PROD_UNIT;
|
||||
|
||||
/**
|
||||
* 商品
|
||||
*
|
||||
* @author Tankaikai tankaikai@aliyun.com
|
||||
* @since 1.0 2025-02-10
|
||||
* @since 1.0 2025-02-16
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
@Service
|
||||
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
|
||||
|
||||
private final ProdSkuMapper prodSkuMapper;
|
||||
|
||||
private QueryWrapper buildQueryWrapper(ProductDTO param) {
|
||||
QueryWrapper queryWrapper = PageUtil.buildSortQueryWrapper();
|
||||
if (StrUtil.isNotEmpty(param.getName())) {
|
||||
queryWrapper.like(Product::getName, param.getName());
|
||||
}
|
||||
if (ObjUtil.isNotNull(param.getCategoryId())) {
|
||||
queryWrapper.eq(Product::getCategoryId, param.getCategoryId());
|
||||
}
|
||||
if (ObjUtil.isNotNull(param.getSpecId())) {
|
||||
queryWrapper.like(Product::getSpecId, param.getSpecId());
|
||||
}
|
||||
Long shopId = StpKit.USER.getLoginIdAsLong();
|
||||
queryWrapper.eq(Product::getShopId, shopId);
|
||||
queryWrapper.eq(Product::getIsDel, DeleteEnum.NORMAL.value());
|
||||
queryWrapper.orderBy(Product::getSort, false);
|
||||
queryWrapper.orderBy(Product::getId, false);
|
||||
return queryWrapper;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Page<ProductDTO> getProductPage(ProductDTO param) {
|
||||
QueryWrapper queryWrapper = buildQueryWrapper(param);
|
||||
queryWrapper.select(PRODUCT.DEFAULT_COLUMNS)
|
||||
.select(SHOP_PROD_UNIT.NAME.as(ProductDTO::getUnitName))
|
||||
.select(SHOP_PROD_CATEGORY.NAME.as(ProductDTO::getCategoryName))
|
||||
.select(SHOP_PROD_SPEC.NAME.as(ProductDTO::getSpecName),SHOP_PROD_SPEC.FULL_NAME.as(ProductDTO::getSpecFullName))
|
||||
.from(PRODUCT)
|
||||
.leftJoin(SHOP_PROD_UNIT).on(SHOP_PROD_UNIT.ID.eq(PRODUCT.UNIT_ID))
|
||||
.leftJoin(SHOP_PROD_CATEGORY).on(SHOP_PROD_CATEGORY.ID.eq(PRODUCT.CATEGORY_ID))
|
||||
.leftJoin(SHOP_PROD_SPEC).on(SHOP_PROD_SPEC.ID.eq(PRODUCT.SPEC_ID));
|
||||
return super.pageAs(PageUtil.buildPage(), queryWrapper, ProductDTO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ProductDTO> getProductList(ProductDTO param) {
|
||||
QueryWrapper queryWrapper = buildQueryWrapper(param);
|
||||
//queryWrapper.eq(Product::getStatus, StatusEnum.ENABLED.value());
|
||||
return super.listAs(queryWrapper, ProductDTO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProductDTO getProductById(Long id) {
|
||||
Long shopId = StpKit.USER.getLoginIdAsLong();
|
||||
return super.getOneAs(query().eq(Product::getId, id).eq(Product::getShopId, shopId), ProductDTO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean addProduct(ProductDTO dto) {
|
||||
Long shopId = StpKit.USER.getLoginIdAsLong();
|
||||
boolean exists = super.exists(query().eq(Product::getName, dto.getName()).eq(Product::getShopId, shopId));
|
||||
if (exists) {
|
||||
throw new CzgException("商品已存在");
|
||||
}
|
||||
|
||||
Product entity = BeanUtil.copyProperties(dto, Product.class);
|
||||
//套餐
|
||||
if (ProductTypeEnum.PACKAGE.value().equals(dto.getType())) {
|
||||
//套餐内容
|
||||
if (CollUtil.isNotEmpty(dto.getProGroupVo())) {
|
||||
entity.setGroupSnap(JSON.toJSONString(dto.getProGroupVo()));
|
||||
}
|
||||
}
|
||||
|
||||
entity.setSpecInfo(JSON.toJSONString(dto.getSkuList()));
|
||||
entity.setIsDel(DeleteEnum.NORMAL.value());
|
||||
entity.setShopId(shopId);
|
||||
super.save(entity);
|
||||
List<ProdSkuDTO> skuList = dto.getSkuList();
|
||||
if(CollUtil.isNotEmpty(skuList)){
|
||||
List<ProdSku> prodSkuList = new ArrayList<>();
|
||||
for (ProdSkuDTO prodSkuDTO : skuList) {
|
||||
ProdSku prodSku = BeanUtil.copyProperties(prodSkuDTO, ProdSku.class);
|
||||
prodSku.setShopId(entity.getShopId());
|
||||
prodSku.setProductId(entity.getId());
|
||||
prodSku.setRealSalesNumber(BigDecimal.ZERO);
|
||||
prodSku.setIsPauseSale(YesNoEnum.NO.value());
|
||||
prodSku.setIsGrounding(YesNoEnum.YES.value());
|
||||
prodSku.setIsDel(DeleteEnum.NORMAL.value());
|
||||
prodSkuList.add(prodSku);
|
||||
}
|
||||
prodSkuMapper.insertBatch(prodSkuList);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateProduct(ProductDTO dto) {
|
||||
Long shopId = StpKit.USER.getLoginIdAsLong();
|
||||
dto.setShopId(shopId);
|
||||
boolean exists = super.exists(query().eq(Product::getName, dto.getName()).eq(Product::getShopId, shopId).ne(Product::getId, dto.getId()));
|
||||
if (exists) {
|
||||
throw new CzgException("商品已存在");
|
||||
}
|
||||
Product entity = BeanUtil.copyProperties(dto, Product.class);
|
||||
return super.updateById(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean deleteProduct(Long id) {
|
||||
Long shopId = StpKit.USER.getLoginIdAsLong();
|
||||
return super.remove(query().eq(Product::getId, id).eq(Product::getShopId, shopId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean disableProduct(Long id) {
|
||||
Long shopId = StpKit.USER.getLoginIdAsLong();
|
||||
return UpdateChain.of(Product.class)
|
||||
//.set(Product::getStatus, StatusEnum.DISABLE.value())
|
||||
.eq(Product::getId, id)
|
||||
.eq(Product::getShopId, shopId)
|
||||
.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean enableProduct(Long id) {
|
||||
Long shopId = StpKit.USER.getLoginIdAsLong();
|
||||
return UpdateChain.of(Product.class)
|
||||
//.set(Product::getStatus, StatusEnum.ENABLED.value())
|
||||
.eq(Product::getId, id)
|
||||
.eq(Product::getShopId, shopId)
|
||||
.update();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -9,7 +9,7 @@ import com.czg.product.dto.ShopProdSpecDTO;
|
||||
import com.czg.product.entity.ShopProdSpec;
|
||||
import com.czg.product.service.ShopProdSpecService;
|
||||
import com.czg.sa.StpKit;
|
||||
import com.czg.service.product.mapper.ShopProductSpecMapper;
|
||||
import com.czg.service.product.mapper.ShopProdSpecMapper;
|
||||
import com.czg.utils.PageUtil;
|
||||
import com.czg.utils.TreeUtils;
|
||||
import com.mybatisflex.core.paginate.Page;
|
||||
@@ -31,7 +31,7 @@ import static com.czg.product.entity.table.ShopProdSpecTableDef.SHOP_PROD_SPEC;
|
||||
* @since 1.0 2025-02-13
|
||||
*/
|
||||
@Service
|
||||
public class ShopProductSpecServiceImpl extends ServiceImpl<ShopProductSpecMapper, ShopProdSpec> implements ShopProdSpecService {
|
||||
public class ShopProductSpecServiceImpl extends ServiceImpl<ShopProdSpecMapper, ShopProdSpec> implements ShopProdSpecService {
|
||||
|
||||
|
||||
private QueryWrapper buildQueryWrapper(ShopProdSpecDTO param) {
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
<?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="com.czg.service.product.mapper.ProdSkuMapper">
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?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="com.czg.service.product.mapper.ShopProdSpecMapper">
|
||||
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user