Przeglądaj źródła

添加快跑者平台创建订单接口和添加快跑者回调接口

liu 10 miesięcy temu
rodzic
commit
c96123da82

Plik diff jest za duży
+ 57 - 0
src/main/java/com/sqx/common/utils/SignUtil.java


+ 99 - 0
src/main/java/com/sqx/modules/callBack/controller/CallBackController.java

@@ -0,0 +1,99 @@
+package com.sqx.modules.callBack.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.sqx.common.constant.RedisKey;
+import com.sqx.common.exception.SqxException;
+import com.sqx.modules.app.entity.UserEntity;
+import com.sqx.modules.app.service.UserService;
+import com.sqx.modules.callBack.dto.CallBackDto;
+import com.sqx.modules.errand.entity.TbIndent;
+import com.sqx.modules.errand.service.TbIndentService;
+import lombok.extern.slf4j.Slf4j;
+import org.checkerframework.checker.units.qual.A;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+@RestController
+@RequestMapping("/back")
+@Slf4j
+public class CallBackController{
+
+    @Autowired
+    TbIndentService tbIndentService;
+
+    @Autowired
+    UserService userService;
+
+    @Resource
+    private RedissonClient redissonClient;
+
+
+    /**
+     * 回调
+     */
+    @PostMapping("/open")
+    public String back(HttpServletResponse response, HttpServletRequest httpServletRequest)throws IOException {
+        BufferedReader streamReader = new BufferedReader(new InputStreamReader(httpServletRequest.getInputStream(), "UTF-8"));
+        StringBuilder responseStrBuilder = new StringBuilder();
+        String inputStr;
+        while ((inputStr = streamReader.readLine()) != null) {
+            responseStrBuilder.append(inputStr);
+        }
+
+        JSONObject jsonObject = JSONObject.parseObject(responseStrBuilder.toString());
+        log.info("jsonObject = " + jsonObject);
+        if (ObjectUtils.isNotEmpty(jsonObject)) {
+
+//            订单号
+            String orderNo = jsonObject.getString("order_no");
+//            配送员名称
+            String courier = jsonObject.getString("courier");
+//            手机号
+            String tel = jsonObject.getString("tel");
+//            更改时间
+            String updateTime = jsonObject.getString("update_time");
+
+            UserEntity userEntity = userService.queryByPhone(tel);
+            if (ObjectUtils.isEmpty(userEntity)) {
+                log.info("不存在该手机号的骑手:"+tel);
+                return "success";
+            }
+
+//            获取骑手订单
+            TbIndent tbIndent = tbIndentService.findIndentByIndentNumber(orderNo);
+
+            //            状态
+            String state = jsonObject.getString("state");
+            if ("4".equals(state)) {//接单
+                log.info("骑手接单:"+orderNo);
+                tbIndentService.indentReceiving(userEntity.getUserId(),orderNo);
+            }else if ("5".equals(state)){//取餐
+                log.info("骑手取餐:"+orderNo);
+               tbIndentService.riderBuyGoods(tbIndent);
+            }else if ("6".equals(state)){//完成订单
+                log.info("骑手完成订单:"+orderNo);
+                tbIndentService.finalizeOrder(userEntity.getUserId(),tbIndent);
+            }
+        }
+        return "success";
+    }
+
+    public String back2(@RequestBody CallBackDto callBackDto)throws IOException {
+        log.info("callBackDto = " + callBackDto);
+        return "success";
+    }
+
+}

+ 42 - 0
src/main/java/com/sqx/modules/callBack/dto/CallBackDto.java

@@ -0,0 +1,42 @@
+package com.sqx.modules.callBack.dto;
+
+import lombok.Data;
+
+/**
+ * 回调参数
+ */
+@Data
+public class CallBackDto {
+//     请求的过期时间,时间戳格式,如:1477483702
+    private String expire_time;
+
+//    加密密钥,按支付宝密钥排序,可参考签名与验签说明,主要用于验证请求权限
+    private String sign;
+
+//    状态发生改变的配送订单的订单单号
+    private String trade_no;
+
+//    订单单号,上游的运单号/订单单号
+    private String order_no;
+
+//    配送订单状态码,可选值为 4取单中(已接单/已抢单),5送单中(已取单),6(已送达),7(已撤销),
+    private String state;
+
+//    创建订单时传递自定义参数 note
+    private String note;
+
+//    配送员的名字
+    private String courier;
+
+//    配送员坐标经度
+    private String longitude;
+
+//    配送员坐标纬度
+    private String latitude;
+
+//    配送员的电话号码
+    private String tel;
+
+//    配送订单状态的改变时间,如:2017-01-01 01:01:01
+    private String update_time;
+}

