package com.cxy.service.impl;
import cn.hutool.json.JSONUtil;
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.cxy.Utils.ThreadLocalUtil;
import com.cxy.clients.mongo.MongoClient;
import com.cxy.clients.mongo.RedisClient;
import com.cxy.entry.*;
import com.cxy.result.Result;
import com.cxy.result.ResultEnum;
import com.cxy.result.redisKey;
import com.cxy.service.AlipayService;
import com.cxy.service.HoldVoucherService;
import com.cxy.service.PaymentService;
import com.cxy.service.VoucherService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
@Service
public class AlipayServiceImpl implements AlipayService {
@Resource
RabbitTemplate rabbitTemplate;
@Resource
VoucherService voucherService;
@Resource
HoldVoucherService holdVoucherService;
@Resource
RedisClient redisClient;
@Resource
MongoClient mongoClient;
@Resource
PaymentService paymentService;
@Override
public Result alipay(Long paymentID) throws Exception {
// System.out.println(orderParam.toString());
//根据订单ID查询数据库
Payment payment = paymentService.getById(paymentID);
AlipayTradePagePayResponse payResponse =
Factory.Payment.Page()
.pay(
String.valueOf(payment.getId()),
String.valueOf(payment.getId()),
String.valueOf(payment.getFinalPaymentAmount()),
""
);
return Result.ok().message("支付宝订单创建成功").data(payResponse.getBody());
}
@Override
public Result payNotify(HttpServletRequest request) throws Exception {
if (!request.getParameter("trade_status").equals("TRADE_SUCCESS")) {
System.out.println("订单没有被成功支付");
return Result.fail(ResultEnum.PAYMENT_ERROR);
}
System.out.println("=========支付宝异步回调========");
Map<String, String> params = new HashMap<>();
Map<String, String[]> requestParams = request.getParameterMap();
for (String name : requestParams.keySet()) {
params.put(name, request.getParameter(name));
// System.out.println(name + " = " + request.getParameter(name));
}
//验签
Boolean verifyNotify = Factory.Payment.Common().verifyNotify(params);
//验签不通过
if (!verifyNotify) {
return Result.fail(ResultEnum.PAYMENT_SIGN_FAIL);
}
//发送到消息队列
rabbitTemplate.convertAndSend("paymentExchange", "payment.complete", JSONUtil.toJsonStr(params));
return Result.ok().message("支付成功");
}
@Override
public Result buyVoucherLimit(buyParam buyParam) {
//拼接参数
String stockKey = redisKey.VOUCHER_STOCK.getKey() + buyParam.getId().toString();
String boughtKey = redisKey.VOUCHER_ALREADY_BOUGHT.getKey() + buyParam.getId().toString();
//根据ID获取优惠券信息
Voucher voucherInfo = voucherService.getById(buyParam.getId());
if (null == voucherInfo) {
return Result.fail(ResultEnum.PROJECT_ERROR);
}
//获取用户ID
Token token = (Token) ThreadLocalUtil.get();
//redis中购买成功后创建消息队列送到订单生成列表
Boolean flag = redisClient.limitBought(stockKey, boughtKey, token.getId(), "1");
//redis扣减库存和存入用户成功
if (!flag) {
return Result.fail().message("购买失败");
}
//异步队列写入订单
// 因为队列是不能返回值的所以这里手动使用雪花算法生成ID
Payment payment = new Payment();
Long assign_id = IdWorker.getId();
payment.setId(assign_id);
payment.setUserId(token.getId());//购买用户的ID
payment.setUserType(token.getPower());//用户的类型主要是不是VIP
payment.setProductId(Long.valueOf(buyParam.getId()));//商品ID 这里结束优惠券的ID
payment.setPaymentAmount(BigDecimal.valueOf(voucherInfo.getPrice()));//支付金额 价格是从数据库查出来的
payment.setFinalPaymentAmount(BigDecimal.valueOf(voucherInfo.getPrice()));//最终支付金额,购买优惠券不能使用优惠券所以最终金额是一样的
payment.setProductType("voucher");
rabbitTemplate.convertAndSend("paymentExchange", "payment.create", JSONUtil.toJsonStr(payment));
//加入延迟队列,开始计时30分钟 发送订单ID
rabbitTemplate.convertAndSend("30M-delayQueue", assign_id.toString());
return Result.ok().data(assign_id);
}
@Override
public Result buy(movieTicketParam movieTicketParam) {
//根据排片ID获取该片场票的价格
MovieSet movieSet = mongoClient.getMovieSetByID(movieTicketParam.getMovieSetId());
if (null == movieSet) {
return Result.fail(ResultEnum.PROJECT_ERROR);
}
//获取用户ID
Token token = (Token) ThreadLocalUtil.get();
//电影票价格
BigDecimal ticketPrice = movieSet.getPrice();
//异步队列写入订单
// 因为队列是不能返回值的所以这里手动使用雪花算法生成ID
Payment payment = new Payment();
Long assign_id = IdWorker.getId();
payment.setId(assign_id);
payment.setUserId(token.getId());//购买用户的ID
payment.setUserType(token.getPower());//用户的类型主要是不是VIP
payment.setProductId(Long.valueOf(movieTicketParam.getMovieSetId()));//商品ID 这里结束优惠券的ID
payment.setProductNum(movieTicketParam.getTickets().length);//商品数量
payment.setProductType("ticket");
BigDecimal number = BigDecimal.valueOf(movieTicketParam.getTickets().length);
BigDecimal price = number.multiply(ticketPrice);//支付金额 价格是从数据库查出来的
payment.setPaymentAmount(price);//支付金额
//如果是VIP就进行九折
if (token.getPower().equals("1")) {
price.multiply(BigDecimal.valueOf(0.9));
}
//优惠券信息 判断是否符合优惠券的使用条件
if (null != movieTicketParam.getVoucherId()) {
Voucher voucher = voucherService.getById(movieTicketParam.getVoucherId());
if (null != voucher) {
//如果大于这张优惠券的满减金额就可以相减
int flag = price.compareTo(BigDecimal.valueOf(voucher.getPayValue()));
if (flag >= 0) {
payment.setPreferentialAmount(BigDecimal.valueOf(voucher.getActualValue()));//优惠金额
payment.setVoucherId(movieTicketParam.getVoucherId());//优惠券ID
holdVoucherService.update(
new LambdaUpdateWrapper<HoldVoucher>()
.eq(HoldVoucher::getUserId, token.getId())
.eq(HoldVoucher::getVoucherId, movieTicketParam.getVoucherId())
.set(HoldVoucher::getState, 0)
);
}
}
}
payment.setFinalPaymentAmount(price.subtract(payment.getPreferentialAmount()));//最终支付金额
//写入座位信息
payment.setProductInfo(JSONUtil.toJsonStr(movieTicketParam.getTickets()));
//发送到消息队列
rabbitTempl
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
毕业设计是高等教育阶段学生在完成学业前所进行的一项重要学术任务,旨在检验学生通过学习所获得的知识、技能以及对特定领域的深刻理解能力。这项任务通常要求学生运用所学专业知识,通过独立研究和创新,完成一个实际问题的解决方案或者开展一项有价值的项目。 首先,毕业设计的选择通常由学生根据个人兴趣、专业方向以及实际需求来确定。学生需要在导师的指导下明确研究目标、问题陈述,确立研究的范围和深度。毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多个阶段,以确保整个过程的科学性和系统性。 其次,毕业设计的完成通常需要学生具备一定的独立思考和解决问题的能力。在研究过程中,学生可能需要采用各种研究方法,如实验、调查、案例分析等,以获取必要的数据和信息。通过这些活动,学生能够培养扎实的专业技能,提升解决实际问题的实际能力。 第三,毕业设计的撰写是整个过程的重要组成部分。学生需要将研究过程、方法、结果以及结论等详细记录在毕业论文中,以展示其研究的全貌和成果。同时,撰写毕业设计还有助于提高学生的学术写作水平,培养清晰、逻辑的表达能力。 最后,毕业设计的评价通常由导师和相关专业人士进行。评价标准包括研究的创新性、实用性、方法的科学性以及论文的质量等方面。学生在毕业设计中获得的成绩也将直接影响其最终的学业成绩和学位授予。 总的来说,毕业设计是高等教育中的一项重要环节,通过此过程,学生不仅能够巩固所学知识,还能培养独立思考和解决问题的能力,为将来的职业发展奠定坚实的基础。
资源推荐
资源详情
资源评论
收起资源包目录
EasyMovie电影售票系统.zip (209个子文件)
.gitignore 366B
AlipayServiceImpl.java 8KB
MovieSetServiceImpl.java 7KB
MoviehouseServiceImpl.java 7KB
UserServiceImpl.java 7KB
VoucherServiceImpl.java 6KB
FilmServiceImpl.java 5KB
PaymentServiceImpl.java 5KB
UserImpl.java 5KB
MongoCinemaImpl.java 4KB
MovieSetController.java 4KB
RedisConfig.java 4KB
PerformerController.java 4KB
RedisStockServiceImpl.java 4KB
MongoMovieSetController.java 4KB
TagController.java 4KB
AuthorizationGlobalFilter.java 3KB
T.java 3KB
MovieHouseController.java 3KB
MongoMoviehouseServerImpl.java 3KB
MongoClient.java 3KB
CommitServiceImpl.java 3KB
UserServiceImpl.java 3KB
RedisStockController.java 3KB
FilmInfoServiceImpl.java 3KB
PerformerServiceImpl.java 2KB
AdministratorServiceImpl.java 2KB
DeadServiceImpl.java 2KB
CinemaServiceImpl.java 2KB
MongoCinemaController.java 2KB
MongoFilmInfoController.java 2KB
VerifyAdminInterceptor.java 2KB
FileServiceImpl.java 2KB
VerifyInterception.java 2KB
LocalDateTimeSerializerConfig.java 2KB
MongoMovieHouseController.java 2KB
RedisUserController.java 2KB
FilmController.java 2KB
Film.java 2KB
NotificationServerListUpdater.java 2KB
Payment.java 2KB
RedisClient.java 2KB
VoucherController.java 2KB
MovieSet.java 2KB
TagIndexServiceImpl.java 2KB
Voucher.java 2KB
Testt.java 2KB
GongsiImpl.java 2KB
NacosServerListListener.java 2KB
FeignClientsInterceptor.java 1KB
User.java 1KB
UserController.java 1KB
AuthorizationImpl.java 1KB
UserController.java 1KB
MongoFilmInfo.java 1KB
Administrator.java 1KB
Performer.java 1KB
Moviehouse.java 1KB
Oauths.java 1KB
MovieSetMapper.java 1KB
AliPayController.java 1KB
PerformerIndex.java 1KB
TagIndex.java 1KB
Result.java 1KB
FilmInfo.java 1KB
AliPayConfig.java 1KB
UserInfo.java 1KB
MybatisPlusConfig.java 1KB
Cinema.java 1KB
MovieSetDto.java 1KB
paymentController.java 1008B
FilmInfoController.java 977B
HoldVoucher.java 975B
MovieSetService.java 957B
verify.java 938B
MongoCommitController.java 933B
Tag.java 931B
holdVoucher.java 931B
MyInterceptionConfig.java 885B
ResourcesConfig.java 881B
CinemaController.java 810B
MongoMoviehouse.java 805B
MyInterceptionConfig.java 797B
DingDingUtil.java 793B
TTest.java 774B
MoviehouseService.java 771B
OrderClient.java 765B
feignConfig.java 748B
gongsiController.java 743B
Commit.java 732B
ResultEnum.java 727B
GlobalException.java 718B
VoucherService.java 716B
r.java 704B
PerformerMapper.java 697B
InterceptionConfig.java 696B
AuthorizationClient.java 671B
MyException.java 640B
mongoApplication.java 625B
PerformerService.java 614B
共 209 条
- 1
- 2
- 3
资源评论
普通的一个普通猿
- 粉丝: 1465
- 资源: 1761
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功