柱状图展示异步统计数据

2024-04-24 03:12

本文主要是介绍柱状图展示异步统计数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PC端

 APP端

 Controller层

package com.cnpc.dj.party.controller;import com.alibaba.fastjson.JSONObject;
import com.cnpc.dj.common.JsonResult;
import com.cnpc.dj.common.context.BaseContextHandler;
import com.cnpc.dj.common.utils.DateUtils;
import com.cnpc.dj.party.common.ReturnExamEnum;
import com.cnpc.dj.party.service.GridDataStatisticService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;@Slf4j
@CrossOrigin
@RestController
@RequestMapping("/dataStatistic")
public class GridDataStatisticController {@Autowiredprivate GridDataStatisticService gridDataStatisticService ;@PostMapping("/doStatisticForGrid")public JsonResult<?> doStatisticForGrid(@RequestBody JSONObject requestBody) {// 检查入参合法性.BigDecimal orgId = requestBody.getBigDecimal("orgId");if (Objects.isNull(orgId)) {return JsonResult.error(ReturnExamEnum.GRID_ILLEGAL_ARGUMENT, "必要参数<orgId>未填写");}BigDecimal tenantId = BaseContextHandler.getDecimalTenantId();long beginTime = System.currentTimeMillis();log.info("\n[ {} ][ 网格员 - 数据统计任务 ]: 开始所有任务(当前租户ID: {} ).", DateUtils.format(new Date(beginTime), "yyyy年MM月dd日 HH时mm分ss秒 SSS毫秒"), tenantId);// 创建统计结果容器.JSONObject result = new JSONObject();// 创建异步统计任务: 调用各统计方法.CompletableFuture<?> task1 = gridDataStatisticService.gridNumberAsyncStatistic(tenantId, orgId, result);CompletableFuture<?> task2 = gridDataStatisticService.gridPersonNumberAsyncStatistic(tenantId, orgId, result);// 等待, 直到所有任务执行完毕.CompletableFuture.allOf(task1,task2).join();long endTime = System.currentTimeMillis();log.info("\n[ {} ][ 网格员 - 数据统计任务 ]: 所有任务完成, 总计耗时 {} 毫秒.", DateUtils.format(new Date(endTime), "yyyy年MM月dd日 HH时mm分ss秒 SSS毫秒"), endTime - beginTime);// 返回统计结果.return JsonResult.success(result);}
}

Service层 

package com.cnpc.dj.party.service;import com.alibaba.fastjson.JSONObject;
import com.cnpc.dj.common.utils.DateUtils;
import com.cnpc.dj.party.common.EChartsResult;
import com.cnpc.dj.party.common.KeyValuePair;
import com.cnpc.dj.party.repository.GridDataStatisticMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;@Service
@Slf4j
public class GridDataStatisticService {@Autowiredprivate GridDataStatisticMapper gridDataStatisticMapper;private static String convert(long timeMillis) {return DateUtils.format(new Date(timeMillis), "yyyy年MM月dd日 HH时mm分ss秒 SSS毫秒");}/*** 获取网格信息* @param orgId 入参: 组织ID.* @return 统计结果.*/@Asyncpublic CompletableFuture<?> gridNumberAsyncStatistic(BigDecimal tenantId, BigDecimal orgId, JSONObject parent) {long t0 = System.currentTimeMillis();log.info("\n[ {} ][ 网格情况 ][ 网格数量统计 ]: 任务开始.", convert(t0));// 查询数据库, 获取原始数据List<KeyValuePair<BigDecimal>> list = gridDataStatisticMapper.statisticGrid(tenantId, orgId);long t1 = System.currentTimeMillis();log.info("\n[ {} ][ 网格情况 ][ 网格数量统计 ]: 原始数据查询成功: 本步耗时 {} 毫秒, 总计耗时 {} 毫秒.", convert(t1),t1 - t0,t1 - t0);// 初始化查询结果容器.// 初始化查询结果容器.管理类,科研类,生产经营类,项目建设类,生产作业类,网格总数String[] mapEntry = {"Manage", "Scientific", "ProductionOperation", "ProjectBuild","FlowHomework", "GridTotal"};EChartsResult result = new EChartsResult();result.init(null, mapEntry, null);BigDecimal gridTotal = BigDecimal.ZERO;// 处理原始数据, 填充查询结果容器.for (KeyValuePair<BigDecimal> item : list) {if (Objects.nonNull(item.getKey())) {switch (item.getKey()) {case "1":result.addToMap(mapEntry[0], item.getValue());gridTotal = gridTotal.add(item.getValue());break;case "2":result.addToMap(mapEntry[1], item.getValue());gridTotal = gridTotal.add(item.getValue());break;case "3":result.addToMap(mapEntry[2], item.getValue());gridTotal = gridTotal.add(item.getValue());break;case "4":result.addToMap(mapEntry[3], item.getValue());gridTotal = gridTotal.add(item.getValue());break;default:result.addToMap(mapEntry[4], item.getValue());gridTotal = gridTotal.add(item.getValue());}}}result.addToMap(mapEntry[5], gridTotal);// 返回查询结果.parent.put("GridStatistic", result.getMap());long t2 = System.currentTimeMillis();log.info("\n[ {} ][ 网格情况 ][ 网格数量统计 ]: 数据处理完成, 任务结束: 本步耗时 {} 毫秒, 总计耗时 {} 毫秒.", convert(t2), t2 - t1,t2 - t0);return CompletableFuture.completedFuture(parent);}/*** 获取网格人员信息* @param orgId 入参: 组织ID.* @return 统计结果.*/@Asyncpublic CompletableFuture<?> gridPersonNumberAsyncStatistic(BigDecimal tenantId, BigDecimal orgId, JSONObject parent) {long t0 = System.currentTimeMillis();log.info("\n[ {} ][ 网格人员情况 ][ 网格人数统计 ]: 任务开始.", convert(t0));// 查询数据库, 获取原始数据List<KeyValuePair<BigDecimal>> list = gridDataStatisticMapper.statisticGridPerson(tenantId, orgId);long t1 = System.currentTimeMillis();log.info("\n[ {} ][ 网格人员情况 ][ 网格人数统计 ]: 原始数据查询成功: 本步耗时 {} 毫秒, 总计耗时 {} 毫秒.", convert(t1),t1 - t0,t1 - t0);// 初始化查询结果容器.// 初始化查询结果容器.管理类,科研类,生产经营类,项目建设类,生产作业类,网格人员总数String[] mapEntry = {"Manage", "Scientific", "ProductionOperation", "ProjectBuild","FlowHomework", "GridPersonTotal"};EChartsResult result = new EChartsResult();result.init(null, mapEntry, null);BigDecimal gridTotal = BigDecimal.ZERO;// 处理原始数据, 填充查询结果容器.for (KeyValuePair<BigDecimal> item : list) {if (Objects.nonNull(item.getKey())) {switch (item.getKey()) {case "1":result.addToMap(mapEntry[0], item.getValue());gridTotal = gridTotal.add(item.getValue());break;case "2":result.addToMap(mapEntry[1], item.getValue());gridTotal = gridTotal.add(item.getValue());break;case "3":result.addToMap(mapEntry[2], item.getValue());gridTotal = gridTotal.add(item.getValue());break;case "4":result.addToMap(mapEntry[3], item.getValue());gridTotal = gridTotal.add(item.getValue());break;default:result.addToMap(mapEntry[4], item.getValue());gridTotal = gridTotal.add(item.getValue());}}}result.addToMap(mapEntry[5], gridTotal);// 返回查询结果.parent.put("GridPersonStatistic", result.getMap());long t2 = System.currentTimeMillis();log.info("\n[ {} ][ 网格人员情况 ][ 网格人数统计 ]: 数据处理完成, 任务结束: 本步耗时 {} 毫秒, 总计耗时 {} 毫秒.", convert(t2), t2 - t1,t2 - t0);return CompletableFuture.completedFuture(parent);}
}

Mapper层

package com.cnpc.dj.party.repository;import com.cnpc.dj.party.common.KeyValuePair;
import org.apache.ibatis.annotations.Mapper;import java.math.BigDecimal;
import java.util.List;@Mapper
public interface GridDataStatisticMapper {/*** 统计网格数量* @param tenantId* @param orgId* @return K V*/List<KeyValuePair<BigDecimal>> statisticGrid(BigDecimal tenantId, BigDecimal orgId);/*** 统计网格人数* @param tenantId* @param orgId* @return K V*/List<KeyValuePair<BigDecimal>> statisticGridPerson(BigDecimal tenantId, BigDecimal orgId);
}

