package com.iotechn.unimall.admin.api.product; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.dobbinsoft.fw.core.exception.AdminServiceException; import com.dobbinsoft.fw.core.exception.ServiceException; import com.dobbinsoft.fw.support.component.CacheComponent; import com.dobbinsoft.fw.support.model.Page; import com.iotechn.unimall.data.domain.GroupShopDO; import com.iotechn.unimall.data.domain.SkuActivityPriceDO; import com.iotechn.unimall.data.domain.SkuDO; import com.iotechn.unimall.data.domain.SpuDO; import com.iotechn.unimall.data.dto.product.GroupShopDTO; import com.iotechn.unimall.data.dto.product.GroupShopSkuDTO; import com.iotechn.unimall.data.enums.GroupShopAutomaticRefundType; import com.iotechn.unimall.data.enums.SpuActivityType; import com.iotechn.unimall.data.enums.StatusType; import com.iotechn.unimall.data.exception.ExceptionDefinition; import com.iotechn.unimall.data.mapper.GroupShopMapper; import com.iotechn.unimall.data.mapper.SkuActivityPriceMapper; import com.iotechn.unimall.data.mapper.SkuMapper; import com.iotechn.unimall.data.mapper.SpuMapper; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.util.*; import java.util.stream.Collectors; /* @PackageName:com.iotechn.unimall.admin.api.goods @ClassName: AdminGroupShopGoodsServiceImpl @Description: @author kbq @date 19-11-13下午4:21 */ @Service public class AdminGroupShopServiceImpl implements AdminGroupShopService { @Autowired private SkuMapper skuMapper; @Autowired private SpuMapper spuMapper; @Autowired private GroupShopMapper groupShopMapper; @Autowired private SkuActivityPriceMapper skuActivityPriceMapper; @Autowired private CacheComponent cacheComponent; @Override @Transactional(rollbackFor = Exception.class) public String create(Long spuId, Long gmtStart, Long gmtEnd, Integer minNum, Integer automaticRefund, String groupShopSkuListStr, Long adminId) throws ServiceException { // 1.转化为对应的GroupShopSkuDTO类的链表 List groupShopSkuDTOList = JSONObject.parseArray(groupShopSkuListStr, GroupShopSkuDTO.class) .stream().sorted(Comparator.comparingInt(GroupShopSkuDTO::getSkuGroupShopPrice)).collect(Collectors.toList()); if (gmtStart.compareTo(gmtEnd) >= 0) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_START_MUST_LESS_THAN_END); } // 2.1 检验数据库中是否存在spuId对应的sku SpuDO spuDO = spuMapper.selectById(spuId); List skuDOList = skuMapper.selectList((new QueryWrapper().eq("spu_id", spuId))); if (spuDO == null || CollectionUtils.isEmpty(skuDOList)) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SPU_NO_EXIST_OR_ONLY_SPU); } // 2.2 检验groupShop表中是否存在此商品 Integer count = groupShopMapper.selectCount((new QueryWrapper().eq("spu_id", spuId))); if (count > 0) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_ALREADY_EXIT); } // 2.3 校验商品是否还有未存在的活动 if (spuDO.getActivityId() != null && spuDO.getActivityType() != null && spuDO.getActivityType() != SpuActivityType.NONE.getCode() && spuDO.getGmtActivityEnd() != null && spuDO.getGmtActivityEnd().getTime() > System.currentTimeMillis()) { throw new AdminServiceException(ExceptionDefinition.PRODUCT_SPU_EXIST_ACTIVITY); } // 3.创建团购活动信息 // 3.1.插入主表 Date timeStart = new Date(gmtStart); Date timeEnd = new Date(gmtEnd); Date now = new Date(); GroupShopDO groupShopDO = new GroupShopDO(); groupShopDO.setBuyerNum(0); groupShopDO.setMinNum(minNum); groupShopDO.setGmtStart(timeStart); groupShopDO.setGmtEnd(timeEnd); groupShopDO.setAutomaticRefund(automaticRefund.compareTo(0) > 0 ? GroupShopAutomaticRefundType.YES.getCode() : GroupShopAutomaticRefundType.NO.getCode()); groupShopDO.setSpuId(spuId); groupShopDO.setMinPrice(groupShopSkuDTOList.get(0).getSkuGroupShopPrice()); groupShopDO.setMaxPrice(groupShopSkuDTOList.get(groupShopSkuDTOList.size() - 1).getSkuGroupShopPrice()); groupShopDO.setGmtCreate(now); groupShopDO.setGmtUpdate(now); // 由活动开始定时任务更改其状态 groupShopDO.setStatus(StatusType.LOCK.getCode()); if (groupShopMapper.insert(groupShopDO) <= 0) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SPU_ADD_SQL_QUERY_ERROR); } if (skuDOList.size() != groupShopSkuDTOList.size()) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SKU_NUMBER_ERROR); } // 3.2 插入groupShopSkuList(插入从表) this.insertGroupShopSkuList(groupShopSkuDTOList, skuDOList, groupShopDO.getId(), now); // 4.修改商品表活动信息 SpuDO updateSpuDO = new SpuDO(); updateSpuDO.setId(spuId); updateSpuDO.setActivityType(SpuActivityType.GROUP_SHOP.getCode()); updateSpuDO.setActivityId(groupShopDO.getId()); updateSpuDO.setGmtActivityStart(timeStart); updateSpuDO.setGmtActivityEnd(timeEnd); updateSpuDO.setGmtUpdate(now); spuMapper.updateById(updateSpuDO); // 5 清理缓存 this.clearCache(spuId); return "ok"; } @Override @Transactional(rollbackFor = Exception.class) public String delete(Long id, Long adminId) throws ServiceException { // 1. 参数校验 GroupShopDO groupShopDO = groupShopMapper.selectById(id); if (groupShopDO == null) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SPU_NO_EXIST_OR_ONLY_SPU); } if (groupShopDO.getStatus() > 0) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_ALREADY_ACTIVE); } // 2. 删除团购 if (groupShopMapper.deleteById(id) <= 0) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SPU_DELETE_SQL_QUERY_ERROR); } if (skuActivityPriceMapper.delete(( new QueryWrapper() .eq("activity_id", id) .eq("activity_type", SpuActivityType.GROUP_SHOP.getCode()))) <= 0) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SKU_DELETE_SQL_QUERY_ERROR); } // 3. 更新SPU状态 // 3.1. 检查一下活动是否被其他活动覆盖 SpuDO existSpu = spuMapper.selectById(groupShopDO.getSpuId()); if (existSpu.getActivityType() == SpuActivityType.GROUP_SHOP.getCode()) { // 3.2.执行状态修改 SpuDO updateSpuDO = new SpuDO(); updateSpuDO.setId(groupShopDO.getSpuId()); updateSpuDO.setActivityType(SpuActivityType.NONE.getCode()); updateSpuDO.setGmtUpdate(new Date()); spuMapper.updateById(updateSpuDO); } // 4. 清理缓存 this.clearCache(groupShopDO.getSpuId()); return "ok"; } @Override @Transactional(rollbackFor = Exception.class) public GroupShopDTO edit(Long id, Long spuId, Long gmtStart, Long gmtEnd, Integer minimumNumber, Integer automaticRefund, String groupShopSkuListStr, Long adminId) throws ServiceException { // 1.转化为对应的GroupShopSkuDO类的链表 List groupShopSkuDOList = JSONObject.parseArray(groupShopSkuListStr, GroupShopSkuDTO.class) .stream().sorted(Comparator.comparingInt(GroupShopSkuDTO::getSkuGroupShopPrice)).collect(Collectors.toList()); // 2校验参数 // 2.1.校验过期 if (gmtStart.compareTo(gmtEnd) >= 0) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_START_MUST_LESS_THAN_END); } // 2.2.校验团购 GroupShopDO groupShopDO = groupShopMapper.selectById(id); if (groupShopDO == null) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SPU_NO_EXIST); } if (groupShopDO.getStatus() > 0) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_ALREADY_ACTIVE); } // 2.2. 校验SPU SpuDO spuDO = spuMapper.selectById(spuId); List skuDOList = skuMapper.selectList((new QueryWrapper().eq("spu_id", spuId))); if (spuDO == null || CollectionUtils.isEmpty(skuDOList)) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SPU_NO_EXIST_OR_ONLY_SPU); } if (skuDOList.size() != groupShopSkuDOList.size()) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SKU_NUMBER_ERROR); } // 3. 修改团购信息 // 3.1. 修改主表 Date timeStart = new Date(gmtStart); Date timeEnd = new Date(gmtEnd); Date now = new Date(); groupShopDO.setMinNum(minimumNumber); groupShopDO.setGmtStart(timeStart); groupShopDO.setGmtEnd(timeEnd); groupShopDO.setAutomaticRefund(automaticRefund.compareTo(0) > 0 ? StatusType.ACTIVE.getCode() : StatusType.LOCK.getCode()); groupShopDO.setSpuId(spuId); groupShopDO.setMinPrice(groupShopSkuDOList.get(0).getSkuGroupShopPrice()); groupShopDO.setMinPrice(groupShopSkuDOList.get(groupShopSkuDOList.size() - 1).getSkuGroupShopPrice()); groupShopDO.setGmtUpdate(now); groupShopDO.setStatus(StatusType.LOCK.getCode()); if (groupShopMapper.updateById(groupShopDO) <= 0) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SPU_UPDATE_SQL_QUERY_ERROR); } // 3.2.插入groupShopSkuList(即修改活动商品价格表) // 3.2.1. 删除旧有活动商品价格 if (skuActivityPriceMapper.delete(( new QueryWrapper() .eq("activity_id", id) .eq("activity_type", SpuActivityType.GROUP_SHOP.getCode()))) <= 0) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SKU_DELETE_SQL_QUERY_ERROR); } // 3.3.2. 插入新的活动商品价格 this.insertGroupShopSkuList(groupShopSkuDOList, skuDOList, groupShopDO.getId(), now); // 4.修改商品活动信息 SpuDO updateSpuDO = new SpuDO(); updateSpuDO.setId(spuId); updateSpuDO.setActivityType(SpuActivityType.GROUP_SHOP.getCode()); updateSpuDO.setActivityId(groupShopDO.getId()); updateSpuDO.setGmtActivityStart(timeStart); updateSpuDO.setGmtActivityEnd(timeEnd); updateSpuDO.setGmtUpdate(now); spuMapper.updateById(updateSpuDO); // 5.清理缓存 this.clearCache(spuId); return new GroupShopDTO(); } @Override public Page list(Long id, String spuName, Integer status, Integer page, Integer limit, Long adminId) throws ServiceException { QueryWrapper queryWrapper = new QueryWrapper(); if (id != null) { queryWrapper.eq("id", id); } if (status != null) { queryWrapper.eq("status", status); } if (!StringUtils.isEmpty(spuName)) { List objectList = spuMapper.selectList( new QueryWrapper() .select("id") .like("title", spuName)); List spuIds = objectList.stream().map(SpuDO::getId).collect(Collectors.toList()); if (CollectionUtils.isEmpty(objectList)) { return new Page<>(new ArrayList<>(), page, limit, 0); } queryWrapper.in("spu_id", spuIds); } Page groupShopDTOPage = groupShopMapper .selectPage(Page.div(page, limit, GroupShopDO.class), queryWrapper).trans(groupShopDO -> { GroupShopDTO groupShopDTO = new GroupShopDTO(); SpuDO spuDO = spuMapper.selectById(groupShopDO.getSpuId()); BeanUtils.copyProperties(spuDO, groupShopDTO); BeanUtils.copyProperties(groupShopDO, groupShopDTO); /** * 添加groupShopSkuDTOList */ Map skuMap = skuMapper.selectList((new QueryWrapper().eq("spu_id", spuDO.getId()))).stream().collect(Collectors.toMap(SkuDO::getId, v -> v)); List skuActivityPriceDOList = skuActivityPriceMapper.selectList(( new QueryWrapper()) .eq("activity_id", groupShopDO.getId()) .eq("activity_type", SpuActivityType.GROUP_SHOP.getCode())); List groupShopSkuDTOList = skuActivityPriceDOList.stream().map(item -> { GroupShopSkuDTO groupShopSkuDTO = new GroupShopSkuDTO(); groupShopSkuDTO.setSkuId(item.getSkuId()); groupShopSkuDTO.setGroupShopId(item.getActivityId()); groupShopSkuDTO.setSkuGroupShopPrice(item.getActivityPrice()); SkuDO skuDO = skuMap.get(item.getSkuId()); BeanUtils.copyProperties(skuDO, groupShopSkuDTO); groupShopSkuDTO.setTitle(skuDO.getTitle()); return groupShopSkuDTO; }).sorted((o1, o2) -> (int)(o1.getSkuId().longValue() - o2.getSkuId().longValue())).collect(Collectors.toList()); groupShopDTO.setGroupShopSkuDTOList(groupShopSkuDTOList); return groupShopDTO; }); return groupShopDTOPage; } private void insertGroupShopSkuList(List groupShopSkuDTOList, List skuDOList, Long groupShopId, Date now) throws ServiceException { for (GroupShopSkuDTO groupShopSkuDTO : groupShopSkuDTOList) { boolean judge = false; for (SkuDO sku : skuDOList) { if (sku.getId().equals(groupShopSkuDTO.getSkuId())) { judge = true; break; } } if (!judge) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SKU_ID_ERROR); } if (groupShopSkuDTO.getSkuGroupShopPrice() == null || groupShopSkuDTO.getSkuGroupShopPrice().equals(0)) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SKU_PRICE_ERROR); } // 插入到商品活动价表 SkuActivityPriceDO skuActivityPriceDO = new SkuActivityPriceDO(); skuActivityPriceDO.setActivityType(SpuActivityType.GROUP_SHOP.getCode()); skuActivityPriceDO.setActivityId(groupShopId); skuActivityPriceDO.setActivityPrice(groupShopSkuDTO.getSkuGroupShopPrice()); skuActivityPriceDO.setGmtUpdate(now); skuActivityPriceDO.setGmtCreate(now); skuActivityPriceDO.setSkuId(groupShopSkuDTO.getSkuId()); if (skuActivityPriceMapper.insert(skuActivityPriceDO) <= 0) { throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SKU_ADD_SQL_QUERY_ERROR); } } } /** * 清除团购列表缓存 */ private void clearCache(Long spuId) { TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCommit() { // cacheComponent.delPrefixKey(CacheConst.PRT_GROUP_SHOP_LIST); // TODO 别忘记刷新商品缓存 // cacheComponent.delHashKey(CacheConst.PRT_SPU_HASH_BUCKET, "P" + spuId); } }); } }