ActivityBtnClickPvUcCalculateTask.java 17 KB
package com.topdraw.business.process.calculate.task;

import com.topdraw.business.module.activitybtn.all.domain.ActTplParamClick;
import com.topdraw.business.module.activitybtn.all.service.ActivityBtnPvUvService;
import com.topdraw.business.module.activitybtn.day.domain.ActTplParamClickDay;
import com.topdraw.business.module.activitybtn.day.service.ActivityBtnPvUvDayService;
import com.topdraw.business.module.activitybtn.hour.domain.ActTplParamClickHour;
import com.topdraw.business.module.activitybtn.hour.service.ActivityBtnPvUvHourService;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import redis.clients.jedis.Jedis;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;

/**
 * @author :
 * @description:
 * @function :
 * @date :Created in 2022/2/26 19:40
 * @version: :
 * @modified By:
 * @since : modified in 2022/2/26 19:40
 */

@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Slf4j
public class ActivityBtnClickPvUcCalculateTask {

    @Autowired
    private Jedis redisUtils;
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private ActivityBtnPvUvService activityBtnPvUvService;
    @Autowired
    private ActivityBtnPvUvDayService activityBtnPvUvDayService;
    @Autowired
    private ActivityBtnPvUvHourService activityBtnPvUvHourService;


    private List<Map<String,Object>> getAllSubjectCode(){
        String sql = "SELECT tadr.`id` AS `id`,tadr.`code` AS `code` FROM `x_subject` tadr " +
                " GROUP BY `code`";
        return this.jdbcTemplate.queryForList(sql);
    }


