记得上下班打卡 | git大法好,push需谨慎

Commit 4ba25734 authored by 胡佳晨's avatar 胡佳晨

增加订单关闭接口,脚本[未测试]

parent bbd6dd56
......@@ -23,4 +23,7 @@ public interface FeignPlatformTaskClient {
@PostMapping("platform/order/checkTransferOrder")
ResponseDto<Boolean> checkTransferOrder(@RequestParam("minute") Integer minute);
@PostMapping("platform/order/goblin/checkOrderTime")
ResponseDto<Boolean> checkGoblinOrderTime();
}
package com.liquidnet.service.consumer.goblin.config;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.consumer.goblin.receiver.ConsumerGoblinOrderCPRdsReceiver;
import com.liquidnet.service.consumer.goblin.receiver.ConsumerGoblinOrderCloseRdsReceiver;
import lombok.var;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.stream.Consumer;
import org.springframework.data.redis.connection.stream.MapRecord;
import org.springframework.data.redis.connection.stream.ReadOffset;
import org.springframework.data.redis.connection.stream.StreamOffset;
import org.springframework.data.redis.stream.StreamMessageListenerContainer;
import org.springframework.data.redis.stream.Subscription;
import java.time.Duration;
@Configuration
public class ConsumerGoblinOrderCloseRedisStreamConfig {
@Autowired
ConsumerGoblinOrderCloseRdsReceiver consumerGoblinOrderCloseRdsReceiver;
private StreamMessageListenerContainer<String, MapRecord<String, String, String>> buildStreamMessageListenerContainer(RedisConnectionFactory factory) {
var options = StreamMessageListenerContainer
.StreamMessageListenerContainerOptions
.builder()
.pollTimeout(Duration.ofMillis(1))
.build();
return StreamMessageListenerContainer.create(factory, options);
}
/**
* 缺票登记
*
* @param listenerContainer
* @param t
* @return
*/
private Subscription receiveGoblinOrderClose(StreamMessageListenerContainer<String, MapRecord<String, String, String>> listenerContainer, int t) {
return listenerContainer.receiveAutoAck(
Consumer.from(MQConst.GoblinQueue.GOBLIN_ORDER_CLOSE.getGroup(), MQConst.GoblinQueue.GOBLIN_ORDER_CLOSE.name() + t),
StreamOffset.create(MQConst.GoblinQueue.GOBLIN_ORDER_CLOSE.getKey(), ReadOffset.lastConsumed()), consumerGoblinOrderCloseRdsReceiver
);
}
/* —————————————————————————— | —————————————————————————— | —————————————————————————— */
/* -------------------------------------------------------- | 缺票登记 */
@Bean
public Subscription subscriptionGoblinOrderClose(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveGoblinOrderClose(listenerContainer, 1);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionGoblinOrderClose2(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveGoblinOrderClose(listenerContainer, 2);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionGoblinOrderClose3(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveGoblinOrderClose(listenerContainer, 3);
listenerContainer.start();
return subscription;
}
/* -------------------------------------------------------- | */
}
package com.liquidnet.service.consumer.goblin.receiver;
import com.liquidnet.service.base.constant.MQConst;
import org.springframework.stereotype.Component;
@Component
public class ConsumerGoblinOrderCloseRdsReceiver extends AbstractSqlRedisReceiver {
@Override
protected String getRedisStreamKey() {
return MQConst.GoblinQueue.GOBLIN_ORDER_CLOSE.getKey();
}
@Override
protected String getRedisStreamGroup() {
return MQConst.GoblinQueue.GOBLIN_ORDER_CLOSE.getGroup();
}
}
......@@ -37,6 +37,17 @@ public class KylinTaskHandler {
}
}
@XxlJob(value = "sev-platform:checkGoblinOrderTimeHandler")
public ReturnT<String> checkGoblinOrderTimeHandler() {
try {
boolean result = feignPlatformTaskClient.checkGoblinOrderTime().getData();
log.info("checkGoblinOrderTimeHandler:结果:" + result);
return ReturnT.SUCCESS;
} catch (Exception e) {
return ReturnT.FAIL;
}
}
@XxlJob(value = "sev-platform:checkPerformanceTimeHandler")
public ReturnT<String> checkPerformanceTimeHandler() {
try {
......
......@@ -20,6 +20,8 @@ public class GoblinRedisUtils {
@Autowired
GoblinMongoUtils goblinMongoUtils;
private int randomMax = 10;
/* ---------------------------------------- sku库存相关 ---------------------------------------- */
public void setSkuStock(String marketPre, String skuId, Integer stock) {
......@@ -504,9 +506,8 @@ public class GoblinRedisUtils {
}
// 获取 未支付订单id列表
public List<String> getUnPayOrder() {
int randomKey = RandomUtil.getRandomInt(0, 100);
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER_UN_PAY.concat(randomKey + "");
public List<String> getUnPayOrder(String randomKey) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER_UN_PAY.concat(randomKey);
Object obj = redisUtil.get(redisKey);
if (obj == null) {
return CollectionUtil.arrayListString();
......@@ -517,9 +518,9 @@ public class GoblinRedisUtils {
// 添加 未支付订单id列表
public void addUnPayOrder(String orderId) {
int randomKey = RandomUtil.getRandomInt(0, 100);
int randomKey = RandomUtil.getRandomInt(0, randomMax);
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER_UN_PAY.concat(randomKey + "");
List<String> list = getUnPayOrder();
List<String> list = getUnPayOrder(randomKey+"");
list.add(orderId);
redisUtil.set(redisKey, list);
}
......@@ -527,10 +528,10 @@ public class GoblinRedisUtils {
// 删除 未支付订单id列表
public void removeGoblinOrder(String randomKey, String orderId) {
if (randomKey == null) {
for (int i = 0; i < 100; i++) {
for (int i = 0; i < randomMax; i++) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER_UN_PAY.concat(i + "");
List<String> list = getUnPayOrder();
if(list.contains(orderId)){
List<String> list = getUnPayOrder(randomKey);
if (list.contains(orderId)) {
list.remove(orderId);
redisUtil.set(redisKey, list);
break;
......@@ -538,7 +539,7 @@ public class GoblinRedisUtils {
}
} else {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER_UN_PAY.concat(randomKey + "");
List<String> list = getUnPayOrder();
List<String> list = getUnPayOrder(randomKey);
list.remove(orderId);
redisUtil.set(redisKey, list);
}
......
......@@ -30,6 +30,9 @@ goblin.order.create.attr_insert=INSERT INTO goblin_order_attr (`order_attr_id`,`
goblin.order.create.sku_insert=INSERT INTO goblin_order_sku (`order_sku_id`,`order_id`,`spu_id`,`sku_id`,`num`,`sku_price`,`sku_price_actual`,`sku_name`,`sku_no`,`sku_image`,`sku_specs`,`price_voucher`,`created_at`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)
goblin_order.pay.order=UPDATE goblin_store_order SET payment_type = ? ,payment_id=?,pay_code = ? ,pay_time = ?,write_off_code = ? ,status = ? ,updated_at = ? WHERE order_id = ? and (updated_at <= ? or created_at = ? or updated_at is null)
goblin_order.pay.sku=UPDATE goblin_order_sku SET status = ? ,updated_at = ? WHERE order_sku_id = ? and (updated_at <= ? or created_at = ? or updated_at is null)
#---- 订单关闭
goblin_order.close.order=UPDATE goblin_store_order SET status = ? ,updated_at = ? WHERE order_id = ? and (updated_at <= ? or created_at = ? or updated_at is null)
goblin_order.close.sku=UPDATE goblin_order_sku SET status = ? ,updated_at = ? WHERE order_sku_id = ? and (updated_at <= ? or created_at = ? or updated_at is null)
#---- 再次支付
goblin_order.pay.again=UPDATE goblin_store_order SET pay_type = ? ,device_from = ? ,pay_code = ? WHERE order_id = ? and (updated_at <= ? or created_at = ? or updated_at is null)
#---- 订单绑定[正在下单]
......
......@@ -61,6 +61,12 @@
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-service-goblin-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
......
package com.liquidnet.service.platform.controller.goblin;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.platform.service.impl.goblin.DMCheckGoblinOrderTimeImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 订单 前端控制器
* </p>
*
* @author liquidnet
* @since 2021-05-20
*/
@Api(tags = "商城-订单相关")
@RestController
@RequestMapping("order/goblin")
@Validated
public class GoblinOrderTicketsController {
@Autowired
DMCheckGoblinOrderTimeImpl goblinCheckOrderTime;
@PostMapping("checkOrderTime")
@ApiOperation("订单过期脚本")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<Boolean> checkOrderTime() {
return ResponseDto.success(goblinCheckOrderTime.checkOrderTime());
}
}
package com.liquidnet.service.platform.service.impl.goblin;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.service.base.OrderCloseMapping;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.vo.GoblinOrderSkuVo;
import com.liquidnet.service.goblin.dto.vo.GoblinStoreMarketVo;
import com.liquidnet.service.goblin.dto.vo.GoblinStoreOrderVo;
import com.liquidnet.service.goblin.entity.GoblinStoreOrder;
import com.liquidnet.service.goblin.mapper.GoblinStoreOrderMapper;
import com.liquidnet.service.kylin.constant.KylinTableStatusConst;
import com.liquidnet.service.kylin.dao.OrderScriptDto;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.kylin.entity.KylinOrderTicketRelations;
import com.liquidnet.service.kylin.entity.KylinOrderTicketStatus;
import com.liquidnet.service.kylin.entity.KylinOrderTickets;
import com.liquidnet.service.platform.utils.GoblinRedisUtils;
import com.liquidnet.service.platform.utils.ObjectUtil;
import com.liquidnet.service.platform.utils.QueueUtils;
import com.mongodb.BasicDBObject;
import com.mongodb.client.result.UpdateResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.*;
/**
* <p>
* 订单 服务实现类
* </p>
*
* @author liquidnet
* @since 2021-05-20
*/
@Service
@Slf4j
public class DMCheckGoblinOrderTimeImpl extends ServiceImpl<GoblinStoreOrderMapper, GoblinStoreOrder> {
@Autowired
private GoblinRedisUtils goblinRedisUtils;
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private MongoConverter mongoConverter;
@Autowired
private QueueUtils queueUtils;
public boolean checkOrderTime() {
LocalDateTime now = LocalDateTime.now();
for (int i = 0; i < goblinRedisUtils.randomMax; i++) {
List<String> orderIds = goblinRedisUtils.getUnPayGoblinOrderList(i + "");
for (String orderId : orderIds) {
GoblinStoreOrderVo orderVo = goblinRedisUtils.getGoblinOrder(orderId);
LocalDateTime expireTime = orderVo.getCreatedAt().plusMinutes(orderVo.getPayCountdownMinute() + 1);
if (now.isAfter(expireTime) && orderVo.getStatus() == GoblinStatusConst.Status.ORDER_STATUS_0.getValue()) {//过期
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlDataSku = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("goblin_order.close.order"));
sqls.add(SqlMapping.get("goblin_order.close.sku"));
for (String skuId : orderVo.getOrderSkuVoIds()) {
GoblinOrderSkuVo skuVo = goblinRedisUtils.getGoblinOrderSkuVo(skuId);
//订单详情
skuVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_5.getValue());
updateGoblinOrderSkuVo(skuVo.getOrderSkuId(), skuVo);
goblinRedisUtils.setGoblinOrderSku(skuVo.getOrderSkuId(), skuVo);
//库存&限购&&待支付订单
goblinRedisUtils.incrSkuStock("pre", skuVo.getSkuId(), skuVo.getNum());
goblinRedisUtils.decrSkuCountByUid(orderVo.getUserId(), skuVo.getSkuId(), skuVo.getNum());
goblinRedisUtils.removeGoblinOrder(i + "", orderVo.getOrderId());
//mysql
sqlDataSku.add(new Object[]{
orderVo.getStatus(),now,orderVo.getOrderId(),now,now
});
}
//订单
orderVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_5.getValue());
updateGoblinStoreOrderVo(orderVo.getOrderId(), orderVo);
goblinRedisUtils.setGoblinOrder(orderVo.getOrderId(), orderVo);
//mysql
sqlDataOrder.add(new Object[]{
orderVo.getStatus(),now,orderVo.getOrderId(),now,now
});
//执行sql
queueUtils.sendMsgByGoblinRedis(MQConst.KylinQueue.SQL_ORDER_CLOSE.getKey(),
SqlMapping.gets(sqls, sqlDataOrder, sqlDataSku) );
}
}
}
return true;
}
private UpdateResult updateGoblinStoreOrderVo(String orderId, GoblinStoreOrderVo data) {
BasicDBObject object = ObjectUtil.cloneBasicDBObject().append("$set", mongoConverter.convertToMongoType(data));
return mongoTemplate.getCollection(GoblinStoreMarketVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderId").is(orderId)).getQueryObject(),
object);
}
private UpdateResult updateGoblinOrderSkuVo(String orderSkuId, GoblinOrderSkuVo data) {
BasicDBObject object = ObjectUtil.cloneBasicDBObject().append("$set", mongoConverter.convertToMongoType(data));
return mongoTemplate.getCollection(GoblinStoreMarketVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderSkuId").is(orderSkuId)).getQueryObject(),
object);
}
}
package com.liquidnet.service.platform.utils;
import com.liquidnet.common.cache.redis.util.AbstractRedisUtil;
import com.liquidnet.common.cache.redis.util.RedisDataSourceUtil;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.dto.vo.GoblinOrderSkuVo;
import com.liquidnet.service.goblin.dto.vo.GoblinStoreOrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class GoblinRedisUtils {
@Autowired
private RedisDataSourceUtil redisDataSourceUtil;
public int randomMax = 10;
private AbstractRedisUtil getRedis() {
return redisDataSourceUtil.getRedisGoblinUtil();
}
// 获取 订单相关vo
public GoblinStoreOrderVo getGoblinOrder(String orderId) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER.concat(orderId);
Object obj = getRedis().get(redisKey);
if (obj == null) {
return null;
} else {
return (GoblinStoreOrderVo) obj;
}
}
// 获取 订单相关Skuvo
public GoblinOrderSkuVo getGoblinOrderSkuVo(String orderSkuId) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER_SKU.concat(orderSkuId);
Object obj = getRedis().get(redisKey);
if (obj == null) {
return null;
} else {
return (GoblinOrderSkuVo) obj;
}
}
//获取 未支付的订单redis列表
public List<String> getUnPayGoblinOrderList(String randomKey) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER_UN_PAY.concat(randomKey);
Object obj = getRedis().get(redisKey);
if (obj == null) {
return CollectionUtil.arrayListString();
} else {
return (List<String>) getRedis().get(redisKey);
}
}
// 删除 未支付订单id列表
public void removeGoblinOrder(String randomKey, String orderId) {
if (randomKey == null) {
for (int i = 0; i < randomMax; i++) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER_UN_PAY.concat(i + "");
List<String> list = getUnPayGoblinOrderList(randomKey);
if (list.contains(orderId)) {
list.remove(orderId);
getRedis().set(redisKey, list);
break;
}
}
} else {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER_UN_PAY.concat(randomKey + "");
List<String> list = getUnPayGoblinOrderList(randomKey);
list.remove(orderId);
getRedis().set(redisKey, list);
}
}
//添加库存
public int incrSkuStock(String marketPre, String skuId, Integer stock) {
String rk = GoblinRedisConst.REAL_STOCK_SKU;
if (marketPre != null && !marketPre.equals("null")) {
rk = rk.concat(marketPre + ":");
}
rk = rk.concat(skuId);
return (int) getRedis().incr(rk, stock);
}
// 减少 用户sku购买个数
public int decrSkuCountByUid(String uid, String skuId, int number) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_BUY_COUNT.concat(uid + ":skuId:" + skuId);
return (int) getRedis().decr(redisKey, number);
}
// 赋值 订单相关vo
public void setGoblinOrder(String orderId, GoblinStoreOrderVo vo) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER.concat(orderId);
getRedis().set(redisKey, vo);
}
// 赋值 订单相关Skuvo
public void setGoblinOrderSku(String orderSkuId, GoblinOrderSkuVo vo) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_ORDER_SKU.concat(orderSkuId);
getRedis().set(redisKey, vo);
}
}
......@@ -51,4 +51,16 @@ public class QueueUtils {
map.put("message", jsonMsg);
redisDataSourceUtil.getRedisCandyUtil().getStringRedisTemplate().opsForStream().add(StreamRecords.mapBacked(map).withStreamKey(streamKey));
}
/**
* 发送消息 - REDIS
*
* @param streamKey Redis消费Key
* @param jsonMsg Json字符串
*/
public void sendMsgByGoblinRedis(String streamKey, String jsonMsg) {
HashMap<String, String> map = CollectionUtil.mapStringString();
map.put("message", jsonMsg);
redisDataSourceUtil.getRedisGoblinUtil().getStringRedisTemplate().opsForStream().add(StreamRecords.mapBacked(map).withStreamKey(streamKey));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment