第15天 支付一半

This commit is contained in:
Y1NanPing 2025-08-06 16:37:25 +08:00
parent 314fffde91
commit 2b3cfeb61c
54 changed files with 462 additions and 65 deletions

View File

@ -61,9 +61,33 @@ public class OrderInfo extends BaseEntity {
@TableField(exist = false)
private List<OrderDerate> orderDerateList;
@TableField(exist = false)
private String orderStatusName;
@TableField(exist = false)
private String payWayName;
// @TableField(exist = false)
// private String orderStatusName;
// @TableField(exist = false)
// private String payWayName;
//更改这个实体类 我们转json的任何框架都是通过获取get方法去改的
//将get去掉获取属性名称 将get方法返回值作为属性值
public String getOrderStatusName() {
if("0901".equals(orderStatus)){
return "未支付";
} else if ("0902".equals(orderStatus)) {
return "已支付";
} else if ("0903".equals(orderStatus)) {
return "已取消";
}
return null;
}
public String getPayWayName() {
if ("1101".equals(payWay)) {
return "微信";
} else if ("1102".equals(payWay)) {
return "支付宝";
} else if ("1103".equals(payWay)) {
return "余额";
}
return "";
}
}

View File

@ -2,8 +2,11 @@ package com.atguigu.tingshu.account;
import com.atguigu.tingshu.account.impl.AccountDegradeFeignClient;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.model.account.RechargeInfo;
import com.atguigu.tingshu.vo.account.AccountDeductVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@ -24,4 +27,7 @@ public interface AccountFeignClient {
@PostMapping("/userAccount/checkAndDeduct")
public Result checkAndDeduct(@RequestBody AccountDeductVo accountDeductVo);
@GetMapping("/rechargeInfo/getRechargeInfo/{orderNo}")
public Result<RechargeInfo> getRechargeInfo(@PathVariable String orderNo);
}

View File

@ -3,6 +3,7 @@ package com.atguigu.tingshu.account.impl;
import com.atguigu.tingshu.account.AccountFeignClient;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.model.account.RechargeInfo;
import com.atguigu.tingshu.vo.account.AccountDeductVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@ -16,4 +17,10 @@ public class AccountDegradeFeignClient implements AccountFeignClient {
log.error("[账户服务]checkAndDeduct服务调用失败");
return null;
}
@Override
public Result<RechargeInfo> getRechargeInfo(String orderNo) {
log.error("[账户服务]getRechargeInfo服务调用失败");
return null;
}
}

View File

@ -9,7 +9,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
@Slf4j

View File

@ -1,7 +1,11 @@
package com.atguigu.tingshu.order.client;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.model.order.OrderInfo;
import com.atguigu.tingshu.order.client.impl.OrderDegradeFeignClient;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* <p>
@ -10,8 +14,10 @@ import org.springframework.cloud.openfeign.FeignClient;
*
* @author atguigu
*/
@FeignClient(value = "service-order", fallback = OrderDegradeFeignClient.class)
@FeignClient(value = "service-order",path = "api/order", fallback = OrderDegradeFeignClient.class)
public interface OrderFeignClient {
@GetMapping("/orderInfo/getOrderInfo/{orderNo}")
public Result<OrderInfo> getOrderInfo(@PathVariable String orderNo);
}

View File

@ -1,10 +1,19 @@
package com.atguigu.tingshu.order.client.impl;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.model.order.OrderInfo;
import com.atguigu.tingshu.order.client.OrderFeignClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class OrderDegradeFeignClient implements OrderFeignClient {
@Override
public Result<OrderInfo> getOrderInfo(String orderNo) {
log.error("[订单服务]提供远程调用方法getOrderInfo执行服务降级");
return null;
}
}

View File

@ -1,8 +1,14 @@
package com.atguigu.tingshu.account.api;
import com.atguigu.tingshu.account.service.RechargeInfoService;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.model.account.RechargeInfo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -15,5 +21,21 @@ public class RechargeInfoApiController {
@Autowired
private RechargeInfoService rechargeInfoService;
/**
* 根据充值订单编号查询充值信息
* @param orderNo
* @return
*/
@Operation(summary = "根据订单编号查询充值信息")
@GetMapping("/rechargeInfo/getRechargeInfo/{orderNo}")
public Result<RechargeInfo> getRechargeInfo(@PathVariable String orderNo){
RechargeInfo rechargeInfo = rechargeInfoService.getOne(
new LambdaQueryWrapper<RechargeInfo>()
.eq(RechargeInfo::getOrderNo, orderNo)
);
return Result.ok(rechargeInfo);
}
}

