|
|
@@ -1,29 +1,47 @@
|
|
|
package com.poyee.service.impl;
|
|
|
|
|
|
-import com.poyee.annotation.ds.Transactional;
|
|
|
+import com.poyee.annotation.ds.CustomTransactional;
|
|
|
+import com.poyee.base.dto.Page;
|
|
|
import com.poyee.base.dto.Result;
|
|
|
import com.poyee.base.service.impl.BaseServiceImpl;
|
|
|
import com.poyee.build.ProductBeanBuildFactory;
|
|
|
+import com.poyee.common.exception.AuthException;
|
|
|
+import com.poyee.common.exception.ServiceException;
|
|
|
import com.poyee.dto.EcologyMerCustomizeDto;
|
|
|
import com.poyee.dto.EcologySkuDto;
|
|
|
import com.poyee.dto.EcologySpuDto;
|
|
|
-import com.poyee.insert.SkuInsertDao;
|
|
|
-import com.poyee.insert.SpuInsertDao;
|
|
|
+import com.poyee.dto.detail.EcologySkuDetailDto;
|
|
|
+import com.poyee.dto.detail.EcologySpuDetailDto;
|
|
|
+import com.poyee.dto.page.EcologySkuPageDto;
|
|
|
+import com.poyee.dto.page.EcologySpuPageDto;
|
|
|
+import com.poyee.dto.where.EcologySkuWhereReq;
|
|
|
+import com.poyee.entity.SkuInsertDao;
|
|
|
+import com.poyee.entity.SpuInsertDao;
|
|
|
+import com.poyee.enums.EcologySpuStatusEnum;
|
|
|
+import com.poyee.feign.CheckListFeignService;
|
|
|
import com.poyee.mapper.EcologyMerCustomizeMapper;
|
|
|
import com.poyee.mapper.EcologySkuMapper;
|
|
|
import com.poyee.req.EcologyMerCustomizeReq;
|
|
|
import com.poyee.req.EcologySkuReq;
|
|
|
import com.poyee.req.EcologySpuReq;
|
|
|
import com.poyee.mapper.EcologySpuMapper;
|
|
|
+import com.poyee.req.insert.EcologySkuInsertReq;
|
|
|
+import com.poyee.req.page.EcologySkuPageReq;
|
|
|
+import com.poyee.req.page.EcologySpuPageReq;
|
|
|
+import com.poyee.req.update.*;
|
|
|
+import com.poyee.req.insert.EcologySpuInsertReq;
|
|
|
import com.poyee.req.sync.EcologySpuSyncReq;
|
|
|
import com.poyee.service.IEcologySpuService;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.atomic.AtomicInteger;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
@@ -43,6 +61,8 @@ public class EcologySpuServiceImpl extends BaseServiceImpl<EcologySpuMapper, Eco
|
|
|
private EcologySkuMapper skuMapper;
|
|
|
@Resource
|
|
|
private EcologyMerCustomizeMapper merCustomizeMapper;
|
|
|
+ @Autowired
|
|
|
+ private CheckListFeignService checkListFeignService;
|
|
|
|
|
|
//业务类型:求购(buy)、热卖(hot) [自动生成暂定类型]
|
|
|
private List<String> bussinessTypes = Arrays.asList("buy", "hot");
|
|
|
@@ -53,7 +73,7 @@ public class EcologySpuServiceImpl extends BaseServiceImpl<EcologySpuMapper, Eco
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- @Transactional(rollbackFor = Exception.class)
|
|
|
+ @CustomTransactional(rollbackFor = Exception.class)
|
|
|
public Result sync(EcologySpuSyncReq req) {
|
|
|
// build spu 信息
|
|
|
SpuInsertDao spuInsertDao = ProductBeanBuildFactory.builderInsertParam(req);
|
|
|
@@ -144,6 +164,190 @@ public class EcologySpuServiceImpl extends BaseServiceImpl<EcologySpuMapper, Eco
|
|
|
return Result.fail("商品新增失败");
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param req
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @CustomTransactional(rollbackFor = Exception.class)
|
|
|
+ public Result save(EcologySpuInsertReq req) {
|
|
|
+ log.debug("开始执行SPU保存操作,事务已启动");
|
|
|
+ checkAndPutMerchantId(req);
|
|
|
+ if(Objects.isNull(req.getMerchantId())){
|
|
|
+ //如果merchantId为空 设置默认 merchantId = 0 merchantName = '平台运营'
|
|
|
+ req.setMerchantId(0L);
|
|
|
+ req.setMerchantName("平台运营");
|
|
|
+ }
|
|
|
+ if(StringUtils.isBlank(req.getName())){
|
|
|
+ //调用接口查询基础库信息
|
|
|
+ Map<String, Object> params = new HashMap<>();
|
|
|
+ params.put("ids", Collections.singletonList(req.getBaseInfoId()));
|
|
|
+ Object paniniBaseInfoRet = checkListFeignService.getPaniniListInfoById(params);
|
|
|
+ ProductBeanBuildFactory.builderSpuInsertPaniniBaseInfo(req ,paniniBaseInfoRet);
|
|
|
+ }
|
|
|
+ SpuInsertDao spuInsertDao = ProductBeanBuildFactory.builderInsertParam(req);
|
|
|
+ Long hasSpu = checkSpu(spuInsertDao);
|
|
|
+ if(Objects.nonNull(hasSpu) && hasSpu > 0){
|
|
|
+ return Result.fail("商品已存在【同商家下的同产品】");
|
|
|
+ }
|
|
|
+ //保存数据
|
|
|
+ log.debug("开始保存SPU数据");
|
|
|
+ int save = baseMapper.save(spuInsertDao);
|
|
|
+ if(save > 0) {
|
|
|
+ Long spuId = spuInsertDao.getId();
|
|
|
+ try {
|
|
|
+ log.debug("SPU数据保存成功,SPU ID: {}", spuId);
|
|
|
+ //判断是否有 skus
|
|
|
+ List<EcologySkuInsertReq> skus = req.getSkus();
|
|
|
+ if (CollectionUtils.isNotEmpty(skus)) {
|
|
|
+ AtomicInteger skuSuccessCount = new AtomicInteger();
|
|
|
+ skus.forEach(item -> {
|
|
|
+ //设置 spuid
|
|
|
+ item.setSpuId(spuId);
|
|
|
+ item.setName(req.getName());
|
|
|
+ //设置商家id, sku code,
|
|
|
+ item.setMerchantId(req.getMerchantId());
|
|
|
+ EcologySkuInsertReq skuInsertReq = ProductBeanBuildFactory.builderSkuInsertParam(item, spuId, item.getBusinessType());
|
|
|
+ log.debug("开始保存SKU数据");
|
|
|
+ int skuSaveResult = skuMapper.save(skuInsertReq);
|
|
|
+ log.debug("SKU数据保存结果: {}", skuSaveResult);
|
|
|
+ skuSuccessCount.set(skuSuccessCount.get() + skuSaveResult);
|
|
|
+ });
|
|
|
+ log.debug("SPU保存完成,共保存 {} 个SKU", skuSuccessCount.get());
|
|
|
+ return Result.success(0,"商品新增成功【" + save + "】,sku新增成功【" + skuSuccessCount.get() + "】");
|
|
|
+ } else {
|
|
|
+ log.debug("SPU保存完成,无SKU数据");
|
|
|
+ return Result.success(0,"商品新增成功【" + save + "】");
|
|
|
+ }
|
|
|
+ }catch (Exception e) {
|
|
|
+ //如果新增失败 手动 回滚数据[手动删除已创建好的spu]
|
|
|
+ EcologySkuWhereReq skuWhereReq = new EcologySkuWhereReq();
|
|
|
+ skuWhereReq.setSpuId(spuId);
|
|
|
+ int skuDel = skuMapper.deleteByReq(skuWhereReq);
|
|
|
+ log.debug("已删除SKU数据【{}】", skuDel);
|
|
|
+ //删除spu
|
|
|
+ int del = baseMapper.deleteById(spuId);
|
|
|
+ log.debug("已删除SPU数据【{}】", del);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.warn("SPU数据保存失败");
|
|
|
+ return Result.fail("商品新增失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @CustomTransactional(rollbackFor = Exception.class)
|
|
|
+ public Result updateById(EcologySpuUpdateReq req) {
|
|
|
+ checkAndPutMerchantId(req);
|
|
|
+ checkSpuInfo("update" ,req.getId());
|
|
|
+ //只更新限定数据和更新时间更新人
|
|
|
+ //同时状态设置为: WAIT_AUDIT
|
|
|
+ req.setStatus(EcologySpuStatusEnum.WAIT_AUDIT.getCode());
|
|
|
+ int update = baseMapper.update(req);
|
|
|
+ return update > 0 ? Result.success(0,"商品修改成功") : Result.fail("商品修改失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @CustomTransactional(rollbackFor = Exception.class)
|
|
|
+ public Result<EcologySpuDetailDto> detail(Long id) {
|
|
|
+ //获取
|
|
|
+ EcologySpuDetailDto detail = (EcologySpuDetailDto) Optional.of(baseMapper.selectByPrimaryKey(id, EcologySpuDetailDto.class))
|
|
|
+ .orElseThrow(()->new ServiceException("商品不存在"));
|
|
|
+ //判断商家
|
|
|
+ if(getUserInfo().isMerchant() && !Objects.equals(detail.getMerchantId(), Long.valueOf(getUserInfo().getMerchantId()))){
|
|
|
+ log.warn("无权限访问[越权]");
|
|
|
+ throw new AuthException("无权限访问[越权]");
|
|
|
+ }
|
|
|
+ //查询sku 信息
|
|
|
+ EcologySkuWhereReq req = new EcologySkuWhereReq();
|
|
|
+ req.setSpuId(id);
|
|
|
+ List<EcologySkuDetailDto> skus = skuMapper.selectList(req, EcologySkuDetailDto.class);
|
|
|
+ if(CollectionUtils.isNotEmpty(skus)) {
|
|
|
+ skus.forEach(item -> item.setTags(ProductBeanBuildFactory.parseSkuTags(item.getTags())));
|
|
|
+ detail.setSkus(skus);
|
|
|
+ }
|
|
|
+ return Result.success(0,detail);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @CustomTransactional(rollbackFor = Exception.class)
|
|
|
+ public Page<EcologySpuPageDto> listPage(EcologySpuPageReq req) {
|
|
|
+ checkAndPutMerchantId(req);
|
|
|
+ Page<EcologySpuPageDto> page = baseMapper.selectPage(req, EcologySpuPageDto.class);
|
|
|
+ if(page != null && page.getRows() != null && !page.getRows().isEmpty()) {
|
|
|
+ //获取spuId
|
|
|
+ List<Long> spuIds = page.getRows()
|
|
|
+ .stream()
|
|
|
+ .map(EcologySpuPageDto::getId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .distinct()
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ EcologySkuPageReq skuPageReq = new EcologySkuPageReq();
|
|
|
+ skuPageReq.setInSpuIds(spuIds);
|
|
|
+ List<EcologySkuPageDto> skus = skuMapper.selectList(skuPageReq, EcologySkuPageDto.class);
|
|
|
+ //根据 spuId 进行 分组
|
|
|
+ if(CollectionUtils.isNotEmpty(skus)) {
|
|
|
+ //对 sku 标签进行处理 "[\"recommend\", \"hot\"]" -> "recommend,hot"
|
|
|
+ skus.forEach(item -> item.setTags(ProductBeanBuildFactory.parseSkuTags(item.getTags())));
|
|
|
+ Map<Long, List<EcologySkuPageDto>> skuMap = skus.stream().collect(Collectors.groupingBy(EcologySkuPageDto::getSpuId));
|
|
|
+ page.getRows().forEach(item -> item.setSkus(skuMap.get(item.getId())));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ page.setCode(0);
|
|
|
+ return page;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @CustomTransactional(rollbackFor = Exception.class)
|
|
|
+ public Result deleteById(Long id) {
|
|
|
+ checkSpuInfo("delete" ,id);
|
|
|
+ //先删除 sku 信息
|
|
|
+ EcologySkuDelReq skuReq = new EcologySkuDelReq(id, 1);
|
|
|
+ //逻辑删除
|
|
|
+ int del = skuMapper.update(skuReq);
|
|
|
+ if(del > 0){
|
|
|
+ //删除 spu
|
|
|
+ EcologySpuDelReq req = new EcologySpuDelReq(id, 1);
|
|
|
+ int delSpu = baseMapper.update(req);
|
|
|
+ if(delSpu > 0){
|
|
|
+ return Result.success(0,"商品删除成功【" + delSpu + "】");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Result.fail("商品删除失败【" + del + "】");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Result up(EcologySpuUpReq req) {
|
|
|
+ checkAndPutMerchantId(req);
|
|
|
+ checkSpuInfo("up" ,req.getId());
|
|
|
+ //如果是下架 设置下架原因
|
|
|
+ if(!req.isUp() && StringUtils.isBlank(req.getReason())){
|
|
|
+ throw new ServiceException("请填写下架原因");
|
|
|
+ }
|
|
|
+ req.setStatus(req.isUp()?EcologySpuStatusEnum.ON_SHELF.getCode():EcologySpuStatusEnum.OFF_SHELF.getCode());
|
|
|
+ int update = baseMapper.update(req);
|
|
|
+ if(update > 0){
|
|
|
+ return Result.success(0,"商品" + (req.isUp()?"上架成功":"下架成功"));
|
|
|
+ }
|
|
|
+ return Result.fail("商品" + (req.isUp()?"上架失败":"下架失败"));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Result review(EcologySpuReviewReq req) {
|
|
|
+ checkAndPutMerchantId(req);
|
|
|
+ checkSpuInfo("review" ,req.getId());
|
|
|
+ //如果是审核驳回 设置审核驳回原因
|
|
|
+ if(!req.isPass() && StringUtils.isBlank(req.getReason())){
|
|
|
+ throw new ServiceException("请填写审核驳回原因");
|
|
|
+ }
|
|
|
+ req.setStatus(req.isPass()?EcologySpuStatusEnum.AUDIT_PASS.getCode():EcologySpuStatusEnum.AUDIT_REJECT.getCode());
|
|
|
+ int update = baseMapper.update(req);
|
|
|
+ if(update > 0){
|
|
|
+ return Result.success(0,"商品" + (req.isPass()?"审核通过成功":"审核驳回成功"));
|
|
|
+ }
|
|
|
+ return Result.fail("商品" + (req.isPass()?"审核通过失败":"审核驳回失败"));
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 检查商品
|
|
|
* @param spuInsertDao
|
|
|
@@ -157,6 +361,8 @@ public class EcologySpuServiceImpl extends BaseServiceImpl<EcologySpuMapper, Eco
|
|
|
queryReq.setName(null);
|
|
|
queryReq.setCarouselImgUrl(null);
|
|
|
queryReq.setDetailImgUrl(null);
|
|
|
+ queryReq.setStatus(null);
|
|
|
+ queryReq.setShowApplet(null);
|
|
|
queryReq.setSource(spuInsertDao.getSource());
|
|
|
List<EcologySpuDto> list = baseMapper.selectList(queryReq, EcologySpuDto.class);
|
|
|
if(CollectionUtils.isNotEmpty(list)){
|
|
|
@@ -166,5 +372,64 @@ public class EcologySpuServiceImpl extends BaseServiceImpl<EcologySpuMapper, Eco
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 编辑删除商品时前置验证条件
|
|
|
+ * @param spuId
|
|
|
+ */
|
|
|
+ private void checkSpuInfo(String methodType ,Long spuId) {
|
|
|
+ //判断当前spu 信息
|
|
|
+ EcologySpuDto spuDto = Optional.ofNullable(baseMapper.selectById(spuId))
|
|
|
+ .orElseThrow(() -> new ServiceException("商品不存在"));
|
|
|
+ if(getUserInfo().isMerchant() && !Objects.equals(spuDto.getMerchantId(), Long.valueOf(getUserInfo().getMerchantId()))){
|
|
|
+ log.warn("无权操作[商家越权]");
|
|
|
+ throw new AuthException("无权操作[越权]");
|
|
|
+ }
|
|
|
+ //如果状态为上架状态 则返回异常
|
|
|
+ if( !Objects.equals(methodType,"up")
|
|
|
+ && Objects.equals(EcologySpuStatusEnum.ON_SHELF.getCode(), spuDto.getStatus())){
|
|
|
+ throw new ServiceException("商品已上架,请勿此操作");
|
|
|
+ }
|
|
|
+ switch (methodType) {
|
|
|
+ case "update":
|
|
|
+ //如果状态为审核中状态 则返回异常
|
|
|
+ if(Objects.equals(EcologySpuStatusEnum.WAIT_AUDIT.getCode(), spuDto.getStatus())){
|
|
|
+ throw new ServiceException("商品正在审核中,请勿修改");
|
|
|
+ }
|
|
|
+ // 如果状态为审核通过状态 则返回异常
|
|
|
+ if(Objects.equals(EcologySpuStatusEnum.AUDIT_PASS.getCode(), spuDto.getStatus())){
|
|
|
+ throw new ServiceException("商品审核通过,请勿修改");
|
|
|
+ }
|
|
|
+ case "delete":
|
|
|
+ //验证 sku
|
|
|
+ EcologySkuWhereReq skuWhereReq = new EcologySkuWhereReq();
|
|
|
+ skuWhereReq.setSpuId(spuId);
|
|
|
+ List<EcologySkuDto> skus = skuMapper.selectList(skuWhereReq, EcologySkuDto.class);
|
|
|
+ if(CollectionUtils.isNotEmpty(skus)){
|
|
|
+ //判断 sku 状态
|
|
|
+ long count = skus.stream()
|
|
|
+ .filter(item -> Objects.equals(EcologySpuStatusEnum.ON_SHELF.getCode(), item.getStatus()))
|
|
|
+ .count();
|
|
|
+ if(count > 0){
|
|
|
+ throw new ServiceException("商品存在上架的SKU,请勿此操作");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "up":
|
|
|
+ //如果不在审核通过,上架,下架状态中 则返回异常
|
|
|
+ if(!EcologySpuStatusEnum.canUpOperate(spuDto.getStatus())){
|
|
|
+ throw new ServiceException("商品状态为["+EcologySpuStatusEnum.getDescByCode(spuDto.getStatus())+"],请勿此操作");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "review":
|
|
|
+ //如果状态为审核中状态 则返回异常
|
|
|
+ if(!Objects.equals(EcologySpuStatusEnum.WAIT_AUDIT.getCode(), spuDto.getStatus())){
|
|
|
+ throw new ServiceException("商品不在审核中状态,请勿此操作");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
|
|
|
}
|