+ 1 - 0
src/main/java/com/sqx/modules/errand/controller/app/AppTbIndentController.java

@@ -34,6 +34,7 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
+import org.apache.http.HttpRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;

+ 2 - 0
src/main/java/com/sqx/modules/errand/service/TbIndentService.java

@@ -160,4 +160,6 @@ public interface TbIndentService extends IService<TbIndent> {
      * @param indentNumber 跑腿订单号
      */
     void sysCancelOrder(String indentNumber);
+
+    Result finalizeOrder(Long userId, TbIndent tbIndent);
 }

+ 33 - 0
src/main/java/com/sqx/modules/errand/service/impl/TbIndentServiceImpl.java

@@ -1232,6 +1232,39 @@ public class TbIndentServiceImpl extends ServiceImpl<TbIndentDao, TbIndent> impl
         }
     }
 
+    @Override
+    public Result finalizeOrder(Long userId, TbIndent indentOrder) {
+        if (ObjectUtil.isNull(indentOrder)) {
+            throw new SqxException("扫码无效的跑腿订单id");
+        }
+
+        // 判断是否为当前骑手订单
+        if (!Objects.equals(indentOrder.getRiderUserId(), userId)) {
+            throw new SqxException("不能完成非本人订单!");
+        }
+
+        RLock lock = redissonClient.getLock(String.format(RedisKey.UPDATE_INDENT_LOCK, indentOrder.getIndentNumber()));
+        lock.lock();
+        try {
+            indentOrder = tbIndentDao.selectById(indentOrder.getIndentId());
+
+            // 4:骑手已取货/购买 只有订单在4状态下才可以完成订单
+            if (!"4".equals(indentOrder.getIndentState())) {
+                throw new SqxException("订单状态已变更,请刷新页面后重试!");
+            }
+
+            log.info("骑手通过收单码完成订单:订单id【{}】", indentOrder.getOrderId());
+            appOrderService.accomplishOrder(indentOrder.getOrderId(), 1);
+        } catch (Exception e) {
+            log.error("完成订单异常:{}", e.getMessage(), e);
+            throw new SqxException(e.getMessage());
+        } finally {
+            lock.unlock();
+        }
+
+        return Result.success();
+    }
+
     @Transactional
     @Override
     public Result riderCancleIndent(String indentNumber, Integer type) {

+ 0 - 2
src/main/java/com/sqx/modules/order/controller/OrderController.java

@@ -133,6 +133,4 @@ public class OrderController extends AbstractController {
         evaluateRiderService.removeById(evaluateRiderId);
         return Result.success();
     }
-
-
 }

+ 100 - 6
src/main/java/com/sqx/modules/order/service/impl/AppAppOrderServiceImpl.java

@@ -24,16 +24,12 @@ import com.github.wxpay.sdk.WXPay;
 import com.sqx.common.constant.RedisKey;
 import com.sqx.common.exception.SqxException;
 import com.sqx.common.sms.SmsSendResult;
-import com.sqx.common.utils.Constant;
-import com.sqx.common.utils.DateUtils;
-import com.sqx.common.utils.DistanceUtil;
-import com.sqx.common.utils.MyGlobalThreadPool;
-import com.sqx.common.utils.PageUtils;
-import com.sqx.common.utils.Result;
+import com.sqx.common.utils.*;
 import com.sqx.modules.activity.entity.ActivityPartRecord;
 import com.sqx.modules.activity.service.ActivityPartRecordService;
 import com.sqx.modules.activity.service.ActivityService;
 import com.sqx.modules.activity.vo.OrderSuitActivityVO;
+import com.sqx.modules.address.dao.AddressDao;
 import com.sqx.modules.address.entity.Address;
 import com.sqx.modules.address.service.AddressService;
 import com.sqx.modules.app.dao.UserBrowseDao;
@@ -109,6 +105,11 @@ import com.sqx.modules.utils.excel.ExcelData;
 import com.sqx.modules.utils.fieYun.FeiYunUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
 import org.apache.shiro.SecurityUtils;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
