package cn.lili.modules.order.order.serviceimpl; import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.OperationalJudgment; import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.utils.BeanUtil; import cn.lili.common.vo.PageVO; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.service.GoodsSkuService; import cn.lili.modules.order.aftersale.entity.enums.ComplaintStatusEnum; import cn.lili.modules.order.order.entity.dos.OrderComplaint; import cn.lili.modules.order.order.entity.dos.OrderComplaintCommunication; import cn.lili.modules.order.order.entity.dos.OrderItem; import cn.lili.modules.order.order.entity.dto.OrderComplaintDTO; import cn.lili.modules.order.order.entity.enums.OrderComplaintStatusEnum; import cn.lili.modules.order.order.entity.vo.*; import cn.lili.modules.order.order.mapper.OrderComplaintMapper; import cn.lili.modules.order.order.service.OrderComplaintCommunicationService; import cn.lili.modules.order.order.service.OrderComplaintService; import cn.lili.modules.order.order.service.OrderItemService; import cn.lili.modules.order.order.service.OrderService; import cn.lili.mybatis.util.PageUtil; 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.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; import java.util.Objects; /** * 交易投诉业务层实现 * * @author paulG * @since 2020/12/5 **/ @Service public class OrderComplaintServiceImpl extends ServiceImpl implements OrderComplaintService { /** * 订单 */ @Autowired private OrderService orderService; /** * 订单货物 */ @Autowired private OrderItemService orderItemService; /** * 商品规格 */ @Autowired private GoodsSkuService goodsSkuService; /** * 交易投诉沟通 */ @Autowired private OrderComplaintCommunicationService orderComplaintCommunicationService; /** * 分页获取交易投诉信息 * * @param searchParams 查询参数 * @param pageVO 分页参数 * @return 交易投诉信息 */ @Override public IPage getOrderComplainByPage(OrderComplaintSearchParams searchParams, PageVO pageVO) { return this.page(PageUtil.initPage(pageVO), searchParams.lambdaQueryWrapper()); } /** * 获取交易投诉详情 * * @param id 交易投诉ID * @return 交易投诉详情 */ @Override public OrderComplaintVO getOrderComplainById(String id) { OrderComplaint orderComplaint = this.checkOrderComplainExist(id); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(OrderComplaintCommunication::getComplainId, id); List list = orderComplaintCommunicationService.list(queryWrapper); OrderComplaintVO orderComplainVO = new OrderComplaintVO(orderComplaint); orderComplainVO.setOrderComplaintCommunications(list); orderComplainVO.setOrderComplaintImages(orderComplaint.getImages().split(",")); if (orderComplaint.getAppealImages() != null) { orderComplainVO.setAppealImagesList(orderComplaint.getAppealImages().split(",")); } return orderComplainVO; } /** * 获取交易投诉详情 * * @param storeId 店铺id * @return 交易投诉详情 */ @Override public OrderComplaint getOrderComplainByStoreId(String storeId) { return this.getOne(new LambdaQueryWrapper().eq(OrderComplaint::getStoreId, storeId)); } /** * 添加交易投诉 * * @param orderComplaintDTO 交易投诉信息 * @return 添加结果 */ @Override @Transactional(rollbackFor = Exception.class) public OrderComplaint addOrderComplain(OrderComplaintDTO orderComplaintDTO) { try { AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser()); //查询订单信息 OrderDetailVO orderDetailVO = orderService.queryDetail(orderComplaintDTO.getOrderSn()); List orderItems = orderDetailVO.getOrderItems(); OrderItem orderItem = orderItems.stream().filter(i -> orderComplaintDTO.getSkuId().equals(i.getSkuId())).findFirst().orElse(null); if (orderItem == null) { throw new ServiceException(ResultCode.COMPLAINT_ORDER_ITEM_EMPTY_ERROR); } //新建交易投诉 OrderComplaint orderComplaint = new OrderComplaint(); BeanUtil.copyProperties(orderComplaintDTO, orderComplaint); //获取商品规格信息 GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(orderItem.getSkuId()); if (goodsSku == null) { throw new ServiceException(ResultCode.COMPLAINT_SKU_EMPTY_ERROR); } orderComplaint.setComplainStatus(ComplaintStatusEnum.NEW.name()); orderComplaint.setGoodsId(goodsSku.getGoodsId()); orderComplaint.setGoodsName(goodsSku.getGoodsName()); orderComplaint.setGoodsImage(goodsSku.getThumbnail()); orderComplaint.setGoodsPrice(goodsSku.getPrice()); orderComplaint.setNum(orderItem.getNum()); //获取订单信息 orderComplaint.setOrderTime(orderDetailVO.getOrder().getCreateTime()); orderComplaint.setOrderPrice(orderDetailVO.getOrder().getPriceDetailDTO().getBillPrice()); orderComplaint.setNum(orderDetailVO.getOrder().getGoodsNum()); orderComplaint.setFreightPrice(orderDetailVO.getOrder().getPriceDetailDTO().getFreightPrice()); orderComplaint.setLogisticsNo(orderDetailVO.getOrder().getLogisticsNo()); orderComplaint.setConsigneeMobile(orderDetailVO.getOrder().getConsigneeMobile()); orderComplaint.setConsigneeAddressPath(orderDetailVO.getOrder().getConsigneeAddressPath()); orderComplaint.setConsigneeName(orderDetailVO.getOrder().getConsigneeName()); //获取商家信息 orderComplaint.setStoreId(orderDetailVO.getOrder().getStoreId()); orderComplaint.setStoreName(orderDetailVO.getOrder().getStoreName()); orderComplaint.setMemberId(currentUser.getId()); orderComplaint.setMemberName(currentUser.getUsername()); //保存订单投诉 this.save(orderComplaint); //更新订单投诉状态 orderItemService.updateOrderItemsComplainStatus(orderComplaint.getOrderSn(), orderComplaint.getSkuId(), orderComplaint.getId(), OrderComplaintStatusEnum.APPLYING); return orderComplaint; } catch (ServiceException e) { throw e; } catch (Exception e) { log.error("订单投诉异常:", e); throw new ServiceException(ResultCode.COMPLAINT_ERROR); } } /** * 更新交易投诉 * * @param orderComplainVO 交易投诉信息 * @return 更新结果 */ @Override public boolean updateOrderComplain(OrderComplaintVO orderComplainVO) { OperationalJudgment.judgment(this.checkOrderComplainExist(orderComplainVO.getId())); return this.updateById(orderComplainVO); } /** * 修改交易投诉状态 * * @param operationParam 操作参数 * @return 修改的交易投诉 */ @Override public OrderComplaint updateOrderComplainByStatus(OrderComplaintOperationParams operationParam) { OrderComplaint orderComplaint = OperationalJudgment.judgment(this.checkOrderComplainExist(operationParam.getComplainId())); this.checkOperationParams(operationParam, orderComplaint); orderComplaint.setComplainStatus(operationParam.getComplainStatus()); this.updateById(orderComplaint); return orderComplaint; } @Override public long waitComplainNum() { QueryWrapper queryWrapper = Wrappers.query(); queryWrapper.ne("complain_status", ComplaintStatusEnum.COMPLETE.name()); queryWrapper.eq(CharSequenceUtil.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), "store_id", UserContext.getCurrentUser().getStoreId()); return this.count(queryWrapper); } @Override public boolean cancel(String id) { OrderComplaint orderComplaint = OperationalJudgment.judgment(this.getById(id)); //如果以及仲裁,则不可以进行申诉取消 if (orderComplaint.getComplainStatus().equals(ComplaintStatusEnum.COMPLETE.name())) { throw new ServiceException(ResultCode.COMPLAINT_CANCEL_ERROR); } LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); lambdaUpdateWrapper.eq(OrderComplaint::getId, id); lambdaUpdateWrapper.set(OrderComplaint::getComplainStatus, ComplaintStatusEnum.CANCEL.name()); return this.update(lambdaUpdateWrapper); } @Override public boolean appeal(StoreAppealVO storeAppealVO) { //获取投诉信息 OrderComplaint orderComplaint = OperationalJudgment.judgment(this.checkOrderComplainExist(storeAppealVO.getOrderComplaintId())); orderComplaint.setAppealContent(storeAppealVO.getAppealContent()); orderComplaint.setAppealImages(storeAppealVO.getAppealImages()); orderComplaint.setAppealTime(new Date()); orderComplaint.setComplainStatus(ComplaintStatusEnum.WAIT_ARBITRATION.name()); this.updateById(orderComplaint); return true; } private OrderComplaint checkOrderComplainExist(String id) { OrderComplaint orderComplaint = this.getById(id); if (orderComplaint == null) { throw new ServiceException(ResultCode.COMPLAINT_NOT_EXIT); } return orderComplaint; } private void checkOperationParams(OrderComplaintOperationParams operationParam, OrderComplaint orderComplaint) { ComplaintStatusEnum complaintStatusEnum = ComplaintStatusEnum.valueOf(operationParam.getComplainStatus()); if (complaintStatusEnum == ComplaintStatusEnum.COMPLETE) { if (CharSequenceUtil.isEmpty(operationParam.getArbitrationResult())) { throw new ServiceException(ResultCode.COMPLAINT_ARBITRATION_RESULT_ERROR); } orderComplaint.setArbitrationResult(operationParam.getArbitrationResult()); } } }