const TenderSelect = function (setting) { const tsObj = { setting, tenderSpread: null, tenderSheet: null, resultSpread: null, resultSheet: null, select: null, tenderSourceTree: null, orgHistroy: {}, trHistory: {}, trArray: [], _rebuildStageSelect: function () { if (tsObj.setting.type === 'stage') { const getItems = function (data) { if (!data) return []; const items = []; for (let i = 1; i <= data.stageCount; i++) { items.push({value: i, text: `第${i}期`}); } return items; }; for (let i = 0; i < tsObj.resultSheet.getRowCount(); i++) { const cellType2 = new spreadNS.CellTypes.ComboBox().itemHeight(10).editorValueType(spreadNS.CellTypes.EditorValueType.value).items(getItems(tsObj.trArray[i])); tsObj.resultSheet.getCell(i, 1).cellType(cellType2); } } }, _initSelected: function () { for (const node of this.tenderSourceTree.nodes) { node.selected = this.trArray.findIndex(x => { return node.tid === x.tid; }) >= 0; } }, _checkSelectTender: function () { if (!this.trHistory.tenders || this.trHistory.tenders.length === 0) return; let differ = this.trHistory.tenders.length !== this.trArray.length; if (!differ) { for (const tr of this.trArray) { if (this.trHistory.tenders.findIndex(x => { return x.tid === tr.tid; }) < 0) { differ = true; break; } } } if (differ) { $('#tender-select-hint').show(); const checkType = tsObj.setting.type === tsObj.trHistory.type ? '上次' : '台账'; $('#ts-hint-text').html(`勾选的标段与${checkType}不同,请仔细确认。`); } else { $('#tender-select-hint').hide(); } }, _addTender: function (tender) { const tr = tsObj.trArray.find(x => { return x.tid === tender.tid; }); const t = {tid: tender.tid, name: tender.name, stageCount: tender.stageCount}; if (!tr) tsObj.trArray.push(t); return t; }, _removeTender: function (tender) { const gri = tsObj.trArray.findIndex(function (x, i, arr) { return x.tid === tender.tid; }); if (gri >= 0) tsObj.trArray.splice(gri, 1); }, reloadResultData: function () { SpreadJsObj.reLoadSheetData(tsObj.resultSheet); this._checkSelectTender(); this._rebuildStageSelect(); }, tsButtonClicked: function (e, info) { if (!info.sheet.zh_setting) return; const col = info.sheet.zh_setting.cols[info.col]; if (col.field !== 'selected') return; const node = SpreadJsObj.getSelectObject(info.sheet); node.selected = !node.selected; if (node.children && node.children.length > 0) { const posterity = tsObj.tenderSourceTree.getPosterity(node); for (const p of posterity) { p.selected = node.selected; if (!p.children || p.children.length === 0){ if (p.selected) { tsObj._addTender(p); } else { tsObj._removeTender(p); } } } SpreadJsObj.reLoadRowData(info.sheet, info.row, posterity.length + 1); } else { if (node.selected) { tsObj._addTender(node); } else { tsObj._removeTender(node); } SpreadJsObj.reLoadRowData(info.sheet, info.row, 1); } tsObj.reloadResultData(); }, trEditEnded: function (e, info) { const data = SpreadJsObj.getSelectObject(info.sheet); const col = info.sheet.zh_setting.cols[info.col]; data[col.field] = info.sheet.getValue(info.row, info.col); }, loadHistory: function () { postData('/list/load', {type: tsObj.setting.type, tid: tsObj.select.tender_id, lid: tsObj.select.id}, data => { tsObj.orgHistory = data.history || {}; tsObj.tenderSourceTree = Tender2Tree.convert(data.category, data.tenders, data.ledgerAuditConst, data.stageAuditConst); tsObj.trHistory = JSON.parse(JSON.stringify(tsObj.orgHistory)); if (tsObj.orgHistory.tenders) { tsObj.trHistory.tenders = tsObj.orgHistory.tenders.filter(x => { return tsObj.tenderSourceTree.nodes.find(y => { return x.tid === y.tid })}); } tsObj.resetSelect(); }); }, initTenderSelect: function () { if (this.tenderSpread) return; this.tenderSpread = SpreadJsObj.createNewSpread($('#ts-source-spread')[0]); this.tenderSheet = this.tenderSpread.getActiveSheet(); SpreadJsObj.initSheet(this.tenderSheet, { cols: [ {title: '选择', field: 'selected', hAlign: 1, width: 40, formatter: '@', cellType: 'checkbox'}, {title: '名称', field: 'name', hAlign: 0, width: 180, formatter: '@', cellType: 'tree'}, {title: '期数', field: 'phase', hAlign: 1, width: 60, formatter: '@'}, {title: '审批状态', field: 'status', hAlign: 1, width: 60, formatter: '@'} ], emptyRows: 0, headRows: 1, headRowHeight: [32], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', headColWidth: [0], selectedBackColor: '#fffacd', readOnly: true, }); this.resultSpread = SpreadJsObj.createNewSpread($('#ts-result-spread')[0]); this.resultSheet = this.resultSpread.getActiveSheet(); const resultSpreadSetting = { cols: [], emptyRows: 0, headRows: 1, headRowHeight: [32], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', headColWidth: [], getColor: function (sheet, data, row, col, defaultColor) { if (data) { return data.invalid ? '#ddd' : defaultColor; } else { return defaultColor; } } }; if (this.setting.type === 'ledger' || this.setting.type === 'revise') { resultSpreadSetting.cols.push( {title: '名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 230, formatter: '@', readOnly: true} ); } else if (this.setting.type === 'stage') { resultSpreadSetting.cols.push( {title: '名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 180, formatter: '@', readOnly: true}, {title: '可选期', colSpan: '1', rowSpan: '1', field: 'stage', hAlign: 0, width: 60}, ) } SpreadJsObj.initSheet(this.resultSheet, resultSpreadSetting); this.tenderSpread.bind(spreadNS.Events.ButtonClicked, tsObj.tsButtonClicked); if (this.setting.type === 'stage') { this.resultSpread.bind(spreadNS.Events.EditEnded, tsObj.trEditEnded); $('#tender-select-option').show(); } else { $('#tender-select-option').hide(); } $('#tender-select-ok').click(() => { const updateData = { lid: tsObj.select.id, type: tsObj.setting.type, tenders: tsObj.trArray }; if (tsObj.setting.type === 'stage') updateData.cover = $('#ts-cover')[0].checked; if (updateData.tenders.length > 0) { postData(window.location.pathname + '/sumLoad', updateData, result => { tsObj.setting.afterLoad(result); $('#tender-select').modal('hide'); }); } else { $('#tender-select').modal('hide'); } }); this.loadHistory(); }, resetSelect: function () { tsObj.trArray.length = 0; if (tsObj.trHistory.tenders) { for (const trh of tsObj.trHistory.tenders) { const source = tsObj.tenderSourceTree.nodes.find(x => { return x.tid === trh.tid; }); if (source) { trh.stageCount = source.stageCount; } else { trh.invalid = true; } tsObj.trArray.push(trh); } } tsObj._initSelected(); SpreadJsObj.loadSheetData(tsObj.tenderSheet, SpreadJsObj.DataType.Tree, tsObj.tenderSourceTree); SpreadJsObj.loadSheetData(tsObj.resultSheet, SpreadJsObj.DataType.Data, tsObj.trArray); tsObj._rebuildStageSelect(); $('#tender-select-hint').hide(); } }; $('#tender-select').on('shown.bs.modal', () => { tsObj.initTenderSelect(); tsObj.loadHistory(); }); $('#tender-select-reset').click(tsObj.resetSelect); const showSelect = function (node) { tsObj.select = node; $('#tender-select-hint').hide(); tsObj.trArray = []; $('#tender-select').modal('show'); }; return { showSelect } };