需求:统计14个抽奖指标的时-日-周-月以及环比的抽奖数据,格式如下
****************************
****************************
2018-12-12 14:00 - 15:00
-----------概况-----------
抽奖次数 500
(日 n% 周 m%)
抽奖人数 480
(日 n% 周 m%)
--------奖励发放数据--------
抽得邀约资格次数 1000
(日 n% 周 m%)
抽得邀约资格人数 1000
(日 n% 周 m%)
抽得商城券次数 800
(日 n% 周 m%)
抽的商城券人数 800
(日 n% 周 m%)
抽得1元红包次数 600
(日 n% 周 m%)
抽的1元红包人数 600
(日 n% 周 m%)
--------奖励使用数据--------
邀约资格使用数 200
(日 n% 周 m%)
邀约资格使用人数 200
(日 n% 周 m%)
商城券使用数 200元
(日 n% 周 m%)
商城券使用人数 200元
(日 n% 周 m%)
1元红包提现数 1元
(日 n% 周 m%)
1元红包提现人数 1元
(日 n% 周 m%)
****************************
当天截止到2018-12-12 15:00
-----------概况-----------
抽奖次数 500
(日 n% 周 m%)
抽奖人数 480
(日 n% 周 m%)
--------奖励发放数据--------
抽得邀约资格次数 1000
(日 n% 周 m%)
抽得邀约资格人数 1000
(日 n% 周 m%)
抽得商城券次数 800
(日 n% 周 m%)
抽的商城券人数 800
(日 n% 周 m%)
抽得1元红包次数 600
(日 n% 周 m%)
抽的1元红包人数 600
(日 n% 周 m%)
--------奖励使用数据--------
邀约资格使用数 200
(日 n% 周 m%)
邀约资格使用人数 200
(日 n% 周 m%)
商城券使用数 200元
(日 n% 周 m%)
商城券使用人数 200元
(日 n% 周 m%)
1元红包提现数 1元
(日 n% 周 m%)
1元红包提现人数 1元
(日 n% 周 m%)
****************************
本月截止到2018-12-12 15:00
-----------概况-----------
抽奖次数 500
(月 m%)
抽奖人数 480
(月 m%)
--------奖励发放数据--------
抽得邀约资格次数 1000
(月 m%)
抽得邀约资格人数 1000
(月 m%)
抽得商城券次数 800
(月 m%)
抽的商城券人数 800
(月 m%)
抽得1元红包次数 600
(月 m%)
抽的1元红包人数 600
(月 m%)
--------奖励使用数据--------
邀约资格使用数 200
(月 m%)
邀约资格使用人数 200
(月 m%)
商城券使用数 200元
(月 m%)
商城券使用人数 200元
(月 m%)
1元红包提现数 1元
(月 m%)
1元红包提现人数 1元
(月 m%)
抽象出一个公用的统计函数,14个指标公用即可
/** * 获得统计指标的各项数据 * @param className * @param methodName * @return */ public Map<String,String> getStatisticsInfo(String className, String methodName){ try { Map<String, String> result = new HashMap<>(); //通过Spring容器获得Dao对象,不能直接获取 WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); Class<?> cls = wac.getBean(className).getClass(); Method method = cls.getMethod(methodName, Map.class); //分时-今日数量 Date now = new Date(); String nowDate = DateTimeUtils.formatDateHH(now); String beginDate = DateTimeUtils.formatDateHH(DateTimeUtils.addHours(now, -1)); Map<String, Object> drawPrizeHourParams = new HashMap<>(); drawPrizeHourParams.put("beginDate", beginDate); drawPrizeHourParams.put("endDate", nowDate); Integer drawPrizeHour = (Integer) method.invoke(wac.getBean(className), drawPrizeHourParams); if(drawPrizeHour == null) { drawPrizeHour = 0; } result.put("drawPrizeHour", drawPrizeHour.toString()); //分时-日环比 String dayBeforeEndDate = DateTimeUtils.formatDateHH(DateTimeUtils.addDays(now, -1)); String dayBeforeBeginDate = DateTimeUtils.formatDateHH(DateTimeUtils.addHours(DateTimeUtils.addDays(now, -1), -1)); Map<String, Object> drawPrizeHourBeforeParams = new HashMap<>(); drawPrizeHourBeforeParams.put("beginDate", dayBeforeBeginDate); drawPrizeHourBeforeParams.put("endDate", dayBeforeEndDate); Integer drawPrizeHourBefore = (Integer) method.invoke(wac.getBean(className), drawPrizeHourBeforeParams); if(drawPrizeHourBefore == null || drawPrizeHourBefore.intValue() == 0) { drawPrizeHourBefore = 1; } String hourDayBeforePercent = getPercent(drawPrizeHour.intValue(), drawPrizeHourBefore.intValue()); result.put("hourDayCmpPercent", hourDayBeforePercent); //分时-周环比 String weekBeforeEndDate = DateTimeUtils.formatDateHH(DateTimeUtils.addDays(now, -7)); String weekBeforeBeginDate = DateTimeUtils.formatDateHH(DateTimeUtils.addHours(DateTimeUtils.addDays(now, -7), -1)); Map<String, Object> drawPrizeHourWeekBeforeParams = new HashMap<>(); drawPrizeHourWeekBeforeParams.put("beginDate", weekBeforeBeginDate); drawPrizeHourWeekBeforeParams.put("endDate", weekBeforeEndDate); Integer drawPrizeWeekBefore = (Integer) method.invoke(wac.getBean(className), drawPrizeHourWeekBeforeParams); if(drawPrizeWeekBefore == null || drawPrizeWeekBefore.intValue() == 0) { drawPrizeWeekBefore = 1; } String hourWeekBeforePercent = getPercent(drawPrizeHour.intValue(), drawPrizeWeekBefore.intValue()); result.put("hourWeekCmpPercent", hourWeekBeforePercent); //当日截止统计时间-今日数量 String dayDeadlineDate = DateTimeUtils.formatDateHH(now); String dayDeadlineBeginDate = DateTimeUtils.formatDate(now) + " 00:00:00"; Map<String, Object> drawPrizeTodayParams = new HashMap<>(); drawPrizeTodayParams.put("beginDate", dayDeadlineBeginDate); drawPrizeTodayParams.put("endDate", dayDeadlineDate); Integer drawPrizeToday = (Integer) method.invoke(wac.getBean(className), drawPrizeTodayParams); if(drawPrizeToday == null) { drawPrizeToday = 0; } result.put("drawPrizeToday", drawPrizeToday.toString()); //当日截止统计时间-日环比 String dayDeadlineBeforeEndDate = DateTimeUtils.formatDateHH(DateTimeUtils.addDays(now, -1)); String dayDeadlineBeforeBeginDate = DateTimeUtils.formatDate(DateTimeUtils.addDays(now, -1)) + " 00:00:00"; Map<String, Object> drawPrizeDayDeadlineBeforeParams = new HashMap<>(); drawPrizeDayDeadlineBeforeParams.put("beginDate", dayDeadlineBeforeBeginDate); drawPrizeDayDeadlineBeforeParams.put("endDate", dayDeadlineBeforeEndDate); Integer drawPrizeDayDeadlineBefore = (Integer) method.invoke(wac.getBean(className), drawPrizeDayDeadlineBeforeParams); if(drawPrizeDayDeadlineBefore == null || drawPrizeDayDeadlineBefore.intValue() == 0) { drawPrizeDayDeadlineBefore = 1; } String dayDeadlineBeforePercent = getPercent(drawPrizeToday.intValue(), drawPrizeDayDeadlineBefore.intValue()); result.put("dayDeadlineCmpPercent", dayDeadlineBeforePercent); //当日截止统计时间-周环比 String weekDeadlineBeforeEndDate = DateTimeUtils.formatDateHH(DateTimeUtils.addDays(now, -7)); String weekDeadlineBeforeBeginDate = DateTimeUtils.formatDate(DateTimeUtils.addDays(now, -7)) + " 00:00:00"; Map<String, Object> drawPrizeWeekDeadlineBeforeParams = new HashMap<>(); drawPrizeWeekDeadlineBeforeParams.put("beginDate", weekDeadlineBeforeBeginDate); drawPrizeWeekDeadlineBeforeParams.put("endDate", weekDeadlineBeforeEndDate); Integer drawPrizeWeekDeadlineBefore = (Integer) method.invoke(wac.getBean(className), drawPrizeWeekDeadlineBeforeParams); if(drawPrizeWeekDeadlineBefore == null || drawPrizeWeekDeadlineBefore.intValue() == 0) { drawPrizeWeekDeadlineBefore = 1; } String weekDeadlineBeforePercent = getPercent(drawPrizeToday.intValue(), drawPrizeWeekDeadlineBefore.intValue()); result.put("weekDeadlineCmpPercent", weekDeadlineBeforePercent); //当日截止统计时间-本月数量 String monthDeadlineDate = DateTimeUtils.formatDateHH(now); String monthDeadlineBeginDate = DateTimeUtils.formatDate(DateTimeUtils.beginDateOfMonth(now,0,1)) + " 00:00:00"; Map<String, Object> drawPrizeMonthParams = new HashMap<>(); drawPrizeMonthParams.put("beginDate", monthDeadlineBeginDate); drawPrizeMonthParams.put("endDate", monthDeadlineDate); Integer drawPrizeMonth = (Integer) method.invoke(wac.getBean(className), drawPrizeMonthParams); if(drawPrizeMonth == null) { drawPrizeMonth = 0; } result.put("drawPrizeMonth", drawPrizeMonth.toString()); //当日截止统计时间-月环比 String monthBeforeDeadlineDate = DateTimeUtils.formatDateHH(DateTimeUtils.addMonths(now,-1)); String monthBeforeDeadlineBeginDate = DateTimeUtils.formatDate(DateTimeUtils.beginDateOfMonth(now,-1,1)) + " 00:00:00"; Map<String, Object> drawPrizeMonthBeforeParams = new HashMap<>(); drawPrizeMonthBeforeParams.put("beginDate", monthBeforeDeadlineBeginDate); drawPrizeMonthBeforeParams.put("endDate", monthBeforeDeadlineDate); Integer drawPrizeMonthBefore = (Integer) method.invoke(wac.getBean(className), drawPrizeMonthBeforeParams); if(drawPrizeMonthBefore == null || drawPrizeMonthBefore.intValue() == 0) { drawPrizeMonthBefore = 1; } String monthBeforePercent = getPercent(drawPrizeMonth.intValue(), drawPrizeMonthBefore.intValue()); result.put("monthCmpPercent", monthBeforePercent); return result; } catch (NoSuchMethodException e) { LOG.error("DrawPrizeDingTalkSchedule.getStatisticsInfo 获取统计指标NoSuchMethodException异常, className:{}, methodName:{},exp:{}",className,methodName,e); return null; } catch (IllegalAccessException e) { LOG.error("DrawPrizeDingTalkSchedule.getStatisticsInfo 获取统计指标IllegalAccessException异常, className:{}, methodName:{},exp:{}",className,methodName,e); return null; } catch (InvocationTargetException e) { LOG.error("DrawPrizeDingTalkSchedule.getStatisticsInfo 获取统计指标InvocationTargetException异常, className:{}, methodName:{},exp:{}",className,methodName,e); return null; } catch (Exception e){ LOG.error("DrawPrizeDingTalkSchedule.getStatisticsInfo 获取统计指标Exception异常, className:{}, methodName:{},exp:{}",className,methodName,e); return null; } } 值得注意的是className不能传Dao接口名,而必须传Dao实现类的名称(如activTaskLogDaoImpl),不然会因为Spring的动态代理,不能注入Dao,而且由于是统计数据,Dao走从库,且SQL需要命中索引,完整代码如下:
@Service public class DrawPrizeDingTalkSchedule { @Value(value = "${dingtalk.redpackage.data}") private String redPackageDingTalkAddress; private static final Logger LOG = LoggerFactory.getLogger(DrawPrizeDingTalkSchedule.class); /** * 定时调度 * 每个整点统计抽奖活动数据 */ public void pushDrawInfo(){ /**抽奖次数*/ Map<String,String> drawPrizeNumberInfo = getStatisticsInfo("activTaskLogDaoImpl", "countDrawNumber"); /**抽奖人数*/ Map<String,String> manTimeInfo = getStatisticsInfo("activTaskLogDaoImpl", "countDrawPeople"); /**抽得邀约资格次数*/ Map<String,String> invitationNumberInfo = getStatisticsInfo("shareInventoryDetailDaoImpl", "countInvitationNumber"); /**抽得邀约资格人数*/ Map<String,String> invitationPeopleInfo = getStatisticsInfo("shareInventoryDetailDaoImpl", "countInvitationPeople"); /**邀约资格使用数*/ Map<String,String> invitationUsedNumberInfo = getStatisticsInfo("shareInventoryDetailDaoImpl", "countInvitationUsedNumber"); /**邀约资格使用人数*/ Map<String,String> invitationUsedPeopleInfo = getStatisticsInfo("shareInventoryDetailDaoImpl", "countInvitationUsedPeople"); /**抽得1元红包次数*/ Map<String,String> oneYuanRpNumberInfo = getStatisticsInfo("activeCouponDetailDaoImpl", "countOneYuanRpNumber"); /**抽得1元红包人数*/ Map<String,String> oneYuanRpPeopleInfo = getStatisticsInfo("activeCouponDetailDaoImpl", "countOneYuanRpPeople"); /**1元红包提现数*/ Map<String,String> oneYuanRpWithdrawNumberInfo = getStatisticsInfo("activeCouponDetailDaoImpl", "countOneYuanRpWithdrawNumber"); /**1元红包提现人数*/ Map<String,String> oneYuanRpWithdrawPeopleInfo = getStatisticsInfo("activeCouponDetailDaoImpl", "countOneYuanRpWithdrawPeople"); /**抽得商城券次数*/ Map<String,String> shopRpNumberInfo = getStatisticsInfo("activeCouponDetailDaoImpl", "countShopRpNumber"); /**抽得商城券人数*/ Map<String,String> shopRpPeopleInfo = getStatisticsInfo("activeCouponDetailDaoImpl", "countShopRpPeople"); /**商城券使用数*/ Map<String,String> shopRpWithdrawNumberInfo = getStatisticsInfo("activeCouponDetailDaoImpl", "countShopRpWithdrawNumber"); /**商城券使用人数*/ Map<String,String> shopRpWithdrawPeopleInfo = getStatisticsInfo("activeCouponDetailDaoImpl", "countShopRpWithdrawPeople"); /**拼接钉钉消息*/ try { String content = "****************************\n" +" 抽奖活动 "+"\n" +"****************************\n" + getHourZone() + "\n" + "-----------概况-----------\n" +"抽奖次数 " + drawPrizeNumberInfo.get("drawPrizeHour") + "\n" +"(日 " + drawPrizeNumberInfo.get("hourDayCmpPercent") + " 周 " + drawPrizeNumberInfo.get("hourWeekCmpPercent") + ")\n" +"抽奖人数 " + manTimeInfo.get("drawPrizeHour") + "\n" +"(日 " + manTimeInfo.get("hourDayCmpPercent") + " 周 " + manTimeInfo.get("hourWeekCmpPercent") + ")\n" +"--------奖励发放数据--------\n" +"抽得邀约资格次数 " + invitationNumberInfo.get("drawPrizeHour") + "\n" +"(日 " + invitationNumberInfo.get("hourDayCmpPercent") + " 周 " + invitationNumberInfo.get("hourWeekCmpPercent") + ")\n" +"抽得邀约资格次人数 " + invitationPeopleInfo.get("drawPrizeHour") + "\n" +"(日 " + invitationPeopleInfo.get("hourDayCmpPercent") + " 周 " + invitationPeopleInfo.get("hourWeekCmpPercent") + ")\n" +"抽得商城券次数 " + shopRpNumberInfo.get("drawPrizeHour") + "\n" +"(日 " + shopRpNumberInfo.get("hourDayCmpPercent") + " 周 " + shopRpNumberInfo.get("hourWeekCmpPercent") + ")\n" +"抽得商城券人数 " + shopRpPeopleInfo.get("drawPrizeHour") + "\n" +"(日 " + shopRpPeopleInfo.get("hourDayCmpPercent") + " 周 " + shopRpPeopleInfo.get("hourWeekCmpPercent") + ")\n" +"抽得1元红包次数 " + oneYuanRpNumberInfo.get("drawPrizeHour") + "\n" +"(日 " + oneYuanRpNumberInfo.get("hourDayCmpPercent") + " 周 " + oneYuanRpNumberInfo.get("hourWeekCmpPercent") + ")\n" +"抽得1元红包人数 " + oneYuanRpPeopleInfo.get("drawPrizeHour") + "\n" +"(日 " + oneYuanRpPeopleInfo.get("hourDayCmpPercent") + " 周 " + oneYuanRpPeopleInfo.get("hourWeekCmpPercent") + ")\n" +"--------奖励使用数据--------\n" +"邀约资格使用数 " + invitationUsedNumberInfo.get("drawPrizeHour") + "\n" +"(日 " + invitationUsedNumberInfo.get("hourDayCmpPercent") + " 周 " + invitationUsedNumberInfo.get("hourWeekCmpPercent") + ")\n" +"邀约资格使用人数 " + invitationUsedPeopleInfo.get("drawPrizeHour") + "\n" +"(日 " + invitationUsedPeopleInfo.get("hourDayCmpPercent") + " 周 " + invitationUsedPeopleInfo.get("hourWeekCmpPercent") + ")\n" +"商城券使用数 " + shopRpWithdrawNumberInfo.get("drawPrizeHour") + "\n" +"(日 " + shopRpWithdrawNumberInfo.get("hourDayCmpPercent") + " 周 " + shopRpWithdrawNumberInfo.get("hourWeekCmpPercent") + ")\n" +"商城券使用人数 " + shopRpWithdrawPeopleInfo.get("drawPrizeHour") + "\n" +"(日 " + shopRpWithdrawPeopleInfo.get("hourDayCmpPercent") + " 周 " + shopRpWithdrawPeopleInfo.get("hourWeekCmpPercent") + ")\n" +"1元红包提现数 " + oneYuanRpWithdrawNumberInfo.get("drawPrizeHour") + "\n" +"(日 " + oneYuanRpWithdrawNumberInfo.get("hourDayCmpPercent") + " 周 " + oneYuanRpWithdrawNumberInfo.get("hourWeekCmpPercent") + ")\n" +"1元红包提现人数 " + oneYuanRpWithdrawPeopleInfo.get("drawPrizeHour") + "\n" +"(日 " + oneYuanRpWithdrawPeopleInfo.get("hourDayCmpPercent") + " 周 " + oneYuanRpWithdrawPeopleInfo.get("hourWeekCmpPercent") + ")\n" +"****************************\n" +"当天截止到" + getDeadlineTime() +"\n" + "-----------概况-----------\n" +"抽奖次数 " + drawPrizeNumberInfo.get("drawPrizeToday") + "\n" +"(日 " + drawPrizeNumberInfo.get("dayDeadlineCmpPercent") + " 周 " + drawPrizeNumberInfo.get("weekDeadlineCmpPercent") + ")\n" +"抽奖人数 " + manTimeInfo.get("drawPrizeToday") + "\n" +"(日 " + manTimeInfo.get("dayDeadlineCmpPercent") + " 周 " + manTimeInfo.get("weekDeadlineCmpPercent") + ")\n" +"--------奖励发放数据--------\n" +"抽得邀约资格次数 " + invitationNumberInfo.get("drawPrizeToday") + "\n" +"(日 " + invitationNumberInfo.get("dayDeadlineCmpPercent") + " 周 " + invitationNumberInfo.get("weekDeadlineCmpPercent") + ")\n" +"抽得邀约资格人数 " + invitationPeopleInfo.get("drawPrizeToday") + "\n" +"(日 " + invitationPeopleInfo.get("dayDeadlineCmpPercent") + " 周 " + invitationPeopleInfo.get("weekDeadlineCmpPercent") + ")\n" +"抽得商城券次数 " + shopRpNumberInfo.get("drawPrizeToday") + "\n" +"(日 " + shopRpNumberInfo.get("dayDeadlineCmpPercent") + " 周 " + shopRpNumberInfo.get("weekDeadlineCmpPercent") + ")\n" +"抽得商城券人数 " + shopRpPeopleInfo.get("drawPrizeToday") + "\n" +"(日 " + shopRpPeopleInfo.get("dayDeadlineCmpPercent") + " 周 " + shopRpPeopleInfo.get("weekDeadlineCmpPercent") + ")\n" +"抽得1元红包次数 " + oneYuanRpNumberInfo.get("drawPrizeToday") + "\n" +"(日 " + oneYuanRpNumberInfo.get("dayDeadlineCmpPercent") + " 周 " + oneYuanRpNumberInfo.get("weekDeadlineCmpPercent") + ")\n" +"抽得1元红包人数 " + oneYuanRpPeopleInfo.get("drawPrizeToday") + "\n" +"(日 " + oneYuanRpPeopleInfo.get("dayDeadlineCmpPercent") + " 周 " + oneYuanRpPeopleInfo.get("weekDeadlineCmpPercent") + ")\n" +"--------奖励使用数据--------\n" +"邀约资格使用数 " + invitationUsedNumberInfo.get("drawPrizeToday") + "\n" +"(日 " + invitationUsedNumberInfo.get("dayDeadlineCmpPercent") + " 周 " + invitationUsedNumberInfo.get("weekDeadlineCmpPercent") + ")\n" +"邀约资格使用人数 " + invitationUsedPeopleInfo.get("drawPrizeToday") + "\n" +"(日 " + invitationUsedPeopleInfo.get("dayDeadlineCmpPercent") + " 周 " + invitationUsedPeopleInfo.get("weekDeadlineCmpPercent") + ")\n" +"商城券使用数 " + shopRpWithdrawNumberInfo.get("drawPrizeToday") + "\n" +"(日 " + shopRpWithdrawNumberInfo.get("dayDeadlineCmpPercent") + " 周 " + shopRpWithdrawNumberInfo.get("weekDeadlineCmpPercent") + ")\n" +"商城券使用人数 " + shopRpWithdrawPeopleInfo.get("drawPrizeToday") + "\n" +"(日 " + shopRpWithdrawPeopleInfo.get("dayDeadlineCmpPercent") + " 周 " + shopRpWithdrawPeopleInfo.get("weekDeadlineCmpPercent") + ")\n" +"1元红包提现数 " + oneYuanRpWithdrawNumberInfo.get("drawPrizeToday") + "\n" +"(日 " + oneYuanRpWithdrawNumberInfo.get("dayDeadlineCmpPercent") + " 周 " + oneYuanRpWithdrawNumberInfo.get("weekDeadlineCmpPercent") + ")\n" +"1元红包提现人数 " + oneYuanRpWithdrawPeopleInfo.get("drawPrizeToday") + "\n" +"(日 " + oneYuanRpWithdrawPeopleInfo.get("dayDeadlineCmpPercent") + " 周 " + oneYuanRpWithdrawPeopleInfo.get("weekDeadlineCmpPercent") + ")\n" +"****************************\n" +"本月截止到" + getDeadlineTime() +"\n" + "-----------概况-----------\n" +"抽奖次数 " + drawPrizeNumberInfo.get("drawPrizeMonth") + "\n" +"(月 " + drawPrizeNumberInfo.get("monthCmpPercent") + ")\n" +"抽奖人数 " + manTimeInfo.get("drawPrizeMonth") + "\n" +"(月 " + manTimeInfo.get("monthCmpPercent") + ")\n" +"--------奖励发放数据--------\n" +"抽得邀约资格次数 " + invitationNumberInfo.get("drawPrizeMonth") + "\n" +"(月 " + invitationNumberInfo.get("monthCmpPercent") + ")\n" +"抽得邀约资格人数 " + invitationPeopleInfo.get("drawPrizeMonth") + "\n" +"(月 " + invitationPeopleInfo.get("monthCmpPercent") + ")\n" +"抽得商城券次数 " + shopRpNumberInfo.get("drawPrizeMonth") + "\n" +"(月 " + shopRpNumberInfo.get("monthCmpPercent") + ")\n" +"抽得商城券人数 " + shopRpPeopleInfo.get("drawPrizeMonth") + "\n" +"(月 " + shopRpPeopleInfo.get("monthCmpPercent") + ")\n" +"抽得1元红包次数 " + oneYuanRpNumberInfo.get("drawPrizeMonth") + "\n" +"(月 " + oneYuanRpNumberInfo.get("monthCmpPercent") + ")\n" +"抽得1元红包人数 " + oneYuanRpPeopleInfo.get("drawPrizeMonth") + "\n" +"(月 " + oneYuanRpPeopleInfo.get("monthCmpPercent") + ")\n" +"--------奖励使用数据--------\n" +"邀约资格使用数 " + invitationUsedNumberInfo.get("drawPrizeMonth") + "\n" +"(月 " + invitationUsedNumberInfo.get("monthCmpPercent") + ")\n" +"邀约资格使用人数 " + invitationUsedPeopleInfo.get("drawPrizeMonth") + "\n" +"(月 " + invitationUsedPeopleInfo.get("monthCmpPercent") + ")\n" +"商城券使用数 " + shopRpWithdrawNumberInfo.get("drawPrizeMonth") + "\n" +"(月 " + shopRpWithdrawNumberInfo.get("monthCmpPercent") + ")\n" +"商城券使用人数 " + shopRpWithdrawPeopleInfo.get("drawPrizeMonth") + "\n" +"(月 " + shopRpWithdrawPeopleInfo.get("monthCmpPercent") + ")\n" +"1元红包提现数 " + oneYuanRpWithdrawNumberInfo.get("drawPrizeMonth") + "\n" +"(月 " + oneYuanRpWithdrawNumberInfo.get("monthCmpPercent") + ")\n" +"1元红包提现人数 " + oneYuanRpWithdrawPeopleInfo.get("drawPrizeMonth") + "\n" +"(月 " + oneYuanRpWithdrawPeopleInfo.get("monthCmpPercent") + ")\n"; Map<String, Object> text = new HashMap<>(); text.put("content", content); Map<String, Object> at = new HashMap<>(); at.put("atMobiles", new String[]{}); at.put("isAtAll", false); Map<String, Object> param = new HashMap<>(); param.put("text", text); param.put("msgtype", "text"); param.put("at", at); HttpUtil.post(redPackageDingTalkAddress, JsonUtil.toString(param)); LOG.info("[DrawPrizeDingTalkSchedule.pushDrawInfo] 发送完成,发送信息:{}",JsonUtil.toString(param)); }catch (Exception e){ LOG.info("[DrawPrizeDingTalkSchedule.pushDrawInfo] 发送信息异常,时间:{}exp:{}",DateTimeUtils.formatDateHH(new Date()),e); } } /** * 获取抽奖活动的小时区间 * @return */ private String getHourZone(){ Date now= new Date(); String nowDate = DateTimeUtils.formatDateHH(now); String beginDate = DateTimeUtils.formatDateHH(DateTimeUtils.addHours(now, -1)); return nowDate.substring(0,10) + beginDate.substring(10,16) + " - " + nowDate.substring(10,16); } private String getDeadlineTime() { Date now= new Date(); String nowDate = DateTimeUtils.formatDateHH(now); return nowDate.substring(0,16); } /** * 获得统计指标的各项数据 * @param className * @param methodName * @return */ public Map<String,String> getStatisticsInfo(String className, String methodName){ try { Map<String, String> result = new HashMap<>(); //通过Spring容器获得Dao对象,不能直接获取 WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); Class<?> cls = wac.getBean(className).getClass(); Method method = cls.getMethod(methodName, Map.class); //分时-今日数量 Date now = new Date(); String nowDate = DateTimeUtils.formatDateHH(now); String beginDate = DateTimeUtils.formatDateHH(DateTimeUtils.addHours(now, -1)); Map<String, Object> drawPrizeHourParams = new HashMap<>(); drawPrizeHourParams.put("beginDate", beginDate); drawPrizeHourParams.put("endDate", nowDate); Integer drawPrizeHour = (Integer) method.invoke(wac.getBean(className), drawPrizeHourParams); if(drawPrizeHour == null) { drawPrizeHour = 0; } result.put("drawPrizeHour", drawPrizeHour.toString()); //分时-日环比 String dayBeforeEndDate = DateTimeUtils.formatDateHH(DateTimeUtils.addDays(now, -1)); String dayBeforeBeginDate = DateTimeUtils.formatDateHH(DateTimeUtils.addHours(DateTimeUtils.addDays(now, -1), -1)); Map<String, Object> drawPrizeHourBeforeParams = new HashMap<>(); drawPrizeHourBeforeParams.put("beginDate", dayBeforeBeginDate); drawPrizeHourBeforeParams.put("endDate", dayBeforeEndDate); Integer drawPrizeHourBefore = (Integer) method.invoke(wac.getBean(className), drawPrizeHourBeforeParams); if(drawPrizeHourBefore == null || drawPrizeHourBefore.intValue() == 0) { drawPrizeHourBefore = 1; } String hourDayBeforePercent = getPercent(drawPrizeHour.intValue(), drawPrizeHourBefore.intValue()); result.put("hourDayCmpPercent", hourDayBeforePercent); //分时-周环比 String weekBeforeEndDate = DateTimeUtils.formatDateHH(DateTimeUtils.addDays(now, -7)); String weekBeforeBeginDate = DateTimeUtils.formatDateHH(DateTimeUtils.addHours(DateTimeUtils.addDays(now, -7), -1)); Map<String, Object> drawPrizeHourWeekBeforeParams = new HashMap<>(); drawPrizeHourWeekBeforeParams.put("beginDate", weekBeforeBeginDate); drawPrizeHourWeekBeforeParams.put("endDate", weekBeforeEndDate); Integer drawPrizeWeekBefore = (Integer) method.invoke(wac.getBean(className), drawPrizeHourWeekBeforeParams); if(drawPrizeWeekBefore == null || drawPrizeWeekBefore.intValue() == 0) { drawPrizeWeekBefore = 1; } String hourWeekBeforePercent = getPercent(drawPrizeHour.intValue(), drawPrizeWeekBefore.intValue()); result.put("hourWeekCmpPercent", hourWeekBeforePercent); //当日截止统计时间-今日数量 String dayDeadlineDate = DateTimeUtils.formatDateHH(now); String dayDeadlineBeginDate = DateTimeUtils.formatDate(now) + " 00:00:00"; Map<String, Object> drawPrizeTodayParams = new HashMap<>(); drawPrizeTodayParams.put("beginDate", dayDeadlineBeginDate); drawPrizeTodayParams.put("endDate", dayDeadlineDate); Integer drawPrizeToday = (Integer) method.invoke(wac.getBean(className), drawPrizeTodayParams); if(drawPrizeToday == null) { drawPrizeToday = 0; } result.put("drawPrizeToday", drawPrizeToday.toString()); //当日截止统计时间-日环比 String dayDeadlineBeforeEndDate = DateTimeUtils.formatDateHH(DateTimeUtils.addDays(now, -1)); String dayDeadlineBeforeBeginDate = DateTimeUtils.formatDate(DateTimeUtils.addDays(now, -1)) + " 00:00:00"; Map<String, Object> drawPrizeDayDeadlineBeforeParams = new HashMap<>(); drawPrizeDayDeadlineBeforeParams.put("beginDate", dayDeadlineBeforeBeginDate); drawPrizeDayDeadlineBeforeParams.put("endDate", dayDeadlineBeforeEndDate); Integer drawPrizeDayDeadlineBefore = (Integer) method.invoke(wac.getBean(className), drawPrizeDayDeadlineBeforeParams); if(drawPrizeDayDeadlineBefore == null || drawPrizeDayDeadlineBefore.intValue() == 0) { drawPrizeDayDeadlineBefore = 1; } String dayDeadlineBeforePercent = getPercent(drawPrizeToday.intValue(), drawPrizeDayDeadlineBefore.intValue()); result.put("dayDeadlineCmpPercent", dayDeadlineBeforePercent); //当日截止统计时间-周环比 String weekDeadlineBeforeEndDate = DateTimeUtils.formatDateHH(DateTimeUtils.addDays(now, -7)); String weekDeadlineBeforeBeginDate = DateTimeUtils.formatDate(DateTimeUtils.addDays(now, -7)) + " 00:00:00"; Map<String, Object> drawPrizeWeekDeadlineBeforeParams = new HashMap<>(); drawPrizeWeekDeadlineBeforeParams.put("beginDate", weekDeadlineBeforeBeginDate); drawPrizeWeekDeadlineBeforeParams.put("endDate", weekDeadlineBeforeEndDate); Integer drawPrizeWeekDeadlineBefore = (Integer) method.invoke(wac.getBean(className), drawPrizeWeekDeadlineBeforeParams); if(drawPrizeWeekDeadlineBefore == null || drawPrizeWeekDeadlineBefore.intValue() == 0) { drawPrizeWeekDeadlineBefore = 1; } String weekDeadlineBeforePercent = getPercent(drawPrizeToday.intValue(), drawPrizeWeekDeadlineBefore.intValue()); result.put("weekDeadlineCmpPercent", weekDeadlineBeforePercent); //当日截止统计时间-本月数量 String monthDeadlineDate = DateTimeUtils.formatDateHH(now); String monthDeadlineBeginDate = DateTimeUtils.formatDate(DateTimeUtils.beginDateOfMonth(now,0,1)) + " 00:00:00"; Map<String, Object> drawPrizeMonthParams = new HashMap<>(); drawPrizeMonthParams.put("beginDate", monthDeadlineBeginDate); drawPrizeMonthParams.put("endDate", monthDeadlineDate); Integer drawPrizeMonth = (Integer) method.invoke(wac.getBean(className), drawPrizeMonthParams); if(drawPrizeMonth == null) { drawPrizeMonth = 0; } result.put("drawPrizeMonth", drawPrizeMonth.toString()); //当日截止统计时间-月环比 String monthBeforeDeadlineDate = DateTimeUtils.formatDateHH(DateTimeUtils.addMonths(now,-1)); String monthBeforeDeadlineBeginDate = DateTimeUtils.formatDate(DateTimeUtils.beginDateOfMonth(now,-1,1)) + " 00:00:00"; Map<String, Object> drawPrizeMonthBeforeParams = new HashMap<>(); drawPrizeMonthBeforeParams.put("beginDate", monthBeforeDeadlineBeginDate); drawPrizeMonthBeforeParams.put("endDate", monthBeforeDeadlineDate); Integer drawPrizeMonthBefore = (Integer) method.invoke(wac.getBean(className), drawPrizeMonthBeforeParams); if(drawPrizeMonthBefore == null || drawPrizeMonthBefore.intValue() == 0) { drawPrizeMonthBefore = 1; } String monthBeforePercent = getPercent(drawPrizeMonth.intValue(), drawPrizeMonthBefore.intValue()); result.put("monthCmpPercent", monthBeforePercent); return result; } catch (NoSuchMethodException e) { LOG.error("DrawPrizeDingTalkSchedule.getStatisticsInfo 获取统计指标NoSuchMethodException异常, className:{}, methodName:{},exp:{}",className,methodName,e); return null; } catch (IllegalAccessException e) { LOG.error("DrawPrizeDingTalkSchedule.getStatisticsInfo 获取统计指标IllegalAccessException异常, className:{}, methodName:{},exp:{}",className,methodName,e); return null; } catch (InvocationTargetException e) { LOG.error("DrawPrizeDingTalkSchedule.getStatisticsInfo 获取统计指标InvocationTargetException异常, className:{}, methodName:{},exp:{}",className,methodName,e); return null; } catch (Exception e){ LOG.error("DrawPrizeDingTalkSchedule.getStatisticsInfo 获取统计指标Exception异常, className:{}, methodName:{},exp:{}",className,methodName,e); return null; } } private String getPercent(int x, int y) { DecimalFormat df = new DecimalFormat("0.00%"); return df.format((x * 1.0) / (y * 1.0)); } }