钉钉机器人推送数据

钉钉开放平台地址:https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.karFPe&treeId=257&articleId=105735&docType=1

需求:统计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需要命中索引(SQL索引调优见https://blog.csdn.net/Wengzhengcun/article/details/85319453),另外,跨天时需要特殊处理(如2019-01-01 00:00:00需要转为2018-12-31 23:59:59),完整代码如下:

@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%");
    if(y != 0){
        return df.format((x * 1.0 - y * 1.0) / (y * 1.0));
    }
    return df.format((x * 1.0) /1.0);
}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值