 Mapper.xml层

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.cnpc.dj.party.repository.GridDataStatisticMapper"><resultMap id="KeyValuePair" type="com.cnpc.dj.party.common.KeyValuePair"><result column="K" property="key" jdbcType="VARCHAR" javaType="java.lang.String"/><result column="V" property="value" jdbcType="INTEGER" javaType="java.math.BigDecimal"/></resultMap><select id="statisticGrid" parameterType="java.math.BigDecimal" resultMap="KeyValuePair">SELECT G.GRID_CLASS k,COUNT(*)     vFROM ZHONGHY_ONLINE_ANSWERS.DJ_GRID GWHERE G.IS_DELETE = '0'AND  G.ORG_CODE IN (SELECT o.ORG_CODEFROM ZHONGHY_BASIC_INFO.DJ_ORG OWHERE o.is_delete = '0'AND o.is_del_org = '0'AND o.tenant_id = #{tenantId, jdbcType=DECIMAL}AND !REGEXP_LIKE(o.org_code, '^(000.001|000.002)')CONNECT BY PRIOR o.id = o.parent_idSTART WITH o.id = #{orgId, jdbcType=DECIMAL})GROUP BY G.GRID_CLASSORDER BY G.GRID_CLASS</select><select id="statisticGridPerson" parameterType="java.math.BigDecimal" resultMap="KeyValuePair">SELECT G.GRID_CLASS k,COUNT(*)     vFROM ZHONGHY_ONLINE_ANSWERS.DJ_GRID_RANGE RLEFT JOIN ZHONGHY_ONLINE_ANSWERS.DJ_GRID GON R.GRID_ID = G.ID AND R.IS_DELETE = '0'WHERE G.IS_DELETE = '0'AND G.ORG_CODE IN (SELECT o.ORG_CODEFROM ZHONGHY_BASIC_INFO.DJ_ORG OWHERE o.is_delete = '0'AND o.is_del_org = '0'AND o.tenant_id = #{tenantId, jdbcType=DECIMAL}AND !REGEXP_LIKE(o.org_code, '^(000.001|000.002)')CONNECT BY PRIOR o.id = o.parent_idSTART WITH o.id = #{orgId, jdbcType=DECIMAL})GROUP BY G.GRID_CLASSORDER BY G.GRID_CLASS</select>
</mapper>

