TBoardStatisticServiceImpl.java 11.4 KB
Newer Older
liqin's avatar
liqin committed
1
package cn.chnmuseum.party.service.impl;
yangtianyou's avatar
yangtianyou committed
2

liqin's avatar
liqin committed
3 4 5 6 7 8 9 10 11
import cn.chnmuseum.party.common.util.CurrencyMathUtil;
import cn.chnmuseum.party.common.util.DateUtil;
import cn.chnmuseum.party.common.util.RedisUtil;
import cn.chnmuseum.party.core.annotations.RedisLock;
import cn.chnmuseum.party.model.*;
import cn.chnmuseum.party.mapper.TBoardStatisticMapper;
import cn.chnmuseum.party.service.TAreaService;
import cn.chnmuseum.party.service.TBoardStatisticService;
import cn.chnmuseum.party.service.TUserService;
yangtianyou's avatar
yangtianyou committed
12 13 14 15 16 17 18 19 20 21 22 23
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;

wzp's avatar
wzp committed
24
import javax.annotation.Resource;
wzp's avatar
wzp committed
25 26 27
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
yangtianyou's avatar
yangtianyou committed
28 29 30 31 32 33 34 35 36 37 38 39 40

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

wzp's avatar
wzp committed
41
    @Resource
yangtianyou's avatar
yangtianyou committed
42 43 44 45 46
    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
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
wzp's avatar
wzp committed
53
    private RedisTemplate<String, ? extends Object> redisTemplate;
yangtianyou's avatar
yangtianyou committed
54
    private static String STATISTIC_BOARD_INFO_KEY = "STATISTIC_BOARD_INFO_KEY"; // 展板统计信息key
wzp's avatar
wzp committed
55

yangtianyou's avatar
yangtianyou committed
56
    @Override
wzp's avatar
wzp committed
57
    @RedisLock(value = "boardLock", timeLock = 20, required = true, timeOut = 1100000)
yangtianyou's avatar
yangtianyou committed
58
    public Object boardStatisticInfo(TBoardStatistic tBoardStatistic, boolean autoUpdate) {
wzp's avatar
wzp committed
59
        if (tBoardStatistic != null) {
wzp's avatar
wzp committed
60 61 62 63 64 65 66 67
            // 根据用户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"));
            }
wzp's avatar
wzp committed
68
            if (null == tBoardStatistic.getPlayNumber()) {
wzp's avatar
wzp committed
69 70 71 72
                // 获取当前日期
                tBoardStatistic.setPlayNumber(1);
            }

yangtianyou's avatar
yangtianyou committed
73
        }
wzp's avatar
wzp committed
74

yangtianyou's avatar
yangtianyou committed
75 76 77 78 79
        List<TBoardStatistic> statisticList = new ArrayList<>();
        String redisKey = STATISTIC_BOARD_INFO_KEY;
        // 获取统计信息缓存数据
        String businessJsonArray = (String) redisUtil.get(redisKey);
        // 缓存数据不为空,转换数据
wzp's avatar
wzp committed
80
        if (StringUtils.isNotEmpty(businessJsonArray)) {
yangtianyou's avatar
yangtianyou committed
81 82
            statisticList = JSONObject.parseArray(businessJsonArray, TBoardStatistic.class);
        }
wzp's avatar
wzp committed
83
        if (tBoardStatistic != null) {
wzp's avatar
wzp committed
84 85
            statisticList.add(tBoardStatistic);
        }
yangtianyou's avatar
yangtianyou committed
86 87
        redisUtil.set(redisKey, JSON.toJSON(statisticList).toString());
        // 统计记录数等于100 时,或者需要自动更新时 汇总统计数据
wzp's avatar
wzp committed
88
        if (statisticList.size() >= 100 || (autoUpdate && statisticList.size() > 0)) {
yangtianyou's avatar
yangtianyou committed
89
            // 更新展板统计信息
wzp's avatar
wzp committed
90
            updateBoardStatisticInfo(statisticList, redisKey);
yangtianyou's avatar
yangtianyou committed
91 92 93 94 95 96
        }
        return true;
    }


    @Override
wzp's avatar
wzp committed
97 98
    public Page<TBoardPlayRank> getBoardRankPageList(Page<TBoardPlayRank> page, TBoardPlayRank rank) {
        page.setRecords(boardStatisticMapper.getBoardRankPageList(page, rank));
yangtianyou's avatar
yangtianyou committed
99 100 101 102
        return page;
    }

    @Override
103
    public Page<TBoardPlayTrend> getBoardTrendPageList(Page<TBoardPlayTrend> page, TBoardPlayTrend trend) {
yangtianyou's avatar
yangtianyou committed
104

105 106
        page.setRecords(boardStatisticMapper.getBoardTrendPageList(page, trend));
        return page;
yangtianyou's avatar
yangtianyou committed
107 108
    }

