| | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.core.constant.SecurityConstants; |
| | | import com.ruoyi.common.core.enums.AuditStatusEnum; |
| | | import com.ruoyi.common.core.enums.OrderStatusEnum; |
| | | import com.ruoyi.common.core.enums.PaymentMethodEnum; |
| | | import com.ruoyi.common.core.enums.RequestTypeEnum; |
| | | import com.ruoyi.common.core.enums.ReturnRequestStatusEnum; |
| | | import com.ruoyi.common.core.exception.ServiceException; |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | import com.ruoyi.common.core.utils.page.BeanUtils; |
| | | import com.ruoyi.common.core.utils.page.PageDTO; |
| | | import com.ruoyi.order.controller.management.dto.MgtOrderReturnRequestQuery; |
| | | import com.ruoyi.order.controller.management.dto.MgtReturnRequestAuditDTO; |
| | | import com.ruoyi.order.controller.management.vo.MgtOrderReturnRequestVO; |
| | | import com.ruoyi.order.domain.OrderReturnRequest; |
| | | import com.ruoyi.order.domain.Paylog; |
| | | import com.ruoyi.order.mapper.OrderMapper; |
| | | import com.ruoyi.order.mapper.OrderReturnRequestMapper; |
| | | import com.ruoyi.order.service.IOrderReturnRequestService; |
| | | import com.ruoyi.order.util.SinataUtil; |
| | | import com.ruoyi.system.api.domain.CustomConfig; |
| | | import com.ruoyi.system.api.domain.GoodsCategory; |
| | | import com.ruoyi.system.api.domain.Member; |
| | | import com.ruoyi.system.api.domain.Order; |
| | | import com.ruoyi.system.api.domain.dto.LogisticsDTO; |
| | | import com.ruoyi.system.api.domain.dto.MemberDTO; |
| | | import com.ruoyi.system.api.domain.dto.OrderReturnDTO; |
| | | import com.ruoyi.system.api.domain.vo.Express100VO; |
| | | import com.ruoyi.system.api.domain.vo.OrderReturnVO; |
| | | import com.ruoyi.system.api.feignClient.MemberClient; |
| | | import com.ruoyi.system.api.feignClient.SysUserClient; |
| | | import com.ruoyi.system.api.util.HuaWeiOBSUtil; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.io.IOException; |
| | | import java.time.LocalDateTime; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | import java.util.function.Function; |
| | | import java.util.regex.Matcher; |
| | | import java.util.regex.Pattern; |
| | | import java.util.stream.Collectors; |
| | | import javax.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | |
| | | @Resource |
| | | private OrderMapper orderMapper; |
| | | |
| | | @Resource |
| | | private MemberClient memberClient; |
| | | @Resource |
| | | private LogisticsServiceImpl logisticsService; |
| | | @Resource |
| | | private PaylogServiceImpl paylogService; |
| | | @Override |
| | | public void saveOrderReturnRequest(OrderReturnDTO OrderReturnDTO) { |
| | | |
| | |
| | | OrderReturnVO orderReturnVO = BeanUtils.copyBean(one, OrderReturnVO.class); |
| | | return orderReturnVO; |
| | | } |
| | | |
| | | /** |
| | | * 获取售后管理列表分页数据 |
| | | * |
| | | * @param query 售后管理查询对象 |
| | | * @return PageDTO<MgtOrderReturnRequestVO> |
| | | */ |
| | | @Override |
| | | public PageDTO<MgtOrderReturnRequestVO> getOrderReturnRequestPage( |
| | | MgtOrderReturnRequestQuery query) { |
| | | Set<Long> memberIdSet; |
| | | Page<MgtOrderReturnRequestVO> page = new Page<>(query.getPageCurr(), query.getPageSize()); |
| | | if (StringUtils.isNotBlank(query.getNickname()) || StringUtils.isNotBlank( |
| | | query.getPhone())) { |
| | | MemberDTO memberDTO = new MemberDTO(); |
| | | memberDTO.setNickname(query.getNickname()); |
| | | memberDTO.setPhone(query.getPhone()); |
| | | List<Member> memberList = memberClient.getMemberListByCondition(memberDTO, |
| | | SecurityConstants.INNER).getData(); |
| | | if (StringUtils.isEmpty(memberList)) { |
| | | return PageDTO.empty(page); |
| | | } |
| | | memberIdSet = memberList.stream().map(Member::getId) |
| | | .collect(Collectors.toSet()); |
| | | } |
| | | page = baseMapper.getOrderReturnRequestPage(page, query); |
| | | if (StringUtils.isEmpty(page.getRecords())) { |
| | | return PageDTO.empty(page); |
| | | } |
| | | Set<Long> memIdSet = page.getRecords().stream().map(MgtOrderReturnRequestVO::getMemberId) |
| | | .collect(Collectors.toSet()); |
| | | List<Member> members = memberClient.getMemberListByIds(memIdSet, SecurityConstants.INNER) |
| | | .getData(); |
| | | Map<Long, Member> memberMap = members.stream() |
| | | .collect(Collectors.toMap(Member::getId, Function.identity())); |
| | | page.getRecords().forEach(item -> { |
| | | Member member = memberMap.get(item.getMemberId()); |
| | | if (StringUtils.isNotNull(member)) { |
| | | item.setNickname(member.getNickname()); |
| | | item.setPhone(member.getPhone()); |
| | | } |
| | | }); |
| | | return PageDTO.of(page); |
| | | } |
| | | |
| | | /** |
| | | * 查看详情 |
| | | * |
| | | * @param id 售后id |
| | | * @return MgtOrderReturnRequestVO |
| | | */ |
| | | @Override |
| | | public MgtOrderReturnRequestVO getOrderReturnRequestDetail(Long id) { |
| | | MgtOrderReturnRequestVO returnRequestVO = baseMapper.getOrderReturnRequestDetail(id); |
| | | // 远程调用member服务,获取会员信息 |
| | | Member member = memberClient.getMembeOne(returnRequestVO.getMemberId(), |
| | | SecurityConstants.INNER).getData(); |
| | | if (StringUtils.isNotNull(member)) { |
| | | returnRequestVO.setNickname(member.getNickname()); |
| | | returnRequestVO.setPhone(member.getPhone()); |
| | | } |
| | | if (returnRequestVO.getRequestType() == RequestTypeEnum.REFUNDS_AND_RETURNS |
| | | && returnRequestVO.getStatus() |
| | | == ReturnRequestStatusEnum.TO_BE_RECEIVED_BY_THE_PLATFORM |
| | | && returnRequestVO.getAuditStatus() == AuditStatusEnum.PASSED) { |
| | | LogisticsDTO logisticsDTO = new LogisticsDTO(); |
| | | logisticsDTO.setCompany(returnRequestVO.getLogisticsNum()); |
| | | logisticsDTO.setPostid(returnRequestVO.getCourierNumber()); |
| | | Express100VO logisticsList = logisticsService.getLogisticsList(logisticsDTO); |
| | | if (StringUtils.isNotNull(logisticsList)) { |
| | | returnRequestVO.setExpress100VO(logisticsList); |
| | | } |
| | | } |
| | | return returnRequestVO; |
| | | } |
| | | |
| | | /** |
| | | * 审核 |
| | | * |
| | | * @param dto 管理后台-售后审核传输对象 |
| | | */ |
| | | @Override |
| | | public void auditReturnRequest(MgtReturnRequestAuditDTO dto) { |
| | | OrderReturnRequest orderReturnRequest = getOrderReturnRequest(dto.getId()); |
| | | if (orderReturnRequest.getAuditStatus() != AuditStatusEnum.TO_BE_REVIEWED) { |
| | | throw new ServiceException("该售后已被审核"); |
| | | } |
| | | if (dto.getAuditStatus() == AuditStatusEnum.PASSED) { |
| | | orderReturnRequest.setStatus(ReturnRequestStatusEnum.TO_BE_RETURNED); |
| | | orderReturnRequest.setAuditStatus(AuditStatusEnum.PASSED); |
| | | } else { |
| | | orderReturnRequest.setStatus(ReturnRequestStatusEnum.REJECTED); |
| | | orderReturnRequest.setAuditStatus(AuditStatusEnum.REJECTED); |
| | | orderReturnRequest.setRefuseReason(dto.getRefuseComment()); |
| | | } |
| | | this.updateById(orderReturnRequest); |
| | | } |
| | | |
| | | private OrderReturnRequest getOrderReturnRequest(Long id) { |
| | | OrderReturnRequest orderReturnRequest = this.getById(id); |
| | | if (StringUtils.isNull(orderReturnRequest)) { |
| | | throw new ServiceException("售后不存在"); |
| | | } |
| | | return orderReturnRequest; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void confirmReturnRequest(Long id) { |
| | | OrderReturnRequest orderReturnRequest = getOrderReturnRequest(id); |
| | | if (orderReturnRequest.getStatus() |
| | | != ReturnRequestStatusEnum.TO_BE_RECEIVED_BY_THE_PLATFORM |
| | | || orderReturnRequest.getAuditStatus() != AuditStatusEnum.PASSED) { |
| | | throw new ServiceException("该售后状态不允许确认收货"); |
| | | } |
| | | orderReturnRequest.setStatus(ReturnRequestStatusEnum.COMPLETED); |
| | | orderReturnRequest.setPlatformReceiptTime(LocalDateTime.now()); |
| | | this.updateById(orderReturnRequest); |
| | | // 退款 |
| | | Order order = orderMapper.selectById(orderReturnRequest.getOrderId()); |
| | | |
| | | if (StringUtils.isNull(order)) { |
| | | throw new ServiceException("订单不存在"); |
| | | } |
| | | String orderNo = order.getOrderNo(); |
| | | Paylog paylog = paylogService.lambdaQuery().eq(Paylog::getOutTradeNo, orderNo) |
| | | .last("limit 1").one(); |
| | | PaymentMethodEnum paymentMethod = order.getPaymentMethod(); |
| | | if (StringUtils.isNotNull(paylog)) { |
| | | boolean result = handleRefund(paymentMethod, paylog, orderNo); |
| | | if (result) { |
| | | paylog.setState(3);// 已退款 |
| | | order.setOrderStatus(OrderStatusEnum.REFUNDED); |
| | | paylogService.updateById(paylog); |
| | | orderMapper.updateById(order); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private boolean handleRefund(PaymentMethodEnum paymentMethod, Paylog paylog, String orderNo) { |
| | | boolean result = false; |
| | | if (paymentMethod == PaymentMethodEnum.WECHAT) { |
| | | String refundMoney = SinataUtil.doubleRetainTwo(paylog.getPayMoney() * 100D); |
| | | int refundFee = Integer.parseInt( |
| | | refundMoney.substring(0, refundMoney.length() - 3)); |
| | | String money = SinataUtil.doubleRetainTwo(paylog.getPayMoney() * 100D); |
| | | Integer totalFee = Integer.parseInt(money.substring(0, money.length() - 3)); |
| | | String regEx = "[^0-9]"; |
| | | Pattern p = Pattern.compile(regEx); |
| | | Matcher m = p.matcher(orderNo); |
| | | String ma = m.replaceAll("").trim(); |
| | | result = paylogService.refundForWxpay(2, paylog.getTradeNo(), |
| | | paylog.getOutTradeNo(), "R" + ma, totalFee, refundFee, "4"); |
| | | } else if (paymentMethod == PaymentMethodEnum.ALIPAY) { |
| | | result = paylogService.refundForAlipay(paylog.getOutTradeNo(), paylog.getTradeNo(), |
| | | paylog.getPayMoney()); |
| | | } |
| | | return result; |
| | | } |
| | | } |