import React, { useState, useEffect } from 'react'
|
|
import ReactECharts from 'echarts-for-react'
|
|
import ColorMaker from '../service/colorGenerator'
|
|
import { getSeconds } from '../service/getSeconds'
|
|
import { getAppId } from '../service/getAppId'
|
|
import { getDayScreenUse } from '../service/getDayScreenUse'
|
|
|
|
const Gannt = () => {
|
|
let [option, setOption] = useState({})
|
|
|
|
useEffect(async () => {
|
|
let categories = ['使用记录']
|
|
var startTime = +new Date()
|
|
|
|
function renderItem(params, api) {
|
|
var categoryIndex = api.value(0)
|
|
var start = api.coord([api.value(1), categoryIndex])
|
|
var end = api.coord([api.value(2), categoryIndex])
|
|
var height = api.size([0, 1])[1] * 0.6
|
|
|
|
var rectShape = echarts.graphic.clipRectByRect(
|
|
{
|
|
x: start[0],
|
|
y: start[1] - height / 2,
|
|
width: end[0] - start[0],
|
|
height: height
|
|
},
|
|
{
|
|
x: params.coordSys.x,
|
|
y: params.coordSys.y,
|
|
width: params.coordSys.width,
|
|
height: params.coordSys.height
|
|
}
|
|
)
|
|
|
|
return (
|
|
rectShape && {
|
|
type: 'rect',
|
|
shape: rectShape,
|
|
style: api.style()
|
|
}
|
|
)
|
|
}
|
|
|
|
let appIdArray = await getAppId('1')
|
|
let types = new Array(appIdArray.data.length)
|
|
for (let i = 0; i < appIdArray.data.length; i++) {
|
|
types[i] = {
|
|
appId: i + 1,
|
|
name: appIdArray.data[i].text,
|
|
color: '#' + ColorMaker.GetColor(i).Color
|
|
}
|
|
}
|
|
|
|
for (let i = 0; i < appIdArray.length; i++) {
|
|
types.push({
|
|
appId: i + 1,
|
|
name: appIdArray[i].text,
|
|
color: '#' + ColorMaker.GetColor(i).Color
|
|
})
|
|
}
|
|
let dateStr = '2022-09-07'
|
|
let useRecord = await getDayScreenUse(dateStr)
|
|
const date = new Date(dateStr)
|
|
const timestampInMs = date.getTime()
|
|
|
|
// 👇️ timestamp in seconds (Unix timestamp)
|
|
const timestampInSeconds = Math.floor(date.getTime())
|
|
|
|
let data = new Array(useRecord.data.length)
|
|
for (let i = 0; i < useRecord.data.length; i++) {
|
|
data[i] = {
|
|
name: useRecord.data[i]['activity'],
|
|
value: new Array(getSeconds(useRecord.data[i]['timeStart']) * 1000, timestampInSeconds + getSeconds(useRecord.data[i]['timeStart']) * 1000, getSeconds(useRecord.data[i]['timeEnd']) * 1000 + timestampInSeconds, getSeconds(useRecord.data[i]['timeEnd']) * 1000),
|
|
itemStyle: {
|
|
normal: {
|
|
color: types[useRecord.data[i]['appId'] - 1]['color']
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
setOption({
|
|
tooltip: {
|
|
formatter: function (params) {
|
|
let seconds = params.value[3] / 1000
|
|
let duration = (params.value[3] - params.value[0]) / 1000
|
|
return (
|
|
params.marker +
|
|
params.name +
|
|
': ' +
|
|
Math.floor(seconds / 3600) +
|
|
'时' +
|
|
Math.floor((seconds % 3600) / 60) +
|
|
'分' +
|
|
Math.floor(seconds % 60) +
|
|
'秒' +
|
|
'<br/>' +
|
|
'持续时间: ' +
|
|
Math.floor(duration / 3600) +
|
|
'时' +
|
|
Math.floor((duration % 3600) / 60) +
|
|
'分' +
|
|
Math.floor(duration % 60) +
|
|
'秒'
|
|
)
|
|
}
|
|
},
|
|
dataZoom: [
|
|
{
|
|
type: 'slider',
|
|
filterMode: 'weakFilter',
|
|
showDataShadow: false,
|
|
top: 550,
|
|
height: 10,
|
|
borderColor: 'transparent',
|
|
backgroundColor: '#e2e2e2',
|
|
handleIcon: 'M10.7,11.9H9.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z', // jshint ignore:line
|
|
handleSize: 20,
|
|
handleStyle: {
|
|
shadowBlur: 6,
|
|
shadowOffsetX: 1,
|
|
shadowOffsetY: 2,
|
|
shadowColor: '#aaa'
|
|
},
|
|
labelFormatter: ''
|
|
},
|
|
{
|
|
type: 'inside',
|
|
filterMode: 'weakFilter'
|
|
}
|
|
],
|
|
grid: {
|
|
height: 450
|
|
},
|
|
xAxis: {
|
|
min: startTime,
|
|
scale: true,
|
|
axisLabel: {
|
|
formatter: function (val) {
|
|
let seconds = (val - startTime) / 1000 + 10620
|
|
return Math.floor(seconds / 3600) + '时' + Math.floor(seconds % 3600 / 60) + '分' + Math.floor(seconds % 60) + '秒'
|
|
}
|
|
}
|
|
},
|
|
yAxis: {
|
|
data: categories
|
|
},
|
|
series: [
|
|
{
|
|
type: 'custom',
|
|
renderItem: function (params, api) {
|
|
var categoryIndex = api.value(0)
|
|
var start = api.coord([api.value(1), categoryIndex])
|
|
var end = api.coord([api.value(2), categoryIndex])
|
|
var height = api.size([0, 1])[1] * 0.6
|
|
|
|
var rectShape = echarts.graphic.clipRectByRect(
|
|
{
|
|
x: start[0],
|
|
y: start[1] - height / 2,
|
|
width: end[0] - start[0],
|
|
height: height
|
|
},
|
|
{
|
|
x: params.coordSys.x,
|
|
y: params.coordSys.y,
|
|
width: params.coordSys.width,
|
|
height: params.coordSys.height
|
|
}
|
|
)
|
|
|
|
return (
|
|
rectShape && {
|
|
type: 'rect',
|
|
shape: rectShape,
|
|
style: api.style()
|
|
}
|
|
)
|
|
},
|
|
itemStyle: {
|
|
normal: {
|
|
opacity: 0.8
|
|
}
|
|
},
|
|
encode: {
|
|
x: [1, 2],
|
|
y: 0
|
|
},
|
|
data: data
|
|
}
|
|
]
|
|
})
|
|
}, [])
|
|
|
|
return <ReactECharts option={option} style={{ height: '800px', width: '1200px' }}></ReactECharts>
|
|
}
|
|
|
|
export default Gannt
|