    public void calculateRedisData2Mysql() {

        List<Map<String, Object>> allMarketingActivityCode = this.getAllSubjectCode();

        if (CollectionUtils.isNotEmpty(allMarketingActivityCode)) {

            for (Map<String, Object> map : allMarketingActivityCode) {

                // 专题code
                Object codeObj = map.get("code");
                Object idObj = map.get("id");
                if (Objects.nonNull(codeObj) && Objects.nonNull(idObj)) {
                    String code = codeObj.toString();
                    String id = idObj.toString();
                    log.info("subject ===>>> code ====>>> [{}]", code);

                    String subjectCode ="";
                    Long subjectId = 0L;
                    Long paramValueId = 0L;
                    String name = "";

                    // 获取此专题活动对应的参数,格式 事件code-按钮id
                    Set<String> codeAndBtnIds = this.redisUtils.smembers("SUBJECT_CODE|"+code);
                    if (Objects.nonNull(codeAndBtnIds) && CollectionUtils.isNotEmpty(codeAndBtnIds)){
                        for (String s1 : codeAndBtnIds) {
                            log.info("codeAndBtnId ==>> {}", s1);
                            String[] split = s1.split("#");

                            if (split.length == 0) {
                                split = s1.split("-");
                            }

                            if (split.length == 0) {
                                continue;
                            }
                            log.info("分割后的结果 ==>> {}", split);
                            try {
                                subjectCode = code;
                                log.info("专题code ==>> {}", subjectCode);
                                subjectId = this.findSubjectByCode(subjectCode);
                                if (Objects.isNull(subjectId)) {
                                    log.error("模板按钮点击次数统计异常,通过活动code无法获取专题, subjectCode ==>> {}", subjectCode);
                                    continue;
                                }
                                paramValueId = Long.valueOf(split[1]);
                                log.info("模板属性id ==>> {}", paramValueId);
                                name = this.findParamValueByValueId(paramValueId);
                                log.info("模板属性名称 ==>> {}", name);
                                if (StringUtils.isBlank(name)) {
                                    log.warn("模板按钮点击次数统计异常,无实例内容名称, paramValueId ==>> {}", paramValueId);
                                    name = "#";
//                                        continue;
                                }
                            } catch (Exception e) {
                                log.error(e.getMessage());
                                continue;
                            }

                            // 小时pv、uv值
                            ActTplParamClickHour activityBtnPvUvHour_ =
                                    this.activityBtnPvUvHourService.
                                            findBySubjectIdAndTemplateParamValueIdAndDayAndHour(
                                                    subjectId, paramValueId, LocalDate.now().toString(),LocalDateTime.now().getHour());

                            if (Objects.isNull(activityBtnPvUvHour_.getId())) {
                                // 新增
                                Integer hourPv = this.getHourPV(subjectCode, paramValueId);
                                Integer hourUv = this.getHourUV(subjectCode, paramValueId);

                                ActTplParamClickHour activityBtnPvUvHour = new ActTplParamClickHour();
                                activityBtnPvUvHour.setSubjectId(subjectId);
                                activityBtnPvUvHour.setSubjectCode(subjectCode);
                                activityBtnPvUvHour.setName(name);
                                activityBtnPvUvHour.setDay(LocalDate.now().toString());
                                activityBtnPvUvHour.setTemplateParamValueId(paramValueId);
                                activityBtnPvUvHour.setHour(LocalDateTime.now().getHour());
                                activityBtnPvUvHour.setPv(hourPv);
                                activityBtnPvUvHour.setUv(hourUv);
                                this.activityBtnPvUvHourService.create(activityBtnPvUvHour);

                            } else {

                                // 修改
                                Integer hourPv = this.getHourPV(subjectCode, paramValueId);
                                Integer hourUv = this.getHourUV(subjectCode, paramValueId);
                                log.info("hourPv ==>> {}", hourPv);
                                log.info("hourUv ==>> {}", hourUv);

                                if (activityBtnPvUvHour_.getPv() >= hourPv) {
                                    hourPv = activityBtnPvUvHour_.getPv();
                                }

                                if (activityBtnPvUvHour_.getUv() >= hourUv) {
                                    hourUv = activityBtnPvUvHour_.getUv();
                                }

                                activityBtnPvUvHour_.setPv(hourPv);
                                activityBtnPvUvHour_.setUv(hourUv);
                                activityBtnPvUvHour_.setUpdateTime(TimestampUtil.now());
                                this.activityBtnPvUvHourService.update(activityBtnPvUvHour_);

                            }

                            // day pv、uv值
                            ActTplParamClickDay pvUvDay1 = this.activityBtnPvUvDayService.
                                    findBySubjectIdAndTemplateParamValueIdAndDay(subjectId, paramValueId, LocalDate.now().toString());
                            if(Objects.isNull(pvUvDay1.getId())){

                                ActTplParamClickDay activityBtnPvUvDay = new ActTplParamClickDay();
                                activityBtnPvUvDay.setSubjectCode(subjectCode);
                                activityBtnPvUvDay.setSubjectId(subjectId);
                                activityBtnPvUvDay.setDay(LocalDate.now().toString());
                                activityBtnPvUvDay.setTemplateParamValueId(paramValueId);
                                activityBtnPvUvDay.setName(name);

                                Integer dayPv = this.getDayPV(subjectCode, paramValueId);
                                Integer dayUv = this.getDayUV(subjectCode, paramValueId);
                                log.info("dayPv ==>> {}", dayPv);
                                log.info("dayUv ==>> {}", dayUv);
                                activityBtnPvUvDay.setPv(dayPv);
                                activityBtnPvUvDay.setUv(dayUv);
                                this.activityBtnPvUvDayService.create(activityBtnPvUvDay);

                            } else {

                                Integer dayPv = this.getDayPV(subjectCode, paramValueId);
                                Integer dayUv = this.getDayUV(subjectCode, paramValueId);
                                log.info("dayPv ==>> {}", dayPv);
                                log.info("dayUv ==>> {}", dayUv);

                                if (pvUvDay1.getPv() >= dayPv) {
                                    dayPv = pvUvDay1.getPv();
                                }

                                if (pvUvDay1.getUv() >= dayUv) {
                                    dayUv = pvUvDay1.getUv();
                                }

                                pvUvDay1.setPv(dayPv);
                                pvUvDay1.setUv(dayUv);
                                pvUvDay1.setUpdateTime(TimestampUtil.now());
                                this.activityBtnPvUvDayService.update(pvUvDay1);
                            }

                            // all
                            ActTplParamClick pvUv1 = this.activityBtnPvUvService.
                                    findBySubjectIdAndTemplateParamValueId(subjectId, paramValueId);
                            if(Objects.isNull(pvUv1.getId())){

                                ActTplParamClick activityBtnPvUv = new ActTplParamClick();
                                activityBtnPvUv.setSubjectId(Long.parseLong(id));
                                activityBtnPvUv.setSubjectCode(subjectCode);
                                activityBtnPvUv.setTemplateParamValueId(paramValueId);
                                activityBtnPvUv.setName(name);

                                Integer allPV = this.getAllPV(subjectCode, paramValueId);
                                Integer allUv = this.getAllUV(subjectCode, paramValueId);
                                log.info("allPV ==>> {}", allPV);
                                log.info("allUv ==>> {}", allUv);
                                activityBtnPvUv.setPv(allPV);
                                activityBtnPvUv.setUv(allUv);

                                this.activityBtnPvUvService.create(activityBtnPvUv);

                            } else {

                                Integer allPV = this.getAllPV(subjectCode, paramValueId);
                                Integer allUv = this.getAllUV(subjectCode, paramValueId);
                                log.info("allPV ==>> {}", allPV);
                                log.info("allUv ==>> {}", allUv);

                                if (pvUv1.getPv() >= allPV) {
                                    allPV = pvUv1.getPv();
                                }

                                if (pvUv1.getUv() >= allUv) {
                                    allUv = pvUv1.getUv();
                                }

                                pvUv1.setPv(allPV);
                                pvUv1.setUv(allUv);
                                pvUv1.setUpdateTime(TimestampUtil.now());
                                this.activityBtnPvUvService.update(pvUv1);
                            }

                        }

                    }

                }
            }

        }

    }


