UcEventBusIptv2ManagementUcEngine.java 11.6 KB
package com.topdraw.mq.consumer;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.iptv.service.UserTvService;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import com.topdraw.config.RabbitMqConfig;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.EntityNotFoundException;
import com.topdraw.mq.domain.DataSyncMsg;
import com.topdraw.resttemplate.RestTemplateClient;
import com.topdraw.util.DateUtil;
import com.topdraw.util.JSONUtil;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.RedisUtils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;

@Component
@Slf4j
public class UcEventBusIptv2ManagementUcEngine {

    @Autowired
    private RestTemplateClient restTemplateClient;
    @Autowired
    private UserTvService userTvService;
    @Autowired
    private MemberService memberService;

    @Autowired
    private RedisUtils redisUtils;


    private static final Integer PLAY_30 = 30;

    /**
     * 事件
     * @param content
     * @description 基础数据同步
     * @author Hongyan Wang
     * @date 2021/9/7 11:26 上午
     */
    @RabbitHandler
    @RabbitListener(queues = RabbitMqConfig.UC_EVENTBUS_QUEUE,
            containerFactory = "serviceRabbitListenerContainerFactory")
    public void ucEventConsumer(String content) throws ParseException {
        log.info(" receive dataSync msg , content is : {} ", content);
        DataSyncMsg dataSyncMsg = this.parseContent(content);
        if (Objects.nonNull(dataSyncMsg)) {
            this.taskDeal(dataSyncMsg);
        }
        log.info("ucEventConsumer ====>>>> end");
    }


    /**
     * 数据解析
     * @param content
     * @return
     */
    private DataSyncMsg parseContent(String content) throws ParseException {

        CommonMsg commonMsg = JSONUtil.parseMsg2Object(content, CommonMsg.class);

        String evt = commonMsg.getEvt();
        switch (evt.toUpperCase()) {

            case "PLAY":
                PlayContent playContent = JSONUtil.parseMsg2Object(content, PlayContent.class);

                PlayContent.MsgData msgData = playContent.getMsgData();
                if (Objects.nonNull(msgData)) {
                    String time = playContent.getTime();
                    String formatDate = DateUtil.formatDate(time);
                    Integer deviceType = playContent.getDeviceType();
                    String platformAccount = msgData.getPlatformAccount();

                    String mediaCode = msgData.getMediaCode();
                    Long mediaId = msgData.getMediaId();
                    String mediaName = msgData.getMediaName();
                    Integer playDuration = msgData.getPlayDuration();
                    log.info("playDuration ==>> {}", playDuration);

                    DataSyncMsg dataSyncMsg = new DataSyncMsg();
                    dataSyncMsg.setEventType(evt);
                    DataSyncMsg.MsgData msgData1 = new DataSyncMsg.MsgData();


                    Integer playDurationValueTotal = 0;

                    if (StringUtils.isNotBlank(platformAccount)) {

                        UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);

                        if(Objects.nonNull(userTvDTO)) {

                            String key = platformAccount+"|"+formatDate;
                            Map<Object, Object> hmget =
                                    this.redisUtils.hmget(key);

                            int maxSize = 1;
                            if (MapUtils.isNotEmpty(hmget)) {

                                Set<Object> objects = hmget.keySet();

                                Integer playDurationValueTotal_ = 0;
                                for (Object key_ : objects) {

                                    if (key_.toString().equalsIgnoreCase("total")) {
                                        playDurationValueTotal_ = Integer.valueOf(hmget.get(key_).toString());
                                        if (playDurationValueTotal_ > 1440) {
                                            maxSize = objects.size();
                                            Integer maxTotal = maxSize+1;
                                            Integer playDurationValue = Integer.valueOf(hmget.get(key_).toString());
                                            playDurationValueTotal = playDurationValue+playDuration;
                                            Map<String, Object> map = new HashMap<>();
                                            map.put(String.valueOf(maxTotal), playDuration);
                                            map.put("total", playDurationValueTotal);
                                            this.redisUtils.hmset(key, map, 172800);
                                            return null;
                                        }
                                    }

                                }

                                maxSize = objects.size();

                                playDurationValueTotal = playDurationValueTotal_ + playDuration;

                                Map<String, Object> map = new HashMap<>();
                                map.put(String.valueOf(maxSize+1), playDuration);
                                map.put("total", playDurationValueTotal);
                                this.redisUtils.hmset(key, map, 172800);


                            } else {

                                playDurationValueTotal = playDuration;
                                Map<String, Object> map = new HashMap<>();
                                map.put("total", playDurationValueTotal);
                                map.put("1", playDuration);
                                this.redisUtils.hmset(key, map, 172800);

                            }

                            DataSyncMsg dataSyncMsg1 = null;
                            if (playDurationValueTotal > 0 && playDurationValueTotal <= PLAY_30) {
                                log.info("playDurationValueTotal ===>>> {}",playDurationValueTotal);
                                log.info("===>> start dealTask");
                                dataSyncMsg1 = getDataSyncMsg(time, deviceType, mediaCode, mediaId, mediaName, playDurationValueTotal,
                                        dataSyncMsg, msgData1, userTvDTO);
                            }

                            if (playDurationValueTotal >= 31 && playDurationValueTotal <= 60) {
                                log.info("playDurationValueTotal ===>>> {}",playDurationValueTotal);
                                log.info("===>> start dealTask");

                                dataSyncMsg1 = getDataSyncMsg(time, deviceType, mediaCode, mediaId, mediaName, 30,
                                        dataSyncMsg, msgData1, userTvDTO);
                                this.taskDeal(dataSyncMsg1);

                                dataSyncMsg1 = getDataSyncMsg(time, deviceType, mediaCode, mediaId, mediaName, playDurationValueTotal,
                                        dataSyncMsg, msgData1, userTvDTO);

                            }
                            if (playDurationValueTotal >= 61 && playDurationValueTotal <= 1440) {
                                log.info("playDurationValueTotal ===>>> {}",playDurationValueTotal);
                                log.info("===>> start dealTask");

                                dataSyncMsg1 = getDataSyncMsg(time, deviceType, mediaCode, mediaId, mediaName, 30,
                                        dataSyncMsg, msgData1, userTvDTO);
                                this.taskDeal(dataSyncMsg1);

                                dataSyncMsg1 = getDataSyncMsg(time, deviceType, mediaCode, mediaId, mediaName, 60,
                                        dataSyncMsg, msgData1, userTvDTO);
                                this.taskDeal(dataSyncMsg1);

                                dataSyncMsg1 = getDataSyncMsg(time, deviceType, mediaCode, mediaId, mediaName, playDurationValueTotal,
                                        dataSyncMsg, msgData1, userTvDTO);
                            }

                            log.info("playDurationValueTotal ===>>> {}",playDurationValueTotal);
                            log.info("===>> start dealTask");
                            /*dataSyncMsg1 = getDataSyncMsg(time, deviceType, mediaCode, mediaId, mediaName, playDurationValueTotal,
                                    dataSyncMsg, msgData1, userTvDTO);*/
                            return dataSyncMsg1;

                        }

                    }

                }

                System.out.println(playContent);
                break;

        }

