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

Commit 55982f64 authored by zhoujianping's avatar zhoujianping

1.开票提醒推送逻辑重新设计

parent a2007a18
......@@ -94,6 +94,8 @@ public class KylinRedisConst {
public static final String REDIS_KEY_KYLIN_PERFORMANCE_SUBSCRIBE_LIST = "kylin:performance:subscribe:list"; //预约列表
public static final String REDIS_KEY_KYLIN_PERFORMANCE_SUBSCRIBE_READ = "kylin:performance:subscribe:read"; //预约列表是否已读
public static final String REDIS_KEY_KYLIN_PERFORMANCE_SUBSCRIBE_LOCK = "kylin:performance:subscribe:lock"; //预约提醒加锁
public static final String REDIS_WQ_ORDER_FIX = "kylin:wq:order:";//纪录万青 订单填写快递地址
public static final String REDIS_WQ_ORDER_EXPRESS = "kylin:wq:pxress:order:";//万青补偿快递vo 订单填写快递地址
......
package com.liquidnet.service.kylin.dao;
import lombok.Data;
/**
* @author zjp
* @create 2024-03-21 15:44
*/
@Data
public class KylinPerformancesSubscribeDao {
private Integer mid;
private String pushTitle;
private String deviceTokens;
private String pushRange;
private String jumpValue;
}
......@@ -104,4 +104,24 @@ public interface KylinPerformancesMapper extends BaseMapper<KylinPerformances> {
* @date 2024/3/18 16:06
*/
List<KylinPerformanceSubscribeTicketStatisticalDao> getSubscribeTicketStatisticalByPerformancesId(@Param("performancesId")String performancesId);
/**
* 获取开票提醒需要push用户信息
* @author zjp
* @param type 推送类型 0 开票提醒
* @param pushRange 推送设备唯一标识
* @param isPush 推送设备 ios android
* @return: java.util.List<com.liquidnet.service.kylin.dao.KylinPerformancesSubscribeDao>
* @date 2024/3/21 16:29
*/
List<KylinPerformancesSubscribeDao> performanceSubscribePush(@Param("type")Integer type,@Param("pushRange")String pushRange,@Param("isPush")Integer isPush);
/**
* 批量修改开票提醒推送状态
* @author zjp
* @param ids
* @return: void
* @date 2024/3/21 18:02
*/
void updatePerformanceSubscribePushById(@Param("ids")List<Integer> ids);
}
......@@ -27,4 +27,7 @@ public interface KylinTicketsMapper extends BaseMapper<KylinTickets> {
List<TicketAndStatusDao> selectTicketsByIds(List<String> ticketsIdList);
ShowAgentDao selectOneByPerIdAndTicketId(@Param("ticketId")String ticketId);
}
......@@ -1224,4 +1224,33 @@ GROUP BY user_mobile,tickets_id;
kps.tickets_id) B ON A.performances_id = B.performance_id AND A.ticket_times_id = B.ticket_times_id AND A.tickets_id = B.tickets_id
ORDER BY A.ticket_times_id
</select>
<select id="performanceSubscribePush" resultType="com.liquidnet.service.kylin.dao.KylinPerformancesSubscribeDao">
SELECT mid,
push_title AS pushTitle,
device_tokens AS deviceTokens,
push_range AS pushRange,
performance_id AS jumpValue
FROM kylin_performance_subscribe
WHERE
push_time &lt;= NOW()
<if test="type!=null">
and type=#{type}
</if>
<if test="pushRange!=null and pushRange!=''">
and push_range=#{pushRange}
</if>
<if test="type!=null">
and type=#{type}
</if>
<if test="isPush!=null">
and is_push=#{isPush}
</if>
</select>
<update id="updatePerformanceSubscribePushById" parameterType="java.util.List">
update kylin_performance_subscribe set is_push=1
where mid in
<foreach collection="ids" item="id" index="index" open="(" close=")" separator=",">
#{id}
</foreach>
</update>
</mapper>
......@@ -31,4 +31,13 @@ public interface FeignPlatformTaskClient {
@GetMapping("platform/performance/line")
ResponseDto<Boolean> performanceLine();
/**
* 定时开票提醒
* @author zjp
* @return: com.liquidnet.service.base.ResponseDto<java.lang.Boolean>
* @date 2024/3/21 18:03
*/
@GetMapping("platform/performance/subscribePush")
ResponseDto<Boolean> performanceSubscribePush();
}
......@@ -82,4 +82,21 @@ public class KylinTaskHandler {
XxlJobHelper.handleFail();
}
}
/**
* 开票提醒定时推送
* @author zjp
* @param null
* @return: null
* @date 2024/3/21 15:32
*/
@XxlJob(value = "sev-platform:performanceSubscribePush")
public void performanceSubscribePush() {
try {
XxlJobHelper.handleSuccess("结果:" + feignPlatformTaskClient.performanceSubscribePush().getData());
} catch (Exception e) {
XxlJobHelper.log(e);
XxlJobHelper.handleFail();
}
}
}
......@@ -83,19 +83,6 @@ public class KylinPerformancesServiceImpl implements IKylinPerformancesService {
@Value("${liquidnet.service.smile.url}")
private String smileUrl;
@Value("${liquidnet.umeng.ios.appkey}")
private String iosAppkey;
@Value("${liquidnet.umeng.ios.appMasterSecret}")
private String iosAppMasterSecret;
@Value("${liquidnet.umeng.android.appkey}")
private String androidAppkey;
@Value("${liquidnet.umeng.android.appMasterSecret}")
private String androidAppMasterSecret;
@Autowired
Environment environment;
private PushClient client = new PushClient();
public HashMap<String, Object> localList(
int days, String cityName, Integer adCode, int type,
Integer isDiscount, Integer isAdvance, Integer isExclusive,
......@@ -880,7 +867,7 @@ public class KylinPerformancesServiceImpl implements IKylinPerformancesService {
"kylin_performance_subscribe.insert",
new Object[]{
param.getPerformancesId(), param.getTicketTimesId(), param.getTicketsId(), uid,KylinTableStatusConst.SubscribeTypeEnum.TYPE1.getKey(),param.getDeviceTokens(),
source,pushTime,param.getPerformancesTitle(),1
source,pushTime,param.getPerformancesTitle(),0
}
));
// 演出预约
......@@ -913,15 +900,6 @@ public class KylinPerformancesServiceImpl implements IKylinPerformancesService {
}
//开票提醒列表存入redis中
dataUtils.setPerformanceSubscribeList(uid,performanceSubscribeList);
//友盟消息推送
if(!StringUtil.isEmpty(source) && !StringUtil.isEmpty(param.getDeviceTokens())){
if (source.equals("IOS")) {
sendIOSBroadcast(param.getDeviceTokens(),kylinPerformanceSubscribeUpushVo);
} else if (source.equals("Android")) {
//Android 推送
sendAndroidBroadcast(param.getDeviceTokens(),kylinPerformanceSubscribeUpushVo);
}
}
}
return ResponseDto.success("预约成功");
} catch (Exception e) {
......@@ -943,68 +921,4 @@ public class KylinPerformancesServiceImpl implements IKylinPerformancesService {
dataUtils.deleteIsSubscribe(uid,performancesId,ticketTimesId);
}
public void sendAndroidBroadcast(String deviceTokens,KylinPerformanceSubscribeUpushVo kylinPerformanceSubscribeUpushVo) {
try {
AndroidBroadcast broadcast = new AndroidBroadcast(androidAppkey, androidAppMasterSecret,"unicast");
broadcast.setBadge(1);
broadcast.setTicker("【正在现场】开票提醒");
broadcast.setTitle("【正在现场】开票提醒");
broadcast.setText(kylinPerformanceSubscribeUpushVo.getPushContent());
String custom = UpushTargetType.getTypeAction(kylinPerformanceSubscribeUpushVo.getJumpType());
broadcast.goCustomAfterOpen(custom);
broadcast.setDisplayType(AndroidNotification.DisplayType.NOTIFICATION);
if (!LnsEnum.ENV.prod.name().equals(environment.getProperty(CurrentUtil.CK_ENV_ACTIVE))) {
broadcast.setTestMode();
} else {
broadcast.setProductionMode();
}
// Set customized fields
broadcast.setExtraField("type", kylinPerformanceSubscribeUpushVo.getJumpType().toString());
broadcast.setExtraField("id", kylinPerformanceSubscribeUpushVo.getJumpValue());
broadcast.setExtraField("url", kylinPerformanceSubscribeUpushVo.getJumpValue());
//表示指定的单个设备
broadcast.setPredefinedKeyValue("device_tokens",deviceTokens);
//推送时间
broadcast.setPredefinedKeyValue("start_time", kylinPerformanceSubscribeUpushVo.getPushTime());
log.info("友盟消息推送开始Android============kylinPerformanceSubscribeUpushVo={},deviceTokens={}",kylinPerformanceSubscribeUpushVo.toString(),deviceTokens);
String sendRes = client.send(broadcast);
log.info("友盟消息推送结算AndroidReturn============sendRes={}",sendRes);
} catch (Exception e) {
log.info("友盟消息推送失败Android============kylinPerformanceSubscribeUpushVo={},deviceTokens={},e={}",kylinPerformanceSubscribeUpushVo.toString(),deviceTokens,e);
}
}
public void sendIOSBroadcast(String deviceTokens,KylinPerformanceSubscribeUpushVo kylinPerformanceSubscribeUpushVo) {
AdminUpush updatePush = new AdminUpush();
try {
IOSBroadcast broadcast = new IOSBroadcast(iosAppkey, iosAppMasterSecret,"unicast");
//alert的值设置为字典
broadcast.setAlert("【正在现场】开票提醒", "", kylinPerformanceSubscribeUpushVo.getPushContent());
broadcast.setBadge(1);
broadcast.setSound("default");
if (!LnsEnum.ENV.prod.name().equals(environment.getProperty(CurrentUtil.CK_ENV_ACTIVE))) {
broadcast.setTestMode();
} else {
broadcast.setProductionMode();
}
// Set customized fields
broadcast.setCustomizedField("type", kylinPerformanceSubscribeUpushVo.getJumpType().toString());
broadcast.setCustomizedField("id", kylinPerformanceSubscribeUpushVo.getJumpValue());
broadcast.setCustomizedField("url", kylinPerformanceSubscribeUpushVo.getJumpValue());
//表示指定的单个设备
broadcast.setPredefinedKeyValue("device_tokens",deviceTokens);
//推送时间
broadcast.setPredefinedKeyValue("start_time", kylinPerformanceSubscribeUpushVo.getPushTime());
log.info("友盟消息推送开始IOS============kylinPerformanceSubscribeUpushVo={},deviceTokens={}",kylinPerformanceSubscribeUpushVo.toString(),deviceTokens);
String sendRes = client.send(broadcast);
log.info("友盟消息推送结算IOSReturn============sendRes={}",sendRes);
} catch (Exception e) {
log.info("友盟消息推送失败IOS============kylinPerformanceSubscribeUpushVo={},deviceTokens={},e={}",kylinPerformanceSubscribeUpushVo.toString(),deviceTokens,e);
}
}
}
package com.liquidnet.service.platform.controller.kylin;
import com.liquidnet.common.cache.redis.util.RedisKylinUtil;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.dto.vo.KylinTimePerformanceVo;
import com.liquidnet.service.kylin.dto.vo.PerformanceOrderStatisticalVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
......@@ -45,6 +48,8 @@ public class KylinPerformancesController {
private IKylinPerformancesPartnerService performancesPartnerService;
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private RedisKylinUtil redisKylinUtil;
@PostMapping("/checkPerformanceTime")
@ApiOperation("演出脚本")
......@@ -86,4 +91,27 @@ public class KylinPerformancesController {
return ResponseDto.success(false);
}
}
@GetMapping(value = "subscribePush")
@ApiOperation(value = "开票提醒定时推送")
public ResponseDto<Boolean> performanceSubscribePush() {
try {
//加锁10分钟避免数据量大重复提醒
boolean lock = redisKylinUtil.lock(KylinRedisConst.REDIS_KEY_KYLIN_PERFORMANCE_SUBSCRIBE_LOCK, 1, 60*10);
if(lock){
log.info("kylin:performance:subscribe:lock开票提醒定时推送我没有加锁!!!!!!!");
performanceVoTask.performanceSubscribePush();
//解锁
redisKylinUtil.uLock(KylinRedisConst.REDIS_KEY_KYLIN_PERFORMANCE_SUBSCRIBE_LOCK);
log.info("kylin:performance:subscribe:lock开票提醒定时推送我解锁了!!!!!!!");
}
return ResponseDto.success(true);
} catch (Exception e) {
e.printStackTrace();
//解锁
redisKylinUtil.uLock(KylinRedisConst.REDIS_KEY_KYLIN_PERFORMANCE_SUBSCRIBE_LOCK);
return ResponseDto.success(false);
}
}
}
......@@ -2,11 +2,17 @@ package com.liquidnet.service.platform.utils;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.liquidnet.common.cache.redis.util.RedisDataSourceUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.commons.lang.constant.LnsEnum;
import com.liquidnet.commons.lang.constant.UpushTargetType;
import com.liquidnet.commons.lang.util.*;
import com.liquidnet.commons.lang.util.upush.AndroidNotification;
import com.liquidnet.commons.lang.util.upush.PushClient;
import com.liquidnet.commons.lang.util.upush.android.AndroidBroadcast;
import com.liquidnet.commons.lang.util.upush.ios.IOSBroadcast;
import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.dao.KylinPerformancesSubscribeDao;
import com.liquidnet.service.kylin.dto.param.PerformancePartnerVo;
import com.liquidnet.service.kylin.dto.vo.KylinPerformanceSubscribeUpushVo;
import com.liquidnet.service.kylin.dto.vo.middle.KylinTicketTimesVo;
import com.liquidnet.service.kylin.dto.vo.middle.KylinTicketVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinPerformanceVo;
......@@ -25,6 +31,8 @@ import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.query.Criteria;
......@@ -38,6 +46,8 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
@Component
@Slf4j
......@@ -87,6 +97,18 @@ public class PerformanceVoTask {
private KylinTicketsPartnerServiceImpl ticketsPartnerService;
@Value("${liquidnet.umeng.ios.appkey}")
private String iosAppkey;
@Value("${liquidnet.umeng.ios.appMasterSecret}")
private String iosAppMasterSecret;
@Value("${liquidnet.umeng.android.appkey}")
private String androidAppkey;
@Value("${liquidnet.umeng.android.appMasterSecret}")
private String androidAppMasterSecret;
@Autowired
Environment environment;
private PushClient client = new PushClient();
/**
* 根据票状态判断 演出状态 票状态
*
......@@ -476,4 +498,110 @@ public class PerformanceVoTask {
}
return false;
}
public void performanceSubscribePush()throws Exception{
//异步处理ios
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
try {
//IOS开票提醒推送
IOSPush();
} catch (Exception e) {
e.printStackTrace();
}
log.info("IOS开票提醒推送异步任务执行完毕");
});
//Android开票提醒推送
log.info("Android开票提醒推送主线程继续执行");
AndroidPush();
future.get(); // 等待异步任务完成
log.info("开票提醒推送所有任务执行完毕");
}
public void AndroidPush(){
List<KylinPerformancesSubscribeDao> kylinPerformancesSubscribeDaoAndroidList = performancesMapper.performanceSubscribePush(0, "Android", 0);
if(!CollectionUtil.isEmpty(kylinPerformancesSubscribeDaoAndroidList)){
long startTime = System.currentTimeMillis(); // 获取开始时间
log.info("友盟Android开票提醒推送开始startTime===={}",startTime);
for (KylinPerformancesSubscribeDao kylinPerformancesSubscribeDao : kylinPerformancesSubscribeDaoAndroidList) {
//友盟推送
sendAndroidBroadcast(kylinPerformancesSubscribeDao.getDeviceTokens(),kylinPerformancesSubscribeDao.getPushTitle(),6,kylinPerformancesSubscribeDao.getJumpValue());
}
long endTime = System.currentTimeMillis(); // 获取结束时间
log.info("友盟Android开票提醒推送结束方法执行时间秒===={}",(startTime-endTime)/1000);
List<Integer> IOSIds = kylinPerformancesSubscribeDaoAndroidList.stream().map(KylinPerformancesSubscribeDao::getMid).collect(Collectors.toList());
//批量修改变成已推送
performancesMapper.updatePerformanceSubscribePushById(IOSIds);
}
}
public void IOSPush(){
List<KylinPerformancesSubscribeDao> kylinPerformancesSubscribeDaoIOSList = performancesMapper.performanceSubscribePush(0, "IOS", 0);
if(!CollectionUtil.isEmpty(kylinPerformancesSubscribeDaoIOSList)){
long startTime = System.currentTimeMillis(); // 获取开始时间
log.info("友盟IOS开票提醒推送开始startTime===={}",startTime);
for (KylinPerformancesSubscribeDao kylinPerformancesSubscribeDao : kylinPerformancesSubscribeDaoIOSList) {
//友盟推送
sendIOSBroadcast(kylinPerformancesSubscribeDao.getDeviceTokens(),kylinPerformancesSubscribeDao.getPushTitle(),6,kylinPerformancesSubscribeDao.getJumpValue());
}
long endTime = System.currentTimeMillis(); // 获取结束时间
log.info("友盟IOS开票提醒推送结束方法执行时间秒===={}",(startTime-endTime)/1000);
List<Integer> IOSIds = kylinPerformancesSubscribeDaoIOSList.stream().map(KylinPerformancesSubscribeDao::getMid).collect(Collectors.toList());
//批量修改变成已推送
performancesMapper.updatePerformanceSubscribePushById(IOSIds);
}
}
public void sendAndroidBroadcast(String deviceTokens,String pushTitle,Integer jumpType,String jumpValue) {
try {
AndroidBroadcast broadcast = new AndroidBroadcast(androidAppkey, androidAppMasterSecret,"unicast");
broadcast.setBadge(1);
broadcast.setTicker("【正在现场】开票提醒");
broadcast.setTitle("【正在现场】开票提醒");
broadcast.setText(pushTitle+",10分钟后即将开售,请点击进入详情页购买。");
String custom = UpushTargetType.getTypeAction(jumpType);
broadcast.goCustomAfterOpen(custom);
broadcast.setDisplayType(AndroidNotification.DisplayType.NOTIFICATION);
if (!LnsEnum.ENV.prod.name().equals(environment.getProperty(CurrentUtil.CK_ENV_ACTIVE))) {
broadcast.setTestMode();
} else {
broadcast.setProductionMode();
}
// Set customized fields
broadcast.setExtraField("type", jumpType.toString());
broadcast.setExtraField("id", jumpValue);
broadcast.setExtraField("url", jumpValue);
//表示指定的单个设备
broadcast.setPredefinedKeyValue("device_tokens",deviceTokens);
log.info("友盟消息推送开始Android============deviceTokens========={},pushTitle========={}",deviceTokens,pushTitle);
String sendRes = client.send(broadcast);
log.info("友盟消息推送成功AndroidReturn============sendRes===={}",sendRes);
} catch (Exception e) {
log.info("友盟消息推送失败Android============deviceTokens={},pushTitle={},e={}",deviceTokens,pushTitle,e);
}
}
public void sendIOSBroadcast(String deviceTokens,String pushTitle,Integer jumpType,String jumpValue) {
AdminUpush updatePush = new AdminUpush();
try {
IOSBroadcast broadcast = new IOSBroadcast(iosAppkey, iosAppMasterSecret,"unicast");
//alert的值设置为字典
broadcast.setAlert("【正在现场】开票提醒", "", pushTitle+",10分钟后即将开售,请点击进入详情页购买。");
broadcast.setBadge(1);
broadcast.setSound("default");
if (!LnsEnum.ENV.prod.name().equals(environment.getProperty(CurrentUtil.CK_ENV_ACTIVE))) {
broadcast.setTestMode();
} else {
broadcast.setProductionMode();
}
// Set customized fields
broadcast.setCustomizedField("type", jumpType.toString());
broadcast.setCustomizedField("id", jumpValue);
broadcast.setCustomizedField("url", jumpValue);
//表示指定的单个设备
broadcast.setPredefinedKeyValue("device_tokens",deviceTokens);
log.info("友盟消息推送开始IOS============deviceTokens========={},pushTitle========={}",deviceTokens,pushTitle);
String sendRes = client.send(broadcast);
log.info("友盟消息推送成功IOS============sendRes===={}",sendRes);
} catch (Exception e) {
log.info("友盟消息推送失败IOS============deviceTokens={},pushTitle={},e={}",deviceTokens,pushTitle,e);;
}
}
}
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