商品模块代码提交

This commit is contained in:
Tankaikai
2025-02-16 18:30:56 +08:00
parent 84914553d0
commit a6175be737
18 changed files with 779 additions and 77 deletions

View File

@@ -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> {
}

View File

@@ -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> {

View File

@@ -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> {
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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) {

View File

@@ -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>

View File

@@ -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>