'use strict'; /** * 材料调差 - 调差清单 * * @author EllisRan * @date 2019/10/25 * @version */ function getStageId() { return window.location.pathname.split('/')[5]; } function findNotJoinLeafXmj(x, type = '') { if (type === 'index') { return notJoinList.findIndex(function (item) { return item.gcl_id === x.gcl_id && item.xmj_id === x.id && (x.mx_id === undefined || (x.mx_id !== undefined && x.mx_id === item.mx_id)); }); } return notJoinList.find(function (item) { return item.gcl_id === x.gcl_id && item.xmj_id === x.id && (x.mx_id === undefined || (x.mx_id !== undefined && x.mx_id === item.mx_id)); }); } function getMpSpreadByMBData(id) { let info = null; if (parseInt(getStageId()) === parseInt(stage_order)) { info = materialBillsData.find(function (item) { return item.id === parseInt(id); }); } else { info = materialBillsData.find(function (item) { return item.mb_id === parseInt(id); }); } console.log(info, id, parseInt(getStageId()), parseInt(stage_order)); return info ? info.m_spread : 0; } function getMaterialListByLeafXmj(gcl_id, xmj_id, mx_id = null) { const list = []; for (const ml of materialListData) { if (gcl_id === ml.gcl_id && xmj_id === ml.xmj_id && (mx_id === null || mx_id === ml.mx_id)) { list.push(ml); } } return list; } function calcOneBQJC(xmj) { let jiacha = 0; const notx = findNotJoinLeafXmj(xmj); if (notx === undefined) { const list = xmj.mx_id !== undefined ? getMaterialListByLeafXmj(xmj.gcl_id, xmj.id, xmj.mx_id) : getMaterialListByLeafXmj(xmj.gcl_id, xmj.id); for (const l of list) { jiacha = ZhCalc.add(jiacha, ZhCalc.mul(ZhCalc.mul(xmj.gather_qty, l.quantity), getMpSpreadByMBData(l.mb_id))); } } return ZhCalc.round(jiacha, 2); } function getPasteHint (str, row = '') { let returnObj = str; if (row) { returnObj.msg = '清单第' + (row+1) + '行' + (str.msg ? str.msg : str); } return returnObj; } // 重新计算列表的价差 function calculateJiaCha(data, index) { // 计算单条的 if (index) { const gcld = data[index] let total_jiacha = 0; for (const [index, xmj] of gcld.leafXmjs.entries()) { const jiacha = calcOneBQJC(xmj); gcld.leafXmjs[index].jiacha = jiacha !== 0 ? jiacha : null; total_jiacha += jiacha; } gcld.total_jiacha = ZhCalc.round(total_jiacha, 2) } else { for(const gcld of data) { let total_jiacha = 0; for (const [index, xmj] of gcld.leafXmjs.entries()) { const jiacha = calcOneBQJC(xmj); gcld.leafXmjs[index].jiacha = jiacha !== 0 ? jiacha : null; total_jiacha += jiacha; } gcld.total_jiacha = ZhCalc.round(total_jiacha, 2) } } } const is_numeric = (value) => { if (typeof(value) === 'object') { return false; } else { return !Number.isNaN(Number(value)) && value.toString().trim() !== ''; } }; $(document).ready(() => { function TipCellType() { } TipCellType.prototype = new GC.Spread.Sheets.CellTypes.ColumnHeader(); TipCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) { return { x: x, y: y, row: context.row, col: context.col, cellRect: cellRect, sheetArea: context.sheetArea, sheet: context.sheet }; }; TipCellType.prototype.processMouseEnter = function (hitInfo){ if (!this._toolTipElement) { var div = document.createElement("div"); $(div).css("position", "absolute") .css("border", "1px #C0C0C0 solid") .css("box-shadow", "1px 2px 5px rgba(0,0,0,0.4)") .css("font", "9pt Arial") .css("background", "#fff") // .css("color", "#fff") .css("z-index", "1000") .css("padding", 5); this._toolTipElement = div; } $(this._toolTipElement).text("单位数量:每一单位清单下所需工料消耗量。") .css("top", hitInfo.y + 15) .css("left", hitInfo.x - 15); $(this._toolTipElement).hide(); // document.body.insertBefore(this._toolTipElement, null); $('#material-spread-div').append(this._toolTipElement, null); $(this._toolTipElement).show("fast"); }; TipCellType.prototype.processMouseLeave = function (hitInfo) { if (this._toolTipElement) { // document.body.removeChild(this._toolTipElement); // $('#material-spread-div').removeChild(this._toolTipElement); this._toolTipElement.remove(); this._toolTipElement = null; } }; autoFlashHeight(); // 清单table const ledgerSpread = SpreadJsObj.createNewSpread($('#ledger-spread')[0]); const ledgerSpreadSetting = { cols: [ {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 90, formatter: '@'}, {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 220, formatter: '@'}, {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 80, formatter: '@'}, {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 110, type: 'Number'}, {title: '本期计量数量|合同', colSpan: '3|1', rowSpan: '1|1', field: 'contract_qty', hAlign: 2, width: 110, type: 'Number'}, {title: '|数量变更', colSpan: '|1', rowSpan: '|1', field: 'qc_qty', hAlign: 2, width: 110, type: 'Number'}, {title: '|小计', colSpan: '|1', rowSpan: '|1', field: 'gather_qty', hAlign: 2, width: 110, type: 'Number'}, {title: '本期完成金额', colSpan: '1', rowSpan: '2', field: 'gather_tp', hAlign: 2, width: 110, type: 'Number'}, {title: '本期价差', colSpan: '1', rowSpan: '2', field: 'total_jiacha', hAlign:3, width: 110, type: 'Number'} ], emptyRows: 0, headRows: 2, headRowHeight: [25, 25], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', readOnly: true, }; // 解析清单汇总数据 gclGatherModel.loadLedgerData(ledger, curLedgerData); gclGatherModel.loadPosData(pos, curPosData); let gclGatherData = gclGatherModel.gatherGclData().filter(item => { return item.qc_qty || item.contract_qty }); calculateJiaCha(gclGatherData); // let gclGatherData = gclGatherModel.gatherGclData() // 获取项目节数据 function loadLeafXmjData(iGclRow) { const gcl = gclGatherData[iGclRow]; if (gcl) { for (const [index, xmj] of gcl.leafXmjs.entries()) { const jiacha = calcOneBQJC(xmj); gcl.leafXmjs[index].jiacha = jiacha !== 0 ? ZhCalc.round(jiacha, 2) : null; } SpreadJsObj.loadSheetData(leafXmjSpread.getActiveSheet(), SpreadJsObj.DataType.Data, gcl.leafXmjs); // 对清单调差工料table的单位数量进行改变 materialSpreadSetting.cols[materialSpreadSetting.cols.length - 2].title = '|' + gcl.unit + '数量 �'; // SpreadJsObj.initSheet(materialSpread.getActiveSheet(), materialSpreadSetting); } else { SpreadJsObj.loadSheetData(leafXmjSpread.getActiveSheet(), SpreadJsObj.DataType.Data, []); } SpreadJsObj.initSheet(materialSpread.getActiveSheet(), materialSpreadSetting); } SpreadJsObj.initSheet(ledgerSpread.getActiveSheet(), ledgerSpreadSetting); // 项目明细table const leafXmjSpread = SpreadJsObj.createNewSpread($('#leaf-xmj-spread')[0]); const leafXmjSpreadSetting = { cols: [ {title: '项目节|编号', colSpan: '2|1', rowSpan: '1|1', field: 'code', hAlign: 0, width: 80, formatter: '@'}, {title: '|项目节名称', colSpan: '|1', rowSpan: '|1', field: 'jldy', hAlign: 0, width: 100, formatter: '@'}, {title: '计量单元|计量单元', colSpan: '2|1', rowSpan: '1|1', field: 'bwmx', hAlign: 0, width: 100, formatter: '@'}, {title: '|复核数量', colSpan: '|1', rowSpan: '|1', field: 'quantity', hAlign: 0, width: 80, type: 'Number'}, {title: '部位信息|单位工程', colSpan: '3|1', rowSpan: '1|1', field: 'dwgc', hAlign: 0, width: 100, formatter: '@'}, {title: '|分部工程', colSpan: '|1', rowSpan: '|1', field: 'fbgc', hAlign: 0, width: 100, formatter: '@'}, {title: '|分项工程', colSpan: '|1', rowSpan: '|1', field: 'fxgc', hAlign: 0, width: 180, formatter: '@'}, {title: '本期计量数量|合同', colSpan: '3|1', rowSpan: '1|1', field: 'contract_qty', hAlign: 2, width: 60, type: 'Number'}, {title: '|数量变更', colSpan: '|1', rowSpan: '|1', field: 'qc_qty', hAlign: 2, width: 80, type: 'Number'}, {title: '|小计', colSpan: '|1', rowSpan: '|1', field: 'gather_qty', hAlign: 2, width: 60, type: 'Number'}, {title: '本期价差', colSpan: '1', rowSpan: '2', field: 'jiacha', hAlign: 2, width: 80, type: 'Number'}, ], emptyRows: 0, headRows: 2, headRowHeight: [25, 25], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', readOnly: true, }; // const leafXmjCol = { // getValue: { // jiacha: function (data) { // let sum = 0; // const sheet = leafXmjSpread.getActiveSheet(); // const select = SpreadJsObj.getSelectObject(sheet); // const notx = findNotJoinLeafXmj(select); // if (notx === undefined) { // for(const ml of materialList) { // sum = ZhCalc.round(ZhCalc.add(sum, ZhCalc.mul(ZhCalc.mul(data.gather_qty, ml.quantity), getMpSpreadByMBData(ml.mb_id))), 2); // } // } // return sum !== 0 ? sum : null; // } // } // }; // SpreadJsObj.initSpreadSettingEvents(leafXmjSpreadSetting, leafXmjCol); SpreadJsObj.initSheet(leafXmjSpread.getActiveSheet(), leafXmjSpreadSetting); // 加载清单数据 SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), SpreadJsObj.DataType.Data, gclGatherData); // 调差清单工料table const materialSpread = SpreadJsObj.createNewSpread($('#material-spread')[0]); const materialSpreadSetting = { cols: [ {title: '清单工料含量|编号', colSpan: '5|1', rowSpan: '1|1', field: 'code', hAlign: 0, width: 80, formatter: '@', readOnly: true}, {title: '|名称', colSpan: '|1', rowSpan: '|1', field: 'name', hAlign: 0, width: 100, formatter: '@', readOnly: true}, {title: '|单位', colSpan: '|1', rowSpan: '|1', field: 'unit', hAlign: 1, width: 60, formatter: '@', readOnly: true}, {title: '|数量 �', colSpan: '|1', rowSpan: '|1', field: 'quantity', hAlign: 2, width: 80, type: 'Number', readOnly: 'readOnly.isEdit'}, {title: '|计算式', colSpan: '1', rowSpan: '|1', field: 'expr', hAlign: 2, width: 120, formatter: '@', readOnly: 'readOnly.isEdit'}, ], emptyRows: 0, headRows: 2, headRowHeight: [25, 25], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', }; const materialBase = { isEdit: function (data) { // 是否本期添加的工料 return data.order === stage_order; } }; const materialCol = { readOnly: { isEdit: function (data) { // const sheet = leafXmjSpread.getActiveSheet(); // const select = SpreadJsObj.getSelectObject(sheet); // const notx = findNotJoinLeafXmj(select); // return !(!readOnly && notx === undefined && materialBase.isEdit(data)); return !(!readOnly && materialBase.isEdit(data)); }, }, }; SpreadJsObj.initSpreadSettingEvents(materialSpreadSetting, materialCol); // 获取项目节数据 let materialList = []; function loadMaterialData(iGclRow, iLXmjRow) { const gcl = gclGatherData[iGclRow]; if (gcl && gcl.leafXmjs[iLXmjRow]) { const xmj = gcl.leafXmjs[iLXmjRow]; materialList = []; for (const m of materialListData) { if (m.gcl_id === xmj.gcl_id && m.xmj_id === xmj.id && ((xmj.mx_id !==undefined && m.mx_id === xmj.mx_id) || xmj.mx_id === undefined)) { materialList.push(m); } } SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialList); } else { SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, []); } SpreadJsObj.reLoadSheetData(leafXmjSpread.getActiveSheet()); } // SpreadJsObj.locateTreeNode(ledgerSpread.getActiveSheet(), ) loadLeafXmjData(0); loadMaterialData(0, 0); const sheet = materialSpread.getActiveSheet(); sheet.suspendPaint(); sheet.setCellType(1, 3, new TipCellType(), spreadNS.SheetArea.colHeader); sheet.resumePaint(); // 不参与调差数据值变灰 function checkNotJoinMaterialData() { const sheet = ledgerSpread.getActiveSheet(); const select = SpreadJsObj.getSelectObject(sheet); const index = gclGatherData.indexOf(select); if (index !== -1) { const xmj = gclGatherData[index].leafXmjs; const leafXmjSheet = leafXmjSpread.getActiveSheet(); for (const [iRow,x] of xmj.entries()) { const notx = findNotJoinLeafXmj(x); const color = notx === undefined ? '' : '#d6d8db'; leafXmjSheet.getRange(iRow, -1, 1, -1).backColor(color); } } } checkNotJoinMaterialData(); // 对添加工料表格赋值 function changeMaterialTable() { $('#materialBills tr').removeClass('table-secondary'); $('#materialBills').find('input').removeAttr('disabled'); $('#materialBills').find('input').prop('checked', false); for (const [index, ml] of materialList.entries()) { const mbIndex = materialBillsData.findIndex(function (item) { return item.id === ml.mb_id; }); if (mbIndex !== -1) { $('#materialBills tr').eq(mbIndex).addClass('table-secondary'); $('#materialBills').find('input').eq(mbIndex).attr('disabled', true); $('#materialBills').find('input').eq(mbIndex).prop('checked', true); } } } // 添加调差工料 $('#add_material_bill').click(function () { // 获取已选工料 $('#materialBills').find('input:disabled').prop('checked', false); const selectList = $('#materialBills').find('input:checked'); if (selectList.length === 0) { toastr.warning('请选择调差工料'); $('#materialBills').find('input:disabled').prop('checked', true); return false; } const mb_id = []; for (let s = 0; s < selectList.length; s++) { mb_id.push($('#materialBills').find('input:checked').eq(s).val()); } // 获取当前项目节或部位明细id const sheet = ledgerSpread.getActiveSheet(); const select = SpreadJsObj.getSelectObject(sheet); const index = gclGatherData.indexOf(select); const leafXmjSheet = leafXmjSpread.getActiveSheet(); const leafXmjSelect = SpreadJsObj.getSelectObject(leafXmjSheet); const gcl = gclGatherData[index].leafXmjs; // const leafXmjIndex = gcl.indexOf(leafXmjSelect); // const xmj = gcl[leafXmjIndex]; // const data = { // xmj_id: xmj.id, // gcl_id: xmj.gcl_id, // mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '', // mb_id: mb_id, // gather_qty: xmj.gather_qty, // }; const datas = []; for (const xmj of gcl) { const notx = findNotJoinLeafXmj(xmj); const data = { xmj_id: xmj.id, gcl_id: xmj.gcl_id, mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '', gather_qty: xmj.gather_qty, is_join: notx === undefined ? 1 : 0, }; datas.push(data); } // 上传到数据库 console.log(datas, gcl); postData(window.location.pathname + '/save', {type: 'adds', postData: {xmjs: datas, mbIds: mb_id}}, function (result) { materialListData = result; // toastr.success('已成功应用'); calculateJiaCha(gclGatherData); // const index = gclGatherData.indexOf(ledgerSelect); loadLeafXmjData(index); const xmjSheet = leafXmjSpread.getActiveSheet(); const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet); const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect); loadMaterialData(index, xmjIndex); SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index); $('#addgl').modal('hide'); }); // postData(window.location.pathname + '/save', {type: 'add', postData: data}, function (result) { // // 添加到materialList里 // materialListData = result; // loadMaterialData(index, leafXmjIndex); // $('#addgl').modal('hide'); // }); $('#materialBills').find('input:disabled').prop('checked', true); }); if (!readOnly) { const leafXmjSpreadObj = { getSelect : function () { const sheet = ledgerSpread.getActiveSheet(); const select = SpreadJsObj.getSelectObject(sheet); const index = gclGatherData.indexOf(select); const leafXmjSheet = leafXmjSpread.getActiveSheet(); const leafXmjSelect = SpreadJsObj.getSelectObject(leafXmjSheet); const iRow = gclGatherData[index].leafXmjs.indexOf(leafXmjSelect); return [index, iRow, leafXmjSheet, leafXmjSelect]; }, checkJoinMaterial: function (type) { const [iGclRow, iRow, sheet, select] = leafXmjSpreadObj.getSelect(); const color = type === 'join' ? '' : '#d6d8db'; const data = { type: type, select: type === 'join' ? findNotJoinLeafXmj(select) : select, } // 添加到 postData(window.location.pathname + '/save', data, function (result) { if (type === 'join') { const index = findNotJoinLeafXmj(select, 'index'); notJoinList.splice(index, 1); } else { notJoinList.push(result); } gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(select); calculateJiaCha(gclGatherData, iGclRow) SpreadJsObj.reLoadRowData(sheet, iRow); sheet.getRange(iRow, -1, 1, -1).backColor(color); loadMaterialData(iGclRow, iRow); SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow); }); }, } // leafXmj右键功能 $.contextMenu({ selector: '#leaf-xmj-spread', build: function ($trigger, e) { const target = SpreadJsObj.safeRightClickSelection($trigger, e, leafXmjSpread); return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader; }, items: { 'stop': { name: '不参与调差', icon: 'fa-remove', callback: function (key, opt) { leafXmjSpreadObj.checkJoinMaterial('notjoin'); }, visible: function (key, opt) { const sheet = leafXmjSpread.getActiveSheet(); const select = SpreadJsObj.getSelectObject(sheet); const sel = sheet.getSelections()[0]; const notx = findNotJoinLeafXmj(select); if (!select || sel.rowCount !== 1) { return false; } if (!readOnly && select && notx === undefined) { return true; } else { return false; } } }, 'start': { name: '参与调差', icon: 'fa-sign-in', callback: function (key, opt) { leafXmjSpreadObj.checkJoinMaterial('join'); }, visible: function (key, opt) { const sheet = leafXmjSpread.getActiveSheet(); const select = SpreadJsObj.getSelectObject(sheet); const sel = sheet.getSelections()[0]; const notx = findNotJoinLeafXmj(select); if (!select || sel.rowCount !== 1) { return false; } if (!readOnly && select && notx === undefined) { return false; } else { return true; } }, } } }); // material-spread右键功能 const materialSpreadObj = { del: function () { const materialSheet = materialSpread.getActiveSheet(); const materialSelect = SpreadJsObj.getSelectObject(materialSheet); const sheet = ledgerSpread.getActiveSheet(); const select = SpreadJsObj.getSelectObject(sheet); const index = gclGatherData.indexOf(select); const gcl = gclGatherData[index].leafXmjs; const datas = []; for (const xmj of gcl) { const data = { xmj_id: xmj.id, gcl_id: xmj.gcl_id, mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '', }; datas.push(data); } console.log(datas, materialSelect.mb_id); postData(window.location.pathname + '/save', {type: 'dels', postData: { xmjs: datas, mb_id: materialSelect.mb_id }}, function (result) { materialListData = result; calculateJiaCha(gclGatherData); // const index = gclGatherData.indexOf(ledgerSelect); loadLeafXmjData(index); const xmjSheet = leafXmjSpread.getActiveSheet(); const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet); const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect); loadMaterialData(index, xmjIndex); SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index); }); // postData(window.location.pathname + '/save', {type: 'del', id: select.id, mb_id: select.mb_id}, function (result) { // const index = materialList.indexOf(select); // materialList.splice(index, 1); // sheet.deleteRows(index, 1); // SpreadJsObj.reLoadSheetData(materialSpread.getActiveSheet()); // const sel = sheet.getSelections(); // sheet.setSelection(index > 0 ? index - 1 : 0, sel.length > 0 ? sel[0].col : 0, 1, 1); // const materialListIndex = materialListData.indexOf(select); // materialListData.splice(materialListIndex, 1); // const [iGclRow, iRow, lsheet, lselect] = leafXmjSpreadObj.getSelect(); // gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(lselect); // calculateJiaCha(gclGatherData, iGclRow); // SpreadJsObj.reLoadRowData(lsheet, iRow); // SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow); // }); }, deletePress: function (sheet) { return; }, editStarting: function (e, info) { const col = info.sheet.zh_setting.cols[info.col]; const select = SpreadJsObj.getSelectObject(info.sheet); if (col.field === 'quantity') { if (select.expr && select.expr !== '') { info.sheet.getCell(info.row, info.col).text(select.expr); } } }, editEnded: function (e, info) { if (info.sheet.zh_setting) { const select = SpreadJsObj.getSelectObject(info.sheet); const col = info.sheet.zh_setting.cols[info.col]; // 未改变值则不提交 // const validText = info.editingText ? (typeof(info.editingText) === 'String' ? info.editingText.replace('\n', '') : info.editingText) : null; // const validText = is_numeric(info.editingText) ? parseFloat(info.editingText) : (info.editingText ? trimInvalidChar(info.editingText) : null); // let orgValue = select[col.field]; const validText = info.editingText ? info.editingText.replace('\n', '') : null; let orgValue; if (col.field === 'quantity') { orgValue = validText && validText !== '' ? _.toNumber(validText) ? select.quantity : select.expr : (select.expr && select.expr !== '') ? select.expr : select.quantity; } else { orgValue = select[col.field]; } if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === '' || validText === null))) { SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } const exprQuantity = { expr: '', quantity: 0, }; const [valid, msg] = materialSpreadObj._checkExpr(validText, exprQuantity); if (!valid) { toastr.error(msg); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } if (isNaN(exprQuantity.quantity)) { toastr.error('不能输入其它非数字类型字符'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } const num = parseFloat(exprQuantity.quantity); if (num < 0 || !/^\d+(\.\d{1,6})?$/.test(num)) { toastr.error('数量值必须大于0并且小于6位小数的浮点数'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } // 更新至服务器 const ledgerSheet = ledgerSpread.getActiveSheet(); const ledgerSelect = SpreadJsObj.getSelectObject(ledgerSheet); const index = gclGatherData.indexOf(ledgerSelect); const gcl = gclGatherData[index].leafXmjs; const datas = []; for (const xmj of gcl) { const data = { xmj_id: xmj.id, gcl_id: xmj.gcl_id, mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '', }; datas.push(data); } console.log(exprQuantity, datas, select.mb_id); postData(window.location.pathname + '/save', { type:'updates', updateData: { xmjs: datas, expr: exprQuantity.expr, quantity: exprQuantity.quantity, mb_id: select.mb_id } }, function (result) { materialListData = result; calculateJiaCha(gclGatherData); // const index = gclGatherData.indexOf(ledgerSelect); loadLeafXmjData(index); const xmjSheet = leafXmjSpread.getActiveSheet(); const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet); const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect); loadMaterialData(index, xmjIndex); SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index); }, function () { SpreadJsObj.reLoadRowData(info.sheet, info.row); }); // postData(window.location.pathname + '/save', { type:'update', updateData: { id:select.id, quantity: validText, mb_id: select.mb_id } }, function (result) { // const materialListIndex = materialListData.indexOf(select); // const index = materialList.indexOf(select); // select[col.field] = validText; // materialListData.splice(materialListIndex, 1, select); // materialList.indexOf(index, 1, select); // SpreadJsObj.reLoadRowData(info.sheet, info.row); // const [iGclRow, iRow, sheet, lselect] = leafXmjSpreadObj.getSelect(); // gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(lselect); // calculateJiaCha(gclGatherData, iGclRow) // SpreadJsObj.reLoadRowData(sheet, iRow); // SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow); // }, function () { // SpreadJsObj.reLoadRowData(info.sheet, info.row); // }); } }, clipboardPasted(e, info) { const hint = { cellError: {type: 'error', msg: '粘贴内容超出了表格范围'}, numberExpr: {type: 'error', msg: '不能粘贴其它非数字类型字符'}, numberCan: {type: 'error', msg: '请粘贴大于0并且小于6位小数的浮点数'}, }; const range = info.cellRange; const sortData = info.sheet.zh_data || []; if (range.row + range.rowCount > sortData.length) { toastMessageUniq(hint.cellError); SpreadJsObj.reLoadSheetHeader(materialSpread.getActiveSheet()); SpreadJsObj.reLoadSheetData(materialSpread.getActiveSheet()); return; } if (sortData.length > 0 && range.col + range.colCount > 5) { toastMessageUniq(hint.cellError); SpreadJsObj.reLoadSheetHeader(materialSpread.getActiveSheet()); SpreadJsObj.reLoadSheetData(materialSpread.getActiveSheet()); return; } const data = []; for (let iRow = 0; iRow < range.rowCount; iRow++) { let bPaste = true; const curRow = range.row + iRow; const materialData = { id: sortData[curRow].id, mb_id: sortData[curRow].mb_id }; const hintRow = range.rowCount > 1 ? curRow : ''; let sameCol = 0; for (let iCol = 0; iCol < range.colCount; iCol++) { const curCol = range.col + iCol; const colSetting = info.sheet.zh_setting.cols[curCol]; if (!colSetting) continue; // let validText = info.sheet.getText(curRow, curCol); // validText = is_numeric(validText) ? parseFloat(validText) : (validText ? trimInvalidChar(validText) : null); const validText = info.sheet.getText(curRow, curCol).replace('\n', ''); const orgValue = sortData[curRow][colSetting.field]; if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === ''))) { sameCol++; if (range.colCount === sameCol) { bPaste = false; } continue; } const exprQuantity = { expr: '', quantity: 0, }; const [valid, msg] = materialSpreadObj._checkExpr(validText, exprQuantity); if (!valid) { toastMessageUniq(getPasteHint(msg, hintRow)); bPaste = false; continue; } if (isNaN(exprQuantity.quantity)) { toastMessageUniq(getPasteHint(hint.numberExpr, hintRow)); bPaste = false; continue; } const num = parseFloat(exprQuantity.quantity); if (num < 0 || !/^\d+(\.\d{1,6})?$/.test(num)) { toastMessageUniq(getPasteHint(hint.numberCan, hintRow)); bPaste = false; continue; } // materialData[colSetting.field] = validText; materialData.expr = exprQuantity.expr; materialData.quantity = exprQuantity.quantity; } if (bPaste) { data.push(materialData); // rowData.push(curRow); } else { SpreadJsObj.reLoadRowData(info.sheet, curRow); } } if (data.length === 0) { SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount); return; } const ledgerSheet = ledgerSpread.getActiveSheet(); const ledgerSelect = SpreadJsObj.getSelectObject(ledgerSheet); const index = gclGatherData.indexOf(ledgerSelect); const gcl = gclGatherData[index].leafXmjs; const datas = []; for (const xmj of gcl) { const data2 = { xmj_id: xmj.id, gcl_id: xmj.gcl_id, mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '', }; datas.push(data2); } console.log(data, datas); // 更新至服务器 postData(window.location.pathname + '/save', { type:'pastes', updateData: { xmjs: datas, pasteData: data } }, function (result) { materialListData = result; calculateJiaCha(gclGatherData); // const index = gclGatherData.indexOf(ledgerSelect); loadLeafXmjData(index); const xmjSheet = leafXmjSpread.getActiveSheet(); const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet); const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect); loadMaterialData(index, xmjIndex); SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index); }, function () { SpreadJsObj.reLoadRowData(info.sheet, info.row); }); // postData(window.location.pathname + '/save', { type:'paste', updateData: data }, function (result) { // materialListData = result; // const [iGclRow, iRow, sheet, lselect] = leafXmjSpreadObj.getSelect(); // gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(lselect); // calculateJiaCha(gclGatherData, iGclRow); // SpreadJsObj.reLoadRowData(sheet, iRow); // SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow); // }, function () { // SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount); // }); }, _checkExprValid(expr) { if (!expr) return [true, null]; const param = []; let num = '', base = ''; for (let i = 0, iLen = expr.length; i < iLen; i++) { if (/^[\d\.%]+/.test(expr[i])) { if (base !== '') { param.push({type: 'base', value: base}); base = ''; } num = num + expr[i]; } else if (expr[i] === '(') { if (num !== '') { param.push({type: 'num', value: num}); num = ''; } if (base !== '') { param.push({type: 'base', value: base}); base = ''; } param.push({type: 'left', value: '('}); } else if (expr[i] === ')') { if (num !== '') { param.push({type: 'num', value: num}); num = ''; } if (base !== '') { param.push({type: 'base', value: base}); base = ''; } param.push({type: 'right', value: ')'}); } else if (/^[\+\-*\/]/.test(expr[i])) { if (num !== '') { param.push({type: 'num', value: num}); num = ''; } if (base !== '') { param.push({type: 'base', value: base}); base = ''; } param.push({type: 'calc', value: expr[i]}); } else { return [false, '输入的表达式含有非法字符: ' + expr[i]]; } } if (num !== '') { param.push({type: 'num', value: num}); num = ''; } if (base !== '') { param.push({type: 'base', value: base}); base = ''; } if (param.length === 0) return true; if (param.length > 1) { if (param[0].value === '-') { param[1].value = '-' + param[1]; } param.unshift(); } const iLen = param.length; let iLeftCount = 0, iRightCount = 0; for (const [i, p] of param.entries()) { if (p.type === 'calc') { if (i === 0 || i === iLen - 1) return [false, '输入的表达式非法:计算符号' + p.value + '前后应有数字']; } if (p.type === 'num') { num = p.value.replace('%', ''); if (p.value.length - num.length > 1) return [false, '输入的表达式非法:' + p.value + '不是一个有效的数字']; num = _.toNumber(num); if (num === undefined || num === null || _.isNaN(num)) return [false, '输入的表达式非法:' + p.value + '不是一个有效的数字']; if (i > 0) { if (param[i - 1].type !== 'calc' && param[i - 1].type !== 'left') { return [false, '输入的表达式非法:' + p.value + '前应有运算符']; } else if (param[i - 1].value === '/' && num === 0) { return [false, '输入的表达式非法:请勿除0']; } } } if (p.type === 'base') { if (i > 0 && (param[i - 1].type === 'num' || param[i - 1].type === 'right')) return [false, '输入的表达式非法:' + p.value + '前应有运算符']; } if (p.type === 'left') { iLeftCount += 1; if (i !== 0 && param[i-1].type !== 'calc') return [false, '输入的表达式非法:(前应有运算符']; } if (p.type === 'right') { iRightCount += 1; if (i !== iLen - 1 && param[i+1].type !== 'calc') return [false, '输入的表达式非法:)后应有运算符']; if (iRightCount > iLeftCount) return [false, '输入的表达式非法:")"前无对应的"("']; } } if (iLeftCount > iRightCount) return [false, '输入的表达式非法:"("后无对应的")"']; return [true, '']; }, _checkExpr: function (text, data) { if (text) { const num = _.toNumber(text); if (num) { data.quantity = num; data.expr = ''; } else { const expr = $.trim(text).replace('\t', '').replace('=', '').toLowerCase(); const [valid, msg] = this._checkExprValid(expr); if (!valid) return [valid, msg]; data.expr = expr; data.quantity = ZhCalc.calcExpr.calcExprStrRpn(expr); // const ce = new CalcEvalMin(); // data.quantity = ce.eval(expr); // console.log(data.quantity); } } else { data.quantity = 0; data.expr = ''; } return [true, '']; }, }; materialSpread.bind(spreadNS.Events.EditStarting, materialSpreadObj.editStarting); materialSpread.bind(spreadNS.Events.EditEnded, materialSpreadObj.editEnded); materialSpread.bind(spreadNS.Events.ClipboardPasted, materialSpreadObj.clipboardPasted); SpreadJsObj.addDeleteBind(materialSpread, materialSpreadObj.deletePress); // 应用调差工料至其他清单明细 $('#user_all_material').click(function () { const ledgerSheet = ledgerSpread.getActiveSheet(); const ledgerSelect = SpreadJsObj.getSelectObject(ledgerSheet); if (ledgerSelect.leafXmjs.length < 2) { toastr.warning('没有需要应用调差工料的其它清单明细'); return false; } const xmjSheet = leafXmjSpread.getActiveSheet(); const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet); // 判断需要应用调差工料的清单明细 const needAddList = []; for (const xmj of ledgerSelect.leafXmjs) { const notx = findNotJoinLeafXmj(xmj); if (notx === undefined && xmjSelect !== xmj) { needAddList.push(xmj); } } if (needAddList.length === 0) { toastr.warning('没有需要应用调差工料的其它清单明细'); return false; } console.log(needAddList, materialList); // 更新至服务器 // postData(window.location.pathname + '/save', { type:'useOther', postData: { addXmj: needAddList, materialBills: materialList } }, function (result) { // materialListData = result; // toastr.success('已成功应用'); // calculateJiaCha(gclGatherData); // const index = gclGatherData.indexOf(ledgerSelect); // loadLeafXmjData(index); // const xmjSheet = leafXmjSpread.getActiveSheet(); // const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet); // const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect); // loadMaterialData(index, xmjIndex); // SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index); // }); }); $.contextMenu({ selector: '#material-spread', build: function ($trigger, e) { const target = SpreadJsObj.safeRightClickSelection($trigger, e, materialSpread); return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader; }, items: { 'create': { name: '添加工料', icon: 'fa-sign-in', callback: function (key, opt) { // 获取已选清单 changeMaterialTable(); $('#addgl').modal('show'); }, disabled: function (key, opt) { const sheet = leafXmjSpread.getActiveSheet(); const select = SpreadJsObj.getSelectObject(sheet); // const notx = findNotJoinLeafXmj(select); if (!select) { return true; } // if (!readOnly && notx === undefined) { // return false; // } else { // return true; // } return readOnly; } }, 'delete': { name: '删除工料', icon: 'fa-remove', callback: function (key, opt) { materialSpreadObj.del(materialSpread.getActiveSheet()); }, disabled: function (key, opt) { const sheet = materialSpread.getActiveSheet(); const select = SpreadJsObj.getSelectObject(sheet); if (!select) { return true; } if (!readOnly && select && materialBase.isEdit(select)) { return false; } else { return true; } } }, } }); } // 切换清单行,读取所属项目节数据 ledgerSpread.getActiveSheet().bind(spreadNS.Events.SelectionChanged, function (e, info) { if (info.oldSelections !== undefined) { const iOldRow = info.oldSelections[0].row, iNewRow = info.newSelections[0].row; if (iNewRow !== iOldRow) { loadLeafXmjData(iNewRow); SpreadJsObj.resetTopAndSelect(leafXmjSpread.getActiveSheet()); loadMaterialData(iNewRow, 0); checkNotJoinMaterialData(); } } }); // 切换项目节数据清单明细行,读取已调用的清单工料数据 leafXmjSpread.getActiveSheet().bind(spreadNS.Events.SelectionChanged, function (e, info) { if (info.oldSelections !== undefined) { const iOldRow = info.oldSelections[0].row, iNewRow = info.newSelections[0].row; if (iNewRow !== iOldRow) { const sheet = ledgerSpread.getActiveSheet(); const select = SpreadJsObj.getSelectObject(sheet); const index = gclGatherData.indexOf(select); loadMaterialData(index, iNewRow); SpreadJsObj.resetTopAndSelect(materialSpread.getActiveSheet()); } } }); // 显示有调差工料清单 $('#show_material_gcl').click(function () { if ($(this).is(':checked')) { const hadMaterialGclGatherData = []; const hadGclIdList = []; for (const ml of materialListData) { if (hadGclIdList.indexOf(ml.gcl_id) === -1) { hadGclIdList.push(ml.gcl_id); } } for (const gcl of gclGatherData) { for (const index in gcl.leafXmjs) { const gcl_id = gcl.leafXmjs[index].gcl_id; if (hadGclIdList.indexOf(gcl_id) !== -1) { hadMaterialGclGatherData.push(gcl); break; } } } gclGatherData = hadMaterialGclGatherData; } else { gclGatherModel.loadLedgerData(ledger, curLedgerData); gclGatherModel.loadPosData(pos, curPosData); gclGatherData = gclGatherModel.gatherGclData().filter(item => { return item.qc_qty || item.contract_qty }); } calculateJiaCha(gclGatherData); SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), SpreadJsObj.DataType.Data, gclGatherData); loadLeafXmjData(0); loadMaterialData(0, 0); SpreadJsObj.resetTopAndSelect(ledgerSpread.getActiveSheet()); SpreadJsObj.resetTopAndSelect(leafXmjSpread.getActiveSheet()); SpreadJsObj.resetTopAndSelect(materialSpread.getActiveSheet()); checkNotJoinMaterialData(); }); $.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(); ledgerSpread.refresh(); leafXmjSpread.refresh(); materialSpread.refresh(); } }); $.divResizer({ select: '#right-spr', callback: function () { ledgerSpread.refresh(); // leafXmjSpread.refresh(); materialSpread.refresh(); const width = (($('#right-view').width()/$('#right-view').parent('div').width())*100).toFixed(); setLocalCache('material_list_' + materialID, width); } }); // 展开收起月信息价并浏览器记住本期展开收起 $('a', '.right-nav').bind('click', function () { //const main = $('#main-view'), tool = $('#tools-view'); const tab = $(this), tabPanel = $(tab.attr('content')); if (!tab.hasClass('active')) { $('a', '.side-menu').removeClass('active'); $('.tab-content .tab-select-show').removeClass('active'); tab.addClass('active'); tabPanel.addClass('active'); showSideTools(tab.hasClass('active')); if (tab.attr('content') === '#material-tab') { const width = (($('#right-view').width()/$('#right-view').parent('div').width())*100).toFixed(); setLocalCache('material_list_' + materialID, width); } } else { removeLocalCache('material_list_' + materialID); tab.removeClass('active'); tabPanel.removeClass('active'); showSideTools(tab.hasClass('active')); } ledgerSpread.refresh(); // leafXmjSpread.refresh(); materialSpread.refresh(); }); // 根据浏览器记录展开收起 if (getLocalCache('material_list_' + materialID)) { const tab = $('.right-nav a[content="#material-tab"]'), tabPanel = $(tab.attr('content')); $('a', '.side-menu').removeClass('active'); $('.tab-content .tab-select-show').removeClass('active'); tab.addClass('active'); tabPanel.addClass('active'); $('#right-view').width(getLocalCache('material_list_' + materialID) + '%'); showSideTools(tab.hasClass('active')); ledgerSpread.refresh(); // leafXmjSpread.refresh(); materialSpread.refresh(); } });