package com.iotechn.unimall.app.api.appraise; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.dobbinsoft.fw.core.exception.AppServiceException; import com.dobbinsoft.fw.core.exception.ServiceException; import com.dobbinsoft.fw.support.component.CacheComponent; import com.dobbinsoft.fw.support.model.Page; import com.dobbinsoft.fw.support.storage.StorageClient; import com.iotechn.unimall.biz.service.appriaise.AppraiseBizService; import com.iotechn.unimall.biz.service.order.OrderBizService; import com.iotechn.unimall.data.constant.CacheConst; import com.iotechn.unimall.data.domain.AppraiseDO; import com.iotechn.unimall.data.domain.ImgDO; import com.iotechn.unimall.data.domain.OrderDO; import com.iotechn.unimall.data.domain.OrderSkuDO; import com.iotechn.unimall.data.dto.appraise.AppraiseRequestDTO; import com.iotechn.unimall.data.dto.appraise.AppraiseRequestItemDTO; import com.iotechn.unimall.data.dto.appraise.AppraiseResponseDTO; import com.iotechn.unimall.data.enums.BizType; import com.iotechn.unimall.data.enums.OrderStatusType; import com.iotechn.unimall.data.exception.ExceptionDefinition; import com.iotechn.unimall.data.mapper.AppraiseMapper; import com.iotechn.unimall.data.mapper.ImgMapper; import com.iotechn.unimall.data.mapper.OrderMapper; import com.iotechn.unimall.data.mapper.OrderSkuMapper; 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.ArrayList; import java.util.Date; import java.util.List; /* @author kbq @date 2019/7/6 - 11:08 */ @Service("appraiseService") public class AppraiseServiceImpl implements AppraiseService { @Autowired private OrderMapper orderMapper; @Autowired private ImgMapper imgMapper; @Autowired private AppraiseMapper appraiseMapper; @Autowired private OrderSkuMapper orderSkuMapper; @Autowired private CacheComponent cacheComponent; @Autowired private AppraiseBizService appraiseBizService; @Autowired private OrderBizService orderBizService; @Autowired private StorageClient storageClient; @Override @Transactional(rollbackFor = Exception.class) public String create(AppraiseRequestDTO appraiseRequestDTO, Long userId) throws ServiceException { // 1. 参数校验 是否有对应等待评价的订单 if (appraiseRequestDTO.getOrderId() == null) { throw new AppServiceException(ExceptionDefinition.APPRAISE_PARAM_CHECK_FAILED); } OrderDO orderDO = orderMapper.selectOne( new QueryWrapper() .eq("id", appraiseRequestDTO.getOrderId()) .eq("status", OrderStatusType.WAIT_APPRAISE.getCode()) .eq("user_id", userId)); if (orderDO == null) { throw new AppServiceException(ExceptionDefinition.APPRAISE_ORDER_CHECK_FAILED); } // 2. 如果传入评价list中没有数据,就直接转变订单状态发出 Date now = new Date(); if (CollectionUtils.isEmpty(appraiseRequestDTO.getAppraiseDTOList())) { OrderDO updateOrderDO = new OrderDO(); updateOrderDO.setStatus(OrderStatusType.COMPLETE.getCode()); orderBizService.changeOrderSubStatus(orderDO.getOrderNo(), OrderStatusType.COMPLETE.getCode(), updateOrderDO); } // 3. 循环读取订单评价中所有商品的评价 List spuIds = new ArrayList<>(); for (AppraiseRequestItemDTO appraiseDTO : appraiseRequestDTO.getAppraiseDTOList()) { Integer count = orderSkuMapper.selectCount(new QueryWrapper() .eq("order_id", appraiseRequestDTO.getOrderId()) .eq("spu_id", appraiseDTO.getSpuId()) .eq("sku_id", appraiseDTO.getSkuId())); //从order_sku表中 验证是否有对应的表单和商品 if (count == 0) { throw new AppServiceException(ExceptionDefinition.APPRAISE_PARAM_CHECK_FAILED); } AppraiseDO appraiseDO = new AppraiseDO(); // 防止传入id,导致插入数据库出错 BeanUtils.copyProperties(appraiseDTO, appraiseDO, "id"); appraiseDO.setSpuId(appraiseDTO.getSpuId()); appraiseDO.setOrderId(appraiseRequestDTO.getOrderId()); //从传入数据取出,不使用DTO中的冗余数据 appraiseDO.setUserId(userId); appraiseDO.setGmtCreate(now); appraiseDO.setGmtUpdate(appraiseDO.getGmtCreate()); appraiseMapper.insert(appraiseDO); //插入该订单该商品评价 //删除商品评论缓存 spuIds.add(appraiseDTO.getSpuId()); String imgUrlS = appraiseDTO.getImgUrl(); if (StringUtils.isEmpty(imgUrlS)) { continue; } String[] imgUrlList = imgUrlS.split(","); //传入图片 for (String imgUrl : imgUrlList) { ImgDO imgDO = new ImgDO(); imgDO.setBizType(BizType.APPRAISE.getCode()); imgDO.setBizId(appraiseDO.getId()); imgDO.setUrl(imgUrl); imgDO.setGmtCreate(now); imgDO.setGmtUpdate(imgDO.getGmtCreate()); imgMapper.insert(imgDO); } } // 4. 改变订单状态 OrderDO updateOrderDO = new OrderDO(); updateOrderDO.setStatus(OrderStatusType.COMPLETE.getCode()); orderBizService.changeOrderSubStatus(orderDO.getOrderNo(), OrderStatusType.WAIT_APPRAISE.getCode(), updateOrderDO); // 5. 清理缓存 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCommit() { for (Long spuId : spuIds) { cacheComponent.delPrefixKey(CacheConst.PRT_APPRAISE_LIST + spuId); } } }); return "ok"; } @Override @Transactional(rollbackFor = Exception.class) public String delete(Long appraiseId, Long userId) throws ServiceException { AppraiseDO appraiseDO = appraiseMapper.selectById(appraiseId); if (appraiseMapper.delete(new QueryWrapper() .eq("id", appraiseId) .eq("user_id", userId)) > 0) { List imgs = imgMapper.getImgs(BizType.APPRAISE.getCode(), appraiseId); imgMapper.delete(new QueryWrapper() .eq("biz_type",BizType.APPRAISE.getCode()) .eq("biz_id",appraiseId)); // 用户删除评价,需要删除对应产品的评论缓存 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCommit() { cacheComponent.delPrefixKey(CacheConst.PRT_APPRAISE_LIST + appraiseDO.getSpuId()); // TODO 异步 for (String img : imgs) { storageClient.delete(img); } } }); return "ok"; } throw new AppServiceException(ExceptionDefinition.APPRAISE_PARAM_CHECK_FAILED); } @Override public Page getUserAllAppraise(Long userId, Integer pageNo, Integer pageSize) throws ServiceException { return appraiseBizService.getUserAppraisePage(userId, pageNo, pageSize); } @Override public Page getSpuAppraisePage(Long spuId, Integer pageNo, Integer pageSize) throws ServiceException { return appraiseBizService.getSpuAppraisePage(spuId, pageNo, pageSize); } @Override public AppraiseResponseDTO getAppraiseById(Long appraiseId) throws ServiceException { AppraiseResponseDTO appraiseResponseDTO = appraiseMapper.selectOneById(appraiseId); if (appraiseResponseDTO == null) { throw new AppServiceException(ExceptionDefinition.APPRAISE_PARAM_CHECK_FAILED); } appraiseResponseDTO.setImgList(imgMapper.getImgs(BizType.APPRAISE.getCode(), appraiseResponseDTO.getId())); return appraiseResponseDTO; } }