| | |
| | | return (await qb.getRawOne()) || {}; |
| | | } |
| | | |
| | | /** 名称取全部种类;codes 仍只含启用项,供 KPI/趋势沿用原口径。分类图不再用 codes 过滤。 */ |
| | | private async enabledWaste() { |
| | | const list = await this.wasteTypeRepo.find({ |
| | | where: { status: 1 }, |
| | | select: ['code', 'name'], |
| | | select: ['code', 'name', 'status'], |
| | | }); |
| | | const names = new Map<string, string>(); |
| | | const codes = new Set<string>(); |
| | | list.forEach(e => { |
| | | const code = String(e.code).toUpperCase(); |
| | | codes.add(code); |
| | | names.set(code, e.name); |
| | | if (Number(e.status) === 1) { |
| | | codes.add(code); |
| | | } |
| | | }); |
| | | return { names, codes }; |
| | | } |
| | |
| | | return cols.map(col => `IFNULL(a.${col},0)`).join(' + '); |
| | | } |
| | | |
| | | /** 首页分类全量返回,不按种类启用状态裁剪;0 值由前端图表隐藏。 */ |
| | | private buildWasteMix(row: any, waste: { names: Map<string, string>; codes: Set<string> }) { |
| | | const items = [ |
| | | { code: 'SW62', key: 'Sw62' }, |
| | |
| | | { code: 'SW63', key: 'Sw63' }, |
| | | { code: 'SW61', key: 'Sw61' }, |
| | | { code: 'SW60', key: 'Sw60' }, |
| | | ].filter(e => waste.codes.has(e.code)); |
| | | ]; |
| | | return items.map(e => ({ |
| | | name: waste.names.get(e.code) || this.defaultWasteName(e.code), |
| | | code: e.code, |
| | |
| | | ); |
| | | } |
| | | |
| | | /** 可回收 7 子类全量返回;碳值保留符号(减排可为负),图表侧取绝对值展示。 */ |
| | | private buildRecycleItems(row: any, waste: { names: Map<string, string>; codes: Set<string> }) { |
| | | const fallback = ['废纸', '塑料', '金属', '织物', '玻璃', '电子产品', '其他可回收']; |
| | | return ['001', '002', '003', '004', '005', '006', '007'] |
| | | .map((idx, i) => ({ idx, i, code: `SW62${idx}` })) |
| | | .filter(e => waste.codes.has(e.code)) |
| | | .map(e => ({ |
| | | name: waste.names.get(e.code) || fallback[e.i], |
| | | code: e.code, |