View File

@ -0,0 +1,8 @@
spring.application.name=service-canal
spring.profiles.active=dev
spring.main.allow-bean-definiton-overriding=true
spring.cloud.nacos.discovery.server-addr=192.168.200.6:8848
spring.cloud.nacos.config.server-addr=192.168.200.6:8848
spring.cloud.nacos.config.prefix=${spring.application.name}
spring.cloud.nacos.config.file-extension=yaml
spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml

View File

@ -3,16 +3,15 @@ package com.atguigu.tingshu.order.api;
import com.atguigu.tingshu.common.login.GuiGuLogin;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.model.order.OrderInfo;
import com.atguigu.tingshu.order.service.OrderInfoService;
import com.atguigu.tingshu.vo.order.OrderInfoVo;
import com.atguigu.tingshu.vo.order.TradeVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@ -48,6 +47,32 @@ public class OrderInfoApiController {
return Result.ok(result);
}
/**
* 查询订单及订单明细+优惠列表
*
* @param orderNo
* @return
*/
@Operation(summary = "查询订单及订单明细+优惠列表")
@GetMapping("/orderInfo/getOrderInfo/{orderNo}")
public Result<OrderInfo> getOrderInfo(@PathVariable String orderNo) {
OrderInfo orderInfo = orderInfoService.getOrderInfo(orderNo);
return Result.ok(orderInfo);
}
@GuiGuLogin
@Operation(summary = "分页获取当前用户订单列表")
@GetMapping("/orderInfo/findUserPage/{page}/{limit}")
public Result<Page<OrderInfo>> findUserOrderPage(@PathVariable Long page, @PathVariable Long limit){
Page<OrderInfo> pageInfo =new Page<>(page,limit);
Long userId = AuthContextHolder.getUserId();
Page<OrderInfo> pageModel =orderInfoService.findUserOrderPage(pageInfo,userId);
return Result.ok(pageModel);
}
}

View File

@ -0,0 +1,35 @@
package com.atguigu.tingshu.order.config;
import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.CustomExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class CanelOrderMqConfig {
@Bean
public Queue cancelQueue() {
// 第一个参数是创建的queue的名字第二个参数是是否支持持久化
return new Queue(MqConst.QUEUE_CANCEL_ORDER, true);
}
@Bean
public CustomExchange cancelExchange() {
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-delayed-type", "direct");
return new CustomExchange(MqConst.EXCHANGE_CANCEL_ORDER, "x-delayed-message", true, false, args);
}
@Bean
public Binding bindingCancel() {
return BindingBuilder.bind(cancelQueue()).to(cancelExchange()).with(MqConst.ROUTING_CANCEL_ORDER).noargs();
}
}

View File

@ -0,0 +1,41 @@
package com.atguigu.tingshu.order.receiver;
import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import com.atguigu.tingshu.order.service.OrderInfoService;
import com.rabbitmq.client.Channel;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author: atguigu
* @create: 2025-08-05 14:03
*/
@Slf4j
@Component
public class OrderReceiver {
@Autowired
private OrderInfoService orderInfoService;
/**
* 延迟关单监听器
*
* @param orderId
*/
@SneakyThrows
@RabbitListener(queues = MqConst.QUEUE_CANCEL_ORDER)
public void cancelOrder(Long orderId, Channel channel, Message message) {
if (orderId != null) {
log.info("[订单服务]监听到延迟关单消息:{}", orderId);
orderInfoService.cancelOrder(orderId);
}
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}
}

View File

@ -0,0 +1,11 @@
package com.atguigu.tingshu.order.service;
import com.atguigu.tingshu.model.order.OrderInfo;
public interface AccountPayBizService {
/**
* 处理账户支付业务逻辑
* @param orderInfo
*/
public void handlerAccountPay(OrderInfo orderInfo);
}

