From 2427b05aeca08ee3c4998843bf749d35440d461b Mon Sep 17 00:00:00 2001 From: rentaiming <806181662@qq.com> Date: 星期六, 15 六月 2024 21:33:41 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderReturnRequestServiceImpl.java | 197 +++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 191 insertions(+), 6 deletions(-) diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderReturnRequestServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderReturnRequestServiceImpl.java index 8c661f5..7954d9d 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderReturnRequestServiceImpl.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderReturnRequestServiceImpl.java @@ -2,31 +2,52 @@ 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> @@ -43,7 +64,12 @@ @Resource private OrderMapper orderMapper; - + @Resource + private MemberClient memberClient; + @Resource + private LogisticsServiceImpl logisticsService; + @Resource + private PaylogServiceImpl paylogService; @Override public void saveOrderReturnRequest(OrderReturnDTO OrderReturnDTO) { @@ -95,4 +121,163 @@ 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; + } } -- Gitblit v1.7.1