TBoardStatisticServiceImpl.java 7.87 KB
Newer Older
yangtianyou's avatar
yangtianyou committed
1 2 3 4 5 6 7 8
package cn.wisenergy.chnmuseum.party.service.impl;

import cn.wisenergy.chnmuseum.party.common.util.CurrencyMathUtil;
import cn.wisenergy.chnmuseum.party.common.util.DateUtil;
import cn.wisenergy.chnmuseum.party.common.util.RedisUtil;
import cn.wisenergy.chnmuseum.party.core.annotations.RedisLock;
import cn.wisenergy.chnmuseum.party.model.*;
import cn.wisenergy.chnmuseum.party.mapper.TBoardStatisticMapper;
yangtianyou's avatar
yangtianyou committed
9
import cn.wisenergy.chnmuseum.party.service.TAreaService;
yangtianyou's avatar
yangtianyou committed
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
import cn.wisenergy.chnmuseum.party.service.TBoardStatisticService;
import cn.wisenergy.chnmuseum.party.service.TUserService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <pre>
 * 展板统计信息表 服务实现类
 * </pre>
 *
 * @author Danny Lee
 * @since 2021-03-25
 */
@Slf4j
@Service
public class TBoardStatisticServiceImpl extends ServiceImpl<TBoardStatisticMapper, TBoardStatistic> implements TBoardStatisticService {

    @Autowired
    private TBoardStatisticMapper boardStatisticMapper;

    @Autowired
    private TUserService userService;

yangtianyou's avatar
yangtianyou committed
47 48 49
    @Autowired
    private TAreaService areaService;

yangtianyou's avatar
yangtianyou committed
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private RedisTemplate<String,? extends Object> redisTemplate;
    private static String STATISTIC_BOARD_INFO_KEY = "STATISTIC_BOARD_INFO_KEY"; // 展板统计信息key
    @Override
    @RedisLock(value = "boardLock",timeLock = 20 ,required = true,timeOut = 1100000)
    public Object boardStatisticInfo(TBoardStatistic tBoardStatistic, boolean autoUpdate) {
        // 根据用户id获取用户信息
        TUser user = userService.selectById(tBoardStatistic.getUserId());

        tBoardStatistic.setOrganId(user.getOrgId());    // 用户所属机构
        tBoardStatistic.setAreaId(Integer.parseInt(user.getAreaId()));// 用户所属地区
        if (StringUtils.isEmpty(tBoardStatistic.getPlayDate())){
            // 获取当前日期
            tBoardStatistic.setPlayDate(DateUtil.getCurrentDate("yyyyMMdd"));
        }
        List<TBoardStatistic> statisticList = new ArrayList<>();
        String redisKey = STATISTIC_BOARD_INFO_KEY;
        // 获取统计信息缓存数据
        String businessJsonArray = (String) redisUtil.get(redisKey);
        // 缓存数据不为空,转换数据
        if (StringUtils.isNotEmpty(businessJsonArray)){
            statisticList = JSONObject.parseArray(businessJsonArray, TBoardStatistic.class);
        }
        statisticList.add(tBoardStatistic);
        redisUtil.set(redisKey, JSON.toJSON(statisticList).toString());
        // 统计记录数等于100 时,或者需要自动更新时 汇总统计数据
        if (statisticList.size() >= 100 || autoUpdate){
            // 更新展板统计信息
            updateBoardStatisticInfo(statisticList,redisKey);
        }
        return true;
    }


    @Override
    public Page<TBoardPlayRank> getBoardRankPageList(Page<TBoardPlayRank> page,TBoardPlayRank rank) {
        page.setRecords(boardStatisticMapper.getBoardRankPageList(page,rank));
        return page;
    }

    @Override
yangtianyou's avatar
yangtianyou committed
93 94 95
    public Page<TBoardPlayTrend> getBoardTrendPageList(Page<TBoardPlayTrend> page, TBoardPlayTrend trend) {

        page.setRecords(boardStatisticMapper.getBoardTrendPageList(page,trend));
yangtianyou's avatar
yangtianyou committed
96 97 98 99 100 101
        return page;
    }