        return null;
    }

    private DataSyncMsg getDataSyncMsg(String time, Integer deviceType, String mediaCode, Long mediaId, String mediaName,
                                       Integer playDuration, DataSyncMsg dataSyncMsg, DataSyncMsg.MsgData msgData1, UserTvDTO userTvDTO) {
        String priorityMemberCode = userTvDTO.getPriorityMemberCode();
        log.info("priorityMemberCode ==>> {}", priorityMemberCode);
        String memberCode = "";
        if (StringUtils.isNotBlank(priorityMemberCode)) {
            memberCode = priorityMemberCode;
        } else {
            memberCode = this.memberService.findById(userTvDTO.getMemberId()).getCode();
        }

        log.info("memberCode ==>> {}", priorityMemberCode);
        if (StringUtils.isBlank(memberCode))
            throw new EntityNotFoundException(MemberDTO.class, "memberCode", "memberCode is null");

        msgData1.setMemberCode(memberCode);

        msgData1.setEvent(8);
        msgData1.setDeviceType(deviceType);
        msgData1.setMediaId(mediaId);

        JSONObject param = new JSONObject();
        // 增量
        param.put("playDuration", playDuration);
        msgData1.setParam(JSON.toJSONString(param));
        JSONObject description = new JSONObject();
        description.put("mediaId", mediaId);
        description.put("mediaName", mediaName);
        description.put("playDuration", playDuration);
        description.put("mediaCode", mediaCode);
        description.put("time", time);
        msgData1.setDescription(JSON.toJSONString(description));
        dataSyncMsg.setMsg(msgData1);
        log.info("dataSyncMsg ==>> {}", dataSyncMsg);
        return dataSyncMsg;
    }

    /**
     * 任务处理
     * @param dataSyncMsg
     */
    private void taskDeal(DataSyncMsg dataSyncMsg) {
        this.restTemplateClient.dealTask(dataSyncMsg);
    }

    @Data
    static class PlayContent {
        private String evt;
        private Integer deviceType;
        private String time;
        private MsgData msgData;

        @Data
        static class MsgData {
            private String platformAccount;
            private Integer playDuration;
            private Long mediaId;
            private String mediaCode;
            private String mediaName;
        }
    }

    @Data
    static class CommonMsg {
        private String evt;
        private Integer deviceType;
        private String time;
    }
}