@@ -129,6 +130,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -1828,6 +1830,23 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             // 生成跑腿订单
             tbIndentService.insertIndent(tbOrder);
 
+            //            创建快跑者订单
+            String responseBody = creatSpeedRunnerOrder(tbOrder);
+            if (ObjectUtils.isNotEmpty(responseBody)) {
+                com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(responseBody);
+                log.info("jsonObject = " + jsonObject);
+                Integer code = jsonObject.getInteger("code");
+                if (code!=200) {
+                    String message = jsonObject.getString("message");
+                    if (!"该订单已存在,请勿重复提交".equals(message)) {
+                        creatSpeedRunnerOrder(tbOrder);
+                    }
+                }
+            }else {
+                creatSpeedRunnerOrder(tbOrder);
+            }
+
+
             //设置小程序消息推送
             CommonInfo one = commonInfoService.findOne(269);
             List<String> msgList = new ArrayList<>();
@@ -3002,4 +3021,79 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             lock.unlock();
         }
     }
+
+
+    public String creatSpeedRunnerOrder(TbOrder tbOrder){
+//               获取店铺信息
+        GoodsShop goodsShop = goodsShopService.getById(tbOrder.getShopId());
+//               获取餐品信息
+        List<OrderGoods> orderGoodsList = orderGoodsDao.selectList(new QueryWrapper<OrderGoods>()
+                .eq("order_id", tbOrder.getOrderId()));
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int i = 0; i < orderGoodsList.size(); i++) {
+            OrderGoods orderGoods = orderGoodsList.get(i);
+            String skuMessage = orderGoods.getSkuMessage();
+            String goodsName = orderGoods.getGoodsName();
+            if (i == 0) {
+                stringBuilder.append(goodsName).append(": ").append(skuMessage);
+            } else {
+                stringBuilder.append(",").append(goodsName).append(":").append(skuMessage);
+            }
+        }
+//               获取用户收货地址
+        Address address = addressService.getById(tbOrder.getAddressId());
+
+        com.alibaba.fastjson.JSONObject body = new com.alibaba.fastjson.JSONObject();
+        body.put("shop_id", tbOrder.getShopId());
+        body.put("shop_name", goodsShop.getShopName());
+        body.put("shop_tel", goodsShop.getPhone());
+        body.put("shop_address", goodsShop.getDetailedAddress());
+        body.put("shop_tag", goodsShop.getShopLng() + "," + goodsShop.getShopLat());
+        body.put("order_content", stringBuilder.toString());
+        body.put("order_note", tbOrder.getRemark());
+        body.put("order_mark", tbOrder.getOrderSequence());
+        body.put("order_from", tbOrder.getShopName() + "#" + tbOrder.getOrderSequence());
+        body.put("order_time", tbOrder.getPayTime());
+        body.put("customer_name", address.getUserName());
+        body.put("customer_tel", address.getUserPhone());
+        body.put("customer_address", address.getAddressDetail());
+        body.put("customer_tag", address.getLng() + "," + address.getLat());
+        body.put("order_no", tbOrder.getOrderNumber());
+        body.put("order_price", tbOrder.getPayMoney());
+        body.put("pay_status", 0);
+
+        log.info("body信息:" + body);
+
+//               版本
+        String version = "1";
+//               时间戳
+        long currentTimeMillis = System.currentTimeMillis();
+        long currentTimeSeconds = currentTimeMillis / 1000;
+        String timestamp = String.valueOf(currentTimeSeconds);
+//               唯一标识符
+        String ticket = "83f0ff99-7c8e-47e8-8802-bd3754414a52";
+//               团队token
+        String teamToken = "Q444DMV4LT8WSGRW";
+//               开发者中心的开发密钥
+        String devKey = "31RRHA4O165VFN9W2DAPDYDH8N83BT12";
+
+//               获取签名
+        String sign = com.sqx.common.utils.SignUtil.getSign(body.toString(), devKey, teamToken, ticket, currentTimeSeconds, 1);
+        String responseBody="";
+        try {
+            log.info("创建快跑者订单");
+            CloseableHttpClient client = HttpClients.createDefault();
+            // 创建httppost
+            HttpPost httpPost = new HttpPost("https://open.keloop.cn/open/order/createOrder");
+            String params = "version=" + version + "&timestamp=" + timestamp + "&ticket=" + ticket + "&team_token=" + teamToken + "&dev_key=" + devKey + "&sign=" + sign + "&body=" + body.toString(); // 注意:这里不需要手动编码,HttpClient会处理它。
+            StringEntity entity = new StringEntity(params, StandardCharsets.UTF_8);
+            entity.setContentType("application/x-www-form-urlencoded"); // 设置Content-Type为application/x-www-form-urlencoded,但不是必须的,HttpClient会自动设置。
+            httpPost.setEntity(entity);
+            responseBody = EntityUtils.toString(client.execute(httpPost).getEntity());
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return responseBody;
+    }
+
 }