View File

@ -3,6 +3,7 @@ package com.atguigu.tingshu.order.service;
import com.atguigu.tingshu.model.order.OrderInfo;
import com.atguigu.tingshu.vo.order.OrderInfoVo;
import com.atguigu.tingshu.vo.order.TradeVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Map;
@ -15,4 +16,11 @@ public interface OrderInfoService extends IService<OrderInfo> {
Map<String, String> submitOrder(OrderInfoVo orderInfoVo, Long userId);
OrderInfo saveOrderInfo(OrderInfoVo orderInfoVo, Long userId);
OrderInfo getOrderInfo(String orderNo);
Page<OrderInfo> findUserOrderPage(Page<OrderInfo> pageInfo, Long userId);
void cancelOrder(Long orderId);
}

View File

@ -0,0 +1,81 @@
package com.atguigu.tingshu.order.service.impl;
import com.atguigu.tingshu.account.AccountFeignClient;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.execption.GuiguException;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.model.order.OrderDetail;
import com.atguigu.tingshu.model.order.OrderInfo;
import com.atguigu.tingshu.order.mapper.OrderInfoMapper;
import com.atguigu.tingshu.order.service.AccountPayBizService;
import com.atguigu.tingshu.order.service.OrderDetailService;
import com.atguigu.tingshu.user.client.UserFeignClient;
import com.atguigu.tingshu.vo.account.AccountDeductVo;
import com.atguigu.tingshu.vo.user.UserPaidRecordVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
@Service
@Slf4j
public class AccountPayBizServiceImpl implements AccountPayBizService {
@Autowired
private AccountFeignClient accountFeignClient;
@Autowired
private OrderInfoMapper orderInfoMapper;
@Autowired
private OrderDetailService orderDetailService;
@Autowired
private UserFeignClient userFeignClient;
@Override
@GlobalTransactional(rollbackFor = Exception.class)
public void handlerAccountPay(OrderInfo orderInfo) {
//余额扣减
//4.1 远程调用账户服务扣减账户余额
AccountDeductVo accountDeductVo = new AccountDeductVo();
accountDeductVo.setAmount(orderInfo.getOrderAmount());
accountDeductVo.setOrderNo(orderInfo.getOrderNo());
accountDeductVo.setContent(orderInfo.getOrderTitle());
accountDeductVo.setUserId(orderInfo.getUserId());
Result result = accountFeignClient.checkAndDeduct(accountDeductVo);
//判断是否为扣减成功
if (result.getCode().intValue() != 200) {
throw new GuiguException(result.getCode(), result.getMessage());
}
//4.2 如果扣减余额成功修改订单状态改为已支付
orderInfo.setOrderStatus(SystemConstant.ORDER_STATUS_PAID);
orderInfoMapper.updateById(orderInfo);
//4.3 远程调用用户服务虚拟物品发货
//4.3.1 构建虚拟发货VO对象
UserPaidRecordVo userPaidRecordVo = new UserPaidRecordVo();
userPaidRecordVo.setOrderNo(orderInfo.getOrderNo());
userPaidRecordVo.setUserId(orderInfo.getUserId());
userPaidRecordVo.setItemType(orderInfo.getItemType());
//根据订单编号查询订单明细获取购买项目ID列表
List<OrderDetail> orderDetailList = orderDetailService.list(
new LambdaQueryWrapper<OrderDetail>()
.eq(OrderDetail::getOrderId, orderInfo.getId())
.select(OrderDetail::getItemId)
);
List<Long> itemIdList = orderDetailList.stream()
.map(OrderDetail::getItemId).collect(Collectors.toList());
userPaidRecordVo.setItemIdList(itemIdList);
//4.3.2 远程调用用户服务,发放用户权益
result = userFeignClient.savePaidRecord(userPaidRecordVo);
//4.3.3 判断远程调用结果业务状态码是否为200
if (result.getCode().intValue() != 200) {
throw new GuiguException(result.getCode(), result.getMessage());
}
}
}

View File

