管理员首页统计

master
wujingtao 2 years ago
parent 5bb15d5c9e
commit f5135b645a

@ -0,0 +1,70 @@
package com.baiye.model.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author jt
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class HomePageReportDTO {
/**
* 使
*/
private Integer usrNum;
/**
* 使
*/
private Double usrNumRate;
/**
*
*/
private Integer turnOnNum;
/**
*
*/
private Double turnOnRate;
/**
*
*/
private Integer totalNum;
/**
*
*/
private Integer addTotalNum;
/**
*
*/
private Integer deliveryNum;
/**
*
*/
private Integer addDeliveryNum;
/**
*
*/
private Integer talkNum;
/**
*
*/
private Integer addTalkNum;
public HomePageReportDTO init() {
this.setUsrNum(0);
this.setUsrNumRate(0.00);
this.setTurnOnNum(0);
this.setTurnOnRate(0.00);
this.setTotalNum(0);
this.setAddTotalNum(0);
this.setAddTalkNum(0);
this.setTalkNum(0);
this.setAddDeliveryNum(0);
this.setDeliveryNum(0);
return this;
}
}

@ -9,9 +9,7 @@ import com.baiye.modules.system.service.dto.ClueMiddleTo;
import com.baiye.modules.telemarkting.entity.ClueMiddle;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@ -84,12 +82,12 @@ public interface SourceClueClient {
CommonResponse<Integer> queryClueByAdmin(@RequestParam(value = "memberId") Long memberId);
@ApiOperation("按任务获取当日所有意向数据")
@GetMapping(API_PREFIX+"/countClueByTaskId")
@GetMapping(API_PREFIX + "/countClueByTaskId")
CommonResponse<Integer> countClueByTaskId(@RequestParam(value = "taskId") Long taskId,
@RequestParam(value = "beginTime") String beginTime,
@RequestParam(value = "endTime") String endTime);
@PostMapping(API_PREFIX+"/count/memberStatus")
@PostMapping(API_PREFIX + "/count/memberStatus")
@ApiOperation("未分配线索的总条数")
CommonResponse<Map<Long, Integer>> countClueByMemberStatus(@RequestBody ClueQueryCriteria clueQueryCriteria);
}

@ -3,6 +3,7 @@ package com.baiye.feign;
import com.baiye.http.CommonResponse;
import com.baiye.model.dto.ClueQueryCriteria;
import com.baiye.model.dto.DistributeResponseDTO;
import com.baiye.model.dto.HomePageReportDTO;
import com.baiye.model.dto.OrganizeQueryCriteria;
import com.baiye.model.vo.ResSourceLabel;
import com.baiye.modules.system.domain.Clue;
@ -92,5 +93,4 @@ public class SourceClueClientFallback implements SourceClueClient {
public CommonResponse<Map<Long, Integer>> countClueByMemberStatus(ClueQueryCriteria clueQueryCriteria) {
return null;
}
}

