Procházet zdrojové kódy

新增撤销快跑者订单接口

liu před 10 měsíci
rodič
revize
3477d47be4

+ 1 - 0
db/update_250822.sql

@@ -0,0 +1 @@
+ALTER TABLE tb_order ADD trade_no varchar(30)  COMMENT '快跑者回调订单号';

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

@@ -7,6 +7,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.gson.Gson;
@@ -19,6 +20,7 @@ import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
 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.UserDao;
 import com.sqx.modules.app.entity.UserEntity;
 import com.sqx.modules.app.entity.UserMoneyDetails;
@@ -52,6 +54,7 @@ import com.sqx.modules.goods.dao.GoodsShopDao;
 import com.sqx.modules.goods.dao.GoodsShopRelevancyDao;
 import com.sqx.modules.goods.entity.GoodsShop;
 import com.sqx.modules.goods.entity.GoodsShopRelevancy;
+import com.sqx.modules.goods.service.GoodsShopService;
 import com.sqx.modules.message.entity.MessageInfo;
 import com.sqx.modules.message.service.MessageService;
 import com.sqx.modules.order.dao.OrderGoodsDao;
@@ -68,6 +71,11 @@ import com.sqx.modules.shop.service.ShopMessageService;
 import com.sqx.modules.utils.HttpClientUtil;
 import com.sqx.modules.utils.SenInfoCheckUtil;
 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.gavaghan.geodesy.Ellipsoid;
 import org.gavaghan.geodesy.GlobalCoordinates;
 import org.redisson.api.RLock;
@@ -83,6 +91,7 @@ import org.springframework.transaction.support.DefaultTransactionDefinition;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -146,6 +155,12 @@ public class TbIndentServiceImpl extends ServiceImpl<TbIndentDao, TbIndent> impl
     @Resource
     private PlatformTransactionManager transactionManager;
 
+    @Autowired
+    private GoodsShopService goodsShopService;
+
+    @Autowired
+    private AddressService addressService;
+
     @Override
     public TbIndent findIndentByPayOrdersNo(String ordersNo) {
         return baseMapper.selectOne(new QueryWrapper<TbIndent>().eq("pay_orders_no", ordersNo));
@@ -326,9 +341,130 @@ public class TbIndentServiceImpl extends ServiceImpl<TbIndentDao, TbIndent> impl
         tbIndent.setUserId(order.getUserId());
         tbIndent.setShopId(order.getShopId());
         baseMapper.insert(tbIndent);
+
+        //            创建快跑者订单
+        log.info("第一次创建快跑者订单");
+        String responseBody = creatSpeedRunnerOrder(order);
+        if (ObjectUtils.isNotEmpty(responseBody)) {
+            String tradeNo= getOrderTradeNo(responseBody);
+            log.info("第一次创建订单获取的快跑者返回订单号:"+tradeNo);
+            if (ObjectUtils.isNotEmpty(tradeNo)) {
+                order.setTradeNo(tradeNo);
+                appOrderService.updateById(order);
+            }else {
+                log.info("第二次创建快跑者订单");
+                String responseBody2 = creatSpeedRunnerOrder(order);
+                if (ObjectUtils.isNotEmpty(responseBody2)) {
+                    String tradeNo2= getOrderTradeNo(responseBody2);
+                    log.info("第二次创建订单获取的快跑者返回订单号:"+tradeNo2);
+                    if (ObjectUtils.isNotEmpty(tradeNo2)) {
+                        order.setTradeNo(tradeNo2);
+                        appOrderService.updateById(order);
+                    }
+                }
+            }
+
+        }else {
+            log.info("创建快跑者订单的返回信息为空,第二次创建");
+            String responseBody2 = creatSpeedRunnerOrder(order);
+            String tradeNo= getOrderTradeNo(responseBody2);
+            log.info("第二次创建订单获取的快跑者返回订单号:"+tradeNo);
+            if (ObjectUtils.isNotEmpty(tradeNo)) {
+                order.setTradeNo(tradeNo);
+                appOrderService.updateById(order);
+            }
+        }
+
         return Result.success();
     }
 
