This commit is contained in:
dzc committed 2025-06-16 10:10:00 +08:00
commit 261b9564e0
12 files changed
+370 -12

No files matched your search

@@ -0,0 +1,10 @@
package com.bsd.pjcloud.supermarket.dto;
import lombok.Data;
@Data
public class SmSpuPageDTO {
private String productName;
}
@@ -85,4 +85,9 @@ public class SmErpAuxiliaryCodeEntity extends Model<SmErpAuxiliaryCodeEntity> {
@Schema(description="包装单位id")
private Long unitId;
@Schema(description="包装单位")
@TableField(exist = false)
private String unit;
}
@@ -0,0 +1,118 @@
package com.bsd.pjcloud.supermarket.vo;
import com.baomidou.mybatisplus.annotation.*;
import com.bsd.pjcloud.supermarket.entity.SmErpAuxiliaryCodeEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpUnitEntity;
import com.bsd.pjcloud.supermarket.vo.sm.smspu.app.SmErpUnitAppVo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* app在线商城 商品列表数据
*/
@Data
public class OnlineShopVo {
@Schema(description="线上SPU 编号,自增")
private Long id;
/**
* 库存商品id
*/
@Schema(description="库存商品id")
private Long erpSpuId;
/**
* 商品详情
*/
@Schema(description="商品详情")
private String description;
/**
* 商品轮播图地址
数组,以逗号分隔
最多上传15张
*/
@Schema(description="商品轮播图地址")
private String sliderPicUrls;
/**
* 销量
*/
@Schema(description="销量")
private Integer salesCount;
/**
* 货号
*/
@Schema(description="货号")
private String productCode;
/**
* 自编码/条码
*/
@Schema(description="自编码/条码")
private String barcode;
/**
* 商品名称
*/
@Schema(description="商品名称")
private String productName;
/**
* 商品简介
*/
@Schema(description="商品简介")
private String introduction;
/**
* 商品封面图
*/
@Schema(description="商品封面图")
private String picUrl;
/**
* 库存
*/
@Schema(description="库存")
private Double stock;
/**
* 商品性质(字典)
*/
@Schema(description="商品性质(字典)")
private String productNature;
/**
* 货商id
*/
@Schema(description="货商id")
private Long supplierName;
@Schema(description = "包装对象集合对象")
private List<SmErpUnitAppVo> smErpUnitEntityList;
}
@@ -0,0 +1,74 @@
package com.bsd.pjcloud.supermarket.vo.sm.smspu.app;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@Schema(description = "移动端商品列表包装对象vo")
public class SmErpUnitAppVo {
/**
* 包装单位id
*/
@Schema(description="包装单位id")
private Long id;
/**
* 条码
*/
@Schema(description="条码")
private String barCode;
/**
* 规格
*/
@Schema(description="规格")
private String spec;
/**
* 单位
*/
@Schema(description="单位")
private String unit;
/**
* 状态(0正常,1停销)
*/
@Schema(description="状态(0正常,1停销)")
private Integer status;
/**
* 内装数量
*/
@Schema(description="内装数量")
private Integer packageNum;
/**
* 零售价/单位分
*/
@Schema(description="零售价/单位分")
private Integer retailPrice;
/**
* spuID
*/
@Schema(description="spuID")
private Long spuId;
/**
* 促销价
*/
@Schema(description="促销价")
private Integer promotionPrice;
@Schema(description = "是否是基础库存,默认0否,1是")
private Boolean isBase;
}
@@ -84,6 +84,7 @@ public class SmErpSpuController {
wrapper.eq(StringUtils.isNotBlank(supermarketSpu.getProductCode()), SmErpSpuEntity::getProductCode,supermarketSpu.getProductCode());
wrapper.eq(StringUtils.isNotBlank(supermarketSpu.getBarcode()), SmErpSpuEntity::getBarcode,supermarketSpu.getBarcode());
wrapper.like(StringUtils.isNotBlank(supermarketSpu.getProductName()), SmErpSpuEntity::getProductName,supermarketSpu.getProductName());
wrapper.orderByDesc(SmErpSpuEntity::getCreateTime);
return R.ok(smErpSpuService.pageScope(page, wrapper));
}
@@ -229,7 +230,7 @@ public class SmErpSpuController {
*/
@PostMapping("/import")
@PreAuthorize("@pms.hasPermission('supermarket_supermarketSpu_import')" )
@Idempotent(key = "#key", expireTime = 10, info = "请勿重复导入,10秒后再重新尝试")
@Idempotent(expireTime = 10, info = "请勿重复导入,10秒后再重新尝试")
public R importErpSpu(@RequestExcel List<SmErpSpuImportDto> dtos, BindingResult bindingResult) {
List<SmErpSpuImportDto> collect = dtos.stream().filter(smErpSpuImportDto -> smErpSpuImportDto.getProductCode() != null).collect(Collectors.toList());
if (CollectionUtils.isEmpty(collect)) {
@@ -4,6 +4,7 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum;
@@ -11,11 +12,16 @@ import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
import com.bsd.pjcloud.supermarket.dto.SmSpuPageDTO;
import com.bsd.pjcloud.supermarket.entity.SmErpCategoryEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpSpuEntity;
import com.bsd.pjcloud.supermarket.entity.SmSpuEntity;
import com.bsd.pjcloud.supermarket.mapper.SmErpSpuMapper;
import com.bsd.pjcloud.supermarket.service.SmErpCategoryService;
import com.bsd.pjcloud.supermarket.service.SmErpSpuService;
import com.bsd.pjcloud.supermarket.service.SmSpuService;
import com.bsd.pjcloud.supermarket.vo.OnlineShopVo;
import com.bsd.pjcloud.supermarket.vo.erp.SmErpCategorySimpleVo;
import com.bsd.pjcloud.supermarket.vo.sm.smspu.SmSpuEditVo;
import com.bsd.pjcloud.wallet.api.feign.RemoteMchService;
import com.bsd.pjcloud.wallet.api.vo.MchManageVo;
@@ -31,6 +37,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 线上超市
@@ -50,6 +57,10 @@ public class SmSpuController {
private final SmErpSpuService smErpSpuService;
private final RemoteMchService remoteMchService;
private final SmErpCategoryService smErpCategoryService;
/**
* 分页查询
* @param page 分页对象
@@ -59,7 +70,7 @@ public class SmSpuController {
@Operation(summary = "分页查询" , description = "分页查询" )
@GetMapping("/page" )
@PreAuthorize("@pms.hasPermission('supermarket_smSpu_view')" )
public R getSmSpuPage(@ParameterObject Page page, @ParameterObject SmSpuEntity smSpu) {
public R getSmSpuPage(@ParameterObject Page page, @ParameterObject SmSpuPageDTO smSpu) {
return R.ok(smSpuService.pageScope(page, smSpu));
}
@@ -145,5 +156,56 @@ public class SmSpuController {
/**
* 获取商户下所有的在线商品,并且获取分类
* @return
*/
@Operation(summary = "APP在线商城数据查询",description = "通过商户id获取该商户下的在线商品数据")
@GetMapping("/app/onlineShopList")
public R<IPage<OnlineShopVo>> getOnlineShopList(@RequestParam("categoryId")Long categoryId,@ParameterObject Page page) {
IPage<OnlineShopVo> onlineShopList = smSpuService.getOnlineShopList(categoryId, page);
return R.ok(onlineShopList);
}
/**
* 获取商户下所有获取分类
* @return
*/
@Operation(summary = "APP在线商城分类数据查询",description = "获取商户下所有获取分类通过商户id")
@GetMapping("/app/onlineCategoryList")
public R<List<SmErpCategorySimpleVo>> getOnlineCategoryList(@RequestParam("merchantId")Long merchantId) {
// R<MchManageVo> byId = remoteMchService.getById(merchantId);
// MchManageVo data = byId.getData();
// if (Objects.isNull(data)){
// return R.failed("商户不存在");
// }
// Long deptId = data.getDeptId();
//
// List<SmErpCategoryEntity> categoryEntities = smErpCategoryService.list(Wrappers.<SmErpCategoryEntity>lambdaQuery().eq(SmErpCategoryEntity::getDeptId, deptId));
// List<SmErpCategorySimpleVo> bean = BeanUtils.toBean(categoryEntities, SmErpCategorySimpleVo.class);
LambdaQueryWrapper<SmSpuEntity> eq = new LambdaQueryWrapper<SmSpuEntity>()
.eq(SmSpuEntity::getMerchantId, merchantId)
//上架数据 0
.eq(SmSpuEntity::getStatus, "0");
List<SmSpuEntity> list = smSpuService.list(eq);
List<Long> erpSpuIds = list.stream().map(smSpuEntity -> smSpuEntity.getErpSpuId()).collect(Collectors.toList());
LambdaQueryWrapper<SmErpSpuEntity> smErpSpuEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
smErpSpuEntityLambdaQueryWrapper.in(SmErpSpuEntity::getId, erpSpuIds);
List<SmErpSpuEntity> erpSpuEntities = smErpSpuService.list(smErpSpuEntityLambdaQueryWrapper);
List<Long> categoryIds= erpSpuEntities.stream().map(smErpSpuEntity -> smErpSpuEntity.getCategoryId()).collect(Collectors.toList());
LambdaQueryWrapper<SmErpCategoryEntity> smErpCategoryEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
smErpCategoryEntityLambdaQueryWrapper.in(SmErpCategoryEntity::getId, categoryIds);
List<SmErpCategoryEntity> categoryEntities = smErpCategoryService.list(smErpCategoryEntityLambdaQueryWrapper);
List<SmErpCategorySimpleVo> bean = BeanUtils.toBean(categoryEntities, SmErpCategorySimpleVo.class);
return R.ok(bean);
}
}
@@ -5,13 +5,17 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper;
import com.bsd.pjcloud.supermarket.dto.SmSpuPageDTO;
import com.bsd.pjcloud.supermarket.dto.SupermarketSpuAppQueryDTO;
import com.bsd.pjcloud.supermarket.entity.SmSpuEntity;
import com.bsd.pjcloud.supermarket.vo.OnlineShopVo;
import com.bsd.pjcloud.supermarket.vo.app.SupermarketAppSpuVo;
import com.bsd.pjcloud.supermarket.vo.sm.smspu.SmErpPageScopeVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface SmSpuMapper extends PjcloudBaseMapper<SmSpuEntity> {
@@ -23,7 +27,7 @@ public interface SmSpuMapper extends PjcloudBaseMapper<SmSpuEntity> {
* @param of
* @return
*/
IPage<SmErpPageScopeVo> selectSmErpPageScopeVo(Page page, @Param("smspu") SmSpuEntity smSpu, DataScope of);
IPage<SmErpPageScopeVo> selectSmErpPageScopeVo(Page page, @Param("smspu") SmSpuPageDTO smSpu, DataScope of);
/**
@@ -33,4 +37,13 @@ public interface SmSpuMapper extends PjcloudBaseMapper<SmSpuEntity> {
* @return
*/
IPage<SupermarketAppSpuVo> getAppPage(Page page, @Param("supermarketSpuQueryDTO")SupermarketSpuAppQueryDTO supermarketSpuQueryDTO);
/**
* 移动端分页获取线上商品数据
* @param categoryId
* @param page
* @return
*/
IPage<OnlineShopVo> getOnlineShopList(@Param("categoryId") Long categoryId, Page page);
}
@@ -102,4 +102,9 @@ public interface SmErpSpuService extends IService<SmErpSpuEntity> {
*/
R importErpSpu(List<SmErpSpuImportDto> smErpSupplierImportDtos, BindingResult bindingResult);
// R calculateCostPrice();
}
@@ -1,10 +1,13 @@
package com.bsd.pjcloud.supermarket.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bsd.pjcloud.supermarket.dto.SmSpuPageDTO;
import com.bsd.pjcloud.supermarket.dto.SupermarketSpuAppQueryDTO;
import com.bsd.pjcloud.supermarket.entity.SmSpuEntity;
import com.bsd.pjcloud.supermarket.vo.OnlineShopVo;
import com.bsd.pjcloud.supermarket.vo.app.SupermarketAppSpuVo;
import java.util.List;
@@ -13,9 +16,16 @@ public interface SmSpuService extends IService<SmSpuEntity> {
Object pageScope(Page page, SmSpuEntity smSpu);
Object pageScope(Page page, SmSpuPageDTO smSpu);
Object getAppPage(Page page, SupermarketSpuAppQueryDTO supermarketSpuQueryDTO);
/**
* 查询该分类下的所有在线商品数据
* @param categoryId
* @return
*/
IPage<OnlineShopVo> getOnlineShopList(Long categoryId, Page page);
}
@@ -108,6 +108,7 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
baseMapper.insert(supermarketSpu);
//库存表
SmErpStockEntity smErpStockEntity = new SmErpStockEntity();
smErpStockEntity.setErpSpuId(supermarketSpu.getId());
@@ -123,16 +124,26 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
if (isBaseNum.size()!=1){
return R.failed("必须且只能指定一个基础包装单位!");
}
List<SmErpUnitEntity> unitCollect = smErpUnitEntityList.stream().filter(smErpUnitEntity -> smErpUnitEntity.getPackageNum() <= 0).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(unitCollect)){
return R.failed("包装类型内装数量不能小于等于0!");
}
if (CollectionUtils.isNotEmpty(smErpUnitEntityList)) {
smErpUnitEntityList.forEach(supermarketUnitEntity -> supermarketUnitEntity.setSpuId(supermarketSpu.getId()));
smErpUnitService.saveBatch(smErpUnitEntityList);
} else {
return R.failed("包装类型不能为空");
}
Map<String, SmErpUnitEntity> unitMap = smErpUnitEntityList.stream().collect(Collectors.toMap(smErpUnitEntity -> smErpUnitEntity.getUnit(), smErpUnitEntity -> smErpUnitEntity));
//辅助条码
List<SmErpAuxiliaryCodeEntity> smErpAuxiliaryCodeEntityList = supermarketSpu.getSmErpAuxiliaryCodeEntityList();
if (CollectionUtils.isNotEmpty(smErpAuxiliaryCodeEntityList)) {
smErpAuxiliaryCodeEntityList.forEach(supermarketAuxiliaryCodeEntity -> supermarketAuxiliaryCodeEntity.setSpuId(supermarketSpu.getId()));
for (int i = 0; i < smErpAuxiliaryCodeEntityList.size(); i++) {
SmErpAuxiliaryCodeEntity smErpAuxiliaryCodeEntity = smErpAuxiliaryCodeEntityList.get(i);
smErpAuxiliaryCodeEntity.setSpuId(supermarketSpu.getId());
smErpAuxiliaryCodeEntity.setUnitId(unitMap.get(smErpAuxiliaryCodeEntity.getUnit()).getId());
}
smErpAuxiliaryCodeService.saveBatch(smErpAuxiliaryCodeEntityList);
}
@@ -165,7 +176,8 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
//新增包装类型
List<SmErpUnitEntity> smErpUnitEntityList = supermarketSpu.getSmErpUnitEntityList();
List<SmErpUnitEntity> insertUnits= new ArrayList<>();
List<SmErpUnitEntity> updateUnits= new ArrayList<>();
if (CollectionUtils.isNotEmpty(smErpUnitEntityList)) {
List<SmErpUnitEntity> baseUnits = smErpUnitEntityList.stream()
@@ -178,10 +190,10 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
}
//id为null新增
List<SmErpUnitEntity> insertUnits = smErpUnitEntityList.stream()
insertUnits = smErpUnitEntityList.stream()
.filter(supermarketUnitEntity -> supermarketUnitEntity.getId() == null).collect(Collectors.toList());
insertUnits.forEach(supermarketUnitEntity -> supermarketUnitEntity.setSpuId(supermarketSpu.getId()));
List<SmErpUnitEntity> updateUnits = smErpUnitEntityList.stream()
updateUnits = smErpUnitEntityList.stream()
.filter(supermarketUnitEntity -> supermarketUnitEntity.getId() != null).collect(Collectors.toList());
smErpUnitService.updateBatchById(updateUnits);
smErpUnitService.saveBatch(insertUnits);
@@ -234,7 +246,19 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
if (CollectionUtils.isNotEmpty(smErpAuxiliaryCodeEntityList)) {
List<SmErpAuxiliaryCodeEntity> insertCollect = smErpAuxiliaryCodeEntityList.stream().filter(supermarketAuxiliaryCodeEntity -> supermarketAuxiliaryCodeEntity.getId() == null).collect(Collectors.toList());
List<SmErpAuxiliaryCodeEntity> updateCollect = smErpAuxiliaryCodeEntityList.stream().filter(supermarketAuxiliaryCodeEntity -> supermarketAuxiliaryCodeEntity.getId() != null).collect(Collectors.toList());
insertCollect.stream().forEach(supermarketAuxiliaryCodeEntity -> supermarketAuxiliaryCodeEntity.setSpuId(supermarketSpu.getId()));
Map<String, SmErpUnitEntity> unitMap;
if (CollectionUtils.isNotEmpty(insertUnits)){
unitMap = insertUnits.stream().collect(Collectors.toMap(smErpUnitEntity -> smErpUnitEntity.getUnit(), smErpUnitEntity -> smErpUnitEntity));
}else {
unitMap = updateUnits.stream().collect(Collectors.toMap(smErpUnitEntity -> smErpUnitEntity.getUnit(), smErpUnitEntity -> smErpUnitEntity));
}
for (int i = 0; i < insertCollect.size(); i++) {
SmErpAuxiliaryCodeEntity smErpAuxiliaryCodeEntity = insertCollect.get(i);
smErpAuxiliaryCodeEntity.setSpuId(supermarketSpu.getId());
smErpAuxiliaryCodeEntity.setUnitId(unitMap.get(smErpAuxiliaryCodeEntity.getUnit()).getId());
}
smErpAuxiliaryCodeService.saveBatch(insertCollect);
smErpAuxiliaryCodeService.updateBatchById(updateCollect);
@@ -558,7 +582,7 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
String productCode = dto.getProductCode();
try {
//================================ 新增代码开始 ================================//
//================================ 新增代码开始 ======= =========================//
// 检查本批次内部重复
List<Integer> duplicateRows = importProductCodeMap.get(productCode);
if (duplicateRows.size() > 1) {
@@ -610,6 +634,10 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
spu.setCategoryId(categoryId);
spu.setSupplierId(supplierId);
spu.setDeptId(deptId);
spu.setCostPrice(BigDecimal.valueOf(dto.getCostPrice())
.multiply(BigDecimal.valueOf(100))
.setScale(0, RoundingMode.HALF_UP)
.doubleValue());
SmErpSpuEntity existingSpu = existingSpuMap.get(productCode);
// 合并两种错误检查
@@ -7,12 +7,14 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
import com.bsd.pjcloud.supermarket.dto.SmSpuPageDTO;
import com.bsd.pjcloud.supermarket.dto.SupermarketSpuAppQueryDTO;
import com.bsd.pjcloud.supermarket.entity.SmSpuEntity;
import com.bsd.pjcloud.supermarket.mapper.SmErpSpuMapper;
import com.bsd.pjcloud.supermarket.mapper.SmErpUnitMapper;
import com.bsd.pjcloud.supermarket.mapper.SmSpuMapper;
import com.bsd.pjcloud.supermarket.service.SmSpuService;
import com.bsd.pjcloud.supermarket.vo.OnlineShopVo;
import com.bsd.pjcloud.supermarket.vo.app.SupermarketAppSpuVo;
import com.bsd.pjcloud.supermarket.vo.sm.smspu.SmErpPageScopeVo;
import com.bsd.pjcloud.wallet.api.feign.RemoteMchService;
@@ -38,7 +40,7 @@ public class SmSpuServiceImpl extends ServiceImpl<SmSpuMapper, SmSpuEntity> impl
private final SmErpUnitMapper smErpUnitMapper;
@Override
public Object pageScope(Page page, SmSpuEntity smSpu) {
public Object pageScope(Page page, SmSpuPageDTO smSpu) {
IPage<SmErpPageScopeVo> pageData = baseMapper.selectSmErpPageScopeVo(page,smSpu, DataScope.of());
return pageData;
}
@@ -48,4 +50,12 @@ public class SmSpuServiceImpl extends ServiceImpl<SmSpuMapper, SmSpuEntity> impl
IPage<SupermarketAppSpuVo> appPage=baseMapper.getAppPage(page,supermarketSpuQueryDTO);
return appPage;
}
@Override
public IPage<OnlineShopVo> getOnlineShopList(Long categoryId, Page page) {
IPage<OnlineShopVo> list = baseMapper.getOnlineShopList(categoryId,page);
return list;
}
}
@@ -30,7 +30,13 @@
on sp.erp_spu_id = esp.id
left join sm_erp_category eca
on esp.category_id = eca.id
where sp.del_flag = 0
<where>
esp.del_flag = 0 and sp.del_flag = 0
<if test="smspu.productName != null">
and esp.product_name like concat('%', #{smspu.productName}, '%')
</if>
</where>
</select>
<select id="getAppPage" resultType="com.bsd.pjcloud.supermarket.vo.app.SupermarketAppSpuVo">
@@ -53,4 +59,20 @@
</if>
</where>
</select>
<select id="getOnlineShopList" resultType="com.bsd.pjcloud.supermarket.vo.OnlineShopVo">
SELECT esp.id as erp_spu_id,esp.product_code,esp.barcode,esp.product_name,esp.category_id,
esp.pic_url,esp.sort,esp.status,esp.merchant_id,esp.dept_id,esp.bar_code,
sp.create_time,sp.id,sp.slider_pic_urls,sp.description,
eca.name as category_name,
stock.current_stock as stock
FROM `sm_spu` sp
LEFT JOIN sm_erp_spu esp
on sp.erp_spu_id = esp.id
LEFT JOIN sm_erp_category eca
on esp.category_id = eca.id
left join sm_erp_stock stock
on esp.id = stock.erp_spu_id
WHERE esp.del_flag = 0 and sp.del_flag = 0 and
esp.status = 0 and esp.category_id=${categoryId}
</select>
</mapper>