'use strict'; /** * 材料调差 - 调差清单 * * @author EllisRan * @date 2019/10/25 * @version */ 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) { const info = materialBillsData.find(function (item) { return item.id === parseInt(id); }); return info.m_spread; } 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 jiacha; } $(document).ready(() => { autoFlashHeight(); // 清单table const ledgerSpread = SpreadJsObj.createNewSpread($('#ledger-spread')[0]); const ledgerSpreadSetting = { cols: [ {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 150, formatter: '@'}, {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 250, formatter: '@'}, {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 120, formatter: '@'}, {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 120, type: 'Number'}, {title: '本期计量数量|合同', colSpan: '3|1', rowSpan: '1|1', field: 'contract_qty', hAlign: 2, width: 120, type: 'Number'}, {title: '|数量变更', colSpan: '|1', rowSpan: '|1', field: 'qc_qty', hAlign: 2, width: 120, type: 'Number'}, {title: '|小计', colSpan: '|1', rowSpan: '|1', field: 'gather_qty', hAlign: 2, width: 120, 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(); console.log(gclGatherData); // 获取项目节数据 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; } // console.log(gcl.leafXmjs); SpreadJsObj.loadSheetData(leafXmjSpread.getActiveSheet(), SpreadJsObj.DataType.Data, gcl.leafXmjs); // 对清单调差工料table的单位数量进行改变 materialSpreadSetting.cols[materialSpreadSetting.cols.length - 1].title = '|' + gcl.unit + '数量'; SpreadJsObj.initSheet(materialSpread.getActiveSheet(), materialSpreadSetting); } else { SpreadJsObj.loadSheetData(leafXmjSpread.getActiveSheet(), SpreadJsObj.DataType.Data, []); } } 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: '4|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: 60, type: 'Number', readOnly: 'readOnly.isEdit'}, ], emptyRows: 0, headRows: 2, headRowHeight: [25, 25], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', }; const materialBase = { isEdit: function (data) { // 是否本期添加的工料 console.log(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)); }, }, }; 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()); } loadLeafXmjData(0); loadMaterialData(0, 0); // 不参与调差数据值变灰 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, }; // 上传到数据库 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); SpreadJsObj.reLoadRowData(sheet, iRow); sheet.getRange(iRow, -1, 1, -1).backColor(color); loadMaterialData(iGclRow, iRow); }); }, } // 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 notx = findNotJoinLeafXmj(select); 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 notx = findNotJoinLeafXmj(select); if (!readOnly && select && notx === undefined) { return false; } else { return true; } }, } } }); // material-spread右键功能 const materialSpreadObj = { del: function () { const sheet = materialSpread.getActiveSheet(); const select = SpreadJsObj.getSelectObject(sheet); 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); SpreadJsObj.reLoadRowData(lsheet, iRow); }); }, 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 orgValue = select[col.field]; if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === '' || validText === null))) { SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } if (col.field === 'quantity') { if (isNaN(validText)) { toastr.error('不能输入其它非数字类型字符'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } const num = parseFloat(validText); if (num < 0 || !/^\d+(\.\d{1,6})?$/.test(num)) { toastr.error('请输入大于0并且小于6位小数的浮点数'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } } // 更新至服务器 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); SpreadJsObj.reLoadRowData(sheet, iRow); }, function () { SpreadJsObj.reLoadRowData(info.sheet, info.row); }); } } }; materialSpread.bind(spreadNS.Events.EditEnded, materialSpreadObj.editEnded); // 应用调差工料至其他清单明细 $('#user_all_material').click(function () { const sheet = materialSpread.getActiveSheet(); const select = SpreadJsObj.getSelectObject(sheet); if (select === undefined) { toastr.warning('请选中需要应用到其他清单明细的调差工料'); return false; } const leafXmjSheet = leafXmjSpread.getActiveSheet(); const leafXmjSelect = SpreadJsObj.getSelectObject(leafXmjSheet); const notl = findNotJoinLeafXmj(leafXmjSelect); if (notl !== undefined) { toastr.error('该清单不参与调差,调差工料无法应用到其它清单中'); return false; } const ledgerSheet = ledgerSpread.getActiveSheet(); const ledgerSelect = SpreadJsObj.getSelectObject(ledgerSheet); if (ledgerSelect.leafXmjs.length < 2) { toastr.warning('没有需要应用调差工料的其它清单明细'); return false; } // 判断需要应用调差工料的清单明细 const needAddList = []; const gather_qty = []; for (const xmj of ledgerSelect.leafXmjs) { if (xmj.mx_id !== undefined) { const notx = findNotJoinLeafXmj(xmj); if (notx === undefined) { const ml = materialListData.find(function (item) { return xmj.mx_id === item.mx_id && select.mb_id === item.mb_id; }); if (ml === undefined) { needAddList.push(xmj.mx_id); gather_qty.push(xmj.gather_qty); } } } } if (needAddList.length === 0) { toastr.warning('没有需要应用调差工料的其它清单明细'); return false; } // 更新至服务器 postData(window.location.pathname + '/save', { type:'useOther', postData: { mx_id: needAddList, select: select, gather_qty: gather_qty } }, function (result) { materialListData = result; toastr.success('成功添加了' + needAddList.length + '条调差工料到其他清单明细中'); 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); }); }); $.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 (!readOnly && notx === undefined) { return false; } else { return true; } } }, '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 (!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) { const gcl_id = gcl.leafXmjs[0].gcl_id; if (hadGclIdList.indexOf(gcl_id) !== -1) { hadMaterialGclGatherData.push(gcl); } } gclGatherData = hadMaterialGclGatherData; } else { gclGatherModel.loadLedgerData(ledger, curLedgerData); gclGatherModel.loadPosData(pos, curPosData); gclGatherData = gclGatherModel.gatherGclData(); } 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(); } }); });