'use strict'; /** * 期计量 - 本期计量台账页面 js * * @author Mai * @date 2018/12/7 * @version */ const ckBillsSpread = window.location.pathname + '-billsSelect'; function checkTzMeasureType () { return tender.measure_type === measureType.tz.value; } function transExpr(expr) { return $.trim(expr).replace('\t', '').replace('=', '').replace('%', '/100'); } function getExprInfo (field) { const exprField = [ {qty: 'sgfh_qty', expr: 'sgfh_expr'}, {qty: 'sjcl_qty', expr: 'sjcl_expr'}, {qty: 'qtcl_qty', expr: 'qtcl_expr'}, {qty: 'contract_qty', expr: 'contract_expr'}, ]; return _.find(exprField, {qty: field}); } /** * 从cookie中读取缓存的列显示设置,没有则取默认 * @returns {*[]} */ function customColDisplay () { const defaultSetting = [ { title: '本期计量合同', fields: ['contract_qty', 'contract_tp'], visible: true }, { title: '本期数量变更', fields: ['qc_qty', 'qc_tp', 'qc_bgl'], visible: true }, { title: '本期完成计量', fields: ['gather_qty', 'gather_tp'], visible: true }, { title: '截止本期计量合同', fields: ['end_contract_qty', 'end_contract_tp'], visible: true }, { title: '截止本期数量变更', fields: ['end_qc_qty', 'end_qc_tp', 'end_qc_bgl'], visible: true }, { title: '截止本期完成计量', fields: ['end_gather_qty', 'end_gather_tp', 'end_gather_percent'], visible: true }, { title: '本期批注', fields: ['postil'], visible: true }, { title: '图册号', fields: ['drawing_code'], visible: true }, { title: '备注', fields: ['memo'], visible: true }, { title: '总额计量', fields: ['is_tp'], visible: true}, ]; if (!checkTzMeasureType()) { defaultSetting.unshift({ title: '签约合同', fields: ['deal_qty', 'deal_tp'], visible: true }, { title: '台账', fields: ['quantity', 'total_price'], visible: true}); } const settingStr = Cookies.get(ckColSetting); if (settingStr) { const customSetting = JSON.parse(settingStr); for (const ds of defaultSetting) { const cs = customSetting.find(x => {return x.title === ds.title}); if (cs) ds.visible = cs.visible; } } return defaultSetting; } /** * 根据列显示设置,调整setting中的列是否显示 * @param setting * @param customDisplay */ function customizeStageTreeSetting(setting, customDisplay) { for (const cd of customDisplay) { for (const c of setting.cols) { if (cd.fields.indexOf(c.field) !== -1) { c.visible = cd.visible; } } } } /** * 初始化 树结构 列事件 * @param setting */ function initTreeColSettingEvents(setting) { const Events = { readOnly: { measureData: function (node) { return node.children && node.children.length > 0; }, }, }; const getEvent = function (eventName) { const names = eventName.split('.'); let event = Events; for (let name of names) { if (event[name]) { event = event[name]; } else { return null; } } if (event && Object.prototype.toString.apply(event) !== "[object Function]") { return null; } else { return event; } }; for (const col of setting.cols) { if (col.readOnly && Object.prototype.toString.apply(col.readOnly) === "[object String]") { col.readOnly = getEvent(col.readOnly); } } } // 生成所有附件列表 function getAllList(currPageNum = 1) { // 每页最多几个附件 const pageCount = 20; // 附件总数 const total = attData.length; // 总页数 const pageNum = Math.ceil(total/pageCount); $('#totalPage').text(pageNum); $('#currentPage').text(total === 0 ? 0 : currPageNum); // 当前页附件内容 const currPageAttData = attData.slice((currPageNum-1)*pageCount, currPageNum*pageCount); currPageFileData = currPageAttData; let html = ''; // '/tender/' + tender.id + '/measure/stage/' + stage.order + '/download/file/' + att.id for(const att of currPageAttData) { html += `
${att.filename}${att.fileext}
${att.username}` } $('#alllist-table').html(html); $('#alllist-table').on('click', 'tr', function() { $('#alllist-table tr').removeClass('bg-light') $(this).addClass('bg-light') }) } // 生成当前节点列表 function getNodeList(node) { let html = ''; for(const att of attData) { if (node === att.lid) { // html += ''+ att.filename + att.fileext +''+ att.username +''; html += `
${att.filename}${att.fileext}
${att.username}` } } $('#nodelist-table').html(html); $('#nodelist-table').on('click', 'tr', function() { $('#nodelist-table tr').removeClass('bg-light') $(this).addClass('bg-light') }) } function getGxbyText(data) { const def = thirdParty.gxby.find(function (x) { return x.value === data.gxby_status; }); return def ? def.name : ''; } function getDaglText(data) { const def = thirdParty.dagl.find(function (x) { return x.value === data.dagl_status; }); return def ? def.name : ''; } function getHintMsg () { return { invalidExpr: {type: 'warning', msg: '粘贴了非法表达式,已过滤'}, disableChange: {type: 'error', msg: '不可修改此数据'}, } } let ledgerData, posData = ''; $(document).ready(() => { const exportExcelSetting = { cols: [ {title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 145, formatter: '@', cellType: 'tree'}, {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 70, formatter: '@'}, {title: '计量单元', colSpan: '1', rowSpan: '2', field: 'pos_code', hAlign: 0, width: 70, formatter: '@'}, {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 185, formatter: '@'}, {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 60, formatter: '@', cellType: 'unit'}, {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number'}, {title: '台账|数量', colSpan: '2|1', rowSpan: '1|1', field: 'quantity', hAlign: 2, width: 60, type: 'Number'}, {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 60, type: 'Number'}, {title: '本期合同计量|数量', colSpan: '2|1', rowSpan: '1|1', field: 'contract_qty', hAlign: 2, width: 60, type: 'Number'}, {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'contract_tp', hAlign: 2, width: 60, type: 'Number'}, {title: '本期数量变更|数量', colSpan: '2|1', rowSpan: '1|1', field: 'qc_qty', hAlign: 2, width: 60, type: 'Number'}, {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'qc_tp', hAlign: 2, width: 60, type: 'Number'}, {title: '本期完成计量|数量', colSpan: '2|1', rowSpan: '1|1', field: 'gather_qty', hAlign: 2, width: 60, type: 'Number'}, {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'gather_tp', hAlign: 2, width: 60, type: 'Number'}, {title: '截止本期合同计量|数量', colSpan: '2|1', rowSpan: '1|1', field: 'end_contract_qty', hAlign: 2, width: 60, type: 'Number'}, {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'end_contract_tp', hAlign: 2, width: 60, type: 'Number'}, {title: '截止本期数量变更|数量', colSpan: '2|1', rowSpan: '1|1', field: 'end_qc_qty', hAlign: 2, width: 60, type: 'Number'}, {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'end_qc_tp', hAlign: 2, width: 60, type: 'Number'}, {title: '截止本期完成计量|数量', colSpan: '3|1', rowSpan: '1|1', field: 'end_gather_qty', hAlign: 2, width: 60, type: 'Number'}, {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'end_gather_tp', hAlign: 2, width: 60, type: 'Number'}, {title: '|完成率(%)', colSpan: '|1', rowSpan: '|1', field: 'end_gather_percent', hAlign: 2, width: 80, type: 'Number'}, {title: '合同|项目节数量1', colSpan: '2|1', rowSpan: '1|1', field: 'deal_dgn_qty1', hAlign: 2, width: 60, type: 'Number'}, {title: '|项目节数量2', colSpan: '|1', rowSpan: '|1', field: 'deal_dgn_qty2', hAlign: 2, width: 60, type: 'Number'}, {title: '变更|项目节数量1', colSpan: '2|1', rowSpan: '1|1', field: 'c_dgn_qty1', hAlign: 2, width: 60, type: 'Number'}, {title: '|项目节数量2', colSpan: '|1', rowSpan: '|1', field: 'c_dgn_qty2', hAlign: 2, width: 60, type: 'Number'}, {title: '经济指标', colSpan: '1', rowSpan: '2', field: 'final_dgn_price', hAlign: 2, width: 60, type: 'Number'}, {title: '本期批注', colSpan: '1', rowSpan: '2', field: 'postil', hAlign: 0, width: 100, formatter: '@', cellType: 'autoTip'}, {title: '图(册)号', colSpan: '1', rowSpan: '2', field: 'drawing_code', hAlign: 0, width: 80, formatter: '@'}, {title: '备注', colSpan: '1', rowSpan: '2', field: 'memo', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}, ], headRows: 2, headRowHeight: [25, 25], defaultRowHeight: 21, headerFont: 'bold 10px 微软雅黑', font: '10px 微软雅黑' }; let detail, searchLedger, checkedChanges; const checkOption = { sibling: { enable: 0 }, empty_code: { enable: 0 }, calc: { enable: 1, fields: ['contract_qty', 'qc_qty'], }, zero: { enable: 0 }, tp: { enable: 1, fields: [ {qty: 'contract_qty', tp: 'contract_tp'}, {qty: 'qc_qty', tp: 'qc_tp'}, ], filter: function (node) { return node.is_tp; } }, over: { enable: 1, isTz: checkTzMeasureType(), }, limit3f: { enable: 1, checkType: [], status: thirdParty, } }; if (tender.s2b_gxby_check) checkOption.limit3f.checkType.push('gxby'); if (tender.s2b_dagl_check) checkOption.limit3f.checkType.push('dagl'); // 界面布局 autoFlashHeight(); // 初始化 台账树结构 数据结构 removeLocalCache('bills-fold'); const stageTreeSetting = { id: 'ledger_id', pid: 'ledger_pid', order: 'order', level: 'level', rootId: -1, keys: ['id', 'tender_id', 'ledger_id'], stageId: 'id', autoExpand: 3, // markFoldKey: 'bills-fold', // markFoldSubKey: window.location.pathname.split('/')[2], markExpandKey: 'stage-bills-expand', markExpandSubKey: window.location.pathname.split('/')[2], }; // 台账树结构计算相关设置 stageTreeSetting.updateFields = ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'postil', 'used', 'contract_expr']; stageTreeSetting.calcFields = ['deal_tp', 'total_price', 'contract_tp', 'qc_tp', 'gather_tp', 'pre_contract_tp', 'pre_qc_tp', 'pre_gather_tp', 'end_contract_tp', 'end_qc_tp', 'end_gather_tp', 'end_correct_tp']; stageTreeSetting.calcFun = function (node) { if (!node.children || node.children.length === 0) { node.pre_gather_qty = ZhCalc.add(node.pre_contract_qty, node.pre_qc_qty); node.gather_qty = ZhCalc.add(node.contract_qty, node.qc_qty); node.end_contract_qty = ZhCalc.add(node.pre_contract_qty, node.contract_qty); node.end_qc_qty = ZhCalc.add(node.pre_qc_qty, node.qc_qty); node.end_gather_qty = ZhCalc.add(node.pre_gather_qty, node.gather_qty); } node.pre_gather_tp = ZhCalc.add(node.pre_contract_tp, node.pre_qc_tp); node.gather_tp = ZhCalc.add(node.contract_tp, node.qc_tp); node.end_contract_tp = ZhCalc.add(node.pre_contract_tp, node.contract_tp); node.end_qc_tp = ZhCalc.add(node.pre_qc_tp, node.qc_tp); node.end_gather_tp = ZhCalc.add(node.pre_gather_tp, node.gather_tp); node.end_final_tp = ZhCalc.add(node.end_qc_tp, node.total_price); if (!node.children || node.children.length === 0) { if (node.end_contract_qty) { node.end_correct_tp = ZhCalc.add(node.end_qc_tp, ZhCalc.mul(node.end_contract_qty, node.unit_price, tenderInfo.decimal.tp)); } else { node.end_correct_tp = node.end_gather_tp; } } node.end_gather_percent = ZhCalc.mul(ZhCalc.div(node.end_gather_tp, node.end_final_tp), 100, 2); node.end_correct_percent = ZhCalc.mul(ZhCalc.div(node.end_correct_tp, node.end_final_tp), 100, 2); node.final_dgn_price = ZhCalc.round(ZhCalc.div(node.end_gather_tp, ZhCalc.add(node.deal_dgn_qty1, node.c_dgn_qty1)), tenderInfo.decimal.up); }; const stageTree = createNewPathTree('stage', stageTreeSetting); // 初始化 计量单元 数据结构 const stagePosSetting = { id: 'id', ledgerId: 'lid', updateFields: ['contract_qty', 'qc_qty', 'postil', 'contract_expr'], }; stagePosSetting.calcFun = function (pos) { pos.pre_gather_qty = ZhCalc.add(pos.pre_contract_qty, pos.pre_qc_qty); pos.gather_qty = ZhCalc.add(pos.contract_qty, pos.qc_qty); pos.end_contract_qty = ZhCalc.add(pos.pre_contract_qty, pos.contract_qty); pos.end_qc_qty = ZhCalc.add(pos.pre_qc_qty, pos.qc_qty); pos.end_gather_qty = ZhCalc.add(pos.pre_gather_qty, pos.gather_qty); pos.sum = ZhCalc.add(pos.end_qc_qty, pos.quantity); pos.end_gather_percent = ZhCalc.mul(ZhCalc.div(pos.end_gather_qty, pos.sum), 100, 2); pos.estimate_qty = !checkZero(pos.real_qty) ? ZhCalc.sub(ZhCalc.sub(pos.real_qty, pos.quantity), pos.end_qc_qty) : null; }; const stagePos = new StagePosData(stagePosSetting); const setCooperationSelectHtml = function () { const selectHtml = []; selectHtml.push(''); const cooName = _.uniqWith(_.map(stageTree.pwd, 'company')); for (const i of cooName) { selectHtml.push(''); } $('#cooperationSelect').html(selectHtml.join('')); }; const reloadCooperationHtml = function () { const html = []; const select = $('#cooperationSelect').val(); const list = select !== '全部' ? _.filter(stageTree.pwd, { company: select }) : stageTree.pwd; for (const p of list) { if (!p.node) continue; if (p.confirm) { html.push(``); } else { html.push(``); } html.push(`${p.node.code}`, `${p.node.name}`); if(coopwd) { html.push('', p.check ? `已解锁:${p.pwd}` : `解锁`, ''); } html.push('', p.company, ''); if (p.check && p.confirm) { html.push('', moment(p.confirm_time).format('YYYY-MM-DD HH:mm') + ' ' + (coopwd ? `重新审批` : ''), ''); } else if (!p.check && p.confirm) { html.push('', moment(p.confirm_time).format('YYYY-MM-DD HH:mm'), ''); } else if (p.check && !p.confirm && coopwd) { html.push('', `确认`, ''); } else { html.push('', ''); } html.push(''); } $('#cooperationList').html(html.join('')); }; class Changes { constructor(obj) { const self = this; this.obj = obj; // 初始化 清单编号窗口 参数 this.spreadSetting = { cols: [ {title: '已用', field: '', width: 45, formatter: '@', cellType: 'image', readOnly: true, hAlign: 1, indent: 14, img: function (data) { if (data.uamount && !checkZero(data.uamount)) { return $('#icon-ok')[0]; } else { return null; } }}, {title: '变更令号', field: 'p_code', width: 100, formatter: '@', readOnly: true, hAlign: 0, }, {title: '名称', field: 'name', width: 120, formatter: '@', readOnly: true, hAlign: 0,}, {title: '变更部位', field: 'b_bwmx', width: 100, formatter: '@', readOnly: true, hAlign: 0,}, //{title: '总数量', field: 'b_amount', width: 60, readOnly: true, hAlign: 2, }, {title: '可变更数量', field: 'vamount', width: 60, readOnly: true, hAlign: 2, type: 'Number', getValue: function (data) {return data.vamount ? data.vamount + '' : '0';}}, {title: '本期计量', field: 'uamount', width: 60, hAlign: 2, type: 'Number', }, ], emptyRows: 0, headRows: 1, headRowHeight: [32], headerFont: '12px 微软雅黑', font: '12px 微软雅黑', getColor: function (sheet, data, row, col, defaultColor) { if (col.field === 'uamount') { if (data.bamount > 0) { const usedAmount = ZhCalc.add(data.uamount, data.pre_amount); return usedAmount < 0 || usedAmount > data.bamount ? '#ff6f5c' : defaultColor; } else if (data.bamount < 0) { const usedAmount = ZhCalc.add(data.uamount, data.pre_amount); return usedAmount > 0 || usedAmount < data.bamount ? '#ff6f5c' : defaultColor; } else { return data.uamount ? '#ff6f5c' : defaultColor; } } else { return defaultColor; } } }; this.curChangeId = ''; this.spread = SpreadJsObj.createNewSpread($('#change-spread')[0]); this.firstView = true; SpreadJsObj.initSheet(this.spread.getActiveSheet(), this.spreadSetting); // 初次显示,需刷新spread界面,保证界面绘制正确 this.obj.bind('shown.bs.modal', function () { if (self.firstView) { self.firstView = false; self.spread.refresh(); } }); // 切换变更令,加载右侧明细数据 this.spread.bind(spreadNS.Events.SelectionChanged, function (e, info) { const change = SpreadJsObj.getSelectObject(info.sheet); if(change) { self._loadChangeDetail(change); } }); // 填写本期计量 this.spread.bind(spreadNS.Events.EditEnded, function (e, info) { if (info.sheet.zh_setting) { const col = info.sheet.zh_setting.cols[info.col]; const sortData = info.sheet.zh_dataType === 'tree' ? info.sheet.zh_tree.nodes : info.sheet.zh_data; const node = sortData[info.row]; node[col.field] = col.type === 'Number' ? parseFloat(info.editingText) : info.editingText; // 刷新界面 SpreadJsObj.reLoadRowData(info.sheet, info.row, 1); } }); this.spread.bind(spreadNS.Events.ClipboardPasted, function (e, info) { if (info.sheet.zh_setting) { const sortData = SpreadJsObj.getSortData(info.sheet); for (let iRow = 0; iRow < info.cellRange.rowCount; iRow++) { const curRow = iRow + info.cellRange.row; const curCol = info.cellRange.col; const col = info.sheet.zh_setting.cols[info.cellRange.col]; sortData[curRow][col.field] = col.type === 'Number' ? _.toNumber(info.sheet.getText(curRow, curCol)) : info.sheet.getText(curRow, curCol); } SpreadJsObj.reLoadRowData(sheet, info.cellRange.row, sel.cellRange.rowCount); } }); SpreadJsObj.addDeleteBind(this.spread, function (sheet) { if (sheet.zh_setting) { const sel = sheet.getSelections()[0]; const sortData = SpreadJsObj.getSortData(sheet); // 仅本期计量可删除 if (sel.col === 5 && sel.colCount === 1) { const col = sheet.zh_setting.cols[sel.col]; for (let iRow = sel.row; iRow < sel.row + sel.rowCount; iRow++) { const data = sortData[iRow]; data[col.field] = null; } SpreadJsObj.reLoadRowData(sheet, sel.row, sel.rowCount); } } }); // 过滤可变更数量为0 $('#filterEmpty').click(function () { self._filterChange(!this.checked, $('#matchPos')[0].checked); }); // 匹配编号 $('#matchPos').click(function () { self._filterChange(!$('#filterEmpty')[0].checked, this.checked); }); // 展开收起 变更令详细信息 $('#show-bgl-detail').bind('click', function () { const detail = $('#bgl-detail'), bgl=$('#bgl'), obj=$(this); if (detail.hasClass('col-4')) { detail.attr('class', 'col').hide(); bgl.attr('class', 'col-12'); $('a', obj).attr('title', '展开侧栏'); $('i', obj).attr('class', 'fa fa-chevron-left'); self.spread.refresh(); } else { detail.attr('class', 'col-4').show(); bgl.attr('class', 'col-8'); $('a', obj).attr('title', '收起侧栏'); $('i', obj).attr('class', 'fa fa-chevron-right'); self.spread.refresh(); } }); // 添加调用变更令 $('#usg-bg-ok').click(function () { const data = { target: self.callData, change: [] }; for (const c of self.displayChanges) { if (c.uamount) { if (c.bamount > 0) { const usedAmount = ZhCalc.add(c.uamount, c.pre_amount); if (usedAmount < 0 || usedAmount > c.bamount) { toastr.error('变更令:' + c.code + ' 超计,请修改本期计量后,再提交'); return; } } else if (c.bamount < 0) { const usedAmount = ZhCalc.add(c.uamount, c.pre_amount); if (usedAmount > 0 || usedAmount < c.bamount) { toastr.error('变更令:' + c.code + ' 超计,请修改本期计量后,再提交'); return; } } else { toastr.error('变更令:' + c.code + ' 超计,请修改本期计量后,再提交'); return; } data.change.push({ cid: c.cid, cbid: c.cbid, qty: c.uamount }); } } // 提交数据到后端 postData(window.location.pathname + '/use-change', data, function(result) { if (result.pos) { stagePos.loadCurStageData(result.pos.curStageData); } const nodes = stageTree.loadPostStageData(result.bills); stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes); stagePosSpreadObj.loadCurPosData(); if (detail) { detail.loadStageChangeUpdateData(result, nodes); } else { stageIm.loadUpdateChangeData(result, nodes) } self.obj.modal('hide'); }); }) } _calculateAmount() { for (const c of this.changes) { c.bamount = _.toNumber(c.b_amount); c.vamount = ZhCalc.sub(c.bamount, c.used_amount); const uc = _.find(this.useChanges, {cid: c.cid, cbid: c.cbid}); if (uc) { c.org_uamount = uc.qty; c.uamount = uc.qty; c.vamount = ZhCalc.add(c.vamount, c.uamount); } c.pre_amount = ZhCalc.sub(c.used_amount, c.uamount); } } _loadChangeDetail(change) { if (change) { if (change.cid === this.curChangeId) { return; } this.curChangeId = change.cid; const inputs = $('input[type!=checkbox][type!=radio]', this.obj); for (const i of inputs) { const field = $(i).attr('name'); const text = (field && change[field]) ? change[field] : ''; $(i).val(text); } const textareas = $('textarea', this.obj); for (const ta of textareas) { const field = $(ta).attr('name'); const text = (field && change[field]) ? change[field].replace(/

/g, '\r\n') : ''; ta.textContent = text; } const html = []; for (const a of change.attachments) { html.push(''); html.push('', '', a.filename + a.fileext, '', ''); html.push('', a.u_name, ''); html.push(''); } // 变更类型 if (change.type) { const cType = change.type.split(','); $('input[name="type"]').prop("checked", false); for (const c of cType) { $('input[name="type"][value='+ c +']').prop("checked", true); } } // 变更类别 $('select[name=class]').val(change.class); // 变更性质 $('select[name=quality]').val(change.quality); // 变更单位 $('select[name=company]').html(''); // 费用承担方 $('input[name=charge][value=' + change.charge + ']').prop('checked', true); // 附件 $('#attachment').html(html.join('')); } else { const inputs = $('input', this.obj); for (const i of inputs) { $(i).val(''); } const textareas = $('textarea', this.obj); for (const ta of textareas) { ta.innerText = ''; } $('#attachment').html(''); } } _viewChanges() { const sheet = this.spread.getActiveSheet(); if (this.changes) { sheet.setSelection(0, 0, 1, 1); this._filterChange(!$('#filterEmpty')[0].checked, $('#matchPos')[0].checked); this._loadChangeDetail(this.changes[0]); } else { toastr.error('查询变更令有误,请刷新页面后重试'); } } _filterChange(filterEmpty, matchPosName) { this.displayChanges = []; for (const c of this.changes) { const filterVisible = filterEmpty ? (c.vamount ? !checkZero(c.vamount) : false) : true; const matchVisible = matchPosName && this.callData.pos ? (c.gcl_id === this.callData.bills.id && c.b_bwmx === this.callData.pos.name) : true; if ((filterVisible && matchVisible) || (c.org_uamount)) { this.displayChanges.push(c); } } SpreadJsObj.loadSheetData(this.spread.getActiveSheet(), SpreadJsObj.DataType.Data, this.displayChanges); } loadChanges(data) { this.callData = data; if (this.callData.pos) { $('#matchPos').parent().show(); } else { $('#matchPos').parent().hide(); } const self = this; $('#b-code-hint').text('当前变更清单:' + data.bills.b_code); postData(window.location.pathname + '/valid-change', data, function (result) { self.changes = result.changes; self.useChanges = result.useChanges; self._calculateAmount(); self._viewChanges(); self.obj.modal('show'); }); } } const changesObj = new Changes($('#use-bg')); // 初始化 台账 spread const slSpread = SpreadJsObj.createNewSpread($('#stage-ledger')[0]); customizeStageTreeSetting(ledgerSpreadSetting, customColDisplay()); // 数量变更列,添加按钮 const qcCol = _.find(ledgerSpreadSetting.cols, {field: 'qc_qty'}); qcCol.readOnly = true; qcCol.cellType = 'activeImageBtn'; qcCol.normalImg = '#ellipsis-icon'; qcCol.indent = 5; qcCol.showImage = function (data) { if (!data || (data.children && data.children.length > 0) || !(data.b_code && data.b_code !== '')) { return false; } else { const nodePos = stagePos.getLedgerPos(data.id); return !(nodePos && nodePos.length > 0); } }; const ratioCol = ledgerSpreadSetting.cols.find(x => {return x.field === 'end_gather_percent' || x.field === 'end_correct_percent'}); ratioCol.field = tenderInfo.display.stage.correct ? 'end_correct_percent' : 'end_gather_percent'; ledgerSpreadSetting.imageClick = function (data, hitinfo) { const col = hitinfo.sheet.zh_setting.cols[hitinfo.col]; switch (col.field) { case 'dagl': data.dagl_url && window.open(data.dagl_url); break; case 'gxby': data.gxby_url && window.open(data.gxby_url); break; case 'qc_qty': if (data.children && data.children.length > 0 || data.lock) return; const nodePos = stagePos.getLedgerPos(data.id); if (nodePos && nodePos.length > 0) return; changesObj.loadChanges({bills: data}); break; default: return; } }; ledgerSpreadSetting.dgnUpFields = ['deal_dgn_qty1', 'deal_dgn_qty2', 'c_dgn_qty1', 'c_dgn_qty2']; ledgerSpreadSetting.getColor = function (sheet, data, row, col, defaultColor) { if (data) { if (col.field === 'gxby') { const def = thirdParty.gxby.find(function (x) { return x.value === data.gxby_status; }); if (def && def.color) return def.color; } else if (col.field === 'dagl') { const def = thirdParty.dagl.find(function (x) { return x.value === data.dagl_status; }); if (def && def.color) return def.color; } return hintOver && checkUtils.billsOver(data, checkTzMeasureType(), stagePos) ? '#f8d7da' : defaultColor; } else { return defaultColor; } }; sjsSettingObj.setFxTreeStyle(ledgerSpreadSetting, sjsSettingObj.FxTreeStyle.jz); sjsSettingObj.set3FCols(ledgerSpreadSetting.cols, [ {field: 'gxby', getValue: getGxbyText, url_field: 'gxby_url'}, {field: 'dagl', getValue: getDaglText, url_field: 'dagl_url'}, ]); if (thousandth) sjsSettingObj.setTpThousandthFormat(ledgerSpreadSetting); ledgerSpreadSetting.headColWidth = [50]; ledgerSpreadSetting.rowHeader = [ { rowHeaderType: 'tag', setting: { indent: 14, tagSize: 0.8, tagFont: '8px 微软雅黑', getColor: function (index, data) { if (!data) return; return billsTag.getBillsTagsColor(data.id); }, getTagHtml: function (index, data) { if (!data) return; const getHtml = function (list) { if (!list || list.length === 0) return ''; const html = []; for (const l of list) { html.push('
'); html.push(`
`, '', '
'); html.push('
', '

', l.comment, '

', '
'); html.push('
'); } return html.join(''); }; return getHtml(billsTag.getBillsTagsInfo(data.id)); } }, }, ]; ledgerSpreadSetting.readOnly = function (data) { if (!data) return false; return data.lock || false; }; SpreadJsObj.initSheet(slSpread.getActiveSheet(), ledgerSpreadSetting); slSpread.getActiveSheet().frozenColumnCount(5); slSpread.getActiveSheet().options.frozenlineColor = '#93b5e4'; //初始化所有附件列表 getAllList(); // 初始化 计量单元 Spread const spSpread = SpreadJsObj.createNewSpread($('#stage-pos')[0]); const spCol = _.find(posSpreadSetting.cols, {field: 'qc_qty'}); spCol.readOnly = true; spCol.cellType = 'activeImageBtn'; spCol.normalImg = '#ellipsis-icon'; spCol.indent = 5; spCol.showImage = function (data) { return data !== undefined && data !== null; }; posSpreadSetting.imageClick = function (data, hitinfo) { const col = hitinfo.sheet.zh_setting.cols[hitinfo.col]; switch (col.field) { case 'gxby': data.gxby_url && window.open(data.gxby_url); break; case 'dagl': data.dagl_url && window.open(data.dagl_url); break; case 'qc_qty': const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); if (node.lock) return; changesObj.loadChanges({bills: node, pos: data}); break; default: return; } }; posSpreadSetting.getColor = function (sheet, data, row, col, defaultColor) { if (data) { if (col.field === 'gxby') { const def = thirdParty.gxby.find(function (x) { return x.value === data.gxby_status; }); if (def && def.color) return def.color; } else if (col.field === 'dagl') { const def = thirdParty.dagl.find(function (x) { return x.value === data.dagl_status; }); if (def && def.color) return def.color; } } if (checkTzMeasureType()) { return hintOver && checkUtils.posOver(data) ? '#f8d7da' : defaultColor; } }; sjsSettingObj.setGridSelectStyle(posSpreadSetting); if (thousandth) sjsSettingObj.setTpThousandthFormat(posSpreadSetting); sjsSettingObj.set3FCols(posSpreadSetting.cols, [ {field: 'gxby', getValue: getGxbyText, url_field: 'gxby_url'}, {field: 'dagl', getValue: getDaglText, url_field: 'dagl_url'}, ]); SpreadJsObj.initSheet(spSpread.getActiveSheet(), posSpreadSetting); const billsTag = $.billsTag({ selector: '#bills-tag', relaSpread: slSpread, updateUrl: window.location.pathname + '/tag', afterModify: function (nodes) { SpreadJsObj.repaintNodesRowHeader(slSpread.getActiveSheet(), nodes); }, afterLocated: function () { stagePosSpreadObj.loadCurPosData(); }, afterShow: function () { slSpread.refresh(); if (spSpread) spSpread.refresh(); }, }); const errorList = $.cs_errorList({ tabSelector: '#error-list-tab', selector: '#error-list', relaSpread: slSpread, storeKey: 'stage-error-' + stage.id, afterLocated: function () { stagePosSpreadObj.loadCurPosData(); }, afterShow: function () { slSpread.refresh(); if (spSpread) spSpread.refresh(); }, }); const checkList = $.ledger_checkList({ id: 'check-list', tabSelector: '#check-list-tab', selector: '#check-list', relaSpread: slSpread, storeKey: 'stage-check-' + window.location.pathname.split('/')[2] + '-' + window.location.pathname.split('/')[4], checkType: getCheckType(checkOption), afterLocated: function () { stagePosSpreadObj.loadCurPosData(); }, afterShow: function () { slSpread.refresh(); if (spSpread) spSpread.refresh(); }, }); const sumLoadMiss = $.sumLoadMiss({ tabSelector: '#sum-load-miss-tab', selector: '#sum-load-miss', relaSpread: slSpread, storeKey: 'stage-slm-' + stage.id, id: 'stage-slm', afterLocated: function () { stagePosSpreadObj.loadCurPosData(); }, afterShow: function () { slSpread.refresh(); if (spSpread) spSpread.refresh(); }, }); const stageTreeSpreadObj = { cut: function (sheet, sel, callback) { callback(true); }, 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); $('#bills-expr').removeAttr('data-row'); return; } const nodePos = stagePos.getLedgerPos(data.id); if (nodePos && nodePos.length > 0) { $('#bills-expr').val('').attr('readOnly', true); } else { const exprInfo = getExprInfo(col.field); const value = exprInfo && data[exprInfo.expr] ? data[exprInfo.expr] : data[col.field]; $('#bills-expr').val(value).attr('field', col.field).attr('org', data[col.field]); if (col.field.indexOf('tp') >= 0) { $('#bills-expr').attr('readOnly', readOnly || cell.locked() || data.is_tp !== 1); } else { $('#bills-expr').attr('readOnly', readOnly || cell.locked() || data.is_tp === 1) } } $('#bills-expr').attr('data-row', sel.row); } else { $('#bills-expr').val('').attr('readOnly', true); $('#bills-expr').removeAttr('data-row'); } }, refreshTreeNodes: function (sheet, nodes) { const tree = sheet.zh_tree; if (!tree) { return } const rows = []; for (const node of nodes) { rows.push(tree.nodes.indexOf(node)); } SpreadJsObj.reLoadRowsData(sheet, rows); }, editEnded: function (e, info) { if (info.sheet.zh_setting) { const col = info.sheet.zh_setting.cols[info.col]; const sortData = info.sheet.zh_dataType === 'tree' ? info.sheet.zh_tree.nodes : info.sheet.zh_data; const node = sortData[info.row], updateData = {}; const orgValue = node[col.field]; let newValue = trimInvalidChar(info.editingText); if (orgValue == newValue || ((!orgValue || orgValue === '') && (!newValue || newValue === ''))) { return; } if (col.type === 'Number' && newValue && newValue !== '') { const num = _.toNumber(newValue); if (_.isFinite(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 (['postil', 'memo', 'ex_memo1', 'ex_memo2', 'ex_memo3'].indexOf(col.field) === -1) { if (node.children && node.children.length > 0) { toastr.error('清单父项不可计量'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } else { const nodePos = stagePos.getLedgerPos(node.id); if (nodePos && nodePos.length > 0) { toastr.error('该清单有计量单元,请在计量单元处计量'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } } } if (['memo', 'ex_memo1', 'ex_memo2', 'ex_memo3'].indexOf(col.field) >= 0) { updateData.main = { id: node.id }; updateData.main[col.field] = newValue; } else if (col.field.indexOf('_dgn_') > 0) { updateData.dgn = { id: node.id }; updateData.dgn[col.field] = newValue; } else if (col.field !== 'is_tp') { updateData.stage = { lid: node.id }; updateData.stage[col.field] = newValue; const exprInfo = getExprInfo(col.field); if (exprInfo) { updateData.stage[exprInfo.expr] = info.editingText !== newValue+ '' ? trimInvalidChar(info.editingText) : ''; } } postData(window.location.href + '/update', {bills: updateData}, function (data) { // tag update const nodes = stageTree.loadPostStageData(data); stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes); if (detail) { detail.loadStageLedgerUpdateData(data, nodes); } else { stageIm.loadUpdateLedgerData(data, nodes); } }, function () { SpreadJsObj.reLoadRowData(info.sheet, info.row); }); } }, loadRelaData: function () { const billsSheet = spSpread.getActiveSheet(); SpreadJsObj.resetTopAndSelect(billsSheet); stagePosSpreadObj.loadCurPosData(); if (posSearch) posSearch.search(); SpreadJsObj.saveTopAndSelect(billsSheet, ckBillsSpread); }, selectionChanged: function (e, info) { if (!info.oldSelections || !info.oldSelections[0] || info.newSelections[0].row !== info.oldSelections[0].row) { stageTreeSpreadObj.loadRelaData(); // 全选去除 $('#dqjiedian').find('.check-all-file').prop('checked', false); } stageTreeSpreadObj.loadExprToInput(info.sheet); }, deletePress(sheet) { if (sheet.zh_setting && sheet.zh_dataType === 'tree') { const tree = sheet.zh_tree; if (!tree) { return; } const sel = sheet.getSelections()[0]; const validCols = []; for (let iCol = sel.col; iCol < sel.col + sel.colCount; iCol++) { const colSetting = sheet.zh_setting.cols[iCol]; if (!colSetting.readOnly && colSetting.field !== 'qc_qty') { validCols.push(iCol); } } if (validCols.length === 0) { return; } const sortData = sheet.zh_tree.nodes; const datas = [], dgnDatas = [], mainDatas = []; for (let iRow = sel.row; iRow < sel.row + sel.rowCount; iRow++) { const node = sortData[iRow]; if (node && !node.lock) { 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) { if (node.b_code && node.b_code !== '') continue; } else if (['postil', 'memo', 'ex_memo1', 'ex_memo2', 'ex_memo3'].indexOf(colSetting.field) < 0) { if (colSetting.field === 'contract_qty') { if (node.is_tp) continue; } else if (colSetting.field === 'contract_tp') { if (!node.is_tp) continue; } if (node.children && node.children.length > 0) { continue; } const nodePos = stagePos.getLedgerPos(node.id); if (nodePos && nodePos.length > 0) { continue; } } if (sheet.zh_setting.dgnUpFields.indexOf(colSetting.field) !== -1) { if (node[colSetting.field] && node[colSetting.field] !== 0) { dgnData[colSetting.field] = 0; filterDgn = false; } } else if (['memo', 'ex_memo1', 'ex_memo2', 'ex_memo3'].indexOf(colSetting.field) >= 0) { mainData[colSetting.field] = null; filterMain = false; } else { data[colSetting.field] = null; const exprInfo = getExprInfo(colSetting.field); if (exprInfo) { data[exprInfo.expr] = ''; } filter = false; } } if (!filter) datas.push(data); if (!filterDgn) dgnDatas.push(dgnData); if (!filterMain) mainDatas.push(mainData); } } 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); if (detail) { detail.loadStageLedgerUpdateData(result, nodes); } else { stageIm.loadUpdateLedgerData(result, nodes); } stageTreeSpreadObj.loadExprToInput(sheet); }); } } }, clipboardPasting(e, info) { if (info.sheet.zh_setting) { const setting = info.sheet.zh_setting; const range = info.cellRange; const validField = ['contract_qty', 'contract_tp', 'qc_qty', 'postil'].concat(['memo', 'ex_memo1', 'ex_memo2', 'ex_memo3'], setting.dgnUpFields); for (let iCol = range.col; iCol < range.col + range.colCount; iCol++) { const col = info.sheet.zh_setting.cols[iCol]; if ((validField.indexOf(col.field) === -1)) { toastr.error('不可修改此数据'); info.cancel = true; return; } } } }, clipboardPasted(e, info) { const pasteHint = getHintMsg(); if (info.sheet.zh_setting && info.sheet.zh_tree) { const sheet = info.sheet, setting = info.sheet.zh_setting; const filterNodes = [], datas = [], dgnDatas = [], mainDatas = []; 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}, 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]; if (col.field === 'contract_tp') { if (!node.is_tp) continue; } else if (col.field === 'contract_qty') { if (node.is_tp) continue; } if (setting.dgnUpFields.indexOf(col.field) !== -1) { if (node.b_code && node.b_code !== '') continue; } else if (['postil', 'memo', 'ex_memo1', 'ex_memo2', 'ex_memo3'].indexOf(col.field) === -1) { if (node.children && node.children.length > 0) continue; const nodePos = stagePos.getLedgerPos(node.id); if (nodePos && nodePos.length > 0) continue; } const text = trimInvalidChar(sheet.getText(curRow, curCol)); if (setting.dgnUpFields.indexOf(col.field) !== -1) { 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) { toastMessageUniq(pasteHint.invalidExpr); } } } else if (['memo', 'ex_memo1', 'ex_memo2', 'ex_memo3'].indexOf(col.field) >= 0) { mainData[col.field] = text; filterMain = false; } else { if (col.type === 'Number') { const exprInfo = getExprInfo(col.field); if (text) { const num = _.toNumber(text); data[col.field] = num; if (exprInfo) data[exprInfo.expr] = ''; if (_.isFinite(num)) { filter = false; } else { try { data[col.field] = math.evaluate(transExpr(text)); if (exprInfo) data[exprInfo.expr] = text; filter = false; } catch(err) { toastMessageUniq(pasteHint.invalidExpr); } } } else { data[col.field] = null; if (exprInfo) data[exprInfo.expr] = ''; filter = false; } } else { data[col.field] = text; } } } 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 || 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)); if (detail) { detail.loadStageLedgerUpdateData(data, nodes); } else { stageIm.loadUpdateLedgerData(data, nodes); } stageTreeSpreadObj.loadExprToInput(sheet); }, function () { // todo //stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), filterNodes); }); } else { stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), filterNodes); } } }, measureAllPosInNode(node, ratio = 1) { const posterity = stageTree.getPosterity(node); const data = {updateType: 'update', updateData: []}; for (const p of posterity) { if (p.children && p.children.length > 0) continue; const posRange = stagePos.getLedgerPos(p.id); if (posRange && posRange.length > 0) { for (const pr of posRange) { if (pr.contract_qty && !checkZero(pr.contract_qty)) continue; const validValue = ZhCalc.sub(pr.quantity, pr.end_contract_qty); if (validValue <= 0) continue; const value = ratio !== 1 ? ZhCalc.mul(pr.quantity, ratio) : pr.quantity; const pData = { pid: pr.id, lid: pr.lid, contract_qty: validValue > 0 ? (value > validValue ? validValue : value) : (value < validValue ? validValue : value), }; data.updateData.push(pData); } } if (data.updateData.length > 1000 || _.map(data.updateData, 'lid').length > 500) { toastr.warning('选中的数据过多,仅计量' + data.updateData.length + '条,请稍后'); break; } } if (data.updateData.length === 0) { toastr.info('其下全部计量单元均已计量'); return; } postData(window.location.pathname + '/update', {pos: data}, function (result) { if (result.pos) { stagePos.updateDatas(result.pos.pos); stagePos.loadCurStageData(result.pos.curStageData); } const nodes = stageTree.loadPostStageData(result.ledger); stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes); stagePosSpreadObj.loadCurPosData(); if (detail) { detail.loadStagePosUpdateData(result, nodes); } else { stageIm.loadUpdatePosData(result, nodes); } toastr.success('已计量' + data.updateData.length + '条'); }, function () { stagePosSpreadObj.loadCurPosData(); }); }, topRowChanged(e, info) { SpreadJsObj.saveTopAndSelect(info.sheet, ckBillsSpread); }, editStarting(e, info) { if (!info.sheet.zh_setting || !info.sheet.zh_tree) return; const col = info.sheet.zh_setting.cols[info.col]; const node = info.sheet.zh_tree.nodes[info.row]; const exprInfo = getExprInfo(col.field); if (exprInfo) { if (node[exprInfo.expr] && node[exprInfo.expr] !== '') { info.sheet.getCell(info.row, info.col).text(node[exprInfo.expr]); } } switch (col.field) { case 'contract_qty': case 'qc_qty': info.cancel = node.is_tp; break; case 'contract_tp': info.cancel = !node.is_tp; break; case 'is_tp': info.cancel = true; break; } }, buttonClicked: function (e, info) { if (info.sheet.zh_setting) { const node = SpreadJsObj.getSelectObject(info.sheet); const col = info.sheet.zh_setting.cols[info.col]; const posRange = stagePos.getLedgerPos(node.id); if (node.pre_used === 1 || (node.children && node.children.length > 0) || (node.unit !== '总额' && node.unit !== '元') || (posRange && posRange.length > 0) /*|| !checkZero(node.qc_qty)*/) { SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } const postIsTp = function () { const data = { calcType: {id: node.id} }; data.calcType.is_tp = info.sheet.getValue(info.row, info.col) || false; // 更新至服务器 postData(window.location.pathname + '/update', {bills: data}, function (result) { const nodes = stageTree.loadPostStageData(result); stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes); if (detail) { detail.loadStageLedgerUpdateData(result, nodes); } else { stageIm.loadUpdateLedgerData(result, nodes); } }); }; if (col.field === 'is_tp') { if (info.sheet.isEditing()) { info.sheet.endEdit(true); } if (!checkZero(node.contract_qty) || !checkZero(node.contract_tp)) { $.msgBox({ id: 'calc-type', title: '提示', message: '切换计量模式,已计量数据会被清空。', ok: { caption: '确定', callback: postIsTp, }, cancel: { caption: '取消', callback: function () { SpreadJsObj.reLoadRowData(info.sheet, info.row); } } }); } else { postIsTp(); } } } }, measureByBatch: function (posNames, ratio, apply2sibling) { if (posNames.length <= 0) return; if (ratio <= 0) return; const fRatio = ZhCalc.div(ratio, 100); const sheet = slSpread.getActiveSheet(); const node = SpreadJsObj.getSelectObject(sheet); const parent = stageTree.getParent(node); const nodes = apply2sibling === true ? (parent ? parent.children : stageTree.children) : [node]; const data = {updateType: 'batchUpdate', updateData: []}; for (const node of nodes) { const posRange = stagePos.getLedgerPos(node.id); if (!posRange || posRange <= 0) continue; for (const p of posRange) { if (posNames.indexOf(p.name) < 0) continue; data.updateData.push({ pid: p.id, lid: p.lid, contract_qty: ZhCalc.mul(p.quantity, fRatio), contract_expr: `${p.quantity}*${ratio}%`, }); } } postData(window.location.pathname + '/update', {pos: data}, function (result) { if (result.pos) { stagePos.updateDatas(result.pos.pos); stagePos.loadCurStageData(result.pos.curStageData); } const nodes = stageTree.loadPostStageData(result.ledger); stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes); stagePosSpreadObj.loadCurPosData(); if (detail) { detail.loadStagePosUpdateData(result, nodes); } else { stageIm.loadUpdatePosData(result, nodes); } $('#calc-by-ratio').modal('hide'); }, function () { stagePosSpreadObj.loadCurPosData(); $('#calc-by-ratio').modal('hide'); }); }, exportExcel: function (filename, nodes) { const exportNodesData = function (data, nodes) { for (const node of nodes) { data.push({ code: node.code, b_code: node.b_code, name: node.name, unit: node.unit, unit_price: node.unit_price, quantity: node.quantity, total_price: node.total_price, contract_qty: node.contract_qty, contract_tp: node.contract_tp, qc_qty: node.qc_qty, qc_tp: node.qc_tp, gather_qty: node.gather_qty, gather_tp: node.gather_tp, end_contract_qty: node.end_contract_qty, end_contract_tp: node.end_contract_tp, end_qc_qty: node.end_qc_qty, end_qc_tp: node.end_qc_tp, end_gather_qty: node.end_gather_qty, end_gather_tp: node.end_gather_tp, end_gather_percent: node.end_gather_percent, deal_dgn_qty1: node.deal_dgn_qty1, deal_dgn_qty2: node.deal_dgn_qty2, c_dgn_qty1: node.c_dgn_qty1, c_dgn_qty2: node.c_dgn_qty2, final_dgn_price: node.final_dgn_price, postil: node.postil, drawing_code: node.drawing_code, memo: node.memo, }); if (node.children && node.children.length > 0) { exportNodesData(data, node.children); } else { const posRange = stagePos.getLedgerPos(node.id); if (posRange && posRange.length > 0) { for (const [i, p] of posRange.entries()) { data.push({ pos_code: (i + 1) + '', name: p.name, quantity: p.quantity, contract_qty: p.contract_qty, qc_qty: p.qc_qty, gather_qty: p.gather_qty, end_contract_qty: p.end_contract_qty, end_qc_qty: p.end_qc_qty, end_gather_qty: p.end_gather_qty, drawing_code: p.drawing_code, memo: p.memo, postil: p.postil, }); } } } } }; const data = []; exportNodesData(data, nodes ? nodes : stageTree.children); SpreadExcelObj.exportSimpleXlsxSheet(exportExcelSetting, data, filename); } }; slSpread.bind(spreadNS.Events.EditEnded, stageTreeSpreadObj.editEnded); slSpread.bind(spreadNS.Events.SelectionChanged, stageTreeSpreadObj.selectionChanged); slSpread.bind(spreadNS.Events.ClipboardPasting, stageTreeSpreadObj.clipboardPasting); slSpread.bind(spreadNS.Events.ClipboardPasted, stageTreeSpreadObj.clipboardPasted); slSpread.bind(spreadNS.Events.TopRowChanged, stageTreeSpreadObj.topRowChanged); slSpread.bind(spreadNS.Events.EditStarting, stageTreeSpreadObj.editStarting); slSpread.bind(spreadNS.Events.ButtonClicked, stageTreeSpreadObj.buttonClicked); SpreadJsObj.addCutEvents(slSpread, stageTreeSpreadObj.cut); SpreadJsObj.addDeleteBind(slSpread, stageTreeSpreadObj.deletePress); if (!readOnly) { $('#bills-expr').bind('change onblur', function () { if (this.readOnly) return; const expr = $(this); const row = expr.attr('data-row') ? _.toInteger(expr.attr('data-row')) : -1; const select = stageTree.getItemsByIndex(row); if (!select) return; const field = expr.attr('field'), orgValue = expr.attr('org'), updateData = {}; let newValue = expr.val(); const num = _.toNumber(newValue); if (_.isFinite(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; const exprInfo = getExprInfo(field); if (exprInfo) { updateData.stage[exprInfo.expr] = expr.val(); } } // 更新至服务器 postData(window.location.pathname + '/update', {bills: updateData}, function (result) { const nodes = stageTree.loadPostStageData(result); stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes); if (detail) { detail.loadStageLedgerUpdateData(result, nodes); } else { stageIm.loadUpdateLedgerData(result, nodes); } }); }); } stageTreeSpreadObj.loadExprToInput(slSpread.getActiveSheet()); const addTag = newTag({ledgerSheet: slSpread.getActiveSheet(), billsTag}); const tenderSelect = TenderSelect({ type: 'stage', afterLoad: function (result) { const nodes = stageTree.loadPostStageData(result); stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes); if (detail) { detail.loadStageLedgerUpdateData(result, nodes); } else { stageIm.loadUpdateLedgerData(result, nodes); } if (result.sumLoadHis.errors.length > 0) { sumLoadMiss.loadMissData(result.sumLoadHis.errors); sumLoadMiss.show(); } else { sumLoadMiss.clearMissData(); } } }); $.contextMenu({ selector: '#stage-ledger', build: function ($trigger, e) { const target = SpreadJsObj.safeRightClickSelection($trigger, e, slSpread); stageTreeSpreadObj.loadRelaData(); return target.hitTestType === spreadNS.SheetArea.viewport || target.hitTestType === spreadNS.SheetArea.rowHeader; }, items: { 'locateZjjl': { name: '定位至中间计量', icon: 'fa-sign-in', callback: function (key, opt) { if (!detail) { detail = new Detail($('#detail-spread')); } const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); const [leafUsedBills, usedPos] = stageIm.getFirstUsed(node); if (leafUsedBills) { if (!$('#zhongjian').hasClass('active')) { const tab = $('#zhongjiantab'), tabPanel = $(tab.attr('content')); $('a', '.side-menu').removeClass('active'); $('.tab-content .tab-select-show').removeClass('active'); tab.addClass('active'); tabPanel.addClass('active'); showSideTools(tab.hasClass('active')); slSpread.refresh(); spSpread.refresh(); } const relaXmj = stageIm.getRelaXmj(leafUsedBills); const im = stageIm.getRelaImData(relaXmj, leafUsedBills, usedPos); SpreadJsObj.locateData(detail.sheet, im); detail.spread.refresh(); $('#zhongjian .sjs-bottom').height('400px'); $('.zhongjian-msg').height($('#zhongjian .sjs-bottom').height()); detail.reLoadDetailData(); } else { toastr.error('无可定位中间计量'); } }, disabled: function (key, opt) { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); return !node; } }, tagSpr: '----', tag: { name: '书签', callback: function (key, opt, menu, e) { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); addTag.do(node); }, disabled: function (key, opt) { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); return !node; } }, showSpr: '----', showLast: { name: '显示至最底层', callback: function (key, opt, menu, e) { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); setTimeout(() => { showWaitingView(); stageTree.expandByCustom(x => { return x.expanded || (x.id === node.id) || (x.full_path.indexOf(node.ledger_id + '-') >= 0); }); SpreadJsObj.refreshTreeRowVisible(slSpread.getActiveSheet()); closeWaitingView(); }, 100); }, disabled: function (key, opt) { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); return !node; } }, exportSpr: '----', exportSelectNodeXlsx: { name: '导出选中节点至Excel', callback: function (key, opt, menu, e) { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); stageTreeSpreadObj.exportExcel($('.sidebar-title').attr('data-original-title') + `计量台账(${node.name || ''}).xlsx`, [node]); }, disabled: function (key, opt) { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); return !node; } }, importSpr: '---', importStageGcl: { name: '导入(其他标段)工程量清单计量数据', icon: 'fa-link', disabled: function (key, opt) { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); return readOnly || !node || !stageTree.isLeafXmj(node); }, callback: function (key, opt) { tenderSelect.showSelect(SpreadJsObj.getSelectObject(slSpread.getActiveSheet())); } }, shoufangdanSpr: '---', shoufangdan: { name: '生成收方单', visible: function(key, opt) { if (cur_uid === stage.user_id) return true; }, disabled: function (key, opt) { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); if (!node || !node.b_code || !node.is_leaf || cur_uid !== stage.user_id) return true; }, callback: function (key, opt) { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); $('#shoufang-lid').val(node.id); $('#shoufang-pid').val(''); $('#shoufang-ledger').text('清单:' + node.b_code); $('#shoufang-pos').text('').hide(); $('#addshoufang').modal('show'); } } } }); const stagePosSpreadObj = { loadExprToInput(sheet) { const sel = sheet.getSelections()[0]; if (!sel) return; const col = sheet.zh_setting.cols[sel.col], cell = sheet.getCell(sel.row, sel.col); if (col && col.type === 'Number') { const data = SpreadJsObj.getSelectObject(sheet); if (data) { const exprInfo = getExprInfo(col.field); const value = exprInfo && data[exprInfo.expr] ? data[exprInfo.expr] : data[col.field]; $('#pos-expr').val(value).attr('field', col.field).attr('org', data[col.field]) .attr('readOnly', readOnly || cell.locked()); $('#pos-expr').attr('data-row', sel.row); } else { $('#pos-expr').val('').attr('readOnly', true); $('#pos-expr').removeAttr('data-row'); } } else { $('#pos-expr').val('').attr('readOnly', true); $('#pos-expr').removeAttr('data-row'); } }, /** * 加载计量单元 根据当前台账选择节点 */ loadCurPosData: function () { const sheet = slSpread.getActiveSheet(); const node = SpreadJsObj.getSelectObject(sheet); if (node) { const posReadOnly = node.lock || (node.children && node.children.length > 0) || !node.b_code; spSpread.getActiveSheet().zh_setting.readOnly = posReadOnly; const posData = stagePos.ledgerPos[itemsPre + node.id] || []; SpreadJsObj.loadSheetData(spSpread.getActiveSheet(), 'data', posData, posReadOnly); getNodeList(node.id); } else { spSpread.getActiveSheet().zh_setting.readOnly = true; SpreadJsObj.loadSheetData(spSpread.getActiveSheet(), 'data', [], true); } stagePosSpreadObj.loadExprToInput(spSpread.getActiveSheet()); }, editEnded: function (e, info) { if (info.sheet.zh_setting) { // 未改变过,则直接跳过 const sortData = info.sheet.zh_data; const posData = sortData ? sortData[info.row] : null; const col = info.sheet.zh_setting.cols[info.col]; const orgText = posData ? posData[col.field] : null; const newText = trimInvalidChar(info.editingText); if (orgText === info.editingText || ((!orgText || orgText === '') && (newText === ''))) { return; } // 台账模式下,不可新增 if (checkTzMeasureType() && !posData) { toastr.error('台账模式不可新增计量单元数据'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return ; } // 不同节点下,计量单元检查输入 //const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); const node = stagePosSpreadObj.stageTreeNode; if (!node) { toastr.warning('数据错误, 请刷新页面后再试'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } else if (newText !== '' && node.children && node.children.length > 0) { toastr.error('父节点不可插入计量单元'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } else if (newText !== '' && !node.b_code || node.b_code === '') { toastr.error('项目节不可插入计量单元'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } // 生成提交数据 const data = {}; if (col.field === 'name') { if ((!newText || newText === '') && posData) { toastr.error('部位名称不可为空'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } else if (!posData) { if (newText !== '') { data.updateType = 'add'; if ((node.pre_used === 1 || !checkZero(node.gather_qty) || !checkZero(node.gather_tp)) && sortData.length === 0) { toastr.error('无计量单元的清单,计量后,不可新增计量单元'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } const order = (!sortData || sortData.length === 0) ? 1 : Math.max(sortData[sortData.length - 1].porder + 1, sortData.length + 1); data.updateData = {name: newText, lid: node.id, tid: tender.id, porder: order}; } else { SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } } else { data.updateType = 'update'; data.updateData = {pid: posData.id, lid: posData.lid, name: newText}; } } else if (!posData) { toastr.warning('新增计量单元请先输入名称'); } else if (['ex_memo1', 'ex_memo2', 'ex_memo3'].indexOf(col.field) >= 0) { data.updateType = 'update'; data.updateData = {pid: posData.id, lid: posData.lid}; data.updateData[col.field] = newText; } else { data.updateType = 'update'; data.updateData = {pid: posData.id, lid: posData.lid}; if (col.type === 'Number') { const exprInfo = getExprInfo(col.field); const num = _.toNumber(newText); if (_.isFinite(num)) { data.updateData[col.field] = num; if (exprInfo) { data.updateData[exprInfo.expr] = ''; } } else { try { data.updateData[col.field] = math.evaluate(transExpr(newText)); if (exprInfo) { data.updateData[exprInfo.expr] = newText; } } catch(err) { toastr.error('输入的表达式非法'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } } } else { data.updateData[col.field] = newText; } } // 提交数据到服务器 postData(window.location.pathname + '/update', {pos: data}, function (result) { if (result.pos) { stagePos.updateDatas(result.pos.pos); stagePos.loadCurStageData(result.pos.curStageData); } const refreshData = stageTree.loadPostStageData(result.ledger); stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), refreshData); stagePosSpreadObj.loadCurPosData(); if (detail) { detail.loadStagePosUpdateData(result, refreshData); } else { stageIm.loadUpdatePosData(result, refreshData); } }, function () { stagePosSpreadObj.loadCurPosData(); }); } }, editStarting: function (e, info) { stagePosSpreadObj.stageTreeNode = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); const sel = info.sheet.getSelections(); if (!sel || !sel[0]) return; const col = info.sheet.zh_setting.cols[sel[0].col]; const node = SpreadJsObj.getSelectObject(info.sheet); const exprInfo = getExprInfo(col.field); if (exprInfo && node) { if (node[exprInfo.expr] && node[exprInfo.expr] !== '') { info.sheet.getCell(info.row, info.col).text(node[exprInfo.expr]); } } }, clipboardPasting: function (e, info) { if (info.sheet.zh_setting) { const sortData = info.sheet.zh_data; const range = info.cellRange; const validField = ['contract_qty', 'qc_qty', 'postil', 'real_qty', 'ex_memo1', 'ex_memo2', 'ex_memo3']; if (!checkTzMeasureType()) { validField.push('name', 'sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'position', 'drawing_code'); } for (let iCol = range.col; iCol < range.col + range.colCount; iCol++) { const col = info.sheet.zh_setting.cols[iCol]; if (validField.indexOf(col.field) === -1) { if (checkTzMeasureType()) { toastr.error('不可修改此数据'); info.cancel = true; return; } else { for (let iRow = range.row; iRow < range.row + range.rowCount; iRow) { const pos = sortData(iRow); if (pos.add_stage !== stage.id || pos.add_times !== stage.times) { toastr.error('不可修改此数据'); info.cancel = true; return; } } } } } } }, clipboardPasted: function (e, info) { if (info.sheet.zh_setting) { if (info.sheet.getColumnCount() > info.sheet.zh_setting.cols.length) { info.sheet.setColumnCount(info.sheet.zh_setting.cols.length); } const data = { updateType: '', updateData: [], }; const sortData = info.sheet.zh_data; const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); if (node.children && node.children.length > 0) return; if (sortData && (info.cellRange.row >= sortData.length)) { data.updateType = 'add'; if (info.cellRange.col !== 0) { toastr.warning('新增计量单元请先输入名称'); stagePosSpreadObj.loadCurPosData(); return; } if ((node.pre_used === 1 || !checkZero(node.gather_qty) || !checkZero(node.gather_tp)) && sortData.length === 0) { toastr.error('无计量单元的清单,计量后,不可新增计量单元'); stagePosSpreadObj.loadCurPosData(); return; } const lastOrder = sortData.length > 0 ? sortData[sortData.length - 1].porder + 1 : 1; for (let iRow = 0; iRow < info.cellRange.rowCount; iRow++) { const curRow = info.cellRange.row + iRow; const newData = {lid: node.id, porder: lastOrder + curRow - sortData.length}; for (let iCol = 0; iCol < info.cellRange.colCount; iCol++) { const curCol = info.cellRange.col + iCol; const colSetting = info.sheet.zh_setting.cols[curCol]; if (!colSetting) continue; const newValue = trimInvalidChar(info.sheet.getText(curRow, curCol)); if (colSetting.type === 'Number') { const exprInfo = getExprInfo(colSetting.field); if (newValue) { const num = _.toNumber(newValue); if (num) { newData[colSetting.field] = num; if (exprInfo) { newData[exprInfo.expr] = ''; } } else { try { newData[colSetting.field] = math.evaluate(transExpr(newValue)); if (exprInfo) { newData[exprInfo.expr] = newValue; } } catch(err) { toastr.error('输入的表达式非法'); stagePosSpreadObj.loadCurPosData(); return; } } } else { newData[colSetting.field] = null; if (exprInfo) newData[exprInfo.expr] = ''; } } else { newData[colSetting.field] = newValue; } } data.updateData.push(newData); } } else { data.updateType = 'update'; for (let iRow = 0; iRow < info.cellRange.rowCount; iRow++) { const curRow = info.cellRange.row + iRow; const curPos = sortData[curRow]; if (curPos) { const newData = {pid: curPos.id, lid: curPos.lid}; for (let iCol = 0; iCol < info.cellRange.colCount; iCol++) { const curCol = info.cellRange.col + iCol; const colSetting = info.sheet.zh_setting.cols[curCol]; const newValue = trimInvalidChar(info.sheet.getText(curRow, curCol)); if (colSetting.type === 'Number') { const exprInfo = getExprInfo(colSetting.field); if (!newValue) { newData[colSetting.field] = newValue; if (exprInfo) newData[exprInfo.expr] = ''; continue; } const num = _.toNumber(newValue); if (num) { newData[colSetting.field] = num; if (exprInfo) newData[exprInfo.expr] = ''; } else { try { newData[colSetting.field] = math.evaluate(transExpr(newValue)); const exprInfo = getExprInfo(colSetting.field); if (exprInfo) newData[exprInfo.expr] = newValue; } catch(err) { toastr.error('输入的表达式非法'); stagePosSpreadObj.loadCurPosData(); return; } } } else { newData[colSetting.field] = newValue; } } data.updateData.push(newData); } } } postData(window.location.pathname + '/update', {pos: data}, function (result) { if (result.pos) { stagePos.updateDatas(result.pos.pos); stagePos.loadCurStageData(result.pos.curStageData); } const nodes = stageTree.loadPostStageData(result.ledger); stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes); stagePosSpreadObj.loadCurPosData(); if (detail) { detail.loadStagePosUpdateData(result, nodes); } else { stageIm.loadUpdatePosData(result, nodes); } }, function () { stagePosSpreadObj.loadCurPosData(); }); } }, deletePress: function (sheet) { if (sheet.zh_setting.readOnly) return; if (sheet.zh_setting && sheet.zh_data) { const sortData = sheet.zh_data; if (!sortData || sortData.length === 0) { return; } const sel = sheet.getSelections()[0]; const validCols = []; for (let iCol = sel.col; iCol < sel.col + sel.colCount; iCol++) { const colSetting = sheet.zh_setting.cols[iCol]; if (!colSetting.readOnly && colSetting.field !== 'qc_qty') { validCols.push(iCol); } } if (validCols.length === 0) { return; } const datas = [], posSelects = []; for (let iRow = sel.row; iRow < sel.row + sel.rowCount; iRow++) { const node = sortData[iRow]; if (node) { const data = {pid: node.id, lid: node.lid}; for (const iCol of validCols) { const colSetting = sheet.zh_setting.cols[iCol]; if (colSetting.field === 'name') { toastr.error('部位名称不能为空'); return; } data[colSetting.field] = null; const exprInfo = getExprInfo(colSetting.field); if (exprInfo) { data[exprInfo.expr] = ''; } } datas.push(data); posSelects.push(node); } } if (datas.length > 0) { postData(window.location.pathname + '/update', {pos: {updateType: 'update', updateData: datas} }, function (result) { if (result.pos) { stagePos.updateDatas(result.pos.pos); stagePos.loadCurStageData(result.pos.curStageData); } const nodes = stageTree.loadPostStageData(result.ledger); stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes); if (detail) { detail.loadStagePosUpdateData(result, nodes); } else { stageIm.loadUpdatePosData(result, nodes); } // todo 只加载改变项 stagePosSpreadObj.loadCurPosData(); }); } } }, deletePos: function (sheet) { const sels = sheet.getSelections(); const sel = sels ? sels[0] : null; if (sheet.zh_data && sel) { const data = {updateType: 'delete', updateData: []}; for (let iRow = 0; iRow < sel.rowCount; iRow++) { const posData = sheet.zh_data[sel.row + iRow]; if (posData) { data.updateData.push(posData.id); } } if (data.updateData.length > 0) { postData(window.location.pathname + '/update', {pos: data}, function (result) { stagePos.removeDatas(result.pos.pos); const refreshData = stageTree.loadPostStageData(result.ledger); stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), refreshData); stagePosSpreadObj.loadCurPosData(); if (detail) { detail.loadStagePosUpdateData(result, refreshData); } else { stageIm.loadUpdatePosData(result, refreshData); } }); } } }, selectionChanged: function (e, info) { stagePosSpreadObj.loadExprToInput(info.sheet); }, addPegs: function (pegs) { if (!pegs || pegs.length <= 0) return; const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); if (!node) return; const sheet = spSpread.getActiveSheet(); const sortData = sheet.zh_data || []; let order = sortData.length > 0 ? sortData[sortData.length - 1].porder + 1 : 1; pegs.forEach(function (p) {p.porder = ++order; p.lid = node.id}); postData(window.location.pathname + '/update', {pos: {updateType: 'add', updateData: pegs} }, function (result) { if (result.pos) { stagePos.updateDatas(result.pos.pos); } stagePosSpreadObj.loadCurPosData(); }); } }; // 加载上下窗口resizer $.divResizer({ select: '#main-resize', callback: function () { slSpread.refresh(); let bcontent = $(".bcontent-wrap") ? $(".bcontent-wrap").height() : 0; $(".sp-wrap").height(bcontent-30); spSpread.refresh(); window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); } }); // 加载计量单元数据 - 暂时统一加载,如有需要,切换成动态加载并缓存 postData(window.location.pathname + '/load', { filter: 'ledger;pos;detail;change;tag;cooperation' }, function (result) { // 加载树结构 stageTree.loadDatas(result.ledgerData); checkShowLast(result.ledgerData.length); treeCalc.calculateAll(stageTree); // 加载解锁相关 if (result.cooperation) { stageTree.loadPwd(result.cooperation, 'bills-p-' + userID + '-' + window.location.pathname.split('/')[2], result.cooperationConfirm); $('#cooperationCount').html(stageTree.pwd.length || ''); if (stageTree.pwd.length > 0) $('#cooperationCount').parent().show(); setCooperationSelectHtml(); reloadCooperationHtml(); } for (const t of result.tags) { t.node = stageTree.datas.find(x => {return x.id === t.lid}); } billsTag.loadDatas(result.tags); // 加载部位明细 stagePos.loadDatas(result.posData); stagePos.calculateAll(); SpreadJsObj.loadSheetData(slSpread.getActiveSheet(), 'tree', stageTree); SpreadJsObj.loadTopAndSelect(slSpread.getActiveSheet(), ckBillsSpread); stagePosSpreadObj.loadCurPosData(); SpreadJsObj.resetTopAndSelect(spSpread.getActiveSheet()); // 加载中间计量 stageIm.init(stage, imType, tenderInfo.decimal); stageIm.loadData(result.ledgerData, result.posData, result.detailData, result.changeData, result.detailAtt); errorList.loadHisErrorData(); checkList.loadHisCheckData(); sumLoadMiss.loadHisMissData(); // 收方单赋值 ledgerData = result.ledgerData; posData = result.posData; makeShouFang(); }, null, true); spSpread.bind(spreadNS.Events.EditEnded, stagePosSpreadObj.editEnded); 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 onblur', function () { if (this.readOnly) return; const expr = $(this); const posSheet = spSpread.getActiveSheet(); const row = expr.attr('data-row') ? _.toInteger(expr.attr('data-row')) : -1; const select = posSheet.zh_data ? posSheet.zh_data[row] : null; if (!select) return; const field = expr.attr('field'), orgValue = expr.attr('org'), newValue = expr.val(); if (orgValue === newValue || (!orgValue && newValue == '')) { return; } const data = {pid: select.id, lid: select.lid}; const exprInfo = getExprInfo(field); if (newValue !== '') { const num = _.toNumber(newValue); if (num) { data[field] = num; if (exprInfo) data[exprInfo.expr] = ''; } else { try { data[field] = math.evaluate(transExpr(newValue)); if (exprInfo) data[exprInfo.expr] = newValue; } catch (err) { toastr.error('输入的表达式非法'); return; } } } else { data[field] = null; if (exprInfo) data[exprInfo.expr] = ''; } // 提交数据到服务器 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); SpreadJsObj.reLoadRowData(posSheet, _.toNumber(row)); } const refreshData = stageTree.loadPostStageData(result.ledger); stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), refreshData); if (detail) { detail.loadStagePosUpdateData(result, refreshData); } else { stageIm.loadUpdatePosData(result, refreshData); } }); }); } const mergePeg = NewMergePeg({ callback: stagePosSpreadObj.addPegs}); $.contextMenu({ selector: '#stage-pos', build: function ($trigger, e) { const target = SpreadJsObj.safeRightClickSelection($trigger, e, spSpread); return target.hitTestType === spreadNS.SheetArea.viewport || target.hitTestType === spreadNS.SheetArea.rowHeader; }, items: { 'del': { name: '删除', icon: 'fa-remove', visible: function (key, opt) { return !checkTzMeasureType(); }, disabled: function (key, opt) { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); if (!node || node.lock) return true; const sheet = spSpread.getActiveSheet(); if (sheet.zh_data && !readOnly) { const selection = sheet.getSelections(); if (selection && selection[0]) { let valid = sheet.zh_data.length < selection[0].row + selection[0].rowCount; for (let iRow = 0; iRow < selection[0].rowCount; iRow++) { const posData = sheet.zh_data[selection[0].row + iRow]; if (posData) { if (posData.add_stage_order < stage.order || ZhCalc.isNonZero(posData.gather_qty) || ZhCalc.isNonZero(posData.end_gather_qty)) { valid = true; break; } } else { valid = true; break; } } return valid; } else { return true; } } else { return true; } }, callback: function (key, opt) { stagePosSpreadObj.deletePos(spSpread.getActiveSheet()); } }, 'merge-peg': { name: '合并起讫桩号', visible: function (key, opt) { return !checkTzMeasureType(); }, disabled: function (key, opt) { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); return _.isNil(node) || _.isNil(node.b_code) || node.b_code === '' || node.lock; }, callback: function (key, opt) { mergePeg.show(); } }, 'calcByRatio': { name: '按比例计量', visible: function (key, opt) { const data = spSpread.getActiveSheet().zh_data; return data && data.length > 0; }, disabled: function (key, opt) { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); return node.lock; }, callback: function (key, opt) { $('#cbr-ratio').val(''); $('#apply2sibling')[0].checked = false; $('#cbr-check-all')[0].checked = false; const html = []; for (const [i, p] of spSpread.getActiveSheet().zh_data.entries()) { html.push(''); html.push('', i+1, ''); html.push('', p.name, ''); html.push('', p.quantity, ''); html.push(''); html.push(''); } $('#cbr-pos-list').html(html.join('')); $('#calc-by-ratio').modal('show'); } }, 'remainCur': { name: '填剩余量(选中行)', disabled: function (key, opt) { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); const curPos = SpreadJsObj.getSelectObject(spSpread.getActiveSheet()); return readOnly || node.lock || !curPos; }, callback: function (key, opt) { const sheet = spSpread.getActiveSheet(); const sels = sheet.getSelections(); if (!sels || !sels[0]) return; const data = { updateType: 'update', updateData: [] }; for (let iRow = 0; iRow < sels[0].rowCount; iRow++) { const curRow = iRow + sels[0].row; const curPos = SpreadJsObj.getRowObject(sheet, curRow); if (!curPos) continue; const qty = ZhCalc.sub(curPos.quantity, curPos.pre_contract_qty); const differ = ZhCalc.sub(curPos.quantity, curPos.end_contract_qty); if (differ) data.updateData.push({ pid: curPos.id, lid: curPos.lid, contract_qty: qty }); } if (data.updateData.length > 0) { postData(window.location.pathname + '/update', {pos: data}, function (result) { if (result.pos) { stagePos.updateDatas(result.pos.pos); stagePos.loadCurStageData(result.pos.curStageData); } const nodes = stageTree.loadPostStageData(result.ledger); stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes); stagePosSpreadObj.loadCurPosData(); if (detail) { detail.loadStagePosUpdateData(result, nodes); } else { stageIm.loadUpdatePosData(result, nodes); } }); } }, }, 'remainAll': { name: '填剩余量(全部行)', disabled: function (key, opt) { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); const curPos = SpreadJsObj.getSelectObject(spSpread.getActiveSheet()); return readOnly || node.lock || !curPos; }, callback: function (key, opt) { const sheet = spSpread.getActiveSheet(); if (!sheet.zh_data || sheet.zh_data.length === 0) return; const data = { updateType: 'update', updateData: [] }; for (const curPos of sheet.zh_data) { const qty = ZhCalc.sub(curPos.quantity, curPos.pre_contract_qty); const differ = ZhCalc.sub(curPos.quantity, curPos.end_contract_qty); if (differ) data.updateData.push({ pid: curPos.id, lid: curPos.lid, contract_qty: qty }); } if (data.updateData.length > 0) { postData(window.location.pathname + '/update', {pos: data}, function (result) { if (result.pos) { stagePos.updateDatas(result.pos.pos); stagePos.loadCurStageData(result.pos.curStageData); } const nodes = stageTree.loadPostStageData(result.ledger); stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes); stagePosSpreadObj.loadCurPosData(); if (detail) { detail.loadStagePosUpdateData(result, nodes); } else { stageIm.loadUpdatePosData(result, nodes); } }); } }, }, 'shoufangdan': { name: '生成收方单', visible: function(key, opt) { if (cur_uid === stage.user_id) return true; }, disabled: function (key, opt) { const node = SpreadJsObj.getSelectObject(spSpread.getActiveSheet()); if (!node || cur_uid !== stage.user_id) return true; }, callback: function (key, opt) { const node = SpreadJsObj.getSelectObject(spSpread.getActiveSheet()); const ledgerNode = _.find(ledgerData, { id: node.lid }); $('#shoufang-lid').val(node.lid); $('#shoufang-pid').val(node.id); $('#shoufang-ledger').text('清单:' + ledgerNode.b_code); $('#shoufang-pos').text('计量单元:' + node.name).show(); $('#addshoufang').modal('show'); } } } }); $.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(); slSpread.refresh(); spSpread.refresh(); if (searchLedger) searchLedger.spread.refresh(); if (detail) detail.spread.refresh(); if (checkedChanges) checkedChanges.refresh(); if (errorList && errorList.spread) errorList.spread.refresh(); if (checkList) checkList.spread.refresh(); if (sumLoadMiss) sumLoadMiss.spread.refresh(); } }); $('#row-view').on('show.bs.modal', function () { const html = [], customDisplay = customColDisplay(); for (const cd of customDisplay) { html.push(''); html.push('', cd.title, ''); html.push('', '', ''); html.push(''); } $('#row-view-list').html(html.join('')); }); $('#row-view-ok').click(function () { const customDisplay = customColDisplay(); const cvl = $('#row-view-list').children(); for (const cv of cvl) { const title = $(cv).children()[0].innerHTML; const check = $('input', cv)[0].checked; const cd = customDisplay.find(function (c) { return c.title === title; }); cd.visible = check; } customizeStageTreeSetting(ledgerSpreadSetting, customDisplay); SpreadJsObj.refreshColumnVisible(slSpread.getActiveSheet()); Cookies.set(ckColSetting, JSON.stringify(customDisplay), 30*24*60*60*1000); $('#row-view').modal('hide'); }); const posSearch = (function () { let resultArr = []; const search = function () { resultArr = []; const keyword = $('#pos-search-keyword').val(); const checkOver = $('#pos-over-search')[0].checked; const checkEmpty = $('#pos-empty-search')[0].checked; const sortData = spSpread.getActiveSheet().zh_data; if (checkOver || checkEmpty) { if (sortData) { for (let i = 0, iLength = sortData.length; i < iLength; i++) { const sd = sortData[i]; let match = false; if (checkOver) { if (sd.end_gather_qty) { if (!sd.quantity || Math.abs(sd.end_gather_qty) > Math.abs(ZhCalc.add(sd.quantity, sd.end_qc_qty))) match = true; } } if (checkEmpty) { if (sd.quantity) { if (!sd.end_gather_qty || ZhCalc.sub(ZhCalc.add(sd.quantity, sd.end_qc_qty), sd.end_gather_qty) > 0) match = true; } } if (keyword && keyword !== '' && sd.name && sd.name.indexOf(keyword) === -1) match = false; if (match) { resultArr.push({index: i, data: sd}); } } } } else if (keyword && keyword !== '') { if (sortData) { for (let i = 0, iLength = sortData.length; i < iLength; i++) { const sd = sortData[i]; if (sd.name && sd.name.indexOf(keyword) > -1) { resultArr.push({index: i, data: sd}); } } } } $('#pos-search-result').html('结果:' + resultArr.length); }; const searchAndLocate = function () { search(); if (resultArr.length > 0) { const sheet = spSpread.getActiveSheet(); const sel = sheet.getSelections()[0]; const curRow = sel ? sel.row : 0; const pos = resultArr[0]; if (pos.index !== curRow) { sheet.setSelection(pos.index, sel ? sel.col : 0, 1, 1); sheet.showRow(pos.index, spreadNS.VerticalPosition.center); SpreadJsObj.reloadRowsBackColor(sheet, [pos.index, curRow]); } } }; const locateNext = function () { if (resultArr.length > 0) { const sheet = spSpread.getActiveSheet(); const sel = sheet.getSelections()[0]; const curRow = sel ? sel.row : 0; let next = _.find(resultArr, function (d) { return d.index > curRow; }); if (!next) next = resultArr[0]; if (next.index !== curRow) { sheet.setSelection(next.index, sel ? sel.col : 0, 1, 1); sheet.showRow(next.index, spreadNS.VerticalPosition.center); SpreadJsObj.reloadRowsBackColor(sheet, [next.index, curRow]); } } }; const locatePre = function () { if (resultArr.length > 0) { const sheet = spSpread.getActiveSheet(); const sel = sheet.getSelections()[0]; const curRow = sel ? sel.row : 0; let next = _.findLast(resultArr, function (d) { return d.index < curRow; }); if (!next) next = resultArr[resultArr.length - 1]; if (next.index !== curRow) { sheet.setSelection(next.index, sel ? sel.col : 0, 1, 1); sheet.showRow(next.index, spreadNS.VerticalPosition.center); SpreadJsObj.reloadRowsBackColor(sheet, [next.index, curRow]); } } }; return {search, searchAndLocate, locateNext, locatePre}; })(); $('#pos-search-keyword').bind('keydown', function(e){ if (e.keyCode == 13) posSearch.searchAndLocate(); }); $('#pos-empty-search').click(function () { if (this.checked) { $('[for=' + this.id +']').addClass('text-warning'); } else { $('[for=' + this.id +']').removeClass('text-warning'); } if (this.checked) { if ($('#pos-over-search')[0].checked) { $('#pos-search-keyword').attr('placeholder', '按名称查询'); } else { $('#pos-search-keyword').attr('placeholder', '漏计中按名称查询'); } } else { if ($('#pos-over-search')[0].checked) { $('#pos-search-keyword').attr('placeholder', '超计中按名称查询'); } else { $('#pos-search-keyword').attr('placeholder', '按名称查询'); } } posSearch.searchAndLocate(); }); $('#pos-over-search').click(function () { if (this.checked) { $('[for=' + this.id +']').addClass('text-danger'); } else { $('[for=' + this.id +']').removeClass('text-danger'); } if (this.checked) { if ($('#pos-empty-search')[0].checked) { $('#pos-search-keyword').attr('placeholder', '按名称查询'); } else { $('#pos-search-keyword').attr('placeholder', '超计中按名称查询'); } } else { if ($('#pos-empty-search')[0].checked) { $('#pos-search-keyword').attr('placeholder', '漏计中按名称查询'); } else { $('#pos-search-keyword').attr('placeholder', '按名称查询'); } } posSearch.searchAndLocate(); }); $('#pos-search-next').click(() => {posSearch.locateNext()}); $('#pos-search-pre').click(() => {posSearch.locatePre()}); $.divResizer({ select: '#right-spr', callback: function () { slSpread.refresh(); spSpread.refresh(); if (searchLedger) { searchLedger.spread.refresh(); } if (detail) { detail.spread.refresh(); } if (checkedChanges) checkedChanges.refresh(); if (errorList && errorList.spread) errorList.spread.refresh(); if (checkList) checkList.spread.refresh(); if (sumLoadMiss) sumLoadMiss.spread.refresh(); window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); } }); // 中间计量加载上下窗口resizer $.divResizer({ select: '#zhongjian-spr', callback: function () { if (detail) { detail.spread.refresh(); } $('.zhongjian-msg').height($('#zhongjian .sjs-bottom').height()); window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); } }); // 附件加载上下窗口resizer $.divResizer({ select: '#file-spr', callback: function () { window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); } }); // 变更令加载上下窗口resizer $.divResizer({ select: '#change-spr', callback: function () { if (checkedChanges) checkedChanges.refresh(); window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); } }); class Detail { constructor (obj) { const self = this; this.spreadSetting = { cols: [ {title: '编号', colSpan: '1', rowSpan: '1', field: 'code', hAlign: 0, width: 80, formatter: '@', readOnly: true}, {title: '中间计量表号', colSpan: '1', rowSpan: '1', field: 'im_code', hAlign: 0, width: 85, formatter: '@', readOnly: true}, {title: '交工证书/凭证号', colSpan: '1', rowSpan: '1', field: 'doc_code', hAlign: 0, width: 110, formatter: '@'}, { title: stage.im_type === imType.tz.value ? '本期计量金额' : '本期计量数量', colSpan: '1', rowSpan: '1', field: 'jl', hAlign: 2, width: 85, formatter: '@', readOnly: true }, { title: '附件', colSpan: '1', rowSpan: '1', field: 'attachment', hAlign: 0, width: 60, readOnly: true, cellType: 'imageBtn', normalImg: '#rela-file-icon', hoverImg: '#rela-file-hover', getValue: function (data) { return data.attachment ? data.attachment.length : 0; } }, ], headRows: 1, emptyRows: 0, headRowHeight: [32], headColWidth: [30], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', readOnly: readOnly, selectedBackColor: '#fffacd', imageClick: function (data) { self.makeAttTable(data); $('#im-file').modal('show'); } }; this.spread = SpreadJsObj.createNewSpread(obj[0]); this.sheet = this.spread.getActiveSheet(); this.spread.options.allowUserDragFill = true; this.spread.options.defaultDragFillType = spreadNS.Fill.AutoFillType.fillSeries; SpreadJsObj.initSheet(this.spread.getActiveSheet(), this.spreadSetting); this.detailObj = { selectionChanged: function (e, info) { self.reLoadDetailData(); if (!info.oldSelections || !info.oldSelections[0] || info.oldSelections[0].row !== info.newSelections[0].row) { self.loadLocateInfo(); } }, editEnded: function(e, info) { if (info.sheet.zh_setting) { const col = info.sheet.zh_setting.cols[info.col]; if (col.field !== 'doc_code') { SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } const data = SpreadJsObj.getSelectObject(info.sheet); if (data) { const updateData = {lid: data.lid, pid: data.pid}; if (data.uuid) { updateData.uuid = data.uuid; } else { updateData.code = data.code; updateData.name = data.name; updateData.unit = data.unit; updateData.unit_price = data.unit_price; updateData.pid = data.pid; updateData.pos_name = data.pos_name; updateData.im_type = data.im_type; } if (data.custom_define.indexOf('doc_code') === -1) { updateData.custom_define = data.custom_define; updateData.custom_define.push('doc_code'); updateData.custom_define = updateData.custom_define.join(','); } updateData.doc_code = info.editingText === null ? '' : info.editingText; postData(window.location.pathname + '/detail/save', updateData, function (result) { stageIm.loadUpdateDetailData(result); SpreadJsObj.reLoadRowData(info.sheet, info.row); }, function () { SpreadJsObj.reLoadRowData(info.sheet, info.row); }); } else { SpreadJsObj.reLoadRowData(info.sheet, info.row); } } }, clipboardPasted: function (e, info) { if (info.sheet.zh_setting && info.sheet.zh_data) { const col = info.sheet.zh_setting.cols[info.cellRange.col]; if (info.cellRange.colCount > 1) { toastr.warning('请勿同时复制粘贴多列数据'); SpreadJsObj.reLoadSheetData(paySpread.getActiveSheet()); return; } if (col.field !== 'doc_code') { SpreadJsObj.reLoadSheetData(paySpread.getActiveSheet()); return; } const datas = []; for (let iRow = 0; iRow < info.cellRange.rowCount; iRow++) { const curRow = info.cellRange.row + iRow; const data = info.sheet.zh_data[curRow]; if (data) { const updateData = {lid: data.lid, pid: data.pid}; if (data.uuid) { updateData.uuid = data.uuid; } else { updateData.code = data.code; updateData.name = data.name; updateData.unit = data.unit; updateData.unit_price = data.unit_price; updateData.pid = data.pid; updateData.pos_name = data.pos_name; updateData.im_type = data.im_type; } if (data.custom_define.indexOf('doc_code') === -1) { updateData.custom_define = data.custom_define; updateData.custom_define.push('doc_code'); updateData.custom_define = updateData.custom_define.join(','); } updateData.doc_code = info.sheet.getText(curRow, info.cellRange.col).replace('\n', ''); datas.push(updateData); } } if (datas.length > 0) { postData(window.location.pathname + '/detail/save', datas, function (result) { stageIm.loadUpdateDetailData(result); SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount); }, function () { SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount); }) } } }, deletePress: function (sheet) { if (sheet.zh_setting) { const datas = []; const sel = sheet.getSelections()[0]; for (let iCol = sel.col; iCol < sel.col + sel.colCount; iCol++) { const col = sheet.zh_setting.cols[iCol]; for (let iRow = sel.row; iRow < sel.row + sel.rowCount; iRow++) { const data = sheet.zh_data[iRow]; if (col.field === 'doc_code') { const updateData = {lid: data.lid}; if (data.uuid) { updateData.uuid = data.uuid; updateData.doc_code = ''; datas.push(updateData); } } } } if (datas.length > 0) { postData(window.location.pathname + '/detail/save', datas, function (result) { stageIm.loadUpdateDetailData(result); SpreadJsObj.reLoadRowData(sheet, sel.row, sel.rowCount); }, function () { SpreadJsObj.reLoadRowData(sheet, sel.row, sel.rowCount); }); } } }, dragFillBlock: function (e, info) { info.cancel = true; if (!info.sheet.zh_setting || !info.sheet.zh_data) return; const sel = info.sheet.getSelections()[0]; const col = info.sheet.zh_setting.cols[info.fillRange.col]; if (info.fillRange.colCount > 1 || !sel || col.field !== 'doc_code') return; const text = info.sheet.getText(sel.row + sel.rowCount - 1, sel.col); if (text === '') return; const regRst = /(\d+)$/g.exec(text), datas = []; for (let iRow = 0; iRow < info.fillRange.rowCount; iRow++) { const curRow = info.fillRange.row + iRow; const data = info.sheet.zh_data[curRow]; if (data) { const updateData = {lid: data.lid}; if (data.uuid) { updateData.uuid = data.uuid; } else { updateData.code = data.code; updateData.name = data.name; updateData.unit = data.unit; updateData.unit_price = data.unit_price; updateData.pid = data.pid; updateData.pos_name = data.pos_name; updateData.im_type = data.im_type; } if (regRst) { updateData.doc_code = text.substr(0, regRst.index) + (parseInt(regRst[0]) + iRow + 1); } else { updateData.doc_code = text.replace('\n', ''); } if (data.custom_define.indexOf('doc_code') === -1) { updateData.custom_define = data.custom_define; updateData.custom_define.push('doc_code'); updateData.custom_define = updateData.custom_define.join(','); } datas.push(updateData); } } if (datas.length > 0) { postData(window.location.pathname + '/detail/save', datas, function (result) { stageIm.loadUpdateDetailData(result); SpreadJsObj.reLoadRowData(info.sheet, info.fillRange.row, info.fillRange.rowCount); }, function () { SpreadJsObj.reLoadRowData(info.sheet, info.fillRange.row, info.fillRange.rowCount); }) } }, }; this.spread.bind(spreadNS.Events.SelectionChanged, this.detailObj.selectionChanged); if (!readOnly) { this.spread.bind(spreadNS.Events.EditEnded, this.detailObj.editEnded); this.spread.bind(spreadNS.Events.ClipboardPasted, this.detailObj.clipboardPasted); this.spread.bind(spreadNS.Events.DragFillBlock, this.detailObj.dragFillBlock); SpreadJsObj.addDeleteBind(this.spread, this.detailObj.deletePress); } this._initImTypeSetRela(); this._initModifyDetail(); this._initLocateRela(); this._initAttRela(); // 草图相关 this._initImageRela(); this.reBuildImData(); } makeAttTable (data) { let html = []; if (data.attachment) { for (const att of data.attachment) { const delHtml = (parseInt(att.uid) === userID && (att.renew || stage.status !== auditConst.status.checked)) ? '' : ''; const viewHtml = att.viewpath ? `` : ''; const downloadHtml = ''; html.push('' + att.filename + att.fileext + '' + att.username + '' + att.in_time + '', '', downloadHtml, viewHtml, delHtml, ''); } } $('#im-attList').html(html.join('')); } _initAttRela() { // 上传附件 const self = this; $('#upload-im-file').change(function () { const files = this.files; const sels = self.sheet.getSelections(); const select = SpreadJsObj.getSelectObject(self.sheet); if (!select) return; const formData = new FormData(); const baseInfo = {}; if (select.att_uuid) { baseInfo.uuid = select.att_uuid; } else { baseInfo.im_type = select.im_type; baseInfo.lid = select.lid; baseInfo.pid = select.pid; baseInfo.code = select.code; baseInfo.name = select.name; baseInfo.unit = select.unit; baseInfo.unit_price = select.unit_price; baseInfo.pos_name = select.pos_name; } formData.append('base', JSON.stringify(baseInfo)); for (const file of files) { if (file === undefined) { toast('未选择上传文件!', 'error'); return false; } const filesize = file.size; if (filesize > 30 * 1024 * 1024) { toast('存在上传文件大小过大!', 'error'); return false; } const fileext = '.' + file.name.toLowerCase().split('.').splice(-1)[0]; if (whiteList.indexOf(fileext) === -1) { toast('只能上传指定格式的附件!', 'error'); return false; } formData.append('size', filesize); formData.append('file[]', file); } postDataWithFile(window.location.pathname + '/im-file/upload', formData, function (data) { stageIm.loadUpdateDetailAtt(data); SpreadJsObj.reLoadRowData(self.sheet, sels[0].row); self.makeAttTable(select); $('#upload-im-file').val(''); }); }); // 删除附件 $('body').on('click', '.delete-att' ,function () { const sels = self.sheet.getSelections(); const select = SpreadJsObj.getSelectObject(self.sheet); if (!select) return; const uuid = $(this).attr('data-imid'); const file_id = $(this).attr('data-attid'); postData(window.location.pathname + '/im-file/del', { uuid, file_id }, function (result) { stageIm.loadUpdateDetailAtt(result); SpreadJsObj.reLoadRowData(self.sheet, sels[0].row); self.makeAttTable(select); }); }); // 预览附件 $('body').on('click', '.preview-att', function () { const uuid = $(this).attr('data-imid'); const file_id = $(this).attr('data-attid'); postData(window.location.pathname + `/im-file/preview?uuid=${uuid}&file_id=${file_id}`, {}, function (result) { const { filepath } = result; $('#load-file').attr('href', filepath); $('#load-file')[0].click(); }); }) } _initImTypeSetRela() { const self = this; const gatherConfirmPopover = { reBind: function (obj, eventName, fun) { obj.unbind(eventName); obj.bind(eventName, fun); }, check: function (pos, hint, okCallback) { const confirmObj = $('#gather-confirm'), hintObj = $('#gather-confirm-hint'); const okObj = $('#gather-confirm-ok'), cancelObj = $('#gather-confirm-cancel'); this.reBind(cancelObj, 'click', function () { confirmObj.hide(); }); this.reBind(okObj, 'click', function () { okCallback(); confirmObj.hide(); }); hintObj.text(hint); confirmObj.css("top", pos.y).css("left", pos.x).show(); } }; this.gsTree = stageIm.getGsTree(); if (stage.im_type === imType.tz.value || stage.im_type === imType.bb.value) { const jlCol = self.spreadSetting.cols.find(function (x) {return x.field === 'jl'}); jlCol.title = '本期计量金额'; SpreadJsObj.reLoadSheetHeader(self.sheet); $('[name=type-title-contract]').text('本期合同计量金额'); $('[name=type-title-qc]').text('本期变更计量金额'); } else { const jlCol = self.spreadSetting.cols.find(function (x) {return x.field === 'jl'}); jlCol.title = '本期计量数量'; SpreadJsObj.reLoadSheetHeader(self.sheet); $('[name=type-title-contract]').text('本期合同计量数量'); $('[name=type-title-qc]').text('本期变更计量数量'); } if (stage.im_type === imType.bb.value || stage.im_type === imType.bw.value) { $('#show-jldy').parent().show(); $('#jldy').parent().show(); $('#show-xm-name').parent().hide(); $('#xm-name').parent().hide(); } else { $('#show-jldy').parent().hide(); $('#jldy').parent().hide(); $('#show-xm-name').parent().show(); $('#xm-name').parent().show(); } // 选择中间计量模式 $('div[name="im-type"]').click(function () { function chooseType(obj) { obj.style.cursor = 'default'; $(obj).children().addClass('text-primary'); $(obj).addClass('border-primary'); $('h5', obj).prepend(''); } function validType(obj) { obj.style.cursor = 'pointer'; $(obj).children().removeClass('text-primary'); $(obj).removeClass('border-primary'); $('i', obj).remove(); } if (this.style.cursor === 'pointer') { const typeArr = $('div[name="im-type"]'); for (const t of typeArr) { if ($(t).attr('im-type') === $(this).attr('im-type')) { chooseType(t); } else { validType(t) } } } }); $('#choose').on('show.bs.modal', function () { function chooseType(obj) { obj.style.cursor = 'default'; $(obj).children().addClass('text-primary'); $('i', obj).remove(); $('h5', obj).prepend(''); } function validType(obj) { obj.style.cursor = 'pointer'; $(obj).children().removeClass('text-primary'); $('i', obj).remove(); } $('#im-pre').val(stage.im_pre ? stage.im_pre : ''); $('#im-start-num').val(stage.im_start_num ? stage.im_start_num : ''); const typeArr = $('div[name="im-type"]'); for (const t of typeArr) { if (parseInt($(t).attr('im-type')) === stage.im_type) { chooseType(t); } else { validType(t) } } }); // 提交 中间计量模式 $('#choose-ok').click(() => { let startNum; try { startNum = parseInt($('#im-start-num').val()); if (!startNum || startNum <= 0) throw '起始编号请输入正整数'; } catch (err) { toastr.error("起始编号请输入正整数"); return; } const chooseType = _.find($('div[name="im-type"]', '#im-type'), function (it) { return it.style.cursor !== 'pointer'; }); const data = { im_type: parseInt($(chooseType).attr('im-type')), im_pre: $('#im-pre').val(), im_start_num: startNum, }; postData(window.location.pathname + '/detail/build', data, function (result) { stage.im_type = data.im_type; stage.im_pre = data.im_pre; stage.im_start_num = data.im_start_num; if (stage.im_type === imType.tz.value || stage.im_type === imType.bb.value) { const jlCol = self.spreadSetting.cols.find(function (x) {return x.field === 'jl'}); jlCol.title = '本期计量金额'; SpreadJsObj.reLoadSheetHeader(self.sheet); $('[name=type-title-contract]').text('本期合同计量金额'); $('[name=type-title-qc]').text('本期变更计量金额'); } else { const jlCol = self.spreadSetting.cols.find(function (x) {return x.field === 'jl'}); jlCol.title = '本期计量数量'; SpreadJsObj.reLoadSheetHeader(self.sheet); $('[name=type-title-contract]').text('本期合同计量数量'); $('[name=type-title-qc]').text('本期变更计量数量'); } if (stage.im_type === imType.bb.value || stage.im_type === imType.bw.value) { $('#show-jldy').parent().show(); $('#jldy').parent().show(); $('#show-xm-name').parent().hide(); $('#xm-name').parent().hide(); } else { $('#show-jldy').parent().hide(); $('#jldy').parent().hide(); $('#show-xm-name').parent().show(); $('#xm-name').parent().show(); } // 加载生成数据 self.reBuildImData(); $('#choose').modal('hide'); }); }); // 显示树结构信息 $('#choose2').on('shown.bs.modal', function () { if (!self.gsSpread) { self.gsSpread = SpreadJsObj.createNewSpread($('#im-gather-spread')[0]); const setting = { cols: [ {title: '计量\n汇总', colSpan: '1', rowSpan: '1', field: 'check', hAlign: 1, width: 50, formatter: '@', readOnly: true, cellType: 'checkbox'}, {title: '项目节编号', colSpan: '1', rowSpan: '1', field: 'code', hAlign: 0, width: 150, formatter: '@', readOnly: true, cellType: 'tree'}, {title: '清单编号', colSpan: '1', rowSpan: '1', field: 'b_code', hAlign: 0, width: 80, formatter: '@', readOnly: true}, {title: '名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 230, formatter: '@', readOnly: true}, {title: '单位', colSpan: '1', rowSpan: '1', field: 'unit', hAlign: 1, width: 60, formatter: '@', readOnly: true}, ], headRows: 1, emptyRows: 0, headRowHeight: [32], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', }; sjsSettingObj.setFxTreeStyle(setting, sjsSettingObj.FxTreeStyle.jz); SpreadJsObj.initSheet(self.gsSpread.getActiveSheet(), setting); self.gsSpread.bind(spreadNS.Events.ButtonClicked, function (e, info) { function checkParent(node) { const parent = self.gsTree.getParent(node); if (parent) { return parent.check ? parent.check : checkParent(parent); } else { return false; } } function checkChildren(node) { for (const child of node.children) { if (child.check) { return true; } else if (checkChildren(child)) { return true; } } return false; } if (!$('#im-gather-check')[0].checked) { return; } const sheet = info.sheet, cellType = sheet.getCellType(info.row, info.col); if (cellType instanceof spreadNS.CellTypes.CheckBox) { if (sheet.isEditing()) { sheet.endEdit(true); } } if (info.sheet.zh_setting) { const col = info.sheet.zh_setting.cols[info.col]; if (col.field !== 'check') { return; } const sortData = info.sheet.zh_dataType === 'tree' ? info.sheet.zh_tree.nodes : info.sheet.zh_data; const node = sortData[info.row]; if (!node.check) { if (checkParent(node)) { const rect = info.sheet.getCellRect(info.row, info.col); gatherConfirmPopover.check({ x: rect.x + rect.width / 2 + 25, y: rect.y + rect.height / 2 + 3, }, '父项已勾选,继续将取消父项勾选。', function () { node.check = true; const parents = self.gsTree.getFullPathNodes(self.gsTree.getParent(node).full_path); const rows = [self.gsTree.nodes.indexOf(node)]; for (const p of parents) { if (p.check) { p.check = false; rows.push(self.gsTree.nodes.indexOf(p)); } } SpreadJsObj.reLoadRowsData(info.sheet, rows); }); } else if (checkChildren(node)) { const rect = info.sheet.getCellRect(info.row, info.col); gatherConfirmPopover.check({ x: rect.x + rect.width / 2 + 25, y: rect.y + rect.height / 2 + 3, }, '子项已勾选,继续将取消子项勾选。', function () { node.check = true; const posterity = self.gsTree.getPosterity(node); const rows = [self.gsTree.nodes.indexOf(node)]; for (const p of posterity) { if (p.check) { rows.push(self.gsTree.nodes.indexOf(p)); p.check = false; } } SpreadJsObj.reLoadRowsData(info.sheet, rows); }); } else { node.check = true; SpreadJsObj.reLoadRowsData(info.sheet, [self.gsTree.nodes.indexOf(node)]); } } else { node.check = false; SpreadJsObj.reLoadRowsData(info.sheet, [self.gsTree.nodes.indexOf(node)]); } } }); const gatherNodes = stage.im_gather_node ? _.map(stage.im_gather_node.split(',')) : []; for (const node of self.gsTree.datas) { node.check = gatherNodes.indexOf(node.id + '') !== -1; } SpreadJsObj.loadSheetData(self.gsSpread.getActiveSheet(), SpreadJsObj.DataType.Tree, self.gsTree); self.gsTree.expandByLevel(4); SpreadJsObj.refreshTreeRowVisible(self.gsSpread.getActiveSheet()); SpreadJsObj.resetFieldReadOnly(self.gsSpread.getActiveSheet, 'check', !$('#im-gather-check')[0].checked); } else { const gatherNodes = stage.im_gather_node ? _.map(stage.im_gather_node.split(',')) : []; for (const node of self.gsTree.datas) { node.check = gatherNodes.indexOf(node.id + '') !== -1; } SpreadJsObj.reLoadColsData(self.gsSpread.getActiveSheet(), [0]); } }); // 提交 高级设置 $('#choose2-ok').click(() => { if (!self.gsTree) { return; } const nodes = []; for (const node of self.gsTree.datas) { if (node.check) { nodes.push(node.id); } } const data = { im_gather: $('#im-gather-check')[0].checked, im_gather_node: nodes.join(','), }; postData(window.location.pathname + '/detail/adv', data, function (result) { stage.im_gather = data.im_gather; stage.im_gather_node = data.im_gather_node; $('#choose2').modal('hide'); }); }); } _initLocateRela() { const self = this; $('#im-locate2bills').click(function () { const curIndex = parseInt($('#im-locate-info')[0].innerText.split('/')[0]); const select = SpreadJsObj.getSelectObject(self.spread.getActiveSheet()); if (select && select.source) { SpreadJsObj.locateTreeNode(slSpread.getActiveSheet(), select.source[curIndex-1].id, true); stagePosSpreadObj.loadCurPosData(); } }); $('#im-locate-pre').click(function () { const curIndex = parseInt($('#im-locate-info')[0].innerText.split('/')[0]); const select = SpreadJsObj.getSelectObject(self.spread.getActiveSheet()); if (select && select.source) { const targetIndex = Math.max(curIndex-1, 1); SpreadJsObj.locateTreeNode(slSpread.getActiveSheet(), select.source[targetIndex-1].id, true); stagePosSpreadObj.loadCurPosData(); $('#im-locate-info')[0].innerText = targetIndex + '/' + select.source.length; } }); $('#im-locate-next').click(function () { const curIndex = parseInt($('#im-locate-info')[0].innerText.split('/')[0]); const select = SpreadJsObj.getSelectObject(self.spread.getActiveSheet()); if (select && select.source) { const targetIndex = Math.min(curIndex+1, select.source.length); SpreadJsObj.locateTreeNode(slSpread.getActiveSheet(), select.source[targetIndex-1].id, true); stagePosSpreadObj.loadCurPosData(); $('#im-locate-info')[0].innerText = targetIndex + '/' + select.source.length; } }); } _initModifyDetail() { const self = this; // 重置 $('#reset-detail-ok').click(function () { const data = SpreadJsObj.getSelectObject(self.spread.getActiveSheet()); if (!data.uuid) return; const updateData = { lid: data.lid, pid: data.pid, uuid: data.uuid, custom_define: [], }; for (const f of data.custom_define) { if (stageIm.resetFields.indexOf(f) >= 0) { updateData[f] = null; } else { updateData.custom_define.push(f); } } updateData.custom_define = updateData.custom_define.join(','); $('#reset-detail-modal').modal('hide'); postData(window.location.pathname + '/detail/save', updateData, function (result) { stageIm.loadUpdateDetailData(result); self.reLoadDetailData(); }); }); // 编辑 $('#edit-detail').click(function () { $(this).hide(); $('#save-detail').show(); $('#cancel-detail').show(); $('#detail-show').hide(); $('#detail-edit').show(); self.updateImageData = null; }); // 保存 $('#save-detail').click(() => { function check(field, obj, org, update) { const newValue = obj.val(); if (!org[field]) { if (newValue !== '') { update[field] = newValue; if (data.custom_define.indexOf(field) === -1) update.custom_define.push(field); return true; } } else if (newValue !== org[field]){ update[field] = newValue; if (data.custom_define.indexOf(field) === -1) update.custom_define.push(field); return true; } return false; } const data = SpreadJsObj.getSelectObject(self.spread.getActiveSheet()); const updateData = {lid: data.lid, pid: data.pid}; if (data.uuid) { updateData.uuid = data.uuid; updateData.custom_define = data.custom_define; } else { updateData.code = data.code; updateData.name = data.name; updateData.unit = data.unit; updateData.unit_price = data.unit_price; updateData.pid = data.pid; updateData.pos_name = data.pos_name; updateData.im_type = data.im_type; updateData.custom_define = []; } let infoUpdate = false; infoUpdate = check('bw', $('#bw-name'), data, updateData) || infoUpdate; infoUpdate = check('peg', $('#peg'), data, updateData) || infoUpdate; infoUpdate = check('xm', $('#xm-name'), data, updateData) || infoUpdate; infoUpdate = check('position', $('#position'), data, updateData) || infoUpdate; infoUpdate = check('jldy', $('#jldy'), data, updateData) || infoUpdate; infoUpdate = check('drawing_code', $('#drawing-code'), data, updateData) || infoUpdate; infoUpdate = check('calc_memo', $('#calc-memo'), data, updateData) || infoUpdate; updateData.custom_define = updateData.custom_define.join(','); if (infoUpdate) { postData(window.location.pathname + '/detail/save', updateData, function (result) { stageIm.loadUpdateDetailData(result); self.reLoadDetailData(); if (!self.updateImageData) return; if (!self.updateImageData.uuid) self.updateImageData.uuid = result.uuid; postData(window.location.pathname + '/detail/merge-img', self.updateImageData, function (result) { stageIm.loadUpdateDetailData(result); self.reLoadDetailData(); }); }); } else if (self.updateImageData) { postData(window.location.pathname + '/detail/merge-img', self.updateImageData, function (result) { stageIm.loadUpdateDetailData(result); self.reLoadDetailData(); }); } else { self.reLoadDetailData(); } }); // 取消 $('#cancel-detail').click(() => { self.reLoadDetailData(); }); } _initImageRela() { const self = this; $('#edit-detail').click(function () { loadImageItem(); }); function setdraggrable(){ $( ".img-item" ).draggable({ containment: "parent" },{stop: function( event, ui ) { }}).resizable({ containment: "parent" },{ handles: 'n, e, s, w, ne, se, sw, nw' },{ maxWidth: parseFloat($('#imgwidth').val())},{maxHeight: parseFloat($('#imgheight').val())},{ stop: function( event, ui ) { } }); } function upload(formData) { if (formData.length < 1) { return; } postDataWithFile(window.location.pathname + '/detail/add-img', formData, function (result) { const html = []; html.push('
'); html.push('
'); html.push(''); html.push('
'); html.push('
'); html.push('
'); $('.img-view').append(html.join('')); $('.img-bar').click(removeImageItem); setdraggrable(); $('#upload-img-file').val(''); }); } function dragFile(e) { var file = null, data = e.dataTransfer.types; for (var i = 0; i < data.length; i += 1) { if (data[i] === 'Files') { file = e.dataTransfer.files; //获取文件 break; } } if (file && file[0].type.indexOf('image') !== -1) { var formData = new FormData(); formData.append('file', file[0]); //上传单个文件的添加方式 upload(formData); //upload 异步上传 } } // 移动图片 const moveImageItem = function (ev) { const item = this; const view = $('.img-view')[0]; let oEvent = ev; // 浏览器有一些图片的默认事件,这里要阻止 oEvent.preventDefault(); let disX = oEvent.clientX - item.offsetLeft; let disY = oEvent.clientY - item.offsetTop; view.onmousemove = function (ev) { oEvent = ev; oEvent.preventDefault(); let x = oEvent.clientX -disX; let y = oEvent.clientY -disY; // 图形移动的边界判断 x = x <= 0 ? 0 : x; x = x >= view.offsetWidth - item.offsetWidth ? view.offsetWidth - item.offsetWidth : x; y = y <= 0 ? 0 : y; y = y >= view.offsetHeight - item.offsetHeight ? view.offsetHeight - item.offsetHeight : y; item.style.left = x + 'px'; item.style.top = y + 'px'; }; // 图形移出父盒子取消移动事件,防止移动过快触发鼠标移出事件,导致鼠标弹起事件失效 view.onmouseleave = function () { view.onmousemove = null; view.onmouseup = null; }; // 鼠标弹起后停止移动 view.onmouseup=function() { view.onmousemove = null; view.onmouseup = null; }; }; const removeImageItem = function () { $(this).parent().remove(); }; // 加载草图组成 const loadImageItem = function () { self.updateImageData = null; const data = SpreadJsObj.getSelectObject(self.spread.getActiveSheet()); const items = data.calc_img_org ? JSON.parse(data.calc_img_org) : []; const html = []; for (const item of items) { const itemStyle = 'top:' + item.top + ';' + 'left:' + item.left + ';' + 'width:' + item.width + ';' + 'height:' + item.height + ';'; html.push('
'); html.push('
'); html.push(''); html.push('
'); html.push('
'); html.push('
'); } $('.img-view').html(html.join('')); $('.img-bar').click(removeImageItem); setdraggrable(); }; // 上传图片 $('#upload-img').click(function () { $('#upload-img-file').trigger('click'); }); // 拖拽上传 //拖拽上传文件 const dragbox = document.querySelector('#upload-img'); dragbox.addEventListener('dragover', function(e) { e.preventDefault(); // 必须阻止默认事件 }, false); dragbox.addEventListener('drop', function(e) { e.preventDefault(); // 阻止默认事件 dragFile(e); }, false); //拖拽上传文件 const dragbox2 = document.querySelector('.img-view'); dragbox2.addEventListener('dragover', function(e) { e.preventDefault(); // 必须阻止默认事件 }, false); dragbox2.addEventListener('drop', function(e) { e.preventDefault(); // 阻止默认事件 dragFile(e); }, false); // 粘贴上传 $(".img-view").on('paste', function(ev) { let file = null; const data = (event.clipboardData || window.clipboardData).items; for (let i = 0; i < data.length; i += 1) { if ((data[i].kind == 'file') && (data[i].type.match('^image/'))) { file = data[i].getAsFile(); //读取图片文件 break; } } if (file) { const formData = new FormData(); formData.append('file', file); //上传单个文件的添加方式 upload(formData); //异步上传文件 } }); $('#upload-img-file').change(function () { const file = this.files[0]; const ext = file.name.toLowerCase().split('.').splice(-1)[0]; const imgStr = /(jpg|jpeg|png|bmp|BMP|JPG|PNG|JPEG)$/; if (!imgStr.test(ext)) { toastr.error('请上传正确的图片格式文件'); return } if ($(this).val()) { const formData = new FormData(); formData.append('file', this.files[0]); upload(formData); } }); // 保存草图修改结果 $('#edit-img-ok').click(function () { // 记录上传的图片的信息 const items = $('.img-item'); const img_remark = $('#text-edit').val(); const data = SpreadJsObj.getSelectObject(self.spread.getActiveSheet()); // 生成上传数据 const updateData = {updateType: 'update', lid: data.lid, pid: data.pid, calc_img_remark: img_remark}; if (data.uuid) { updateData.uuid = data.uuid; } else { updateData.code = data.code; updateData.name = data.name; updateData.unit = data.unit; updateData.unit_price = data.unit_price; updateData.pid = data.pid; updateData.pos_name = data.pos_name; updateData.im_type = data.im_type; } if (items.length > 0) { const itemInfo = []; for (const item of items) { const itemData = { src: $('img', item).attr('src'), left: item.style.left, top: item.style.top, width: item.style.width, height: item.style.height, }; itemInfo.push(itemData); } // 获取合并好的图片数据 const canvas = document.createElement('canvas'); const view = $('.img-view')[0]; canvas.height = view.clientHeight; canvas.width = view.clientWidth; const ctx = canvas.getContext('2d'); ctx.fillStyle = '#ffffff'; ctx.fillRect(0, 0, canvas.width, canvas.height); for (const b of $('.img-item')) { const pos = $(b).position(); const img = $('img', b)[0]; ctx.drawImage(img, pos.left, pos.top, img.width, img.height); } updateData.img = canvas.toDataURL('image/png'); updateData.imgInfo = itemInfo; self.updateImageData = updateData; $('#calc-img').attr('src', updateData.img); $('#calc-remark').html(img_remark); $('#view-calc-img').attr('src', updateData.img); $('#show-calc-img').attr('src', updateData.img); $('#show-calc-remark').html((img_remark ? ''+ img_remark +'' : '')); $('#view-calc-remark').text(img_remark); $('#edit-img').modal('hide'); // updateImageData = updateData; // $('#edit-img').modal('hide'); // postData(window.location.pathname + '/detail/merge-img', updateData, function (result) { // stageIm.loadUpdateDetailData(result); // data.calc_img = result.calc_img; // data.calc_img_org = result.calc_img_org; // const calcImgSrc = data && data.calc_img ? '/' + data.calc_img : ''; // $('#show-calc-img').attr('src', calcImgSrc); // $('#calc-img').attr('src', calcImgSrc); // $('#view-calc-img').attr('src', calcImgSrc); // $('#edit-img').modal('hide'); // }); } else if (data.calc_img) { self.updateImageData = {updateType: 'clear', lid: data.lid, pid: data.pid, uuid: data.uuid, calc_img_remark: img_remark}; $('#show-calc-img').attr('src', ''); $('#show-calc-remark').html(''); $('#calc-img').attr('src', ''); $('#calc-remark').html(''); $('#view-calc-img').attr('src', ''); $('#view-calc-remark').val(''); $('#text-edit').val(''); $('#edit-img').modal('hide'); // postData(window.location.pathname + '/detail/merge-img', {updateType: 'clear', lid: data.lid, pid: data.pid, uuid: data.uuid}, function (result) { // stageIm.loadUpdateDetailData(result); // data.calc_img = result.calc_img; // data.calc_img_org = result.calc_img_org; // const calcImgSrc = data && data.calc_img ? '/' + data.calc_img : ''; // $('#show-calc-img').attr('src', calcImgSrc); // $('#calc-img').attr('src', calcImgSrc); // $('#view-calc-img').attr('src', calcImgSrc); // $('#edit-img').modal('hide'); // }); } else { self.updateImageData = updateData; $('#show-calc-img').attr('src', ''); $('#show-calc-remark').html(''); $('#calc-img').attr('src', ''); $('#calc-remark').html(''); $('#view-calc-img').attr('src', ''); $('#view-calc-remark').val(''); $('#text-edit').val(''); $('#edit-img').modal('hide'); } }); } reBuildImData() { const imData = stageIm.buildImData(); SpreadJsObj.loadSheetData(this.sheet, SpreadJsObj.DataType.Data, imData); this.reLoadDetailData(); this.loadLocateInfo(); } loadStageLedgerUpdateData(data, nodes) { const imData = stageIm.loadUpdateLedgerData(data, nodes); SpreadJsObj.loadSheetData(this.sheet, SpreadJsObj.DataType.Data, imData); this.reLoadDetailData(); } loadStagePosUpdateData(data, nodes) { const imData = stageIm.loadUpdatePosData(data, nodes); SpreadJsObj.loadSheetData(this.sheet, SpreadJsObj.DataType.Data, imData); this.reLoadDetailData(); } loadStageChangeUpdateData(data, nodes) { const imData = stageIm.loadUpdateChangeData(data, nodes); SpreadJsObj.loadSheetData(this.sheet, SpreadJsObj.DataType.Data, imData); this.reLoadDetailData(); } loadLocateInfo() { const select = SpreadJsObj.getSelectObject(this.sheet); if (select && select.source.length > 1) { $('#im-locate2bills').next().show(); } else { $('#im-locate2bills').next().hide(); } $('#im-locate-info')[0].innerText = '1/' + (select ? select.source.length : '0'); } reLoadDetailData() { const data = SpreadJsObj.getSelectObject(this.spread.getActiveSheet()); $('#reset-detail').hide(); if (data) { for (const f of data.custom_define) { if (stageIm.resetFields.indexOf(f) >= 0) { $('#reset-detail').show(); break; } } $('#edit-detail').show(); $('#modify-img').show(); } else { $('#edit-detail').hide(); $('#modify-img').hide(); } $('#save-detail').hide(); $('#cancel-detail').hide(); $('#detail-show').show(); $('#detail-edit').hide(); const contractJl = data && data.contract_jl ? data.contract_jl : ''; $('#show-contract-jl').text(contractJl); $('#contract-jl').val(contractJl); const qcJl = data && data.qc_jl ? data.qc_jl : ''; $('#show-qc-jl').text(qcJl); $('#qc-jl').val(qcJl); const bglCode = data && data.bgl_code ? data.bgl_code : ''; $('#show-bgl-code').text(bglCode); $('#bgl-code').val(bglCode); const bglDrawingCode = data && data.bgl_drawing_code ? data.bgl_drawing_code : ''; $('#show-bgl-drawing-code').text(bglDrawingCode); $('#bgl-drawing-code').val(bglDrawingCode); const bwName = data && data.bw ? data.bw : ''; $('#show-bw-name').text(bwName); $('#bw-name').val(bwName); const position = data && data.position ? data.position : ''; $('#show-position').text(position); $('#position').val(position); const peg = data && data.peg ? data.peg : ''; $('#show-peg').text(peg); $('#peg').val(peg); const xmName = data && data.xm ? data.xm: ''; $('#show-xm-name').text(xmName); $('#xm-name').val(xmName); const jldy = data && data.jldy ? data.jldy: ''; $('#show-jldy').text(jldy); $('#jldy').val(jldy); const drawingCode = data && data.drawing_code ? data.drawing_code: ''; $('#show-drawing-code').text(drawingCode); $('#drawing-code').val(drawingCode); const calcMemo = data && data.calc_memo ? data.calc_memo: ''; $('#show-calc-memo').html(calcMemo.replace(/\n/g, '
')); $('#calc-memo').val(calcMemo); const calcImgSrc = data && data.calc_img ? '/' + data.calc_img : ''; $('#show-calc-img').attr('src', calcImgSrc); $('#calc-img').attr('src', calcImgSrc); $('#view-calc-img').attr('src', calcImgSrc); const calcImgRemark = data && data.calc_img_remark || ''; $('#view-calc-remark').val(calcImgRemark); $('#show-calc-remark').html((calcImgRemark ? ''+ calcImgRemark +'' : '')); $('#calc-remark').html(calcImgRemark); $("#view-calc-remark").attr('readonly', true); // 处理 编辑 -> 添加草图中textarea多余的空格 $('#text-edit').val(calcImgRemark) } } class CheckedChange { constructor (setting) { const self = this; this.changeSpreadSetting = { cols: [ {title: '变更令号', colSpan: '1', rowSpan: '1', field: 'p_code', hAlign: 0, width: 100, formatter: '@'}, {title: '变更名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 180, formatter: '@'}, {title: '金额', colSpan: '1', rowSpan: '1', field: 'total_price', hAlign: 2, width: 80, type: 'Number'}, {title: '批复文号', colSpan: '1', rowSpan: '1', field: 'w_code', hAlign: 0, width: 100, formatter: '@'}, ], emptyRows: 0, headRows: 1, headRowHeight: [32], headColWidth: [30], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', readOnly: true, }; this.changeSpread = SpreadJsObj.createNewSpread(setting.changeObj[0]); this.changeSheet = this.changeSpread.getActiveSheet(); SpreadJsObj.initSheet(this.changeSheet, this.changeSpreadSetting); const getTipText = function (data) { if (!data) return ''; const tips = []; if (data.xmj_dwgc) tips.push(data.xmj_dwgc); if (data.xmj_fbgc) tips.push(data.xmj_fbgc); if (data.xmj_fxgc) tips.push(data.xmj_fxgc); if (data.xmj_jldy) tips.push(data.xmj_jldy); return tips.join('-'); }; this.changeBillsSpreadSetting = { cols: [ {title: '清单编号', colSpan: '1', rowSpan: '1', field: 'code', hAlign: 0, width: 80, formatter: '@', cellType: 'tip', getTip: getTipText}, {title: '名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 150, type: 'Number', cellType: 'tip', getTip: getTipText}, {title: '单位', colSpan: '1', rowSpan: '1', field: 'unit', hAlign: 1, width: 50, formatter: '@', cellType: 'tip', getTip: getTipText}, {title: '单价', colSpan: '1', rowSpan: '1', field: 'unit_price', hAlign: 2, width: 60, type: 'Number', cellType: 'tip', getTip: getTipText}, {title: '数量', colSpan: '1', rowSpan: '1', field: 'qty', hAlign: 2, width: 60, formatter: '@', cellType: 'tip', getTip: getTipText}, {title: '金额', colSpan: '1', rowSpan: '1', field: 'tp', hAlign: 2, width: 60, formatter: '@', cellType: 'tip', getTip: getTipText}, {title: '变更部位', colSpan: '1', rowSpan: '1', field: 'bwmx', hAlign: 0, width: 100, formatter: '@', cellType: 'tip', getTip: getTipText}, ], emptyRows: 0, headRows: 1, headRowHeight: [32], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', readOnly: true }; this.changeBillsSpread = SpreadJsObj.createNewSpread(setting.changeBillsObj[0]); this.changeBillsSheet = this.changeBillsSpread.getActiveSheet(); SpreadJsObj.initSheet(this.changeBillsSheet, this.changeBillsSpreadSetting); this.changeSheet.bind(spreadNS.Events.SelectionChanged, function (e, info) { const change = SpreadJsObj.getSelectObject(self.changeSheet); if (change.cid === self.curChangeId) { return; } self.curChangeId = change.cid; if (change.detail) { self.loadChangeDetailData(); } else { postData(window.location.pathname + '/change/detail', {cid: change.cid}, function (result) { change.detail = result; self.analyzeChange(change); self.loadChangeDetailData(); }); } }); this.changes = null; this.reloadChangeData(); setting.reloadObj.click(function() { self.reloadChangeData(); }); $.contextMenu({ selector: '#' + setting.changeBillsObj.attr('id'), build: function ($trigger, e) { const target = SpreadJsObj.safeRightClickSelection($trigger, e, self.changeBillsSpread); return target.hitTestType === spreadNS.SheetArea.viewport || target.hitTestType === spreadNS.SheetArea.rowHeader; }, items: { 'locateZjjl': { name: '定位至台账', icon: 'fa-sign-in', callback: function (key, opt) { const changeBills = SpreadJsObj.getSelectObject(self.changeBillsSheet); if (changeBills.gcl_id) { const node = stageTree.nodes.find(x => {return x.id === changeBills.gcl_id}); SpreadJsObj.locateTreeNode(slSpread.getActiveSheet(), node.ledger_id, true); stagePosSpreadObj.loadCurPosData(); } else { const cb = { b_code: changeBills.code || '', name: changeBills.name || '', unit: changeBills.unit || '', unit_price: changeBills.unit_price || 0, }; for (const node of stageTree.nodes) { if (node.children && node.children.length > 0) continue; const b = { b_code: node.b_code || '', name: node.name || '', unit: node.unit || '', unit_price: node.unit_price || 0, }; if (_.isMatch(cb, b)) { SpreadJsObj.locateTreeNode(slSpread.getActiveSheet(), node.ledger_id); stagePosSpreadObj.loadCurPosData(); return; } } } }, disabled: function (key, opt) { const changeBills = SpreadJsObj.getSelectObject(self.changeBillsSheet); return !changeBills; } }, } }); } loadChangeDetailData() { const change = SpreadJsObj.getSelectObject(this.changeSheet); if (change) { SpreadJsObj.loadSheetData(this.changeBillsSheet, SpreadJsObj.DataType.Data, change.bills); } else { SpreadJsObj.loadSheetData(this.changeBillsSheet, SpreadJsObj.DataType.Data, []); } } refresh() { this.changeSpread.refresh(); this.changeBillsSpread.refresh(); } reloadChangeData() { const self = this; postData(window.location.pathname + '/change/data', null, function (result) { self.changes = result.changes; SpreadJsObj.loadSheetData(self.changeSheet, SpreadJsObj.DataType.Data, self.changes); self.changeSheet.setSelection(0, 0, 1, 1); if (self.changes.length > 0) self.analyzeChange(result.changes[0]); self.curChangeId = self.changes.length > 0 ? self.changes[0].id : null; self.loadChangeDetailData(); }); } analyzeChange(change) { change.bills = change.detail.bills; for (const b of change.bills) { const aub = change.detail.addUsedBills.find(function (x) { return x.id === b.id; }); if (aub) { b.used_qty = aub.used_qty; } b.qty = _.toNumber(b.samount); b.valid_qty = ZhCalc.sub(b.qty, b.used_qty); b.tp = ZhCalc.round(ZhCalc.mul(b.qty, b.unit_price), tenderInfo.decimal.tp); b.pos = _.filter(change.detail.curUsedBills, {cbid: b.id}); b.cur_qty = 0; for (const p of b.pos) { p.f_qty = p.p_qty ? p.p_qty : p.l_qty; b.cur_qty = ZhCalc.add(b.cur_qty, p.qty); } } } } // 展开收起附件 $('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') === '#search' && !searchLedger) { searchLedger = $.billsSearch({ selector: '#search', searchSpread: slSpread, searchOver: true, searchEmpty: true, resultSpreadSetting: { cols: [ {title: '项目节编号', field: 'code', hAlign: 0, width: 90, formatter: '@'}, {title: '清单编号', field: 'b_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}, {title: '完成率(%)', field: 'end_gather_percent', hAlign: 2, width: 70}, ], emptyRows: 0, headRows: 1, headRowHeight: [32], headColWidth: [30], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', selectedBackColor: '#fffacd', }, afterLocated: function () { stagePosSpreadObj.loadCurPosData(); }, customSearch: [ { key: 'less', title: '漏计', valid: true, check: function (node) { if (node.quantity) { return ZhCalc.sub(ZhCalc.add(node.quantity, node.end_qc_qty), node.end_gather_qty) > 0; } else if (node.total_price) { return ZhCalc.sub(ZhCalc.add(node.total_price, node.end_qc_tp), node.end_gather_tp) > 0; } } }, { key: 'over', title: '超计', valid: true, check: function (node) { return checkUtils.billsOver(node, checkTzMeasureType(), stagePos); } }, { key: 'empty', title: '漏计', valid: false, check: function (node) { if (node.quantity) { return !node.end_gather_qty || checkZero(node.end_gather_qty); } else if (node.total_price) { return !node.end_gather_tp || checkZero(node.end_gather_tp); } } }, { key: 'estimate', title: '预计变更', valid: true, check: function (node) { const posRange = stagePos.ledgerPos[itemsPre + node.id] || []; if (posRange.length > 0) { for (const p of posRange) { if (!checkZero(p.estimate_qty)) return true; } return false; } else { return false; } } } ], }); searchLedger.spread.refresh(); } if (tab.attr('content') === '#fujian') { const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); node && getNodeList(node.id); } if (tab.attr('content') === '#zhongjian') { if (!detail) { detail = new Detail($('#detail-spread')); detail.spread.refresh(); $('#zhongjian .sjs-bottom').height('400px'); $('.zhongjian-msg').height($('#zhongjian .sjs-bottom').height()); } else { detail.spread.refresh(); } } if (tab.attr('content') === '#checked-change') { if (!checkedChanges) { checkedChanges = new CheckedChange({ changeObj: $('#cc-spread'), changeBillsObj: $('#ccb-spread'), reloadObj: $('#refresh-cc'), }); checkedChanges.refresh(); } else { $('#ccb-spread').height('400px'); checkedChanges.refresh(); } } if (tab.attr('content') === '#error-list') { errorList.spread.refresh(); } if (tab.attr('content') === '#check-list') { checkList.spread.refresh(); } if (tab.attr('content') === '#sum-load-miss') sumLoadMiss.spread.refresh(); } else { tab.removeClass('active'); tabPanel.removeClass('active'); showSideTools(tab.hasClass('active')); } slSpread.refresh(); spSpread.refresh(); }); // 切换附件里节点和所有附件 $('#fujian .nav-link').on('click', function () { const tabPanel = $(this).attr('fujian-content'); if (tabPanel !== 'syfujian') { $('#showPage').hide(); $('#bach-download').prop('type', 'curr'); } else { $('#showPage').show(); $('#bach-download').prop('type', 'all') } $('#showAttachment').hide(); }); // 上传附件 $('#upload-file-btn').click(function () { // if (curAuditor && curAuditor.aid !== cur_uid) { // return toastr.error('当前操作没有权限!'); // } const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); if (!node) return const files = $('#upload-file')[0].files; const formData = new FormData(); formData.append('lid', node.id); for (const file of files) { if (file === undefined) { toastr.error('未选择上传文件!'); return false; } const filesize = file.size; if (filesize > 30 * 1024 * 1024) { toastr.error('存在上传文件大小过大!'); return false; } const fileext = '.' + file.name.toLowerCase().split('.').splice(-1)[0]; if (whiteList.indexOf(fileext) === -1) { toastr.error('只能上传指定格式的附件!'); return false; } formData.append('size', filesize); formData.append('file[]', file); } postDataWithFile('/tender/' + tender.id + '/measure/stage/' + stage.order + '/upload/file', formData, function (data) { $('#upload').modal('hide'); // 插入到attData中 attData = data.concat(attData); // 重新生成List getAllList(); getNodeList(node.id); }, function () { toastr.error('附件上传失败'); }); $('#upload-file').val(''); }); // 获取附件信息 $('.list-table').on('click', '.att-file-name', function () { const fid = $(this).attr('file-id'); if ($('#showAttachment').attr('file-id') === fid && !$('#showAttachment').is(":hidden")) { return; } const att = attData.find(function (item) { return item.id === parseInt(fid); }); $('#edit-att').hide(); $('#show-att').show(); if (att !== undefined) { // 进来先把编辑功能隐藏 $('#btn-att a').eq(3).hide() $('#show-att tr').eq(0).children('td').text(att.filename + att.fileext); const name = att.code !== null && att.code !== '' ? att.code : (att.b_code !== null ? att.b_code : ''); $('#show-att tr').eq(1).children('td').text($.trim(name + ' ' + att.lname)); // $('#show-att tr').eq(2).find('a').attr('href', '/tender/' + tender.id + '/measure/stage/' + stage.order + '/download/file/' + att.id); // $('#show-att tr').eq(2).find('a').attr('href', att.filepath); $('#show-att tr').eq(2).children('td').eq(0).text(att.username); $('#show-att tr').eq(2).children('td').eq(1).text(att.in_time); $('#show-att tr').eq(3).children('td').text(att.remark); // 附件uid等于当前用户id, 附件上传本人 if (parseInt(cur_uid) === att.uid) { $('#btn-att').show(); const showDel = stage.status === auditConst.status.checked ? Boolean(att.extra_upload) : true; // if (!curAuditor) { // stage.status === auditConst.status.checked && parseInt(att.re_upload) && (showDel = true) // stage.status === auditConst.status.uncheck && parseInt(cur_uid) === stage.user_id && (showDel = true) // stage.status === auditConst.status.checkNo && parseInt(cur_uid) === stage.user_id && (showDel = true) // } else { // curAuditor.aid === parseInt(cur_uid) && (showDel = true) // } if (showDel) $('#btn-att a').eq(3).show(); // $('#btn-att a').eq(3).show(); $('#btn-att a').eq(2).hide(); $('#btn-att a').eq(4).hide(); $('#btn-att a').eq(5).hide(); } else { $('#btn-att').hide(); $('#btn-att a').eq(3).hide(); $('#btn-att a').eq(2).hide(); $('#btn-att a').eq(4).hide(); $('#btn-att a').eq(5).hide(); } $('#showAttachment').attr('file-id', fid); $('#showAttachment').show(); } else { $('#showAttachment').hide(); $('#showAttachment').attr('file-id', ''); toastr.error('附件信息获取失败'); } }); // $('body').on('click', '.alllist-table a', handleFileList); $('body').on('click', '#btn-att a', function () { const content = $(this).attr('content'); const fid = $('#showAttachment').attr('file-id'); const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet()); if (content === 'edit') { $('#btn-att a').eq(3).hide(); $('#btn-att a').eq(2).show(); $('#btn-att a').eq(4).show(); $('#btn-att a').eq(5).show(); $('#show-att').hide(); $('#edit-att').show(); const att = attData.find(function (item) { return item.id === parseInt(fid); }); $('#edit-att .form-group').eq(0).find('input').val(att.filename); $('#edit-att .form-group').eq(0).find('span').eq(1).text(att.fileext); const name = att.code !== null && att.code !== '' ? att.code : (att.b_code !== null ? att.b_code : ''); $('#edit-att .form-group').eq(1).find('input').val($.trim(name + ' ' + att.lname)); $('#edit-att .form-group').eq(2).find('input').val(att.in_time); $('#edit-att .form-group').eq(3).find('input').val(att.remark); } else if (content === 'cancel') { $('#show-att').show(); $('#edit-att').hide(); $('#btn-att a').eq(3).show(); $('#btn-att a').eq(2).hide(); $('#btn-att a').eq(4).hide(); $('#btn-att a').eq(5).hide(); } else if (content === 'save') { const formData = new FormData(); formData.append('id', fid); formData.append('filename', $('#edit-att .form-group').eq(0).find('input').val()); formData.append('fileext', $('#edit-att .form-group').eq(0).find('span').eq(1).text()); formData.append('remark', $('#edit-att .form-group').eq(3).find('input').val()); const file = $('#change-att-btn')[0]; if (file.files[0] !== undefined) { const filesize = file.files[0].size; formData.append('size', filesize); formData.append('file', file.files[0]); } postDataWithFile('/tender/' + tender.id + '/measure/stage/' + stage.order + '/save/file', formData, function (data) { // 替换到attData中 const att_index = attData.findIndex(function (item) { return item.id === parseInt(fid); }); attData.splice(att_index, 1, data); // 重新生成List getAllList(parseInt($('#currentPage').text())); getNodeList(node.id); $('#show-att').show(); $('#edit-att').hide(); $('#show-att tr').eq(0).children('td').text(data.filename + data.fileext); const name = data.code !== null && data.code !== '' ? data.code : (data.b_code !== null ? data.b_code : ''); $('#show-att tr').eq(1).children('td').text($.trim(name + ' ' + data.lname)); // $('#show-att tr').eq(2).find('a').attr('href', '/tender/' + tender.id + '/measure/stage/' + stage.order + '/download/file/' + data.id); $('#show-att tr').eq(3).children('td').eq(0).text(data.username); $('#show-att tr').eq(3).children('td').eq(1).text(data.in_time); $('#show-att tr').eq(4).children('td').text(data.remark); $('#btn-att a').eq(3).show(); $('#btn-att a').eq(2).hide(); $('#btn-att a').eq(4).hide(); $('#btn-att a').eq(5).hide(); }, function () { toastr.error('附件上传失败'); }); $('#change-att-btn').val(''); } else if (content === 'del') { const data = {id: fid}; postData('/tender/' + tender.id + '/measure/stage/' + stage.order + '/delete/file', data, function (result) { // 删除到attData中 const att_index = attData.findIndex(function (item) { return item.id === parseInt(fid); }); attData.splice(att_index, 1); // 重新生成List if ($('#alllist-table tr').length === 1) { getAllList(parseInt($('#currentPage').text()) - 1); } else { getAllList(parseInt($('#currentPage').text())); } getNodeList(node.id); $('#showAttachment').hide(); $('#showAttachment').attr('file-id', ''); }); } else if (content === 'view') { const data = {id: fid}; postData('/tender/' + tender.id + '/measure/stage/' + stage.order + '/check/file', data, function (result) { const { filepath } = result $('#load-file').attr('href', filepath); $('#load-file')[0].click(); // $('#show-att tr').eq(2).find('a').attr('href', filepath) // $('#show-att tr').eq(2).find('a').children('span').eq(0).trigger('click') }); } else if (content === 'location') { const att = attData.find(item => item.id === parseInt(fid)); if (Object.keys(att).length) { SpreadJsObj.locateTreeNode(slSpread.getActiveSheet(), att.ledger_id, true); stagePosSpreadObj.loadCurPosData(); } } }); // 替换附件 $('#change-att-btn').on('change', function () { const file = $('#change-att-btn')[0].files[0]; const name = file.name; const filename = name.substring(0, name.lastIndexOf(".")); const fileext = name.substr(name.indexOf(".")); const filesize = file.size; if (filesize > 30 * 1024 * 1024) { toastr.error('文件大小过大!'); $('#change-att-btn').val(''); return false; } if (whiteList.indexOf(fileext) === -1) { toastr.error('只能上传指定格式的附件!'); $('#change-att-btn').val(''); return false; } $('#edit-att .form-group').eq(0).find('input').val(filename); $('#edit-att .form-group').eq(0).find('span').eq(1).text(fileext); }); // 切换页数 $('.page-select').on('click', function () { const totalPageNum = parseInt($('#totalPage').text()); const lastPageNum = parseInt($('#currentPage').text()); const status = $(this).attr('content'); if (status === 'pre' && lastPageNum > 1) { getAllList(lastPageNum-1); $('#showAttachment').hide(); $('#syfujian .check-all-file').prop('checked', false) } else if (status === 'next' && lastPageNum < totalPageNum) { getAllList(lastPageNum+1); $('#showAttachment').hide(); $('#syfujian .check-all-file').prop('checked', false) } }); // 批量下载 $('#bach-download').click(function() { const fileIds = []; const type = $(this).attr('type'); let node = '' if (type === 'curr') { node = '#nodelist-table .check-file:checked' } else { node = '#alllist-table .check-file:checked' } $(node).each(function() { const fileId = $(this).attr('file-id'); fileId && fileIds.push(fileId); }); if (fileIds.length) { if (fileIds.length > 20) { return toastr.warning(`最大允许20个文件(当前${fileIds.length}个)`) } toastr.success('正在进行压缩文件...', '', { timeOut: 0, extendedTimeOut: 0}) $(this).attr('disabled', "true") const btn = $(this); const fileArr = []; for (const id of fileIds) { const fileInfo = _.find(currPageFileData, { id: parseInt(id) }); fileArr.push({ url: fileInfo.orginpath, //文件的oss存储路径 (必填) name: fileInfo.filename, // 文件名 (可选, 不需要填扩展名) foldPath: '' // (可选, 文件在压缩包中的存储路径) }); } const packageName = `${tender.name}-计量台账-第${stage.order}期-附件.zip`; try { zipOss.downloadFromAliOss(fileArr, packageName, btn); } catch (e) { btn.removeAttr('disabled'); toastr.clear(); toastr.error('批量下载失败'); } // postCompressFile(`/tender/${tender.id}/measure/stage/${stage.order}/download/compresse-file`, {fileIds}, function(result) { // toastr.clear() // toastr.success('压缩文件成功') // btn.removeAttr('disabled') // const href = window.URL.createObjectURL(result) // $('#zipDown').attr('href', href); // $('#zipDown').attr('download', `${tender.name}-计量台账-第${stage.order}期-附件.zip`); // $("#zipDown")[0].click(); // }, () => { // btn.removeAttr('disabled') // toastr.clear() // toastr.error('批量下载失败') // }); // const url = `/tender/${tender.id}/measure/stage/${stage.order}/download/compresse-file?fileIds=${JSON.stringify(fileIds)}`; // $('#zipDown').attr('href', url); // $("#zipDown")[0].click(); } }); // 监听附件check是否选中 $('.list-table').on('click', '.check-file', function() { const checkedList = $(this).parents('.list-table').children().find('input:checked'); const childs = $(this).parents('.list-table').children().length; const checkBox = $(this).parents('.list-table').parent().find('.check-all-file'); if (checkedList.length === childs) { checkBox.prop("checked", true); } else { checkBox.prop("checked", false); } }); $('.check-all-file').click(function() { const isCheck = $(this).is(':checked'); $(this).parents('table').find('.list-table').each(function() { $(this).find('input:checkbox').prop("checked", isCheck); }) }); // 显示层次 (function (select, sheet) { $(select).click(function () { if (!sheet.zh_tree) return; const tag = $(this).attr('tag'); const tree = sheet.zh_tree; setTimeout(() => { showWaitingView(); switch (tag) { case "1": case "2": case "3": case "4": case "5": tree.expandByLevel(parseInt(tag)); SpreadJsObj.refreshTreeRowVisible(sheet); break; case "last": tree.expandByCustom(() => { return true; }); SpreadJsObj.refreshTreeRowVisible(sheet); break; case "leafXmj": tree.expandToLeafXmj(); SpreadJsObj.refreshTreeRowVisible(sheet); break; case "curMeasure": tree.expandByCustom(function (node) { for (const field of ['contract_tp', 'qc_tp', 'gather_tp']) { if (node[field]) { return true; } } return false; }); SpreadJsObj.refreshTreeRowVisible(sheet); break; } closeWaitingView(); }, 100); }); })('a[name=showLevel]', slSpread.getActiveSheet()); const stageCheckerSetting = { ledgerTree: stageTree, ledgerPos: stagePos, checkList: checkList, decimal: tenderInfo.decimal, checkOption: checkOption, }; if (!checkTzMeasureType()) { stageCheckerSetting.checkOption.tp.fields.push( {qty: 'sgfh_qty', tp: 'sgfh_tp'}, {qty: 'sjcl_qty', tp: 'sjcl_tp'}, {qty: 'qtcl_qty', tp: 'qtcl_tp'}, {qty: 'quantity', tp: 'total_price'}, ); } $('#ledger-check2').click(() => { const result = ledgerCheck2(stageCheckerSetting); check2Viewing({ extra: ZhCalc.div(stageTree.datas.length + stagePos.datas.length, 10000, 0), randomWait: true, prefix: 'check2-', checks: result, checkList: checkList, }) }); const dataChecker = DataChecker({ checkUrl: window.location.pathname + '/check', completeData: function (data) { stagePos.updateDatas({pos: data.source.pos}); const refreshData = stageTree.loadPostStageData({bills: data.source.bills}); stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), refreshData); stagePosSpreadObj.loadCurPosData(); for (const e of data.error) { e.serialNo = stageTree.getNodeIndex(stageTree.getItems(e.ledger_id)) + 1; } }, errorList: errorList, }); $('[name=stage-start]').submit(function (e) { if (checkAuditorFrom()) { // 再检查多人协同确认情况 const list = stageTree.pwd.find(x => {return !x.confirm }); if(list) { toastr.error('请检查多人协同确认情况再上报'); $('#hide-all').hide(); return false; } $(this).parent().parent().parent().modal('hide'); dataChecker.checkAndPost(this.action, {}); $('#hide-all').hide(); } return false; }); $('#audit-check0').submit(function (e) { // 再检查多人协同确认情况 const list = stageTree.pwd.find(x => {return !x.confirm }); if(list) { toastr.error('请检查多人协同确认情况再审批通过'); $('#hide-all').hide(); return false; } const checkType = parseInt($('[name=checkType]').val()); const data = { opinion: $(`${'#sp-done'}`).find('[name=opinion]').val().replace(/\r\n/g, '
').replace(/\n/g, '
').replace(/\s/g, ' '), checkType, }; $('#sp-done').modal('hide'); checkType && dataChecker.checkAndPost(this.action, data); $('#hide-all').hide(); return false; }); $('#audit-check1').submit(function (e) { const checkType = parseInt($('[name=checkType]:checked').val()); const data = { opinion: $(`${'#sp-back'}`).find('[name=opinion]').val().replace(/\r\n/g, '
').replace(/\n/g, '
').replace(/\s/g, ' '), checkType, }; if ($('#warning-text').length) $('#warning-text').remove() if (!checkType && !$('#warning-text').length) { $('#reject-process').prepend('

请选择退回流程

'); return false } $('#sp-back').modal('hide'); checkType && dataChecker.checkAndPost(this.action, data); $('#hide-all').hide(); return false; }); $('#exportExcel').click(function () { stageTreeSpreadObj.exportExcel($('.sidebar-title').attr('data-original-title') + "计量台账.xlsx", stageTree.children); }); $('#cbr-check-all').click(function () { if (this.checked) { $('input', '#cbr-pos-list').attr('checked', 'checked'); } else { $('input', '#cbr-pos-list').removeAttr('checked'); } }); $('#cbr-ok').click(() => { const ratio = parseInt($('#cbr-ratio').val()); if (!ratio) { toastr.warning('请输入计量比例'); return; } else if (ratio < 1) { toastr.warning('计量比例不可小于1'); return; } else if (ratio > 100) { toastr.warning('计量比例不可大于100'); return; } const apply2sibling = $('#apply2sibling')[0].checked; const posName = _.map($('input:checked', '#cbr-pos-list'), function (x) {return $(x).attr('pos-name')}); if (posName.length === 0) { toastr.warning('请勾选需要按计量比例的计量单元'); return; } stageTreeSpreadObj.measureByBatch(posName, ratio, apply2sibling); }); $('body').on('click', '[name=ledger-unlock]', function() { $('#cooperation').modal('hide'); const lid = this.getAttribute('lid'); if (!lid) return; const p = stageTree.pwd.find(x => {return x.ledger_id == lid}); if (!p) return; $('#unlock-info').html(`${p.node.code} ${p.node.name} 解锁密码*`); $('#unlock-pwd').val('').removeClass('is-invalid'); $('.invalid-feedback', '#unlock').hide(); $('.alert-warning', '#unlock').hide(); $('#unlock-ok').attr('lid', lid); $('#unlock').modal('show'); }); $('#unlock-ok').click(function () { const lid = this.getAttribute('lid'); if (!lid) return; const p = stageTree.pwd.find(x => {return x.ledger_id == lid}); if (!p) return; if (p.pwd === $('#unlock-pwd').val()) { const refresh = stageTree.lockNode(p, false); // 修改线上 SpreadJsObj.reloadRowsReadonly(slSpread.getActiveSheet(), refresh); stagePosSpreadObj.loadCurPosData(); $('#unlock').modal('hide'); reloadCooperationHtml(); } else { $('#unlock-pwd').addClass('is-invalid'); $('.invalid-feedback', '#unlock').show(); $('.alert-warning', '#unlock').show(); } }); $('#cooperationSelect').change(function () { reloadCooperationHtml(); }); // 确认 $('body').on('click', '[name=ledger-confirm]', function() { const lid = this.getAttribute('lid'); if (!lid) return; const p = stageTree.pwd.find(x => {return x.ledger_id == lid}); if (!p) return; // 修改线上 postData(window.location.pathname + '/save/cooperation', { type: 'save-confirm', postData: { ledger_id: lid } }, function (result) { p.confirm = true; p.confirm_time = new Date(); stageTree.confirmList = result.cooperationConfirm; reloadCooperationHtml(); }); }); // 确认 $('body').on('click', '[name=ledger-unconfirm]', function() { const lid = this.getAttribute('lid'); if (!lid) return; const p = stageTree.pwd.find(x => {return x.ledger_id == lid}); if (!p) return; // 修改线上 postData(window.location.pathname + '/save/cooperation', { type: 'del-confirm', postData: { ledger_id: lid } }, function (result) { p.confirm = false; p.confirm_time = null; stageTree.confirmList = result.cooperationConfirm; reloadCooperationHtml(); }); }); // 收方单生成 $('#setshoufang').click(function () { const lid = $('#shoufang-lid').val(); const pid = $('#shoufang-pid').val() !== '' ? $('#shoufang-pid').val() : null; // 修改线上 postData(window.location.pathname + '/save/shoufang', { type: 'add', postData: { lid, pid } }, function (result) { // 收方单tab打开并显示在最新 if (!$('#shoufang-tab').hasClass('active')) { $('#shoufang-tab').click(); } const data = makeOneShouFang(result); data.filenum = 0; sfData = _.concat(data, sfData); getShouFangList(); }); }); $('body').on('click', '.del-shoufang', function () { const id = $(this).attr('data-id'); $('#del-shoufang-id').val(id); const name = $(this).parents('tr').children('td').eq(0).text(); const ledger_code = name.split(' / ')[0]; const pos_name = name.split(' / ')[1] ? name.split(' / ')[1] : ''; $('#del-shoufang-ledger').text('清单:' + ledger_code); if (pos_name) { $('#del-shoufang-pos').text('计量单元:' + pos_name).show(); } else { $('#del-shoufang-pos').text('').hide(); } }); // 收方单删除 $('#delshoufang').click(function () { const sfid = $('#del-shoufang-id').val(); // 修改线上 postData(window.location.pathname + '/save/shoufang', { type: 'del', postData: { sfid } }, function (result) { // 删除到sfData中 const att_index = sfData.findIndex(function (item) { return item.id === parseInt(sfid); }); sfData.splice(att_index, 1); // 重新生成List if ($('#shoufang-table tr').length === 1) { getShouFangList(parseInt($('#shoufang-currentPage').text()) - 1); } else { getShouFangList(parseInt($('#shoufang-currentPage').text())); } $('#shoufangdelete').modal('hide'); }); }); // 切换页数 $('.shoufang-page-select').on('click', function () { const totalPageNum = parseInt($('#shoufang-totalPage').text()); const lastPageNum = parseInt($('#shoufang-currentPage').text()); const status = $(this).attr('content'); if (status === 'pre' && lastPageNum > 1) { getShouFangList(lastPageNum-1); } else if (status === 'next' && lastPageNum < totalPageNum) { getShouFangList(lastPageNum+1); } }); // 获取单个收方单附件列表 $('body').on('click', '.show-shoufang-att', function () { const id = parseInt($(this).attr('data-id')); let html = ''; $('#shoufang-flie-list').html(html); postData(window.location.pathname + '/shoufang/file', { sfid: id }, function (result) { for (const att of result) { html += `${att.filename}${att.fileext} ` + makeEditHtml(att.id, att.filename, att.fileext, att.extra_upload) + `${moment(att.in_time).format('YYYY-MM-DD HH:mm')}` + `` + makeViewHtml(att.viewpath) + makeDelHtml(att.id, att.extra_upload) +``; } $('#shoufang-flie-list').html(html); $('[data-toggle="tooltip"]').tooltip() }); function makeViewHtml(viewpath) { return viewpath ? `` : ''; } function makeDelHtml(fid, extra_upload) { return sfAttDelPower && (stage.status !== auditConst.status.checked || (stage.status === auditConst.status.checked && extra_upload)) ? '' + '' : ''; } }); function makeEditHtml(fid, filename, fileext, extra_upload) { return sfAttDelPower && (stage.status !== auditConst.status.checked || (stage.status === auditConst.status.checked && extra_upload)) ? '' + '' : '' } // 修改收方单附件文件名 $('body').on('click', '.edit-shoufang-att', function () { $(this).children('i').tooltip('hide'); const fid = $(this).data('id'); const filename = $(this).data('filename'); const fileext = $(this).data('fileext'); const html = `
`; $(this).parents('td').html(html); }); // 确认修改文件名 $('body').on('click', '.shoufang-att-confirm-btn', function () { const validText = $.trim($(this).parents('td').find('input').val()); const orgValue = $.trim($(this).data('filename')); const fileext = $(this).data('fileext'); const fid = $(this).data('fid'); if (!validText) { toastr.error('文件名不能为空'); return; } // const reg = /^[0-9a-zA-Z\-_\u4e00-\u9fa5]+$/; if(validText.indexOf('.') !== -1 || validText.indexOf(' ') !== -1) { toastr.error('文件名中不能包含.字符和空格'); return; } if(validText == orgValue) { const html = `${orgValue}${fileext} ` + makeEditHtml(fid, orgValue, fileext, 1); $(this).parents('td').html(html); return; } const data = { id: fid, filename: validText, }; const _self = $(this); postData('/wap/shoufang/editfile', data, function (result) { const html = `${validText}${fileext} ` + makeEditHtml(fid, validText, fileext, 1); _self.parents('td').html(html); }); }); // 取消修改文件名 $('body').on('click', '.shoufang-att-cancel-btn', function () { const fid = $(this).data('fid'); const filename = $(this).data('filename'); const fileext = $(this).data('fileext'); const html = `${filename}${fileext} ` + makeEditHtml(fid, filename, fileext, 1); $(this).parents('td').html(html); }); // 删除收方单附件 $('body').on('click', '.del-shoufang-att', function () { const id = $(this).data('id'); const _self = $(this); const data = { id }; const sfid = $(this).data('sfid'); postData('/wap/shoufang/delfile', data, function (result) { _self.parents('tr').remove(); // 附件个数更新 $('#shoufang-table').find('.show-shoufang-att[data-id="'+ sfid +'"]').text($('#shoufang-flie-list tr').length); const sfInfo = _.find(sfData, { id: sfid }); sfInfo.filenum = $('#shoufang-flie-list tr').length; }); }); // 定位到对应的清单或计量单元 $('body').on('click', '.show-shoufang-node', function () { const id = parseInt($(this).attr('data-id')); const sfInfo = _.find(sfData, { id }); if (sfInfo) { const lData = _.find(ledgerData, { id: sfInfo.lid }); SpreadJsObj.locateTreeNode(slSpread.getActiveSheet(), lData.ledger_id, true); stagePosSpreadObj.loadCurPosData(); if (sfInfo.pid) { const posData = _.find(spSpread.getActiveSheet().zh_data, { id: sfInfo.pid }); SpreadJsObj.locateData(spSpread.getActiveSheet(), posData); stagePosSpreadObj.loadExprToInput(spSpread.getActiveSheet()); } } }); // 定位到对应的清单或计量单元 $('body').on('click', '.show-shoufang-report', function () { const id = parseInt($(this).attr('data-id')); const [qrCodePath, replace_key_params, req_params, rpt_name] = makeReportData(id); sessionStorage.qrCodePath = qrCodePath; sessionStorage.replace_key_params = JSON.stringify(replace_key_params); sessionStorage.req_params = JSON.stringify(req_params); sessionStorage.rpt_name = rpt_name; window.open('/individualReport/A4'); }); }); function makeOneShouFang(sf) { const lData = _.find(ledgerData, { id: sf.lid }); sf.name = lData.b_code; if (sf.pid) { const pData = _.find(posData, { id: sf.pid }); sf.name = lData.b_code + ' / ' + pData.name; } return sf; } function makeShouFang() { for (const sf of sfData) { makeOneShouFang(sf); } getShouFangList(); } // 生成收方单列表 function getShouFangList(currPageNum = 1) { // 每页最多几个附件 const pageCount = 20; // 附件总数 const total = sfData.length; // 总页数 const pageNum = Math.ceil(total/pageCount); $('#shoufang-totalPage').text(pageNum); $('#shoufang-currentPage').text(total === 0 ? 0 : currPageNum); // 当前页附件内容 const currPageAttData = sfData.slice((currPageNum-1)*pageCount, currPageNum*pageCount); let html = ''; for(const att of currPageAttData) { html += '' + att.name + '' + ''+ att.filenum +'' + '' + ' ' + ' ' + // ' ' + makeDelHtml(att.id, att.extra_upload) + ''; } function makeDelHtml(id, extra_upload) { return cur_uid === stage.user_id && (stage.status !== auditConst.status.checked || (stage.status === auditConst.status.checked && extra_upload)) ? '' + '' : ''; } $('#shoufang-table').html(html); $('[data-toggle="tooltip"]').tooltip(); } function makeReportData(sfid) { const sfInfo = _.find(sfData, { id: sfid }); const ledger_code = sfInfo.name.split(' / ')[0]; const pos_name = sfInfo.name.split(' / ')[1] ? sfInfo.name.split(' / ')[1] : ''; const replace_key_params = { 'KEY_标段名称': tenderInfo.deal_info.buildName, 'KEY_总承包单位': tenderInfo.construction_unit.contract1.company, 'KEY_合同段': tenderInfo.deal_info.dealName, 'KEY_监理单位': tenderInfo.construction_unit.supervision1.company, 'KEY_编号': '', 'KEY_设计工程数量': 0, }; // if (sfInfo.pid) { // const pData = _.find(posData, { id: sfInfo.pid }); // replace_key_params['KEY_设计工程数量'] = pData.quantity; // } else { const lData = _.find(ledgerData, { id: sfInfo.lid }); // } replace_key_params['KEY_子目号及子目名称'] = ledger_code + ' ' + lData.name; replace_key_params['KEY_桩号及工程部位'] = pos_name; const req_params = { rpt_tpl_id: window.location.host === '127.0.0.1:7002' || window.location.host === 'jlqa.smartcost.com.cn:7002' ? 1784 : (window.location.host === 'jluat.smartcost.com.cn' ? 315 : 2138), // 1784(qa的,外网是2138) pageSize: 'A4', project_id: tender.project_id, tender_id: tender.id, stage_id: stage.id, }; const rpt_name = tender.name + '-第' + stage.order + '期-' + ledger_code + (pos_name ? '/' + pos_name : '-' + lData.name); const qrCodePath = sfInfo.qrcode; return [qrCodePath, replace_key_params, req_params, rpt_name]; }