'use strict';
/**
* 安全生产
*
* @author Mai
* @date 2021/10/21
* @version
*/
$(document).ready(() => {
autoFlashHeight();
const safeSpreadSetting = {
cols: [
{title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 350, formatter: '@'},
{title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 60, formatter: '@', cellType: 'unit'},
{title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number'},
{title: '计划|数量', colSpan: '2|1', rowSpan: '1|1', field: 'quantity', hAlign: 2, width: 60, type: 'Number'},
{title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 60, type: 'Number', readOnly: true},
{title: '本期|数量', colSpan: '2|1', rowSpan: '1|1', field: 'qty', hAlign: 2, width: 60, type: 'Number'},
{title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'tp', hAlign: 2, width: 60, type: 'Number', readOnly: true},
{title: '截止本期|数量', colSpan: '2|1', rowSpan: '1|1', field: 'end_qty', hAlign: 2, width: 60, type: 'Number', readOnly: true},
{title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'end_tp', hAlign: 2, width: 60, type: 'Number', readOnly: true},
{title: '备注', colSpan: '1', rowSpan: '2', field: 'memo', hAlign: 0, width: 180, formatter: '@', cellType: 'ellipsisAutoTip'}
],
emptyRows: readOnly ? 0 : 3,
headRows: 2,
headRowHeight: [25, 25],
defaultRowHeight: 21,
headerFont: '12px 微软雅黑',
font: '12px 微软雅黑',
readOnly: readOnly,
localCache: {
key: 'stage-extra-temp',
colWidth: true,
},
getColor: function (sheet, data, row, col, defaultColor) {
if (!data || !data.quantity) return defaultColor;
return data.quantity >= 0
? data.end_qty > data.quantity ? '#f8d7da' : defaultColor
: data.end_qty < data.quantity ? '#f8d7da' : defaultColor;
}
};
const safeSpread = SpreadJsObj.createNewSpread($('#safe-prod-spread')[0]);
const safeSheet = safeSpread.getActiveSheet();
if (thousandth) sjsSettingObj.setTpThousandthFormat(safeSpreadSetting);
SpreadJsObj.initSheet(safeSheet, safeSpreadSetting);
$.subMenu({
menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
key: 'menu.1.0.0',
miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
callback: function (info) {
if (info.mini) {
$('.panel-title').addClass('fluid');
$('#sub-menu').removeClass('panel-sidebar');
} else {
$('.panel-title').removeClass('fluid');
$('#sub-menu').addClass('panel-sidebar');
}
autoFlashHeight();
safeSpread.refresh();
}
});
class SeSafe {
constructor () {
this.data = [];
}
resortData() {
this.data.sort(function (a, b) {
return a.order - b.order;
});
}
calculateAll() {
for (const d of this.data) {
d.end_qty = ZhCalc.add(d.pre_qty, d.qty);
d.end_tp = ZhCalc.add(d.pre_tp, d.tp);
}
}
loadDatas(datas) {
this.data = datas;
this.calculateAll();
this.resortData();
}
loadUpdateData(updateData) {
if (updateData.add) {
for (const a of updateData.add) {
this.data.push(a);
}
}
if (updateData.update) {
for (const u of updateData.update) {
const d = this.data.find(function (x) {
return u.id === x.id;
});
if (d) {
_.assign(d, u);
} else {
this.data.push(d);
}
}
}
if (updateData.del) {
_.remove(this.data, function (d) {
return updateData.del.indexOf(d.id) >= 0;
});
}
this.calculateAll();
this.resortData();
}
sum () {
const result = {
total_price: 0,
tp: 0,
end_tp: 0,
};
for (const d of this.data) {
result.total_price = ZhCalc.add(result.total_price, d.total_price);
result.tp = ZhCalc.add(result.tp, d.tp);
result.end_tp = ZhCalc.add(result.end_tp, d.end_tp);
}
return result;
}
}
const seSafeObj = new SeSafe();
const refreshSum = function () {
const sum = seSafeObj.sum();
const html = [];
const getTrHtml = function (name, value) {
return '
' + name + ' | ' + (!checkZero(value) ? value : '') + ' |
';
};
html.push(getTrHtml('金额', sum.total_price));
html.push(getTrHtml('本期金额', sum.tp));
html.push(getTrHtml('截止本期金额', sum.end_tp));
$('#sum').html(html.join(' '));
};
postData(window.location.pathname + '/load', null, function (result) {
seSafeObj.loadDatas(result);
SpreadJsObj.loadSheetData(safeSheet, SpreadJsObj.DataType.Data, seSafeObj.data);
refreshSum();
});
if (!readOnly) {
const seSafeOprObj = {
/**
* 删除按钮响应事件
* @param sheet
*/
deletePress: function (sheet) {
if (!sheet.zh_setting || readOnly) return;
const sortData = sheet.zh_data;
const datas = [];
const sels = sheet.getSelections();
if (!sels || !sels[0]) return;
for (let iRow = sels[0].row; iRow < sels[0].row + sels[0].rowCount; iRow++) {
let bDel = false;
const node = sortData[iRow];
if (node) {
const data = {id: node.id};
for (let iCol = sels[0].col; iCol < sels[0].col + sels[0].colCount; iCol++) {
const colSetting = sheet.zh_setting.cols[iCol];
if (colSetting.field === 'name') {
toastr.error('名称不能为空,如需删除请使用右键删除');
return;
}
const style = sheet.getStyle(iRow, iCol);
if (!style.locked) {
const colSetting = sheet.zh_setting.cols[iCol];
data[colSetting.field] = null;
bDel = true;
}
}
if (bDel) {
datas.push(data);
}
}
}
if (datas.length > 0) {
postData(window.location.pathname + '/update', {update: datas}, function (result) {
seSafeObj.loadUpdateData(result);
SpreadJsObj.reLoadSheetData(safeSheet);
refreshSum();
}, function () {
SpreadJsObj.reLoadSheetData(safeSheet);
});
}
},
delete: function (sheet) {
if (!sheet.zh_setting || readOnly) return;
const sortData = sheet.zh_data;
const datas = [];
const sels = sheet.getSelections();
if (!sels || !sels[0]) return;
const hint = {
isOld: {type: 'warning', msg: '该数据已计量,不可删除'},
invalidDel: {type: 'warning', msg: '该数据为往期新增,只有原报可删除'},
};
for (let iRow = sels[0].row, iLen = sels[0].row + sels[0].rowCount; iRow < iLen; iRow++) {
const node = sortData[iRow];
if (node.pre_used || !checkZero(node.end_tp)) {
toastMessageUniq(hint.isOld);
continue;
} else {
if (node.add_sid !== stageId && stageUserId !== userID) {
toastMessageUniq(hint.invalidDel);
continue;
}
datas.push(node.id);
}
}
if (datas.length > 0) {
postData(window.location.pathname + '/update', {del: datas}, function (result) {
seSafeObj.loadUpdateData(result);
SpreadJsObj.reLoadSheetData(safeSheet);
refreshSum();
}, function () {
SpreadJsObj.reLoadSheetData(safeSheet);
});
}
},
editEnded: function (e, info) {
if (!info.sheet.zh_setting || !info.sheet.zh_data) return;
const node = info.sheet.zh_data[info.row];
const col = info.sheet.zh_setting.cols[info.col];
const data = {};
if (node) {
data.update = {};
data.update.id = node.id;
const oldValue = node ? node[col.field] : null;
const newValue = trimInvalidChar(info.editingText);
if (oldValue == info.editingText || ((!oldValue || oldValue === '') && (newValue === ''))) {
SpreadJsObj.reLoadRowData(info.sheet, info.row);
return;
}
data.update[col.field] = newValue;
} else {
if (col.field !== 'name') {
toastr.warning('请先输入名称');
SpreadJsObj.reLoadRowData(info.sheet, info.row);
return;
}
data.add = {};
data.add.order = info.row + 1;
data.add.name = trimInvalidChar(info.editingText);
}
postData(window.location.pathname + '/update', data, function (result) {
seSafeObj.loadUpdateData(result);
SpreadJsObj.reLoadSheetData(info.sheet);
refreshSum();
}, function () {
SpreadJsObj.reLoadRowData(info.sheet, info.row);
});
},
editStarting(e, info) {
if (!info.sheet.zh_setting || !info.sheet.zh_data) {
info.cancel = true;
return;
}
const col = info.sheet.zh_setting.cols[info.col];
const node = info.sheet.zh_data[info.row];
if (!node) return;
switch (col.field) {
case 'unit':
case 'unit_price':
case 'quantity':
info.cancel = readOnly || node.pre_used;
break;
}
},
clipboardPasting(e, info) {
const setting = info.sheet.zh_setting, sortData = info.sheet.zh_data;
info.cancel = true;
if (!setting || !sortData) return;
const pasteData = info.pasteData.html
? SpreadJsObj.analysisPasteHtml(info.pasteData.html)
: (info.pasteData.text === ''
? SpreadJsObj.Clipboard.getAnalysisPasteText()
: SpreadJsObj.analysisPasteText(info.pasteData.text));
const hint = {
name: {type: 'warning', msg: '名称不可为空,已过滤'},
};
const uDatas = [], iDatas = [];
for (let iRow = 0; iRow < info.cellRange.rowCount; iRow++) {
const curRow = info.cellRange.row + iRow;
const node = sortData[curRow];
let bPaste = false;
const data = {};
for (let iCol = 0; iCol < info.cellRange.colCount; iCol++) {
const curCol = info.cellRange.col + iCol;
const colSetting = setting.cols[curCol];
const value = trimInvalidChar(pasteData[iRow][iCol]);
if (colSetting.field === 'name' && (!value || value === '')) {
toastMessageUniq(hint.name);
break;
}
if (colSetting.type === 'Number') {
const num = _.toNumber(value);
if (num) {
data[colSetting.field] = num;
bPaste = true;
}
} else {
data[colSetting.field] = value;
bPaste = true;
}
}
if (bPaste) {
if (node) {
data.id = node.id;
uDatas.push(data);
} else {
data.order = curRow + 1;
iDatas.push(data);
}
}
}
const updateData = {};
if (uDatas.length > 0) updateData.update = uDatas;
if (iDatas.length > 0) updateData.add = iDatas;
if (uDatas.length > 0 || iDatas.length > 0) {
postData(window.location.pathname + '/update', updateData, function (result) {
seSafeObj.loadUpdateData(result);
SpreadJsObj.reLoadSheetData(info.sheet);
refreshSum();
});
} else {
SpreadJsObj.reLoadSheetData(info.sheet);
}
},
upMove: function () {
const sels = safeSheet.getSelections(), sortData = safeSheet.zh_data;
const node = sortData[sels[0].row];
const preNode = sortData[sels[0].row - 1];
const data = [
{id: node.id, order: preNode.order},
{id: preNode.id, order: node.order}
];
postData(window.location.pathname + '/update', {update: data}, function (result) {
seSafeObj.loadUpdateData(result);
SpreadJsObj.reLoadRowsData(safeSheet, [sels[0].row, sels[0].row - 1]);
safeSheet.setSelection(sels[0].row - 1, sels[0].col, sels[0].rowCount, sels[0].colCount);
});
},
downMove: function () {
const sels = safeSheet.getSelections(), sortData = safeSheet.zh_data;
const node = sortData[sels[0].row];
const nextNode = sortData[sels[0].row + 1];
const data = [
{id: node.id, order: nextNode.order},
{id: nextNode.id, order: node.order}
];
postData(window.location.pathname + '/update', {update: data}, function (result) {
seSafeObj.loadUpdateData(result);
SpreadJsObj.reLoadRowsData(safeSheet, [sels[0].row, sels[0].row + 1]);
safeSheet.setSelection(sels[0].row + 1, sels[0].col, sels[0].rowCount, sels[0].colCount);
});
}
};
safeSheet.bind(spreadNS.Events.EditEnded, seSafeOprObj.editEnded);
safeSheet.bind(spreadNS.Events.EditStarting, seSafeOprObj.editStarting);
safeSheet.bind(spreadNS.Events.ClipboardPasting, seSafeOprObj.clipboardPasting);
SpreadJsObj.addDeleteBind(safeSpread, seSafeOprObj.deletePress);
$.contextMenu({
selector: '#safe-prod-spread',
build: function ($trigger, e) {
const target = SpreadJsObj.safeRightClickSelection($trigger, e, safeSpread);
return target.hitTestType === spreadNS.SheetArea.viewport || target.hitTestType === spreadNS.SheetArea.rowHeader;
},
items: {
del: {
name: '删除',
icon: 'fa-remove',
callback: function (key, opt) {
seSafeOprObj.delete(safeSheet);
},
disabled: function (key, opt) {
const sels = safeSheet.getSelections();
if (!sels || !sels[0]) return true;
const row = sels[0].row;
const node = seSafeObj.data[row];
return node === undefined || node === null;
},
visible: function (key, opt) {
return !readOnly;
}
},
sprDel: '------------',
upMove: {
name: '上移',
icon: 'fa-arrow-up',
callback: function (key, opt) {
seSafeOprObj.upMove();
},
disabled: function (key, opt) {
const sels = safeSheet.getSelections();
if (!sels || !sels[0] || sels[0].row === 0) return true;
const row = sels[0].row;
const node = seSafeObj.data[row];
return node === undefined || node === null;
},
visible: function (key, opt) {
return !readOnly;
}
},
downMove: {
name: '下移',
icon: 'fa-arrow-down',
callback: function (key, opt) {
seSafeOprObj.downMove();
},
disabled: function (key, opt) {
const sels = safeSheet.getSelections();
if (!sels || !sels[0] || sels[0].row >= seSafeObj.data.length - 1) return true;
const row = sels[0].row;
const node = seSafeObj.data[row];
return node === undefined || node === null;
},
visible: function (key, opt) {
return !readOnly;
}
}
},
})
}
$('#exportExcel').click(function () {
SpreadExcelObj.exportSimpleXlsxSheet(safeSpreadSetting, seSafeObj.data, $('.sidebar-title').attr('data-original-title') + "-安全生产.xlsx");
});
});