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