    private Integer getAllUV(String code, Long btnId) {
        String key = "SUBJECT_BTN_UV|"+code+"#"+btnId;
        log.info("getAllUV ==>> key ==>> {}", key);
        Object hourBtnClickUV = this.redisUtils.hget(key, "ALL");
        if (Objects.nonNull(hourBtnClickUV)) {
            return Integer.valueOf(hourBtnClickUV.toString());
        } else {
            hourBtnClickUV = this.redisUtils.hget(key, "ALL");
            if (Objects.nonNull(hourBtnClickUV)) {
                return Integer.valueOf(hourBtnClickUV.toString());
            }
        }

        return 0;
    }

    private Integer getAllPV(String code, Long btnId) {
        String key = "SUBJECT_BTN_PV|"+code+"#"+btnId;
        log.info("getAllPV ==>> key ==>> {}", key);
        Object hourBtnClickPV = this.redisUtils.hget(key, "ALL");
        if (Objects.nonNull(hourBtnClickPV)) {
            return Integer.valueOf(hourBtnClickPV.toString());
        } else {
            hourBtnClickPV = this.redisUtils.hget(key, "ALL");
            if (Objects.nonNull(hourBtnClickPV)) {
                return Integer.valueOf(hourBtnClickPV.toString());
            }
        }

        return 0;
    }

    private Integer getDayUV(String code, Long btnId) {
        String key = "SUBJECT_BTN_UV|"+code+"#"+btnId+ "|" + LocalDate.now();
        log.info("getDayUV ==>> key ==>> {}", key);
        Object hourBtnClickUV = this.redisUtils.hget(key, "ALL");
        if (Objects.nonNull(hourBtnClickUV)) {
            return Integer.valueOf(hourBtnClickUV.toString());
        } else {
            hourBtnClickUV = this.redisUtils.hget(key, "ALL");
            if (Objects.nonNull(hourBtnClickUV)) {
                return Integer.valueOf(hourBtnClickUV.toString());
            }
        }

        return 0;
    }

    private Integer getDayPV(String code, Long btnId) {
        String key = "SUBJECT_BTN_PV|"+code+"#"+btnId+ "|" + LocalDate.now();
        log.info("getDayUV ==>> key ==>> {}", key);
        Object hourBtnClickPV = this.redisUtils.hget(key, "ALL");
        if (Objects.nonNull(hourBtnClickPV)) {
            return Integer.valueOf(hourBtnClickPV.toString());
        } else {
            hourBtnClickPV = this.redisUtils.hget(key, "ALL");
            if (Objects.nonNull(hourBtnClickPV)) {
                return Integer.valueOf(hourBtnClickPV.toString());
            }
        }

        return 0;
    }

    private Integer getHourUV(String code, Long btnId) {
        int hour = LocalDateTime.now().getHour();
        String hourStr = "";
        if (hour < 10) {
            hourStr = "0"+hour;
        } else {
            hourStr = String.valueOf(hour);
        }

        String key = "SUBJECT_BTN_UV|"+code+"#"+btnId+ "|" + LocalDate.now()+"|"+hourStr;
        log.info("getHourUV ==>> key ==>> {}", key);
        Object hourBtnClickUV = this.redisUtils.hget(key, "ALL");
        if (Objects.nonNull(hourBtnClickUV)) {
            return Integer.valueOf(hourBtnClickUV.toString());
        } else {
            hourBtnClickUV = this.redisUtils.hget(key, "ALL");
            if (Objects.nonNull(hourBtnClickUV)) {
                return Integer.valueOf(hourBtnClickUV.toString());
            }
        }

        return 0;
    }

    private Integer getHourPV(String code, Long btnId) {
        int hour = LocalDateTime.now().getHour();
        String hourStr = "";
        if (hour < 10) {
            hourStr = "0"+hour;
        } else {
            hourStr = String.valueOf(hour);
        }
        String key = "SUBJECT_BTN_PV|"+code+"#"+btnId+ "|" + LocalDate.now()+"|"+hourStr;
        log.info("getHourPV ==>> key ==>> {}", key);
        Object hourBtnClickPV = this.redisUtils.hget(key, "ALL");
        if (Objects.nonNull(hourBtnClickPV)) {
            return Integer.valueOf(hourBtnClickPV.toString());
        } else {
            hourBtnClickPV = this.redisUtils.hget(key, "ALL");
            if (Objects.nonNull(hourBtnClickPV)) {
                return Integer.valueOf(hourBtnClickPV.toString());
            }
        }

        return 0;
    }

    private String findParamValueByValueId(Long paramValueId) {
        String sql = "SELECT tt.`name` FROM `tp_template_param_value` AS tt " +
                " WHERE tt.id = '"+paramValueId+"'";
        List<Map<String, Object>> objectMap = this.jdbcTemplate.queryForList(sql);
        if (CollectionUtils.isNotEmpty(objectMap)) {
            return objectMap.get(0).get("name").toString();
        }
        return null;
    }

    private Long findSubjectByCode(String subjectCode) {
        String sql = "SELECT am.`id` FROM `x_subject` AS am WHERE `code` = '"+subjectCode+"'";
        List<Map<String, Object>> objectMap = this.jdbcTemplate.queryForList(sql);
        if (CollectionUtils.isNotEmpty(objectMap)) {
            Map<String, Object> map = objectMap.get(0);
            return Long.valueOf(map.get("id").toString());
        }
        return null;
    }

}