'use strict'; /** * 变更令详细页js * * @author EllisRan. * @date 2018/11/22 * @version */ // 编号排序,多重判断 function sortByCode(a, b) { let code1 = a.code.split('-'); let code2 = b.code.split('-'); let code1length = code1.length; let code2length = code2.length; for (let i = 0; i < code1length; i ++) { if (i+1 <= code2length) { if (code1[i] != code2[i]) { if (/^\d+$/.test(code1[i]) && /^\d+$/.test(code2[i])) { return parseInt(code1[i]) - parseInt(code2[i]); } else if (!/^\d+$/.test(code1[i]) && /^\d+$/.test(code2[i])) { return 1; } else if (/^\d+$/.test(code1[i]) && !/^\d+$/.test(code2[i])) { return -1; } else { const str1length = code1[i].length; const str2length = code2[i].length; for (let j = 0; j < str1length; j++) { if (j+1 <= str2length) { if (code1[i].charAt(j) != code2[i].charAt(j)) { return code1[i].charAt(j).charCodeAt() - code2[i].charAt(j).charCodeAt(); } else if (j+1 == str1length && code1[i].charAt(j) == code2[i].charAt(j)) { if (str1length == str2length) { return 0; } else { return str1length - str2length; } } } else { if (j+1 >= str1length) { return 1; } else { return -1; } } } } } else if (i+1 == code1length && code1[i] == code2[i]) { if (code1length == code2length) { return 0; } else { return code1length - code2length; } } } else { if (i+1 >= code1length) { return 1; } else { return -1; } } } } let searchCodeList = []; $(document).ready(() => { let searchGcl; autoFlashHeight(); const gclSpreadSetting = { cols: [ {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 120, formatter: '@'}, {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 300, formatter: '@'}, {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 100, formatter: '@'}, {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 100}, {title: '数量', colSpan: '1', rowSpan: '2', field: 'quantity', hAlign: 2, width: 100}, ], emptyRows: 0, headRows: 2, headRowHeight: [25, 25], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', readOnly: true, rowHeader:[ { rowHeaderType: 'circle', setting: { size: 5, indent: 16, getColor: function (index, data) { if (!data) return; if (data.cid) { return '#dc3545'; } } }, }, ], localCache: { key: 'change-add-list-gcl-spread', colWidth: true, } }; gclSpreadSetting.getColor = function (sheet, data, row, col, defaultColor) { if (data && data.settle_status && data.settle_status === settleStatus.finish) { return spreadColor.stage.settle; } if (data && data.is_change) { return '#c3e6cb'; } return defaultColor; } const gclSpreadObj = { resetXmjSpread: function(data = null) { const xmjs = []; if (data && data.id) { xmjs.push({ deal_id: data.id, cid: '', is_change: _.findIndex(changeList, { lid: data.id }) !== -1 ? 1 : 0, code: '', jldy: '', dwgc: '', fbgc: '', fxgc: '', bwmx: '', quantity: '', }) } else if (data && data.leafXmjs) { for (const leaf of data.leafXmjs) { xmjs.push({ gcl_id: leaf.gcl_id, mx_id: leaf.mx_id || '', is_change: _.findIndex(changeList, { gcl_id: leaf.gcl_id, mx_id: leaf.mx_id || '' }) !== -1 ? 1 : 0, cid: leaf.cid || '', code: leaf.code, jldy: leaf.jldy || '', dwgc: leaf.dwgc || '', fbgc: leaf.fbgc || '', fxgc: leaf.fxgc || '', bwmx: leaf.bwmx || '', quantity: leaf.quantity ? ZhCalc.round(leaf.quantity, findDecimal(data.unit)).toString() : '0', }); } } SpreadJsObj.loadSheetData(xmjSpreadSheet, SpreadJsObj.DataType.Data, xmjs); checkSelectAll(data); }, selectionChanged: function (e, info) { const data = SpreadJsObj.getSelectObject(info.sheet); gclSpreadObj.resetXmjSpread(data); xmjSearch.searchAndLocate($('#xmj-keyword').val()); } }; const xmjSpreadSetting = { cols: [ { title: '变更清单', colSpan: '1', rowSpan: '2', field: 'is_change', hAlign: 1, width: 60, cellType: 'checkbox', readOnly: 'readOnly.isChangeList'}, {title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 120, formatter: '@', readOnly: true}, {title: '细目', colSpan: '1', rowSpan: '2', field: 'jldy', hAlign: 0, width: 150, formatter: '@', readOnly: true}, {title: '单位工程', colSpan: '1', rowSpan: '2', field: 'dwgc', hAlign: 0, width: 150, formatter: '@', readOnly: true}, {title: '分部工程', colSpan: '1', rowSpan: '2', field: 'fbgc', hAlign: 0, width: 150, readOnly: true}, {title: '分项工程', colSpan: '1', rowSpan: '2', field: 'fxgc', hAlign: 0, width: 150, readOnly: true}, {title: '计量单元', colSpan: '1', rowSpan: '2', field: 'bwmx', hAlign: 0, width: 150, readOnly: true}, {title: '数量', colSpan: '1', rowSpan: '2', field: 'quantity', hAlign: 2, width: 100, readOnly: true}, ], emptyRows: 0, headRows: 2, headRowHeight: [25, 25], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', rowHeader:[ { rowHeaderType: 'circle', setting: { size: 5, indent: 16, getColor: function (index, data) { if (!data) return; if (data.cid) { return '#dc3545'; } } }, }, ], }; const xmjCol = { readOnly: { isChangeList: function (data) { if (!data) return true; return readOnly; } } }; const xmjSpreadObj = { buttonClicked: function (e, info) { if (info.sheet.zh_setting) { const select = SpreadJsObj.getSelectObject(info.sheet); const col = info.sheet.zh_setting.cols[info.col]; const gclInfo = SpreadJsObj.getSelectObject(gclSpreadSheet); const gclIndex = changeListData.indexOf(gclInfo); if (col.field === 'is_change') { if (xmjCol.readOnly.isChangeList(select)) { info.sheet.setValue(info.row, info.col, !select || !select.is_change ? 0 : 1); return } if (info.sheet.isEditing()) { info.sheet.endEdit(true); } const is_change = info.sheet.getValue(info.row, info.col) ? 1 : 0; if (!gclInfo) { info.sheet.setValue(info.row, info.col, 0); return; } if (is_change) { const oldCInfo = select.deal_id ? _.find(oldChangeList, { lid: select.deal_id }) : _.find(oldChangeList, { gcl_id: select.gcl_id, mx_id: select.mx_id }); const data = {}; if (oldCInfo) { data.detail = oldCInfo.detail; data.camount = oldCInfo.camount; data.spamount = oldCInfo.spamount; data.is_valuation = oldCInfo.is_valuation; data.delimit = oldCInfo.delimit; } if (select.deal_id) { const newData = { lid: select.deal_id, code: gclInfo.code, name: gclInfo.name, unit: gclInfo.unit, unit_price: gclInfo.unit_price, oamount: gclInfo.quantity ? parseFloat(gclInfo.quantity) : 0, oamount2: oldCInfo ? oldCInfo.oamount2 : gclInfo.quantity ? parseFloat(gclInfo.quantity) : 0, bwmx: '', xmj_code: '', xmj_jldy: '', xmj_dwgc: '', xmj_fbgc: '', xmj_fxgc: '', gcl_id: '', mx_id: '', } _.assign(data, newData); } else if (gclInfo.leafXmjs) { const xmjInfo = _.find(gclInfo.leafXmjs, function (item) { return item.gcl_id === select.gcl_id && (item.mx_id === undefined || item.mx_id === select.mx_id); }); const newData = { lid: select.gcl_id, code: gclInfo.b_code, name: gclInfo.name, unit: gclInfo.unit, unit_price: gclInfo.unit_price, oamount: xmjInfo.quantity, oamount2: oldCInfo ? oldCInfo.oamount2 : xmjInfo.quantity, bwmx: xmjInfo.bwmx || xmjInfo.jldy || '', xmj_code: xmjInfo.code || '', xmj_jldy: xmjInfo.jldy || '', xmj_dwgc: xmjInfo.dwgc || '', xmj_fbgc: xmjInfo.fbgc || '', xmj_fxgc: xmjInfo.fxgc || '', gcl_id: select.gcl_id, mx_id: select.mx_id, } _.assign(data, newData); } console.log(data); // 更新至服务器 postData('/tender/' + window.location.pathname.split('/')[2] + '/change/' + window.location.pathname.split('/')[4] + '/information/save', { type: 'add-change-list', postData: [data] }, function (result) { changeList = result.changeList; select.is_change = 1; changeListData[gclIndex].is_change = 1; SpreadJsObj.reLoadRowData(gclSpreadSheet, gclIndex); checkSelectAll(gclInfo); }, function () { info.sheet.setValue(info.row, info.col, 0); }); } else { const cInfo = select.deal_id ? _.find(changeList, { lid: select.deal_id }) : _.find(changeList, { gcl_id: select.gcl_id, mx_id: select.mx_id }); if (_.find(changeUsedData, {cbid: cInfo.id})) { toastr.warning('该清单已被使用,无法取消变更'); info.sheet.setValue(info.row, info.col, 1); return } else if (checkIsSettle(cInfo)) { toastr.warning('该清单已结算,无法取消变更'); info.sheet.setValue(info.row, info.col, 1); return } else { postData('/tender/' + window.location.pathname.split('/')[2] + '/change/' + window.location.pathname.split('/')[4] + '/information/save', { type: 'del-change-list', ids: [cInfo.id], postData: null }, function (result) { changeList = result.changeList; select.is_change = 0; checkSelectAll(gclInfo); if (select.deal_id) { changeListData[gclIndex].is_change = 0; SpreadJsObj.reLoadRowData(gclSpreadSheet, gclIndex); } else { let isChange = false; gclInfo.leafXmjs.forEach(function (item) { if (item.gcl_id === select.gcl_id && (item.mx_id === undefined || item.mx_id === select.mx_id) && item.is_change) { isChange = true; } }); if (!isChange) { changeListData[gclIndex].is_change = 0; SpreadJsObj.reLoadRowData(gclSpreadSheet, gclIndex); } } }, function () { info.sheet.setValue(info.row, info.col, 1); }); } } } } } }; const preUrl = window.location.pathname.split('/').slice(0, 4).join('/'); let changeListData; let gclGatherData; const gclSpread = SpreadJsObj.createNewSpread($('#gcl-spread')[0]); const gclSpreadSheet = gclSpread.getActiveSheet(); const xmjSpread = SpreadJsObj.createNewSpread($('#xmj-spread')[0]); const xmjSpreadSheet = xmjSpread.getActiveSheet(); sjsSettingObj.setGridSelectStyle(gclSpreadSetting); SpreadJsObj.initSheet(gclSpreadSheet, gclSpreadSetting); sjsSettingObj.setGridSelectStyle(xmjSpreadSetting); SpreadJsObj.initSpreadSettingEvents(xmjSpreadSetting, xmjCol); SpreadJsObj.initSheet(xmjSpreadSheet, xmjSpreadSetting); postData(preUrl + '/defaultBills', { from: 'batch' }, function (result) { gclGatherModel.loadLedgerData(result.bills); gclGatherModel.loadPosData(result.pos); gclGatherData = gclGatherModel.gatherGclData(); gclGatherData = _.filter(gclGatherData, function (item) { return item.leafXmjs && item.leafXmjs.length !== 0; }); for (const ggd in gclGatherData) { if (gclGatherData[ggd].leafXmjs && gclGatherData[ggd].leafXmjs.length === 0) { gclGatherData.splice(ggd, 1); } gclGatherData[ggd].code = gclGatherData[ggd].b_code; let hadcid = 0; for (const xmj of gclGatherData[ggd].leafXmjs) { const changeLedger = _.find(result.changeLedgerList, { id: xmj.gcl_id }); const changePos = _.find(result.changePosList, { id: xmj.mx_id, lid: xmj.gcl_id }); if (changeLedger || changePos) { xmj.cid = 1; xmj.ccid = changeLedger ? changeLedger.ccid : changePos.ccid; hadcid = 1; } } if (hadcid !== 0) gclGatherData[ggd].cid = 1; } // 数组去重 const dealBillList = result.dealBills; for (const db of gclGatherData) { const exist_index = dealBillList.findIndex(function (item) { return item.code === db.code && item.name === db.name && item.unit === db.unit && item.unit_price === db.unit_price; }); if (exist_index !== -1) { dealBillList.splice(exist_index, 1); } } changeListData = gclGatherData.concat(dealBillList).sort(sortByCode); for (const gcl of changeListData) { gcl.unit = gcl.unit !== undefined && gcl.unit !== null ? gcl.unit : ''; gcl.quantity = gcl.quantity !== 0 && gcl.quantity !== null && gcl.quantity !== undefined ? (gcl.unit !== '' ? ZhCalc.round(gcl.quantity, findDecimal(gcl.unit)) : gcl.quantity).toString() : '0'; gcl.unit_price = gcl.unit_price !== null && gcl.unit_price !== undefined ? ZhCalc.round(gcl.unit_price, unitPriceUnit) : 0; // 用id值区分签约清单和台账 if (gcl.id) { const cInfo = gcl.id ? _.find(changeList, { lid: gcl.id }) : null; gcl.is_change = cInfo ? 1 : 0; } else { const index = gcl.leafXmjs && gcl.leafXmjs.length !== 0 ? _.findIndex(gcl.leafXmjs, function (item) { return _.findIndex(changeList, { gcl_id: item.gcl_id }) !== -1; }) : -1; gcl.is_change = index !== -1 ? 1 : 0; } } console.log(changeListData); SpreadJsObj.loadSheetData(gclSpreadSheet, SpreadJsObj.DataType.Data, changeListData); gclSpreadObj.resetXmjSpread(SpreadJsObj.getSelectObject(gclSpreadSheet)); }); gclSpread.bind(spreadNS.Events.SelectionChanged, gclSpreadObj.selectionChanged); xmjSpread.bind(spreadNS.Events.ButtonClicked, xmjSpreadObj.buttonClicked) const xmjSearch = $.xmjSearch({ selector: '#xmj-search', searchSpread: xmjSpread, searchRangeStr: '输入项目节编号、细目、计量单元查找', }); $.divResizer({ select: '#revise-right-spr', callback: function () { gclSpread.refresh(); xmjSpread.refresh(); if (searchGcl) searchGcl.spread.refresh(); } }); $.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(); gclSpread.refresh(); xmjSpread.refresh(); if (searchGcl) searchGcl.spread.refresh(); } }); gclSpread.refresh(); xmjSpread.refresh(); // 展开收起标准节点 $('a', '#side-menu').bind('click', function (e) { e.preventDefault(); const tab = $(this), tabPanel = $(tab.attr('content')); // 展开工具栏、切换标签 if (!tab.hasClass('active')) { const close = $('.active', '#side-menu').length === 0; $('a', '#side-menu').removeClass('active'); tab.addClass('active'); $('.tab-content .tab-pane').removeClass('active'); tabPanel.addClass('active'); showSideTools(tab.hasClass('active')); if (tab.attr('content') === '#search') { if (!searchGcl) { searchGcl = $.listSearch({ selector: '#search', searchSpread: gclSpread, searchOver: true, searchEmpty: true, resultSpreadSetting: { cols: [ {title: '清单编号', field: 'code', hAlign: 0, width: 80, formatter: '@'}, {title: '名称', field: 'name', width: 150, hAlign: 0, formatter: '@'}, {title: '单位', field: 'unit', width: 50, hAlign: 1, formatter: '@'}, {title: '单价', field: 'unit_price', hAlign: 2, width: 50}, {title: '数量', field: 'quantity', hAlign: 2, width: 50}, ], emptyRows: 0, headRows: 1, headRowHeight: [32], headColWidth: [30], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', selectedBackColor: '#fffacd', readOnly: true, }, afterLocated: function () { gclSpreadObj.resetXmjSpread(SpreadJsObj.getSelectObject(gclSpreadSheet)); }, check: function(data, keyword) { return !keyword || (data.code && data.code.indexOf(keyword) > -1) || (data.name && data.name.indexOf(keyword) > -1); }, customSearch: [ { key: 'revise', title: '新增部位', valid: true, parent: true, check: function (node) { if (node.formc || node.cid) { return true; } else { return false; } } } ], }); } searchGcl.spread.refresh(); } } else {// 收起工具栏 tab.removeClass('active'); tabPanel.removeClass('active'); showSideTools(tab.hasClass('active')); } gclSpread.refresh(); xmjSpread.refresh(); }); // 全选及取消 $('#code-select-all').click(function () { // 全选checkbox const data = SpreadJsObj.getSelectObject(gclSpreadSheet); if ($(this).is(':checked')){ const addDatas = []; if (data && data.id) { if (_.findIndex(changeList, function (item) { return item.id && item.id === data.id; }) === -1) { addDatas.push({ lid: data.id, code: data.code, name: data.name || '', unit: data.unit || '', unit_price: data.unit_price, oamount: data.quantity ? parseFloat(data.quantity) : 0, oamount2: data.quantity ? parseFloat(data.quantity) : 0, bwmx: '', xmj_code: '', xmj_jldy: '', xmj_dwgc: '', xmj_fbgc: '', xmj_fxgc: '', gcl_id: '', mx_id: '', }); } } else if (data && data.leafXmjs) { for (const leaf of data.leafXmjs) { if (_.findIndex(changeList, function (item) { return item.gcl_id === leaf.gcl_id && item.mx_id === (leaf.mx_id || ''); }) === -1) { addDatas.push({ lid: leaf.gcl_id, code: data.code, name: data.name || '', unit: data.unit || '', unit_price: data.unit_price, oamount: leaf.quantity, oamount2: leaf.quantity, bwmx: leaf.bwmx || leaf.jldy || '', xmj_code: leaf.code || '', xmj_jldy: leaf.jldy || '', xmj_dwgc: leaf.dwgc || '', xmj_fbgc: leaf.fbgc || '', xmj_fxgc: leaf.fxgc || '', gcl_id: leaf.gcl_id, mx_id: leaf.mx_id, }); } } } console.log(addDatas); if (addDatas.length > 0) { // 更新至服务器 postData('/tender/' + window.location.pathname.split('/')[2] + '/change/' + window.location.pathname.split('/')[4] + '/information/save', { type: 'add-change-list', postData: addDatas, }, function (result) { changeList = result.changeList; const gclIndex = changeListData.indexOf(data); data.is_change = 1; changeListData[gclIndex].is_change = 1; SpreadJsObj.reLoadRowData(gclSpreadSheet, gclIndex); gclSpreadObj.resetXmjSpread(data); }, function () { $('#code-select-all').prop('checked', false); }); } } else { const cList = xmjSpreadSheet.zh_data; const removeDatas = []; let hadContinue = false; for (const c of cList) { const cInfo = c.deal_id ? _.find(changeList, { lid: c.deal_id }) : _.find(changeList, function (item) { return item.gcl_id === c.gcl_id && item.mx_id === c.mx_id; }); if (_.find(changeUsedData, {cbid: cInfo.id})) { hadContinue = true; continue; } else if (checkIsSettle(cInfo)) { hadContinue = true; continue; } removeDatas.push(cInfo); } console.log(removeDatas); if (removeDatas.length > 0) { postData('/tender/' + window.location.pathname.split('/')[2] + '/change/' + window.location.pathname.split('/')[4] + '/information/save', { type: 'del-change-list', ids: _.map(removeDatas, 'id'), postData: null }, function (result) { changeList = result.changeList; if (!hadContinue) { const gclIndex = changeListData.indexOf(data); data.is_change = 0; changeListData[gclIndex].is_change = 0; SpreadJsObj.reLoadRowData(gclSpreadSheet, gclIndex); } gclSpreadObj.resetXmjSpread(data); }, function () { $('#code-select-all').prop('checked', true); }); } } }); // 选中所有新增部位/清单 $('#select-all-revise').click(function() { const qtySpr = '*;*', infoSpr = '!_!', recSpr = '$#$'; const gclTr = $('#table-list-select tr'); for (const tr of gclTr) { const lid = $(tr).data('lid'); let gcl = _.find(gclGatherData, function (item) { return item.leafXmjs && item.leafXmjs[0].gcl_id === lid; }); if (!gcl) gcl = gclGatherData[$(this).data('gcl')]; if (!gcl || !gcl.cid) continue; let data_bwmx = []; if ($(tr).attr('data-bwmx') !== '') { data_bwmx = $(tr).attr('data-bwmx').split(recSpr); data_bwmx = data_bwmx.filter(x => { const rec = x.split(qtySpr); const info = rec[0].split(infoSpr); if (info.length < 8) return true; const leaf = gcl.leafXmjs.find(lx => { return lx.mx_id === info[6]}); return !leaf || !leaf.cid || leaf.ccid !== window.location.pathname.split('/')[4]; }); } let hasNew = false; for (const [index, leaf] of gcl.leafXmjs.entries()) { if (!leaf.cid || leaf.ccid !== window.location.pathname.split('/')[4]) continue; const bwmx = [leaf.code, leaf.jldy || '', leaf.dwgc || '', leaf.fbgc || '', leaf.fxgc || '', leaf.gcl_id, leaf.mx_id, leaf.bwmx || leaf.jldy || '']; const de_qu = bwmx.join(infoSpr) + qtySpr + (leaf.quantity || 0); if (data_bwmx.indexOf(de_qu) < 0) data_bwmx.push(de_qu); hasNew = true; } if (hasNew) $(tr).attr('data-bwmx', data_bwmx.join(recSpr)).addClass('table-success'); } // 触发点击当前清单,重载当前全部部位 const dataIndex = $('#code-list').attr('data-index'); if (dataIndex) { $(`tr[data-index=${dataIndex}]`).trigger('click'); } }); }); function checkSelectAll(data) { let check = false; if (data && data.id && data.is_change) { check = true; } else if(data && data.leafXmjs) { check = data.leafXmjs.length > 0 ? true : false; data.leafXmjs.forEach(function (item) { const is_change = _.findIndex(changeList, { gcl_id: item.gcl_id, mx_id: item.mx_id || '' }) !== -1 if (!is_change) { check = false; return; } }); } $('#code-select-all').prop('checked', check); } function findDecimal(unit) { let value = precision.other.value; const changeUnits = precision; for (const d in changeUnits) { if (changeUnits[d].unit !== undefined && changeUnits[d].unit === unit) { value = changeUnits[d].value; break; } } return value; } // 判断是否是已结算清单 function checkIsSettle(data) { const info = data.mx_id ? _.find(settlePos, { lid: data.gcl_id, pid: data.mx_id }) : _.find(settleBills, { lid: data.gcl_id }); if (info && info.settle_status && info.settle_status === settleStatus.finish) { return true; } return false; }