ContentCalculateTask.java 12.1 KB
package com.topdraw.business.process.calculate.task;

import com.topdraw.business.module.content.all.domain.ContentPVUV;
import com.topdraw.business.module.content.all.service.ContentPVUVService;
import com.topdraw.business.module.content.day.domain.ContentPVUVDay;
import com.topdraw.business.module.content.day.service.ContentPVUVDayService;
import com.topdraw.business.module.content.hour.domain.ContentPVUVHour;
import com.topdraw.business.module.content.hour.service.ContentPVUVHourService;
import com.topdraw.business.module.template.service.TemplateParamValueService;
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 com.topdraw.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
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.*;
import java.util.stream.Collectors;

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

    @Autowired
    private RedisUtils redisUtils;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private ContentPVUVService contentPVUVService;
    @Autowired
    private ContentPVUVDayService contentPVUVDayService;
    @Autowired
    private ContentPVUVHourService contentPVUVHourService;
    @Autowired
    private TemplateParamValueService templateParamValueService;

    public boolean calculateRedisData2Mysql(){
        //先查询所有内容信息(从redis中获取)
        //循环所有内容,
        Map<Object, Object> allContents = this.getAllContents();
        Set<Object> contentCodes = allContents.keySet();
        List<Long> btnIds = contentCodes.stream().map(item -> {return Long.parseLong(item.toString().split("#")[0]);}).collect(Collectors.toList());
        Map<Long, String> btnNames = templateParamValueService.btnNames(btnIds);
        //查询btn name集合
        if (CollectionUtils.isNotEmpty(contentCodes)) {
            for (Object item : contentCodes) {
                String key = String.valueOf(item);
                String[] split = key.split("#");
                if (split.length < 2) {
                    continue;
                }
                Long btnId = Long.parseLong(split[0]);
                String contentCode = split[1];
                String name = allContents.get(item).toString();
                name = StringUtils.isNotEmpty(name) ? name : btnNames.get(btnId);

                String day = LocalDate.now().toString();
                Integer hour = LocalDateTime.now().getHour();

                // 小时pv、uv值
                ContentPVUVHour pvUvHour1 =
                        this.contentPVUVHourService.
                                findByBtnIdAndCodeAndDayAndHour(btnId, contentCode, day, hour);
                if (Objects.isNull(pvUvHour1.getId())) {

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

                    ContentPVUVHour pvUvHour = new ContentPVUVHour();
                    pvUvHour.setDay(LocalDate.now().toString());
                    pvUvHour.setHour(LocalDateTime.now().getHour());
                    pvUvHour.setPv(hourPv);
                    pvUvHour.setUv(hourUv);
                    pvUvHour.setHour(hour);
                    pvUvHour.setDay(day);
                    pvUvHour.setTemplateParamValueId(btnId);
                    pvUvHour.setBtnName(btnNames.get(btnId));
                    pvUvHour.setCode(contentCode);
                    pvUvHour.setName(name);
                    log.info("PvUvHour不存在,创建PvUvHour: {}", pvUvHour);
                    this.contentPVUVHourService.create(pvUvHour);

                }
                else {

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

                    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.contentPVUVHourService.update(pvUvHour1);
                    }

                }

                // day pv、uv值
                ContentPVUVDay pvUvDay1 = this.contentPVUVDayService.findByBtnIdAndCodeAndDay(btnId, contentCode, day);
                if(Objects.isNull(pvUvDay1.getId())){
                    ContentPVUVDay pvUvDay = new ContentPVUVDay();
                    pvUvDay.setTemplateParamValueId(btnId);
                    pvUvDay.setBtnName(btnNames.get(btnId));
                    pvUvDay.setCode(contentCode);
                    pvUvDay.setName(name);
                    pvUvDay.setDay(day);

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

                    Integer dayPv = this.getDayPV(key);
                    Integer dayUv = this.getDayUV(key);
                    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.contentPVUVDayService.update(pvUvDay1);
                    }

                }

                // all
                ContentPVUV pvUv1 = this.contentPVUVService.findByBtnIdAndCode(btnId, contentCode);
                if(Objects.isNull(pvUv1.getId())){
                    ContentPVUV pvUv = new ContentPVUV();

                    Integer allPV = this.getAllPV(key);
                    Integer allUv = this.getAllUV(key);
                    log.info("allPV ==>> {}", allPV);
                    log.info("allUv ==>> {}", allUv);
                    pvUv.setPv(allPV);
                    pvUv.setUv(allUv);
                    pvUv.setTemplateParamValueId(btnId);
                    pvUv.setBtnName(btnNames.get(btnId));
                    pvUv.setCode(contentCode);
                    pvUv.setName(name);
                    log.info("PvUv不存在,创建PvUvALL: {}", pvUv);
                    this.contentPVUVService.create(pvUv);

                }
                else {

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

                    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.contentPVUVService.update(pvUv1);
                    }

                }

            }

        }
        return true;
    }

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

        return 0;
    }

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

        return 0;
    }

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

        return 0;
    }

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

        return 0;
    }

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

        return 0;
    }

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

        return 0;
    }

    private Map<Object,Object> getAllContents(){
        log.info("getAllContents ==>> key ==>> {}", "CONTENT_BTN_CODE");
        Map<Object, Object> allContents = this.redisUtils.hmget("CONTENT_BTN_CODE");
        return allContents;
    }

}