/* * 版 本 Learun-ADMS V7.0.3 力软敏捷开发框架(http://www.learun.cn) * Copyright (c) 2013-2018 上海力软信息技术有限公司 * 创建人:力软-前端开发组 * 日 期:2018.11.22 * 描 述:甘特图 */ (function ($, learun) { "use strict"; //+--------------------------------------------------- //| 日期计算 //+--------------------------------------------------- Date.prototype.DateAdd = function (strInterval, Number) { var dtTmp = this; switch (strInterval) { case 's': return new Date(Date.parse(dtTmp) + (1000 * Number));// 秒 case 'n': return new Date(Date.parse(dtTmp) + (60000 * Number));// 分 case 'h': return new Date(Date.parse(dtTmp) + (3600000 * Number));// 小时 case 'd': return new Date(Date.parse(dtTmp) + (86400000 * Number));// 天 case 'w': return new Date(Date.parse(dtTmp) + ((86400000 * 7) * Number));// 星期 case 'q': return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number * 3, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());// 季度 case 'm': return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());// 月 case 'y': return new Date((dtTmp.getFullYear() + Number), dtTmp.getMonth(), dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());// 年 } } //+--------------------------------------------------- //| 比较日期差 dtEnd 格式为日期型或者 有效日期格式字符串 //+--------------------------------------------------- Date.prototype.DateDiff = function (strInterval, dtEnd) { var dtStart = this; if (typeof dtEnd == 'string')//如果是字符串转换为日期型 { dtEnd = learun.parseDate(dtEnd); } switch (strInterval) { case 's': return parseInt((dtEnd - dtStart) / 1000); case 'n': return parseInt((dtEnd - dtStart) / 60000); case 'h': return parseInt((dtEnd - dtStart) / 3600000); case 'd': return parseInt((dtEnd - dtStart) / 86400000); case 'w': return parseInt((dtEnd - dtStart) / (86400000 * 7)); case 'm': return (dtEnd.getMonth() + 1) + ((dtEnd.getFullYear() - dtStart.getFullYear()) * 12) - (dtStart.getMonth() + 1); case 'y': return dtEnd.getFullYear() - dtStart.getFullYear(); } } //+--------------------------------------------------- //| 取得当前日期所在月的最大天数 //+--------------------------------------------------- Date.prototype.MaxDayOfDate = function () { var myDate = this; var date1 = learun.parseDate(learun.formatDate(myDate, 'yyyy-MM-01 00:00:00')); var date2 = date1.DateAdd('m', 1); var result = date1.DateDiff('d', date2); return result; } //--------------------------------------------------- // 判断闰年 //--------------------------------------------------- Date.prototype.isLeapYear = function () { return (0 == this.getYear() % 4 && ((this.getYear() % 100 != 0) || (this.getYear() % 400 == 0))); } var _gantt = { init: function ($self, op) { $self.addClass('lr-gantt'); var $title = $('
\
时间维度:
\
\
\
'); $.each(op.timebtns, function (_index, _item) { switch (_item) { case 'month': $title.find('.btn-group-sm').append(''); break; case 'week': $title.find('.btn-group-sm').append(''); break; case 'day': $title.find('.btn-group-sm').append(''); break; case 'hour': $title.find('.btn-group-sm').append(''); break; } }); var $footer = $(''); var $body = $('
').css({ 'padding-left': op.leftWidh }); var $left = $('
').css({ width: op.leftWidh }); // 左侧显示区域 var $right = $('
\
\
\
\
'); // 右侧显示区域 $left.append('
'); // 左右移动滑块 $right.append('
'); $body.append('
\
\
\
'); op._row = 0; _gantt.initTitle($title, op); _gantt.initFooter($footer, $self, op); _gantt.initLeft($left, $self, op); _gantt.initRight($right, $self, op); _gantt.initMove($self); _gantt.initShow($body); $body.append($left); $body.append($right); $self.append($title); $self.append($body); $self.append($footer); // 绘制数据 _gantt.renderData($self, op); // 加载后台数据 // _gantt.loadData($self, op); $title = null; $body = null; $footer = null; $left = null; $right = null; $self = null; }, initShow: function ($body) { $body.find('.lr-gantt-showtext-content').lrscroll(); $body.find('.lr-gantt-showtext-title-remove').on('click', function () { var $this = $(this); $this.parent().removeClass('active'); $this.parents('.lr-gantt').removeClass('lr-gantt-showtext-active'); $this.parent().find('.lr-scroll-box').html(''); $this = null; }); }, initMove: function ($self) { $self.on('mousedown', function (e) { e = e || window.event; var et = e.target || e.srcElement; var $et = $(et); var $this = $(this); var dfop = $this[0].dfop; if ($et.hasClass('lr-gantt-move')) { dfop._ismove = true; dfop._pageX = e.pageX; } }); $self.mousemove(function (e) { var $this = $(this); var dfop = $this[0].dfop; if (dfop._ismove) { var $block = $this.find('.lr-gantt-left'); $block.css('width', dfop.leftWidh + (e.pageX - dfop._pageX)); $this.find('.lr-gantt-body').css('padding-left', dfop.leftWidh + (e.pageX - dfop._pageX)); } }); $self.on('click', function (e) { var $this = $(this); var dfop = $this[0].dfop; if (dfop._ismove) { dfop.leftWidh += (e.pageX - dfop._pageX); dfop._ismove = false; } }); }, initTitle: function ($title, op) { $title.find('.' + op.type).addClass('active'); $title.find('a').on('click', function () { var $this = $(this); if (!$this.hasClass('active')) { $this.parent().find('.active').removeClass('active'); var $self = $this.parents('.lr-gantt'); var _op = $self[0].dfop; _op.type = $this.attr('data-value'); setTimeout(function () { _gantt.renderRightHeader($self.find('.lr-gantt-rightheader'), op); _gantt.renderRightData($self, op); $self = null; }); $this.addClass('active'); } $this = null; }); }, initFooter: function ($footer, $self, op) { if (op.isPage) { var $pagebar = $('
无显示数据
\
'); $footer.append($pagebar); $pagebar.find('#lr_gantt_page_bar_num_' + op.id).on('click', _gantt.turnPage); $pagebar.find('#lr_gantt_page_bar_nums_' + op.id + ' .pagebtn').on('click', { op: op }, _gantt.turnPage2); $pagebar = null; } else { $self.addClass('lr-gantt-nopage'); } $footer = null; }, initLeft: function ($left, $self, op) { $left.find('.lr-gantt-left-content').lrscroll(function (x, y) { if (!$self.is(":hidden")) { $self.find('.lr-gantt-rightbody').lrscrollSet('moveY', y); } }); }, initRight: function ($right, $self, op) { $right.find('.lr-gantt-rightbody').lrscroll(function (x, y) { if (!$self.is(":hidden")) { $self.find('.lr-gantt-rightheader').css('left', -x); $self.find('.lr-gantt-left-content').lrscrollSet('moveY', y); } }); }, renderRightHeader: function ($header, op) { $header.hide(); $header.html(''); op._time = DateUtils.getBoundaryDatesFromData(op.data, op.cellNum, op.type); // 绘制头部 var $month = $('
'); var $day = $('
'); var len = 0; var last = op._time.min; var y = ''; var w = 0; var $y = null; op._num = 0; switch (op.type) { case 'month': len = op._time.min.DateDiff('m', op._time.max) + 1; w = 0; for (var i = 0; i < len; i++) { var _y = last.getFullYear(); if (y != _y) { y = _y; if ($y != null) { $y.css({ 'width': w * 28 }); } $y = $('
' + y + '
'); $month.append($y); w = 0; } $day.append('
' + (last.getMonth()+1) + '
'); last = last.DateAdd('m', 1); w++; op._num++; } $y.css({ 'width': w * 28 }); break; case 'week': len = op._time.min.DateDiff('w', op._time.max) +1; w = 0; var start = null; for (var i = 0; i < len; i++) { var _y = op.monthNames[last.getMonth()] + '/' + last.getFullYear(); if (y != _y) { y = _y; if ($y != null) { if (op._time.min.DateDiff('m', start) > 0) { $y.css({ 'width': start.MaxDayOfDate() * 4 }); } else { $y.css({ 'width': (start.MaxDayOfDate() - start.getDate() + 1) * 4 }); } } start = last; $y = $('
' + y + '
'); $month.append($y); w = 0; } $day.append('
' + DateUtils.getWeekNumber(last) + '
'); last = last.DateAdd('w', 1); w++; op._num++; } $y.css({ 'width': (last.DateAdd('w', -1).getDate() + 6) * 4 }); break; case 'day': len = op._time.min.DateDiff('d', op._time.max) + 1; w = 0; for (var i = 0; i < len; i++) { var _y = op.monthNames[last.getMonth()] + '/' + last.getFullYear(); if (y != _y) { y = _y; if ($y != null) { $y.css({ 'width': w * 28 }); } $y = $('
' + y + '
'); $month.append($y); w = 0; } $day.append('
' + last.getDate() + '
'); last = last.DateAdd('d', 1); w++; op._num++; } $y.css({ 'width': w * 28 }); break; case 'hour': len = op._time.min.DateDiff('h', op._time.max) + 1; w = 0; for (var i = 0; i < len; i++) { var _y = last.getDate() + '/' + op.monthNames[last.getMonth()] + '/' + last.getFullYear(); if (y != _y) { y = _y; if ($y != null) { $y.css({ 'width': w * 28 }); } $y = $('
' + y + '
'); $month.append($y); w = 0; } $day.append('
' + last.getHours() + '
'); last = last.DateAdd('h', 1); w++; op._num++; } $y.css({ 'width': w * 28 }); break; } op._width = op._num * 28; $header.css("width", op._width + "px"); $header.append($month); $header.append($day); $header.show(); $header = null; $month = null; $day = null; }, renderRightGird: function ($content, op) { $content.hide(); $content.css({ 'width': op._width }); $content.html(''); var $row = $('
'); for (var j = 0; j < op._num; j++) { var $cell = $('
', { "class": "ganttview-grid-row-cell" }); $row.append($cell); $cell = null; } for (var j = 0; j < op._row; j++) { $content.append($row.clone()); } $content.show(); if (op._row == 0) { $content.parents('.lr-gantt-right').find('.lr-gantt-nodata-img').show(); } else { $content.parents('.lr-gantt-right').find('.lr-gantt-nodata-img').hide(); } $row = null; $content = null; }, // 加载数据 loadData: function ($self, op) { var _param = op.param || {}; if (op.isPage) { learun.loading(true, '正在获取数据'); op.pageparam = op.pageparam || { rows: op.rows, // 每页行数 page: 1, // 当前页 sidx: '', // 排序列 sord: '', // 排序类型 records: 0, // 总记录数 total: 0 // 总页数 }; op.pageparam.rows = op.rows; op.pageparam.sidx = op.sidx; op.pageparam.sord = op.sord; op.pageparam.page = op.pageparam.page || 1; op.pageparam.records = 0; op.pageparam.total = 0; op.param = op.param || {}; delete op.param['pagination']; var _paramString = JSON.stringify(op.param); if (op.paramString != _paramString) { op.paramString = _paramString; op.pageparam.page = 1; } op.param['pagination'] = JSON.stringify(op.pageparam); learun.httpAsync('GET', op.url, op.param, function (data) { learun.loading(false); if (data) { op.data = data.rows; op.pageparam.page = data.page; op.pageparam.records = data.records; op.pageparam.total = data.total; } else { op.data = []; op.pageparam.page = 1; op.pageparam.records = 0; op.pageparam.total = 0; } _gantt.renderData($self, op); var $pagebar = $self.find('#lr_gantt_page_bar_' + op.id); var $pagebarBtn = $pagebar.find('#lr_gantt_page_bar_num_' + op.id); var $pagebarBtns = $pagebar.find('#lr_gantt_page_bar_nums_' + op.id); var pagebarLabel = ''; var btnlist = ""; if (op.data.length == 0) { pagebarLabel = '无显示数据'; } else { var pageparam = op.pageparam; var beginnum = (pageparam.page - 1) * pageparam.rows + 1; var endnum = beginnum + op.data.length - 1; pagebarLabel = '显示第 ' + beginnum + ' - ' + endnum + ' 条记录 | 检索到 ' + pageparam.records + ' 条记录'; if (pageparam.total > 1) { var bpage = pageparam.page - 6; bpage = bpage < 0 ? 0 : bpage; var epage = bpage + 10; if (epage > pageparam.total) { epage = pageparam.total; } if ((epage - bpage) < 10) { bpage = epage - 10; } bpage = bpage < 0 ? 0 : bpage; for (var i = bpage; i < epage; i++) { btnlist += '
  • ' + (i + 1) + '
  • '; } $pagebarBtns.find('span').text('共' + pageparam.total + '页,到'); $pagebarBtns.show(); } else { $pagebarBtns.hide(); } } $pagebarBtn.html(btnlist); $pagebar.find('.lr-gantt-page-bar-info').html(pagebarLabel); op.onRenderComplete && op.onRenderComplete(op.data); }); } else { if (op.url) { learun.loading(true, '正在获取数据'); learun.httpAsync('GET', op.url, _param, function (data) { learun.loading(false); op.data = data || []; _gantt.renderData($self, op); op.onRenderComplete && op.onRenderComplete(op.data); }); } } }, turnPage: function (e) { e = e || window.event; var $this = $(this); var $self = $('#' + $this.attr('id').replace('lr_gantt_page_bar_num_', '')); var op = $self[0].dfop; var et = e.target || e.srcElement; var $et = $(et); if ($et.hasClass('pagebtn')) { var page = parseInt($et.text()); if (page != op.pageparam.page) { $this.find('.active').removeClass('active'); $et.addClass('active'); op.pageparam.page = page; _gantt.loadData($self, op); } } }, turnPage2: function (e) { var $this = $(this); var op = e.data.op; var name = $this.text(); var $pagenum = $('#lr_gantt_page_bar_num_' + op.id); var page = parseInt($pagenum.find('.active').text()); var falg = false; switch (name) { case '首页': if (page != 1) { op.pageparam.page = 1; falg = true; } break; case '上一页': if (page > 1) { op.pageparam.page = page - 1; falg = true; } break; case '下一页': if (page < op.pageparam.total) { op.pageparam.page = page + 1; falg = true; } break; case '尾页': if (page != op.pageparam.total) { op.pageparam.page = op.pageparam.total; falg = true; } break; case '跳转': var text = $this.parents('#lr_gantt_page_bar_nums_' + op.id).find('input').val(); if (!!text) { var p = parseInt(text); if (String(p) != 'NaN') { if (p < 1) { p = 1; } if (p > op.pageparam.total) { p = op.pageparam.total; } op.pageparam.page = p; falg = true; } } break; } if (falg) { _gantt.loadData($('#' + op.id), op); } }, // 渲染数据 renderData: function ($self, op) { _gantt.hideinfo($self); _gantt.renderRightHeader($self.find('.lr-gantt-rightheader'), op); // 绘制左侧列表数据 _gantt.renderLeftData($self, op); // 绘制右侧数据 _gantt.renderRightData($self, op); }, // 左侧 renderLeftData: function ($self, op) { var $treeRoot = $(''); var _len = op.data.length; op._timeDatas = {}; op._row = 0; for (var i = 0; i < _len; i++) { var $node = _gantt.renderNode(op.data[i], 0, i, op, true); $treeRoot.append($node); } $self.find('.lr-gantt-left .lr-scroll-box').html($treeRoot); }, renderNode: function (node, deep, path, dfop, isShow) { if (isShow) { dfop._timeDatas[path + ''] = node; dfop._row++; } node._deep = deep; node._path = path; // 渲染成单个节点 var nid = node.id.replace(/[^\w]/gi, "_"); var title = node.title || node.text; var $node = $('
  • '); var $nodeDiv = $('
    '); if (node.hasChildren) { var c = (node.isexpand || dfop.isAllExpand) ? 'lr-gantt-tree-node-expanded' : 'lr-gantt-tree-node-collapsed'; $nodeDiv.addClass(c); } else { $nodeDiv.addClass('lr-gantt-tree-node-leaf'); } // span indent var $span = $(''); if (deep == 1) { $span.append(''); } else if (deep > 1) { $span.append(''); for (var j = 1; j < deep; j++) { $span.append(''); } } $nodeDiv.append($span); // img var $img = $(''); $nodeDiv.append($img); // a var ahtml = ''; ahtml += '' + node.text + ''; ahtml += ''; $nodeDiv.append(ahtml); // 节点事件绑定 $nodeDiv.on('click', _gantt.nodeClick); if (!node.complete) { $nodeDiv.append('
    '); } $node.append($nodeDiv); if (node.hasChildren) { var $treeChildren = $('