From 07de03ccae02d00be243911a003115fe9b24f863 Mon Sep 17 00:00:00 2001 From: huliguo <2023611923@qq.com> Date: 星期二, 08 四月 2025 16:07:07 +0800 Subject: [PATCH] 订单部分+个人中心部分 --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java | 463 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 343 insertions(+), 120 deletions(-) diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java index 173f41c..90ec3d6 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java @@ -1,40 +1,35 @@ package com.ruoyi.order.service.impl; -import cn.hutool.http.HttpRequest; -import cn.hutool.http.HttpUtil; -import cn.hutool.json.JSONUtil; + import com.alibaba.fastjson2.JSON; -import com.alibaba.fastjson2.JSONArray; + import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.feignClient.*; import com.ruoyi.account.api.model.*; -import com.ruoyi.account.api.vo.CouponInfoVo; -import com.ruoyi.account.api.vo.PaymentUserCoupon; -import com.ruoyi.account.api.vo.PaymentUserCouponVo; + import com.ruoyi.common.core.constant.ExpressCompanyMap; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; -import com.ruoyi.common.core.utils.HttpUtils; + import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.common.core.utils.bean.BeanUtils; import com.ruoyi.common.core.utils.uuid.QRCodeGenerator; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.enums.OrderStatus; -import com.ruoyi.order.event.ConfirmDeliveryEvent; + import com.ruoyi.order.mapper.OrderGoodMapper; import com.ruoyi.order.mapper.OrderMapper; import com.ruoyi.order.model.Order; import com.ruoyi.order.model.OrderGood; import com.ruoyi.order.service.OrderGoodService; import com.ruoyi.order.service.OrderService; -import com.ruoyi.order.util.ExpressDeliveryUtil; + import com.ruoyi.order.util.payment.PaymentUtil; -import com.ruoyi.order.util.payment.model.RefundCallbackResult; -import com.ruoyi.order.util.payment.model.RefundResult; -import com.ruoyi.order.util.vo.MapTrackKD100Vo; -import com.ruoyi.order.util.vo.QueryKD100ListVo; +import com.ruoyi.order.util.payment.model.*; + import com.ruoyi.order.vo.*; import com.ruoyi.other.api.domain.*; import com.ruoyi.other.api.feignClient.*; @@ -44,34 +39,27 @@ import com.ruoyi.system.api.feignClient.SysConfigClient; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.model.LoginUser; -import lombok.SneakyThrows; -import org.apache.poi.ss.usermodel.CellType; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.xssf.streaming.SXSSFWorkbook; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.jetbrains.annotations.Nullable; + +import lombok.extern.slf4j.Slf4j; + import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import java.io.IOException; -import java.io.InputStream; + import java.math.BigDecimal; import java.math.RoundingMode; -import java.net.MalformedURLException; -import java.net.URL; + +import java.text.SimpleDateFormat; import java.time.LocalDateTime; -import java.time.OffsetDateTime; + import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.*; -import java.util.function.Function; + import java.util.stream.Collectors; /** @@ -82,6 +70,7 @@ * @author luodangjia * @since 2024-11-21 */ +@Slf4j @Service public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService { @Resource @@ -112,7 +101,13 @@ private OrderGoodService orderGoodService; @Resource + private UserPointClient userPointClient; + + @Resource private RedisTemplate redisTemplate; + + @Resource + private ShopBalanceStatment shopBalanceStatment; @Resource private SystemConfigClient systemConfigClient; @@ -141,33 +136,17 @@ } // 商品 - List<OrderGood> orderGoods = orderGoodMapper.selectList(new LambdaQueryWrapper<OrderGood>() - .eq(OrderGood::getOrderId, orderId)); + OrderGood orderGood = orderGoodMapper.selectOne(new LambdaQueryWrapper<OrderGood>().eq(OrderGood::getOrderId, orderId)); + String goodJson = orderGood.getGoodJson(); + Goods goods = JSONObject.parseObject(goodJson, Goods.class); - List<OrderGoodsVO> goodsList = new ArrayList<>(); - for (OrderGood orderGood : orderGoods) { - String goodJson = orderGood.getGoodJson(); - Goods goods = JSONObject.parseObject(goodJson, Goods.class); - OrderGoodsVO orderGoodsVO = new OrderGoodsVO(); - orderGoodsVO.setGoodsId(orderGood.getGoodsId()); - orderGoodsVO.setNum(orderGood.getNum()); - orderGoodsVO.setGoodsName(goods.getName()); - orderGoodsVO.setType(goods.getType()); - orderGoodsVO.setGoodsPic(goods.getHomePagePicture()); - orderGoodsVO.setSellingPrice(orderGood.getSellingPrice()); - orderGoodsVO.setIntegral(orderGood.getIntegral()); - orderGoodsVO.setOriginalPrice(goods.getOriginalPrice()); - goodsList.add(orderGoodsVO); - } - // 优惠券 - String couponJson = order.getCouponJson(); - JSONObject jsonObject = new JSONObject(); - if (StringUtils.isNotEmpty(couponJson)) { - jsonObject = JSONObject.parseObject(couponJson); - } + OrderGoodsVO orderGoodsVO = new OrderGoodsVO(); + BeanUtils.copyProperties(orderGood, orderGoodsVO); + orderGoodsVO.setGoodsName(goods.getName()); + orderGoodsVO.setGoodsPic(goods.getHomePagePicture()); OrderDetailVO orderDetailVO = new OrderDetailVO(); - orderDetailVO.setDistributionMode(order.getDistributionMode()); + orderDetailVO.setOrderGoodsVO(orderGoodsVO); Shop shop = shopR.getData(); orderDetailVO.setId(order.getId()); orderDetailVO.setOrderStatus(order.getOrderStatus()); @@ -175,23 +154,12 @@ orderDetailVO.setOrderNumber(order.getOrderNumber()); orderDetailVO.setCreateTime(order.getCreateTime()); orderDetailVO.setTotalAmount(order.getTotalAmount()); - orderDetailVO.setCouponName(jsonObject.getString("couponName")); - orderDetailVO.setCouponAmount(order.getDiscountTotalAmount()); - orderDetailVO.setExpressAmount(order.getExpressAmount()); - orderDetailVO.setPointAmount(order.getGetPoint()); orderDetailVO.setPaymentAmount(order.getPaymentAmount()); - orderDetailVO.setGoodsList(goodsList); orderDetailVO.setShopName(shop.getName()); orderDetailVO.setShopAddress(shop.getAddress()); orderDetailVO.setLongitude(shop.getLongitude()); orderDetailVO.setLatitude(shop.getLatitude()); orderDetailVO.setShopId(shop.getId()); - if (StringUtils.isNotEmpty(order.getExpressResult())) { - MapTrackKD100Vo mapTrackKD100Vo = JSON.parseObject(order.getExpressResult(), MapTrackKD100Vo.class); - List<QueryKD100ListVo> data = mapTrackKD100Vo.getData(); - orderDetailVO.setExpress(null != data && data.size() > 0 ? data.get(0).getContext() : ""); - } - // 生成核销码BASE64 try { String base64 = QRCodeGenerator.generateQRCodeBase64(String.valueOf(order.getId()), 124, 124); @@ -240,7 +208,7 @@ order.setEndTime(LocalDateTime.now()); order.setCancellerAppUserId(loginUserApplet.getUserid()); if (StringUtils.isNotEmpty(technicianId) && !"null".equals(technicianId)) { - order.setTechnicianId(Integer.valueOf(technicianId)); +// order.setTechnicianId(Integer.valueOf(technicianId)); } orderMapper.updateById(order); } @@ -371,9 +339,14 @@ return R.fail("订单取消失败"); } order.setOrderStatus(5); + //todo 商品销售数量 R r = refundPayMoney(order); if (200 == r.getCode()) { this.updateById(order); + } + R r2 = userPointClient.deleteUserPointCopy(orderId, Arrays.asList(8));//门店业绩 + if (200 != r2.getCode()) { // 项目没有分布式事务,此处报错可能会导致数据不一致 + throw new RuntimeException("订单取消失败"); } return r; } @@ -412,11 +385,11 @@ */ public R refundPayMoney(Order order) { //开始退款 - Integer payMethod = order.getPayMethod(); - BigDecimal expressAmount = order.getExpressAmount() == null ? BigDecimal.ZERO : order.getExpressAmount(); - BigDecimal paymentAmount = order.getPaymentAmount().add(expressAmount); + + BigDecimal paymentAmount = order.getPaymentAmount(); AppUser appUser = appUserClient.getAppUserById(order.getAppUserId()); - if (1 == payMethod) { + + if (BigDecimal.ZERO.compareTo(order.getPaymentAmount()) < 0) {//支付的金额是否大于0 //微信退款 RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), paymentAmount.doubleValue(), "/order/order/refundPayMoneyCallback"); if ("100".equals(refund.getRa_Status())) { @@ -426,38 +399,8 @@ return R.fail(refund.getRc_CodeMsg()); } } - if (2 == payMethod) { - BigDecimal balance = appUser.getBalance(); - appUser.setBalance(balance.add(paymentAmount).setScale(2, RoundingMode.HALF_EVEN)); - appUser.setShopAmount(appUser.getShopAmount().subtract(paymentAmount).setScale(2, RoundingMode.HALF_EVEN)); - //查询最后一次的消费订单 - Order order1 = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getAppUserId, order.getAppUserId()).eq(Order::getPayStatus, 2) - .eq(Order::getDelFlag, 0).in(Order::getOrderStatus, Arrays.asList(1, 2, 3, 4, 8)).ne(Order::getId, order.getId()).last(" order by create_time desc limit 0, 1")); - if (null != order1) { - appUser.setLastShopTime(order1.getCreateTime()); - } else { - appUser.setLastShopTime(null); - } - } - if (3 == payMethod) { - //开始运费退款,积分支付,运费是单独进行支付的,所以需要单独退款 - if (null != order.getExpressAmount() && BigDecimal.ZERO.compareTo(order.getExpressAmount()) < 0) { - if (1 == order.getExpressPayMethod()) { - //微信退款 - RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), expressAmount.doubleValue(), "/order/order/refundExpressPayMoneyCallback"); - if ("100".equals(refund.getRa_Status())) { - order.setRefundStatus(1); - return R.ok(); - } else { - return R.fail(refund.getRc_CodeMsg()); - } - } - if (2 == order.getExpressPayMethod()) { - BigDecimal balance = appUser.getBalance(); - appUser.setBalance(balance.add(expressAmount).setScale(2, RoundingMode.HALF_EVEN)); - } - } + if (0 != order.getPoint()) {//使用的积分是否为0 Integer lavePoint = appUser.getLavePoint(); //积分退款 appUser.setLavePoint(appUser.getLavePoint() + order.getPoint()); @@ -465,13 +408,37 @@ UserPoint userPoint1 = new UserPoint(); userPoint1.setType(11); userPoint1.setObjectId(order.getId()); + List<UserPoint> data = userPointClient.getUserPointList(userPoint1).getData();//用户积分流水 Integer transferablePoint = order.getPoint(); + if (data.size() > 0) { + UserPoint userPoint = data.get(0); + transferablePoint = Integer.valueOf(userPoint.getExtention()); + } appUser.setTransferablePoint(appUser.getTransferablePoint() + transferablePoint); + + //构建积分流水明细 + if (order.getPoint() > 0) { + UserPoint userPoint = new UserPoint(); + userPoint.setType(11); + userPoint.setHistoricalPoint(lavePoint); + userPoint.setVariablePoint(order.getPoint()); + userPoint.setBalance(appUser.getLavePoint()); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(order.getAppUserId()); + userPoint.setObjectId(order.getId()); + userPointClient.saveUserPoint(userPoint); + } appUserClient.editAppUserById(appUser); } order.setRefundStatus(2); order.setRefundTime(LocalDateTime.now()); + orderMapper.updateById(order); + //todo 退款后店铺积分流水以及退款前店铺积分流水 + /* shopPointClient.deleteShopPointCopy(order.getId(), Arrays.asList(1,2,3)); + shopBalanceStatementClient.deleteShopBalanceStatementCopy(order.getId(), Arrays.asList(1,2,3)); + appUserGiveawayTemporaryClient.delAppUserGiveawayTemporary(order.getId()); + shopGiveawayTemporaryClient.delShopGiveawayTemporary(order.getId());*/ return R.ok(); } @@ -547,22 +514,16 @@ orderInfo.setUserName(appUser.getName()); orderInfo.setPhone(appUser.getPhone()); } - orderInfo.setOrderType(order.getOrderType() == 1 ? "服务" : (StringUtils.isNotEmpty(order.getAddressJson()) ? "单品-快递配送" : "单品-上门自提")); + Shop shop = shopClient.getShopById(order.getShopId()).getData(); if (null != shop) { orderInfo.setShopName(shop.getName()); } orderInfo.setPaymentMethod(order.getPayMethod()); orderInfo.setTotalAmount(order.getTotalAmount()); - orderInfo.setDiscountAmount(order.getDiscountTotalAmount()); - orderInfo.setExpressAmount(order.getExpressAmount()); + orderInfo.setPaymentAmount(order.getPaymentAmount()); - orderInfo.setGetPoint(order.getGetPoint()); - if (StringUtils.isNotEmpty(order.getExpressJson()) && !order.getExpressJson().equals("NULL")){ - JSONObject jsonObject = JSON.parseObject(order.getExpressJson()); - orderInfo.setExpressCompany(jsonObject.getString("com")); - orderInfo.setExpressNumber(jsonObject.getString("num")); - } + List<OrderGood> orderGoods = orderGoodMapper.selectList(new LambdaQueryWrapper<OrderGood>().eq(OrderGood::getOrderId, orderId).eq(OrderGood::getDelFlag, 0)); int sum = orderGoods.stream().mapToInt(OrderGood::getNum).sum(); @@ -657,8 +618,6 @@ confirmOrderVo.setShopName(shop.getShopName()); confirmOrderVo.setPurchaseLimitNum(good.getPurchaseLimit()); confirmOrderVo.setOriginalPrice(good.getOriginalPrice()); - //todo 实时计算用户可用积分 - confirmOrderVo.setResidualPoint(appUser.getAvailablePoint()); //插入价格 @@ -666,7 +625,7 @@ confirmOrderVo.setPoint(good.getIntegral()); //计算活动价格信息 - Price price = getPrice(goodId, 1); + Price price = getPrice(goodId); if (null != price) { confirmOrderVo.setCash(price.getCash()); confirmOrderVo.setOrderPoint(price.getPoint()); @@ -687,7 +646,7 @@ confirmOrderVo.setIsPurchaseLimit(false); confirmOrderVo.setPurchaseLimitNum(-1); }else{ - //todo 查当前用户的订单 + // 查当前用户的订单 List<Order> orders = this.list(new LambdaQueryWrapper<Order>().eq(Order::getAppUserId, appUser.getId()).eq(Order::getDelFlag, 0).in(Order::getOrderStatus, Arrays.asList(4, 8))); List<Long> orderIds = orders.stream().map(Order::getId).collect(Collectors.toList()); int sum = 0; @@ -703,26 +662,290 @@ return confirmOrderVo; } + + /** + * 订单支付 + * + */ + @Override + public R orderPayment(OrderPayment orderPayment) { + Long userid = tokenService.getLoginUserApplet().getUserid(); + AppUser appUser = appUserClient.getAppUserById(userid); + int type=1;//商品类型 1=普通商品,2=秒杀商品 + //商品信息 + Goods goods = goodsClient.getGoodsById(orderPayment.getGoodId()).getData(); + if (null == goods || 1==goods.getDelFlag()){ + return R.fail( "商品不存在"); + } + if(goods.getStatus() == 1){ + return R.fail(goods.getName() + "商品已被下架"); + } + + //是否在秒杀活动中 + GetSeckillActivityInfo info = new GetSeckillActivityInfo(); + info.setGoodsId(orderPayment.getGoodId()); + GoodsSeckill goodsSeckill = seckillActivityInfoClient.getSeckillActivityInfo(info).getData(); + + if (null != goodsSeckill){ + //秒杀商品 + type=2; + //判断当前数量是否已经超出限购数量(需要计算已经购买的数量) + Integer goodsSaleNum = orderMapper.getGoodsSaleNum(orderPayment.getGoodId(), 2, userid);//已购买数量 + SeckillActivityInfo activityInfo = seckillActivityInfoClient.getSeckillActivityInfoById(goodsSeckill.getSeckillActivityInfoId()).getData(); + if(null != activityInfo.getMaxNum() && -1 != activityInfo.getMaxNum() && (goodsSaleNum + 1) > activityInfo.getMaxNum()){ + return R.fail(goods.getName() + "已超出秒杀活动购买上限"); + } + //价格 + goods.setSellingPrice(goodsSeckill.getSellingPrice());//秒杀活动价格 + goods.setIntegral(goodsSeckill.getIntegral());//秒杀活动积分价格 + }else { + //普通商品 + //判断当前数量是否已经超出限购数量(需要计算已经购买的数量) + Integer goodsSaleNum = orderMapper.getGoodsSaleNum(orderPayment.getGoodId(), 1, userid);//已购买数量 + //普通商品 + if(null != goods.getPurchaseLimit() && -1 != goods.getPurchaseLimit() && (goodsSaleNum + 1) > goods.getPurchaseLimit()){ + return R.fail(goods.getName() + "已超出购买上限"); + } + } + + //判断支付方式是否正确 + if(1 != orderPayment.getPaymentType() && 3 != orderPayment.getPaymentType()){ + return R.fail("支付方式不正确"); + } + + //现金支付的订单总金额 + BigDecimal orderMoney = BigDecimal.ZERO; + //积分支付的订单积分 + Integer orderPoint = 0; + + //现金的实际支付金额 + BigDecimal paymentMoney = BigDecimal.ZERO; + //积分抵扣金额 + BigDecimal pointDeductionAmount = BigDecimal.ZERO; + + if(3 != orderPayment.getPaymentType()){ + //现金支付 + orderMoney = goods.getSellingPrice(); + paymentMoney=orderMoney.setScale(2, RoundingMode.HALF_EVEN);; + + //是否使用积分抵扣 + if (orderPayment.getIsPointDeduction() == 1) { + //积分抵扣金额 + Integer availablePoint = appUser.getAvailablePoint();//用户可用积分 + BigDecimal maxPointDeductionAmount = getCashByPoint(availablePoint);//最大可抵扣金额 + pointDeductionAmount=maxPointDeductionAmount.min(orderMoney);//实际抵扣金额 + // 计算实际支付金额 + paymentMoney = orderMoney.subtract(pointDeductionAmount).setScale(2, RoundingMode.HALF_EVEN); + //计算消耗积分 + orderPoint=getPoint(pointDeductionAmount); + } + }else{ + //积分支付 + orderPoint=goods.getIntegral(); + Integer availablePoint = appUser.getAvailablePoint();//用户可用积分 + if(availablePoint.compareTo(orderPoint) < 0){ + return R.fail("账户可用积分不足"); + } + } + //构建订单 + Order order = new Order(); + order.setAppUserId(appUser.getId()); + order.setNum(1); + order.setGoodPics(goods.getHomePagePicture()); + order.setGoodName(goods.getName()); + order.setOrderStatus( 3 );//待使用 + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + order.setOrderNumber("QJS" + getNumber(3) + sdf.format(new Date())); + order.setTotalAmount(orderMoney.setScale(2, RoundingMode.HALF_EVEN));//订单总金额 + order.setPointDeductionAmount(pointDeductionAmount.setScale(2, RoundingMode.HALF_EVEN)); + order.setPaymentAmount(paymentMoney);//实际支付价格 + order.setPoint(orderPoint);//使用积分 + order.setPayMethod(orderPayment.getPaymentType());//支付方式 + order.setPayStatus(1); + order.setShopId(orderPayment.getShopId()); + order.setDelFlag(0); + order.setCreateTime(LocalDateTime.now()); + + orderMapper.insert(order); + + //构建订单明细数据 + OrderGood orderGood = new OrderGood(); + orderGood.setGoodsId(goods.getId()); + orderGood.setOrderId(order.getId()); + orderGood.setNum(1); + orderGood.setType(type); + if (2==type){ + orderGood.setSeckillJson(JSON.toJSONString(goodsSeckill)); + } + orderGood.setGoodJson(JSON.toJSONString(goods)); + orderGood.setDelFlag(0); + orderGood.setCreateTime(LocalDateTime.now()); + orderGood.setCashPayment(orderPayment.getPaymentType()==1 ? 1 : 0); + orderGood.setPointPayment(orderPayment.getPaymentType()==3 ? 1 : 0); + orderGood.setSellingPrice(goods.getSellingPrice()); + orderGood.setIntegral(goods.getIntegral()); + orderGoodService.save(orderGood); + + //开始构建支付信息 + if(BigDecimal.ZERO.compareTo(paymentMoney) > 0){ + paymentMoney = BigDecimal.ZERO; + } + //判断积分是否为零,积分支付 + if (0 != order.getPoint()){ + //积分支付 + Integer lavePoint = appUser.getLavePoint(); + //扣减订单支付积分 + appUser.setLavePoint(appUser.getLavePoint() - orderPoint); + appUser.setAvailablePoint(appUser.getAvailablePoint() - orderPoint); + //可转赠积分 + Integer transferablePoint = appUser.getTransferablePoint(); + Integer tra = 0; + if(transferablePoint > 0){ + tra = transferablePoint - orderPoint; + appUser.setTransferablePoint(tra >= 0 ? tra : 0); + }else{ + appUser.setTransferablePoint(appUser.getTransferablePoint() - orderPoint); + } + //构建积分流水记录 + if(orderPoint > 0){ + UserPoint userPoint = new UserPoint(); + userPoint.setType(11); + userPoint.setHistoricalPoint(lavePoint); + userPoint.setVariablePoint(orderPoint); + userPoint.setBalance(appUser.getLavePoint()); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(appUser.getId()); + userPoint.setObjectId(order.getId()); + userPoint.setExtention((tra >= 0 ? orderPoint : transferablePoint) + ""); + userPointClient.saveUserPoint(userPoint); + } + + appUser.setLastShopTime(LocalDateTime.now()); + appUserClient.editAppUserById(appUser); +/* //变更等级 + applicationEventPublisher.publishEvent(new PayEvent(JSON.toJSONString(appUser)));*/ + + } + //判断需要支付的金额是否大于0 + if ( BigDecimal.ZERO.compareTo(paymentMoney) < 0){ + //调起微信支付 + String goodsNames = goods.getName(); + UniPayResult uniPayResult = PaymentUtil.uniPay(order.getOrderNumber(), paymentMoney.doubleValue(), "购买单品商品", + goodsNames, "", "/order/order/orderPaymentCallback", appUser.getWxOpenid(), null); + if(null == uniPayResult || !"100".equals(uniPayResult.getRa_Code())){ + return R.fail(null == uniPayResult ? "支付失败" : uniPayResult.getRb_CodeMsg()); + } + String rc_result = uniPayResult.getRc_Result(); + JSONObject jsonObject = JSON.parseObject(rc_result); + jsonObject.put("orderId", order.getId().toString()); + //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。 + long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC); + redisTemplate.opsForZSet().add("OrderPayment", order.getOrderNumber(), second); + return R.ok(jsonObject.toJSONString()); + + } + + //不需要微信支付,直接修改订支付状态 + order.setPayStatus(2); + orderMapper.updateById(order); + //商品销量增加 + goodsClient.editGoodsNum(orderGood.getGoodsId(), 1); + + //todo 门店增加冻结资金 + + return R.ok(order.getId().toString()); + } + + /** + * 订单支付回调通知 + */ + @Override + public R orderPaymentCallback(UniPayCallbackResult uniPayCallbackResult) { + Order order = orderMapper.selectOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, uniPayCallbackResult.getR2_OrderNo())); + if(null == order || order.getPayStatus() == 2){ + return R.ok(); + } + + AppUser appUser = appUserClient.getAppUserById(order.getAppUserId()); + BigDecimal paymentMoney = order.getPaymentAmount(); + //构建积分流水记录 + appUser.setShopAmount(appUser.getShopAmount().add(paymentMoney).setScale(2, RoundingMode.HALF_EVEN));//消费总金额 + appUser.setLastShopTime(LocalDateTime.now()); + appUserClient.editAppUserById(appUser); + + //修改订支付状态 + order.setPayStatus(2); + //待使用 + order.setOrderStatus(3); + String r7TrxNo = uniPayCallbackResult.getR9_BankTrxNo(); + order.setSerialNumber(r7TrxNo); + orderMapper.updateById(order); + + //商店余额改变,增加冻结余额 + Shop shop = shopClient.getShopById(order.getShopId()).getData(); + + + + //商品销量增加 + OrderGood orderGood = orderGoodService.getOne(new LambdaQueryWrapper<OrderGood>().eq(OrderGood::getOrderId, order.getId())); + goodsClient.editGoodsNum(orderGood.getGoodsId(), 1); + + return R.ok(); + } + + /** + * 定时任务关闭订单 + */ + @Override + public void closeOrder() { + //订单支付数据 + long second = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC); + Set<String> orderPayment = redisTemplate.opsForZSet().rangeByScore("OrderPayment", 0, second); + if(orderPayment.size() > 0){ + List<Order> list = orderMapper.selectList(new LambdaQueryWrapper<Order>().in(Order::getOrderNumber, orderPayment)); + for (Order order : list) { + if(null == order || order.getPayStatus() != 1){ + redisTemplate.opsForZSet().remove("OrderPayment", order.getOrderNumber()); + continue; + } + //开始执行关闭订单操作 + CloseOrderResult closeOrderResult = PaymentUtil.closeOrder(order.getOrderNumber()); + if((null == closeOrderResult || !closeOrderResult.getRa_Status().equals("100")) && + Arrays.asList("0", "4", "101", "10080000", "10080002", "10083004", "10083005").contains(closeOrderResult.getRb_Code())){ + redisTemplate.opsForZSet().add("OrderPayment", order.getOrderNumber(), 0); + log.error("关闭订单失败:{}---->{}", order.getOrderNumber(), JSON.toJSONString(closeOrderResult)); + } + redisTemplate.opsForZSet().remove("OrderPayment", order.getOrderNumber()); + } + } + + } + + public String getNumber(Integer size){ + StringBuilder str = new StringBuilder(); + for (int i = 0; i < size; i++) { + str.append(Double.valueOf(Math.random() * 10).intValue()); + } + return str.toString(); + } /** * 根据商品的价格配置体系获取商品当前的价格 - * @param goodsId - * @param type 1普通商品,2秒杀商品 - * @return */ - public Price getPrice( Integer goodsId, Integer type){ - //判断是否有在秒杀活动时间中 + public Price getPrice( Integer goodsId){ + //判断是否有在秒杀活动时间中的商品 Price price = new Price(); GetSeckillActivityInfo getSeckillActivityInfo = new GetSeckillActivityInfo(); getSeckillActivityInfo.setGoodsId(goodsId); GoodsSeckill goodsSeckill = seckillActivityInfoClient.getSeckillActivityInfo(getSeckillActivityInfo).getData(); - //没有秒杀活动或者添加的普通商品则使用秒杀活动价格 - if(null == goodsSeckill || type == 1){ + //没有秒杀活动 + if(null == goodsSeckill ){ return null; } //秒杀活动价格 price.setCash(goodsSeckill.getSellingPrice()); //计算对应积分 price.setPoint(getPoint(price.getCash())); + //结束时间 price.setEndTimeStamp(goodsSeckill.getEndTime()); return price; } -- Gitblit v1.7.1