|
|
@@ -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 + "×tamp=" + 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 + "×tamp=" + 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)) {
|