195 lines
5.8 KiB
JavaScript
Raw Normal View History

2022-06-08 14:51:11 +08:00
/*
GanttSchedule甘特图功能逻辑模块
描述监听处理单元格编辑以及条形图拖拽事件
*/
function clearTime (date) {
if (!date) return null;
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
}
function maxTime(date) {
if (!date) return null;
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59);
}
GanttSchedule = function (gantt) {
this.gantt = gantt;
//处理单元格编辑,和条形图拖拽事件
gantt.on("cellbeginedit", this.__OnCellBeginEdit, this);
gantt.on("aftercellcommitedit", this.__OnCellCommitEdit, this);
gantt.on("itemdragstart", this.__OnItemDragStart, this);
gantt.on("itemdragcomplete", this.__OnItemDragComplete, this);
gantt.on("taskdragdrop", this.__OnTaskDragDrop, this);
gantt.on("tasksync", function (e) {
this._syncTask(e.task);
}, this);
}
GanttSchedule.prototype = {
__OnTaskDragDrop: function (e) {
e.cancel = true;
var dragRecords = e.tasks, targetRecord = e.targetTask, action = e.action;
this.gantt.moveTasks(dragRecords, targetRecord, action);
},
__OnCellBeginEdit: function (e) {
var task = e.record, field = e.field;
if (task.Summary) {
2022-11-05 16:45:14 +08:00
if (field == 'Start' || field == 'Finish' || field == 'duration') {
2022-06-08 14:51:11 +08:00
e.cancel = true;
}
}
},
__OnCellCommitEdit: function (e) {
e.cancel = true;
var task = e.record, field = e.field, value = e.value, oldValue = task[field];
if (mini.isEquals(oldValue, value)) return;
try {
//!!!处理单元格编辑提交
var gantt = this.gantt;
//标记任务的属性被修改
gantt.setTaskModified(task, field);
if (e.column.displayField) {
task[e.column.displayField] = e.text;
}
switch (field) {
2022-11-05 16:45:14 +08:00
case "duration":
task.duration = value;
2022-06-08 14:51:11 +08:00
if (task.Start) {
task.Finish = maxTime(task.Start);
2022-11-05 16:45:14 +08:00
task.Finish.setDate(task.Finish.getDate() + task.duration - 1);
2022-06-08 14:51:11 +08:00
gantt.setTaskModified(task, "Finish");
}
break;
case "Start":
task.Start = clearTime(value);
if (task.Start) {
task.Finish = maxTime(task.Start);
2022-11-05 16:45:14 +08:00
task.Finish.setDate(task.Start.getDate() + task.duration - 1);
2022-06-08 14:51:11 +08:00
gantt.setTaskModified(task, "Finish");
}
break;
case "Finish":
task.Finish = maxTime(value);
if (task.Finish && task.Start) {
var days = parseInt((task.Finish - task.Start) / (3600 * 24 * 1000));
2022-11-05 16:45:14 +08:00
task.duration = days + 1;
2022-06-08 14:51:11 +08:00
2022-11-05 16:45:14 +08:00
gantt.setTaskModified(task, "duration");
2022-06-08 14:51:11 +08:00
}
break;
case "PredecessorLink":
gantt.setLinks(task, value);
return;
break;
default:
task[field] = value;
break;
}
this._syncTask(task);
gantt.refresh();
} catch (ex) {
alert(ex.message);
}
},
__OnItemDragStart: function (e) {
if (e.action == "start") {
e.cancel = true;
}
},
__OnItemDragComplete: function (e) {
var action = e.action, value = e.value, task = e.item;
//!!!处理条形图拖拽完成
var gantt = this.gantt;
if (action == "finish") {
gantt.setTaskModified(task, "Finish");
task.Finish = maxTime(value);
if (task.Finish && task.Start) {
var days = parseInt((task.Finish - task.Start) / (3600 * 24 * 1000));
task.duration = days + 1;
2022-06-08 14:51:11 +08:00
gantt.setTaskModified(task, "duration");
2022-06-08 14:51:11 +08:00
}
}
if (action == "percentcomplete") {
console.log('是更改进度',task)
2022-06-08 14:51:11 +08:00
gantt.setTaskModified(task, "PercentComplete");
// console.log('更改进度的时候的task',task)
2022-06-08 14:51:11 +08:00
task.PercentComplete = value;
}
if (action == "move") {
gantt.setTaskModified(task, "Start");
task.Start = clearTime(value);
if (task.Start) {
task.Finish = maxTime(task.Start);
task.Finish.setDate(task.Start.getDate() + task.duration - 1);
2022-06-08 14:51:11 +08:00
gantt.setTaskModified(task, "Finish");
}
}
this._syncTask(task);
gantt.refresh();
},
_syncTask: function (task) {
if (!task) return;
var gantt = this.gantt;
//同步任务的父任务工期
function getDuration(pnode) {
var nodes = gantt.getChildTasks(pnode);
var duration = 0;
if (nodes && nodes.length > 0) {
for (var i = 0, l = nodes.length; i < l; i++) {
var node = nodes[i];
var d = parseInt(node.duration);
2022-06-08 14:51:11 +08:00
if (!isNaN(d)) {
duration += d;
}
}
}
return duration;
}
//1)获取所有父级任务
var ans = gantt.getAncestorTasks(task);
ans.reverse();
for (var i = 0, l = ans.length; i < l; i++) {
var t = ans[i];
//2)获取父任务下子任务的Duration之和
var duration = getDuration(t);
if (t.duration != duration) {
t.duration = duration;
gantt.setTaskModified(t, "duration");
2022-06-08 14:51:11 +08:00
}
}
}
};