109 110 111 112 113 114 115
//    @Override
//    public List<TBoardPlayTrend> getBoardTrendPageList(Page<TBoardPlayTrend> page, TBoardPlayTrend trend) {
//
//        List<TBoardPlayTrend> boardTrendPageList = boardStatisticMapper.getBoardTrendPageList(trend);
//        return boardTrendPageList;
//    }

yangtianyou's avatar
yangtianyou committed
116
    @Override
wzp's avatar
wzp committed
117
    public Page<TDistrictBoardStatistic> getBoardDistrictPageList(Page<TDistrictBoardStatistic> page, TDistrictBoardStatistic district) {
wzp's avatar
wzp committed
118
        List<TDistrictBoardStatistic> list = boardStatisticMapper.getBoardDistrictPageList(page, district);
wzp's avatar
wzp committed
119
        page.setRecords(list);
yangtianyou's avatar
yangtianyou committed
120 121 122
        return page;
    }

yangtianyou's avatar
yangtianyou committed
123
    @Override
wzp's avatar
wzp committed
124
    public TBoardSurvey getBoardSurvey(TBoardSurvey survey) {
yangtianyou's avatar
yangtianyou committed
125 126 127 128 129 130 131 132 133 134 135 136
        // 获取展板播放量
        survey.setPlayCnt(boardStatisticMapper.getBoardPlayTotal(survey));
        // 获取展板总数
        survey.setBoardCnt(boardStatisticMapper.getBoardTotal(survey));
        // 获取播放展板的机构总数
        survey.setOrgCnt(boardStatisticMapper.getOrganTotal(survey));
        // 获取互动总数
        survey.setInteractionCnt(boardStatisticMapper.getInteractionTotal(survey));
        return survey;
    }

    @Override
wzp's avatar
wzp committed
137 138
    public Page getInteractionFrequency(Page page, String frequencyDate, String orgCode) {
        page.setRecords(boardStatisticMapper.getInteractionFrequency(page, frequencyDate, orgCode));
yangtianyou's avatar
yangtianyou committed
139 140 141
        return page;
    }

142 143 144 145 146 147 148

    @Override
    public Page getInteractionFrequency(Page page, String frequencyDate, String orgCode, List<String> areaIds) {
        page.setRecords(boardStatisticMapper.getInteractionFrequency1(page, frequencyDate, orgCode,areaIds));
        return page;
    }

yangtianyou's avatar
yangtianyou committed
149
    @Override
wzp's avatar
wzp committed
150
    public List getBoardProvincePlayTotalList(String organId, String orgCode) {
yangtianyou's avatar
yangtianyou committed
151 152
        // 获取省份信息
        QueryWrapper qw = new QueryWrapper();
wzp's avatar
wzp committed
153
        qw.eq("type", "P");
yangtianyou's avatar
yangtianyou committed
154
        List<TArea> provlist = areaService.list(qw);
wzp's avatar
wzp committed
155 156
        provlist.stream().forEach(l -> l.setName(l.getName().replace("省", "").replace("市", "").
                replace("自治区", "").replace("特别行政区", "").replace("壮族", "").replace("回族", "").replace("维吾尔", "")));
yangtianyou's avatar
yangtianyou committed
157 158 159 160 161
        // 遍历省份,统计各省播放量
        TBoardSurvey survey = new TBoardSurvey();
        String dateStr = DateUtil.getCurrentDate("yyyyMM");
        survey.setStatisticDate(dateStr);
        survey.setOrganId(organId);
wzp's avatar
wzp committed
162
        survey.setOrganCode(orgCode);
yangtianyou's avatar
yangtianyou committed
163 164
        List list = new ArrayList();
        // 根据省份查询播放量
wzp's avatar
wzp committed
165
        for (TArea prov : provlist) {
yangtianyou's avatar
yangtianyou committed
166
            Map map = new HashMap();
wzp's avatar
wzp committed
167
            survey.setAreaId(prov.getId().toString().substring(0, 2));
yangtianyou's avatar
yangtianyou committed
168
            Integer cnt = boardStatisticMapper.getBoardPlayTotal(survey);
wzp's avatar
wzp committed
169 170
            map.put("name", prov.getName());
            map.put("value", cnt == null ? 0 : cnt);
yangtianyou's avatar
yangtianyou committed
171 172 173 174
            list.add(map);
        }
        return list;
    }
yangtianyou's avatar
yangtianyou committed
175

