随笔 - 42,  文章 - 0,  评论 - 3,  阅读 - 24113

1、安装 highcharts

npm install highcharts --save

2、页面引用

// 引入
import Highcharts from 'highcharts/highcharts-gantt.src.js'
// 引入拖拽
import factory from 'highcharts/modules/draggable-points.js'
factory(Highcharts)

3、封装组件

<!--
* @Descripttion: 新甘特图
* @version: 0.0.1
* @Author: PengShuai
* @Date: 2023-01-12 13:20:44
* @LastEditors: PengShuai
* @LastEditTime: 2023-02-01 15:00:55
-->
<template>
<div class="BaseNewGantt">
<div id="container"></div>
</div>
</template>
<script>
import Highcharts from 'highcharts/highcharts-gantt.src.js'
import factory from 'highcharts/modules/draggable-points.js'
factory(Highcharts)
export default {
name: 'BaseNewGantt',
data() {
return {
isShow: true,
tableConfig: [],
}
},
props: {
// 甘特图配置
ganttConfig: {
type: Object,
default: () => {
return {
data: [],
columnsConfig: [],
}
},
},
},
mounted() {},
methods: {
// 页面初始化
init() {
Highcharts.setOptions({
global: {
useUTC: false, // 不使用utc时间
}, // 默认都是英文的,这里做了部分中文翻译
lang: {
noData: '暂无数据',
months: [
'一月',
'二月',
'三月',
'四月',
'五月',
'六月',
'七月',
'八月',
'九月',
'十月',
'十一月',
'十二月',
],
shortMonths: [
'一月',
'二月',
'三月',
'四月',
'五月',
'六月',
'七月',
'八月',
'九月',
'十月',
'十一月',
'十二月',
],
weekdays: ['日', '一', '二', '三', '四', '五', '六'],
buttons: [
{ type: 'month', count: 1, text: '月' },
{ type: 'month', count: 3, text: '季度' },
{ type: 'month', count: 6, text: '半年' },
{ type: 'ytd', text: 'YTD' },
{ type: 'year', count: 1, text: '年' },
{ type: 'all', text: '所有' },
],
rangeSelectorZoom: '范围',
},
})
this.getGantt()
},
getGantt() {
const _this = this
const day = 1000 * 60 * 60 * 24
const map = Highcharts.map
// 获取数据源
let series = this.ganttConfig.data
// 左侧表格配置
this.columnsConfig = []
if (this.ganttConfig.tableConfig.length > 0) {
this.ganttConfig.tableConfig.forEach((item) => {
let obj = {
title: {
text: item.title,
},
categories: map(series, function (s) {
return s[item.labels]
}),
}
this.columnsConfig.push(obj)
})
}
Highcharts.ganttChart('container', {
plotOptions: {
series: {
animation: true,
dragDrop: {
draggableX: true, // 是否横向拖动
draggableY: false, // 是否纵向拖动
dragPrecisionX: day,
},
dataLabels: {
enabled: true,
format: '{point.title}',
style: {
cursor: 'default',
opacity: _this.isShow ? 0 : 1,
pointerEvents: 'none',
},
},
allowPointSelect: true,
point: {
events: {
dragStart: _this.onDragStart,
drag: _this.onDrag,
drop: _this.onDrop,
select: _this.onHandleSelect,
},
},
},
},
yAxis: {
type: 'category',
grid: {
enabled: true,
borderColor: 'rgba(0,0,0,0.3)',
borderWidth: 1,
columns: _this.columnsConfig,
},
},
xAxis: [
{
currentDateIndicator: true,
grid: {
borderWidth: 1, // 右侧表头边框宽度
cellHeight: 0, // 右侧日期表头高度
},
labels: {
format: '{value:%d}日',
},
},
{
labels: {
format: '{value:%Y年-%m月}',
},
},
],
// 提示信息
tooltip: {
formatter: function () {
return `<div>
${this.point.title}<br/>
开始时间: ${_this.$library.common.formatDate(
new Date(this.point.start),
'YYYY-MM-DD',
)}<br/>
结束时间: ${_this.$library.common.formatDate(
new Date(this.point.end),
'YYYY-MM-DD',
)}<br/>
</div>`
},
},
navigator: {
enabled: true,
series: {
type: 'gantt',
pointPlacement: 0.5,
pointPadding: 0.25,
},
yAxis: {
min: 0,
max: 6,
reversed: true,
categories: [],
},
},
series: series,
// 显示滚动条
scrollbar: {
enabled: true,
},
// 顶部筛选按钮
rangeSelector: {
enabled: true,
selected: 0,
buttons: [
{ type: 'month', count: 1, text: '月' },
{ type: 'month', count: 3, text: '季度' },
{ type: 'month', count: 6, text: '半年' },
{ type: 'ytd', text: 'YTD' },
{ type: 'year', count: 1, text: '年' },
{ type: 'all', text: '所有' },
],
},
// // 去掉右下角版权信息
credits: {
enabled: false,
},
})
},
// 拖动开始
onDragStart(e) {},
// 拖动
onDrag(e) {},
// 拖动停止
onDrop(e) {
this.$emit('onDragStop', e.target.options)
},
// 选择事件
onHandleSelect(e) {
this.$emit('onHandleSelect', e.target.options)
console.log(e)
},
// 是否显示标题
onShowTitle() {
// 标题过长 隐藏 更改文字透明度
this.isShow = !this.isShow
// 重新加载
this.getGantt()
},
},
}
</script>
<style lang="less" scoped>
.BaseNewGantt {
height: calc(100% - 70px);
overflow: auto;
}
</style>

4、组件使用

<base-gantt
ref="gantt"
:ganttConfig="ganttConfig"
@onDragStop="onDragStop"
@onHandleSelect="onHandleSelect">
</base-gantt>

data中配置

// 甘特图配置
ganttConfig: {
// 数据源
data: [],
// 左侧表格列配置
tableConfig: [
{
title: '设备名称',
labels: 'machineName',
},
{
title: '设备编码',
labels: 'machineNo',
},
],
},

事件

// 拖动停止
onDragStop(option) {},
// 甘特图选中
onHandleSelect(option) {
this.selectGanttRowData = option
},

5、实例

6、官网地址

https://www.hcharts.cn/
演示地址
https://www.hcharts.cn/demo/gantt

posted on   丶凉雨拾忆  阅读(2103)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示