//
// 陈日红 2016-10-28
//
// 本脚本用于处理 排班导入功能中的 撤消和重做 操作 , 类似于 vs 的 撤销和重做
//
// @linkbutton_undo_id 界面[撤消]按钮ID
// @linkbutton_redo_id 界面[重做]按钮ID
function PaibanDaoruCls(linkbutton_undo_id, linkbutton_redo_id) {
this.linkbutton_undo_id = (linkbutton_undo_id);
this.linkbutton_redo_id = (linkbutton_redo_id);
// 可记录操作数
this.record_count = 5;
// 剪切板(复制&剪切)
this.clipboard = [];
// 操作类型
this.obj_operate = { apply: "apply", del: "delete", cut: "cut", copy: "copy", paste: "paste" };
this.clipboard_tpye = this.obj_operate.copy;
// 用于记录用户操作的数组
this.arr_operate = [];
// 用于记录用户操作的数据的数组(修正后台数据)
this.arr_operate_data = [];
// 用于记录用户操作的单元格的数组(修正界面)
this.arr_operate_cell = [];
// 实例类时,禁有撤销和重做按钮
this.deal_linkbutton();
// 指针索引
this.pointer = -1;
// 辐射源
this.radiation_source = [];
}
PaibanDaoruCls.prototype.clear = function () {
this.pointer = -1;
this.arr_operate = [];
this.arr_operate_data = [];
this.arr_operate_cell = [];
this.radiation_source = [];
this.deal_linkbutton();
}
PaibanDaoruCls.prototype.deal_linkbutton = function () {
var self = this;
var code = self.arr_operate.length > 0 && self.pointer > -1 ? "enable" : "disable";
$("#" + self.linkbutton_undo_id).linkbutton(code);
code = self.pointer < self.arr_operate.length - 1 ? "enable" : "disable";
$("#" + self.linkbutton_redo_id).linkbutton(code);
}
// 记录用户的操作
PaibanDaoruCls.prototype.push_operate = function (dowhat, data, cells) {
var self = this;
// 如果指针不是在最末(有撤销动作),则清理指标后面的动作
if (self.pointer != self.arr_operate.length - 1) {
for (var i = self.pointer + 1; i < self.arr_operate.length; i++) {
self.arr_operate.pop();
self.arr_operate_data.pop();
self.arr_operate_cell.pop();
}
}
self.arr_operate.push(dowhat);
self.arr_operate_data.push(data);
self.arr_operate_cell.push(cells);
// 超过可记录操作数时,要清空前面的
if (self.arr_operate.length > this.record_count) {
for (var i = 0; i < (self.arr_operate.length - this.record_count); i++) {
self.arr_operate.shift();
self.arr_operate_data.shift();
self.arr_operate_cell.shift();
}
}
self.pointer = self.arr_operate.length - 1;
self.deal_linkbutton();
}
// 单元格班次准允判断
PaibanDaoruCls.prototype.can_edit = function () {
return 1;
}
// 撤销上一步
PaibanDaoruCls.prototype.undo = function () {
var self = this;
var operate = self.arr_operate[self.pointer];
var callback = function () {
self.pointer--;
self.deal_linkbutton();
};
if (operate == self.obj_operate.apply) {
self.undo_apply(callback);
}
else if (operate == self.obj_operate.del) {
self.undo_delete(callback);
}
else if (operate == self.obj_operate.paste) {
self.undo_paste(callback);
}
}
// 重做下一步
PaibanDaoruCls.prototype.redo = function () {
var self = this;
var operate = self.arr_operate[self.pointer + 1];
var callback = function () {
self.pointer++;
self.deal_linkbutton();
};
if (operate == self.obj_operate.apply) {
self.redo_apply(callback);
}
else if (operate == self.obj_operate.del) {
self.redo_delete(callback);
}
else if (operate == self.obj_operate.paste) {
self.redo_paste(callback);
}
}
// 点击剪切
PaibanDaoruCls.prototype.do_cut = function () {
this.do_copy();
this.clipboard_tpye = this.obj_operate.cut;
this.do_delete();
};
// 点击复制
PaibanDaoruCls.prototype.do_copy = function () {
var canedit = this.can_edit();
if (canedit == 0) {
return;
}
var self = this;
self.clipboard = [];
self.clipboard_tpye = self.obj_operate.copy;
$(".selected-cell").each(function () {
var $this = $(this);
if (!$this.hasClass("day-cell")) return;
self.clipboard.push($this.clone()); // 这里用的克隆(剪切会把界面破坏)
});
};
// 点击粘贴
PaibanDaoruCls.prototype.do_paste = function () {
var self = this;
var arr_selected_cells = [];
var copyArray = self.clipboard;
var toArray = [];
if (copyArray.length == 0) {
alert("您没有复制(剪切)排班数据,请先复制(剪切)然后粘贴!");
return;
}
var $pasteCell = $(".selected-cell");
if ($pasteCell.size() == 0) {
alert("请选择您需要粘贴的开始单元格");
return;
} else if ($pasteCell.size() > 1) {
alert("不能有多个粘贴的开始单元格");
return;
}
var pbrq = $pasteCell.attr("pbrq");
var canedit = self.can_edit();
if (canedit == 0) {
return;
}
var int_row_gap = $pasteCell.attr("rowid") - copyArray[0].attr("rowid");
var int_col_gap = $pasteCell.attr("day") - copyArray[0].attr("day");
for (var m = 0; m < copyArray.length; m++) {
var $from = copyArray[m];
var day = parseInt($from.attr("day")) + int_col_gap;
var rowid = parseInt($from.attr("rowid")) + int_row_gap;
var $to = $("#td_" + rowid + "_" + day);
if ($to.hasClass('waijie')) {
continue;
}
if ($from.text() == "---") {
continue;
}
if ($to.size() > 0) {
var zgid1 = $("#" + copyArray[m].attr("id")).siblings(":first").attr("zgid");
var pbrq1 = $("#" + copyArray[m].attr("id")).attr("pbrq");
var zgid2 = $to.siblings(":first").attr("zgid");
var pbrq2 = $to.attr("pbrq");
var is_holiday = ($to.hasClass("holiday") || $to.hasClass("normalday")) ? 1 : 0;
var bcids = $from.children("span").map(function () {
if ($(this).attr("bcid") != "") {
return $(this).attr("bcid");
}
}).get().join(",");
arr_selected_cells.push({ TOID: $to.attr("id"), FROM_HTML: $from.html(), TO_HTML: $to.html() });
toArray.push({ FROM_ZGID: zgid1, TO_ZGID: zgid2, FROM_PBRQ: pbrq1, TO_PBRQ: pbrq2, BCIDS: bcids, HOLIDAY: is_holiday, TOID: $to.attr("id") });
}
}
if (toArray.length == 0) {
return;
}
var dataobj = { TOS: $.toJSON(toArray), KSID: $("#KSID").val(), PBRQ_START: $("#PBRQ_START").val(), PBRQ_END: $("#PBRQ_END").val() };
self.push_operate(self.obj_operate.paste, dataobj);
for (var p in arr_selected_cells) {
var TOID = arr_selected_cells[p].TOID;
var FROM_HTML = arr_selected_cells[p].FROM_HTML;
$("#" + TOID).html(FROM_HTML);
}
};
// 撤销粘贴
PaibanDaoruCls.prototype.undo_paste = function (callback) {
var self = this;
var dataobj = self.arr_operate_data[self.pointer];
var cellarr = []; //self.arr_operate_cell[self.pointer];
//TOS:[{FROM_ZGID: zgid1, TO_ZGID: zgid2, FROM_PBRQ: pbrq1, TO_PBRQ: pbrq2, BCIDS: bcids, HOLIDAY: is_holiday, TOID: td_id }]
var tos = $.parseJSON(dataobj.TOS);
var deletes = [];
for (var i = 0; i < tos.length; i++) {
deletes.push({ ZGID: tos[i].TO_ZGID, PBRQ: tos[i].TO_PBRQ });
cellarr.push(tos[i].TOID);
}
var postdotaobj = { KSID: dataobj.KSID, PBRQ_START: dataobj.PBRQ_START, PBRQ_END: dataobj.PBRQ_END, DELETES: $.toJSON(deletes) }
callback();
for (var p in cellarr) {
$("#" + cellarr[p]).empty();
}
};
// redo 粘贴
PaibanDaoruCls.prototype.redo_paste = function (callback) {
var self = this;
var dataobj = self.arr_operate_data[self.pointer + 1];
var cellarr = []; //self.arr_operate_cell[self.pointer + 1];
callback();
//TOS:[{FROM_ZGID: zgid1, TO_ZGID: zgid2, FROM_PBRQ: pbrq1, TO_PBRQ: pbrq2, BCIDS: bcids, HOLIDAY: is_holiday, TOID: toid }]
var tos = $.parseJSON(dataobj.TOS);
var dict = {};
for (var i = 0; i < tos.length; i++) {
var arrbcid = tos[i].BCIDS.split(',');
for (var j = 0; j < arrbcid.length; j++) {
var bcid = arrbcid[j];
var bchtml = "";
if (dict[bcid]) {
bchtml = dict[bcid];
} else {
bchtml = self.get_bcid_html(bcid);
dict[bcid] = bchtml;
}
if (j == 0) {
$("#" + tos[i].TOID).empty().append(bchtml);
} else {
$("#" + tos[i].TOID).append(bchtml);
}
}
}
};
// 点击删除
PaibanDaoruCls.prototype.do_delete = function () {
var canedit = this.can_edit();
if (canedit == 0) {
return;
}
var self = this;
var arr_selected_cells = [];
var deleteArray = new Array();
var undoDeleteArray = [];
var undoDeleteCells = [];
$(".selected-cell").each(function () {
var $this = $(this);
if (!$this.hasClass("day-cell")) return;
var pbrq = $this.attr("pbrq");
var is_holiday = ($this.hasClass("holiday") || $this.hasClass("normalday")) ? 1 : 0;
var pbrq = $this.attr("pbrq");
var zgid = $this.siblings(":first").attr("zgid");
arr_selected_cells.push($this);
undoDeleteCells.push($this.clone());
$this.find("span").each(function (i, span) {
var bcid = span.getAttribute("bcid");
undoDeleteArray.push({ ZGID: zgid, PBRQ: pbrq, BCID: bcid, PXXH: i + 1, HOLIDAY: is_holiday });
});
deleteArray.push({ ZGID: zgid, PBRQ: pbrq });
});
if (deleteArray.length == 0) {
return;
}
var dataobj = { KSID: $("#KSID").val(), PBRQ_START: $("#PBRQ_START").val(), PBRQ_END: $("#PBRQ_END").val(), INSERTS: $.toJSON(undoDeleteArray), UPDATES: $.toJSON([]) };
self.push_operate(self.obj_operate.del, dataobj, undoDeleteCells);
for (var p in arr_selected_cells) {
var $cell = arr_selected_cells[p];
if ($cell.html().indexOf(">---<") < 0)
$cell.empty();
}
};
// 撤销删除
PaibanDaoruCls.prototype.undo_delete = function (callback) {
var self = this;
var dataobj = self.arr_operate_data[self.pointer];
var cellarr = self.arr_operate_cell[self.pointer];
dataobj.undodelete = "1";
callback();
for (var p in cellarr) {
$("#" + cellarr[p].attr("id")).html(cellarr[p].get(0).innerHTML)
}
}
// redo 删除
PaibanDaoruCls.prototype.redo_delete = function (callback) {
var self = this;
var dataobj = self.arr_operate_data[self.pointer + 1];
var cellarr = self.arr_operate_cell[self.pointer + 1];
var inserts = $.parseJSON(dataobj.INSERTS);
var postdotaobj = { KSID: dataobj.KSID, PBRQ_START: dataobj.PBRQ_START, PBRQ_END: dataobj.PBRQ_END, DELETES: dataobj.INSERTS }
callback();
for (var p in cellarr) {
$("#" + cellarr[p].attr("id")).empty();
}
};
// 点击应用
PaibanDaoruCls.prototype.do_apply = function () {
var canedit = this.can_edit();
if (canedit == 0) {
return;
}
var self = this;
// 选中的单元格
var arr_selected_cells = [];
// 将要写入的班次
var arr_insert = [];
// 将要编辑的班次(会更新修改人修改日期)[比如班次A应用到含有班次A的单元格中,这条数据将会进入编辑]
var arr_update = [];
var bcid = $("#BCID").val();
$(".selected-cell").each(function () {
var $this = $(this);
if (!$this.hasClass("day-cell")) return true;
arr_selected_cells.push($this);
var is_holiday = ($this.hasClass("holiday") || $this.hasClass("normalday")) ? 1 : 0;
var pbrq = $this.attr("pbrq");
var zgid = $this.siblings(":first").attr("zgid");
if ("---" == $this.text()) {
// "---" 一般是调走了的,注销了的
return true;
}
// 双击(应用)单元格前,格子里就有的班次,存到 数组 arr_exist_bcid 中
var arr_exist_bcid = [];
var bcspan = $this.children("span");
if (bcspan.length > 0) {
bcspan.each(function (i, n) {
var bcspan_bcid = n.getAttribute("bcid");
if (bcspan_bcid) {
arr_exist_bcid.push(bcspan_bcid);
}
});
}
if (arr_exist_bcid.length > 0) {
if (arr_exist_bcid.join(",").indexOf(bcid) >= 0) {
for (var m = 0; m < arr_exist_bcid.length; m++) {
if (arr_exist_bcid[m] == bcid) {
// 应用的班次如果存在于单元格中,写进 编辑数组 arr_update 中 ,需要注意的是 PXXH 不能保存错
arr_update.push({ ZGID: zgid, PBRQ: pbrq, BCID: bcid, PXXH: m + 1 });
}
}
} else {
arr_insert.push({ ZGID: zgid, PBRQ: pbrq, BCID: bcid, PXXH: arr_exist_bcid.length + 1, HOLIDAY: is_holiday });
}
} else {
arr_insert.push({ ZGID: zgid, PBRQ: pbrq, BCID: bcid, PXXH: 1, HOLIDAY: is_holiday });
}
});
if (arr_insert.length == 0 && arr_update.length == 0) {
return;
}
var dataobj = { KSID: $("#KSID").val(), PBRQ_START: $("#PBRQ_START").val(), PBRQ_END: $("#PBRQ_END").val(), INSERTS: $.toJSON(arr_insert), UPDATES: $.toJSON(arr_update) };
self.push_operate(self.obj_operate.apply, dataobj, arr_selected_cells);
self.fixed_cell(bcid, arr_selected_cells);
};
// redo 应用
PaibanDaoruCls.prototype.redo_apply = function (callback) {
var self = this;
var dataobj = self.arr_operate_data[self.pointer + 1];
var cellarr = self.arr_operate_cell[self.pointer + 1];
var inserts = $.parseJSON(dataobj.INSERTS);
var bcid = inserts[0].BCID;
callback();
self.fixed_cell(bcid, cellarr);
};
// 撤销应用
PaibanDaoruCls.prototype.undo_apply = function (callback) {
var self = this;
var dataobj = self.arr_operate_data[self.pointer];
var cellarr = self.arr_operate_cell[self.pointer];
callback();
for (var p in cellarr) {
var $cell = cellarr[p];
if ("---" == $cell.text()) {
// "---" 一般是调走了的,注销了的
continue;
}
var cell_html = "";
var bcspan = $cell.children("span");
if (bcspan.length > 0) {
bcspan.each(function (i, n) {
if (i < bcspan.length - 1) {
if (i > 0) { cell_html + "/"; }
cell_html += n.outerHTML;
}
});
$cell.html(cell_html);
}
}
}
// 互换班次
PaibanDaoruCls.prototype.exchange = function () {
var sels = [];
$(".selected-cell").each(function () {
if ($(this).hasClass("day-cell")) {
sels.push($(this));
}
});
if (sels.length > 2) {
alert('只能在两个选中的单元格之间互换');
return;
} else if (sels.length < 2) {
alert('请按住ctrl选中要互换班次的单元格');
return;
}
var self = this;
var cell1 = $(sels[0]), cell2 = $(sels[1]);
var arr1 = [], arr2 = [];
var bcid1 = [], bcid2 = []
cell1.children("span").each(function (i, span) {
arr1.push(span.getAttribute("bcid"));
bcid1.push(span.getAttribute("bcid"));
});
cell2.children("span").each(function (i, span) {
arr2.push(span.getAttribute("bcid"));
bcid2.push(span.getAttribute("bcid"));
});
if (cell1.children("span").length == cell2.children("span").length) {
if (arr1.sort().join(",") == arr2.sort().join(",")) {
alert('无效的互换');
return;
}
}
var zgid1 = cell1.siblings(":first").attr("zgid");
var zgid2 = cell2.siblings(":first").attr("zgid");
var pbrq1 = cell1.attr("pbrq");
var pbrq2 = cell2.attr("pbrq");
var ksid = $("#KSID").val();
var is_holiday1 = (cell1.hasClass("holiday") || cell1.hasClass("normalday")) ? 1 : 0;
var is_holiday2 = (cell2.hasClass("holiday") || cell2.hasClass("normalday")) ? 1 : 0;
var clone1 = cell1.clone();
var clone2 = cell2.clone();
cell1.html(clone2.html());
cell2.html(clone1.html());
// 交换后,不许再撤销
self.clear();
}
// 班次的html代码
PaibanDaoruCls.prototype.get_bcid_html = function (bcid) {
if (bcid == "" || bcid == undefined) {
return "";
}
var option = $("#BCID").children("option[value='" + bcid + "']");
var qjs = option.css("color");
var bjs = option.css("background-color");
var bcmc = option.attr("bcmc");
var bcjc = option.attr("bcjc");
bcmc = bcjc;
return "<span id='--" + bcid + "--' bcid='" + bcid + "' user_id='$0$' onmouseover='over_bc();' onmouseout='out_bc()' oncontextmenu='contextMenuClick()' ondblclick='dbclick_bc()' style='cursor:pointer;color:" + qjs + ";background-color:" + bjs + "'>" + bcmc + "</span>";
}
// 双击和应用班次成功后,将界面修补完整
PaibanDaoruCls.prototype.fixed_cell = function (bcid, arr_selected_cells) {
var self = this;
var bc_html = self.get_bcid_html(bcid)
for (var p in arr_selected_cells) {
var $cell = arr_selected_cells[p];
if ("---" == $cell.text()) {
// "---" 一般是调走了的,注销了的
continue;
}
var arr_exist_bcid = [];
var bcspan = $cell.children("span");
if (bcspan.length > 0) {
bcspan.each(function (i, n) {
var bcspan_bcid = n.getAttribute("bcid");
if (bcspan_bcid) {
arr_exist_bcid.push(bcspan_bcid);
}
});
}
if (arr_exist_bcid.length > 0) {
if (arr_exist_bcid.join(",").indexOf(bcid) >= 0) {
continue;
} else {
$cell.append("/" + bc_html);
}
} else {
$cell.append(bc_html);
}
}
};
// 辐射班次
PaibanDaoruCls.prototype.radiation = function () {
// 选中一个有班次的单元格
// 点击 辐射 按钮 启动辐射功能
// 即 单击单元格击应用辐射源的班次
var self = this;
var bflagdwon = $("#btnFlag").hasClass("pbtn-down");
if (!bflagdwon) {
return;
}
if (self.radiation_source.length == 0) {
return;
}
var canedit = this.can_edit();
if (canedit == 0) {
return;
}
// 选中的单元格
var arr_selected_cells = [];
// 将要写入的班次
var arr_insert = [];
// 将要编辑的班次(会更新修改人修改日期)[比如班次A应用到含有班次A的单元格中,这条数据将会进入编辑]
var arr_update = [];
//var bcid = $("#BCID").val();
// 辐射源的bcid数组
var arr_radiation_bcid = [];
self.radiation_source[0].children("span").each(function (a, b) {
arr_radiation_bcid.push(b.getAttribute("bcid"));
});
var radiation_zgid = self.radiation_source[0].siblings(":first").attr("zgid");
var radiation_pbrq = self.radiation_source[0].attr("pbrq");
$(".selected-cell").each(function () {
var $this = $(this);
if (!$this.hasClass("day-cell")) return true;
//过滤辐射源
if ($this.attr("id") == self.radiation_source[0].attr("id")) return true;
arr_selected_cells.push($this);
var is_holiday = ($this.hasClass("holiday") || $this.hasClass("normalday")) ? 1 : 0;
var pbrq = $this.attr("pbrq");
var zgid = $this.siblings(":first").attr("zgid");
if ("---" == $this.text()) {
// "---" 一般是调走了的,注销了的
return true;
}
// 双击(应用)单元格前,格子里就有的班次,存到 数组 arr_exist_bcid 中
var arr_exist_bcid = [];
var bcspan = $this.children("span");
if (bcspan.length > 0) {
bcspan.each(function (i, n) {
var bcspan_bcid = n.getAttribute("bcid");
if (bcspan_bcid) {
arr_exist_bcid.push(bcspan_bcid);
}
});
}
for (var u = 0; u < arr_radiation_bcid.length; u++) {
var bcid = arr_radiation_bcid[u];
if (arr_exist_bcid.length > 0) {
if (arr_exist_bcid.join(",").indexOf(bcid) >= 0) {
for (var m = 0; m < arr_exist_bcid.length; m++) {
if (arr_exist_bcid[m] == bcid) {
// 应用的班次如果存在于单元格中,写进 编辑数组 arr_update 中 ,需要注意的是 PXXH 不能保存错
arr_update.push({ ZGID: zgid, PBRQ: pbrq, BCID: bcid, PXXH: m + 1 });
}
}
} else {
arr_insert.push({ ZGID: zgid, PBRQ: pbrq, BCID: bcid, PXXH: arr_exist_bcid.length + 1, HOLIDAY: is_holiday });
}
} else {
arr_insert.push({ ZGID: zgid, PBRQ: pbrq, BCID: bcid, PXXH: 1, HOLIDAY: is_holiday });
}
}
});
if (arr_insert.length == 0 && arr_update.length == 0) {
return;
}
var dataobj = { KSID: $("#KSID").val(), PBRQ_START: $("#PBRQ_START").val(), PBRQ_END: $("#PBRQ_END").val(), INSERTS: $.toJSON(arr_insert), UPDATES: $.toJSON(arr_update) };
dataobj.radiation_zgid = radiation_zgid;
dataobj.radiation_pbrq = radiation_pbrq;
self.push_operate(self.obj_operate.apply, dataobj, arr_selected_cells);
for (var u = 0; u < arr_radiation_bcid.length; u++) {
self.fixed_cell(arr_radiation_bcid[u], arr_selected_cells);
}
};
PaibanDaoruCls.prototype.doimport = function () {
var table = document.getElementById("Grid1");
var postjson = [];
for (var i = 1; i < table.rows.length; i++) {
var cells = table.rows[i].cells;
var obj = {
zgid: cells[1].innerText,
arr_pbbc: []
};
for (var j = 4; j <= 10; j++) {
var cell = cells[j];
var childnodes = cell.childNodes;
var arrbc = [];
for (var k = 0; k < childnodes.length; k++) {
if (childnodes[k].tagName == "SPAN" && childnodes[k].getAttribute("bcid")) {
arrbc.push(childnodes[k].getAttribute("bcid"));
}
}
obj.arr_pbbc.push(arrbc.join(","));
}
postjson.push(obj);
}
var jsonstr = $.toJSON(postjson);
var ksid = document.getElementById("KSID").value;
var pbrq = document.getElementById("IMPPBRQ").value;
var rypx = document.getElementById("ckbox_saveordernum").checked ? 1 : 0;
$.post("../../hr/paibandaoru/doimp", { jsonstr: jsonstr, ksid: ksid, pbrq: pbrq, rypx: rypx }, function (msg) {
alert(msg.msg);
});
};