  公共类EChartsResult

package com.cnpc.dj.party.common;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.math.BigDecimal;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.LinkedList;/*** 陕西信合 - 数据统计.*/
public class EChartsResult {public static final Comparator<? super Entry> VALUE_ASC = Comparator.comparing(Entry::getValue);public static final Comparator<? super Entry> VALUE_DESC = (Entry o1, Entry o2) -> o2.getValue().compareTo(o1.getValue());private Comparator<? super Entry> comparator;private LinkedHashMap<String, Entry> entryMap;private LinkedHashMap<String, BigDecimal> valueMap;private BigDecimal total;public void init(String[] names, String[] keys, Comparator<? super Entry> comparator) {// 初始化EntryMapif (names != null && names.length > 0) {this.entryMap = new LinkedHashMap<>(names.length);for (String name : names) {this.entryMap.put(name, new Entry(name, BigDecimal.ZERO, null));}}// 初始化ValueMapif (keys != null && keys.length > 0) {this.valueMap = new LinkedHashMap<>(keys.length);for (String key : keys) {this.valueMap.put(key, BigDecimal.ZERO);}}// 设置Comparatorthis.comparator = comparator;}public void setComparator(Comparator<? super Entry> comparator) {this.comparator = comparator;}public void addToList(String name, BigDecimal value) {if (this.entryMap == null) {this.entryMap = new LinkedHashMap<>();}if (this.entryMap.containsKey(name)) {this.entryMap.get(name).addValue(value);} else {this.entryMap.put(name, new Entry(name, value, null));}}public void addToMap(String key, BigDecimal value) {if (this.valueMap == null) {this.valueMap = new LinkedHashMap<>();}this.valueMap.put(key, this.valueMap.containsKey(key)? this.valueMap.get(key).add(value): value);}public void calculate() {this.calculateTotal();this.calculatePercent();}public void calculate(BigDecimal total) {this.calculateTotal();this.calculatePercent(total);}private void calculateTotal() {if (this.entryMap != null) {// 初始化Total.this.total = BigDecimal.ZERO;// 累加求和.for (Entry entry : this.entryMap.values()) {this.total = this.total.add(entry.getValue());}}}private void calculatePercent() {if (this.entryMap != null) {// 若Total未初始化, 则先计算Total.if (this.total == null) {this.calculateTotal();}// 遍历EntryMap的所有项目, 计算百分比.this.entryMap.values().forEach(entry -> entry.calculatePercent(this.total));}}private void calculatePercent(BigDecimal total) {if (this.entryMap != null) {// 遍历EntryMap的所有项目, 计算百分比.this.entryMap.values().forEach(entry -> entry.calculatePercent(total));}}public void buildMap() {this.calculate();LinkedList<Entry> list = this.getList();if (list != null) {for (Entry entry : list) {this.addToMap(entry.getName(), entry.getValue());this.addToMap(entry.getName() + "Percent", entry.getPercent());}this.addToMap("Total", this.total);}}public LinkedList<Entry> getList() {if (this.entryMap != null) {LinkedList<Entry> list = new LinkedList<>(this.entryMap.values());if (this.comparator != null) {list.sort(this.comparator);}return list;}return null;}public LinkedHashMap<String, BigDecimal> getMap() {return this.valueMap;}public BigDecimal getTotal() {return this.total;}/*** ECharts 统计列表项.** @author wangzijie05@cnpc.com.cn* @since 2019-03-15*/@Data@NoArgsConstructor@AllArgsConstructorpublic class Entry {private String name;private BigDecimal value;private BigDecimal percent;void addValue(BigDecimal augend) {this.value = this.value.add(augend);}void calculatePercent(BigDecimal total) {if (BigDecimal.ZERO.equals(total)) {this.percent = BigDecimal.ZERO;} else {this.percent = this.value.abs().divide(total, 10, BigDecimal.ROUND_HALF_UP);}}}
}

