'use strict'; /** * * * @author Mai * @date 2018/10/11 * @version */ const EmptyTenderHtml = [ '', ]; let selfLevelSort; const tenderTree = []; let parentId = 0; // 查询方法 function findNode (key, value, arr) { for (const a of arr) { if (a[key] && a[key] === value) { return a; } } } function getPId(level) { if (level !== 1) { const p = findNode('level', level - 1, levelNodes); if (p) { return p.lid } else { return 1; } } else { return 2; } } // 分类数据排序 function loadSelfCategoryLevel(selfLevel){ selfLevelSort = selfLevel ? selfLevel.split(',') : []; selfLevelSort = selfLevelSort.filter(x => { return category.find(c => { return c.id + '' === x; }); }); category.forEach(cate => { cate.is_self = selfLevelSort.length > 0; cate.self_level = selfLevelSort.indexOf(cate.id + '') + 1; }); } // 分类数据排序 function sortCategory() { category.forEach(cate => { cate.show_level = cate.is_self ? cate.self_level : cate.level; }); category.sort(function (a, b) { return a.show_level ? (b.show_level ? a.show_level - b.show_level : -1) : a.id - b.id; }); } function calculateParent(node) { if (node.children && node.cid) { node.end_qc_tp = 0; node.pre_gather_tp = 0; node.gather_tp = 0; node.sum_tp = 0; node.lastStage = 0; for (const c of node.children) { calculateParent(c); node.end_qc_tp = ZhCalc.add(node.end_qc_tp, c.end_qc_tp); node.pre_gather_tp = ZhCalc.add(node.pre_gather_tp, c.pre_gather_tp); node.gather_tp = ZhCalc.add(node.gather_tp, c.gather_tp); node.sum_tp = ZhCalc.add(node.sum_tp, c.sum_tp); node.lastStage = c.cid ? Math.max(node.lastStage, c.lastStage) : (c.lastStage ? Math.max(node.lastStage, c.lastStage.order) : node.lastStage); } } } // 初始化TenderTree数据 function initTenderTree () { const levelCategory = category.filter(function (c) { return c.show_level && c.show_level > 0; }); function findCategoryNode(cid, value, array) { for (const a of array) { if (a.cid === cid && a.vid === value) { return a; } } } function getCategoryNode(category, value, parent, i = null) { const array = parent ? parent.children : tenderTree; let cate = findCategoryNode(category.id, value, array); if (!cate) { const cateValue = findNode('id', value, category.value); if (!cateValue) return null; cate = { cid: category.id, vid: value, name: cateValue.value, children: [], level: i ? i : category.show_level, sort_id: ++parentId, sort: cateValue.sort, }; array.push(cate); } return cate; } function loadTenderCategory (tender) { let tenderCategory = null; for (const [index, lc] of levelCategory.entries()) { const tenderCate = findNode('cid', lc.id, tender.category); if (tenderCate) { tenderCategory = getCategoryNode(lc, tenderCate.value, tenderCategory); } else { if (index === 0 && tender.category) { for (const [i,c] of tender.category.entries()) { const cate = findNode('id', c.cid, category); if (cate) { tenderCategory = getCategoryNode(cate, c.value, tenderCategory, i+1); } } } return tenderCategory; } } return tenderCategory; } function calculateTender(tender) { if (tender.lastStage) { tender.end_qc_tp = ZhCalc.add(tender.lastStage.pre_qc_tp, tender.lastStage.qc_tp); tender.pre_gather_tp = ZhCalc.add(tender.lastStage.pre_contract_tp, tender.lastStage.pre_qc_tp); tender.gather_tp = ZhCalc.add(tender.lastStage.contract_tp, tender.lastStage.qc_tp); tender.sum_tp = ZhCalc.add(tender.total_price, tender.end_qc_tp); } else { tender.sum_tp = tender.total_price; } } tenderTree.splice(0, tenderTree.length); for (const t of tenders) { calculateTender(t); t.valid = true; delete t.level; if (t.category && levelCategory.length > 0) { const parent = loadTenderCategory(t); if (parent) { t.level = parent.level + 1; parent.children.push(t); } else { tenderTree.push(t); } } else { tenderTree.push(t); } } sortTenderTree(tenderTree); for (const t of tenderTree) { calculateParent(t); } } function getProgressHtml(total, pre, cur) { if (total !== 0) { let preP = ZhCalc.mul(ZhCalc.div(pre, total, 2), 100, 0); let curP = ZhCalc.mul(ZhCalc.div(cur, total, 2), 100, 0); let other = Math.max(ZhCalc.sub(ZhCalc.sub(total, pre), cur), 0); let otherP = Math.max(100 - preP - curP, 0); const html = '
' + '
' + preP + '%
' + '
' + curP + '%
' + '
' + otherP + '%
' + '
'; return html; } else { return ''; } } function recursiveGetTenderNodeHtml (node, arr, pid) { const html = []; html.push(''); // 名称 if (node.cid) { html.push(''); html.push(' ', node.name); // html.push(''); html.push(''); } else { html.push(''); html.push('
'); html.push(''); html.push(''); html.push(arr.indexOf(node) === arr.length - 1 ? '└' : '├'); html.push(''); html.push('', node.name, ''); html.push(''); html.push('
'); // html.push('
'); // // 计量期数 // if (!node.cid) { // html.push(node.lastStage ? '第' + node.lastStage.order + '期' : '台账'); // } // html.push(''); // // 累计合同计量 // const sum = node.lastStage ? ZhCalc.add(node.total_price, node.lastStage.end_qc_tp) : node.total_price; // html.push(node.sum_tp ? node.sum_tp : ''); // html.push('
'); // // 截止本期累计完成/本期完成/未完成 // if (node.lastStage) { // html.push(getProgressHtml(node.sum_tp, node.pre_gather_tp, node.gather_tp)); // } else { // html.push(''); // } html.push(''); } html.push(''); if (node.children) { for (const c of node.children) { html.push(recursiveGetTenderNodeHtml(c, node.children, node.sort_id)); } } return html.join(''); } // 根据TenderTree数据获取Html代码 function getTenderTreeHtml () { const html = []; html.push(''); html.push('', ''); html.push(''); // html.push(''); // html.push(''); html.push('', ''); if (tenderTree.length > 0) { parentId = 0; for (const t of tenderTree) { html.push(recursiveGetTenderNodeHtml(t, tenderTree, '')); } } else { html.push(EmptyTenderHtml.join('')); } html.push('
', subProject.name, '计量期数总价
'); return html.join(''); } function bindTenderUrl() { $('.c-body').on('click', 'a', function () { const tenderId = parseInt($(this).attr('id')); const tender = _.find(tenders, function (t) { return t.id === tenderId; }); if (tender.measure_type) { window.location.href = '/wap/tender/' + tenderId; } else { // for (const a of $('a', '#jlms')) { // a.href = '/wap/tender/' + tenderId + '/type?type=' + $(a).attr('mst'); // } // $('#jlms').modal('show'); } }); } $(document).ready(() => { // 初始化标段树结构 sortCategory(); initTenderTree(); $('.c-body').html(getTenderTreeHtml()); bindTenderUrl(); localHideList(true); });