+    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());
+            log.info("创建结果:"+responseBody);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return responseBody;
+    }
+
+    public String getOrderTradeNo(String responseBody){
+        com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(responseBody);
+        Integer code = jsonObject.getInteger("code");
+        String tradeNo="";
+        if (ObjectUtils.isNotEmpty(code)) {
+            if (code==200) {
+                JSONObject data = jsonObject.getJSONObject("data");
+                tradeNo = data.getString("trade_no");
+            }
+        }
+        return tradeNo;
+    }
+
     //根据双方经纬度计算距离
     @Override
     public Result distance(double ol, double od, double dl, double dd) {
@@ -1229,9 +1365,65 @@ public class TbIndentServiceImpl extends ServiceImpl<TbIndentDao, TbIndent> impl
             newIndent.setIndentId(tbIndent.getIndentId());
             newIndent.setIndentState("10");
             tbIndentDao.updateById(newIndent);
+
+//            撤销快跑者订单
+            TbOrder tbOrder = appOrderService.getOne(new QueryWrapper<TbOrder>().eq("order_number", indentNumber));
+            if (ObjectUtils.isNotEmpty(tbOrder)&&ObjectUtils.isNotEmpty(tbOrder.getTradeNo())) {
+                log.info("第一次撤销快跑者订单:"+tbOrder.getTradeNo());
+                String responseBody = cancelSpeedRunnerOrder(tbOrder.getTradeNo());
+                if (ObjectUtils.isNotEmpty(responseBody)) {
+                    JSONObject jsonObject = JSONObject.parseObject(responseBody);
+                    Integer code = jsonObject.getInteger("code");
+                    if (code!=200) {
+                        log.info("第二次撤销快跑者订单:"+tbOrder.getTradeNo());
+                        String responseBody2 = cancelSpeedRunnerOrder(tbOrder.getTradeNo());
+                    }
+                }else {
+                    log.info("第一次撤销结果为空,第二次撤销快跑者订单:"+tbOrder.getTradeNo());
+                    String responseBody2 = cancelSpeedRunnerOrder(tbOrder.getTradeNo());
+                }
+            }
         }
     }
+    public String cancelSpeedRunnerOrder(String tradeNo){
+
+        com.alibaba.fastjson.JSONObject body = new com.alibaba.fastjson.JSONObject();
+        body.put("trade_no", tradeNo);
+
+        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/cancelOrder");
+            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());
+            log.info("撤销结果:"+responseBody);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return responseBody;
+    }
     @Override
     public Result finalizeOrder(Long userId, TbIndent indentOrder) {
         if (ObjectUtil.isNull(indentOrder)) {

+ 3 - 0
src/main/java/com/sqx/modules/order/entity/TbOrder.java

@@ -309,4 +309,7 @@ public class TbOrder implements Serializable {
 
     @ApiModelProperty("身份证号")
     private String idCard;
+
+    @ApiModelProperty("快跑者回调订单号")
+    private String tradeNo;
 }

+ 0 - 94
src/main/java/com/sqx/modules/order/service/impl/AppAppOrderServiceImpl.java

@@ -1830,26 +1830,6 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             // 生成跑腿订单
             tbIndentService.insertIndent(tbOrder);
 
-            //            创建快跑者订单
-            log.info("第一创建快跑者订单");
-            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)) {
-                        log.info("创建快跑者订单的返回信息:"+message);
-                        log.info("第二次创建");
-                        creatSpeedRunnerOrder(tbOrder);
-                    }
-                }
-            }else {
-                log.info("创建快跑者订单的返回信息为空,第二次创建");
-                creatSpeedRunnerOrder(tbOrder);
-            }
-
 
             //设置小程序消息推送
             CommonInfo one = commonInfoService.findOne(269);
@@ -3027,78 +3007,4 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
     }
 
 
-    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());
-            log.info("创建结果:"+responseBody);
-        }catch (Exception e){
-            e.printStackTrace();
-        }
-        return responseBody;
-    }
-
 }

+ 1 - 1
src/main/resources/application-dev.yml

@@ -115,7 +115,7 @@ secure-api:
     local-date-time-format: yyyy-MM-dd HH:mm:ss
 
 mp:
-    temp: true
+    temp: false
 sftp:
     username: export
     password: Waimai2024#

+ 1 - 1
src/main/resources/mapper/order/OrderMapper.xml

@@ -552,7 +552,7 @@
                ti.indent_number     as indentNumber,
                ti.rider_user_id     as riderUserId,
                ti.indent_state     as indentState,
-               tu.nick_name         as riderNickName,
+               tu.user_name         as riderNickName,
                tu.avatar            as riderAvatar,
                tu.phone             as riderPhone,
                e.evaluate_message   as evaluateMessage,