浏览代码

Merge branch 'dev-1'

codingliang 2 年之前
父节点
当前提交
0f49f55bb5

+ 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);
+    }
 
 
     /**

+ 3 - 2
src/main/java/com/sqx/modules/errand/controller/TbIndentSmsController.java

@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.sqx.common.exception.SqxException;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
+import com.sqx.modules.errand.dto.SmsCountQueryDTO;
 import com.sqx.modules.errand.dto.SmsLogQueryDTO;
 import com.sqx.modules.errand.dto.SmsTemplateDTO;
 import com.sqx.modules.errand.dto.SmsTemplateQueryDTO;
@@ -72,8 +73,8 @@ public class TbIndentSmsController {
 
     @ApiOperation("短信发送成功数量统计")
     @GetMapping(value = "count-of-send-success")
-    public Result countOfSendSuccess() {
-        int count = smsSendLogService.countOfSendSuccess();
+    public Result countOfSendSuccess(SmsCountQueryDTO queryDTO) {
+        int count = smsSendLogService.countOfSendSuccess(queryDTO);
         return Result.success().put("data", count);
     }
 

+ 3 - 0
src/main/java/com/sqx/modules/errand/dao/TbIndentSmsSendLogDao.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.sqx.modules.errand.IndentSmsSendLogVO;
+import com.sqx.modules.errand.dto.SmsCountQueryDTO;
 import com.sqx.modules.errand.dto.SmsLogQueryDTO;
 import com.sqx.modules.errand.entity.TbIndentSmsSendLog;
 import org.apache.ibatis.annotations.Mapper;
@@ -13,4 +14,6 @@ import org.apache.ibatis.annotations.Param;
 public interface TbIndentSmsSendLogDao extends BaseMapper<TbIndentSmsSendLog>  {
 
     IPage<IndentSmsSendLogVO> logPage(@Param("pages") Page<TbIndentSmsSendLog> pages, @Param("query") SmsLogQueryDTO query);
+
+    int countOfSendSuccess(@Param("query") SmsCountQueryDTO queryDTO);
 }

+ 27 - 0
src/main/java/com/sqx/modules/errand/dto/SmsCountQueryDTO.java

@@ -0,0 +1,27 @@
+package com.sqx.modules.errand.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 短信统计查询dto
+ */
+@Data
+@ApiModel("SmsCountQueryDTO")
+public class SmsCountQueryDTO {
+
+    @ApiModelProperty("发送人电话")
+    private String fromTo;
+
+    @ApiModelProperty("查询开始时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date startTime;
+
+    @ApiModelProperty("查询结束时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date endTime;
+}

+ 3 - 1
src/main/java/com/sqx/modules/errand/service/TbIndentSmsSendLogService.java

@@ -3,6 +3,7 @@ package com.sqx.modules.errand.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.common.sms.SmsSendResult;
 import com.sqx.common.utils.PageUtils;
+import com.sqx.modules.errand.dto.SmsCountQueryDTO;
 import com.sqx.modules.errand.dto.SmsLogQueryDTO;
 import com.sqx.modules.errand.entity.TbIndentSmsSendLog;
 
@@ -19,7 +20,8 @@ public interface TbIndentSmsSendLogService extends IService<TbIndentSmsSendLog>
 
     /**
      * 统计发送成功的短信条数
+     * @param queryDTO 查询参数
      * @return count
      */
-    int countOfSendSuccess();
+    int countOfSendSuccess(SmsCountQueryDTO queryDTO);
 }

+ 3 - 6
src/main/java/com/sqx/modules/errand/service/impl/TbIndentSmsSendLogServiceImpl.java

@@ -1,14 +1,13 @@
 package com.sqx.modules.errand.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sqx.common.sms.SmsSendResult;
-import com.sqx.common.utils.Constant;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.modules.errand.IndentSmsSendLogVO;
 import com.sqx.modules.errand.dao.TbIndentSmsSendLogDao;
+import com.sqx.modules.errand.dto.SmsCountQueryDTO;
 import com.sqx.modules.errand.dto.SmsLogQueryDTO;
 import com.sqx.modules.errand.entity.TbIndentSmsSendLog;
 import com.sqx.modules.errand.service.TbIndentSmsSendLogService;
@@ -43,9 +42,7 @@ public class TbIndentSmsSendLogServiceImpl extends ServiceImpl<TbIndentSmsSendLo
     }
 
     @Override
-    public int countOfSendSuccess() {
-        LambdaQueryWrapper<TbIndentSmsSendLog> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(TbIndentSmsSendLog::getSuccessFlag, Constant.YES);
-        return this.count(queryWrapper);
+    public int countOfSendSuccess(SmsCountQueryDTO queryDTO) {
+        return baseMapper.countOfSendSuccess(queryDTO);
     }
 }

+ 2 - 0
src/main/java/com/sqx/modules/goods/entity/GoodsShop.java

