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

Commit 4136c403 authored by wangyifan's avatar wangyifan

platform、executor-main 拼团任务定时任务;kylin 模块类更新字段

parent a93c81ef
......@@ -43,15 +43,16 @@ public class KylinGroupBuyActivityVo implements Serializable {
@ApiModelProperty(value = "活动说明")
private String description;
@ApiModelProperty(value = "优惠配置")
private List<KylinGroupBuyDiscountVo> discounts;
@ApiModelProperty(value = "创建时间")
private String createdAt;
@ApiModelProperty(value = "更新时间")
private String updatedAt;
@ApiModelProperty(value = "优惠配置")
private List<KylinGroupBuyDiscountVo> discounts;
@ApiModelProperty(value = "关联演出名称(列表查询时填充)")
private String performanceName;
......
......@@ -18,12 +18,6 @@ public class KylinGroupBuyMemberVo implements Serializable {
@ApiModelProperty(value = "用户ID")
private String userId;
@ApiModelProperty(value = "昵称")
private String nickname;
@ApiModelProperty(value = "头像")
private String avatar;
@ApiModelProperty(value = "订单ID")
private String orderTicketsId;
......@@ -35,4 +29,14 @@ public class KylinGroupBuyMemberVo implements Serializable {
@ApiModelProperty(value = "加入时间")
private String joinTime;
@ApiModelProperty(value = "创建时间")
private String createdAt;
@ApiModelProperty(value = "昵称")
private String nickname;
@ApiModelProperty(value = "头像")
private String avatar;
}
......@@ -46,12 +46,13 @@ public class KylinGroupBuyOrderVo implements Serializable {
@ApiModelProperty(value = "过期时间")
private String expiresAt;
@ApiModelProperty(value = "成员")
private List<KylinGroupBuyMemberVo> members;
@ApiModelProperty(value = "创建时间")
private String createdAt;
@ApiModelProperty(value = "更新时间")
private String updatedAt;
@ApiModelProperty(value = "成员")
private List<KylinGroupBuyMemberVo> members;
}
......@@ -54,4 +54,10 @@ public interface FeignPlatformTaskClient {
@GetMapping("platform/refund/failRefund")
ResponseDto<Boolean> failRefund();
@PostMapping("platform/groupBuy/timeout")
ResponseDto<Boolean> groupBuyTimeout();
@PostMapping("platform/groupBuy/activitySchedule")
ResponseDto<Boolean> groupBuyActivitySchedule();
}
......@@ -122,4 +122,24 @@ public class KylinTaskHandler {
}
}
@XxlJob(value = "sev-platform:groupBuyTimeout")
public void groupBuyTimeout() {
try {
XxlJobHelper.handleSuccess("结果:" + feignPlatformTaskClient.groupBuyTimeout().getData());
} catch (Exception e) {
XxlJobHelper.log(e);
XxlJobHelper.handleFail();
}
}
@XxlJob(value = "sev-platform:groupBuyActivitySchedule")
public void groupBuyActivitySchedule() {
try {
XxlJobHelper.handleSuccess("结果:" + feignPlatformTaskClient.groupBuyActivitySchedule().getData());
} catch (Exception e) {
XxlJobHelper.log(e);
XxlJobHelper.handleFail();
}
}
}
......@@ -296,7 +296,7 @@ public class KylinGroupBuyOrderServiceImpl implements IKylinGroupBuyOrderService
return new Object[]{vo.getMemberId(), vo.getGroupOrderId(), vo.getUserId(),
vo.getOrderTicketsId(), vo.getTicketCount(), vo.getStatus(),
DateUtil.Formatter.yyyyMMddHHmmss.parse(vo.getJoinTime()),
DateUtil.Formatter.yyyyMMddHHmmss.parse(vo.getJoinTime())};
DateUtil.Formatter.yyyyMMddHHmmss.parse(vo.getCreatedAt())};
}
private void cacheOrder(KylinGroupBuyOrderVo order) {
......
package com.liquidnet.service.platform.controller.kylin.task;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.platform.service.impl.kylin.PlatformGroupBuyTaskServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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;
@Api(tags = "前端-拼团任务")
@RestController
@RequestMapping("groupBuy")
@Validated
public class PlatformGroupBuyTaskController {
@Autowired
private PlatformGroupBuyTaskServiceImpl groupBuyTaskService;
@PostMapping("timeout")
@ApiOperation("拼团超时退款任务")
public ResponseDto<Boolean> timeout() {
return ResponseDto.success(groupBuyTaskService.timeout());
}
@PostMapping("activitySchedule")
@ApiOperation("拼团活动启动/结束任务")
public ResponseDto<Boolean> activitySchedule() {
return ResponseDto.success(groupBuyTaskService.activitySchedule());
}
}
package com.liquidnet.service.platform.service.impl.kylin;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.base.constant.RedisKeyExpireConst;
import com.liquidnet.service.kylin.constant.GroupBuyStatusConst;
import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyActivityVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyMemberVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyOrderVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketEntitiesVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.platform.utils.QueueUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.time.LocalDateTime;
import java.util.List;
@Service
@Slf4j
public class PlatformGroupBuyTaskServiceImpl {
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private RedisUtil redisUtil;
@Autowired
private QueueUtils queueUtils;
@Value("${liquidnet.service.kylin.url}")
private String kylinUrl;
public boolean timeout() {
String now = now();
Query query = Query.query(Criteria.where("status").is(GroupBuyStatusConst.OrderStatus.PENDING)
.and("expiresAt").lt(now));
List<KylinGroupBuyOrderVo> orders = mongoTemplate.find(query,
KylinGroupBuyOrderVo.class, KylinGroupBuyOrderVo.class.getSimpleName());
for (KylinGroupBuyOrderVo order : orders) {
Query cas = Query.query(Criteria.where("groupOrderId").is(order.getGroupOrderId())
.and("status").is(GroupBuyStatusConst.OrderStatus.PENDING)
.and("expiresAt").lt(now));
Update update = Update.update("status", GroupBuyStatusConst.OrderStatus.FAILED)
.set("updatedAt", now);
if (mongoTemplate.updateFirst(cas, update,
KylinGroupBuyOrderVo.class, KylinGroupBuyOrderVo.class.getSimpleName()).getModifiedCount() == 1) {
order.setStatus(GroupBuyStatusConst.OrderStatus.FAILED);
order.setUpdatedAt(now);
sendOrderStatusSql(order.getGroupOrderId(), GroupBuyStatusConst.OrderStatus.PENDING,
GroupBuyStatusConst.OrderStatus.FAILED, LocalDateTime.now());
cacheOrder(order);
refundMembers(order, "拼团超时未成团,全额退款");
}
}
return true;
}
public boolean activitySchedule() {
String now = now();
List<KylinGroupBuyActivityVo> dueStartList = mongoTemplate.find(Query.query(Criteria.where("status").is(GroupBuyStatusConst.ActivityStatus.PENDING)
.and("launchType").is(GroupBuyStatusConst.LaunchType.SCHEDULED)
.and("scheduledTime").lte(now)),
KylinGroupBuyActivityVo.class, KylinGroupBuyActivityVo.class.getSimpleName());
mongoTemplate.updateMulti(Query.query(Criteria.where("status").is(GroupBuyStatusConst.ActivityStatus.PENDING)
.and("launchType").is(GroupBuyStatusConst.LaunchType.SCHEDULED)
.and("scheduledTime").lte(now)),
Update.update("status", GroupBuyStatusConst.ActivityStatus.ACTIVE).set("updatedAt", now),
"KylinGroupBuyActivityVo");
for (KylinGroupBuyActivityVo activity : dueStartList) {
activity.setStatus(GroupBuyStatusConst.ActivityStatus.ACTIVE);
activity.setUpdatedAt(now);
sendActivityStatusSql(activity.getActivityId(), GroupBuyStatusConst.ActivityStatus.PENDING,
GroupBuyStatusConst.ActivityStatus.ACTIVE, LocalDateTime.now());
cacheActivity(activity);
}
List<KylinGroupBuyActivityVo> dueEndList = mongoTemplate.find(Query.query(Criteria.where("status")
.in(GroupBuyStatusConst.ActivityStatus.ACTIVE, GroupBuyStatusConst.ActivityStatus.CLOSED)
.and("endTime").lte(now)),
KylinGroupBuyActivityVo.class, KylinGroupBuyActivityVo.class.getSimpleName());
mongoTemplate.updateMulti(Query.query(Criteria.where("status")
.in(GroupBuyStatusConst.ActivityStatus.ACTIVE, GroupBuyStatusConst.ActivityStatus.CLOSED)
.and("endTime").lte(now)),
Update.update("status", GroupBuyStatusConst.ActivityStatus.ENDED).set("updatedAt", now),
"KylinGroupBuyActivityVo");
for (KylinGroupBuyActivityVo activity : dueEndList) {
Integer fromStatus = activity.getStatus();
activity.setStatus(GroupBuyStatusConst.ActivityStatus.ENDED);
activity.setUpdatedAt(now);
sendActivityStatusSql(activity.getActivityId(), fromStatus,
GroupBuyStatusConst.ActivityStatus.ENDED, LocalDateTime.now());
cacheActivity(activity);
}
return true;
}
private void cacheOrder(KylinGroupBuyOrderVo order) {
redisUtil.del(KylinRedisConst.GROUP_BUY_ORDER.concat(order.getGroupOrderId()));
redisUtil.del(KylinRedisConst.GROUP_BUY_ORDER_SHARE.concat(order.getShareToken()));
redisUtil.set(KylinRedisConst.GROUP_BUY_ORDER.concat(order.getGroupOrderId()), order, RedisKeyExpireConst.KYLIN_GROUP_BUY_EXPIRE);
redisUtil.set(KylinRedisConst.GROUP_BUY_ORDER_SHARE.concat(order.getShareToken()), order, RedisKeyExpireConst.KYLIN_GROUP_BUY_EXPIRE);
}
private void cacheActivity(KylinGroupBuyActivityVo activity) {
redisUtil.del(KylinRedisConst.GROUP_BUY_ACTIVITY.concat(activity.getActivityId()));
redisUtil.set(KylinRedisConst.GROUP_BUY_ACTIVITY.concat(activity.getActivityId()), activity, RedisKeyExpireConst.KYLIN_GROUP_BUY_EXPIRE);
}
private void sendOrderStatusSql(String groupOrderId, Integer fromStatus, Integer toStatus, LocalDateTime updatedAt) {
queueUtils.sendMsgByRedis(MQConst.KylinQueue.SQL_ORDER_OVERTIME_REFUND.getKey(),
SqlMapping.get("kylin_group_buy_order.update_status", toStatus, updatedAt, groupOrderId, fromStatus));
}
private void sendActivityStatusSql(String activityId, Integer fromStatus, Integer toStatus, LocalDateTime updatedAt) {
queueUtils.sendMsgByRedis(MQConst.SlimeQueue.SQL_SLIME_FIELD.getKey(),
SqlMapping.get("kylin_group_buy_activity.update_status", toStatus, updatedAt, activityId, fromStatus));
}
private void refundMembers(KylinGroupBuyOrderVo order, String reason) {
if (CollectionUtils.isEmpty(order.getMembers())) {
return;
}
for (KylinGroupBuyMemberVo member : order.getMembers()) {
KylinOrderTicketVo orderTicketVo = mongoTemplate.findOne(
Query.query(Criteria.where("orderTicketsId").is(member.getOrderTicketsId())),
KylinOrderTicketVo.class, KylinOrderTicketVo.class.getSimpleName());
if (orderTicketVo == null) {
continue;
}
List<KylinOrderTicketEntitiesVo> entities = mongoTemplate.find(
Query.query(Criteria.where("orderId").is(orderTicketVo.getOrderTicketsId())),
KylinOrderTicketEntitiesVo.class, KylinOrderTicketEntitiesVo.class.getSimpleName());
for (KylinOrderTicketEntitiesVo entity : entities) {
autoRefund(orderTicketVo.getOrderTicketsId(), entity.getOrderTicketEntitiesId(), reason);
}
}
}
private void autoRefund(String orderId, String orderTicketEntitiesId, String reason) {
try {
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("orderId", orderId);
params.add("orderTicketEntitiesId", orderTicketEntitiesId);
params.add("reason", reason);
params.add("sendExpressType", "0");
params.add("skipCharges", "true");
params.add("autoApproved", "true");
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.add("Accept", "application/json;charset=UTF-8");
HttpUtil.post(kylinUrl + "/orderRefund/sendOrderRefunds", params, headers);
} catch (Exception e) {
log.error("拼团自动退款失败 orderId={}, entityId={}", orderId, orderTicketEntitiesId, e);
}
}
private String now() {
return DateUtil.Formatter.yyyyMMddHHmmss.format(LocalDateTime.now());
}
}
......@@ -4,3 +4,7 @@ goblin_order.close.sku=UPDATE goblin_order_sku SET status = ? ,updated_at = ? WH
# ------------------------????----------------------------
kylin_camera_record.insert=INSERT INTO kylin_camera_record (camera_record_id, camera_id, person_num) VALUES (?,?,?)
# ------------------------演出票拼团----------------------------
kylin_group_buy_order.update_status=UPDATE kylin_group_buy_order SET status = ?, updated_at = ? WHERE group_order_id = ? AND status = ?
kylin_group_buy_activity.update_status=UPDATE kylin_group_buy_activity SET status = ?, updated_at = ? WHERE activity_id = ? AND status = ?
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