    @Override
    public Page<TDistrictBoardStatistic> getBoardDistrictPageList(Page<TDistrictBoardStatistic> page, TDistrictBoardStatistic district){
wzp's avatar
wzp committed
102
        List<TDistrictBoardStatistic> list = boardStatisticMapper.getBoardDistrictPageList(page, district);
wzp's avatar
wzp committed
103
       page.setRecords(list);
yangtianyou's avatar
yangtianyou committed
104 105 106
        return page;
    }

yangtianyou's avatar
yangtianyou committed
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
    @Override
    public TBoardSurvey getBoardSurvey(TBoardSurvey survey){
        // 获取展板播放量
        survey.setPlayCnt(boardStatisticMapper.getBoardPlayTotal(survey));
        // 获取展板总数
        survey.setBoardCnt(boardStatisticMapper.getBoardTotal(survey));
        // 获取播放展板的机构总数
        survey.setOrgCnt(boardStatisticMapper.getOrganTotal(survey));
        // 获取互动总数
        survey.setInteractionCnt(boardStatisticMapper.getInteractionTotal(survey));
        return survey;
    }

    @Override
    public Page getInteractionFrequency(Page page,String frequencyDate){
        page.setRecords(boardStatisticMapper.getInteractionFrequency(page,frequencyDate));
        return page;
    }

    @Override
    public List getBoardProvincePlayTotalList(String organId){
        // 获取省份信息
        QueryWrapper qw = new QueryWrapper();
        qw.eq("type","P");
        List<TArea> provlist = areaService.list(qw);
wzp's avatar
wzp committed
132 133
        provlist.stream().forEach(l->l.setName(l.getName().replace("省","").replace("市","").
                replace("自治区","").replace("特别行政区","").replace("壮族","").replace("回族","").replace("维吾尔","")));
yangtianyou's avatar
yangtianyou committed
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
        // 遍历省份,统计各省播放量
        TBoardSurvey survey = new TBoardSurvey();
        String dateStr = DateUtil.getCurrentDate("yyyyMM");
        survey.setStatisticDate(dateStr);
        survey.setOrganId(organId);
        List list = new ArrayList();
        // 根据省份查询播放量
        for(TArea prov : provlist){
            Map map = new HashMap();
            survey.setAreaId(prov.getId().toString().substring(0,2));
            Integer cnt = boardStatisticMapper.getBoardPlayTotal(survey);
            map.put("name",prov.getName());
            map.put("value",cnt == null ? 0 : cnt);
            list.add(map);
        }
        return list;
    }
yangtianyou's avatar
yangtianyou committed
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203

    /**
     * 更新展板统计信息
     */
    @Override
    public void updateBoardStatisticInfo(List<TBoardStatistic> statisticList,String redisKey) {
        Map<String,TBoardStatistic> map = new HashMap<>();
        statisticList.stream().forEach(s->{
            String key = s.getBoardId()+"_"+s.getOrganId()+"_"+s.getPlayDate();
            // 如果有对应的展板记录,累计播放量
            if (map.containsKey(key)){
                TBoardStatistic boardStatistic = map.get(key);
                boardStatistic.setPlayNumber(Integer.parseInt(CurrencyMathUtil.add(boardStatistic.getPlayNumber(),s.getPlayNumber())));
                map.put(key,boardStatistic);
            }else {
                // 如果无对应的展板记录,插入到map中
                map.put(key,s);
            }
        });
        // 更新数据库展板统计信息
        for (String key : map.keySet()){
            TBoardStatistic bs = map.get(key);
            // 查询数据库是否有对应的记录
            QueryWrapper<TBoardStatistic> qw = new QueryWrapper<>();
            qw.eq("board_id",bs.getBoardId());
            qw.eq("organ_id",bs.getOrganId());
            qw.eq("play_date",bs.getPlayDate());
            TBoardStatistic tbDB = this.getOne(qw);
            // 如果数据库存在统计记录,则累计统计数量
            if (tbDB != null){
                tbDB.setPlayNumber(Integer.parseInt(CurrencyMathUtil.add(bs.getPlayNumber(),tbDB.getPlayNumber())));
                this.updateById(tbDB);
                map.put(key,tbDB);
            }else {
                // 如果数据库不存在统计记录,则增加统计数据
                this.save(bs);
            }
        }
        // 更新展板播放排行 t_board_play_rank

        // 插入

        // 看板播放趋势

        // 地区看板播放统计

        // 播放数据概览

        // 清空redis
        redisUtil.del(redisKey);
    }

}