|
@@ -0,0 +1,236 @@
|
|
|
+package com.sxtvs.open.api.odata.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.collection.ListUtil;
|
|
|
+import cn.hutool.core.io.IoUtil;
|
|
|
+import cn.hutool.core.map.MapUtil;
|
|
|
+import cn.hutool.poi.excel.ExcelUtil;
|
|
|
+import cn.hutool.poi.excel.ExcelWriter;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+
|
|
|
+import com.sxtvs.open.api.odata.dao.OpenDataMapper;
|
|
|
+import com.sxtvs.open.api.odata.dto.Agg;
|
|
|
+import com.sxtvs.open.api.odata.dto.NewMedia;
|
|
|
+import com.sxtvs.open.api.odata.dto.RequestDTO;
|
|
|
+import com.sxtvs.open.api.odata.entity.OpenData;
|
|
|
+import com.sxtvs.open.api.odata.service.IOpenDataService;
|
|
|
+import jakarta.servlet.ServletOutputStream;
|
|
|
+import jakarta.servlet.http.HttpServletResponse;
|
|
|
+import org.apache.http.util.TextUtils;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.UnsupportedEncodingException;
|
|
|
+import java.net.URLEncoder;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class OpenDataServiceImpl extends ServiceImpl<OpenDataMapper, OpenData> implements IOpenDataService {
|
|
|
+ public List<Agg> aggList(RequestDTO requestDTO){
|
|
|
+ DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyyMMdd");
|
|
|
+// DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyyMM");
|
|
|
+ DateTimeFormatter dtf3 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+// DateTimeFormatter dtf4 = DateTimeFormatter.ofPattern("yyyy-MM");
|
|
|
+ List<Agg> newMediaList = new ArrayList<>();
|
|
|
+ List<String> names = new ArrayList<>();
|
|
|
+ if(!TextUtils.isEmpty(requestDTO.getUserId())){
|
|
|
+ requestDTO.setGroupName(baseMapper.getDepGroup(requestDTO.getUserId()));
|
|
|
+ }
|
|
|
+ if (!TextUtils.isEmpty(requestDTO.getGroupName())){
|
|
|
+ names = baseMapper.departmentGroup(requestDTO.getGroupName(), null);
|
|
|
+ }
|
|
|
+ switch (requestDTO.getPlatform()){
|
|
|
+ case "微博":
|
|
|
+ newMediaList = baseMapper.weiboAggList(dtf1.format(requestDTO.getStart()), dtf1.format(requestDTO.getEnd()), requestDTO.getMatch(), names, aggSort(requestDTO.getSort()), requestDTO.getOrder());
|
|
|
+ break;
|
|
|
+ case "微信":
|
|
|
+ newMediaList = baseMapper.weixinAggList(dtf1.format(requestDTO.getStart()), dtf1.format(requestDTO.getEnd()), requestDTO.getMatch(), names, aggSort(requestDTO.getSort()), requestDTO.getOrder());
|
|
|
+ break;
|
|
|
+ case "头条":
|
|
|
+ newMediaList = baseMapper.toutiaoAggList(dtf3.format(requestDTO.getStart()), dtf3.format(requestDTO.getEnd()), requestDTO.getMatch(), names, aggSort(requestDTO.getSort()), requestDTO.getOrder());
|
|
|
+ break;
|
|
|
+ case "抖音":
|
|
|
+ newMediaList = baseMapper.douyinAggList(dtf1.format(requestDTO.getStart()), dtf1.format(requestDTO.getEnd()), requestDTO.getMatch(), names, aggSort(requestDTO.getSort()), requestDTO.getOrder());
|
|
|
+ break;
|
|
|
+ case "快手":
|
|
|
+ newMediaList = baseMapper.kuaishouAggList(dtf3.format(requestDTO.getStart()), dtf3.format(requestDTO.getEnd()), requestDTO.getMatch(), names, aggSort(requestDTO.getSort()), requestDTO.getOrder());
|
|
|
+ break;
|
|
|
+ case "B站":
|
|
|
+ newMediaList = baseMapper.biliAggList(dtf3.format(requestDTO.getStart()), dtf3.format(requestDTO.getEnd()), requestDTO.getMatch(), names, aggSort(requestDTO.getSort()), requestDTO.getOrder());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return newMediaList;
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<NewMedia> newMediaList(RequestDTO requestDTO){
|
|
|
+ DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+ List<String> names = new ArrayList<>();
|
|
|
+ if(!TextUtils.isEmpty(requestDTO.getUserId())){
|
|
|
+ requestDTO.setGroupName(baseMapper.getDepGroup(requestDTO.getUserId()));
|
|
|
+ names = baseMapper.departmentGroup(requestDTO.getGroupName(), requestDTO.getPlatform());
|
|
|
+ }
|
|
|
+
|
|
|
+ return baseMapper.newMediaList(requestDTO.getPlatform(), dtf1.format(requestDTO.getStart()), dtf1.format(requestDTO.getEnd()), requestDTO.getMatch(), names, listSort(requestDTO.getSort()), requestDTO.getOrder());
|
|
|
+ }
|
|
|
+
|
|
|
+ private String listSort(String sort){
|
|
|
+ String rs = "publish_time";
|
|
|
+ switch (sort){
|
|
|
+ case "playCount":
|
|
|
+ rs = "play_count";
|
|
|
+ break;
|
|
|
+ case "likeCount":
|
|
|
+ rs = "like_count";
|
|
|
+ break;
|
|
|
+ case "commentCount":
|
|
|
+ rs = "comment_count";
|
|
|
+ break;
|
|
|
+ case "shareCount":
|
|
|
+ rs = "share_count";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return rs;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String aggSort(String sort){
|
|
|
+ String rs = "read_count";
|
|
|
+ switch (sort){
|
|
|
+ case "fans":
|
|
|
+ rs = "fans";
|
|
|
+ break;
|
|
|
+ case "publishCount":
|
|
|
+ rs = "publish_count";
|
|
|
+ break;
|
|
|
+ case "commentCount":
|
|
|
+ rs = "comment_count";
|
|
|
+ break;
|
|
|
+ case "shareCount":
|
|
|
+ rs = "share_count";
|
|
|
+ break;
|
|
|
+ case "likeCount":
|
|
|
+ rs = "like_count";
|
|
|
+ break;
|
|
|
+ case "favCount":
|
|
|
+ rs = "fav_count";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return rs;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void export(String start, String end, String sort, HttpServletResponse response){
|
|
|
+ String[] platforms = new String[]{"微博", "微信", "头条", "抖音", "快手", "B站"};
|
|
|
+ ExcelWriter writer = ExcelUtil.getWriter();
|
|
|
+ for(String platform : platforms){
|
|
|
+ if (platform.equals("微博")){
|
|
|
+ writer.renameSheet(platform);
|
|
|
+ }else{
|
|
|
+ writer.setSheet(platform);
|
|
|
+ }
|
|
|
+ List<Agg> aggs = aggList(new RequestDTO(platform, LocalDate.parse(start), LocalDate.parse(end), sort));
|
|
|
+ writer.clearHeaderAlias();
|
|
|
+ writer.addHeaderAlias("userName", "账号");
|
|
|
+ writer.addHeaderAlias("depName", "部门");
|
|
|
+ writer.addHeaderAlias("publishCount", "发稿量");
|
|
|
+// writer.addHeaderAlias("monthPublishCount", "月发稿量");
|
|
|
+ writer.addHeaderAlias("readCount", "阅读量");
|
|
|
+// writer.addHeaderAlias("monthReadCount", "本月累计阅读量");
|
|
|
+ if (platform.equals("抖音") || platform.equals("微博") || platform.equals("微信")){
|
|
|
+ writer.addHeaderAlias("fans", "粉丝数");
|
|
|
+ writer.addHeaderAlias("shareCount", "转发量");
|
|
|
+ }
|
|
|
+ if (platform.equals("抖音") || platform.equals("微博") || platform.equals("快手")){
|
|
|
+ writer.addHeaderAlias("likeCount", "点赞量");
|
|
|
+ }
|
|
|
+ if (platform.equals("微博") || platform.equals("快手")){
|
|
|
+ writer.addHeaderAlias("commentCount", "评论量");
|
|
|
+ }
|
|
|
+ if (platform.equals("微信")){
|
|
|
+ writer.addHeaderAlias("favCount", "收藏量");
|
|
|
+ }
|
|
|
+ writer.setOnlyAlias(true);
|
|
|
+
|
|
|
+ writer.write(aggs, true);
|
|
|
+ for(int i = 0; i < 6; i++){
|
|
|
+ writer.setColumnWidth(i, 18);
|
|
|
+ }
|
|
|
+
|
|
|
+ List<NewMedia> newMediaList = newMediaList(new RequestDTO(platform, LocalDate.parse(start), LocalDate.parse(end), sort));
|
|
|
+ if(newMediaList.size() > 60000){
|
|
|
+ newMediaList = newMediaList.subList(0,60000);
|
|
|
+ }
|
|
|
+ writer.clearHeaderAlias();
|
|
|
+ writer.setSheet(platform + "【清单】");
|
|
|
+ writer.addHeaderAlias("userName", "账号");
|
|
|
+ writer.addHeaderAlias("depName", "部门");
|
|
|
+ writer.addHeaderAlias("title", "篇名");
|
|
|
+ writer.addHeaderAlias("playCount", "传播量");
|
|
|
+ if (!platform.equals("快手") && !platform.equals("微博")){
|
|
|
+ writer.addHeaderAlias("shareCount", "转发量");
|
|
|
+ }
|
|
|
+ writer.addHeaderAlias("publishTime", "发布时间");
|
|
|
+
|
|
|
+ writer.setOnlyAlias(true);
|
|
|
+ writer.write(newMediaList, true);
|
|
|
+ for(int i = 0; i < 6; i++){
|
|
|
+ writer.setColumnWidth(i, 18);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ String name = "";
|
|
|
+ try {
|
|
|
+ name = URLEncoder.encode("新媒体报表" + start + "~" + "end", "UTF8");
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
+ name = "media-"+ start + "~" + "end";
|
|
|
+ }
|
|
|
+
|
|
|
+ response.setContentType("application/vnd.ms-excel;charset=utf-8");
|
|
|
+ //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
|
|
|
+
|
|
|
+ response.setHeader("Content-Disposition","attachment;filename="+ name +".xls");
|
|
|
+
|
|
|
+ ServletOutputStream out= null;
|
|
|
+ try {
|
|
|
+ out = response.getOutputStream();
|
|
|
+ writer.flush(out, true);
|
|
|
+ }
|
|
|
+ catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ finally {
|
|
|
+ // 关闭writer,释放内存
|
|
|
+ writer.close();
|
|
|
+ }
|
|
|
+ //此处记得关闭输出Servlet流
|
|
|
+ IoUtil.close(out);
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<Map<String, Object>> platform(String kh){
|
|
|
+// return new String[]{"微博", "微信", "头条", "抖音", "快手", "B站"};
|
|
|
+ DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+ DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyyMMdd");
|
|
|
+
|
|
|
+ ArrayList<Map<String, Object>> ls = ListUtil.toList(
|
|
|
+ MapUtil.builder(new HashMap<String, Object>())
|
|
|
+ .put("platform", "微博").put("dt", dtf.format(dtf1.parse(baseMapper.weiboLastDt()))).build(),
|
|
|
+ MapUtil.builder(new HashMap<String, Object>())
|
|
|
+ .put("platform", "微信").put("dt", dtf.format(dtf1.parse(baseMapper.weixinLastDt()))).build(),
|
|
|
+ MapUtil.builder(new HashMap<String, Object>())
|
|
|
+ .put("platform", "抖音").put("dt", dtf.format(dtf1.parse(baseMapper.douyinLastDt()))).build()
|
|
|
+ );
|
|
|
+ if (kh.equals("0")){
|
|
|
+ ls.addAll(ListUtil.toList(
|
|
|
+ MapUtil.builder(new HashMap<String, Object>())
|
|
|
+ .put("platform", "头条").put("dt", dtf.format(dtf1.parse(baseMapper.toutiaoLastDt()))).build(),
|
|
|
+ MapUtil.builder(new HashMap<String, Object>())
|
|
|
+ .put("platform", "快手").put("dt", dtf.format(dtf1.parse(baseMapper.kuaishouLastDt()))).build(),
|
|
|
+ MapUtil.builder(new HashMap<String, Object>())
|
|
|
+ .put("platform", "B站").put("dt", dtf.format(dtf1.parse(baseMapper.biliLastDt()))).build()
|
|
|
+ ));
|
|
|
+ }
|
|
|
+ return ls;
|
|
|
+ }
|
|
|
+}
|