'use strict';
/**
* 临时占地
*
* @author Mai
* @date 2021/10/21
* @version
*/
$(document).ready(() => {
autoFlashHeight();
const tempSpreadSetting = {
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: '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,
}
};
const TempSpread = SpreadJsObj.createNewSpread($('#temp-land-spread')[0]);
const tempSheet = TempSpread.getActiveSheet();
if (thousandth) sjsSettingObj.setTpThousandthFormat(tempSpreadSetting);
SpreadJsObj.initSheet(tempSheet, tempSpreadSetting);
$.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();
TempSpread.refresh();
}
});
class SeTemp {
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 seTempObj = new SeTemp();
const refreshSum = function () {
const sum = seTempObj.sum();
const html = [];
const getTrHtml = function (name, value) {
return '
' + name + ' | ' + (!checkZero(value) ? value : '') + ' |
';
};
html.push(getTrHtml('本期金额', sum.tp));
html.push(getTrHtml('截止本期金额', sum.end_tp));
$('#sum').html(html.join(' '));
};
postData(window.location.pathname + '/load', null, function (result) {
seTempObj.loadDatas(result);
SpreadJsObj.loadSheetData(tempSheet, SpreadJsObj.DataType.Data, seTempObj.data);
refreshSum();
});
if (!readOnly) {
const seTempOprObj = {
/**
* 删除按钮响应事件
* @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) {
seTempObj.loadUpdateData(result);
SpreadJsObj.reLoadSheetData(tempSheet);
refreshSum();
}, function () {
SpreadJsObj.reLoadSheetData(tempSheet);
});
}
},
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) {
seTempObj.loadUpdateData(result);
SpreadJsObj.reLoadSheetData(tempSheet);
refreshSum();
}, function () {
SpreadJsObj.reLoadSheetData(tempSheet);
});
}
},
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) {
seTempObj.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':
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) {
seTempObj.loadUpdateData(result);
SpreadJsObj.reLoadSheetData(info.sheet);
refreshSum();
});
} else {
SpreadJsObj.reLoadSheetData(info.sheet);
}
},
upMove: function () {
const sels = tempSheet.getSelections(), sortData = tempSheet.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) {
seTempObj.loadUpdateData(result);
SpreadJsObj.reLoadRowsData(tempSheet, [sels[0].row, sels[0].row - 1]);
tempSheet.setSelection(sels[0].row - 1, sels[0].col, sels[0].rowCount, sels[0].colCount);
});
},
downMove: function () {
const sels = tempSheet.getSelections(), sortData = tempSheet.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) {
seTempObj.loadUpdateData(result);
SpreadJsObj.reLoadRowsData(tempSheet, [sels[0].row, sels[0].row + 1]);
tempSheet.setSelection(sels[0].row + 1, sels[0].col, sels[0].rowCount, sels[0].colCount);
});
}
};
tempSheet.bind(spreadNS.Events.EditEnded, seTempOprObj.editEnded);
tempSheet.bind(spreadNS.Events.EditStarting, seTempOprObj.editStarting);
tempSheet.bind(spreadNS.Events.ClipboardPasting, seTempOprObj.clipboardPasting);
SpreadJsObj.addDeleteBind(TempSpread, seTempOprObj.deletePress);
$.contextMenu({
selector: '#temp-land-spread',
build: function ($trigger, e) {
const target = SpreadJsObj.safeRightClickSelection($trigger, e, TempSpread);
return target.hitTestType === spreadNS.SheetArea.viewport || target.hitTestType === spreadNS.SheetArea.rowHeader;
},
items: {
del: {
name: '删除',
icon: 'fa-remove',
callback: function (key, opt) {
seTempOprObj.delete(tempSheet);
},
disabled: function (key, opt) {
const sels = tempSheet.getSelections();
if (!sels || !sels[0]) return true;
const row = sels[0].row;
const node = seTempObj.data[row];
return node === undefined || node === null;
},
visible: function (key, opt) {
return !readOnly;
}
},
sprDel: '------------',
upMove: {
name: '上移',
icon: 'fa-arrow-up',
callback: function (key, opt) {
seTempOprObj.upMove();
},
disabled: function (key, opt) {
const sels = tempSheet.getSelections();
if (!sels || !sels[0] || sels[0].row === 0) return true;
const row = sels[0].row;
const node = seTempObj.data[row];
return node === undefined || node === null;
},
visible: function (key, opt) {
return !readOnly;
}
},
downMove: {
name: '下移',
icon: 'fa-arrow-down',
callback: function (key, opt) {
seTempOprObj.downMove();
},
disabled: function (key, opt) {
const sels = tempSheet.getSelections();
if (!sels || !sels[0] || sels[0].row >= seTempObj.data.length - 1) return true;
const row = sels[0].row;
const node = seTempObj.data[row];
return node === undefined || node === null;
},
visible: function (key, opt) {
return !readOnly;
}
}
},
})
}
$('#exportExcel').click(function () {
SpreadExcelObj.exportSimpleXlsxSheet(tempSpreadSetting, seTempObj.data, $('.sidebar-title').attr('data-original-title') + "-临时占地.xlsx");
});
});