|
@@ -12,6 +12,10 @@ function checkTzMeasureType () {
|
|
|
return tender.measure_type === measureType.tz.value;
|
|
|
}
|
|
|
|
|
|
+function transExpr(expr) {
|
|
|
+ return expr.replace('=', '').replace('%', '/100');
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* 从cookie中读取缓存的列显示设置,没有则取默认
|
|
|
* @returns {*[]}
|
|
@@ -444,6 +448,9 @@ $(document).ready(() => {
|
|
|
changesObj.loadChanges({bills: data});
|
|
|
};
|
|
|
ledgerSpreadSetting.dgnUpFields = ['deal_dgn_qty1', 'deal_dgn_qty2', 'c_dgn_qty1', 'c_dgn_qty2'];
|
|
|
+ ledgerSpreadSetting.getColor = function (sheet, data, col, defaultColor) {
|
|
|
+ return data && data.end_contract_qty > data.quantity ? '#f8d7da' : defaultColor;
|
|
|
+ };
|
|
|
SpreadJsObj.initSheet(slSpread.getActiveSheet(), ledgerSpreadSetting);
|
|
|
|
|
|
stageTree.loadDatas(ledgerData);
|
|
@@ -472,9 +479,32 @@ $(document).ready(() => {
|
|
|
const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet());
|
|
|
changesObj.loadChanges({bills: node, pos: data});
|
|
|
};
|
|
|
+ posSpreadSetting.getColor = function (sheet, data, col, defaultColor) {
|
|
|
+ return data && data.end_contract_qty > data.quantity ? '#f8d7da' : defaultColor;
|
|
|
+ };
|
|
|
SpreadJsObj.initSheet(spSpread.getActiveSheet(), posSpreadSetting);
|
|
|
|
|
|
const stageTreeSpreadObj = {
|
|
|
+ loadExprToInput(sheet) {
|
|
|
+ const sel = sheet.getSelections()[0];
|
|
|
+ const col = sheet.zh_setting.cols[sel.col], cell = sheet.getCell(sel.row, sel.col);
|
|
|
+ if (col.type === 'Number') {
|
|
|
+ const data = SpreadJsObj.getSelectObject(sheet);
|
|
|
+ if (!data) {
|
|
|
+ $('#bills-expr').val('').attr('readOnly', true);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const nodePos = stagePos.getLedgerPos(data.id);
|
|
|
+ if (nodePos && nodePos.length > 0) {
|
|
|
+ $('#bills-expr').val('').attr('readOnly', true);
|
|
|
+ } else {
|
|
|
+ $('#bills-expr').val(data[col.field]).attr('field', col.field).attr('org', data[col.field])
|
|
|
+ .attr('readOnly', readOnly || cell.locked());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ $('#bills-expr').val('').attr('readOnly', true);
|
|
|
+ }
|
|
|
+ },
|
|
|
refreshTreeNodes: function (sheet, nodes) {
|
|
|
const tree = sheet.zh_tree;
|
|
|
if (!tree) { return }
|
|
@@ -491,17 +521,32 @@ $(document).ready(() => {
|
|
|
const node = sortData[info.row], updateData = {};
|
|
|
|
|
|
const orgValue = node[col.field];
|
|
|
- const newValue = col.type === 'Number' ? parseFloat(info.editingText) : info.editingText;
|
|
|
- if (orgValue == newValue || ((!orgValue || orgValue === '') && (newValue === ''))) {
|
|
|
+ let newValue = info.editingText;
|
|
|
+ if (orgValue == newValue || ((!orgValue || orgValue === '') && (!newValue || newValue === ''))) {
|
|
|
return;
|
|
|
}
|
|
|
+ if (col.type === 'Number' && newValue && newValue !== '') {
|
|
|
+ const num = _.toNumber(newValue);
|
|
|
+ if (num) {
|
|
|
+ newValue = num;
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ newValue = math.evaluate(transExpr(newValue));
|
|
|
+ } catch(err) {
|
|
|
+ toastr.error('输入的表达式非法');
|
|
|
+ SpreadJsObj.reLoadRowData(info.sheet, info.row);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (col.field.indexOf('_dgn_') > 0) {
|
|
|
if (node.b_code && node.b_code !== '') {
|
|
|
toastr.error('仅项目节可输入设计数量');
|
|
|
SpreadJsObj.reLoadRowData(info.sheet, info.row);
|
|
|
return;
|
|
|
}
|
|
|
- } else if (col.field !== 'postil') {
|
|
|
+ } else if (col.field !== 'postil' && col.field !== 'memo') {
|
|
|
if (node.children && node.children.length > 0) {
|
|
|
toastr.error('清单父项不可计量');
|
|
|
SpreadJsObj.reLoadRowData(info.sheet, info.row);
|
|
@@ -516,7 +561,12 @@ $(document).ready(() => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (col.field.indexOf('_dgn_') > 0) {
|
|
|
+ if (col.field === 'memo') {
|
|
|
+ updateData.main = {
|
|
|
+ id: node.id
|
|
|
+ };
|
|
|
+ updateData.main[col.field] = newValue;
|
|
|
+ } else if (col.field.indexOf('_dgn_') > 0) {
|
|
|
updateData.dgn = {
|
|
|
id: node.id
|
|
|
};
|
|
@@ -542,6 +592,7 @@ $(document).ready(() => {
|
|
|
posSearch.search();
|
|
|
}
|
|
|
SpreadJsObj.saveTopAndSelect(info.sheet, ckBillsSpread);
|
|
|
+ stageTreeSpreadObj.loadExprToInput(info.sheet);
|
|
|
},
|
|
|
deletePress(sheet) {
|
|
|
if (sheet.zh_setting && sheet.zh_dataType === 'tree') {
|
|
@@ -558,12 +609,12 @@ $(document).ready(() => {
|
|
|
if (validCols.length === 0) { return; }
|
|
|
|
|
|
const sortData = sheet.zh_tree.nodes;
|
|
|
- const datas = [], dgnDatas = [];
|
|
|
+ const datas = [], dgnDatas = [], mainDatas = [];
|
|
|
for (let iRow = sel.row; iRow < sel.row + sel.rowCount; iRow++) {
|
|
|
const node = sortData[iRow];
|
|
|
if (node) {
|
|
|
- const data = { lid: node.id }, dgnData = { id: node.id };
|
|
|
- let filter = true, filterDgn = true;
|
|
|
+ const data = { lid: node.id }, dgnData = { id: node.id }, mainData = { id: node.id };
|
|
|
+ let filter = true, filterDgn = true, filterMain = true;
|
|
|
for (const iCol of validCols) {
|
|
|
const colSetting = sheet.zh_setting.cols[iCol];
|
|
|
if (sheet.zh_setting.dgnUpFields.indexOf(colSetting.field) !== -1) {
|
|
@@ -579,6 +630,9 @@ $(document).ready(() => {
|
|
|
dgnData[colSetting.field] = 0;
|
|
|
filterDgn = false;
|
|
|
}
|
|
|
+ } else if (colSetting.field === 'memo') {
|
|
|
+ mainData[colSetting.field] = null;
|
|
|
+ filterMain = false;
|
|
|
} else {
|
|
|
data[colSetting.field] = null;
|
|
|
filter = false;
|
|
@@ -586,12 +640,14 @@ $(document).ready(() => {
|
|
|
}
|
|
|
if (!filter) datas.push(data);
|
|
|
if (!filterDgn) dgnDatas.push(dgnData);
|
|
|
+ if (!filterMain) mainDatas.push(mainData);
|
|
|
}
|
|
|
}
|
|
|
- if (datas.length > 0 || dgnDatas.length > 0) {
|
|
|
+ if (datas.length > 0 || dgnDatas.length > 0 || mainDatas.length > 0) {
|
|
|
const bills = {};
|
|
|
if (datas.length > 0) bills.stage = datas;
|
|
|
if (dgnDatas.length > 0) bills.dgn = dgnDatas;
|
|
|
+ if (mainDatas.length > 0) bills.main = mainDatas;
|
|
|
postData(window.location.href + '/update', {bills: bills}, function (result) {
|
|
|
const nodes = stageTree.loadPostStageData(result);
|
|
|
stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes);
|
|
@@ -607,7 +663,8 @@ $(document).ready(() => {
|
|
|
const stageField = ['contract_qty', 'contract_tp', 'qc_qty', 'postil'];
|
|
|
for (let iCol = range.col; iCol < range.col + range.colCount; iCol++) {
|
|
|
const col = info.sheet.zh_setting.cols[iCol];
|
|
|
- if ((stageField.indexOf(col.field) === -1) && setting.dgnUpFields.indexOf(col.field) === -1) {
|
|
|
+ if ((stageField.indexOf(col.field) === -1) && setting.dgnUpFields.indexOf(col.field) === -1
|
|
|
+ && col.field !== 'memo') {
|
|
|
toastr.error('不可修改此数据');
|
|
|
info.cancel = true;
|
|
|
return;
|
|
@@ -618,14 +675,15 @@ $(document).ready(() => {
|
|
|
clipboardPasted(e, info) {
|
|
|
if (info.sheet.zh_setting && info.sheet.zh_tree) {
|
|
|
const sheet = info.sheet, setting = info.sheet.zh_setting;
|
|
|
- const filterNodes = [], datas = [], dgnDatas = [];
|
|
|
+ const filterNodes = [], datas = [], dgnDatas = [], mainDatas = [];
|
|
|
+ let bHint = false;
|
|
|
|
|
|
for (let iRow = 0; iRow < info.cellRange.rowCount; iRow++) {
|
|
|
const curRow = iRow + info.cellRange.row;
|
|
|
const node = sheet.zh_tree.getItemsByIndex(curRow);
|
|
|
|
|
|
- const data = {lid: node.id}, dgnData = {id: node.id};
|
|
|
- let filter = true, filterDgn = true;
|
|
|
+ const data = {lid: node.id}, dgnData = {id: node.id}, mainData = {id: node.id};
|
|
|
+ let filter = true, filterDgn = true, filterMain = true;
|
|
|
for (let iCol = 0; iCol < info.cellRange.colCount; iCol++) {
|
|
|
const curCol = info.cellRange.col + iCol;
|
|
|
const col = info.sheet.zh_setting.cols[curCol];
|
|
@@ -638,25 +696,61 @@ $(document).ready(() => {
|
|
|
if (nodePos && nodePos.length > 0) continue;
|
|
|
}
|
|
|
|
|
|
+ const text = sheet.getText(curRow, curCol);
|
|
|
if (setting.dgnUpFields.indexOf(col.field) !== -1) {
|
|
|
- dgnData[col.field] = _.toNumber(sheet.getText(curRow, curCol));
|
|
|
- filterDgn = false;
|
|
|
+ const num = _.toNumber(text);
|
|
|
+ if (num) {
|
|
|
+ dgnData[col.field] = num;
|
|
|
+ filterDgn = false;
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ dgnData[col.field] = math.evaluate(transExpr(text));
|
|
|
+ filterDgn = false;
|
|
|
+ } catch(err) {
|
|
|
+ if (!bHint) {
|
|
|
+ toastr.warning('粘贴了非法表达式,已过滤');
|
|
|
+ bHint = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (col.field === 'memo') {
|
|
|
+ mainData.memo = text;
|
|
|
+ filterMain = false;
|
|
|
} else {
|
|
|
- data[col.field] = col.type === 'Number' ? _.toNumber(sheet.getText(curRow, curCol)) : sheet.getText(curRow, curCol);
|
|
|
- filter = false;
|
|
|
+ if (col.type === 'Number') {
|
|
|
+ const num = _.toNumber(text);
|
|
|
+ if (num) {
|
|
|
+ data[col.field] = num;
|
|
|
+ filter = false;
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ data[col.field] = math.evaluate(transExpr(text));
|
|
|
+ filter = false;
|
|
|
+ } catch(err) {
|
|
|
+ if (!bHint) {
|
|
|
+ toastr.warning('粘贴了非法表达式,已过滤');
|
|
|
+ bHint = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ data[col.field] = text;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- if (filter && filterDgn) {
|
|
|
+ if (filter && filterDgn && filterMain) {
|
|
|
filterNodes.push(node);
|
|
|
} else {
|
|
|
if (!filter) datas.push(data);
|
|
|
if (!filterDgn) dgnDatas.push(dgnData);
|
|
|
+ if (!filterMain) mainDatas.push(mainData);
|
|
|
}
|
|
|
}
|
|
|
- if (datas.length > 0 || dgnDatas.length > 0) {
|
|
|
+ if (datas.length > 0 || dgnDatas.length > 0 || mainDatas.length > 0) {
|
|
|
const updateData = {};
|
|
|
if (datas.length > 0) updateData.stage = datas;
|
|
|
if (dgnDatas.length > 0) updateData.dgn = dgnDatas;
|
|
|
+ if (mainDatas.length > 0) updateData.main = mainDatas;
|
|
|
postData(window.location.href + '/update', {bills: updateData}, function (data) {
|
|
|
const nodes = stageTree.loadPostStageData(data);
|
|
|
stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes.concat(filterNodes));
|
|
@@ -831,8 +925,65 @@ $(document).ready(() => {
|
|
|
},
|
|
|
}
|
|
|
});
|
|
|
+ if (!readOnly) {
|
|
|
+ $('#bills-expr').bind('change mouseleave', function () {
|
|
|
+ const expr = $(this);
|
|
|
+ const sheet = slSpread.getActiveSheet();
|
|
|
+ const select = SpreadJsObj.getSelectObject(sheet);
|
|
|
+ const field = expr.attr('field'), orgValue = expr.attr('org'), updateData = {};
|
|
|
+ let newValue = expr.val();
|
|
|
+
|
|
|
+ const num = _.toNumber(newValue);
|
|
|
+ if (num) {
|
|
|
+ newValue = num;
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ newValue = math.evaluate(transExpr(newValue));
|
|
|
+ } catch(err) {
|
|
|
+ toastr.error('输入的表达式非法');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (orgValue === newValue || (!orgValue && newValue == '')) { return; }
|
|
|
+
|
|
|
+ if (field.indexOf('_dgn_') > 0) {
|
|
|
+ updateData.dgn = {
|
|
|
+ id: select.id
|
|
|
+ };
|
|
|
+ updateData.dgn[field] = newValue;
|
|
|
+ } else {
|
|
|
+ updateData.stage = {
|
|
|
+ lid: select.id
|
|
|
+ };
|
|
|
+ updateData.stage[field] = newValue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新至服务器
|
|
|
+ postData(window.location.pathname + '/update', {bills: updateData}, function (result) {
|
|
|
+ const nodes = stageTree.loadPostStageData(result);
|
|
|
+ expr.val(select[field]);
|
|
|
+ stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ stageTreeSpreadObj.loadExprToInput(slSpread.getActiveSheet());
|
|
|
|
|
|
const stagePosSpreadObj = {
|
|
|
+ loadExprToInput(sheet) {
|
|
|
+ const sel = sheet.getSelections()[0];
|
|
|
+ const col = sheet.zh_setting.cols[sel.col], cell = sheet.getCell(sel.row, sel.col);
|
|
|
+ if (col.type === 'Number') {
|
|
|
+ const data = SpreadJsObj.getSelectObject(sheet);
|
|
|
+ if (data) {
|
|
|
+ $('#pos-expr').val(data[col.field]).attr('field', col.field).attr('org', data[col.field])
|
|
|
+ .attr('row', sel.row).attr('readOnly', readOnly || cell.locked());
|
|
|
+ } else {
|
|
|
+ $('#pos-expr').val('').attr('readOnly', true);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ $('#pos-expr').val('').attr('readOnly', true);
|
|
|
+ }
|
|
|
+ },
|
|
|
/**
|
|
|
* 加载部位明细 根据当前台账选择节点
|
|
|
*/
|
|
@@ -907,7 +1058,22 @@ $(document).ready(() => {
|
|
|
} else {
|
|
|
data.updateType = 'update';
|
|
|
data.updateData = {pid: posData.id, lid: posData.lid};
|
|
|
- data.updateData[col.field] = col.type === 'Number' ? parseFloat(info.editingText) : info.editingText;
|
|
|
+ if (col.type === 'Number') {
|
|
|
+ const num = _.toNumber(info.editingText);
|
|
|
+ if (num) {
|
|
|
+ data.updateData[col.field] = num;
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ data.updateData[col.field] = math.evaluate(transExpr(info.editingText));
|
|
|
+ } catch(err) {
|
|
|
+ toastr.error('输入的表达式非法');
|
|
|
+ SpreadJsObj.reLoadRowData(info.sheet, info.row);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ data.updateData[col.field] = info.editingText;
|
|
|
+ }
|
|
|
}
|
|
|
// 提交数据到服务器
|
|
|
postData(window.location.pathname + '/update', {pos: data}, function (result) {
|
|
@@ -976,8 +1142,20 @@ $(document).ready(() => {
|
|
|
const curCol = info.cellRange.col + iCol;
|
|
|
const colSetting = info.sheet.zh_setting.cols[curCol];
|
|
|
newData[colSetting.field] = info.sheet.getText(curRow, curCol);
|
|
|
- if (colSetting.type === 'Number') {
|
|
|
- newData[colSetting.field] = _.toNumber(newData[colSetting.field]);
|
|
|
+ if (col.type === 'Number') {
|
|
|
+ const num = _.toNumber(newData[colSetting.field]);
|
|
|
+ if (num) {
|
|
|
+ newData[colSetting.field] = num;
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ newData[colSetting.field] = math.evaluate(transExpr(newData[colSetting.field]));
|
|
|
+ } catch(err) {
|
|
|
+ toastr.error('输入的表达式非法');
|
|
|
+ self.loadCurPosData();
|
|
|
+ return;
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
data.updateData.push(newData);
|
|
@@ -993,8 +1171,19 @@ $(document).ready(() => {
|
|
|
const curCol = info.cellRange.col + iCol;
|
|
|
const colSetting = info.sheet.zh_setting.cols[curCol];
|
|
|
newData[colSetting.field] = info.sheet.getText(curRow, curCol);
|
|
|
- if (colSetting.type === 'Number') {
|
|
|
- newData[colSetting.field] = _.toNumber(newData[colSetting.field]);
|
|
|
+ if (col.type === 'Number') {
|
|
|
+ const num = _.toNumber(newData[colSetting.field]);
|
|
|
+ if (num) {
|
|
|
+ newData[colSetting.field] = num;
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ newData[colSetting.field] = math.evaluate(transExpr(newData[colSetting.field]));
|
|
|
+ } catch(err) {
|
|
|
+ toastr.error('输入的表达式非法');
|
|
|
+ self.loadCurPosData();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
data.updateData.push(newData);
|
|
@@ -1084,6 +1273,9 @@ $(document).ready(() => {
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
+ selectionChanged: function (e, info) {
|
|
|
+ stagePosSpreadObj.loadExprToInput(info.sheet);
|
|
|
+ }
|
|
|
};
|
|
|
// 加载上下窗口resizer
|
|
|
$.divResizer({
|
|
@@ -1110,7 +1302,42 @@ $(document).ready(() => {
|
|
|
spSpread.bind(spreadNS.Events.ClipboardPasting, stagePosSpreadObj.clipboardPasting);
|
|
|
spSpread.bind(spreadNS.Events.ClipboardPasted, stagePosSpreadObj.clipboardPasted);
|
|
|
spSpread.bind(spreadNS.Events.EditStarting, stagePosSpreadObj.editStarting);
|
|
|
+ spSpread.bind(spreadNS.Events.SelectionChanged, stagePosSpreadObj.selectionChanged);
|
|
|
SpreadJsObj.addDeleteBind(spSpread, stagePosSpreadObj.deletePress);
|
|
|
+ if (!readOnly) {
|
|
|
+ $('#pos-expr').bind('change mouseleave', function () {
|
|
|
+ const expr = $(this);
|
|
|
+ const posSheet = spSpread.getActiveSheet();
|
|
|
+ const select = SpreadJsObj.getSelectObject(posSheet);
|
|
|
+ const field = expr.attr('field'), orgValue = expr.attr('org'), newValue = expr.val(), row = expr.attr('row');
|
|
|
+ if (orgValue === newValue || (!orgValue && newValue == '')) { return; }
|
|
|
+
|
|
|
+ const data = {pid: select.id, lid: select.lid};
|
|
|
+ const num = _.toNumber(newValue);
|
|
|
+ if (num) {
|
|
|
+ data[field] = num;
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ data[field] = math.evaluate(transExpr(newValue));
|
|
|
+ } catch (err) {
|
|
|
+ toastr.error('输入的表达式非法');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 提交数据到服务器
|
|
|
+ postData(window.location.pathname + '/update', {pos: {updateType: 'update', updateData: data}}, function (result) {
|
|
|
+ if (result.pos) {
|
|
|
+ stagePos.updateDatas(result.pos.pos);
|
|
|
+ stagePos.loadCurStageData(result.pos.curStageData);
|
|
|
+ expr.val(select[field]);
|
|
|
+ SpreadJsObj.reLoadRowData(posSheet, _.toNumber(row));
|
|
|
+ }
|
|
|
+ const refreshData = stageTree.loadPostStageData(result.ledger);
|
|
|
+ stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), refreshData);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
if (!checkTzMeasureType()) {
|
|
|
$.contextMenu({
|
|
|
selector: '#stage-pos',
|