package cn.lili.modules.goods.serviceimpl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.json.JSONUtil; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.event.TransactionCommitSendMQEvent; import cn.lili.common.exception.ServiceException; import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; import cn.lili.modules.goods.entity.dos.*; import cn.lili.modules.goods.entity.dto.GoodsOperationDTO; import cn.lili.modules.goods.entity.dto.GoodsParamsDTO; import cn.lili.modules.goods.entity.dto.GoodsSearchParams; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; import cn.lili.modules.goods.entity.vos.GoodsSkuVO; import cn.lili.modules.goods.entity.vos.GoodsVO; import cn.lili.modules.goods.mapper.GoodsMapper; import cn.lili.modules.goods.service.*; import cn.lili.modules.member.entity.dto.EvaluationQueryParams; import cn.lili.modules.member.entity.enums.EvaluationGradeEnum; import cn.lili.modules.member.service.MemberEvaluationService; import cn.lili.modules.search.utils.EsIndexUtil; import cn.lili.modules.store.entity.dos.FreightTemplate; import cn.lili.modules.store.entity.dos.Store; import cn.lili.modules.store.entity.vos.StoreVO; import cn.lili.modules.store.service.FreightTemplateService; import cn.lili.modules.store.service.StoreService; import cn.lili.modules.system.aspect.annotation.SystemLogPoint; import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.dto.GoodsSetting; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; import cn.lili.mybatis.util.PageUtil; import cn.lili.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.rocketmq.tags.GoodsTagsEnum; import cn.lili.utils.COSUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; /** * 商品业务层实现 * * @author pikachu * @since 2020-02-23 15:18:56 */ @Service public class GoodsServiceImpl extends ServiceImpl implements GoodsService { /** * 分类 */ @Autowired private CategoryService categoryService; /** * 设置 */ @Autowired private SettingService settingService; /** * 商品相册 */ @Autowired private GoodsGalleryService goodsGalleryService; /** * 商品规格 */ @Autowired private GoodsSkuService goodsSkuService; /** * 店铺详情 */ @Autowired private StoreService storeService; /** * 会员评价 */ @Autowired private MemberEvaluationService memberEvaluationService; /** * rocketMq */ @Autowired private RocketMQTemplate rocketMQTemplate; /** * rocketMq配置 */ @Autowired private RocketmqCustomProperties rocketmqCustomProperties; @Autowired private ApplicationEventPublisher applicationEventPublisher; @Autowired private FreightTemplateService freightTemplateService; @Autowired private WholesaleService wholesaleService; @Autowired private Cache cache; @Autowired private COSUtil cosUtil; @Override public List getByBrandIds(List brandIds) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.in(Goods::getBrandId, brandIds); return list(lambdaQueryWrapper); } @Override @Transactional(rollbackFor = Exception.class) public void underStoreGoods(String storeId) { //获取商品ID列表 List list = this.baseMapper.getGoodsIdByStoreId(storeId); //下架店铺下的商品 this.updateGoodsMarketAbleByStoreId(storeId, GoodsStatusEnum.DOWN, "店铺关闭"); applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("下架商品", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.DOWN.name(), JSONUtil.toJsonStr(list))); } /** * 更新商品参数 * * @param goodsId 商品id * @param params 商品参数 */ @Override @Transactional(rollbackFor = Exception.class) public void updateGoodsParams(String goodsId, String params) { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(Goods::getId, goodsId); updateWrapper.set(Goods::getParams, params); this.update(updateWrapper); } @Override public final long getGoodsCountByCategory(String categoryId) { QueryWrapper queryWrapper = Wrappers.query(); queryWrapper.like("category_path", categoryId); queryWrapper.eq("delete_flag", false); return this.count(queryWrapper); } @Override @Transactional(rollbackFor = Exception.class) @SystemLogPoint(description = "添加商品", customerLog = "'新增商品名称:['+#goodsOperationDTO.goodsName+']'") public void addGoods(GoodsOperationDTO goodsOperationDTO) { Goods goods = new Goods(goodsOperationDTO); //检查商品 this.checkGoods(goods); //向goods加入图片 if (goodsOperationDTO.getGoodsGalleryList()!=null&& !goodsOperationDTO.getGoodsGalleryList().isEmpty()) { this.setGoodsGalleryParam(goodsOperationDTO.getGoodsGalleryList().get(0), goods); } //添加商品参数 if (goodsOperationDTO.getGoodsParamsDTOList() != null && !goodsOperationDTO.getGoodsParamsDTOList().isEmpty()) { //给商品参数填充值 goods.setParams(JSONUtil.toJsonStr(goodsOperationDTO.getGoodsParamsDTOList())); } //添加商品 this.save(goods); //添加商品sku信息 this.goodsSkuService.add(goods, goodsOperationDTO); //添加相册 if (goodsOperationDTO.getGoodsGalleryList() != null && !goodsOperationDTO.getGoodsGalleryList().isEmpty()) { this.goodsGalleryService.add(goodsOperationDTO.getGoodsGalleryList(), goods.getId()); } this.generateEs(goods); } @Override @Transactional(rollbackFor = Exception.class) @SystemLogPoint(description = "修改商品", customerLog = "'操作的商品ID:['+#goodsId+']'") public void editGoods(GoodsOperationDTO goodsOperationDTO, String goodsId) { Goods goods = new Goods(goodsOperationDTO); goods.setId(goodsId); //检查商品信息 this.checkGoods(goods); //向goods加入图片 if (goodsOperationDTO.getGoodsGalleryList() != null&& !goodsOperationDTO.getGoodsGalleryList().isEmpty()) { this.setGoodsGalleryParam(goodsOperationDTO.getGoodsGalleryList().get(0), goods); }else { goods.setOriginal(null); goods.setSmall(null); goods.setThumbnail(null); goodsGalleryService.removeByGoodsId(goodsId); } //添加商品参数 if (goodsOperationDTO.getGoodsParamsDTOList() != null && !goodsOperationDTO.getGoodsParamsDTOList().isEmpty()) { goods.setParams(JSONUtil.toJsonStr(goodsOperationDTO.getGoodsParamsDTOList())); } //修改商品 this.updateById(goods); //修改商品sku信息 this.goodsSkuService.update(goods, goodsOperationDTO); //添加相册 if (goodsOperationDTO.getGoodsGalleryList() != null && !goodsOperationDTO.getGoodsGalleryList().isEmpty()) { this.goodsGalleryService.add(goodsOperationDTO.getGoodsGalleryList(), goods.getId()); } if (GoodsAuthEnum.TOBEAUDITED.name().equals(goods.getAuthFlag())) { this.deleteEsGoods(Collections.singletonList(goodsId)); } cache.remove(CachePrefix.GOODS.getPrefix() + goodsId); this.generateEs(goods); } @Override public GoodsVO getGoodsVO(String goodsId) { //缓存获取,如果没有则读取缓存 GoodsVO goodsVO = cache.get(CachePrefix.GOODS.getPrefix() + goodsId); if (goodsVO != null) { // List goodsGalleryList = goodsVO.getGoodsGalleryList(); // if (goodsGalleryList != null && !goodsGalleryList.isEmpty()) { // List galleryList = goodsGalleryList.stream().map(item -> { // if (StringUtils.isNotBlank(item)&&!item.contains("http")) { // return cosUtil.getPreviewUrl(item); // }else { // return item; // } // }).collect(Collectors.toList()); // goodsVO.setGoodsGalleryList(galleryList); // } return goodsVO; } //查询商品信息 Goods goods = this.getById(goodsId); if (goods == null) { log.error("商品ID为" + goodsId + "的商品不存在"); throw new ServiceException(ResultCode.GOODS_NOT_EXIST); } goodsVO = new GoodsVO(); //赋值 BeanUtils.copyProperties(goods, goodsVO); //商品id goodsVO.setId(goods.getId()); //商品相册赋值 List images = new ArrayList<>(); List galleryList = goodsGalleryService.goodsGalleryList(goodsId); for (GoodsGallery goodsGallery : galleryList) { images.add(goodsGallery.getOriginal()); // String original = goodsGallery.getOriginal(); // if (StringUtils.isNotBlank(original)&&!original.contains("http")) { // images.add(cosUtil.getPreviewUrl(original)); // }else { // images.add(goodsGallery.getOriginal()); // } } goodsVO.setGoodsGalleryList(images); //商品sku赋值 List goodsListByGoodsId = goodsSkuService.getGoodsListByGoodsId(goodsId); if (goodsListByGoodsId != null && !goodsListByGoodsId.isEmpty()) { goodsVO.setSkuList(goodsListByGoodsId); } //商品分类名称赋值 List categoryName = new ArrayList<>(); String categoryPath = goods.getCategoryPath(); String[] strArray = categoryPath.split(","); List categories = categoryService.listByIds(Arrays.asList(strArray)); for (Category category : categories) { categoryName.add(category.getName()); } goodsVO.setCategoryName(categoryName); //参数非空则填写参数 if (CharSequenceUtil.isNotEmpty(goods.getParams())) { goodsVO.setGoodsParamsDTOList(JSONUtil.toList(goods.getParams(), GoodsParamsDTO.class)); } List wholesaleList = wholesaleService.findByGoodsId(goodsId); if (CollUtil.isNotEmpty(wholesaleList)) { goodsVO.setWholesaleList(wholesaleList); } cache.put(CachePrefix.GOODS.getPrefix() + goodsId, goodsVO); return goodsVO; } @Override public IPage queryByParams(GoodsSearchParams goodsSearchParams) { return this.page(PageUtil.initPage(goodsSearchParams), goodsSearchParams.queryWrapper()); } /** * 商品查询 * * @param goodsSearchParams 查询参数 * @return 商品信息 */ @Override public List queryListByParams(GoodsSearchParams goodsSearchParams) { return this.list(goodsSearchParams.queryWrapper()); } @Override @SystemLogPoint(description = "审核商品", customerLog = "'操作的商品ID:['+#goodsIds+'],操作后商品状态:['+#goodsAuthEnum+']'") @Transactional(rollbackFor = Exception.class) public boolean auditGoods(List goodsIds, GoodsAuthEnum goodsAuthEnum) { List goodsCacheKeys = new ArrayList<>(); boolean result = false; for (String goodsId : goodsIds) { Goods goods = this.checkExist(goodsId); goods.setAuthFlag(goodsAuthEnum.name()); result = this.updateById(goods); goodsSkuService.updateGoodsSkuStatus(goods); //删除之前的缓存 goodsCacheKeys.add(CachePrefix.GOODS.getPrefix() + goodsId); //商品审核消息 String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.GOODS_AUDIT.name(); //发送mq消息 rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(goods), RocketmqSendCallbackBuilder.commonCallback()); } cache.multiDel(goodsCacheKeys); return result; } @Override @Transactional(rollbackFor = Exception.class) @SystemLogPoint(description = "商品状态操作", customerLog = "'操作类型:['+#goodsStatusEnum+'],操作对象:['+#goodsIds+'],操作原因:['+#underReason+']'") public Boolean updateGoodsMarketAble(List goodsIds, GoodsStatusEnum goodsStatusEnum, String underReason) { boolean result; //如果商品为空,直接返回 if (goodsIds == null || goodsIds.isEmpty()) { return true; } LambdaUpdateWrapper updateWrapper = this.getUpdateWrapperByStoreAuthority(); updateWrapper.set(Goods::getMarketEnable, goodsStatusEnum.name()); updateWrapper.set(Goods::getUnderMessage, underReason); updateWrapper.in(Goods::getId, goodsIds); result = this.update(updateWrapper); //修改规格商品 LambdaQueryWrapper queryWrapper = this.getQueryWrapperByStoreAuthority(); queryWrapper.in(Goods::getId, goodsIds); List goodsList = this.list(queryWrapper); this.updateGoodsStatus(goodsIds, goodsStatusEnum, goodsList); return result; } /** * 更新商品上架状态状态 * * @param storeId 店铺ID * @param goodsStatusEnum 更新的商品状态 * @param underReason 下架原因 * @return 更新结果 */ @Override @SystemLogPoint(description = "店铺关闭下架商品", customerLog = "'操作类型:['+#goodsStatusEnum+'],操作对象:['+#storeId+'],操作原因:['+#underReason+']'") public Boolean updateGoodsMarketAbleByStoreId(String storeId, GoodsStatusEnum goodsStatusEnum, String underReason) { LambdaUpdateWrapper updateWrapper = this.getUpdateWrapperByStoreAuthority(); updateWrapper.set(Goods::getMarketEnable, goodsStatusEnum.name()); updateWrapper.set(Goods::getUnderMessage, underReason); updateWrapper.eq(Goods::getStoreId, storeId); boolean result = this.update(updateWrapper); //修改规格商品 this.goodsSkuService.updateGoodsSkuStatusByStoreId(storeId, goodsStatusEnum.name(), null); return result; } @Override @SystemLogPoint(description = "管理员关闭下架商品", customerLog = "'操作类型:['+#goodsStatusEnum+'],操作对象:['+#goodsIds+'],操作原因:['+#underReason+']'") @Transactional(rollbackFor = Exception.class) public Boolean managerUpdateGoodsMarketAble(List goodsIds, GoodsStatusEnum goodsStatusEnum, String underReason) { boolean result; //如果商品为空,直接返回 if (goodsIds == null || goodsIds.isEmpty()) { return true; } //检测管理员权限 this.checkManagerAuthority(); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.set(Goods::getMarketEnable, goodsStatusEnum.name()); updateWrapper.set(Goods::getUnderMessage, underReason); updateWrapper.in(Goods::getId, goodsIds); result = this.update(updateWrapper); //修改规格商品 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(Goods::getId, goodsIds); List goodsList = this.list(queryWrapper); this.updateGoodsStatus(goodsIds, goodsStatusEnum, goodsList); return result; } @Override @Transactional(rollbackFor = Exception.class) @SystemLogPoint(description = "删除商品", customerLog = "'操作对象:['+#goodsIds+']'") public Boolean deleteGoods(List goodsIds) { LambdaUpdateWrapper updateWrapper = this.getUpdateWrapperByStoreAuthority(); updateWrapper.set(Goods::getMarketEnable, GoodsStatusEnum.DOWN.name()); updateWrapper.set(Goods::getDeleteFlag, true); updateWrapper.in(Goods::getId, goodsIds); this.update(updateWrapper); //修改规格商品 LambdaQueryWrapper queryWrapper = this.getQueryWrapperByStoreAuthority(); queryWrapper.in(Goods::getId, goodsIds); List goodsList = this.list(queryWrapper); List goodsCacheKeys = new ArrayList<>(); for (Goods goods : goodsList) { //修改SKU状态 goodsSkuService.updateGoodsSkuStatus(goods); goodsCacheKeys.add(CachePrefix.GOODS.getPrefix() + goods.getId()); } //删除缓存 cache.multiDel(goodsCacheKeys); this.deleteEsGoods(goodsIds); return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean freight(List goodsIds, String templateId) { AuthUser authUser = this.checkStoreAuthority(); FreightTemplate freightTemplate = freightTemplateService.getById(templateId); if (freightTemplate == null) { throw new ServiceException(ResultCode.FREIGHT_TEMPLATE_NOT_EXIST); } if (authUser != null && !freightTemplate.getStoreId().equals(authUser.getStoreId())) { throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); } LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); lambdaUpdateWrapper.set(Goods::getTemplateId, templateId); lambdaUpdateWrapper.in(Goods::getId, goodsIds); List goodsCache = goodsIds.stream().map(item -> CachePrefix.GOODS.getPrefix() + item).collect(Collectors.toList()); cache.multiDel(goodsCache); goodsSkuService.freight(goodsIds, templateId); return this.update(lambdaUpdateWrapper); } @Override @SystemLogPoint(description = "同步商品库存", customerLog = "'同步商品商品ID的库存:['+#goodsId+']'") public void updateStock(String goodsId) { LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); Integer stock = goodsSkuService.getGoodsStock(goodsId); lambdaUpdateWrapper.set(Goods::getQuantity, stock); lambdaUpdateWrapper.eq(Goods::getId, goodsId); cache.remove(CachePrefix.GOODS.getPrefix() + goodsId); this.update(lambdaUpdateWrapper); } @Override @Transactional(rollbackFor = Exception.class) public void updateGoodsCommentNum(String goodsId, String skuId) { GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(skuId); if (goodsSku == null) { return; } //获取商品信息 Goods goods = this.getById(goodsId); if (goods == null) { return; } //修改商品评价数量 long commentNum = memberEvaluationService.getEvaluationCount(EvaluationQueryParams.builder().goodsId(goodsId).status("OPEN").build()); goods.setCommentNum((int) (commentNum)); //好评数量 long highPraiseNum = memberEvaluationService.getEvaluationCount(EvaluationQueryParams.builder().goodsId(goodsId).status("OPEN").grade(EvaluationGradeEnum.GOOD.name()).build()); //好评率 double grade = NumberUtil.mul(NumberUtil.div(highPraiseNum, goods.getCommentNum().doubleValue(), 2), 100); goods.setGrade(grade); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(Goods::getId, goodsId); updateWrapper.set(Goods::getCommentNum, goods.getCommentNum()); updateWrapper.set(Goods::getGrade, goods.getGrade()); this.update(updateWrapper); cache.remove(CachePrefix.GOODS.getPrefix() + goodsId); // 修改商品sku评价数量 this.goodsSkuService.updateGoodsSkuGrade(goodsId, grade, goods.getCommentNum()); Map updateIndexFieldsMap = EsIndexUtil.getUpdateIndexFieldsMap(MapUtil.builder(new HashMap()).put("goodsId", goodsId).build(), MapUtil.builder(new HashMap()).put("commentNum", goods.getCommentNum()).put("highPraiseNum", highPraiseNum).put("grade", grade).build()); applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("更新商品索引信息", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.UPDATE_GOODS_INDEX_FIELD.name(), JSONUtil.toJsonStr(updateIndexFieldsMap))); } /** * 更新商品的购买数量 * * @param goodsId 商品ID * @param buyCount 购买数量 */ @Override public void updateGoodsBuyCount(String goodsId, int buyCount) { this.update(new LambdaUpdateWrapper() .eq(Goods::getId, goodsId) .set(Goods::getBuyCount, buyCount)); } @Override @Transactional(rollbackFor = Exception.class) public void updateStoreDetail(Store store) { UpdateWrapper updateWrapper = new UpdateWrapper<>() .eq("store_id", store.getId()) .set("store_name", store.getStoreName()) .set("self_operated", store.getSelfOperated()); this.update(updateWrapper); goodsSkuService.update(updateWrapper); } @Override public long countStoreGoodsNum(String storeId) { return this.count( new LambdaQueryWrapper() .eq(Goods::getStoreId, storeId) .eq(Goods::getDeleteFlag, Boolean.FALSE) .eq(Goods::getAuthFlag, GoodsAuthEnum.PASS.name()) .eq(Goods::getMarketEnable, GoodsStatusEnum.UPPER.name())); } @Override public void categoryGoodsName(String categoryId) { //获取分类下的商品 List list = this.list(new LambdaQueryWrapper().like(Goods::getCategoryPath, categoryId)); list.parallelStream().forEach(goods -> { //移除redis中商品缓存 cache.remove(CachePrefix.GOODS.getPrefix() + goods.getId()); }); } @Override public void addGoodsCommentNum(Integer commentNum, String goodsId) { this.baseMapper.addGoodsCommentNum(commentNum, goodsId); } /** * 更新商品状态 * * @param goodsIds 商品ID * @param goodsStatusEnum 商品状态 * @param goodsList 商品列表 */ private void updateGoodsStatus(List goodsIds, GoodsStatusEnum goodsStatusEnum, List goodsList) { List goodsCacheKeys = new ArrayList<>(); for (Goods goods : goodsList) { goodsCacheKeys.add(CachePrefix.GOODS.getPrefix() + goods.getId()); goodsSkuService.updateGoodsSkuStatus(goods); } cache.multiDel(goodsCacheKeys); if (GoodsStatusEnum.DOWN.equals(goodsStatusEnum)) { this.deleteEsGoods(goodsIds); } else { this.updateEsGoods(goodsIds); } //下架商品发送消息 if (goodsStatusEnum.equals(GoodsStatusEnum.DOWN)) { applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("下架商品", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.DOWN.name(), JSONUtil.toJsonStr(goodsIds))); } } /** * 发送生成ES商品索引 * * @param goods 商品信息 */ @Transactional public void generateEs(Goods goods) { // 不生成没有审核通过且没有上架的商品 if (!GoodsStatusEnum.UPPER.name().equals(goods.getMarketEnable()) || !GoodsAuthEnum.PASS.name().equals(goods.getAuthFlag())) { return; } applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("生成商品", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.GENERATOR_GOODS_INDEX.name(), goods.getId())); } /** * 发送生成ES商品索引 * * @param goodsIds 商品id */ @Transactional public void updateEsGoods(List goodsIds) { applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("更新商品", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.UPDATE_GOODS_INDEX.name(), goodsIds)); } /** * 发送删除es索引的信息 * * @param goodsIds 商品id */ @Transactional public void deleteEsGoods(List goodsIds) { applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("删除商品", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.GOODS_DELETE.name(), JSONUtil.toJsonStr(goodsIds))); } /** * 添加商品默认图片 * * @param origin 图片 * @param goods 商品 */ private void setGoodsGalleryParam(String origin, Goods goods) { GoodsGallery goodsGallery = goodsGalleryService.getGoodsGallery(origin); goods.setOriginal(goodsGallery.getOriginal()); goods.setSmall(goodsGallery.getSmall()); goods.setThumbnail(goodsGallery.getThumbnail()); } /** * 检查商品信息 * 如果商品是虚拟商品则无需配置配送模板 * 如果商品是实物商品需要配置配送模板 * 判断商品是否存在 * 判断商品是否需要审核 * 判断当前用户是否为店铺 * * @param goods 商品 */ private void checkGoods(Goods goods) { //判断商品类型 switch (goods.getGoodsType()) { case "PHYSICAL_GOODS": if ("0".equals(goods.getTemplateId())) { throw new ServiceException(ResultCode.PHYSICAL_GOODS_NEED_TEMP); } break; case "VIRTUAL_GOODS": if (!"0".equals(goods.getTemplateId())) { goods.setTemplateId("0"); } break; default: throw new ServiceException(ResultCode.GOODS_TYPE_ERROR); } //检查商品是否存在--修改商品时使用 if (goods.getId() != null) { this.checkExist(goods.getId()); } else { //评论次数 goods.setCommentNum(0); //购买次数 goods.setBuyCount(0); //购买次数 goods.setQuantity(0); //商品评分 goods.setGrade(100.0); } //获取商品系统配置决定是否审核 Setting setting = settingService.get(SettingEnum.GOODS_SETTING.name()); GoodsSetting goodsSetting = JSONUtil.toBean(setting.getSettingValue(), GoodsSetting.class); //是否需要审核 goods.setAuthFlag(Boolean.TRUE.equals(goodsSetting.getGoodsCheck()) ? GoodsAuthEnum.TOBEAUDITED.name() : GoodsAuthEnum.PASS.name()); //判断当前用户是否为店铺 if (Objects.requireNonNull(UserContext.getCurrentUser()).getRole().equals(UserEnums.STORE)) { StoreVO storeDetail = this.storeService.getStoreDetail(); if (storeDetail.getSelfOperated() != null) { goods.setSelfOperated(storeDetail.getSelfOperated()); } goods.setStoreId(storeDetail.getId()); goods.setStoreName(storeDetail.getStoreName()); goods.setSelfOperated(storeDetail.getSelfOperated()); } else { throw new ServiceException(ResultCode.STORE_NOT_LOGIN_ERROR); } } /** * 判断商品是否存在 * * @param goodsId 商品id * @return 商品信息 */ private Goods checkExist(String goodsId) { Goods goods = getById(goodsId); if (goods == null) { log.error("商品ID为" + goodsId + "的商品不存在"); throw new ServiceException(ResultCode.GOODS_NOT_EXIST); } return goods; } /** * 获取UpdateWrapper(检查用户越权) * * @return updateWrapper */ private LambdaUpdateWrapper getUpdateWrapperByStoreAuthority() { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); AuthUser authUser = this.checkStoreAuthority(); if (authUser != null) { updateWrapper.eq(Goods::getStoreId, authUser.getStoreId()); } return updateWrapper; } /** * 检查当前登录的店铺 * * @return 当前登录的店铺 */ private AuthUser checkStoreAuthority() { AuthUser currentUser = UserContext.getCurrentUser(); //如果当前会员不为空,且为店铺角色 if (currentUser != null && (currentUser.getRole().equals(UserEnums.STORE) && currentUser.getStoreId() != null)) { return currentUser; } return null; } /** * 检查当前登录的店铺 * * @return 当前登录的店铺 */ private AuthUser checkManagerAuthority() { AuthUser currentUser = UserContext.getCurrentUser(); //如果当前会员不为空,且为店铺角色 if (currentUser != null && (currentUser.getRole().equals(UserEnums.MANAGER))) { return currentUser; } else { throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); } } /** * 获取QueryWrapper(检查用户越权) * * @return queryWrapper */ private LambdaQueryWrapper getQueryWrapperByStoreAuthority() { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); AuthUser authUser = this.checkStoreAuthority(); if (authUser != null) { queryWrapper.eq(Goods::getStoreId, authUser.getStoreId()); } return queryWrapper; } }