@ -3,25 +3,23 @@ package com.atguigu.tingshu.order.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import com.atguigu.tingshu.account.AccountFeignClient;
import com.atguigu.tingshu.album.AlbumFeignClient;
import com.atguigu.tingshu.common.constant.RedisConstant;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.execption.GuiguException;
import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import com.atguigu.tingshu.common.rabbit.service.RabbitService;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.TrackInfo;
import com.atguigu.tingshu.model.order.OrderDerate;
import com.atguigu.tingshu.model.order.OrderDetail;
import com.atguigu.tingshu.model.order.OrderInfo;
import com.atguigu.tingshu.model.user.VipServiceConfig;
import com.atguigu.tingshu.order.helper.SignHelper;
import com.atguigu.tingshu.order.mapper.OrderInfoMapper;
import com.atguigu.tingshu.order.pattern.TradeTypeStrategy;
import com.atguigu.tingshu.order.pattern.factory.TradeTypeStrategyFactory;
import com.atguigu.tingshu.order.service.AccountPayBizService;
import com.atguigu.tingshu.order.service.OrderDerateService;
import com.atguigu.tingshu.order.service.OrderDetailService;
import com.atguigu.tingshu.order.service.OrderInfoService;
@ -31,21 +29,20 @@ import com.atguigu.tingshu.vo.order.OrderDerateVo;
import com.atguigu.tingshu.vo.order.OrderDetailVo;
import com.atguigu.tingshu.vo.order.OrderInfoVo;
import com.atguigu.tingshu.vo.order.TradeVo;
import com.atguigu.tingshu.vo.user.UserInfoVo;
import com.atguigu.tingshu.vo.user.UserPaidRecordVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Slf4j
@ -69,6 +66,12 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
private AccountFeignClient accountFeignClient;
@Autowired
private TradeTypeStrategyFactory tradeTypeStrategyFactory;
@Autowired
private AccountPayBizService accountPayBizService;
@Value("${order.cancel}")
private int ttl;
@Autowired
private RabbitService rabbitService;
@Override
@ -116,57 +119,21 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
OrderInfo orderInfo = this.saveOrderInfo(orderInfoVo, userId);
//支付方式1101-微信 1102-支付宝 1103-账户余额
String payWay = orderInfoVo.getPayWay();
//4.TODO 判断支付方式余额扣减核心业务
//4. 判断支付方式余额扣减核心业务
if (SystemConstant.ORDER_PAY_ACCOUNT.equals(payWay)) {
//余额扣减
//4.1 远程调用账户服务扣减账户余额
AccountDeductVo accountDeductVo = new AccountDeductVo();
accountDeductVo.setAmount(orderInfo.getOrderAmount());
accountDeductVo.setOrderNo(orderInfo.getOrderNo());
accountDeductVo.setContent(orderInfo.getOrderTitle());
accountDeductVo.setUserId(orderInfo.getUserId());
Result result = accountFeignClient.checkAndDeduct(accountDeductVo);
//判断是否为扣减成功
if(result.getCode().intValue()!=200){
throw new GuiguException(result.getCode(), result.getMessage());
}
//4.2 如果扣减余额成功修改订单状态改为已支付
orderInfo.setOrderStatus(SystemConstant.ORDER_STATUS_PAID);
orderInfoMapper.updateById(orderInfo);
//4.3 远程调用用户服务虚拟物品发货
//4.3.1 构建虚拟发货VO对象
UserPaidRecordVo userPaidRecordVo =new UserPaidRecordVo();
userPaidRecordVo.setOrderNo(orderInfo.getOrderNo());
userPaidRecordVo.setUserId(orderInfo.getUserId());
userPaidRecordVo.setItemType(orderInfo.getItemType());
//根据订单编号查询订单明细获取购买项目ID列表
List<OrderDetail> orderDetailList = orderDetailService.list(
new LambdaQueryWrapper<OrderDetail>()
.eq(OrderDetail::getOrderId, orderInfo.getId())
.select(OrderDetail::getItemId)
);
List<Long> itemIdList = orderDetailList.stream()
.map(OrderDetail::getItemId).collect(Collectors.toList());
userPaidRecordVo.setItemIdList(itemIdList);
//4.3.2 远程调用用户服务,发放用户权益
result = userFeignClient.savePaidRecord(userPaidRecordVo);
//4.3.3 判断远程调用结果业务状态码是否为200
if (result.getCode().intValue() != 200) {
throw new GuiguException(result.getCode(), result.getMessage());
}
//进行提取 其他两个功能用分布式事务@GlobalTransactional去修饰
accountPayBizService.handlerAccountPay(orderInfo);
}
//5.TODO 判断支付方式微信
//else if(SystemConstant.ORDER_PAY_WAY_WEIXIN.equals(payWay)){
if(SystemConstant.ORDER_PAY_WAY_WEIXIN.equals(payWay)){
//发送一个延时关闭的延时插件
rabbitService.sendDealyMessage(MqConst.EXCHANGE_CANCEL_ORDER,
MqConst.ROUTING_CANCEL_ORDER, orderInfo.getId(), ttl);
//}
}
//6.响应结果
return Map.of("orderNo", orderInfo.getOrderNo());
}
@Override
@ -215,4 +182,73 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
return orderInfo;
}
@Override
public OrderInfo getOrderInfo(String orderNo) {
//1.根据订单编号查询订单信息
OrderInfo orderInfo = orderInfoMapper.selectOne(
new LambdaQueryWrapper<OrderInfo>()
.eq(OrderInfo::getOrderNo, orderNo)
);
Long orderInfoId = orderInfo.getId();
//2.根据订单ID查询订单明细
List<OrderDetail> list = orderDetailService.list(
new LambdaQueryWrapper<OrderDetail>()
.eq(OrderDetail::getOrderId, orderInfoId)
);
orderInfo.setOrderDetailList(list);
//3.根据订单ID查询订单减免列表
List<OrderDerate> orderDerateList = orderDerateService.list(
new LambdaQueryWrapper<OrderDerate>()
.eq(OrderDerate::getOrderId, orderInfoId)
);
orderInfo.setOrderDerateList(orderDerateList);
return orderInfo;
}
@Override
public Page<OrderInfo> findUserOrderPage(Page<OrderInfo> pageInfo, Long userId) {
//2.TODO 方式二单独分页查询订单在根据订单ID集合查询订单明细封装订单明细列表
//先查出来订单的分页对象
Page<OrderInfo> orderInfoPage = orderInfoMapper.selectPage(pageInfo,
new LambdaQueryWrapper<OrderInfo>()
.eq(OrderInfo::getId, userId)
.select(OrderInfo::getId, OrderInfo::getOrderNo, OrderInfo::getOrderStatus,
OrderInfo::getPayWay, OrderInfo::getOriginalAmount, OrderInfo::getOrderAmount,
OrderInfo::getDerateAmount)
.orderByDesc(OrderInfo::getId));
//根据分页对象查出订单的id,将其变成一个list
List<Long> orderIdList = orderInfoPage.getRecords().stream().map(OrderInfo::getId).collect(Collectors.toList());
//4.查询所有订单明细列表
List<OrderDetail> orderDetailList = orderDetailService.list(
new LambdaQueryWrapper<OrderDetail>()
.in(OrderDetail::getOrderId, orderIdList)
.select(OrderDetail::getOrderId, OrderDetail::getItemId, OrderDetail::getItemName,
OrderDetail::getItemPrice, OrderDetail::getItemUrl)
);
//将所有订单明细表作为value存入一个map中,key为订单的id
Map<Long, List<OrderDetail>> orderDetailListMap = orderDetailList.stream().collect(Collectors.groupingBy(OrderDetail::getOrderId));
//遍历 将其都改成订单的明细列表
for (OrderInfo record : orderInfoPage.getRecords()) {
record.setOrderDetailList(orderDetailListMap.get(record.getId()));
}
return orderInfoPage;
}
//关单 如果长时间没有支付的话我们就将订单的状态由未支付改为已取消
@Override
public void cancelOrder(Long orderId) {
OrderInfo orderInfo = orderInfoMapper.selectById(orderId);
String orderStatus = orderInfo.getOrderStatus();
if(SystemConstant.ORDER_STATUS_UNPAID.equals(orderStatus)){
orderInfo.setOrderStatus(SystemConstant.ORDER_STATUS_CANCEL);
orderInfoMapper.updateById(orderInfo);
//TODO 关闭第三方支付平台微信支付支付订单
}
}
}

