健康项目之套餐预约占比饼形图

举报
tea_year 发表于 2025/10/29 15:31:31 2025/10/29
【摘要】 ECharts缩写来自Enterprise Charts,商业级数据图表,是百度的一个开源的使用JavaScript实现的数据可视化工具,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的矢量图形库 ZRender,提供直观、交互丰富、可高度个性化定制的数据可视化图表。

ECharts缩写来自Enterprise Charts,商业级数据图表,是百度的一个开源的使用JavaScript实现的数据可视化工具,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的矢量图形库 ZRender,提供直观、交互丰富、可高度个性化定制的数据可视化图表。

1. 套餐预约占比饼形图

1.1 需求分析

会员可以通过移动端自助进行体检预约,在预约时需要选择预约的体检套餐。本章节我们需要通过饼形图直观的展示出会员预约的各个套餐占比情况。展示效果如下图:

1.png

1.2 完善页面

套餐预约占比饼形图对应的页面为/pages/report_setmeal.html。

1.2.1 导入ECharts库

<script src="../plugins/echarts/echarts.js"></script>

1.2.2 参照官方实例导入饼形图

<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":"获取套餐统计数据成功"
}

1.3 后台代码

1.3.1 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);
}

1.3.2 服务接口

在SetmealService服务接口中扩展方法findSetmealCount

public List<Map<String,Object>> findSetmealCount();

1.3.3 服务实现类

在SetmealServiceImpl服务实现类中实现findSetmealCount方法

public List<Map<String, Object>> findSetmealCount() {
 return setmealDao.findSetmealCount();
}

1.3.4 Dao接口

在SetmealDao接口中扩展方法findSetmealCount

public List<Map<String,Object>> findSetmealCount();

1.3.5 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>

总结

该功能通过 ECharts 饼形图直观展示各体检套餐的预约占比,核心是前后端协同完成数据统计与可视化呈现。​
前端在 report_setmeal.html 页面,先导入 ECharts 库并创建固定高度的 DOM 容器,初始化图表实例后,通过 Axios 发送 GET 请求至 /report/getSetmealReport.do 接口。拿到返回数据后,按饼形图配置 option:将 setmealNames 设为图例与提示框数据,setmealCount(含套餐名与预约数的对象数组)作为系列数据,同时配置阴影强调等样式,实现占比可视化。​
后端 ReportController 的 getSetmealReport 方法,调用 SetmealService 的 findSetmealCount 获取统计数据;服务层直接调用 Dao 层同名方法;Dao 层通过 SQL 关联 t_order 与 t_setmeal 表,按套餐名分组统计预约数,返回 “name - 套餐名、value - 预约数” 的 Map 列表。最终后端整理出 setmealNames 与 setmealCount,返回符合前端需求的数据集,完成套餐预约占比展示。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。