+ 45 - 0
src/main/java/com/sqx/modules/pay/service/impl/NewPayServiceImpl.java

@@ -4,6 +4,8 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ekyong.www.pay.common.Constant;
 import com.ekyong.www.pay.pay.qrcode.api.RhtQrcodePayApi;
 import com.ekyong.www.pay.pay.qrcode.bean.QrcodeOpenPayRequestBean;
@@ -16,14 +18,43 @@ import com.ekyong.www.pay.pay.split.bean.SplitPayResponseBean;
 import com.ekyong.www.pay.util.SignUtil;
 import com.sqx.common.exception.SqxException;
 import com.sqx.common.utils.SpringContextUtils;
+import com.sqx.modules.activity.service.ActivityPartRecordService;
+import com.sqx.modules.activity.service.ActivityService;
+import com.sqx.modules.address.entity.Address;
+import com.sqx.modules.address.service.AddressService;
 import com.sqx.modules.app.bo.UpdateMoneyBO;
+import com.sqx.modules.app.dao.UserBrowseDao;
+import com.sqx.modules.app.dao.UserDao;
+import com.sqx.modules.app.dao.UserMoneyDao;
+import com.sqx.modules.app.dao.UserMoneyDetailsDao;
 import com.sqx.modules.app.service.UserMoneyService;
+import com.sqx.modules.app.service.UserService;
 import com.sqx.modules.common.service.CommonInfoService;
+import com.sqx.modules.coupon.dao.TbCouponUserDao;
 import com.sqx.modules.datacentre.service.DataCentreService;
+import com.sqx.modules.errand.dao.TbIndentDao;
+import com.sqx.modules.errand.service.TbIndentService;
+import com.sqx.modules.errand.service.TbIndentSmsSendLogService;
+import com.sqx.modules.errand.service.TbIndentSmsTemplateService;
+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.GoodsShop;
 import com.sqx.modules.goods.service.GoodsShopService;
+import com.sqx.modules.integral.dao.UserIntegralDao;
+import com.sqx.modules.integral.dao.UserIntegralDetailsDao;
+import com.sqx.modules.message.dao.MessageInfoDao;
+import com.sqx.modules.order.dao.AppOrderDao;
+import com.sqx.modules.order.dao.EvaluateDao;
+import com.sqx.modules.order.dao.OrderGoodsDao;
+import com.sqx.modules.order.entity.OrderGoods;
 import com.sqx.modules.order.entity.TbOrder;
 import com.sqx.modules.order.service.AppOrderService;
+import com.sqx.modules.order.service.EvaluateRiderService;
 import com.sqx.modules.pay.config.WechatPayConfig;
+import com.sqx.modules.pay.controller.app.AliPayController;
+import com.sqx.modules.pay.dao.PayDetailsDao;
 import com.sqx.modules.pay.dto.GetPayParamDTO;
 import com.sqx.modules.pay.entity.PayDetails;
 import com.sqx.modules.pay.enums.PayChannelEnum;
@@ -31,18 +62,32 @@ import com.sqx.modules.pay.enums.PaySceneEnum;
 import com.sqx.modules.pay.enums.PayStateEnums;
 import com.sqx.modules.pay.service.NewPayService;
 import com.sqx.modules.pay.service.PayDetailsService;
+import com.sqx.modules.pay.service.WxErrService;
 import com.sqx.modules.pay.vo.WechatTransactionsParamVO;
+import com.sqx.modules.shop.service.ShopMessageService;
+import com.sqx.modules.shop.service.ShopTypeService;
+import com.sqx.modules.sys.service.SysUserService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.PlatformTransactionManager;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
 import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
 
 @Slf4j