| @@ -0,0 +1,335 @@ | |||||
| package com.iformall.controller.datatower; | |||||
| import com.iformall.annotation.SystemControllerLog; | |||||
| import com.iformall.common.ResultData; | |||||
| import com.iformall.controller.base.BaseController; | |||||
| import com.iformall.domain.dto.WxCUserBasicInfoDto; | |||||
| import com.iformall.domain.po.base.TenantEntity; | |||||
| import com.iformall.domain.vo.UserCountVo; | |||||
| import com.iformall.enums.*; | |||||
| import com.iformall.service.*; | |||||
| import io.swagger.annotations.Api; | |||||
| import io.swagger.annotations.ApiOperation; | |||||
| import org.slf4j.Logger; | |||||
| import org.slf4j.LoggerFactory; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import org.springframework.web.bind.annotation.*; | |||||
| import java.math.BigDecimal; | |||||
| import java.text.SimpleDateFormat; | |||||
| import java.util.*; | |||||
| @RestController | |||||
| @Api(description = "会员统计") | |||||
| @RequestMapping("userStatistics") | |||||
| public class WxUserStatisticsController extends BaseController { | |||||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||||
| @Autowired | |||||
| private WxCUserBasicInfoService wxCUserBasicInfoService; | |||||
| @Autowired | |||||
| private WxCUserService wxCUserService; | |||||
| @Autowired | |||||
| private WxMallService wxMallService; | |||||
| @ApiOperation("查询微信用户数量") | |||||
| @GetMapping("/findWxUserCount") | |||||
| @SystemControllerLog(description = "查询微信用户数量") | |||||
| public ResultData findWxUserCount() { | |||||
| logger.debug("[" + getIpAddr() + "] userStatistics::findWxUserCount"); | |||||
| TenantEntity tenantEntity = getTenantInfo(); | |||||
| List<TenantEntity> tenantEntitys = wxMallService.getTenantEntitys(tenantEntity); | |||||
| //昨日同比 | |||||
| Map<String, Object> map = new HashMap<>(); | |||||
| WxCUserBasicInfoDto dto = new WxCUserBasicInfoDto(); | |||||
| dto.updateTenantInfo(tenantEntity); | |||||
| dto.setEndTime(new Date()); | |||||
| //微信用户数据 | |||||
| long wxTotalCount = wxCUserService.findCount(dto,tenantEntitys);//总量 | |||||
| map.put("wxTotalCount",wxTotalCount); | |||||
| Calendar c = Calendar.getInstance(); | |||||
| c.set(Calendar.HOUR_OF_DAY, 0); | |||||
| c.set(Calendar.MINUTE, 0); | |||||
| c.set(Calendar.SECOND, 0); | |||||
| Date today = c.getTime(); | |||||
| dto.setStartTime(today); | |||||
| dto.setEndTime(null); | |||||
| long wxTodayCount = wxCUserService.findCount(dto, tenantEntitys);//今天新增 | |||||
| map.put("wxTodayCount",wxTodayCount); | |||||
| //昨日同比 | |||||
| c.clear(); | |||||
| c.setTime(today); | |||||
| c.add(Calendar.DAY_OF_YEAR, -1); | |||||
| dto.setStartTime(c.getTime()); | |||||
| c.add(Calendar.DAY_OF_YEAR, 1); | |||||
| dto.setEndTime(c.getTime()); | |||||
| long wxYesterdayCount = wxCUserService.findCount(dto, tenantEntitys); | |||||
| if (wxYesterdayCount > 0) { | |||||
| double yesterday = (double) (wxTodayCount - wxYesterdayCount) / wxYesterdayCount * 100; | |||||
| double zrhb = new BigDecimal(yesterday).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); | |||||
| map.put("wxhb", zrhb + "%"); | |||||
| } else { | |||||
| map.put("wxhb", "--%"); | |||||
| } | |||||
| return new ResultData(map); | |||||
| } | |||||
| @ApiOperation("查询会员数量") | |||||
| @GetMapping("/findBasicUserCount") | |||||
| @SystemControllerLog(description = "查询会员数量") | |||||
| public ResultData findBasicUserCount() { | |||||
| logger.debug("[" + getIpAddr() + "] WxUserStatisticsController::findBasicUserCount"); | |||||
| TenantEntity tenantEntity = getTenantInfo(); | |||||
| List<TenantEntity> tenantEntitys = wxMallService.getTenantEntitys(tenantEntity); | |||||
| //昨日同比 | |||||
| Map<String, Object> map = new HashMap<>(); | |||||
| WxCUserBasicInfoDto dto = new WxCUserBasicInfoDto(); | |||||
| dto.updateTenantInfo(tenantEntity); | |||||
| dto.setEndTime(new Date()); | |||||
| //会员用户数据 | |||||
| long memTotalCount = wxCUserBasicInfoService.findCount(ifParentUpdateTenantInfo(),dto);//总量 | |||||
| map.put("memTotalCount",memTotalCount); | |||||
| Calendar c = Calendar.getInstance(); | |||||
| c.set(Calendar.HOUR_OF_DAY, 0); | |||||
| c.set(Calendar.MINUTE, 0); | |||||
| c.set(Calendar.SECOND, 0); | |||||
| Date today = c.getTime(); | |||||
| dto.setStartTime(today); | |||||
| dto.setEndTime(null); | |||||
| long memTodayCount = wxCUserBasicInfoService.findCount(ifParentUpdateTenantInfo(),dto);//今天新增 | |||||
| map.put("memTodayCount",memTodayCount); | |||||
| //昨日同比 | |||||
| c.clear(); | |||||
| c.setTime(today); | |||||
| c.add(Calendar.DAY_OF_YEAR, -1); | |||||
| dto.setStartTime(c.getTime()); | |||||
| c.add(Calendar.DAY_OF_YEAR, 1); | |||||
| dto.setEndTime(c.getTime()); | |||||
| long memYesterdayCount = wxCUserBasicInfoService.findCount(ifParentUpdateTenantInfo(),dto); | |||||
| if (memYesterdayCount > 0) { | |||||
| double yesterday = (double) (memTodayCount - memYesterdayCount) / memYesterdayCount * 100; | |||||
| double zrhb = new BigDecimal(yesterday).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); | |||||
| map.put("memhb", zrhb + "%"); | |||||
| } else { | |||||
| map.put("memhb", "--%"); | |||||
| } | |||||
| return new ResultData(map); | |||||
| } | |||||
| @ApiOperation("查询微信用户趋势") | |||||
| @GetMapping("/findWxUserTrend") | |||||
| @SystemControllerLog(description = "查询微信用户趋势") | |||||
| public ResultData findWxUserTrend(Date startTime, Date endTime, Integer reportType) { | |||||
| logger.debug("[" + getIpAddr() + "] WxUserStatisticsController::findUserCount"); | |||||
| TenantEntity tenantEntity = getTenantInfo(); | |||||
| List<TenantEntity> tenantEntitys = wxMallService.getTenantEntitys(tenantEntity); | |||||
| WxCUserBasicInfoDto dto = new WxCUserBasicInfoDto(); | |||||
| dto.updateTenantInfo(tenantEntity); | |||||
| if (startTime == null || endTime == null) { | |||||
| startTime = addMonth(new Date(), -1); | |||||
| endTime = new Date(); | |||||
| reportType = EnumUserCountReportType.DAY.getCode(); | |||||
| } | |||||
| dto.updateTenantInfo(tenantEntity); | |||||
| dto.setStartTime(startTime); | |||||
| dto.setEndTime(endTime); | |||||
| dto.setReportType(reportType); | |||||
| List<UserCountVo> wxCountList = new ArrayList<>();//每日新增会员数 | |||||
| List<UserCountVo> wxCounts = wxCUserService.findCountHistory(dto,tenantEntitys);//每日新增会员数 | |||||
| SimpleDateFormat sdf; | |||||
| SimpleDateFormat fsdf; | |||||
| if (reportType.equals(EnumUserCountReportType.YEAR.getCode())) { | |||||
| sdf = new SimpleDateFormat("yyyy"); | |||||
| fsdf = new SimpleDateFormat("yyyy"); | |||||
| }else if (reportType.equals(EnumUserCountReportType.MONTH.getCode())) { | |||||
| sdf = new SimpleDateFormat("yyyy-MM"); | |||||
| fsdf = new SimpleDateFormat("yyyy-MM"); | |||||
| }else { | |||||
| sdf = new SimpleDateFormat("yyyy-MM-dd"); | |||||
| fsdf = new SimpleDateFormat("MM-dd"); | |||||
| } | |||||
| Date curTime = new Date(startTime.getTime()); | |||||
| do { | |||||
| UserCountVo wxUc = new UserCountVo(); | |||||
| wxUc.setReportTime(fsdf.format(curTime)); | |||||
| final Date ct = new Date(curTime.getTime()); | |||||
| if (ct.before(new Date()) || ct.equals(new Date())) { | |||||
| //用户 | |||||
| Optional<UserCountVo> opWxUserCountVo = | |||||
| wxCounts.stream().filter(md -> md.getReportTime().equals(sdf.format(ct))).findFirst(); | |||||
| if (opWxUserCountVo.isPresent()) { | |||||
| wxUc.setIncCount(opWxUserCountVo.get().getIncCount()); | |||||
| wxUc.setTotalCount(opWxUserCountVo.get().getTotalCount()); | |||||
| } else { | |||||
| wxUc.setIncCount(0L); | |||||
| wxUc.setTotalCount(0L); | |||||
| } | |||||
| } | |||||
| wxCountList.add(wxUc); | |||||
| if (reportType.equals(EnumUserCountReportType.YEAR.getCode())) { | |||||
| curTime = addYear(curTime, 1); | |||||
| } else if (reportType.equals(EnumUserCountReportType.MONTH.getCode())) { | |||||
| curTime = addMonth(curTime, 1); | |||||
| } else { | |||||
| curTime = addDay(curTime, 1); | |||||
| } | |||||
| }while (curTime.before(endTime) || curTime.equals(endTime)); | |||||
| if (wxCountList.size() > 0 | |||||
| && wxCountList.get(0).getTotalCount() != null | |||||
| && wxCountList.get(0).getTotalCount() == 0) { | |||||
| WxCUserBasicInfoDto pdto = new WxCUserBasicInfoDto(); | |||||
| pdto.updateTenantInfo(tenantEntity); | |||||
| pdto.setEndTime(startTime); | |||||
| wxCountList.get(0).setTotalCount(wxCUserService.findCount(pdto, tenantEntitys)); | |||||
| } | |||||
| for (int i = 1; i < wxCountList.size(); i++){ | |||||
| if (wxCountList.get(i).getTotalCount() != null && | |||||
| wxCountList.get(i-1).getTotalCount() != null && | |||||
| wxCountList.get(i).getTotalCount() < wxCountList.get(i-1).getTotalCount()){ | |||||
| wxCountList.get(i).setTotalCount(wxCountList.get(i-1).getTotalCount()); | |||||
| } | |||||
| } | |||||
| return new ResultData(wxCountList); | |||||
| } | |||||
| @ApiOperation("查询会员趋势") | |||||
| @GetMapping("/findBasicUserTrend") | |||||
| @SystemControllerLog(description = "查询会员趋势") | |||||
| public ResultData findBasicUserTrend(Date startTime, Date endTime, Integer reportType) { | |||||
| logger.debug("[" + getIpAddr() + "] WxUserStatisticsController::findBasicUserTrend"); | |||||
| TenantEntity tenantEntity = getTenantInfo(); | |||||
| List<TenantEntity> tenantEntitys = wxMallService.getTenantEntitys(tenantEntity); | |||||
| WxCUserBasicInfoDto dto = new WxCUserBasicInfoDto(); | |||||
| dto.updateTenantInfo(tenantEntity); | |||||
| if (startTime == null || endTime == null) { | |||||
| startTime = addMonth(new Date(), -1); | |||||
| endTime = new Date(); | |||||
| reportType = EnumUserCountReportType.DAY.getCode(); | |||||
| } | |||||
| dto.updateTenantInfo(tenantEntity); | |||||
| dto.setStartTime(startTime); | |||||
| dto.setEndTime(endTime); | |||||
| dto.setReportType(reportType); | |||||
| List<UserCountVo> memCountList = new ArrayList<>();//每日新增会员数 | |||||
| List<UserCountVo> memCounts = wxCUserBasicInfoService.findCountHistory(ifParentUpdateTenantInfo(),dto);//每日新增会员数 | |||||
| SimpleDateFormat sdf; | |||||
| SimpleDateFormat fsdf; | |||||
| if (reportType.equals(EnumUserCountReportType.YEAR.getCode())) { | |||||
| sdf = new SimpleDateFormat("yyyy"); | |||||
| fsdf = new SimpleDateFormat("yyyy"); | |||||
| }else if (reportType.equals(EnumUserCountReportType.MONTH.getCode())) { | |||||
| sdf = new SimpleDateFormat("yyyy-MM"); | |||||
| fsdf = new SimpleDateFormat("yyyy-MM"); | |||||
| }else { | |||||
| sdf = new SimpleDateFormat("yyyy-MM-dd"); | |||||
| fsdf = new SimpleDateFormat("MM-dd"); | |||||
| } | |||||
| Date curTime = new Date(startTime.getTime()); | |||||
| do { | |||||
| UserCountVo memUc = new UserCountVo(); | |||||
| memUc.setReportTime(fsdf.format(curTime)); | |||||
| final Date ct = new Date(curTime.getTime()); | |||||
| if (ct.before(new Date()) || ct.equals(new Date())) { | |||||
| //会员 | |||||
| Optional<UserCountVo> opMemUserCountVo = | |||||
| memCounts.stream().filter(md -> md.getReportTime().equals(sdf.format(ct))).findFirst(); | |||||
| if (opMemUserCountVo.isPresent()) { | |||||
| memUc.setIncCount(opMemUserCountVo.get().getIncCount()); | |||||
| memUc.setTotalCount(opMemUserCountVo.get().getTotalCount()); | |||||
| } else { | |||||
| memUc.setIncCount(0L); | |||||
| memUc.setTotalCount(0L); | |||||
| } | |||||
| } | |||||
| memCountList.add(memUc); | |||||
| if (reportType.equals(EnumUserCountReportType.YEAR.getCode())) { | |||||
| curTime = addYear(curTime, 1); | |||||
| } else if (reportType.equals(EnumUserCountReportType.MONTH.getCode())) { | |||||
| curTime = addMonth(curTime, 1); | |||||
| } else { | |||||
| curTime = addDay(curTime, 1); | |||||
| } | |||||
| }while (curTime.before(endTime) || curTime.equals(endTime)); | |||||
| if (memCountList.size() > 0 | |||||
| && memCountList.get(0).getTotalCount() != null | |||||
| && memCountList.get(0).getTotalCount() == 0) { | |||||
| WxCUserBasicInfoDto pdto = new WxCUserBasicInfoDto(); | |||||
| pdto.setEndTime(startTime); | |||||
| memCountList.get(0).setTotalCount(wxCUserBasicInfoService.findCount(ifParentUpdateTenantInfo(),pdto)); | |||||
| } | |||||
| for (int i = 1; i < memCountList.size(); i++){ | |||||
| if ( memCountList.get(i).getTotalCount() != null && | |||||
| memCountList.get(i-1).getTotalCount() != null && | |||||
| memCountList.get(i).getTotalCount() < memCountList.get(i-1).getTotalCount()){ | |||||
| memCountList.get(i).setTotalCount(memCountList.get(i-1).getTotalCount()); | |||||
| } | |||||
| } | |||||
| return new ResultData(memCountList); | |||||
| } | |||||
| private Date addDay(Date date , int addDayAmount) { | |||||
| Calendar c = Calendar.getInstance(); | |||||
| c.setTime(date); | |||||
| c.add(Calendar.DATE, addDayAmount); | |||||
| Date result = c.getTime(); | |||||
| return result; | |||||
| } | |||||
| private Date addMonth(Date date, int addMountAmount) { | |||||
| Calendar c = Calendar.getInstance(); | |||||
| c.setTime(date); | |||||
| c.add(Calendar.MONTH, addMountAmount); | |||||
| Date result = c.getTime(); | |||||
| return result; | |||||
| } | |||||
| private Date addYear(Date date, int addYearAmount) { | |||||
| Calendar c = Calendar.getInstance(); | |||||
| c.setTime(date); | |||||
| c.add(Calendar.YEAR, addYearAmount); | |||||
| Date result = c.getTime(); | |||||
| return result; | |||||
| } | |||||
| } | |||||