Преглед изворни кода

重构订单支付前、支付成功逻辑代码;

codingliang пре 2 година
родитељ
комит
bb1b184402

+ 21 - 0
src/main/java/com/sqx/common/utils/DistanceUtil.java

@@ -0,0 +1,21 @@
+package com.sqx.common.utils;
+
+import com.sqx.modules.errand.util.LonLatUtil;
+import org.gavaghan.geodesy.Ellipsoid;
+import org.gavaghan.geodesy.GlobalCoordinates;
+
+/**
+ * 距离计算
+ *
+ * @author: codingliang
+ * @date: 2024-04-20 21:29
+ */
+public class DistanceUtil {
+
+    public static double distance(double ol, double od, double dl, double dd) {
+        GlobalCoordinates source = new GlobalCoordinates(ol, od);
+        GlobalCoordinates target = new GlobalCoordinates(dl, dd);
+        return LonLatUtil.getDistanceMeter(source, target, Ellipsoid.Sphere);
+    }
+
+}

+ 2 - 0
src/main/java/com/sqx/modules/app/service/UserMoneyService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.app.entity.UserMoney;
+import com.sqx.modules.order.entity.TbOrder;
 import org.springframework.web.bind.annotation.RequestAttribute;
 
 import java.math.BigDecimal;
@@ -26,4 +27,5 @@ public interface UserMoneyService extends IService<UserMoney> {
 
     Result updateCashDeposit(Long userId, BigDecimal money, Integer type);
 
+    void addConsumeRecord(TbOrder order);
 }

+ 21 - 0
src/main/java/com/sqx/modules/app/service/impl/UserMoneyServiceImpl.java

@@ -11,6 +11,7 @@ import com.sqx.modules.app.entity.*;
 import com.sqx.modules.app.service.UserMoneyDetailsService;
 import com.sqx.modules.app.service.UserMoneyService;
 
+import com.sqx.modules.order.entity.TbOrder;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -144,7 +145,27 @@ public class UserMoneyServiceImpl extends ServiceImpl<UserMoneyDao, UserMoney> i
         return Result.success();
     }
 
+    @Override
+    public void addConsumeRecord(TbOrder order) {
+        //添加用户钱包消费记录
+        UserMoneyDetails userMoneyDetails = new UserMoneyDetails();
+        userMoneyDetails.setUserId(order.getUserId());
+        if (order.getPayType() == 1) {
+            userMoneyDetails.setTitle("微信支付");
+            userMoneyDetails.setContent("使用微信支付:" + order.getPayMoney() + "元");
+        } else {
+            userMoneyDetails.setTitle("支付宝支付");
+            userMoneyDetails.setContent("使用支付宝支付:" + order.getPayMoney() + "元");
+        }
 
+        userMoneyDetails.setType(2);
+        userMoneyDetails.setClassify(3);
+        userMoneyDetails.setState(2);
+        userMoneyDetails.setMoney(order.getPayMoney());
+
+        userMoneyDetails.setCreateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+        userMoneyDetailsDao.insert(userMoneyDetails);
+    }
 
 
     /**

+ 22 - 0
src/main/java/com/sqx/modules/order/service/AppOrderService.java

@@ -91,4 +91,26 @@ public interface AppOrderService extends IService<TbOrder> {
     IPage<Evaluate> getEvaluateList(Evaluate evaluate, Integer page, Integer limit);
 
     Result deleteEvaluateById(Long userId, Long id);
+
+    /**
+     * 准备订单,用于订单支付前检验订单信息、填充订单必要参数
+     * @param userId 用户id
+     * @param orderParentId 父订单id 一般为订单id
+     * @param orderType 订单类别 为2时表示外卖订单、1表示上门
+     * @param addressId 地址id
+     * @return 订单信息
+     */
+    TbOrder prepareOrder(Long userId, Long orderParentId, Integer orderType, Long addressId);
+
+    /**
+     * 根据订单扣减库存
+     * @param order 订单信息
+     */
+    void subStock(TbOrder order);
+
+    /**
+     * 支付成功后更新订单
+     * @param order 订单信息
+     */
+    void updateOrderAfterPaySuccess(TbOrder order);
 }

+ 439 - 1
src/main/java/com/sqx/modules/order/service/impl/AppAppOrderServiceImpl.java

@@ -8,8 +8,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sqx.common.exception.SqxException;
 import com.sqx.common.utils.DateUtils;
+import com.sqx.common.utils.DistanceUtil;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
+import com.sqx.modules.address.entity.Address;
+import com.sqx.modules.address.service.AddressService;
 import com.sqx.modules.app.dao.UserBrowseDao;
 import com.sqx.modules.app.dao.UserDao;
 import com.sqx.modules.app.dao.UserMoneyDao;
@@ -43,7 +46,6 @@ import com.sqx.modules.order.service.AppOrderService;
 import com.sqx.modules.pay.controller.app.AliPayController;
 import com.sqx.modules.pay.dao.PayDetailsDao;
 import com.sqx.modules.pay.entity.PayDetails;
-import com.sqx.modules.pay.service.PayDetailsService;
 import com.sqx.modules.pay.service.WxErrService;
 import com.sqx.modules.shop.service.ShopMessageService;
 import com.sqx.modules.sys.dao.SysUserRoleDao;
@@ -55,6 +57,7 @@ import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
@@ -113,6 +116,8 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
     @Autowired
     private PayDetailsDao payDetailsDao;
     @Autowired
+    private AddressService addressService;
+    @Autowired
     private ShopMessageService shopMessageService;
     private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true);
 
@@ -336,6 +341,439 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         }
     }
 