wzp's avatar
wzp committed
176 177
    @Override
    public List getBoardCityPlayTotalList(String areaCode, String orgCode) {
wzp's avatar
wzp committed
178 179 180
        if (areaCode.equals("110000")||areaCode.equals("120000")||areaCode.equals("310000")||areaCode.equals("500000")){
            areaCode=areaCode.substring(0,2)+"0100";
        }
wzp's avatar
wzp committed
181
        QueryWrapper qw = new QueryWrapper();
wzp's avatar
wzp committed
182 183 184 185 186 187
        if (areaCode.endsWith("00")) {
            qw.eq("parent_id", areaCode);
        }else {
            qw.eq("code", areaCode);
        }

wzp's avatar
wzp committed
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
        List<TArea> provlist = areaService.list(qw);
        TBoardSurvey survey = new TBoardSurvey();
        String dateStr = DateUtil.getCurrentDate("yyyyMM");
        survey.setStatisticDate(dateStr);
        survey.setOrganCode(orgCode);
        List list = new ArrayList();
        // 根据省份查询播放量
        for (TArea prov : provlist) {
            Map map = new HashMap();
            if (areaCode.endsWith("0000")) {
                survey.setAreaId(prov.getId().toString().substring(0, 4));
            }else {
                survey.setAreaId(prov.getId().toString());
            }
            Integer cnt = boardStatisticMapper.getBoardPlayTotal(survey);
            map.put("name", prov.getName());
            map.put("value", cnt == null ? 0 : cnt);
            list.add(map);
        }
        return list;
    }


wzp's avatar
wzp committed
211 212
    @Override
    public Page<TBoardPlayTrend> getBoardPageList(Page<TBoardPlayTrend> page, TBoardPlayTrend trend) {
wzp's avatar
wzp committed
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
        HashMap<String, Integer> map = new HashMap<>();
        List<TBoardPlayTrend> board = boardStatisticMapper.getBoardPageList(page, trend);
        for (TBoardPlayTrend tBoardPlayTrend : board) {
            map.put(tBoardPlayTrend.getPlayDate(),tBoardPlayTrend.getPlayNumber());
        }
        SimpleDateFormat sim = new SimpleDateFormat("yyyyMM");
        Date begin = null;
        Date end = null;
        try {
            begin = sim.parse(trend.getBeginDate());
            end = sim.parse(trend.getEndDate());
        } catch (ParseException e) {
            e.printStackTrace();
        }

        long l = (end.getTime() - begin.getTime()) / 1000 / 3600 / 24 / 30;

        ArrayList<TBoardPlayTrend> list = new ArrayList<>();
        Calendar rightNow = Calendar.getInstance();
        rightNow.setTime(begin);
        for (int i = 0; i <= l; i++) {
            TBoardPlayTrend tBoardPlayTrend = new TBoardPlayTrend();
            String date = sim.format(rightNow.getTime());
            tBoardPlayTrend.setPlayDate(date);
            if (map.get(date)!=null){
                tBoardPlayTrend.setPlayNumber(map.get(date));
            }else {
                tBoardPlayTrend.setPlayNumber(0);
            }
            list.add(tBoardPlayTrend);
            rightNow.add(Calendar.MONTH, 1);
        }
        page.setRecords(list);
wzp's avatar
wzp committed
246 247 248
        return page;
    }

yangtianyou's avatar
yangtianyou committed
249 250 251 252
    /**
     * 更新展板统计信息
     */
    @Override
wzp's avatar
wzp committed
253 254 255 256
    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();
yangtianyou's avatar
yangtianyou committed
257
            // 如果有对应的展板记录,累计播放量
wzp's avatar
wzp committed
258
            if (map.containsKey(key)) {
yangtianyou's avatar
yangtianyou committed
259
                TBoardStatistic boardStatistic = map.get(key);
wzp's avatar
wzp committed
260 261 262
                boardStatistic.setPlayNumber(Integer.parseInt(CurrencyMathUtil.add(boardStatistic.getPlayNumber(), s.getPlayNumber())));
                map.put(key, boardStatistic);
            } else {
yangtianyou's avatar
yangtianyou committed
263
                // 如果无对应的展板记录,插入到map中
wzp's avatar
wzp committed
264
                map.put(key, s);
yangtianyou's avatar
yangtianyou committed
265 266 267
            }
        });
        // 更新数据库展板统计信息
wzp's avatar
wzp committed
268
        for (String key : map.keySet()) {
yangtianyou's avatar
yangtianyou committed
269 270 271
            TBoardStatistic bs = map.get(key);
            // 查询数据库是否有对应的记录
            QueryWrapper<TBoardStatistic> qw = new QueryWrapper<>();
wzp's avatar
wzp committed
272 273 274
            qw.eq("board_id", bs.getBoardId());
            qw.eq("organ_id", bs.getOrganId());
            qw.eq("play_date", bs.getPlayDate());
275
            TBoardStatistic tbDB = this.getOne(qw,false);
yangtianyou's avatar
yangtianyou committed
276
            // 如果数据库存在统计记录,则累计统计数量
wzp's avatar
wzp committed
277 278
            if (tbDB != null) {
                tbDB.setPlayNumber(Integer.parseInt(CurrencyMathUtil.add(bs.getPlayNumber(), tbDB.getPlayNumber())));
yangtianyou's avatar
yangtianyou committed
279
                this.updateById(tbDB);
wzp's avatar
wzp committed
280 281
                map.put(key, tbDB);
            } else {
yangtianyou's avatar
yangtianyou committed
282 283 284 285 286 287 288 289 290 291
                // 如果数据库不存在统计记录,则增加统计数据
                this.save(bs);
            }
        }

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

}