@@ -159,6 +159,8 @@ public class GoodsShop implements Serializable {
     @ApiModelProperty("是否减免配送费")
     private Integer exemptErrandFlag;
 
+    @ApiModelProperty("是否开启满减配送费 0是 1否")
+    private Integer enableFullReductionFlag;
 
     @ApiModelProperty("最低起送金额")
     private BigDecimal minimumDelivery;

+ 1 - 1
src/main/java/com/sqx/modules/goods/service/impl/GoodsServiceImpl.java

@@ -82,7 +82,7 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsDao, Goods> implements Go
         GoodsShopRelevancy goodsShopRelevancy = new GoodsShopRelevancy();
         goodsShopRelevancy.setCreateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
         goodsShopRelevancy.setGoodsId(goods.getGoodsId());
-        goodsShopRelevancy.setInventory(0);
+        goodsShopRelevancy.setInventory(1000);
         goodsShopRelevancy.setStatus(0);
         goodsShopRelevancy.setShopId(goods.getShopId());
         goodsShopRelevancy.setSales(0);

+ 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);
 }

+ 463 - 3
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;
@@ -30,7 +33,10 @@ import com.sqx.modules.goods.dao.GoodsDao;
 import com.sqx.modules.goods.dao.GoodsShopDao;
 import com.sqx.modules.goods.dao.GoodsShopRelevancyDao;
 import com.sqx.modules.goods.dao.GoodsSkuDao;
-import com.sqx.modules.goods.entity.*;
+import com.sqx.modules.goods.entity.Goods;
+import com.sqx.modules.goods.entity.GoodsShop;
+import com.sqx.modules.goods.entity.GoodsShopRelevancy;
+import com.sqx.modules.goods.entity.GoodsSku;
 import com.sqx.modules.message.dao.MessageInfoDao;
 import com.sqx.modules.message.entity.MessageInfo;
 import com.sqx.modules.order.dao.AppOrderDao;
@@ -43,7 +49,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 +60,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;
@@ -63,7 +69,11 @@ import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 @Service
@@ -113,6 +123,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 +348,454 @@ 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);
+
+                // 设置订单商品
+                List<OrderGoods> orderGoodsList = orderGoodsDao.selectList(new QueryWrapper<OrderGoods>().eq("order_id", order.getOrderId()));
+                order.setOrderGoodsList(orderGoodsList);
+
+                // 设置店铺名称
+                order.setShopName(goodsShop.getShopName());
+
+                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("超出商家配送范围,无法点餐!");
+            }
+
+            // 店铺是否开启配送费满减 0是 1否
+            Integer enableFullReductionFlag = goodsShop.getEnableFullReductionFlag() != null ? goodsShop.getEnableFullReductionFlag() : 1;
+            // 店铺跑腿费
+            BigDecimal shopErrandMoney = goodsShop.getErrandMoney() != null ? goodsShop.getErrandMoney() : BigDecimal.ZERO;
+            // 减免配送费最小订单金额
+            BigDecimal exemptMinMoney = goodsShop.getExemptMinMoney() != null ? goodsShop.getExemptMinMoney() : BigDecimal.ZERO;
+            // 店铺是否开启自动派单 0开启 1关闭
+            Integer autoSendOrder = goodsShop.getAutoSendOrder() == 0 ? 0 : 1;
+
+            // 店铺开启了配送费满减
+            if (enableFullReductionFlag == 0) {
+                if(shopErrandMoney.doubleValue() > 0
+                        && order.getPayMoney().doubleValue() < exemptMinMoney.doubleValue()){
+                    // 跑腿费加入订单总金额
+                    order.setPayMoney(order.getPayMoney().add(shopErrandMoney));
+                    order.setErrandMoneyIsShop("本单未达到商家满减金额,跑腿费由用户承担");
+                } else {
+                    order.setErrandMoneyIsShop("本单已达到商家满减金额,跑腿费由商家承担");
+                    // 店铺关闭自动派单,则为商家自己配送订单,跑腿金额设置为0
+                    if (autoSendOrder == 1) {
+                        shopErrandMoney = BigDecimal.ZERO;
+                    }
+                }
+            }
+            // 店铺未开启配送费满减
+            else {
+                // 跑腿费加入订单总金额
+                order.setPayMoney(order.getPayMoney().add(shopErrandMoney));
+                order.setErrandMoneyIsShop("商家未开启配送费满减,跑腿费由用户承担");
+            }
+
+            order.setErrandMoney(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);
+
+            // 设置是否自动派单
+            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();

+ 21 - 2
src/main/resources/mapper/errand/TbIndentSmsSendLogMapper.xml

@@ -21,12 +21,31 @@
                 and issl.send_to = #{query.sendTo}
             </if>
             <if test="query.startTime != null">
-                and issl.send_time >= #{query.orderId}
+                and issl.send_time >= #{query.startTime}
             </if>
             <if test="query.endTime != null">
-                and issl.send_time <![CDATA[<=]]> #{query.orderId}
+                and issl.send_time <![CDATA[<=]]> #{query.endTime}
             </if>
         </where>
         order by issl.send_time desc
     </select>
+
+    <select id="countOfSendSuccess" resultType="java.lang.Integer">
+        select
+               count(1)
+        from
+            tb_indent_sms_send_log issl
+        left join tb_user u on u.user_id = issl.send_from_id
+        where
+            issl.success_flag = '1'
+            <if test="query.fromTo != null and query.fromTo != ''">
+                and u.phone = #{query.fromTo}
+            </if>
+            <if test="query.startTime != null">
+                and issl.send_time >= #{query.startTime}
+            </if>
+            <if test="query.endTime != null">
+                and issl.send_time <![CDATA[<=]]> #{query.endTime}
+            </if>
+    </select>
 </mapper>