ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/Order.java
@@ -149,5 +149,7 @@ @ApiModelProperty(value = "实际商品价格") private BigDecimal sjPrice; @ApiModelProperty("拍卖会id") private Long auctionSalesroomId; } ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/OrderTypeEnum.java
New file @@ -0,0 +1,39 @@ package com.ruoyi.common.core.enums; import com.baomidou.mybatisplus.annotation.EnumValue; import com.fasterxml.jackson.annotation.JsonValue; import lombok.AllArgsConstructor; import lombok.Getter; @Getter @AllArgsConstructor public enum OrderTypeEnum { /* 拍卖类型 1=商城订单 1=拍卖订单*/ MALL_ODER(1, "商城订单"), AUCTION_ORDER(2, "拍卖订单"); @EnumValue private final int code; @JsonValue private final String desc; /** * 通过code获取枚举 * * @param code * @return */ public static OrderTypeEnum fromCode(Integer code) { OrderTypeEnum[] resultTypes = OrderTypeEnum.values(); for (OrderTypeEnum resultType : resultTypes) { if (code.equals(resultType.getCode())) { return resultType; } } return null; } } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/MgtOrderController.java
@@ -3,8 +3,8 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.order.controller.management.dto.MgtMallOrderQuery; import com.ruoyi.order.controller.management.dto.MgtOrderConfirmShipmentDTO; import com.ruoyi.order.controller.management.dto.MgtOrderQuery; import com.ruoyi.order.controller.management.vo.MgtOrderVO; import com.ruoyi.order.service.IOrderService; import io.swagger.annotations.Api; @@ -48,7 +48,7 @@ @ApiOperation("订单分页列表") @PostMapping("/page") public R<PageDTO<MgtOrderVO>> getOrderPage( @Validated @RequestBody MgtMallOrderQuery query) { @Validated @RequestBody MgtOrderQuery query) { return R.ok(orderService.getOrderPage(query)); } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/MgtOrderReturnRequestController.java
@@ -1,8 +1,21 @@ package com.ruoyi.order.controller.management; import com.ruoyi.common.core.domain.R; 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.service.IOrderReturnRequestService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -20,4 +33,51 @@ @Api(tags = {"管理后台-售后管理相关接口"}, value = "管理后台-售后管理相关接口") public class MgtOrderReturnRequestController { private final IOrderReturnRequestService orderReturnRequestService; /** * 获取售后管理列表分页数据 * * @param query 售后管理查询对象 * @return PageDTO<MgtOrderReturnRequestVO> */ @ApiOperation("获取售后管理列表分页数据") @PostMapping("/page") public R<PageDTO<MgtOrderReturnRequestVO>> getOrderReturnRequestPage( @Validated @RequestBody MgtOrderReturnRequestQuery query) { return R.ok(orderReturnRequestService.getOrderReturnRequestPage(query)); } /** * 查看详情 * * @param id 售后id * @return MgtOrderReturnRequestVO */ @ApiOperation("查看详情") @PostMapping("/detail/{id}") public R<MgtOrderReturnRequestVO> getOrderReturnRequestDetail( @ApiParam(name = "id", value = "售后id", required = true) @PathVariable("id") Long id) { return R.ok(orderReturnRequestService.getOrderReturnRequestDetail(id)); } /** * 审核 * * @param dto 管理后台-售后审核传输对象 */ @ApiOperation("审核") @PutMapping("/audit") public R<?> auditReturnRequest(@Validated @RequestBody MgtReturnRequestAuditDTO dto) { orderReturnRequestService.auditReturnRequest(dto); return R.ok(); } @ApiOperation("确认收货") @PutMapping("/confirm/{id}") public R<?> confirmReturnRequest( @ApiParam(name = "id", value = "售后id", required = true) @PathVariable("id") Long id) { orderReturnRequestService.confirmReturnRequest(id); return R.ok(); } } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/dto/MgtOrderQuery.java
File was renamed from ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/dto/MgtMallOrderQuery.java @@ -2,9 +2,11 @@ import com.ruoyi.common.core.enums.OrderFromEnum; import com.ruoyi.common.core.enums.OrderStatusEnum; import com.ruoyi.common.core.enums.OrderTypeEnum; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import javax.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; @@ -14,8 +16,8 @@ */ @Data @EqualsAndHashCode(callSuper = true) @ApiModel(value = "商城订单查询对象") public class MgtMallOrderQuery extends BasePage { @ApiModel(value = "订单查询对象") public class MgtOrderQuery extends BasePage { private static final long serialVersionUID = 7466073766154410614L; @@ -36,4 +38,8 @@ @ApiModelProperty(value = "订单状态 1=待支付 2=待发货 3=待收货 4=已完成 5=已取消,6 售后") private OrderStatusEnum orderStatus; @ApiModelProperty(value = "订单类型 1=商城订单 2=拍卖订单") @NotNull(message = "订单类型不能为空") private OrderTypeEnum queryType; } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/dto/MgtOrderReturnRequestQuery.java
New file @@ -0,0 +1,49 @@ package com.ruoyi.order.controller.management.dto; import com.ruoyi.common.core.enums.AuditStatusEnum; import com.ruoyi.common.core.enums.OrderTypeEnum; import com.ruoyi.common.core.enums.RequestTypeEnum; import com.ruoyi.common.core.enums.ReturnRequestStatusEnum; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.util.Set; import lombok.Data; import lombok.EqualsAndHashCode; /** * @author mitao * @date 2024/6/15 */ @Data @EqualsAndHashCode(callSuper = true) @ApiModel(value = "售后管理查询对象") public class MgtOrderReturnRequestQuery extends BasePage { private static final long serialVersionUID = -2488762912713305360L; @ApiModelProperty(value = "订单编号") private String orderNo; @ApiModelProperty(value = "售后类型 1=退款 2=退款退货") private RequestTypeEnum requestType; @ApiModelProperty(value = "会员姓名") private String nickname; @ApiModelProperty("联系方式") private String phone; @ApiModelProperty(value = "售后状态 1=待审核 2=待退货 3=待平台收货 4=已完成 5=已拒绝") private ReturnRequestStatusEnum status; @ApiModelProperty(value = "审核状态 1=待审核 2=已通过 3=已拒绝") private AuditStatusEnum auditStatus; @ApiModelProperty(value = "订单类型 1=商城订单 2=拍卖订单") private OrderTypeEnum orderType; @ApiModelProperty(value = "会员id列表", hidden = true) private Set<Long> memberIdSet; } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/dto/MgtReturnRequestAuditDTO.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.order.controller.management.dto; import com.ruoyi.common.core.enums.AuditStatusEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import javax.validation.constraints.NotNull; import lombok.Data; @Data @ApiModel(value = "管理后台-售后审核传输对象", description = "管理后台-售后审核传输对象") public class MgtReturnRequestAuditDTO implements Serializable { private static final long serialVersionUID = -8029337933255222034L; @ApiModelProperty(value = "售后id") @NotNull(message = "售后id不能为空") private Long id; @ApiModelProperty(value = "审核状态 已通过 已拒绝") @NotNull(message = "审核状态不能为空") private AuditStatusEnum auditStatus; @ApiModelProperty(value = "拒绝原因") private String refuseComment; } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/vo/MgtOrderReturnRequestVO.java
@@ -1,11 +1,16 @@ package com.ruoyi.order.controller.management.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.enums.AuditStatusEnum; import com.ruoyi.common.core.enums.OrderTypeEnum; import com.ruoyi.common.core.enums.PaymentMethodEnum; import com.ruoyi.common.core.enums.RequestTypeEnum; import com.ruoyi.common.core.enums.ReturnRequestStatusEnum; import com.ruoyi.system.api.domain.vo.Express100VO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import lombok.Data; @@ -58,6 +63,50 @@ @ApiModelProperty(value = "备注") private String remark; @ApiModelProperty(value = "快递单号") @ApiModelProperty(value = "退货快递单号") private String courierNumber; @ApiModelProperty(value = "订单编号") private String orderNo; @ApiModelProperty(value = "下单时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime orderTime; @ApiModelProperty(value = "会员姓名") private Long memberId; @ApiModelProperty(value = "会员姓名") private String nickname; @ApiModelProperty("联系方式") private String phone; @ApiModelProperty(value = "支付时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime payTime; @ApiModelProperty(value = "支付方式 1=微信 2=支付宝") private PaymentMethodEnum paymentMethod; @ApiModelProperty(value = "商品价格") private BigDecimal price; @ApiModelProperty(value = "积分") private Integer points; @ApiModelProperty(value = "支付合计") private BigDecimal totalAmount; @ApiModelProperty(value = "优惠金额") private BigDecimal discountMoney; @ApiModelProperty(value = "订单类型 1=商城订单 2=拍卖订单") private OrderTypeEnum orderType; @ApiModelProperty("发货快递") private String logisticsNum; @ApiModelProperty("物流信息") private Express100VO express100VO; } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/vo/MgtOrderVO.java
@@ -40,6 +40,9 @@ @ApiModelProperty(value = "所属拍卖场") private String salesroomName; @ApiModelProperty("拍卖会id") private Long auctionSalesroomId; @ApiModelProperty(value = "保证金") private BigDecimal bound; ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/OrderReturnRequest.java
@@ -97,5 +97,6 @@ @ApiModelProperty(value = "快递单号") private String courierNumber; @ApiModelProperty(value = "物流编码") private String logisticsNum; } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/OrderReturnRequestMapper.java
@@ -1,7 +1,11 @@ package com.ruoyi.order.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.order.controller.management.dto.MgtOrderReturnRequestQuery; import com.ruoyi.order.controller.management.vo.MgtOrderReturnRequestVO; import com.ruoyi.order.domain.OrderReturnRequest; import org.apache.ibatis.annotations.Param; /** * <p> @@ -13,4 +17,9 @@ */ public interface OrderReturnRequestMapper extends BaseMapper<OrderReturnRequest> { Page<MgtOrderReturnRequestVO> getOrderReturnRequestPage( @Param("page") Page<MgtOrderReturnRequestVO> page, @Param("query") MgtOrderReturnRequestQuery query); MgtOrderReturnRequestVO getOrderReturnRequestDetail(Long id); } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderReturnRequestService.java
@@ -1,6 +1,10 @@ package com.ruoyi.order.service; import com.baomidou.mybatisplus.extension.service.IService; 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.system.api.domain.dto.OrderReturnDTO; import com.ruoyi.system.api.domain.vo.OrderReturnVO; @@ -21,5 +25,28 @@ OrderReturnVO OrderReturnRequestInfo(@RequestBody OrderReturnDTO OrderReturnDTO); /** * 获取售后管理列表分页数据 * * @param query 售后管理查询对象 * @return PageDTO<MgtOrderReturnRequestVO> */ PageDTO<MgtOrderReturnRequestVO> getOrderReturnRequestPage(MgtOrderReturnRequestQuery query); /** * 查看详情 * * @param id 售后id * @return MgtOrderReturnRequestVO */ MgtOrderReturnRequestVO getOrderReturnRequestDetail(Long id); /** * 审核 * * @param dto 管理后台-售后审核传输对象 */ void auditReturnRequest(MgtReturnRequestAuditDTO dto); void confirmReturnRequest(Long id); } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderService.java
@@ -2,8 +2,8 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.order.controller.management.dto.MgtMallOrderQuery; import com.ruoyi.order.controller.management.dto.MgtOrderConfirmShipmentDTO; import com.ruoyi.order.controller.management.dto.MgtOrderQuery; import com.ruoyi.order.controller.management.vo.MgtOrderVO; import com.ruoyi.system.api.domain.Order; import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO; @@ -81,7 +81,7 @@ * @param query 商城订单查询对象 * @return PageDTO<MgtMallOrderVO> */ PageDTO<MgtOrderVO> getOrderPage(MgtMallOrderQuery query); PageDTO<MgtOrderVO> getOrderPage(MgtOrderQuery query); /** * 获取商城订单详情 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,162 @@ 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); 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; } } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -12,6 +12,7 @@ import com.ruoyi.common.core.enums.BondStatusEnum; import com.ruoyi.common.core.enums.OrderFromEnum; import com.ruoyi.common.core.enums.OrderStatusEnum; import com.ruoyi.common.core.enums.OrderTypeEnum; import com.ruoyi.common.core.enums.PaymentMethodEnum; import com.ruoyi.common.core.enums.RequestTypeEnum; import com.ruoyi.common.core.enums.ReturnRequestStatusEnum; @@ -20,8 +21,8 @@ import com.ruoyi.common.core.utils.page.BeanUtils; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.order.controller.management.dto.MgtMallOrderQuery; import com.ruoyi.order.controller.management.dto.MgtOrderConfirmShipmentDTO; import com.ruoyi.order.controller.management.dto.MgtOrderQuery; import com.ruoyi.order.controller.management.vo.MgtOrderReturnRequestVO; import com.ruoyi.order.controller.management.vo.MgtOrderVO; import com.ruoyi.order.domain.OrderReturnRequest; @@ -74,10 +75,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import javax.annotation.Resource; import lombok.Synchronized; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.stereotype.Service; @@ -759,7 +757,7 @@ * @return PageDTO<MgtMallOrderVO> */ @Override public PageDTO<MgtOrderVO> getOrderPage(MgtMallOrderQuery query) { public PageDTO<MgtOrderVO> getOrderPage(MgtOrderQuery query) { PageDTO<MgtOrderVO> pageVO; // 封装会员条件查询对象 MemberDTO memberDTO = null; @@ -783,9 +781,15 @@ } page = this.lambdaQuery() .in(StringUtils.isNotEmpty(memberIdSet), Order::getMemberId, memberIdSet) .ne(query.getQueryType().equals(OrderTypeEnum.MALL_ODER), Order::getOrderFrom, OrderFromEnum.AUCTION_ORDERS) .eq(query.getQueryType().equals(OrderTypeEnum.AUCTION_ORDER), Order::getOrderFrom, OrderFromEnum.AUCTION_ORDERS) .like(StringUtils.isNotBlank(query.getOrderNo()), Order::getOrderNo, query.getOrderNo()) .eq(StringUtils.isNotNull(query.getOrderFrom()), Order::getOrderFrom, .eq(StringUtils.isNotNull(query.getOrderFrom()) && query.getQueryType() .equals(OrderTypeEnum.MALL_ODER), Order::getOrderFrom, query.getOrderFrom()) .like(StringUtils.isNotBlank(query.getSkuName()), Order::getSkuName, query.getSkuName()) @@ -798,12 +802,30 @@ pageVO = PageDTO.of(page, MgtOrderVO.class); if (query.getOrderFrom() == OrderFromEnum.AUCTION_ORDERS) { List<MgtOrderVO> list = pageVO.getList(); // 封装参数查询拍卖会 Set<Long> auctionSalesroomGoodsIdSet = list.stream() .filter(order -> order.getAuctionType() == AuctionOrderTypeEnum.AUCTION_ITEMS) .map(MgtOrderVO::getGoodsSkuId).collect(Collectors.toSet()); List<AuctionSalesroom> auctionSalesroomList = auctionClient.getAuctionSalesroomByIds( auctionSalesroomGoodsIdSet, SecurityConstants.INNER) .getData(); Map<Long, String> salesroomMap = auctionSalesroomList.stream() .collect(Collectors.toMap(AuctionSalesroom::getId, AuctionSalesroom::getSalesroomName)); // 封装参数查询拍卖订单保证金 Set<Long> orderIdSet = list.stream().map(MgtOrderVO::getId) Set<Long> auctionGoodsIdSet = list.stream() .filter(order -> order.getAuctionType() == AuctionOrderTypeEnum.REGULAR_ITEMS) .map(MgtOrderVO::getGoodsSkuId) .collect(Collectors.toSet()); Set<Long> auctionSalesroomSet = auctionSalesroomList.stream() .map(AuctionSalesroom::getId) .collect(Collectors.toSet()); List<OrderAuctionBond> auctionBondList = orderAuctionBondMapper.selectList( Wrappers.lambdaQuery(OrderAuctionBond.class) .in(OrderAuctionBond::getOrderId, orderIdSet) .in(OrderAuctionBond::getAuctionGoodsId, auctionGoodsIdSet) .in(OrderAuctionBond::getAuctionSalesroomId, auctionSalesroomSet) .eq(OrderAuctionBond::getBoundStatus, BondStatusEnum.PAID)); Map<String, OrderAuctionBond> auctionSalesroomBondMap = auctionBondList.stream() @@ -816,27 +838,18 @@ .collect(Collectors.toMap( bond -> bond.getAuctionGoodsId() + "-" + bond.getMemberId(), Function.identity())); // 封装参数查询拍卖会 Set<Long> auctionSalesroomGoodsIdSet = list.stream() .filter(order -> order.getAuctionType() == AuctionOrderTypeEnum.AUCTION_ITEMS) .map(MgtOrderVO::getGoodsSkuId).collect(Collectors.toSet()); List<AuctionSalesroom> auctionSalesroomList = auctionClient.getAuctionSalesroomByIds( auctionSalesroomGoodsIdSet, SecurityConstants.INNER) .getData(); Map<Long, String> salesroomMap = auctionSalesroomList.stream() .collect(Collectors.toMap(AuctionSalesroom::getId, AuctionSalesroom::getSalesroomName)); list.forEach(order -> { if (order.getAuctionType() == AuctionOrderTypeEnum.AUCTION_ITEMS) { order.setSalesroomName( StringUtils.isNotBlank(salesroomMap.get(order.getGoodsSkuId())) ? salesroomMap.get(order.getGoodsSkuId()) : "无"); ? salesroomMap.get(order.getAuctionSalesroomId()) : "无"); order.setBoundStatus( StringUtils.isNotNull(auctionSalesroomBondMap.get( order.getGoodsSkuId() + "-" + order.getMemberId()) order.getAuctionSalesroomId() + "-" + order.getMemberId()) .getBoundStatus()) ? auctionSalesroomBondMap.get( order.getGoodsSkuId() + "-" + order.getMemberId()) order.getAuctionSalesroomId() + "-" + order.getMemberId()) .getBoundStatus() : null); } @@ -1044,12 +1057,30 @@ @Override public void refundBond(Long id) { Order order = getOrder(id); OrderAuctionBond orderAuctionBond = orderAuctionBondMapper.selectOne( Wrappers.lambdaQuery(OrderAuctionBond.class) .eq(OrderAuctionBond::getOrderId, id)); OrderAuctionBond orderAuctionBond; if (order.getAuctionType() == AuctionOrderTypeEnum.AUCTION_ITEMS) { orderAuctionBond = orderAuctionBondMapper.selectOne( Wrappers.lambdaQuery(OrderAuctionBond.class) .eq(OrderAuctionBond::getAuctionSalesroomId, order.getAuctionSalesroomId()) .eq(OrderAuctionBond::getBoundStatus, BondStatusEnum.PAID)); if (StringUtils.isNotNull(orderAuctionBond) && orderAuctionBond.getBoundStatus() == BondStatusEnum.REFUNDED) { throw new ServiceException("改拍卖会已退保证金"); } } else { orderAuctionBond = orderAuctionBondMapper.selectOne( Wrappers.lambdaQuery(OrderAuctionBond.class) .eq(OrderAuctionBond::getAuctionGoodsId, order.getGoodsSkuId()) .eq(OrderAuctionBond::getBoundStatus, BondStatusEnum.PAID)); } Paylog paylog = iPaylogService.lambdaQuery() .eq(Paylog::getOutTradeNo, orderAuctionBond.getOrderNo()) .last("limit 1").one(); if (StringUtils.isNull(paylog)) { throw new ServiceException("支付记录不存在"); } PaymentMethodEnum paymentMethod = orderAuctionBond.getPaymentMethod(); if (orderAuctionBond.getBoundStatus() == BondStatusEnum.PAID) { boolean result = handleRefund(paymentMethod, paylog, orderAuctionBond.getOrderNo()); ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/AgreementController.java
@@ -5,14 +5,11 @@ import com.ruoyi.system.domain.Agreement; import com.ruoyi.system.service.IAgreementService; import io.swagger.annotations.ApiOperation; import javax.annotation.Resource; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; /** * <p> @@ -24,6 +21,7 @@ */ @RestController @RequestMapping("/agreement") public class AgreementController { @Resource private IAgreementService iAgreementService; ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CustomConfigController.java
@@ -5,9 +5,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.domain.CustomConfig; import com.ruoyi.system.domain.dto.MgtAfterSaleSettingDTO; import com.ruoyi.system.domain.dto.PointsConfigDTO; import com.ruoyi.system.domain.vo.CustomConfigVO; import com.ruoyi.system.service.ICustomConfigService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import java.util.List; import javax.annotation.Resource; @@ -30,6 +32,7 @@ */ @RestController @RequestMapping("/custom-config") @Api(value = "系统配置接口", tags = "系统配置接口") public class CustomConfigController { @Resource private ICustomConfigService iCustomConfigService; @@ -87,4 +90,12 @@ iCustomConfigService.saveOrderDescription(description); return R.ok(); } @ApiOperation(value = "售后设置") @PostMapping("/save-after-sale-setting") public R<?> saveAfterSaleSetting(@Validated @RequestBody MgtAfterSaleSettingDTO dto) { iCustomConfigService.saveAfterSaleSetting(dto); return R.ok(); } } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtAfterSaleSettingDTO.java
New file @@ -0,0 +1,35 @@ package com.ruoyi.system.domain.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import lombok.Data; /** * @author mitao * @date 2024/6/15 */ @Data @ApiModel(value = "售后设置对象") public class MgtAfterSaleSettingDTO implements Serializable { private static final long serialVersionUID = 6993506291454436640L; @ApiModelProperty("退货地址-收货人姓名") @NotBlank(message = "收货人姓名不能为空") private String receiverName; @ApiModelProperty("退货地址-收货人电话") @NotBlank(message = "收货人电话不能为空") private String receiverPhone; @ApiModelProperty("退货地址-收获地址") @NotBlank(message = "收获地址不能为空") private String receiverAddress; @ApiModelProperty("售后周期") @NotNull(message = "售后周期不能为空") private Integer returnCycle; } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomConfigService.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.system.api.domain.CustomConfig; import com.ruoyi.system.domain.dto.MgtAfterSaleSettingDTO; import com.ruoyi.system.domain.dto.PointsConfigDTO; import com.ruoyi.system.domain.vo.CustomConfigVO; import java.util.List; @@ -44,4 +45,6 @@ * @param description 订单说明 */ void saveOrderDescription(String description); void saveAfterSaleSetting(MgtAfterSaleSettingDTO dto); } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomConfigServiceImpl.java
@@ -5,6 +5,7 @@ import com.ruoyi.common.core.utils.page.BeanUtils; import com.ruoyi.system.api.constants.ConfigEnum; import com.ruoyi.system.api.domain.CustomConfig; import com.ruoyi.system.domain.dto.MgtAfterSaleSettingDTO; import com.ruoyi.system.domain.dto.PointsConfigDTO; import com.ruoyi.system.domain.vo.CustomConfigVO; import com.ruoyi.system.mapper.CustomConfigMapper; @@ -109,4 +110,27 @@ orderDescription.setConfigValue(description); this.saveOrUpdate(orderDescription); } @Override @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) public void saveAfterSaleSetting(MgtAfterSaleSettingDTO dto) { handleConfigSetting(dto.getReceiverName(), ConfigEnum.RETURN_ADDRESS_USER_NAME); handleConfigSetting(dto.getReceiverPhone(), ConfigEnum.RETURN_ADDRESS_USER_PHONE); handleConfigSetting(dto.getReceiverAddress(), ConfigEnum.RETURN_ADDRESS_USER_ADDRESS); handleConfigSetting(dto.getReturnCycle().toString(), ConfigEnum.RETURN_CYCLE); } private void handleConfigSetting(String value, ConfigEnum configEnum) { Optional<CustomConfig> receiverNameConfigOptional = getCustomConfigByKey( ConfigEnum.RETURN_ADDRESS_USER_NAME.getKey()); CustomConfig receiverNameConfig = receiverNameConfigOptional.orElseGet(() -> { CustomConfig config = new CustomConfig(); config.setConfigKey(ConfigEnum.RETURN_ADDRESS_USER_NAME.getKey()); config.setConfigType(ConfigEnum.RETURN_ADDRESS_USER_NAME.getKeyType()); config.setConfigName(ConfigEnum.RETURN_ADDRESS_USER_NAME.getKeyName()); return config; }); receiverNameConfig.setConfigValue(value); this.saveOrUpdate(receiverNameConfig); } }