+    @Transactional(propagation = Propagation.SUPPORTS)
+    @Override
+    public TbOrder prepareOrder(Long userId, Long orderParentId, Integer orderType, Long addressId) {
+        // 获取订单信息
+        TbOrder parentOrder = appOrderDao.selectById(orderParentId);
+        if (parentOrder == null) {
+            throw new SqxException("无效的订单id");
+        }
+
+        // 获取店铺信息
+        // 注意:调用shopMessageService获取店铺信息,这个service对店铺的抽成比例有特殊处理(历史代码就是如此/(ㄒoㄒ)/~~)
+        GoodsShop goodsShop = shopMessageService.selectShopId(parentOrder.getShopId());
+
+        // 设置订单类型
+        parentOrder.setOrderType(orderType);
+
+        // 校验订单信息
+        checkOrderGoods(parentOrder);
+
+        // 计算订单总价格(包含总打包费)和总打包费
+        calcOrderPriceAndPack(parentOrder);
+
+        // 校验地址、配送费信息
+        checkAddress(parentOrder, addressId, goodsShop);
+
+        // 校验优惠券信息
+        checkCoupon(parentOrder, userId);
+
+        // 计算店铺收益
+        calcShopIncome(parentOrder, goodsShop);
+
+        return parentOrder;
+    }
+
+    @Override
+    public void subStock(TbOrder tbOrder) {
+        Long shopId1 = tbOrder.getShopId();
+        Long orderId = tbOrder.getOrderId();
+        List<OrderGoods> orderGoodsList = orderGoodsDao.selectList(
+                new QueryWrapper<OrderGoods>()
+                    .eq("order_id", orderId));
+        for(int a = 0; a< orderGoodsList.size(); a++){
+            Integer goodsNum = orderGoodsList.get(a).getGoodsNum();
+            Long goodsId = orderGoodsList.get(a).getGoodsId();
+            GoodsShopRelevancy goodsShopRelevancy = goodsShopRelevancyDao.selectOne(
+                    new QueryWrapper<GoodsShopRelevancy>()
+                        .eq("shop_id", shopId1)
+                        .eq("goods_id", goodsId));
+            GoodsShopRelevancy goodsShopRelevancy1 = new GoodsShopRelevancy();
+            goodsShopRelevancy1.setId(goodsShopRelevancy.getId());
+
+            //加销量
+            goodsShopRelevancy1.setSales(goodsShopRelevancy.getSales() + goodsNum);
+
+            //减库存
+            goodsShopRelevancy1.setInventory(goodsShopRelevancy.getInventory() - goodsNum);
+            goodsShopRelevancyDao.updateById(goodsShopRelevancy1);
+            goodsShopDao.updateShopSales(1, goodsNum, goodsShopRelevancy.getShopId());
+        }
+    }
+
+    @Transactional(propagation = Propagation.SUPPORTS)
+    @Override
+    public void updateOrderAfterPaySuccess(TbOrder order) {
+        String currentTimeStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+        order.setOrderCode(generateOrderCode());
+        order.setIsPay(1);
+        order.setPayTime(currentTimeStr);
+
+        // 店铺信息
+        GoodsShop goodsShop = goodsShopDao.selectById(order.getShopId());
+        // 小程序推送设置
+        CommonInfo mpPushConfig = commonInfoService.findOne(269);
+        // 用户信息
+        UserEntity userEntity = userDao.selectById(order.getUserId());
+
+        // 添加消息记录并且进行推送
+        addOrderMessageAndPush(order, goodsShop, mpPushConfig, userEntity);
+
+        // 判断店铺是否设置自动接单
+        boolean autoAccept = goodsShop.getAutoAcceptOrder() != null && goodsShop.getAutoAcceptOrder() == 0;
+        if(autoAccept) {
+            // 6制作中
+            order.setStatus(6);
+            order.setShopReceivingTime(currentTimeStr);
+        } else {
+            // 7商家待接单
+            order.setStatus(7);
+        }
+
+        // 更新订单状态
+        updateById(order);
+
+        // 扣减库存
+        this.subStock(order);
+
+        // 如果是外卖订单,则生成一个跑腿的订单
+        tbIndentService.insertIndent(order);
+
+        // 优惠券变成已使用状态
+        updateCouponState(order);
+
+        // 如果是支付宝或者微信支付,用户钱包新增消费记录
+        addConsumeRecordInUserMoneyDetail(order);
+
+        if (autoAccept) {
+            // 发送商家接单通知
+            sendOrderAcceptMessage(order, goodsShop, mpPushConfig, userEntity);
+            // 打印小票
+            if (StringUtils.isNotEmpty(goodsShop.getSnCode())) {
+                // 查询当天店铺所有已支付的订单号,按支付时间排序
+                int sequence = selectCurrentOrderSequenceByShopId(order.getOrderId(), goodsShop.getShopId());
+                order.setCountOrder(sequence);
+                FeiYunUtils.print(goodsShop.getSnCode(), null, order);
+            }
+        }
+    }
+
+    /**
+     * 用户钱包新增消费记录
+     * @param order 订单信息
+     */
+    private void addConsumeRecordInUserMoneyDetail(TbOrder order) {
+        // 本来就是钱包支付的,前面已经记录了钱包消费记录,这里不要重复记录
+        if (order.getPayType() == 2) {
+            return;
+        }
+
+        userMoneyService.addConsumeRecord(order);
+    }
+
+    /**
+     * 发送订单接单消息
+     * @param order 订单信息
+     * @param goodsShop 店铺信息
+     * @param mpPushConfig 小程序推送设置
+     * @param userEntity 用户信息
+     */
+    private void sendOrderAcceptMessage(TbOrder order, GoodsShop goodsShop, CommonInfo mpPushConfig, UserEntity userEntity) {
+        List<String> msgList = new ArrayList<>();
+        String shopName = goodsShop.getShopName();
+        String orderNum1 = order.getOrderNumber();
+        msgList.add("商家已接单");
+        msgList.add(orderNum1);
+        msgList.add(shopName);
+        msgList.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+        userService.pushToSingle("商家已接单", "亲爱的用户您好,商家已接单,请耐心等待!", userEntity.getClientid());
+
+        SenInfoCheckUtil.sendMsg(userEntity.getOpenId(), mpPushConfig.getValue(), msgList, 1);
+    }
+
+    /**
+     * 添加订单消息并推送消息
+     * @param order 订单信息
+     * @param goodsShop 店铺信息
+     * @param mpPushConfig 小程序推送设置
+     * @param userEntity 用户信息
+     */
+    private void addOrderMessageAndPush(TbOrder order, GoodsShop goodsShop, CommonInfo mpPushConfig, UserEntity userEntity) {
+        String currentDateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+        // 用户消息
+        MessageInfo userMessageInfo = new MessageInfo();
+
+        userMessageInfo.setTitle("下单");
+        userMessageInfo.setContent("恭喜您,下单成功!");
+        userMessageInfo.setCreateAt(currentDateStr);
+        userMessageInfo.setUserId(order.getUserId().toString());
+        userMessageInfo.setUserName(userEntity.getUserName());
+        messageInfoDao.insert(userMessageInfo);
+
+        // 商家消息
+        MessageInfo shopMessageInfo = new MessageInfo();
+        shopMessageInfo.setTitle("有新订单");
+        shopMessageInfo.setCreateAt(currentDateStr);
+        shopMessageInfo.setContent("有新订单,请及时处理!");
+        shopMessageInfo.setShopId(order.getShopId());
+        shopMessageInfo.setReadFlag(2);
+        shopMessageInfo.setIsSee("2");
+        messageInfoDao.insert(shopMessageInfo);
+
+
+        // 商户消息模板
+        CommonInfo shopTemplate = commonInfoService.findOne(352);
+        UserEntity shopUser = userService.selectUserById(goodsShop.getUserId());
+
+        // 用户端消息推送
+        List<String> userMsgList = new ArrayList<>();
+        userMsgList.add("下单成功");
+        userMsgList.add(order.getOrderCode());
+        userMsgList.add(goodsShop.getShopName());
+        userMsgList.add(currentDateStr);
+        SenInfoCheckUtil.sendMsg(userEntity.getOpenId(), mpPushConfig.getValue(), userMsgList,1);
+        userService.pushToSingle("下单成功", "亲爱的用户您好,您已下单成功,请等待商家接单!", userEntity.getClientid());
+
+        // 商户端消息推送
+        List<String> shopMsgShopList=new ArrayList<>();
+        shopMsgShopList.add(order.getOrderNumber());
+        shopMsgShopList.add(order.getPayMoney().toString());
+        shopMsgShopList.add(order.getPayTime());
+        shopMsgShopList.add("生意来了,立即去接单>");
+        if(StringUtils.isNotEmpty(shopUser.getShopOpenId())){
+            SenInfoCheckUtil.sendShopMsg(shopUser.getShopOpenId(), shopTemplate.getValue(), shopMsgShopList,7);
+        }
+        if(StringUtils.isNotEmpty(shopUser.getShopClientId())){
+            userService.pushToSingleShop("下单成功","生意来了,立即去接单>",shopUser.getShopClientId());
+        }
+    }
+
+    /**
+     * 更新优惠券状态 更新订单状态
+     * @param order 订单信息
+     */
+    private void updateCouponState(TbOrder order) {
+        if(order.getCouponId()!=null){
+            TbCouponUser tbCouponUser = new TbCouponUser();
+            tbCouponUser.setId(order.getCouponId());
+            tbCouponUser.setStatus(1);
+            tbCouponUserDao.updateById(tbCouponUser);
+        }
+    }
+
+    /**
+     * 生成取餐号
+     * @return 订单号
+     */
+    private String generateOrderCode() {
+        String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+        TbOrder preOrder = orderGoodsDao.selectByPayTime(format);
+
+        String orderCode;
+        if(preOrder == null) {
+            String a = new SimpleDateFormat("yyyyMMdd").format(new Date());
+            orderCode = a + "001";
+        } else {
+            Long a = Long.parseLong(preOrder.getOrderCode()) + 1;
+            orderCode = a.toString();
+        }
+
+        return orderCode;
+    }
+
+    /**
+     * 计算店铺收益 店铺订单收益=订单应付金额+订单使用的优惠券金额-跑腿费用
+     * @param order 订单信息
+     * @param goodsShop 店铺信息
+     */
+    private void calcShopIncome(TbOrder order, GoodsShop goodsShop) {
+        BigDecimal shopRate = goodsShop.getShopRate();
+        BigDecimal sumMoney = order.getPayMoney();
+
+        sumMoney = sumMoney.add(order.getCouponMoney());
+        if (order.getAutoSendOrder() == 0) {
+            sumMoney = sumMoney.subtract(goodsShop.getErrandMoney());
+        }
+
+        BigDecimal shopMoney = sumMoney .multiply(shopRate);
+        order.setShopIncomeMoney(shopMoney.setScale(2, BigDecimal.ROUND_DOWN));
+    }
+
+    /**
+     * 校验订单优惠券信息
+     * @param order 订单信息
+     * @return 使用的优惠券金额
+     */
+    private void checkCoupon(TbOrder order, Long userId) {
+        if (order.getCouponId() == null) {
+            order.setCouponMoney(BigDecimal.ZERO);
+
+            return;
+        }
+
+        TbCouponUser tbCouponUser = tbCouponUserDao.selectById(order.getCouponId());
+        // 订单应付金额
+        BigDecimal payMoney = order.getPayMoney();
+
+        if(!tbCouponUser.getUserId().equals(userId)){
+            throw new SqxException("优惠券与登录用户不匹配");
+        }
+        if(tbCouponUser.getStatus()!=0){
+            throw new SqxException("该优惠券已失效");
+        }
+        if(tbCouponUser.getMinMoney().doubleValue() > payMoney.doubleValue()){
+            throw new SqxException("订单金额不足,无法使用该优惠券");
+        }
+        if(tbCouponUser.getShopId() != 0 && !tbCouponUser.getShopId().equals(order.getShopId())){
+            throw new SqxException("优惠券使用错误,请刷新后重试");
+        }
+
+        BigDecimal couponUserMoney = tbCouponUser.getMoney();
+        payMoney = payMoney.subtract(couponUserMoney);
+        //如果使用红包后,订单价格小于0,则改为0.01元
+        if(payMoney.doubleValue() <= 0){
+            payMoney = new BigDecimal("0.01");
+        }
+
+        // 更新订单总金额
+        order.setPayMoney(payMoney);
+
+        order.setCouponMoney(couponUserMoney);
+    }
+
+    /**
+     * 校验配送范围、配送费
+     * @param order 订单信息
+     * @param addressId 用户收货地址id
+     * @param goodsShop 店铺信息
+     */
+    private void checkAddress(TbOrder order, Long addressId, GoodsShop goodsShop) {
+        // 如果时外卖订单
+        if (order.getOrderType() == 2) {
+            if(addressId == null){
+                throw new SqxException("请填写地址地址!");
+            }
+            Address address = addressService.getById(addressId);
+
+            // 计算用户位置到商户位置的距离,并判断是否在配送范围内
+            double distance = DistanceUtil.distance(goodsShop.getShopLat(), goodsShop.getShopLng(), address.getLat(), address.getLng());
+            if(distance > goodsShop.getDistributionDistance()){
+                throw new SqxException("超出商家配送范围,无法点餐!");
+            }
+
+            // 店铺跑腿费
+            BigDecimal shopErrandMoney = goodsShop.getErrandMoney();
+
+            // 如果店铺减免配送费最小订单金额不为null 并且 店铺配送费不为null且大于0 并且 订单金额小于店铺减免配送费最小订单金额
+            // 则用户承担加跑腿费
+            if(goodsShop.getExemptMinMoney() != null
+                    && shopErrandMoney != null
+                    && shopErrandMoney.doubleValue() > 0
+                    && order.getPayMoney().doubleValue() < goodsShop.getExemptMinMoney().doubleValue()){
+                // 跑腿费加入订单总金额
+                order.setPayMoney(order.getPayMoney().add(shopErrandMoney));
+                // 更新订单跑腿费
+                order.setErrandMoney(shopErrandMoney);
+                order.setErrandMoneyIsShop("本单未达到商家满减金额,跑腿费由用户承担");
+            }
+            // 否则店铺承担跑腿费
+            else {
+                order.setErrandMoneyIsShop("本单已达到商家满减金额,跑腿费由商家承担");
+            }
+
+            order.setErrandMoney(shopErrandMoney == null ? BigDecimal.ZERO : shopErrandMoney);
+
+            //判断订单金额是否大于最低起送金额
+            if(goodsShop.getMinimumDelivery() == null){
+                goodsShop.setMinimumDelivery(BigDecimal.valueOf(0));
+            }
+
+            if(order.getPayMoney().doubleValue() < goodsShop.getMinimumDelivery().doubleValue()){
+                throw new SqxException("订单金额未满足最低起送金额!");
+            }
+
+            // 设置地址信息
+            String addressJson = JSONObject.toJSONString(address);
+            order.setAddress(addressJson);
+            order.setAddressId(addressId);
+
+            // 设置是否自动派单
+            Integer autoSendOrder = 1;
+            if(goodsShop.getAutoSendOrder() == 0){
+                autoSendOrder = 0;
+            }
+            order.setAutoSendOrder(autoSendOrder);
+        }
+    }
+
+    /**
+     * 计算商品总价格和商品总打包费
+     * @param parentOrder 订单信息
+     */
+    private void calcOrderPriceAndPack(TbOrder parentOrder) {
+        // 商品总打包费 初始为0
+        BigDecimal goodsPack = BigDecimal.valueOf(0);
+        // 商品总价格 初始为0,商品总价格包含总打包费
+        BigDecimal payMoney = BigDecimal.valueOf(0);
+        List<TbOrder> orderList = selectOrderByParentId(parentOrder.getOrderId());
+        if(orderList.size() == 0){
+            throw new SqxException("订单不存在,请刷新后重试!");
+        }
+        for(int i = 0; i < orderList.size(); i++) {
+            List<OrderGoods> orderGoodsList = orderGoodsDao.selectList(
+                    new QueryWrapper<OrderGoods>()
+                            .eq("order_id", orderList.get(i).getOrderId()));
+            for (int a = 0; a < orderGoodsList.size(); a++) {
+                BigDecimal goodsNum = new BigDecimal(orderGoodsList.get(a).getGoodsNum());
+                BigDecimal goodsPrice = orderGoodsList.get(a).getGoodsPrice();
+                BigDecimal goodsPacks = orderGoodsList.get(a).getGoodsPack();
+
+                // 当前子订单总打包费
+                BigDecimal sumGoodsPack = goodsNum.multiply(goodsPacks);
+                // 当前子订单总商品价格
+                BigDecimal multiply1 = goodsNum.multiply(goodsPrice);
+                // 当前子订单总打包费计入父订单总打包费
+                goodsPack = goodsPack.add(sumGoodsPack);
+                // 当前子订单总商品价格计入父订单总商品价格
+                payMoney = payMoney.add(multiply1);
+                // 当前子订单总打包费计入入父订单总商品价格
+                payMoney = payMoney.add(sumGoodsPack);
+            }
+        }
+
+        // 订单设置订单总金额
+        parentOrder.setPayMoney(payMoney);
+        parentOrder.setPackMoney(goodsPack);
+    }
+
+    private void checkOrderGoods(TbOrder order) {
+        Long orderId = order.getOrderId();
+        // 获取订单商品信息
+        List<OrderGoods> orderGoodsList = orderGoodsDao.selectList(
+                new QueryWrapper<OrderGoods>()
+                    .eq("order_id", orderId));
+        for(int b = 0; b < orderGoodsList.size(); b++){
+            OrderGoods orderGoods = orderGoodsList.get(b);
+            Long goodsId = orderGoods.getGoodsId();
+            Goods goods = goodsDao.selectById(goodsId);
+            if(goods == null || goods.getStatus().equals(1)) {
+                // TODO ??感觉有问题??
+                orderGoodsDao.deleteById(orderGoods.getId());
+                throw new SqxException("商品:"+orderGoods.getGoodsName()+",不存在,请刷新后重试!");
+            }
+
+            GoodsShopRelevancy goodsShopRelevancy = goodsShopRelevancyDao.selectOne(
+                    new QueryWrapper<GoodsShopRelevancy>()
+                        .eq("goods_id", goodsId)
+                        .eq("shop_id", order.getShopId()));
+            int i = goodsShopRelevancyDao.selectGoodsCount(orderId, goodsId);
+            if(goodsShopRelevancy.getInventory() < i){
+                throw new SqxException("库存不足");
+            }
+        }
+    }
+
     @Override
     public Result joinOrder(Long userId, Long orderId, Long shopId, Long goodsId, Integer num, Long skuId, String skuMessage) {
         // 判断当前时间是否在店铺营业范围内

+ 49 - 506
src/main/java/com/sqx/modules/pay/service/impl/WxServiceImpl.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.wxpay.sdk.WXPay;
 import com.github.wxpay.sdk.WXPayConstants;
 import com.github.wxpay.sdk.WXPayUtil;
+import com.sqx.common.utils.DistanceUtil;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.address.dao.AddressDao;
 import com.sqx.modules.address.entity.Address;
@@ -143,264 +144,45 @@ public class WxServiceImpl implements WxService {
         return Result.error("系统繁忙,请稍后再试!");
     }
 
+    /**
+     * 钱包支付订单
+     * @param userId
+     * @param parentId
+     * @param orderType
+     * @param addressId
+     * @return
+     */
     @Transactional
     public Result balanceOrders(Long userId, Long parentId, Integer orderType, Long addressId){
-        String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
-        TbOrder tbOrder2 = appOrderDao.selectById(parentId);
-        Address address = addressDao.selectById(addressId);
-        tbOrder2.setOrderType(orderType);
-        //判断商品数量不能超过库存
-        Long orderId1 = tbOrder2.getOrderId();
-        List<OrderGoods> orderGoodsList1 = orderGoodsDao.selectList(new QueryWrapper<OrderGoods>().eq("order_id", orderId1));
-        for(int b = 0;b<orderGoodsList1.size();b++){
-            Long goodsId = orderGoodsList1.get(b).getGoodsId();
-            OrderGoods orderGoods = orderGoodsList1.get(b);
-            Goods goods = goodsService.getById(orderGoods.getGoodsId());
-            if(goods==null || goods.getStatus().equals(1)){
-                orderGoodsDao.deleteById(orderGoods.getId());
-                return Result.error("商品:"+orderGoods.getGoodsName()+",不存在,请刷新后重试!");
-            }
-
-            GoodsShopRelevancy goodsShopRelevancy = goodsShopRelevancyDao.selectOne(new QueryWrapper<GoodsShopRelevancy>()
-                    .eq("goods_id", goodsId).eq("shop_id", tbOrder2.getShopId()));
-            int i = goodsShopRelevancyDao.selectGoodsCount(orderId1, goodsId);
-            if(goodsShopRelevancy.getInventory()<i){
-                return Result.error("库存不足");
-            }
-        }
-        List<TbOrder> tbOrderList = appOrderService.selectOrderByParentId(parentId);
-        BigDecimal goodsPack = BigDecimal.valueOf(0);
-        BigDecimal payMoney = BigDecimal.valueOf(0);
-        for(int i = 0;i<tbOrderList.size();i++){
-            List<OrderGoods> orderGoodsList = orderGoodsDao.selectList(new QueryWrapper<OrderGoods>().eq("order_id", tbOrderList.get(i).getOrderId()));
-            for (int a = 0; a < orderGoodsList.size(); a++) {
-                BigDecimal goodsNum = new BigDecimal(orderGoodsList.get(a).getGoodsNum());
-                BigDecimal goodsPrice = orderGoodsList.get(a).getGoodsPrice();
-                BigDecimal goodsPacks = orderGoodsList.get(a).getGoodsPack();
-                BigDecimal sumGoodsPack = goodsNum.multiply(goodsPacks);
-                BigDecimal multiply1 = goodsNum.multiply(goodsPrice);
-                goodsPack = goodsPack.add(sumGoodsPack);
-                payMoney = payMoney.add(multiply1);
-                BigDecimal multiply2 = goodsNum.multiply(orderGoodsList.get(a).getGoodsPack());
-                payMoney = payMoney.add(multiply2);
-            }
-        }
-        //查该商户的配送费 和 减免配送费最小订单金额
-        GoodsShop goodsShop2 = goodsShopDao.selectById(tbOrder2.getShopId());
-        BigDecimal errandMoney=BigDecimal.ZERO;
-        if(orderType==2) {
-            //计算用户位置到商户位置的距离,并判断是否在配送范围内
-            double distance = distance(goodsShop2.getShopLat(), goodsShop2.getShopLng(), address.getLat(), address.getLng());
-            if(distance>goodsShop2.getDistributionDistance()){
-                return Result.error("超出商家配送范围,无法点餐!");
-            }
-            if(goodsShop2.getExemptMinMoney()!=null && payMoney.doubleValue()<goodsShop2.getExemptMinMoney().doubleValue() && goodsShop2.getErrandMoney()!=null && goodsShop2.getErrandMoney().doubleValue()>0){
-                //加跑腿费
-                payMoney = payMoney.add(goodsShop2.getErrandMoney());
-                errandMoney=goodsShop2.getErrandMoney();
-                tbOrder2.setErrandMoneyIsShop("本单未达到商家满减金额,跑腿费由用户承担");
-            }else{
-                tbOrder2.setErrandMoneyIsShop("本单已达到商家满减金额,跑腿费由商家承担");
-                if(goodsShop2.getAutoSendOrder()!=null && goodsShop2.getAutoSendOrder()==0){
-                    errandMoney=goodsShop2.getErrandMoney() == null ? BigDecimal.ZERO : goodsShop2.getErrandMoney();
-                }
-            }
+        // 获取订单信息
+        TbOrder tbOrder = appOrderService.prepareOrder(userId, parentId, orderType, addressId);
 
-            tbOrder2.setErrandMoney(goodsShop2.getErrandMoney()==null?BigDecimal.ZERO:goodsShop2.getErrandMoney());
-            //判断订单金额是否大于最低起送金额
-            if(goodsShop2.getMinimumDelivery()==null){
-                goodsShop2.setMinimumDelivery(BigDecimal.valueOf(0));
-            }
-            if(goodsShop2.getMinimumDelivery()!=null && payMoney.doubleValue()<goodsShop2.getMinimumDelivery().doubleValue()){
-                return Result.error("订单金额未满足最低起送金额!");
-            }
-        }
-        if(tbOrder2.getCouponId()!=null){
-            TbCouponUser tbCouponUser = tbCouponUserDao.selectById(tbOrder2.getCouponId());
-            //计算总支付金额
-            if(!tbCouponUser.getUserId().equals(userId)){
-                return Result.error("优惠券与登录用户不匹配");
-            }
-            if(tbCouponUser.getStatus()!=0){
-                return Result.error("该优惠券已失效");
-            }
-            if(tbCouponUser.getMinMoney().doubleValue()>payMoney.doubleValue()){
-                return Result.error("订单金额不足,无法使用该优惠券");
-            }
-            if(!tbCouponUser.getShopId().equals(tbOrder2.getShopId()) && tbCouponUser.getShopId()!=0){
-                return Result.error("优惠券使用错误,请刷新后重试");
-            }
-            payMoney = payMoney.subtract(tbCouponUser.getMoney());
-            //如果使用红包后,订单价格小于0,则改为0.01元
-            if(payMoney.doubleValue()<=0){
-                payMoney = new BigDecimal("0.01");
-            }
-        }
-        if(tbOrderList.size()==0){
-            return Result.error("订单不存在,请刷新后重试!");
-        }
-        if(orderType==2&&addressId==null){
-            return Result.error("请填写地址地址!");
-        }
-        /*if(!tbOrderList.get(0).getOrderId().equals(tbOrderList.get(0).getParentId())){
-            return Result.error("您不是订单发起人,无法支付该订单!");
-        }*/
+        // 扣除用户余额
+        BigDecimal payMoney = tbOrder.getPayMoney();
         UserMoney userMoney = userMoneyService.selectUserMoneyByUserId(userId);
-        if(payMoney.doubleValue()>userMoney.getMoney().doubleValue()){
+        if(payMoney.doubleValue() > userMoney.getMoney().doubleValue()){
             return Result.error("您的余额不足,请充值后再支付!");
         }
-        tbOrder2.setPayMoney(payMoney);
-        userMoneyService.updateMoney(2, userId, tbOrder2.getPayMoney().doubleValue());
-        //支付成功,增加该商品和商铺的销量,减少该商品库存
-        Long shopId1 = tbOrder2.getShopId();
-        Long orderId = tbOrder2.getOrderId();
-        List<OrderGoods> orderGoodsList = orderGoodsDao.selectList(new QueryWrapper<OrderGoods>().eq("order_id", orderId));
-        for(int a = 0;a<orderGoodsList.size();a++){
-            Integer goodsNum = orderGoodsList.get(a).getGoodsNum();
-            Long goodsId = orderGoodsList.get(a).getGoodsId();
-            GoodsShopRelevancy goodsShopRelevancy = goodsShopRelevancyDao.selectOne(new QueryWrapper<GoodsShopRelevancy>()
-                    .eq("shop_id", shopId1).eq("goods_id", goodsId));
-            GoodsShopRelevancy goodsShopRelevancy1 = new GoodsShopRelevancy();
-            goodsShopRelevancy1.setId(goodsShopRelevancy.getId());
-            goodsShopRelevancy1.setSales(goodsShopRelevancy.getSales()+goodsNum);//加销量
-            goodsShopRelevancy1.setInventory(goodsShopRelevancy.getInventory()-goodsNum);//减库存
-            goodsShopRelevancyDao.updateById(goodsShopRelevancy1);
-            goodsShopDao.updateShopSales(1,goodsNum, goodsShopRelevancy.getShopId());
-        }
-
-        //支付成功,修改订单状态
+        userMoneyService.updateMoney(2, userId, payMoney.doubleValue());
 
-        TbOrder tbOrder = orderGoodsDao.selectByPayTime(format);
-        String orderCode = null;
-        if(tbOrder==null){
-            String a = new SimpleDateFormat("yyyyMMdd").format(new Date());
-            orderCode = a+"001";
-        }else {
-            Long a = Long.parseLong(tbOrder.getOrderCode())+ 1;
-            orderCode = a.toString();
-        }
-        tbOrder2.setOrderCode(orderCode);
-        //tbOrder1.setOrderCode(orderCode);
-        tbOrder2.setIsPay(1);
-        tbOrder2.setErrandMoney(errandMoney);
-        tbOrder2.setPackMoney(goodsPack);
-        tbOrder2.setOrderType(orderType);
-        tbOrder2.setStatus(7);
-        tbOrder2.setPayMoney(payMoney);
-        tbOrder2.setPayType(2);
-        tbOrder2.setPayTime(format);
-        if(orderType==2){
-            //添加地址
-            String addressJson = JSONObject.toJSONString(address);
-            tbOrder2.setAddress(addressJson);
-            tbOrder2.setAddressId(addressId);
-        }
-        Integer autoSendOrder = 1;
-        //如果是外卖订单,则生成一个跑腿的订单
-        if(orderType==2){
-            tbOrder2.setAddressId(addressId);
-            GoodsShop goodsShop = goodsShopDao.selectById(tbOrder2.getShopId());
-            //商户开启自动推单再生成订单
-            if(goodsShop.getAutoSendOrder()==0){
-                autoSendOrder = 0;
-            }
-        }
-        indentService.insertIndent(tbOrder2);
-        tbOrder2.setAutoSendOrder(autoSendOrder);
-        appOrderDao.updateById(tbOrder2);
-        //将优惠券改为已使用状态
-        if(tbOrder2.getCouponId()!=null){
-            TbCouponUser tbCouponUser = new TbCouponUser();
-            tbCouponUser.setId(tbOrder2.getCouponId());
-            tbCouponUser.setStatus(1);
-            tbCouponUserService.updateById(tbCouponUser);
-        }
-        //添加钱包消费记录
+        // 添加钱包消费记录
         UserMoneyDetails userMoneyDetails = new UserMoneyDetails();
         userMoneyDetails.setUserId(userId);
         userMoneyDetails.setTitle("余额支付");
         userMoneyDetails.setType(2);
         userMoneyDetails.setClassify(3);
         userMoneyDetails.setState(2);
-        userMoneyDetails.setMoney(tbOrder2.getPayMoney());
-        String money = String.format("%.2f", tbOrder2.getPayMoney());
-        userMoneyDetails.setContent("使用余额支付:"+money+"元");
+        userMoneyDetails.setMoney(payMoney);
+        userMoneyDetails.setContent("使用余额支付:"+ String.format("%.2f", payMoney) +"元");
         userMoneyDetails.setCreateTime(sdf.format(new Date()));
         userMoneyDetailsDao.insert(userMoneyDetails);
-        //添加消息记录
-        MessageInfo messageInfo = new MessageInfo();
-        UserEntity userEntity = userDao.selectById(userId);
-        messageInfo.setTitle("下单");
-        messageInfo.setContent("恭喜您,下单成功!");
-        messageInfo.setCreateAt(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
-        messageInfo.setUserId(tbOrder2.getUserId().toString());
-        messageInfo.setUserName(userEntity.getUserName());
-        messageInfoDao.insert(messageInfo);
-        //店铺端添加消息记录
-        MessageInfo messageInfo1 = new MessageInfo();
-        messageInfo1.setTitle("有新订单");
-        messageInfo1.setCreateAt(format);
-        messageInfo1.setContent("有新订单,请及时处理!");
-        messageInfo1.setShopId(tbOrder2.getShopId());
-        messageInfo1.setReadFlag(2);
-        messageInfo1.setIsSee("2");
-        messageInfoDao.insert(messageInfo1);
-        //设置小程序消息推送
-        CommonInfo one2 = commonInfoService.findOne(269);
-        List<String> msgList=new ArrayList<>();
-        Long shopId = tbOrder2.getShopId();
-        GoodsShop goodsShop = shopMessageService.selectShopId(shopId);
-        String shopName = goodsShop.getShopName();
-//        String goodsMoney = tbOrder2.getPayMoney().toString();
-        String orderNum1 = tbOrder2.getOrderNumber();
-//        String payTime = tbOrder2.getPayTime();
-        msgList.add("下单成功");
-        msgList.add(orderNum1);
-        msgList.add(shopName);
-        msgList.add(format);
-        SenInfoCheckUtil.sendMsg(userEntity.getOpenId(),one2.getValue(),msgList,1);
-        userService.pushToSingle("下单成功", "亲爱的用户您好,您已下单成功,请等待商家接单!", userEntity.getClientid());
-
 
-        CommonInfo shopTemplate = commonInfoService.findOne(352);
-        //商家通知
-        List<String> msgShopList=new ArrayList<>();
-        msgShopList.add(tbOrder2.getOrderNumber());
-        msgShopList.add(tbOrder2.getPayMoney().toString());
-        msgShopList.add(tbOrder2.getPayTime());
-        msgShopList.add("生意来了,立即去接单>");
-        UserEntity shopUser = userService.selectUserById(goodsShop.getUserId());
-        if(StringUtils.isNotEmpty(shopUser.getShopOpenId())){
-            SenInfoCheckUtil.sendShopMsg(shopUser.getShopOpenId(),shopTemplate.getValue(),msgShopList,7);
-        }
-        if(StringUtils.isNotEmpty(shopUser.getShopClientId())){
-            userService.pushToSingleShop("下单成功","生意来了,立即去接单>",shopUser.getShopClientId());
-        }
+        // 设置订单支付方式 2为余额支付
+        tbOrder.setPayType(2);
 
+        // 订单支付成功
+        appOrderService.updateOrderAfterPaySuccess(tbOrder);
 
-        //处理如果是设置了自动接单 判断是否自动接单
-        //商户开启自动推单再生成订单
-        BigDecimal shopRate = goodsShop.getShopRate();
-        BigDecimal sumMoney = tbOrder2.getPayMoney();
-        if (tbOrder2.getCouponId() != null) {
-            TbCouponUser tbCouponUser = tbCouponUserDao.selectById(tbOrder2.getCouponId());
-            sumMoney = tbOrder2.getPayMoney().add(tbCouponUser.getMoney());
-        }
-        if (tbOrder2.getAutoSendOrder() == 0) {
-            //再减去商户需要支付的配送费
-//            sumMoney = sumMoney.subtract(tbOrder2.getErrandMoney());
-            sumMoney = sumMoney.subtract(goodsShop2.getErrandMoney());
-        }
-
-        BigDecimal shopMoney = sumMoney .multiply(shopRate);
-        shopMoney = (shopMoney.setScale(2, BigDecimal.ROUND_DOWN));
-        tbOrder2.setShopIncomeMoney(shopMoney);
-        if(goodsShop.getAutoAcceptOrder()!=null && goodsShop.getAutoAcceptOrder()==0){
-            tbOrder2.setStatus(6);
-            appOrderService.updateOrder(tbOrder2);
-        }else{
-            appOrderService.updateOrder(tbOrder2);
-        }
         return Result.success();
     }
 
@@ -450,13 +232,6 @@ public class WxServiceImpl implements WxService {
         return Result.success();
     }
 
-    public double distance(double ol, double od, double dl, double dd) {
-        GlobalCoordinates source = new GlobalCoordinates(ol, od);
-        GlobalCoordinates target = new GlobalCoordinates(dl, dd);
-        return LonLatUtil.getDistanceMeter(source, target, Ellipsoid.Sphere);
-    }
-
-
     @Override
     public Result shopCashDeposit(Long shopId, Double money, String openId,Integer type) throws Exception {
         GoodsShop goodsShop = goodsShopDao.selectById(shopId);
@@ -476,127 +251,37 @@ public class WxServiceImpl implements WxService {
         return pay(money.doubleValue(), type, userId, generalOrder, 2);
     }
 
+    /**
+     * 微信/支付宝支付订单
+     * @param userId 用户id
+     * @param parentId 父订单id
+     * @param type 支付方式
+     * @param addressId 用户地址id
+     * @param orderType 订单类型 1到店、2外卖
+     */
     @Override
     public Result payOrder(Long userId, Long parentId, Integer type, Long addressId, Integer orderType) throws Exception {
-        TbOrder tbOrder2 = appOrderDao.selectById(parentId);
-        Address address = addressDao.selectById(addressId);
-        //判断商品数量不能超过库存
-        Long orderId1 = tbOrder2.getOrderId();
-        List<OrderGoods> orderGoodsList1 = orderGoodsDao.selectList(new QueryWrapper<OrderGoods>().eq("order_id", orderId1));
-        for(int b = 0;b<orderGoodsList1.size();b++){
-            Long goodsId = orderGoodsList1.get(b).getGoodsId();
-            OrderGoods orderGoods = orderGoodsList1.get(b);
-            Goods goods = goodsService.getById(orderGoods.getGoodsId());
-            if(goods==null || goods.getStatus().equals(1)){
-                orderGoodsDao.deleteById(orderGoods.getId());
-                return Result.error("商品:"+orderGoods.getGoodsName()+",不存在,请刷新后重试!");
-            }
-            GoodsShopRelevancy goodsShopRelevancy = goodsShopRelevancyDao.selectOne(new QueryWrapper<GoodsShopRelevancy>()
-                    .eq("goods_id", goodsId).eq("shop_id", tbOrder2.getShopId()));
-            int i = goodsShopRelevancyDao.selectGoodsCount(orderId1, goodsId);
-            if(goodsShopRelevancy.getInventory()<i){
-                return Result.error("库存不足");
-            }
-        }
-        List<TbOrder> tbOrder = appOrderService.selectOrderByParentId(parentId);
-        BigDecimal goodsPack = BigDecimal.valueOf(0);
-        BigDecimal payMoney = BigDecimal.valueOf(0);
-        for(int i = 0;i<tbOrder.size();i++){
-            List<OrderGoods> orderGoodsList = orderGoodsDao.selectList(new QueryWrapper<OrderGoods>().eq("order_id", tbOrder.get(i).getOrderId()));
-            for (int a = 0; a < orderGoodsList.size(); a++) {
-                BigDecimal goodsNum = new BigDecimal(orderGoodsList.get(a).getGoodsNum());
-                BigDecimal goodsPrice = orderGoodsList.get(a).getGoodsPrice();
-                BigDecimal goodsPacks = orderGoodsList.get(a).getGoodsPack();
-                BigDecimal sumGoodsPack = goodsNum.multiply(goodsPacks);
-                BigDecimal multiply1 = goodsNum.multiply(goodsPrice);
-                goodsPack = goodsPack.add(sumGoodsPack);
-                payMoney = payMoney.add(multiply1);
-                BigDecimal multiply2 = goodsNum.multiply(orderGoodsList.get(a).getGoodsPack());
-                payMoney = payMoney.add(multiply2);
-            }
-        }
-        //查该商户的配送费 和 减免配送费最小订单金额
-        GoodsShop goodsShop2 = goodsShopDao.selectById(tbOrder2.getShopId());
-        BigDecimal errandMoney=BigDecimal.ZERO;
-
-        TbOrder tbOrder1 = new TbOrder();
+        TbOrder tbOrder = appOrderService.prepareOrder(userId, parentId, orderType, addressId);
 
-        if(orderType==2) {
-            //计算用户位置到商户位置的距离,并判断是否在配送范围内
-            double distance = distance(goodsShop2.getShopLat(), goodsShop2.getShopLng(), address.getLat(), address.getLng());
-            if(distance>goodsShop2.getDistributionDistance()) {
-                return Result.error("超出商家配送范围,无法点餐!");
-            }
-
-            if (goodsShop2.getExemptMinMoney() != null && payMoney.doubleValue() < goodsShop2.getExemptMinMoney().doubleValue()) {
-                //加跑腿费
-                errandMoney=goodsShop2.getErrandMoney() == null ? BigDecimal.ZERO : goodsShop2.getErrandMoney();
-                payMoney = payMoney.add(errandMoney);
-                tbOrder1.setErrandMoneyIsShop("本单未达到商家满减金额,跑腿费由用户承担");
-            }else{
-                tbOrder1.setErrandMoneyIsShop("本单已达到商家满减金额,跑腿费由商家承担");
-                if(goodsShop2.getAutoSendOrder()!=null && goodsShop2.getAutoSendOrder()==0){
-                    errandMoney=goodsShop2.getErrandMoney() == null ? BigDecimal.ZERO : goodsShop2.getErrandMoney();
-                }
-            }
-            tbOrder2.setErrandMoney(goodsShop2.getErrandMoney()==null?BigDecimal.ZERO:goodsShop2.getErrandMoney());
-            //判断订单金额是否大于最低起送金额
-            if(goodsShop2.getMinimumDelivery()==null){
-                goodsShop2.setMinimumDelivery(BigDecimal.valueOf(0));
-            }
-            if(goodsShop2.getMinimumDelivery()!=null && payMoney.doubleValue()<goodsShop2.getMinimumDelivery().doubleValue()){
-                return Result.error("订单金额未满足最低起送金额!");
-            }
-            if(addressId==null){
-                return Result.error("请填写地址地址!");
-            }
+        // 设置支付方式 1表示微信支付、4或5表示支付宝支付
+        tbOrder.setPayType(1);
+        if(type== 4 || type== 5){
+            tbOrder.setPayType(3);
         }
-        if(tbOrder2.getCouponId()!=null){
-            TbCouponUser tbCouponUser = tbCouponUserDao.selectById(tbOrder2.getCouponId());
-            //计算总支付金额
-            if(!tbCouponUser.getUserId().equals(userId)){
-                return Result.error("优惠券与登录用户不匹配");
-            }
-            if(tbCouponUser.getStatus()!=0){
-                return Result.error("该优惠券已失效");
-            }
-            if(tbCouponUser.getMinMoney().doubleValue()>payMoney.doubleValue()){
-                return Result.error("订单金额不足,无法使用该优惠券");
-            }
-            if(!tbCouponUser.getShopId().equals(tbOrder2.getShopId()) && tbCouponUser.getShopId()!=0){
-                return Result.error("优惠券使用错误,请刷新后重试");
-            }
-            payMoney = payMoney.subtract(tbCouponUser.getMoney());
-            if(payMoney.doubleValue()<=0){
-                payMoney = new BigDecimal(0.01);
-            }
-        }
-        /*if(tbOrder.get(0).getOrderId().equals(tbOrder.get(0).getParentId())){
-            return Result.error("您不是订单发起人,无法支付该订单!");
-        }*/
 
-        tbOrder1.setOrderId(tbOrder.get(0).getOrderId());
-        tbOrder1.setPayMoney(payMoney);
-        tbOrder1.setPackMoney(goodsPack);
-        tbOrder1.setErrandMoney(errandMoney);
-        tbOrder1.setOrderType(orderType);
-        tbOrder1.setPayType(1);
-        String generalOrder = getGeneralOrder();
-        tbOrder1.setOrderNumber(generalOrder);
-        if(orderType==2) {
-            //添加地址
-            String addressJson = JSONObject.toJSONString(address);
-            tbOrder1.setAddress(addressJson);
-            tbOrder1.setAddressId(addressId);
-        }
+        // 设置订单号
+        tbOrder.setOrderNumber(getGeneralOrder());
 
-        if(type==4||type==5){
-            tbOrder1.setPayType(3);
-            appOrderDao.updateById(tbOrder1);
-            return aliPayController.payAppOrders(payMoney.doubleValue(), type, tbOrder2.getUserId(), generalOrder, 1);
+        // 保存订单信息
+        appOrderDao.updateById(tbOrder);
+
+        if (tbOrder.getPayType() == 1) {
+            // 微信支付
+            return pay(tbOrder.getPayMoney().doubleValue(), type, tbOrder.getUserId(), tbOrder.getOrderNumber(), 1);
+        } else {
+            // 支付宝支付
+            return aliPayController.payAppOrders(tbOrder.getPayMoney().doubleValue(), type, tbOrder.getUserId(), tbOrder.getOrderNumber(), 1);
         }
-        appOrderDao.updateById(tbOrder1);
-        return pay(payMoney.doubleValue(), type, tbOrder2.getUserId(), generalOrder, 1);
     }
 
     /**
@@ -1093,153 +778,11 @@ public class WxServiceImpl implements WxService {
             userMoneyDetails.setCreateTime(sdf.format(new Date()));
             userMoneyDetailsDao.insert(userMoneyDetails);
         }else if(payDetails.getClassify()==1){
-            //订单支付
+            // 根据订单编号查询订单
             TbOrder tbOrder = appOrderService.selectOrderByNum(payDetails.getOrderId());
-            Integer autoSendOrder = 1;
-            //如果是外卖订单,则生成一个跑腿的订单
-            if(tbOrder.getOrderType()==2){
-                GoodsShop goodsShop = goodsShopDao.selectById(tbOrder.getShopId());
-                //商户开启自动推单再生成订单
-                if(goodsShop.getAutoSendOrder()==0){
-                    autoSendOrder = 0;
-                }
-            }
-            tbOrder.setAutoSendOrder(autoSendOrder);
-            appOrderDao.updateById(tbOrder);
-            List<TbOrder> tbOrderList = appOrderDao.selectList(new QueryWrapper<TbOrder>().eq("parent_id", tbOrder.getParentId()));
-            String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
-            for(int i = 0;i<tbOrderList.size();i++){
-                TbOrder tbOrder1 = new TbOrder();
-                TbOrder tbOrder2 = orderGoodsDao.selectByPayTime(time);
-                String orderCode = null;
-                if(tbOrder2==null){
-                    String a = new SimpleDateFormat("yyyyMMdd").format(new Date());
-                    orderCode = a+"001";
-                }else {
-                    Long a = Long.parseLong(tbOrder2.getOrderCode())+1;
-                    orderCode = a.toString();
-                }
-                tbOrder.setOrderCode(orderCode);
-                tbOrder1.setOrderCode(orderCode);
-                tbOrder1.setOrderId(tbOrderList.get(i).getOrderId());
-                tbOrder1.setIsPay(1);
-                tbOrder1.setStatus(7);
-                tbOrder1.setPayTime(time);
-                appOrderDao.updateById(tbOrder1);
-            }
-            tbOrder.setPayTime(time);
-            tbOrder.setIsPay(1);
-            tbOrder.setStatus(7);
-            indentService.insertIndent(tbOrder);
-            //将红包改为已使用状态
-            TbCouponUser tbCouponUser = new TbCouponUser();
-            tbCouponUser.setId(tbOrder.getCouponId());
-            tbCouponUser.setStatus(1);
-            tbCouponUserDao.updateById(tbCouponUser);
-            //支付成功,增加该商品销量,减少该商品库存
-            Long shopId1 = tbOrder.getShopId();
-            Long orderId = tbOrder.getOrderId();
-            List<OrderGoods> orderGoodsList = orderGoodsDao.selectList(new QueryWrapper<OrderGoods>().eq("order_id", orderId));
-            for(int a = 0;a<orderGoodsList.size();a++){
-                Integer goodsNum = orderGoodsList.get(a).getGoodsNum();
-                Long goodsId = orderGoodsList.get(a).getGoodsId();
-                GoodsShopRelevancy goodsShopRelevancy = goodsShopRelevancyDao.selectOne(new QueryWrapper<GoodsShopRelevancy>()
-                        .eq("shop_id", shopId1).eq("goods_id", goodsId));
-                GoodsShopRelevancy goodsShopRelevancy1 = new GoodsShopRelevancy();
-                goodsShopRelevancy1.setId(goodsShopRelevancy.getId());
-                goodsShopRelevancy1.setSales(goodsShopRelevancy.getSales()+goodsNum);//加销量
-                goodsShopRelevancy1.setInventory(goodsShopRelevancy.getInventory()-goodsNum);//减库存
-                goodsShopRelevancyDao.updateById(goodsShopRelevancy1);
-                goodsShopDao.updateShopSales(1,goodsNum, goodsShopRelevancy.getShopId());
-            }
-
-            //添加用户钱包消费记录
-            UserMoneyDetails userMoneyDetails = new UserMoneyDetails();
-            userMoneyDetails.setUserId(tbOrder.getUserId());
-            if(payDetails.getType()==1 || payDetails.getType()==2 || payDetails.getType()==3){
-                userMoneyDetails.setTitle("微信支付");
-                userMoneyDetails.setContent("使用微信支付:"+tbOrder.getPayMoney()+"元");
-            }else{
-                userMoneyDetails.setTitle("支付宝支付");
-                userMoneyDetails.setContent("使用支付宝支付:"+tbOrder.getPayMoney()+"元");
-            }
-
-            userMoneyDetails.setType(2);
-            userMoneyDetails.setClassify(3);
-            userMoneyDetails.setState(2);
-            userMoneyDetails.setMoney(tbOrder.getPayMoney());
-
-            userMoneyDetails.setCreateTime(sdf.format(new Date()));
-            userMoneyDetailsDao.insert(userMoneyDetails);
-            //用户端添加消息记录
-            MessageInfo messageInfo = new MessageInfo();
-            UserEntity userEntity = userDao.selectById(tbOrder.getUserId());
-            messageInfo.setTitle("下单");
-            messageInfo.setContent("恭喜您,下单成功!");
-            String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
-            messageInfo.setCreateAt(format);
-            messageInfo.setUserId(tbOrder.getUserId().toString());
-            messageInfo.setUserName(userEntity.getUserName());
-            messageInfoDao.insert(messageInfo);
-            //店铺端添加消息记录
-            MessageInfo messageInfo1 = new MessageInfo();
-            messageInfo1.setTitle("有新订单");
-            messageInfo1.setCreateAt(format);
-            messageInfo1.setContent("有新订单,请及时处理!");
-            messageInfo1.setShopId(tbOrder.getShopId());
-            messageInfo1.setReadFlag(2);
-            messageInfo1.setIsSee("2");
-            messageInfoDao.insert(messageInfo1);
-            //设置小程序消息推送
-            CommonInfo one = commonInfoService.findOne(269);
-            List<String> msgList=new ArrayList<>();
-            Long shopId = tbOrder.getShopId();
-            GoodsShop goodsShop = goodsShopDao.selectById(shopId);
-            String shopName = goodsShop.getShopName();
-            String orderNum = tbOrder.getOrderNumber();
-            msgList.add("下单成功");
-            msgList.add(orderNum);
-            msgList.add(shopName);
-            msgList.add(format);
-            SenInfoCheckUtil.sendMsg(userEntity.getOpenId(),one.getValue(),msgList,1);
-            userService.pushToSingle("下单成功", "亲爱的用户您好,您已下单成功!", userEntity.getClientid());
-            BigDecimal shopRate = goodsShop.getShopRate();
-            BigDecimal sumMoney = tbOrder.getPayMoney();
-            if (tbOrder.getCouponId() != null) {
-                tbCouponUser = tbCouponUserDao.selectById(tbOrder.getCouponId());
-                sumMoney = tbOrder.getPayMoney().add(tbCouponUser.getMoney());
-            }
-            if (tbOrder.getAutoSendOrder() == 0) {
-                //再减去商户需要支付的配送费
-                sumMoney = sumMoney.subtract(goodsShop.getErrandMoney());
-            }
-
-            BigDecimal shopMoney = sumMoney.multiply(shopRate);
-            shopMoney = (shopMoney.setScale(2, BigDecimal.ROUND_DOWN));
-            tbOrder.setShopIncomeMoney(shopMoney);
-            if(goodsShop.getAutoAcceptOrder()!=null && goodsShop.getAutoAcceptOrder()==0){
-                tbOrder.setStatus(6);
-                tbOrder.setIsPay(1);
-                appOrderService.updateOrder(tbOrder);
-            }else{
-                appOrderService.updateOrder(tbOrder);
-            }
-
-            CommonInfo shopTemplate = commonInfoService.findOne(352);
-            //商家通知
-            List<String> msgShopList=new ArrayList<>();
-            msgShopList.add(tbOrder.getOrderNumber());
-            msgShopList.add(tbOrder.getPayMoney().toString());
-            msgShopList.add(tbOrder.getPayTime());
-            msgShopList.add("生意来了,立即去接单>");
-            UserEntity shopUser = userService.selectUserById(goodsShop.getUserId());
-            if(StringUtils.isNotEmpty(shopUser.getShopOpenId())){
-                SenInfoCheckUtil.sendShopMsg(shopUser.getShopOpenId(),shopTemplate.getValue(),msgShopList,7);
-            }
-            if(StringUtils.isNotEmpty(shopUser.getShopClientId())){
-                userService.pushToSingleShop("下单成功","生意来了,立即去接单>",shopUser.getShopClientId());
-            }
 
+            // 订单支付成功,修改订单状态
+            appOrderService.updateOrderAfterPaySuccess(tbOrder);
         }else if(payDetails.getClassify()==3){
             //商户交保证金
             Double money = payDetails.getMoney();