package com.glume.glumemall.order.service.impl;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.glume.common.core.constant.OrderConstant;
import com.glume.common.core.exception.servlet.NoStockException;
import com.glume.common.core.to.MemberRespTo;
import com.glume.common.core.to.mq.OrderTo;
import com.glume.common.core.to.mq.SeckillOrderTo;
import com.glume.common.core.utils.R;
import com.glume.common.core.utils.RedisUtils;
import com.glume.common.core.utils.SpringUtils;
import com.glume.common.core.utils.StringUtils;
import com.glume.glumemall.order.entity.OrderItemEntity;
import com.glume.common.core.enums.OrderStatusEnum;
import com.glume.glumemall.order.entity.PaymentInfoEntity;
import com.glume.glumemall.order.feign.CartFeignService;
import com.glume.glumemall.order.feign.MemberFeignService;
import com.glume.glumemall.order.feign.ProductFeignService;
import com.glume.glumemall.order.feign.WareFeignService;
import com.glume.glumemall.order.interceptor.LoginUserInterceptor;
import com.glume.glumemall.order.service.OrderItemService;
import com.glume.glumemall.order.service.PaymentInfoService;
import com.glume.glumemall.order.to.OrderCreateTo;
import com.glume.glumemall.order.vo.*;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.glume.common.mybatis.PageUtils;
import com.glume.common.mybatis.Query;
import com.glume.glumemall.order.dao.OrderDao;
import com.glume.glumemall.order.entity.OrderEntity;
import com.glume.glumemall.order.service.OrderService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
@Service("orderService")
public class OrderServiceImpl extends ServiceImpl<OrderDao, OrderEntity> implements OrderService {
private ThreadLocal<OrderSubmitVo> confirmVoThreadLocal = new ThreadLocal<>();
@Resource
MemberFeignService memberFeignService;
@Resource
CartFeignService cartFeignService;
@Resource
WareFeignService wareFeignService;
@Resource
ProductFeignService productFeignService;
@Autowired
PaymentInfoService paymentInfoService;
@Autowired
ThreadPoolExecutor executor;
@Autowired
OrderItemService orderItemService;
@Autowired
RabbitTemplate rabbitTemplate;
@Override
public PageUtils queryPage(Map<String, Object> params) {
IPage<OrderEntity> page = this.page(
new Query<OrderEntity>().getPage(params),
new QueryWrapper<OrderEntity>()
);
return new PageUtils(page);
}
@Override
public OrderEntity getOrderByOrderSn(String orderSn) {
OrderEntity orderEntity = baseMapper.selectOne(new QueryWrapper<OrderEntity>().eq("order_sn",orderSn));
return orderEntity;
}
/**
* 当前用户所有订单信息
*/
@Override
public PageUtils queryPageWithItem(Map<String, Object> params) {
MemberRespTo memberRespTo = LoginUserInterceptor.toThreadLocal.get();
IPage<OrderEntity> orderEntityIPage = baseMapper.selectPage(
new Query<OrderEntity>().getPage(params),
new QueryWrapper<OrderEntity>()
.eq("member_id", memberRespTo.getId()).orderByDesc("id"));
List<OrderEntity> entityList = orderEntityIPage.getRecords().stream().map(orderEntity -> {
List<OrderItemEntity> orderItemEntityList = orderItemService.list(new QueryWrapper<OrderItemEntity>().eq("order_sn", orderEntity.getOrderSn()));
orderEntity.setOrderItemEntities(orderItemEntityList);
return orderEntity;
}).collect(Collectors.toList());
orderEntityIPage.setRecords(entityList);
return new PageUtils(orderEntityIPage);
}
/**
* 处理支付宝的支付结果
*/
@Override
public String handlerPayResult(PayAsyncVo payAsyncVo) {
PaymentInfoEntity paymentInfoEntity = new PaymentInfoEntity();
paymentInfoEntity.setAlipayTradeNo(payAsyncVo.getTrade_no());
paymentInfoEntity.setOrderSn(payAsyncVo.getOut_trade_no());
paymentInfoEntity.setPaymentStatus(payAsyncVo.getTrade_status());
paymentInfoEntity.setCallbackTime(payAsyncVo.getNotify_time());
// 保存交易流水
paymentInfoService.save(paymentInfoEntity);
// 修改订单状态
if (payAsyncVo.getTrade_status().equals("TRADE_SUCCESS") ||
payAsyncVo.getTrade_status().equals("TRADE_FINISHED")) {
String orderSn = payAsyncVo.getOut_trade_no();
baseMapper.updateOrderStatus(orderSn,OrderStatusEnum.PAYED.getCode());
}
return "success";
}
@Override
public void closeOrder(OrderEntity orderEntity) {
OrderEntity entity = baseMapper.selectById(orderEntity.getId());
// 当订单状态为待付款时,才能进行关闭订单
if (entity.getStatus() == OrderStatusEnum.CREATE_NEW.getCode()) {
OrderEntity newOrderData = new OrderEntity();
newOrderData.setId(entity.getId());
newOrderData.setStatus(OrderStatusEnum.CANCLED.getCode());
baseMapper.updateById(newOrderData);
OrderTo orderTo = new OrderTo();
BeanUtils.copyProperties(entity,orderTo);
try {
// TODO 保证消息一定能发送出去,每一个消息都可以做好日志记录(给数据库保存每一条记录)
rabbitTemplate.convertAndSend("order-event-exchange","order.release.other.#",orderTo);
} catch (AmqpException e) {
// TODO 将没发送成功的消息进行重试发送
e.printStackTrace();
}
}
}
@Override
public PayVo getOrderPay(String orderSn) {
PayVo payVo = new PayVo();
OrderEntity orderByOrderSn = this.getOrderByOrderSn(orderSn);
payVo.setOut_trade_no(orderByOrderSn.getOrderSn());
// 保留小数点两位,并且向上取值
BigDecimal money = orderByOrderSn.getPayAmount().setScale(2, BigDecimal.ROUND_UP);
payVo.setTotal_amount(money.toString());
List<OrderItemEntity> orderItemEntities = orderItemService.list(new QueryWrapper<OrderItemEntity>().eq("order_sn", orderSn));
payVo.setSubject(orderItemEntities.get(0).getSkuName());
payVo.setBody(orderItemEntities.get(0).getSkuAttrsVals());
return payVo;
}
/**
* 订单确认页需要返回的数据
* @return
*/
@Override
public OrderConfirmVo confirmOrder() throws ExecutionException, InterruptedException {
// TODO 订单确认页需要返回的数据待完成
OrderConfirmVo orderConfirmVo = new OrderConfirmVo();
MemberRespTo memberRespTo = LoginUserInterceptor.toThreadLocal.get();
/** 异步多线程:远程调用解决请求头丢失问题 */
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// 远程查询会员收货地址
CompletableFuture<Void> feignMemberAddress = CompletableFuture.runAsync(() -> {
RequestContextHolder.setRequestAttributes(r
没有合适的资源?快使用搜索试试~ 我知道了~
glume-mall是一个B2C模式的电商平台,
共2000个文件
java:784个
js:315个
jpg:181个
需积分: 0 0 下载量 22 浏览量
2024-04-26
22:07:51
上传
评论
收藏 44.58MB ZIP 举报
温馨提示
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
资源推荐
资源详情
资源评论
收起资源包目录
glume-mall是一个B2C模式的电商平台, (2000个子文件)
package.bat 153B
build.bat 109B
run-web.bat 99B
file.conf 3KB
file.conf 3KB
file.conf 3KB
registry.conf 1KB
registry.conf 1KB
registry.conf 1KB
GL.css 624KB
app.05cde78c.css 332KB
index.css 192KB
index.css 192KB
index.css 192KB
index.css 192KB
index.css 192KB
index.css 192KB
index.css 192KB
index.css 192KB
index.css 192KB
index.css 192KB
index.css 192KB
index.css 192KB
bootstrap.css 144KB
bootstrap.css 143KB
bootstrap.css 143KB
bootstrap.css 142KB
bootstrap.css 142KB
bootstrap.min.css 120KB
bootstrap.min.css 118KB
bootstrap.min.css 118KB
bootstrap.min.css 118KB
bootstrap.min.css 118KB
bootstrap.min.css 118KB
AdminLTE.min.css 88KB
animate.min.css 86KB
success.css 62KB
chunk-67b8be68.c5674eb6.css 52KB
ueditor.css 43KB
screen.css 43KB
print.css 41KB
header.css 40KB
header.css 40KB
all-skins.min.css 40KB
chunk-libs.69af8c84.css 37KB
font-awesome.css 37KB
jquery-ui.css 36KB
scss.css 36KB
jquery-ui.min.css 35KB
ueditor.min.css 34KB
shop.css 31KB
shop.css 31KB
font-awesome.min.css 30KB
font-awesome.min.css 30KB
swagger-ui.css 26KB
index.css 22KB
index.css 22KB
video-js.css 21KB
swiper.css 20KB
jquery-ui.structure.css 18KB
jquery-ui.theme.css 18KB
One_bdyStyle.css 18KB
ui.jqgrid-bootstrap.css 18KB
image.css 18KB
swiper.min.css 17KB
swiper-3.4.2.min.css 17KB
swiper-3.4.2.min.css 17KB
ui.jqgrid.css 17KB
JD2.css 17KB
jquery-ui.structure.min.css 15KB
video.css 15KB
attachment.css 14KB
layer.css 14KB
jquery-ui.theme.min.css 14KB
video-js.min.css 11KB
JD1.css 7KB
shCoreDefault.css 7KB
SHOUhou.css 6KB
SHOUhou.css 6KB
layer.css 5KB
One_mainFoot.css 5KB
style.css 5KB
index.css 5KB
main.css 4KB
main.css 4KB
scrawl.css 4KB
index.css 4KB
style.css 3KB
index.css 3KB
style.css 3KB
codemirror.css 3KB
charts.css 3KB
background.css 2KB
emotion.css 2KB
dialogbase.css 2KB
music.css 2KB
index.css 1KB
edittable.css 1KB
main.css 1KB
template.css 1KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
fishniu35
- 粉丝: 520
- 资源: 276
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功