 公共类KeyValuePair

package com.cnpc.dj.party.common;import lombok.Data;@Data
public class KeyValuePair<T> {private String key;private T value;}

 postman测试

这篇关于柱状图展示异步统计数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/930609

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

Python使用asyncio实现异步操作的示例

《Python使用asyncio实现异步操作的示例》本文主要介绍了Python使用asyncio实现异步操作的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录1. 基础概念2. 实现异步 I/O 的步骤2.1 定义异步函数2.2 使用 await 等待异

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

起点中文网防止网页调试的代码展示

起点中文网对爬虫非常敏感。如图,想在页面启用调试后会显示“已在调试程序中暂停”。 选择停用断点并继续运行后会造成cpu占用率升高电脑卡顿。 经简单分析网站使用了js代码用于防止调试并在强制继续运行后造成电脑卡顿,代码如下: function A(A, B) {if (null != B && "undefined" != typeof Symbol && B[Symbol.hasInstan

AsyncTask 异步任务解析

1:构建AsyncTask 子类的回调方法: A:doInBackground:   必须重写,所有的耗时操作都在这个里面进行; B: onPreExecute:     用户操作数据前的调用; 例如:显示一个进度条 等 ; C: onPostExecute:    当doInBackground 执行完成后;会自动把数据传给onPostExecute方法;也就是说:这个方法是处理返回的数据的方法

使用Node-API进行异步任务开发

一、Node-API异步任务机制概述         Node-API异步任务开发主要用于执行耗时操作的场景中使用,以避免阻塞主线程,确保应用程序的性能和响应效率。         1、应用场景: 文件操作:读取大型文件或执行复杂的文件操作时,可以使用异步工作项来避免阻塞主线程。网络请求:当需要进行网络请求并等待响应时,可以使用异步工作项来避免阻塞主线程,从而提高应用程序的响应性能。数据库操

通过Ajax请求后台数据,返回JSONArray(JsonObject),页面(Jquery)以table的形式展示

点击“会商人员情况表”,弹出层,显示一个表格,如下图: 利用Ajax和Jquery和JSONArray和JsonObject来实现: 代码如下: 在hspersons.html中: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>会商人员情况表</title><script type="text/javasc

Jasperreports+jaspersoft studio 实现单个或多个jrxml(jasper)文件生成一个pdf文件,并利用Servlet发送该pdf文件到浏览器中展示

Jasperreports+jaspersoft studio 实现单个或多个jrxml(jasper)文件生成一个pdf文件,并利用Servlet发送该pdf文件到浏览器中展示; 代码如下: Demo07.jrxml <?xml version="1.0" encoding="UTF-8"?><!-- Created with Jaspersoft Studio version 6.6.