View File

@ -4,5 +4,13 @@ import com.atguigu.tingshu.model.payment.PaymentInfo;
import com.baomidou.mybatisplus.extension.service.IService;
public interface PaymentInfoService extends IService<PaymentInfo> {
/**
* 保存本地交易记录
*
* @param paymentType:支付类型 1301-订单 1302-充值
* @param orderNo: 订单编号
* @return
*/
public PaymentInfo savePaymentInfo(String paymentType, String orderNo);
}

View File

@ -1,13 +1,84 @@
package com.atguigu.tingshu.payment.service.impl;
import com.atguigu.tingshu.account.AccountFeignClient;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.model.account.RechargeInfo;
import com.atguigu.tingshu.model.order.OrderInfo;
import com.atguigu.tingshu.model.payment.PaymentInfo;
import com.atguigu.tingshu.order.client.OrderFeignClient;
import com.atguigu.tingshu.payment.mapper.PaymentInfoMapper;
import com.atguigu.tingshu.payment.service.PaymentInfoService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
@SuppressWarnings({"all"})
@SuppressWarnings("all")
public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, PaymentInfo> implements PaymentInfoService {
@Autowired
private OrderFeignClient orderFeignClient;
@Autowired
private AccountFeignClient accountFeignClient;
@Autowired
private PaymentInfoMapper paymentInfoMapper;
//保存本地的用户信息
@Override
public PaymentInfo savePaymentInfo(String paymentType, String orderNo) {
//根据订单id去获取订单的支付信息
PaymentInfo paymentInfo = paymentInfoMapper.selectOne(
new LambdaQueryWrapper<PaymentInfo>()
.eq(PaymentInfo::getOrderNo, orderNo)
);
if (paymentInfo != null) {
return paymentInfo;
}
//2.如果不存在则构建本地交易记录对象
paymentInfo = new PaymentInfo();
//2.1 交易状态1401-未支付 1402-已支付
paymentInfo.setPaymentStatus(SystemConstant.PAYMENT_STATUS_UNPAID);
//2.2 交易编号微信或支付
paymentInfo.setPayWay(SystemConstant.ORDER_PAY_WAY_WEIXIN);
//2.3 支付类型1301-订单 1302-充值
paymentInfo.setPaymentType(paymentType);
//2.4 订单编号
paymentInfo.setOrderNo(orderNo);
//处理支付类型为 订单
if (SystemConstant.PAYMENT_TYPE_ORDER.equals(paymentType)){
//远程调用订单服务获取订单信息封装用户ID交易金额交易内容
OrderInfo orderInfo = orderFeignClient.getOrderInfo(orderNo).getData();
String orderStatus = orderInfo.getOrderStatus();
if (!SystemConstant.ORDER_STATUS_UNPAID.equals(orderStatus)) {
throw new RuntimeException("订单状态有误!");
}
//2.5 用户ID
paymentInfo.setUserId(orderInfo.getUserId());
//2.6 交易金额
paymentInfo.setAmount(orderInfo.getOrderAmount());
//2.7 交易内容
paymentInfo.setContent(orderInfo.getOrderTitle());
}
//处理支付类型为充值
if (SystemConstant.PAYMENT_TYPE_RECHARGE.equals(paymentType)) {
//远程调用账户服务获取充值信息封装用户ID交易金额交易内容
RechargeInfo rechargeInfo = accountFeignClient.getRechargeInfo(orderNo).getData();
String rechargeStatus = rechargeInfo.getRechargeStatus();
if (!SystemConstant.ORDER_STATUS_UNPAID.equals(rechargeStatus)) {
throw new RuntimeException("充值状态有误!");
}
//2.5 用户ID
paymentInfo.setUserId(rechargeInfo.getUserId());
//2.6 交易金额
paymentInfo.setAmount(rechargeInfo.getRechargeAmount());
//2.7 交易内容
paymentInfo.setContent("充值:" + rechargeInfo.getRechargeAmount());
}
paymentInfoMapper.insert(paymentInfo);
return paymentInfo;
}
}