套餐预约占比饼形图
需求分析
会员可以通过移动端自助进行体检预约,在预约时需要选择预约的体检套餐。本章节我们需要通过饼形图直观的展示出会员预约的各个套餐占比情况。展示效果如下图:
完善页面
套餐预约占比饼形图对应的页面为/pages/report_setmeal.html。
导入ECharts库
<script src="../plugins/echarts/echarts.js"></script>
参照官方实例导入饼形图
<div class="box">
<!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
<div id="chart1" style="height:600px;"></div>
</div>
<script type="text/javascript"> // 基于准备好的dom,初始化echarts实例 var myChart1 = echarts.init(document.getElementById('chart1')); //发送ajax请求获取动态数据 axios.get("/report/getSetmealReport.do").then((res)=>{ myChart1.setOption({ title : { text: '套餐预约占比', subtext: '', x:'center' }, tooltip : {//提示框组件 trigger: 'item',//触发类型,在饼形图中为item formatter: "{a} <br/>{b} : {c} ({d}%)"//提示内容格式 }, legend: { orient: 'vertical', left: 'left', data: res.data.data.setmealNames }, series : [ { name: '套餐预约占比', type: 'pie', radius : '55%', center: ['50%', '60%'], data:res.data.data.setmealCount, itemStyle: { emphasis: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } } } ] }); }); </script>
根据饼形图对数据格式的要求,我们发送ajax请求,服务端需要返回如下格式的数据:
{ "data":{ "setmealNames":["套餐1","套餐2","套餐3"], "setmealCount":[ {"name":"套餐1","value":10}, {"name":"套餐2","value":30}, {"name":"套餐3","value":25} ] }, "flag":true, "message":"获取套餐统计数据成功" }
后台代码
Controller
在health_backend工程的ReportController中提供getSetmealReport方法
@Reference private SetmealService setmealService; /** * 套餐占比统计 * @return */ @RequestMapping("/getSetmealReport") public Result getSetmealReport(){ List<Map<String, Object>> list = setmealService.findSetmealCount(); Map<String,Object> map = new HashMap<>(); map.put("setmealCount",list); List<String> setmealNames = new ArrayList<>(); for(Map<String,Object> m : list){ String name = (String) m.get("name"); setmealNames.add(name); } map.put("setmealNames",setmealNames); return new Result(true, MessageConstant.GET_SETMEAL_COUNT_REPORT_SUCCESS,map); }
服务接口
在SetmealService服务接口中扩展方法findSetmealCount
public List<Map<String,Object>> findSetmealCount();
服务实现类
在SetmealServiceImpl服务实现类中实现findSetmealCount方法
public List<Map<String, Object>> findSetmealCount() { return setmealDao.findSetmealCount(); }
Dao接口
在SetmealDao接口中扩展方法findSetmealCount
public List<Map<String,Object>> findSetmealCount();
Mapper映射文件
在SetmealDao.xml映射文件中提供SQL语句
<select id="findSetmealCount" resultType="map"> select s.name,count(o.id) as value from t_order o ,t_setmeal s where o.setmeal_id = s.id group by s.name </select>