|
|
|
@@ -7,11 +7,10 @@ import com.iformall.common.ResultData; |
|
|
|
import com.iformall.controller.base.BaseController; |
|
|
|
import com.iformall.domain.dto.WxCUserBasicInfoDto; |
|
|
|
import com.iformall.domain.po.*; |
|
|
|
import com.iformall.domain.vo.KwMeterDataVo; |
|
|
|
import com.iformall.domain.vo.UserCountVo; |
|
|
|
import com.iformall.domain.vo.UserStructureVo; |
|
|
|
import com.iformall.enums.EnumAgeInfo; |
|
|
|
import com.iformall.enums.EnumCUserBaseInfoSex; |
|
|
|
import com.iformall.enums.EnumScoreType; |
|
|
|
import com.iformall.enums.EnumTag; |
|
|
|
import com.iformall.enums.*; |
|
|
|
import com.iformall.service.*; |
|
|
|
import io.swagger.annotations.Api; |
|
|
|
import io.swagger.annotations.ApiImplicitParam; |
|
|
|
@@ -261,27 +260,51 @@ public class WxUserStructureController extends BaseController { |
|
|
|
} |
|
|
|
|
|
|
|
/********************************会员数据**************************************/ |
|
|
|
|
|
|
|
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; |
|
|
|
} |
|
|
|
|
|
|
|
@ApiOperation("查询会员数量") |
|
|
|
@GetMapping("/findUserDataCount") |
|
|
|
@SystemControllerLog(description = "会员管理-查询会员数量") |
|
|
|
public ResultData findUserCount(Date startTime, Date endTime) { |
|
|
|
|
|
|
|
final int daysBefore = 29; |
|
|
|
public ResultData findUserCount(Date startTime, Date endTime, Integer reportType) { |
|
|
|
logger.debug("[" + getIpAddr() + "] WxUserStructureController::findUserCount"); |
|
|
|
|
|
|
|
|
|
|
|
//昨日同比 |
|
|
|
Map<String, Object> map = new HashMap<>(); |
|
|
|
|
|
|
|
WxCUserBasicInfoDto dto = new WxCUserBasicInfoDto(); |
|
|
|
dto.setTenantId(getTenantId()); |
|
|
|
dto.setStartTime(startTime); |
|
|
|
dto.setEndTime(endTime); |
|
|
|
if (endTime != null) { |
|
|
|
Calendar c = Calendar.getInstance(); |
|
|
|
c.setTime(endTime); |
|
|
|
c.add(Calendar.DAY_OF_YEAR, 1); |
|
|
|
endTime = c.getTime(); |
|
|
|
} |
|
|
|
dto.setEndTime(new Date()); |
|
|
|
//微信用户数据 |
|
|
|
long wxTotalCount = wxCUserService.findCount(dto);//总量 |
|
|
|
//微信用户数据 |
|
|
|
long wxallCount = wxCUserService.findCount(dto);//总量 |
|
|
|
//会员数据 |
|
|
|
Map<String,Object> member=getMemberData(dto); |
|
|
|
long memTotalCount = wxCUserBasicInfoService.findCount(dto);//总量 |
|
|
|
|
|
|
|
map.put("wxTotalCount",wxTotalCount); |
|
|
|
map.put("memTotalCount",memTotalCount); |
|
|
|
|
|
|
|
Calendar c = Calendar.getInstance(); |
|
|
|
c.set(Calendar.HOUR_OF_DAY, 0); |
|
|
|
@@ -290,46 +313,12 @@ public class WxUserStructureController extends BaseController { |
|
|
|
Date today = c.getTime(); |
|
|
|
dto.setStartTime(today); |
|
|
|
dto.setEndTime(null); |
|
|
|
long wxtodayCount = wxCUserService.findCount(dto);//今天新增 |
|
|
|
List<UserStructureVo> wxnewCountVos = new ArrayList<>();//每日新增会员数 |
|
|
|
int j = 1; |
|
|
|
for (int i = daysBefore; i >= 0; i--) { |
|
|
|
c.clear(); |
|
|
|
c.setTime(today); |
|
|
|
c.add(Calendar.DAY_OF_YEAR, -i); |
|
|
|
dto.setStartTime(c.getTime()); |
|
|
|
c.add(Calendar.DAY_OF_YEAR, 1); |
|
|
|
dto.setEndTime(c.getTime()); |
|
|
|
long count = wxCUserService.findCount(dto); |
|
|
|
UserStructureVo vo = new UserStructureVo(); |
|
|
|
vo.setSortNum(j); |
|
|
|
j++; |
|
|
|
vo.setName(new SimpleDateFormat("MM/dd").format(dto.getStartTime())); |
|
|
|
vo.setCount(count); |
|
|
|
wxnewCountVos.add(vo); |
|
|
|
} |
|
|
|
List<UserStructureVo> wxallCountVos = new ArrayList<>();//累计会员数 |
|
|
|
c.clear(); |
|
|
|
c.setTime(today); |
|
|
|
c.add(Calendar.DAY_OF_YEAR, -daysBefore); |
|
|
|
dto.setEndTime(c.getTime()); |
|
|
|
dto.setStartTime(null); |
|
|
|
long firstDay = wxCUserService.findCount(dto);//统计的第一天总数 |
|
|
|
int i = 0; |
|
|
|
long sumCount = 0; |
|
|
|
for (UserStructureVo v : wxnewCountVos) { |
|
|
|
UserStructureVo vo = new UserStructureVo(); |
|
|
|
sumCount += v.getCount(); |
|
|
|
vo.setCount(firstDay + sumCount); |
|
|
|
vo.setName(v.getName()); |
|
|
|
vo.setSortNum(i + 1); |
|
|
|
wxallCountVos.add(vo); |
|
|
|
i++; |
|
|
|
} |
|
|
|
long wxTodayCount = wxCUserService.findCount(dto);//今天新增 |
|
|
|
long memTodayCount = wxCUserBasicInfoService.findCount(dto);//今天新增 |
|
|
|
|
|
|
|
map.put("wxTodayCount",wxTodayCount); |
|
|
|
map.put("memTodayCount",memTodayCount); |
|
|
|
|
|
|
|
//昨日同比 |
|
|
|
Map<String, Object> map = new HashMap<>(); |
|
|
|
//昨日同比 |
|
|
|
c.clear(); |
|
|
|
c.setTime(today); |
|
|
|
@@ -337,98 +326,137 @@ public class WxUserStructureController extends BaseController { |
|
|
|
dto.setStartTime(c.getTime()); |
|
|
|
c.add(Calendar.DAY_OF_YEAR, 1); |
|
|
|
dto.setEndTime(c.getTime()); |
|
|
|
long yesterdayCount = wxCUserService.findCount(dto); |
|
|
|
if(yesterdayCount>0){ |
|
|
|
double yesterday=(double) (wxtodayCount-yesterdayCount)/yesterdayCount*100; |
|
|
|
long wxYesterdayCount = wxCUserService.findCount(dto); |
|
|
|
long memYesterdayCount = wxCUserBasicInfoService.findCount(dto); |
|
|
|
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","--%"); |
|
|
|
map.put("wxhb", zrhb + "%"); |
|
|
|
} else { |
|
|
|
map.put("wxhb", "--%"); |
|
|
|
} |
|
|
|
if (memYesterdayCount > 0) { |
|
|
|
double yesterday = (double) (wxTodayCount - memYesterdayCount) / memYesterdayCount * 100; |
|
|
|
double zrhb = new BigDecimal(yesterday).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); |
|
|
|
map.put("memhb", zrhb + "%"); |
|
|
|
} else { |
|
|
|
map.put("memhb", "--%"); |
|
|
|
} |
|
|
|
map.put("wxallCount", wxallCount);//累计会员总数 |
|
|
|
map.put("wxtodayCount", wxtodayCount);//今日新增会员数 |
|
|
|
map.put("wxallCountVos", wxallCountVos);//累计会员列表( 日期和数量list) |
|
|
|
map.put("wxnewCountVos", wxnewCountVos);//新增会员列表(日期和数量list) |
|
|
|
map.putAll(member); |
|
|
|
return new ResultData(map); |
|
|
|
} |
|
|
|
|
|
|
|
private Map<String,Object> getMemberData(WxCUserBasicInfoDto dto) { |
|
|
|
final int daysBefore = 29; |
|
|
|
long allCount = wxCUserBasicInfoService.findCount(dto);//总量 |
|
|
|
|
|
|
|
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 todayCount = wxCUserBasicInfoService.findCount(dto);//今天新增 |
|
|
|
List<UserStructureVo> newCountVos = new ArrayList<>();//每日新增会员数 |
|
|
|
int j = 1; |
|
|
|
for (int i = daysBefore; i >= 0; i--) { |
|
|
|
c.clear(); |
|
|
|
c.setTime(today); |
|
|
|
c.add(Calendar.DAY_OF_YEAR, -i); |
|
|
|
dto.setStartTime(c.getTime()); |
|
|
|
c.add(Calendar.DAY_OF_YEAR, 1); |
|
|
|
dto.setEndTime(c.getTime()); |
|
|
|
long count = wxCUserBasicInfoService.findCount(dto); |
|
|
|
UserStructureVo vo = new UserStructureVo(); |
|
|
|
vo.setSortNum(j); |
|
|
|
j++; |
|
|
|
vo.setName(new SimpleDateFormat("MM/dd").format(dto.getStartTime())); |
|
|
|
vo.setCount(count); |
|
|
|
newCountVos.add(vo); |
|
|
|
if (startTime == null || endTime == null) { |
|
|
|
startTime = addMonth(new Date(), -1); |
|
|
|
endTime = new Date(); |
|
|
|
reportType = EnumUserCountReportType.DAY.getCode(); |
|
|
|
} |
|
|
|
List<UserStructureVo> allCountVos = new ArrayList<>();//累计会员数 |
|
|
|
c.clear(); |
|
|
|
c.setTime(today); |
|
|
|
c.add(Calendar.DAY_OF_YEAR, -daysBefore); |
|
|
|
dto.setEndTime(c.getTime()); |
|
|
|
dto.setStartTime(null); |
|
|
|
long firstDay = wxCUserBasicInfoService.findCount(dto);//统计的第一天总数 |
|
|
|
int i = 0; |
|
|
|
long sumCount = 0; |
|
|
|
for (UserStructureVo v : newCountVos) { |
|
|
|
UserStructureVo vo = new UserStructureVo(); |
|
|
|
sumCount += v.getCount(); |
|
|
|
vo.setCount(firstDay + sumCount); |
|
|
|
vo.setName(v.getName()); |
|
|
|
vo.setSortNum(i + 1); |
|
|
|
allCountVos.add(vo); |
|
|
|
i++; |
|
|
|
|
|
|
|
dto.setTenantId(getTenantId()); |
|
|
|
dto.setStartTime(startTime); |
|
|
|
dto.setEndTime(endTime); |
|
|
|
dto.setReportType(reportType); |
|
|
|
|
|
|
|
List<UserCountVo> wxCountList = new ArrayList<>();//每日新增会员数 |
|
|
|
List<UserCountVo> wxCounts = wxCUserService.findCountHistory(dto);//每日新增会员数 |
|
|
|
List<UserCountVo> memCountList = new ArrayList<>();//每日新增会员数 |
|
|
|
List<UserCountVo> memCounts = wxCUserBasicInfoService.findCountHistory(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 wxUc = new UserCountVo(); |
|
|
|
UserCountVo memUc = new UserCountVo(); |
|
|
|
wxUc.setReportTime(fsdf.format(curTime)); |
|
|
|
memUc.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); |
|
|
|
} |
|
|
|
|
|
|
|
Map<String, Object> map = new HashMap<>(); |
|
|
|
//昨日同比 |
|
|
|
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 yesterdayCount = wxCUserService.findCount(dto); |
|
|
|
if(yesterdayCount>0){ |
|
|
|
double yesterday=(double) (todayCount-yesterdayCount)/yesterdayCount*100; |
|
|
|
double zrhb = new BigDecimal(yesterday).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); |
|
|
|
map.put("hb",zrhb+"%"); |
|
|
|
}else{ |
|
|
|
map.put("hb","--%"); |
|
|
|
} |
|
|
|
|
|
|
|
//会员 |
|
|
|
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); |
|
|
|
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); |
|
|
|
} |
|
|
|
|
|
|
|
map.put("allCount", allCount);//累计会员总数 |
|
|
|
map.put("todayCount", todayCount);//今日新增会员数 |
|
|
|
map.put("allCountVos", allCountVos);//累计会员列表( 日期和数量list) |
|
|
|
map.put("newCountVos", newCountVos);//新增会员列表(日期和数量list) |
|
|
|
}while (curTime.before(endTime)); |
|
|
|
|
|
|
|
return map; |
|
|
|
|
|
|
|
if (wxCountList.size() > 0 |
|
|
|
&& wxCountList.get(0).getTotalCount() != null |
|
|
|
&& wxCountList.get(0).getTotalCount() == 0) { |
|
|
|
WxCUserBasicInfoDto pdto = new WxCUserBasicInfoDto(); |
|
|
|
pdto.setTenantId(getTenantId()); |
|
|
|
pdto.setEndTime(startTime); |
|
|
|
wxCountList.get(0).setTotalCount(wxCUserService.findCount(pdto)); |
|
|
|
} |
|
|
|
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()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (memCountList.size() > 0 |
|
|
|
&& memCountList.get(0).getTotalCount() != null |
|
|
|
&& memCountList.get(0).getTotalCount() == 0) { |
|
|
|
WxCUserBasicInfoDto pdto = new WxCUserBasicInfoDto(); |
|
|
|
pdto.setTenantId(getTenantId()); |
|
|
|
pdto.setEndTime(startTime); |
|
|
|
memCountList.get(0).setTotalCount(wxCUserBasicInfoService.findCount(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()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
map.put("wxCountList", wxCountList);//累计/新增用户列表( 日期和数量list) |
|
|
|
map.put("memCountList", memCountList);//累计/新增会员列表( 日期和数量list) |
|
|
|
|
|
|
|
return new ResultData(map); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ApiOperation("拓客分析") |
|
|
|
@GetMapping("/findUserByChannel") |
|
|
|
@ApiImplicitParams({ |
|
|
|
|