package com.matrix.system.hiveErp.action; import com.matrix.core.constance.MatrixConstance; import com.matrix.core.pojo.AjaxResult; import com.matrix.core.tools.WebUtil; import com.matrix.system.common.bean.SysUsers; import com.matrix.system.common.tools.DataAuthUtil; import com.matrix.system.hive.bean.SysShopInfo; import com.matrix.system.hive.dao.SysShopInfoDao; import com.matrix.system.hiveErp.analysUtil.*; import com.matrix.system.hiveErp.dao.TjVipSumDao; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.util.*; /** * 会员数据分析 * @author jyy */ @Controller @RequestMapping(value = "admin/analysis") public class DataAnalysisCustomer { @Autowired TjVipSumDao tjVipSumDao; @Autowired SysShopInfoDao shopInfoDao; /** * 会员人头数统计 * 业务说明: * 人头指门店所有进店客户的总人数,同一个人在一段时间内无论进店几次都视为一次进店 * 比如:张三1个月来了3次做护理,李四来2次做护理,杨欢来2次做护理,但是只统计客户名字,那人头就是3个 * @param statisticsParam * @return */ @RequestMapping(value = "/customerHeadCompare") public @ResponseBody AjaxResult customerHeadCompare(StatisticsParamVo statisticsParam) { return getAnalysisResult(statisticsParam, new Caculate() { @Override public Map exec(List timeSpaceParam, Long shopId) { //从员工业绩统计表中,按时间段,门店的维度统计人头数 return tjVipSumDao.customerHeadCompare(timeSpaceParam,shopId); } }); } /** * 会员人次统计 * 业务说明: * 一个会员在一天进店一次或者多次即为一个人次 * @param statisticsParam * @return */ @RequestMapping(value = "/customerEnterCountCompare") public @ResponseBody AjaxResult customerEnterCountCompare(StatisticsParamVo statisticsParam) { return getAnalysisResult(statisticsParam, new Caculate() { @Override public Map exec(List timeSpaceParam, Long shopId) { //从员工业绩统计表中,按时间段,门店的维度统计人次 return tjVipSumDao.customerEnterCountCompare(timeSpaceParam,shopId); } }); } /** * 到店率 * 业务说明: * 门店所有客户人次数除以人头数 * @param statisticsParam * @return */ @RequestMapping(value = "/customerEnterRateCompare") public @ResponseBody AjaxResult customerEnterRateCompare(StatisticsParamVo statisticsParam) { return getAnalysisResult(statisticsParam, new Caculate() { @Override public Map exec(List timeSpaceParam, Long shopId) { //从员工业绩统计表中,按时间段,门店的维度统计人次 return tjVipSumDao.customerEnterRateCompare(timeSpaceParam,shopId); } }); } /** * 按店铺查询数据通用格式执行方法,支持时、日、月、年维度 * 如: A店铺 B店铺 * 2020-01-01 12 13 * 2020-02-02 10 11 * @param statisticsParam 时间条件 * @param caculate 循环调用caculate计算该店的数据 * 查询的数据需满足 只有一个门店只有一行 列名称为 t0,t1,t2 * @return */ private AjaxResult getAnalysisResult(StatisticsParamVo statisticsParam, Caculate caculate) { AjaxResult result = new AjaxResult(); //根据计算横坐标 List xAxis = StatisticsTimeUtil.getTimeSpace(statisticsParam.getBeginTime(), statisticsParam.getEndTime(), statisticsParam.getStatisticsUnit()); //获取所有门店 SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY); List shops=null; if(DataAuthUtil.hasAllShopAuth()){ shops= shopInfoDao.selectShopInfo(user.getCompanyId()); }else{ shops=Arrays.asList(shopInfoDao.selectById(user.getShopId())); } //定义数据项内容 List series=new ArrayList<>(); //定义数据主体 String[] legendData=new String[shops.size()]; int i=0; //按门店统计数据 List timeSpaceParam = StatisticsTimeUtil.buidParam(xAxis); for(SysShopInfo shop: shops){ legendData[i++]=shop.getShopName(); //数据项内容 SeriesVo storeInfoSeries=new SeriesVo(); storeInfoSeries.setName(shop.getShopName()); //调用计算器获取数据库统计的结果 Map yAxisMap = caculate.exec(timeSpaceParam,shop.getId()); //把统计结果转成数组格式 storeInfoSeries.setData(StatisticsTimeUtil.getSeries(yAxisMap)); series.add(storeInfoSeries); } //构造返回对象 Map data=new HashMap<>(); data.put("legendData",legendData); data.put("series",series); data.put("xAxis", StatisticsTimeUtil.getFormartDateList(xAxis,statisticsParam)); result.setMapInfo(data); result.setStatus(AjaxResult.STATUS_SUCCESS); return result; } }