PvUvCalculateTask.java 11.1 KB
package com.topdraw.business.process.calculate.task;

import com.topdraw.business.module.uv.all.domain.PvUv;
import com.topdraw.business.module.uv.all.service.PvUvService;
import com.topdraw.business.module.uv.day.domain.PvUvDay;
import com.topdraw.business.module.uv.day.service.PvUvDayService;
import com.topdraw.business.module.uv.hour.domain.PvUvHour;
import com.topdraw.business.module.uv.hour.service.PvUvHourService;
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.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

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 PvUvCalculateTask {

    @Autowired
    private RedisUtils redisUtils;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private PvUvService pvUvService;
    @Autowired
    private PvUvDayService pvUvDayService;
    @Autowired
    private PvUvHourService pvUvHourService;

    public boolean calculateRedisData2Mysql(){
        List<Map<String, Object>> allSubjectCode = this.getAllSubjectCode();

        if (CollectionUtils.isNotEmpty(allSubjectCode)) {

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

                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);

                    // 小时pv、uv值
                    PvUvHour pvUvHour1 =
                            this.pvUvHourService.
                                    findByMarketingActivityIdAndDayAndHour(Long.parseLong(id), LocalDate.now().toString(), LocalDateTime.now().getHour());

                    if (Objects.isNull(pvUvHour1.getId())) {

                        Integer hourPv = this.getHourPV(code);
                        Integer hourUv = this.getHourUV(code);
                        log.info("hourPv ==>> {}", hourPv);
                        log.info("hourUv ==>> {}", hourUv);

                        PvUvHour pvUvHour = new PvUvHour();
                        pvUvHour.setSubjectId(Long.parseLong(id));
                        pvUvHour.setSubjectCode(code);
                        pvUvHour.setDay(LocalDate.now().toString());
                        pvUvHour.setHour(LocalDateTime.now().getHour());
                        pvUvHour.setPv(hourPv);
                        pvUvHour.setUv(hourUv);
                        log.info("PvUvHour不存在,创建PvUvHour: {}", pvUvHour);
                        this.pvUvHourService.create(pvUvHour);

                    }
                    else {

                        Integer hourPv = this.getHourPV(code);
                        Integer hourUv = this.getHourUV(code);

                        log.info("访问每小时次数更新 redisPV: {}, dbPV: {}, redisUV: {}, dbUV: {}", hourPv, pvUvHour1.getPv(), hourUv, pvUvHour1.getUv());

                        if (pvUvHour1.getPv() != hourPv || pvUvHour1.getUv() != hourUv) {

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

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

                            pvUvHour1.setPv(hourPv);
                            pvUvHour1.setUv(hourUv);
                            pvUvHour1.setUpdateTime(TimestampUtil.now());
                            this.pvUvHourService.updateByMarketingActivityCodeAndDayAndHour(pvUvHour1);
                        }

                    }

                    // day pv、uv值
                    PvUvDay pvUvDay1 = this.pvUvDayService.findByMarketingActivityIdAndDay(Long.parseLong(id), LocalDate.now().toString());

                    if(Objects.isNull(pvUvDay1.getId())){
                        PvUvDay pvUvDay = new PvUvDay();
                        pvUvDay.setSubjectId(Long.parseLong(id));
                        pvUvDay.setSubjectCode(code);
                        pvUvDay.setDay(LocalDate.now().toString());

                        Integer dayPv = this.getDayPV(code);
                        Integer dayUv = this.getDayUV(code);
                        log.info("dayPv ==>> {}", dayPv);
                        log.info("dayUv ==>> {}", dayUv);
                        pvUvDay.setPv(dayPv);
                        pvUvDay.setUv(dayUv);
                        log.info("PvUvDay不存在,创建PvUvDay: {}", pvUvDay);
                        this.pvUvDayService.create(pvUvDay);
                    }
                    else {

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

                        log.info("访问每日次数更新 redisPV: {}, dbPV: {}, redisUV: {}, dbUV: {}", dayPv, pvUvDay1.getPv(), dayUv, pvUvDay1.getUv());

                        if (pvUvDay1.getPv() != dayPv || pvUvDay1.getUv() != 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.pvUvDayService.update(pvUvDay1);
                        }

                    }

                    // all
                    PvUv pvUv1 = this.pvUvService.findByMarketingActivityId(Long.parseLong(id));
                    if(Objects.isNull(pvUv1.getId())){
                        PvUv pvUv = new PvUv();
                        pvUv.setSubjectId(Long.parseLong(id));
                        pvUv.setSubjectCode(code);

                        Integer allPV = this.getAllPV(code);
                        Integer allUv = this.getAllUV(code);
                        log.info("allPV ==>> {}", allPV);
                        log.info("allUv ==>> {}", allUv);
                        pvUv.setPv(allPV);
                        pvUv.setUv(allUv);
                        log.info("PvUv不存在,创建PvUvALL: {}", pvUv);
                        this.pvUvService.create(pvUv);

                    }
                    else {

                        Integer allPV = this.getAllPV(code);
                        Integer allUv = this.getAllUV(code);

                        log.info("访问总次数更新 redisPV: {}, dbPV: {}, redisUV: {}, dbUV: {}", allPV, pvUv1.getPv(), allUv, pvUv1.getUv());

                        if (pvUv1.getPv() != allPV || pvUv1.getUv() != 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.pvUvService.update(pvUv1);
                        }

                    }
                }

            }

        }
        return true;
    }



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

        return 0;
    }

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

        return 0;
    }

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

        return 0;
    }


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

        return 0;
    }


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

        return 0;
    }


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

        return 0;
    }

    private List<Map<String,Object>> getAllSubjectCode(){

        String sql = "SELECT adr.`id` AS `id`, adr.`code` AS `code` FROM " +
                " `cms_subject` adr " +
                " GROUP BY `code`";
        return this.jdbcTemplate.queryForList(sql);

    }

}