@ -27,7 +27,7 @@ public class ReportController {
private QueryReportService queryReportService;
@GetMapping("/report/all")
@ApiOperation("所有任务的统计信息")
@ApiOperation("所有任务的统计信息(暂时放弃)")
public CommonResponse<Object> getReportByAll() {
return queryReportService.getReportByAll();
}
@ -72,13 +72,15 @@ public class ReportController {
// Long currentUserId = 68L;
return queryReportService.getMemberReport(beginTime, endTime, currentUserId);
}
@GetMapping("/report/member/month")
@ApiOperation("获取单个成员近30天的统计信息")
public CommonResponse<Object> getMemberReportByMonth() {
// Long currentUserId = 68L;
Long currentUserId = SecurityUtils.getCurrentUserId();
return queryReportService.getMemberReportByMonth( currentUserId);
return queryReportService.getMemberReportByMonth(currentUserId);
}
@GetMapping("/download/member")
@ApiOperation("导出单个成员统计信息")
public void downloadMemberReport(HttpServletResponse response, String beginTime, String endTime, Long memberId) {
@ -100,6 +102,6 @@ public class ReportController {
@GetMapping("/download/details")
@ApiOperation("下载通话记录详情")
public void downloadCallRecordDetails(HttpServletResponse response, Long clueId) {
queryReportService.downloadCallRecordDetails(response,clueId);
queryReportService.downloadCallRecordDetails(response, clueId);
}
}

@ -11,6 +11,7 @@ import java.util.List;
* @date 2022/03/16
*/
public interface QueryReportService {
/**
*
*

@ -3,7 +3,6 @@ package com.baiye.modules.report.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
@ -75,7 +74,7 @@ public class QueryReportServiceImpl implements QueryReportService {
private final UserService userService;
/**
*
*
*
* @return
*/
@ -891,12 +890,4 @@ public class QueryReportServiceImpl implements QueryReportService {
public User getMember(Long id) {
return userRepository.findUserById(id);
}
public static void main(String[] args) {
Long createTime = 1661762157L;
DateTime date = DateUtil.date(createTime);
int compare = DateUtil.compare(DateUtil.date(), date);
System.out.println(compare > 30);
}
}

@ -217,6 +217,7 @@ public class UserServiceImpl implements UserService {
//抖音(飞鱼)
createTask(userCreateResult.getId(), "抖音任务", DefaultNumberConstants.THREE_NUMBER);
}
//公司名称做的对应,所以将公司名设为表单任务名
createTask(userCreateResult.getId(), userCreateResult.getUsername(), DefaultNumberConstants.ONE_NUMBER);
createTask(userCreateResult.getId(), "员工上传任务", DefaultNumberConstants.TWO_NUMBER);
createTask(userCreateResult.getId(), "投流回流任务", DefaultNumberConstants.SEVEN_NUMBER);

@ -44,7 +44,7 @@ public interface CallClueRepository extends JpaRepository<CallClueInfo, Long>, J
int deleteByCompanyId(Long companyId);
/**
*
* 使线
*
* @param beginTime
* @param endTime

@ -273,9 +273,6 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
clueInfo.setCompanyId(companyId);
allCallInfoRepository.save(allCallInfo);
callClueRepository.save(clueInfo);
// } else {
// return CommonResponse.createByError();
// }
return CommonResponse.createBySuccess(requestId);
}

@ -1,5 +1,7 @@
package com.baiye.module.controller;
import com.baiye.http.CommonResponse;
import com.baiye.model.dto.HomePageReportDTO;
import com.baiye.module.entity.dto.ReportTokerDTO;
import com.baiye.module.service.ReportTokerService;
import io.swagger.annotations.Api;
@ -11,6 +13,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* @author jt
@ -41,4 +44,11 @@ public class ReportTokerController {
public ResponseEntity<Object> reportTokerPie(@RequestBody ReportTokerDTO reportTokerDTO) {
return new ResponseEntity<>(reportTokerService.reportTokerPie(reportTokerDTO), HttpStatus.OK);
}
@GetMapping("/homePage")
@ApiOperation("管理员首页统计总览")
public CommonResponse<Map<String, HomePageReportDTO>> getReportHomePage(@RequestParam(value = "userId") Long userId) {
return reportTokerService.getReportHomePage(userId);
}
}

@ -210,4 +210,14 @@ public interface ClueMiddleRepository extends JpaRepository<ClueMiddle, Long>, J
List<ClueMiddle> queryClueByClueType(String startTime, String endTime, List<Integer> clueType);
List<ClueMiddle> findByTaskIdAndMemberStatus(Long taskId, int memberStatus);
/**
* 线
*
* @param userId
* @return
*/
@Query(value = " select * from tb_clue_middle as tcm left join tb_clue as tc on tcm.clue_id =tc.id" +
" where tc.create_by = ?1", nativeQuery = true)
List<ClueMiddle> findClueMiddleByCreateBy(Long userId);
}

@ -50,7 +50,6 @@ public class ReqOceanEngineApi {
execute().
body();
OceanEngineResponse response = JSONUtil.toBean(body, OceanEngineResponse.class);
log.info("获取广告商id结果==={}",body);
if (response.getCode() == 0 && response.getData() != null) {
JSONObject json = JSONUtil.parseObj(response.getData());
JSONArray list = json.getJSONArray("list");
@ -137,7 +136,6 @@ public class ReqOceanEngineApi {
result.append(line);
}
bufferedReader.close();
log.info("同步数据==={}", result);
OceanEngineResponse oceanEngineResponse = JSONUtil.toBean(result.toString(), OceanEngineResponse.class);
if (oceanEngineResponse.getCode() == 0 && oceanEngineResponse.getData() != null) {
return JSONUtil.parseObj(oceanEngineResponse.getData());
@ -177,7 +175,6 @@ public class ReqOceanEngineApi {
result.append(line);
}
bufferedReader.close();
log.info("回传数据==={}", result);
OceanEngineResponse oceanEngineResponse = JSONUtil.toBean(result.toString(), OceanEngineResponse.class);
if (oceanEngineResponse.getCode() == 0 && oceanEngineResponse.getData() != null) {
return true;

@ -1,7 +1,8 @@
package com.baiye.module.service;
import com.baiye.http.CommonResponse;
import com.baiye.model.dto.HomePageReportDTO;
import com.baiye.module.entity.dto.ReportTokerDTO;
import org.springframework.web.bind.annotation.RequestBody;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
@ -17,4 +18,6 @@ public interface ReportTokerService {
void downloadReportToker(HttpServletResponse response, ReportTokerDTO reportTokerDTO);
List<HashMap<String, Object>> reportTokerPie(ReportTokerDTO reportTokerDTO);
CommonResponse<Map<String, HomePageReportDTO>> getReportHomePage(Long userId);
}

@ -1,15 +1,21 @@
package com.baiye.module.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.baiye.constant.ClueTypeConstants;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.exception.BadRequestException;
import com.baiye.feign.TaskClient;
import com.baiye.feign.UserClient;
import com.baiye.http.CommonResponse;
import com.baiye.model.dto.HomePageReportDTO;
import com.baiye.module.dao.ClueMiddleRepository;
import com.baiye.module.dao.ReportTokerRepository;
import com.baiye.module.entity.ClueMiddle;
import com.baiye.module.entity.ReportToker;
import com.baiye.module.entity.Task;
import com.baiye.module.entity.dto.ReportTokerDTO;
@ -38,6 +44,7 @@ public class ReportTokerServiceImpl implements ReportTokerService {
private final UserClient userClient;
private final ReportSync reportSync;
private final ClueMiddleRepository clueMiddleRepository;
@Override
public Map<String, Object> reportTokerBroken(ReportTokerDTO reportTokerDTO) {
@ -92,42 +99,30 @@ public class ReportTokerServiceImpl implements ReportTokerService {
/**
*
*
* @param endTime
* @return
*/
private List<ReportToker> getTodayData(String endTime) {
long between = DateUtil.between(DateUtil.parseDate(endTime), DateUtil.parseDate(DateUtil.today()), DateUnit.DAY);
//TODO 需要实时查询当天的统计
// 需要实时查询当天的统计
if (between == DefaultNumberConstants.ZERO_NUMBER) {
return reportSync.dealData(DateUtil.beginOfDay(DateUtil.date()).toString(), DateUtil.endOfDay(DateUtil.date()).toString());
}
return new ArrayList<>();
}
/**
*
*
* @param beginTime
* @param endTime
* @param reportTokers
* @return
*/
private Map<String, Object> dealReportData(String beginTime, String endTime, Long taskId, Long memberId, List<ReportToker> reportTokers) {
Date start = DateUtil.parseDate(beginTime);
Date end = DateUtil.parseDate(endTime);
int between = (int) DateUtil.between(start, end, DateUnit.DAY);
// Map<Date, List<ReportToker>> collect = reportTokers.stream().collect(Collectors.groupingBy(ReportToker::getCreateTime, Collectors.toList()));
List<HashMap<String, Object>> list = new ArrayList<>();
Map<String, Object> map = new HashMap<>();
Map<String, Object> map = new HashMap<>(2);
String userName = null;
if (CollUtil.isNotEmpty(reportTokers)) {
userName = reportTokers.get(0).getMemberName();
}
for (int i = 0; i <= between; i++) {
Date date = DateUtil.offsetDay(start, i);
HashMap<String, Object> dataMap = new HashMap<>();
HashMap<String, Object> dataMap = new HashMap<>(8);
int intention = 0;
int notIntention = 0;
int notTurnOn = 0;
@ -170,7 +165,7 @@ public class ReportTokerServiceImpl implements ReportTokerService {
@Cacheable(value = "taskName", key = "'task:name:' + #p0")
public String findByTaskId(Long taskId) {
Task body = taskClient.queryDetails(taskId).getBody();
if (ObjectUtil.isNotEmpty(body)) {
if (body != null) {
return body.getTaskName();
}
return null;
@ -188,7 +183,7 @@ public class ReportTokerServiceImpl implements ReportTokerService {
List<ReportToker> todayData = getTodayData(reportTokerDTO.getEndTime());
tokers.addAll(todayData);
Map<Long, List<ReportToker>> tokerByTaskId = tokers.stream().collect(Collectors.groupingBy(ReportToker::getTaskId, Collectors.toList()));
HashMap<String, Object> map = new HashMap<>();
HashMap<String, Object> map = new HashMap<>(5);
for (Long taskId : tokerByTaskId.keySet()) {
String taskName = findByTaskId(taskId);
List<ReportToker> tokerByTaskIdList = tokerByTaskId.get(taskId);
@ -209,4 +204,91 @@ public class ReportTokerServiceImpl implements ReportTokerService {
}
return list;
}
@Override
public CommonResponse<Map<String, HomePageReportDTO>> getReportHomePage(Long userId) {
Map<String, HomePageReportDTO> map = new HashMap<>(2);
List<ClueMiddle> clueMiddles = clueMiddleRepository.findClueMiddleByCreateBy(userId);
if (CollUtil.isNotEmpty(clueMiddles)) {
HomePageReportDTO crmReport = new HomePageReportDTO().init();
HomePageReportDTO talkReport = new HomePageReportDTO().init();
for (ClueMiddle clueMiddle : clueMiddles) {
//crm
if (Arrays.asList(ClueTypeConstants.SCREEN_TYPE).contains(clueMiddle.getClueType())) {
dealData(clueMiddle, crmReport, 1);
} else if (Arrays.asList(ClueTypeConstants.TOKER_TYPE).contains(clueMiddle.getClueType())) {
//拓客投流
dealData(clueMiddle, talkReport, 2);
}
}
map.put("crm", rate(crmReport));
map.put("talk", rate(talkReport));
}
return CommonResponse.createBySuccess(map);
}
private HomePageReportDTO rate(HomePageReportDTO report) {
double usrRate = 0.00;
double turnRate = 0.00;
if (report.getTotalNum() != DefaultNumberConstants.ZERO_NUMBER) {
usrRate = NumberUtil.div(report.getUsrNum(), report.getTotalNum(), 2).doubleValue();
}
if (report.getUsrNum() != DefaultNumberConstants.ZERO_NUMBER) {
turnRate = NumberUtil.div(report.getTurnOnNum(), report.getUsrNum(), 2).doubleValue();
}
report.setUsrNumRate(usrRate);
report.setTurnOnRate(turnRate);
return report;
}
private void dealData(ClueMiddle clueMiddle, HomePageReportDTO report, Integer flag) {
Integer clueType = clueMiddle.getClueType();
report.setTotalNum(report.getTotalNum() + 1);
//来源
if (flag == 1) {
//投流来源
if (clueType == DefaultNumberConstants.SEVEN_NUMBER) {
report.setDeliveryNum(report.getDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.SIX_NUMBER) {
report.setTalkNum(report.getTalkNum() + 1);
}
} else {
//投流来源
if (clueType == DefaultNumberConstants.FIVE_NUMBER) {
report.setDeliveryNum(report.getDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.FOUR_NUMBER) {
report.setTalkNum(report.getTalkNum() + 1);
}
}
//昨日新增
DateTime yesterday = DateUtil.yesterday();
if (clueMiddle.getCreateTime() != null && DateUtil.betweenDay(clueMiddle.getCreateTime(), yesterday, true) == DefaultNumberConstants.ZERO_NUMBER) {
report.setAddTotalNum(report.getAddTotalNum() + 1);
if (flag == 1) {
if (clueType == DefaultNumberConstants.SEVEN_NUMBER) {
report.setAddDeliveryNum(report.getAddDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.SIX_NUMBER) {
report.setAddTalkNum(report.getAddTalkNum() + 1);
}
} else {
if (clueType == DefaultNumberConstants.FIVE_NUMBER) {
report.setAddDeliveryNum(report.getAddDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.FOUR_NUMBER) {
report.setAddTalkNum(report.getAddTalkNum() + 1);
}
}
}
//今日实时
DateTime today = DateUtil.date();
if (clueMiddle.getNewestCallTime() != null && DateUtil.betweenDay(clueMiddle.getNewestCallTime(), today, true) == DefaultNumberConstants.ZERO_NUMBER) {
if (clueMiddle.getClueCallStatus() == DefaultNumberConstants.ONE_NUMBER) {
report.setUsrNum(report.getUsrNum() + 1);
} else if (clueMiddle.getClueCallStatus() == DefaultNumberConstants.TWO_NUMBER) {
report.setTurnOnNum(report.getTurnOnNum() + 1);
report.setUsrNum(report.getUsrNum() + 1);
}
}
}
}

@ -73,24 +73,20 @@ public class OceanEngineSync {
taskQueryCriteria.setIsForm(3);
JSONArray taskIds = JSONUtil.parseArray(taskClient.query(taskQueryCriteria).getBody());
if (CollUtil.isEmpty(taskIds) || taskIds.size() != 1) {
log.info("没有任务 用户id=={}", userId);
return;
}
taskId = taskIds.getJSONObject(0).getLong("id");
if (CollUtil.isEmpty(advertisers)) {
log.info("没有管家id 用户id=={}", userId);
return;
}
List<String> advertiseList = ReqOceanEngineApi.getAdvertiseIds(accessToken, advertisers);
if (CollUtil.isEmpty(advertiseList)) {
log.info("没有广告商id 用户id=={}", userId);
return;
}
Date currentTime = DateUtil.date();
Date startTime = DateUtil.beginOfMinute(DateUtil.offsetMinute(currentTime, -15));
Date endTime = DateUtil.endOfMinute(DateUtil.offsetMinute(currentTime, -1));
log.info("查询时间==当前时间={},开始时间={},结束时间={}", currentTime, startTime, endTime);
Map<String, Object> map = new HashMap<>(5);
map.put("advertiser_ids", advertiseList);
map.put("start_time", startTime.toString());
@ -100,7 +96,6 @@ public class OceanEngineSync {
return;
}
parseAndSaveData(userId, taskId, array);
log.info("同步成功==========");
}
private boolean checkCountName(String countName) {

Loading…
Cancel
Save