734 lines
26 KiB
JavaScript
734 lines
26 KiB
JavaScript
|
||
// 订单列表逻辑
|
||
(function() {
|
||
// 存储 Token
|
||
let authToken = '';
|
||
|
||
// 登录并获取订单数据
|
||
function loginAndFetchOrders() {
|
||
// 如果已有 Token,直接获取订单
|
||
if (authToken) {
|
||
fetchOrders();
|
||
return;
|
||
}
|
||
|
||
// 登录接口
|
||
$.ajax({
|
||
url: '/api/login',
|
||
method: 'POST',
|
||
contentType: 'application/json',
|
||
data: JSON.stringify({
|
||
mobile: '18888888888', // 请替换为真实账号
|
||
password: '123456', // 请替换为真实密码
|
||
loginType: 0
|
||
}),
|
||
success: function(res) {
|
||
console.log('登录接口完整响应:', res);
|
||
// 兼容多种 Token 返回结构
|
||
// 1. res.data.tokenValue (Sa-Token 常见)
|
||
// 2. res.data.token (常见 JWT)
|
||
// 3. res.token (根层级)
|
||
// 4. res.data (直接返回字符串)
|
||
let token = '';
|
||
if (res && res.code === 200) {
|
||
if (res.data && res.data.tokenValue) {
|
||
token = res.data.tokenValue;
|
||
} else if (res.data && res.data.token) {
|
||
token = res.data.token;
|
||
} else if (res.token) {
|
||
token = res.token;
|
||
} else if (typeof res.data === 'string') {
|
||
token = res.data;
|
||
}
|
||
}
|
||
|
||
if (token) {
|
||
authToken = token;
|
||
console.log('登录成功,获取到Token:', authToken);
|
||
fetchOrders();
|
||
fetchCattleOverview();
|
||
fetchSlaughterOverview();
|
||
} else {
|
||
console.error('登录成功但未能提取Token,请检查响应结构:', res);
|
||
}
|
||
},
|
||
error: function(err) {
|
||
console.error('登录请求错误:', err);
|
||
}
|
||
});
|
||
}
|
||
|
||
// 获取订单列表
|
||
function fetchOrders() {
|
||
if (!authToken) return;
|
||
|
||
$.ajax({
|
||
url: '/api/delivery/pageQueryList',
|
||
method: 'POST', // 假设是 POST 分页查询
|
||
contentType: 'application/json',
|
||
headers: {
|
||
'Authorization': authToken,
|
||
// 或者根据后端要求可能是其他 header key,如 satoken
|
||
'satoken': authToken
|
||
},
|
||
data: JSON.stringify({
|
||
pageNo: 1,
|
||
pageSize: 300,
|
||
interfaceType: 2
|
||
}),
|
||
success: function(res) {
|
||
console.log('订单列表响应:', res);
|
||
let list = [];
|
||
if (res && res.data && Array.isArray(res.data.rows)) {
|
||
// 适配 { code: 200, data: { rows: [...] } } 结构
|
||
list = res.data.rows;
|
||
} else if (res && res.data && Array.isArray(res.data.records)) {
|
||
// 适配 { code: 200, data: { records: [...] } } 结构
|
||
list = res.data.records;
|
||
} else if (res && Array.isArray(res.data)) {
|
||
// 适配 { code: 200, data: [...] } 结构
|
||
list = res.data;
|
||
}
|
||
|
||
renderOrderList(list);
|
||
renderOrderStatusStats(list);
|
||
updateMapWithFlyLines(list);
|
||
},
|
||
error: function(err) {
|
||
console.error('获取订单列表失败:', err);
|
||
if (err.status === 401) {
|
||
// Token 过期,重新登录
|
||
authToken = '';
|
||
loginAndFetchOrders();
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
function renderOrderStatusStats(orders) {
|
||
if (!orders || !Array.isArray(orders)) return;
|
||
|
||
let pendingCount = 0; // status: 1
|
||
let shippingCount = 0; // status: 2
|
||
let doneCount = 0; // status: 3
|
||
|
||
orders.forEach(order => {
|
||
const status = parseInt(order.status);
|
||
if (status === 1) {
|
||
pendingCount++;
|
||
} else if (status === 2) {
|
||
shippingCount++;
|
||
} else if (status === 3) {
|
||
doneCount++;
|
||
}
|
||
});
|
||
|
||
// 更新 DOM
|
||
$('.stat-value[data-field="status_pending"]').text(pendingCount);
|
||
$('.stat-value[data-field="status_shipping"]').text(shippingCount);
|
||
$('.stat-value[data-field="status_done"]').text(doneCount);
|
||
}
|
||
|
||
function updateMapWithFlyLines(data) {
|
||
if (!data || !Array.isArray(data)) return;
|
||
|
||
const flyLineData = [];
|
||
const pointMap = new Map(); // 用于去重地点
|
||
|
||
data.forEach(item => {
|
||
// startLon, startLat, endLon, endLat
|
||
if (item.startLon && item.startLat && item.endLon && item.endLat) {
|
||
// 1. 飞线数据
|
||
flyLineData.push({
|
||
fromName: item.startLocation || item.startAddress || '',
|
||
toName: item.endLocation || item.endAddress || '',
|
||
coords: [
|
||
[parseFloat(item.startLon), parseFloat(item.startLat)], // 起点
|
||
[parseFloat(item.endLon), parseFloat(item.endLat)] // 终点
|
||
]
|
||
});
|
||
|
||
// 2. 起点数据 (用于显示名称)
|
||
const startName = item.startLocation || item.startAddress || '';
|
||
if (startName) {
|
||
const startKey = `${startName}_${item.startLon}_${item.startLat}`;
|
||
if (!pointMap.has(startKey)) {
|
||
pointMap.set(startKey, {
|
||
name: startName,
|
||
value: [parseFloat(item.startLon), parseFloat(item.startLat)]
|
||
});
|
||
}
|
||
}
|
||
|
||
// 3. 终点数据 (用于显示名称)
|
||
const endName = item.endLocation || item.endAddress || '';
|
||
if (endName) {
|
||
const endKey = `${endName}_${item.endLon}_${item.endLat}`;
|
||
if (!pointMap.has(endKey)) {
|
||
pointMap.set(endKey, {
|
||
name: endName,
|
||
value: [parseFloat(item.endLon), parseFloat(item.endLat)]
|
||
});
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
// 更新 option8 (全局变量)
|
||
if (typeof option8 !== 'undefined') {
|
||
// series[1] 是线路
|
||
if (option8.series && option8.series[1]) {
|
||
option8.series[1].data = flyLineData;
|
||
}
|
||
|
||
// series[3] 是运单地点 (我们在 chartMap.js 中新加的)
|
||
if (option8.series && option8.series[3]) {
|
||
option8.series[3].data = Array.from(pointMap.values());
|
||
}
|
||
|
||
// 尝试获取 echarts 实例并更新
|
||
if (typeof myChart8 !== 'undefined') {
|
||
myChart8.setOption(option8);
|
||
} else if (window.myChart8) {
|
||
window.myChart8.setOption(option8);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 存储滚动定时器,防止重复创建
|
||
let orderScrollTimer = null;
|
||
|
||
function renderOrderList(orders) {
|
||
const container = $('.order_list_content');
|
||
if (container.length === 0) return;
|
||
|
||
// 清除旧的定时器和事件监听
|
||
if (orderScrollTimer) {
|
||
clearInterval(orderScrollTimer);
|
||
orderScrollTimer = null;
|
||
}
|
||
container.off('mouseenter mouseleave');
|
||
|
||
let html = '';
|
||
if (orders.length === 0) {
|
||
html = '<div style="text-align:center;color:#ccc;padding:10px;">暂无运单</div>';
|
||
container.html(html);
|
||
} else {
|
||
orders.forEach((order, index) => {
|
||
// 状态映射: 1-准备中,2-运送中,3-已结束
|
||
let statusText = '--';
|
||
let statusClass = '';
|
||
|
||
// 确保 status 是数字
|
||
const status = parseInt(order.status);
|
||
|
||
switch(status) {
|
||
case 1:
|
||
statusText = '准备中';
|
||
statusClass = 'status-pending'; // 红色
|
||
break;
|
||
case 2:
|
||
statusText = '运送中';
|
||
statusClass = 'status-shipping'; // 黄色
|
||
break;
|
||
case 3:
|
||
statusText = '已结束';
|
||
statusClass = 'status-done'; // 绿色
|
||
break;
|
||
default:
|
||
statusText = '未知';
|
||
}
|
||
|
||
html += `
|
||
<div class="order_item">
|
||
<span>${index + 1}</span>
|
||
<span>${order.deliveryNumber || '--'}</span>
|
||
<span>${order.startLocation || order.startAddress || '--'}</span>
|
||
<span>${order.endLocation || order.endAddress || '--'}</span>
|
||
<span class="${statusClass}">${statusText}</span>
|
||
<span>${order.estimatedDeliveryTime || '--'}</span>
|
||
</div>
|
||
`;
|
||
});
|
||
|
||
container.html(html);
|
||
|
||
// 自动滚动逻辑
|
||
// 确保 DOM 渲染完成
|
||
setTimeout(() => {
|
||
const scrollHeight = container[0].scrollHeight;
|
||
const clientHeight = container.height();
|
||
|
||
// 只有当内容高度超过容器高度时才滚动
|
||
if (scrollHeight > clientHeight) {
|
||
// 复制一份内容实现无缝滚动
|
||
container.append(html);
|
||
|
||
let currentScroll = 0;
|
||
|
||
function startScroll() {
|
||
if (orderScrollTimer) clearInterval(orderScrollTimer);
|
||
|
||
orderScrollTimer = setInterval(() => {
|
||
currentScroll += 0.5; // 滚动速度,数值越小越慢
|
||
|
||
// 当滚动到第一份内容的末尾时,瞬间切换回顶部
|
||
if (currentScroll >= scrollHeight) {
|
||
currentScroll = 0;
|
||
}
|
||
|
||
container.scrollTop(currentScroll);
|
||
}, 20); // 刷新频率
|
||
}
|
||
|
||
startScroll();
|
||
|
||
// 鼠标悬停暂停
|
||
container.on('mouseenter', function() {
|
||
if (orderScrollTimer) clearInterval(orderScrollTimer);
|
||
});
|
||
|
||
// 鼠标移开继续
|
||
container.on('mouseleave', function() {
|
||
startScroll();
|
||
});
|
||
}
|
||
}, 100);
|
||
}
|
||
}
|
||
|
||
// 初始化
|
||
$(function() {
|
||
loginAndFetchOrders();
|
||
|
||
// 定时刷新 (每30秒)
|
||
setInterval(() => {
|
||
if (authToken) {
|
||
fetchOrders();
|
||
fetchCattleOverview();
|
||
fetchSlaughterOverview();
|
||
} else {
|
||
loginAndFetchOrders();
|
||
}
|
||
}, 30000);
|
||
});
|
||
|
||
// 获取牛只概况(仓库列表)
|
||
function fetchCattleOverview() {
|
||
if (!authToken) return;
|
||
|
||
$.ajax({
|
||
url: '/api/warehouse/list',
|
||
method: 'POST', // 改为 POST
|
||
contentType: 'application/json',
|
||
headers: {
|
||
'Authorization': 'Bearer ' + authToken,
|
||
'satoken': authToken
|
||
},
|
||
data: JSON.stringify({
|
||
pageNo: 1,
|
||
pageSize: 100 // 假设需要分页参数,如果不传可能会报错
|
||
}),
|
||
success: function(res) {
|
||
console.log('牛只概况响应:', res);
|
||
let list = [];
|
||
// 适配双层嵌套结构: res.data.data.rows
|
||
if (res && res.code === 200 && res.data) {
|
||
if (res.data.data && Array.isArray(res.data.data.rows)) {
|
||
// 结构: { code: 200, data: { data: { rows: [...] } } }
|
||
list = res.data.data.rows;
|
||
} else if (res.data.rows && Array.isArray(res.data.rows)) {
|
||
// 结构: { code: 200, data: { rows: [...] } }
|
||
list = res.data.rows;
|
||
} else if (Array.isArray(res.data)) {
|
||
list = res.data;
|
||
}
|
||
}
|
||
renderCattleOverview(list);
|
||
updateMapWithWarehouseData(list);
|
||
},
|
||
error: function(err) {
|
||
console.error('获取牛只概况失败:', err);
|
||
}
|
||
});
|
||
}
|
||
|
||
function updateMapWithWarehouseData(data) {
|
||
if (!data || !Array.isArray(data)) return;
|
||
|
||
const mapData = data.map(item => {
|
||
if (item.longitude && item.latitude) {
|
||
return {
|
||
name: item.warehouseName || '未知仓库',
|
||
value: [parseFloat(item.longitude), parseFloat(item.latitude)]
|
||
};
|
||
}
|
||
return null;
|
||
}).filter(item => item !== null);
|
||
|
||
// 更新 option8 (全局变量)
|
||
if (typeof option8 !== 'undefined') {
|
||
// 假设 series[0] 是 scatter/effectScatter 用于显示地点
|
||
if (option8.series && option8.series[0]) {
|
||
option8.series[0].data = mapData;
|
||
}
|
||
|
||
// 尝试获取 echarts 实例并更新
|
||
// myChart8 在 index.html 中定义为 var myChart8 (全局)
|
||
if (typeof myChart8 !== 'undefined') {
|
||
myChart8.setOption(option8);
|
||
} else if (window.myChart8) {
|
||
window.myChart8.setOption(option8);
|
||
}
|
||
}
|
||
}
|
||
|
||
function renderCattleOverview(data) {
|
||
const container = $('#cattle_overview_container');
|
||
if (container.length === 0) return;
|
||
|
||
let html = '';
|
||
if (!data || data.length === 0) {
|
||
html = '<div style="text-align:center;color:#ccc;padding:10px;width:100%;">暂无数据</div>';
|
||
} else {
|
||
data.forEach(item => {
|
||
// 接口字段: warehouseName, account
|
||
if (item.account === undefined) {
|
||
console.warn('牛只概况接口返回数据缺少 account 字段,请检查接口文档或后端返回:', item);
|
||
}
|
||
const name = item.warehouseName || '--';
|
||
const value = item.account || 0;
|
||
|
||
html += `
|
||
<div class="cattle_item">
|
||
<div class="cattle_icon">
|
||
<span class="glyphicon glyphicon-home" aria-hidden="true"></span>
|
||
</div>
|
||
<div class="cattle_info">
|
||
<span class="cattle_name" title="${name}">${name}</span>
|
||
<div>
|
||
<span class="cattle_value">${value}</span>
|
||
<span class="cattle_unit">头</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
`;
|
||
});
|
||
}
|
||
container.html(html);
|
||
}
|
||
|
||
// 获取屠宰场概况
|
||
function fetchSlaughterOverview() {
|
||
if (!authToken) return;
|
||
|
||
$.ajax({
|
||
url: '/api/slaughter/house/list',
|
||
method: 'POST',
|
||
contentType: 'application/json',
|
||
headers: {
|
||
'Authorization': 'Bearer ' + authToken,
|
||
'satoken': authToken
|
||
},
|
||
data: JSON.stringify({
|
||
pageNo: 1,
|
||
pageSize: 100
|
||
}),
|
||
success: function(res) {
|
||
console.log('屠宰场概况响应:', res);
|
||
let list = [];
|
||
// 适配双层嵌套结构: res.data.data.rows
|
||
if (res && res.code === 200 && res.data) {
|
||
if (res.data.data && Array.isArray(res.data.data.rows)) {
|
||
list = res.data.data.rows;
|
||
} else if (res.data.rows && Array.isArray(res.data.rows)) {
|
||
list = res.data.rows;
|
||
} else if (Array.isArray(res.data)) {
|
||
list = res.data;
|
||
}
|
||
}
|
||
renderSlaughterOverview(list);
|
||
updateMapWithSlaughterData(list);
|
||
},
|
||
error: function(err) {
|
||
console.error('获取屠宰场概况失败:', err);
|
||
}
|
||
});
|
||
}
|
||
|
||
function updateMapWithSlaughterData(data) {
|
||
if (!data || !Array.isArray(data)) return;
|
||
|
||
const mapData = data.map(item => {
|
||
if (item.longitude && item.latitude) {
|
||
return {
|
||
name: item.houseName || '未知屠宰场',
|
||
value: [parseFloat(item.longitude), parseFloat(item.latitude)]
|
||
};
|
||
}
|
||
return null;
|
||
}).filter(item => item !== null);
|
||
|
||
// 更新 option8 (全局变量)
|
||
if (typeof option8 !== 'undefined') {
|
||
// series[2] 是屠宰场
|
||
if (option8.series && option8.series[2]) {
|
||
option8.series[2].data = mapData;
|
||
}
|
||
|
||
// 尝试获取 echarts 实例并更新
|
||
if (typeof myChart8 !== 'undefined') {
|
||
myChart8.setOption(option8);
|
||
} else if (window.myChart8) {
|
||
window.myChart8.setOption(option8);
|
||
}
|
||
}
|
||
}
|
||
|
||
function renderSlaughterOverview(data) {
|
||
const container = $('#slaughterhouse_overview_container');
|
||
if (container.length === 0) return;
|
||
|
||
let html = '';
|
||
if (!data || data.length === 0) {
|
||
html = '<div style="text-align:center;color:#ccc;padding:10px;width:100%;">暂无数据</div>';
|
||
} else {
|
||
data.forEach(item => {
|
||
// 接口字段: houseName, account
|
||
const name = item.houseName || '--';
|
||
const value = item.account || 0;
|
||
|
||
html += `
|
||
<div class="cattle_item">
|
||
<div class="cattle_icon">
|
||
<span class="glyphicon glyphicon-oil" aria-hidden="true"></span>
|
||
</div>
|
||
<div class="cattle_info">
|
||
<span class="cattle_name" title="${name}">${name}</span>
|
||
<div>
|
||
<span class="cattle_value">${value}</span>
|
||
<span class="cattle_unit">头</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
`;
|
||
});
|
||
}
|
||
container.html(html);
|
||
}
|
||
})();
|
||
|
||
// 移除旧的模拟数据逻辑
|
||
/*
|
||
(function() {
|
||
// ... 旧代码 ...
|
||
})();
|
||
*/
|
||
|
||
// 牛只行情列表逻辑
|
||
(function() {
|
||
let scrollInterval;
|
||
|
||
function fetchAndRenderMarketList() {
|
||
$.ajax({
|
||
// 使用本地代理接口解决跨域问题
|
||
// 原接口: https://ad.yunmainiu.com/api/cattle-data
|
||
// 代理配置在 server.js 中: /api/cattle-market-data -> https://ad.yunmainiu.com/api/cattle-data
|
||
url: '/api/cattle-market-data',
|
||
method: 'GET',
|
||
success: function(response) {
|
||
// 尝试解析字符串响应
|
||
if (typeof response === 'string') {
|
||
try {
|
||
response = JSON.parse(response);
|
||
} catch (e) {
|
||
console.error('JSON解析失败:', e);
|
||
}
|
||
}
|
||
|
||
let data = [];
|
||
// 兼容可能的返回格式:直接数组 或 { data: [] }
|
||
if (Array.isArray(response)) {
|
||
data = response;
|
||
} else if (response && Array.isArray(response.data)) {
|
||
data = response.data;
|
||
} else if (response && Array.isArray(response.list)) {
|
||
data = response.list;
|
||
}
|
||
|
||
console.log('获取到的牛只行情数据:', data);
|
||
renderMarketList(data);
|
||
},
|
||
error: function(err) {
|
||
console.error('获取牛只行情数据失败:', err);
|
||
// 失败时显示空或错误提示,或者保留旧数据
|
||
}
|
||
});
|
||
}
|
||
|
||
function renderMarketList(data) {
|
||
const container = $('.market_list_content');
|
||
if (container.length === 0) return;
|
||
|
||
let html = '';
|
||
if (data.length === 0) {
|
||
html = '<div style="text-align:center;color:#ccc;padding:20px;">暂无数据</div>';
|
||
} else {
|
||
data.forEach((item, index) => {
|
||
// 接口字段: province(省份), location(地区), type(品种), price(单价)
|
||
html += `
|
||
<div class="market_item">
|
||
<span>${index + 1}</span>
|
||
<span>${item.province || '--'}</span>
|
||
<span>${item.location || '--'}</span>
|
||
<span>${item.type || '--'}</span>
|
||
<span class="market_price">${item.price || '--'}</span>
|
||
</div>
|
||
`;
|
||
});
|
||
}
|
||
container.html(html);
|
||
|
||
// 清除旧的滚动定时器
|
||
if (scrollInterval) {
|
||
clearInterval(scrollInterval);
|
||
scrollInterval = null;
|
||
}
|
||
|
||
// 简单的自动滚动效果
|
||
// 需要等待DOM渲染完成后计算高度,这里简单使用setTimeout
|
||
setTimeout(() => {
|
||
let scrollPos = 0;
|
||
// 重新获取DOM元素属性,确保准确
|
||
const scrollHeight = container[0].scrollHeight;
|
||
const clientHeight = container[0].clientHeight;
|
||
|
||
// 只有当内容高度超过容器高度时才滚动
|
||
if (scrollHeight > clientHeight) {
|
||
scrollInterval = setInterval(() => {
|
||
scrollPos += 1;
|
||
// 当滚动到底部时,回到顶部
|
||
if (scrollPos >= scrollHeight - clientHeight) {
|
||
scrollPos = 0;
|
||
}
|
||
container.scrollTop(scrollPos);
|
||
}, 50);
|
||
}
|
||
}, 100);
|
||
}
|
||
|
||
$(function() {
|
||
fetchAndRenderMarketList();
|
||
|
||
// 每60秒刷新一次数据
|
||
setInterval(fetchAndRenderMarketList, 60000);
|
||
});
|
||
})();
|
||
|
||
// 出肉率图表逻辑
|
||
(function() {
|
||
// 确保 DOM 加载完成
|
||
$(function() {
|
||
const chartDom = document.getElementById('meat_yield_chart');
|
||
if (!chartDom) return;
|
||
|
||
const myChart = echarts.init(chartDom);
|
||
|
||
const option = {
|
||
tooltip: {
|
||
trigger: 'axis',
|
||
axisPointer: { type: 'shadow' }
|
||
},
|
||
grid: {
|
||
left: '3%',
|
||
right: '10%',
|
||
bottom: '3%',
|
||
top: '10%',
|
||
containLabel: true
|
||
},
|
||
xAxis: {
|
||
type: 'value',
|
||
axisLabel: {
|
||
color: '#fff',
|
||
fontSize: 12
|
||
},
|
||
splitLine: {
|
||
show: true,
|
||
lineStyle: {
|
||
color: 'rgba(255,255,255,0.1)'
|
||
}
|
||
},
|
||
axisLine: {
|
||
show: true,
|
||
lineStyle: {
|
||
color: '#fff'
|
||
}
|
||
}
|
||
},
|
||
yAxis: {
|
||
type: 'category',
|
||
data: ['鲁西黄牛', '西门塔尔', '夏洛莱', '利木赞', '安格斯'],
|
||
axisLabel: {
|
||
color: '#fff',
|
||
fontSize: 12
|
||
},
|
||
axisLine: {
|
||
show: true,
|
||
lineStyle: {
|
||
color: '#fff'
|
||
}
|
||
}
|
||
},
|
||
series: [
|
||
{
|
||
name: '出肉率',
|
||
type: 'bar',
|
||
data: [45, 52, 58, 55, 60],
|
||
itemStyle: {
|
||
normal: {
|
||
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||
{ offset: 0, color: '#2b86ff' },
|
||
{ offset: 1, color: '#1effc0' }
|
||
]),
|
||
barBorderRadius: [0, 5, 5, 0]
|
||
}
|
||
},
|
||
label: {
|
||
show: true,
|
||
position: 'right',
|
||
formatter: '{c}%',
|
||
color: '#fff'
|
||
},
|
||
barWidth: '40%'
|
||
}
|
||
]
|
||
};
|
||
|
||
myChart.setOption(option);
|
||
|
||
// 窗口大小改变时重置图表大小
|
||
window.addEventListener("resize", function () {
|
||
myChart.resize();
|
||
});
|
||
|
||
// 模拟数据动态变化
|
||
setInterval(() => {
|
||
const newData = option.series[0].data.map(val => {
|
||
let change = Math.floor(Math.random() * 3) - 1;
|
||
let newVal = val + change;
|
||
if (newVal > 70) newVal = 70;
|
||
if (newVal < 35) newVal = 35;
|
||
return newVal;
|
||
});
|
||
|
||
myChart.setOption({
|
||
series: [{
|
||
data: newData
|
||
}]
|
||
});
|
||
}, 5000);
|
||
});
|
||
})();
|
||
|
||
|